From 9158d035af3ab866c62b7825ad332b74191d5ef2 Mon Sep 17 00:00:00 2001 From: Doesnty Date: Wed, 2 Aug 2017 14:18:39 -0500 Subject: Improve battle_4 --- src/battle_4.c | 620 +++++++++++++++++++-------------------------------------- 1 file changed, 207 insertions(+), 413 deletions(-) (limited to 'src') diff --git a/src/battle_4.c b/src/battle_4.c index 31d6c76dc..b5f774e6b 100644 --- a/src/battle_4.c +++ b/src/battle_4.c @@ -93,6 +93,7 @@ extern u16 gUnknown_02024C2C[4]; //last used moves 2, used by sketch extern u16 gUnknown_030041B0; extern u16 gUnknown_02024C4C[4]; //last used moves by banks, another one extern u8 gCurrentMoveTurn; +extern u16 gTrappingMoves[]; //extern functions u8 AtkCanceller_UnableToUseMove(void); @@ -199,6 +200,9 @@ extern u8 BattleScript_TrainerBallBlock[]; extern u8 BattleScript_WallyBallThrow[]; extern u8 BattleScript_SuccessBallThrow[]; extern u8 BattleScript_ShakeBallThrow[]; +extern u8 BattleScript_AllStatsUp[]; +extern u8 BattleScript_AtkDefDown[]; +extern u8 BattleScript_SAtkDown2[]; extern u8 gUnknown_081D919F[]; //spikes1 extern u8 gUnknown_081D9171[]; //spikes2 @@ -417,6 +421,7 @@ static void atk85_stockpile(void); static void atk86_stockpiletobasedamage(void); static void atk87_stockpiletohpheal(void); static void atk88_negativedamage(void); +static u8 ChangeStatBuffs(s8, u8, u8, u8*); static void atk89_statbuffchange(void); static void atk8A_normalisebuffs(void); static void atk8B_setbide(void); @@ -871,19 +876,19 @@ static const u32 gStatusFlagsForMoveEffects[] = 0x00000000 }; -extern const u8 BattleScript_1D963E[]; -extern const u8 BattleScript_1D965A[]; -extern const u8 BattleScript_1D9669[]; -extern const u8 BattleScript_1D9678[]; -extern const u8 BattleScript_1D9687[]; -extern const u8 BattleScript_1D969D[]; -extern const u8 BattleScript_1D96BA[]; -extern const u8 BattleScript_1D9696[]; -extern const u8 BattleScript_1D96B1[]; -extern const u8 BattleScript_1D96AA[]; -extern const u8 BattleScript_1D96C8[]; +extern u8 BattleScript_1D963E[]; +extern u8 BattleScript_1D965A[]; +extern u8 BattleScript_1D9669[]; +extern u8 BattleScript_1D9678[]; +extern u8 BattleScript_1D9687[]; +extern u8 BattleScript_1D969D[]; +extern u8 BattleScript_1D96BA[]; +extern u8 BattleScript_1D9696[]; +extern u8 BattleScript_1D96B1[]; +extern u8 BattleScript_1D96AA[]; +extern u8 BattleScript_1D96C8[]; -const u8* const gMoveEffectBS_Ptrs[] = +u8* const gMoveEffectBS_Ptrs[] = { BattleScript_1D963E, BattleScript_1D963E, @@ -956,7 +961,7 @@ static const u16 sUnknown_081FACFE[] = //banned moves to copy 0xFFFF }; -static const u8 sUnknown_081FAD26[] = +static const u8 sUnknown_081FAD26[] = //reversal+flail HP thresholds to power { 1, 200, 4, 150, @@ -1629,7 +1634,6 @@ static void ModulateDmgByType2(u8 multiplier, u16 move, u8* flags) //a literal c } } -#ifdef NONMATCHING u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) { int i = 0; @@ -1671,7 +1675,7 @@ u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); //check type2 if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type2 && - gBattleMons[bank_def].type1 != gBattleMons[bank_def].type2) + gBattleMons[gBankTarget /* what the christ */].type1 != gBattleMons[bank_def].type2) ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); } i += 3; @@ -1687,254 +1691,6 @@ u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) } return flags; } -#else -__attribute__((naked)) -u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r10, r0\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - str r1, [sp, 0x4]\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - mov r9, r2\n\ - movs r7, 0\n\ - mov r0, sp\n\ - strb r7, [r0]\n\ - mov r0, r10\n\ - cmp r0, 0xA5\n\ - bne _0801D2AE\n\ - movs r0, 0\n\ - b _0801D43A\n\ - _0801D2AE:\n\ - ldr r1, _0801D31C @ =gBattleMoves\n\ - mov r3, r10\n\ - lsls r2, r3, 1\n\ - adds r0, r2, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - str r0, [sp, 0x8]\n\ - ldr r1, _0801D320 @ =gBattleMons\n\ - movs r0, 0x58\n\ - ldr r3, [sp, 0x4]\n\ - muls r0, r3\n\ - adds r3, r0, r1\n\ - adds r0, r3, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - str r2, [sp, 0xC]\n\ - adds r5, r1, 0\n\ - ldr r1, [sp, 0x8]\n\ - cmp r0, r1\n\ - beq _0801D2E2\n\ - adds r0, r3, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, r1\n\ - bne _0801D2F4\n\ - _0801D2E2:\n\ - ldr r4, _0801D324 @ =gBattleMoveDamage\n\ - ldr r1, [r4]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - str r0, [r4]\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - _0801D2F4:\n\ - movs r0, 0x58\n\ - mov r2, r9\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - adds r0, r5\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1A\n\ - bne _0801D328\n\ - ldr r3, [sp, 0x8]\n\ - cmp r3, 0x4\n\ - bne _0801D328\n\ - movs r1, 0x9\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ - orrs r0, r1\n\ - mov r1, sp\n\ - strb r0, [r1]\n\ - b _0801D3DC\n\ - .align 2, 0\n\ - _0801D31C: .4byte gBattleMoves\n\ - _0801D320: .4byte gBattleMons\n\ - _0801D324: .4byte gBattleMoveDamage\n\ - _0801D328:\n\ - ldr r1, _0801D344 @ =gTypeEffectiveness\n\ - adds r0, r7, r1\n\ - ldrb r0, [r0]\n\ - adds r2, r1, 0\n\ - cmp r0, 0xFF\n\ - beq _0801D3DC\n\ - cmp r0, 0xFE\n\ - bne _0801D34C\n\ - movs r0, 0x58\n\ - mov r1, r9\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - b _0801D3CA\n\ - .align 2, 0\n\ - _0801D344: .4byte gTypeEffectiveness\n\ - _0801D348:\n\ - adds r7, 0x3\n\ - b _0801D3B6\n\ - _0801D34C:\n\ - ldr r6, _0801D44C @ =gTypeEffectiveness\n\ - adds r0, r7, r6\n\ - ldrb r0, [r0]\n\ - ldr r2, [sp, 0x8]\n\ - cmp r0, r2\n\ - bne _0801D3B0\n\ - adds r1, r7, 0x1\n\ - adds r1, r6\n\ - ldr r3, _0801D450 @ =gBattleMons\n\ - mov r8, r3\n\ - movs r3, 0x58\n\ - mov r0, r9\n\ - muls r0, r3\n\ - mov r2, r8\n\ - adds r5, r0, r2\n\ - adds r0, r5, 0\n\ - adds r0, 0x21\n\ - ldrb r4, [r1]\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - bne _0801D388\n\ - adds r0, r7, 0x2\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - mov r1, r10\n\ - mov r2, sp\n\ - str r3, [sp, 0x10]\n\ - bl ModulateDmgByType2\n\ - ldr r3, [sp, 0x10]\n\ - _0801D388:\n\ - adds r0, r5, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - bne _0801D3B0\n\ - ldr r0, _0801D454 @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - muls r0, r3\n\ - add r0, r8\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, r4\n\ - beq _0801D3B0\n\ - adds r0, r7, 0x2\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - mov r1, r10\n\ - mov r2, sp\n\ - bl ModulateDmgByType2\n\ - _0801D3B0:\n\ - adds r7, 0x3\n\ - ldr r5, _0801D450 @ =gBattleMons\n\ - ldr r2, _0801D44C @ =gTypeEffectiveness\n\ - _0801D3B6:\n\ - adds r0, r7, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xFF\n\ - beq _0801D3DC\n\ - cmp r0, 0xFE\n\ - bne _0801D34C\n\ - movs r0, 0x58\n\ - mov r3, r9\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - _0801D3CA:\n\ - adds r1, r5, 0\n\ - adds r1, 0x50\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 22\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801D348\n\ - _0801D3DC:\n\ - movs r0, 0x58\n\ - mov r1, r9\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, r5\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x19\n\ - bne _0801D436\n\ - mov r0, sp\n\ - ldrb r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801D436\n\ - ldr r0, [sp, 0x4]\n\ - mov r1, r10\n\ - bl AttacksThisTurn\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - cmp r1, 0x2\n\ - bne _0801D436\n\ - mov r0, sp\n\ - ldrb r3, [r0]\n\ - adds r0, r1, 0\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _0801D41E\n\ - movs r0, 0x6\n\ - ands r0, r3\n\ - cmp r0, 0x6\n\ - bne _0801D436\n\ - _0801D41E:\n\ - ldr r0, _0801D458 @ =gBattleMoves\n\ - ldr r1, [sp, 0xC]\n\ - add r1, r10\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0\n\ - beq _0801D436\n\ - mov r0, sp\n\ - movs r1, 0x1\n\ - orrs r1, r3\n\ - strb r1, [r0]\n\ - _0801D436:\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ - _0801D43A:\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ - _0801D44C: .4byte gTypeEffectiveness\n\ - _0801D450: .4byte gBattleMons\n\ - _0801D454: .4byte gBankTarget\n\ - _0801D458: .4byte gBattleMoves\n\ - .syntax divided\n"); -} -#endif // NONMATCHING u8 AI_TypeCalc(u16 move, u16 species, u8 ability) { @@ -2519,7 +2275,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) #define EffectAffectsUser 0x40 register u8 certain asm("r5") = certainArg; register bool32 StatusChanged asm("r10") = 0; - register int AffectsUser asm("r6") = 0; //0x40 otherwise + register int AffectsUser asm("r6") = 0; //0x40 otherwise bool32 NoSunCanFreeze = 1; if (gBattleCommunication[MOVE_EFFECT_BYTE] & EffectAffectsUser) @@ -2535,16 +2291,16 @@ void SetMoveEffect(bool8 primary, u8 certainArg) BATTLE_STRUCT->scriptingActive = gBankAttacker; } - if (gBattleMons[gEffectBank].ability_id == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && + if (gBattleMons[gEffectBank].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) {gBattlescriptCurrInstr++; return;} - if (gSideAffecting[get_bank_identity(gEffectBank) & 1] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && + if (gSideAffecting[GetBankIdentity(gEffectBank) & 1] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7) {gBattlescriptCurrInstr++; return;} //make sure at least ONE HP except payday and thief - if (gBattleMons[gEffectBank].current_hp == 0 && gBattleCommunication[MOVE_EFFECT_BYTE] != 0xB && gBattleCommunication[MOVE_EFFECT_BYTE] != 0x1F) + if (gBattleMons[gEffectBank].hp == 0 && gBattleCommunication[MOVE_EFFECT_BYTE] != 0xB && gBattleCommunication[MOVE_EFFECT_BYTE] != 0x1F) {gBattlescriptCurrInstr++; return;} if (gBattleMons[gEffectBank].status2 & STATUS2_SUBSTITUTE && AffectsUser != EffectAffectsUser) @@ -2556,81 +2312,82 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { case STATUS_SLEEP: //check active uproar - if (gBattleMons[gEffectBank].ability_id != ABILITY_SOUNDPROOF) + if (gBattleMons[gEffectBank].ability != ABILITY_SOUNDPROOF) { for (gActiveBank = 0; gActiveBank < gNoOfAllBanks && !(gBattleMons[gActiveBank].status2 & STATUS2_UPROAR); gActiveBank++) {} } else gActiveBank = gNoOfAllBanks; - if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].status1) {break;} if (gActiveBank != gNoOfAllBanks) {break;} //nice way of checking uproar... - if (gBattleMons[gEffectBank].ability_id == ABILITY_VITAL_SPIRIT) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_INSOMNIA) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_VITAL_SPIRIT) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_INSOMNIA) {break;} - b_cancel_multi_turn_move_maybe(gEffectBank); + CancelMultiTurnMoves(gEffectBank); StatusChanged = 1; break; case STATUS_POISON: - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) + if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) { gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbility(gEffectBank, ABILITY_IMMUNITY); + RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); b_movescr_stack_push(gBattlescriptCurrInstr + 1); //_0801E664: - gBattlescriptCurrInstr = BS_PSN_PREVENTION; + gBattlescriptCurrInstr = BattleScript_PSNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); return; } else - {gBattleCommunication.multistring_chooser = 0; return;} + {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} } if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_PSN_PREVENTION; - gBattleCommunication.multistring_chooser = 2; + gBattlescriptCurrInstr = BattleScript_PSNPrevention; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; } if (gBattleMons[gEffectBank].type1 == TYPE_POISON) {break;} if (gBattleMons[gEffectBank].type2 == TYPE_POISON) {break;} if (gBattleMons[gEffectBank].type1 == TYPE_STEEL) {break;} if (gBattleMons[gEffectBank].type2 == TYPE_STEEL) {break;} - if (gBattleMons[gEffectBank].status) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY) {break;} + if (gBattleMons[gEffectBank].status1) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;} + StatusChanged = 1; break; case STATUS_BURN: - if (gBattleMons[gEffectBank].ability_id == ABILITY_WATER_VEIL && (primary == 1 || certain == 0x80)) + if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL && (primary == 1 || certain == 0x80)) { gLastUsedAbility = ABILITY_WATER_VEIL; - RecordAbility(gEffectBank, ABILITY_WATER_VEIL); + RecordAbilityBattle(gEffectBank, ABILITY_WATER_VEIL); b_movescr_stack_push(gBattlescriptCurrInstr + 1); //_0801E664: - gBattlescriptCurrInstr = BS_BRN_PREVENTION; + gBattlescriptCurrInstr = BattleScript_BRNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); return; } else - {gBattleCommunication.multistring_chooser = 0; return;} + {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} } if ((gBattleMons[gEffectBank].type1 == TYPE_FIRE || gBattleMons[gEffectBank].type2 == TYPE_FIRE) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_BRN_PREVENTION; - gBattleCommunication.multistring_chooser = 2; + gBattlescriptCurrInstr = BattleScript_BRNPrevention; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; } if (gBattleMons[gEffectBank].type1 == TYPE_FIRE) {break;} if (gBattleMons[gEffectBank].type2 == TYPE_FIRE) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_WATER_VEIL) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL) {break;} if (gBattleMons[gEffectBank].status1 == 0) {break;} StatusChanged = 1; break; @@ -2638,70 +2395,70 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) {NoSunCanFreeze = 0;} if (gBattleMons[gEffectBank].type1 == TYPE_ICE) {break;} if (gBattleMons[gEffectBank].type2 == TYPE_ICE) {break;} - if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].status1) {break;} if (NoSunCanFreeze == 0) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_MAGMA_ARMOR) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_MAGMA_ARMOR) {break;} - b_cancel_multi_turn_move_maybe(gEffectBank); + CancelMultiTurnMoves(gEffectBank); StatusChanged = 1; break; case STATUS_PARALYSIS: - if (gBattleMons[gEffectBank].ability_id == ABILITY_LIMBER) + if (gBattleMons[gEffectBank].ability == ABILITY_LIMBER) { if ((primary == 1 || certain == 0x80)) { gLastUsedAbility = ABILITY_LIMBER; - RecordAbility(gEffectBank, ABILITY_LIMBER); + RecordAbilityBattle(gEffectBank, ABILITY_LIMBER); b_movescr_stack_push(gBattlescriptCurrInstr + 1); //_0801E664: - gBattlescriptCurrInstr = BS_PRLZ_PREVENTION; + gBattlescriptCurrInstr = BattleScript_PRLZPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); return; } else - {gBattleCommunication.multistring_chooser = 0; return;} + {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} } else {break;} } - if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].status1) {break;} StatusChanged = 1; break; case STATUS_TOXIC_POISON: - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) + if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) { gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbility(gEffectBank, ABILITY_IMMUNITY); + RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); b_movescr_stack_push(gBattlescriptCurrInstr + 1); //_0801E664: - gBattlescriptCurrInstr = BS_PSN_PREVENTION; + gBattlescriptCurrInstr = BattleScript_PSNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); return; } else - {gBattleCommunication.multistring_chooser = 0; return;} + {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} } if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_PSN_PREVENTION; - gBattleCommunication.multistring_chooser = 2; + gBattlescriptCurrInstr = BattleScript_PSNPrevention; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; } - if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].status1) {break;} if (gBattleMons[gEffectBank].type1 != TYPE_POISON && gBattleMons[gEffectBank].type2 != TYPE_POISON && gBattleMons[gEffectBank].type1 != TYPE_STEEL && gBattleMons[gEffectBank].type2 != TYPE_STEEL) { - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY) {break;} - gBattleMons[gEffectBank].status1 |= ~(STATUS_POISON); //TODO: fix OR to AND + if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;} + gBattleMons[gEffectBank].status1 &= ~(0x9); //This gets (correctly) optimized out... StatusChanged = 1; break; } @@ -2716,20 +2473,20 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gBattleMons[gEffectBank].status1 |= ((Random() & 3) + 2); else gBattleMons[gEffectBank].status1 |= gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; gActiveBank = gEffectBank; - bb2_setattributes_in_battle(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status); - mark_buffer_bank_for_execution(gActiveBank); + EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status1); + MarkBufferBankForExecution(gActiveBank); if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); } else - gBattleCommunication.multistring_chooser = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; if (gBattleCommunication[MOVE_EFFECT_BYTE] == 2 || gBattleCommunication[MOVE_EFFECT_BYTE] == 6 || gBattleCommunication[MOVE_EFFECT_BYTE] == 5 || gBattleCommunication[MOVE_EFFECT_BYTE] == 3) { - BATTLE_STRUCT->SynchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; + BATTLE_STRUCT->synchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; } return; @@ -2747,22 +2504,22 @@ void SetMoveEffect(bool8 primary, u8 certainArg) switch (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) { case 7: //confusion - if (gBattleMons[gEffectBank].ability_id == ABILITY_OWN_TEMPO) + if (gBattleMons[gEffectBank].ability == ABILITY_OWN_TEMPO) {gBattlescriptCurrInstr++; return;} if (gBattleMons[gEffectBank].status2 & STATUS2_CONFUSION) {gBattlescriptCurrInstr++; return;} gBattleMons[gEffectBank].status2 |= (((Random()) % 0x4)) + 2; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 8: //flinch - if (gBattleMons[gEffectBank].ability_id == ABILITY_INNER_FOCUS) + if (gBattleMons[gEffectBank].ability == ABILITY_INNER_FOCUS) { if (primary == 1 || certain == 0x80) { gLastUsedAbility = ABILITY_INNER_FOCUS; - RecordAbility(gEffectBank, ABILITY_INNER_FOCUS); - gBattlescriptCurrInstr = BS_FLINCH_PREVENTION; + RecordAbilityBattle(gEffectBank, ABILITY_INNER_FOCUS); + gBattlescriptCurrInstr = BattleScript_FlinchPrevention; return; } else @@ -2782,21 +2539,21 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gLockedMove[gEffectBank] = gCurrentMove; gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 11: //pay day - if (!(get_bank_identity(gEffectBank) & 1)) + if (!(GetBankIdentity(gBankAttacker) & 1)) { u16 PayDay = gPaydayMoney; - gPaydayMoney += (gBattleMons[gEffectBank].level * 5); + gPaydayMoney += (gBattleMons[gBankAttacker].level * 5); if (PayDay > gPaydayMoney) gPaydayMoney = 0xFFFF; } b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 9: //tri attack - if (gBattleMons[gEffectBank].status) + if (gBattleMons[gEffectBank].status1) {gBattlescriptCurrInstr++; return;} gBattleCommunication[MOVE_EFFECT_BYTE] = Random() % 3 + 3; SetMoveEffect(0, 0); @@ -2804,73 +2561,73 @@ void SetMoveEffect(bool8 primary, u8 certainArg) case 12: //charging move gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; gLockedMove[gEffectBank] = gCurrentMove; - gProtectStructs[gEffectBank].flag1_chargingturn = 1; + gProtectStructs[gEffectBank].chargingTurn = 1; gBattlescriptCurrInstr++; break; case 13: //wrap if (gBattleMons[gEffectBank].status2 & STATUS2_WRAPPED) {gBattlescriptCurrInstr++; return;} gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 0xD; - BATTLE_STRUCT->WrappedMove1[gEffectBank] = gCurrentMove; - BATTLE_STRUCT->WrappedMove2[gEffectBank] = gCurrentMove >> 8; - BATTLE_STRUCT->WrappedBy[gEffectBank] = gBankAttacker; + BATTLE_STRUCT->wrappedMove[gEffectBank*2] = (u8)gCurrentMove; + (1 + BATTLE_STRUCT->wrappedMove)[gEffectBank*2] = gCurrentMove >> 8; //don't ask. + BATTLE_STRUCT->wrappedBy[gEffectBank] = gBankAttacker; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattleCommunication.multistring_chooser = 0; - while (gBattleCommunication.multistring_chooser <= 4 - && gCurrentMove != gTrappingMoves[gBattleCommunication.multistring_chooser]) - gBattleCommunication.multistring_chooser++; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + while (gBattleCommunication[MULTISTRING_CHOOSER] <= 4 + && gCurrentMove != gTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]]) + gBattleCommunication[MULTISTRING_CHOOSER]++; break; - case 14: //recoil + case 14: //25% recoil gBattleMoveDamage = (gHP_dealt) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 15 ... 21: //stat + 1 - if (ChangeStats(0x10, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xF2, certain, 0)) {gBattlescriptCurrInstr++;} + if (ChangeStatBuffs(0x10, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xF2, certain, 0)) {gBattlescriptCurrInstr++;} else { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; //TODO: the arg ptr is wrong by one BATTLE_STRUCT->animArg2 = 0; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_UP; + gBattlescriptCurrInstr = BattleScript_StatUp; } break; case 22 ... 28: //stat - 1 - if (ChangeStats(~(0x6f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xEB, certain, 0)) {gBattlescriptCurrInstr++;} //TODO: negation doesnt work correctly + if (ChangeStatBuffs(~(0x6f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xEB, certain, 0)) {gBattlescriptCurrInstr++;} //TODO: negation doesnt work correctly else { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; BATTLE_STRUCT->animArg2 = 0; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_DOWN; + gBattlescriptCurrInstr = BattleScript_StatDown; } break; case 39 ... 45: //stat + 2 - if (ChangeStats(0x20, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xDA, certain, 0)) {gBattlescriptCurrInstr++;} + if (ChangeStatBuffs(0x20, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xDA, certain, 0)) {gBattlescriptCurrInstr++;} else { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; BATTLE_STRUCT->animArg2 = 0; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_UP; + gBattlescriptCurrInstr = BattleScript_StatUp; } break; case 46 ... 52: //stat - 2 - if (ChangeStats(~(0x5f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xD3, certain, 0)) {gBattlescriptCurrInstr++;} + if (ChangeStatBuffs(~(0x5f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xD3, certain, 0)) {gBattlescriptCurrInstr++;} else { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; BATTLE_STRUCT->animArg2 = 0; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_DOWN; + gBattlescriptCurrInstr = BattleScript_StatDown; } break; case 29: //recharge gBattleMons[gEffectBank].status2 |= STATUS2_RECHARGE; - gDisableStructs[gEffectBank].recharge_counter = 2; + gDisableStructs[gEffectBank].rechargeCounter = 2; gLockedMove[gEffectBank] = gCurrentMove; gBattlescriptCurrInstr++; break; @@ -2880,83 +2637,85 @@ void SetMoveEffect(bool8 primary, u8 certainArg) break; case 31: //item steal { - u8 side = battle_side_get_owner(gBankAttacker); - if (battle_side_get_owner(gBankAttacker) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400) + u8 side = GetBankSide(gBankAttacker); + if (GetBankSide(gBankAttacker) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400) {gBattlescriptCurrInstr++; return;} - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400 && (gWishFutureKnock.KnockedOff[side] & gBitTable[gBattlePartyID[gBankAttacker]])) + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400 && (gWishFutureKnock.knockedOffPokes[side] & gBitTable[gBattlePartyID[gBankAttacker]])) {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].held_item && gBattleMons[gBankTarget].ability_id == ABILITY_STICKY_HOLD) + if (gBattleMons[gBankTarget].item && gBattleMons[gBankTarget].ability == ABILITY_STICKY_HOLD) { b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BS_NO_ITEMSTEAL; - gLastUsedAbility = gBattleMons[gBankTarget].ability_id; - RecordAbility(gBankTarget, gLastUsedAbility); + gBattlescriptCurrInstr = BattleScript_NoItemSteal; + gLastUsedAbility = gBattleMons[gBankTarget].ability; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); return; } - if (gBattleMons[gBankAttacker].held_item) + if (gBattleMons[gBankAttacker].item) {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].held_item == ITEM_ENIGMA_BERRY) + if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].held_item == 0) + if (gBattleMons[gBankTarget].item == 0) {gBattlescriptCurrInstr++; return;} - CHANGED_HELDITEMS[gBankAttacker] = gLastUsedItem = gBattleMons[gBankTarget].held_item; - gBattleMons[gBankTarget].held_item = 0; + gLastUsedItem = gBattleMons[gBankTarget].item; + unk_2000000[gBankAttacker * 2 + 0x160cc] = gLastUsedItem; + gBattleMons[gBankTarget].item = 0; gActiveBank = gBankAttacker; - bb2_setattributes_in_battle(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); - mark_buffer_bank_for_execution(gBankAttacker); + EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); + MarkBufferBankForExecution(gBankAttacker); gActiveBank = gBankTarget; - bb2_setattributes_in_battle(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].held_item); - mark_buffer_bank_for_execution(gBankTarget); + EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item); + MarkBufferBankForExecution(gBankTarget); b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_ITEMSTEAL; + gBattlescriptCurrInstr = BattleScript_ItemSteal; - STORE_CHOICEMOVE(gBankTarget, 0); + ewram[gBankTarget * 2 + 0x160e8] = 0; + //STORE_CHOICEMOVE(gBankTarget, 0); } break; case 32: //escape prevention gBattleMons[gBankTarget].status2 |= STATUS2_RECHARGE; - gDisableStructs[gBankTarget].BankPreventingEscape = gBankAttacker; + gDisableStructs[gBankTarget].bankPreventingEscape = gBankAttacker; gBattlescriptCurrInstr++; break; case 33: //nightmare gBattleMons[gBankTarget].status2 |= STATUS2_NIGHTMARE; gBattlescriptCurrInstr++; break; - case 34: + case 34: //ancientpower b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D9224; + gBattlescriptCurrInstr = BattleScript_AllStatsUp; return; case 35: //break free rapidspin b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_RAPIDSPINAWAY; + gBattlescriptCurrInstr = BattleScript_RapidSpinAway; return; case 36: //paralysis removal if (gBattleMons[gBankTarget].status1 & STATUS_PARALYSIS) { gBattleMons[gBankTarget].status1 &= ~(STATUS_PARALYSIS); gActiveBank = gBankTarget; - bb2_setattributes_in_battle(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status); - mark_buffer_bank_for_execution(gActiveBank); + EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); + MarkBufferBankForExecution(gActiveBank); b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_PARALYSISHEALED; + gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; } else {gBattlescriptCurrInstr++; return;} break; - case 37: // + case 37: //superpower b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D93FA; + gBattlescriptCurrInstr = BattleScript_AtkDefDown; return; - case 38: //recoil plus paralysis + case 38: //33% recoil gBattleMoveDamage = gHP_dealt / 3; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 53: //thrash if (!(gBattleMons[gEffectBank].status2 & STATUS2_LOCK_CONFUSE)) @@ -2969,32 +2728,33 @@ void SetMoveEffect(bool8 primary, u8 certainArg) {gBattlescriptCurrInstr++; return;} break; case 54: //knock off - if (gBattleMons[gEffectBank].ability_id == ABILITY_STICKY_HOLD) + if (gBattleMons[gEffectBank].ability == ABILITY_STICKY_HOLD) { - if (gBattleMons[gEffectBank].held_item == 0) + if (gBattleMons[gEffectBank].item == 0) {gBattlescriptCurrInstr++; return;} gLastUsedAbility = ABILITY_STICKY_HOLD; - gBattlescriptCurrInstr = BS_STICKYHOLD_ACTIVATES; - RecordAbility(gEffectBank, ABILITY_STICKY_HOLD); + gBattlescriptCurrInstr = BattleScript_NoItemSteal; + RecordAbilityBattle(gEffectBank, ABILITY_STICKY_HOLD); return; } - if (gBattleMons[gEffectBank].held_item == 0) + if (gBattleMons[gEffectBank].item == 0) {gBattlescriptCurrInstr++; return;} else { - u8 side = battle_side_get_owner(gEffectBank); - gLastUsedItem = gBattleMons[gEffectBank].held_item; - gBattleMons[gEffectBank].held_item = 0; - gWishFutureKnock.KnockedOff[side] |= gBitTable[gBattlePartyID[gEffectBank]]; + u8 side = GetBankSide(gEffectBank); + gLastUsedItem = gBattleMons[gEffectBank].item; + gBattleMons[gEffectBank].item = 0; + gWishFutureKnock.knockedOffPokes[side] |= gBitTable[gBattlePartyID[gEffectBank]]; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_KNOCKEDOFF; + gBattlescriptCurrInstr = BattleScript_KnockedOff; - STORE_CHOICEMOVE(gEffectBank, 0); + ewram[gEffectBank * 2 + 0x160e8] = 0; + //STORE_CHOICEMOVE(gEffectBank, 0); } break; - case 59: //overheat I guess, dont remember + case 59: //overheat b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D94B0; + gBattlescriptCurrInstr = BattleScript_SAtkDown2; return; } } @@ -4897,11 +4657,11 @@ _0801F3BC:\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ bl b_movescr_stack_push\n\ - ldr r0, _0801F3D0 @ =gUnknown_081D9224\n\ + ldr r0, _0801F3D0 @ =BattleScript_AllStatsUp\n\ b _0801F5F8\n\ .align 2, 0\n\ _0801F3CC: .4byte gBattlescriptCurrInstr\n\ -_0801F3D0: .4byte gUnknown_081D9224\n\ +_0801F3D0: .4byte BattleScript_AllStatsUp\n\ _0801F3D4:\n\ ldr r4, _0801F3E4 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ @@ -4961,11 +4721,11 @@ _0801F44C:\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ bl b_movescr_stack_push\n\ - ldr r0, _0801F460 @ =gUnknown_081D93FA\n\ + ldr r0, _0801F460 @ =BattleScript_AtkDefDown\n\ b _0801F5F8\n\ .align 2, 0\n\ _0801F45C: .4byte gBattlescriptCurrInstr\n\ -_0801F460: .4byte gUnknown_081D93FA\n\ +_0801F460: .4byte BattleScript_AtkDefDown\n\ _0801F464:\n\ ldr r4, _0801F494 @ =gBattleMoveDamage\n\ ldr r0, _0801F498 @ =gHP_dealt\n\ @@ -5150,7 +4910,7 @@ _0801F5EC:\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ bl b_movescr_stack_push\n\ - ldr r0, _0801F610 @ =gUnknown_081D94B0\n\ + ldr r0, _0801F610 @ =BattleScript_SAtkDown2\n\ _0801F5F8:\n\ str r0, [r4]\n\ _0801F5FA:\n\ @@ -5164,11 +4924,12 @@ _0801F5FA:\n\ bx r0\n\ .align 2, 0\n\ _0801F60C: .4byte gBattlescriptCurrInstr\n\ -_0801F610: .4byte gUnknown_081D94B0\n\ +_0801F610: .4byte BattleScript_SAtkDown2\n\ .syntax divided\n"); } #endif // NONMATCHING + static void atk15_seteffectwithchancetarget(void) { u32 PercentChance; @@ -5841,13 +5602,14 @@ static void atk23_getexp(void) else { BATTLE_STRUCT->atk23StateTracker++; - unk_2000000[0x16113] |= gBitTable[gBattlePartyID[gBank1]]; + ((u8*)ewram)[0x16113] |= gBitTable[gBattlePartyID[gBank1]]; } break; case 1: //calculate experience points to redistribute { - int via_sent_in = 0, i; + int via_sent_in = 0; u16 calculatedExp; + int i; for (i = 0; i < 6; i++) { u16 item; @@ -5903,15 +5665,14 @@ static void atk23_getexp(void) BATTLE_STRUCT->sentInPokes >>= 1; tracker = &BATTLE_STRUCT->atk23StateTracker; zero = 0; - goto LABEL; + *tracker = 5; //increment looper + gBattleMoveDamage = zero; //used for exp } else if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) == 100) { - BATTLE_STRUCT->sentInPokes >>= 1; tracker = &BATTLE_STRUCT->atk23StateTracker; zero = 0; - LABEL: *tracker = 5; //increment looper gBattleMoveDamage = zero; //used for exp } @@ -5927,7 +5688,7 @@ static void atk23_getexp(void) if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP)) { - s16 stringID; + s16 stringID; if (BATTLE_STRUCT->sentInPokes & 1) gBattleMoveDamage = *exp; else @@ -5946,7 +5707,9 @@ static void atk23_getexp(void) stringID = 0x14A; } else - stringID = 0x149; + { + stringID = 0x149; + } //get exp getter bank if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) @@ -5971,12 +5734,13 @@ static void atk23_getexp(void) gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID; gBattleTextBuff1[4] = 0xFF; - //buffer 'gained' or 'gained a boosted' - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = sBYTE0_32(stringID); - gBattleTextBuff2[3] = sBYTE1_32(stringID); - gBattleTextBuff2[4] = 0xFF; + //buffer 'gained' or 'gained a boosted' + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 0; + gBattleTextBuff2[2] = stringID; + stringID = (stringID >> 8) & (0xFF); //this does not want to cooperate + gBattleTextBuff2[3] = stringID; + gBattleTextBuff2[4] = 0xFF; //buffer exp number gBattleTextBuff3[0] = 0xFD; @@ -6003,12 +5767,12 @@ static void atk23_getexp(void) gBattleBufferB[BATTLE_STRUCT->expGetterBank][0] = 0; if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) != 100) { - BATTLE_STRUCT->beforeLvlUp[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); //doesnt match - BATTLE_STRUCT->beforeLvlUp[1] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); - BATTLE_STRUCT->beforeLvlUp[2] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); - BATTLE_STRUCT->beforeLvlUp[3] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); - BATTLE_STRUCT->beforeLvlUp[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); - BATTLE_STRUCT->beforeLvlUp[5] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF); + ((u16*)ewram + 0xB8C0)[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); //doesnt match + ((u16*)ewram + 0xB8C0)[1] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); + ((u16*)ewram + 0xB8C0)[2] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); + ((u16*)ewram + 0xB8C0)[3] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); + ((u16*)ewram + 0xB8C0)[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); + ((u16*)ewram + 0xB8C0)[5] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF); gActiveBank = BATTLE_STRUCT->expGetterBank; EmitExpBarUpdate(0, BATTLE_STRUCT->expGetterID, gBattleMoveDamage); @@ -8031,9 +7795,39 @@ _080214AE:\n\ #ifdef NONMATCHING static void atk46_playanimation2(void) { - + u8 arg1; + u8* arg2; + u16* arg3; + u32 something; + + arg1 = BSScriptRead8(gBattlescriptCurrInstr + 1); + gActiveBank = GetBattleBank(arg1); + arg2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); + arg3 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6); + + if (*arg2 == 1 || *arg2 == 0x11 || *arg2 == 2) + { + EmitBattleAnimation(0, *arg2, *arg3); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 10; + return; + } + if ((gHitMarker & 0x80)) + { + something = (u32)(gBattlescriptCurrInstr + 10); + } + else + { + u8 yeah = *arg2 - 10; + if (yeah < 4 || (gStatuses3[gActiveBank] & 0x000400C0) == 0) + { + EmitBattleAnimation(0, *arg2, *arg3); + MarkBufferBankForExecution(gActiveBank); + } + something = (u32)(gBattlescriptCurrInstr + 10); + } + gBattlescriptCurrInstr = (u8*)something; } - #else __attribute__((naked)) static void atk46_playanimation2(void) -- cgit v1.2.3 From 1a8fe435e7deabf06029c8e50201136518e3af73 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 12 Aug 2017 01:26:29 -0400 Subject: split out src/ directory into categorized subdirectories. --- src/agb_flash.c | 295 - src/agb_flash_1m.c | 86 - src/agb_flash_le.c | 31 - src/agb_flash_mx.c | 197 - src/bard_music.c | 97 - src/battle/battle_10.c | 1323 +++ src/battle/battle_2.c | 2441 +++++ src/battle/battle_4.c | 18196 +++++++++++++++++++++++++++++++ src/battle/battle_6.c | 1507 +++ src/battle/battle_7.c | 1235 +++ src/battle/battle_8.c | 1642 +++ src/battle/battle_811DA74.c | 1606 +++ src/battle/battle_ai.c | 2150 ++++ src/battle/battle_anim.c | 2270 ++++ src/battle/battle_anim_80A7E7C.c | 940 ++ src/battle/battle_anim_81258BC.c | 50 + src/battle/battle_anim_8137220.c | 1486 +++ src/battle/battle_interface.c | 3049 ++++++ src/battle/battle_party_menu.c | 756 ++ src/battle/battle_records.c | 334 + src/battle/battle_setup.c | 1416 +++ src/battle/calculate_base_damage.c | 1474 +++ src/battle/contest_link_80C857C.c | 55 + src/battle/pokeball.c | 1193 ++ src/battle/post_battle_event_funcs.c | 69 + src/battle/smokescreen.c | 73 + src/battle_10.c | 1323 --- src/battle_2.c | 2441 ----- src/battle_4.c | 18196 ------------------------------- src/battle_6.c | 1507 --- src/battle_7.c | 1235 --- src/battle_8.c | 1642 --- src/battle_811DA74.c | 1606 --- src/battle_ai.c | 2150 ---- src/battle_anim.c | 2270 ---- src/battle_anim_80A7E7C.c | 940 -- src/battle_anim_81258BC.c | 50 - src/battle_anim_8137220.c | 1486 --- src/battle_interface.c | 3049 ------ src/battle_party_menu.c | 756 -- src/battle_records.c | 334 - src/battle_setup.c | 1416 --- src/berry.c | 1380 --- src/berry_tag_screen.c | 580 - src/bike.c | 1013 -- src/birch_pc.c | 114 - src/blend_palette.c | 20 - src/braille_puzzles.c | 258 - src/cable_club.c | 317 - src/calculate_base_damage.c | 1474 --- src/choose_party.c | 1072 -- src/clear_save_data_menu.c | 177 - src/clock.c | 90 - src/coins.c | 84 - src/contest_link_80C857C.c | 55 - src/contest_painting.c | 805 -- src/coord_event_weather.c | 118 - src/credits.c | 1496 --- src/daycare.c | 350 - src/de_rom_8040FE0.c | 272 - src/debug/matsuda_debug_menu.c | 1113 ++ src/debug/mori_debug_menu.c | 168 + src/debug/unknown_debug_menu.c | 52 + src/decompress.c | 112 - src/decoration.c | 4280 -------- src/decoration_inventory.c | 169 - src/dewford_trend.c | 332 - src/diploma.c | 139 - src/easy_chat.c | 442 - src/egg_hatch.c | 52 - src/engine/agb_flash.c | 295 + src/engine/agb_flash_1m.c | 86 + src/engine/agb_flash_le.c | 31 + src/engine/agb_flash_mx.c | 197 + src/engine/blend_palette.c | 20 + src/engine/cable_club.c | 317 + src/engine/clear_save_data_menu.c | 177 + src/engine/clock.c | 90 + src/engine/decompress.c | 112 + src/engine/libc.c | 143 + src/engine/link.c | 1820 ++++ src/engine/load_save.c | 168 + src/engine/m4a_2.c | 912 ++ src/engine/m4a_4.c | 545 + src/engine/m4a_tables.c | 307 + src/engine/main.c | 363 + src/engine/main_menu.c | 1639 +++ src/engine/menu.c | 871 ++ src/engine/menu_cursor.c | 798 ++ src/engine/mystery_event_menu.c | 341 + src/engine/mystery_event_script.c | 462 + src/engine/name_string_util.c | 40 + src/engine/naming_screen.c | 2038 ++++ src/engine/option_menu.c | 579 + src/engine/palette.c | 834 ++ src/engine/play_time.c | 73 + src/engine/record_mixing.c | 1085 ++ src/engine/reset_rtc_screen.c | 496 + src/engine/rng.c | 18 + src/engine/rtc.c | 349 + src/engine/save.c | 797 ++ src/engine/save_failed_screen.c | 310 + src/engine/save_menu_util.c | 148 + src/engine/script.c | 368 + src/engine/siirtc.c | 432 + src/engine/sound.c | 585 + src/engine/sound_check_menu.c | 2199 ++++ src/engine/sprite.c | 1802 +++ src/engine/string_util.c | 561 + src/engine/task.c | 209 + src/engine/text.c | 4324 ++++++++ src/engine/text_window.c | 184 + src/engine/tileset_anim.c | 630 ++ src/engine/time_events.c | 118 + src/engine/trade.c | 88 + src/engine/trainer_card.c | 1569 +++ src/engine/trig.c | 549 + src/engine/util.c | 525 + src/event_data.c | 184 - src/field/bard_music.c | 97 + src/field/berry.c | 1380 +++ src/field/berry_tag_screen.c | 580 + src/field/bike.c | 1013 ++ src/field/birch_pc.c | 114 + src/field/braille_puzzles.c | 258 + src/field/choose_party.c | 1072 ++ src/field/coins.c | 84 + src/field/coord_event_weather.c | 118 + src/field/daycare.c | 350 + src/field/decoration.c | 4280 ++++++++ src/field/decoration_inventory.c | 169 + src/field/dewford_trend.c | 332 + src/field/diploma.c | 139 + src/field/easy_chat.c | 442 + src/field/event_data.c | 184 + src/field/field_camera.c | 495 + src/field/field_control_avatar.c | 878 ++ src/field/field_door.c | 221 + src/field/field_effect.c | 3406 ++++++ src/field/field_fadetransition.c | 626 ++ src/field/field_ground_effect.c | 240 + src/field/field_map_obj.c | 8474 ++++++++++++++ src/field/field_map_obj_helpers.c | 318 + src/field/field_message_box.c | 155 + src/field/field_player_avatar.c | 1728 +++ src/field/field_poison.c | 143 + src/field/field_region_map.c | 125 + src/field/field_screen_effect.c | 340 + src/field/field_special_scene.c | 349 + src/field/field_specials.c | 2383 ++++ src/field/field_tasks.c | 859 ++ src/field/field_weather.c | 367 + src/field/fieldmap.c | 955 ++ src/field/fldeff_cut.c | 290 + src/field/fldeff_flash.c | 306 + src/field/fldeff_softboiled.c | 153 + src/field/fldeff_strength.c | 76 + src/field/fldeff_sweetscent.c | 88 + src/field/fldeff_teleport.c | 46 + src/field/heal_location.c | 63 + src/field/hof_pc.c | 42 + src/field/item.c | 674 ++ src/field/item_menu.c | 4583 ++++++++ src/field/item_use.c | 1198 ++ src/field/landmark.c | 73 + src/field/lottery_corner.c | 174 + src/field/map_name_popup.c | 107 + src/field/map_obj_lock.c | 118 + src/field/mauville_old_man.c | 247 + src/field/menu_helpers.c | 572 + src/field/metatile_behavior.c | 1308 +++ src/field/money.c | 275 + src/field/party_menu.c | 1505 +++ src/field/player_pc.c | 1368 +++ src/field/pokeblock.c | 1134 ++ src/field/pokenav.c | 40 + src/field/region_map.c | 1847 ++++ src/field/roamer.c | 226 + src/field/rotating_gate.c | 1228 +++ src/field/safari_zone.c | 253 + src/field/scrcmd.c | 1887 ++++ src/field/script_menu.c | 1134 ++ src/field/script_movement.c | 224 + src/field/secret_base.c | 1075 ++ src/field/shop.c | 342 + src/field/slot_machine.c | 150 + src/field/start_menu.c | 850 ++ src/field/starter_choose.c | 757 ++ src/field/trader.c | 261 + src/field/trainer_see.c | 455 + src/field/tv.c | 3260 ++++++ src/field/use_pokeblock.c | 965 ++ src/field/wallclock.c | 1061 ++ src/field/wild_encounter.c | 3568 ++++++ src/field_camera.c | 495 - src/field_control_avatar.c | 878 -- src/field_door.c | 221 - src/field_effect.c | 3406 ------ src/field_fadetransition.c | 626 -- src/field_ground_effect.c | 240 - src/field_map_obj.c | 8474 -------------- src/field_map_obj_helpers.c | 318 - src/field_message_box.c | 155 - src/field_player_avatar.c | 1728 --- src/field_poison.c | 143 - src/field_region_map.c | 125 - src/field_screen_effect.c | 340 - src/field_special_scene.c | 349 - src/field_specials.c | 2383 ---- src/field_tasks.c | 859 -- src/field_weather.c | 367 - src/fieldmap.c | 955 -- src/fldeff_cut.c | 290 - src/fldeff_flash.c | 306 - src/fldeff_softboiled.c | 153 - src/fldeff_strength.c | 76 - src/fldeff_sweetscent.c | 88 - src/fldeff_teleport.c | 46 - src/heal_location.c | 63 - src/hof_pc.c | 42 - src/intro.c | 3167 ------ src/item.c | 674 -- src/item_menu.c | 4583 -------- src/item_use.c | 1198 -- src/landmark.c | 73 - src/libc.c | 143 - src/link.c | 1820 ---- src/load_save.c | 168 - src/lottery_corner.c | 174 - src/m4a_2.c | 912 -- src/m4a_4.c | 545 - src/m4a_tables.c | 307 - src/mail.c | 437 - src/mail_data.c | 208 - src/main.c | 363 - src/main_menu.c | 1639 --- src/map_name_popup.c | 107 - src/map_obj_lock.c | 118 - src/matsuda_debug_menu.c | 1113 -- src/mauville_old_man.c | 247 - src/menu.c | 871 -- src/menu_cursor.c | 798 -- src/menu_helpers.c | 572 - src/metatile_behavior.c | 1308 --- src/misc/de_rom_8040FE0.c | 272 + src/misc/rom3.c | 1393 +++ src/misc/rom4.c | 2573 +++++ src/misc/rom6.c | 202 + src/misc/rom_800D42C.c | 118 + src/misc/rom_8077ABC.c | 2055 ++++ src/misc/script_pokemon_util_80C4BF0.c | 716 ++ src/misc/script_pokemon_util_80F99CC.c | 445 + src/misc/unknown_task.c | 255 + src/misc/unused_8124F94.c | 126 + src/mon_markings.c | 383 - src/money.c | 275 - src/mori_debug_menu.c | 168 - src/mystery_event_menu.c | 341 - src/mystery_event_script.c | 462 - src/name_string_util.c | 40 - src/naming_screen.c | 2038 ---- src/new_game.c | 166 - src/option_menu.c | 579 - src/palette.c | 834 -- src/party_menu.c | 1505 --- src/play_time.c | 73 - src/player_pc.c | 1368 --- src/pokeball.c | 1193 -- src/pokeblock.c | 1134 -- src/pokedex.c | 5528 ---------- src/pokedex_cry_screen.c | 85 - src/pokemon/mail.c | 437 + src/pokemon/mail_data.c | 208 + src/pokemon/mon_markings.c | 383 + src/pokemon/pokedex.c | 5528 ++++++++++ src/pokemon/pokedex_cry_screen.c | 85 + src/pokemon/pokemon_1.c | 666 ++ src/pokemon/pokemon_2.c | 1312 +++ src/pokemon/pokemon_3.c | 1380 +++ src/pokemon/pokemon_data.c | 128 + src/pokemon/pokemon_icon.c | 1276 +++ src/pokemon/pokemon_size_record.c | 217 + src/pokemon/pokemon_storage_system.c | 99 + src/pokemon/pokemon_summary_screen.c | 180 + src/pokemon_1.c | 666 -- src/pokemon_2.c | 1312 --- src/pokemon_3.c | 1380 --- src/pokemon_data.c | 128 - src/pokemon_icon.c | 1276 --- src/pokemon_size_record.c | 217 - src/pokemon_storage_system.c | 99 - src/pokemon_summary_screen.c | 180 - src/pokenav.c | 40 - src/post_battle_event_funcs.c | 69 - src/record_mixing.c | 1085 -- src/region_map.c | 1847 ---- src/reset_rtc_screen.c | 496 - src/rng.c | 18 - src/roamer.c | 226 - src/rom3.c | 1393 --- src/rom4.c | 2573 ----- src/rom6.c | 202 - src/rom_800D42C.c | 118 - src/rom_8077ABC.c | 2055 ---- src/rotating_gate.c | 1228 --- src/rtc.c | 349 - src/safari_zone.c | 253 - src/save.c | 797 -- src/save_failed_screen.c | 310 - src/save_menu_util.c | 148 - src/scene/contest_painting.c | 805 ++ src/scene/credits.c | 1496 +++ src/scene/egg_hatch.c | 52 + src/scene/intro.c | 3167 ++++++ src/scene/new_game.c | 166 + src/scene/title_screen.c | 892 ++ src/scrcmd.c | 1887 ---- src/script.c | 368 - src/script_menu.c | 1134 -- src/script_movement.c | 224 - src/script_pokemon_util_80C4BF0.c | 716 -- src/script_pokemon_util_80F99CC.c | 445 - src/secret_base.c | 1075 -- src/shop.c | 342 - src/siirtc.c | 432 - src/slot_machine.c | 150 - src/smokescreen.c | 73 - src/sound.c | 585 - src/sound_check_menu.c | 2199 ---- src/sprite.c | 1802 --- src/start_menu.c | 850 -- src/starter_choose.c | 757 -- src/string_util.c | 561 - src/task.c | 209 - src/text.c | 4324 -------- src/text_window.c | 184 - src/tileset_anim.c | 630 -- src/time_events.c | 118 - src/title_screen.c | 892 -- src/trade.c | 88 - src/trader.c | 261 - src/trainer_card.c | 1569 --- src/trainer_see.c | 455 - src/trig.c | 549 - src/tv.c | 3260 ------ src/unknown_debug_menu.c | 52 - src/unknown_task.c | 255 - src/unused_8124F94.c | 126 - src/use_pokeblock.c | 965 -- src/util.c | 525 - src/wallclock.c | 1061 -- src/wild_encounter.c | 3568 ------ 352 files changed, 168491 insertions(+), 168491 deletions(-) delete mode 100644 src/agb_flash.c delete mode 100644 src/agb_flash_1m.c delete mode 100644 src/agb_flash_le.c delete mode 100644 src/agb_flash_mx.c delete mode 100644 src/bard_music.c create mode 100644 src/battle/battle_10.c create mode 100644 src/battle/battle_2.c create mode 100644 src/battle/battle_4.c create mode 100644 src/battle/battle_6.c create mode 100644 src/battle/battle_7.c create mode 100644 src/battle/battle_8.c create mode 100644 src/battle/battle_811DA74.c create mode 100644 src/battle/battle_ai.c create mode 100644 src/battle/battle_anim.c create mode 100644 src/battle/battle_anim_80A7E7C.c create mode 100644 src/battle/battle_anim_81258BC.c create mode 100644 src/battle/battle_anim_8137220.c create mode 100644 src/battle/battle_interface.c create mode 100644 src/battle/battle_party_menu.c create mode 100644 src/battle/battle_records.c create mode 100644 src/battle/battle_setup.c create mode 100644 src/battle/calculate_base_damage.c create mode 100644 src/battle/contest_link_80C857C.c create mode 100644 src/battle/pokeball.c create mode 100644 src/battle/post_battle_event_funcs.c create mode 100644 src/battle/smokescreen.c delete mode 100644 src/battle_10.c delete mode 100644 src/battle_2.c delete mode 100644 src/battle_4.c delete mode 100644 src/battle_6.c delete mode 100644 src/battle_7.c delete mode 100644 src/battle_8.c delete mode 100644 src/battle_811DA74.c delete mode 100644 src/battle_ai.c delete mode 100644 src/battle_anim.c delete mode 100644 src/battle_anim_80A7E7C.c delete mode 100644 src/battle_anim_81258BC.c delete mode 100644 src/battle_anim_8137220.c delete mode 100644 src/battle_interface.c delete mode 100644 src/battle_party_menu.c delete mode 100644 src/battle_records.c delete mode 100644 src/battle_setup.c delete mode 100644 src/berry.c delete mode 100644 src/berry_tag_screen.c delete mode 100644 src/bike.c delete mode 100644 src/birch_pc.c delete mode 100644 src/blend_palette.c delete mode 100644 src/braille_puzzles.c delete mode 100644 src/cable_club.c delete mode 100644 src/calculate_base_damage.c delete mode 100644 src/choose_party.c delete mode 100644 src/clear_save_data_menu.c delete mode 100644 src/clock.c delete mode 100644 src/coins.c delete mode 100644 src/contest_link_80C857C.c delete mode 100644 src/contest_painting.c delete mode 100644 src/coord_event_weather.c delete mode 100644 src/credits.c delete mode 100644 src/daycare.c delete mode 100644 src/de_rom_8040FE0.c create mode 100644 src/debug/matsuda_debug_menu.c create mode 100644 src/debug/mori_debug_menu.c create mode 100644 src/debug/unknown_debug_menu.c delete mode 100644 src/decompress.c delete mode 100644 src/decoration.c delete mode 100644 src/decoration_inventory.c delete mode 100644 src/dewford_trend.c delete mode 100644 src/diploma.c delete mode 100644 src/easy_chat.c delete mode 100644 src/egg_hatch.c create mode 100644 src/engine/agb_flash.c create mode 100644 src/engine/agb_flash_1m.c create mode 100644 src/engine/agb_flash_le.c create mode 100644 src/engine/agb_flash_mx.c create mode 100644 src/engine/blend_palette.c create mode 100644 src/engine/cable_club.c create mode 100644 src/engine/clear_save_data_menu.c create mode 100644 src/engine/clock.c create mode 100644 src/engine/decompress.c create mode 100644 src/engine/libc.c create mode 100644 src/engine/link.c create mode 100644 src/engine/load_save.c create mode 100644 src/engine/m4a_2.c create mode 100644 src/engine/m4a_4.c create mode 100644 src/engine/m4a_tables.c create mode 100644 src/engine/main.c create mode 100644 src/engine/main_menu.c create mode 100644 src/engine/menu.c create mode 100644 src/engine/menu_cursor.c create mode 100644 src/engine/mystery_event_menu.c create mode 100644 src/engine/mystery_event_script.c create mode 100644 src/engine/name_string_util.c create mode 100644 src/engine/naming_screen.c create mode 100644 src/engine/option_menu.c create mode 100644 src/engine/palette.c create mode 100644 src/engine/play_time.c create mode 100644 src/engine/record_mixing.c create mode 100644 src/engine/reset_rtc_screen.c create mode 100644 src/engine/rng.c create mode 100644 src/engine/rtc.c create mode 100644 src/engine/save.c create mode 100644 src/engine/save_failed_screen.c create mode 100644 src/engine/save_menu_util.c create mode 100644 src/engine/script.c create mode 100644 src/engine/siirtc.c create mode 100644 src/engine/sound.c create mode 100644 src/engine/sound_check_menu.c create mode 100644 src/engine/sprite.c create mode 100644 src/engine/string_util.c create mode 100644 src/engine/task.c create mode 100644 src/engine/text.c create mode 100644 src/engine/text_window.c create mode 100644 src/engine/tileset_anim.c create mode 100644 src/engine/time_events.c create mode 100644 src/engine/trade.c create mode 100644 src/engine/trainer_card.c create mode 100644 src/engine/trig.c create mode 100644 src/engine/util.c delete mode 100644 src/event_data.c create mode 100644 src/field/bard_music.c create mode 100644 src/field/berry.c create mode 100644 src/field/berry_tag_screen.c create mode 100644 src/field/bike.c create mode 100644 src/field/birch_pc.c create mode 100644 src/field/braille_puzzles.c create mode 100644 src/field/choose_party.c create mode 100644 src/field/coins.c create mode 100644 src/field/coord_event_weather.c create mode 100644 src/field/daycare.c create mode 100644 src/field/decoration.c create mode 100644 src/field/decoration_inventory.c create mode 100644 src/field/dewford_trend.c create mode 100644 src/field/diploma.c create mode 100644 src/field/easy_chat.c create mode 100644 src/field/event_data.c create mode 100644 src/field/field_camera.c create mode 100644 src/field/field_control_avatar.c create mode 100644 src/field/field_door.c create mode 100644 src/field/field_effect.c create mode 100644 src/field/field_fadetransition.c create mode 100644 src/field/field_ground_effect.c create mode 100644 src/field/field_map_obj.c create mode 100644 src/field/field_map_obj_helpers.c create mode 100644 src/field/field_message_box.c create mode 100644 src/field/field_player_avatar.c create mode 100644 src/field/field_poison.c create mode 100644 src/field/field_region_map.c create mode 100644 src/field/field_screen_effect.c create mode 100644 src/field/field_special_scene.c create mode 100644 src/field/field_specials.c create mode 100644 src/field/field_tasks.c create mode 100644 src/field/field_weather.c create mode 100644 src/field/fieldmap.c create mode 100644 src/field/fldeff_cut.c create mode 100644 src/field/fldeff_flash.c create mode 100644 src/field/fldeff_softboiled.c create mode 100644 src/field/fldeff_strength.c create mode 100644 src/field/fldeff_sweetscent.c create mode 100644 src/field/fldeff_teleport.c create mode 100644 src/field/heal_location.c create mode 100644 src/field/hof_pc.c create mode 100644 src/field/item.c create mode 100644 src/field/item_menu.c create mode 100644 src/field/item_use.c create mode 100644 src/field/landmark.c create mode 100644 src/field/lottery_corner.c create mode 100644 src/field/map_name_popup.c create mode 100644 src/field/map_obj_lock.c create mode 100644 src/field/mauville_old_man.c create mode 100644 src/field/menu_helpers.c create mode 100644 src/field/metatile_behavior.c create mode 100644 src/field/money.c create mode 100644 src/field/party_menu.c create mode 100644 src/field/player_pc.c create mode 100644 src/field/pokeblock.c create mode 100644 src/field/pokenav.c create mode 100644 src/field/region_map.c create mode 100644 src/field/roamer.c create mode 100644 src/field/rotating_gate.c create mode 100644 src/field/safari_zone.c create mode 100644 src/field/scrcmd.c create mode 100644 src/field/script_menu.c create mode 100644 src/field/script_movement.c create mode 100644 src/field/secret_base.c create mode 100644 src/field/shop.c create mode 100644 src/field/slot_machine.c create mode 100644 src/field/start_menu.c create mode 100644 src/field/starter_choose.c create mode 100644 src/field/trader.c create mode 100644 src/field/trainer_see.c create mode 100644 src/field/tv.c create mode 100644 src/field/use_pokeblock.c create mode 100644 src/field/wallclock.c create mode 100644 src/field/wild_encounter.c delete mode 100644 src/field_camera.c delete mode 100644 src/field_control_avatar.c delete mode 100644 src/field_door.c delete mode 100644 src/field_effect.c delete mode 100644 src/field_fadetransition.c delete mode 100644 src/field_ground_effect.c delete mode 100644 src/field_map_obj.c delete mode 100644 src/field_map_obj_helpers.c delete mode 100644 src/field_message_box.c delete mode 100644 src/field_player_avatar.c delete mode 100644 src/field_poison.c delete mode 100644 src/field_region_map.c delete mode 100644 src/field_screen_effect.c delete mode 100644 src/field_special_scene.c delete mode 100644 src/field_specials.c delete mode 100644 src/field_tasks.c delete mode 100644 src/field_weather.c delete mode 100644 src/fieldmap.c delete mode 100644 src/fldeff_cut.c delete mode 100644 src/fldeff_flash.c delete mode 100644 src/fldeff_softboiled.c delete mode 100644 src/fldeff_strength.c delete mode 100644 src/fldeff_sweetscent.c delete mode 100644 src/fldeff_teleport.c delete mode 100644 src/heal_location.c delete mode 100644 src/hof_pc.c delete mode 100644 src/intro.c delete mode 100644 src/item.c delete mode 100644 src/item_menu.c delete mode 100644 src/item_use.c delete mode 100644 src/landmark.c delete mode 100644 src/libc.c delete mode 100644 src/link.c delete mode 100644 src/load_save.c delete mode 100644 src/lottery_corner.c delete mode 100644 src/m4a_2.c delete mode 100644 src/m4a_4.c delete mode 100644 src/m4a_tables.c delete mode 100644 src/mail.c delete mode 100644 src/mail_data.c delete mode 100644 src/main.c delete mode 100644 src/main_menu.c delete mode 100644 src/map_name_popup.c delete mode 100644 src/map_obj_lock.c delete mode 100644 src/matsuda_debug_menu.c delete mode 100644 src/mauville_old_man.c delete mode 100644 src/menu.c delete mode 100644 src/menu_cursor.c delete mode 100644 src/menu_helpers.c delete mode 100644 src/metatile_behavior.c create mode 100644 src/misc/de_rom_8040FE0.c create mode 100644 src/misc/rom3.c create mode 100644 src/misc/rom4.c create mode 100644 src/misc/rom6.c create mode 100644 src/misc/rom_800D42C.c create mode 100644 src/misc/rom_8077ABC.c create mode 100644 src/misc/script_pokemon_util_80C4BF0.c create mode 100644 src/misc/script_pokemon_util_80F99CC.c create mode 100644 src/misc/unknown_task.c create mode 100644 src/misc/unused_8124F94.c delete mode 100644 src/mon_markings.c delete mode 100644 src/money.c delete mode 100644 src/mori_debug_menu.c delete mode 100644 src/mystery_event_menu.c delete mode 100644 src/mystery_event_script.c delete mode 100644 src/name_string_util.c delete mode 100644 src/naming_screen.c delete mode 100644 src/new_game.c delete mode 100644 src/option_menu.c delete mode 100644 src/palette.c delete mode 100644 src/party_menu.c delete mode 100644 src/play_time.c delete mode 100644 src/player_pc.c delete mode 100644 src/pokeball.c delete mode 100644 src/pokeblock.c delete mode 100644 src/pokedex.c delete mode 100644 src/pokedex_cry_screen.c create mode 100644 src/pokemon/mail.c create mode 100644 src/pokemon/mail_data.c create mode 100644 src/pokemon/mon_markings.c create mode 100644 src/pokemon/pokedex.c create mode 100644 src/pokemon/pokedex_cry_screen.c create mode 100644 src/pokemon/pokemon_1.c create mode 100644 src/pokemon/pokemon_2.c create mode 100644 src/pokemon/pokemon_3.c create mode 100644 src/pokemon/pokemon_data.c create mode 100644 src/pokemon/pokemon_icon.c create mode 100644 src/pokemon/pokemon_size_record.c create mode 100644 src/pokemon/pokemon_storage_system.c create mode 100644 src/pokemon/pokemon_summary_screen.c delete mode 100644 src/pokemon_1.c delete mode 100644 src/pokemon_2.c delete mode 100644 src/pokemon_3.c delete mode 100644 src/pokemon_data.c delete mode 100644 src/pokemon_icon.c delete mode 100644 src/pokemon_size_record.c delete mode 100644 src/pokemon_storage_system.c delete mode 100644 src/pokemon_summary_screen.c delete mode 100644 src/pokenav.c delete mode 100644 src/post_battle_event_funcs.c delete mode 100644 src/record_mixing.c delete mode 100644 src/region_map.c delete mode 100644 src/reset_rtc_screen.c delete mode 100644 src/rng.c delete mode 100644 src/roamer.c delete mode 100644 src/rom3.c delete mode 100644 src/rom4.c delete mode 100644 src/rom6.c delete mode 100644 src/rom_800D42C.c delete mode 100644 src/rom_8077ABC.c delete mode 100644 src/rotating_gate.c delete mode 100644 src/rtc.c delete mode 100644 src/safari_zone.c delete mode 100644 src/save.c delete mode 100644 src/save_failed_screen.c delete mode 100644 src/save_menu_util.c create mode 100644 src/scene/contest_painting.c create mode 100644 src/scene/credits.c create mode 100644 src/scene/egg_hatch.c create mode 100644 src/scene/intro.c create mode 100644 src/scene/new_game.c create mode 100644 src/scene/title_screen.c delete mode 100644 src/scrcmd.c delete mode 100644 src/script.c delete mode 100644 src/script_menu.c delete mode 100644 src/script_movement.c delete mode 100644 src/script_pokemon_util_80C4BF0.c delete mode 100644 src/script_pokemon_util_80F99CC.c delete mode 100644 src/secret_base.c delete mode 100644 src/shop.c delete mode 100644 src/siirtc.c delete mode 100644 src/slot_machine.c delete mode 100644 src/smokescreen.c delete mode 100644 src/sound.c delete mode 100644 src/sound_check_menu.c delete mode 100644 src/sprite.c delete mode 100644 src/start_menu.c delete mode 100644 src/starter_choose.c delete mode 100644 src/string_util.c delete mode 100644 src/task.c delete mode 100644 src/text.c delete mode 100644 src/text_window.c delete mode 100644 src/tileset_anim.c delete mode 100644 src/time_events.c delete mode 100644 src/title_screen.c delete mode 100644 src/trade.c delete mode 100644 src/trader.c delete mode 100644 src/trainer_card.c delete mode 100644 src/trainer_see.c delete mode 100644 src/trig.c delete mode 100644 src/tv.c delete mode 100644 src/unknown_debug_menu.c delete mode 100644 src/unknown_task.c delete mode 100644 src/unused_8124F94.c delete mode 100644 src/use_pokeblock.c delete mode 100644 src/util.c delete mode 100644 src/wallclock.c delete mode 100644 src/wild_encounter.c (limited to 'src') diff --git a/src/agb_flash.c b/src/agb_flash.c deleted file mode 100644 index 340d469a7..000000000 --- a/src/agb_flash.c +++ /dev/null @@ -1,295 +0,0 @@ -#include "gba/gba.h" -#include "gba/flash_internal.h" - -static u8 sTimerNum; -static u16 sTimerCount; -static vu16 *sTimerReg; -static u16 sSavedIme; - -u8 gFlashTimeoutFlag; -u8 (*PollFlashStatus)(u8 *); -u16 (*WaitForFlashWrite)(u8 phase, u8 *addr, u8 lastData); -u16 (*ProgramFlashSector)(u16 sectorNum, u8 *src); -const struct FlashType *gFlash; -u16 (*ProgramFlashByte)(u16 sectorNum, u32 offset, u8 data); -u16 gFlashNumRemainingBytes; -u16 (*EraseFlashChip)(); -u16 (*EraseFlashSector)(u16 sectorNum); -const u16 *gFlashMaxTime; - -void SetReadFlash1(u16 *dest); - -void SwitchFlashBank(u8 bankNum) -{ - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0xB0); - FLASH_WRITE(0x0000, bankNum); -} - -#define DELAY() \ -do { \ - vu16 i; \ - for (i = 20000; i != 0; i--) \ - ; \ -} while (0) - -u16 ReadFlashId(void) -{ - u16 flashId; - u16 readFlash1Buffer[0x20]; - u8 (*readFlash1)(u8 *); - - SetReadFlash1(readFlash1Buffer); - readFlash1 = (u8 (*)(u8 *))((s32)readFlash1Buffer + 1); - - // Enter ID mode. - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0x90); - DELAY(); - - flashId = readFlash1(FLASH_BASE + 1) << 8; - flashId |= readFlash1(FLASH_BASE); - - // Leave ID mode. - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0xF0); - FLASH_WRITE(0x5555, 0xF0); - DELAY(); - - return flashId; -} - -void FlashTimerIntr(void) -{ - if (sTimerCount != 0 && --sTimerCount == 0) - gFlashTimeoutFlag = 1; -} - -u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)) -{ - if (timerNum >= 4) - return 1; - - sTimerNum = timerNum; - sTimerReg = ®_TMCNT(sTimerNum); - *intrFunc = FlashTimerIntr; - return 0; -} - -void StartFlashTimer(u8 phase) -{ - const u16 *maxTime = &gFlashMaxTime[phase * 3]; - sSavedIme = REG_IME; - REG_IME = 0; - sTimerReg[1] = 0; - REG_IE |= (INTR_FLAG_TIMER0 << sTimerNum); - gFlashTimeoutFlag = 0; - sTimerCount = *maxTime++; - *sTimerReg++ = *maxTime++; - *sTimerReg-- = *maxTime++; - REG_IF = (INTR_FLAG_TIMER0 << sTimerNum); - REG_IME = 1; -} - -void StopFlashTimer(void) -{ - REG_IME = 0; - *sTimerReg++ = 0; - *sTimerReg-- = 0; - REG_IE &= ~(INTR_FLAG_TIMER0 << sTimerNum); - REG_IME = sSavedIme; -} - -u8 ReadFlash1(u8 *addr) -{ - return *addr; -} - -void SetReadFlash1(u16 *dest) -{ - u16 *src; - u16 i; - - PollFlashStatus = (u8 (*)(u8 *))((s32)dest + 1); - - src = (u16 *)ReadFlash1; - src = (u16 *)((s32)src ^ 1); - - i = ((s32)SetReadFlash1 - (s32)ReadFlash1) >> 1; - - while (i != 0) - { - *dest++ = *src++; - i--; - } -} - -void ReadFlash_Core(u8 *src, u8 *dest, u32 size) -{ - while (size-- != 0) - { - *dest++ = *src++; - } -} - -void ReadFlash(u16 sectorNum, u32 offset, u8 *dest, u32 size) -{ - u8 *src; - u16 i; - u16 readFlash_Core_Buffer[0x40]; - u16 *funcSrc; - u16 *funcDest; - void (*readFlash_Core)(u8 *, u8 *, u32); - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - - if (gFlash->romSize == FLASH_ROM_SIZE_1M) - { - SwitchFlashBank(sectorNum / SECTORS_PER_BANK); - sectorNum %= SECTORS_PER_BANK; - } - - funcSrc = (u16 *)ReadFlash_Core; - funcSrc = (u16 *)((s32)funcSrc ^ 1); - funcDest = readFlash_Core_Buffer; - - i = ((s32)ReadFlash - (s32)ReadFlash_Core) >> 1; - - while (i != 0) - { - *funcDest++ = *funcSrc++; - i--; - } - - readFlash_Core = (void (*)(u8 *, u8 *, u32))((s32)readFlash_Core_Buffer + 1); - - src = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset; - - readFlash_Core(src, dest, size); -} - -u32 VerifyFlashSector_Core(u8 *src, u8 *tgt, u32 size) -{ - while (size-- != 0) - { - if (*tgt++ != *src++) - return (u32)(tgt - 1); - } - - return 0; -} - -u32 VerifyFlashSector(u16 sectorNum, u8 *src) -{ - u16 i; - u16 verifyFlashSector_Core_Buffer[0x80]; - u16 *funcSrc; - u16 *funcDest; - u8 *tgt; - u16 size; - u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - - if (gFlash->romSize == FLASH_ROM_SIZE_1M) - { - SwitchFlashBank(sectorNum / SECTORS_PER_BANK); - sectorNum %= SECTORS_PER_BANK; - } - - funcSrc = (u16 *)VerifyFlashSector_Core; - funcSrc = (u16 *)((s32)funcSrc ^ 1); - funcDest = verifyFlashSector_Core_Buffer; - - i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1; - - while (i != 0) - { - *funcDest++ = *funcSrc++; - i--; - } - - verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1); - - tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift); - size = gFlash->sector.size; - - return verifyFlashSector_Core(src, tgt, size); // return 0 if verified. -} - -u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n) -{ - u16 i; - u16 verifyFlashSector_Core_Buffer[0x80]; - u16 *funcSrc; - u16 *funcDest; - u8 *tgt; - u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); - - if (gFlash->romSize == FLASH_ROM_SIZE_1M) - { - SwitchFlashBank(sectorNum / SECTORS_PER_BANK); - sectorNum %= SECTORS_PER_BANK; - } - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - - funcSrc = (u16 *)VerifyFlashSector_Core; - funcSrc = (u16 *)((s32)funcSrc ^ 1); - funcDest = verifyFlashSector_Core_Buffer; - - i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1; - - while (i != 0) - { - *funcDest++ = *funcSrc++; - i--; - } - - verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1); - - tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift); - - return verifyFlashSector_Core(src, tgt, n); -} - -u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src) // 3rd is unused -{ - u8 i; - u32 result; - - for (i = 0; i < 3; i++) // 3 attempts - { - result = ProgramFlashSector(sectorNum, src); - if (result != 0) - continue; - - result = VerifyFlashSector(sectorNum, src); - if (result == 0) - break; - } - - return result; // return 0 if verified and programmed. -} - -u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, u8 *src, u32 n) -{ - u8 i; - u32 result; - - for (i = 0; i < 3; i++) - { - result = ProgramFlashSector(sectorNum, src); - if (result != 0) - continue; - - result = VerifyFlashSectorNBytes(sectorNum, src, n); - if (result == 0) - break; - } - - return result; -} diff --git a/src/agb_flash_1m.c b/src/agb_flash_1m.c deleted file mode 100644 index e249fab9a..000000000 --- a/src/agb_flash_1m.c +++ /dev/null @@ -1,86 +0,0 @@ -#include "gba/gba.h" -#include "gba/flash_internal.h" - -static const char AgbLibFlashVersion[] = "FLASH1M_V103"; - -const struct FlashSetupInfo * const sSetupInfos[] = -{ - &MX29L010, - &LE26FV10N1TS, - &DefaultFlash -}; - -u16 IdentifyFlash(void) -{ - u16 result; - u16 flashId; - const struct FlashSetupInfo * const *setupInfo; - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - - flashId = ReadFlashId(); - - setupInfo = sSetupInfos; - result = 1; - - for (;;) - { - if ((*setupInfo)->type.ids.separate.makerId == 0) - break; - - if (flashId == (*setupInfo)->type.ids.joined) - { - result = 0; - break; - } - - setupInfo++; - } - - ProgramFlashByte = (*setupInfo)->programFlashByte; - ProgramFlashSector = (*setupInfo)->programFlashSector; - EraseFlashChip = (*setupInfo)->eraseFlashChip; - EraseFlashSector = (*setupInfo)->eraseFlashSector; - WaitForFlashWrite = (*setupInfo)->WaitForFlashWrite; - gFlashMaxTime = (*setupInfo)->maxTime; - gFlash = &(*setupInfo)->type; - - return result; -} - -u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData) -{ - u16 result = 0; - u8 status; - - StartFlashTimer(phase); - - while ((status = PollFlashStatus(addr)) != lastData) - { - if (status & 0x20) - { - // The write operation exceeded the flash chip's time limit. - - if (PollFlashStatus(addr) == lastData) - break; - - FLASH_WRITE(0x5555, 0xF0); - result = phase | 0xA000u; - break; - } - - if (gFlashTimeoutFlag) - { - if (PollFlashStatus(addr) == lastData) - break; - - FLASH_WRITE(0x5555, 0xF0); - result = phase | 0xC000u; - break; - } - } - - StopFlashTimer(); - - return result; -} diff --git a/src/agb_flash_le.c b/src/agb_flash_le.c deleted file mode 100644 index 39d956e27..000000000 --- a/src/agb_flash_le.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "gba/gba.h" -#include "gba/flash_internal.h" - -const u16 leMaxTime[] = -{ - 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, - 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, - 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, - 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, -}; - -const struct FlashSetupInfo LE26FV10N1TS = -{ - ProgramFlashByte_MX, - ProgramFlashSector_MX, - EraseFlashChip_MX, - EraseFlashSector_MX, - WaitForFlashWrite_Common, - leMaxTime, - { - 131072, // ROM size - { - 4096, // sector size - 12, // bit shift to multiply by sector size (4096 == 1 << 12) - 32, // number of sectors - 0 // appears to be unused - }, - { 3, 1 }, // wait state setup data - { { 0x62, 0x13 } } // ID - } -}; diff --git a/src/agb_flash_mx.c b/src/agb_flash_mx.c deleted file mode 100644 index 67348901f..000000000 --- a/src/agb_flash_mx.c +++ /dev/null @@ -1,197 +0,0 @@ -#include "gba/gba.h" -#include "gba/flash_internal.h" - -const u16 mxMaxTime[] = -{ - 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, - 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, - 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, - 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, -}; - -const struct FlashSetupInfo MX29L010 = -{ - ProgramFlashByte_MX, - ProgramFlashSector_MX, - EraseFlashChip_MX, - EraseFlashSector_MX, - WaitForFlashWrite_Common, - mxMaxTime, - { - 131072, // ROM size - { - 4096, // sector size - 12, // bit shift to multiply by sector size (4096 == 1 << 12) - 32, // number of sectors - 0 // appears to be unused - }, - { 3, 1 }, // wait state setup data -#if defined(GERMAN) && defined(SAPPHIRE) - { { 0xBF, 0xD4 } } // ID -#else - { { 0xC2, 0x09 } } // ID -#endif - } -}; - -const struct FlashSetupInfo DefaultFlash = -{ - ProgramFlashByte_MX, - ProgramFlashSector_MX, - EraseFlashChip_MX, - EraseFlashSector_MX, - WaitForFlashWrite_Common, - mxMaxTime, - { - 131072, // ROM size - { - 4096, // sector size - 12, // bit shift to multiply by sector size (4096 == 1 << 12) - 32, // number of sectors - 0 // appears to be unused - }, - { 3, 1 }, // wait state setup data - { { 0x00, 0x00 } } // ID of 0 - } -}; - -u16 EraseFlashChip_MX(void) -{ - u16 result; - u16 readFlash1Buffer[0x20]; - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; - - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0x80); - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0x10); - - SetReadFlash1(readFlash1Buffer); - - result = WaitForFlashWrite(3, FLASH_BASE, 0xFF); - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - - return result; -} - -u16 EraseFlashSector_MX(u16 sectorNum) -{ - u16 numTries; - u16 result; - u8 *addr; - u16 readFlash1Buffer[0x20]; - - if (sectorNum >= gFlash->sector.count) - return 0x80FF; - - SwitchFlashBank(sectorNum / SECTORS_PER_BANK); - sectorNum %= SECTORS_PER_BANK; - - numTries = 0; - -try_erase: - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; - - addr = FLASH_BASE + (sectorNum << gFlash->sector.shift); - - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0x80); - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - *addr = 0x30; - - SetReadFlash1(readFlash1Buffer); - - result = WaitForFlashWrite(2, addr, 0xFF); - - if (!(result & 0xA000) || numTries > 3) - goto done; - - numTries++; - - goto try_erase; - -done: - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - - return result; -} - -u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data) -{ - u8 *addr; - u16 readFlash1Buffer[0x20]; - - if (offset >= gFlash->sector.size) - return 0x8000; - - SwitchFlashBank(sectorNum / SECTORS_PER_BANK); - sectorNum %= SECTORS_PER_BANK; - - addr = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset; - - SetReadFlash1(readFlash1Buffer); - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; - - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0xA0); - *addr = data; - - return WaitForFlashWrite(1, addr, data); -} - -static u16 ProgramByte(u8 *src, u8 *dest) -{ - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0xA0); - *dest = *src; - - return WaitForFlashWrite(1, dest, *src); -} - -u16 ProgramFlashSector_MX(u16 sectorNum, u8 *src) -{ - u16 result; - u8 *dest; - u16 readFlash1Buffer[0x20]; - - if (sectorNum >= gFlash->sector.count) - return 0x80FF; - - result = EraseFlashSector_MX(sectorNum); - - if (result != 0) - return result; - - SwitchFlashBank(sectorNum / SECTORS_PER_BANK); - sectorNum %= SECTORS_PER_BANK; - - SetReadFlash1(readFlash1Buffer); - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; - - gFlashNumRemainingBytes = gFlash->sector.size; - dest = FLASH_BASE + (sectorNum << gFlash->sector.shift); - - while (gFlashNumRemainingBytes > 0) - { - result = ProgramByte(src, dest); - - if (result != 0) - break; - - gFlashNumRemainingBytes--; - src++; - dest++; - } - - return result; -} diff --git a/src/bard_music.c b/src/bard_music.c deleted file mode 100644 index a31568475..000000000 --- a/src/bard_music.c +++ /dev/null @@ -1,97 +0,0 @@ -#include "global.h" -#include "easy_chat.h" - -struct BardSound -{ - u8 pad_00[48]; -}; - -struct UnkBard -{ - /*0x00*/ u8 var00; - /*0x01*/ s8 var01; - /*0x02*/ u16 var02; - /*0x04*/ u16 var04; - /*0x06*/ u16 var06; -}; - -struct UnkBard3 -{ - /*0x00*/ u16 var00; - /*0x02*/ u16 var02; - /*0x04*/ s16 var04; - /*0x06*/ u16 var06; -}; - -struct UnkBard2 -{ - /*0x00*/ u8 var00; - /*0x01*/ u8 var01; - /*0x02*/ u8 var02; - /*0x03*/ u8 var03; - /*0x04*/ u16 var04; - u8 pad06[4]; - /*0x0A*/ u16 var0A; - u8 pad0C[12]; - /*0x18*/ struct UnkBard3 var18[6]; -}; - -extern struct BardSound *gBardMusicTable[]; -extern s16 *gUnknown_08417068[]; -extern u32 gUnknown_084170F4[]; - -static s16 sub_814A2B8(u32 arg0, u32 arg1) -{ - return gUnknown_08417068[arg0][arg1]; -} - -#if ENGLISH -struct BardSound *sub_814A2D0(u16 arg0, u16 arg1) -{ - struct BardSound *sounds = gBardMusicTable[arg0]; - - return &sounds[arg1]; -} -#elif GERMAN -struct BardSound *sub_814A2D0(u16 arg0, u16 arg1) -{ - u32 index; - struct BardSound *sounds; - - sounds = gBardMusicTable[arg0]; - index = de_sub_80EB748(arg0, arg1); - - return &sounds[index]; -} -#endif - -s32 sub_814A2EC(struct UnkBard2 *dest, struct UnkBard *src, u16 arg2) -{ - s32 i; - s32 j; - s32 thirty; - - for (i = 0; i < 6; i++) - { - dest->var18[i].var00 = src[i].var00; - if (src[i].var00 != 0xFF) - { - s32 r1 = src[i].var01 +gUnknown_084170F4[src[i].var00]; - - dest->var18[i].var02 = r1; - dest->var18[i].var06 = src[i].var04; - dest->var04 += r1; - } - } - - for (j = 0, thirty = 30; j < i; j++) - dest->var18[j].var04 = sub_814A2B8(thirty + arg2, j); - - dest->var00++; - dest->var01 = 0; - dest->var02 = 0; - dest->var03 = 0; - dest->var0A = 0; - - //warning: no return statement in function returning non-void -} diff --git a/src/battle/battle_10.c b/src/battle/battle_10.c new file mode 100644 index 000000000..0237bab4b --- /dev/null +++ b/src/battle/battle_10.c @@ -0,0 +1,1323 @@ +#include "global.h" +#include "battle.h" +#include "battle_interface.h" +#include "data2.h" +#include "link.h" +#include "palette.h" +#include "rom_8077ABC.h" +#include "rom3.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "util.h" + +struct UnknownStruct3 +{ + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; +}; + +extern u8 gActiveBank; +extern u8 gBattleBufferA[][0x200]; +extern u8 gObjectBankIDs[]; +extern u16 gBattlePartyID[]; +extern u8 gHealthboxIDs[]; +extern u16 gBattleTypeFlags; +extern u8 gBattleMonForms[]; +extern void (*gBattleBankFunc[])(void); +extern u32 *gDisableStructMoveAnim; +extern u32 gMoveDmgMoveAnim; +extern u16 gMovePowerMoveAnim; +extern u8 gHappinessMoveAnim; +extern u16 gWeatherMoveAnim; +extern u32 gPID_perBank[]; +extern u8 gAnimScriptActive; +extern void (*gAnimScriptCallback)(void); +extern u8 gDisplayedStringBattle[]; +extern bool8 gDoingBattleAnim; +extern u8 gBattleOutcome; +extern u16 gUnknown_02024DE8; +extern u8 gUnknown_02024E68[]; +extern struct SpriteTemplate gUnknown_02024E8C; +extern u8 gUnknown_0202F7C4; +extern struct Window gUnknown_03004210; +extern u16 gUnknown_030042A0; +extern u16 gUnknown_030042A4; +extern u8 gUnknown_0300434C[]; + +extern u8 sub_8077F68(); +extern u8 sub_8079E90(); +extern u8 GetBankIdentity(u8); +extern void sub_8031794(struct Pokemon *, u8); +extern void sub_8037A74(void); +extern void sub_8032984(u8, u16); +extern void sub_8037E30(void); +extern void sub_80312F0(struct Sprite *); +extern u8 sub_8046400(); +extern void sub_8032A08(); +extern void sub_8043DB0(); +extern void sub_8037BBC(void); +extern s32 sub_803FC34(u16); +extern void sub_8031A6C(u16, u8); +extern void sub_80313A0(struct Sprite *); +extern void sub_803757C(void); +extern void oamt_add_pos2_onto_pos1(); +extern void oamt_set_x3A_32(); +extern void sub_8078B34(struct Sprite *); +extern void sub_80375B4(void); +extern void sub_8010384(struct Sprite *); +extern void sub_8037B78(void); +extern u8 sub_8031720(); +extern bool8 mplay_80342A4(u8); +extern void ExecuteMoveAnim(); +extern void sub_80326EC(); +extern void sub_8031F24(void); +extern void sub_80324BC(); +extern void BufferStringBattle(); +extern void sub_8037C2C(void); +extern void sub_8043D84(); +extern void sub_8037B24(void); +extern void sub_8045A5C(); +extern void sub_8037FAC(void); +extern void move_anim_start_t2_for_situation(); +extern void dp01t_0F_4_move_anim(void); +extern void sub_8047858(); +extern u8 GetBankSide(u8); +extern void sub_80E43C0(); +extern void sub_803A3A8(struct Sprite *); +extern void sub_8044CA0(u8); +extern void nullsub_47(void); +extern bool8 IsDoubleBattle(void); +extern void sub_8037840(void); +extern void sub_8031B74(); +extern u8 sub_8078874(); +extern u8 move_anim_start_t3(); +extern void sub_8037FD8(void); +extern void sub_8037F34(void); +extern void dp01_tbl4_exec_completed(void); + +u32 dp01_getattr_by_ch1_for_player_pokemon__(u8, u8 *); +void sub_8038900(u8); +void sub_8039430(u8, u8); +void sub_8039648(void); +void sub_8039B64(void); +void sub_803A2C4(u8); +void sub_803A4E0(void); + +void LinkOpponentHandleGetAttributes(void) +{ + u8 buffer[0x100]; + u32 r6 = 0; + u8 r4; + s32 i; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + r6 = dp01_getattr_by_ch1_for_player_pokemon__(gBattlePartyID[gActiveBank], buffer); + } + else + { + r4 = gBattleBufferA[gActiveBank][2]; + for (i = 0; i < 6; i++) + { + if (r4 & 1) + r6 += dp01_getattr_by_ch1_for_player_pokemon__(i, buffer + r6); + r4 >>= 1; + } + } + dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, r6, buffer); + dp01_tbl4_exec_completed(); +} + +u32 dp01_getattr_by_ch1_for_player_pokemon__(u8 a, u8 *buffer) +{ + struct BattlePokemon battlePokemon; + struct UnknownStruct3 moveData; + u8 nickname[20]; + u8 *src; + s16 data16; + u32 data32; + s32 size = 0; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + battlePokemon.species = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); + battlePokemon.item = GetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM); + for (size = 0; size < 4; size++) + { + battlePokemon.moves[size] = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + size); + battlePokemon.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); + } + battlePokemon.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); + battlePokemon.friendship = GetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP); + battlePokemon.experience = GetMonData(&gEnemyParty[a], MON_DATA_EXP); + battlePokemon.hpIV = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); + battlePokemon.attackIV = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); + battlePokemon.defenseIV = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); + battlePokemon.speedIV = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); + battlePokemon.spAttackIV = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); + battlePokemon.spDefenseIV = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); + battlePokemon.personality = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); + battlePokemon.status1 = GetMonData(&gEnemyParty[a], MON_DATA_STATUS); + battlePokemon.level = GetMonData(&gEnemyParty[a], MON_DATA_LEVEL); + battlePokemon.hp = GetMonData(&gEnemyParty[a], MON_DATA_HP); + battlePokemon.maxHP = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); + battlePokemon.attack = GetMonData(&gEnemyParty[a], MON_DATA_ATK); + battlePokemon.defense = GetMonData(&gEnemyParty[a], MON_DATA_DEF); + battlePokemon.speed = GetMonData(&gEnemyParty[a], MON_DATA_SPD); + battlePokemon.spAttack = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); + battlePokemon.spDefense = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); + battlePokemon.isEgg = GetMonData(&gEnemyParty[a], MON_DATA_IS_EGG); + battlePokemon.altAbility = GetMonData(&gEnemyParty[a], MON_DATA_ALT_ABILITY); + battlePokemon.otId = GetMonData(&gEnemyParty[a], MON_DATA_OT_ID); + GetMonData(&gEnemyParty[a], MON_DATA_NICKNAME, nickname); + StringCopy10(battlePokemon.nickname, nickname); + GetMonData(&gEnemyParty[a], MON_DATA_OT_NAME, battlePokemon.otName); + src = (u8 *)&battlePokemon; + for (size = 0; size < sizeof(battlePokemon); size++) + buffer[size] = src[size]; + break; + case 1: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 2: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 3: + for (size = 0; size < 4; size++) + { + moveData.moves[size] = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + size); + moveData.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); + } + moveData.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); + src = (u8 *)&moveData; + for (size = 0; size < sizeof(moveData); size++) + buffer[size] = src[size]; + break; + case 4: + case 5: + case 6: + case 7: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 8: + for (size = 0; size < 4; size++) + buffer[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); + buffer[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); + size++; + break; + case 9: + case 10: + case 11: + case 12: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); + size = 1; + break; + case 17: + data32 = GetMonData(&gEnemyParty[a], MON_DATA_OT_ID); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 18: + data32 = GetMonData(&gEnemyParty[a], MON_DATA_EXP); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 19: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_EV); + size = 1; + break; + case 20: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_EV); + size = 1; + break; + case 21: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_EV); + size = 1; + break; + case 22: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_EV); + size = 1; + break; + case 23: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV); + size = 1; + break; + case 24: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_EV); + size = 1; + break; + case 25: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP); + size = 1; + break; + case 26: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_POKERUS); + size = 1; + break; + case 27: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_LOCATION); + size = 1; + break; + case 28: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_LEVEL); + size = 1; + break; + case 29: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_GAME); + size = 1; + break; + case 30: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_POKEBALL); + size = 1; + break; + case 31: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); + buffer[1] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); + buffer[2] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); + buffer[3] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); + buffer[4] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); + buffer[5] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); + size = 6; + break; + case 32: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); + size = 1; + break; + case 33: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); + size = 1; + break; + case 34: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); + size = 1; + break; + case 35: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); + size = 1; + break; + case 36: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); + size = 1; + break; + case 37: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); + size = 1; + break; + case 38: + data32 = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 39: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_CHECKSUM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 40: + data32 = GetMonData(&gEnemyParty[a], MON_DATA_STATUS); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 41: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_LEVEL); + size = 1; + break; + case 42: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 43: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 44: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_ATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 45: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_DEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 46: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPD); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 47: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 48: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 49: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_COOL); + size = 1; + break; + case 50: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_BEAUTY); + size = 1; + break; + case 51: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_CUTE); + size = 1; + break; + case 52: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SMART); + size = 1; + break; + case 53: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_TOUGH); + size = 1; + break; + case 54: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SHEEN); + size = 1; + break; + case 55: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_COOL_RIBBON); + size = 1; + break; + case 56: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_BEAUTY_RIBBON); + size = 1; + break; + case 57: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_CUTE_RIBBON); + size = 1; + break; + case 58: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SMART_RIBBON); + size = 1; + break; + case 59: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_TOUGH_RIBBON); + size = 1; + break; + } + return size; +} + +void sub_803889C(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_80388A8(void) +{ + u8 i; + u8 r4; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + sub_8038900(gBattlePartyID[gActiveBank]); + } + else + { + r4 = gBattleBufferA[gActiveBank][2]; + for (i = 0; i < 6; i++) + { + if (r4 & 1) + sub_8038900(i); + r4 >>= 1; + } + } + dp01_tbl4_exec_completed(); +} + +void sub_8038900(u8 a) +{ + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; + struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; + s32 i; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + { + u8 iv; + + SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); + SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + for (i = 0; i < 4; i++) + { + SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); + SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + } + SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); + SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); + SetMonData(&gEnemyParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + iv = battlePokemon->hpIV; + SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, (u8 *)&iv); + iv = battlePokemon->attackIV; + SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + iv = battlePokemon->defenseIV; + SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + iv = battlePokemon->speedIV; + SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + iv = battlePokemon->spAttackIV; + SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + iv = battlePokemon->spDefenseIV; + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); + SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); + SetMonData(&gEnemyParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); + SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); + SetMonData(&gEnemyParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); + SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); + SetMonData(&gEnemyParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); + SetMonData(&gEnemyParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); + SetMonData(&gEnemyParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); + SetMonData(&gEnemyParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + } + break; + case 1: + SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); + break; + case 2: + SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); + break; + case 3: + for (i = 0; i < 4; i++) + { + SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); + SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + } + SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); + break; + case 4: + case 5: + case 6: + case 7: + SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); + break; + case 8: + SetMonData(&gEnemyParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gEnemyParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gEnemyParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gEnemyParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); + break; + case 9: + case 10: + case 11: + case 12: + SetMonData(&gEnemyParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); + break; + case 17: + SetMonData(&gEnemyParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); + break; + case 18: + SetMonData(&gEnemyParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); + break; + case 19: + SetMonData(&gEnemyParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 20: + SetMonData(&gEnemyParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 21: + SetMonData(&gEnemyParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 22: + SetMonData(&gEnemyParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 23: + SetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 24: + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 25: + SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); + break; + case 26: + SetMonData(&gEnemyParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); + break; + case 27: + SetMonData(&gEnemyParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); + break; + case 28: + SetMonData(&gEnemyParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 29: + SetMonData(&gEnemyParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); + break; + case 30: + SetMonData(&gEnemyParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); + break; + case 31: + SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); + break; + case 32: + SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 33: + SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 34: + SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 35: + SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 36: + SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 37: + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 38: + SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); + break; + case 39: + SetMonData(&gEnemyParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); + break; + case 40: + SetMonData(&gEnemyParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); + break; + case 41: + SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 42: + SetMonData(&gEnemyParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 43: + SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 44: + SetMonData(&gEnemyParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); + break; + case 45: + SetMonData(&gEnemyParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); + break; + case 46: + SetMonData(&gEnemyParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); + break; + case 47: + SetMonData(&gEnemyParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); + break; + case 48: + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); + break; + case 49: + SetMonData(&gEnemyParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); + break; + case 50: + SetMonData(&gEnemyParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); + break; + case 51: + SetMonData(&gEnemyParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); + break; + case 52: + SetMonData(&gEnemyParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); + break; + case 53: + SetMonData(&gEnemyParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); + break; + case 54: + SetMonData(&gEnemyParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); + break; + case 55: + SetMonData(&gEnemyParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 56: + SetMonData(&gEnemyParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 57: + SetMonData(&gEnemyParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 58: + SetMonData(&gEnemyParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 59: + SetMonData(&gEnemyParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + } +} + +void sub_8039220(void) +{ + u8 *dst; + u8 i; + + dst = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; + for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) + dst[i] = gBattleBufferA[gActiveBank][3 + i]; + dp01_tbl4_exec_completed(); +} + +void sub_8039294(void) +{ + u16 species = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES); + + sub_8031794(&gEnemyParty[gBattlePartyID[gActiveBank]], gActiveBank); + GetMonSpriteTemplate_803C56C(species, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + sub_8077ABC(gActiveBank, 2), + sub_8077F68(gActiveBank), + sub_8079E90(gActiveBank)); + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; + gSprites[gObjectBankIDs[gActiveBank]].data0 = gActiveBank; + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]); + sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); + gBattleBankFunc[gActiveBank] = sub_8037A74; +} + +void sub_80393E4(void) +{ + gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1]; + sub_8039430(gActiveBank, gBattleBufferA[gActiveBank][2]); + gBattleBankFunc[gActiveBank] = sub_8037E30; +} + +void sub_8039430(u8 a, u8 b) +{ + u16 species; + + sub_8032AA8(a, b); + gBattlePartyID[a] = gBattleBufferA[a][1]; + species = GetMonData(&gEnemyParty[gBattlePartyID[a]], MON_DATA_SPECIES); + gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); + sub_8031794(&gEnemyParty[gBattlePartyID[a]], a); + GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a)); + gObjectBankIDs[a] = CreateSprite( + &gUnknown_02024E8C, + sub_8077ABC(a, 2), + sub_8077F68(a), + sub_8079E90(a)); + gSprites[gUnknown_0300434C[a]].data1 = gObjectBankIDs[a]; + gSprites[gObjectBankIDs[a]].data0 = a; + gSprites[gObjectBankIDs[a]].data2 = species; + gSprites[gObjectBankIDs[a]].oam.paletteNum = a; + StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]); + gSprites[gObjectBankIDs[a]].invisible = TRUE; + gSprites[gObjectBankIDs[a]].callback = SpriteCallbackDummy; + gSprites[gUnknown_0300434C[a]].data0 = sub_8046400(0, 0xFE); +} + +void sub_80395B4(void) +{ + if (gBattleBufferA[gActiveBank][1] == 0) + { + ewram17810[gActiveBank].unk4 = 0; + gBattleBankFunc[gActiveBank] = sub_8039648; + } + else + { + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8032A08(gActiveBank); + sub_8043DB0(gHealthboxIDs[gActiveBank]); + dp01_tbl4_exec_completed(); + } +} + +void sub_8039648(void) +{ + switch (ewram17810[gActiveBank].unk4) + { + case 0: + if (ewram17800[gActiveBank].unk0_2) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + ewram17810[gActiveBank].unk4 = 1; + break; + case 1: + if (!ewram17810[gActiveBank].unk0_6) + { + ewram17810[gActiveBank].unk4 = 0; + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 2); + gBattleBankFunc[gActiveBank] = sub_8037BBC; + } + break; + } +} + +void sub_80396D0(void) +{ + s16 xOffset; + u32 gender; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (GetBankIdentity(gActiveBank) & 2) + xOffset = -16; + else + xOffset = 16; + gender = gLinkPlayers[sub_803FC34(gActiveBank)].gender; + } + else + { + xOffset = 0; + gender = gLinkPlayers[GetMultiplayerId() ^ 1].gender; + } + sub_8031A6C(gender, gActiveBank); + GetMonSpriteTemplate_803C5A0(gender, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + 176 + xOffset, 40 + 4 * (8 - gTrainerFrontPicCoords[gender].coords), + sub_8079E90(gActiveBank)); + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; + gSprites[gObjectBankIDs[gActiveBank]].data0 = 2; + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[gender].tag); + gSprites[gObjectBankIDs[gActiveBank]].data5 = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum; + gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[gender].tag); + gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam = gender; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gBattleBankFunc[gActiveBank] = sub_803757C; +} + +void sub_80398A4(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_80398B0(void) +{ + oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); + gSprites[gObjectBankIDs[gActiveBank]].data0 = 35; + gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; + gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; + oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + gBattleBankFunc[gActiveBank] = sub_80375B4; +} + +void sub_803995C(void) +{ + if (ewram17810[gActiveBank].unk4 == 0) + { + if (ewram17800[gActiveBank].unk0_2) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + ewram17810[gActiveBank].unk4++; + } + else if (!ewram17810[gActiveBank].unk0_6) + { + ewram17810[gActiveBank].unk4 = 0; + PlaySE12WithPanning(SE_POKE_DEAD, 63); + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8010384; + gBattleBankFunc[gActiveBank] = sub_8037B78; + } +} + +void sub_8039A00(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039A0C(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039A18(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039A24(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039A30(void) +{ + if (!mplay_80342A4(gActiveBank)) + { + u32 r0 = gBattleBufferA[gActiveBank][1] + | (gBattleBufferA[gActiveBank][2] << 8); + + gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; + gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] + | (gBattleBufferA[gActiveBank][5] << 8); + gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] + | (gBattleBufferA[gActiveBank][7] << 8) + | (gBattleBufferA[gActiveBank][8] << 16) + | (gBattleBufferA[gActiveBank][9] << 24); + gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; + gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] + | (gBattleBufferA[gActiveBank][13] << 8); + gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; + gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; + + // Dead code. sub_8031720 always returns 0. + if (sub_8031720(r0, gUnknown_0202F7C4) != 0) + { + dp01_tbl4_exec_completed(); + } + else + { + ewram17810[gActiveBank].unk4 = 0; + gBattleBankFunc[gActiveBank] = sub_8039B64; + } + } +} + +void sub_8039B64(void) +{ + u16 r4 = gBattleBufferA[gActiveBank][1] + | (gBattleBufferA[gActiveBank][2] << 8); + u8 r7 = gBattleBufferA[gActiveBank][11]; + + switch (ewram17810[gActiveBank].unk4) + { + case 0: + if (ewram17800[gActiveBank].unk0_2 && !ewram17800[gActiveBank].unk0_3) + { + ewram17800[gActiveBank].unk0_3 = 1; + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + } + ewram17810[gActiveBank].unk4 = 1; + break; + case 1: + if (!ewram17810[gActiveBank].unk0_6) + { + sub_80326EC(0); + ExecuteMoveAnim(r4); + ewram17810[gActiveBank].unk4 = 2; + } + break; + case 2: + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + sub_80326EC(1); + if ((ewram17800[gActiveBank].unk0_2) && r7 <= 1) + { + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); + ewram17800[gActiveBank].unk0_3 = 0; + } + ewram17810[gActiveBank].unk4 = 3; + } + break; + case 3: + if (!ewram17810[gActiveBank].unk0_6) + { + sub_8031F24(); + sub_80324BC( + gActiveBank, + gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + ewram17810[gActiveBank].unk4 = 0; + dp01_tbl4_exec_completed(); + } + break; + } +} + +void sub_8039CC8(void) +{ + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); + sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gBattleBankFunc[gActiveBank] = sub_8037C2C; +} + +void sub_8039D2C(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039D38(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039D44(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039D50(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039D5C(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039D68(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039D74(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039D80(void) +{ + s16 r7; + + load_gfxc_health_bar(0); + r7 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + if (r7 != 0x7FFF) + { + u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + u32 hp = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, hp, r7); + } + else + { + u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); + } + gBattleBankFunc[gActiveBank] = sub_8037B24; +} + +void sub_8039E70(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039E7C(void) +{ + if (mplay_80342A4(gActiveBank) == 0) + { + sub_8045A5C(gHealthboxIDs[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], 9); + ewram17810[gActiveBank].unk0_4 = 0; + gBattleBankFunc[gActiveBank] = sub_8037FAC; + } +} + +void sub_8039EF0(void) +{ + if (mplay_80342A4(gActiveBank) == 0) + { + move_anim_start_t2_for_situation( + gBattleBufferA[gActiveBank][1], + gBattleBufferA[gActiveBank][2] + | (gBattleBufferA[gActiveBank][3] << 8) + | (gBattleBufferA[gActiveBank][4] << 16) + | (gBattleBufferA[gActiveBank][5] << 24)); + gBattleBankFunc[gActiveBank] = sub_8037FAC; + } +} + +void sub_8039F58(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039F64(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039F70(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039F7C(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039F88(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039F94(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039FA0(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039FAC(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039FB8(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_8039FC4(void) +{ + gUnknown_020238C8.unk0_0 = 0; + dp01_tbl4_exec_completed(); +} + +void sub_8039FE0(void) +{ + gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBank][1]; + dp01_tbl4_exec_completed(); +} + +void sub_803A018(void) +{ + gUnknown_020238C8.unk0_7 = 0; + dp01_tbl4_exec_completed(); +} + +void sub_803A030(void) +{ + gUnknown_020238C8.unk0_7 ^= 1; + dp01_tbl4_exec_completed(); +} + +void dp01t_29_4_blink(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) + { + dp01_tbl4_exec_completed(); + } + else + { + gDoingBattleAnim = TRUE; + gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; + sub_8047858(gActiveBank); + gBattleBankFunc[gActiveBank] = dp01t_0F_4_move_anim; + } +} + +void sub_803A0C8(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_803A0D4(void) +{ + s8 pan; + + if (GetBankSide(gActiveBank) == 0) + pan = -64; + else + pan = 63; + PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan); + dp01_tbl4_exec_completed(); +} + +void sub_803A118(void) +{ + PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + dp01_tbl4_exec_completed(); +} + +void sub_803A148(void) +{ + PlayCry3( + GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES), + 25, 5); + dp01_tbl4_exec_completed(); +} + +void dp01t_2E_4_battle_intro(void) +{ + sub_80E43C0(gBattleBufferA[gActiveBank][1]); + gUnknown_02024DE8 |= 1; + dp01_tbl4_exec_completed(); +} + +void sub_803A1B8(void) +{ + u8 taskId; + + oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); + gSprites[gObjectBankIDs[gActiveBank]].data0 = 35; + gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; + gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; + oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_803A3A8); + taskId = CreateTask(sub_803A2C4, 5); + gTasks[taskId].data[0] = gActiveBank; + if (ewram17810[gActiveBank].unk0_0) + gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; + ewram17840.unk9_0 = 1; + gBattleBankFunc[gActiveBank] = nullsub_47; +} + +void sub_803A2C4(u8 taskId) +{ + u8 r9; + + r9 = gActiveBank; + gActiveBank = gTasks[taskId].data[0]; + if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_8039430(gActiveBank, 0); + } + else + { + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_8039430(gActiveBank, 0); + gActiveBank ^= 2; + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_8039430(gActiveBank, 0); + gActiveBank ^= 2; + } + gBattleBankFunc[gActiveBank] = sub_8037840; + gActiveBank = r9; + DestroyTask(taskId); +} + +void sub_803A3A8(struct Sprite *sprite) +{ + sub_8031B74(sprite->oam.affineParam); + sprite->oam.tileNum = sprite->data5; + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); +} + +void sub_803A3DC(void) +{ + if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) + { + dp01_tbl4_exec_completed(); + return; + } + + ewram17810[gActiveBank].unk0_0 = 1; + if (gBattleBufferA[gActiveBank][2] != 0) + { + if (ewram17810[gActiveBank].unk1_1 < 2) + { + ewram17810[gActiveBank].unk1_1++; + return; + } + else + { + ewram17810[gActiveBank].unk1_1 = 0; + } + } + gUnknown_02024E68[gActiveBank] = sub_8044804( + gActiveBank, + (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], + gBattleBufferA[gActiveBank][1], + gBattleBufferA[gActiveBank][2]); + ewram17810[gActiveBank].unk5 = 0; + if (gBattleBufferA[gActiveBank][2] != 0) + ewram17810[gActiveBank].unk5 = 0x5D; + gBattleBankFunc[gActiveBank] = sub_803A4E0; +} + +void sub_803A4E0(void) +{ + if (ewram17810[gActiveBank].unk5++ >= 93) + { + ewram17810[gActiveBank].unk5 = 0; + dp01_tbl4_exec_completed(); + } +} + +void sub_803A520(void) +{ + if (ewram17810[gActiveBank].unk0_0) + gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; + dp01_tbl4_exec_completed(); +} + +void sub_803A56C(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_803A578(void) +{ + if (sub_8078874(gActiveBank) != 0) + { + gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; + sub_8031F88(gActiveBank); + } + dp01_tbl4_exec_completed(); +} + +void bx_exec_buffer_A_ch0_tbl4(void) +{ + if (mplay_80342A4(gActiveBank) == 0) + { + u8 r3 = gBattleBufferA[gActiveBank][1]; + u16 r4 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + + if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, r3, r4) != 0) + dp01_tbl4_exec_completed(); + else + gBattleBankFunc[gActiveBank] = sub_8037FD8; + } +} + +void sub_803A640(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_803A64C(void) +{ + dp01_tbl4_exec_completed(); +} + +void sub_803A658(void) +{ + if (gBattleBufferA[gActiveBank][1] == 3) + gBattleOutcome = gBattleBufferA[gActiveBank][1]; + else + gBattleOutcome = gBattleBufferA[gActiveBank][1] ^ 3; + FadeOutMapMusic(5); + BeginFastPaletteFade(3); + dp01_tbl4_exec_completed(); + gBattleBankFunc[gActiveBank] = sub_8037F34; +} + +void nullsub_48(void) +{ +} diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c new file mode 100644 index 000000000..7772444d7 --- /dev/null +++ b/src/battle/battle_2.c @@ -0,0 +1,2441 @@ +#include "global.h" +#include "abilities.h" +#include "battle.h" +#include "battle_interface.h" +#include "battle_setup.h" +#include "data2.h" +#include "item.h" +#include "link.h" +#include "main.h" +#include "name_string_util.h" +#include "palette.h" +#include "party_menu.h" +#include "pokeball.h" +#include "pokedex.h" +#include "pokemon.h" +#include "rng.h" +#include "rom3.h" +#include "rom_8077ABC.h" +#include "rom_8094928.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "sprite.h" +#include "task.h" +#include "text.h" +#include "trig.h" +#include "unknown_task.h" +#include "util.h" +#include "items.h" +#include "hold_effects.h" +#include "battle_move_effects.h" + +struct UnknownStruct6 +{ + u16 unk0[0xA0]; + u8 fillerA0[0x640]; + u16 unk780[0xA0]; +}; + +struct UnknownStruct7 +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; +}; + +struct UnknownStruct8 +{ + u8 unk0[7]; + u8 unk7; + u8 unk8[18]; + u8 unk1A; +}; + +struct UnknownPokemonStruct2 +{ + /*0x00*/ u16 species; + /*0x02*/ u16 heldItem; + /*0x04*/ u8 nickname[11]; + /*0x0F*/ u8 level; + /*0x10*/ u16 hp; + /*0x12*/ u16 maxhp; + /*0x14*/ u32 status; + /*0x18*/ u32 personality; + /*0x1C*/ u8 gender; + /*0x1D*/ u8 language; +}; + +struct UnknownStruct12 +{ + u32 unk0; + u8 filler4[0x54]; +}; + +extern const u16 gUnknown_08D004E0[]; +extern const struct MonCoords gCastformFrontSpriteCoords[]; + +extern u8 ewram[]; +#define ewram0 (*(struct UnknownStruct7 *)(ewram + 0x0)) +#define ewram4 (*(struct UnknownStruct8 *)(ewram + 0x4)) +#define ewram16000 (ewram[0x16000]) +#define ewram16001 (ewram[0x16001]) +#define ewram16002 (ewram[0x16002]) +#define ewram16003 (ewram[0x16003]) +#define ewram1600C (ewram[0x1600C]) +#define ewram1600E (ewram[0x1600E]) +#define ewram1601B (ewram[0x1601B]) +#define ewram16020 ((u8 *)(ewram + 0x16020)) +#define ewram16056 (ewram[0x16056]) +#define ewram16058 (ewram[0x16058]) +#define ewram16059 (ewram[0x16059]) +#define ewram16078 (ewram[0x16078]) +#define ewram16084 (ewram[0x16084]) +#define ewram16086 (ewram[0x16086]) +#define ewram16087 (ewram[0x16087]) +#define ewram16088 (ewram[0x16088]) +#define ewram16089 (ewram[0x16089]) +#define ewram160A1 (ewram[0x160A1]) +#define ewram160A6 (ewram[0x160A6]) +#define ewram160AC ((u8 *)(ewram + 0x160AC)) +#define ewram160BC ((u16 *)(ewram + 0x160BC)) // hp +#define ewram160C8 (ewram[0x160C8]) +#define ewram160C9 (ewram[0x160C9]) +#define ewram160CB (ewram[0x160CB]) +#define ewram160CC ((u8 *)(ewram + 0x160CC)) +#define ewram160E6 (ewram[0x160E6]) +#define ewram160E8 ((u8 *)(ewram + 0x160E8)) +#define ewram160F0 ((u8 *)(ewram + 0x160F0)) +#define ewram160F9 (ewram[0x160F9]) +#define ewram16100 ((u8 *)(ewram + 0x16100)) +#define ewram16108 ((u8 *)(ewram + 0x16108)) +#define ewram16110 (ewram[0x16110]) +#define ewram16111 (ewram[0x16111]) +#define ewram16113 (ewram[0x16113]) +#define ewram17100 ((u32 *)(ewram + 0x17100)) +#define ewram17130 (ewram[0x17130]) +#define ewram17160 (ewram[0x17160]) +#define ewram1D000 ((struct Pokemon *)(ewram + 0x1D000)) + +extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; +extern u8 gBattleBufferB[][0x200]; +extern u8 gActiveBank; +extern u32 gBattleExecBuffer; +extern u8 gNoOfAllBanks; +extern u16 gBattlePartyID[]; +extern u8 gFightStateTracker; +extern u8 gTurnOrder[]; +extern struct UnknownStruct12 gUnknown_02024AD0[]; +extern u8 gObjectBankIDs[]; +extern u16 gCurrentMove; +extern u8 gLastUsedAbility; +extern u8 gStringBank; +extern u8 gAbsentBankFlags; +extern u8 gMultiHitCounter; +extern u8 gActionForBanks[]; +extern u16 gUnknown_02024C2C[]; +extern u16 gLastUsedMove[]; +extern u16 gMoveHitWith[]; +extern u16 gUnknown_02024C44[]; +extern u16 gUnknown_02024C4C[]; +extern u16 gLockedMove[]; +extern u8 gUnknown_02024C5C[]; +extern u16 gChosenMovesByBanks[]; +extern u32 gHitMarker; +extern u8 gUnknown_02024C70[]; +extern u16 gSideAffecting[]; +extern u32 gStatuses3[]; +//extern u8 gDisableStructs[][0x1C]; +extern u16 gPauseCounterBattle; +extern u16 gPaydayMoney; +extern u16 gRandomTurnNumber; +extern u8 gBattleCommunication[]; +extern u8 gUnknown_02024D1F[]; // I don't actually know what type this is. +extern u8 gBattleOutcome; +extern u16 gUnknown_02024DE8; +extern u8 gActionSelectionCursor[]; +extern u8 gMoveSelectionCursor[]; +extern u8 gUnknown_02038470[]; +extern u16 gUnknown_030041B0; +extern u16 gUnknown_030041B4; +extern u16 gUnknown_030041B8; +extern struct Window gUnknown_030041D0; +extern u16 gUnknown_03004200; +extern struct Window gUnknown_03004210; +extern u16 gUnknown_03004244; +extern struct Window gUnknown_03004250; +extern u16 gUnknown_03004240; +extern u16 gUnknown_03004280; +extern u32 gUnknown_03004284; +extern u16 gUnknown_03004288; +extern u16 gUnknown_030042A0; +extern u16 gUnknown_030042A4; +extern u16 gUnknown_030042C0; +extern u16 gUnknown_030042C4; +extern MainCallback gPreBattleCallback1; +extern void (*gBattleMainFunc)(void); +extern u8 gLeveledUpInBattle; +extern void (*gBattleBankFunc[])(void); +extern u8 gHealthboxIDs[]; +extern struct UnknownStruct6 gUnknown_03004DE0; +//extern u16 gUnknown_03004DE0[][0xA0]; // possibly? +extern u16 gBattleTypeFlags; +extern s8 gBattleTerrain; // I'm not sure if this is supposed to be s8 or u8. Regardless, it must have the same type as the return value of GetBattleTerrain. +extern u8 gReservedSpritePaletteCount; +extern u16 gTrainerBattleOpponent; +extern struct BattleEnigmaBerry gEnigmaBerries[]; +extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2]; +extern u8 gBattleMonForms[]; +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u16 gBattleWeather; +extern u32 gBattleMoveDamage; +extern struct BattlePokemon gBattleMons[]; +extern u8 gBattleMoveFlags; + +static void BattlePrepIntroSlide(void); + +void sub_800E7C4(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + sub_800B858(); + SetMainCallback2(sub_800F104); + gBattleCommunication[0] = 0; + } + else + { + InitBattle(); + } +} + +void InitBattle(void) +{ + s32 i; + + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + + CpuFill32(0, (void *)VRAM, VRAM_SIZE); + + REG_MOSAIC = 0; + REG_WIN0H = 0xF0; + REG_WIN0V = 0x5051; + REG_WININ = 0; + REG_WINOUT = 0; + gUnknown_030042C4 = 0xF0; + gUnknown_03004240 = 0x5051; + dp12_8087EA4(); + + for (i = 0; i < 80; i++) + { + gUnknown_03004DE0.unk0[i] = 0xF0; + gUnknown_03004DE0.unk780[i] = 0xF0; + } + for (i = 80; i < 160; i++) + { + asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter + gUnknown_03004DE0.unk0[i] = 0xFF10; + gUnknown_03004DE0.unk780[i] = 0xFF10; + } + sub_80895F8(gUnknown_081F9674.unk0, gUnknown_081F9674.unk4, gUnknown_081F9674.unk8); + SetUpWindowConfig(&gWindowConfig_81E6C58); + ResetPaletteFade(); + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + gUnknown_030042C0 = 0; + gUnknown_030041B4 = 0; + gUnknown_03004288 = 0; + gUnknown_03004280 = 0; + gUnknown_030041B0 = 0; + gUnknown_030041B8 = 0; + gBattleTerrain = GetBattleTerrain(); + InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58); + InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0); + InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC); + sub_800D6D4(); + sub_800DAB8(); + ResetSpriteData(); + ResetTasks(); + sub_800E23C(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 4; + SetVBlankCallback(sub_800FCFC); + setup_poochyena_battle(); + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + SetMainCallback2(sub_800F298); + else + SetMainCallback2(sub_800EC9C); + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) + { + CreateNPCTrainerParty(gEnemyParty, gTrainerBattleOpponent); + SetWildMonHeldItem(); + } + gMain.inBattle = TRUE; + for (i = 0; i < 6; i++) + AdjustFriendship(&gPlayerParty[i], 3); + gBattleCommunication[0] = 0; +} + +void sub_800E9EC(void) +{ + u16 r6 = 0; + u16 species; + u16 hp; + u32 status; + s32 i; + + for (i = 0; i < 6; i++) + { + species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); + hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); + + if (species == 0) + continue; + if (species != SPECIES_EGG && hp != 0 && status == 0) + r6 |= 1 << i * 2; + + if (species == 0) + continue; + if (hp != 0 && (species == SPECIES_EGG || status != 0)) + r6 |= 2 << i * 2; + + if (species == 0) + continue; + if (species != SPECIES_EGG && hp == 0) + r6 |= 3 << i * 2; + } + ewram0.unk2 = r6; + ewram0.unk3 = r6 >> 8; +} + +void sub_800EAAC(void) +{ + s32 i; + struct UnknownStruct8 *_ewram4 = &ewram4; + + for (i = 0; i < 7; i++) + _ewram4->unk0[i] = gSaveBlock1.enigmaBerry.berry.name[i]; + for (i = 0; i < 18; i++) + _ewram4->unk8[i] = gSaveBlock1.enigmaBerry.itemEffect[i]; + _ewram4->unk7 = gSaveBlock1.enigmaBerry.holdEffect; + _ewram4->unk1A = gSaveBlock1.enigmaBerry.holdEffectParam; +} + +void sub_800EB08(void) +{ + s32 i; + s32 j; + + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) + { + for (i = 0; i < 7; i++) + { + gEnigmaBerries[0].name[i] = gSaveBlock1.enigmaBerry.berry.name[i]; + gEnigmaBerries[2].name[i] = gSaveBlock1.enigmaBerry.berry.name[i]; + } + for (i = 0; i < 18; i++) + { + gEnigmaBerries[0].itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i]; + gEnigmaBerries[2].itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i]; + } + gEnigmaBerries[0].holdEffect = gSaveBlock1.enigmaBerry.holdEffect; + gEnigmaBerries[2].holdEffect = gSaveBlock1.enigmaBerry.holdEffect; + gEnigmaBerries[0].holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam; + gEnigmaBerries[2].holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam; + } + else + { + s32 numPlayers; + struct BattleEnigmaBerry *src; + u8 r4; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + numPlayers = 4; + else + numPlayers = 2; + for (i = 0; i < numPlayers; i++) + { + src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2); + r4 = gLinkPlayers[i].lp_field_18; + + for (j = 0; j < 7; j++) + gEnigmaBerries[r4].name[j] = src->name[j]; + for (j = 0; j < 18; j++) + gEnigmaBerries[r4].itemEffect[j] = src->itemEffect[j]; + gEnigmaBerries[r4].holdEffect = src->holdEffect; + gEnigmaBerries[r4].holdEffectParam = src->holdEffectParam; + } + } +} + +void shedinja_something(struct Pokemon *pkmn) +{ + u8 nickname[POKEMON_NAME_LENGTH + 1]; + u8 language = 1; + + if (GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA + && GetMonData(pkmn, MON_DATA_LANGUAGE) != language) + { + GetMonData(pkmn, MON_DATA_NICKNAME, nickname); + if (StringCompareWithoutExtCtrlCodes(nickname, gUnknown_081F96C8) == 0) + SetMonData(pkmn, MON_DATA_LANGUAGE, &language); + } +} + +void sub_800EC9C(void) +{ + u8 playerId; + u8 enemyId; + + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + playerId = GetMultiplayerId(); + ewram160CB = playerId; + enemyId = playerId ^ 1; + + switch (gBattleCommunication[0]) + { + case 0: + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + { + ewram0.unk0 = 1; + ewram0.unk1 = 1; + sub_800E9EC(); + sub_800EAAC(); + SendBlock(bitmask_all_link_players_but_self(), &ewram0, 32); + gBattleCommunication[0] = 1; + } + } + else + { + gBattleTypeFlags |= BATTLE_TYPE_WILD; + gBattleCommunication[0] = 8; + sub_800EB08(); + } + break; + case 1: + if ((GetBlockReceivedStatus() & 3) == 3) + { + s32 id; + u8 taskId; + + ResetBlockReceivedFlags(); + id = 0; + if (gBlockRecvBuffer[0][0] == 0x100) + { + if (playerId == 0) + gBattleTypeFlags |= 12; + else + gBattleTypeFlags |= 8; + id++; + } + if (id == 0) + { + if (gBlockRecvBuffer[0][0] == gBlockRecvBuffer[1][0]) + { + if (playerId == 0) + gBattleTypeFlags |= 12; + else + gBattleTypeFlags |= 8; + id++; + } + if (id == 0) + { + while (id < 2) + { + if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId) + break; + id++; + } + if (id == 2) + gBattleTypeFlags |= 12; + else + gBattleTypeFlags |= 8; + } + } + sub_800EB08(); + taskId = CreateTask(sub_800DE30, 0); + gTasks[taskId].data[1] = 0x10E; + gTasks[taskId].data[2] = 0x5A; + gTasks[taskId].data[5] = 0; + gTasks[taskId].data[3] = ewram0.unk2 | (ewram0.unk3 << 8); + gTasks[taskId].data[4] = gBlockRecvBuffer[enemyId][1]; + gBattleCommunication[0]++; + } + break; + case 2: + if (sub_8007ECC()) + { + SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(*gPlayerParty) * 2); + gBattleCommunication[0]++; + } + break; + case 3: + if ((GetBlockReceivedStatus() & 3) == 3) + { + ResetBlockReceivedFlags(); + memcpy(gEnemyParty, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2); + gBattleCommunication[0]++; + } + break; + case 4: + if (sub_8007ECC()) + { + SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(*gPlayerParty) * 2); + gBattleCommunication[0]++; + } + break; + case 5: + if ((GetBlockReceivedStatus() & 3) == 3) + { + ResetBlockReceivedFlags(); + memcpy(gEnemyParty + 2, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2); + gBattleCommunication[0]++; + } + break; + case 6: + if (sub_8007ECC()) + { + SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(*gPlayerParty) * 2); + gBattleCommunication[0]++; + } + break; + case 7: + if ((GetBlockReceivedStatus() & 3) == 3) + { + ResetBlockReceivedFlags(); + memcpy(gEnemyParty + 4, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2); + shedinja_something(&gEnemyParty[0]); + shedinja_something(&gEnemyParty[1]); + shedinja_something(&gEnemyParty[2]); + shedinja_something(&gEnemyParty[3]); + shedinja_something(&gEnemyParty[4]); + shedinja_something(&gEnemyParty[5]); + gBattleCommunication[0]++; + } + break; + case 8: + sub_800B950(); + gBattleCommunication[0]++; + gBattleCommunication[1] = 0; + gBattleCommunication[2] = 0; + break; + case 9: + if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) + { + gPreBattleCallback1 = gMain.callback1; + gMain.callback1 = sub_8010824; + SetMainCallback2(sub_800F808); + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gTrainerBattleOpponent = 0x800; + gBattleTypeFlags |= BATTLE_TYPE_20; + } + } + break; + } +} + +void sub_800F02C(void) +{ + s32 i; + + for (i = 0; i < 3; i++) + { + u8 *nickname = gUnknown_02023A00[i].nickname; + + gUnknown_02023A00[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES); + gUnknown_02023A00[i].heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nickname); + gUnknown_02023A00[i].level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); + gUnknown_02023A00[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + gUnknown_02023A00[i].maxhp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); + gUnknown_02023A00[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); + gUnknown_02023A00[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); + gUnknown_02023A00[i].gender = GetMonGender(&gPlayerParty[i]); + StripExtCtrlCodes(nickname); + gUnknown_02023A00[i].language = GetMonData(&gPlayerParty[i], MON_DATA_LANGUAGE); + if (gUnknown_02023A00[i].language != 1) + PadNameString(nickname, 0); + } + memcpy(ewram, gUnknown_02023A00, 0x60); +} + +void sub_800F104(void) +{ + u8 playerId; + MainCallback *pSavedCallback; + u16 *pSavedBattleTypeFlags; + + playerId = GetMultiplayerId(); + ewram160CB = playerId; + // Seriously, Game Freak? + pSavedCallback = (MainCallback *)(ewram + 0x160C4); + pSavedBattleTypeFlags = (u16 *)(ewram + 0x160C2); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + + switch (gBattleCommunication[0]) + { + case 0: + if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + { + sub_800F02C(); + SendBlock(bitmask_all_link_players_but_self(), ewram, 0x60); + gBattleCommunication[0]++; + } + break; + case 1: + if ((GetBlockReceivedStatus() & 0xF) == 0xF) + { + s32 i; + + ResetBlockReceivedFlags(); + for (i = 0; i < 4; i++) + { + if (i != playerId) + { + if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) + || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) + memcpy(gUnknown_02023A00, gBlockRecvBuffer[i], 0x60); + } + } + gBattleCommunication[0]++; + *pSavedCallback = gMain.savedCallback; + *pSavedBattleTypeFlags = gBattleTypeFlags; + gMain.savedCallback = sub_800F104; + OpenPartyMenu(5, 0); + } + break; + case 2: + if (!gPaletteFade.active) + { + gBattleCommunication[0] = 3; + sub_800832C(); + } + break; + case 3: + if (gReceivedRemoteLinkPlayers == 0) + { + gBattleTypeFlags = *pSavedBattleTypeFlags; + gMain.savedCallback = *pSavedCallback; + SetMainCallback2(InitBattle); + } + break; + } +} + +void sub_800F298(void) +{ + u8 playerId; + s32 id; + + playerId = GetMultiplayerId(); + ewram160CB = playerId; + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + switch (gBattleCommunication[0]) + { + case 0: + if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + { + ewram0.unk0 = 1; + ewram0.unk1 = 1; + sub_800E9EC(); + sub_800EAAC(); + SendBlock(bitmask_all_link_players_but_self(), ewram, 0x20); + gBattleCommunication[0]++; + } + break; + case 1: + if ((GetBlockReceivedStatus() & 0xF) == 0xF) + { + u8 taskId; + + ResetBlockReceivedFlags(); + id = 0; + if (gBlockRecvBuffer[0][0] == 0x100) + { + if (playerId == 0) + gBattleTypeFlags |= 12; + else + gBattleTypeFlags |= 8; + id++; + } + if (id == 0) + { + s32 i; + + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0]) + break; + } + if (i == MAX_LINK_PLAYERS) + { + if (playerId == 0) + gBattleTypeFlags |= 12; + else + gBattleTypeFlags |= 8; + id++; + } + if (id == 0) + { + while (id < MAX_LINK_PLAYERS) + { + if (gBlockRecvBuffer[id][0] == 0x0101 && id != playerId) + if (id < playerId) + break; + if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId) + break; + id++; + } + if (id == MAX_LINK_PLAYERS) + gBattleTypeFlags |= 12; + else + gBattleTypeFlags |= 8; + } + } + sub_800EB08(); + memcpy(ewram1D000, gPlayerParty, sizeof(struct Pokemon) * 3); + taskId = CreateTask(sub_800DE30, 0); + gTasks[taskId].data[1] = 0x10E; + gTasks[taskId].data[2] = 0x5A; + gTasks[taskId].data[5] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 0; + for (id = 0; id < MAX_LINK_PLAYERS; id++) + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F; + break; + case 1: + gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F; + break; + case 2: + gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; + break; + case 3: + gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; + break; + } + } + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + gBattleCommunication[0]++; + goto step_2; + } + break; + case 2: + step_2: + if (sub_8007ECC()) + { + SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2); + gBattleCommunication[0]++; + } + break; + case 3: + if ((GetBlockReceivedStatus() & 0xF) == 0xF) + { + ResetBlockReceivedFlags(); + for (id = 0; id < MAX_LINK_PLAYERS; id++) + { + if (id == playerId) + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + case 1: + case 2: + memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + } + } + else + { + if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) + || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + case 1: + case 2: + memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + } + } + else + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + case 1: + case 2: + memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + } + } + } + } + gBattleCommunication[0]++; + } + break; + case 4: + if (sub_8007ECC()) + { + SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon)); + gBattleCommunication[0]++; + } + break; + case 5: + if ((GetBlockReceivedStatus() & 0xF) == 0xF) + { + ResetBlockReceivedFlags(); + for (id = 0; id < MAX_LINK_PLAYERS; id++) + { + if (id == playerId) + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + case 1: + case 2: + memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + } + } + else + { + if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) + || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + case 1: + case 2: + memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + } + } + else + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + case 1: + case 2: + memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + } + } + } + } + + shedinja_something(&gPlayerParty[0]); + shedinja_something(&gPlayerParty[1]); + shedinja_something(&gPlayerParty[2]); + shedinja_something(&gPlayerParty[3]); + shedinja_something(&gPlayerParty[4]); + shedinja_something(&gPlayerParty[5]); + + shedinja_something(&gEnemyParty[0]); + shedinja_something(&gEnemyParty[1]); + shedinja_something(&gEnemyParty[2]); + shedinja_something(&gEnemyParty[3]); + shedinja_something(&gEnemyParty[4]); + shedinja_something(&gEnemyParty[5]); + + gBattleCommunication[0]++; + } + break; + case 6: + sub_800B950(); + gBattleCommunication[0]++; + gBattleCommunication[1] = 0; + gBattleCommunication[2] = 0; + break; + case 7: + if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) + { + gPreBattleCallback1 = gMain.callback1; + gMain.callback1 = sub_8010824; + SetMainCallback2(sub_800F808); + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gTrainerBattleOpponent = 0x800; + gBattleTypeFlags |= BATTLE_TYPE_20; + } + } + break; + } +} + +void sub_800F808(void) +{ + AnimateSprites(); + BuildOamBuffer(); + sub_800374C(&gUnknown_03004210); + UpdatePaletteFade(); + RunTasks(); +} + +void sub_800F828(struct Sprite *sprite) +{ + sprite->data0 = 0; + sprite->callback = sub_800F838; +} + +void sub_800F838(struct Sprite *sprite) +{ + u16 *arr = (u16 *)ewram; + + switch (sprite->data0) + { + case 0: + sprite->data0++; + sprite->data1 = 0; + sprite->data2 = 0x281; + sprite->data3 = 0; + sprite->data4 = 1; + // fall through + case 1: + sprite->data4--; + if (sprite->data4 == 0) + { + s32 i; + s32 r2; + s32 r0; + + sprite->data4 = 2; + r2 = sprite->data1 + sprite->data3 * 32; + r0 = sprite->data2 - sprite->data3 * 32; + for (i = 0; i < 29; i += 2) + { + arr[r2 + i] = 0x3D; + arr[r0 + i] = 0x3D; + } + sprite->data3++; + if (sprite->data3 == 21) + { + sprite->data0++; + sprite->data1 = 32; + } + } + break; + case 2: + sprite->data1--; + if (sprite->data1 == 20) + SetMainCallback2(sub_800E7C4); + break; + } +} + +u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) +{ + u32 nameHash = 0; + s32 i; + + if (trainerNum == 0x400) + return 0; + + if ((gBattleTypeFlags & 0x908) == 8) + { + ZeroEnemyPartyMons(); + for (i = 0; i < gTrainers[trainerNum].partySize; i++) + { + u32 personalityValue; + s32 j; + u8 fixedIV; + + if (gTrainers[trainerNum].doubleBattle == TRUE) + personalityValue = 0x80; + else if (gTrainers[trainerNum].encounterMusic_gender & 0x80) + personalityValue = 0x78; + else + personalityValue = 0x88; + + for (j = 0; gTrainers[trainerNum].trainerName[j] != 0xFF; j++) + nameHash += gTrainers[trainerNum].trainerName[j]; + + switch (gTrainers[trainerNum].partyFlags) + { + case 0: + { + struct TrainerPartyMember0 *partyData = gTrainers[trainerNum].party; + + for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) + nameHash += gSpeciesNames[partyData[i].species][j]; + personalityValue += nameHash << 8; + fixedIV = partyData[i].iv * 31 / 255; + CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); + break; + } + case 1: + { + struct TrainerPartyMember1 *partyData = gTrainers[trainerNum].party; + + for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) + nameHash += gSpeciesNames[partyData[i].species][j]; + personalityValue += nameHash << 8; + fixedIV = partyData[i].iv * 31 / 255; + CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); + + for (j = 0; j < 4; j++) + { + SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]); + SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); + } + break; + } + case 2: + { + struct TrainerPartyMember2 *partyData = gTrainers[trainerNum].party; + + for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) + nameHash += gSpeciesNames[partyData[i].species][j]; + personalityValue += nameHash << 8; + fixedIV = partyData[i].iv * 31 / 255; + CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); + + SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem); + break; + } + case 3: + { + struct TrainerPartyMember3 *partyData = gTrainers[trainerNum].party; + + for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) + nameHash += gSpeciesNames[partyData[i].species][j]; + personalityValue += nameHash << 8; + fixedIV = partyData[i].iv * 31 / 255; + CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); + + SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem); + for (j = 0; j < 4; j++) + { + SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]); + SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); + } + break; + } + } + } + gBattleTypeFlags |= gTrainers[trainerNum].doubleBattle; + } + return gTrainers[trainerNum].partySize; +} + +void sub_800FCD4(void) +{ + if (REG_VCOUNT < 0xA0 && REG_VCOUNT >= 0x6F ) + REG_BG0CNT = 0x9800; +} + +void sub_800FCFC(void) +{ + Random(); // unused return value + REG_BG0HOFS = gUnknown_030042A4; + REG_BG0VOFS = gUnknown_030042A0; + REG_BG1HOFS = gUnknown_030042C0; + REG_BG1VOFS = gUnknown_030041B4; + REG_BG2HOFS = gUnknown_03004288; + REG_BG2VOFS = gUnknown_03004280; + REG_BG3HOFS = gUnknown_030041B0; + REG_BG3VOFS = gUnknown_030041B8; + REG_WIN0H = gUnknown_030042C4; + REG_WIN0V = gUnknown_03004240; + REG_WIN1H = gUnknown_03004200; + REG_WIN1V = gUnknown_03004244; + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_8089668(); +} + +void nullsub_36(struct Sprite *sprite) +{ +} + +void sub_800FDB0(struct Sprite *sprite) +{ + if (sprite->data0 != 0) + sprite->pos1.x = sprite->data1 + ((sprite->data2 & 0xFF00) >> 8); + else + sprite->pos1.x = sprite->data1 - ((sprite->data2 & 0xFF00) >> 8); + sprite->data2 += 0x180; + if (sprite->affineAnimEnded) + { + FreeSpriteTilesByTag(0x2710); + FreeSpritePaletteByTag(0x2710); + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + } +} + +void sub_800FE20(struct Sprite *sprite) +{ + StartSpriteAffineAnim(sprite, 1); + sprite->callback = sub_800FDB0; + PlaySE(SE_BT_START); +} + +void sub_800FE40(u8 taskId) +{ + struct Pokemon *sp4 = NULL; + struct Pokemon *sp8 = NULL; + u8 r2 = ewram160CB; + u32 r7; + s32 i; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + switch (gLinkPlayers[r2].lp_field_18) + { + case 0: + case 2: + sp4 = gPlayerParty; + sp8 = gEnemyParty; + break; + case 1: + case 3: + sp4 = gEnemyParty; + sp8 = gPlayerParty; + break; + } + } + else + { + sp4 = gPlayerParty; + sp8 = gEnemyParty; + } + + r7 = 0; + for (i = 0; i < 6; i++) + { + u16 species = GetMonData(&sp4[i], MON_DATA_SPECIES2); + u16 hp = GetMonData(&sp4[i], MON_DATA_HP); + u32 status = GetMonData(&sp4[i], MON_DATA_STATUS); + + if (species == 0) + continue; + if (species != SPECIES_EGG && hp != 0 && status == 0) + r7 |= 1 << i * 2; + + if (species == 0) + continue; + if (hp != 0 && (species == SPECIES_EGG || status != 0)) + r7 |= 2 << i * 2; + + if (species == 0) + continue; + if (species != SPECIES_EGG && hp == 0) + r7 |= 3 << i * 2; + } + gTasks[taskId].data[3] = r7; + + r7 = 0; + for (i = 0; i < 6; i++) + { + u16 species = GetMonData(&sp8[i], MON_DATA_SPECIES2); + u16 hp = GetMonData(&sp8[i], MON_DATA_HP); + u32 status = GetMonData(&sp8[i], MON_DATA_STATUS); + + if (species == 0) + continue; + if (species != SPECIES_EGG && hp != 0 && status == 0) + r7 |= 1 << i * 2; + + if (species == 0) + continue; + if (hp != 0 && (species == SPECIES_EGG || status != 0)) + r7 |= 2 << i * 2; + + if (species == 0) + continue; + if (species != SPECIES_EGG && hp == 0) + r7 |= 3 << i * 2; + } + gTasks[taskId].data[4] = r7; +} + +void c2_8011A1C(void) +{ + s32 i; + u8 taskId; + + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + CpuFill32(0, (void *)VRAM, VRAM_SIZE); + REG_MOSAIC = 0; + REG_WIN0H = 0xF0; + REG_WIN0V = 0x5051; + REG_WININ = 0; + REG_WINOUT = 0; + gUnknown_030042C4 = 0xF0; + gUnknown_03004240 = 0x5051; + dp12_8087EA4(); + + for (i = 0; i < 80; i++) + { + gUnknown_03004DE0.unk0[i] = 0xF0; + gUnknown_03004DE0.unk780[i] = 0xF0; + } + for (i = 80; i < 160; i++) + { + asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter + gUnknown_03004DE0.unk0[i] = 0xFF10; + gUnknown_03004DE0.unk780[i] = 0xFF10; + } + SetUpWindowConfig(&gWindowConfig_81E6C58); + ResetPaletteFade(); + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + gUnknown_030042C0 = 0; + gUnknown_030041B4 = 0; + gUnknown_03004288 = 0; + gUnknown_03004280 = 0; + gUnknown_030041B0 = 0; + gUnknown_030041B8 = 0; + + InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58); + InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0); + InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC); + sub_800D6D4(); + LoadCompressedPalette(gUnknown_08D004E0, 0, 64); + sub_800D74C(); + ResetSpriteData(); + ResetTasks(); + sub_800E23C(); + REG_WINOUT = 0x37; + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 4; + SetVBlankCallback(sub_800FCFC); + taskId = CreateTask(sub_800DE30, 0); + gTasks[taskId].data[1] = 0x10E; + gTasks[taskId].data[2] = 0x5A; + gTasks[taskId].data[5] = 1; + sub_800FE40(taskId); + SetMainCallback2(sub_80101B8); + gBattleCommunication[0] = 0; +} + +void sub_80101B8(void) +{ + c2_081284E0(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + RunTasks(); +} + +void c2_081284E0(void) +{ + switch (gBattleCommunication[0]) + { + case 0: + gBattleCommunication[1] = 0xFF; + gBattleCommunication[0]++; + break; + case 1: + gBattleCommunication[1]--; + if (gBattleCommunication[1] == 0) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gBattleCommunication[0]++; + } + break; + case 2: + if (!gPaletteFade.active) + SetMainCallback2(gMain.savedCallback); + break; + } +} + +void oac_poke_opponent(struct Sprite *sprite) +{ + sprite->callback = sub_8010278; + StartSpriteAnimIfDifferent(sprite, 0); + BeginNormalPaletteFade(0x00020000, 0, 10, 10, 0x3DEF); +} + +void sub_8010278(struct Sprite *sprite) +{ + if ((gUnknown_02024DE8 & 1) == 0) + { + sprite->pos2.x += 2; + if (sprite->pos2.x == 0) + { + sprite->callback = sub_80102AC; + PlayCry1(sprite->data2, 25); + } + } +} + +void sub_80102AC(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + sub_804777C(sprite->data0); + sub_8043DFC(gHealthboxIDs[sprite->data0]); + sprite->callback = nullsub_37; + StartSpriteAnimIfDifferent(sprite, 0); + BeginNormalPaletteFade(0x00020000, 0, 10, 0, 0x3DEF); + } +} + +void nullsub_37(struct Sprite *sprite) +{ +} + +void unref_sub_801030C(struct Sprite *sprite) +{ + sprite->data3 = 6; + sprite->data4 = 1; + sprite->callback = sub_8010320; +} + +void sub_8010320(struct Sprite *sprite) +{ + sprite->data4--; + if (sprite->data4 == 0) + { + sprite->data4 = 8; + sprite->invisible ^= 1; + sprite->data3--; + if (sprite->data3 == 0) + { + sprite->invisible = FALSE; + sprite->callback = nullsub_37; + gUnknown_03004284 = 0; + } + } +} + +void sub_8010384(struct Sprite *sprite) +{ + u8 r6 = sprite->data0; + u16 species; + u8 yOffset; + + if (ewram17800[r6].unk2 != 0) + species = ewram17800[r6].unk2; + else + species = sprite->data2; + + GetMonData(&gEnemyParty[gBattlePartyID[r6]], MON_DATA_PERSONALITY); // Unused return value + + if (species == SPECIES_UNOWN) + { + u32 personalityValue = GetMonData(&gEnemyParty[gBattlePartyID[r6]], MON_DATA_PERSONALITY); + u16 unownForm = ((((personalityValue & 0x3000000) >> 18) | ((personalityValue & 0x30000) >> 12) | ((personalityValue & 0x300) >> 6) | (personalityValue & 3)) % 0x1C); + u16 unownSpecies; + + if (unownForm == 0) + unownSpecies = SPECIES_UNOWN; // Use the A Unown form + else + unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters + + yOffset = gMonFrontPicCoords[unownSpecies].y_offset; + } + else if (species == SPECIES_CASTFORM) + { + yOffset = gCastformFrontSpriteCoords[gBattleMonForms[r6]].y_offset; + } + else if (species > NUM_SPECIES) + { + yOffset = gMonFrontPicCoords[SPECIES_NONE].y_offset; + } + else + { + yOffset = gMonFrontPicCoords[species].y_offset; + } + + sprite->data3 = 8 - yOffset / 8; + sprite->data4 = 1; + sprite->callback = sub_8010494; +} + +void sub_8010494(struct Sprite *sprite) +{ + s32 i; + + sprite->data4--; + if (sprite->data4 == 0) + { + sprite->data4 = 2; + sprite->pos2.y += 8; + sprite->data3--; + if (sprite->data3 < 0) + { + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + } + else + { + u8 *dst = (u8 *)gUnknown_081FAF4C[GetBankIdentity(sprite->data0)] + (gBattleMonForms[sprite->data0] << 11) + (sprite->data3 << 8); + + for (i = 0; i < 0x100; i++) + *(dst++) = 0; + StartSpriteAnim(sprite, gBattleMonForms[sprite->data0]); + } + } +} + +void sub_8010520(struct Sprite *sprite) +{ + sprite->data3 = 8; + sprite->data4 = sprite->invisible; + sprite->callback = sub_801053C; +} + +void sub_801053C(struct Sprite *sprite) +{ + sprite->data3--; + if (sprite->data3 == 0) + { + sprite->invisible ^= 1; + sprite->data3 = 8; + } +} + +void sub_8010574(struct Sprite *sprite) +{ + sprite->invisible = sprite->data4; + sprite->data4 = FALSE; + sprite->callback = nullsub_37; +} + +void sub_80105A0(struct Sprite *sprite) +{ + sprite->callback = oac_poke_ally_; +} + +void oac_poke_ally_(struct Sprite *sprite) +{ + if ((gUnknown_02024DE8 & 1) == 0) + { + sprite->pos2.x -= 2; + if (sprite->pos2.x == 0) + { + sprite->callback = nullsub_86; + sprite->data1 = 0; + } + } +} + +void sub_80105DC(struct Sprite *sprite) +{ + sprite->callback = nullsub_86; +} + +void nullsub_86(struct Sprite *sprite) +{ +} + +void sub_80105EC(struct Sprite *sprite) +{ + if ((gUnknown_02024DE8 & 1) == 0) + { + sprite->pos2.x += sprite->data1; + sprite->pos2.y += sprite->data2; + } +} + +void dp11b_obj_instanciate(u8 bank, u8 b, s8 c, s8 d) +{ + u8 spriteId; + u8 objectID; + + if (b) + { + if (ewram17810[bank].unk0_1) + return; + } + else + { + if (ewram17810[bank].unk0_2) + return; + } + + spriteId = CreateInvisibleSpriteWithCallback(objc_dp11b_pingpong); + if (b == TRUE) + { + objectID = gHealthboxIDs[bank]; + ewram17810[bank].unk2 = spriteId; + ewram17810[bank].unk0_1 = 1; + gSprites[spriteId].data0 = 0x80; + } + else + { + objectID = gObjectBankIDs[bank]; + ewram17810[bank].unk3 = spriteId; + ewram17810[bank].unk0_2 = 1; + gSprites[spriteId].data0 = 0xC0; + } + gSprites[spriteId].data1 = c; + gSprites[spriteId].data2 = d; + gSprites[spriteId].data3 = objectID; + gSprites[spriteId].data4 = b; + gSprites[objectID].pos2.x = 0; + gSprites[objectID].pos2.y = 0; +} + +void dp11b_obj_free(u8 a, u8 b) +{ + u8 r4; + + if (b == TRUE) + { + if (!ewram17810[a].unk0_1) + return; + r4 = gSprites[ewram17810[a].unk2].data3; + DestroySprite(&gSprites[ewram17810[a].unk2]); + ewram17810[a].unk0_1 = 0; + } + else + { + if (!ewram17810[a].unk0_2) + return; + r4 = gSprites[ewram17810[a].unk3].data3; + DestroySprite(&gSprites[ewram17810[a].unk3]); + ewram17810[a].unk0_2 = 0; + } + gSprites[r4].pos2.x = 0; + gSprites[r4].pos2.y = 0; +} + +void objc_dp11b_pingpong(struct Sprite *sprite) +{ + u8 spriteId = sprite->data3; + s32 var; + + if (sprite->data4 == 1) + var = sprite->data0; + else + var = sprite->data0; + + gSprites[spriteId].pos2.y = Sin(var, sprite->data2) + sprite->data2; + sprite->data0 = (sprite->data0 + sprite->data1) & 0xFF; +} + +void nullsub_41(void) +{ +} + +void sub_8010800(void) +{ + sub_8010874(); + gBattleCommunication[1] = 0; + gBattleMainFunc = bc_8012FAC; +} + +void sub_8010824(void) +{ + gBattleMainFunc(); + + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + gBattleBankFunc[gActiveBank](); +} + +void sub_8010874(void) +{ + s32 i; + u32 j; + u8 *r4; + + TurnValuesCleanUp(0); + SpecialStatusesClear(); + + for (i = 0; i < 4; i++) + { + gStatuses3[i] = 0; + + r4 = (u8 *)&gDisableStructs[i]; + for (j = 0; j < (u32)0x1C; j++) + r4[j] = 0; + + gDisableStructs[i].isFirstTurn= 2; + gUnknown_02024C70[i] = 0; + gLastUsedMove[i] = 0; + gMoveHitWith[i] = 0; + gUnknown_02024C44[i] = 0; + gUnknown_02024C4C[i] = 0; + gUnknown_02024C5C[i] = 0xFF; + gLockedMove[i] = 0; + gUnknown_02024C2C[i] = 0; + ewram17100[i] = 0; + } + + for (i = 0; i < 2; i++) + { + gSideAffecting[i] = 0; + + r4 = (u8 *)&gSideTimer[i]; + for (j = 0; j < 12; j++) + r4[j] = 0; + } + + gBankAttacker = 0; + gBankTarget = 0; + gBattleWeather = 0; + + r4 = (u8 *)&gWishFutureKnock; + for (i = 0; i < (u32)0x2C; i++) + r4[i] = 0; + + gHitMarker = 0; + if ((gBattleTypeFlags & BATTLE_TYPE_LINK) == 0 && gSaveBlock2.optionsBattleSceneOff == TRUE) + gHitMarker = HITMARKER_NO_ANIMATIONS; + ewram16084 = gSaveBlock2.optionsBattleStyle; + gMultiHitCounter = 0; + gBattleOutcome = 0; + gBattleExecBuffer = 0; + gPaydayMoney = 0; + ewram17130 = 0; + ewram17160 = 0; + for (i = 0; i < 8; i++) + gBattleCommunication[i] = 0; + gPauseCounterBattle = 0; + gBattleMoveDamage = 0; + gUnknown_02024DE8 = 0; + ewram16002 = 0; + ewram160A1 = 0; + gLeveledUpInBattle = 0; + gAbsentBankFlags = 0; + ewram16078 = 0; + ewram16086 = 0; + ewram16087 = 0; + ewram16089 = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275; + ewram16088 = 3; + ewram1601B = 0; + ewram16056 = 1; + + for (i = 0; i < 8; i++) + { + ewram[i + 0x160AC] = 0; + ewram[i + 0x160CC] = 0; + ewram[i + 0x160E8] = 0; + ewram[i + 0x160F0] = 0; + ewram[i + 0x16100] = 0; + ewram[i + 0x16108] = 0; + } + + ewram160C8 = 6; + ewram160C9 = 6; + ewram16113 = 0; + for (i = 0; i < 11; i++) + gBattleResults.unk36[i] = 0; + gBattleResults.battleTurnCounter = 0; + gBattleResults.playerFaintCounter = 0; + gBattleResults.opponentFaintCounter = 0; + gBattleResults.unk2 = 0; + gBattleResults.unk3 = 0; + gBattleResults.unk4 = 0; + gBattleResults.unk5_0 = 0; + gBattleResults.unk5_1 = 0; + gBattleResults.lastOpponentSpecies = 0; + gBattleResults.lastUsedMove = 0; + gBattleResults.opponentMove = 0; + gBattleResults.poke1Species = 0; + gBattleResults.opponentSpecies = 0; + gBattleResults.caughtPoke = 0; + for (i = 0; i < 10; i++) + { + gBattleResults.pokeString1[i] = 0; + gBattleResults.pokeString2[i] = 0; + gBattleResults.caughtNick[i] = 0; + } +} + +void SwitchInClearStructs(void) +{ + struct DisableStruct sp0 = gDisableStructs[gActiveBank]; + s32 i; + u8 *ptr; + u32 *ptr2; + + if (gBattleMoves[gCurrentMove].effect != EFFECT_BATON_PASS) + { + for (i = 0; i < 8; i++) + gBattleMons[gActiveBank].statStages[i] = 6; + for (i = 0; i < gNoOfAllBanks; i++) + { + struct UnknownStruct12 *sp20 = &gUnknown_02024AD0[i]; + + if ((sp20->unk0 & 0x04000000) && gDisableStructs[i].bankPreventingEscape == gActiveBank) + sp20->unk0 &= ~0x04000000; + if ((gStatuses3[i] & STATUS3_ALWAYS_HITS) && gDisableStructs[i].bankWithSureHit == gActiveBank) + { + gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; + gDisableStructs[i].bankWithSureHit = 0; + } + } + } + if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) + { + gBattleMons[gActiveBank].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED); + gStatuses3[gActiveBank] &= (STATUS3_LEECHSEED_BANK | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT); + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (GetBankSide(gActiveBank) != GetBankSide(i) + && (gStatuses3[i] & STATUS3_ALWAYS_HITS) != 0 + && (gDisableStructs[i].bankWithSureHit == gActiveBank)) + { + gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; + gStatuses3[i] |= 0x10; + } + } + } + else + { + gBattleMons[gActiveBank].status2 = 0; + gStatuses3[gActiveBank] = 0; + } + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gUnknown_02024AD0[i].unk0 & (gBitTable[gActiveBank] << 16)) + gUnknown_02024AD0[i].unk0 &= ~(gBitTable[gActiveBank] << 16); + if ((gUnknown_02024AD0[i].unk0 & 0xE000) && ewram[0x16020 + i] == gActiveBank) + gUnknown_02024AD0[i].unk0 &= ~0xE000; + } + + gActionSelectionCursor[gActiveBank] = 0; + gMoveSelectionCursor[gActiveBank] = 0; + + ptr = (u8 *)&gDisableStructs[gActiveBank]; + for (i = 0; i < (u32)0x1C; i++) + ptr[i] = 0; + + if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) + { + gDisableStructs[gActiveBank].substituteHP = sp0.substituteHP; + gDisableStructs[gActiveBank].bankWithSureHit = sp0.bankWithSureHit; + gDisableStructs[gActiveBank].perishSong1 = sp0.perishSong1; + gDisableStructs[gActiveBank].perishSong2 = sp0.perishSong2; + } + + gDisableStructs[gActiveBank].isFirstTurn= 2; + gLastUsedMove[gActiveBank] = 0; + gMoveHitWith[gActiveBank] = 0; + gUnknown_02024C44[gActiveBank] = 0; + gUnknown_02024C4C[gActiveBank] = 0; + gUnknown_02024C2C[gActiveBank] = 0; + gUnknown_02024C5C[gActiveBank] = 0xFF; + + ewram[0x160AC + gActiveBank * 2 + 0] = 0; + ewram[0x160AC + gActiveBank * 2 + 1] = 0; + ewram[0x16100 + gActiveBank * 4 + 0] = 0; + ewram[0x16100 + gActiveBank * 4 + 1] = 0; + ewram[0x16100 + gActiveBank * 4 + 2] = 0; + ewram[0x16100 + gActiveBank * 4 + 3] = 0; + ewram[0x160E8 + gActiveBank * 2 + 0] = 0; + ewram[0x160E8 + gActiveBank * 2 + 1] = 0; + + ptr2 = (u32 *)(ewram + 0x17100); + ptr2[gActiveBank] = 0; + + gCurrentMove = 0; +} + +void UndoEffectsAfterFainting(void) +{ + s32 i; + u8 *ptr; + u32 *ptr2; + + for (i = 0; i < 8; i++) + gBattleMons[gActiveBank].statStages[i] = 6; + gBattleMons[gActiveBank].status2 = 0; + gStatuses3[gActiveBank] = 0; + for (i = 0; i < gNoOfAllBanks; i++) + { + if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].bankPreventingEscape == gActiveBank) + gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; + if (gBattleMons[i].status2 & (gBitTable[gActiveBank] << 16)) + gBattleMons[i].status2 &= ~(gBitTable[gActiveBank] << 16); + if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && ewram[0x16020 + i] == gActiveBank) + gBattleMons[i].status2 &= ~STATUS2_WRAPPED; + } + gActionSelectionCursor[gActiveBank] = 0; + gMoveSelectionCursor[gActiveBank] = 0; + + ptr = (u8 *)&gDisableStructs[gActiveBank]; + for (i = 0; i < (u32)0x1C; i++) + ptr[i] = 0; + gProtectStructs[gActiveBank].protected = 0; + gProtectStructs[gActiveBank].endured = 0; + gProtectStructs[gActiveBank].onlyStruggle = 0; + gProtectStructs[gActiveBank].helpingHand = 0; + gProtectStructs[gActiveBank].bounceMove = 0; + gProtectStructs[gActiveBank].stealMove = 0; + gProtectStructs[gActiveBank].flag0Unknown = 0; + gProtectStructs[gActiveBank].prlzImmobility = 0; + gProtectStructs[gActiveBank].confusionSelfDmg = 0; + gProtectStructs[gActiveBank].notEffective = 0; + gProtectStructs[gActiveBank].chargingTurn = 0; + gProtectStructs[gActiveBank].fleeFlag = 0; + gProtectStructs[gActiveBank].usedImprisionedMove = 0; + gProtectStructs[gActiveBank].loveImmobility = 0; + gProtectStructs[gActiveBank].usedDisabledMove = 0; + gProtectStructs[gActiveBank].usedTauntedMove = 0; + gProtectStructs[gActiveBank].flag2Unknown = 0; + gProtectStructs[gActiveBank].flinchImmobility = 0; + gProtectStructs[gActiveBank].notFirstStrike = 0; + + gDisableStructs[gActiveBank].isFirstTurn= 2; + gLastUsedMove[gActiveBank] = 0; + gMoveHitWith[gActiveBank] = 0; + gUnknown_02024C44[gActiveBank] = 0; + gUnknown_02024C4C[gActiveBank] = 0; + gUnknown_02024C2C[gActiveBank] = 0; + gUnknown_02024C5C[gActiveBank] = 0xFF; + + ewram[0x160E8 + gActiveBank * 2 + 0] = 0; + ewram[0x160E8 + gActiveBank * 2 + 1] = 0; + ewram[0x160AC + gActiveBank * 2 + 0] = 0; + ewram[0x160AC + gActiveBank * 2 + 1] = 0; + ewram[0x16100 + gActiveBank * 4 + 0] = 0; + ewram[0x16100 + gActiveBank * 4 + 1] = 0; + ewram[0x16100 + gActiveBank * 4 + 2] = 0; + ewram[0x16100 + gActiveBank * 4 + 3] = 0; + + ptr2 = (u32 *)(ewram + 0x17100); + ptr2[gActiveBank] = 0; + + gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1; + gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2; +} + +void bc_8012FAC(void) +{ + switch (gBattleCommunication[0]) + { + case 0: + gActiveBank = gBattleCommunication[1]; + EmitGetAttributes(0, 0, 0); + MarkBufferBankForExecution(gActiveBank); + gBattleCommunication[0]++; + break; + case 1: + if (gBattleExecBuffer == 0) + { + gBattleCommunication[1]++; + if (gBattleCommunication[1] == gNoOfAllBanks) + gBattleMainFunc = BattlePrepIntroSlide; + else + gBattleCommunication[0] = 0; + } + break; + } +} + +static void BattlePrepIntroSlide(void) +{ + if (gBattleExecBuffer == 0) + { + gActiveBank = GetBankByPlayerAI(0); + EmitBattleIntroSlide(0, gBattleTerrain); + MarkBufferBankForExecution(gActiveBank); + gBattleMainFunc = sub_8011384; + gBattleCommunication[0] = 0; + gBattleCommunication[1] = 0; + } +} + +void sub_8011384(void) +{ + u8 *ptr; + s32 i; + + if (gBattleExecBuffer == 0) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) + && GetBankSide(gActiveBank) == 0) + { + ptr = (u8 *)&gBattleMons[gActiveBank]; + for (i = 0; i < (u32)0x58; i++) + ptr[i] = 0; + } + else + { + u8 r0; + + ptr = (u8 *)&gBattleMons[gActiveBank]; + for (i = 0; i < (u32)0x58; i++) + ptr[i] = gBattleBufferB[gActiveBank][4 + i]; + + gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1; + gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2; + gBattleMons[gActiveBank].ability = GetAbilityBySpecies(gBattleMons[gActiveBank].species, gBattleMons[gActiveBank].altAbility); + r0 = GetBankSide(gActiveBank); + ewram160BC[r0] = gBattleMons[gActiveBank].hp; + for (i = 0; i < 8; i++) + gBattleMons[gActiveBank].statStages[i] = 6; + gBattleMons[gActiveBank].status2 = 0; + } + + if (GetBankIdentity(gActiveBank) == 0) + { + dp01_build_cmdbuf_x07_7_7_7(0); + MarkBufferBankForExecution(gActiveBank); + } + + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + if (GetBankIdentity(gActiveBank) == 1) + { + dp01_build_cmdbuf_x07_7_7_7(0); + MarkBufferBankForExecution(gActiveBank); + } + if (GetBankSide(gActiveBank) == 1 + && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) + GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); + } + else + { + if (GetBankSide(gActiveBank) == 1 + && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) + { + GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); + dp01_build_cmdbuf_x04_4_4_4(0); + MarkBufferBankForExecution(gActiveBank); + } + } + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (GetBankIdentity(gActiveBank) == 2 + || GetBankIdentity(gActiveBank) == 3) + { + dp01_build_cmdbuf_x07_7_7_7(0); + MarkBufferBankForExecution(gActiveBank); + } + } + } + gBattleMainFunc = bc_801333C; + } +} + +void bc_801333C(void) +{ + s32 i; + + if (gBattleExecBuffer == 0) + { + struct + { + u16 hp; + u32 status; + } sp0[6]; + + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + for (i = 0; i < 6; i++) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == 0 + || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + { + sp0[i].hp = 0xFFFF; + sp0[i].status = 0; + } + else + { + sp0[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP); + sp0[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); + } + } + gActiveBank = GetBankByPlayerAI(1); + dp01_build_cmdbuf_x30_TODO(0, (u8 *)sp0, 0x80); + MarkBufferBankForExecution(gActiveBank); + + for (i = 0; i < 6; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0 + || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + { + sp0[i].hp = 0xFFFF; + sp0[i].status = 0; + } + else + { + sp0[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + sp0[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); + } + } + gActiveBank = GetBankByPlayerAI(0); + dp01_build_cmdbuf_x30_TODO(0, (u8 *)sp0, 0x80); + MarkBufferBankForExecution(gActiveBank); + + gBattleMainFunc = bc_battle_begin_message; + } + else + { + // The array gets set here, but nothing is ever done with it. + // Likely unfinished code. + + for (i = 0; i < 6; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0 + || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + { + sp0[i].hp = 0xFFFF; + sp0[i].status = 0; + } + else + { + sp0[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + sp0[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); + } + } + + gBattleMainFunc = bc_8013568; + } + } +} + +void bc_battle_begin_message(void) +{ + if (gBattleExecBuffer == 0) + { + gActiveBank = GetBankByPlayerAI(1); + PrepareStringBattle(0, gActiveBank); + gBattleMainFunc = sub_8011800; + } +} + +void bc_8013568(void) +{ + if (gBattleExecBuffer == 0) + { + gBattleMainFunc = sub_8011970; + PrepareStringBattle(0, 0); + } +} + +void sub_8011800(void) +{ + if (gBattleExecBuffer == 0) + { + PrepareStringBattle(1, GetBankByPlayerAI(1)); + gBattleMainFunc = sub_8011834; + } +} + +void sub_8011834(void) +{ + if (gBattleExecBuffer == 0) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (GetBankIdentity(gActiveBank) == 1) + { + dp01_build_cmdbuf_x2F_2F_2F_2F(0); + MarkBufferBankForExecution(gActiveBank); + } + if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) + && GetBankIdentity(gActiveBank) == 3) + { + dp01_build_cmdbuf_x2F_2F_2F_2F(0); + MarkBufferBankForExecution(gActiveBank); + } + } + gBattleMainFunc = bc_801362C; + } +} + +void bc_801362C(void) +{ + if (gBattleExecBuffer == 0) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (GetBankSide(gActiveBank) == 1 + && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) + GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); + } + gBattleMainFunc = sub_8011970; + } +} + +void unref_sub_8011950(void) +{ + if (gBattleExecBuffer == 0) + gBattleMainFunc = sub_8011970; +} + +void sub_8011970(void) +{ + if (gBattleExecBuffer == 0) + { + if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) + PrepareStringBattle(1, GetBankByPlayerAI(0)); + gBattleMainFunc = sub_80119B4; + } +} + +void sub_80119B4(void) +{ + if (gBattleExecBuffer == 0) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (GetBankIdentity(gActiveBank) == 0) + { + dp01_build_cmdbuf_x2F_2F_2F_2F(0); + MarkBufferBankForExecution(gActiveBank); + } + if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) + && GetBankIdentity(gActiveBank) == 2) + { + dp01_build_cmdbuf_x2F_2F_2F_2F(0); + MarkBufferBankForExecution(gActiveBank); + } + } + ewram16058 = 0; + ewram160F9 = 0; + ewram160E6 = 0; + gBattleMainFunc = BattleBeginFirstTurn; + } +} + +void unref_sub_8011A68(void) +{ + if (gBattleExecBuffer == 0) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (GetBankSide(gActiveBank) == 0) + { + EmitSwitchInAnim(0, gBattlePartyID[gActiveBank], 0); + MarkBufferBankForExecution(gActiveBank); + } + } + ewram16058 = 0; + ewram160F9 = 0; + ewram160E6 = 0; + gBattleMainFunc = BattleBeginFirstTurn; + } +} + +void BattleBeginFirstTurn(void) +{ + s32 i; + s32 j; + u8 r9 = 0; + + if (gBattleExecBuffer == 0) + { + if (ewram16058 == 0) + { + for (i = 0; i < gNoOfAllBanks; i++) + gTurnOrder[i] = i; + for (i = 0; i < gNoOfAllBanks - 1; i++) + { + for (j = i + 1; j < gNoOfAllBanks; j++) + { + if (b_first_side(gTurnOrder[i], gTurnOrder[j], 1) != 0) + sub_8012FBC(i, j); + } + } + } + if (ewram160E6 == 0 && AbilityBattleEffects(0, 0, 0, 0xFF, 0) != 0) + { + ewram160E6 = 1; + return; + } + while (ewram16058 < gNoOfAllBanks) + { + if (AbilityBattleEffects(0, gTurnOrder[ewram16058], 0, 0, 0) != 0) + r9++; + ewram16058++; + if (r9 != 0) + return; + } + if (AbilityBattleEffects(9, 0, 0, 0, 0) != 0) + return; + if (AbilityBattleEffects(11, 0, 0, 0, 0) != 0) + return; + while (ewram160F9 < gNoOfAllBanks) + { + if (ItemBattleEffects(0, gTurnOrder[ewram160F9], 0) != 0) + r9++; + ewram160F9++; + if (r9 != 0) + return; + } + // Absolutely pointless for-loop that somehow doesn't get optimized out + for (i = 0; i < gNoOfAllBanks; i++) + ; + for (i = 0; i < 4; i++) + { + ewram[0x16068 + i] = 6; + gActionForBanks[i] = 0xFF; + gChosenMovesByBanks[i] = 0; + } + TurnValuesCleanUp(0); + SpecialStatusesClear(); + ewram160A6 = gAbsentBankFlags; + gBattleMainFunc = sub_8012324; + sub_80156DC(); + for (i = 0; i < 8; i++) + gBattleCommunication[i] = 0; + for (i = 0; i < gNoOfAllBanks; i++) + gBattleMons[i].status2 &= ~8; + ewram16000 = 0; + ewram16001 = 0; + ewram16110 = 0; + ewram16111 = 0; + ewram1600C = 0; + ewram16059 = 0; + ewram1600E = 0; + gBattleMoveFlags = 0; + gRandomTurnNumber = Random(); + } +} + +void bc_8013B1C(void) +{ + s32 i; + + if (gBattleExecBuffer == 0) + { + gBattleMainFunc = BattleTurnPassed; + for (i = 0; i < 8; i++) + gBattleCommunication[i] = 0; + for (i = 0; i < gNoOfAllBanks; i++) + { + gBattleMons[i].status2 &= ~8; + if ((gBattleMons[i].status1 & 7) && (gBattleMons[i].status2 & 0x1000)) + CancelMultiTurnMoves(i); + } + ewram16000 = 0; + ewram16001 = 0; + ewram16110 = 0; + ewram16111 = 0; + ewram1600E = 0; + gBattleMoveFlags = 0; + } +} + +void BattleTurnPassed(void) +{ + s32 i; + + TurnValuesCleanUp(1); + if (gBattleOutcome == 0) + { + if (UpdateTurnCounters() != 0) + return; + if (TurnBasedEffects() != 0) + return; + } + if (sub_80173A4() != 0) + return; + ewram16059 = 0; + if (sub_80170DC() != 0) + return; + TurnValuesCleanUp(0); + gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; + gHitMarker &= ~0x80000; + gHitMarker &= ~0x400000; + gHitMarker &= ~0x100000; + ewram16002 = 0; + ewram160A1 = 0; + ewram1600C = 0; + gBattleMoveDamage = 0; + gBattleMoveFlags = 0; + for (i = 0; i < 5; i++) + gBattleCommunication[i] = 0; + if (gBattleOutcome != 0) + { + gFightStateTracker = 12; + gBattleMainFunc = sub_80138F0; + return; + } + if (gBattleResults.battleTurnCounter < 0xFF) + gBattleResults.battleTurnCounter++; + for (i = 0; i < gNoOfAllBanks; i++) + { + gActionForBanks[i] = 0xFF; + gChosenMovesByBanks[i] = 0; + } + for (i = 0; i < 4; i++) + ewram[0x16068 + i] = 6; + ewram160A6 = gAbsentBankFlags; + gBattleMainFunc = sub_8012324; + gRandomTurnNumber = Random(); +} + +u8 CanRunFromBattle(void) +{ + u8 r2; + u8 r6; + s32 i; + + if (gBattleMons[gActiveBank].item == ITEM_ENIGMA_BERRY) + r2 = gEnigmaBerries[gActiveBank].holdEffect; + else + r2 = ItemId_GetHoldEffect(gBattleMons[gActiveBank].item); + gStringBank = gActiveBank; + if (r2 == HOLD_EFFECT_CAN_ALWAYS_RUN) + return 0; + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + return 0; + if (gBattleMons[gActiveBank].ability == ABILITY_RUN_AWAY) + return 0; + r6 = GetBankSide(gActiveBank); + for (i = 0; i < gNoOfAllBanks; i++) + { + if (r6 != GetBankSide(i) + && gBattleMons[i].ability == ABILITY_SHADOW_TAG) + { + ewram16003 = i; + gLastUsedAbility = gBattleMons[i].ability; + gBattleCommunication[5] = 2; + return 2; + } + if (r6 != GetBankSide(i) + && gBattleMons[gActiveBank].ability != ABILITY_LEVITATE + && gBattleMons[gActiveBank].type1 != 2 + && gBattleMons[gActiveBank].type2 != 2 + && gBattleMons[i].ability == ABILITY_ARENA_TRAP) + { + ewram16003 = i; + gLastUsedAbility = gBattleMons[i].ability; + gBattleCommunication[5] = 2; + return 2; + } + } + i = AbilityBattleEffects(15, gActiveBank, ABILITY_MAGNET_PULL, 0, 0); + if (i != 0 && (gBattleMons[gActiveBank].type1 == 8 || gBattleMons[gActiveBank].type2 == 8)) + { + ewram16003 = i - 1; + gLastUsedAbility = gBattleMons[i - 1].ability; + gBattleCommunication[5] = 2; + return 2; + } + if ((gBattleMons[gActiveBank].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) || (gStatuses3[gActiveBank] & STATUS3_ROOTED)) + { + gBattleCommunication[5] = 0; + return 1; + } + if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) + { + gBattleCommunication[5] = 1; + return 1; + } + return 0; +} + +void sub_8012258(u8 a) +{ + s32 i; + u8 r4; + u8 r1; + + for (i = 0; i < 3; i++) + gUnknown_02038470[i] = ewram[0x1606C + i + a * 3]; + r4 = pokemon_order_func(gBattlePartyID[a]); + r1 = pokemon_order_func(ewram[0x16068 + a]); + sub_8094C98(r4, r1); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + for (i = 0; i < 3; i++) + { + ewram[0x1606C + i + a * 3] = gUnknown_02038470[i]; + ewram[0x1606C + i + (a ^ 2) * 3] = gUnknown_02038470[i]; + } + } + else + { + for (i = 0; i < 3; i++) + { + ewram[0x1606C + i + a * 3] = gUnknown_02038470[i]; + } + } +} + +/* +void sub_8012324(void) +{ + u8 r5; + + gBattleCommunication[4] = 0; + // inverted loop + //_0801234C + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + r5 = GetBankIdentity(gActiveBank); + switch (gBattleCommunication[gActiveBank]) + { + case 0: + ewram[0x016068 + gActiveBank] = 6; + if (!(gBattleTypeFlags & 0x40) + && (r5 & 2) + && !(ewram160A6 & gBitTable[GetBankByPlayerAI(r5 ^ 2)]) + && gBattleCommunication[GetBankByPlayerAI(r5)] != 4) + break; + //_080123F8 + if (ewram160A6 & gBitTable[gActiveBank]) + { + gActionForBanks[gActiveBank] = 13; + if (!(gBattleTypeFlags & 0x40)) + gBattleCommunication[gActiveBank] = 4; + //_08012454 + else + gBattleCommunication[gActiveBank] = 3; + break; + } + //_08012468 + if ((gBattleMons[gActiveBank].status2 & 0x1000) + || (gBattleMons[gActiveBank].status2 & 0x10000000)) + { + gActionForBanks[gActiveBank] = 0; + gBattleCommunication[gActiveBank] = 3; + } + else + { + dp01_build_cmdbuf_x12_a_bb(0, gActionForBanks[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8)); + MarkBufferBankForExecution(gActiveBank); + gBattleCommunication[gActiveBank]++; + } + break; + case 1: + } + } +} +*/ diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c new file mode 100644 index 000000000..d58ae4145 --- /dev/null +++ b/src/battle/battle_4.c @@ -0,0 +1,18196 @@ +#include "global.h" +#include "battle.h" +#include "battle_move_effects.h" +#include "moves.h" +#include "abilities.h" +#include "item.h" +#include "items.h" +#include "data2.h" +#include "hold_effects.h" +#include "rng.h" +#include "rom3.h" +#include "species.h" +#include "pokemon.h" +#include "text.h" +#include "palette.h" +#include "main.h" +#include "songs.h" +#include "sound.h" +#include "task.h" +#include "decompress.h" +#include "naming_screen.h" + +//extern needed variables +extern u8 gCritMultiplier; +extern s32 gBattleMoveDamage; +extern u32 gStatuses3[4]; +extern u16 gBattleTypeFlags; +extern const u32 gBitTable[]; +extern const struct BaseStats gBaseStats[]; +extern struct BattleEnigmaBerry gEnigmaBerries[4]; +extern struct BattlePokemon gBattleMons[4]; +extern u8 gActiveBank; +extern u32 gBattleExecBuffer; +extern u8 gNoOfAllBanks; +extern u16 gBattlePartyID[4]; +extern u8 gTurnOrder[4]; +extern u8 gUnknown_02024A76[4]; +extern u16 gCurrentMove; +extern u8 gLastUsedAbility; +extern u16 gBattleWeather; +extern u8 gStringBank; +extern u8 gEffectBank; +extern u8 gAbsentBankFlags; +extern u8 gMultiHitCounter; +extern u16 gLastUsedMove[4]; +extern u16 gLockedMove[4]; +extern u16 gChosenMovesByBanks[4]; +extern u16 gSideAffecting[2]; +extern u16 gPauseCounterBattle; +extern u16 gPaydayMoney; +extern u16 gRandomTurnNumber; +extern u8 gBattleOutcome; +extern u8 gBattleTerrain; +extern u16 gTrainerBattleOpponent; +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u8* gBattlescriptCurrInstr; +extern u8 gCurrMovePos; +extern u8 gFightStateTracker; +extern u32 gHitMarker; +extern u8 gBattleMoveFlags; +extern u8 gBattleCommunication[]; +extern u16 gMoveHitWith[4]; +extern u16 gUnknown_02024C44[4]; +extern u8 gStringBank; +extern u16 gDynamicBasePower; +extern const u8 gTypeEffectiveness[]; +extern u16 gLastUsedItem; +extern u16 gBattleMovePower; +extern s32 gHP_dealt; +extern s32 gTakenDmg[4]; +extern u8 gTakenDmgBanks[4]; +extern const u16 gMissStrings[]; +extern u8 gSentPokesToOpponent[2]; +extern u8 gBank1; +extern u16 gExpShareExp; +extern u8 gBattleTextBuff1[]; +extern u8 gBattleTextBuff2[]; +extern u8 gBattleTextBuff3[]; +extern u8 gLeveledUpInBattle; +extern void (*gBattleMainFunc)(void); +extern struct Window gUnknown_03004210; +extern const u8 gUnknown_08400D7A[]; +extern u8 gPlayerPartyCount; +extern u16 word_2024E82; //move to learn +extern const u8 gTrainerMoney[]; +extern u16 gRandomMove; +extern u8* gBattleScriptsEffectsTable[]; +extern u16 gUnknown_02024BE8; //last used move in battle +extern u8 gBankInMenu; +extern u8 gActionForBanks[4]; +extern u16 gUnknown_02024C2C[4]; //last used moves 2, used by sketch +extern u16 gUnknown_030041B0; +extern u16 gUnknown_02024C4C[4]; //last used moves by banks, another one +extern u8 gCurrentMoveTurn; + +//extern functions +bool8 CantUseMove(void); +void PressurePPLose(u8 bank_atk, u8 bank_def, u16 move); +void CancelMultiTurnMoves(u8 bank); +void b_movescr_stack_push(u8* BS_ptr); +void b_movescr_stack_push_cursor(void); +void RecordAbilityBattle(u8 bank, u8 ability); +void RecordItemBattle(u8 bank, u8 item); +int IsPokeDisobedient(void); +static bool8 IsTwoTurnsMove(u16 move); +static void DestinyBondFlagUpdate(void); +static void b_wonderguard_and_levitate(void); +u8 GetBankIdentity(u8 bank); +u8 GetBankSide(u8 bank); +u8 GetBattleBank(u8 bankValue); +s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 bank_atk, u8 bank_def); +static u8 AttacksThisTurn(u8 bank, u16 move); //Note: returns 1 if it's a charging turn, otherwise 2 +void UndoEffectsAfterFainting(void); +void BattleMusicStop(void); +void PlayBGM(u16 songID); +void MonGainEVs(struct Pokemon*, u16 defeatedSpecies); +extern u8 gBattleBufferB[4][0x200]; +void sub_80324F8(struct Pokemon*, u8 bank); +void AdjustFriendship(struct Pokemon*, u8 value); +bool8 IsTradedMon(struct Pokemon*); +void b_movescr_stack_pop_cursor(void); +void SwitchInClearStructs(void); +u8* ConvertIntToDecimalStringN(u8*, s32, u8, u8); +u8 GetNationalPokedexFlag(u16 nationalNum, u8 caseID); +u16 SpeciesToNationalPokedexNum(u16 species); +u8 sub_803FC34(u8 bank); +u16 sub_803FBFC(u8 a); +u8 GetBankByPlayerAI(u8 ID); +void sub_8012258(u8); +void sub_80157C4(u8 bank); //update sent pokes in battle +//sub_803B7C8 teach poke a move +u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move); +void IncrementGameStat(u8 index); +u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale); +u16 GetPokedexHeightWeight(u16 national_num, u8 heightweight); +u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5); +void DestroyMenuCursor(void); +void sub_802BC6C(void); +void sub_809D9F0(struct Pokemon *party, u8, u8, void *, u32); +u8 sub_809FA30(void); +bool32 IsHMMove2(u16 move); +void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0); +void nullsub_6(void); +void ReshowBattleScreenAfterMenu(void); +void sub_800F808(void); +void sub_80B79B8(u32* moneySaveblock, u32 to_give); +void sub_80156DC(void); //set sentpokes value +bool8 sub_8014AB8(u8 bank); //can run from battle +u8 CountAliveMons(u8 caseID); +void sub_803E1B0(struct Pokemon*, u16 item, u8 partyID, u8 r3, u8 sp); +u8 CanRunFromBattle(void); +u8 sub_801B5C0(u16 move, u8 targetbyte); //get target of move +void sub_80153D0(u8 atk); //pressure perish song pp decrement +u8 castform_switch(u8 bank); +void b_push_move_exec(u8* bs_ptr); +u8 sav1_map_get_light_level(void); +u8 CalculatePlayerPartyCount(void); +u16 Sqrt(u32 num); +u8 sub_809070C(u16 nationalNum, u32 TiD, u32 PiD); //task prepare poke dex display +void sub_814A880(u8 a1, u8 a2); +u8 sub_8015A98(u8 bank, u8 unusable_moves, u8 flags); //choose move limitations +void sub_801529C(u8 bank); +bool8 IsLinkDoubleBattle(void); +void sub_8094B6C(u8 bank, u8 partyID, u8 r2); + +//extern BattleScripts +extern u8 BattleScript_EndTurn[]; +extern u8 BattleScript_NoPPForMove[]; +extern u8 BattleScript_MagicCoatBounce[]; +extern u8 BattleScript_TookAttack[]; +extern u8 BattleScript_SnatchedMove[]; +extern u8 BattleScript_Pausex20[]; +extern u8 BattleScript_SubstituteFade[]; +extern u8 BattleScript_HangedOnMsg[]; +extern u8 BattleScript_OneHitKOMsg[]; +extern u8 BattleScript_EnduredMsg[]; +extern u8 BattleScript_PSNPrevention[]; +extern u8 BattleScript_BRNPrevention[]; +extern u8 BattleScript_PRLZPrevention[]; +extern u8 BattleScript_FlinchPrevention[]; +extern u8 BattleScript_StatUp[]; +extern u8 BattleScript_StatDown[]; +extern u8 BattleScript_NoItemSteal[]; +extern u8 BattleScript_ItemSteal[]; +extern u8 BattleScript_RapidSpinAway[]; +extern u8 BattleScript_TargetPRLZHeal[]; +extern u8 BattleScript_KnockedOff[]; +extern u8 BattleScript_LevelUp[]; +extern u8 BattleScript_WrapFree[]; +extern u8 BattleScript_LeechSeedFree[]; +extern u8 BattleScript_SpikesFree[]; +extern u8 BattleScript_ButItFailed[]; +extern u8 BattleScript_ObliviousPreventsAttraction[]; +extern u8 BattleScript_MistProtected[]; +extern u8 BattleScript_AbilityNoStatLoss[]; +extern u8 BattleScript_AbilityNoSpecificStatLoss[]; +extern u8 BattleScript_TrainerBallBlock[]; +extern u8 BattleScript_WallyBallThrow[]; +extern u8 BattleScript_SuccessBallThrow[]; +extern u8 BattleScript_ShakeBallThrow[]; + +extern u8 gUnknown_081D919F[]; //spikes1 +extern u8 gUnknown_081D9171[]; //spikes2 +extern u8 gUnknown_081D91CD[]; //spikes3 +extern u8 BattleScript_1D6F44[]; //present dmg +extern u8 BattleScript_1D83B5[]; //present full hp +extern u8 BattleScript_1D839B[]; //present hp heal +extern u8 BattleScript_1D6F74[]; +extern u8 gUnknown_081D977D[]; //castform change bs +extern u8 gUnknown_081D9834[]; +extern u8 gUnknown_081D90FC[]; //bs random switchout +extern u8 gUnknown_081D95DB[]; //bs payday money give + +//useful macros +//read via orr +#define BSScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) +#define BSScriptRead8(ptr) (((u8)((ptr)[0]))) +#define BSScriptReadPtr(ptr) ((void *)BSScriptRead32(ptr)) + +//read via add +#define BS2ScriptRead32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) +#define BS2ScriptRead16(ptr) ((ptr)[0] + ((ptr)[1] << 8)) +#define BS2ScriptReadPtr(ptr) ((void *)BS2ScriptRead32(ptr)) + + +#define MOVESTATUS_MISSED (1 << 0) +#define MOVESTATUS_SUPEREFFECTIVE (1 << 1) +#define MOVESTATUS_NOTVERYEFFECTIVE (1 << 2) +#define MOVESTATUS_NOTAFFECTED (1 << 3) +#define MOVESTATUS_ONEHITKO (1 << 4) +#define MOVESTATUS_FAILED (1 << 5) +#define MOVESTATUS_ENDURED (1 << 6) +#define MOVESTATUS_HUNGON (1 << 7) + +#define MOVESTATUS_NOEFFECT ((MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED | MOVESTATUS_FAILED)) + +#define TargetProtectAffected ((gProtectStructs[gBankTarget].protected && gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED)) + +#define ABILITYEFFECT_CONTACT 0x4 +#define ABILITYEFFECT_IMMUNITY 0x5 +#define ABILITYEFFECT_SYNCHRONIZE 0x7 +#define ABILITYEFFECT_ATK_SYNCHRONIZE 0x8 +#define ABILITYEFFECT_CHECK_OTHER_SIDE 0xC +#define ABILITYEFFECT_CHECK_BANK_SIDE 0xD +#define ABILITYEFFECT_COUNT_OTHER_SIZE 0x10 +#define ABILITYEFFECT_COUNT_BANK_SIDE 0x11 +#define ABILITYEFFECT_COUNT_ON_FIELD 0x12 +#define ABILITYEFFECT_CHECK_ON_FIELD 0x13 + +//array entries for battle communication +#define MOVE_EFFECT_BYTE 0x3 +#define MULTISTRING_CHOOSER 0x5 +#define MSG_DISPLAY 0x7 + +#define TARGET_SELECTED 0x0 +#define TARGET_DEPENDS 0x1 +#define TARGET_BOTH 0x8 +#define TARGET_FOES_AND_ALLY 0x20 +#define TARGET_OPPONENTS_FIELD 0x40 + +#define TYPE_FORESIGHT 0xFE +#define TYPE_ENDTABLE 0xFF + +#define CMP_EQUAL 0x0 +#define CMP_NOT_EQUAL 0x1 +#define CMP_GREATER_THAN 0x2 +#define CMP_LESS_THAN 0x3 +#define CMP_COMMON_BITS 0x4 +#define CMP_NO_COMMON_BITS 0x5 + +#define BATTLE_WON 0x1 +#define BATTLE_LOST 0x2 +#define BATTLE_DREW 0x3 +#define BATTLE_RAN 0x4 +#define BATTLE_PLAYER_TELEPORTED 0x5 +#define BATTLE_POKE_FLED 0x6 +#define BATTLE_CAUGHT 0x7 +#define BATTLE_OPPONENT_TELEPORTED 0xA + +#define uBYTE0_16(value)(( (u8) (((u16)(value) & (0x000000FF)) >> 0x00))) +#define uBYTE1_16(value)(( (u8) (((u16)(value) & (0x0000FF00)) >> 0x08))) + +#define uBYTE0_32(value)(( (u8) (((u32)(value) & (0x000000FF)) >> 0x00))) +#define uBYTE1_32(value)(( (u8) (((u32)(value) & (0x0000FF00)) >> 0x08))) +#define uBYTE2_32(value)(( (u8) (((u32)(value) & (0x00FF0000)) >> 0x10))) +#define uBYTE3_32(value)(( (u8) (((u32)(value) & (0xFF000000)) >> 0x18))) + +#define sBYTE0_16(value)(( (u8) (((s16)(value) & (0x000000FF)) >> 0x00))) +#define sBYTE1_16(value)(( (u8) (((s16)(value) & (0x0000FF00)) >> 0x08))) + +#define sBYTE0_32(value)(( (u8) (((s32)(value) & (0x000000FF)) >> 0x00))) +#define sBYTE1_32(value)(( (u8) (((s32)(value) & (0x0000FF00)) >> 0x08))) +#define sBYTE2_32(value)(( (u8) (((s32)(value) & (0x00FF0000)) >> 0x10))) +#define sBYTE3_32(value)(( (u8) (((s32)(value) & (0xFF000000)) >> 0x18))) + +#define USED_HELD_ITEM(bank)((((u16*)(&unk_2000000[bank * 2 + 0x160cc])))) + +#define RecordAbilitySetField6(ability, fieldValue) \ +(gLastUsedAbility = ability, gBattleCommunication[6] = fieldValue, RecordAbilityBattle(gBankTarget, ability)) + +#define WEATHER_HAS_EFFECT ((!AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_AIR_LOCK, 0, 0))) +#define TARGET_TURN_DAMAGED (((gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_physical.moveturnLostHP_special))) + +#define HP_ON_SWITCHOUT (((u16*)(0x020160bc))) + +static void atk00_attackcanceler(void); +static void atk01_accuracycheck(void); +static void atk02_attackstring(void); +static void atk03_ppreduce(void); +static void atk04_critcalc(void); +static void atk05_damagecalc1(void); +static void atk06_typecalc(void); +static void atk07_dmg_adjustment(void); +static void atk08_dmg_adjustment2(void); +static void atk09_attackanimation(void); +static void atk0A_waitanimation(void); +static void atk0B_healthbarupdate(void); +static void atk0C_datahpupdate(void); +static void atk0D_critmessage(void); +static void atk0E_effectiveness_sound(void); +static void atk0F_resultmessage(void); +static void atk10_printstring(void); +static void atk11_printstring_playeronly(void); +static void atk12_waitmessage(void); +static void atk13_printfromtable(void); +static void atk14_printfromtable_playeronly(void); +static void atk15_seteffectwithchancetarget(void); +static void atk16_seteffectprimary(void); +static void atk17_seteffectsecondary(void); +static void atk18_status_effect_clear(void); +static void atk19_faint_pokemon(void); +static void atk1A_faint_animation(void); +static void atk1B_faint_effects_clear(void); +static void atk1C_jumpifstatus(void); +static void atk1D_jumpifstatus2(void); +static void atk1E_jumpifability(void); +static void atk1F_jumpifsideaffecting(void); +static void atk20_jumpifstat(void); +static void atk21_jumpifstatus3(void); +static void atk22_jumpiftype(void); +static void atk23_getexp(void); +static void atk24(void); +static void atk25_move_values_cleanup(void); +static void atk26_set_multihit(void); +static void atk27_decrement_multihit(void); +static void atk28_goto(void); +static void atk29_jumpifbyte(void); +static void atk2A_jumpifhalfword(void); +static void atk2B_jumpifword(void); +static void atk2C_jumpifarrayequal(void); +static void atk2D_jumpifarraynotequal(void); +static void atk2E_setbyte(void); +static void atk2F_addbyte(void); +static void atk30_subbyte(void); +static void atk31_copyarray(void); +static void atk32_copyarray_withindex(void); +static void atk33_orbyte(void); +static void atk34_orhalfword(void); +static void atk35_orword(void); +static void atk36_bicbyte(void); +static void atk37_bichalfword(void); +static void atk38_bicword(void); +static void atk39_pause(void); +static void atk3A_waitstate(void); +static void atk3B_healthbar_update(void); +static void atk3C_return(void); +static void atk3D_end(void); +static void atk3E_end2(void); +static void atk3F_end3(void); +static void atk40_jump_if_move_affected_by_protect(void); +static void atk41_call(void); +static void atk42_jumpiftype2(void); +static void atk43_jumpifabilitypresent(void); +static void atk44(void); +static void atk45_playanimation(void); +static void atk46_playanimation2(void); +static void atk47_setgraphicalstatchangevalues(void); +static void atk48_playstatchangeanimation(void); +static void atk49_moveendturn(void); +static void atk4A_typecalc2(void); +static void atk4B_return_atk_to_ball(void); +static void atk4C_copy_poke_data(void); +static void atk4D_switch_data_update(void); +static void atk4E_switchin_anim(void); +static void atk4F_jump_if_cannot_switch(void); +static void atk50_openpartyscreen(void); +static void atk51_switch_handle_order(void); +static void atk52_switch_in_effects(void); +static void atk53_trainer_slide(void); +static void atk54_effectiveness_sound(void); +static void atk55_play_sound(void); +static void atk56_fainting_cry(void); +static void atk57(void); +static void atk58_return_to_ball(void); +void atk59_learnmove_inbattle(void); +static void atk5A(void); +static void atk5B_80256E0(void); +static void atk5C_hitanimation(void); +static void atk5D_getmoneyreward(void); +static void atk5E_8025A70(void); +static void atk5F_8025B24(void); +static void atk60_increment_gamestat(void); +static void atk61_8025BA4(void); +static void atk62_08025C6C(void); +static void atk63_jumptorandomattack(void); +static void atk64_statusanimation(void); +static void atk65_status2animation(void); +static void atk66_chosenstatusanimation(void); +static void atk67_8025ECC(void); +static void atk68_80246A0(void); +static void atk69_dmg_adjustment2(void); +void atk6A_removeitem(void); +static void atk6B_atknameinbuff1(void); +static void atk6C_lvlbox_display(void); +static void atk6D_set_sentpokes_values(void); +static void atk6E_set_atk_to_player0(void); +static void atk6F_set_visible(void); +static void atk70_record_ability(void); +static void atk71_buffer_move_to_learn(void); +static void atk72_jump_if_can_run_frombattle(void); +static void atk73_hp_thresholds(void); +static void atk74_hp_thresholds2(void); +static void atk75_8026A58(void); +static void atk76_various(void); +static void atk77_setprotect(void); +static void atk78_faintifabilitynotdamp(void); +static void atk79_setatkhptozero(void); +static void atk7A_jumpwhiletargetvalid(void); +static void atk7B_healhalfHP_if_possible(void); +static void atk7C_8025508(void); +static void atk7D_set_rain(void); +static void atk7E_setreflect(void); +static void atk7F_setseeded(void); +static void atk80_manipulatedamage(void); +static void atk81_setrest(void); +static void atk82_jumpifnotfirstturn(void); +static void atk83_nop(void); +static void atk84_jump_if_cant_sleep(void); +static void atk85_stockpile(void); +static void atk86_stockpiletobasedamage(void); +static void atk87_stockpiletohpheal(void); +static void atk88_negativedamage(void); +static void atk89_statbuffchange(void); +static void atk8A_normalisebuffs(void); +static void atk8B_setbide(void); +static void atk8C_confuseifrepeatingattackends(void); +static void atk8D_setmultihit_counter(void); +static void atk8E_prepare_multihit(void); +static void atk8F_forcerandomswitch(void); +static void atk90_conversion_type_change(void); +static void atk91_givepaydaymoney(void); +static void atk92_setlightscreen(void); +static void atk93_ko_move(void); +static void atk94_gethalfcurrentenemyhp(void); +static void atk95_setsandstorm(void); +static void atk96_weatherdamage(void); +static void atk97_try_infatuation(void); +static void atk98_status_icon_update(void); +static void atk99_setmist(void); +static void atk9A_set_focusenergy(void); +static void atk9B_transformdataexecution(void); +static void atk9C_set_substitute(void); +static void atk9D_copyattack(void); +static void atk9E_metronome(void); +static void atk9F_dmgtolevel(void); +static void atkA0_psywavedamageeffect(void); +static void atkA1_counterdamagecalculator(void); +static void atkA2_mirrorcoatdamagecalculator(void); +static void atkA3_disablelastusedattack(void); +static void atkA4_setencore(void); +static void atkA5_painsplitdmgcalc(void); +static void atkA6_settypetorandomresistance(void); +static void atkA7_setalwayshitflag(void); +static void atkA8_copymovepermanently(void); +static void atkA9_sleeptalk_choose_move(void); +static void atkAA_set_destinybond(void); +static void atkAB_DestinyBondFlagUpdate(void); +static void atkAC_remaininghptopower(void); +static void atkAD_spite_ppreduce(void); +static void atkAE_heal_party_status(void); +static void atkAF_cursetarget(void); +static void atkB0_set_spikes(void); +static void atkB1_set_foresight(void); +static void atkB2_setperishsong(void); +static void atkB3_rolloutdamagecalculation(void); +static void atkB4_jumpifconfusedandstatmaxed(void); +static void atkB5_furycuttercalc(void); +static void atkB6_happinesstodamagecalculation(void); +static void atkB7_presentdamagecalculation(void); +static void atkB8_set_safeguard(void); +static void atkB9_magnitudedamagecalculation(void); +static void atkBA_jumpifnopursuitswitchdmg(void); +static void atkBB_setsunny(void); +static void atkBC_maxattackhalvehp(void); +static void atkBD_copyfoestats(void); +static void atkBE_breakfree(void); +static void atkBF_set_defense_curl(void); +static void atkC0_recoverbasedonsunlight(void); +static void atkC1_hidden_power(void); +static void atkC2_selectnexttarget(void); +static void atkC3_setfutureattack(void); +static void atkC4_beat_up(void); +static void atkC5_hidepreattack(void); +static void atkC6_unhidepostattack(void); +static void atkC7_setminimize(void); +static void atkC8_sethail(void); +static void atkC9_jumpifattackandspecialattackcannotfall(void); +static void atkCA_setforcedtarget(void); +static void atkCB_setcharge(void); +static void atkCC_callterrainattack(void); +static void atkCD_cureifburnedparalysedorpoisoned(void); +static void atkCE_settorment(void); +static void atkCF_jumpifnodamage(void); +static void atkD0_settaunt(void); +static void atkD1_set_helpinghand(void); +static void atkD2_swap_items(void); +static void atkD3_copy_ability(void); +static void atkD4_wish_effect(void); +static void atkD5_setroots(void); +static void atkD6_doubledamagedealtifdamaged(void); +static void atkD7_setyawn(void); +static void atkD8_setdamagetohealthdifference(void); +static void atkD9_scaledamagebyhealthratio(void); +static void atkDA_abilityswap(void); +static void atkDB_imprisoneffect(void); +static void atkDC_setgrudge(void); +static void atkDD_weightdamagecalculation(void); +static void atkDE_asistattackselect(void); +static void atkDF_setmagiccoat(void); +static void atkE0_setstealstatchange(void); +static void atkE1_intimidate_string_loader(void); +static void atkE2_switchout_abilities(void); +static void atkE3_jumpiffainted(void); +static void atkE4_getsecretpowereffect(void); +static void atkE5_pickup(void); +static void atkE6_castform_change_animation(void); +static void atkE7_castform_data_change(void); +static void atkE8_settypebasedhalvers(void); +static void atkE9_setweatherballtype(void); +static void atkEA_recycleitem(void); +static void atkEB_settypetoterrain(void); +static void atkEC_pursuit_sth(void); +static void atkED_802B4B4(void); +static void atkEE_removelightscreenreflect(void); +void atkEF_pokeball_catch_calculation(void); +static void atkF0_copy_caught_poke(void); +static void atkF1_setpoke_as_caught(void); +static void atkF2_display_dex_info(void); +static void atkF3_nickname_caught_poke(void); +static void atkF4_802BEF0(void); +static void atkF5_removeattackerstatus1(void); +static void atkF6_802BF48(void); +static void atkF7_802BF54(void); + +typedef void (*BattleCmdFunc)(void); + +const BattleCmdFunc gBattleScriptingCommandsTable[] = +{ + atk00_attackcanceler, + atk01_accuracycheck, + atk02_attackstring, + atk03_ppreduce, + atk04_critcalc, + atk05_damagecalc1, + atk06_typecalc, + atk07_dmg_adjustment, + atk08_dmg_adjustment2, + atk09_attackanimation, + atk0A_waitanimation, + atk0B_healthbarupdate, + atk0C_datahpupdate, + atk0D_critmessage, + atk0E_effectiveness_sound, + atk0F_resultmessage, + atk10_printstring, + atk11_printstring_playeronly, + atk12_waitmessage, + atk13_printfromtable, + atk14_printfromtable_playeronly, + atk15_seteffectwithchancetarget, + atk16_seteffectprimary, + atk17_seteffectsecondary, + atk18_status_effect_clear, + atk19_faint_pokemon, + atk1A_faint_animation, + atk1B_faint_effects_clear, + atk1C_jumpifstatus, + atk1D_jumpifstatus2, + atk1E_jumpifability, + atk1F_jumpifsideaffecting, + atk20_jumpifstat, + atk21_jumpifstatus3, + atk22_jumpiftype, + atk23_getexp, + atk24, + atk25_move_values_cleanup, + atk26_set_multihit, + atk27_decrement_multihit, + atk28_goto, + atk29_jumpifbyte, + atk2A_jumpifhalfword, + atk2B_jumpifword, + atk2C_jumpifarrayequal, + atk2D_jumpifarraynotequal, + atk2E_setbyte, + atk2F_addbyte, + atk30_subbyte, + atk31_copyarray, + atk32_copyarray_withindex, + atk33_orbyte, + atk34_orhalfword, + atk35_orword, + atk36_bicbyte, + atk37_bichalfword, + atk38_bicword, + atk39_pause, + atk3A_waitstate, + atk3B_healthbar_update, + atk3C_return, + atk3D_end, + atk3E_end2, + atk3F_end3, + atk40_jump_if_move_affected_by_protect, + atk41_call, + atk42_jumpiftype2, + atk43_jumpifabilitypresent, + atk44, + atk45_playanimation, + atk46_playanimation2, + atk47_setgraphicalstatchangevalues, + atk48_playstatchangeanimation, + atk49_moveendturn, + atk4A_typecalc2, + atk4B_return_atk_to_ball, + atk4C_copy_poke_data, + atk4D_switch_data_update, + atk4E_switchin_anim, + atk4F_jump_if_cannot_switch, + atk50_openpartyscreen, + atk51_switch_handle_order, + atk52_switch_in_effects, + atk53_trainer_slide, + atk54_effectiveness_sound, + atk55_play_sound, + atk56_fainting_cry, + atk57, + atk58_return_to_ball, + atk59_learnmove_inbattle, + atk5A, + atk5B_80256E0, + atk5C_hitanimation, + atk5D_getmoneyreward, + atk5E_8025A70, + atk5F_8025B24, + atk60_increment_gamestat, + atk61_8025BA4, + atk62_08025C6C, + atk63_jumptorandomattack, + atk64_statusanimation, + atk65_status2animation, + atk66_chosenstatusanimation, + atk67_8025ECC, + atk68_80246A0, + atk69_dmg_adjustment2, + atk6A_removeitem, + atk6B_atknameinbuff1, + atk6C_lvlbox_display, + atk6D_set_sentpokes_values, + atk6E_set_atk_to_player0, + atk6F_set_visible, + atk70_record_ability, + atk71_buffer_move_to_learn, + atk72_jump_if_can_run_frombattle, + atk73_hp_thresholds, + atk74_hp_thresholds2, + atk75_8026A58, + atk76_various, + atk77_setprotect, + atk78_faintifabilitynotdamp, + atk79_setatkhptozero, + atk7A_jumpwhiletargetvalid, + atk7B_healhalfHP_if_possible, + atk7C_8025508, + atk7D_set_rain, + atk7E_setreflect, + atk7F_setseeded, + atk80_manipulatedamage, + atk81_setrest, + atk82_jumpifnotfirstturn, + atk83_nop, + atk84_jump_if_cant_sleep, + atk85_stockpile, + atk86_stockpiletobasedamage, + atk87_stockpiletohpheal, + atk88_negativedamage, + atk89_statbuffchange, + atk8A_normalisebuffs, + atk8B_setbide, + atk8C_confuseifrepeatingattackends, + atk8D_setmultihit_counter, + atk8E_prepare_multihit, + atk8F_forcerandomswitch, + atk90_conversion_type_change, + atk91_givepaydaymoney, + atk92_setlightscreen, + atk93_ko_move, + atk94_gethalfcurrentenemyhp, + atk95_setsandstorm, + atk96_weatherdamage, + atk97_try_infatuation, + atk98_status_icon_update, + atk99_setmist, + atk9A_set_focusenergy, + atk9B_transformdataexecution, + atk9C_set_substitute, + atk9D_copyattack, + atk9E_metronome, + atk9F_dmgtolevel, + atkA0_psywavedamageeffect, + atkA1_counterdamagecalculator, + atkA2_mirrorcoatdamagecalculator, + atkA3_disablelastusedattack, + atkA4_setencore, + atkA5_painsplitdmgcalc, + atkA6_settypetorandomresistance, + atkA7_setalwayshitflag, + atkA8_copymovepermanently, + atkA9_sleeptalk_choose_move, + atkAA_set_destinybond, + atkAB_DestinyBondFlagUpdate, + atkAC_remaininghptopower, + atkAD_spite_ppreduce, + atkAE_heal_party_status, + atkAF_cursetarget, + atkB0_set_spikes, + atkB1_set_foresight, + atkB2_setperishsong, + atkB3_rolloutdamagecalculation, + atkB4_jumpifconfusedandstatmaxed, + atkB5_furycuttercalc, + atkB6_happinesstodamagecalculation, + atkB7_presentdamagecalculation, + atkB8_set_safeguard, + atkB9_magnitudedamagecalculation, + atkBA_jumpifnopursuitswitchdmg, + atkBB_setsunny, + atkBC_maxattackhalvehp, + atkBD_copyfoestats, + atkBE_breakfree, + atkBF_set_defense_curl, + atkC0_recoverbasedonsunlight, + atkC1_hidden_power, + atkC2_selectnexttarget, + atkC3_setfutureattack, + atkC4_beat_up, + atkC5_hidepreattack, + atkC6_unhidepostattack, + atkC7_setminimize, + atkC8_sethail, + atkC9_jumpifattackandspecialattackcannotfall, + atkCA_setforcedtarget, + atkCB_setcharge, + atkCC_callterrainattack, + atkCD_cureifburnedparalysedorpoisoned, + atkCE_settorment, + atkCF_jumpifnodamage, + atkD0_settaunt, + atkD1_set_helpinghand, + atkD2_swap_items, + atkD3_copy_ability, + atkD4_wish_effect, + atkD5_setroots, + atkD6_doubledamagedealtifdamaged, + atkD7_setyawn, + atkD8_setdamagetohealthdifference, + atkD9_scaledamagebyhealthratio, + atkDA_abilityswap, + atkDB_imprisoneffect, + atkDC_setgrudge, + atkDD_weightdamagecalculation, + atkDE_asistattackselect, + atkDF_setmagiccoat, + atkE0_setstealstatchange, + atkE1_intimidate_string_loader, + atkE2_switchout_abilities, + atkE3_jumpiffainted, + atkE4_getsecretpowereffect, + atkE5_pickup, + atkE6_castform_change_animation, + atkE7_castform_data_change, + atkE8_settypebasedhalvers, + atkE9_setweatherballtype, + atkEA_recycleitem, + atkEB_settypetoterrain, + atkEC_pursuit_sth, + atkED_802B4B4, + atkEE_removelightscreenreflect, + atkEF_pokeball_catch_calculation, + atkF0_copy_caught_poke, + atkF1_setpoke_as_caught, + atkF2_display_dex_info, + atkF3_nickname_caught_poke, + atkF4_802BEF0, + atkF5_removeattackerstatus1, + atkF6_802BF48, + atkF7_802BF54, +}; + +struct statFractions +{ + u8 dividend; + u8 divisor; +}; + +static const struct statFractions gAccuracyStageRatios[] = +{ + { 33, 100}, // -6 + { 36, 100}, // -5 + { 43, 100}, // -4 + { 50, 100}, // -3 + { 60, 100}, // -2 + { 75, 100}, // -1 + { 1, 1}, // 0 + {133, 100}, // +1 + {166, 100}, // +2 + { 2, 1}, // +3 + {233, 100}, // +4 + {133, 50}, // +5 + { 3, 1}, // +6 +}; + +//The chance is 1/N for each stage. +static const u16 gCriticalHitChance[] = {16, 8, 4, 3, 2}; + +static const u32 gStatusFlagsForMoveEffects[] = +{ + 0x00000000, + 0x00000007, + 0x00000008, + 0x00000010, + 0x00000020, + 0x00000040, + 0x00000080, + 0x00000007, + 0x00000008, + 0x00000000, + 0x00000070, + 0x00000000, + 0x00001000, + 0x0000E000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00400000, + 0x00000000, + 0x00000000, + 0x04000000, + 0x08000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000C00, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000 +}; + +extern const u8 BattleScript_1D963E[]; +extern const u8 BattleScript_1D965A[]; +extern const u8 BattleScript_1D9669[]; +extern const u8 BattleScript_1D9678[]; +extern const u8 BattleScript_1D9687[]; +extern const u8 BattleScript_1D969D[]; +extern const u8 BattleScript_1D96BA[]; +extern const u8 BattleScript_1D9696[]; +extern const u8 BattleScript_1D96B1[]; +extern const u8 BattleScript_1D96AA[]; +extern const u8 BattleScript_1D96C8[]; + +const u8* const gMoveEffectBS_Ptrs[] = +{ + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D965A, + BattleScript_1D9669, + BattleScript_1D9678, + BattleScript_1D9687, + BattleScript_1D969D, + BattleScript_1D96BA, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D9696, + BattleScript_1D96AA, + BattleScript_1D963E, + BattleScript_1D96B1, + BattleScript_1D96C8, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D963E, + BattleScript_1D96C8 +}; + +const u8 sUnreferencedBitMask1[] = {0, 1, 3, 7, 0xF, 0x1F, 0x3F}; + +const u8 gLevelUpStatBoxStats[] = {MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK, MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPD}; + +static const u16 sProtectSuccessRates[] = {0xFFFF, 0x7FFF, 0x3FFF, 0x1FFF}; + +static const u16 sUnknown_081FACFE[] = //banned moves to copy +{ + MOVE_METRONOME, + MOVE_STRUGGLE, + MOVE_SKETCH, + MOVE_MIMIC, + 0xFFFE, + MOVE_COUNTER, + MOVE_MIRROR_COAT, + MOVE_PROTECT, + MOVE_DETECT, + MOVE_ENDURE, + MOVE_DESTINY_BOND, + MOVE_SLEEP_TALK, + MOVE_THIEF, + MOVE_FOLLOW_ME, + MOVE_SNATCH, + MOVE_HELPING_HAND, + MOVE_COVET, + MOVE_TRICK, + MOVE_FOCUS_PUNCH, + 0xFFFF +}; + +static const u8 sUnknown_081FAD26[] = +{ + 1, 200, + 4, 150, + 9, 100, + 16, 80, + 32, 40, + 48, 20 +}; + +static const u16 sNaturePowerMoves[] = +{ + MOVE_STUN_SPORE, + MOVE_RAZOR_LEAF, + MOVE_EARTHQUAKE, + MOVE_HYDRO_PUMP, + MOVE_SURF, + MOVE_BUBBLE_BEAM, + MOVE_ROCK_SLIDE, + MOVE_SHADOW_BALL, + MOVE_SWIFT, + MOVE_SWIFT +}; + +//weight-based damage table for Low Kick +//format: min. weight (hectograms), base power +static const u16 sWeightDamage[] = +{ + 100, 20, + 250, 40, + 500, 60, + 1000, 80, + 2000, 100, + -1, -1 +}; + +static const u16 sPickupItems[] = +{ + ITEM_SUPER_POTION, 30, + ITEM_FULL_HEAL, 40, + ITEM_ULTRA_BALL, 50, + ITEM_RARE_CANDY, 60, + ITEM_FULL_RESTORE, 70, + ITEM_REVIVE, 80, + ITEM_NUGGET, 90, + ITEM_PROTEIN, 95, + ITEM_PP_UP, 99, + ITEM_KINGS_ROCK, 1 +}; + +static const u8 sTerrainToType[] = +{ + TYPE_GRASS, // tall grass + TYPE_GRASS, // long grass + TYPE_GROUND, // sand + TYPE_WATER, // underwater + TYPE_WATER, // water + TYPE_WATER, // pond water + TYPE_ROCK , // rock + TYPE_ROCK , // cave + TYPE_NORMAL, // building + TYPE_NORMAL, // plain +}; + +static const u8 sBallCatchBonuses[] = +{ + 20, 15, 10, 15 //Ultra, Great, Poke, Safari +}; + +static void atk00_attackcanceler(void) +{ + int i; + if (gBattleOutcome) + { + gFightStateTracker = 0xC; + return; + } + if (gBattleMons[gBankAttacker].hp == 0 && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) + { + gHitMarker |= HITMARKER_x80000; + gBattlescriptCurrInstr = BattleScript_EndTurn; + return; + } + if (CantUseMove()) + return; + if (AbilityBattleEffects(2, gBankTarget, 0, 0, 0)) + return; + if (!gBattleMons[gBankAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & 0x800200) + && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) + { + gBattlescriptCurrInstr = BattleScript_NoPPForMove; + gBattleMoveFlags |= MOVESTATUS_MISSED; + return; + } + gHitMarker &= ~(HITMARKER_x800000); + if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) + { + u8 disobedient = IsPokeDisobedient(); + asm("":::"r0"); //It's impossible to match + asm("":::"r1"); + if ((disobedient)) + { + if (disobedient == 2) + gHitMarker |= HITMARKER_OBEYS; + else + gBattleMoveFlags |= MOVESTATUS_MISSED; + return; + } + } + gHitMarker |= HITMARKER_OBEYS; + if (gProtectStructs[gBankTarget].bounceMove && gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED) + { + PressurePPLose(gBankAttacker, gBankTarget, MOVE_MAGIC_COAT); + gProtectStructs[gBankTarget].bounceMove = 0; + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; + return; + } + for (i = 0; i < gNoOfAllBanks; i++) + { + if ((gProtectStructs[gTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED) + { + PressurePPLose(gBankAttacker, gTurnOrder[i], MOVE_SNATCH); + gProtectStructs[gTurnOrder[i]].stealMove = 0; + BATTLE_STRUCT->scriptingActive = gTurnOrder[i]; + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = BattleScript_SnatchedMove; + return; + } + } + if (gSpecialStatuses[gBankTarget].lightningRodRedirected) + { + gSpecialStatuses[gBankTarget].lightningRodRedirected = 0; + gLastUsedAbility = ABILITY_LIGHTNING_ROD; + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = BattleScript_TookAttack; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); + } + else if (TargetProtectAffected + && (gCurrentMove != MOVE_CURSE || (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST)) + && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)))) + { + CancelMultiTurnMoves(gBankAttacker); + gBattleMoveFlags |= MOVESTATUS_MISSED; + gMoveHitWith[gBankTarget] = 0; + gUnknown_02024C44[gBankTarget] = 0; + gBattleCommunication[6] = 1; + gBattlescriptCurrInstr++; + } + else + { + gBattlescriptCurrInstr++; + } +} + +static void JumpIfMoveFailed(u8 adder, u16 move) +{ + void* to_store = gBattlescriptCurrInstr + adder; + if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) + { + gMoveHitWith[gBankTarget] = 0; + gUnknown_02024C44[gBankTarget] = 0; + to_store = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } + else + { + DestinyBondFlagUpdate(); + if (AbilityBattleEffects(3, gBankTarget, 0, 0, move)) + return; + } + gBattlescriptCurrInstr = to_store; +} + +static void atk40_jump_if_move_affected_by_protect(void) +{ + if (TargetProtectAffected) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + JumpIfMoveFailed(5, 0); + gBattleCommunication[6] = 1; + } + else + { + gBattlescriptCurrInstr += 5; + } +} + +static bool8 JumpIfMoveAffectedByProtect(u16 move) +{ + bool8 affected = 0; + if (TargetProtectAffected) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + JumpIfMoveFailed(7, move); + gBattleCommunication[6] = 1; + affected = 1; + } + return affected; +} + +static bool8 AccuracyCalcHelper(u16 move) +{ + if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker) + { + JumpIfMoveFailed(7, move); + return TRUE; + } + + if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBankTarget] & STATUS3_ON_AIR) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + JumpIfMoveFailed(7, move); + return TRUE; + } + gHitMarker &= ~HITMARKER_IGNORE_ON_AIR; + + if (!(gHitMarker & HITMARKER_IGNORE_UNDERGROUND) && gStatuses3[gBankTarget] & STATUS3_UNDERGROUND) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + JumpIfMoveFailed(7, move); + return TRUE; + } + gHitMarker &= ~HITMARKER_IGNORE_UNDERGROUND; + + if (!(gHitMarker & HITMARKER_IGNORE_UNDERWATER) && gStatuses3[gBankTarget] & STATUS3_UNDERWATER) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + JumpIfMoveFailed(7, move); + return TRUE; + } + gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER; + + if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && gBattleMoves[move].effect == EFFECT_THUNDER) + || (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW)) + { + JumpIfMoveFailed(7, move); + return TRUE; + } + return FALSE; +} + +static void atk01_accuracycheck(void) +{ + u16 move = BS2ScriptRead16(gBattlescriptCurrInstr + 5); + if (move == 0xFFFE || move == 0xFFFF) + { + if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && move == 0xFFFF && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker) + gBattlescriptCurrInstr += 7; + else if (gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else if (!JumpIfMoveAffectedByProtect(0)) + gBattlescriptCurrInstr += 7; + } + else + { + u8 type; s8 buff; u8 MoveAcc; u16 calc; u8 hold_effect; u8 quality; + if (move == 0) {move = gCurrentMove;} + + if (BATTLE_STRUCT->dynamicMoveType) + type = BATTLE_STRUCT->dynamicMoveType & 0x3F; + else + type = gBattleMoves[move].type; + + if (JumpIfMoveAffectedByProtect(move)) + return; + if (AccuracyCalcHelper(move)) + return; + + if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) + { + u8 acc = gBattleMons[gBankAttacker].statStages[STAT_STAGE_ACC]; + buff = acc; + } + else + { + u8 acc = gBattleMons[gBankAttacker].statStages[STAT_STAGE_ACC]; + buff = acc + 6 - gBattleMons[gBankTarget].statStages[STAT_STAGE_EVASION]; + } + + if (buff < 0) {buff = 0;} + if (buff > 0xC) {buff = 0xC;} + + MoveAcc = gBattleMoves[move].accuracy; + //check Thunder on sunny weather + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && gBattleMoves[move].effect == EFFECT_THUNDER) + MoveAcc = 50; + + calc = gAccuracyStageRatios[buff].dividend * MoveAcc; + calc /= gAccuracyStageRatios[buff].divisor; + + if (gBattleMons[gBankAttacker].ability == ABILITY_COMPOUND_EYES) + calc = (calc * 130) / 100; //1.3 compound eyes boost + if (WEATHER_HAS_EFFECT && gBattleMons[gBankTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & WEATHER_SANDSTORM_ANY) + calc = (calc * 80) / 100; //1.2 sand veil loss; + if (gBattleMons[gBankAttacker].ability == ABILITY_HUSTLE && type < 9) + calc = (calc * 80) / 100; //1.2 hustle loss; + + if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) + hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; + else + { + hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); + quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); + } + + gStringBank = gBankTarget; + + if (hold_effect == HOLD_EFFECT_EVASION_UP) + calc = (calc * (100 - quality)) / 100; + + //final calculation + if ((Random() % 100 + 1) > calc) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && (gBattleMoves[move].target == 0x8 || gBattleMoves[move].target == 0x20)) + gBattleCommunication[6] = 2; + else + gBattleCommunication[6] = 0; + b_wonderguard_and_levitate(); + + } + JumpIfMoveFailed(7, move); + } +} + +static void atk02_attackstring(void) +{ + if (gBattleExecBuffer) + return; + if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED))) + { + PrepareStringBattle(4, gBankAttacker); + gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; + } + gBattlescriptCurrInstr++; + gBattleCommunication[MSG_DISPLAY] = 0; +} + +static void atk03_ppreduce(void) +{ + int to_deduct = 1; + if (gBattleExecBuffer) + return; + if (!gSpecialStatuses[gBankAttacker].flag20) + { + switch (gBattleMoves[gCurrentMove].target) + { + case TARGET_FOES_AND_ALLY: + to_deduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBankAttacker, ABILITY_PRESSURE, 0, 0); + break; + case TARGET_BOTH: + case TARGET_OPPONENTS_FIELD: + to_deduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIZE, gBankAttacker, ABILITY_PRESSURE, 0, 0); + break; + default: + if (gBankAttacker != gBankTarget && gBattleMons[gBankTarget].ability == ABILITY_PRESSURE) + to_deduct++; + break; + } + } + if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBankAttacker].pp[gCurrMovePos]) + { + gProtectStructs[gBankAttacker].notFirstStrike = 1; + if (gBattleMons[gBankAttacker].pp[gCurrMovePos] > to_deduct) + gBattleMons[gBankAttacker].pp[gCurrMovePos] -= to_deduct; + else + gBattleMons[gBankAttacker].pp[gCurrMovePos] = 0; + + if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED) + && !((gDisableStructs[gBankAttacker].unk18_b) & gBitTable[gCurrMovePos])) + { + gActiveBank = gBankAttacker; + EmitSetAttributes(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBankAttacker].pp[gCurrMovePos]); + MarkBufferBankForExecution(gBankAttacker); + } + } + gHitMarker &= ~(HITMARKER_NO_PPDEDUCT); + gBattlescriptCurrInstr++; +} + +static void atk04_critcalc(void) +{ + u8 hold_effect; u16 item; u16 crit_chance; int adderv3, adderv5, adderv6, adderv7, adderv8, adderv9, adderv10, adderv11; u16 adderv12; + item = gBattleMons[gBankAttacker].item; + if (item == ITEM_ENIGMA_BERRY) + hold_effect = gEnigmaBerries[gBankAttacker].holdEffect; + else + hold_effect = ItemId_GetHoldEffect(item); + + gStringBank = gBankAttacker; + + if (gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) + adderv3 = 2; + else + adderv3 = 0; + + if (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL) {adderv3++;} + adderv5 = adderv3; + if (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK) {adderv5 = adderv3 + 1;} + + if (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK) {adderv5++;} + adderv6 = adderv5; + if (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL) {adderv6 = adderv5 + 1;} + + adderv7 = 0; + if (hold_effect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBankAttacker].species == SPECIES_CHANSEY) {adderv7 = 1;} + adderv8 = 2 * adderv7; + adderv9 = 0; + if (hold_effect == HOLD_EFFECT_STICK && gBattleMons[gBankAttacker].species == SPECIES_FARFETCHD) {adderv9 = 1;} + adderv11 = 2 * adderv9; + if (hold_effect == HOLD_EFFECT_SCOPE_LENS) + {adderv10 = 1 + adderv6 + adderv8; adderv12 = adderv10 + adderv11;} + else + {adderv10 = adderv6 + adderv8; adderv12 = adderv10 + adderv11;} + + crit_chance = adderv12; + + if (crit_chance > 4) {crit_chance = 4;} + + if ((gBattleMons[gBankTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBankTarget].ability != ABILITY_SHELL_ARMOR) + && !(gStatuses3[gBankAttacker] & STATUS3_CANT_SCORE_A_CRIT) + && !(gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) + && !(Random() % gCriticalHitChance[crit_chance])) + gCritMultiplier = 2; + else + gCritMultiplier = 1; + gBattlescriptCurrInstr++; +} + +static void atk05_damagecalc1(void) +{ + u16 side_hword = gSideAffecting[GetBankIdentity(gBankTarget) & 1]; + gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, + side_hword, gDynamicBasePower, + BATTLE_STRUCT->dynamicMoveType, gBankAttacker, gBankTarget); + gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * BATTLE_STRUCT->dmgMultiplier; + + if (gStatuses3[gBankAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) + gBattleMoveDamage *= 2; + if (gProtectStructs[gBankAttacker].helpingHand) + gBattleMoveDamage = gBattleMoveDamage * 15 / 10; + + gBattlescriptCurrInstr++; +} + +void AI_CalcDmg(u8 BankAtk, u8 BankDef) +{ + u16 side_hword = gSideAffecting[GetBankIdentity(BankDef) & 1]; + gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[BankAtk], &gBattleMons[BankDef], gCurrentMove, + side_hword, gDynamicBasePower, + BATTLE_STRUCT->dynamicMoveType, BankAtk, BankDef); + gDynamicBasePower = 0; + gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * BATTLE_STRUCT->dmgMultiplier; + + if (gStatuses3[BankAtk] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) + gBattleMoveDamage *= 2; + if (gProtectStructs[BankAtk].helpingHand) + gBattleMoveDamage = gBattleMoveDamage * 15 / 10; +} + +static void ModulateDmgByType(u8 multiplier) +{ + gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; + if (gBattleMoveDamage == 0 && multiplier != 0) + gBattleMoveDamage = 1; + + switch (multiplier) + { + case 0: //no effect + gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED; + gBattleMoveFlags &= ~MOVESTATUS_NOTVERYEFFECTIVE; + gBattleMoveFlags &= ~MOVESTATUS_SUPEREFFECTIVE; + break; + case 5: //not very effecting + if (gBattleMoves[gCurrentMove].power && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) + { + if (gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) + gBattleMoveFlags &= ~MOVESTATUS_SUPEREFFECTIVE; + else + gBattleMoveFlags |= MOVESTATUS_NOTVERYEFFECTIVE; + } + break; + case 20: //super effective + if (gBattleMoves[gCurrentMove].power && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) + { + if (gBattleMoveFlags & MOVESTATUS_NOTVERYEFFECTIVE) + gBattleMoveFlags &= ~MOVESTATUS_NOTVERYEFFECTIVE; + else + gBattleMoveFlags |= MOVESTATUS_SUPEREFFECTIVE; + } + break; + } +} + +static void atk06_typecalc(void) +{ + int i = 0; + u8 move_type; + if (gCurrentMove == MOVE_STRUGGLE) {goto END;} + + if (BATTLE_STRUCT->dynamicMoveType) + move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; + else + move_type = gBattleMoves[gCurrentMove].type; + + //check stab + if (gBattleMons[gBankAttacker].type1 == move_type || gBattleMons[gBankAttacker].type2 == move_type) + { + gBattleMoveDamage = gBattleMoveDamage * 15; + gBattleMoveDamage = gBattleMoveDamage / 10; + } + + if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) + { + gLastUsedAbility = gBattleMons[gBankTarget].ability; + gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); + gMoveHitWith[gBankTarget] = 0; + gUnknown_02024C44[gBankTarget] = 0; + gBattleCommunication[6] = move_type; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); + } + else + { + while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) + { + if (gTypeEffectiveness[i] == TYPE_FORESIGHT) + { + if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) + break; + i += 3; + continue; + } + + else if (gTypeEffectiveness[i] == move_type) + { + //check type1 + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) + ModulateDmgByType(gTypeEffectiveness[i + 2]); + //check type2 + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && + gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2) + ModulateDmgByType(gTypeEffectiveness[i + 2]); + } + i += 3; + } + } + + if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 + && (!(gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) || ((gBattleMoveFlags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) + && gBattleMoves[gCurrentMove].power) + { + gLastUsedAbility = ABILITY_WONDER_GUARD; + gBattleMoveFlags |= MOVESTATUS_MISSED; + gMoveHitWith[gBankTarget] = 0; + gUnknown_02024C44[gBankTarget] = 0; + gBattleCommunication[6] = 3; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); + } + if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) + gProtectStructs[gBankAttacker].notEffective = 1; + + END: + gBattlescriptCurrInstr++; +} + +static void b_wonderguard_and_levitate(void) +{ + u8 flags = 0; + int i = 0; + u8 move_type; + + if (gCurrentMove == MOVE_STRUGGLE || !gBattleMoves[gCurrentMove].power) + return; + + if (BATTLE_STRUCT->dynamicMoveType) + move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; + else + move_type = gBattleMoves[gCurrentMove].type; + + if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) + { + RecordAbilitySetField6(ABILITY_LEVITATE, move_type); + return; + } + + while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) + { + if (gTypeEffectiveness[i] == TYPE_FORESIGHT) + { + if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) + break; + i += 3; + continue; + } + + if (gTypeEffectiveness[i] == move_type) + { + //check no effect + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 0) + { + gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED; + gProtectStructs[gBankAttacker].notEffective = 1; + } + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && + gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && + gTypeEffectiveness[i + 2] == 0) + { + gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED; + gProtectStructs[gBankAttacker].notEffective = 1; + } + + //check super effective + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 20) + flags |= 1; + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 + && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 + && gTypeEffectiveness[i + 2] == 20) + flags |= 1; + + //check not very effective + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 5) + flags |= 2; + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 + && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 + && gTypeEffectiveness[i + 2] == 5) + flags |= 2; + } + i += 3; + } + + if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2) + { + if (((flags & 2) || !(flags & 1)) && gBattleMoves[gCurrentMove].power) + { + RecordAbilitySetField6(ABILITY_WONDER_GUARD, 3); + } + } +} + +static void ModulateDmgByType2(u8 multiplier, u16 move, u8* flags) //a literal copy of the ModulateDmgbyType1 with different args... +{ + gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; + if (gBattleMoveDamage == 0 && multiplier != 0) + gBattleMoveDamage = 1; + + switch (multiplier) + { + case 0: //no effect + *flags |= MOVESTATUS_NOTAFFECTED; + *flags &= ~MOVESTATUS_NOTVERYEFFECTIVE; + *flags &= ~MOVESTATUS_SUPEREFFECTIVE; + break; + case 5: //not very effecting + if (gBattleMoves[move].power && !(*flags & MOVESTATUS_NOEFFECT)) + { + if (*flags & MOVESTATUS_SUPEREFFECTIVE) + *flags &= ~MOVESTATUS_SUPEREFFECTIVE; + else + *flags |= MOVESTATUS_NOTVERYEFFECTIVE; + } + break; + case 20: //super effective + if (gBattleMoves[move].power && !(*flags & MOVESTATUS_NOEFFECT)) + { + if (*flags & MOVESTATUS_NOTVERYEFFECTIVE) + *flags &= ~MOVESTATUS_NOTVERYEFFECTIVE; + else + *flags |= MOVESTATUS_SUPEREFFECTIVE; + } + break; + } +} + +#ifdef NONMATCHING +u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) +{ + int i = 0; + u8 flags = 0; + u8 move_type; + + if (move == MOVE_STRUGGLE) + return 0; + + move_type = gBattleMoves[move].type; + + //check stab + if (gBattleMons[bank_atk].type1 == move_type || gBattleMons[bank_atk].type2 == move_type) + { + gBattleMoveDamage = gBattleMoveDamage * 15; + gBattleMoveDamage = gBattleMoveDamage / 10; + } + + if (gBattleMons[bank_def].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) + { + flags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); + } + else + { + while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) + { + if (gTypeEffectiveness[i] == TYPE_FORESIGHT) + { + if (gBattleMons[bank_def].status2 & STATUS2_FORESIGHT) + break; + i += 3; + continue; + } + + else if (gTypeEffectiveness[i] == move_type) + { + //check type1 + if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type1) + ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); + //check type2 + if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type2 && + gBattleMons[bank_def].type1 != gBattleMons[bank_def].type2) + ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); + } + i += 3; + } + } + + if (gBattleMons[bank_def].ability == ABILITY_WONDER_GUARD && !(flags & MOVESTATUS_MISSED) && + AttacksThisTurn(bank_atk, move) == 2 && + (!(flags & MOVESTATUS_SUPEREFFECTIVE) || ((flags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) && + gBattleMoves[move].power) + { + flags |= MOVESTATUS_MISSED; + } + return flags; +} +#else +__attribute__((naked)) +u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r10, r0\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + str r1, [sp, 0x4]\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + mov r9, r2\n\ + movs r7, 0\n\ + mov r0, sp\n\ + strb r7, [r0]\n\ + mov r0, r10\n\ + cmp r0, 0xA5\n\ + bne _0801D2AE\n\ + movs r0, 0\n\ + b _0801D43A\n\ + _0801D2AE:\n\ + ldr r1, _0801D31C @ =gBattleMoves\n\ + mov r3, r10\n\ + lsls r2, r3, 1\n\ + adds r0, r2, r3\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r0, [r0, 0x2]\n\ + str r0, [sp, 0x8]\n\ + ldr r1, _0801D320 @ =gBattleMons\n\ + movs r0, 0x58\n\ + ldr r3, [sp, 0x4]\n\ + muls r0, r3\n\ + adds r3, r0, r1\n\ + adds r0, r3, 0\n\ + adds r0, 0x21\n\ + ldrb r0, [r0]\n\ + str r2, [sp, 0xC]\n\ + adds r5, r1, 0\n\ + ldr r1, [sp, 0x8]\n\ + cmp r0, r1\n\ + beq _0801D2E2\n\ + adds r0, r3, 0\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r0, r1\n\ + bne _0801D2F4\n\ + _0801D2E2:\n\ + ldr r4, _0801D324 @ =gBattleMoveDamage\n\ + ldr r1, [r4]\n\ + lsls r0, r1, 4\n\ + subs r0, r1\n\ + str r0, [r4]\n\ + movs r1, 0xA\n\ + bl __divsi3\n\ + str r0, [r4]\n\ + _0801D2F4:\n\ + movs r0, 0x58\n\ + mov r2, r9\n\ + muls r2, r0\n\ + adds r0, r2, 0\n\ + adds r0, r5\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1A\n\ + bne _0801D328\n\ + ldr r3, [sp, 0x8]\n\ + cmp r3, 0x4\n\ + bne _0801D328\n\ + movs r1, 0x9\n\ + mov r0, sp\n\ + ldrb r0, [r0]\n\ + orrs r0, r1\n\ + mov r1, sp\n\ + strb r0, [r1]\n\ + b _0801D3DC\n\ + .align 2, 0\n\ + _0801D31C: .4byte gBattleMoves\n\ + _0801D320: .4byte gBattleMons\n\ + _0801D324: .4byte gBattleMoveDamage\n\ + _0801D328:\n\ + ldr r1, _0801D344 @ =gTypeEffectiveness\n\ + adds r0, r7, r1\n\ + ldrb r0, [r0]\n\ + adds r2, r1, 0\n\ + cmp r0, 0xFF\n\ + beq _0801D3DC\n\ + cmp r0, 0xFE\n\ + bne _0801D34C\n\ + movs r0, 0x58\n\ + mov r1, r9\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + b _0801D3CA\n\ + .align 2, 0\n\ + _0801D344: .4byte gTypeEffectiveness\n\ + _0801D348:\n\ + adds r7, 0x3\n\ + b _0801D3B6\n\ + _0801D34C:\n\ + ldr r6, _0801D44C @ =gTypeEffectiveness\n\ + adds r0, r7, r6\n\ + ldrb r0, [r0]\n\ + ldr r2, [sp, 0x8]\n\ + cmp r0, r2\n\ + bne _0801D3B0\n\ + adds r1, r7, 0x1\n\ + adds r1, r6\n\ + ldr r3, _0801D450 @ =gBattleMons\n\ + mov r8, r3\n\ + movs r3, 0x58\n\ + mov r0, r9\n\ + muls r0, r3\n\ + mov r2, r8\n\ + adds r5, r0, r2\n\ + adds r0, r5, 0\n\ + adds r0, 0x21\n\ + ldrb r4, [r1]\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + bne _0801D388\n\ + adds r0, r7, 0x2\n\ + adds r0, r6\n\ + ldrb r0, [r0]\n\ + mov r1, r10\n\ + mov r2, sp\n\ + str r3, [sp, 0x10]\n\ + bl ModulateDmgByType2\n\ + ldr r3, [sp, 0x10]\n\ + _0801D388:\n\ + adds r0, r5, 0\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + bne _0801D3B0\n\ + ldr r0, _0801D454 @ =gBankTarget\n\ + ldrb r0, [r0]\n\ + muls r0, r3\n\ + add r0, r8\n\ + adds r0, 0x21\n\ + ldrb r0, [r0]\n\ + cmp r0, r4\n\ + beq _0801D3B0\n\ + adds r0, r7, 0x2\n\ + adds r0, r6\n\ + ldrb r0, [r0]\n\ + mov r1, r10\n\ + mov r2, sp\n\ + bl ModulateDmgByType2\n\ + _0801D3B0:\n\ + adds r7, 0x3\n\ + ldr r5, _0801D450 @ =gBattleMons\n\ + ldr r2, _0801D44C @ =gTypeEffectiveness\n\ + _0801D3B6:\n\ + adds r0, r7, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xFF\n\ + beq _0801D3DC\n\ + cmp r0, 0xFE\n\ + bne _0801D34C\n\ + movs r0, 0x58\n\ + mov r3, r9\n\ + muls r3, r0\n\ + adds r0, r3, 0\n\ + _0801D3CA:\n\ + adds r1, r5, 0\n\ + adds r1, 0x50\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + movs r1, 0x80\n\ + lsls r1, 22\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801D348\n\ + _0801D3DC:\n\ + movs r0, 0x58\n\ + mov r1, r9\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + adds r0, r5\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x19\n\ + bne _0801D436\n\ + mov r0, sp\n\ + ldrb r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0801D436\n\ + ldr r0, [sp, 0x4]\n\ + mov r1, r10\n\ + bl AttacksThisTurn\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0x2\n\ + bne _0801D436\n\ + mov r0, sp\n\ + ldrb r3, [r0]\n\ + adds r0, r1, 0\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _0801D41E\n\ + movs r0, 0x6\n\ + ands r0, r3\n\ + cmp r0, 0x6\n\ + bne _0801D436\n\ + _0801D41E:\n\ + ldr r0, _0801D458 @ =gBattleMoves\n\ + ldr r1, [sp, 0xC]\n\ + add r1, r10\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x1]\n\ + cmp r0, 0\n\ + beq _0801D436\n\ + mov r0, sp\n\ + movs r1, 0x1\n\ + orrs r1, r3\n\ + strb r1, [r0]\n\ + _0801D436:\n\ + mov r0, sp\n\ + ldrb r0, [r0]\n\ + _0801D43A:\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ + _0801D44C: .4byte gTypeEffectiveness\n\ + _0801D450: .4byte gBattleMons\n\ + _0801D454: .4byte gBankTarget\n\ + _0801D458: .4byte gBattleMoves\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +u8 AI_TypeCalc(u16 move, u16 species, u8 ability) +{ + int i = 0; + u8 flags = 0; + u8 type1 = gBaseStats[species].type1, type2 = gBaseStats[species].type2, move_type; + + if (move == MOVE_STRUGGLE) + return 0; + + move_type = gBattleMoves[move].type; + + if (ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) + flags = MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED; + else + { + while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) + { + if (gTypeEffectiveness[i] == TYPE_FORESIGHT) + { + i += 3; + continue; + } + if (gTypeEffectiveness[i] == move_type) + { + //check type1 + if (gTypeEffectiveness[i + 1] == type1) + ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); + //check type2 + if (gTypeEffectiveness[i + 1] == type2 && gBattleMons[gBankTarget].type1 != type2) //gf you morons, you should check if (type1 != type2)... + ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); + } + i += 3; + } + } + if (ability == ABILITY_WONDER_GUARD + && (!(flags & MOVESTATUS_SUPEREFFECTIVE) || ((flags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) + && gBattleMoves[move].power) + flags |= MOVESTATUS_NOTAFFECTED; + return flags; +} + +// Multiplies the damage by a random factor between 85% to 100% inclusive +static inline void ApplyRandomDmgMultiplier(void) +{ + u16 rand = Random(); + u16 randPercent = 100 - (rand % 16); + + if (gBattleMoveDamage != 0) + { + gBattleMoveDamage *= randPercent; + gBattleMoveDamage /= 100; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + } +} + +void Unused_ApplyRandomDmgMultiplier(void) +{ + ApplyRandomDmgMultiplier(); +} + +static void atk07_dmg_adjustment(void) +{ + u8 hold_effect, quality; + ApplyRandomDmgMultiplier(); + if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) + { + hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; + } + else + { + hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); + quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); + } + + gStringBank = gBankTarget; + + if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) + { + RecordItemBattle(gBankTarget, hold_effect); + gSpecialStatuses[gBankTarget].focusBanded = 1; + } + if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE) + goto END; + if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBankTarget].endured + && !gSpecialStatuses[gBankTarget].focusBanded) + goto END; + + if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) + goto END; + + gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1; + + if (gProtectStructs[gBankTarget].endured) + { + gBattleMoveFlags |= MOVESTATUS_ENDURED; + goto END; + } + if (gSpecialStatuses[gBankTarget].focusBanded) + { + gBattleMoveFlags |= MOVESTATUS_HUNGON; + gLastUsedItem = gBattleMons[gBankTarget].item; + } + + END: + gBattlescriptCurrInstr++; +} + +static void atk08_dmg_adjustment2(void) //literally the same as 0x7 except it doesn't check for false swipe move effect... +{ + u8 hold_effect, quality; + ApplyRandomDmgMultiplier(); + if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) + { + hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; + } + else + { + hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); + quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); + } + + gStringBank = gBankTarget; + + if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) + { + RecordItemBattle(gBankTarget, hold_effect); + gSpecialStatuses[gBankTarget].focusBanded = 1; + } + if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE) + goto END; + if (!gProtectStructs[gBankTarget].endured + && !gSpecialStatuses[gBankTarget].focusBanded) + goto END; + + if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) + goto END; + + gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1; + + if (gProtectStructs[gBankTarget].endured) + { + gBattleMoveFlags |= MOVESTATUS_ENDURED; + goto END; + } + if (gSpecialStatuses[gBankTarget].focusBanded) + { + gBattleMoveFlags |= MOVESTATUS_HUNGON; + gLastUsedItem = gBattleMons[gBankTarget].item; + } + + END: + gBattlescriptCurrInstr++; +} + +static void atk09_attackanimation(void) +{ + if (gBattleExecBuffer) + return; + + if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE)) + { + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_Pausex20; + BATTLE_STRUCT->animTurn += 1; + BATTLE_STRUCT->animTargetsHit += 1; + } + else + { + if ((gBattleMoves[gCurrentMove].target & TARGET_BOTH || gBattleMoves[gCurrentMove].target & TARGET_FOES_AND_ALLY || gBattleMoves[gCurrentMove].target & TARGET_DEPENDS) && BATTLE_STRUCT->animTargetsHit) + { + gBattlescriptCurrInstr++; + return; + } + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) + { + gActiveBank = gBankAttacker; + + EmitMoveAnimation(0, gCurrentMove, BATTLE_STRUCT->animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBankAttacker].friendship, &gDisableStructs[gBankAttacker]); + BATTLE_STRUCT->animTurn += 1; + BATTLE_STRUCT->animTargetsHit += 1; + MarkBufferBankForExecution(gBankAttacker); + gBattlescriptCurrInstr++; + } + else + { + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_Pausex20; + } + } +} + +static void atk0A_waitanimation(void) +{ + if (gBattleExecBuffer == 0) + gBattlescriptCurrInstr++; +} + +static void atk0B_healthbarupdate(void) +{ + if (gBattleExecBuffer) + return; + if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) + goto END; + + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + + if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBank].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) + { + PrepareStringBattle(0x80, gActiveBank); + goto END; + } + + EmitHealthBarUpdate(0, gBattleMoveDamage); + MarkBufferBankForExecution(gActiveBank); + + if (!GetBankSide(gActiveBank) && gBattleMoveDamage > 0) + gBattleResults.unk5_0 = 1; + + END: + gBattlescriptCurrInstr += 2; +} + +static void atk0C_datahpupdate(void) +{ + register u32 move_type asm("r6"); //no idea how to match it otherwise + u8 dynamic_move_type; + + if (gBattleExecBuffer) + return; + + dynamic_move_type = BATTLE_STRUCT->dynamicMoveType; + if (dynamic_move_type && !(dynamic_move_type & 0x40)) + { + move_type = 0x3F; + move_type &= dynamic_move_type; + } + else + { + move_type = gBattleMoves[gCurrentMove].type; + } + + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) + { + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBank].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) + { + if (gDisableStructs[gActiveBank].substituteHP >= gBattleMoveDamage) + { + if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0) + gSpecialStatuses[gActiveBank].moveturnLostHP = gBattleMoveDamage; + gDisableStructs[gActiveBank].substituteHP -= gBattleMoveDamage; + gHP_dealt = gBattleMoveDamage; + } + else + { + if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0) + gSpecialStatuses[gActiveBank].moveturnLostHP = gDisableStructs[gActiveBank].substituteHP; + gHP_dealt = gDisableStructs[gActiveBank].substituteHP; + gDisableStructs[gActiveBank].substituteHP = 0; + } + //check substitute fading + if (gDisableStructs[gActiveBank].substituteHP == 0) + { + gBattlescriptCurrInstr += 2; + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = BattleScript_SubstituteFade; + return; + } + } + else + { + gHitMarker &= ~(HITMARKER_IGNORE_SUBSTITUTE); + if (gBattleMoveDamage < 0) //hp goes up + { + gBattleMons[gActiveBank].hp -= gBattleMoveDamage; + if (gBattleMons[gActiveBank].hp > gBattleMons[gActiveBank].maxHP) + gBattleMons[gActiveBank].hp = gBattleMons[gActiveBank].maxHP; + + } + else //hp goes down + { + if (gHitMarker & HITMARKER_x20) + { + gHitMarker &= ~(HITMARKER_x20); + } + else + { + gTakenDmg[gActiveBank] += gBattleMoveDamage; + if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0) + gTakenDmgBanks[gActiveBank] = gBankAttacker; + else + gTakenDmgBanks[gActiveBank] = gBankTarget; + } + + if (gBattleMons[gActiveBank].hp > gBattleMoveDamage) + { + gBattleMons[gActiveBank].hp -= gBattleMoveDamage; + gHP_dealt = gBattleMoveDamage; + } + else + { + gHP_dealt = gBattleMons[gActiveBank].hp; + gBattleMons[gActiveBank].hp = 0; + } + + if (!gSpecialStatuses[gActiveBank].moveturnLostHP && !(gHitMarker & HITMARKER_x100000)) + gSpecialStatuses[gActiveBank].moveturnLostHP = gHP_dealt; + + if (move_type <= 8 && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT) + { + gProtectStructs[gActiveBank].physicalDmg = gHP_dealt; + gSpecialStatuses[gActiveBank].moveturnLostHP_physical = gHP_dealt; + if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0) + { + gProtectStructs[gActiveBank].physicalBank = gBankAttacker; + gSpecialStatuses[gActiveBank].moveturnPhysicalBank = gBankAttacker; + } + else + { + gProtectStructs[gActiveBank].physicalBank = gBankTarget; + gSpecialStatuses[gActiveBank].moveturnPhysicalBank = gBankTarget; + } + } + else if (move_type > 8 && !(gHitMarker & HITMARKER_x100000)) + { + gProtectStructs[gActiveBank].specialDmg = gHP_dealt; + gSpecialStatuses[gActiveBank].moveturnLostHP_special = gHP_dealt; + if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0) + { + gProtectStructs[gActiveBank].specialBank = gBankAttacker; + gSpecialStatuses[gActiveBank].moveturnSpecialBank = gBankAttacker; + } + else + { + gProtectStructs[gActiveBank].specialBank = gBankTarget; + gSpecialStatuses[gActiveBank].moveturnSpecialBank = gBankTarget; + } + } + } + gHitMarker &= ~(HITMARKER_x100000); + EmitSetAttributes(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp); + MarkBufferBankForExecution(gActiveBank); + } + } + else + { + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0) + gSpecialStatuses[gActiveBank].moveturnLostHP = 0xFFFF; + } + gBattlescriptCurrInstr += 2; +} + +static void atk0D_critmessage(void) +{ + if (gBattleExecBuffer == 0) + { + if (gCritMultiplier == 2 && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) + { + PrepareStringBattle(0xD9, gBankAttacker); + gBattleCommunication[MSG_DISPLAY] = 1; + } + gBattlescriptCurrInstr++; + } +} + +static void atk0E_effectiveness_sound(void) +{ + if (gBattleExecBuffer) + return; + gActiveBank = gBankTarget; + if (!(gBattleMoveFlags & MOVESTATUS_MISSED)) + { + u8 flag = ~MOVESTATUS_MISSED; + switch (gBattleMoveFlags & flag) + { + case MOVESTATUS_SUPEREFFECTIVE: + EmitEffectivenessSound(0, 14); + MarkBufferBankForExecution(gActiveBank); + break; + case MOVESTATUS_NOTVERYEFFECTIVE: + EmitEffectivenessSound(0, 12); + MarkBufferBankForExecution(gActiveBank); + break; + case MOVESTATUS_NOTAFFECTED: + case MOVESTATUS_FAILED: + break; + case MOVESTATUS_ENDURED: + case MOVESTATUS_ONEHITKO: + case MOVESTATUS_HUNGON: + default: + if (gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) + { + EmitEffectivenessSound(0, 14); + MarkBufferBankForExecution(gActiveBank); + } + else if (gBattleMoveFlags & MOVESTATUS_NOTVERYEFFECTIVE) + { + EmitEffectivenessSound(0, 12); + MarkBufferBankForExecution(gActiveBank); + } + else if (!(gBattleMoveFlags & (MOVESTATUS_NOTAFFECTED | MOVESTATUS_FAILED))) + { + EmitEffectivenessSound(0, 13); + MarkBufferBankForExecution(gActiveBank); + } + break; + } + } + gBattlescriptCurrInstr++; +} + +static void atk0F_resultmessage(void) +{ + u16 stringID = 0; + + if (gBattleExecBuffer) + return; + + if (gBattleMoveFlags & MOVESTATUS_MISSED && (!(gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) || gBattleCommunication[6] > 2)) + { + stringID = gMissStrings[gBattleCommunication[6]]; + gBattleCommunication[MSG_DISPLAY] = 1; + } + else + { + gBattleCommunication[MSG_DISPLAY] = 1; + switch (gBattleMoveFlags & 0xFE) + { + case MOVESTATUS_SUPEREFFECTIVE: + stringID = 0xDE; + break; + case MOVESTATUS_NOTVERYEFFECTIVE: + stringID = 0xDD; + break; + case MOVESTATUS_ONEHITKO: + stringID = 0xDA; + break; + case MOVESTATUS_ENDURED: + stringID = 0x99; + break; + case MOVESTATUS_FAILED: + goto FAILED; + case MOVESTATUS_NOTAFFECTED: + goto NOTAFFECTED; + case MOVESTATUS_HUNGON: + gLastUsedItem = gBattleMons[gBankTarget].item; + gStringBank = gBankTarget; + gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON); + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = BattleScript_HangedOnMsg; + return; + default: + if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) + NOTAFFECTED: + stringID = 0x1B; + else if (gBattleMoveFlags & MOVESTATUS_ONEHITKO) + { + gBattleMoveFlags &= ~(MOVESTATUS_ONEHITKO); + gBattleMoveFlags &= ~(MOVESTATUS_SUPEREFFECTIVE); + gBattleMoveFlags &= ~(MOVESTATUS_NOTVERYEFFECTIVE); + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; + return; + } + else if (gBattleMoveFlags & MOVESTATUS_ENDURED) + { + gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON); + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = BattleScript_EnduredMsg; + return; + } + else if (gBattleMoveFlags & MOVESTATUS_HUNGON) + { + gLastUsedItem = gBattleMons[gBankTarget].item; + gStringBank = gBankTarget; + gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON); + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = BattleScript_HangedOnMsg; + return; + } + else if (gBattleMoveFlags & MOVESTATUS_FAILED) + FAILED: + stringID = 0xE5; + else + gBattleCommunication[MSG_DISPLAY] = 0; + } + } + + if (stringID) + { + register u16 dummy asm("r0") = stringID; //Can't match it otherwise + PrepareStringBattle(dummy, gBankAttacker); + } + gBattlescriptCurrInstr++; +} + +static void atk10_printstring(void) +{ + if (gBattleExecBuffer == 0) + { + u16 var = BS2ScriptRead16(gBattlescriptCurrInstr + 1); + PrepareStringBattle(var, gBankAttacker); + gBattlescriptCurrInstr += 3; + gBattleCommunication[MSG_DISPLAY] = 1; + } +} + +static void atk11_printstring_playeronly(void) +{ + gActiveBank = gBankAttacker; + EmitPrintStringPlayerOnly(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 3; + gBattleCommunication[MSG_DISPLAY] = 1; +} + +static void atk12_waitmessage(void) +{ + if (gBattleExecBuffer == 0) + { + if (!gBattleCommunication[MSG_DISPLAY]) + { + gBattlescriptCurrInstr += 3; + } + else + { + u16 to_wait = BS2ScriptRead16(gBattlescriptCurrInstr + 1); + if (++gPauseCounterBattle >= to_wait) + { + gPauseCounterBattle = 0; + gBattlescriptCurrInstr += 3; + gBattleCommunication[MSG_DISPLAY] = 0; + } + } + } +} + +static void atk13_printfromtable(void) +{ + if (gBattleExecBuffer == 0) + { + u16 *ptr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + ptr += gBattleCommunication[MULTISTRING_CHOOSER]; + PrepareStringBattle(*(u16*)ptr, gBankAttacker); + gBattlescriptCurrInstr += 5; + gBattleCommunication[MSG_DISPLAY] = 1; + } +} + +static void atk14_printfromtable_playeronly(void) +{ + if (gBattleExecBuffer == 0) + { + u16 *ptr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + ptr += gBattleCommunication[MULTISTRING_CHOOSER]; + gActiveBank = gBankAttacker; + EmitPrintStringPlayerOnly(0, *(u16*)ptr); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 5; + gBattleCommunication[MSG_DISPLAY] = 1; + } +} + +u8 BankGetTurnOrder(u8 bank) +{ + int i; + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gTurnOrder[i] == bank) + break; + } + return i; +} + +//Someone please decompile this monstrosity below... +#ifdef NONMATCHING +void SetMoveEffect(bool8 primary, u8 certainArg) +{ + #define EffectAffectsUser 0x40 + register u8 certain asm("r5") = certainArg; + register bool32 StatusChanged asm("r10") = 0; + register int AffectsUser asm("r6") = 0; //0x40 otherwise + bool32 NoSunCanFreeze = 1; + + if (gBattleCommunication[MOVE_EFFECT_BYTE] & EffectAffectsUser) + { + gEffectBank = gBankAttacker; //bank that effects get applied on + gBattleCommunication[MOVE_EFFECT_BYTE] &= ~(EffectAffectsUser); + AffectsUser = EffectAffectsUser; + BATTLE_STRUCT->scriptingActive = gBankTarget; //theoretically the attacker + } + else + { + gEffectBank = gBankTarget; + BATTLE_STRUCT->scriptingActive = gBankAttacker; + } + + if (gBattleMons[gEffectBank].ability_id == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && + !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) + {gBattlescriptCurrInstr++; return;} + + if (gSideAffecting[get_bank_identity(gEffectBank) & 1] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && + !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7) + {gBattlescriptCurrInstr++; return;} + + //make sure at least ONE HP except payday and thief + if (gBattleMons[gEffectBank].current_hp == 0 && gBattleCommunication[MOVE_EFFECT_BYTE] != 0xB && gBattleCommunication[MOVE_EFFECT_BYTE] != 0x1F) + {gBattlescriptCurrInstr++; return;} + + if (gBattleMons[gEffectBank].status2 & STATUS2_SUBSTITUTE && AffectsUser != EffectAffectsUser) + {gBattlescriptCurrInstr++; return;} + + if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) //status change + { + switch (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) + { + case STATUS_SLEEP: + //check active uproar + if (gBattleMons[gEffectBank].ability_id != ABILITY_SOUNDPROOF) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks && !(gBattleMons[gActiveBank].status2 & STATUS2_UPROAR); gActiveBank++) {} + } + else + gActiveBank = gNoOfAllBanks; + if (gBattleMons[gEffectBank].status) {break;} + if (gActiveBank != gNoOfAllBanks) {break;} //nice way of checking uproar... + if (gBattleMons[gEffectBank].ability_id == ABILITY_VITAL_SPIRIT) {break;} + if (gBattleMons[gEffectBank].ability_id == ABILITY_INSOMNIA) {break;} + + b_cancel_multi_turn_move_maybe(gEffectBank); + StatusChanged = 1; + break; + case STATUS_POISON: + if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) + { + gLastUsedAbility = ABILITY_IMMUNITY; + RecordAbility(gEffectBank, ABILITY_IMMUNITY); + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + //_0801E664: + gBattlescriptCurrInstr = BS_PSN_PREVENTION; + if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + { + gBattleCommunication.multistring_chooser = 1; + gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); + return; + } + else + {gBattleCommunication.multistring_chooser = 0; return;} + } + if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) + && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) + { + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BS_PSN_PREVENTION; + gBattleCommunication.multistring_chooser = 2; + return; + } + if (gBattleMons[gEffectBank].type1 == TYPE_POISON) {break;} + if (gBattleMons[gEffectBank].type2 == TYPE_POISON) {break;} + if (gBattleMons[gEffectBank].type1 == TYPE_STEEL) {break;} + if (gBattleMons[gEffectBank].type2 == TYPE_STEEL) {break;} + if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY) {break;} + StatusChanged = 1; + break; + case STATUS_BURN: + if (gBattleMons[gEffectBank].ability_id == ABILITY_WATER_VEIL && (primary == 1 || certain == 0x80)) + { + gLastUsedAbility = ABILITY_WATER_VEIL; + RecordAbility(gEffectBank, ABILITY_WATER_VEIL); + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + //_0801E664: + gBattlescriptCurrInstr = BS_BRN_PREVENTION; + if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + { + gBattleCommunication.multistring_chooser = 1; + gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); + return; + } + else + {gBattleCommunication.multistring_chooser = 0; return;} + } + if ((gBattleMons[gEffectBank].type1 == TYPE_FIRE || gBattleMons[gEffectBank].type2 == TYPE_FIRE) + && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) + { + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BS_BRN_PREVENTION; + gBattleCommunication.multistring_chooser = 2; + return; + } + if (gBattleMons[gEffectBank].type1 == TYPE_FIRE) {break;} + if (gBattleMons[gEffectBank].type2 == TYPE_FIRE) {break;} + if (gBattleMons[gEffectBank].ability_id == ABILITY_WATER_VEIL) {break;} + if (gBattleMons[gEffectBank].status1 == 0) {break;} + StatusChanged = 1; + break; + case STATUS_FREEZE: + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) {NoSunCanFreeze = 0;} + if (gBattleMons[gEffectBank].type1 == TYPE_ICE) {break;} + if (gBattleMons[gEffectBank].type2 == TYPE_ICE) {break;} + if (gBattleMons[gEffectBank].status) {break;} + if (NoSunCanFreeze == 0) {break;} + if (gBattleMons[gEffectBank].ability_id == ABILITY_MAGMA_ARMOR) {break;} + + b_cancel_multi_turn_move_maybe(gEffectBank); + StatusChanged = 1; + break; + case STATUS_PARALYSIS: + if (gBattleMons[gEffectBank].ability_id == ABILITY_LIMBER) + { + if ((primary == 1 || certain == 0x80)) + { + gLastUsedAbility = ABILITY_LIMBER; + RecordAbility(gEffectBank, ABILITY_LIMBER); + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + //_0801E664: + gBattlescriptCurrInstr = BS_PRLZ_PREVENTION; + if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + { + gBattleCommunication.multistring_chooser = 1; + gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); + return; + } + else + {gBattleCommunication.multistring_chooser = 0; return;} + } + else {break;} + } + if (gBattleMons[gEffectBank].status) {break;} + StatusChanged = 1; + break; + case STATUS_TOXIC_POISON: + if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) + { + gLastUsedAbility = ABILITY_IMMUNITY; + RecordAbility(gEffectBank, ABILITY_IMMUNITY); + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + //_0801E664: + gBattlescriptCurrInstr = BS_PSN_PREVENTION; + if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + { + gBattleCommunication.multistring_chooser = 1; + gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); + return; + } + else + {gBattleCommunication.multistring_chooser = 0; return;} + } + if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) + && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) + { + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BS_PSN_PREVENTION; + gBattleCommunication.multistring_chooser = 2; + return; + } + if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].type1 != TYPE_POISON && + gBattleMons[gEffectBank].type2 != TYPE_POISON && + gBattleMons[gEffectBank].type1 != TYPE_STEEL && + gBattleMons[gEffectBank].type2 != TYPE_STEEL) + { + if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY) {break;} + gBattleMons[gEffectBank].status1 |= ~(STATUS_POISON); //TODO: fix OR to AND + StatusChanged = 1; + break; + } + else + gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED; + break; + } + if (StatusChanged == 1) + { + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + if (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS_SLEEP) + gBattleMons[gEffectBank].status1 |= ((Random() & 3) + 2); + else + gBattleMons[gEffectBank].status1 |= gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gActiveBank = gEffectBank; + bb2_setattributes_in_battle(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status); + mark_buffer_bank_for_execution(gActiveBank); + if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + { + gBattleCommunication.multistring_chooser = 1; + gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); + } + else + gBattleCommunication.multistring_chooser = 0; + if (gBattleCommunication[MOVE_EFFECT_BYTE] == 2 || gBattleCommunication[MOVE_EFFECT_BYTE] == 6 || gBattleCommunication[MOVE_EFFECT_BYTE] == 5 || gBattleCommunication[MOVE_EFFECT_BYTE] == 3) + { + BATTLE_STRUCT->SynchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; + gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; + } + return; + } + else if (StatusChanged == 0) + {gBattlescriptCurrInstr++; return;} + } + else + { + if (gBattleMons[gEffectBank].status2 & gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) + { + gBattlescriptCurrInstr++; + return; + } + switch (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) + { + case 7: //confusion + if (gBattleMons[gEffectBank].ability_id == ABILITY_OWN_TEMPO) + {gBattlescriptCurrInstr++; return;} + if (gBattleMons[gEffectBank].status2 & STATUS2_CONFUSION) + {gBattlescriptCurrInstr++; return;} + gBattleMons[gEffectBank].status2 |= (((Random()) % 0x4)) + 2; + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + break; + case 8: //flinch + if (gBattleMons[gEffectBank].ability_id == ABILITY_INNER_FOCUS) + { + if (primary == 1 || certain == 0x80) + { + gLastUsedAbility = ABILITY_INNER_FOCUS; + RecordAbility(gEffectBank, ABILITY_INNER_FOCUS); + gBattlescriptCurrInstr = BS_FLINCH_PREVENTION; + return; + } + else + {gBattlescriptCurrInstr++; return;} + } + else + { + if (BankGetTurnOrder(gEffectBank) > gCurrentMoveTurn) + gBattleMons[gEffectBank].status2 |= gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr++; return; + } + break; + case 10: //uproar + if (gBattleMons[gEffectBank].status2 & STATUS2_UPROAR) + {gBattlescriptCurrInstr++; return;} + gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; + gLockedMove[gEffectBank] = gCurrentMove; + gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4; + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + break; + case 11: //pay day + if (!(get_bank_identity(gEffectBank) & 1)) + { + u16 PayDay = gPaydayMoney; + gPaydayMoney += (gBattleMons[gEffectBank].level * 5); + if (PayDay > gPaydayMoney) + gPaydayMoney = 0xFFFF; + } + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + break; + case 9: //tri attack + if (gBattleMons[gEffectBank].status) + {gBattlescriptCurrInstr++; return;} + gBattleCommunication[MOVE_EFFECT_BYTE] = Random() % 3 + 3; + SetMoveEffect(0, 0); + break; + case 12: //charging move + gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; + gLockedMove[gEffectBank] = gCurrentMove; + gProtectStructs[gEffectBank].flag1_chargingturn = 1; + gBattlescriptCurrInstr++; + break; + case 13: //wrap + if (gBattleMons[gEffectBank].status2 & STATUS2_WRAPPED) + {gBattlescriptCurrInstr++; return;} + gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 0xD; + BATTLE_STRUCT->WrappedMove1[gEffectBank] = gCurrentMove; + BATTLE_STRUCT->WrappedMove2[gEffectBank] = gCurrentMove >> 8; + BATTLE_STRUCT->WrappedBy[gEffectBank] = gBankAttacker; + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattleCommunication.multistring_chooser = 0; + while (gBattleCommunication.multistring_chooser <= 4 + && gCurrentMove != gTrappingMoves[gBattleCommunication.multistring_chooser]) + gBattleCommunication.multistring_chooser++; + break; + case 14: //recoil + gBattleMoveDamage = (gHP_dealt) / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + break; + case 15 ... 21: //stat + 1 + if (ChangeStats(0x10, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xF2, certain, 0)) {gBattlescriptCurrInstr++;} + else + { + BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; //TODO: the arg ptr is wrong by one + BATTLE_STRUCT->animArg2 = 0; + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BS_STAT_UP; + } + break; + case 22 ... 28: //stat - 1 + if (ChangeStats(~(0x6f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xEB, certain, 0)) {gBattlescriptCurrInstr++;} //TODO: negation doesnt work correctly + else + { + BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; + BATTLE_STRUCT->animArg2 = 0; + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BS_STAT_DOWN; + } + break; + case 39 ... 45: //stat + 2 + if (ChangeStats(0x20, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xDA, certain, 0)) {gBattlescriptCurrInstr++;} + else + { + BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; + BATTLE_STRUCT->animArg2 = 0; + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BS_STAT_UP; + } + break; + case 46 ... 52: //stat - 2 + if (ChangeStats(~(0x5f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xD3, certain, 0)) {gBattlescriptCurrInstr++;} + else + { + BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; + BATTLE_STRUCT->animArg2 = 0; + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BS_STAT_DOWN; + } + break; + case 29: //recharge + gBattleMons[gEffectBank].status2 |= STATUS2_RECHARGE; + gDisableStructs[gEffectBank].recharge_counter = 2; + gLockedMove[gEffectBank] = gCurrentMove; + gBattlescriptCurrInstr++; + break; + case 30: //rage + gBattleMons[gBankAttacker].status2 |= STATUS2_RAGE; + gBattlescriptCurrInstr++; + break; + case 31: //item steal + { + u8 side = battle_side_get_owner(gBankAttacker); + if (battle_side_get_owner(gBankAttacker) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400) + {gBattlescriptCurrInstr++; return;} + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400 && (gWishFutureKnock.KnockedOff[side] & gBitTable[gBattlePartyID[gBankAttacker]])) + {gBattlescriptCurrInstr++; return;} + if (gBattleMons[gBankTarget].held_item && gBattleMons[gBankTarget].ability_id == ABILITY_STICKY_HOLD) + { + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = BS_NO_ITEMSTEAL; + gLastUsedAbility = gBattleMons[gBankTarget].ability_id; + RecordAbility(gBankTarget, gLastUsedAbility); + return; + } + if (gBattleMons[gBankAttacker].held_item) + {gBattlescriptCurrInstr++; return;} + if (gBattleMons[gBankTarget].held_item == ITEM_ENIGMA_BERRY) + {gBattlescriptCurrInstr++; return;} + if (gBattleMons[gBankTarget].held_item == 0) + {gBattlescriptCurrInstr++; return;} + + CHANGED_HELDITEMS[gBankAttacker] = gLastUsedItem = gBattleMons[gBankTarget].held_item; + gBattleMons[gBankTarget].held_item = 0; + + gActiveBank = gBankAttacker; + bb2_setattributes_in_battle(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); + mark_buffer_bank_for_execution(gBankAttacker); + + gActiveBank = gBankTarget; + bb2_setattributes_in_battle(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].held_item); + mark_buffer_bank_for_execution(gBankTarget); + + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BS_ITEMSTEAL; + + STORE_CHOICEMOVE(gBankTarget, 0); + } + break; + case 32: //escape prevention + gBattleMons[gBankTarget].status2 |= STATUS2_RECHARGE; + gDisableStructs[gBankTarget].BankPreventingEscape = gBankAttacker; + gBattlescriptCurrInstr++; + break; + case 33: //nightmare + gBattleMons[gBankTarget].status2 |= STATUS2_NIGHTMARE; + gBattlescriptCurrInstr++; + break; + case 34: + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = gUnknown_081D9224; + return; + case 35: //break free rapidspin + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BS_RAPIDSPINAWAY; + return; + case 36: //paralysis removal + if (gBattleMons[gBankTarget].status1 & STATUS_PARALYSIS) + { + gBattleMons[gBankTarget].status1 &= ~(STATUS_PARALYSIS); + gActiveBank = gBankTarget; + bb2_setattributes_in_battle(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status); + mark_buffer_bank_for_execution(gActiveBank); + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BS_PARALYSISHEALED; + } + else + {gBattlescriptCurrInstr++; return;} + break; + case 37: // + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = gUnknown_081D93FA; + return; + case 38: //recoil plus paralysis + gBattleMoveDamage = gHP_dealt / 3; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + break; + case 53: //thrash + if (!(gBattleMons[gEffectBank].status2 & STATUS2_LOCK_CONFUSE)) + { + gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; + gLockedMove[gEffectBank] = gCurrentMove; + gBattleMons[gEffectBank].status2 |= (((Random() & 1) + 2) << 0xA); + } + else + {gBattlescriptCurrInstr++; return;} + break; + case 54: //knock off + if (gBattleMons[gEffectBank].ability_id == ABILITY_STICKY_HOLD) + { + if (gBattleMons[gEffectBank].held_item == 0) + {gBattlescriptCurrInstr++; return;} + gLastUsedAbility = ABILITY_STICKY_HOLD; + gBattlescriptCurrInstr = BS_STICKYHOLD_ACTIVATES; + RecordAbility(gEffectBank, ABILITY_STICKY_HOLD); + return; + } + if (gBattleMons[gEffectBank].held_item == 0) + {gBattlescriptCurrInstr++; return;} + else + { + u8 side = battle_side_get_owner(gEffectBank); + gLastUsedItem = gBattleMons[gEffectBank].held_item; + gBattleMons[gEffectBank].held_item = 0; + gWishFutureKnock.KnockedOff[side] |= gBitTable[gBattlePartyID[gEffectBank]]; + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BS_KNOCKEDOFF; + + STORE_CHOICEMOVE(gEffectBank, 0); + } + break; + case 59: //overheat I guess, dont remember + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = gUnknown_081D94B0; + return; + } + } +} +#else +__attribute__((naked)) +void SetMoveEffect(bool8 primary, u8 certainArg) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + lsls r1, 24\n\ + lsrs r5, r1, 24\n\ + movs r0, 0\n\ + mov r10, r0\n\ + movs r6, 0\n\ + movs r1, 0x1\n\ + str r1, [sp, 0x4]\n\ + ldr r1, _0801E430 @ =gBattleCommunication\n\ + ldrb r3, [r1, 0x3]\n\ + movs r0, 0x40\n\ + ands r0, r3\n\ + adds r7, r1, 0\n\ + cmp r0, 0\n\ + beq _0801E444\n\ + ldr r2, _0801E434 @ =gEffectBank\n\ + ldr r0, _0801E438 @ =gBankAttacker\n\ + ldrb r0, [r0]\n\ + strb r0, [r2]\n\ + movs r0, 0xBF\n\ + ands r0, r3\n\ + strb r0, [r7, 0x3]\n\ + movs r6, 0x40\n\ + ldr r0, _0801E43C @ =0x02000000\n\ + ldr r1, _0801E440 @ =gBankTarget\n\ + b _0801E450\n\ + .align 2, 0\n\ +_0801E430: .4byte gBattleCommunication\n\ +_0801E434: .4byte gEffectBank\n\ +_0801E438: .4byte gBankAttacker\n\ +_0801E43C: .4byte 0x02000000\n\ +_0801E440: .4byte gBankTarget\n\ +_0801E444:\n\ + ldr r2, _0801E538 @ =gEffectBank\n\ + ldr r0, _0801E53C @ =gBankTarget\n\ + ldrb r0, [r0]\n\ + strb r0, [r2]\n\ + ldr r0, _0801E540 @ =0x02000000\n\ + ldr r1, _0801E544 @ =gBankAttacker\n\ +_0801E450:\n\ + ldrb r1, [r1]\n\ + ldr r3, _0801E548 @ =0x00016003\n\ + adds r0, r3\n\ + strb r1, [r0]\n\ + mov r8, r2\n\ + ldr r2, _0801E54C @ =gBattleMons\n\ + mov r0, r8\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + adds r0, r2\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x13\n\ + bne _0801E48A\n\ + ldr r0, _0801E550 @ =gHitMarker\n\ + ldr r0, [r0]\n\ + movs r1, 0x80\n\ + lsls r1, 6\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0801E48A\n\ + cmp r4, 0\n\ + bne _0801E48A\n\ + ldrb r0, [r7, 0x3]\n\ + cmp r0, 0x9\n\ + bhi _0801E48A\n\ + bl _0801F5DC\n\ +_0801E48A:\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + bl GetBankIdentity\n\ + ldr r2, _0801E554 @ =gSideAffecting\n\ + movs r1, 0x1\n\ + ands r1, r0\n\ + lsls r1, 1\n\ + adds r1, r2\n\ + ldrh r1, [r1]\n\ + movs r0, 0x20\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801E4C4\n\ + ldr r0, _0801E550 @ =gHitMarker\n\ + ldr r0, [r0]\n\ + movs r1, 0x80\n\ + lsls r1, 6\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0801E4C4\n\ + cmp r4, 0\n\ + bne _0801E4C4\n\ + ldr r0, _0801E558 @ =gBattleCommunication\n\ + ldrb r0, [r0, 0x3]\n\ + cmp r0, 0x7\n\ + bhi _0801E4C4\n\ + bl _0801F5DC\n\ +_0801E4C4:\n\ + ldr r3, _0801E54C @ =gBattleMons\n\ + ldr r2, _0801E538 @ =gEffectBank\n\ + ldrb r1, [r2]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + adds r0, r3\n\ + ldrh r0, [r0, 0x28]\n\ + mov r8, r2\n\ + mov r9, r3\n\ + cmp r0, 0\n\ + bne _0801E4EA\n\ + ldr r0, _0801E558 @ =gBattleCommunication\n\ + ldrb r0, [r0, 0x3]\n\ + cmp r0, 0xB\n\ + beq _0801E4EA\n\ + cmp r0, 0x1F\n\ + beq _0801E4EA\n\ + bl _0801F5DC\n\ +_0801E4EA:\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + mov r1, r9\n\ + adds r1, 0x50\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + movs r1, 0x80\n\ + lsls r1, 17\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801E50C\n\ + cmp r6, 0x40\n\ + beq _0801E50C\n\ + bl _0801F5DC\n\ +_0801E50C:\n\ + ldr r0, _0801E558 @ =gBattleCommunication\n\ + ldrb r1, [r0, 0x3]\n\ + adds r7, r0, 0\n\ + cmp r1, 0x6\n\ + bls _0801E518\n\ + b _0801EB4A\n\ +_0801E518:\n\ + ldr r1, _0801E55C @ =gStatusFlagsForMoveEffects\n\ + ldrb r0, [r7, 0x3]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + cmp r0, 0x10\n\ + bne _0801E528\n\ + b _0801E714\n\ +_0801E528:\n\ + cmp r0, 0x10\n\ + bhi _0801E560\n\ + cmp r0, 0x7\n\ + beq _0801E57A\n\ + cmp r0, 0x8\n\ + bne _0801E536\n\ + b _0801E630\n\ +_0801E536:\n\ + b _0801EA14\n\ + .align 2, 0\n\ +_0801E538: .4byte gEffectBank\n\ +_0801E53C: .4byte gBankTarget\n\ +_0801E540: .4byte 0x02000000\n\ +_0801E544: .4byte gBankAttacker\n\ +_0801E548: .4byte 0x00016003\n\ +_0801E54C: .4byte gBattleMons\n\ +_0801E550: .4byte gHitMarker\n\ +_0801E554: .4byte gSideAffecting\n\ +_0801E558: .4byte gBattleCommunication\n\ +_0801E55C: .4byte gStatusFlagsForMoveEffects\n\ +_0801E560:\n\ + cmp r0, 0x40\n\ + bne _0801E566\n\ + b _0801E888\n\ +_0801E566:\n\ + cmp r0, 0x40\n\ + bhi _0801E572\n\ + cmp r0, 0x20\n\ + bne _0801E570\n\ + b _0801E7EA\n\ +_0801E570:\n\ + b _0801EA14\n\ +_0801E572:\n\ + cmp r0, 0x80\n\ + bne _0801E578\n\ + b _0801E8E4\n\ +_0801E578:\n\ + b _0801EA14\n\ +_0801E57A:\n\ + mov r3, r8\n\ + ldrb r1, [r3]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + add r0, r9\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x2B\n\ + beq _0801E5DC\n\ + ldr r0, _0801E5D4 @ =gActiveBank\n\ + movs r1, 0\n\ + strb r1, [r0]\n\ + ldr r1, _0801E5D8 @ =gNoOfAllBanks\n\ + ldrb r3, [r1]\n\ + adds r7, r0, 0\n\ + mov r12, r1\n\ + cmp r3, 0\n\ + beq _0801E5E8\n\ + mov r4, r9\n\ + ldr r0, [r4, 0x50]\n\ + movs r1, 0x70\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0801E5E8\n\ + adds r1, r7, 0\n\ + mov r6, r9\n\ + adds r6, 0x50\n\ + movs r5, 0x58\n\ + movs r4, 0x70\n\ +_0801E5B4:\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, r3\n\ + bcs _0801E5E8\n\ + ldrb r0, [r7]\n\ + muls r0, r5\n\ + adds r0, r6\n\ + ldr r0, [r0]\n\ + ands r0, r4\n\ + cmp r0, 0\n\ + beq _0801E5B4\n\ + b _0801E5E8\n\ + .align 2, 0\n\ +_0801E5D4: .4byte gActiveBank\n\ +_0801E5D8: .4byte gNoOfAllBanks\n\ +_0801E5DC:\n\ + ldr r0, _0801E628 @ =gActiveBank\n\ + ldr r2, _0801E62C @ =gNoOfAllBanks\n\ + ldrb r1, [r2]\n\ + strb r1, [r0]\n\ + adds r7, r0, 0\n\ + mov r12, r2\n\ +_0801E5E8:\n\ + mov r0, r8\n\ + ldrb r2, [r0]\n\ + movs r0, 0x58\n\ + adds r1, r2, 0\n\ + muls r1, r0\n\ + mov r0, r9\n\ + adds r0, 0x4C\n\ + adds r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + beq _0801E600\n\ + b _0801EA14\n\ +_0801E600:\n\ + ldrb r0, [r7]\n\ + mov r3, r12\n\ + ldrb r3, [r3]\n\ + cmp r0, r3\n\ + beq _0801E60C\n\ + b _0801EA14\n\ +_0801E60C:\n\ + mov r4, r9\n\ + adds r0, r1, r4\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x48\n\ + bne _0801E61A\n\ + b _0801EA14\n\ +_0801E61A:\n\ + cmp r0, 0xF\n\ + bne _0801E620\n\ + b _0801EA14\n\ +_0801E620:\n\ + adds r0, r2, 0\n\ + bl CancelMultiTurnMoves\n\ + b _0801EA04\n\ + .align 2, 0\n\ +_0801E628: .4byte gActiveBank\n\ +_0801E62C: .4byte gNoOfAllBanks\n\ +_0801E630:\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + add r0, r9\n\ + adds r0, 0x20\n\ + ldrb r1, [r0]\n\ + cmp r1, 0x11\n\ + bne _0801E688\n\ + cmp r4, 0x1\n\ + beq _0801E64A\n\ + cmp r5, 0x80\n\ + bne _0801E688\n\ +_0801E64A:\n\ + ldr r0, _0801E678 @ =gLastUsedAbility\n\ + strb r1, [r0]\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + movs r1, 0x11\n\ + bl RecordAbilityBattle\n\ + ldr r4, _0801E67C @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801E680 @ =BattleScript_PSNPrevention\n\ +_0801E664:\n\ + str r0, [r4]\n\ + ldr r2, _0801E684 @ =gHitMarker\n\ + ldr r1, [r2]\n\ + movs r0, 0x80\n\ + lsls r0, 6\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801E676\n\ + b _0801E928\n\ +_0801E676:\n\ + b _0801E94C\n\ + .align 2, 0\n\ +_0801E678: .4byte gLastUsedAbility\n\ +_0801E67C: .4byte gBattlescriptCurrInstr\n\ +_0801E680: .4byte BattleScript_PSNPrevention\n\ +_0801E684: .4byte gHitMarker\n\ +_0801E688:\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + movs r1, 0x58\n\ + muls r0, r1\n\ + add r0, r9\n\ + adds r1, r0, 0\n\ + adds r1, 0x21\n\ + ldrb r1, [r1]\n\ + cmp r1, 0x3\n\ + beq _0801E6AC\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x3\n\ + beq _0801E6AC\n\ + cmp r1, 0x8\n\ + beq _0801E6AC\n\ + cmp r0, 0x8\n\ + bne _0801E6C6\n\ +_0801E6AC:\n\ + ldr r0, _0801E710 @ =gHitMarker\n\ + ldr r0, [r0]\n\ + movs r1, 0x80\n\ + lsls r1, 6\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801E6C6\n\ + cmp r4, 0x1\n\ + bne _0801E6C0\n\ + b _0801E98C\n\ +_0801E6C0:\n\ + cmp r5, 0x80\n\ + bne _0801E6C6\n\ + b _0801E98C\n\ +_0801E6C6:\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + movs r0, 0x58\n\ + muls r1, r0\n\ + mov r4, r9\n\ + adds r3, r1, r4\n\ + adds r0, r3, 0\n\ + adds r0, 0x21\n\ + ldrb r4, [r0]\n\ + cmp r4, 0x3\n\ + bne _0801E6DE\n\ + b _0801EA14\n\ +_0801E6DE:\n\ + adds r0, 0x1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x3\n\ + bne _0801E6E8\n\ + b _0801EA14\n\ +_0801E6E8:\n\ + cmp r4, 0x8\n\ + bne _0801E6EE\n\ + b _0801EA14\n\ +_0801E6EE:\n\ + cmp r0, 0x8\n\ + bne _0801E6F4\n\ + b _0801EA14\n\ +_0801E6F4:\n\ + mov r0, r9\n\ + adds r0, 0x4C\n\ + adds r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + beq _0801E702\n\ + b _0801EA14\n\ +_0801E702:\n\ + adds r0, r3, 0\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x11\n\ + bne _0801E70E\n\ + b _0801EA14\n\ +_0801E70E:\n\ + b _0801EA04\n\ + .align 2, 0\n\ +_0801E710: .4byte gHitMarker\n\ +_0801E714:\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + add r0, r9\n\ + adds r0, 0x20\n\ + ldrb r1, [r0]\n\ + cmp r1, 0x29\n\ + bne _0801E758\n\ + cmp r4, 0x1\n\ + beq _0801E72E\n\ + cmp r5, 0x80\n\ + bne _0801E758\n\ +_0801E72E:\n\ + ldr r0, _0801E74C @ =gLastUsedAbility\n\ + strb r1, [r0]\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + movs r1, 0x29\n\ + bl RecordAbilityBattle\n\ + ldr r4, _0801E750 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801E754 @ =BattleScript_BRNPrevention\n\ + b _0801E664\n\ + .align 2, 0\n\ +_0801E74C: .4byte gLastUsedAbility\n\ +_0801E750: .4byte gBattlescriptCurrInstr\n\ +_0801E754: .4byte BattleScript_BRNPrevention\n\ +_0801E758:\n\ + mov r0, r8\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + mov r2, r9\n\ + adds r1, r0, r2\n\ + adds r0, r1, 0\n\ + adds r0, 0x21\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xA\n\ + beq _0801E778\n\ + adds r0, r1, 0\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xA\n\ + bne _0801E7A8\n\ +_0801E778:\n\ + ldr r0, _0801E79C @ =gHitMarker\n\ + ldr r0, [r0]\n\ + movs r1, 0x80\n\ + lsls r1, 6\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801E7A8\n\ + cmp r4, 0x1\n\ + beq _0801E78E\n\ + cmp r5, 0x80\n\ + bne _0801E7A8\n\ +_0801E78E:\n\ + ldr r4, _0801E7A0 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801E7A4 @ =BattleScript_BRNPrevention\n\ + b _0801E998\n\ + .align 2, 0\n\ +_0801E79C: .4byte gHitMarker\n\ +_0801E7A0: .4byte gBattlescriptCurrInstr\n\ +_0801E7A4: .4byte BattleScript_BRNPrevention\n\ +_0801E7A8:\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + movs r1, 0x58\n\ + adds r2, r0, 0\n\ + muls r2, r1\n\ + mov r4, r9\n\ + adds r1, r2, r4\n\ + adds r0, r1, 0\n\ + adds r0, 0x21\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xA\n\ + bne _0801E7C2\n\ + b _0801EA14\n\ +_0801E7C2:\n\ + adds r0, r1, 0\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xA\n\ + bne _0801E7CE\n\ + b _0801EA14\n\ +_0801E7CE:\n\ + adds r0, r1, 0\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x29\n\ + bne _0801E7DA\n\ + b _0801EA14\n\ +_0801E7DA:\n\ + mov r0, r9\n\ + adds r0, 0x4C\n\ + adds r0, r2, r0\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + beq _0801E7E8\n\ + b _0801EA14\n\ +_0801E7E8:\n\ + b _0801EA04\n\ +_0801E7EA:\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0x13\n\ + movs r1, 0\n\ + movs r2, 0xD\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0\n\ + bne _0801E826\n\ + str r0, [sp]\n\ + movs r0, 0x13\n\ + movs r1, 0\n\ + movs r2, 0x4D\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0801E826\n\ + ldr r0, _0801E87C @ =gBattleWeather\n\ + ldrh r1, [r0]\n\ + movs r0, 0x60\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801E826\n\ + movs r1, 0\n\ + str r1, [sp, 0x4]\n\ +_0801E826:\n\ + ldr r4, _0801E880 @ =gBattleMons\n\ + ldr r0, _0801E884 @ =gEffectBank\n\ + ldrb r3, [r0]\n\ + movs r0, 0x58\n\ + adds r2, r3, 0\n\ + muls r2, r0\n\ + adds r1, r2, r4\n\ + adds r0, r1, 0\n\ + adds r0, 0x21\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xF\n\ + bne _0801E840\n\ + b _0801EA14\n\ +_0801E840:\n\ + adds r0, r1, 0\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xF\n\ + bne _0801E84C\n\ + b _0801EA14\n\ +_0801E84C:\n\ + adds r0, r4, 0\n\ + adds r0, 0x4C\n\ + adds r0, r2, r0\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + beq _0801E85A\n\ + b _0801EA14\n\ +_0801E85A:\n\ + ldr r2, [sp, 0x4]\n\ + cmp r2, 0\n\ + bne _0801E862\n\ + b _0801EA14\n\ +_0801E862:\n\ + adds r0, r1, 0\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x28\n\ + bne _0801E86E\n\ + b _0801EA14\n\ +_0801E86E:\n\ + adds r0, r3, 0\n\ + bl CancelMultiTurnMoves\n\ + movs r3, 0x1\n\ + mov r10, r3\n\ + b _0801EA14\n\ + .align 2, 0\n\ +_0801E87C: .4byte gBattleWeather\n\ +_0801E880: .4byte gBattleMons\n\ +_0801E884: .4byte gEffectBank\n\ +_0801E888:\n\ + mov r0, r8\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + muls r1, r0\n\ + mov r2, r9\n\ + adds r0, r1, r2\n\ + adds r0, 0x20\n\ + ldrb r2, [r0]\n\ + cmp r2, 0x7\n\ + bne _0801E8D0\n\ + cmp r4, 0x1\n\ + beq _0801E8A6\n\ + cmp r5, 0x80\n\ + beq _0801E8A6\n\ + b _0801EA14\n\ +_0801E8A6:\n\ + ldr r0, _0801E8C4 @ =gLastUsedAbility\n\ + strb r2, [r0]\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + movs r1, 0x7\n\ + bl RecordAbilityBattle\n\ + ldr r4, _0801E8C8 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801E8CC @ =BattleScript_PRLZPrevention\n\ + b _0801E664\n\ + .align 2, 0\n\ +_0801E8C4: .4byte gLastUsedAbility\n\ +_0801E8C8: .4byte gBattlescriptCurrInstr\n\ +_0801E8CC: .4byte BattleScript_PRLZPrevention\n\ +_0801E8D0:\n\ + mov r0, r9\n\ + adds r0, 0x4C\n\ + adds r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + beq _0801E8DE\n\ + b _0801EA14\n\ +_0801E8DE:\n\ + movs r4, 0x1\n\ + mov r10, r4\n\ + b _0801EA14\n\ +_0801E8E4:\n\ + mov r0, r8\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + add r0, r9\n\ + adds r0, 0x20\n\ + ldrb r1, [r0]\n\ + cmp r1, 0x11\n\ + bne _0801E952\n\ + cmp r4, 0x1\n\ + beq _0801E8FE\n\ + cmp r5, 0x80\n\ + bne _0801E952\n\ +_0801E8FE:\n\ + ldr r0, _0801E938 @ =gLastUsedAbility\n\ + strb r1, [r0]\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + movs r1, 0x11\n\ + bl RecordAbilityBattle\n\ + ldr r4, _0801E93C @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801E940 @ =BattleScript_PSNPrevention\n\ + str r0, [r4]\n\ + ldr r2, _0801E944 @ =gHitMarker\n\ + ldr r1, [r2]\n\ + movs r0, 0x80\n\ + lsls r0, 6\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801E94C\n\ +_0801E928:\n\ + movs r0, 0x1\n\ + strb r0, [r7, 0x5]\n\ + ldr r0, _0801E948 @ =0xffffdfff\n\ + ands r1, r0\n\ + str r1, [r2]\n\ + bl _0801F5FA\n\ + .align 2, 0\n\ +_0801E938: .4byte gLastUsedAbility\n\ +_0801E93C: .4byte gBattlescriptCurrInstr\n\ +_0801E940: .4byte BattleScript_PSNPrevention\n\ +_0801E944: .4byte gHitMarker\n\ +_0801E948: .4byte 0xffffdfff\n\ +_0801E94C:\n\ + strb r0, [r7, 0x5]\n\ + bl _0801F5FA\n\ +_0801E952:\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + movs r1, 0x58\n\ + muls r0, r1\n\ + add r0, r9\n\ + adds r1, r0, 0\n\ + adds r1, 0x21\n\ + ldrb r1, [r1]\n\ + cmp r1, 0x3\n\ + beq _0801E976\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x3\n\ + beq _0801E976\n\ + cmp r1, 0x8\n\ + beq _0801E976\n\ + cmp r0, 0x8\n\ + bne _0801E9B4\n\ +_0801E976:\n\ + ldr r0, _0801E9A4 @ =gHitMarker\n\ + ldr r0, [r0]\n\ + movs r1, 0x80\n\ + lsls r1, 6\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801E9B4\n\ + cmp r4, 0x1\n\ + beq _0801E98C\n\ + cmp r5, 0x80\n\ + bne _0801E9B4\n\ +_0801E98C:\n\ + ldr r4, _0801E9A8 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801E9AC @ =BattleScript_PSNPrevention\n\ +_0801E998:\n\ + str r0, [r4]\n\ + ldr r1, _0801E9B0 @ =gBattleCommunication\n\ + movs r0, 0x2\n\ + strb r0, [r1, 0x5]\n\ + bl _0801F5FA\n\ + .align 2, 0\n\ +_0801E9A4: .4byte gHitMarker\n\ +_0801E9A8: .4byte gBattlescriptCurrInstr\n\ +_0801E9AC: .4byte BattleScript_PSNPrevention\n\ +_0801E9B0: .4byte gBattleCommunication\n\ +_0801E9B4:\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + movs r6, 0x58\n\ + muls r0, r6\n\ + mov r2, r9\n\ + adds r2, 0x4C\n\ + adds r5, r0, r2\n\ + ldr r4, [r5]\n\ + cmp r4, 0\n\ + bne _0801EA14\n\ + mov r3, r9\n\ + adds r1, r0, r3\n\ + adds r0, r1, 0\n\ + adds r0, 0x21\n\ + ldrb r3, [r0]\n\ + cmp r3, 0x3\n\ + beq _0801EA0A\n\ + adds r0, 0x1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x3\n\ + beq _0801EA0A\n\ + cmp r3, 0x8\n\ + beq _0801EA0A\n\ + cmp r0, 0x8\n\ + beq _0801EA0A\n\ + adds r0, r1, 0\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x11\n\ + beq _0801EA14\n\ + mov r4, r8\n\ + ldrb r0, [r4]\n\ + adds r1, r0, 0\n\ + muls r1, r6\n\ + adds r1, r2\n\ + ldr r0, [r1]\n\ + movs r2, 0x9\n\ + negs r2, r2\n\ + ands r0, r2\n\ + str r0, [r1]\n\ +_0801EA04:\n\ + movs r0, 0x1\n\ + mov r10, r0\n\ + b _0801EA14\n\ +_0801EA0A:\n\ + ldr r0, _0801EA58 @ =gBattleMoveFlags\n\ + ldrb r1, [r0]\n\ + movs r2, 0x8\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ +_0801EA14:\n\ + mov r1, r10\n\ + cmp r1, 0x1\n\ + beq _0801EA1C\n\ + b _0801EB3C\n\ +_0801EA1C:\n\ + ldr r0, _0801EA5C @ =gBattlescriptCurrInstr\n\ + ldr r0, [r0]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r1, _0801EA60 @ =gStatusFlagsForMoveEffects\n\ + ldr r0, _0801EA64 @ =gBattleCommunication\n\ + ldrb r0, [r0, 0x3]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r3, [r0]\n\ + cmp r3, 0x7\n\ + bne _0801EA70\n\ + bl Random\n\ + ldr r2, _0801EA68 @ =gBattleMons\n\ + ldr r1, _0801EA6C @ =gEffectBank\n\ + ldrb r3, [r1]\n\ + movs r1, 0x58\n\ + muls r3, r1\n\ + adds r2, 0x4C\n\ + adds r3, r2\n\ + movs r1, 0x3\n\ + ands r1, r0\n\ + adds r1, 0x2\n\ + ldr r0, [r3]\n\ + orrs r0, r1\n\ + str r0, [r3]\n\ + b _0801EA84\n\ + .align 2, 0\n\ +_0801EA58: .4byte gBattleMoveFlags\n\ +_0801EA5C: .4byte gBattlescriptCurrInstr\n\ +_0801EA60: .4byte gStatusFlagsForMoveEffects\n\ +_0801EA64: .4byte gBattleCommunication\n\ +_0801EA68: .4byte gBattleMons\n\ +_0801EA6C: .4byte gEffectBank\n\ +_0801EA70:\n\ + ldr r2, _0801EAD4 @ =gBattleMons\n\ + ldr r0, _0801EAD8 @ =gEffectBank\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + muls r1, r0\n\ + adds r2, 0x4C\n\ + adds r1, r2\n\ + ldr r0, [r1]\n\ + orrs r0, r3\n\ + str r0, [r1]\n\ +_0801EA84:\n\ + ldr r2, _0801EADC @ =gBattlescriptCurrInstr\n\ + ldr r1, _0801EAE0 @ =gMoveEffectBS_Ptrs\n\ + ldr r5, _0801EAE4 @ =gBattleCommunication\n\ + ldrb r0, [r5, 0x3]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + str r0, [r2]\n\ + ldr r4, _0801EAE8 @ =gActiveBank\n\ + ldr r1, _0801EAD8 @ =gEffectBank\n\ + ldrb r0, [r1]\n\ + strb r0, [r4]\n\ + ldrb r1, [r1]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + ldr r1, _0801EAEC @ =gUnknown_02024ACC\n\ + adds r0, r1\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0x28\n\ + movs r2, 0\n\ + movs r3, 0x4\n\ + bl EmitSetAttributes\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + ldr r2, _0801EAF0 @ =gHitMarker\n\ + ldr r1, [r2]\n\ + movs r0, 0x80\n\ + lsls r0, 6\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801EAF8\n\ + movs r0, 0x1\n\ + strb r0, [r5, 0x5]\n\ + ldr r0, _0801EAF4 @ =0xffffdfff\n\ + ands r1, r0\n\ + str r1, [r2]\n\ + b _0801EAFA\n\ + .align 2, 0\n\ +_0801EAD4: .4byte gBattleMons\n\ +_0801EAD8: .4byte gEffectBank\n\ +_0801EADC: .4byte gBattlescriptCurrInstr\n\ +_0801EAE0: .4byte gMoveEffectBS_Ptrs\n\ +_0801EAE4: .4byte gBattleCommunication\n\ +_0801EAE8: .4byte gActiveBank\n\ +_0801EAEC: .4byte gUnknown_02024ACC\n\ +_0801EAF0: .4byte gHitMarker\n\ +_0801EAF4: .4byte 0xffffdfff\n\ +_0801EAF8:\n\ + strb r0, [r5, 0x5]\n\ +_0801EAFA:\n\ + ldr r0, _0801EB2C @ =gBattleCommunication\n\ + ldrb r2, [r0, 0x3]\n\ + adds r7, r0, 0\n\ + cmp r2, 0x2\n\ + beq _0801EB14\n\ + cmp r2, 0x6\n\ + beq _0801EB14\n\ + cmp r2, 0x5\n\ + beq _0801EB14\n\ + cmp r2, 0x3\n\ + beq _0801EB14\n\ + bl _0801F5FA\n\ +_0801EB14:\n\ + ldr r0, _0801EB30 @ =0x02000000\n\ + ldrb r1, [r7, 0x3]\n\ + ldr r2, _0801EB34 @ =0x000160ca\n\ + adds r0, r2\n\ + strb r1, [r0]\n\ + ldr r2, _0801EB38 @ =gHitMarker\n\ + ldr r0, [r2]\n\ + movs r1, 0x80\n\ + lsls r1, 7\n\ + bl _0801F4F2\n\ + .align 2, 0\n\ +_0801EB2C: .4byte gBattleCommunication\n\ +_0801EB30: .4byte 0x02000000\n\ +_0801EB34: .4byte 0x000160ca\n\ +_0801EB38: .4byte gHitMarker\n\ +_0801EB3C:\n\ + mov r3, r10\n\ + cmp r3, 0\n\ + beq _0801EB46\n\ + bl _0801F5FA\n\ +_0801EB46:\n\ + bl _0801F5DC\n\ +_0801EB4A:\n\ + mov r0, r8\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + muls r1, r0\n\ + mov r0, r9\n\ + adds r0, 0x50\n\ + adds r1, r0\n\ + ldr r2, _0801EB84 @ =gStatusFlagsForMoveEffects\n\ + ldrb r3, [r7, 0x3]\n\ + lsls r0, r3, 2\n\ + adds r0, r2\n\ + ldr r1, [r1]\n\ + ldr r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _0801EB6E\n\ + bl _0801F5DC\n\ +_0801EB6E:\n\ + subs r0, r3, 0x7\n\ + cmp r0, 0x34\n\ + bls _0801EB78\n\ + bl _0801F5FA\n\ +_0801EB78:\n\ + lsls r0, 2\n\ + ldr r1, _0801EB88 @ =_0801EB8C\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_0801EB84: .4byte gStatusFlagsForMoveEffects\n\ +_0801EB88: .4byte _0801EB8C\n\ + .align 2, 0\n\ +_0801EB8C:\n\ + .4byte _0801EC60\n\ + .4byte _0801ECD4\n\ + .4byte _0801EE4C\n\ + .4byte _0801ED60\n\ + .4byte _0801EDDC\n\ + .4byte _0801EE84\n\ + .4byte _0801EECC\n\ + .4byte _0801EFA8\n\ + .4byte _0801EFEC\n\ + .4byte _0801EFEC\n\ + .4byte _0801EFEC\n\ + .4byte _0801EFEC\n\ + .4byte _0801EFEC\n\ + .4byte _0801EFEC\n\ + .4byte _0801EFEC\n\ + .4byte _0801F040\n\ + .4byte _0801F040\n\ + .4byte _0801F040\n\ + .4byte _0801F040\n\ + .4byte _0801F040\n\ + .4byte _0801F040\n\ + .4byte _0801F040\n\ + .4byte _0801F13C\n\ + .4byte _0801F184\n\ + .4byte _0801F1A4\n\ + .4byte _0801F364\n\ + .4byte _0801F3A0\n\ + .4byte _0801F3BC\n\ + .4byte _0801F3D4\n\ + .4byte _0801F3EC\n\ + .4byte _0801F44C\n\ + .4byte _0801F464\n\ + .4byte _0801F094\n\ + .4byte _0801F094\n\ + .4byte _0801F094\n\ + .4byte _0801F094\n\ + .4byte _0801F094\n\ + .4byte _0801F094\n\ + .4byte _0801F094\n\ + .4byte _0801F0E8\n\ + .4byte _0801F0E8\n\ + .4byte _0801F0E8\n\ + .4byte _0801F0E8\n\ + .4byte _0801F0E8\n\ + .4byte _0801F0E8\n\ + .4byte _0801F0E8\n\ + .4byte _0801F4A8\n\ + .4byte _0801F500\n\ + .4byte _0801F5FA\n\ + .4byte _0801F5FA\n\ + .4byte _0801F5FA\n\ + .4byte _0801F5FA\n\ + .4byte _0801F5EC\n\ +_0801EC60:\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + movs r5, 0x58\n\ + adds r1, r0, 0\n\ + muls r1, r5\n\ + mov r2, r9\n\ + adds r0, r1, r2\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x14\n\ + bne _0801EC7A\n\ + bl _0801F5DC\n\ +_0801EC7A:\n\ + mov r4, r9\n\ + adds r4, 0x50\n\ + adds r0, r1, r4\n\ + ldr r0, [r0]\n\ + movs r1, 0x7\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801EC8E\n\ + bl _0801F5DC\n\ +_0801EC8E:\n\ + bl Random\n\ + mov r3, r8\n\ + ldrb r1, [r3]\n\ + adds r2, r1, 0\n\ + muls r2, r5\n\ + adds r2, r4\n\ + lsls r0, 16\n\ + movs r1, 0xC0\n\ + lsls r1, 10\n\ + ands r1, r0\n\ + lsrs r1, 16\n\ + adds r1, 0x2\n\ + ldr r0, [r2]\n\ + orrs r0, r1\n\ + str r0, [r2]\n\ + ldr r4, _0801ECC8 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r1, _0801ECCC @ =gMoveEffectBS_Ptrs\n\ + ldr r0, _0801ECD0 @ =gBattleCommunication\n\ + ldrb r0, [r0, 0x3]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + bl _0801F5F8\n\ + .align 2, 0\n\ +_0801ECC8: .4byte gBattlescriptCurrInstr\n\ +_0801ECCC: .4byte gMoveEffectBS_Ptrs\n\ +_0801ECD0: .4byte gBattleCommunication\n\ +_0801ECD4:\n\ + mov r0, r8\n\ + ldrb r2, [r0]\n\ + movs r6, 0x58\n\ + adds r0, r2, 0\n\ + muls r0, r6\n\ + add r0, r9\n\ + adds r0, 0x20\n\ + ldrb r1, [r0]\n\ + cmp r1, 0x27\n\ + bne _0801ED18\n\ + cmp r4, 0x1\n\ + beq _0801ECF4\n\ + cmp r5, 0x80\n\ + beq _0801ECF4\n\ + bl _0801F5DC\n\ +_0801ECF4:\n\ + ldr r0, _0801ED0C @ =gLastUsedAbility\n\ + strb r1, [r0]\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + movs r1, 0x27\n\ + bl RecordAbilityBattle\n\ + ldr r1, _0801ED10 @ =gBattlescriptCurrInstr\n\ + ldr r0, _0801ED14 @ =BattleScript_FlinchPrevention\n\ + str r0, [r1]\n\ + bl _0801F5FA\n\ + .align 2, 0\n\ +_0801ED0C: .4byte gLastUsedAbility\n\ +_0801ED10: .4byte gBattlescriptCurrInstr\n\ +_0801ED14: .4byte BattleScript_FlinchPrevention\n\ +_0801ED18:\n\ + adds r0, r2, 0\n\ + bl BankGetTurnOrder\n\ + ldr r1, _0801ED54 @ =gCurrentMoveTurn\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bhi _0801ED2E\n\ + bl _0801F5DC\n\ +_0801ED2E:\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + adds r2, r0, 0\n\ + muls r2, r6\n\ + mov r0, r9\n\ + adds r0, 0x50\n\ + adds r2, r0\n\ + ldr r1, _0801ED58 @ =gStatusFlagsForMoveEffects\n\ + ldr r0, _0801ED5C @ =gBattleCommunication\n\ + ldrb r0, [r0, 0x3]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r1, [r2]\n\ + ldr r0, [r0]\n\ + orrs r1, r0\n\ + str r1, [r2]\n\ + bl _0801F5DC\n\ + .align 2, 0\n\ +_0801ED54: .4byte gCurrentMoveTurn\n\ +_0801ED58: .4byte gStatusFlagsForMoveEffects\n\ +_0801ED5C: .4byte gBattleCommunication\n\ +_0801ED60:\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + movs r5, 0x58\n\ + muls r0, r5\n\ + mov r4, r9\n\ + adds r4, 0x50\n\ + adds r2, r0, r4\n\ + ldr r1, [r2]\n\ + movs r0, 0x70\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801ED7C\n\ + bl _0801F5DC\n\ +_0801ED7C:\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + orrs r1, r0\n\ + str r1, [r2]\n\ + ldr r1, _0801EDC8 @ =gLockedMove\n\ + ldrb r0, [r3]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + ldr r1, _0801EDCC @ =gCurrentMove\n\ + ldrh r1, [r1]\n\ + strh r1, [r0]\n\ + bl Random\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + adds r2, r1, 0\n\ + muls r2, r5\n\ + adds r2, r4\n\ + movs r1, 0x3\n\ + ands r1, r0\n\ + adds r1, 0x2\n\ + lsls r1, 4\n\ + ldr r0, [r2]\n\ + orrs r0, r1\n\ + str r0, [r2]\n\ + ldr r4, _0801EDD0 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r1, _0801EDD4 @ =gMoveEffectBS_Ptrs\n\ + ldr r0, _0801EDD8 @ =gBattleCommunication\n\ + ldrb r0, [r0, 0x3]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + bl _0801F5F8\n\ + .align 2, 0\n\ +_0801EDC8: .4byte gLockedMove\n\ +_0801EDCC: .4byte gCurrentMove\n\ +_0801EDD0: .4byte gBattlescriptCurrInstr\n\ +_0801EDD4: .4byte gMoveEffectBS_Ptrs\n\ +_0801EDD8: .4byte gBattleCommunication\n\ +_0801EDDC:\n\ + ldr r5, _0801EE30 @ =gBankAttacker\n\ + ldrb r0, [r5]\n\ + bl GetBankIdentity\n\ + movs r1, 0x1\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + bne _0801EE14\n\ + ldr r4, _0801EE34 @ =gPaydayMoney\n\ + ldrh r3, [r4]\n\ + ldr r2, _0801EE38 @ =gBattleMons\n\ + ldrb r1, [r5]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + adds r0, r2\n\ + adds r0, 0x2A\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + adds r0, r3, r0\n\ + strh r0, [r4]\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r3, r0\n\ + bls _0801EE14\n\ + ldr r3, _0801EE3C @ =0x0000ffff\n\ + adds r0, r3, 0\n\ + strh r0, [r4]\n\ +_0801EE14:\n\ + ldr r4, _0801EE40 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r1, _0801EE44 @ =gMoveEffectBS_Ptrs\n\ + ldr r0, _0801EE48 @ =gBattleCommunication\n\ + ldrb r0, [r0, 0x3]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + bl _0801F5F8\n\ + .align 2, 0\n\ +_0801EE30: .4byte gBankAttacker\n\ +_0801EE34: .4byte gPaydayMoney\n\ +_0801EE38: .4byte gBattleMons\n\ +_0801EE3C: .4byte 0x0000ffff\n\ +_0801EE40: .4byte gBattlescriptCurrInstr\n\ +_0801EE44: .4byte gMoveEffectBS_Ptrs\n\ +_0801EE48: .4byte gBattleCommunication\n\ +_0801EE4C:\n\ + mov r4, r8\n\ + ldrb r1, [r4]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + mov r1, r9\n\ + adds r1, 0x4C\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + beq _0801EE62\n\ + b _0801F5DC\n\ +_0801EE62:\n\ + bl Random\n\ + ldr r4, _0801EE80 @ =gBattleCommunication\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x3\n\ + bl __umodsi3\n\ + adds r0, 0x3\n\ + strb r0, [r4, 0x3]\n\ + movs r0, 0\n\ + movs r1, 0\n\ + bl SetMoveEffect\n\ + b _0801F5FA\n\ + .align 2, 0\n\ +_0801EE80: .4byte gBattleCommunication\n\ +_0801EE84:\n\ + mov r0, r8\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + adds r2, r1, 0\n\ + muls r2, r0\n\ + mov r0, r9\n\ + adds r0, 0x50\n\ + adds r2, r0\n\ + ldr r0, [r2]\n\ + movs r1, 0x80\n\ + lsls r1, 5\n\ + orrs r0, r1\n\ + str r0, [r2]\n\ + ldr r1, _0801EEC0 @ =gLockedMove\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + ldr r1, _0801EEC4 @ =gCurrentMove\n\ + ldrh r1, [r1]\n\ + strh r1, [r0]\n\ + ldr r0, _0801EEC8 @ =gProtectStructs\n\ + ldrb r1, [r2]\n\ + lsls r1, 4\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x1]\n\ + movs r2, 0x4\n\ + orrs r0, r2\n\ + strb r0, [r1, 0x1]\n\ + b _0801F5DC\n\ + .align 2, 0\n\ +_0801EEC0: .4byte gLockedMove\n\ +_0801EEC4: .4byte gCurrentMove\n\ +_0801EEC8: .4byte gProtectStructs\n\ +_0801EECC:\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + movs r6, 0x58\n\ + muls r0, r6\n\ + mov r4, r9\n\ + adds r4, 0x50\n\ + adds r0, r4\n\ + ldr r5, [r0]\n\ + movs r0, 0xE0\n\ + lsls r0, 8\n\ + ands r5, r0\n\ + cmp r5, 0\n\ + beq _0801EEE8\n\ + b _0801F5DC\n\ +_0801EEE8:\n\ + bl Random\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + adds r2, r1, 0\n\ + muls r2, r6\n\ + adds r2, r4\n\ + movs r1, 0x3\n\ + ands r1, r0\n\ + adds r1, 0x3\n\ + lsls r1, 13\n\ + ldr r0, [r2]\n\ + orrs r0, r1\n\ + str r0, [r2]\n\ + ldr r2, _0801EF80 @ =0x02000000\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + lsls r0, 1\n\ + ldr r4, _0801EF84 @ =0x00016004\n\ + adds r0, r4\n\ + adds r0, r2\n\ + ldr r6, _0801EF88 @ =gCurrentMove\n\ + ldrh r1, [r6]\n\ + strb r1, [r0]\n\ + ldrb r0, [r3]\n\ + lsls r0, 1\n\ + ldr r1, _0801EF8C @ =0x00016005\n\ + adds r0, r1\n\ + adds r0, r2\n\ + ldrh r1, [r6]\n\ + lsrs r1, 8\n\ + strb r1, [r0]\n\ + ldrb r0, [r3]\n\ + ldr r3, _0801EF90 @ =0x00016020\n\ + adds r0, r3\n\ + adds r0, r2\n\ + ldr r1, _0801EF94 @ =gBankAttacker\n\ + ldrb r1, [r1]\n\ + strb r1, [r0]\n\ + ldr r4, _0801EF98 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r1, _0801EF9C @ =gMoveEffectBS_Ptrs\n\ + ldr r2, _0801EFA0 @ =gBattleCommunication\n\ + ldrb r0, [r2, 0x3]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + str r0, [r4]\n\ + strb r5, [r2, 0x5]\n\ + ldr r1, _0801EFA4 @ =gTrappingMoves\n\ + ldrh r0, [r1]\n\ + ldrh r4, [r6]\n\ + cmp r0, r4\n\ + bne _0801EF5C\n\ + b _0801F5FA\n\ +_0801EF5C:\n\ + adds r3, r1, 0\n\ + adds r1, r6, 0\n\ +_0801EF60:\n\ + ldrb r0, [r2, 0x5]\n\ + adds r0, 0x1\n\ + strb r0, [r2, 0x5]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x4\n\ + bls _0801EF70\n\ + b _0801F5FA\n\ +_0801EF70:\n\ + ldrb r0, [r2, 0x5]\n\ + lsls r0, 1\n\ + adds r0, r3\n\ + ldrh r0, [r0]\n\ + ldrh r4, [r1]\n\ + cmp r0, r4\n\ + bne _0801EF60\n\ + b _0801F5FA\n\ + .align 2, 0\n\ +_0801EF80: .4byte 0x02000000\n\ +_0801EF84: .4byte 0x00016004\n\ +_0801EF88: .4byte gCurrentMove\n\ +_0801EF8C: .4byte 0x00016005\n\ +_0801EF90: .4byte 0x00016020\n\ +_0801EF94: .4byte gBankAttacker\n\ +_0801EF98: .4byte gBattlescriptCurrInstr\n\ +_0801EF9C: .4byte gMoveEffectBS_Ptrs\n\ +_0801EFA0: .4byte gBattleCommunication\n\ +_0801EFA4: .4byte gTrappingMoves\n\ +_0801EFA8:\n\ + ldr r1, _0801EFD8 @ =gBattleMoveDamage\n\ + ldr r0, _0801EFDC @ =gHP_dealt\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + bge _0801EFB4\n\ + adds r0, 0x3\n\ +_0801EFB4:\n\ + asrs r0, 2\n\ + str r0, [r1]\n\ + cmp r0, 0\n\ + bne _0801EFC0\n\ + movs r0, 0x1\n\ + str r0, [r1]\n\ +_0801EFC0:\n\ + ldr r4, _0801EFE0 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r1, _0801EFE4 @ =gMoveEffectBS_Ptrs\n\ + ldr r0, _0801EFE8 @ =gBattleCommunication\n\ + ldrb r0, [r0, 0x3]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + b _0801F5F8\n\ + .align 2, 0\n\ +_0801EFD8: .4byte gBattleMoveDamage\n\ +_0801EFDC: .4byte gHP_dealt\n\ +_0801EFE0: .4byte gBattlescriptCurrInstr\n\ +_0801EFE4: .4byte gMoveEffectBS_Ptrs\n\ +_0801EFE8: .4byte gBattleCommunication\n\ +_0801EFEC:\n\ + ldrb r1, [r7, 0x3]\n\ + adds r1, 0xF2\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + movs r0, 0x10\n\ + adds r2, r6, 0\n\ + movs r3, 0\n\ + bl ChangeStatBuffs\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0\n\ + beq _0801F008\n\ + b _0801F5DC\n\ +_0801F008:\n\ + ldr r2, _0801F02C @ =0x02000000\n\ + ldrb r1, [r7, 0x3]\n\ + movs r0, 0x3F\n\ + ands r0, r1\n\ + ldr r4, _0801F030 @ =0x000160a4\n\ + adds r1, r2, r4\n\ + strb r0, [r1]\n\ + ldr r0, _0801F034 @ =0x000160a5\n\ + adds r2, r0\n\ + strb r3, [r2]\n\ + ldr r4, _0801F038 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801F03C @ =BattleScript_StatUp\n\ + b _0801F5F8\n\ + .align 2, 0\n\ +_0801F02C: .4byte 0x02000000\n\ +_0801F030: .4byte 0x000160a4\n\ +_0801F034: .4byte 0x000160a5\n\ +_0801F038: .4byte gBattlescriptCurrInstr\n\ +_0801F03C: .4byte BattleScript_StatUp\n\ +_0801F040:\n\ + movs r0, 0x70\n\ + negs r0, r0\n\ + ldrb r1, [r7, 0x3]\n\ + adds r1, 0xEB\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + adds r2, r6, 0\n\ + movs r3, 0\n\ + bl ChangeStatBuffs\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0\n\ + beq _0801F05E\n\ + b _0801F5DC\n\ +_0801F05E:\n\ + ldr r2, _0801F080 @ =0x02000000\n\ + ldrb r1, [r7, 0x3]\n\ + movs r0, 0x3F\n\ + ands r0, r1\n\ + ldr r4, _0801F084 @ =0x000160a4\n\ + adds r1, r2, r4\n\ + strb r0, [r1]\n\ + ldr r0, _0801F088 @ =0x000160a5\n\ + adds r2, r0\n\ + strb r3, [r2]\n\ + ldr r4, _0801F08C @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801F090 @ =BattleScript_StatDown\n\ + b _0801F5F8\n\ + .align 2, 0\n\ +_0801F080: .4byte 0x02000000\n\ +_0801F084: .4byte 0x000160a4\n\ +_0801F088: .4byte 0x000160a5\n\ +_0801F08C: .4byte gBattlescriptCurrInstr\n\ +_0801F090: .4byte BattleScript_StatDown\n\ +_0801F094:\n\ + ldrb r1, [r7, 0x3]\n\ + adds r1, 0xDA\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + movs r0, 0x20\n\ + adds r2, r6, 0\n\ + movs r3, 0\n\ + bl ChangeStatBuffs\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0\n\ + beq _0801F0B0\n\ + b _0801F5DC\n\ +_0801F0B0:\n\ + ldr r2, _0801F0D4 @ =0x02000000\n\ + ldrb r1, [r7, 0x3]\n\ + movs r0, 0x3F\n\ + ands r0, r1\n\ + ldr r4, _0801F0D8 @ =0x000160a4\n\ + adds r1, r2, r4\n\ + strb r0, [r1]\n\ + ldr r0, _0801F0DC @ =0x000160a5\n\ + adds r2, r0\n\ + strb r3, [r2]\n\ + ldr r4, _0801F0E0 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801F0E4 @ =BattleScript_StatUp\n\ + b _0801F5F8\n\ + .align 2, 0\n\ +_0801F0D4: .4byte 0x02000000\n\ +_0801F0D8: .4byte 0x000160a4\n\ +_0801F0DC: .4byte 0x000160a5\n\ +_0801F0E0: .4byte gBattlescriptCurrInstr\n\ +_0801F0E4: .4byte BattleScript_StatUp\n\ +_0801F0E8:\n\ + movs r0, 0x60\n\ + negs r0, r0\n\ + ldrb r1, [r7, 0x3]\n\ + adds r1, 0xD3\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + adds r2, r6, 0\n\ + movs r3, 0\n\ + bl ChangeStatBuffs\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0\n\ + beq _0801F106\n\ + b _0801F5DC\n\ +_0801F106:\n\ + ldr r2, _0801F128 @ =0x02000000\n\ + ldrb r1, [r7, 0x3]\n\ + movs r0, 0x3F\n\ + ands r0, r1\n\ + ldr r4, _0801F12C @ =0x000160a4\n\ + adds r1, r2, r4\n\ + strb r0, [r1]\n\ + ldr r0, _0801F130 @ =0x000160a5\n\ + adds r2, r0\n\ + strb r3, [r2]\n\ + ldr r4, _0801F134 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801F138 @ =BattleScript_StatDown\n\ + b _0801F5F8\n\ + .align 2, 0\n\ +_0801F128: .4byte 0x02000000\n\ +_0801F12C: .4byte 0x000160a4\n\ +_0801F130: .4byte 0x000160a5\n\ +_0801F134: .4byte gBattlescriptCurrInstr\n\ +_0801F138: .4byte BattleScript_StatDown\n\ +_0801F13C:\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + movs r0, 0x58\n\ + adds r2, r1, 0\n\ + muls r2, r0\n\ + mov r0, r9\n\ + adds r0, 0x50\n\ + adds r2, r0\n\ + ldr r0, [r2]\n\ + movs r1, 0x80\n\ + lsls r1, 15\n\ + orrs r0, r1\n\ + str r0, [r2]\n\ + ldr r2, _0801F178 @ =gDisableStructs\n\ + mov r3, r8\n\ + ldrb r1, [r3]\n\ + lsls r0, r1, 3\n\ + subs r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + movs r1, 0x2\n\ + strb r1, [r0, 0x19]\n\ + ldr r1, _0801F17C @ =gLockedMove\n\ + ldrb r0, [r3]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + ldr r1, _0801F180 @ =gCurrentMove\n\ + ldrh r1, [r1]\n\ + strh r1, [r0]\n\ + b _0801F5DC\n\ + .align 2, 0\n\ +_0801F178: .4byte gDisableStructs\n\ +_0801F17C: .4byte gLockedMove\n\ +_0801F180: .4byte gCurrentMove\n\ +_0801F184:\n\ + ldr r0, _0801F1A0 @ =gBankAttacker\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + adds r2, r1, 0\n\ + muls r2, r0\n\ + mov r0, r9\n\ + adds r0, 0x50\n\ + adds r2, r0\n\ + ldr r0, [r2]\n\ + movs r1, 0x80\n\ + lsls r1, 16\n\ +_0801F19A:\n\ + orrs r0, r1\n\ + str r0, [r2]\n\ + b _0801F5DC\n\ + .align 2, 0\n\ +_0801F1A0: .4byte gBankAttacker\n\ +_0801F1A4:\n\ + ldr r4, _0801F254 @ =gBankAttacker\n\ + ldrb r0, [r4]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + ldrb r0, [r4]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _0801F1D8\n\ + ldr r0, _0801F258 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + ldr r0, _0801F25C @ =0x00000902\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0801F214\n\ + ldr r0, _0801F260 @ =gTrainerBattleOpponent\n\ + ldrh r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + cmp r1, r0\n\ + beq _0801F1D8\n\ + b _0801F5DC\n\ +_0801F1D8:\n\ + ldr r0, _0801F258 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + ldr r0, _0801F25C @ =0x00000902\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0801F214\n\ + ldr r0, _0801F260 @ =gTrainerBattleOpponent\n\ + ldrh r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + cmp r1, r0\n\ + beq _0801F214\n\ + ldr r0, _0801F264 @ =gWishFutureKnock\n\ + adds r0, 0x29\n\ + adds r0, r6, r0\n\ + ldrb r1, [r0]\n\ + ldr r3, _0801F268 @ =gBitTable\n\ + ldr r2, _0801F26C @ =gBattlePartyID\n\ + ldr r0, _0801F254 @ =gBankAttacker\n\ + ldrb r0, [r0]\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + ldrh r0, [r0]\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + ldr r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _0801F214\n\ + b _0801F5DC\n\ +_0801F214:\n\ + ldr r2, _0801F270 @ =gBattleMons\n\ + ldr r1, _0801F274 @ =gBankTarget\n\ + ldrb r0, [r1]\n\ + movs r3, 0x58\n\ + muls r0, r3\n\ + adds r4, r0, r2\n\ + ldrh r0, [r4, 0x2E]\n\ + adds r7, r1, 0\n\ + mov r9, r2\n\ + cmp r0, 0\n\ + beq _0801F284\n\ + adds r0, r4, 0\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x3C\n\ + bne _0801F284\n\ + ldr r1, _0801F278 @ =gBattlescriptCurrInstr\n\ + ldr r0, _0801F27C @ =BattleScript_NoItemSteal\n\ + str r0, [r1]\n\ + ldr r1, _0801F280 @ =gLastUsedAbility\n\ + ldrb r0, [r7]\n\ + muls r0, r3\n\ + add r0, r9\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldrb r0, [r7]\n\ + ldrb r1, [r1]\n\ + bl RecordAbilityBattle\n\ + b _0801F5FA\n\ + .align 2, 0\n\ +_0801F254: .4byte gBankAttacker\n\ +_0801F258: .4byte gBattleTypeFlags\n\ +_0801F25C: .4byte 0x00000902\n\ +_0801F260: .4byte gTrainerBattleOpponent\n\ +_0801F264: .4byte gWishFutureKnock\n\ +_0801F268: .4byte gBitTable\n\ +_0801F26C: .4byte gBattlePartyID\n\ +_0801F270: .4byte gBattleMons\n\ +_0801F274: .4byte gBankTarget\n\ +_0801F278: .4byte gBattlescriptCurrInstr\n\ +_0801F27C: .4byte BattleScript_NoItemSteal\n\ +_0801F280: .4byte gLastUsedAbility\n\ +_0801F284:\n\ + ldr r4, _0801F340 @ =gBankAttacker\n\ + mov r10, r4\n\ + ldrb r1, [r4]\n\ + movs r0, 0x58\n\ + mov r8, r0\n\ + mov r0, r8\n\ + muls r0, r1\n\ + add r0, r9\n\ + ldrh r3, [r0, 0x2E]\n\ + cmp r3, 0\n\ + beq _0801F29C\n\ + b _0801F5DC\n\ +_0801F29C:\n\ + ldrb r0, [r7]\n\ + mov r2, r8\n\ + muls r2, r0\n\ + adds r0, r2, 0\n\ + add r0, r9\n\ + ldrh r2, [r0, 0x2E]\n\ + adds r0, r2, 0\n\ + cmp r0, 0xAF\n\ + bne _0801F2B0\n\ + b _0801F5DC\n\ +_0801F2B0:\n\ + cmp r0, 0\n\ + bne _0801F2B6\n\ + b _0801F5DC\n\ +_0801F2B6:\n\ + lsls r0, r1, 1\n\ + ldr r5, _0801F344 @ =0x020160f0\n\ + adds r0, r5\n\ + ldr r1, _0801F348 @ =gLastUsedItem\n\ + strh r2, [r0]\n\ + strh r2, [r1]\n\ + ldrb r0, [r7]\n\ + mov r4, r8\n\ + muls r4, r0\n\ + adds r0, r4, 0\n\ + add r0, r9\n\ + movs r6, 0\n\ + strh r3, [r0, 0x2E]\n\ + ldr r4, _0801F34C @ =gActiveBank\n\ + mov r2, r10\n\ + ldrb r0, [r2]\n\ + strb r0, [r4]\n\ + str r1, [sp]\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + movs r2, 0\n\ + movs r3, 0x2\n\ + bl EmitSetAttributes\n\ + mov r3, r10\n\ + ldrb r0, [r3]\n\ + bl MarkBufferBankForExecution\n\ + ldrb r0, [r7]\n\ + strb r0, [r4]\n\ + ldrb r0, [r7]\n\ + mov r4, r8\n\ + muls r4, r0\n\ + adds r0, r4, 0\n\ + mov r1, r9\n\ + adds r1, 0x2E\n\ + adds r0, r1\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + movs r2, 0\n\ + movs r3, 0x2\n\ + bl EmitSetAttributes\n\ + ldrb r0, [r7]\n\ + bl MarkBufferBankForExecution\n\ + ldr r4, _0801F350 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801F354 @ =BattleScript_ItemSteal\n\ + str r0, [r4]\n\ + ldr r0, _0801F358 @ =0xfffe9f10\n\ + adds r5, r0\n\ + ldrb r0, [r7]\n\ + lsls r0, 1\n\ + ldr r1, _0801F35C @ =0x000160e8\n\ + adds r0, r1\n\ + adds r0, r5\n\ + strb r6, [r0]\n\ + ldrb r0, [r7]\n\ + lsls r0, 1\n\ + ldr r2, _0801F360 @ =0x000160e9\n\ + adds r0, r2\n\ + adds r0, r5\n\ + strb r6, [r0]\n\ + b _0801F5FA\n\ + .align 2, 0\n\ +_0801F340: .4byte gBankAttacker\n\ +_0801F344: .4byte 0x020160f0\n\ +_0801F348: .4byte gLastUsedItem\n\ +_0801F34C: .4byte gActiveBank\n\ +_0801F350: .4byte gBattlescriptCurrInstr\n\ +_0801F354: .4byte BattleScript_ItemSteal\n\ +_0801F358: .4byte 0xfffe9f10\n\ +_0801F35C: .4byte 0x000160e8\n\ +_0801F360: .4byte 0x000160e9\n\ +_0801F364:\n\ + ldr r3, _0801F394 @ =gBankTarget\n\ + ldrb r1, [r3]\n\ + movs r0, 0x58\n\ + adds r2, r1, 0\n\ + muls r2, r0\n\ + mov r0, r9\n\ + adds r0, 0x50\n\ + adds r2, r0\n\ + ldr r0, [r2]\n\ + movs r1, 0x80\n\ + lsls r1, 19\n\ + orrs r0, r1\n\ + str r0, [r2]\n\ + ldr r2, _0801F398 @ =gDisableStructs\n\ + ldrb r1, [r3]\n\ + lsls r0, r1, 3\n\ + subs r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldr r1, _0801F39C @ =gBankAttacker\n\ + ldrb r1, [r1]\n\ + strb r1, [r0, 0x14]\n\ + b _0801F5DC\n\ + .align 2, 0\n\ +_0801F394: .4byte gBankTarget\n\ +_0801F398: .4byte gDisableStructs\n\ +_0801F39C: .4byte gBankAttacker\n\ +_0801F3A0:\n\ + ldr r0, _0801F3B8 @ =gBankTarget\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + adds r2, r1, 0\n\ + muls r2, r0\n\ + mov r0, r9\n\ + adds r0, 0x50\n\ + adds r2, r0\n\ + ldr r0, [r2]\n\ + movs r1, 0x80\n\ + lsls r1, 20\n\ + b _0801F19A\n\ + .align 2, 0\n\ +_0801F3B8: .4byte gBankTarget\n\ +_0801F3BC:\n\ + ldr r4, _0801F3CC @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801F3D0 @ =gUnknown_081D9224\n\ + b _0801F5F8\n\ + .align 2, 0\n\ +_0801F3CC: .4byte gBattlescriptCurrInstr\n\ +_0801F3D0: .4byte gUnknown_081D9224\n\ +_0801F3D4:\n\ + ldr r4, _0801F3E4 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801F3E8 @ =BattleScript_RapidSpinAway\n\ + b _0801F5F8\n\ + .align 2, 0\n\ +_0801F3E4: .4byte gBattlescriptCurrInstr\n\ +_0801F3E8: .4byte BattleScript_RapidSpinAway\n\ +_0801F3EC:\n\ + ldr r6, _0801F43C @ =gBankTarget\n\ + ldrb r0, [r6]\n\ + movs r2, 0x58\n\ + muls r0, r2\n\ + mov r1, r9\n\ + adds r1, 0x4C\n\ + adds r5, r0, r1\n\ + ldr r4, [r5]\n\ + movs r0, 0x40\n\ + ands r0, r4\n\ + cmp r0, 0\n\ + bne _0801F406\n\ + b _0801F5DC\n\ +_0801F406:\n\ + movs r0, 0x41\n\ + negs r0, r0\n\ + ands r4, r0\n\ + str r4, [r5]\n\ + ldr r4, _0801F440 @ =gActiveBank\n\ + ldrb r0, [r6]\n\ + strb r0, [r4]\n\ + ldrb r0, [r4]\n\ + muls r0, r2\n\ + adds r0, r1\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0x28\n\ + movs r2, 0\n\ + movs r3, 0x4\n\ + bl EmitSetAttributes\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + ldr r4, _0801F444 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801F448 @ =BattleScript_TargetPRLZHeal\n\ + b _0801F5F8\n\ + .align 2, 0\n\ +_0801F43C: .4byte gBankTarget\n\ +_0801F440: .4byte gActiveBank\n\ +_0801F444: .4byte gBattlescriptCurrInstr\n\ +_0801F448: .4byte BattleScript_TargetPRLZHeal\n\ +_0801F44C:\n\ + ldr r4, _0801F45C @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801F460 @ =gUnknown_081D93FA\n\ + b _0801F5F8\n\ + .align 2, 0\n\ +_0801F45C: .4byte gBattlescriptCurrInstr\n\ +_0801F460: .4byte gUnknown_081D93FA\n\ +_0801F464:\n\ + ldr r4, _0801F494 @ =gBattleMoveDamage\n\ + ldr r0, _0801F498 @ =gHP_dealt\n\ + ldr r0, [r0]\n\ + movs r1, 0x3\n\ + bl __divsi3\n\ + str r0, [r4]\n\ + cmp r0, 0\n\ + bne _0801F47A\n\ + movs r0, 0x1\n\ + str r0, [r4]\n\ +_0801F47A:\n\ + ldr r4, _0801F49C @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r1, _0801F4A0 @ =gMoveEffectBS_Ptrs\n\ + ldr r0, _0801F4A4 @ =gBattleCommunication\n\ + ldrb r0, [r0, 0x3]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + b _0801F5F8\n\ + .align 2, 0\n\ +_0801F494: .4byte gBattleMoveDamage\n\ +_0801F498: .4byte gHP_dealt\n\ +_0801F49C: .4byte gBattlescriptCurrInstr\n\ +_0801F4A0: .4byte gMoveEffectBS_Ptrs\n\ +_0801F4A4: .4byte gBattleCommunication\n\ +_0801F4A8:\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + movs r5, 0x58\n\ + muls r0, r5\n\ + mov r4, r9\n\ + adds r4, 0x50\n\ + adds r2, r0, r4\n\ + ldr r1, [r2]\n\ + movs r0, 0xC0\n\ + lsls r0, 4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801F4C4\n\ + b _0801F5DC\n\ +_0801F4C4:\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + orrs r1, r0\n\ + str r1, [r2]\n\ + ldr r1, _0801F4F8 @ =gLockedMove\n\ + ldrb r0, [r3]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + ldr r1, _0801F4FC @ =gCurrentMove\n\ + ldrh r1, [r1]\n\ + strh r1, [r0]\n\ + bl Random\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + adds r2, r1, 0\n\ + muls r2, r5\n\ + adds r2, r4\n\ + movs r1, 0x1\n\ + ands r1, r0\n\ + adds r1, 0x2\n\ + lsls r1, 10\n\ + ldr r0, [r2]\n\ +_0801F4F2:\n\ + orrs r0, r1\n\ + str r0, [r2]\n\ + b _0801F5FA\n\ + .align 2, 0\n\ +_0801F4F8: .4byte gLockedMove\n\ +_0801F4FC: .4byte gCurrentMove\n\ +_0801F500:\n\ + mov r5, r8\n\ + ldrb r3, [r5]\n\ + movs r4, 0x58\n\ + adds r0, r3, 0\n\ + muls r0, r4\n\ + mov r2, r9\n\ + adds r1, r0, r2\n\ + adds r0, r1, 0\n\ + adds r0, 0x20\n\ + ldrb r2, [r0]\n\ + cmp r2, 0x3C\n\ + bne _0801F540\n\ + ldrh r0, [r1, 0x2E]\n\ + cmp r0, 0\n\ + beq _0801F5DC\n\ + ldr r0, _0801F534 @ =gLastUsedAbility\n\ + strb r2, [r0]\n\ + ldr r1, _0801F538 @ =gBattlescriptCurrInstr\n\ + ldr r0, _0801F53C @ =BattleScript_NoItemSteal\n\ + str r0, [r1]\n\ + ldrb r0, [r5]\n\ + movs r1, 0x3C\n\ + bl RecordAbilityBattle\n\ + b _0801F5FA\n\ + .align 2, 0\n\ +_0801F534: .4byte gLastUsedAbility\n\ +_0801F538: .4byte gBattlescriptCurrInstr\n\ +_0801F53C: .4byte BattleScript_NoItemSteal\n\ +_0801F540:\n\ + ldrh r0, [r1, 0x2E]\n\ + cmp r0, 0\n\ + beq _0801F5DC\n\ + adds r0, r3, 0\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + ldr r1, _0801F5B8 @ =gLastUsedItem\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + muls r0, r4\n\ + add r0, r9\n\ + ldrh r0, [r0, 0x2E]\n\ + strh r0, [r1]\n\ + ldrb r0, [r3]\n\ + muls r0, r4\n\ + add r0, r9\n\ + movs r5, 0\n\ + movs r1, 0\n\ + strh r1, [r0, 0x2E]\n\ + ldr r2, _0801F5BC @ =gWishFutureKnock\n\ + adds r2, 0x29\n\ + adds r2, r6, r2\n\ + ldr r3, _0801F5C0 @ =gBitTable\n\ + ldr r1, _0801F5C4 @ =gBattlePartyID\n\ + mov r4, r8\n\ + ldrb r0, [r4]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + ldrh r0, [r0]\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + ldr r0, [r0]\n\ + ldrb r1, [r2]\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r4, _0801F5C8 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801F5CC @ =BattleScript_KnockedOff\n\ + str r0, [r4]\n\ + ldr r1, _0801F5D0 @ =0x02000000\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + lsls r0, 1\n\ + ldr r3, _0801F5D4 @ =0x000160e8\n\ + adds r0, r3\n\ + adds r0, r1\n\ + strb r5, [r0]\n\ + ldrb r0, [r2]\n\ + lsls r0, 1\n\ + ldr r4, _0801F5D8 @ =0x000160e9\n\ + adds r0, r4\n\ + adds r0, r1\n\ + strb r5, [r0]\n\ + b _0801F5FA\n\ + .align 2, 0\n\ +_0801F5B8: .4byte gLastUsedItem\n\ +_0801F5BC: .4byte gWishFutureKnock\n\ +_0801F5C0: .4byte gBitTable\n\ +_0801F5C4: .4byte gBattlePartyID\n\ +_0801F5C8: .4byte gBattlescriptCurrInstr\n\ +_0801F5CC: .4byte BattleScript_KnockedOff\n\ +_0801F5D0: .4byte 0x02000000\n\ +_0801F5D4: .4byte 0x000160e8\n\ +_0801F5D8: .4byte 0x000160e9\n\ +_0801F5DC:\n\ + ldr r1, _0801F5E8 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x1\n\ + str r0, [r1]\n\ + b _0801F5FA\n\ + .align 2, 0\n\ +_0801F5E8: .4byte gBattlescriptCurrInstr\n\ +_0801F5EC:\n\ + ldr r4, _0801F60C @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801F610 @ =gUnknown_081D94B0\n\ +_0801F5F8:\n\ + str r0, [r4]\n\ +_0801F5FA:\n\ + add sp, 0x8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0801F60C: .4byte gBattlescriptCurrInstr\n\ +_0801F610: .4byte gUnknown_081D94B0\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +static void atk15_seteffectwithchancetarget(void) +{ + u32 PercentChance; + if (gBattleMons[gBankAttacker].ability == ABILITY_SERENE_GRACE) + PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance * 2; + else + PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance; + if (gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80 && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) + { + gBattleCommunication[MOVE_EFFECT_BYTE] &= 0x7F; + SetMoveEffect(0, 0x80); + } + else if (Random() % 100 <= PercentChance && gBattleCommunication[MOVE_EFFECT_BYTE] && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) + { + if (PercentChance >= 100) + SetMoveEffect(0, 0x80); + else + SetMoveEffect(0, 0); + } + else + gBattlescriptCurrInstr++; + gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + BATTLE_STRUCT->filler2[0x3E] = 0; //TODO: to fix this later +} + +static void atk16_seteffectprimary(void) +{ + SetMoveEffect(1, 0); +} + +static void atk17_seteffectsecondary(void) +{ + SetMoveEffect(0, 0); +} + +static void atk18_status_effect_clear(void) +{ + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) + gBattleMons[gActiveBank].status1 &= (~gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); + else + gBattleMons[gActiveBank].status2 &= (~gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); + + gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + gBattlescriptCurrInstr += 2; + BATTLE_STRUCT->filler2[0x3E] = 0; //TODO: to fix this later +} + +//Fuck this, Maybe later +__attribute__((naked)) +static void atk19_faint_pokemon(void) +{ + asm(".syntax unified\n\ +push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + ldr r0, _0801F81C @ =gBattlescriptCurrInstr\n\ + ldr r2, [r0]\n\ + ldrb r1, [r2, 0x2]\n\ + adds r6, r0, 0\n\ + cmp r1, 0\n\ + beq _0801F834\n\ + ldrb r0, [r2, 0x1]\n\ + bl GetBattleBank\n\ + ldr r5, _0801F820 @ =gActiveBank\n\ + strb r0, [r5]\n\ + ldr r2, _0801F824 @ =gHitMarker\n\ + ldr r1, _0801F828 @ =gBitTable\n\ + ldrb r0, [r5]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ + lsls r1, 28\n\ + ldr r0, [r2]\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0801F7E6\n\ + b _0801FB1C\n\ +_0801F7E6:\n\ + ldr r1, [r6]\n\ + ldrb r4, [r1, 0x3]\n\ + ldrb r0, [r1, 0x4]\n\ + lsls r0, 8\n\ + orrs r4, r0\n\ + ldrb r0, [r1, 0x5]\n\ + lsls r0, 16\n\ + orrs r4, r0\n\ + ldrb r0, [r1, 0x6]\n\ + lsls r0, 24\n\ + orrs r4, r0\n\ + bl b_movescr_stack_pop_cursor\n\ + str r4, [r6]\n\ + ldrb r0, [r5]\n\ + bl GetBankSide\n\ + ldr r1, _0801F82C @ =gSideAffecting\n\ + lsls r0, 24\n\ + lsrs r0, 23\n\ + adds r0, r1\n\ + ldrh r2, [r0]\n\ + ldr r1, _0801F830 @ =0x0000fdff\n\ + ands r1, r2\n\ + strh r1, [r0]\n\ + b _0801FB22\n\ + .align 2, 0\n\ +_0801F81C: .4byte gBattlescriptCurrInstr\n\ +_0801F820: .4byte gActiveBank\n\ +_0801F824: .4byte gHitMarker\n\ +_0801F828: .4byte gBitTable\n\ +_0801F82C: .4byte gSideAffecting\n\ +_0801F830: .4byte 0x0000fdff\n\ +_0801F834:\n\ + ldrb r0, [r2, 0x1]\n\ + cmp r0, 0x1\n\ + bne _0801F85C\n\ + ldr r1, _0801F84C @ =gActiveBank\n\ + ldr r0, _0801F850 @ =gBankAttacker\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldr r0, _0801F854 @ =gBankTarget\n\ + ldrb r7, [r0]\n\ + ldr r4, _0801F858 @ =gUnknown_081D8C58\n\ + b _0801F86A\n\ + .align 2, 0\n\ +_0801F84C: .4byte gActiveBank\n\ +_0801F850: .4byte gBankAttacker\n\ +_0801F854: .4byte gBankTarget\n\ +_0801F858: .4byte gUnknown_081D8C58\n\ +_0801F85C:\n\ + ldr r1, _0801F954 @ =gActiveBank\n\ + ldr r0, _0801F958 @ =gBankTarget\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldr r0, _0801F95C @ =gBankAttacker\n\ + ldrb r7, [r0]\n\ + ldr r4, _0801F960 @ =gUnknown_081D8C65\n\ +_0801F86A:\n\ + ldr r0, _0801F964 @ =gAbsentBankFlags\n\ + ldrb r1, [r0]\n\ + ldr r0, _0801F968 @ =gBitTable\n\ + mov r12, r0\n\ + ldr r2, _0801F954 @ =gActiveBank\n\ + mov r8, r2\n\ + ldrb r2, [r2]\n\ + lsls r0, r2, 2\n\ + add r0, r12\n\ + ldr r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _0801F886\n\ + b _0801FB1C\n\ +_0801F886:\n\ + ldr r3, _0801F96C @ =gBattleMons\n\ + mov r10, r3\n\ + movs r5, 0x58\n\ + mov r9, r5\n\ + mov r0, r9\n\ + muls r0, r2\n\ + add r0, r10\n\ + ldrh r3, [r0, 0x28]\n\ + cmp r3, 0\n\ + beq _0801F89C\n\ + b _0801FB1C\n\ +_0801F89C:\n\ + ldr r2, _0801F970 @ =0x02000000\n\ + lsls r1, r7, 1\n\ + ldr r5, _0801F974 @ =0x000160ac\n\ + adds r0, r1, r5\n\ + adds r0, r2\n\ + strb r3, [r0]\n\ + ldr r0, _0801F978 @ =0x000160ad\n\ + adds r1, r0\n\ + adds r1, r2\n\ + strb r3, [r1]\n\ + lsls r1, r7, 2\n\ + adds r5, 0x54\n\ + adds r0, r1, r5\n\ + adds r0, r2\n\ + strb r3, [r0]\n\ + adds r5, 0x1\n\ + adds r0, r1, r5\n\ + adds r0, r2\n\ + strb r3, [r0]\n\ + adds r5, 0x1\n\ + adds r0, r1, r5\n\ + adds r0, r2\n\ + strb r3, [r0]\n\ + ldr r0, _0801F97C @ =0x00016103\n\ + adds r1, r0\n\ + adds r1, r2\n\ + strb r3, [r1]\n\ + ldr r5, _0801F980 @ =gHitMarker\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + lsls r0, 2\n\ + add r0, r12\n\ + ldr r1, [r0]\n\ + lsls r1, 28\n\ + ldr r0, [r5]\n\ + orrs r0, r1\n\ + str r0, [r5]\n\ + ldr r0, [r6]\n\ + adds r0, 0x7\n\ + bl b_movescr_stack_push\n\ + str r4, [r6]\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0801F9B0\n\ + ldr r0, [r5]\n\ + movs r1, 0x80\n\ + lsls r1, 15\n\ + orrs r0, r1\n\ + str r0, [r5]\n\ + ldr r1, _0801F984 @ =gBattleResults\n\ + ldrb r0, [r1]\n\ + cmp r0, 0xFE\n\ + bhi _0801F914\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ +_0801F914:\n\ + mov r0, r9\n\ + muls r0, r7\n\ + add r0, r10\n\ + adds r3, r0, 0\n\ + adds r3, 0x2A\n\ + mov r4, r8\n\ + ldrb r2, [r4]\n\ + mov r0, r9\n\ + muls r0, r2\n\ + add r0, r10\n\ + adds r1, r0, 0\n\ + adds r1, 0x2A\n\ + ldrb r0, [r3]\n\ + ldrb r5, [r1]\n\ + cmp r0, r5\n\ + bls _0801F9CC\n\ + ldrb r1, [r1]\n\ + subs r0, r1\n\ + cmp r0, 0x1D\n\ + ble _0801F990\n\ + ldr r1, _0801F988 @ =gBattlePartyID\n\ + lsls r0, r2, 1\n\ + adds r0, r1\n\ + ldrh r1, [r0]\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + ldr r1, _0801F98C @ =gPlayerParty\n\ + adds r0, r1\n\ + movs r1, 0x8\n\ + bl AdjustFriendship\n\ + b _0801F9CC\n\ + .align 2, 0\n\ +_0801F954: .4byte gActiveBank\n\ +_0801F958: .4byte gBankTarget\n\ +_0801F95C: .4byte gBankAttacker\n\ +_0801F960: .4byte gUnknown_081D8C65\n\ +_0801F964: .4byte gAbsentBankFlags\n\ +_0801F968: .4byte gBitTable\n\ +_0801F96C: .4byte gBattleMons\n\ +_0801F970: .4byte 0x02000000\n\ +_0801F974: .4byte 0x000160ac\n\ +_0801F978: .4byte 0x000160ad\n\ +_0801F97C: .4byte 0x00016103\n\ +_0801F980: .4byte gHitMarker\n\ +_0801F984: .4byte gBattleResults\n\ +_0801F988: .4byte gBattlePartyID\n\ +_0801F98C: .4byte gPlayerParty\n\ +_0801F990:\n\ + ldr r1, _0801F9A8 @ =gBattlePartyID\n\ + lsls r0, r2, 1\n\ + adds r0, r1\n\ + ldrh r1, [r0]\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + ldr r1, _0801F9AC @ =gPlayerParty\n\ + adds r0, r1\n\ + movs r1, 0x6\n\ + bl AdjustFriendship\n\ + b _0801F9CC\n\ + .align 2, 0\n\ +_0801F9A8: .4byte gBattlePartyID\n\ +_0801F9AC: .4byte gPlayerParty\n\ +_0801F9B0:\n\ + ldr r1, _0801FAE0 @ =gBattleResults\n\ + ldrb r0, [r1, 0x1]\n\ + cmp r0, 0xFE\n\ + bhi _0801F9BC\n\ + adds r0, 0x1\n\ + strb r0, [r1, 0x1]\n\ +_0801F9BC:\n\ + ldr r2, _0801FAE4 @ =gActiveBank\n\ + ldrb r0, [r2]\n\ + mov r3, r9\n\ + muls r3, r0\n\ + adds r0, r3, 0\n\ + add r0, r10\n\ + ldrh r0, [r0]\n\ + strh r0, [r1, 0x20]\n\ +_0801F9CC:\n\ + ldr r0, _0801FAE8 @ =gHitMarker\n\ + ldr r0, [r0]\n\ + movs r1, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0801FA02\n\ + ldr r6, _0801FAEC @ =gBattleMons\n\ + ldr r0, _0801FAF0 @ =gBankAttacker\n\ + ldrb r0, [r0]\n\ + movs r5, 0x58\n\ + muls r0, r5\n\ + adds r0, r6\n\ + ldrh r0, [r0, 0x28]\n\ + cmp r0, 0\n\ + beq _0801FA02\n\ + ldr r4, _0801FAF4 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + bl b_movescr_stack_push\n\ + ldr r1, _0801FAF8 @ =gBattleMoveDamage\n\ + adds r0, r7, 0\n\ + muls r0, r5\n\ + adds r0, r6\n\ + ldrh r0, [r0, 0x28]\n\ + str r0, [r1]\n\ + ldr r0, _0801FAFC @ =gUnknown_081D9156\n\ + str r0, [r4]\n\ +_0801FA02:\n\ + ldr r1, _0801FB00 @ =gStatuses3\n\ + ldr r6, _0801FB04 @ =gBankTarget\n\ + ldrb r0, [r6]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + movs r1, 0x80\n\ + lsls r1, 7\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0801FA1A\n\ + b _0801FB22\n\ +_0801FA1A:\n\ + ldr r0, _0801FAE8 @ =gHitMarker\n\ + ldr r5, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 17\n\ + ands r5, r0\n\ + cmp r5, 0\n\ + bne _0801FB22\n\ + ldr r4, _0801FAF0 @ =gBankAttacker\n\ + mov r8, r4\n\ + ldrb r0, [r4]\n\ + bl GetBankSide\n\ + adds r4, r0, 0\n\ + ldrb r0, [r6]\n\ + bl GetBankSide\n\ + lsls r4, 24\n\ + lsls r0, 24\n\ + cmp r4, r0\n\ + beq _0801FB22\n\ + ldr r0, _0801FAEC @ =gBattleMons\n\ + mov r9, r0\n\ + mov r1, r8\n\ + ldrb r2, [r1]\n\ + movs r7, 0x58\n\ + adds r3, r2, 0\n\ + muls r3, r7\n\ + adds r0, r3, r0\n\ + ldrh r0, [r0, 0x28]\n\ + cmp r0, 0\n\ + beq _0801FB22\n\ + ldr r0, _0801FB08 @ =gCurrentMove\n\ + ldrh r0, [r0]\n\ + cmp r0, 0xA5\n\ + beq _0801FB22\n\ + ldr r1, _0801FB0C @ =0x02000000\n\ + ldr r4, _0801FB10 @ =0x0001608c\n\ + adds r0, r2, r4\n\ + adds r0, r1\n\ + ldrb r4, [r0]\n\ + adds r0, r4, r3\n\ + mov r6, r9\n\ + adds r6, 0x24\n\ + adds r0, r6\n\ + strb r5, [r0]\n\ + ldr r5, _0801FAF4 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r5]\n\ + bl b_movescr_stack_push\n\ + ldr r0, _0801FB14 @ =gUnknown_081D9468\n\ + str r0, [r5]\n\ + ldr r5, _0801FAE4 @ =gActiveBank\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + strb r0, [r5]\n\ + adds r1, r4, 0\n\ + adds r1, 0x9\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + ldrb r0, [r5]\n\ + muls r0, r7\n\ + adds r0, r6\n\ + adds r0, r4\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r2, 0\n\ + movs r3, 0x1\n\ + bl EmitSetAttributes\n\ + ldrb r0, [r5]\n\ + bl MarkBufferBankForExecution\n\ + ldr r1, _0801FB18 @ =gBattleTextBuff1\n\ + movs r0, 0xFD\n\ + strb r0, [r1]\n\ + movs r0, 0x2\n\ + strb r0, [r1, 0x1]\n\ + lsls r4, 1\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + muls r0, r7\n\ + adds r0, r4, r0\n\ + mov r2, r9\n\ + adds r2, 0xC\n\ + adds r0, r2\n\ + ldrh r0, [r0]\n\ + strb r0, [r1, 0x2]\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + muls r0, r7\n\ + adds r4, r0\n\ + adds r4, r2\n\ + ldrh r0, [r4]\n\ + lsrs r0, 8\n\ + strb r0, [r1, 0x3]\n\ + movs r0, 0xFF\n\ + strb r0, [r1, 0x4]\n\ + b _0801FB22\n\ + .align 2, 0\n\ +_0801FAE0: .4byte gBattleResults\n\ +_0801FAE4: .4byte gActiveBank\n\ +_0801FAE8: .4byte gHitMarker\n\ +_0801FAEC: .4byte gBattleMons\n\ +_0801FAF0: .4byte gBankAttacker\n\ +_0801FAF4: .4byte gBattlescriptCurrInstr\n\ +_0801FAF8: .4byte gBattleMoveDamage\n\ +_0801FAFC: .4byte gUnknown_081D9156\n\ +_0801FB00: .4byte gStatuses3\n\ +_0801FB04: .4byte gBankTarget\n\ +_0801FB08: .4byte gCurrentMove\n\ +_0801FB0C: .4byte 0x02000000\n\ +_0801FB10: .4byte 0x0001608c\n\ +_0801FB14: .4byte gUnknown_081D9468\n\ +_0801FB18: .4byte gBattleTextBuff1\n\ +_0801FB1C:\n\ + ldr r0, [r6]\n\ + adds r0, 0x7\n\ + str r0, [r6]\n\ +_0801FB22:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} + +static void atk1A_faint_animation(void) +{ + if (gBattleExecBuffer == 0) + { + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + EmitFaintAnimation(0); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 2; + } +} + +static void atk1B_faint_effects_clear(void) +{ + //Clears things like attraction or trapping to other banks + if (gBattleExecBuffer == 0) + { + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gBattleMons[gActiveBank].status1 = 0; + EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBank].status1); + MarkBufferBankForExecution(gActiveBank); + UndoEffectsAfterFainting(); + gBattlescriptCurrInstr += 2; + } +} + +static void atk1C_jumpifstatus(void) +{ + u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + u32 flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2); + void* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6); + if (gBattleMons[bank].status1 & flags && gBattleMons[bank].hp) + gBattlescriptCurrInstr = jump_loc; + else + gBattlescriptCurrInstr += 10; +} + +static void atk1D_jumpifstatus2(void) +{ + u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + u32 flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2); + void* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6); + if (gBattleMons[bank].status2 & flags && gBattleMons[bank].hp) + gBattlescriptCurrInstr = jump_loc; + else + gBattlescriptCurrInstr += 10; +} + +static void atk1E_jumpifability(void) +{ + u8 bank; + u8 ability = BSScriptRead8(gBattlescriptCurrInstr + 2); + void* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3); + if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 8) + { + bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_BANK_SIDE, gBankAttacker, ability, 0, 0); + if (bank) + { + gLastUsedAbility = ability; + gBattlescriptCurrInstr = jump_loc; + RecordAbilityBattle(bank -1, gLastUsedAbility); + unk_2000000[0x160f8] = bank - 1; + } + else + gBattlescriptCurrInstr += 7; + } + else if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 9) + { + bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBankAttacker, ability, 0, 0); + if (bank) + { + gLastUsedAbility = ability; + gBattlescriptCurrInstr = jump_loc; + RecordAbilityBattle(bank - 1, gLastUsedAbility); + unk_2000000[0x160f8] = bank - 1; + } + else + gBattlescriptCurrInstr += 7; + } + else + { + bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + if (gBattleMons[bank].ability == ability) + { + gLastUsedAbility = ability; + gBattlescriptCurrInstr = jump_loc; + RecordAbilityBattle(bank, gLastUsedAbility); + unk_2000000[0x160f8] = bank; + } + else + gBattlescriptCurrInstr += 7; + } +} + +static void atk1F_jumpifsideaffecting(void) +{ + u8 side; + u16 flags; + void* jump_loc; + if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 1) + side = GetBankIdentity(gBankAttacker) & 1; + else + side = GetBankIdentity(gBankTarget) & 1; + + flags = BS2ScriptRead16(gBattlescriptCurrInstr + 2); + jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 4); + + if (gSideAffecting[side] & flags) + gBattlescriptCurrInstr = jump_loc; + else + gBattlescriptCurrInstr += 8; +} + +static void atk20_jumpifstat(void) +{ + u8 ret = 0; + u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + u8 value = gBattleMons[bank].statStages[BSScriptRead8(gBattlescriptCurrInstr + 3)]; + switch (BSScriptRead8(gBattlescriptCurrInstr + 2)) + { + case CMP_EQUAL: + if (value == BSScriptRead8(gBattlescriptCurrInstr + 4)) + ret++; + break; + case CMP_NOT_EQUAL: + if (value != BSScriptRead8(gBattlescriptCurrInstr + 4)) + ret++; + break; + case CMP_GREATER_THAN: + if (value > BSScriptRead8(gBattlescriptCurrInstr + 4)) + ret++; + break; + case CMP_LESS_THAN: + if (value < BSScriptRead8(gBattlescriptCurrInstr + 4)) + ret++; + break; + case CMP_COMMON_BITS: + if (value & BSScriptRead8(gBattlescriptCurrInstr + 4)) + ret++; + break; + case CMP_NO_COMMON_BITS: + if (!(value & BSScriptRead8(gBattlescriptCurrInstr + 4))) + ret++; + break; + } + if (ret) + gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); + else + gBattlescriptCurrInstr += 9; +} + +static void atk21_jumpifstatus3(void) +{ + u32 flags; + void* jump_loc; + + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2); + jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 7); + if (BSScriptRead8(gBattlescriptCurrInstr + 6)) + { + if ((gStatuses3[gActiveBank] & flags) != 0) + gBattlescriptCurrInstr += 11; + else + gBattlescriptCurrInstr = jump_loc; + } + else + { + if ((gStatuses3[gActiveBank] & flags) != 0) + gBattlescriptCurrInstr = jump_loc; + else + gBattlescriptCurrInstr += 11; + } +} + +static void atk22_jumpiftype(void) //u8 bank, u8 type, *ptr +{ + u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + u8 type = BSScriptRead8(gBattlescriptCurrInstr + 2); + void* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3); + + if (gBattleMons[bank].type1 == type || gBattleMons[bank].type2 == type) + gBattlescriptCurrInstr = jump_loc; + else + gBattlescriptCurrInstr += 7; +} + +//here we go again... +#ifdef NONMATCHING +static void atk23_getexp(void) +{ + u8 hold_effect; + int via_expshare = 0, sent_in; + u16* exp = &BATTLE_STRUCT->exp; + gBank1 = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + sent_in = gSentPokesToOpponent[(gBank1 & 2) >> 1]; + switch (BATTLE_STRUCT->atk23StateTracker) + { + case 0: //check if should receive exp at all + if (GetBankSide(gBank1) != 1 || (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) + BATTLE_STRUCT->atk23StateTracker = 6; //goto last case + else + { + BATTLE_STRUCT->atk23StateTracker++; + unk_2000000[0x16113] |= gBitTable[gBattlePartyID[gBank1]]; + } + break; + case 1: //calculate experience points to redistribute + { + int via_sent_in = 0, i; + u16 calculatedExp; + for (i = 0; i < 6; i++) + { + u16 item; + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == 0 || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) + continue; + if (gBitTable[i] & sent_in) + via_sent_in++; + + item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + if (item == ITEM_ENIGMA_BERRY) + hold_effect = gSaveBlock1.enigmaBerry.holdEffect; + else + hold_effect = ItemId_GetHoldEffect(item); + + if (hold_effect == HOLD_EFFECT_EXP_SHARE) + via_expshare++; + } + calculatedExp = gBaseStats[gBattleMons[gBank1].species].expYield * gBattleMons[gBank1].level / 7; + if (via_expshare) //at least one poke is getting exp via exp share + { + calculatedExp /= 2; + *exp = calculatedExp / via_sent_in; + if (*exp == 0) + *exp = 1; + + gExpShareExp = calculatedExp / via_expshare; + if (gExpShareExp == 0) + gExpShareExp = 1; + } + else + { + *exp = calculatedExp / via_sent_in; + if (*exp == 0) + *exp = 1; + gExpShareExp = 0; + } + BATTLE_STRUCT->atk23StateTracker++; + BATTLE_STRUCT->expGetterID = 0; + BATTLE_STRUCT->sentInPokes = sent_in; + } //no break statement + case 2: //loop; set exp value to the poke in expgetter_id and print message + if (gBattleExecBuffer == 0) + { + u16 item = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HELD_ITEM); + u8* tracker; u32 zero; + if (item == ITEM_ENIGMA_BERRY) + hold_effect = gSaveBlock1.enigmaBerry.holdEffect; + else + hold_effect = ItemId_GetHoldEffect(item); + + if ((hold_effect != HOLD_EFFECT_EXP_SHARE && !(BATTLE_STRUCT->sentInPokes & 1))) + { + BATTLE_STRUCT->sentInPokes >>= 1; + tracker = &BATTLE_STRUCT->atk23StateTracker; + zero = 0; + goto LABEL; + } + else if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) == 100) + { + + BATTLE_STRUCT->sentInPokes >>= 1; + tracker = &BATTLE_STRUCT->atk23StateTracker; + zero = 0; + LABEL: + *tracker = 5; //increment looper + gBattleMoveDamage = zero; //used for exp + } + else + { + //music change in wild battle after fainting a poke + if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !BATTLE_STRUCT->wildVictorySong) + { + BattleMusicStop(); + PlayBGM(0x161); + BATTLE_STRUCT->wildVictorySong++; + } + + if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP)) + { + s16 stringID; + if (BATTLE_STRUCT->sentInPokes & 1) + gBattleMoveDamage = *exp; + else + gBattleMoveDamage = 0; + + if (hold_effect == HOLD_EFFECT_EXP_SHARE) + gBattleMoveDamage += gExpShareExp; + if (hold_effect == HOLD_EFFECT_LUCKY_EGG) + gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; + + if (IsTradedMon(&gPlayerParty[BATTLE_STRUCT->expGetterID])) + { + gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; + stringID = 0x14A; + } + else + stringID = 0x149; + + //get exp getter bank + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + if (!(gBattlePartyID[2] != BATTLE_STRUCT->expGetterID) && !(gAbsentBankFlags & gBitTable[2])) + BATTLE_STRUCT->expGetterBank = 2; + else + { + if (!(gAbsentBankFlags & gBitTable[0])) + BATTLE_STRUCT->expGetterBank = 0; + else + BATTLE_STRUCT->expGetterBank = 2; + } + } + else + BATTLE_STRUCT->expGetterBank = 0; + + //buffer poke name + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 4; + gBattleTextBuff1[2] = BATTLE_STRUCT->expGetterBank; + gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID; + gBattleTextBuff1[4] = 0xFF; + + //buffer 'gained' or 'gained a boosted' + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 0; + gBattleTextBuff2[2] = sBYTE0_32(stringID); + gBattleTextBuff2[3] = sBYTE1_32(stringID); + gBattleTextBuff2[4] = 0xFF; + + //buffer exp number + gBattleTextBuff3[0] = 0xFD; + gBattleTextBuff3[1] = 1; + gBattleTextBuff3[2] = 4; //word + gBattleTextBuff3[3] = 5; //max digits + gBattleTextBuff3[4] = gBattleMoveDamage; + gBattleTextBuff3[5] = sBYTE1_32(gBattleMoveDamage); + gBattleTextBuff3[6] = sBYTE2_32(gBattleMoveDamage); + gBattleTextBuff3[7] = sBYTE3_32(gBattleMoveDamage); + gBattleTextBuff3[8] = 0xFF; + + PrepareStringBattle(0xD, BATTLE_STRUCT->expGetterBank); + MonGainEVs(&gPlayerParty[BATTLE_STRUCT->expGetterID], gBattleMons[gBank1].species); + } + BATTLE_STRUCT->sentInPokes >>= 1; + BATTLE_STRUCT->atk23StateTracker++; + } + } + break; + case 3: //Set Stats and give exp + if (gBattleExecBuffer == 0) + { + gBattleBufferB[BATTLE_STRUCT->expGetterBank][0] = 0; + if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) != 100) + { + BATTLE_STRUCT->beforeLvlUp[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); //doesnt match + BATTLE_STRUCT->beforeLvlUp[1] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); + BATTLE_STRUCT->beforeLvlUp[2] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); + BATTLE_STRUCT->beforeLvlUp[3] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); + BATTLE_STRUCT->beforeLvlUp[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); + BATTLE_STRUCT->beforeLvlUp[5] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF); + + gActiveBank = BATTLE_STRUCT->expGetterBank; + EmitExpBarUpdate(0, BATTLE_STRUCT->expGetterID, gBattleMoveDamage); + MarkBufferBankForExecution(gActiveBank); + } + BATTLE_STRUCT->atk23StateTracker++; + } + break; + case 4: //lvl up if necessary + if (gBattleExecBuffer == 0) + { + gActiveBank = BATTLE_STRUCT->expGetterBank; + if (gBattleBufferB[gActiveBank][0] == 0x21 && gBattleBufferB[gActiveBank][1] == 0xB) + { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID) + sub_80324F8(&gPlayerParty[gActiveBank], gActiveBank); + + //buff poke name + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 4; + gBattleTextBuff1[2] = gActiveBank; + gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID; + gBattleTextBuff1[4] = 0xFF; + + //buff level + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 1; + gBattleTextBuff2[2] = 1; + gBattleTextBuff2[3] = 3; + gBattleTextBuff2[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL); + gBattleTextBuff2[5] = 0xFF; + + b_movescr_stack_push_cursor(); + gLeveledUpInBattle |= gBitTable[BATTLE_STRUCT->expGetterID]; + gBattlescriptCurrInstr = BattleScript_LevelUp; + gBattleMoveDamage = (gBattleBufferB[gActiveBank][2] | (gBattleBufferB[gActiveBank][3] << 8)); + AdjustFriendship(&gPlayerParty[BATTLE_STRUCT->expGetterID], 0); + + //update battle mon structure after level up + if (gBattlePartyID[0] == BATTLE_STRUCT->expGetterID && gBattleMons[0].hp) + { + gBattleMons[0].level = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL); + gBattleMons[0].hp = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP); + gBattleMons[0].maxHP = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); + gBattleMons[0].attack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); + gBattleMons[0].defense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); + gBattleMons[0].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); + gBattleMons[0].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); + gBattleMons[0].spDefense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF); + } + //What is else if? Guess it's too advanced for GameFreak + if (gBattlePartyID[2] == BATTLE_STRUCT->expGetterID && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + gBattleMons[2].level = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL); + gBattleMons[2].hp = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP); + gBattleMons[2].maxHP = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); + gBattleMons[2].attack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); + gBattleMons[2].defense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); + //There are no words...GF can't even copy&paste code properly + gBattleMons[2].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); + gBattleMons[2].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD /*RIP*/); + gBattleMons[2].spDefense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); + } + BATTLE_STRUCT->atk23StateTracker = 5; + } + else + { + gBattleMoveDamage = 0; + BATTLE_STRUCT->atk23StateTracker = 5; + } + } + break; + case 5: //looper increment + if (gBattleMoveDamage) //there is exp to give, goto case 3 that gives exp + BATTLE_STRUCT->atk23StateTracker = 3; + else + { + if (++BATTLE_STRUCT->expGetterID <= 5) + BATTLE_STRUCT->atk23StateTracker = 2; //loop again + else + BATTLE_STRUCT->atk23StateTracker = 6; //we're done + } + break; + case 6: //increment instruction + if (gBattleExecBuffer == 0) + { + //not even sure why gamefreak clears that data in this place + gBattleMons[gBank1].item = 0; + gBattleMons[gBank1].ability = 0; + gBattlescriptCurrInstr += 2; + } + break; + } +} +#else +__attribute__((naked)) +static void atk23_getexp(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + movs r6, 0\n\ + ldr r0, _0802004C @ =0x0201605c\n\ + mov r10, r0\n\ + ldr r0, _08020050 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r0]\n\ + ldrb r0, [r0, 0x1]\n\ + bl GetBattleBank\n\ + ldr r1, _08020054 @ =gBank1\n\ + strb r0, [r1]\n\ + ldr r2, _08020058 @ =gSentPokesToOpponent\n\ + movs r1, 0x2\n\ + ands r1, r0\n\ + lsls r1, 24\n\ + lsrs r1, 25\n\ + adds r1, r2\n\ + ldrb r1, [r1]\n\ + mov r8, r1\n\ + mov r0, r10\n\ + subs r0, 0x4D\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x6\n\ + bls _08020040\n\ + bl _08020996\n\ +_08020040:\n\ + lsls r0, 2\n\ + ldr r1, _0802005C @ =_08020060\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_0802004C: .4byte 0x0201605c\n\ +_08020050: .4byte gBattlescriptCurrInstr\n\ +_08020054: .4byte gBank1\n\ +_08020058: .4byte gSentPokesToOpponent\n\ +_0802005C: .4byte _08020060\n\ + .align 2, 0\n\ +_08020060:\n\ + .4byte _0802007C\n\ + .4byte _080200FC\n\ + .4byte _08020216\n\ + .4byte _0802055C\n\ + .4byte _08020648\n\ + .4byte _08020910\n\ + .4byte _0802096C\n\ +_0802007C:\n\ + ldr r4, _080200A8 @ =gBank1\n\ + ldrb r0, [r4]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _08020098\n\ + ldr r0, _080200AC @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + ldr r0, _080200B0 @ =0x00000982\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080200BC\n\ +_08020098:\n\ + ldr r0, _080200B4 @ =0x02000000\n\ + ldr r1, _080200B8 @ =0x0001600f\n\ + adds r0, r1\n\ + movs r1, 0x6\n\ + strb r1, [r0]\n\ + bl _08020996\n\ + .align 2, 0\n\ +_080200A8: .4byte gBank1\n\ +_080200AC: .4byte gBattleTypeFlags\n\ +_080200B0: .4byte 0x00000982\n\ +_080200B4: .4byte 0x02000000\n\ +_080200B8: .4byte 0x0001600f\n\ +_080200BC:\n\ + ldr r2, _080200E8 @ =0x02000000\n\ + ldr r3, _080200EC @ =0x0001600f\n\ + adds r1, r2, r3\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + ldr r0, _080200F0 @ =0x00016113\n\ + adds r2, r0\n\ + ldr r3, _080200F4 @ =gBitTable\n\ + ldr r1, _080200F8 @ =gBattlePartyID\n\ + ldrb r0, [r4]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + ldrh r0, [r0]\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + ldr r0, [r0]\n\ + ldrb r1, [r2]\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + bl _08020996\n\ + .align 2, 0\n\ +_080200E8: .4byte 0x02000000\n\ +_080200EC: .4byte 0x0001600f\n\ +_080200F0: .4byte 0x00016113\n\ +_080200F4: .4byte gBitTable\n\ +_080200F8: .4byte gBattlePartyID\n\ +_080200FC:\n\ + movs r5, 0\n\ + movs r7, 0\n\ + ldr r1, _08020150 @ =gSaveBlock1 + 0x3688\n\ + mov r9, r1\n\ +_08020104:\n\ + movs r0, 0x64\n\ + adds r1, r7, 0\n\ + muls r1, r0\n\ + ldr r0, _08020154 @ =gPlayerParty\n\ + adds r4, r1, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0802016A\n\ + adds r0, r4, 0\n\ + movs r1, 0x39\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0802016A\n\ + ldr r0, _08020158 @ =gBitTable\n\ + lsls r1, r7, 2\n\ + adds r1, r0\n\ + ldr r0, [r1]\n\ + mov r2, r8\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _08020138\n\ + adds r5, 0x1\n\ +_08020138:\n\ + adds r0, r4, 0\n\ + movs r1, 0xC\n\ + bl GetMonData\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0xAF\n\ + bne _0802015C\n\ + mov r3, r9\n\ + ldrb r4, [r3]\n\ + b _08020164\n\ + .align 2, 0\n\ +_08020150: .4byte gSaveBlock1 + 0x3688\n\ +_08020154: .4byte gPlayerParty\n\ +_08020158: .4byte gBitTable\n\ +_0802015C:\n\ + bl ItemId_GetHoldEffect\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ +_08020164:\n\ + cmp r4, 0x19\n\ + bne _0802016A\n\ + adds r6, 0x1\n\ +_0802016A:\n\ + adds r7, 0x1\n\ + cmp r7, 0x5\n\ + ble _08020104\n\ + ldr r3, _080201D0 @ =gBaseStats\n\ + ldr r2, _080201D4 @ =gBattleMons\n\ + ldr r0, _080201D8 @ =gBank1\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + muls r1, r0\n\ + adds r1, r2\n\ + ldrh r2, [r1]\n\ + lsls r0, r2, 3\n\ + subs r0, r2\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + ldrb r2, [r0, 0x9]\n\ + adds r1, 0x2A\n\ + ldrb r0, [r1]\n\ + muls r0, r2\n\ + movs r1, 0x7\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + cmp r6, 0\n\ + beq _080201E0\n\ + lsrs r4, r0, 17\n\ + adds r0, r4, 0\n\ + adds r1, r5, 0\n\ + bl __divsi3\n\ + mov r1, r10\n\ + strh r0, [r1]\n\ + lsls r0, 16\n\ + cmp r0, 0\n\ + bne _080201B6\n\ + movs r0, 0x1\n\ + strh r0, [r1]\n\ +_080201B6:\n\ + ldr r5, _080201DC @ =gExpShareExp\n\ + adds r0, r4, 0\n\ + adds r1, r6, 0\n\ + bl __divsi3\n\ + strh r0, [r5]\n\ + lsls r0, 16\n\ + cmp r0, 0\n\ + bne _080201FA\n\ + movs r0, 0x1\n\ + strh r0, [r5]\n\ + b _080201FA\n\ + .align 2, 0\n\ +_080201D0: .4byte gBaseStats\n\ +_080201D4: .4byte gBattleMons\n\ +_080201D8: .4byte gBank1\n\ +_080201DC: .4byte gExpShareExp\n\ +_080201E0:\n\ + adds r0, r1, 0\n\ + adds r1, r5, 0\n\ + bl __divsi3\n\ + mov r2, r10\n\ + strh r0, [r2]\n\ + lsls r0, 16\n\ + cmp r0, 0\n\ + bne _080201F6\n\ + movs r0, 0x1\n\ + strh r0, [r2]\n\ +_080201F6:\n\ + ldr r0, _08020248 @ =gExpShareExp\n\ + strh r6, [r0]\n\ +_080201FA:\n\ + ldr r1, _0802024C @ =0x02000000\n\ + ldr r3, _08020250 @ =0x0001600f\n\ + adds r2, r1, r3\n\ + ldrb r0, [r2]\n\ + adds r0, 0x1\n\ + movs r3, 0\n\ + strb r0, [r2]\n\ + ldr r2, _08020254 @ =0x00016018\n\ + adds r0, r1, r2\n\ + strb r3, [r0]\n\ + ldr r3, _08020258 @ =0x0001605f\n\ + adds r1, r3\n\ + mov r0, r8\n\ + strb r0, [r1]\n\ +_08020216:\n\ + ldr r0, _0802025C @ =gBattleExecBuffer\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + beq _08020220\n\ + b _08020996\n\ +_08020220:\n\ + ldr r0, _0802024C @ =0x02000000\n\ + ldr r1, _08020254 @ =0x00016018\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + ldr r1, _08020260 @ =gPlayerParty\n\ + adds r0, r1\n\ + movs r1, 0xC\n\ + bl GetMonData\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0xAF\n\ + bne _0802026C\n\ + ldr r0, _08020264 @ =gSaveBlock1\n\ + ldr r2, _08020268 @ =0x00003688\n\ + adds r0, r2\n\ + ldrb r4, [r0]\n\ + b _08020274\n\ + .align 2, 0\n\ +_08020248: .4byte gExpShareExp\n\ +_0802024C: .4byte 0x02000000\n\ +_08020250: .4byte 0x0001600f\n\ +_08020254: .4byte 0x00016018\n\ +_08020258: .4byte 0x0001605f\n\ +_0802025C: .4byte gBattleExecBuffer\n\ +_08020260: .4byte gPlayerParty\n\ +_08020264: .4byte gSaveBlock1\n\ +_08020268: .4byte 0x00003688\n\ +_0802026C:\n\ + bl ItemId_GetHoldEffect\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ +_08020274:\n\ + ldr r5, _08020294 @ =0x02000000\n\ + cmp r4, 0x19\n\ + beq _080202A0\n\ + ldr r3, _08020298 @ =0x0001605f\n\ + adds r1, r5, r3\n\ + ldrb r0, [r1]\n\ + movs r2, 0x1\n\ + ands r2, r0\n\ + cmp r2, 0\n\ + bne _080202A0\n\ + lsrs r0, 1\n\ + strb r0, [r1]\n\ + ldr r0, _0802029C @ =0x0001600f\n\ + adds r1, r5, r0\n\ + b _080202C8\n\ + .align 2, 0\n\ +_08020294: .4byte 0x02000000\n\ +_08020298: .4byte 0x0001605f\n\ +_0802029C: .4byte 0x0001600f\n\ +_080202A0:\n\ + ldr r1, _080202D4 @ =0x00016018\n\ + adds r0, r5, r1\n\ + ldrb r1, [r0]\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + ldr r1, _080202D8 @ =gPlayerParty\n\ + adds r0, r1\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + cmp r0, 0x64\n\ + bne _080202E8\n\ + ldr r2, _080202DC @ =0x0001605f\n\ + adds r1, r5, r2\n\ + ldrb r0, [r1]\n\ + lsrs r0, 1\n\ + movs r2, 0\n\ + strb r0, [r1]\n\ + ldr r3, _080202E0 @ =0x0001600f\n\ + adds r1, r5, r3\n\ +_080202C8:\n\ + movs r0, 0x5\n\ + strb r0, [r1]\n\ + ldr r0, _080202E4 @ =gBattleMoveDamage\n\ + str r2, [r0]\n\ + b _08020996\n\ + .align 2, 0\n\ +_080202D4: .4byte 0x00016018\n\ +_080202D8: .4byte gPlayerParty\n\ +_080202DC: .4byte 0x0001605f\n\ +_080202E0: .4byte 0x0001600f\n\ +_080202E4: .4byte gBattleMoveDamage\n\ +_080202E8:\n\ + ldr r0, _0802034C @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08020316\n\ + ldr r0, _08020350 @ =gBattleMons\n\ + ldrh r0, [r0, 0x28]\n\ + cmp r0, 0\n\ + beq _08020316\n\ + ldr r0, _08020354 @ =0x0001601b\n\ + adds r5, r0\n\ + ldrb r0, [r5]\n\ + cmp r0, 0\n\ + bne _08020316\n\ + bl BattleMusicStop\n\ + ldr r0, _08020358 @ =0x00000161\n\ + bl PlayBGM\n\ + ldrb r0, [r5]\n\ + adds r0, 0x1\n\ + strb r0, [r5]\n\ +_08020316:\n\ + ldr r5, _0802035C @ =0x02000000\n\ + ldr r1, _08020360 @ =0x00016018\n\ + adds r0, r5, r1\n\ + ldrb r1, [r0]\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + ldr r1, _08020364 @ =gPlayerParty\n\ + adds r0, r1\n\ + movs r1, 0x39\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _08020332\n\ + b _0802051E\n\ +_08020332:\n\ + ldr r2, _08020368 @ =0x0001605f\n\ + adds r0, r5, r2\n\ + ldrb r0, [r0]\n\ + movs r3, 0x1\n\ + ands r3, r0\n\ + cmp r3, 0\n\ + beq _08020370\n\ + ldr r1, _0802036C @ =gBattleMoveDamage\n\ + mov r3, r10\n\ + ldrh r0, [r3]\n\ + str r0, [r1]\n\ + mov r8, r1\n\ + b _08020376\n\ + .align 2, 0\n\ +_0802034C: .4byte gBattleTypeFlags\n\ +_08020350: .4byte gBattleMons\n\ +_08020354: .4byte 0x0001601b\n\ +_08020358: .4byte 0x00000161\n\ +_0802035C: .4byte 0x02000000\n\ +_08020360: .4byte 0x00016018\n\ +_08020364: .4byte gPlayerParty\n\ +_08020368: .4byte 0x0001605f\n\ +_0802036C: .4byte gBattleMoveDamage\n\ +_08020370:\n\ + ldr r0, _080203EC @ =gBattleMoveDamage\n\ + str r3, [r0]\n\ + mov r8, r0\n\ +_08020376:\n\ + cmp r4, 0x19\n\ + bne _08020386\n\ + ldr r0, _080203F0 @ =gExpShareExp\n\ + ldrh r1, [r0]\n\ + mov r2, r8\n\ + ldr r0, [r2]\n\ + adds r0, r1\n\ + str r0, [r2]\n\ +_08020386:\n\ + cmp r4, 0x28\n\ + bne _0802039C\n\ + mov r3, r8\n\ + ldr r1, [r3]\n\ + movs r0, 0x96\n\ + muls r0, r1\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + mov r1, r8\n\ + str r0, [r1]\n\ +_0802039C:\n\ + ldr r0, _080203F4 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080203B8\n\ + ldr r4, _080203EC @ =gBattleMoveDamage\n\ + ldr r1, [r4]\n\ + movs r0, 0x96\n\ + muls r0, r1\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + str r0, [r4]\n\ +_080203B8:\n\ + ldr r0, _080203F8 @ =0x02000000\n\ + ldr r2, _080203FC @ =0x00016018\n\ + adds r0, r2\n\ + ldrb r1, [r0]\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + ldr r1, _08020400 @ =gPlayerParty\n\ + adds r0, r1\n\ + bl IsTradedMon\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08020404\n\ + ldr r4, _080203EC @ =gBattleMoveDamage\n\ + ldr r1, [r4]\n\ + movs r0, 0x96\n\ + muls r0, r1\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + str r0, [r4]\n\ + movs r7, 0xA5\n\ + lsls r7, 1\n\ + mov r8, r4\n\ + b _0802040A\n\ + .align 2, 0\n\ +_080203EC: .4byte gBattleMoveDamage\n\ +_080203F0: .4byte gExpShareExp\n\ +_080203F4: .4byte gBattleTypeFlags\n\ +_080203F8: .4byte 0x02000000\n\ +_080203FC: .4byte 0x00016018\n\ +_08020400: .4byte gPlayerParty\n\ +_08020404:\n\ + ldr r7, _0802043C @ =0x00000149\n\ + ldr r3, _08020440 @ =gBattleMoveDamage\n\ + mov r8, r3\n\ +_0802040A:\n\ + ldr r0, _08020444 @ =gBattleTypeFlags\n\ + ldrh r0, [r0]\n\ + movs r1, 0x1\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _08020488\n\ + ldr r1, _08020448 @ =gBattlePartyID\n\ + ldr r0, _0802044C @ =0x02000000\n\ + ldr r3, _08020450 @ =0x00016018\n\ + adds r2, r0, r3\n\ + ldrh r1, [r1, 0x4]\n\ + adds r5, r0, 0\n\ + ldr r4, _08020454 @ =gBitTable\n\ + ldr r3, _08020458 @ =gAbsentBankFlags\n\ + ldrb r2, [r2]\n\ + cmp r1, r2\n\ + bne _08020460\n\ + ldrb r1, [r3]\n\ + ldr r0, [r4, 0x8]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + bne _08020460\n\ + ldr r0, _0802045C @ =0x000160a2\n\ + adds r1, r5, r0\n\ + b _0802047C\n\ + .align 2, 0\n\ +_0802043C: .4byte 0x00000149\n\ +_08020440: .4byte gBattleMoveDamage\n\ +_08020444: .4byte gBattleTypeFlags\n\ +_08020448: .4byte gBattlePartyID\n\ +_0802044C: .4byte 0x02000000\n\ +_08020450: .4byte 0x00016018\n\ +_08020454: .4byte gBitTable\n\ +_08020458: .4byte gAbsentBankFlags\n\ +_0802045C: .4byte 0x000160a2\n\ +_08020460:\n\ + ldrb r2, [r3]\n\ + ldr r0, [r4]\n\ + ands r2, r0\n\ + cmp r2, 0\n\ + bne _08020478\n\ + ldr r1, _08020474 @ =0x000160a2\n\ + adds r0, r5, r1\n\ + strb r2, [r0]\n\ + b _08020490\n\ + .align 2, 0\n\ +_08020474: .4byte 0x000160a2\n\ +_08020478:\n\ + ldr r2, _08020484 @ =0x000160a2\n\ + adds r1, r5, r2\n\ +_0802047C:\n\ + movs r0, 0x2\n\ + strb r0, [r1]\n\ + b _08020490\n\ + .align 2, 0\n\ +_08020484: .4byte 0x000160a2\n\ +_08020488:\n\ + ldr r0, _08020530 @ =0x02000000\n\ + ldr r3, _08020534 @ =0x000160a2\n\ + adds r0, r3\n\ + strb r1, [r0]\n\ +_08020490:\n\ + ldr r1, _08020538 @ =gBattleTextBuff1\n\ + movs r3, 0\n\ + movs r2, 0xFD\n\ + strb r2, [r1]\n\ + movs r5, 0x4\n\ + strb r5, [r1, 0x1]\n\ + ldr r4, _08020530 @ =0x02000000\n\ + ldr r0, _08020534 @ =0x000160a2\n\ + adds r6, r4, r0\n\ + ldrb r0, [r6]\n\ + strb r0, [r1, 0x2]\n\ + ldr r0, _0802053C @ =0x00016018\n\ + adds r4, r0\n\ + ldrb r0, [r4]\n\ + strb r0, [r1, 0x3]\n\ + movs r0, 0xFF\n\ + strb r0, [r1, 0x4]\n\ + ldr r1, _08020540 @ =gBattleTextBuff2\n\ + strb r2, [r1]\n\ + strb r3, [r1, 0x1]\n\ + strb r7, [r1, 0x2]\n\ + movs r3, 0xFF\n\ + lsls r3, 8\n\ + ands r7, r3\n\ + asrs r0, r7, 8\n\ + strb r0, [r1, 0x3]\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + strb r0, [r1, 0x4]\n\ + ldr r1, _08020544 @ =gBattleTextBuff3\n\ + strb r2, [r1]\n\ + movs r0, 0x1\n\ + strb r0, [r1, 0x1]\n\ + strb r5, [r1, 0x2]\n\ + movs r0, 0x5\n\ + strb r0, [r1, 0x3]\n\ + mov r0, r8\n\ + ldr r2, [r0]\n\ + strb r2, [r1, 0x4]\n\ + adds r0, r2, 0\n\ + ands r0, r3\n\ + asrs r0, 8\n\ + strb r0, [r1, 0x5]\n\ + movs r0, 0xFF\n\ + lsls r0, 16\n\ + ands r0, r2\n\ + asrs r0, 16\n\ + strb r0, [r1, 0x6]\n\ + lsrs r2, 24\n\ + strb r2, [r1, 0x7]\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + strb r0, [r1, 0x8]\n\ + ldrb r1, [r6]\n\ + movs r0, 0xD\n\ + bl PrepareStringBattle\n\ + ldrb r1, [r4]\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + ldr r1, _08020548 @ =gPlayerParty\n\ + adds r0, r1\n\ + ldr r3, _0802054C @ =gBattleMons\n\ + ldr r1, _08020550 @ =gBank1\n\ + ldrb r2, [r1]\n\ + movs r1, 0x58\n\ + muls r1, r2\n\ + adds r1, r3\n\ + ldrh r1, [r1]\n\ + bl MonGainEVs\n\ +_0802051E:\n\ + ldr r1, _08020530 @ =0x02000000\n\ + ldr r3, _08020554 @ =0x0001605f\n\ + adds r2, r1, r3\n\ + ldrb r0, [r2]\n\ + lsrs r0, 1\n\ + strb r0, [r2]\n\ + ldr r0, _08020558 @ =0x0001600f\n\ + adds r1, r0\n\ + b _08020618\n\ + .align 2, 0\n\ +_08020530: .4byte 0x02000000\n\ +_08020534: .4byte 0x000160a2\n\ +_08020538: .4byte gBattleTextBuff1\n\ +_0802053C: .4byte 0x00016018\n\ +_08020540: .4byte gBattleTextBuff2\n\ +_08020544: .4byte gBattleTextBuff3\n\ +_08020548: .4byte gPlayerParty\n\ +_0802054C: .4byte gBattleMons\n\ +_08020550: .4byte gBank1\n\ +_08020554: .4byte 0x0001605f\n\ +_08020558: .4byte 0x0001600f\n\ +_0802055C:\n\ + ldr r0, _08020620 @ =gBattleExecBuffer\n\ + ldr r2, [r0]\n\ + cmp r2, 0\n\ + beq _08020566\n\ + b _08020996\n\ +_08020566:\n\ + ldr r1, _08020624 @ =gBattleBufferB\n\ + ldr r4, _08020628 @ =0x02000000\n\ + ldr r3, _0802062C @ =0x000160a2\n\ + adds r3, r4\n\ + mov r8, r3\n\ + ldrb r0, [r3]\n\ + lsls r0, 9\n\ + adds r0, r1\n\ + strb r2, [r0]\n\ + ldr r0, _08020630 @ =0x00016018\n\ + adds r7, r4, r0\n\ + ldrb r0, [r7]\n\ + movs r6, 0x64\n\ + muls r0, r6\n\ + ldr r5, _08020634 @ =gPlayerParty\n\ + adds r0, r5\n\ + movs r1, 0x39\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _08020612\n\ + ldrb r0, [r7]\n\ + muls r0, r6\n\ + adds r0, r5\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + cmp r0, 0x64\n\ + beq _08020612\n\ + ldrb r0, [r7]\n\ + muls r0, r6\n\ + adds r0, r5\n\ + movs r1, 0x3A\n\ + bl GetMonData\n\ + ldr r1, _08020638 @ =0x00017180\n\ + adds r4, r1\n\ + strh r0, [r4]\n\ + ldrb r0, [r7]\n\ + muls r0, r6\n\ + adds r0, r5\n\ + movs r1, 0x3B\n\ + bl GetMonData\n\ + strh r0, [r4, 0x2]\n\ + ldrb r0, [r7]\n\ + muls r0, r6\n\ + adds r0, r5\n\ + movs r1, 0x3C\n\ + bl GetMonData\n\ + strh r0, [r4, 0x4]\n\ + ldrb r0, [r7]\n\ + muls r0, r6\n\ + adds r0, r5\n\ + movs r1, 0x3D\n\ + bl GetMonData\n\ + strh r0, [r4, 0x6]\n\ + ldrb r0, [r7]\n\ + muls r0, r6\n\ + adds r0, r5\n\ + movs r1, 0x3E\n\ + bl GetMonData\n\ + strh r0, [r4, 0x8]\n\ + ldrb r0, [r7]\n\ + muls r0, r6\n\ + adds r0, r5\n\ + movs r1, 0x3F\n\ + bl GetMonData\n\ + strh r0, [r4, 0xA]\n\ + ldr r4, _0802063C @ =gActiveBank\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + strb r0, [r4]\n\ + ldrb r1, [r7]\n\ + ldr r0, _08020640 @ =gBattleMoveDamage\n\ + ldrh r2, [r0]\n\ + movs r0, 0\n\ + bl EmitExpBarUpdate\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ +_08020612:\n\ + ldr r1, _08020628 @ =0x02000000\n\ + ldr r3, _08020644 @ =0x0001600f\n\ + adds r1, r3\n\ +_08020618:\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + b _08020996\n\ + .align 2, 0\n\ +_08020620: .4byte gBattleExecBuffer\n\ +_08020624: .4byte gBattleBufferB\n\ +_08020628: .4byte 0x02000000\n\ +_0802062C: .4byte 0x000160a2\n\ +_08020630: .4byte 0x00016018\n\ +_08020634: .4byte gPlayerParty\n\ +_08020638: .4byte 0x00017180\n\ +_0802063C: .4byte gActiveBank\n\ +_08020640: .4byte gBattleMoveDamage\n\ +_08020644: .4byte 0x0001600f\n\ +_08020648:\n\ + ldr r0, _080208AC @ =gBattleExecBuffer\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + beq _08020652\n\ + b _08020996\n\ +_08020652:\n\ + ldr r1, _080208B0 @ =gActiveBank\n\ + ldr r4, _080208B4 @ =0x02000000\n\ + ldr r2, _080208B8 @ =0x000160a2\n\ + adds r0, r4, r2\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldr r2, _080208BC @ =gBattleBufferB\n\ + ldrb r3, [r1]\n\ + lsls r1, r3, 9\n\ + adds r0, r1, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x21\n\ + beq _0802066E\n\ + b _080208F0\n\ +_0802066E:\n\ + adds r0, r2, 0x1\n\ + adds r0, r1, r0\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xB\n\ + beq _0802067A\n\ + b _080208F0\n\ +_0802067A:\n\ + ldr r0, _080208C0 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080206A8\n\ + ldr r1, _080208C4 @ =gBattlePartyID\n\ + lsls r0, r3, 1\n\ + adds r2, r0, r1\n\ + ldr r0, _080208C8 @ =0x00016018\n\ + adds r1, r4, r0\n\ + ldrh r0, [r2]\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bne _080206A8\n\ + adds r1, r0, 0\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + ldr r1, _080208CC @ =gPlayerParty\n\ + adds r0, r1\n\ + adds r1, r3, 0\n\ + bl sub_80324F8\n\ +_080206A8:\n\ + ldr r1, _080208D0 @ =gBattleTextBuff1\n\ + movs r2, 0xFD\n\ + strb r2, [r1]\n\ + movs r0, 0x4\n\ + strb r0, [r1, 0x1]\n\ + ldr r5, _080208B0 @ =gActiveBank\n\ + ldrb r0, [r5]\n\ + strb r0, [r1, 0x2]\n\ + ldr r0, _080208B4 @ =0x02000000\n\ + ldr r3, _080208C8 @ =0x00016018\n\ + adds r6, r0, r3\n\ + ldrb r0, [r6]\n\ + strb r0, [r1, 0x3]\n\ + movs r0, 0xFF\n\ + strb r0, [r1, 0x4]\n\ + ldr r4, _080208D4 @ =gBattleTextBuff2\n\ + strb r2, [r4]\n\ + movs r0, 0x1\n\ + strb r0, [r4, 0x1]\n\ + strb r0, [r4, 0x2]\n\ + movs r0, 0x3\n\ + strb r0, [r4, 0x3]\n\ + ldrb r0, [r6]\n\ + movs r1, 0x64\n\ + mov r8, r1\n\ + mov r2, r8\n\ + muls r2, r0\n\ + adds r0, r2, 0\n\ + ldr r7, _080208CC @ =gPlayerParty\n\ + adds r0, r7\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + strb r0, [r4, 0x4]\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + strb r0, [r4, 0x5]\n\ + bl b_movescr_stack_push_cursor\n\ + ldr r2, _080208D8 @ =gLeveledUpInBattle\n\ + ldr r1, _080208DC @ =gBitTable\n\ + ldrb r0, [r6]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + ldrb r1, [r2]\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r1, _080208E0 @ =gBattlescriptCurrInstr\n\ + ldr r0, _080208E4 @ =BattleScript_LevelUp\n\ + str r0, [r1]\n\ + ldr r4, _080208E8 @ =gBattleMoveDamage\n\ + ldr r2, _080208BC @ =gBattleBufferB\n\ + ldrb r1, [r5]\n\ + lsls r1, 9\n\ + adds r0, r2, 0x2\n\ + adds r0, r1, r0\n\ + ldrb r3, [r0]\n\ + adds r2, 0x3\n\ + adds r1, r2\n\ + ldrb r0, [r1]\n\ + lsls r0, 8\n\ + orrs r3, r0\n\ + str r3, [r4]\n\ + ldrb r0, [r6]\n\ + mov r3, r8\n\ + muls r3, r0\n\ + adds r0, r3, 0\n\ + adds r0, r7\n\ + movs r1, 0\n\ + bl AdjustFriendship\n\ + ldr r0, _080208C4 @ =gBattlePartyID\n\ + ldrb r1, [r6]\n\ + ldrh r0, [r0]\n\ + cmp r0, r1\n\ + bne _080207EC\n\ + ldr r4, _080208EC @ =gBattleMons\n\ + ldrh r0, [r4, 0x28]\n\ + cmp r0, 0\n\ + beq _080207EC\n\ + mov r0, r8\n\ + muls r0, r1\n\ + adds r0, r7\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + adds r1, r4, 0\n\ + adds r1, 0x2A\n\ + strb r0, [r1]\n\ + ldrb r0, [r6]\n\ + mov r1, r8\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + adds r0, r7\n\ + movs r1, 0x39\n\ + bl GetMonData\n\ + strh r0, [r4, 0x28]\n\ + ldrb r0, [r6]\n\ + mov r2, r8\n\ + muls r2, r0\n\ + adds r0, r2, 0\n\ + adds r0, r7\n\ + movs r1, 0x3A\n\ + bl GetMonData\n\ + strh r0, [r4, 0x2C]\n\ + ldrb r0, [r6]\n\ + mov r3, r8\n\ + muls r3, r0\n\ + adds r0, r3, 0\n\ + adds r0, r7\n\ + movs r1, 0x3B\n\ + bl GetMonData\n\ + strh r0, [r4, 0x2]\n\ + ldrb r0, [r6]\n\ + mov r1, r8\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + adds r0, r7\n\ + movs r1, 0x3C\n\ + bl GetMonData\n\ + strh r0, [r4, 0x4]\n\ + ldrb r0, [r6]\n\ + mov r2, r8\n\ + muls r2, r0\n\ + adds r0, r2, 0\n\ + adds r0, r7\n\ + movs r1, 0x3D\n\ + bl GetMonData\n\ + strh r0, [r4, 0x6]\n\ + ldrb r0, [r6]\n\ + mov r3, r8\n\ + muls r3, r0\n\ + adds r0, r3, 0\n\ + adds r0, r7\n\ + movs r1, 0x3D\n\ + bl GetMonData\n\ + strh r0, [r4, 0x6]\n\ + ldrb r0, [r6]\n\ + mov r1, r8\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + adds r0, r7\n\ + movs r1, 0x3E\n\ + bl GetMonData\n\ + strh r0, [r4, 0x8]\n\ + ldrb r0, [r6]\n\ + mov r2, r8\n\ + muls r2, r0\n\ + adds r0, r2, 0\n\ + adds r0, r7\n\ + movs r1, 0x3F\n\ + bl GetMonData\n\ + strh r0, [r4, 0xA]\n\ +_080207EC:\n\ + ldr r0, _080208C4 @ =gBattlePartyID\n\ + ldr r1, _080208B4 @ =0x02000000\n\ + ldr r3, _080208C8 @ =0x00016018\n\ + adds r7, r1, r3\n\ + ldrb r2, [r7]\n\ + ldrh r0, [r0, 0x4]\n\ + cmp r0, r2\n\ + bne _080208F6\n\ + ldr r6, _080208EC @ =gBattleMons\n\ + movs r0, 0xD8\n\ + adds r0, r6\n\ + mov r8, r0\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + beq _080208F6\n\ + ldr r0, _080208C0 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080208F6\n\ + movs r5, 0x64\n\ + adds r0, r2, 0\n\ + muls r0, r5\n\ + ldr r4, _080208CC @ =gPlayerParty\n\ + adds r0, r4\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + adds r1, r6, 0\n\ + adds r1, 0xDA\n\ + strb r0, [r1]\n\ + ldrb r0, [r7]\n\ + muls r0, r5\n\ + adds r0, r4\n\ + movs r1, 0x39\n\ + bl GetMonData\n\ + mov r1, r8\n\ + strh r0, [r1]\n\ + ldrb r0, [r7]\n\ + muls r0, r5\n\ + adds r0, r4\n\ + movs r1, 0x3A\n\ + bl GetMonData\n\ + adds r1, r6, 0\n\ + adds r1, 0xDC\n\ + strh r0, [r1]\n\ + ldrb r0, [r7]\n\ + muls r0, r5\n\ + adds r0, r4\n\ + movs r1, 0x3B\n\ + bl GetMonData\n\ + adds r1, r6, 0\n\ + adds r1, 0xB2\n\ + strh r0, [r1]\n\ + ldrb r0, [r7]\n\ + muls r0, r5\n\ + adds r0, r4\n\ + movs r1, 0x3C\n\ + bl GetMonData\n\ + adds r1, r6, 0\n\ + adds r1, 0xB4\n\ + strh r0, [r1]\n\ + ldrb r0, [r7]\n\ + muls r0, r5\n\ + adds r0, r4\n\ + movs r1, 0x3D\n\ + bl GetMonData\n\ + movs r2, 0xB6\n\ + adds r2, r6\n\ + mov r8, r2\n\ + strh r0, [r2]\n\ + ldrb r0, [r7]\n\ + muls r0, r5\n\ + adds r0, r4\n\ + movs r1, 0x3D\n\ + bl GetMonData\n\ + mov r3, r8\n\ + strh r0, [r3]\n\ + ldrb r0, [r7]\n\ + muls r0, r5\n\ + adds r0, r4\n\ + movs r1, 0x3E\n\ + bl GetMonData\n\ + adds r1, r6, 0\n\ + adds r1, 0xB8\n\ + strh r0, [r1]\n\ + b _080208F6\n\ + .align 2, 0\n\ +_080208AC: .4byte gBattleExecBuffer\n\ +_080208B0: .4byte gActiveBank\n\ +_080208B4: .4byte 0x02000000\n\ +_080208B8: .4byte 0x000160a2\n\ +_080208BC: .4byte gBattleBufferB\n\ +_080208C0: .4byte gBattleTypeFlags\n\ +_080208C4: .4byte gBattlePartyID\n\ +_080208C8: .4byte 0x00016018\n\ +_080208CC: .4byte gPlayerParty\n\ +_080208D0: .4byte gBattleTextBuff1\n\ +_080208D4: .4byte gBattleTextBuff2\n\ +_080208D8: .4byte gLeveledUpInBattle\n\ +_080208DC: .4byte gBitTable\n\ +_080208E0: .4byte gBattlescriptCurrInstr\n\ +_080208E4: .4byte BattleScript_LevelUp\n\ +_080208E8: .4byte gBattleMoveDamage\n\ +_080208EC: .4byte gBattleMons\n\ +_080208F0:\n\ + ldr r1, _08020904 @ =gBattleMoveDamage\n\ + movs r0, 0\n\ + str r0, [r1]\n\ +_080208F6:\n\ + ldr r0, _08020908 @ =0x02000000\n\ + ldr r1, _0802090C @ =0x0001600f\n\ + adds r0, r1\n\ + movs r1, 0x5\n\ + strb r1, [r0]\n\ + b _08020996\n\ + .align 2, 0\n\ +_08020904: .4byte gBattleMoveDamage\n\ +_08020908: .4byte 0x02000000\n\ +_0802090C: .4byte 0x0001600f\n\ +_08020910:\n\ + ldr r0, _08020924 @ =gBattleMoveDamage\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + beq _08020930\n\ + ldr r0, _08020928 @ =0x02000000\n\ + ldr r2, _0802092C @ =0x0001600f\n\ + adds r0, r2\n\ + movs r1, 0x3\n\ + strb r1, [r0]\n\ + b _08020996\n\ + .align 2, 0\n\ +_08020924: .4byte gBattleMoveDamage\n\ +_08020928: .4byte 0x02000000\n\ +_0802092C: .4byte 0x0001600f\n\ +_08020930:\n\ + ldr r2, _08020950 @ =0x02000000\n\ + ldr r3, _08020954 @ =0x00016018\n\ + adds r1, r2, r3\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x5\n\ + bhi _0802095C\n\ + ldr r0, _08020958 @ =0x0001600f\n\ + adds r1, r2, r0\n\ + movs r0, 0x2\n\ + strb r0, [r1]\n\ + b _08020996\n\ + .align 2, 0\n\ +_08020950: .4byte 0x02000000\n\ +_08020954: .4byte 0x00016018\n\ +_08020958: .4byte 0x0001600f\n\ +_0802095C:\n\ + ldr r3, _08020968 @ =0x0001600f\n\ + adds r1, r2, r3\n\ + movs r0, 0x6\n\ + strb r0, [r1]\n\ + b _08020996\n\ + .align 2, 0\n\ +_08020968: .4byte 0x0001600f\n\ +_0802096C:\n\ + ldr r0, _080209A4 @ =gBattleExecBuffer\n\ + ldr r5, [r0]\n\ + cmp r5, 0\n\ + bne _08020996\n\ + ldr r4, _080209A8 @ =gBattleMons\n\ + ldr r2, _080209AC @ =gBank1\n\ + ldrb r0, [r2]\n\ + movs r1, 0x58\n\ + muls r0, r1\n\ + adds r0, r4\n\ + movs r3, 0\n\ + strh r5, [r0, 0x2E]\n\ + ldrb r0, [r2]\n\ + muls r0, r1\n\ + adds r0, r4\n\ + adds r0, 0x20\n\ + strb r3, [r0]\n\ + ldr r1, _080209B0 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x2\n\ + str r0, [r1]\n\ +_08020996:\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080209A4: .4byte gBattleExecBuffer\n\ +_080209A8: .4byte gBattleMons\n\ +_080209AC: .4byte gBank1\n\ +_080209B0: .4byte gBattlescriptCurrInstr\n\ + .syntax divided\n"); +} + +#endif // NONMATCHING + +#ifdef NONMATCHING +static void atk24(void) +{ + u16 HP_count = 0; + int i; + if (gBattleExecBuffer) {return;} + + for (i = 0; i < 6; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); + } + + if (HP_count == 0) + gBattleOutcome |= BATTLE_LOST; + + for (HP_count = 0, i = 0; i < 6; i++) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)) + HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP); + } + + if (!HP_count) + gBattleOutcome |= BATTLE_WON; + + if (!gBattleOutcome && (gBattleTypeFlags & BATTLE_TYPE_LINK)) + { + register int found1 asm("r2"); + register int found2 asm("r4"); + + //I can't for the love of god decompile that part + + for (found1 = 0, i = 0; i < gNoOfAllBanks; i += 2) + { + if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40) + found1++; + } + + for (found2 = 0, i = 1; i < gNoOfAllBanks; i += 2) + { + if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40) + found2++; + } + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (found2 + found1 > 1) + gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; + } + else + { + if (found2 != 0 && found1 != 0) + gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; + } + } + else + gBattlescriptCurrInstr += 5; + +} +#else +__attribute__((naked)) +static void atk24(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + movs r6, 0\n\ + ldr r0, _08020AF0 @ =gBattleExecBuffer\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + beq _080209C6\n\ + b _08020B46\n\ +_080209C6:\n\ + movs r5, 0\n\ +_080209C8:\n\ + movs r0, 0x64\n\ + adds r1, r5, 0\n\ + muls r1, r0\n\ + ldr r0, _08020AF4 @ =gPlayerParty\n\ + adds r4, r1, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _080209F8\n\ + adds r0, r4, 0\n\ + movs r1, 0x2D\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _080209F8\n\ + adds r0, r4, 0\n\ + movs r1, 0x39\n\ + bl GetMonData\n\ + adds r0, r6, r0\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ +_080209F8:\n\ + adds r5, 0x1\n\ + cmp r5, 0x5\n\ + ble _080209C8\n\ + cmp r6, 0\n\ + bne _08020A0C\n\ + ldr r0, _08020AF8 @ =gBattleOutcome\n\ + ldrb r1, [r0]\n\ + movs r2, 0x2\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ +_08020A0C:\n\ + movs r6, 0\n\ + movs r5, 0\n\ +_08020A10:\n\ + movs r0, 0x64\n\ + adds r1, r5, 0\n\ + muls r1, r0\n\ + ldr r0, _08020AFC @ =gEnemyParty\n\ + adds r4, r1, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _08020A40\n\ + adds r0, r4, 0\n\ + movs r1, 0x2D\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _08020A40\n\ + adds r0, r4, 0\n\ + movs r1, 0x39\n\ + bl GetMonData\n\ + adds r0, r6, r0\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ +_08020A40:\n\ + adds r5, 0x1\n\ + cmp r5, 0x5\n\ + ble _08020A10\n\ + ldr r2, _08020AF8 @ =gBattleOutcome\n\ + cmp r6, 0\n\ + bne _08020A54\n\ + ldrb r0, [r2]\n\ + movs r1, 0x1\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ +_08020A54:\n\ + ldrb r0, [r2]\n\ + cmp r0, 0\n\ + bne _08020B3E\n\ + ldr r2, _08020B00 @ =gBattleTypeFlags\n\ + ldrh r1, [r2]\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + mov r8, r2\n\ + cmp r0, 0\n\ + beq _08020B3E\n\ + movs r2, 0\n\ + movs r5, 0\n\ + ldr r0, _08020B04 @ =gNoOfAllBanks\n\ + ldrb r3, [r0]\n\ + mov r12, r0\n\ + ldr r7, _08020B08 @ =gBattlescriptCurrInstr\n\ + cmp r2, r3\n\ + bge _08020AA0\n\ + ldr r0, _08020B0C @ =gHitMarker\n\ + movs r1, 0x80\n\ + lsls r1, 21\n\ + ldr r6, [r0]\n\ + adds r4, r3, 0\n\ + ldr r3, _08020B10 @ =gSpecialStatuses\n\ +_08020A84:\n\ + adds r0, r1, 0\n\ + lsls r0, r5\n\ + ands r0, r6\n\ + cmp r0, 0\n\ + beq _08020A98\n\ + ldrb r0, [r3]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _08020A98\n\ + adds r2, 0x1\n\ +_08020A98:\n\ + adds r3, 0x28\n\ + adds r5, 0x2\n\ + cmp r5, r4\n\ + blt _08020A84\n\ +_08020AA0:\n\ + movs r4, 0\n\ + movs r5, 0x1\n\ + mov r0, r12\n\ + ldrb r3, [r0]\n\ + cmp r5, r3\n\ + bge _08020ADA\n\ + ldr r0, _08020B0C @ =gHitMarker\n\ + movs r1, 0x80\n\ + lsls r1, 21\n\ + mov r12, r1\n\ + ldr r1, [r0]\n\ + ldr r0, _08020B10 @ =gSpecialStatuses\n\ + adds r6, r3, 0\n\ + adds r3, r0, 0\n\ + adds r3, 0x14\n\ +_08020ABE:\n\ + mov r0, r12\n\ + lsls r0, r5\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08020AD2\n\ + ldrb r0, [r3]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _08020AD2\n\ + adds r4, 0x1\n\ +_08020AD2:\n\ + adds r3, 0x28\n\ + adds r5, 0x2\n\ + cmp r5, r6\n\ + blt _08020ABE\n\ +_08020ADA:\n\ + mov r0, r8\n\ + ldrh r1, [r0]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08020B14\n\ + adds r0, r4, r2\n\ + cmp r0, 0x1\n\ + bgt _08020B1C\n\ + b _08020B36\n\ + .align 2, 0\n\ +_08020AF0: .4byte gBattleExecBuffer\n\ +_08020AF4: .4byte gPlayerParty\n\ +_08020AF8: .4byte gBattleOutcome\n\ +_08020AFC: .4byte gEnemyParty\n\ +_08020B00: .4byte gBattleTypeFlags\n\ +_08020B04: .4byte gNoOfAllBanks\n\ +_08020B08: .4byte gBattlescriptCurrInstr\n\ +_08020B0C: .4byte gHitMarker\n\ +_08020B10: .4byte gSpecialStatuses\n\ +_08020B14:\n\ + cmp r4, 0\n\ + beq _08020B36\n\ + cmp r2, 0\n\ + beq _08020B36\n\ +_08020B1C:\n\ + ldr r2, [r7]\n\ + ldrb r1, [r2, 0x1]\n\ + ldrb r0, [r2, 0x2]\n\ + lsls r0, 8\n\ + adds r1, r0\n\ + ldrb r0, [r2, 0x3]\n\ + lsls r0, 16\n\ + adds r1, r0\n\ + ldrb r0, [r2, 0x4]\n\ + lsls r0, 24\n\ + adds r1, r0\n\ + str r1, [r7]\n\ + b _08020B46\n\ +_08020B36:\n\ + ldr r0, [r7]\n\ + adds r0, 0x5\n\ + str r0, [r7]\n\ + b _08020B46\n\ +_08020B3E:\n\ + ldr r1, _08020B50 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x5\n\ + str r0, [r1]\n\ +_08020B46:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08020B50: .4byte gBattlescriptCurrInstr\n\ + .syntax divided\n"); +} +#endif + +static void MoveValuesCleanUp(void) +{ + gBattleMoveFlags = 0; + BATTLE_STRUCT->dmgMultiplier = 1; + gCritMultiplier = 1; + gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + gBattleCommunication[6] = 0; + gHitMarker &= ~(HITMARKER_DESTINYBOND); + gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); +} + +static void atk25_move_values_cleanup(void) +{ + MoveValuesCleanUp(); + gBattlescriptCurrInstr += 1; +} + +static void atk26_set_multihit(void) +{ + gMultiHitCounter = BSScriptRead8(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr += 2; +} + +static void atk27_decrement_multihit(void) +{ + if (--gMultiHitCounter == 0) + gBattlescriptCurrInstr += 5; + else + gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atk28_goto(void) +{ + gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atk29_jumpifbyte(void) +{ + u8 caseID = BSScriptRead8(gBattlescriptCurrInstr + 1); + u8* ptr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); + u8 value = BSScriptRead8(gBattlescriptCurrInstr + 6); + u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 7); + gBattlescriptCurrInstr += 11; + switch (caseID) + { + case CMP_EQUAL: + if (*ptr == value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_NOT_EQUAL: + if (*ptr != value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_GREATER_THAN: + if (*ptr > value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_LESS_THAN: + if (*ptr < value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_COMMON_BITS: + if (*ptr & value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_NO_COMMON_BITS: + if (!(*ptr & value)) + gBattlescriptCurrInstr = jump_loc; + break; + } +} + +static void atk2A_jumpifhalfword(void) +{ + u8 caseID = BSScriptRead8(gBattlescriptCurrInstr + 1); + u16* ptr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); + u16 value = BS2ScriptRead16(gBattlescriptCurrInstr + 6); + u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 8); + gBattlescriptCurrInstr += 12; + switch (caseID) + { + case CMP_EQUAL: + if (*ptr == value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_NOT_EQUAL: + if (*ptr != value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_GREATER_THAN: + if (*ptr > value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_LESS_THAN: + if (*ptr < value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_COMMON_BITS: + if (*ptr & value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_NO_COMMON_BITS: + if (!(*ptr & value)) + gBattlescriptCurrInstr = jump_loc; + break; + } +} + +static void atk2B_jumpifword(void) +{ + u8 caseID = BSScriptRead8(gBattlescriptCurrInstr + 1); + u32* ptr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); + u32 value = BSScriptRead32(gBattlescriptCurrInstr + 6); + u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 10); + gBattlescriptCurrInstr += 14; + switch (caseID) + { + case CMP_EQUAL: + if (*ptr == value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_NOT_EQUAL: + if (*ptr != value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_GREATER_THAN: + if (*ptr > value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_LESS_THAN: + if (*ptr < value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_COMMON_BITS: + if (*ptr & value) + gBattlescriptCurrInstr = jump_loc; + break; + case CMP_NO_COMMON_BITS: + if (!(*ptr & value)) + gBattlescriptCurrInstr = jump_loc; + break; + } +} + +static void atk2C_jumpifarrayequal(void) +{ + //Mem1, Mem2, Size, Jump Loc + u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); + u32 size = BSScriptRead8(gBattlescriptCurrInstr + 9); + u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 10); + + u8 i; + for (i = 0; i < size; i++) + { + if (*mem1 != *mem2) + { + gBattlescriptCurrInstr += 14; + break; + } + mem1++, mem2++; + } + + if (i == size) + gBattlescriptCurrInstr = jump_loc; +} + +static void atk2D_jumpifarraynotequal(void) +{ + //Mem1, Mem2, Size, Jump Loc + u8 equal_bytes = 0; + u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); + u32 size = BSScriptRead8(gBattlescriptCurrInstr + 9); + u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 10); + + u8 i; + for (i = 0; i < size; i++) + { + if (*mem1 == *mem2) + { + equal_bytes++; + } + mem1++, mem2++; + } + + if (equal_bytes != size) + gBattlescriptCurrInstr = jump_loc; + else + gBattlescriptCurrInstr += 14; +} + +static void atk2E_setbyte(void) +{ + u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + *mem = BSScriptRead8(gBattlescriptCurrInstr + 5); + gBattlescriptCurrInstr += 6; +} + +static void atk2F_addbyte(void) +{ + u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + *mem += BSScriptRead8(gBattlescriptCurrInstr + 5); + gBattlescriptCurrInstr += 6; +} + +static void atk30_subbyte(void) +{ + u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + *mem -= BSScriptRead8(gBattlescriptCurrInstr + 5); + gBattlescriptCurrInstr += 6; +} + +static void atk31_copyarray(void) +{ + u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); + s32 size = BSScriptRead8(gBattlescriptCurrInstr + 9); + + s32 i; + for (i = 0; i < size; i++) + { + mem1[i] = mem2[i]; + } + + gBattlescriptCurrInstr += 10; +} + +static void atk32_copyarray_withindex(void) +{ + u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); + u8* index = BS2ScriptReadPtr(gBattlescriptCurrInstr + 9); + s32 size = BSScriptRead8(gBattlescriptCurrInstr + 13); + + s32 i; + for (i = 0; i < size; i++) + { + mem1[i] = mem2[i + *index]; + } + + gBattlescriptCurrInstr += 14; +} + +static void atk33_orbyte(void) +{ + u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + *mem |= BSScriptRead8(gBattlescriptCurrInstr + 5); + gBattlescriptCurrInstr += 6; +} + +static void atk34_orhalfword(void) +{ + u16* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + u16 val = BS2ScriptRead16(gBattlescriptCurrInstr + 5); + + *mem |= val; + gBattlescriptCurrInstr += 7; +} + +static void atk35_orword(void) +{ + u32* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + u32 val = BS2ScriptRead32(gBattlescriptCurrInstr + 5); + + *mem |= val; + gBattlescriptCurrInstr += 9; +} + +static void atk36_bicbyte(void) +{ + u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + *mem &= ~(BSScriptRead8(gBattlescriptCurrInstr + 5)); + gBattlescriptCurrInstr += 6; +} + +static void atk37_bichalfword(void) +{ + u16* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + u16 val = BS2ScriptRead16(gBattlescriptCurrInstr + 5); + + *mem &= ~val; + gBattlescriptCurrInstr += 7; +} + +static void atk38_bicword(void) +{ + u32* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + u32 val = BS2ScriptRead32(gBattlescriptCurrInstr + 5); + + *mem &= ~val; + gBattlescriptCurrInstr += 9; +} + +static void atk39_pause(void) +{ + if (gBattleExecBuffer == 0) + { + u16 value = BS2ScriptRead16(gBattlescriptCurrInstr + 1); + if (++gPauseCounterBattle >= value) + { + gPauseCounterBattle = 0; + gBattlescriptCurrInstr += 3; + } + } +} + +static void atk3A_waitstate(void) +{ + if (gBattleExecBuffer == 0) + gBattlescriptCurrInstr++; +} + +static void atk3B_healthbar_update(void) +{ + if (!BSScriptRead8(gBattlescriptCurrInstr + 1)) + gActiveBank = gBankTarget; + else + gActiveBank = gBankAttacker; + + EmitHealthBarUpdate(0, gBattleMoveDamage); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 2; +} + +static void atk3C_return(void) +{ + b_movescr_stack_pop_cursor(); +} + +static void atk3D_end(void) +{ + gBattleMoveFlags = 0; + gActiveBank = 0; + gFightStateTracker = 0xB; +} + +static void atk3E_end2(void) +{ + //not much difference between this and 3D. It's more apparent in Emerald + gActiveBank = 0; + gFightStateTracker = 0xB; +} + +static void atk3F_end3(void) //pops the main function stack +{ + b_movescr_stack_pop_cursor(); + if (B_FUNCTION_STACK->size) + B_FUNCTION_STACK->size--; + gBattleMainFunc = B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size]; +} + +static void atk41_call(void) +{ + b_movescr_stack_push(gBattlescriptCurrInstr + 5); + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atk42_jumpiftype2(void) //u8 bank, u8 type, *ptr +{ + u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + + if (BSScriptRead8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type1 || BSScriptRead8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type2) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; +} + +static void atk43_jumpifabilitypresent(void) +{ + if (AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, BSScriptRead8(gBattlescriptCurrInstr + 1), 0, 0)) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + else + gBattlescriptCurrInstr += 6; +} + +static void atk44(void) +{ + unk_2000000[gBankAttacker + 0x16060] = 1; +} + +#ifdef NONMATCHING + +static void atk45_playanimation(void) +{ + #define ANIMATION_ID BSScriptRead8(gBattlescriptCurrInstr + 2) + #define ARGUMENT (u16*) BS2ScriptReadPtr(gBattlescriptCurrInstr + 3) + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + + if ( ANIMATION_ID == 1 || ANIMATION_ID == 0x11 || ANIMATION_ID == 2) { + EmitBattleAnimation(0, ANIMATION_ID, *argument); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 7; + } else if (gHitMarker & HITMARKER_NO_ANIMATIONS) { + b_movescr_stack_push(gBattlescriptCurrInstr + 7); + gBattlescriptCurrInstr = BattleScript_Pausex20; + } else { + if (((ANIMATION_ID - 10) > 3 && gStatuses3[gActiveBank] & (STATUS3_SEMI_INVULNERABLE))) { + gBattlescriptCurrInstr += 7; + } else { + EmitBattleAnimation(0, ANIMATION_ID, *argument); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 7; + } + } +} + +#else +__attribute__((naked)) +static void atk45_playanimation(void) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + ldr r5, _08021444 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r5]\n\ + ldrb r0, [r0, 0x1]\n\ + bl GetBattleBank\n\ + ldr r6, _08021448 @ =gActiveBank\n\ + strb r0, [r6]\n\ + ldr r2, [r5]\n\ + ldrb r1, [r2, 0x3]\n\ + ldrb r0, [r2, 0x4]\n\ + lsls r0, 8\n\ + adds r1, r0\n\ + ldrb r0, [r2, 0x5]\n\ + lsls r0, 16\n\ + adds r1, r0\n\ + ldrb r0, [r2, 0x6]\n\ + lsls r0, 24\n\ + adds r3, r1, r0\n\ + ldrb r4, [r2, 0x2]\n\ + adds r0, r4, 0\n\ + cmp r0, 0x1\n\ + beq _08021426\n\ + cmp r0, 0x11\n\ + beq _08021426\n\ + cmp r0, 0x2\n\ + bne _0802144C\n\ +_08021426:\n\ + ldr r4, _08021444 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r4]\n\ + ldrb r1, [r0, 0x2]\n\ + ldrh r2, [r3]\n\ + movs r0, 0\n\ + bl EmitBattleAnimation\n\ + ldr r0, _08021448 @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + bl MarkBufferBankForExecution\n\ + ldr r0, [r4]\n\ + adds r0, 0x7\n\ + str r0, [r4]\n\ + b _080214AE\n\ + .align 2, 0\n\ +_08021444: .4byte gBattlescriptCurrInstr\n\ +_08021448: .4byte gActiveBank\n\ +_0802144C:\n\ + ldr r0, _08021464 @ =gHitMarker\n\ + ldr r0, [r0]\n\ + movs r1, 0x80\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0802146C\n\ + adds r0, r2, 0x7\n\ + bl b_movescr_stack_push\n\ + ldr r0, _08021468 @ =BattleScript_Pausex20\n\ + b _080214AC\n\ + .align 2, 0\n\ +_08021464: .4byte gHitMarker\n\ +_08021468: .4byte BattleScript_Pausex20\n\ +_0802146C:\n\ + adds r0, r4, 0\n\ + subs r0, 0xA\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x3\n\ + bls _08021498\n\ + ldr r1, _08021490 @ =gStatuses3\n\ + ldrb r0, [r6]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + ldr r1, _08021494 @ =0x000400c0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08021498\n\ + adds r0, r2, 0x7\n\ + b _080214AC\n\ + .align 2, 0\n\ +_08021490: .4byte gStatuses3\n\ +_08021494: .4byte 0x000400c0\n\ +_08021498:\n\ + ldrb r1, [r2, 0x2]\n\ + ldrh r2, [r3]\n\ + movs r0, 0\n\ + bl EmitBattleAnimation\n\ + ldrb r0, [r6]\n\ + bl MarkBufferBankForExecution\n\ + ldr r0, [r5]\n\ + adds r0, 0x7\n\ +_080214AC:\n\ + str r0, [r5]\n\ +_080214AE:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided"); +} +#endif // NONMATCHING + +#ifdef NONMATCHING +static void atk46_playanimation2(void) +{ + +} + +#else +__attribute__((naked)) +static void atk46_playanimation2(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + ldr r6, _0802151C @ =gBattlescriptCurrInstr\n\ + ldr r0, [r6]\n\ + ldrb r0, [r0, 0x1]\n\ + bl GetBattleBank\n\ + ldr r7, _08021520 @ =gActiveBank\n\ + strb r0, [r7]\n\ + ldr r2, [r6]\n\ + ldrb r1, [r2, 0x2]\n\ + ldrb r0, [r2, 0x3]\n\ + lsls r0, 8\n\ + adds r1, r0\n\ + ldrb r0, [r2, 0x4]\n\ + lsls r0, 16\n\ + adds r1, r0\n\ + ldrb r0, [r2, 0x5]\n\ + lsls r0, 24\n\ + adds r3, r1, r0\n\ + ldrb r1, [r2, 0x6]\n\ + ldrb r0, [r2, 0x7]\n\ + lsls r0, 8\n\ + adds r1, r0\n\ + ldrb r0, [r2, 0x8]\n\ + lsls r0, 16\n\ + adds r1, r0\n\ + ldrb r0, [r2, 0x9]\n\ + lsls r0, 24\n\ + adds r4, r1, r0\n\ + ldrb r5, [r3]\n\ + adds r0, r5, 0\n\ + cmp r0, 0x1\n\ + beq _080214FE\n\ + cmp r0, 0x11\n\ + beq _080214FE\n\ + cmp r0, 0x2\n\ + bne _08021524\n\ +_080214FE:\n\ + ldrb r1, [r3]\n\ + ldrh r2, [r4]\n\ + movs r0, 0\n\ + bl EmitBattleAnimation\n\ + ldr r0, _08021520 @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + bl MarkBufferBankForExecution\n\ + ldr r1, _0802151C @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0xA\n\ + str r0, [r1]\n\ + b _0802157A\n\ + .align 2, 0\n\ +_0802151C: .4byte gBattlescriptCurrInstr\n\ +_08021520: .4byte gActiveBank\n\ +_08021524:\n\ + ldr r0, _08021534 @ =gHitMarker\n\ + ldr r0, [r0]\n\ + movs r1, 0x80\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08021538\n\ + adds r0, r2, 0\n\ + b _08021576\n\ + .align 2, 0\n\ +_08021534: .4byte gHitMarker\n\ +_08021538:\n\ + adds r0, r5, 0\n\ + subs r0, 0xA\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x3\n\ + bls _08021564\n\ + ldr r1, _0802155C @ =gStatuses3\n\ + ldrb r0, [r7]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + ldr r1, _08021560 @ =0x000400c0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08021564\n\ + adds r0, r2, 0\n\ + b _08021576\n\ + .align 2, 0\n\ +_0802155C: .4byte gStatuses3\n\ +_08021560: .4byte 0x000400c0\n\ +_08021564:\n\ + ldrb r1, [r3]\n\ + ldrh r2, [r4]\n\ + movs r0, 0\n\ + bl EmitBattleAnimation\n\ + ldrb r0, [r7]\n\ + bl MarkBufferBankForExecution\n\ + ldr r0, [r6]\n\ +_08021576:\n\ + adds r0, 0xA\n\ + str r0, [r6]\n\ +_0802157A:\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided "); +} +#endif // NONMATCHING + +static void atk47_setgraphicalstatchangevalues(void) +{ + u8 to_add = 0; + switch (BATTLE_STRUCT->statChanger & 0xF0) + { + case 0x10: //+1 + to_add = 0xF; + break; + case 0x20: //+2 + to_add = 0x27; + break; + case 0x90: //-1 + to_add = 0x16; + break; + case 0xA0: //-2 + to_add = 0x2E; + break; + } + BATTLE_STRUCT->animArg1 = (BATTLE_STRUCT->statChanger & 0xF) + to_add - 1; + BATTLE_STRUCT->animArg2 = 0; + gBattlescriptCurrInstr++; +} + +#ifdef NONMATCHING +static void atk48_playstatchangeanimation(void) +{ + int curr_stat = 0; + u16 stat_animID = 0; + int changeable_stats = 0; + u32 stats_to_check; + u8 arg3; + + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + stats_to_check = BSScriptRead8(gBattlescriptCurrInstr + 2); + arg3 = BSScriptRead8(gBattlescriptCurrInstr + 3); + if (arg3 & 1) + { + u16 r1 = 0x15; + if (arg3 & 0x2) + r1 = 0x2D; + while (stats_to_check != 0) + { + if (!(stats_to_check & 1)) + continue; + if (!(BSScriptRead8(gBattlescriptCurrInstr + 3))) + { + u8 ability; + if (gSideTimer[GetBankIdentity(gActiveBank) & 1].mistTimer) + continue; + ability = gBattleMons[gActiveBank].ability; + if (ability == ABILITY_CLEAR_BODY || ability == ABILITY_WHITE_SMOKE || (ability == ABILITY_KEEN_EYE && curr_stat == 6) || (ability == ABILITY_HYPER_CUTTER && curr_stat == 1)) + continue; + } + if (gBattleMons[gActiveBank].statStages[curr_stat] > 0) + { + stat_animID = r1; + changeable_stats++; + } + + stats_to_check >>= 1; + r1 += 1; + curr_stat++; + } + if (changeable_stats > 1 && BSScriptRead8(gBattlescriptCurrInstr + 3) & 2) + stat_animID = 0x39; + else + stat_animID = 0x3A; + } + else + { + u16 r1 = 0x15; + if (arg3 & 0x2) + r1 = 0x2D; + while (stats_to_check != 0) + { + if (!(stats_to_check & 1)) + continue; + if (gBattleMons[gActiveBank].statStages[curr_stat] < 0xB) + { + stat_animID = r1; + changeable_stats++; + } + + stats_to_check >>= 1; + r1 += 1; + curr_stat++; + } + if (changeable_stats > 1 && BSScriptRead8(gBattlescriptCurrInstr + 3) & 2) + stat_animID = 0x37; + else + stat_animID = 0x38; + } + if ((BSScriptRead8(gBattlescriptCurrInstr + 3) & 2 && changeable_stats <= 1) + || changeable_stats == 0 || BATTLE_STRUCT->filler2[0] != 0) + gBattlescriptCurrInstr += 4; + else + { + EmitBattleAnimation(0, 1, stat_animID); + MarkBufferBankForExecution(gActiveBank); + if ((BSScriptRead8(gBattlescriptCurrInstr + 3) & 4) && changeable_stats > 1) + BATTLE_STRUCT->filler2[0] = 1; + gBattlescriptCurrInstr += 4; + } +} + +#else +__attribute__((naked)) +static void atk48_playstatchangeanimation(void) +{ + asm(".syntax unified\n\ +push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + movs r7, 0\n\ + movs r0, 0\n\ + mov r8, r0\n\ + movs r3, 0\n\ + ldr r5, _08021670 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r5]\n\ + ldrb r0, [r0, 0x1]\n\ + str r3, [sp]\n\ + bl GetBattleBank\n\ + ldr r2, _08021674 @ =gActiveBank\n\ + strb r0, [r2]\n\ + ldr r0, [r5]\n\ + ldrb r4, [r0, 0x2]\n\ + ldrb r1, [r0, 0x3]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + ldr r3, [sp]\n\ + cmp r0, 0\n\ + beq _08021710\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + movs r1, 0x15\n\ + cmp r0, 0\n\ + beq _0802163C\n\ + movs r1, 0x2D\n\ +_0802163C:\n\ + cmp r4, 0\n\ + beq _080216E4\n\ + movs r0, 0x1\n\ + mov r10, r0\n\ + ldr r0, _08021678 @ =gUnknown_02024A98\n\ + mov r9, r0\n\ + lsls r5, r1, 16\n\ +_0802164A:\n\ + adds r0, r4, 0\n\ + mov r1, r10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080216D6\n\ + ldr r0, _08021670 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r0]\n\ + ldrb r1, [r0, 0x3]\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0802167C\n\ + ldr r0, _08021674 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + adds r0, r7, r0\n\ + b _080216C4\n\ + .align 2, 0\n\ +_08021670: .4byte gBattlescriptCurrInstr\n\ +_08021674: .4byte gActiveBank\n\ +_08021678: .4byte gUnknown_02024A98\n\ +_0802167C:\n\ + ldr r6, _08021700 @ =gActiveBank\n\ + ldrb r0, [r6]\n\ + str r3, [sp]\n\ + bl GetBankIdentity\n\ + mov r1, r10\n\ + ands r1, r0\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _08021704 @ =gSideTimer\n\ + adds r0, r1\n\ + ldrb r0, [r0, 0x2]\n\ + ldr r3, [sp]\n\ + cmp r0, 0\n\ + bne _080216D6\n\ + ldr r0, _08021708 @ =gBattleMons\n\ + ldrb r2, [r6]\n\ + movs r1, 0x58\n\ + muls r2, r1\n\ + adds r0, r2, r0\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1D\n\ + beq _080216D6\n\ + cmp r0, 0x49\n\ + beq _080216D6\n\ + cmp r0, 0x33\n\ + bne _080216BA\n\ + cmp r7, 0x6\n\ + beq _080216D6\n\ +_080216BA:\n\ + cmp r0, 0x34\n\ + bne _080216C2\n\ + cmp r7, 0x1\n\ + beq _080216D6\n\ +_080216C2:\n\ + adds r0, r7, r2\n\ +_080216C4:\n\ + add r0, r9\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0\n\ + ble _080216D6\n\ + lsrs r0, r5, 16\n\ + mov r8, r0\n\ + adds r3, 0x1\n\ +_080216D6:\n\ + lsrs r4, 1\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + adds r5, r1\n\ + adds r7, 0x1\n\ + cmp r4, 0\n\ + bne _0802164A\n\ +_080216E4:\n\ + ldr r0, _0802170C @ =gBattlescriptCurrInstr\n\ + mov r9, r0\n\ + cmp r3, 0x1\n\ + ble _08021772\n\ + ldr r0, [r0]\n\ + ldrb r1, [r0, 0x3]\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + movs r1, 0x39\n\ + mov r8, r1\n\ + cmp r0, 0\n\ + beq _08021772\n\ + movs r0, 0x3A\n\ + b _08021770\n\ + .align 2, 0\n\ +_08021700: .4byte gActiveBank\n\ +_08021704: .4byte gSideTimer\n\ +_08021708: .4byte gBattleMons\n\ +_0802170C: .4byte gBattlescriptCurrInstr\n\ +_08021710:\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + movs r1, 0xE\n\ + cmp r0, 0\n\ + beq _0802171C\n\ + movs r1, 0x26\n\ +_0802171C:\n\ + mov r9, r5\n\ + cmp r4, 0\n\ + beq _08021758\n\ + ldr r6, _0802178C @ =gUnknown_02024A98\n\ + adds r5, r2, 0\n\ + lsls r2, r1, 16\n\ +_08021728:\n\ + movs r0, 0x1\n\ + ands r0, r4\n\ + cmp r0, 0\n\ + beq _0802174A\n\ + ldrb r1, [r5]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + adds r0, r7, r0\n\ + adds r0, r6\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0xB\n\ + bgt _0802174A\n\ + lsrs r1, r2, 16\n\ + mov r8, r1\n\ + adds r3, 0x1\n\ +_0802174A:\n\ + lsrs r4, 1\n\ + movs r0, 0x80\n\ + lsls r0, 9\n\ + adds r2, r0\n\ + adds r7, 0x1\n\ + cmp r4, 0\n\ + bne _08021728\n\ +_08021758:\n\ + cmp r3, 0x1\n\ + ble _08021772\n\ + mov r1, r9\n\ + ldr r0, [r1]\n\ + ldrb r1, [r0, 0x3]\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + movs r1, 0x37\n\ + mov r8, r1\n\ + cmp r0, 0\n\ + beq _08021772\n\ + movs r0, 0x38\n\ +_08021770:\n\ + mov r8, r0\n\ +_08021772:\n\ + mov r1, r9\n\ + ldr r2, [r1]\n\ + ldrb r1, [r2, 0x3]\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08021790\n\ + cmp r3, 0x1\n\ + bgt _08021790\n\ + adds r0, r2, 0x4\n\ + mov r1, r9\n\ + b _080217E6\n\ + .align 2, 0\n\ +_0802178C: .4byte gUnknown_02024A98\n\ +_08021790:\n\ + cmp r3, 0\n\ + beq _080217E0\n\ + ldr r0, _080217D0 @ =0x02000000\n\ + ldr r1, _080217D4 @ =0x000160dc\n\ + adds r4, r0, r1\n\ + ldrb r0, [r4]\n\ + cmp r0, 0\n\ + bne _080217E0\n\ + movs r0, 0\n\ + movs r1, 0x1\n\ + mov r2, r8\n\ + str r3, [sp]\n\ + bl EmitBattleAnimation\n\ + ldr r0, _080217D8 @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + bl MarkBufferBankForExecution\n\ + ldr r0, _080217DC @ =gBattlescriptCurrInstr\n\ + ldr r0, [r0]\n\ + ldrb r1, [r0, 0x3]\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + ldr r3, [sp]\n\ + cmp r0, 0\n\ + beq _080217CC\n\ + cmp r3, 0x1\n\ + ble _080217CC\n\ + movs r0, 0x1\n\ + strb r0, [r4]\n\ +_080217CC:\n\ + ldr r1, _080217DC @ =gBattlescriptCurrInstr\n\ + b _080217E2\n\ + .align 2, 0\n\ +_080217D0: .4byte 0x02000000\n\ +_080217D4: .4byte 0x000160dc\n\ +_080217D8: .4byte gActiveBank\n\ +_080217DC: .4byte gBattlescriptCurrInstr\n\ +_080217E0:\n\ + mov r1, r9\n\ +_080217E2:\n\ + ldr r0, [r1]\n\ + adds r0, 0x4\n\ +_080217E6:\n\ + str r0, [r1]\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided"); +} + +#endif // NONMATCHING + +#ifdef NONMATCHING +static void atk49_moveendturn(void) +{ + int i; + int effect = 0; + u16 last_move = 0, *choiced_move_atk; + int arg1, arg2, hold_effect_atk, move_type; + if (gLastUsedMove != 0xFFFF) + last_move = gLastUsedMove; + + arg1 = BSScriptRead8(gBattlescriptCurrInstr + 1); + arg2 = BSScriptRead8(gBattlescriptCurrInstr + 2); + if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) + hold_effect_atk = gEnigmaBerries[gBankAttacker].holdEffect; + else + hold_effect_atk = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); + + choiced_move_atk = (u16*)(gBankAttacker * 0x020160e8); + if (BATTLE_STRUCT->dynamicMoveType) + move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; + else + move_type = gBattleMoves[gCurrentMove].type; + + do + { + switch (BATTLE_STRUCT->cmd49StateTracker) + { + case 0: //rage check + if (gBattleMons[gBankTarget].status2 & STATUS2_RAGE + && gBattleMons[gBankTarget].hp && gBankAttacker != gBankTarget + && GetBankSide(gBankAttacker) != GetBankSide(gBankTarget) + && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT) && TARGET_TURN_DAMAGED + && gBattleMoves[gCurrentMove].power && gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] <= 0xB) + { + gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK]++; + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = gUnknown_081D9132; + effect = 1; + } + BATTLE_STRUCT->cmd49StateTracker++; + break; + case 1: //defrosting check + if (gBattleMons[gBankTarget].status1 & STATUS_FREEZE + && gBattleMons[gBankTarget].hp && gBankAttacker != gBankTarget + && gSpecialStatuses[gBankTarget].moveturnLostHP + && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT) && move_type == TYPE_FIRE) + { + gBattleMons[gBankTarget].status1 &= ~(STATUS_FREEZE); + gActiveBank = gBankTarget; + EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); + MarkBufferBankForExecution(gActiveBank); + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = gUnknown_081D955D; + effect = 1; + } + BATTLE_STRUCT->cmd49StateTracker++; + break; + case 2: //target synchronize + if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBankTarget, 0, 0, 0)) + effect = 1; + BATTLE_STRUCT->cmd49StateTracker++; + break; + case 3: //contact abilities + if (AbilityBattleEffects(ABILITYEFFECT_CONTACT, gBankTarget, 0, 0, 0)) + effect = 1; + BATTLE_STRUCT->cmd49StateTracker++; + break; + case 4: //status immunities + if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0)) + effect = 1; //it loops through 4 banks, so we increment after its done with all banks + else + BATTLE_STRUCT->cmd49StateTracker++; + break; + case 5: //attacker synchronize + if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBankAttacker, 0, 0, 0)) + effect = 1; + BATTLE_STRUCT->cmd49StateTracker++; + break; + case 6: //update choice band move + if (gHitMarker & HITMARKER_OBEYS && hold_effect_atk == HOLD_EFFECT_CHOICE_BAND + && gLastUsedMove != MOVE_STRUGGLE && (*choiced_move_atk == 0 || *choiced_move_atk == 0xFFF) + && gLastUsedMove != MOVE_BATON_PASS && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) + { + *choiced_move_atk = gLastUsedMove; + for (i = 0; i < 4 && gBattleMons[gBankAttacker].moves[i] != *choiced_move_atk; i++){} + if (i == 4) + *choiced_move_atk = 0; + } + BATTLE_STRUCT->cmd49StateTracker++; + break; + case 7: //changed held items + for (i = 0; i < gNoOfAllBanks; i++) + { + #define CHANGED_ITEM (((*u16)(0x020160f0))) + if (CHANGED_ITEM(i)) + gBattleMons[i].item = CHANGED_ITEM(i); + } + BATTLE_STRUCT->cmd49StateTracker++; + break; + case 8: //make sprite invisible + if (gStatuses3[gBankAttacker] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER) + && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) + { + gActiveBank = gBankAttacker; + EmitSpriteInvisibility(0, 1); + MarkBufferBankForExecution(gActiveBank); + } + BATTLE_STRUCT->cmd49StateTracker++; + break; + //sub_8015660 CheckIfMoveFailed + case 9: //semi-invlurneable attacker make visible + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) || !(gStatuses3[gBankAttacker] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + || sub_8015660(gBankAttacker)) + { + gActiveBank = gBankAttacker; + EmitSpriteInvisibility(0, 0); + MarkBufferBankForExecution(gActiveBank); + gStatuses3 &= ~(STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER); + gSpecialStatuses[gBankAttacker].restored_bank_sprite = 1; + } + BATTLE_STRUCT->cmd49StateTracker++; + break; + case 10: //semi-invlurneable target make visible + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) || !(gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + || sub_8015660(gBankTarget)) + { + gActiveBank = gBankTarget; + EmitSpriteInvisibility(0, 0); + MarkBufferBankForExecution(gActiveBank); + gStatuses3 &= ~(STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER); + gSpecialStatuses[gBankTarget].restored_bank_sprite = 1; + } + BATTLE_STRUCT->cmd49StateTracker++; + break; + case 11: // + } + + } while (effect == 0) +} +#else +__attribute__((naked)) +static void atk49_moveendturn(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x18\n\ + movs r0, 0\n\ + mov r10, r0\n\ + ldr r0, _08021834 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r0]\n\ + ldrb r1, [r0, 0x1]\n\ + str r1, [sp, 0x10]\n\ + ldrb r0, [r0, 0x2]\n\ + str r0, [sp, 0x14]\n\ + ldr r1, _08021838 @ =gBattleMons\n\ + ldr r0, _0802183C @ =gBankAttacker\n\ + ldrb r2, [r0]\n\ + movs r0, 0x58\n\ + muls r0, r2\n\ + adds r1, r0, r1\n\ + ldrh r0, [r1, 0x2E]\n\ + cmp r0, 0xAF\n\ + bne _08021844\n\ + ldr r1, _08021840 @ =gEnigmaBerries\n\ + lsls r0, r2, 3\n\ + subs r0, r2\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r0, [r0, 0x7]\n\ + b _0802184E\n\ + .align 2, 0\n\ +_08021834: .4byte gBattlescriptCurrInstr\n\ +_08021838: .4byte gBattleMons\n\ +_0802183C: .4byte gBankAttacker\n\ +_08021840: .4byte gEnigmaBerries\n\ +_08021844:\n\ + ldrh r0, [r1, 0x2E]\n\ + bl ItemId_GetHoldEffect\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ +_0802184E:\n\ + str r0, [sp, 0x8]\n\ + ldr r0, _0802186C @ =gBankAttacker\n\ + ldrb r1, [r0]\n\ + lsls r1, 1\n\ + ldr r0, _08021870 @ =0x020160e8\n\ + adds r1, r0\n\ + str r1, [sp, 0xC]\n\ + subs r0, 0xCC\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _080218C0\n\ + movs r2, 0x3F\n\ + ands r2, r0\n\ + str r2, [sp, 0x4]\n\ + b _080218D2\n\ + .align 2, 0\n\ +_0802186C: .4byte gBankAttacker\n\ +_08021870: .4byte 0x020160e8\n\ +_08021874:\n\ + strb r2, [r7]\n\ + ldr r0, [r5]\n\ + orrs r0, r6\n\ + str r0, [r5]\n\ + ldr r0, _080218AC @ =0x02000000\n\ + ldr r3, _080218B0 @ =0x0001600c\n\ + adds r0, r3\n\ + strb r4, [r0]\n\ + bl MoveValuesCleanUp\n\ + ldr r2, _080218B4 @ =gBattleScriptsEffectsTable\n\ + mov r4, r8\n\ + ldrh r1, [r4]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + add r0, r9\n\ + ldrb r0, [r0]\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldr r0, [r0]\n\ + bl b_movescr_stack_push\n\ + ldr r1, _080218B8 @ =gBattlescriptCurrInstr\n\ + ldr r0, _080218BC @ =gUnknown_081D9B2D\n\ + bl _0802229C\n\ + .align 2, 0\n\ +_080218AC: .4byte 0x02000000\n\ +_080218B0: .4byte 0x0001600c\n\ +_080218B4: .4byte gBattleScriptsEffectsTable\n\ +_080218B8: .4byte gBattlescriptCurrInstr\n\ +_080218BC: .4byte gUnknown_081D9B2D\n\ +_080218C0:\n\ + ldr r2, _080218D8 @ =gBattleMoves\n\ + ldr r0, _080218DC @ =gCurrentMove\n\ + ldrh r1, [r0]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldrb r0, [r0, 0x2]\n\ + str r0, [sp, 0x4]\n\ +_080218D2:\n\ + ldr r5, _080218E0 @ =0x02000000\n\ + mov r12, r5\n\ + b _080218EE\n\ + .align 2, 0\n\ +_080218D8: .4byte gBattleMoves\n\ +_080218DC: .4byte gCurrentMove\n\ +_080218E0: .4byte 0x02000000\n\ +_080218E4:\n\ + mov r0, r10\n\ + cmp r0, 0\n\ + beq _080218EE\n\ + bl _08022286\n\ +_080218EE:\n\ + ldr r0, _08021908 @ =0x0001600c\n\ + add r0, r12\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x11\n\ + bls _080218FC\n\ + bl _0802224E\n\ +_080218FC:\n\ + lsls r0, 2\n\ + ldr r1, _0802190C @ =_08021910\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_08021908: .4byte 0x0001600c\n\ +_0802190C: .4byte _08021910\n\ + .align 2, 0\n\ +_08021910:\n\ + .4byte _08021958\n\ + .4byte _08021A34\n\ + .4byte _08021AF0\n\ + .4byte _08021B20\n\ + .4byte _08021B44\n\ + .4byte _08021B78\n\ + .4byte _08021B9C\n\ + .4byte _08021C40\n\ + .4byte _08021C78\n\ + .4byte _08021CA8\n\ + .4byte _08021CCC\n\ + .4byte _08021D18\n\ + .4byte _08021DAC\n\ + .4byte _08021E30\n\ + .4byte _08021E70\n\ + .4byte _08022068\n\ + .4byte _080221C0\n\ + .4byte _0802224E\n\ +_08021958:\n\ + ldr r5, _08021A08 @ =gBattleMons\n\ + ldr r2, _08021A0C @ =gBankTarget\n\ + ldrb r4, [r2]\n\ + movs r6, 0x58\n\ + adds r3, r4, 0\n\ + muls r3, r6\n\ + adds r0, r5, 0\n\ + adds r0, 0x50\n\ + adds r0, r3, r0\n\ + ldr r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 16\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _080219FE\n\ + adds r0, r3, r5\n\ + ldrh r0, [r0, 0x28]\n\ + cmp r0, 0\n\ + beq _080219FE\n\ + ldr r0, _08021A10 @ =gBankAttacker\n\ + ldrb r1, [r0]\n\ + cmp r1, r4\n\ + beq _080219FE\n\ + adds r0, r1, 0\n\ + bl GetBankSide\n\ + adds r4, r0, 0\n\ + ldr r1, _08021A0C @ =gBankTarget\n\ + ldrb r0, [r1]\n\ + bl GetBankSide\n\ + lsls r4, 24\n\ + lsls r0, 24\n\ + cmp r4, r0\n\ + beq _080219FE\n\ + ldr r0, _08021A14 @ =gBattleMoveFlags\n\ + ldrb r1, [r0]\n\ + movs r0, 0x29\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080219FE\n\ + ldr r2, _08021A18 @ =gProtectStructs\n\ + ldr r4, _08021A0C @ =gBankTarget\n\ + ldrb r3, [r4]\n\ + lsls r1, r3, 4\n\ + adds r0, r2, 0x4\n\ + adds r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + bne _080219C8\n\ + adds r0, r2, 0\n\ + adds r0, 0x8\n\ + adds r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + beq _080219FE\n\ +_080219C8:\n\ + ldr r2, _08021A1C @ =gBattleMoves\n\ + ldr r0, _08021A20 @ =gCurrentMove\n\ + ldrh r1, [r0]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldrb r0, [r0, 0x1]\n\ + cmp r0, 0\n\ + beq _080219FE\n\ + adds r0, r3, 0\n\ + muls r0, r6\n\ + adds r1, r0, r5\n\ + ldrb r2, [r1, 0x19]\n\ + movs r0, 0x19\n\ + ldrsb r0, [r1, r0]\n\ + cmp r0, 0xB\n\ + bgt _080219FE\n\ + adds r0, r2, 0x1\n\ + strb r0, [r1, 0x19]\n\ + bl b_movescr_stack_push_cursor\n\ + ldr r1, _08021A24 @ =gBattlescriptCurrInstr\n\ + ldr r0, _08021A28 @ =gUnknown_081D9132\n\ + str r0, [r1]\n\ + movs r5, 0x1\n\ + mov r10, r5\n\ +_080219FE:\n\ + ldr r2, _08021A2C @ =0x02000000\n\ + ldr r0, _08021A30 @ =0x0001600c\n\ + adds r1, r2, r0\n\ + b _08021E00\n\ + .align 2, 0\n\ +_08021A08: .4byte gBattleMons\n\ +_08021A0C: .4byte gBankTarget\n\ +_08021A10: .4byte gBankAttacker\n\ +_08021A14: .4byte gBattleMoveFlags\n\ +_08021A18: .4byte gProtectStructs\n\ +_08021A1C: .4byte gBattleMoves\n\ +_08021A20: .4byte gCurrentMove\n\ +_08021A24: .4byte gBattlescriptCurrInstr\n\ +_08021A28: .4byte gUnknown_081D9132\n\ +_08021A2C: .4byte 0x02000000\n\ +_08021A30: .4byte 0x0001600c\n\ +_08021A34:\n\ + ldr r2, _08021AD0 @ =gBattleMons\n\ + ldr r1, _08021AD4 @ =gBankTarget\n\ + ldrb r4, [r1]\n\ + movs r3, 0x58\n\ + mov r12, r3\n\ + mov r3, r12\n\ + muls r3, r4\n\ + adds r7, r2, 0\n\ + adds r7, 0x4C\n\ + adds r6, r3, r7\n\ + ldr r5, [r6]\n\ + movs r0, 0x20\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + bne _08021A54\n\ + b _08021DFA\n\ +_08021A54:\n\ + adds r0, r3, r2\n\ + ldrh r0, [r0, 0x28]\n\ + cmp r0, 0\n\ + bne _08021A5E\n\ + b _08021DFA\n\ +_08021A5E:\n\ + ldr r0, _08021AD8 @ =gBankAttacker\n\ + ldrb r0, [r0]\n\ + cmp r0, r4\n\ + bne _08021A68\n\ + b _08021DFA\n\ +_08021A68:\n\ + ldr r0, _08021ADC @ =gSpecialStatuses\n\ + lsls r1, r4, 2\n\ + adds r1, r4\n\ + lsls r1, 2\n\ + adds r0, 0xC\n\ + adds r1, r0\n\ + ldr r0, [r1]\n\ + cmp r0, 0\n\ + bne _08021A7C\n\ + b _08021DFA\n\ +_08021A7C:\n\ + ldr r0, _08021AE0 @ =gBattleMoveFlags\n\ + ldrb r1, [r0]\n\ + movs r0, 0x29\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08021A8A\n\ + b _08021DFA\n\ +_08021A8A:\n\ + ldr r4, [sp, 0x4]\n\ + cmp r4, 0xA\n\ + beq _08021A92\n\ + b _08021DFA\n\ +_08021A92:\n\ + movs r0, 0x21\n\ + negs r0, r0\n\ + ands r5, r0\n\ + str r5, [r6]\n\ + ldr r4, _08021AE4 @ =gActiveBank\n\ + ldr r5, _08021AD4 @ =gBankTarget\n\ + ldrb r0, [r5]\n\ + strb r0, [r4]\n\ + ldrb r0, [r5]\n\ + mov r1, r12\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + adds r0, r7\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0x28\n\ + movs r2, 0\n\ + movs r3, 0x4\n\ + bl EmitSetAttributes\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + bl b_movescr_stack_push_cursor\n\ + ldr r1, _08021AE8 @ =gBattlescriptCurrInstr\n\ + ldr r0, _08021AEC @ =gUnknown_081D955D\n\ + str r0, [r1]\n\ + movs r2, 0x1\n\ + mov r10, r2\n\ + b _08021DFA\n\ + .align 2, 0\n\ +_08021AD0: .4byte gBattleMons\n\ +_08021AD4: .4byte gBankTarget\n\ +_08021AD8: .4byte gBankAttacker\n\ +_08021ADC: .4byte gSpecialStatuses\n\ +_08021AE0: .4byte gBattleMoveFlags\n\ +_08021AE4: .4byte gActiveBank\n\ +_08021AE8: .4byte gBattlescriptCurrInstr\n\ +_08021AEC: .4byte gUnknown_081D955D\n\ +_08021AF0:\n\ + ldr r0, _08021B14 @ =gBankTarget\n\ + ldrb r1, [r0]\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0x7\n\ + movs r2, 0\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08021B0C\n\ + movs r4, 0x1\n\ + mov r10, r4\n\ +_08021B0C:\n\ + ldr r2, _08021B18 @ =0x02000000\n\ + ldr r5, _08021B1C @ =0x0001600c\n\ + adds r1, r2, r5\n\ + b _08021E00\n\ + .align 2, 0\n\ +_08021B14: .4byte gBankTarget\n\ +_08021B18: .4byte 0x02000000\n\ +_08021B1C: .4byte 0x0001600c\n\ +_08021B20:\n\ + ldr r0, _08021B40 @ =gBankTarget\n\ + ldrb r1, [r0]\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0x4\n\ + movs r2, 0\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08021B3A\n\ + b _08021DFA\n\ +_08021B3A:\n\ + movs r0, 0x1\n\ + mov r10, r0\n\ + b _08021DFA\n\ + .align 2, 0\n\ +_08021B40: .4byte gBankTarget\n\ +_08021B44:\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0x5\n\ + movs r1, 0\n\ + movs r2, 0\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08021B68\n\ + movs r4, 0x1\n\ + mov r10, r4\n\ + ldr r5, _08021B64 @ =0x02000000\n\ + mov r12, r5\n\ + b _0802224E\n\ + .align 2, 0\n\ +_08021B64: .4byte 0x02000000\n\ +_08021B68:\n\ + ldr r2, _08021B70 @ =0x02000000\n\ + ldr r0, _08021B74 @ =0x0001600c\n\ + adds r1, r2, r0\n\ + b _08021E00\n\ + .align 2, 0\n\ +_08021B70: .4byte 0x02000000\n\ +_08021B74: .4byte 0x0001600c\n\ +_08021B78:\n\ + ldr r0, _08021B98 @ =gBankAttacker\n\ + ldrb r1, [r0]\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0x8\n\ + movs r2, 0\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08021B92\n\ + b _08021DFA\n\ +_08021B92:\n\ + movs r1, 0x1\n\ + mov r10, r1\n\ + b _08021DFA\n\ + .align 2, 0\n\ +_08021B98: .4byte gBankAttacker\n\ +_08021B9C:\n\ + ldr r0, _08021C28 @ =gHitMarker\n\ + ldr r0, [r0]\n\ + movs r1, 0x80\n\ + lsls r1, 18\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08021BE0\n\ + ldr r4, [sp, 0x8]\n\ + cmp r4, 0x1D\n\ + bne _08021BE0\n\ + ldr r0, _08021C2C @ =gUnknown_02024BE8\n\ + ldrh r2, [r0]\n\ + adds r7, r0, 0\n\ + cmp r2, 0xA5\n\ + beq _08021BE0\n\ + ldr r5, [sp, 0xC]\n\ + ldrh r1, [r5]\n\ + cmp r1, 0\n\ + beq _08021BC8\n\ + ldr r0, _08021C30 @ =0x0000ffff\n\ + cmp r1, r0\n\ + bne _08021BE0\n\ +_08021BC8:\n\ + cmp r2, 0xE2\n\ + bne _08021BDA\n\ + ldr r0, _08021C34 @ =gBattleMoveFlags\n\ + ldrb r1, [r0]\n\ + movs r0, 0x20\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08021BDA\n\ + b _08022244\n\ +_08021BDA:\n\ + ldrh r0, [r7]\n\ + ldr r1, [sp, 0xC]\n\ + strh r0, [r1]\n\ +_08021BE0:\n\ + movs r4, 0\n\ + ldr r2, _08021C38 @ =gBattleMons\n\ + ldr r3, _08021C3C @ =gBankAttacker\n\ + ldrb r1, [r3]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + adds r2, 0xC\n\ + adds r0, r2\n\ + ldrh r0, [r0]\n\ + ldr r5, [sp, 0xC]\n\ + ldrh r1, [r5]\n\ + mov r9, r3\n\ + cmp r0, r1\n\ + beq _08021C18\n\ + mov r6, r9\n\ + movs r3, 0x58\n\ + adds r5, r1, 0\n\ +_08021C02:\n\ + adds r4, 0x1\n\ + cmp r4, 0x3\n\ + bgt _08021C18\n\ + lsls r0, r4, 1\n\ + ldrb r1, [r6]\n\ + muls r1, r3\n\ + adds r0, r1\n\ + adds r0, r2\n\ + ldrh r0, [r0]\n\ + cmp r0, r5\n\ + bne _08021C02\n\ +_08021C18:\n\ + cmp r4, 0x4\n\ + beq _08021C1E\n\ + b _08022244\n\ +_08021C1E:\n\ + movs r0, 0\n\ + ldr r1, [sp, 0xC]\n\ +_08021C22:\n\ + strh r0, [r1]\n\ + b _08022244\n\ + .align 2, 0\n\ +_08021C28: .4byte gHitMarker\n\ +_08021C2C: .4byte gUnknown_02024BE8\n\ +_08021C30: .4byte 0x0000ffff\n\ +_08021C34: .4byte gBattleMoveFlags\n\ +_08021C38: .4byte gBattleMons\n\ +_08021C3C: .4byte gBankAttacker\n\ +_08021C40:\n\ + movs r4, 0\n\ + ldr r0, _08021C6C @ =gNoOfAllBanks\n\ + ldrb r2, [r0]\n\ + cmp r4, r2\n\ + blt _08021C4C\n\ + b _08022244\n\ +_08021C4C:\n\ + movs r5, 0\n\ + ldr r2, _08021C70 @ =0x020160f0\n\ + ldr r3, _08021C74 @ =gBattleMons\n\ +_08021C52:\n\ + ldrh r1, [r2]\n\ + cmp r1, 0\n\ + beq _08021C5C\n\ + strh r1, [r3, 0x2E]\n\ + strh r5, [r2]\n\ +_08021C5C:\n\ + adds r2, 0x2\n\ + adds r3, 0x58\n\ + adds r4, 0x1\n\ + ldrb r1, [r0]\n\ + cmp r4, r1\n\ + blt _08021C52\n\ + b _08022244\n\ + .align 2, 0\n\ +_08021C6C: .4byte gNoOfAllBanks\n\ +_08021C70: .4byte 0x020160f0\n\ +_08021C74: .4byte gBattleMons\n\ +_08021C78:\n\ + movs r0, 0x3\n\ + movs r1, 0\n\ + movs r2, 0\n\ + bl ItemBattleEffects\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08021C98\n\ + movs r2, 0x1\n\ + mov r10, r2\n\ + ldr r3, _08021C94 @ =0x02000000\n\ + mov r12, r3\n\ + b _0802224E\n\ + .align 2, 0\n\ +_08021C94: .4byte 0x02000000\n\ +_08021C98:\n\ + ldr r2, _08021CA0 @ =0x02000000\n\ + ldr r4, _08021CA4 @ =0x0001600c\n\ + adds r1, r2, r4\n\ + b _08021E00\n\ + .align 2, 0\n\ +_08021CA0: .4byte 0x02000000\n\ +_08021CA4: .4byte 0x0001600c\n\ +_08021CA8:\n\ + movs r0, 0x4\n\ + movs r1, 0\n\ + movs r2, 0\n\ + bl ItemBattleEffects\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08021CBC\n\ + movs r5, 0x1\n\ + mov r10, r5\n\ +_08021CBC:\n\ + ldr r2, _08021CC4 @ =0x02000000\n\ + ldr r0, _08021CC8 @ =0x0001600c\n\ + adds r1, r2, r0\n\ + b _08021E00\n\ + .align 2, 0\n\ +_08021CC4: .4byte 0x02000000\n\ +_08021CC8: .4byte 0x0001600c\n\ +_08021CCC:\n\ + ldr r1, _08021D04 @ =gStatuses3\n\ + ldr r0, _08021D08 @ =gBankAttacker\n\ + ldrb r2, [r0]\n\ + lsls r0, r2, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + ldr r1, _08021D0C @ =0x000400c0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08021CE2\n\ + b _08021DFA\n\ +_08021CE2:\n\ + ldr r0, _08021D10 @ =gHitMarker\n\ + ldr r0, [r0]\n\ + movs r1, 0x80\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08021CF0\n\ + b _08021DFA\n\ +_08021CF0:\n\ + ldr r4, _08021D14 @ =gActiveBank\n\ + strb r2, [r4]\n\ + movs r0, 0\n\ + movs r1, 0x1\n\ + bl EmitSpriteInvisibility\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + b _08021DFA\n\ + .align 2, 0\n\ +_08021D04: .4byte gStatuses3\n\ +_08021D08: .4byte gBankAttacker\n\ +_08021D0C: .4byte 0x000400c0\n\ +_08021D10: .4byte gHitMarker\n\ +_08021D14: .4byte gActiveBank\n\ +_08021D18:\n\ + ldr r0, _08021D88 @ =gBattleMoveFlags\n\ + ldrb r1, [r0]\n\ + movs r0, 0x29\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08021D44\n\ + ldr r1, _08021D8C @ =gStatuses3\n\ + ldr r0, _08021D90 @ =gBankAttacker\n\ + ldrb r2, [r0]\n\ + lsls r0, r2, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + ldr r1, _08021D94 @ =0x000400c0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08021D44\n\ + adds r0, r2, 0\n\ + bl sub_8015660\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08021D7E\n\ +_08021D44:\n\ + ldr r4, _08021D98 @ =gActiveBank\n\ + ldr r5, _08021D90 @ =gBankAttacker\n\ + ldrb r0, [r5]\n\ + strb r0, [r4]\n\ + movs r0, 0\n\ + movs r1, 0\n\ + bl EmitSpriteInvisibility\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + ldr r0, _08021D8C @ =gStatuses3\n\ + ldrb r2, [r5]\n\ + lsls r2, 2\n\ + adds r2, r0\n\ + ldr r0, [r2]\n\ + ldr r1, _08021D9C @ =0xfffbff3f\n\ + ands r0, r1\n\ + str r0, [r2]\n\ + ldr r2, _08021DA0 @ =gSpecialStatuses\n\ + ldrb r1, [r5]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldrb r1, [r0]\n\ + movs r2, 0x4\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ +_08021D7E:\n\ + ldr r2, _08021DA4 @ =0x02000000\n\ + ldr r4, _08021DA8 @ =0x0001600c\n\ + adds r1, r2, r4\n\ + b _08021E00\n\ + .align 2, 0\n\ +_08021D88: .4byte gBattleMoveFlags\n\ +_08021D8C: .4byte gStatuses3\n\ +_08021D90: .4byte gBankAttacker\n\ +_08021D94: .4byte 0x000400c0\n\ +_08021D98: .4byte gActiveBank\n\ +_08021D9C: .4byte 0xfffbff3f\n\ +_08021DA0: .4byte gSpecialStatuses\n\ +_08021DA4: .4byte 0x02000000\n\ +_08021DA8: .4byte 0x0001600c\n\ +_08021DAC:\n\ + ldr r2, _08021E0C @ =gSpecialStatuses\n\ + ldr r1, _08021E10 @ =gBankTarget\n\ + ldrb r3, [r1]\n\ + lsls r4, r3, 2\n\ + adds r0, r4, r3\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + lsls r0, 29\n\ + cmp r0, 0\n\ + blt _08021DFA\n\ + ldr r0, _08021E14 @ =gNoOfAllBanks\n\ + ldrb r0, [r0]\n\ + cmp r3, r0\n\ + bcs _08021DFA\n\ + ldr r5, _08021E18 @ =gStatuses3\n\ + adds r0, r4, r5\n\ + ldr r0, [r0]\n\ + ldr r1, _08021E1C @ =0x000400c0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08021DFA\n\ + ldr r4, _08021E20 @ =gActiveBank\n\ + strb r3, [r4]\n\ + movs r0, 0\n\ + movs r1, 0\n\ + bl EmitSpriteInvisibility\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + ldr r0, _08021E10 @ =gBankTarget\n\ + ldrb r2, [r0]\n\ + lsls r2, 2\n\ + adds r2, r5\n\ + ldr r0, [r2]\n\ + ldr r1, _08021E24 @ =0xfffbff3f\n\ + ands r0, r1\n\ + str r0, [r2]\n\ +_08021DFA:\n\ + ldr r2, _08021E28 @ =0x02000000\n\ + ldr r3, _08021E2C @ =0x0001600c\n\ + adds r1, r2, r3\n\ +_08021E00:\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + mov r12, r2\n\ + b _0802224E\n\ + .align 2, 0\n\ +_08021E0C: .4byte gSpecialStatuses\n\ +_08021E10: .4byte gBankTarget\n\ +_08021E14: .4byte gNoOfAllBanks\n\ +_08021E18: .4byte gStatuses3\n\ +_08021E1C: .4byte 0x000400c0\n\ +_08021E20: .4byte gActiveBank\n\ +_08021E24: .4byte 0xfffbff3f\n\ +_08021E28: .4byte 0x02000000\n\ +_08021E2C: .4byte 0x0001600c\n\ +_08021E30:\n\ + movs r4, 0\n\ + ldr r0, _08021E60 @ =gNoOfAllBanks\n\ + ldrb r5, [r0]\n\ + cmp r4, r5\n\ + blt _08021E3C\n\ + b _08022244\n\ +_08021E3C:\n\ + ldr r2, _08021E64 @ =gDisableStructs\n\ + ldr r5, _08021E68 @ =0xfeffffff\n\ + adds r3, r0, 0\n\ + ldr r1, _08021E6C @ =gUnknown_02024AD0\n\ +_08021E44:\n\ + ldrb r0, [r2, 0xA]\n\ + cmp r0, 0\n\ + bne _08021E50\n\ + ldr r0, [r1]\n\ + ands r0, r5\n\ + str r0, [r1]\n\ +_08021E50:\n\ + adds r2, 0x1C\n\ + adds r1, 0x58\n\ + adds r4, 0x1\n\ + ldrb r0, [r3]\n\ + cmp r4, r0\n\ + blt _08021E44\n\ + b _08022244\n\ + .align 2, 0\n\ +_08021E60: .4byte gNoOfAllBanks\n\ +_08021E64: .4byte gDisableStructs\n\ +_08021E68: .4byte 0xfeffffff\n\ +_08021E6C: .4byte gUnknown_02024AD0\n\ +_08021E70:\n\ + ldr r1, _08021F2C @ =gHitMarker\n\ + ldr r3, [r1]\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + ands r0, r3\n\ + ldr r2, _08021F30 @ =gBankAttacker\n\ + mov r9, r2\n\ + adds r5, r1, 0\n\ + cmp r0, 0\n\ + beq _08021E9A\n\ + ldr r0, _08021F34 @ =gActiveBank\n\ + ldrb r2, [r2]\n\ + strb r2, [r0]\n\ + ldr r1, _08021F38 @ =gBankTarget\n\ + ldrb r0, [r1]\n\ + mov r4, r9\n\ + strb r0, [r4]\n\ + strb r2, [r1]\n\ + ldr r0, _08021F3C @ =0xffffefff\n\ + ands r3, r0\n\ + str r3, [r5]\n\ +_08021E9A:\n\ + ldr r1, _08021F40 @ =gBattleMoves\n\ + ldr r2, _08021F44 @ =gUnknown_02024BE8\n\ + ldrh r3, [r2]\n\ + lsls r0, r3, 1\n\ + adds r0, r3\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + mov r8, r1\n\ + adds r7, r2, 0\n\ + cmp r0, 0x7F\n\ + bne _08021EBE\n\ + ldr r0, _08021F48 @ =gBattleMoveFlags\n\ + ldrb r1, [r0]\n\ + movs r0, 0x29\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08021ECA\n\ +_08021EBE:\n\ + ldr r1, _08021F4C @ =gUnknown_02024C2C\n\ + mov r2, r9\n\ + ldrb r0, [r2]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + strh r3, [r0]\n\ +_08021ECA:\n\ + ldr r0, _08021F50 @ =gAbsentBankFlags\n\ + ldrb r1, [r0]\n\ + ldr r2, _08021F54 @ =gBitTable\n\ + mov r3, r9\n\ + ldrb r4, [r3]\n\ + lsls r0, r4, 2\n\ + adds r0, r2\n\ + ldr r3, [r0]\n\ + ands r1, r3\n\ + adds r6, r2, 0\n\ + cmp r1, 0\n\ + beq _08021EE4\n\ + b _08022244\n\ +_08021EE4:\n\ + ldr r0, _08021F58 @ =0x000160a6\n\ + add r0, r12\n\ + ldrb r0, [r0]\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _08021EF2\n\ + b _08022244\n\ +_08021EF2:\n\ + ldrh r2, [r7]\n\ + lsls r0, r2, 1\n\ + adds r0, r2\n\ + lsls r0, 2\n\ + add r0, r8\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x7F\n\ + bne _08021F04\n\ + b _08022244\n\ +_08021F04:\n\ + ldr r0, [r5]\n\ + movs r1, 0x80\n\ + lsls r1, 18\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08021F68\n\ + ldr r1, _08021F5C @ =gLastUsedMove\n\ + lsls r0, r4, 1\n\ + adds r0, r1\n\ + strh r2, [r0]\n\ + ldr r0, _08021F60 @ =gUnknown_02024C4C\n\ + mov r4, r9\n\ + ldrb r1, [r4]\n\ + lsls r1, 1\n\ + adds r1, r0\n\ + ldr r0, _08021F64 @ =gCurrentMove\n\ + ldrh r0, [r0]\n\ + strh r0, [r1]\n\ + b _08021F82\n\ + .align 2, 0\n\ +_08021F2C: .4byte gHitMarker\n\ +_08021F30: .4byte gBankAttacker\n\ +_08021F34: .4byte gActiveBank\n\ +_08021F38: .4byte gBankTarget\n\ +_08021F3C: .4byte 0xffffefff\n\ +_08021F40: .4byte gBattleMoves\n\ +_08021F44: .4byte gUnknown_02024BE8\n\ +_08021F48: .4byte gBattleMoveFlags\n\ +_08021F4C: .4byte gUnknown_02024C2C\n\ +_08021F50: .4byte gAbsentBankFlags\n\ +_08021F54: .4byte gBitTable\n\ +_08021F58: .4byte 0x000160a6\n\ +_08021F5C: .4byte gLastUsedMove\n\ +_08021F60: .4byte gUnknown_02024C4C\n\ +_08021F64: .4byte gCurrentMove\n\ +_08021F68:\n\ + ldr r1, _08021FD0 @ =gLastUsedMove\n\ + lsls r0, r4, 1\n\ + adds r0, r1\n\ + ldr r1, _08021FD4 @ =0x0000ffff\n\ + strh r1, [r0]\n\ + ldr r1, _08021FD8 @ =gUnknown_02024C4C\n\ + mov r2, r9\n\ + ldrb r0, [r2]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + strh r1, [r0]\n\ +_08021F82:\n\ + ldr r2, _08021FDC @ =gBankTarget\n\ + ldrb r3, [r2]\n\ + lsls r0, r3, 2\n\ + adds r0, r6\n\ + ldr r0, [r0]\n\ + lsls r0, 28\n\ + ldr r1, [r5]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + bne _08021FA0\n\ + ldr r0, _08021FE0 @ =gUnknown_02024C5C\n\ + adds r0, r3, r0\n\ + mov r3, r9\n\ + ldrb r1, [r3]\n\ + strb r1, [r0]\n\ +_08021FA0:\n\ + ldr r0, [r5]\n\ + movs r1, 0x80\n\ + lsls r1, 18\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0802204C\n\ + ldr r0, _08021FE4 @ =gBattleMoveFlags\n\ + ldrb r1, [r0]\n\ + movs r0, 0x29\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0802204C\n\ + ldrh r2, [r7]\n\ + ldr r0, _08021FD4 @ =0x0000ffff\n\ + cmp r2, r0\n\ + bne _08021FEC\n\ + ldr r1, _08021FE8 @ =gMoveHitWith\n\ + ldr r4, _08021FDC @ =gBankTarget\n\ + ldrb r0, [r4]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + strh r2, [r0]\n\ + b _08022244\n\ + .align 2, 0\n\ +_08021FD0: .4byte gLastUsedMove\n\ +_08021FD4: .4byte 0x0000ffff\n\ +_08021FD8: .4byte gUnknown_02024C4C\n\ +_08021FDC: .4byte gBankTarget\n\ +_08021FE0: .4byte gUnknown_02024C5C\n\ +_08021FE4: .4byte gBattleMoveFlags\n\ +_08021FE8: .4byte gMoveHitWith\n\ +_08021FEC:\n\ + ldr r0, _08022014 @ =gMoveHitWith\n\ + ldr r5, _08022018 @ =gBankTarget\n\ + ldrb r1, [r5]\n\ + lsls r1, 1\n\ + adds r1, r0\n\ + ldr r4, _0802201C @ =gCurrentMove\n\ + ldrh r0, [r4]\n\ + strh r0, [r1]\n\ + ldr r0, _08022020 @ =0x0001601c\n\ + add r0, r12\n\ + ldrb r3, [r0]\n\ + cmp r3, 0\n\ + beq _08022028\n\ + ldr r0, _08022024 @ =gUnknown_02024C44\n\ + ldrb r1, [r5]\n\ + lsls r1, 1\n\ + adds r1, r0\n\ + movs r0, 0x3F\n\ + ands r0, r3\n\ + b _08021C22\n\ + .align 2, 0\n\ +_08022014: .4byte gMoveHitWith\n\ +_08022018: .4byte gBankTarget\n\ +_0802201C: .4byte gCurrentMove\n\ +_08022020: .4byte 0x0001601c\n\ +_08022024: .4byte gUnknown_02024C44\n\ +_08022028:\n\ + ldr r0, _08022044 @ =gUnknown_02024C44\n\ + ldr r1, _08022048 @ =gBankTarget\n\ + ldrb r2, [r1]\n\ + lsls r2, 1\n\ + adds r2, r0\n\ + ldrh r1, [r4]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + add r0, r8\n\ + ldrb r0, [r0, 0x2]\n\ + strh r0, [r2]\n\ + b _08022244\n\ + .align 2, 0\n\ +_08022044: .4byte gUnknown_02024C44\n\ +_08022048: .4byte gBankTarget\n\ +_0802204C:\n\ + ldr r0, _0802205C @ =gMoveHitWith\n\ + ldr r2, _08022060 @ =gBankTarget\n\ + ldrb r1, [r2]\n\ + lsls r1, 1\n\ + adds r1, r0\n\ + ldr r0, _08022064 @ =0x0000ffff\n\ + b _08021C22\n\ + .align 2, 0\n\ +_0802205C: .4byte gMoveHitWith\n\ +_08022060: .4byte gBankTarget\n\ +_08022064: .4byte 0x0000ffff\n\ +_08022068:\n\ + ldr r0, _0802212C @ =gAbsentBankFlags\n\ + ldrb r1, [r0]\n\ + ldr r6, _08022130 @ =gBitTable\n\ + ldr r2, _08022134 @ =gBankAttacker\n\ + ldrb r5, [r2]\n\ + lsls r0, r5, 2\n\ + adds r0, r6\n\ + ldr r4, [r0]\n\ + ands r1, r4\n\ + mov r9, r2\n\ + cmp r1, 0\n\ + beq _08022082\n\ + b _08022244\n\ +_08022082:\n\ + ldr r0, _08022138 @ =0x000160a6\n\ + add r0, r12\n\ + ldrb r0, [r0]\n\ + ands r0, r4\n\ + cmp r0, 0\n\ + beq _08022090\n\ + b _08022244\n\ +_08022090:\n\ + ldr r1, _0802213C @ =gBattleMoves\n\ + ldr r4, _08022140 @ =gUnknown_02024BE8\n\ + ldrh r3, [r4]\n\ + lsls r0, r3, 1\n\ + adds r0, r3\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r1, [r0, 0x8]\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0802215C\n\ + ldr r0, _08022144 @ =gHitMarker\n\ + ldr r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 18\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0802215C\n\ + ldr r2, _08022148 @ =gBankTarget\n\ + ldrb r0, [r2]\n\ + cmp r5, r0\n\ + bne _080220C0\n\ + b _08022244\n\ +_080220C0:\n\ + adds r2, r0, 0\n\ + lsls r0, r2, 2\n\ + adds r0, r6\n\ + ldr r0, [r0]\n\ + lsls r0, 28\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + bne _0802215C\n\ + ldr r0, _0802214C @ =gBattleMoveFlags\n\ + ldrb r1, [r0]\n\ + movs r0, 0x29\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0802215C\n\ + lsls r0, r2, 1\n\ + ldr r5, _08022150 @ =0x000160ac\n\ + adds r0, r5\n\ + add r0, r12\n\ + strb r3, [r0]\n\ + ldr r0, _08022148 @ =gBankTarget\n\ + ldrb r1, [r0]\n\ + lsls r1, 1\n\ + ldr r2, _08022154 @ =0x000160ad\n\ + adds r1, r2\n\ + add r1, r12\n\ + ldrh r0, [r4]\n\ + lsrs r0, 8\n\ + strb r0, [r1]\n\ + ldr r3, _08022148 @ =gBankTarget\n\ + ldrb r2, [r3]\n\ + lsls r2, 2\n\ + mov r5, r9\n\ + ldrb r0, [r5]\n\ + lsrs r0, 1\n\ + lsls r0, 1\n\ + ldr r1, _08022158 @ =0x00016100\n\ + adds r0, r1\n\ + adds r2, r0\n\ + add r2, r12\n\ + ldrh r0, [r4]\n\ + strb r0, [r2]\n\ + ldrb r2, [r3]\n\ + lsls r2, 2\n\ + ldrb r0, [r5]\n\ + lsrs r0, 1\n\ + lsls r0, 1\n\ + adds r1, 0x1\n\ + adds r0, r1\n\ + adds r2, r0\n\ + add r2, r12\n\ + ldrh r0, [r4]\n\ + lsrs r0, 8\n\ + strb r0, [r2]\n\ + b _08022244\n\ + .align 2, 0\n\ +_0802212C: .4byte gAbsentBankFlags\n\ +_08022130: .4byte gBitTable\n\ +_08022134: .4byte gBankAttacker\n\ +_08022138: .4byte 0x000160a6\n\ +_0802213C: .4byte gBattleMoves\n\ +_08022140: .4byte gUnknown_02024BE8\n\ +_08022144: .4byte gHitMarker\n\ +_08022148: .4byte gBankTarget\n\ +_0802214C: .4byte gBattleMoveFlags\n\ +_08022150: .4byte 0x000160ac\n\ +_08022154: .4byte 0x000160ad\n\ +_08022158: .4byte 0x00016100\n\ +_0802215C:\n\ + mov r1, r9\n\ + ldrb r0, [r1]\n\ + ldr r2, _080221B4 @ =gBankTarget\n\ + ldrb r2, [r2]\n\ + cmp r0, r2\n\ + beq _08022244\n\ + ldr r3, _080221B4 @ =gBankTarget\n\ + ldrb r0, [r3]\n\ + lsls r0, 1\n\ + ldr r4, _080221B8 @ =0x000160ac\n\ + adds r0, r4\n\ + add r0, r12\n\ + movs r3, 0\n\ + strb r3, [r0]\n\ + ldr r5, _080221B4 @ =gBankTarget\n\ + ldrb r0, [r5]\n\ + lsls r0, 1\n\ + ldr r1, _080221BC @ =0x000160ad\n\ + adds r0, r1\n\ + add r0, r12\n\ + strb r3, [r0]\n\ + ldrb r2, [r5]\n\ + lsls r2, 2\n\ + mov r4, r9\n\ + ldrb r0, [r4]\n\ + lsrs r0, 1\n\ + lsls r0, 1\n\ + adds r1, 0x53\n\ + adds r0, r1\n\ + adds r2, r0\n\ + add r2, r12\n\ + strb r3, [r2]\n\ + ldrb r2, [r5]\n\ + lsls r2, 2\n\ + ldrb r0, [r4]\n\ + lsrs r0, 1\n\ + lsls r0, 1\n\ + adds r1, 0x1\n\ + adds r0, r1\n\ + adds r2, r0\n\ + add r2, r12\n\ + strb r3, [r2]\n\ + b _08022244\n\ + .align 2, 0\n\ +_080221B4: .4byte gBankTarget\n\ +_080221B8: .4byte 0x000160ac\n\ +_080221BC: .4byte 0x000160ad\n\ +_080221C0:\n\ + ldr r5, _080222B0 @ =gHitMarker\n\ + ldr r2, [r5]\n\ + movs r0, 0x80\n\ + lsls r0, 12\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _08022244\n\ + ldr r0, _080222B4 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08022244\n\ + ldr r1, _080222B8 @ =gProtectStructs\n\ + ldr r0, _080222BC @ =gBankAttacker\n\ + ldrb r0, [r0]\n\ + lsls r0, 4\n\ + adds r0, r1\n\ + ldrb r0, [r0, 0x1]\n\ + lsls r0, 29\n\ + cmp r0, 0\n\ + blt _08022244\n\ + ldr r0, _080222C0 @ =gBattleMoves\n\ + mov r9, r0\n\ + ldr r1, _080222C4 @ =gCurrentMove\n\ + mov r8, r1\n\ + ldrh r0, [r1]\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + add r1, r9\n\ + ldrb r0, [r1, 0x6]\n\ + cmp r0, 0x8\n\ + bne _08022244\n\ + movs r6, 0x80\n\ + lsls r6, 2\n\ + adds r4, r6, 0\n\ + ands r4, r2\n\ + cmp r4, 0\n\ + bne _08022244\n\ + ldr r7, _080222C8 @ =gBankTarget\n\ + ldrb r0, [r7]\n\ + bl GetBankIdentity\n\ + movs r1, 0x2\n\ + eors r0, r1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetBankByPlayerAI\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + ldr r1, _080222CC @ =gBattleMons\n\ + movs r0, 0x58\n\ + muls r0, r2\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x28]\n\ + cmp r0, 0\n\ + beq _0802223A\n\ + bl _08021874\n\ +_0802223A:\n\ + ldr r0, [r5]\n\ + orrs r0, r6\n\ + str r0, [r5]\n\ + ldr r2, _080222D0 @ =0x02000000\n\ + mov r12, r2\n\ +_08022244:\n\ + ldr r1, _080222D4 @ =0x0001600c\n\ + add r1, r12\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ +_0802224E:\n\ + ldr r3, [sp, 0x10]\n\ + cmp r3, 0x1\n\ + bne _08022262\n\ + mov r4, r10\n\ + cmp r4, 0\n\ + bne _08022262\n\ + ldr r1, _080222D4 @ =0x0001600c\n\ + add r1, r12\n\ + movs r0, 0x11\n\ + strb r0, [r1]\n\ +_08022262:\n\ + ldr r5, [sp, 0x10]\n\ + cmp r5, 0x2\n\ + bne _08022278\n\ + ldr r1, _080222D4 @ =0x0001600c\n\ + add r1, r12\n\ + ldr r0, [sp, 0x14]\n\ + ldrb r2, [r1]\n\ + cmp r0, r2\n\ + bne _08022278\n\ + movs r0, 0x11\n\ + strb r0, [r1]\n\ +_08022278:\n\ + ldr r0, _080222D4 @ =0x0001600c\n\ + add r0, r12\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x11\n\ + beq _08022286\n\ + bl _080218E4\n\ +_08022286:\n\ + ldr r0, _080222D4 @ =0x0001600c\n\ + add r0, r12\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x11\n\ + bne _0802229E\n\ + mov r3, r10\n\ + cmp r3, 0\n\ + bne _0802229E\n\ + ldr r1, _080222D8 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x3\n\ +_0802229C:\n\ + str r0, [r1]\n\ +_0802229E:\n\ + add sp, 0x18\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080222B0: .4byte gHitMarker\n\ +_080222B4: .4byte gBattleTypeFlags\n\ +_080222B8: .4byte gProtectStructs\n\ +_080222BC: .4byte gBankAttacker\n\ +_080222C0: .4byte gBattleMoves\n\ +_080222C4: .4byte gCurrentMove\n\ +_080222C8: .4byte gBankTarget\n\ +_080222CC: .4byte gBattleMons\n\ +_080222D0: .4byte 0x02000000\n\ +_080222D4: .4byte 0x0001600c\n\ +_080222D8: .4byte gBattlescriptCurrInstr\n\ + .syntax divided" + ); +} +#endif // NONMATCHING + +static void atk4A_typecalc2(void) +{ + u8 flags = 0; + int i = 0; + u8 move_type = gBattleMoves[gCurrentMove].type; + + if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) + { + gLastUsedAbility = gBattleMons[gBankTarget].ability; + gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); + gMoveHitWith[gBankTarget] = 0; + gBattleCommunication[6] = move_type; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); + } + else + { + while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) + { + if (gTypeEffectiveness[i] == TYPE_FORESIGHT) + { + if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) {break;} + else {i += 3; continue;} + } + + if (gTypeEffectiveness[i] == move_type) + { + //check type1 + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) + { + if (gTypeEffectiveness[i + 2] == 0) + { + gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED; + break; + } + if (gTypeEffectiveness[i + 2] == 5) + flags |= MOVESTATUS_NOTVERYEFFECTIVE; + if (gTypeEffectiveness[i + 2] == 20) + flags |= MOVESTATUS_SUPEREFFECTIVE; + } + //check type2 + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2) + { + if (gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 + && gTypeEffectiveness[i + 2] == 0) + { + gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED; + break; + } + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && gTypeEffectiveness[i + 2] == 5) + flags |= MOVESTATUS_NOTVERYEFFECTIVE; + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 + && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && gTypeEffectiveness[i + 2] == 20) + flags |= MOVESTATUS_SUPEREFFECTIVE; + } + } + i += 3; + } + } + + if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && !(flags & MOVESTATUS_NOEFFECT) && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 && + (!(flags & MOVESTATUS_SUPEREFFECTIVE) || ((flags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) && + gBattleMoves[gCurrentMove].power) + { + gLastUsedAbility = ABILITY_WONDER_GUARD; + gBattleMoveFlags |= MOVESTATUS_MISSED; + gMoveHitWith[gBankTarget] = 0; + gBattleCommunication[6] = 3; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); + } + if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) + gProtectStructs[gBankAttacker].notEffective = 1; + + gBattlescriptCurrInstr++; +} + +static void atk4B_return_atk_to_ball(void) +{ + gActiveBank = gBankAttacker; + if (!(gHitMarker & HITMARKER_FAINTED(gActiveBank))) + { + EmitReturnPokeToBall(0, 0); + MarkBufferBankForExecution(gActiveBank); + } + gBattlescriptCurrInstr++; +} + +static void atk4C_copy_poke_data(void) +{ + if (gBattleExecBuffer) + return; + + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + + gBattlePartyID[gActiveBank] = unk_2000000[0x16068 + gActiveBank]; + + EmitGetAttributes(0, 0, gBitTable[gBattlePartyID[gActiveBank]]); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 2; +} + +static inline u8 get_knocked_off_byte(u8 bank) +{ + register u32 side asm("r2") = GetBankSide(bank); + register struct WishFutureKnock* dummy = &gWishFutureKnock; + register u8* aa = ((u8*)((u8*)(dummy))); + register u8* bb = aa + 0x29; + register u8* cc asm("r0") = side + bb; + return *cc; +} + +static void atk4D_switch_data_update(void) +{ + struct BattlePokemon OldData; + int i; + u8 *monData; + if (gBattleExecBuffer) + return; + + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + OldData = gBattleMons[gActiveBank]; + monData = (u8*)(&gBattleMons[gActiveBank]); + for (i = 0; i < sizeof(struct BattlePokemon); i++) + { + monData[i] = gBattleBufferB[gActiveBank][4 + i]; + } + + gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1; + gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2; + gBattleMons[gActiveBank].ability = GetAbilityBySpecies(gBattleMons[gActiveBank].species, gBattleMons[gActiveBank].altAbility); + //check knocked off item + if (get_knocked_off_byte(gActiveBank) & gBitTable[gBattlePartyID[gActiveBank]]) + { + gBattleMons[gActiveBank].item = 0; + } + + if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) + { + for (i = 0; i < 8; i++) + { + gBattleMons[gActiveBank].statStages[i] = OldData.statStages[i]; + } + gBattleMons[gActiveBank].status2 = OldData.status2; + } + SwitchInClearStructs(); + BATTLE_STRUCT->scriptingActive = gActiveBank; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 7; + gBattleTextBuff1[2] = gActiveBank; + gBattleTextBuff1[3] = gBattlePartyID[gActiveBank]; + gBattleTextBuff1[4] = 0xFF; + + gBattlescriptCurrInstr += 2; +} + +static void atk4E_switchin_anim(void) +{ + if (gBattleExecBuffer) + return; + + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + if (GetBankSide(gActiveBank) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER))) + { + GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); + } + gAbsentBankFlags &= ~(gBitTable[gActiveBank]); + EmitSwitchInAnim(0, gBattlePartyID[gActiveBank], BSScriptRead8(gBattlescriptCurrInstr + 2)); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 3; +} + +static void atk4F_jump_if_cannot_switch(void) +{ + int val, to_cmp; + register struct Pokemon *party; + u8 r7; + //0x80 byte is used as a way of telling the function whether to not check status2/status3 + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1) & 0x7F); + if (!(BSScriptRead8(gBattlescriptCurrInstr + 1) & 0x80) + && ((gBattleMons[gActiveBank].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + || (gStatuses3[gActiveBank] & STATUS3_ROOTED))) + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + return; + } + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (GetBankSide(gActiveBank) == 1) + party = gEnemyParty; + else + party = gPlayerParty; + val = 0; + if (sub_803FBFC(sub_803FC34(gActiveBank)) == 1) + val = 3; + for (to_cmp = val + 3; val < to_cmp; val++) + { + if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE + && !GetMonData(&party[val], MON_DATA_IS_EGG) + && GetMonData(&party[val], MON_DATA_HP) != 0 + && gBattlePartyID[gActiveBank] != val) + break; + } + if (val == to_cmp) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + else + gBattlescriptCurrInstr += 6; + } + else + { + if (GetBankSide(gActiveBank) == 1) + { + r7 = GetBankByPlayerAI(1); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + to_cmp = GetBankByPlayerAI(3); + else + to_cmp = r7; + party = gEnemyParty; + } + else + { + r7 = GetBankByPlayerAI(0); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + to_cmp = GetBankByPlayerAI(2); + else + to_cmp = r7; + party = gPlayerParty; + } + for (val = 0; val < 6; val++) + { + if (GetMonData(&party[val], MON_DATA_HP) != 0 + && GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE + && !GetMonData(&party[val], MON_DATA_IS_EGG) + && val != gBattlePartyID[r7] && val != gBattlePartyID[to_cmp]) + break; + } + if (val == 6) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + else + gBattlescriptCurrInstr += 6; + } +} + +void sub_8022A3C(u8 unkown) +{ + //BATTLE_STRUCT->unk16064[gActiveBank] = gBattlePartyID[gActiveBank]; + ewram[gActiveBank + 0x16064] = gBattlePartyID[gActiveBank]; + EmitChoosePokemon(0, 1, unkown, 0, BATTLE_STRUCT->unk1606C[gActiveBank]); + MarkBufferBankForExecution(gActiveBank); +} + +/* +static void atk50_openpartyscreen(void) +{ + int i = 0; + int r9 = 0; + u8* fail_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + + if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 5) + { + if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) + { + for (gActiveBank = i; gActiveBank < gNoOfAllBanks; gActiveBank++) + { + if (!(gHitMarker & HITMARKER_FAINTED(gActiveBank))) + { + EmitLinkStandbyMsg(0, 2); + MarkBufferBankForExecution(gActiveBank); + } + else if (sub_8018018(gActiveBank, 6, 6) == 0 + && !gSpecialStatuses[gActiveBank].flag40) + { + sub_8022A3C(6); + gSpecialStatuses[gActiveBank].flag40 = 1; + } + else + { + gAbsentBankFlags |= gBitTable[gActiveBank]; + gHitMarker &= (~HITMARKER_FAINTED(gActiveBank)); + EmitLinkStandbyMsg(0, 2); + MarkBufferBankForExecution(gActiveBank); + } + } + } + else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + if (!(gHitMarker >> 0x1C & gBitTable[0])) + { + + } + else if (sub_8018018(gActiveBank, 6, 6) == 0 + && !gSpecialStatuses[gActiveBank].flag40) + { + + } + else + { + + } + } + } +} +*/ + +__attribute__((naked)) +static void atk50_openpartyscreen(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + sub sp, 0x4\n\ + movs r7, 0\n\ + movs r0, 0\n\ + mov r9, r0\n\ + ldr r6, _08022B44 @ =gBattlescriptCurrInstr\n\ + ldr r1, [r6]\n\ + ldrb r2, [r1, 0x2]\n\ + ldrb r0, [r1, 0x3]\n\ + lsls r0, 8\n\ + orrs r2, r0\n\ + ldrb r0, [r1, 0x4]\n\ + lsls r0, 16\n\ + orrs r2, r0\n\ + ldrb r0, [r1, 0x5]\n\ + lsls r0, 24\n\ + orrs r2, r0\n\ + mov r8, r2\n\ + ldrb r2, [r1, 0x1]\n\ + adds r0, r2, 0\n\ + mov r12, r6\n\ + cmp r0, 0x5\n\ + beq _08022ACE\n\ + b _08022F74\n\ +_08022ACE:\n\ + ldr r0, _08022B48 @ =gBattleTypeFlags\n\ + ldrh r0, [r0]\n\ + movs r1, 0x41\n\ + ands r1, r0\n\ + cmp r1, 0x1\n\ + beq _08022BBC\n\ + ldr r1, _08022B4C @ =gActiveBank\n\ + strb r7, [r1]\n\ + ldr r0, _08022B50 @ =gNoOfAllBanks\n\ + ldrb r0, [r0]\n\ + cmp r7, r0\n\ + bcc _08022AE8\n\ + b _08022F62\n\ +_08022AE8:\n\ + ldr r7, _08022B54 @ =gHitMarker\n\ + ldr r6, _08022B58 @ =gBitTable\n\ + adds r4, r1, 0\n\ + ldr r0, _08022B5C @ =gAbsentBankFlags\n\ + mov r8, r0\n\ +_08022AF2:\n\ + ldrb r2, [r4]\n\ + lsls r0, r2, 2\n\ + adds r0, r6\n\ + ldr r1, [r0]\n\ + lsls r1, 28\n\ + ldr r0, [r7]\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08022B94\n\ + adds r0, r2, 0\n\ + movs r1, 0x6\n\ + movs r2, 0x6\n\ + bl sub_8018018\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08022B60\n\ + ldrb r0, [r4]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r0, [r0]\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldrb r0, [r4]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r1, [r0]\n\ + lsls r1, 28\n\ + ldr r0, [r7]\n\ + bics r0, r1\n\ + str r0, [r7]\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + bl EmitLinkStandbyMsg\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + b _08022BA2\n\ + .align 2, 0\n\ +_08022B44: .4byte gBattlescriptCurrInstr\n\ +_08022B48: .4byte gBattleTypeFlags\n\ +_08022B4C: .4byte gActiveBank\n\ +_08022B50: .4byte gNoOfAllBanks\n\ +_08022B54: .4byte gHitMarker\n\ +_08022B58: .4byte gBitTable\n\ +_08022B5C: .4byte gAbsentBankFlags\n\ +_08022B60:\n\ + ldr r5, _08022B90 @ =gSpecialStatuses\n\ + ldrb r0, [r4]\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r5\n\ + ldrb r0, [r1]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _08022BA2\n\ + movs r0, 0x6\n\ + bl sub_8022A3C\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + ldrb r1, [r0]\n\ + movs r2, 0x40\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ + b _08022BA2\n\ + .align 2, 0\n\ +_08022B90: .4byte gSpecialStatuses\n\ +_08022B94:\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + bl EmitLinkStandbyMsg\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ +_08022BA2:\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ + ldr r1, _08022BB8 @ =gNoOfAllBanks\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcc _08022AF2\n\ + b _08022F62\n\ + .align 2, 0\n\ +_08022BB8: .4byte gNoOfAllBanks\n\ +_08022BBC:\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + bne _08022BC4\n\ + b _08022F62\n\ +_08022BC4:\n\ + ldr r0, _08022C1C @ =gHitMarker\n\ + mov r8, r0\n\ + ldr r0, [r0]\n\ + lsrs r5, r0, 28\n\ + ldr r6, _08022C20 @ =gBitTable\n\ + ldr r0, [r6]\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + beq _08022C7E\n\ + ldr r4, _08022C24 @ =gActiveBank\n\ + strb r7, [r4]\n\ + movs r0, 0\n\ + movs r1, 0x6\n\ + movs r2, 0x6\n\ + bl sub_8018018\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08022C2C\n\ + ldr r2, _08022C28 @ =gAbsentBankFlags\n\ + ldrb r0, [r4]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r0, [r0]\n\ + ldrb r1, [r2]\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldrb r0, [r4]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r1, [r0]\n\ + lsls r1, 28\n\ + mov r2, r8\n\ + ldr r0, [r2]\n\ + bics r0, r1\n\ + str r0, [r2]\n\ + movs r0, 0\n\ + bl dp01_build_cmdbuf_x2A_2A_2A_2A\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + b _08022C7E\n\ + .align 2, 0\n\ +_08022C1C: .4byte gHitMarker\n\ +_08022C20: .4byte gBitTable\n\ +_08022C24: .4byte gActiveBank\n\ +_08022C28: .4byte gAbsentBankFlags\n\ +_08022C2C:\n\ + ldr r6, _08022C60 @ =gSpecialStatuses\n\ + ldrb r0, [r4]\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r6\n\ + ldrb r0, [r1]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _08022C6C\n\ + ldr r0, _08022C64 @ =0x02000000\n\ + ldr r1, _08022C68 @ =0x0001606a\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + bl sub_8022A3C\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldrb r1, [r0]\n\ + movs r2, 0x40\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ + b _08022C7E\n\ + .align 2, 0\n\ +_08022C60: .4byte gSpecialStatuses\n\ +_08022C64: .4byte 0x02000000\n\ +_08022C68: .4byte 0x0001606a\n\ +_08022C6C:\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + bl EmitLinkStandbyMsg\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + movs r2, 0x1\n\ + mov r9, r2\n\ +_08022C7E:\n\ + ldr r6, _08022CD8 @ =gBitTable\n\ + ldr r0, [r6, 0x8]\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + beq _08022D40\n\ + ldr r0, [r6]\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + bne _08022D40\n\ + ldr r4, _08022CDC @ =gActiveBank\n\ + movs r0, 0x2\n\ + strb r0, [r4]\n\ + movs r0, 0x2\n\ + movs r1, 0x6\n\ + movs r2, 0x6\n\ + bl sub_8018018\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08022CE8\n\ + ldr r2, _08022CE0 @ =gAbsentBankFlags\n\ + ldrb r0, [r4]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r0, [r0]\n\ + ldrb r1, [r2]\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r2, _08022CE4 @ =gHitMarker\n\ + ldrb r0, [r4]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r1, [r0]\n\ + lsls r1, 28\n\ + ldr r0, [r2]\n\ + bics r0, r1\n\ + str r0, [r2]\n\ + movs r0, 0\n\ + bl dp01_build_cmdbuf_x2A_2A_2A_2A\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + b _08022D40\n\ + .align 2, 0\n\ +_08022CD8: .4byte gBitTable\n\ +_08022CDC: .4byte gActiveBank\n\ +_08022CE0: .4byte gAbsentBankFlags\n\ +_08022CE4: .4byte gHitMarker\n\ +_08022CE8:\n\ + ldr r6, _08022D1C @ =gSpecialStatuses\n\ + ldrb r0, [r4]\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r6\n\ + ldrb r0, [r1]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _08022D28\n\ + ldr r0, _08022D20 @ =0x02000000\n\ + ldr r1, _08022D24 @ =0x00016068\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + bl sub_8022A3C\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldrb r1, [r0]\n\ + movs r2, 0x40\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ + b _08022D40\n\ + .align 2, 0\n\ +_08022D1C: .4byte gSpecialStatuses\n\ +_08022D20: .4byte 0x02000000\n\ +_08022D24: .4byte 0x00016068\n\ +_08022D28:\n\ + movs r0, 0x1\n\ + mov r2, r9\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _08022D40\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + bl EmitLinkStandbyMsg\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ +_08022D40:\n\ + ldr r6, _08022D90 @ =gBitTable\n\ + ldr r0, [r6, 0x4]\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + beq _08022DF6\n\ + ldr r4, _08022D94 @ =gActiveBank\n\ + movs r0, 0x1\n\ + strb r0, [r4]\n\ + movs r0, 0x1\n\ + movs r1, 0x6\n\ + movs r2, 0x6\n\ + bl sub_8018018\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08022DA0\n\ + ldr r2, _08022D98 @ =gAbsentBankFlags\n\ + ldrb r0, [r4]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r0, [r0]\n\ + ldrb r1, [r2]\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r2, _08022D9C @ =gHitMarker\n\ + ldrb r0, [r4]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r1, [r0]\n\ + lsls r1, 28\n\ + ldr r0, [r2]\n\ + bics r0, r1\n\ + str r0, [r2]\n\ + movs r0, 0\n\ + bl dp01_build_cmdbuf_x2A_2A_2A_2A\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + b _08022DF6\n\ + .align 2, 0\n\ +_08022D90: .4byte gBitTable\n\ +_08022D94: .4byte gActiveBank\n\ +_08022D98: .4byte gAbsentBankFlags\n\ +_08022D9C: .4byte gHitMarker\n\ +_08022DA0:\n\ + ldr r6, _08022DD4 @ =gSpecialStatuses\n\ + ldrb r0, [r4]\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r6\n\ + ldrb r0, [r1]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _08022DE0\n\ + ldr r0, _08022DD8 @ =0x02000000\n\ + ldr r1, _08022DDC @ =0x0001606b\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + bl sub_8022A3C\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldrb r1, [r0]\n\ + movs r2, 0x40\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ + b _08022DF6\n\ + .align 2, 0\n\ +_08022DD4: .4byte gSpecialStatuses\n\ +_08022DD8: .4byte 0x02000000\n\ +_08022DDC: .4byte 0x0001606b\n\ +_08022DE0:\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + bl EmitLinkStandbyMsg\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + movs r0, 0x2\n\ + mov r2, r9\n\ + orrs r2, r0\n\ + mov r9, r2\n\ +_08022DF6:\n\ + ldr r6, _08022E50 @ =gBitTable\n\ + ldr r0, [r6, 0xC]\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + beq _08022EB8\n\ + ldr r0, [r6, 0x4]\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + bne _08022EB8\n\ + ldr r4, _08022E54 @ =gActiveBank\n\ + movs r0, 0x3\n\ + strb r0, [r4]\n\ + movs r0, 0x3\n\ + movs r1, 0x6\n\ + movs r2, 0x6\n\ + bl sub_8018018\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08022E60\n\ + ldr r2, _08022E58 @ =gAbsentBankFlags\n\ + ldrb r0, [r4]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r0, [r0]\n\ + ldrb r1, [r2]\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r2, _08022E5C @ =gHitMarker\n\ + ldrb r0, [r4]\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldr r1, [r0]\n\ + lsls r1, 28\n\ + ldr r0, [r2]\n\ + bics r0, r1\n\ + str r0, [r2]\n\ + movs r0, 0\n\ + bl dp01_build_cmdbuf_x2A_2A_2A_2A\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + b _08022EB8\n\ + .align 2, 0\n\ +_08022E50: .4byte gBitTable\n\ +_08022E54: .4byte gActiveBank\n\ +_08022E58: .4byte gAbsentBankFlags\n\ +_08022E5C: .4byte gHitMarker\n\ +_08022E60:\n\ + ldr r6, _08022E94 @ =gSpecialStatuses\n\ + ldrb r0, [r4]\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r6\n\ + ldrb r0, [r1]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _08022EA0\n\ + ldr r0, _08022E98 @ =0x02000000\n\ + ldr r1, _08022E9C @ =0x00016069\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + bl sub_8022A3C\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldrb r1, [r0]\n\ + movs r2, 0x40\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ + b _08022EB8\n\ + .align 2, 0\n\ +_08022E94: .4byte gSpecialStatuses\n\ +_08022E98: .4byte 0x02000000\n\ +_08022E9C: .4byte 0x00016069\n\ +_08022EA0:\n\ + movs r0, 0x2\n\ + mov r2, r9\n\ + ands r2, r0\n\ + cmp r2, 0\n\ + bne _08022EB8\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + bl EmitLinkStandbyMsg\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ +_08022EB8:\n\ + ldr r1, _08022EE8 @ =gSpecialStatuses\n\ + ldrb r0, [r1]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _08022F0C\n\ + adds r0, r1, 0\n\ + adds r0, 0x28\n\ + ldrb r0, [r0]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _08022F0C\n\ + cmp r5, 0\n\ + beq _08022F0C\n\ + ldr r0, _08022EEC @ =gAbsentBankFlags\n\ + ldrb r1, [r0]\n\ + ldr r0, _08022EF0 @ =gBitTable\n\ + ldr r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _08022EF8\n\ + ldr r1, _08022EF4 @ =gActiveBank\n\ + movs r0, 0x2\n\ + strb r0, [r1]\n\ + b _08022EFC\n\ + .align 2, 0\n\ +_08022EE8: .4byte gSpecialStatuses\n\ +_08022EEC: .4byte gAbsentBankFlags\n\ +_08022EF0: .4byte gBitTable\n\ +_08022EF4: .4byte gActiveBank\n\ +_08022EF8:\n\ + ldr r0, _08022F3C @ =gActiveBank\n\ + strb r1, [r0]\n\ +_08022EFC:\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + bl EmitLinkStandbyMsg\n\ + ldr r0, _08022F3C @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + bl MarkBufferBankForExecution\n\ +_08022F0C:\n\ + ldr r1, _08022F40 @ =gSpecialStatuses\n\ + ldrb r0, [r1, 0x14]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _08022F62\n\ + adds r0, r1, 0\n\ + adds r0, 0x3C\n\ + ldrb r0, [r0]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _08022F62\n\ + cmp r5, 0\n\ + beq _08022F62\n\ + ldr r0, _08022F44 @ =gAbsentBankFlags\n\ + ldrb r0, [r0]\n\ + ldr r1, _08022F48 @ =gBitTable\n\ + ldr r1, [r1, 0x4]\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08022F4C\n\ + ldr r1, _08022F3C @ =gActiveBank\n\ + movs r0, 0x3\n\ + b _08022F50\n\ + .align 2, 0\n\ +_08022F3C: .4byte gActiveBank\n\ +_08022F40: .4byte gSpecialStatuses\n\ +_08022F44: .4byte gAbsentBankFlags\n\ +_08022F48: .4byte gBitTable\n\ +_08022F4C:\n\ + ldr r1, _08022F6C @ =gActiveBank\n\ + movs r0, 0x1\n\ +_08022F50:\n\ + strb r0, [r1]\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + bl EmitLinkStandbyMsg\n\ + ldr r0, _08022F6C @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + bl MarkBufferBankForExecution\n\ +_08022F62:\n\ + ldr r1, _08022F70 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x6\n\ + str r0, [r1]\n\ + b _08023302\n\ + .align 2, 0\n\ +_08022F6C: .4byte gActiveBank\n\ +_08022F70: .4byte gBattlescriptCurrInstr\n\ +_08022F74:\n\ + cmp r0, 0x6\n\ + beq _08022F7A\n\ + b _08023170\n\ +_08022F7A:\n\ + ldr r0, _08022FF0 @ =gBattleTypeFlags\n\ + ldrh r2, [r0]\n\ + movs r0, 0x40\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _08022F88\n\ + b _0802310C\n\ +_08022F88:\n\ + movs r0, 0x1\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _08022F92\n\ + b _0802310C\n\ +_08022F92:\n\ + ldr r7, _08022FF4 @ =gHitMarker\n\ + ldr r0, [r7]\n\ + lsrs r5, r0, 28\n\ + ldr r4, _08022FF8 @ =gBitTable\n\ + ldr r0, [r4, 0x8]\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + beq _0802303A\n\ + ldr r0, [r4]\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + beq _0802303A\n\ + ldr r6, _08022FFC @ =gActiveBank\n\ + movs r0, 0x2\n\ + strb r0, [r6]\n\ + ldr r0, _08023000 @ =gBattleBufferB\n\ + ldrb r1, [r0, 0x1]\n\ + movs r0, 0x2\n\ + movs r2, 0x6\n\ + bl sub_8018018\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08023008\n\ + ldr r2, _08023004 @ =gAbsentBankFlags\n\ + ldrb r0, [r6]\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldr r0, [r0]\n\ + ldrb r1, [r2]\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldrb r0, [r6]\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldr r1, [r0]\n\ + lsls r1, 28\n\ + ldr r0, [r7]\n\ + bics r0, r1\n\ + str r0, [r7]\n\ + movs r0, 0\n\ + bl dp01_build_cmdbuf_x2A_2A_2A_2A\n\ + ldrb r0, [r6]\n\ + bl MarkBufferBankForExecution\n\ + b _0802303A\n\ + .align 2, 0\n\ +_08022FF0: .4byte gBattleTypeFlags\n\ +_08022FF4: .4byte gHitMarker\n\ +_08022FF8: .4byte gBitTable\n\ +_08022FFC: .4byte gActiveBank\n\ +_08023000: .4byte gBattleBufferB\n\ +_08023004: .4byte gAbsentBankFlags\n\ +_08023008:\n\ + ldr r4, _08023098 @ =gSpecialStatuses\n\ + ldrb r0, [r6]\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4\n\ + ldrb r0, [r1]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _0802303A\n\ + ldr r0, _0802309C @ =0x02000000\n\ + ldr r1, _080230A0 @ =0x00016068\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + bl sub_8022A3C\n\ + ldrb r1, [r6]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldrb r1, [r0]\n\ + movs r2, 0x40\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ +_0802303A:\n\ + ldr r4, _080230A4 @ =gBitTable\n\ + ldr r0, [r4, 0xC]\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + beq _080230EE\n\ + ldr r0, [r4, 0x4]\n\ + ands r5, r0\n\ + cmp r5, 0\n\ + beq _080230EE\n\ + ldr r5, _080230A8 @ =gActiveBank\n\ + movs r0, 0x3\n\ + strb r0, [r5]\n\ + ldr r0, _080230AC @ =gBattleBufferB\n\ + ldr r2, _080230B0 @ =0x00000201\n\ + adds r0, r2\n\ + ldrb r1, [r0]\n\ + movs r0, 0x3\n\ + movs r2, 0x6\n\ + bl sub_8018018\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080230BC\n\ + ldr r2, _080230B4 @ =gAbsentBankFlags\n\ + ldrb r0, [r5]\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldr r0, [r0]\n\ + ldrb r1, [r2]\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r2, _080230B8 @ =gHitMarker\n\ + ldrb r0, [r5]\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldr r1, [r0]\n\ + lsls r1, 28\n\ + ldr r0, [r2]\n\ + bics r0, r1\n\ + str r0, [r2]\n\ + movs r0, 0\n\ + bl dp01_build_cmdbuf_x2A_2A_2A_2A\n\ + ldrb r0, [r5]\n\ + bl MarkBufferBankForExecution\n\ + b _080230EE\n\ + .align 2, 0\n\ +_08023098: .4byte gSpecialStatuses\n\ +_0802309C: .4byte 0x02000000\n\ +_080230A0: .4byte 0x00016068\n\ +_080230A4: .4byte gBitTable\n\ +_080230A8: .4byte gActiveBank\n\ +_080230AC: .4byte gBattleBufferB\n\ +_080230B0: .4byte 0x00000201\n\ +_080230B4: .4byte gAbsentBankFlags\n\ +_080230B8: .4byte gHitMarker\n\ +_080230BC:\n\ + ldr r4, _080230FC @ =gSpecialStatuses\n\ + ldrb r0, [r5]\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4\n\ + ldrb r0, [r1]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + blt _080230EE\n\ + ldr r0, _08023100 @ =0x02000000\n\ + ldr r1, _08023104 @ =0x00016069\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + bl sub_8022A3C\n\ + ldrb r1, [r5]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldrb r1, [r0]\n\ + movs r2, 0x40\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ +_080230EE:\n\ + ldr r1, _08023108 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x6\n\ + str r0, [r1]\n\ + mov r12, r1\n\ + b _08023110\n\ + .align 2, 0\n\ +_080230FC: .4byte gSpecialStatuses\n\ +_08023100: .4byte 0x02000000\n\ +_08023104: .4byte 0x00016069\n\ +_08023108: .4byte gBattlescriptCurrInstr\n\ +_0802310C:\n\ + adds r0, r1, 0x6\n\ + str r0, [r6]\n\ +_08023110:\n\ + ldr r0, _08023160 @ =gHitMarker\n\ + ldr r0, [r0]\n\ + lsrs r5, r0, 28\n\ + ldr r1, _08023164 @ =gBank1\n\ + movs r0, 0\n\ + strb r0, [r1]\n\ + ldr r4, _08023168 @ =gBitTable\n\ + ldr r2, [r4]\n\ + ands r2, r5\n\ + ldr r6, _0802316C @ =gNoOfAllBanks\n\ + cmp r2, 0\n\ + bne _0802314C\n\ + adds r7, r6, 0\n\ + ldrb r0, [r6]\n\ + cmp r2, r0\n\ + bcs _0802314C\n\ + adds r3, r1, 0\n\ +_08023132:\n\ + ldrb r0, [r3]\n\ + adds r0, 0x1\n\ + strb r0, [r3]\n\ + ldrb r2, [r3]\n\ + lsls r0, r2, 2\n\ + adds r0, r4\n\ + ldr r0, [r0]\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + bne _0802314C\n\ + ldrb r0, [r7]\n\ + cmp r2, r0\n\ + bcc _08023132\n\ +_0802314C:\n\ + ldrb r0, [r1]\n\ + ldrb r6, [r6]\n\ + cmp r0, r6\n\ + beq _08023156\n\ + b _08023302\n\ +_08023156:\n\ + mov r1, r8\n\ + mov r2, r12\n\ + str r1, [r2]\n\ + b _08023302\n\ + .align 2, 0\n\ +_08023160: .4byte gHitMarker\n\ +_08023164: .4byte gBank1\n\ +_08023168: .4byte gBitTable\n\ +_0802316C: .4byte gNoOfAllBanks\n\ +_08023170:\n\ + movs r0, 0x80\n\ + ands r0, r2\n\ + movs r5, 0x1\n\ + cmp r0, 0\n\ + beq _0802317C\n\ + movs r5, 0\n\ +_0802317C:\n\ + movs r0, 0x7F\n\ + ands r0, r2\n\ + bl GetBattleBank\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + ldr r1, _080231A4 @ =gSpecialStatuses\n\ + lsls r0, r7, 2\n\ + adds r0, r7\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + lsls r0, 25\n\ + cmp r0, 0\n\ + bge _080231A8\n\ + ldr r0, [r6]\n\ + adds r0, 0x6\n\ + str r0, [r6]\n\ + b _08023302\n\ + .align 2, 0\n\ +_080231A4: .4byte gSpecialStatuses\n\ +_080231A8:\n\ + adds r0, r7, 0\n\ + movs r1, 0x6\n\ + movs r2, 0x6\n\ + bl sub_8018018\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080231F8\n\ + ldr r2, _080231E8 @ =gActiveBank\n\ + strb r7, [r2]\n\ + ldr r3, _080231EC @ =gAbsentBankFlags\n\ + ldr r4, _080231F0 @ =gBitTable\n\ + ldrb r0, [r2]\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldr r0, [r0]\n\ + ldrb r1, [r3]\n\ + orrs r0, r1\n\ + strb r0, [r3]\n\ + ldr r3, _080231F4 @ =gHitMarker\n\ + ldrb r0, [r2]\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldr r1, [r0]\n\ + lsls r1, 28\n\ + ldr r0, [r3]\n\ + bics r0, r1\n\ + str r0, [r3]\n\ + mov r0, r8\n\ + str r0, [r6]\n\ + b _08023302\n\ + .align 2, 0\n\ +_080231E8: .4byte gActiveBank\n\ +_080231EC: .4byte gAbsentBankFlags\n\ +_080231F0: .4byte gBitTable\n\ +_080231F4: .4byte gHitMarker\n\ +_080231F8:\n\ + ldr r4, _080232A0 @ =gActiveBank\n\ + strb r7, [r4]\n\ + ldr r3, _080232A4 @ =0x02000000\n\ + ldrb r0, [r4]\n\ + ldr r2, _080232A8 @ =0x00016064\n\ + adds r1, r0, r2\n\ + adds r1, r3\n\ + ldr r2, _080232AC @ =gBattlePartyID\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + ldrh r0, [r0]\n\ + strb r0, [r1]\n\ + ldrb r1, [r4]\n\ + movs r0, 0x2\n\ + eors r0, r1\n\ + ldr r1, _080232B0 @ =0x00016068\n\ + adds r0, r1\n\ + adds r0, r3\n\ + ldrb r2, [r0]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + ldr r1, _080232B4 @ =0x0001606c\n\ + adds r3, r1\n\ + adds r0, r3\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + adds r1, r5, 0\n\ + movs r3, 0\n\ + bl EmitChoosePokemon\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + ldr r0, [r6]\n\ + adds r0, 0x6\n\ + str r0, [r6]\n\ + ldrb r0, [r4]\n\ + bl GetBankIdentity\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0802325A\n\ + ldr r1, _080232B8 @ =gBattleResults\n\ + ldrb r0, [r1, 0x2]\n\ + cmp r0, 0xFE\n\ + bhi _0802325A\n\ + adds r0, 0x1\n\ + strb r0, [r1, 0x2]\n\ +_0802325A:\n\ + ldr r0, _080232BC @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080232C4\n\ + ldr r1, _080232A0 @ =gActiveBank\n\ + movs r0, 0\n\ + strb r0, [r1]\n\ + ldr r0, _080232C0 @ =gNoOfAllBanks\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _08023302\n\ + adds r4, r1, 0\n\ +_08023276:\n\ + ldrb r0, [r4]\n\ + cmp r0, r7\n\ + beq _0802328A\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + bl EmitLinkStandbyMsg\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ +_0802328A:\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ + ldr r1, _080232C0 @ =gNoOfAllBanks\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcc _08023276\n\ + b _08023302\n\ + .align 2, 0\n\ +_080232A0: .4byte gActiveBank\n\ +_080232A4: .4byte 0x02000000\n\ +_080232A8: .4byte 0x00016064\n\ +_080232AC: .4byte gBattlePartyID\n\ +_080232B0: .4byte 0x00016068\n\ +_080232B4: .4byte 0x0001606c\n\ +_080232B8: .4byte gBattleResults\n\ +_080232BC: .4byte gBattleTypeFlags\n\ +_080232C0: .4byte gNoOfAllBanks\n\ +_080232C4:\n\ + adds r0, r7, 0\n\ + bl GetBankIdentity\n\ + movs r1, 0x1\n\ + eors r0, r1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetBankByPlayerAI\n\ + ldr r4, _08023310 @ =gActiveBank\n\ + strb r0, [r4]\n\ + ldr r0, _08023314 @ =gAbsentBankFlags\n\ + ldrb r1, [r0]\n\ + ldr r2, _08023318 @ =gBitTable\n\ + ldrb r3, [r4]\n\ + lsls r0, r3, 2\n\ + adds r0, r2\n\ + ldr r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _080232F4\n\ + movs r0, 0x2\n\ + eors r3, r0\n\ + strb r3, [r4]\n\ +_080232F4:\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + bl EmitLinkStandbyMsg\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ +_08023302:\n\ + add sp, 0x4\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08023310: .4byte gActiveBank\n\ +_08023314: .4byte gAbsentBankFlags\n\ +_08023318: .4byte gBitTable\n\ + .syntax divided"); +} + +static void atk51_switch_handle_order(void) +{ + int i; + if (gBattleExecBuffer) + return; + + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + switch (BSScriptRead8(gBattlescriptCurrInstr + 2)) + { + case 0: + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gBattleBufferB[i][0] == 0x22) + ewram[i + 0x16068] = gBattleBufferB[i][1]; + } + break; + case 1: + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + sub_8012258(gActiveBank); + break; + case 2: + gBattleCommunication[0] = gBattleBufferB[gActiveBank][1]; + ewram[gActiveBank + 0x16068] = gBattleBufferB[gActiveBank][1]; + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + + ewram[(gActiveBank) * 3 + (0x1606C + 0)] &= 0xF; + ewram[(gActiveBank) * 3 + (0x1606C + 0)] |= (gBattleBufferB[gActiveBank][2] & 0xF0); + ewram[(gActiveBank) * 3 + (0x1606C + 1)] = gBattleBufferB[gActiveBank][3]; + + ewram[(gActiveBank ^ 2) * 3 + (0x1606C + 0)] &= (0xF0); + ewram[(gActiveBank ^ 2) * 3 + (0x1606C + 0)] |= (gBattleBufferB[gActiveBank][2] & 0xF0) >> 4; + ewram[(gActiveBank ^ 2) * 3 + (0x1606C + 2)] = gBattleBufferB[gActiveBank][3]; + } + else + sub_8012258(gActiveBank); + + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 6; + gBattleTextBuff1[2] = gBattleMons[gBankAttacker].species; + gBattleTextBuff1[3] = gBattleMons[gBankAttacker].species >> 8; + gBattleTextBuff1[4] = 0xFF; + + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 7; + gBattleTextBuff2[2] = gActiveBank; + gBattleTextBuff2[3] = gBattleBufferB[gActiveBank][1]; + gBattleTextBuff2[4] = 0xFF; + break; + } + gBattlescriptCurrInstr += 3; +} + +static void atk52_switch_in_effects(void) +{ + int i; + + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + sub_80157C4(gActiveBank); + gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank)); + gSpecialStatuses[gActiveBank].flag40 = 0; + + if (!(gSideAffecting[GetBankSide(gActiveBank)] & SIDE_STATUS_SPIKES_DAMAGED) && (gSideAffecting[GetBankSide(gActiveBank)] & SIDE_STATUS_SPIKES) + && gBattleMons[gActiveBank].type1 != TYPE_FLYING && gBattleMons[gActiveBank].type2 != TYPE_FLYING && gBattleMons[gActiveBank].ability != ABILITY_LEVITATE) + { + u8 spikesDmg; + + gSideAffecting[GetBankSide(gActiveBank)] |= SIDE_STATUS_SPIKES_DAMAGED; + + spikesDmg = (5 - gSideTimer[GetBankSide(gActiveBank)].spikesAmount) * 2; + gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / (spikesDmg); + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + + BATTLE_STRUCT->scriptingActive = gActiveBank; + b_movescr_stack_push_cursor(); + + if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0) + gBattlescriptCurrInstr = gUnknown_081D919F; + else if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 1) + gBattlescriptCurrInstr = gUnknown_081D9171; + else + gBattlescriptCurrInstr = gUnknown_081D91CD; + } + else + { + if (gBattleMons[gActiveBank].ability == ABILITY_TRUANT) + { + gDisableStructs[gActiveBank].truantCounter = 1; + } + + if (AbilityBattleEffects(0, gActiveBank, 0, 0, 0) == 0 && ItemBattleEffects(0, gActiveBank, 0) == 0) + { + gSideAffecting[GetBankSide(gActiveBank)] &= ~(SIDE_STATUS_SPIKES_DAMAGED); + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gTurnOrder[i] == gActiveBank) + gUnknown_02024A76[i] = 0xC; + } + + for (i = 0; i < gNoOfAllBanks; i++) + { + *(HP_ON_SWITCHOUT + GetBankSide(i)) = gBattleMons[i].hp; + } + + if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 5) + { + u32 hitmark = gHitMarker >> 0x1C; + gBank1++; + while (1) + { + if (hitmark & gBitTable[gBank1] && !(gAbsentBankFlags & gBitTable[gBank1])) + break; + if (gBank1 >= gNoOfAllBanks) + break; + gBank1++; + } + } + gBattlescriptCurrInstr += 2; + } + } +} + +static void atk53_trainer_slide(void) +{ + if (!BSScriptRead8(gBattlescriptCurrInstr + 1)) + gActiveBank = GetBankByPlayerAI(0); + else + gActiveBank = GetBankByPlayerAI(1); + + EmitTrainerSlide(0); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 2; +} + +static void atk54_effectiveness_sound(void) +{ + gActiveBank = gBankAttacker; + EmitEffectivenessSound(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 3; +} + +static void atk55_play_sound(void) +{ + gActiveBank = gBankAttacker; + EmitPlaySound(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 3; +} + +static void atk56_fainting_cry(void) +{ + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + EmitFaintingCry(0); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 2; +} + +static void atk57(void) +{ + gActiveBank = GetBankByPlayerAI(0); + dp01_build_cmdbuf_x37_a(0, gBattleOutcome); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 1; +} + +static void atk58_return_to_ball(void) +{ + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + EmitReturnPokeToBall(0, 1); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 2; +} + +void atk59_learnmove_inbattle(void) +{ + u8* loc1 = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + u8* loc2 = BSScriptReadPtr(gBattlescriptCurrInstr + 5); + + u16 ret = sub_803B7C8(&gPlayerParty[BATTLE_STRUCT->expGetterID], BSScriptRead8(gBattlescriptCurrInstr + 9)); + while (ret == 0xFFFE) + ret = sub_803B7C8(&gPlayerParty[BATTLE_STRUCT->expGetterID], 0); + + if (ret == 0) + { + gBattlescriptCurrInstr = loc2; + } + else if (ret == 0xFFFF) + { + gBattlescriptCurrInstr += 10; + } + else + { + gActiveBank = GetBankByPlayerAI(0); + if (gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) + GiveMoveToBattleMon(&gBattleMons[gActiveBank], ret); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) //what is else if + { + gActiveBank = GetBankByPlayerAI(2); + if (gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) + GiveMoveToBattleMon(&gBattleMons[gActiveBank], ret); + } + gBattlescriptCurrInstr = loc1; + } +} + +void sub_8023A80(void) +{ + sub_802BBD4(0x18, 8, 0x1D, 0xD, 0); + InitWindow(&gUnknown_03004210, gUnknown_08400D7A, 0x100, 0x19, 0x9); + sub_8002F44(&gUnknown_03004210); + sub_814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20); +} + +void sub_8023AD8(void) +{ + sub_802BBD4(0x18, 8, 0x1D, 0xD, 1); + DestroyMenuCursor(); +} + +static void atk5A(void) +{ + gActiveBank = 0; + switch (BATTLE_STRUCT->atk5A_StateTracker) + { + case 0: + sub_8023A80(); + BATTLE_STRUCT->atk5A_StateTracker++; + gBattleCommunication[1] = 0; + sub_802BC6C(); + break; + case 1: + if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) + { + PlaySE(SE_SELECT); + nullsub_6(); + gBattleCommunication[1] = 0; + sub_802BC6C(); + } + if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) + { + PlaySE(SE_SELECT); + nullsub_6(); + gBattleCommunication[1] = 1; + sub_802BC6C(); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gBattleCommunication[1] == 0) + { + sub_8023AD8(); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BATTLE_STRUCT->atk5A_StateTracker++; + return; + } + goto state_tracker_4; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + state_tracker_4: + BATTLE_STRUCT->atk5A_StateTracker = 4; + } + break; + case 2: + if (!gPaletteFade.active) + { + sub_809D9F0(gPlayerParty, BATTLE_STRUCT->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, word_2024E82); + BATTLE_STRUCT->atk5A_StateTracker++; + } + break; + case 3: + if (!gPaletteFade.active && gMain.callback2 == sub_800F808) + { + u8 move_pos = sub_809FA30(); + if (move_pos == 4) + { + BATTLE_STRUCT->atk5A_StateTracker = 4; + } + else + { + u16 move = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MOVE1 + move_pos); + if (IsHMMove2(move)) + { + PrepareStringBattle(0x13F, gActiveBank); + BATTLE_STRUCT->atk5A_StateTracker = 5; + } + else + { + u8 *ptr; + + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + ptr = gBattleTextBuff2; + { + ptr[0] = 0xFD; + ptr[1] = 2; + ptr[2] = move; + ptr[3] = ((move & 0xFF00) >> 8); + ptr += 4; + } + ptr[0] = 0xFF; + RemoveMonPPBonus(&gPlayerParty[BATTLE_STRUCT->expGetterID], move_pos); + SetMonMoveSlot(&gPlayerParty[BATTLE_STRUCT->expGetterID], word_2024E82, move_pos); + if (gBattlePartyID[0] == BATTLE_STRUCT->expGetterID && !(gBattleMons[0].status2 & STATUS2_TRANSFORMED) + && !(gDisableStructs[0].unk18_b & gBitTable[move_pos])) + { + RemoveBattleMonPPBonus(&gBattleMons[0], move_pos); + SetBattleMonMoveSlot(&gBattleMons[0], word_2024E82, move_pos); + } + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlePartyID[2] == BATTLE_STRUCT->expGetterID && !(gBattleMons[2].status2 & STATUS2_TRANSFORMED) + && !(gDisableStructs[2].unk18_b & gBitTable[move_pos])) + { + RemoveBattleMonPPBonus(&gBattleMons[2], move_pos); + SetBattleMonMoveSlot(&gBattleMons[2], word_2024E82, move_pos); + } + } + } + } + break; + case 4: + sub_8023AD8(); + gBattlescriptCurrInstr += 5; + break; + case 5: + if (gBattleExecBuffer == 0) + { + BATTLE_STRUCT->atk5A_StateTracker = 2; + } + break; + } +} + +static void atk5B_80256E0(void) +{ + switch (BATTLE_STRUCT->atk5A_StateTracker) + { + case 0: + sub_8023A80(); + BATTLE_STRUCT->atk5A_StateTracker++; + gBattleCommunication[1] = 0; + sub_802BC6C(); + break; + case 1: + if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) + { + PlaySE(SE_SELECT); + nullsub_6(); + gBattleCommunication[1] = 0; + sub_802BC6C(); + } + if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) + { + PlaySE(SE_SELECT); + nullsub_6(); + gBattleCommunication[1] = 1; + sub_802BC6C(); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gBattleCommunication[1] != 0) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; + sub_8023AD8(); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + sub_8023AD8(); + } + } +} + +static void atk5C_hitanimation(void) +{ + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) + gBattlescriptCurrInstr += 2; + else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBank].substituteHP == 0) + { + EmitHitAnimation(0); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 2; + } + else + gBattlescriptCurrInstr += 2; +} + +#define MONEY_UNKNOWN ((*(u8*)(0x02017000 + 0x94))) + +#ifdef NONMATCHING +static void atk5D_getmoneyreward(void) +{ + int i = 0; + u8 r5 = 0; + u32 money_to_give; + if (gTrainerBattleOpponent == 0x400) + { + money_to_give = 2 * BATTLE_STRUCT->moneyMultiplier * MONEY_UNKNOWN; + } + else + { + switch(gTrainers[gTrainerBattleOpponent].partyFlags) + { + case 0: + { + const struct PokeTrainerData1 *data = &gTrainers[gTrainerBattleOpponent].party->noItemNoMoves; + r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl; + } + break; + case 2: + { + const struct PokeTrainerData2 *data = &gTrainers[gTrainerBattleOpponent].party->itemNoMoves; + r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl; + } + break; + case 1: + case 3: + { + const struct PokeTrainerData3 *data = &gTrainers[gTrainerBattleOpponent].party->itemMoves; + r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl; + } + break; + } + for (; gTrainerMoney[i * 4] != 0xFF && gTrainerMoney[i * 4 + 1] != gTrainers[gTrainerBattleOpponent].trainerClass ; i++) {} + + money_to_give = (r5 << 2) * BATTLE_STRUCT->moneyMultiplier; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + money_to_give = 2 * gTrainerMoney[i * 4 + 1] * money_to_give; + else + money_to_give = 1 * gTrainerMoney[i * 4 + 1] * money_to_give; + } + + sub_80B79B8(&gSaveBlock1.money, money_to_give); + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 1; + gBattleTextBuff1[2] = 4; + gBattleTextBuff1[3] = 5; + gBattleTextBuff1[4] = BYTE0(money_to_give); + gBattleTextBuff1[5] = BYTE1(money_to_give); + gBattleTextBuff1[6] = BYTE2(money_to_give); + gBattleTextBuff1[7] = BYTE3(money_to_give); + gBattleTextBuff1[8] = 0xFF; + + gBattlescriptCurrInstr += 1; +} +#else +__attribute__((naked)) +static void atk5D_getmoneyreward(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + movs r6, 0\n\ + movs r5, 0\n\ + ldr r0, _08024048 @ =gTrainerBattleOpponent\n\ + ldrh r2, [r0]\n\ + movs r1, 0x80\n\ + lsls r1, 3\n\ + cmp r2, r1\n\ + bne _08024058\n\ + ldr r0, _0802404C @ =0x02017000\n\ + adds r1, r0, 0\n\ + adds r1, 0x94\n\ + ldrb r2, [r1]\n\ + ldr r1, _08024050 @ =0xfffff056\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r4, r2, 0\n\ + muls r4, r0\n\ + ldr r0, _08024054 @ =gSaveBlock1 + 0x490\n\ + mov r8, r0\n\ + b _08024140\n\ + .align 2, 0\n\ +_08024048: .4byte gTrainerBattleOpponent\n\ +_0802404C: .4byte 0x02017000\n\ +_08024050: .4byte 0xfffff056\n\ +_08024054: .4byte gSaveBlock1 + 0x490\n\ +_08024058:\n\ + ldr r2, _08024074 @ =gTrainers\n\ + ldrh r1, [r0]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r3, r0, 3\n\ + adds r4, r3, r2\n\ + ldrb r1, [r4]\n\ + cmp r1, 0x1\n\ + beq _080240AE\n\ + cmp r1, 0x1\n\ + bgt _08024078\n\ + cmp r1, 0\n\ + beq _08024082\n\ + b _080240C4\n\ + .align 2, 0\n\ +_08024074: .4byte gTrainers\n\ +_08024078:\n\ + cmp r1, 0x2\n\ + beq _08024098\n\ + cmp r1, 0x3\n\ + beq _080240AE\n\ + b _080240C4\n\ +_08024082:\n\ + adds r0, r2, 0\n\ + adds r0, 0x24\n\ + adds r0, r3, r0\n\ + ldr r1, [r0]\n\ + adds r0, r4, 0\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + subs r0, 0x8\n\ + b _080240C2\n\ +_08024098:\n\ + adds r0, r2, 0\n\ + adds r0, 0x24\n\ + adds r0, r3, r0\n\ + ldr r1, [r0]\n\ + adds r0, r4, 0\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + subs r0, 0x8\n\ + b _080240C2\n\ +_080240AE:\n\ + adds r0, r2, 0\n\ + adds r0, 0x24\n\ + adds r0, r3, r0\n\ + ldr r1, [r0]\n\ + adds r0, r4, 0\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + lsls r0, 4\n\ + adds r0, r1\n\ + subs r0, 0x10\n\ +_080240C2:\n\ + ldrb r5, [r0, 0x2]\n\ +_080240C4:\n\ + ldr r0, _08024120 @ =gTrainerMoney\n\ + lsls r1, r6, 2\n\ + adds r3, r1, r0\n\ + ldrb r1, [r3]\n\ + mov r12, r0\n\ + lsls r4, r5, 2\n\ + ldr r5, _08024124 @ =0x02000000\n\ + ldr r7, _08024128 @ =gBattleTypeFlags\n\ + ldr r0, _0802412C @ =gSaveBlock1 + 0x490\n\ + mov r8, r0\n\ + cmp r1, 0xFF\n\ + beq _080240FE\n\ + ldr r2, _08024130 @ =gTrainers\n\ + ldr r0, _08024134 @ =gTrainerBattleOpponent\n\ + ldrh r1, [r0]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 3\n\ + adds r0, r2\n\ + ldrb r2, [r0, 0x1]\n\ + adds r1, r3, 0\n\ +_080240EE:\n\ + ldrb r0, [r1]\n\ + cmp r0, r2\n\ + beq _080240FE\n\ + adds r1, 0x4\n\ + adds r6, 0x1\n\ + ldrb r0, [r1]\n\ + cmp r0, 0xFF\n\ + bne _080240EE\n\ +_080240FE:\n\ + ldr r1, _08024138 @ =0x00016056\n\ + adds r0, r5, r1\n\ + ldrb r0, [r0]\n\ + adds r3, r4, 0\n\ + muls r3, r0\n\ + lsls r0, r6, 2\n\ + add r0, r12\n\ + ldrb r2, [r0, 0x1]\n\ + ldrh r1, [r7]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0802413C\n\ + lsls r0, r2, 1\n\ + adds r4, r3, 0\n\ + muls r4, r0\n\ + b _08024140\n\ + .align 2, 0\n\ +_08024120: .4byte gTrainerMoney\n\ +_08024124: .4byte 0x02000000\n\ +_08024128: .4byte gBattleTypeFlags\n\ +_0802412C: .4byte gSaveBlock1 + 0x490\n\ +_08024130: .4byte gTrainers\n\ +_08024134: .4byte gTrainerBattleOpponent\n\ +_08024138: .4byte 0x00016056\n\ +_0802413C:\n\ + adds r4, r3, 0\n\ + muls r4, r2\n\ +_08024140:\n\ + mov r0, r8\n\ + adds r1, r4, 0\n\ + bl sub_80B79B8\n\ + ldr r1, _0802418C @ =gBattleTextBuff1\n\ + movs r0, 0xFD\n\ + strb r0, [r1]\n\ + movs r0, 0x1\n\ + strb r0, [r1, 0x1]\n\ + movs r0, 0x4\n\ + strb r0, [r1, 0x2]\n\ + movs r0, 0x5\n\ + strb r0, [r1, 0x3]\n\ + strb r4, [r1, 0x4]\n\ + movs r0, 0xFF\n\ + lsls r0, 8\n\ + ands r0, r4\n\ + lsrs r0, 8\n\ + strb r0, [r1, 0x5]\n\ + movs r0, 0xFF\n\ + lsls r0, 16\n\ + ands r0, r4\n\ + lsrs r0, 16\n\ + strb r0, [r1, 0x6]\n\ + lsrs r0, r4, 24\n\ + strb r0, [r1, 0x7]\n\ + movs r0, 0xFF\n\ + strb r0, [r1, 0x8]\n\ + ldr r1, _08024190 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x1\n\ + str r0, [r1]\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0802418C: .4byte gBattleTextBuff1\n\ +_08024190: .4byte gBattlescriptCurrInstr\n\ + .syntax divided"); +} +#endif //NONMATCHING + +static void atk5E_8025A70(void) +{ + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + switch (gBattleCommunication[0]) + { + case 0: + EmitGetAttributes(0, REQUEST_ALL_BATTLE, 0); + MarkBufferBankForExecution(gActiveBank); + gBattleCommunication[0]++; + break; + case 1: + if (gBattleExecBuffer == 0) + { + int i; + struct BattlePokemon* bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBank][4]; + for (i = 0; i < 4; i++) + { + gBattleMons[gActiveBank].moves[i] = bufferPoke->moves[i]; + gBattleMons[gActiveBank].pp[i] = bufferPoke->pp[i]; + } + gBattlescriptCurrInstr += 2; + } + break; + } +} + +static void atk5F_8025B24(void) +{ + gActiveBank = gBankAttacker; + gBankAttacker = gBankTarget; + gBankTarget = gActiveBank; + //what is xor... + if (gHitMarker & HITMARKER_PURSUIT_TRAP) + gHitMarker &= ~(HITMARKER_PURSUIT_TRAP); + else + gHitMarker |= HITMARKER_PURSUIT_TRAP; + gBattlescriptCurrInstr++; +} + +static void atk60_increment_gamestat(void) +{ + if (GetBankSide(gBankAttacker) == 0) + { + IncrementGameStat(BSScriptRead8(gBattlescriptCurrInstr + 1)); + } + gBattlescriptCurrInstr += 2; +} + +struct hp_status +{ + u16 hp; + u32 status; +}; + +static void atk61_8025BA4(void) +{ + int i; + struct Pokemon* party; + struct hp_status hpStatus[6]; + if (gBattleExecBuffer) + return; + + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + if (GetBankSide(gActiveBank) == 0) + party = gPlayerParty; + else + party = gEnemyParty; + + for (i = 0; i < 6; i++) + { + if (GetMonData(&party[i], MON_DATA_SPECIES2) == 0 || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) + { + hpStatus[i].hp = 0xFFFF; + hpStatus[i].status = 0; + } + else + { + hpStatus[i].hp = GetMonData(&party[i], MON_DATA_HP); + hpStatus[i].status = GetMonData(&party[i], MON_DATA_STATUS); + } + } + dp01_build_cmdbuf_x30_TODO(0, (u8*)(hpStatus), 1); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 2; +} + +static void atk62_08025C6C(void) +{ + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + dp01_build_cmdbuf_x31_31_31_31(0); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 2; +} + +static void atk63_jumptorandomattack(void) +{ + if (BSScriptRead8(gBattlescriptCurrInstr + 1)) + gCurrentMove = gRandomMove; + else + gUnknown_02024BE8 = gCurrentMove = gRandomMove; + gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]; +} + +static void atk64_statusanimation(void) +{ + if (gBattleExecBuffer == 0) + { + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + if (!(gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBank].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) + { + EmitStatusAnimation(0, 0, gBattleMons[gActiveBank].status1); + MarkBufferBankForExecution(gActiveBank); + } + gBattlescriptCurrInstr += 2; + } +} + +static void atk65_status2animation(void) +{ + if (gBattleExecBuffer == 0) + { + u32 possible_to_anim; + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + possible_to_anim = BSScriptRead32(gBattlescriptCurrInstr + 2); + if (!(gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBank].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) + { + EmitStatusAnimation(0, 1, gBattleMons[gActiveBank].status2 & possible_to_anim); + MarkBufferBankForExecution(gActiveBank); + } + gBattlescriptCurrInstr += 6; + } +} + +static void atk66_chosenstatusanimation(void) +{ + if (gBattleExecBuffer == 0) + { + u32 status; + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + status = BSScriptRead32(gBattlescriptCurrInstr + 3); + if (!(gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBank].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) + { + EmitStatusAnimation(0, BSScriptRead8(gBattlescriptCurrInstr + 2), status); + MarkBufferBankForExecution(gActiveBank); + } + gBattlescriptCurrInstr += 7; + } +} + +static void atk67_8025ECC(void) +{ + switch (gBattleCommunication[0]) + { + case 0: + sub_8023A80(); + gBattleCommunication[0]++; + gBattleCommunication[1] = 0; + sub_802BC6C(); + break; + case 1: + if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) + { + PlaySE(SE_SELECT); + nullsub_6(); + gBattleCommunication[1] = 0; + sub_802BC6C(); + } + if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) + { + PlaySE(SE_SELECT); + nullsub_6(); + gBattleCommunication[1] = 1; + sub_802BC6C(); + } + if (gMain.newKeys & B_BUTTON) + { + gBattleCommunication[1] = 1; + PlaySE(SE_SELECT); + sub_8023AD8(); + gBattlescriptCurrInstr++; + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_8023AD8(); + gBattlescriptCurrInstr++; + } + break; + } +} + +static void atk68_80246A0(void) +{ + int i; + for (i = 0; i < gNoOfAllBanks; i++) + { + gUnknown_02024A76[i] = 0xC; + } + gBattlescriptCurrInstr++; +} + +static void atk69_dmg_adjustment2(void) //literally a copy of atk07 except theres no rand dmg modifier... +{ + u8 hold_effect, quality; + if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) + hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; + else + { + hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); + quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); + } + + gStringBank = gBankTarget; + + if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) + { + RecordItemBattle(gBankTarget, hold_effect); + gSpecialStatuses[gBankTarget].focusBanded = 1; + } + if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE) + goto END; + if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBankTarget].endured + && !gSpecialStatuses[gBankTarget].focusBanded) + goto END; + if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) + goto END; + + gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1; + + if (gProtectStructs[gBankTarget].endured) + { + gBattleMoveFlags |= MOVESTATUS_ENDURED; + goto END; + } + if (gSpecialStatuses[gBankTarget].focusBanded) + { + gBattleMoveFlags |= MOVESTATUS_HUNGON; + gLastUsedItem = gBattleMons[gBankTarget].item; + } + + END: + gBattlescriptCurrInstr++; +} + +void atk6A_removeitem(void) +{ + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + #define USED_HELD_ITEMS(bank) (*(u16 *)&ewram[0x160CC + 2 * (bank)]) + USED_HELD_ITEMS(gActiveBank) = gBattleMons[gActiveBank].item; + + gBattleMons[gActiveBank].item = 0; + EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 2; +} + +static void atk6B_atknameinbuff1(void) +{ + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 7; + gBattleTextBuff1[2] = gBankAttacker; + gBattleTextBuff1[3] = gBattlePartyID[gBankAttacker]; + gBattleTextBuff1[4] = 0xFF; + gBattlescriptCurrInstr++; +} + +#ifdef NONMATCHING +static void atk6C_lvlbox_display(void) +{ + u8 r1 = 0; + u8 r7 = 0; + switch (BATTLE_STRUCT->atk6C_statetracker) + { + case 0: + sub_802BBD4(0xB, 0, 0x1D, 0x7, r1); + StringCopy(gStringVar4, gUnknown_08400D9F); + + } +} + +#else +__attribute__((naked)) +static void atk6C_lvlbox_display(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + movs r1, 0\n\ + movs r7, 0\n\ + ldr r0, _08024928 @ =0x02000000\n\ + mov r10, r0\n\ + ldr r4, _0802492C @ =0x0001609c\n\ + add r4, r10\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x1\n\ + bne _0802491C\n\ + b _08024AF4\n\ +_0802491C:\n\ + cmp r0, 0x1\n\ + bgt _08024930\n\ + cmp r0, 0\n\ + beq _0802493E\n\ + b _08024C38\n\ + .align 2, 0\n\ +_08024928: .4byte 0x02000000\n\ +_0802492C: .4byte 0x0001609c\n\ +_08024930:\n\ + cmp r0, 0x2\n\ + bne _08024936\n\ + b _08024C04\n\ +_08024936:\n\ + cmp r0, 0x3\n\ + bne _0802493C\n\ + b _08024C30\n\ +_0802493C:\n\ + b _08024C38\n\ +_0802493E:\n\ + str r1, [sp]\n\ + movs r0, 0xB\n\ + movs r1, 0\n\ + movs r2, 0x1D\n\ + movs r3, 0x7\n\ + bl sub_802BBD4\n\ + ldr r0, _0802499C @ =gStringVar4\n\ + ldr r1, _080249A0 @ =gUnknown_08400D9F\n\ + bl StringCopy\n\ + adds r5, r0, 0\n\ + movs r1, 0\n\ + mov r8, r1\n\ +_0802495A:\n\ + movs r2, 0\n\ + mov r9, r2\n\ + ldr r0, _080249A4 @ =gUnknown_0840165C\n\ + mov r1, r8\n\ + lsls r4, r1, 2\n\ + adds r0, r4, r0\n\ + ldr r1, [r0]\n\ + adds r0, r5, 0\n\ + bl StringAppend\n\ + adds r5, r0, 0\n\ + ldr r0, _080249A8 @ =0x02000000\n\ + ldr r2, _080249AC @ =0x00016018\n\ + adds r0, r2\n\ + ldrb r1, [r0]\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + ldr r1, _080249B0 @ =gPlayerParty\n\ + adds r0, r1\n\ + ldr r1, _080249B4 @ =gLevelUpStatBoxStats\n\ + add r1, r8\n\ + ldrb r1, [r1]\n\ + bl GetMonData\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + mov r0, r8\n\ + cmp r0, 0x5\n\ + bhi _08024A1A\n\ + ldr r0, _080249B8 @ =_080249BC\n\ + adds r0, r4, r0\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_0802499C: .4byte gStringVar4\n\ +_080249A0: .4byte gUnknown_08400D9F\n\ +_080249A4: .4byte gUnknown_0840165C\n\ +_080249A8: .4byte 0x02000000\n\ +_080249AC: .4byte 0x00016018\n\ +_080249B0: .4byte gPlayerParty\n\ +_080249B4: .4byte gLevelUpStatBoxStats\n\ +_080249B8: .4byte _080249BC\n\ + .align 2, 0\n\ +_080249BC:\n\ + .4byte _080249D4\n\ + .4byte _080249E0\n\ + .4byte _080249EC\n\ + .4byte _080249F8\n\ + .4byte _08024A04\n\ + .4byte _08024A10\n\ +_080249D4:\n\ + ldr r0, _080249DC @ =0x02017180\n\ + ldrh r0, [r0]\n\ + b _08024A14\n\ + .align 2, 0\n\ +_080249DC: .4byte 0x02017180\n\ +_080249E0:\n\ + ldr r0, _080249E8 @ =0x02017180\n\ + ldrh r0, [r0, 0x8]\n\ + b _08024A14\n\ + .align 2, 0\n\ +_080249E8: .4byte 0x02017180\n\ +_080249EC:\n\ + ldr r0, _080249F4 @ =0x02017180\n\ + ldrh r0, [r0, 0x2]\n\ + b _08024A14\n\ + .align 2, 0\n\ +_080249F4: .4byte 0x02017180\n\ +_080249F8:\n\ + ldr r0, _08024A00 @ =0x02017180\n\ + ldrh r0, [r0, 0xA]\n\ + b _08024A14\n\ + .align 2, 0\n\ +_08024A00: .4byte 0x02017180\n\ +_08024A04:\n\ + ldr r0, _08024A0C @ =0x02017180\n\ + ldrh r0, [r0, 0x4]\n\ + b _08024A14\n\ + .align 2, 0\n\ +_08024A0C: .4byte 0x02017180\n\ +_08024A10:\n\ + ldr r0, _08024A54 @ =0x02017180\n\ + ldrh r0, [r0, 0x6]\n\ +_08024A14:\n\ + subs r0, r1, r0\n\ + lsls r0, 16\n\ + lsrs r7, r0, 16\n\ +_08024A1A:\n\ + lsls r0, r7, 16\n\ + asrs r0, 16\n\ + cmp r0, 0\n\ + bge _08024A2C\n\ + negs r0, r0\n\ + lsls r0, 16\n\ + lsrs r7, r0, 16\n\ + movs r1, 0x1\n\ + add r9, r1\n\ +_08024A2C:\n\ + movs r0, 0xFC\n\ + strb r0, [r5]\n\ + movs r0, 0x13\n\ + strb r0, [r5, 0x1]\n\ + movs r1, 0x1\n\ + mov r2, r8\n\ + ands r1, r2\n\ + lsls r0, r1, 3\n\ + adds r0, r1\n\ + adds r0, 0x5\n\ + lsls r0, 3\n\ + adds r0, 0x6\n\ + strb r0, [r5, 0x2]\n\ + adds r5, 0x3\n\ + mov r0, r9\n\ + cmp r0, 0\n\ + beq _08024A5C\n\ + ldr r1, _08024A58 @ =gUnknown_08400DAC\n\ + b _08024A5E\n\ + .align 2, 0\n\ +_08024A54: .4byte 0x02017180\n\ +_08024A58: .4byte gUnknown_08400DAC\n\ +_08024A5C:\n\ + ldr r1, _08024AA4 @ =gUnknown_08400DAA\n\ +_08024A5E:\n\ + adds r0, r5, 0\n\ + bl StringCopy\n\ + adds r5, r0, 0\n\ + movs r6, 0xFC\n\ + strb r6, [r5]\n\ + movs r4, 0x14\n\ + strb r4, [r5, 0x1]\n\ + movs r0, 0x6\n\ + strb r0, [r5, 0x2]\n\ + adds r5, 0x3\n\ + lsls r1, r7, 16\n\ + asrs r1, 16\n\ + adds r0, r5, 0\n\ + movs r2, 0x1\n\ + movs r3, 0x2\n\ + bl ConvertIntToDecimalStringN\n\ + adds r5, r0, 0\n\ + strb r6, [r5]\n\ + strb r4, [r5, 0x1]\n\ + movs r0, 0\n\ + strb r0, [r5, 0x2]\n\ + adds r5, 0x3\n\ + movs r0, 0x1\n\ + mov r1, r8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08024AA8\n\ + movs r0, 0xFE\n\ + strb r0, [r5]\n\ + movs r0, 0xFF\n\ + strb r0, [r5, 0x1]\n\ + adds r5, 0x1\n\ + b _08024AB8\n\ + .align 2, 0\n\ +_08024AA4: .4byte gUnknown_08400DAA\n\ +_08024AA8:\n\ + strb r6, [r5]\n\ + movs r0, 0x11\n\ + strb r0, [r5, 0x1]\n\ + movs r0, 0x8\n\ + strb r0, [r5, 0x2]\n\ + adds r5, 0x3\n\ + movs r0, 0xFF\n\ + strb r0, [r5]\n\ +_08024AB8:\n\ + movs r2, 0x1\n\ + add r8, r2\n\ + mov r0, r8\n\ + cmp r0, 0x5\n\ + bgt _08024AC4\n\ + b _0802495A\n\ +_08024AC4:\n\ + ldr r4, _08024AE4 @ =gUnknown_03004210\n\ + ldr r1, _08024AE8 @ =gStringVar4\n\ + adds r2, 0xFF\n\ + movs r0, 0x1\n\ + str r0, [sp]\n\ + adds r0, r4, 0\n\ + movs r3, 0xC\n\ + bl InitWindow\n\ + adds r0, r4, 0\n\ + bl sub_8002F44\n\ + ldr r1, _08024AEC @ =0x02000000\n\ + ldr r2, _08024AF0 @ =0x0001609c\n\ + adds r1, r2\n\ + b _08024BEA\n\ + .align 2, 0\n\ +_08024AE4: .4byte gUnknown_03004210\n\ +_08024AE8: .4byte gStringVar4\n\ +_08024AEC: .4byte 0x02000000\n\ +_08024AF0: .4byte 0x0001609c\n\ +_08024AF4:\n\ + ldr r0, _08024B94 @ =gMain\n\ + ldrh r0, [r0, 0x2E]\n\ + cmp r0, 0\n\ + bne _08024AFE\n\ + b _08024C38\n\ +_08024AFE:\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + ldr r0, _08024B98 @ =gStringVar4\n\ + ldr r1, _08024B9C @ =gUnknown_08400D9F\n\ + bl StringCopy\n\ + adds r5, r0, 0\n\ + movs r0, 0\n\ + mov r8, r0\n\ + mov r9, r0\n\ + movs r6, 0xFC\n\ + movs r7, 0x14\n\ + ldr r1, _08024BA0 @ =0x00016018\n\ + add r10, r1\n\ +_08024B1C:\n\ + ldr r1, _08024BA4 @ =gUnknown_0840165C\n\ + mov r2, r8\n\ + lsls r0, r2, 2\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ + adds r0, r5, 0\n\ + bl StringAppend\n\ + adds r5, r0, 0\n\ + mov r0, r10\n\ + ldrb r1, [r0]\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + ldr r1, _08024BA8 @ =gPlayerParty\n\ + adds r0, r1\n\ + ldr r1, _08024BAC @ =gLevelUpStatBoxStats\n\ + add r1, r8\n\ + ldrb r1, [r1]\n\ + bl GetMonData\n\ + adds r1, r0, 0\n\ + strb r6, [r5]\n\ + movs r0, 0x13\n\ + strb r0, [r5, 0x1]\n\ + movs r4, 0x1\n\ + mov r2, r8\n\ + ands r4, r2\n\ + lsls r0, r4, 3\n\ + adds r0, r4\n\ + adds r0, 0x5\n\ + lsls r0, 3\n\ + adds r0, 0x6\n\ + strb r0, [r5, 0x2]\n\ + adds r5, 0x3\n\ + strb r6, [r5]\n\ + strb r7, [r5, 0x1]\n\ + movs r0, 0x6\n\ + strb r0, [r5, 0x2]\n\ + adds r5, 0x3\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + adds r0, r5, 0\n\ + movs r2, 0x1\n\ + movs r3, 0x3\n\ + bl ConvertIntToDecimalStringN\n\ + adds r5, r0, 0\n\ + strb r6, [r5]\n\ + strb r7, [r5, 0x1]\n\ + mov r0, r9\n\ + strb r0, [r5, 0x2]\n\ + adds r5, 0x3\n\ + cmp r4, 0\n\ + beq _08024BB0\n\ + movs r0, 0xFE\n\ + strb r0, [r5]\n\ + movs r0, 0xFF\n\ + strb r0, [r5, 0x1]\n\ + adds r5, 0x1\n\ + b _08024BC0\n\ + .align 2, 0\n\ +_08024B94: .4byte gMain\n\ +_08024B98: .4byte gStringVar4\n\ +_08024B9C: .4byte gUnknown_08400D9F\n\ +_08024BA0: .4byte 0x00016018\n\ +_08024BA4: .4byte gUnknown_0840165C\n\ +_08024BA8: .4byte gPlayerParty\n\ +_08024BAC: .4byte gLevelUpStatBoxStats\n\ +_08024BB0:\n\ + strb r6, [r5]\n\ + movs r0, 0x11\n\ + strb r0, [r5, 0x1]\n\ + movs r0, 0x8\n\ + strb r0, [r5, 0x2]\n\ + adds r5, 0x3\n\ + movs r0, 0xFF\n\ + strb r0, [r5]\n\ +_08024BC0:\n\ + movs r1, 0x1\n\ + add r8, r1\n\ + mov r2, r8\n\ + cmp r2, 0x5\n\ + ble _08024B1C\n\ + ldr r4, _08024BF4 @ =gUnknown_03004210\n\ + ldr r1, _08024BF8 @ =gStringVar4\n\ + movs r2, 0x80\n\ + lsls r2, 1\n\ + movs r0, 0x1\n\ + str r0, [sp]\n\ + adds r0, r4, 0\n\ + movs r3, 0xC\n\ + bl InitWindow\n\ + adds r0, r4, 0\n\ + bl sub_8002F44\n\ + ldr r1, _08024BFC @ =0x02000000\n\ + ldr r0, _08024C00 @ =0x0001609c\n\ + adds r1, r0\n\ +_08024BEA:\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + b _08024C38\n\ + .align 2, 0\n\ +_08024BF4: .4byte gUnknown_03004210\n\ +_08024BF8: .4byte gStringVar4\n\ +_08024BFC: .4byte 0x02000000\n\ +_08024C00: .4byte 0x0001609c\n\ +_08024C04:\n\ + ldr r0, _08024C2C @ =gMain\n\ + ldrh r0, [r0, 0x2E]\n\ + cmp r0, 0\n\ + beq _08024C38\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x1\n\ + str r0, [sp]\n\ + movs r0, 0xB\n\ + movs r1, 0\n\ + movs r2, 0x1D\n\ + movs r3, 0x7\n\ + bl sub_802BBD4\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ + b _08024C38\n\ + .align 2, 0\n\ +_08024C2C: .4byte gMain\n\ +_08024C30:\n\ + ldr r1, _08024C48 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x1\n\ + str r0, [r1]\n\ +_08024C38:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08024C48: .4byte gBattlescriptCurrInstr\n\ + .syntax divided"); +} + +#endif + +static void atk6D_set_sentpokes_values(void) +{ + sub_80156DC(); + gBattlescriptCurrInstr++; +} + +static void atk6E_set_atk_to_player0(void) +{ + gBankAttacker = GetBankByPlayerAI(0); + gBattlescriptCurrInstr++; +} + +static void atk6F_set_visible(void) +{ + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + EmitSpriteInvisibility(0, 0); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 2; +} + +static void atk70_record_ability(void) +{ + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + RecordAbilityBattle(gActiveBank, gLastUsedAbility); + gBattlescriptCurrInstr += 1; //buggy, should be += 2, one byte for command, one byte for argument... +} + +void sub_8024CEC(void) +{ + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 2; + gBattleTextBuff2[2] = (word_2024E82); + gBattleTextBuff2[3] = uBYTE1_16(word_2024E82); + gBattleTextBuff2[4] = 0xFF; +} + +static void atk71_buffer_move_to_learn(void) +{ + sub_8024CEC(); + gBattlescriptCurrInstr++; +} + +static void atk72_jump_if_can_run_frombattle(void) +{ + if (sub_8014AB8(gBank1)) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; +} + +static void atk73_hp_thresholds(void) +{ + u8 opposing_bank; + s32 result; + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + opposing_bank = gActiveBank ^ 1; + + result = gBattleMons[opposing_bank].hp * 100 / gBattleMons[opposing_bank].maxHP; + if (result == 0) + result = 1; + + if (result > 69 || !gBattleMons[opposing_bank].hp) + BATTLE_STRUCT->hpScale = 0; + else if (result > 39) + BATTLE_STRUCT->hpScale = 1; + else if (result > 9) + BATTLE_STRUCT->hpScale = 2; + else + BATTLE_STRUCT->hpScale = 3; + } + + gBattlescriptCurrInstr += 2; +} + +static void atk74_hp_thresholds2(void) +{ + u8 opposing_bank; + u8 hp_switchout; + s32 result; + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + opposing_bank = gActiveBank ^ 1; + hp_switchout = ewram[2 * GetBankSide(opposing_bank) + 0x160bc]; //BATTLE_STRUCT->HP_OnSwitchout[GetBankSide(opposing_bank)]; + result = (hp_switchout - gBattleMons[opposing_bank].hp) * 100 / hp_switchout; + + if (gBattleMons[opposing_bank].hp >= hp_switchout) + BATTLE_STRUCT->hpScale = 0; + else if (result <= 29) + BATTLE_STRUCT->hpScale = 1; + else if (result <= 69) + BATTLE_STRUCT->hpScale = 2; + else + BATTLE_STRUCT->hpScale = 3; + } + + gBattlescriptCurrInstr += 2; +} + +static void atk75_8026A58(void) +{ + gBankInMenu = gBankAttacker; + sub_803E1B0(&gEnemyParty[gBattlePartyID[gBankAttacker]], gLastUsedItem, gBattlePartyID[gBankAttacker], 0, 1); + gBattlescriptCurrInstr += 1; +} + +static void atk76_various(void) +{ + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + switch (BSScriptRead8(gBattlescriptCurrInstr + 2)) + { + case 0: + CancelMultiTurnMoves(gActiveBank); + break; + case 1: + { + u8 side; + gBankAttacker = gBankTarget; + side = GetBankSide(gBankAttacker) ^ 1; + if (gSideTimer[side].followmeTimer && gBattleMons[gSideTimer[side].followmeTarget].hp) + gBankTarget = gSideTimer[side].followmeTarget; + else + gBankTarget = gActiveBank; + } + break; + case 2: + gBattleCommunication[0] = CanRunFromBattle(); + break; + case 3: + gBankTarget = sub_801B5C0(gCurrentMove, 0); + break; + case 4: + if (gHitMarker & HITMARKER_FAINTED(gActiveBank)) + gBattleCommunication[0] = 1; + else + gBattleCommunication[0] = 0; + break; + case 5: + gSpecialStatuses[gActiveBank].intimidatedPoke = 0; + gSpecialStatuses[gActiveBank].traced = 0; + break; + case 6: + { + int i; + u16* choiced_move; + if (gBattlePartyID[0] == BATTLE_STRUCT->expGetterID) + goto ACTIVE_0; + if (gBattlePartyID[2] != BATTLE_STRUCT->expGetterID) + break; + if (gBattlePartyID[0] == gBattlePartyID[2]) + { + ACTIVE_0: + gActiveBank = 0; + } + else + gActiveBank = 2; + + choiced_move = (u16*)(&ewram[gActiveBank * 2 + 0x160e8]); + for (i = 0; i < 4; i++) + { + if (gBattleMons[gActiveBank].moves[i] == *choiced_move) + break; + } + if (i == 4) + *choiced_move = 0; + } + break; + } + + gBattlescriptCurrInstr += 3; +} + +static void atk77_setprotect(void) //protect and endure +{ + bool8 not_last_turn = 1; + u16 last_move = gUnknown_02024C4C[gBankAttacker]; + + if (last_move != MOVE_PROTECT && last_move != MOVE_DETECT && last_move != MOVE_ENDURE) + gDisableStructs[gBankAttacker].protectUses = 0; + if (gCurrentMoveTurn == (gNoOfAllBanks - 1)) + not_last_turn = 0; + + if (sProtectSuccessRates[gDisableStructs[gBankAttacker].protectUses] > Random() && not_last_turn) + { + if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT) + { + gProtectStructs[gBankAttacker].protected = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) //what is else if + { + gProtectStructs[gBankAttacker].endured = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + gDisableStructs[gBankAttacker].protectUses++; + } + else + { + gDisableStructs[gBankAttacker].protectUses = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleMoveFlags |= MOVESTATUS_MISSED; + } + + gBattlescriptCurrInstr++; +} + +static void atk78_faintifabilitynotdamp(void) +{ + if (gBattleExecBuffer) + return; + + for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++) + { + if (gBattleMons[gBankTarget].ability == ABILITY_DAMP) + break; + } + + if (gBankTarget == gNoOfAllBanks) + { + gActiveBank = gBankAttacker; + gBattleMoveDamage = gBattleMons[gActiveBank].hp; + EmitHealthBarUpdate(0, 0x7FFF); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr++; + + for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++) + { + if (gBankTarget == gBankAttacker) + continue; + if (!(gAbsentBankFlags & gBitTable[gBankTarget])) + break; + } + } + else + { + gLastUsedAbility = ABILITY_DAMP; + RecordAbilityBattle(gBankTarget, gBattleMons[gBankTarget].ability); + gBattlescriptCurrInstr = gUnknown_081D9834; + } +} + +static void atk79_setatkhptozero(void) +{ + if (gBattleExecBuffer) + return; + + gActiveBank = gBankAttacker; + gBattleMons[gActiveBank].hp = 0; + EmitSetAttributes(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp); + MarkBufferBankForExecution(gActiveBank); + + gBattlescriptCurrInstr++; +} + +static void atk7A_jumpwhiletargetvalid(void) //used by intimidate to loop through all targets +{ + u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + for (gBankTarget++; ; gBankTarget++) + { + if (gBankTarget == gBankAttacker) + continue; + if (!(gAbsentBankFlags & gBitTable[gBankTarget])) + break; + } + + if (gBankTarget >= gNoOfAllBanks) + gBattlescriptCurrInstr += 5; + else + gBattlescriptCurrInstr = jump_loc; + } + else + gBattlescriptCurrInstr += 5; +} + +static void atk7B_healhalfHP_if_possible(void) +{ + u8* fail_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + + if (BSScriptRead8(gBattlescriptCurrInstr + 5) == 1) + gBankTarget = gBankAttacker; + + gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + + if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) + gBattlescriptCurrInstr = fail_loc; + else + gBattlescriptCurrInstr += 6; +} + +static void atk7C_8025508(void) +{ + u16 r7 = ewram[gBankAttacker * 2 + 0x160ac] | (ewram[gBankAttacker * 2 + 0x160ad] << 8); + u16 r6 = ewram[gBankAttacker * 4 + 0x16100] | (ewram[gBankAttacker * 4 + 0x16101] << 8); + u16 r5 = ewram[gBankAttacker * 4 + 0x16102] | (ewram[gBankAttacker * 4 + 0x16103] << 8); + + if (r7 !=0 && r7 != 0xFFFF) + { + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gCurrentMove = r7; + gBankTarget = sub_801B5C0(gCurrentMove, 0); + gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]; + } + else if (r6 != 0 && r5 != 0 && r6 != 0xFFFF && r5 != 0xFFFF) + { + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + if (Random() & 1) + gCurrentMove = r6; + else + gCurrentMove = r5; + gBankTarget = sub_801B5C0(gCurrentMove, 0); + gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]; + } + else if (r6 != 0 && r6 != 0xFFFF) + { + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gCurrentMove = r6; + gBankTarget = sub_801B5C0(gCurrentMove, 0); + gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]; + } + else if (r5 != 0 && r5 != 0xFFFF) + { + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gCurrentMove = r5; + gBankTarget = sub_801B5C0(gCurrentMove, 0); + gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]; + } + else + { + gSpecialStatuses[gBankAttacker].flag20 = 1; + gBattlescriptCurrInstr++; + } +} + +static void atk7D_set_rain(void) +{ + if (gBattleWeather & WEATHER_RAIN_ANY) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + } + else + { + gBattleWeather = WEATHER_RAIN_TEMPORARY; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gWishFutureKnock.weatherDuration = 5; + } + gBattlescriptCurrInstr++; +} + +static void atk7E_setreflect(void) +{ + if (gSideAffecting[GetBankIdentity(gBankAttacker) & 1] & SIDE_STATUS_REFLECT) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else + { + gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_REFLECT; + gSideTimer[GetBankIdentity(gBankAttacker) & 1].reflectTimer = 5; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2) + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + gBattlescriptCurrInstr++; +} + +static void atk7F_setseeded(void) +{ + if (gBattleMoveFlags & MOVESTATUS_NOEFFECT || gStatuses3[gBankTarget] & STATUS3_LEECHSEED) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else if (gBattleMons[gBankTarget].type1 == TYPE_GRASS || gBattleMons[gBankTarget].type2 == TYPE_GRASS) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + } + else + { + gStatuses3[gBankTarget] |= gBankAttacker; + gStatuses3[gBankTarget] |= STATUS3_LEECHSEED; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + + gBattlescriptCurrInstr++; +} + +static void atk80_manipulatedamage(void) +{ + switch (BSScriptRead8(gBattlescriptCurrInstr + 1)) + { + case 0: + gBattleMoveDamage *= -1; + break; + case 1: + gBattleMoveDamage /= 2; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + if ((gBattleMons[gBankTarget].maxHP / 2) < gBattleMoveDamage) + gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; + break; + case 2: + gBattleMoveDamage *= 2; + break; + } + + gBattlescriptCurrInstr += 2; +} + +static void atk81_setrest(void) +{ + u8* fail_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gActiveBank = gBankTarget = gBankAttacker; + gBattleMoveDamage = gBattleMons[gBankTarget].maxHP * (-1); + if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) + gBattlescriptCurrInstr = fail_loc; + else + { + if (gBattleMons[gBankTarget].status1 & ((u8)(~STATUS_SLEEP))) + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + + gBattleMons[gBankTarget].status1 = 3; + EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 5; + } +} + +static void atk82_jumpifnotfirstturn(void) +{ + u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + + if (gDisableStructs[gBankAttacker].isFirstTurn) + gBattlescriptCurrInstr += 5; + else + gBattlescriptCurrInstr = jump_loc; +} + +static void atk83_nop(void) +{ + gBattlescriptCurrInstr++; +} + +bool8 sub_8025A44(u8 bank) //uproar wakeup check +{ + int i; + for (i = 0; i < gNoOfAllBanks; i++) + { + if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || gBattleMons[bank].ability == ABILITY_SOUNDPROOF) //wtf gamefreak, you should check this only once, not every time in a loop... + continue; + BATTLE_STRUCT->scriptingActive = i; + if (gBankTarget == 0xFF) + gBankTarget = i; + else if (gBankTarget == i) + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + break; + } + if (i == gNoOfAllBanks) + return 0; + else + return 1; +} + +static void atk84_jump_if_cant_sleep(void) +{ + u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + if (sub_8025A44(gBankTarget)) + gBattlescriptCurrInstr = jump_loc; + else if (gBattleMons[gBankTarget].ability == ABILITY_INSOMNIA || gBattleMons[gBankTarget].ability == ABILITY_VITAL_SPIRIT) + { + gLastUsedAbility = gBattleMons[gBankTarget].ability; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattlescriptCurrInstr = jump_loc; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); + } + else + { + gBattlescriptCurrInstr += 5; + } +} + +static void atk85_stockpile(void) +{ + if (gDisableStructs[gBankAttacker].stockpileCounter == 3) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else + { + gDisableStructs[gBankAttacker].stockpileCounter++; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 1; + gBattleTextBuff1[2] = 1; + gBattleTextBuff1[3] = 1; + gBattleTextBuff1[4] = gDisableStructs[gBankAttacker].stockpileCounter; + gBattleTextBuff1[5] = 0xFF; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + gBattlescriptCurrInstr++; +} + +static void atk86_stockpiletobasedamage(void) +{ + u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + if (gDisableStructs[gBankAttacker].stockpileCounter == 0) + { + gBattlescriptCurrInstr = jump_loc; + } + else + { + if (gBattleCommunication[6] != 1) + { + gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, + gSideAffecting[GetBankIdentity(gBankTarget) & 1], 0, + 0, gBankAttacker, gBankTarget) + * gDisableStructs[gBankAttacker].stockpileCounter; + BATTLE_STRUCT->animTurn = gDisableStructs[gBankAttacker].stockpileCounter; + + if (gProtectStructs[gBankAttacker].helpingHand) + gBattleMoveDamage = gBattleMoveDamage * 15 / 10; + } + gDisableStructs[gBankAttacker].stockpileCounter = 0; + gBattlescriptCurrInstr += 5; + } +} + +static void atk87_stockpiletohpheal(void) +{ + u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + if (gDisableStructs[gBankAttacker].stockpileCounter == 0) + { + gBattlescriptCurrInstr = jump_loc; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else if (gBattleMons[gBankAttacker].maxHP == gBattleMons[gBankAttacker].hp) + { + gDisableStructs[gBankAttacker].stockpileCounter = 0; + gBattlescriptCurrInstr = jump_loc; + gBankTarget = gBankAttacker; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else + { + gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / (1 << (3 - gDisableStructs[gBankAttacker].stockpileCounter)); + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + BATTLE_STRUCT->animTurn = gDisableStructs[gBankAttacker].stockpileCounter; + gDisableStructs[gBankAttacker].stockpileCounter = 0; + gBattlescriptCurrInstr += 5; + gBankTarget = gBankAttacker; + } +} + +static void atk88_negativedamage(void) +{ + gBattleMoveDamage = -(gHP_dealt / 2); + if (gBattleMoveDamage == 0) + gBattleMoveDamage = -1; + gBattlescriptCurrInstr++; +} + +#ifdef NONMATCHING +u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr) +{ + u8 r9 = 0; + u8 r10 = 0; + u8 index; + if (flags & 0x40) + gActiveBank = gBankAttacker; + else + gActiveBank = gBankTarget; + flags &= ~(0x40); + if (flags & 0x80) + r9++; + flags &= ~(0x80); + if (flags & 0x20) + r10++; + flags &= ~(0x20); + + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 5; + gBattleTextBuff1[2] = stat; + gBattleTextBuff1[3] = 0xFF; + + if ((statchanger << 0x18) < 0) //stat decrease + { + if (gSideTimer[GetBankIdentity(gActiveBank) & 1].mistTimer && !r9 && gCurrentMove != MOVE_CURSE) + { + if (flags == 1) + { + if (gSpecialStatuses[gActiveBank].statloweringflag) + gBattlescriptCurrInstr = bs_ptr; + else + { + b_movescr_stack_push(bs_ptr); + BATTLE_STRUCT->scriptingActive = gActiveBank; + gBattlescriptCurrInstr = BattleScript_MistProtected; + gSpecialStatuses[gActiveBank].statloweringflag = 1; + } + } + return 1; + } + else if (gCurrentMove != MOVE_CURSE && r10 != 1 && JumpIfMoveAffectedByProtect(0)) + { + gBattlescriptCurrInstr = BattleScript_ButItFailed; + return 1; + } + else if ((gBattleMons[gActiveBank].ability == ABILITY_CLEAR_BODY || gBattleMons[gActiveBank].ability == ABILITY_WHITE_SMOKE) && !r9 && gCurrentMove != MOVE_CURSE) + { + if (flags == 1) + { + if (gSpecialStatuses[gActiveBank].statloweringflag) + gBattlescriptCurrInstr = bs_ptr; + else + { + b_movescr_stack_push(bs_ptr); + BATTLE_STRUCT->scriptingActive = gActiveBank; + gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; + gLastUsedAbility = gBattleMons[gActiveBank].ability; + RecordAbilityBattle(gActiveBank, gLastUsedAbility); + gSpecialStatuses[gActiveBank].statloweringflag = 1; + } + } + return 1; + } + else if (gBattleMons[gActiveBank].ability == ABILITY_KEEN_EYE && !r9 && stat == STAT_STAGE_ACC) + { + if (flags == 1) + { + b_movescr_stack_push(bs_ptr); + BATTLE_STRUCT->scriptingActive = gActiveBank; + gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; + gLastUsedAbility = gBattleMons[gActiveBank].ability; + RecordAbilityBattle(gActiveBank, gLastUsedAbility); + } + return 1; + } + else if (gBattleMons[gActiveBank].ability == ABILITY_HYPER_CUTTER && !r9 && stat == STAT_STAGE_ATK) + { + if (flags == 1) + { + b_movescr_stack_push(bs_ptr); + BATTLE_STRUCT->scriptingActive = gActiveBank; + gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; + gLastUsedAbility = gBattleMons[gActiveBank].ability; + RecordAbilityBattle(gActiveBank, gLastUsedAbility); + } + return 1; + } + else if (gBattleMons[gActiveBank].ability == ABILITY_SHIELD_DUST && flags == 0) + return 1; + else //decrease + { + statchanger = -((statchanger >> 4) & (7)); + gBattleTextBuff2[0] = 0xFD; + index = 1; + if (statchanger == -2) + { + gBattleTextBuff2[1] = 0; + gBattleTextBuff2[2] = 0xD3; //harshly + gBattleTextBuff2[3] = 0x0; + index = 4; + } + gBattleTextBuff2[index] = 0; + index++; + gBattleTextBuff2[index] = 0xD4; //fell + index++; + gBattleTextBuff2[index] = 0; + index++; + gBattleTextBuff2[index] = 0xFF; + + if (gBattleMons[gActiveBank].statStages[stat] == 0) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + } + else + { + u8 stringID = 0; + if (gBankTarget == gActiveBank) + stringID = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = stringID; + } + } + } + else //stat increase + { + statchanger = (statchanger >> 4) & (7); + gBattleTextBuff2[0] = 0xFD; + index = 1; + if (statchanger == 2) + { + gBattleTextBuff2[1] = 0; + gBattleTextBuff2[2] = 0xD1; //sharply + gBattleTextBuff2[3] = 0x0; + index = 4; + } + gBattleTextBuff2[index] = 0; + index++; + gBattleTextBuff2[index] = 0xD2; //rose + index++; + gBattleTextBuff2[index] = 0; + index++; + gBattleTextBuff2[index] = 0xFF; + + if (gBattleMons[gActiveBank].statStages[stat] == 0xC) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + } + else + { + u8 stringID = 0; + if (gBankTarget == gActiveBank) + stringID = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = stringID; + } + } + + gBattleMons[gActiveBank].statStages[stat] += statchanger; + if (gBattleMons[gActiveBank].statStages[stat] < 0) + gBattleMons[gActiveBank].statStages[stat] = 0; + if (gBattleMons[gActiveBank].statStages[stat] > 0xC) + gBattleMons[gActiveBank].statStages[stat] = 0xC; + + if (gBattleCommunication[MULTISTRING_CHOOSER] == 2) + { + if (flags & 1) + gBattleMoveFlags |= MOVESTATUS_MISSED; + if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && !(flags & 1)) //what the actual fuck gamefreak... + return 1; + } + return 0; +} + +#else +__attribute__((naked)) +u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + mov r8, r3\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + lsls r1, 24\n\ + lsrs r7, r1, 24\n\ + lsls r2, 24\n\ + lsrs r5, r2, 24\n\ + movs r0, 0\n\ + mov r9, r0\n\ + mov r10, r0\n\ + movs r0, 0x40\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + beq _08025E54\n\ + ldr r0, _08025E4C @ =gActiveBank\n\ + ldr r1, _08025E50 @ =gBankAttacker\n\ + b _08025E58\n\ + .align 2, 0\n\ +_08025E4C: .4byte gActiveBank\n\ +_08025E50: .4byte gBankAttacker\n\ +_08025E54:\n\ + ldr r0, _08025EF8 @ =gActiveBank\n\ + ldr r1, _08025EFC @ =gBankTarget\n\ +_08025E58:\n\ + ldrb r1, [r1]\n\ + strb r1, [r0]\n\ + movs r0, 0xBF\n\ + ands r5, r0\n\ + movs r0, 0x80\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + beq _08025E72\n\ + mov r0, r9\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r9, r0\n\ +_08025E72:\n\ + movs r0, 0x7F\n\ + ands r5, r0\n\ + movs r0, 0x20\n\ + ands r0, r5\n\ + cmp r0, 0\n\ + beq _08025E88\n\ + mov r0, r10\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ +_08025E88:\n\ + movs r0, 0xDF\n\ + ands r5, r0\n\ + ldr r1, _08025F00 @ =gBattleTextBuff1\n\ + movs r4, 0\n\ + movs r2, 0xFD\n\ + strb r2, [r1]\n\ + movs r0, 0x5\n\ + strb r0, [r1, 0x1]\n\ + strb r7, [r1, 0x2]\n\ + movs r3, 0x1\n\ + negs r3, r3\n\ + mov r12, r3\n\ + movs r0, 0xFF\n\ + strb r0, [r1, 0x3]\n\ + lsls r0, r6, 24\n\ + cmp r0, 0\n\ + blt _08025EAC\n\ + b _080261B0\n\ +_08025EAC:\n\ + ldr r4, _08025F04 @ =gSideTimer\n\ + ldr r1, _08025EF8 @ =gActiveBank\n\ + ldrb r0, [r1]\n\ + bl GetBankIdentity\n\ + movs r1, 0x1\n\ + ands r1, r0\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldrb r0, [r0, 0x2]\n\ + cmp r0, 0\n\ + beq _08025F54\n\ + mov r2, r9\n\ + cmp r2, 0\n\ + bne _08025F54\n\ + ldr r0, _08025F08 @ =gCurrentMove\n\ + ldrh r0, [r0]\n\ + cmp r0, 0xAE\n\ + beq _08025F84\n\ + cmp r5, 0x1\n\ + bne _08025F74\n\ + ldr r4, _08025F0C @ =gSpecialStatuses\n\ + ldr r3, _08025EF8 @ =gActiveBank\n\ + ldrb r0, [r3]\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4\n\ + ldrb r0, [r1]\n\ + lsls r0, 31\n\ + cmp r0, 0\n\ + beq _08025F14\n\ + ldr r0, _08025F10 @ =gBattlescriptCurrInstr\n\ + mov r4, r8\n\ + str r4, [r0]\n\ + b _08025F74\n\ + .align 2, 0\n\ +_08025EF8: .4byte gActiveBank\n\ +_08025EFC: .4byte gBankTarget\n\ +_08025F00: .4byte gBattleTextBuff1\n\ +_08025F04: .4byte gSideTimer\n\ +_08025F08: .4byte gCurrentMove\n\ +_08025F0C: .4byte gSpecialStatuses\n\ +_08025F10: .4byte gBattlescriptCurrInstr\n\ +_08025F14:\n\ + mov r0, r8\n\ + bl b_movescr_stack_push\n\ + ldr r0, _08025F40 @ =0x02000000\n\ + ldr r6, _08025F44 @ =gActiveBank\n\ + ldrb r1, [r6]\n\ + ldr r2, _08025F48 @ =0x00016003\n\ + adds r0, r2\n\ + strb r1, [r0]\n\ + ldr r1, _08025F4C @ =gBattlescriptCurrInstr\n\ + ldr r0, _08025F50 @ =BattleScript_MistProtected\n\ + str r0, [r1]\n\ + ldrb r1, [r6]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldrb r1, [r0]\n\ + movs r2, 0x1\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ + b _08025F74\n\ + .align 2, 0\n\ +_08025F40: .4byte 0x02000000\n\ +_08025F44: .4byte gActiveBank\n\ +_08025F48: .4byte 0x00016003\n\ +_08025F4C: .4byte gBattlescriptCurrInstr\n\ +_08025F50: .4byte BattleScript_MistProtected\n\ +_08025F54:\n\ + ldr r0, _08025F78 @ =gCurrentMove\n\ + ldrh r0, [r0]\n\ + cmp r0, 0xAE\n\ + beq _08025F84\n\ + mov r3, r10\n\ + cmp r3, 0x1\n\ + beq _08025F84\n\ + movs r0, 0\n\ + bl JumpIfMoveAffectedByProtect\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08025F84\n\ + ldr r1, _08025F7C @ =gBattlescriptCurrInstr\n\ + ldr r0, _08025F80 @ =BattleScript_ButItFailed\n\ + str r0, [r1]\n\ +_08025F74:\n\ + movs r0, 0x1\n\ + b _080262A4\n\ + .align 2, 0\n\ +_08025F78: .4byte gCurrentMove\n\ +_08025F7C: .4byte gBattlescriptCurrInstr\n\ +_08025F80: .4byte BattleScript_ButItFailed\n\ +_08025F84:\n\ + ldr r2, _08025FCC @ =gBattleMons\n\ + ldr r1, _08025FD0 @ =gActiveBank\n\ + ldrb r3, [r1]\n\ + movs r4, 0x58\n\ + adds r0, r3, 0\n\ + muls r0, r4\n\ + adds r0, r2\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + mov r10, r2\n\ + cmp r0, 0x1D\n\ + beq _08025FA0\n\ + cmp r0, 0x49\n\ + bne _08026040\n\ +_08025FA0:\n\ + mov r0, r9\n\ + cmp r0, 0\n\ + bne _08026040\n\ + ldr r0, _08025FD4 @ =gCurrentMove\n\ + ldrh r0, [r0]\n\ + cmp r0, 0xAE\n\ + beq _08026040\n\ + cmp r5, 0x1\n\ + bne _08025F74\n\ + ldr r4, _08025FD8 @ =gSpecialStatuses\n\ + lsls r0, r3, 2\n\ + adds r0, r3\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldrb r0, [r0]\n\ + lsls r0, 31\n\ + cmp r0, 0\n\ + beq _08025FE0\n\ + ldr r0, _08025FDC @ =gBattlescriptCurrInstr\n\ + mov r1, r8\n\ + str r1, [r0]\n\ + b _08025F74\n\ + .align 2, 0\n\ +_08025FCC: .4byte gBattleMons\n\ +_08025FD0: .4byte gActiveBank\n\ +_08025FD4: .4byte gCurrentMove\n\ +_08025FD8: .4byte gSpecialStatuses\n\ +_08025FDC: .4byte gBattlescriptCurrInstr\n\ +_08025FE0:\n\ + mov r0, r8\n\ + bl b_movescr_stack_push\n\ + ldr r0, _08026028 @ =0x02000000\n\ + ldr r2, _0802602C @ =gActiveBank\n\ + ldrb r1, [r2]\n\ + ldr r3, _08026030 @ =0x00016003\n\ + adds r0, r3\n\ + strb r1, [r0]\n\ + ldr r1, _08026034 @ =gBattlescriptCurrInstr\n\ + ldr r0, _08026038 @ =BattleScript_AbilityNoStatLoss\n\ + str r0, [r1]\n\ + ldr r1, _0802603C @ =gLastUsedAbility\n\ + ldrb r0, [r2]\n\ + movs r6, 0x58\n\ + muls r0, r6\n\ + add r0, r10\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldrb r0, [r2]\n\ + ldrb r1, [r1]\n\ + bl RecordAbilityBattle\n\ + ldr r0, _0802602C @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r4\n\ + ldrb r1, [r0]\n\ + movs r2, 0x1\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ + b _08025F74\n\ + .align 2, 0\n\ +_08026028: .4byte 0x02000000\n\ +_0802602C: .4byte gActiveBank\n\ +_08026030: .4byte 0x00016003\n\ +_08026034: .4byte gBattlescriptCurrInstr\n\ +_08026038: .4byte BattleScript_AbilityNoStatLoss\n\ +_0802603C: .4byte gLastUsedAbility\n\ +_08026040:\n\ + ldr r1, _08026090 @ =gActiveBank\n\ + ldrb r0, [r1]\n\ + movs r4, 0x58\n\ + muls r0, r4\n\ + add r0, r10\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x33\n\ + bne _080260A8\n\ + mov r2, r9\n\ + cmp r2, 0\n\ + bne _080260A8\n\ + cmp r7, 0x6\n\ + bne _080260A8\n\ + cmp r5, 0x1\n\ + bne _08025F74\n\ + mov r0, r8\n\ + bl b_movescr_stack_push\n\ + ldr r0, _08026094 @ =0x02000000\n\ + ldr r3, _08026090 @ =gActiveBank\n\ + ldrb r1, [r3]\n\ + ldr r6, _08026098 @ =0x00016003\n\ + adds r0, r6\n\ + strb r1, [r0]\n\ + ldr r1, _0802609C @ =gBattlescriptCurrInstr\n\ + ldr r0, _080260A0 @ =BattleScript_AbilityNoSpecificStatLoss\n\ + str r0, [r1]\n\ + ldr r1, _080260A4 @ =gLastUsedAbility\n\ + ldrb r0, [r3]\n\ + muls r0, r4\n\ + add r0, r10\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldrb r0, [r3]\n\ + ldrb r1, [r1]\n\ + bl RecordAbilityBattle\n\ + b _08025F74\n\ + .align 2, 0\n\ +_08026090: .4byte gActiveBank\n\ +_08026094: .4byte 0x02000000\n\ +_08026098: .4byte 0x00016003\n\ +_0802609C: .4byte gBattlescriptCurrInstr\n\ +_080260A0: .4byte BattleScript_AbilityNoSpecificStatLoss\n\ +_080260A4: .4byte gLastUsedAbility\n\ +_080260A8:\n\ + ldr r1, _080260FC @ =gActiveBank\n\ + ldrb r0, [r1]\n\ + movs r4, 0x58\n\ + muls r0, r4\n\ + add r0, r10\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x34\n\ + bne _08026114\n\ + mov r2, r9\n\ + cmp r2, 0\n\ + bne _08026114\n\ + cmp r7, 0x1\n\ + bne _08026114\n\ + cmp r5, 0x1\n\ + beq _080260CA\n\ + b _08025F74\n\ +_080260CA:\n\ + mov r0, r8\n\ + bl b_movescr_stack_push\n\ + ldr r0, _08026100 @ =0x02000000\n\ + ldr r3, _080260FC @ =gActiveBank\n\ + ldrb r1, [r3]\n\ + ldr r6, _08026104 @ =0x00016003\n\ + adds r0, r6\n\ + strb r1, [r0]\n\ + ldr r1, _08026108 @ =gBattlescriptCurrInstr\n\ + ldr r0, _0802610C @ =BattleScript_AbilityNoSpecificStatLoss\n\ + str r0, [r1]\n\ + ldr r1, _08026110 @ =gLastUsedAbility\n\ + ldrb r0, [r3]\n\ + muls r0, r4\n\ + add r0, r10\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldrb r0, [r3]\n\ + ldrb r1, [r1]\n\ + bl RecordAbilityBattle\n\ + b _08025F74\n\ + .align 2, 0\n\ +_080260FC: .4byte gActiveBank\n\ +_08026100: .4byte 0x02000000\n\ +_08026104: .4byte 0x00016003\n\ +_08026108: .4byte gBattlescriptCurrInstr\n\ +_0802610C: .4byte BattleScript_AbilityNoSpecificStatLoss\n\ +_08026110: .4byte gLastUsedAbility\n\ +_08026114:\n\ + ldr r0, _080261A0 @ =gActiveBank\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + add r0, r10\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x13\n\ + bne _0802612C\n\ + cmp r5, 0\n\ + bne _0802612C\n\ + b _08025F74\n\ +_0802612C:\n\ + lsls r0, r6, 24\n\ + asrs r0, 28\n\ + movs r1, 0x7\n\ + ands r0, r1\n\ + negs r0, r0\n\ + lsls r0, 24\n\ + ldr r3, _080261A4 @ =gBattleTextBuff2\n\ + movs r4, 0\n\ + movs r1, 0xFD\n\ + strb r1, [r3]\n\ + movs r2, 0x1\n\ + lsrs r6, r0, 24\n\ + asrs r0, 24\n\ + subs r1, 0xFF\n\ + cmp r0, r1\n\ + bne _08026156\n\ + strb r4, [r3, 0x1]\n\ + movs r0, 0xD3\n\ + strb r0, [r3, 0x2]\n\ + strb r4, [r3, 0x3]\n\ + movs r2, 0x4\n\ +_08026156:\n\ + adds r0, r2, r3\n\ + strb r4, [r0]\n\ + adds r2, 0x1\n\ + adds r1, r2, r3\n\ + movs r0, 0xD4\n\ + strb r0, [r1]\n\ + adds r2, 0x1\n\ + adds r0, r2, r3\n\ + strb r4, [r0]\n\ + adds r2, 0x1\n\ + adds r1, r2, r3\n\ + movs r0, 0xFF\n\ + strb r0, [r1]\n\ + ldr r1, _080261A0 @ =gActiveBank\n\ + ldrb r2, [r1]\n\ + movs r0, 0x58\n\ + muls r0, r2\n\ + adds r0, r7, r0\n\ + mov r1, r10\n\ + adds r1, 0x18\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0\n\ + beq _08026206\n\ + movs r1, 0\n\ + ldr r0, _080261A8 @ =gBankTarget\n\ + ldrb r0, [r0]\n\ + ldr r3, _080261AC @ =gBattleCommunication\n\ + mov r8, r3\n\ + cmp r0, r2\n\ + bne _0802619A\n\ + movs r1, 0x1\n\ +_0802619A:\n\ + mov r4, r8\n\ + strb r1, [r4, 0x5]\n\ + b _08026234\n\ + .align 2, 0\n\ +_080261A0: .4byte gActiveBank\n\ +_080261A4: .4byte gBattleTextBuff2\n\ +_080261A8: .4byte gBankTarget\n\ +_080261AC: .4byte gBattleCommunication\n\ +_080261B0:\n\ + asrs r6, r0, 28\n\ + movs r0, 0x7\n\ + ands r6, r0\n\ + ldr r3, _08026210 @ =gBattleTextBuff2\n\ + strb r2, [r3]\n\ + movs r2, 0x1\n\ + cmp r6, 0x2\n\ + bne _080261CA\n\ + strb r4, [r3, 0x1]\n\ + movs r0, 0xD1\n\ + strb r0, [r3, 0x2]\n\ + strb r4, [r3, 0x3]\n\ + movs r2, 0x4\n\ +_080261CA:\n\ + adds r0, r2, r3\n\ + strb r4, [r0]\n\ + adds r2, 0x1\n\ + adds r1, r2, r3\n\ + movs r0, 0xD2\n\ + strb r0, [r1]\n\ + adds r2, 0x1\n\ + adds r0, r2, r3\n\ + strb r4, [r0]\n\ + adds r2, 0x1\n\ + adds r1, r2, r3\n\ + ldrb r0, [r1]\n\ + mov r2, r12\n\ + orrs r0, r2\n\ + strb r0, [r1]\n\ + ldr r2, _08026214 @ =gBattleMons\n\ + ldr r4, _08026218 @ =gActiveBank\n\ + ldrb r3, [r4]\n\ + movs r0, 0x58\n\ + muls r0, r3\n\ + adds r0, r7, r0\n\ + adds r1, r2, 0\n\ + adds r1, 0x18\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + mov r10, r2\n\ + cmp r0, 0xC\n\ + bne _08026220\n\ +_08026206:\n\ + ldr r1, _0802621C @ =gBattleCommunication\n\ + movs r0, 0x2\n\ + strb r0, [r1, 0x5]\n\ + mov r8, r1\n\ + b _08026234\n\ + .align 2, 0\n\ +_08026210: .4byte gBattleTextBuff2\n\ +_08026214: .4byte gBattleMons\n\ +_08026218: .4byte gActiveBank\n\ +_0802621C: .4byte gBattleCommunication\n\ +_08026220:\n\ + movs r1, 0\n\ + ldr r0, _080262B4 @ =gBankTarget\n\ + ldrb r0, [r0]\n\ + ldr r2, _080262B8 @ =gBattleCommunication\n\ + mov r8, r2\n\ + cmp r0, r3\n\ + bne _08026230\n\ + movs r1, 0x1\n\ +_08026230:\n\ + mov r3, r8\n\ + strb r1, [r3, 0x5]\n\ +_08026234:\n\ + ldr r2, _080262BC @ =gActiveBank\n\ + ldrb r0, [r2]\n\ + movs r4, 0x58\n\ + adds r1, r0, 0\n\ + muls r1, r4\n\ + adds r1, r7, r1\n\ + mov r3, r10\n\ + adds r3, 0x18\n\ + adds r1, r3\n\ + lsls r0, r6, 24\n\ + asrs r0, 24\n\ + ldrb r6, [r1]\n\ + adds r0, r6\n\ + strb r0, [r1]\n\ + ldrb r0, [r2]\n\ + muls r0, r4\n\ + adds r0, r7, r0\n\ + adds r1, r0, r3\n\ + movs r0, 0\n\ + ldrsb r0, [r1, r0]\n\ + cmp r0, 0\n\ + bge _08026264\n\ + movs r0, 0\n\ + strb r0, [r1]\n\ +_08026264:\n\ + ldr r1, _080262BC @ =gActiveBank\n\ + ldrb r0, [r1]\n\ + muls r0, r4\n\ + adds r0, r7, r0\n\ + adds r1, r0, r3\n\ + movs r0, 0\n\ + ldrsb r0, [r1, r0]\n\ + cmp r0, 0xC\n\ + ble _0802627A\n\ + movs r0, 0xC\n\ + strb r0, [r1]\n\ +_0802627A:\n\ + mov r2, r8\n\ + ldrb r0, [r2, 0x5]\n\ + cmp r0, 0x2\n\ + bne _080262A2\n\ + movs r3, 0x1\n\ + ands r3, r5\n\ + cmp r3, 0\n\ + beq _08026294\n\ + ldr r0, _080262C0 @ =gBattleMoveFlags\n\ + ldrb r1, [r0]\n\ + movs r2, 0x1\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ +_08026294:\n\ + mov r4, r8\n\ + ldrb r0, [r4, 0x5]\n\ + cmp r0, 0x2\n\ + bne _080262A2\n\ + cmp r3, 0\n\ + bne _080262A2\n\ + b _08025F74\n\ +_080262A2:\n\ + movs r0, 0\n\ +_080262A4:\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_080262B4: .4byte gBankTarget\n\ +_080262B8: .4byte gBattleCommunication\n\ +_080262BC: .4byte gActiveBank\n\ +_080262C0: .4byte gBattleMoveFlags\n\ + .syntax divided"); +} +#endif // NONMATCHING + +static void atk89_statbuffchange(void) +{ + u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + if (ChangeStatBuffs(BATTLE_STRUCT->statChanger & 0xF0, BATTLE_STRUCT->statChanger & 0xF, BSScriptRead8(gBattlescriptCurrInstr + 1), jump_loc) == 0) + gBattlescriptCurrInstr += 6; +} + +static void atk8A_normalisebuffs(void) //haze +{ + int i, j; + for (i = 0; i < gNoOfAllBanks; i++) + { + for (j = 0; j < 8; j++) + { + gBattleMons[i].statStages[j] = 6; + } + } + gBattlescriptCurrInstr++; +} + +static void atk8B_setbide(void) +{ + gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS; + gLockedMove[gBankAttacker] = gCurrentMove; + gTakenDmg[gBankAttacker] = 0; + gBattleMons[gBankAttacker].status2 |= (STATUS2_BIDE - 0x100); //2 turns + gBattlescriptCurrInstr++; +} + +static void atk8C_confuseifrepeatingattackends(void) +{ + if (!(gBattleMons[gBankAttacker].status2 & STATUS2_LOCK_CONFUSE)) + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x75; + gBattlescriptCurrInstr++; +} + +static void atk8D_setmultihit_counter(void) +{ + if (BSScriptRead8(gBattlescriptCurrInstr + 1)) + gMultiHitCounter = BSScriptRead8(gBattlescriptCurrInstr + 1); + else + { + gMultiHitCounter = Random() & 3; + if (gMultiHitCounter > 1) + gMultiHitCounter = (Random() & 3) + 2; + else + gMultiHitCounter += 2; + } + gBattlescriptCurrInstr += 2; +} + +static void atk8E_prepare_multihit(void) +{ + ewram[0x160e0] = 0xFD; + ewram[0x160e1] = 1; + ewram[0x160e2] = 1; + ewram[0x160e3] = 1; + ewram[0x160e4] = 0; + ewram[0x160e5] = 0xFF; + gBattlescriptCurrInstr++; +} + +static bool8 sub_80264C0(void) +{ + if (gBattleMons[gBankAttacker].level >= gBattleMons[gBankTarget].level) + { + ewram[gBankTarget + 0x16064] = gBattlePartyID[gBankTarget]; + } + else + { + u16 random = Random() & 0xFF; + if ((u32)((random * (gBattleMons[gBankAttacker].level + gBattleMons[gBankTarget].level) >> 8) + 1) <= (gBattleMons[gBankTarget].level / 4)) + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + return 0; + } + ewram[gBankTarget + 0x16064] = gBattlePartyID[gBankTarget]; + } + gBattlescriptCurrInstr = gUnknown_081D90FC; + return 1; +} + +static void atk8F_forcerandomswitch(void) +{ + if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)) + { + u8 i; + struct Pokemon* party; + u8 valid; + u8 val; + if (!GetBankSide(gBankTarget)) + party = gPlayerParty; + else + party = gEnemyParty; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + valid = 0; + val = 0; + if (sub_803FBFC(sub_803FC34(gBankTarget)) == 1) + val = 3; + for (i = val; i < val + 3; i++) + { + if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE + && !GetMonData(&party[i], MON_DATA_IS_EGG) + && GetMonData(&party[i], MON_DATA_HP) != 0) + valid++; + } + } + else + { + valid = 0; + for (i = 0; i < 6; i++) + { + if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE + && !GetMonData(&party[i], MON_DATA_IS_EGG) + && GetMonData(&party[i], MON_DATA_HP) != 0) + valid++; + } + } + + if ((valid < 2 && (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) + || (valid < 3 && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))) + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } + else if (sub_80264C0()) + { +#define MON_CAN_BATTLE(mon) (((GetMonData(mon, MON_DATA_SPECIES) && GetMonData(mon, MON_DATA_IS_EGG) != 1 && GetMonData(mon, MON_DATA_HP)))) + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + do + { + val = Random() % 3; + if (sub_803FBFC(sub_803FC34(gBankTarget)) == 1) + i = val + 3; + else + i = val; + } while (i == gBattlePartyID[gBankTarget] || i == gBattlePartyID[gBankTarget ^ 2] || !MON_CAN_BATTLE(&party[i])); + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + do + { + i = Random() % 6; + } while (i == gBattlePartyID[gBankTarget] || i == gBattlePartyID[gBankTarget ^ 2] || !MON_CAN_BATTLE(&party[i])); + } + else + { + do + { + i = Random() % 6; + } while (i == gBattlePartyID[gBankTarget] || !MON_CAN_BATTLE(&party[i])); + } + } + ewram[gBankTarget + 0x16068] = i; + if (!IsLinkDoubleBattle()) + sub_8012258(gBankTarget); + sub_8094B6C(gBankTarget, i, 0); + sub_8094B6C(gBankTarget ^ 2, i, 1); +#undef MON_CAN_BATTLE + } + } + else + { + sub_80264C0(); + } +} + +static void atk90_conversion_type_change(void) +{ + //randomly changes user's type to one of its moves' type + u8 valid_moves = 0; + u8 checked_move; + u8 move_type; + while (valid_moves < 4) + { + if (gBattleMons[gBankAttacker].moves[valid_moves] == 0) + break; + valid_moves++; + } + + for (checked_move = 0; checked_move < valid_moves; checked_move++) + { + move_type = gBattleMoves[gBattleMons[gBankAttacker].moves[checked_move]].type; + if (move_type == TYPE_MYSTERY) + { + if (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST) + move_type = TYPE_GHOST; + else + move_type = TYPE_NORMAL; + } + if (move_type != gBattleMons[gBankAttacker].type1 && move_type != gBattleMons[gBankAttacker].type2) + break; + } + + if (checked_move == valid_moves) + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } + else + { + do + { + + while ((checked_move = Random() & 3) >= valid_moves); + + move_type = gBattleMoves[gBattleMons[gBankAttacker].moves[checked_move]].type; + if (move_type == TYPE_MYSTERY) + { + if (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST) + move_type = TYPE_GHOST; + else + move_type = TYPE_NORMAL; + } + } while (move_type == gBattleMons[gBankAttacker].type1 || move_type == gBattleMons[gBankAttacker].type2); + + gBattleMons[gBankAttacker].type1 = move_type; + gBattleMons[gBankAttacker].type2 = move_type; + + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 3; + gBattleTextBuff1[2] = move_type; + gBattleTextBuff1[3] = 0xFF; + + gBattlescriptCurrInstr += 5; + } +} + +static void atk91_givepaydaymoney(void) +{ + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gPaydayMoney) + { + sub_80B79B8(&gSaveBlock1.money, gPaydayMoney * BATTLE_STRUCT->moneyMultiplier); + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 1; + gBattleTextBuff1[2] = 2; + gBattleTextBuff1[3] = 5; + gBattleTextBuff1[4] = gPaydayMoney; + gBattleTextBuff1[5] = uBYTE1_16(gPaydayMoney); + gBattleTextBuff1[6] = 0xFF; + b_movescr_stack_push(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = gUnknown_081D95DB; + } + else + gBattlescriptCurrInstr++; +} + +static void atk92_setlightscreen(void) +{ + if (gSideAffecting[GetBankIdentity(gBankAttacker) & 1] & SIDE_STATUS_LIGHTSCREEN) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else + { + gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_LIGHTSCREEN; + gSideTimer[GetBankIdentity(gBankAttacker) & 1].lightscreenTimer = 5; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2) + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + } + gBattlescriptCurrInstr++; +} + +#ifdef NOTMATCHING +static void atk93_ko_move(void) +{ + if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) + hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; + else + { + hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); + quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); + } + + gStringBank = gBankTarget; + + if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) + { + RecordItemBattle(gBankTarget, hold_effect); + gSpecialStatuses[gBankTarget].focusBanded = 1; + } + + if (gBattleMons[gBankTarget].ability == ABILITY_STURDY) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + gLastUsedAbility = ABILITY_STURDY; + gBattlescriptCurrInstr = x; + RecordAbilityBattle(gBankTarget, ABILITY_STURDY); + return; + } + + if (!(gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS)) + { + u16 to_cmp = gBattleMons[gBankAttacker].level - gBattleMons[gBankTarget].level + gBattleMoves[gCurrentMove].accuracy; + if (Random() % 0x64 + 1 < to_cmp || gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) + { + goto MOVESTATUS_MISSED_LABEL; + } + } + else + { + if (gDisableStructs[gBankTarget].bankWithSureHit != gBankAttacker || gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) + { + + } + } + +MOVESTATUS_MISSED_LABEL: + gBattleTypeFlags |= MOVESTATUS_MISSED; + if (gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +#else +__attribute((naked)) +static void atk93_ko_move(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + ldr r7, _08026BA8 @ =gBattleMons\n\ + ldr r6, _08026BAC @ =gBankTarget\n\ + ldrb r2, [r6]\n\ + movs r5, 0x58\n\ + adds r0, r2, 0\n\ + muls r0, r5\n\ + adds r1, r0, r7\n\ + ldrh r0, [r1, 0x2E]\n\ + cmp r0, 0xAF\n\ + bne _08026BB4\n\ + ldr r1, _08026BB0 @ =gEnigmaBerries\n\ + lsls r0, r2, 3\n\ + subs r0, r2\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r4, [r0, 0x7]\n\ + ldrb r6, [r0, 0x1A]\n\ + b _08026BCE\n\ + .align 2, 0\n\ +_08026BA8: .4byte gBattleMons\n\ +_08026BAC: .4byte gBankTarget\n\ +_08026BB0: .4byte gEnigmaBerries\n\ +_08026BB4:\n\ + ldrh r0, [r1, 0x2E]\n\ + bl ItemId_GetHoldEffect\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + ldrb r0, [r6]\n\ + muls r0, r5\n\ + adds r0, r7\n\ + ldrh r0, [r0, 0x2E]\n\ + bl ItemId_GetHoldEffectParam\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ +_08026BCE:\n\ + ldr r1, _08026C4C @ =gStringBank\n\ + ldr r5, _08026C50 @ =gBankTarget\n\ + ldrb r0, [r5]\n\ + strb r0, [r1]\n\ + cmp r4, 0x27\n\ + bne _08026C0C\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x64\n\ + bl __umodsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, r6\n\ + bcs _08026C0C\n\ + ldrb r0, [r5]\n\ + movs r1, 0x27\n\ + bl RecordItemBattle\n\ + ldr r2, _08026C54 @ =gSpecialStatuses\n\ + ldrb r1, [r5]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldrb r1, [r0]\n\ + movs r2, 0x80\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ +_08026C0C:\n\ + ldr r0, _08026C58 @ =gBattleMons\n\ + mov r8, r0\n\ + ldr r1, _08026C50 @ =gBankTarget\n\ + ldrb r2, [r1]\n\ + movs r6, 0x58\n\ + adds r0, r2, 0\n\ + muls r0, r6\n\ + mov r3, r8\n\ + adds r5, r0, r3\n\ + adds r0, r5, 0\n\ + adds r0, 0x20\n\ + ldrb r3, [r0]\n\ + mov r10, r8\n\ + cmp r3, 0x5\n\ + bne _08026C6C\n\ + ldr r2, _08026C5C @ =gBattleMoveFlags\n\ + ldrb r0, [r2]\n\ + movs r1, 0x1\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r0, _08026C60 @ =gLastUsedAbility\n\ + strb r3, [r0]\n\ + ldr r1, _08026C64 @ =gBattlescriptCurrInstr\n\ + ldr r0, _08026C68 @ =gUnknown_081D9826\n\ + str r0, [r1]\n\ + ldr r1, _08026C50 @ =gBankTarget\n\ + ldrb r0, [r1]\n\ + movs r1, 0x5\n\ + bl RecordAbilityBattle\n\ + b _08026E40\n\ + .align 2, 0\n\ +_08026C4C: .4byte gStringBank\n\ +_08026C50: .4byte gBankTarget\n\ +_08026C54: .4byte gSpecialStatuses\n\ +_08026C58: .4byte gBattleMons\n\ +_08026C5C: .4byte gBattleMoveFlags\n\ +_08026C60: .4byte gLastUsedAbility\n\ +_08026C64: .4byte gBattlescriptCurrInstr\n\ +_08026C68: .4byte gUnknown_081D9826\n\ +_08026C6C:\n\ + ldr r1, _08026CE0 @ =gStatuses3\n\ + lsls r0, r2, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + movs r1, 0x18\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08026CF4\n\ + ldr r1, _08026CE4 @ =gBattleMoves\n\ + ldr r0, _08026CE8 @ =gCurrentMove\n\ + ldrh r0, [r0]\n\ + lsls r2, r0, 1\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r1\n\ + ldr r7, _08026CEC @ =gBankAttacker\n\ + ldrb r0, [r7]\n\ + muls r0, r6\n\ + add r0, r10\n\ + adds r0, 0x2A\n\ + ldrb r0, [r0]\n\ + adds r1, r5, 0\n\ + adds r1, 0x2A\n\ + ldrb r1, [r1]\n\ + subs r0, r1\n\ + ldrb r2, [r2, 0x3]\n\ + adds r0, r2\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x64\n\ + bl __umodsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + adds r0, 0x1\n\ + cmp r0, r4\n\ + bge _08026CDC\n\ + ldrb r0, [r7]\n\ + adds r1, r0, 0\n\ + muls r1, r6\n\ + add r1, r10\n\ + adds r1, 0x2A\n\ + ldr r2, _08026CF0 @ =gBankTarget\n\ + ldrb r0, [r2]\n\ + muls r0, r6\n\ + add r0, r10\n\ + adds r0, 0x2A\n\ + ldrb r1, [r1]\n\ + movs r4, 0x1\n\ + ldrb r0, [r0]\n\ + cmp r1, r0\n\ + bcs _08026D20\n\ +_08026CDC:\n\ + mov r10, r8\n\ + b _08026DE0\n\ + .align 2, 0\n\ +_08026CE0: .4byte gStatuses3\n\ +_08026CE4: .4byte gBattleMoves\n\ +_08026CE8: .4byte gCurrentMove\n\ +_08026CEC: .4byte gBankAttacker\n\ +_08026CF0: .4byte gBankTarget\n\ +_08026CF4:\n\ + ldr r0, _08026D4C @ =gDisableStructs\n\ + lsls r1, r2, 3\n\ + subs r1, r2\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldr r2, _08026D50 @ =gBankAttacker\n\ + ldrb r0, [r1, 0x15]\n\ + movs r4, 0\n\ + ldrb r3, [r2]\n\ + cmp r0, r3\n\ + bne _08026D20\n\ + ldrb r0, [r2]\n\ + muls r0, r6\n\ + add r0, r10\n\ + adds r0, 0x2A\n\ + adds r1, r5, 0\n\ + adds r1, 0x2A\n\ + ldrb r0, [r0]\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcc _08026D20\n\ + movs r4, 0x1\n\ +_08026D20:\n\ + cmp r4, 0\n\ + beq _08026DE0\n\ + ldr r0, _08026D54 @ =gProtectStructs\n\ + ldr r1, _08026D58 @ =gBankTarget\n\ + ldrb r2, [r1]\n\ + lsls r1, r2, 4\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + lsls r0, 30\n\ + cmp r0, 0\n\ + bge _08026D64\n\ + ldr r1, _08026D5C @ =gBattleMoveDamage\n\ + movs r0, 0x58\n\ + muls r0, r2\n\ + add r0, r10\n\ + ldrh r0, [r0, 0x28]\n\ + subs r0, 0x1\n\ + str r0, [r1]\n\ + ldr r2, _08026D60 @ =gBattleMoveFlags\n\ + ldrb r0, [r2]\n\ + movs r1, 0x40\n\ + b _08026DC6\n\ + .align 2, 0\n\ +_08026D4C: .4byte gDisableStructs\n\ +_08026D50: .4byte gBankAttacker\n\ +_08026D54: .4byte gProtectStructs\n\ +_08026D58: .4byte gBankTarget\n\ +_08026D5C: .4byte gBattleMoveDamage\n\ +_08026D60: .4byte gBattleMoveFlags\n\ +_08026D64:\n\ + ldr r0, _08026DA0 @ =gSpecialStatuses\n\ + lsls r1, r2, 2\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + lsrs r0, 7\n\ + cmp r0, 0\n\ + beq _08026DB4\n\ + ldr r1, _08026DA4 @ =gBattleMoveDamage\n\ + movs r3, 0x58\n\ + adds r0, r2, 0\n\ + muls r0, r3\n\ + add r0, r10\n\ + ldrh r0, [r0, 0x28]\n\ + subs r0, 0x1\n\ + str r0, [r1]\n\ + ldr r2, _08026DA8 @ =gBattleMoveFlags\n\ + ldrb r0, [r2]\n\ + movs r1, 0x80\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r1, _08026DAC @ =gLastUsedItem\n\ + ldr r2, _08026DB0 @ =gBankTarget\n\ + ldrb r0, [r2]\n\ + muls r0, r3\n\ + add r0, r10\n\ + ldrh r0, [r0, 0x2E]\n\ + strh r0, [r1]\n\ + b _08026DCA\n\ + .align 2, 0\n\ +_08026DA0: .4byte gSpecialStatuses\n\ +_08026DA4: .4byte gBattleMoveDamage\n\ +_08026DA8: .4byte gBattleMoveFlags\n\ +_08026DAC: .4byte gLastUsedItem\n\ +_08026DB0: .4byte gBankTarget\n\ +_08026DB4:\n\ + ldr r1, _08026DD4 @ =gBattleMoveDamage\n\ + movs r0, 0x58\n\ + muls r0, r2\n\ + add r0, r10\n\ + ldrh r0, [r0, 0x28]\n\ + str r0, [r1]\n\ + ldr r2, _08026DD8 @ =gBattleMoveFlags\n\ + ldrb r0, [r2]\n\ + movs r1, 0x10\n\ +_08026DC6:\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ +_08026DCA:\n\ + ldr r1, _08026DDC @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x5\n\ + str r0, [r1]\n\ + b _08026E40\n\ + .align 2, 0\n\ +_08026DD4: .4byte gBattleMoveDamage\n\ +_08026DD8: .4byte gBattleMoveFlags\n\ +_08026DDC: .4byte gBattlescriptCurrInstr\n\ +_08026DE0:\n\ + ldr r2, _08026E10 @ =gBattleMoveFlags\n\ + ldrb r0, [r2]\n\ + movs r1, 0x1\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r0, _08026E14 @ =gBankAttacker\n\ + ldrb r0, [r0]\n\ + movs r2, 0x58\n\ + adds r1, r0, 0\n\ + muls r1, r2\n\ + add r1, r10\n\ + adds r1, 0x2A\n\ + ldr r3, _08026E18 @ =gBankTarget\n\ + ldrb r0, [r3]\n\ + muls r0, r2\n\ + add r0, r10\n\ + adds r0, 0x2A\n\ + ldrb r1, [r1]\n\ + ldrb r0, [r0]\n\ + cmp r1, r0\n\ + bcc _08026E20\n\ + ldr r1, _08026E1C @ =gBattleCommunication\n\ + movs r0, 0\n\ + b _08026E24\n\ + .align 2, 0\n\ +_08026E10: .4byte gBattleMoveFlags\n\ +_08026E14: .4byte gBankAttacker\n\ +_08026E18: .4byte gBankTarget\n\ +_08026E1C: .4byte gBattleCommunication\n\ +_08026E20:\n\ + ldr r1, _08026E50 @ =gBattleCommunication\n\ + movs r0, 0x1\n\ +_08026E24:\n\ + strb r0, [r1, 0x5]\n\ + ldr r3, _08026E54 @ =gBattlescriptCurrInstr\n\ + ldr r2, [r3]\n\ + ldrb r1, [r2, 0x1]\n\ + ldrb r0, [r2, 0x2]\n\ + lsls r0, 8\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x3]\n\ + lsls r0, 16\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x4]\n\ + lsls r0, 24\n\ + orrs r1, r0\n\ + str r1, [r3]\n\ +_08026E40:\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08026E50: .4byte gBattleCommunication\n\ +_08026E54: .4byte gBattlescriptCurrInstr\n\ + .syntax divided"); +} +#endif // NOTMATCHING + +static void atk94_gethalfcurrentenemyhp(void) //super fang +{ + gBattleMoveDamage = gBattleMons[gBankTarget].hp / 2; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattlescriptCurrInstr++; +} + +static void atk95_setsandstorm(void) +{ + if (gBattleWeather & WEATHER_SANDSTORM_ANY) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + } + else + { + gBattleWeather = WEATHER_SANDSTORM_TEMPORARY; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gWishFutureKnock.weatherDuration = 5; + } + gBattlescriptCurrInstr++; +} + +static void atk96_weatherdamage(void) +{ + if (WEATHER_HAS_EFFECT) + { + if (gBattleWeather & WEATHER_SANDSTORM_ANY) + { + if (gBattleMons[gBankAttacker].type1 != TYPE_ROCK && gBattleMons[gBankAttacker].type1 != TYPE_STEEL && gBattleMons[gBankAttacker].type1 != TYPE_GROUND + && gBattleMons[gBankAttacker].type2 != TYPE_ROCK && gBattleMons[gBankAttacker].type2 != TYPE_STEEL && gBattleMons[gBankAttacker].type2 != TYPE_GROUND + && gBattleMons[gBankAttacker].ability != ABILITY_SAND_VEIL && !(gStatuses3[gBankAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBankAttacker] & STATUS3_UNDERWATER)) + { + gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + } + else + { + gBattleMoveDamage = 0; + } + } + if (gBattleWeather & WEATHER_HAIL) + { + if (gBattleMons[gBankAttacker].type1 != TYPE_ICE && gBattleMons[gBankAttacker].type2 != TYPE_ICE && !(gStatuses3[gBankAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBankAttacker] & STATUS3_UNDERWATER)) + { + gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + } + else + { + gBattleMoveDamage = 0; + } + } + } + else + gBattleMoveDamage = 0; + + if (gAbsentBankFlags & gBitTable[gBankAttacker]) + gBattleMoveDamage = 0; + + gBattlescriptCurrInstr++; +} + +static void atk97_try_infatuation(void) +{ + struct Pokemon *attacker, *target; + u16 atk_species, def_species; + u32 atk_pid, def_pid; + if (!GetBankSide(gBankAttacker)) + attacker = &gPlayerParty[gBattlePartyID[gBankAttacker]]; + else + attacker = &gEnemyParty[gBattlePartyID[gBankAttacker]]; + + if (!GetBankSide(gBankTarget)) + target = &gPlayerParty[gBattlePartyID[gBankTarget]]; + else + target = &gEnemyParty[gBattlePartyID[gBankTarget]]; + + atk_species = GetMonData(attacker, MON_DATA_SPECIES); + atk_pid = GetMonData(attacker, MON_DATA_PERSONALITY); + + def_species = GetMonData(target, MON_DATA_SPECIES); + def_pid = GetMonData(target, MON_DATA_PERSONALITY); + + if (gBattleMons[gBankTarget].ability == ABILITY_OBLIVIOUS) + { + gBattlescriptCurrInstr = BattleScript_ObliviousPreventsAttraction; + gLastUsedAbility = ABILITY_OBLIVIOUS; + RecordAbilityBattle(gBankTarget, ABILITY_OBLIVIOUS); + } + else + { + if (GetGenderFromSpeciesAndPersonality(atk_species, atk_pid) == GetGenderFromSpeciesAndPersonality(def_species, def_pid) + || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE || gBattleMons[gBankTarget].status2 & STATUS2_INFATUATION || GetGenderFromSpeciesAndPersonality(atk_species, atk_pid) == 0xFF + || GetGenderFromSpeciesAndPersonality(def_species, def_pid) == 0xFF) + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } + else + { + gBattleMons[gBankTarget].status2 |= (gBitTable[gBankAttacker] << 16); + gBattlescriptCurrInstr += 5; + } + } +} + +static void atk98_status_icon_update(void) +{ + if (gBattleExecBuffer) + return; + + if (BSScriptRead8(gBattlescriptCurrInstr + 1) != 4) + { + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 2; + } + else + { + gActiveBank = gBankAttacker; + if (!(gAbsentBankFlags & gBitTable[gActiveBank])) + { + EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2); + MarkBufferBankForExecution(gActiveBank); + } + if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + if (!(gAbsentBankFlags & gBitTable[gActiveBank])) + { + EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2); + MarkBufferBankForExecution(gActiveBank); + } + } + gBattlescriptCurrInstr += 2; + } +} + +static void atk99_setmist(void) +{ + if (gSideTimer[GetBankIdentity(gBankAttacker) & 1].mistTimer) + { + gBattleMoveFlags |= MOVESTATUS_FAILED; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else + { + gSideTimer[GetBankIdentity(gBankAttacker) & 1].mistTimer = 5; + gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_MIST; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + gBattlescriptCurrInstr++; +} + +static void atk9A_set_focusenergy(void) +{ + if (gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) + { + gBattleMoveFlags |= MOVESTATUS_FAILED; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else + { + gBattleMons[gBankAttacker].status2 |= STATUS2_FOCUS_ENERGY; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + gBattlescriptCurrInstr++; +} + +static void atk9B_transformdataexecution(void) +{ + gUnknown_02024BE8 = 0xFFFF; + gBattlescriptCurrInstr++; + if (gBattleMons[gBankTarget].status2 & STATUS2_TRANSFORMED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE) + { + gBattleMoveFlags |= MOVESTATUS_FAILED; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else + { + u32 i; s32 j; + u8 *atk_data, *def_data; + gBattleMons[gBankAttacker].status2 |= STATUS2_TRANSFORMED; + gDisableStructs[gBankAttacker].disabledMove = 0; + gDisableStructs[gBankAttacker].disableTimer1 = 0; + gDisableStructs[gBankAttacker].unk0 = gBattleMons[gBankTarget].personality; + gDisableStructs[gBankAttacker].unk18_b = 0; + + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 6; + gBattleTextBuff1[2] = (gBattleMons[gBankTarget].species); + gBattleTextBuff1[3] = uBYTE1_16(gBattleMons[gBankTarget].species); + gBattleTextBuff1[4] = 0xFF; + + atk_data = (u8*)(&gBattleMons[gBankAttacker]); + def_data = (u8*)(&gBattleMons[gBankTarget]); + + for (i = 0; i < 0x24; i++) + atk_data[i] = def_data[i]; + + for (j = 0; j < 4; j++) + { + if (gBattleMoves[gBattleMons[gBankAttacker].moves[j]].pp < 5) + gBattleMons[gBankAttacker].pp[j] = gBattleMoves[gBattleMons[gBankAttacker].moves[j]].pp; + else + gBattleMons[gBankAttacker].pp[j] = 5; + } + + gActiveBank = gBankAttacker; + EmitResetActionMoveSelection(0, 2); + MarkBufferBankForExecution(gActiveBank); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } +} + +static void atk9C_set_substitute(void) +{ + u32 hp = gBattleMons[gBankAttacker].maxHP / 4; + if (gBattleMons[gBankAttacker].maxHP / 4 == 0) + hp = 1; + if (gBattleMons[gBankAttacker].hp <= hp) + { + gBattleMoveDamage = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else + { + gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMons[gBankAttacker].status2 |= STATUS2_SUBSTITUTE; + gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED); + gDisableStructs[gBankAttacker].substituteHP = gBattleMoveDamage; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE; + } + gBattlescriptCurrInstr++; +} + +static bool8 IsMoveUncopyable(u16 move) +{ + int i; + for (i = 0; sUnknown_081FACFE[i] != 0xFFFE && sUnknown_081FACFE[i] != move; i++) {} + return (sUnknown_081FACFE[i] != 0xFFFE); +} + +static void atk9D_copyattack(void) +{ + gUnknown_02024BE8 = 0xFFFF; + if (IsMoveUncopyable(gLastUsedMove[gBankTarget]) || gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED + || gLastUsedMove[gBankTarget] == 0 || gLastUsedMove[gBankTarget] == 0xFFFF) + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } + else + { + int i; + for (i = 0; i < 4; i++) + { + if (gBattleMons[gBankAttacker].moves[i] == gLastUsedMove[gBankTarget]) + break; + } + if (i == 4) + { + gBattleMons[gBankAttacker].moves[gCurrMovePos] = gLastUsedMove[gBankTarget]; + if (gBattleMoves[gLastUsedMove[gBankTarget]].pp < 5) + gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gLastUsedMove[gBankTarget]].pp; + else + gBattleMons[gBankAttacker].pp[gCurrMovePos] = 5; + + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = gLastUsedMove[gBankTarget]; + gBattleTextBuff1[3] = uBYTE1_16(gLastUsedMove[gBankTarget]); + gBattleTextBuff1[4] = 0xFF; + + gDisableStructs[gBankAttacker].unk18_b |= gBitTable[gCurrMovePos]; + gBattlescriptCurrInstr += 5; + } + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } +} + +#ifdef NONMATCHING +static void atk9E_metronome(void) +{ + // sUnknown_081FACFE + int i; + do + { + while ((gCurrentMove = (Random() & 0x1FF) + 1) > 0x162); + for (i = 0; sUnknown_081FACFE[i] != gCurrentMove && sUnknown_081FACFE[i] != 0xFFFF; i++); + } while (sUnknown_081FACFE[i] != 0xFFFF); + + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]; + gBankTarget = sub_801B5C0(gCurrentMove, 0); +} + +#else +__attribute__((naked)) +static void atk9E_metronome(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + ldr r7, _08027938 @ =gCurrentMove\n\ + movs r6, 0xB1\n\ + lsls r6, 1\n\ + ldr r5, _0802793C @ =sUnknown_081FACFE\n\ + ldr r0, _08027940 @ =gBattlescriptCurrInstr\n\ + mov r8, r0\n\ +_080278CA:\n\ + bl Random\n\ + ldr r2, _08027944 @ =0x000001ff\n\ + adds r1, r2, 0\n\ + ands r0, r1\n\ + adds r0, 0x1\n\ + strh r0, [r7]\n\ + cmp r0, r6\n\ + bhi _080278CA\n\ + movs r0, 0x3\n\ +_080278DE:\n\ + subs r0, 0x1\n\ + cmp r0, 0\n\ + bge _080278DE\n\ + ldr r4, _08027938 @ =gCurrentMove\n\ + ldrh r2, [r4]\n\ + ldr r3, _08027948 @ =0x0000ffff\n\ + subs r0, r5, 0x2\n\ +_080278EC:\n\ + adds r0, 0x2\n\ + ldrh r1, [r0]\n\ + cmp r1, r2\n\ + beq _080278F8\n\ + cmp r1, r3\n\ + bne _080278EC\n\ +_080278F8:\n\ + ldr r0, _08027948 @ =0x0000ffff\n\ + cmp r1, r0\n\ + bne _080278CA\n\ + ldr r2, _0802794C @ =gHitMarker\n\ + ldr r0, [r2]\n\ + ldr r1, _08027950 @ =0xfffffbff\n\ + ands r0, r1\n\ + str r0, [r2]\n\ + ldr r3, _08027954 @ =gBattleScriptsEffectsTable\n\ + ldr r2, _08027958 @ =gBattleMoves\n\ + ldrh r1, [r4]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + ldr r0, [r0]\n\ + mov r1, r8\n\ + str r0, [r1]\n\ + ldrh r0, [r4]\n\ + movs r1, 0\n\ + bl sub_801B5C0\n\ + ldr r1, _0802795C @ =gBankTarget\n\ + strb r0, [r1]\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08027938: .4byte gCurrentMove\n\ +_0802793C: .4byte sUnknown_081FACFE\n\ +_08027940: .4byte gBattlescriptCurrInstr\n\ +_08027944: .4byte 0x000001ff\n\ +_08027948: .4byte 0x0000ffff\n\ +_0802794C: .4byte gHitMarker\n\ +_08027950: .4byte 0xfffffbff\n\ +_08027954: .4byte gBattleScriptsEffectsTable\n\ +_08027958: .4byte gBattleMoves\n\ +_0802795C: .4byte gBankTarget\n\ + .syntax divided"); +} +#endif // NONMATCHING + +static void atk9F_dmgtolevel(void) +{ + gBattleMoveDamage = gBattleMons[gBankAttacker].level; + gBattlescriptCurrInstr++; +} + +static void atkA0_psywavedamageeffect(void) +{ + s32 rand_dmg; + while ((rand_dmg = (Random() & 0xF)) > 0xA); + rand_dmg *= 10; + gBattleMoveDamage = gBattleMons[gBankAttacker].level * (rand_dmg + 50) / 100; + gBattlescriptCurrInstr++; +} + +static void atkA1_counterdamagecalculator(void) +{ + u8 atk_side = GetBankSide(gBankAttacker); + u8 def_side = GetBankSide(gProtectStructs[gBankAttacker].physicalBank); + if (gProtectStructs[gBankAttacker].physicalDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].physicalBank].hp) + { + gBattleMoveDamage = gProtectStructs[gBankAttacker].physicalDmg * 2; + if (gSideTimer[def_side].followmeTimer && gBattleMons[gSideTimer[def_side].followmeTarget].hp) + gBankTarget = gSideTimer[def_side].followmeTarget; + else + gBankTarget = gProtectStructs[gBankAttacker].physicalBank; + gBattlescriptCurrInstr += 5; + } + else + { + gSpecialStatuses[gBankAttacker].flag20 = 1; + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } +} + +static void atkA2_mirrorcoatdamagecalculator(void) //a copy of atkA1 with the physical -> special field changes +{ + u8 atk_side = GetBankSide(gBankAttacker); + u8 def_side = GetBankSide(gProtectStructs[gBankAttacker].specialBank); + if (gProtectStructs[gBankAttacker].specialDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].specialBank].hp) + { + gBattleMoveDamage = gProtectStructs[gBankAttacker].specialDmg * 2; + if (gSideTimer[def_side].followmeTimer && gBattleMons[gSideTimer[def_side].followmeTarget].hp) + gBankTarget = gSideTimer[def_side].followmeTarget; + else + gBankTarget = gProtectStructs[gBankAttacker].specialBank; + gBattlescriptCurrInstr += 5; + } + else + { + gSpecialStatuses[gBankAttacker].flag20 = 1; + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } +} + +static void atkA3_disablelastusedattack(void) +{ + int i; + for (i = 0; i < 4; i++) + { + if (gBattleMons[gBankTarget].moves[i] == gLastUsedMove[gBankTarget]) + break; + } + if (gDisableStructs[gBankTarget].disabledMove == 0 && i != 4 && gBattleMons[gBankTarget].pp[i] != 0) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = gBattleMons[gBankTarget].moves[i]; + gBattleTextBuff1[3] = uBYTE1_16(gBattleMons[gBankTarget].moves[i]); + gBattleTextBuff1[4] = 0xFF; + + gDisableStructs[gBankTarget].disabledMove = gBattleMons[gBankTarget].moves[i]; + gDisableStructs[gBankTarget].disableTimer1 = (Random() & 3) + 2; + gDisableStructs[gBankTarget].disableTimer2 = gDisableStructs[gBankTarget].disableTimer1; //that's interesting + gBattlescriptCurrInstr += 5; + } + else + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } +} + +static void atkA4_setencore(void) +{ + int i; + for (i = 0; i < 4; i++) + { + if (gBattleMons[gBankTarget].moves[i] == gLastUsedMove[gBankTarget]) + break; + } + if (gLastUsedMove[gBankTarget] == MOVE_STRUGGLE || gLastUsedMove[gBankTarget] == MOVE_ENCORE || gLastUsedMove[gBankTarget] == MOVE_MIRROR_MOVE) + i = 4; + if (gDisableStructs[gBankTarget].encoredMove == 0 && i != 4 && gBattleMons[gBankTarget].pp[i] != 0) + { + gDisableStructs[gBankTarget].encoredMove = gBattleMons[gBankTarget].moves[i]; + gDisableStructs[gBankTarget].encoredMovePos = i; + gDisableStructs[gBankTarget].encoreTimer1 = (Random() & 3) + 3; + gDisableStructs[gBankTarget].encoreTimer2 = gDisableStructs[gBankTarget].encoreTimer1; + gBattlescriptCurrInstr += 5; + } + else + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } +} + +static void atkA5_painsplitdmgcalc(void) +{ + if (!(gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE)) + { + s32 hp_diff = (gBattleMons[gBankAttacker].hp + gBattleMons[gBankTarget].hp) / 2; + s32 to_store = gBattleMoveDamage = gBattleMons[gBankTarget].hp - hp_diff; + BATTLE_STRUCT->unk16014 = sBYTE0_32(to_store); + BATTLE_STRUCT->unk16015 = sBYTE1_32(to_store); + BATTLE_STRUCT->unk16016 = sBYTE2_32(to_store); + BATTLE_STRUCT->unk16017 = sBYTE3_32(to_store); + + gBattleMoveDamage = gBattleMons[gBankAttacker].hp - hp_diff; + gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF; + + gBattlescriptCurrInstr += 5; + } + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +#ifdef NONMATCHING +static void atkA6_settypetorandomresistance(void) +{ + if (gMoveHitWith[gBankAttacker] == 0 || gMoveHitWith[gBankAttacker] == 0xFFFF || (IsTwoTurnsMove(gMoveHitWith[gBankAttacker]) && !gProtectStructs[gBankAttacker].physicalDmg && !gProtectStructs[gBankAttacker].specialDmg)) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + { + int type = 0, rands = 0; + do + { + while (((type = (Random() & 0x7F)) > 0x70)); + type *= 3; + if (gTypeEffectiveness[type] == gUnknown_02024C44[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1]) + { + gBattleMons[gBankAttacker].type1 = type; + gBattleMons[gBankAttacker].type2 = type; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 3; + gBattleTextBuff1[2] = type; + gBattleTextBuff1[3] = 0xFF; + gBattlescriptCurrInstr += 5; + return; + } + rands++; + } while (rands <= 999); + + type = 0, rands = 0; + do + { + if (gTypeEffectiveness[type] == 0xFE || gTypeEffectiveness[type] != 0xFF) + { + if (gTypeEffectiveness[type] == gUnknown_02024C44[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1]) + { + gBattleMons[gBankAttacker].type1 = gTypeEffectiveness[rands + 1]; + gBattleMons[gBankAttacker].type2 = gTypeEffectiveness[rands + 1]; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 3; + gBattleTextBuff1[2] = gTypeEffectiveness[rands + 1]; + gBattleTextBuff1[3] = 0xFF; + gBattlescriptCurrInstr += 5; + return; + } + } + type += 3, rands += 3; + } while (rands < 336); + + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } +} + +#else +__attribute__((naked)) +static void atkA6_settypetorandomresistance(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + ldr r1, _08027FA8 @ =gMoveHitWith\n\ + ldr r4, _08027FAC @ =gBankAttacker\n\ + ldrb r0, [r4]\n\ + lsls r0, 1\n\ + adds r2, r0, r1\n\ + ldrh r1, [r2]\n\ + cmp r1, 0\n\ + beq _08027F8C\n\ + ldr r0, _08027FB0 @ =0x0000ffff\n\ + cmp r1, r0\n\ + beq _08027F8C\n\ + ldrh r0, [r2]\n\ + bl IsTwoTurnsMove\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08028024\n\ + ldr r2, _08027FB4 @ =gProtectStructs\n\ + ldrb r0, [r4]\n\ + lsls r1, r0, 4\n\ + adds r0, r2, 0x4\n\ + adds r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + bne _08028024\n\ + adds r0, r2, 0\n\ + adds r0, 0x8\n\ + adds r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, 0\n\ + bne _08028024\n\ +_08027F8C:\n\ + ldr r3, _08027FB8 @ =gBattlescriptCurrInstr\n\ + ldr r2, [r3]\n\ + ldrb r1, [r2, 0x1]\n\ + ldrb r0, [r2, 0x2]\n\ + lsls r0, 8\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x3]\n\ + lsls r0, 16\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x4]\n\ + lsls r0, 24\n\ + orrs r1, r0\n\ + str r1, [r3]\n\ + b _08028110\n\ + .align 2, 0\n\ +_08027FA8: .4byte gMoveHitWith\n\ +_08027FAC: .4byte gBankAttacker\n\ +_08027FB0: .4byte 0x0000ffff\n\ +_08027FB4: .4byte gProtectStructs\n\ +_08027FB8: .4byte gBattlescriptCurrInstr\n\ +_08027FBC:\n\ + mov r0, r12\n\ + strb r5, [r0]\n\ + mov r1, r10\n\ + ldrb r0, [r1]\n\ + muls r0, r2\n\ + adds r0, r7\n\ + adds r0, 0x22\n\ + strb r5, [r0]\n\ + ldr r1, _08027FE0 @ =gBattleTextBuff1\n\ + movs r0, 0xFD\n\ + strb r0, [r1]\n\ + movs r0, 0x3\n\ + strb r0, [r1, 0x1]\n\ + strb r5, [r1, 0x2]\n\ + movs r0, 0xFF\n\ + strb r0, [r1, 0x3]\n\ + ldr r1, _08027FE4 @ =gBattlescriptCurrInstr\n\ + b _08028012\n\ + .align 2, 0\n\ +_08027FE0: .4byte gBattleTextBuff1\n\ +_08027FE4: .4byte gBattlescriptCurrInstr\n\ +_08027FE8:\n\ + mov r0, r8\n\ + adds r0, 0x1\n\ + adds r0, r3\n\ + ldrb r2, [r0]\n\ + strb r2, [r4]\n\ + mov r4, r10\n\ + ldrb r0, [r4]\n\ + muls r0, r6\n\ + ldr r7, _0802801C @ =gBattleMons\n\ + adds r0, r7\n\ + adds r0, 0x22\n\ + strb r2, [r0]\n\ + ldr r1, _08028020 @ =gBattleTextBuff1\n\ + movs r0, 0xFD\n\ + strb r0, [r1]\n\ + movs r0, 0x3\n\ + strb r0, [r1, 0x1]\n\ + strb r2, [r1, 0x2]\n\ + movs r0, 0xFF\n\ + strb r0, [r1, 0x3]\n\ + mov r1, r12\n\ +_08028012:\n\ + ldr r0, [r1]\n\ + adds r0, 0x5\n\ + str r0, [r1]\n\ + b _08028110\n\ + .align 2, 0\n\ +_0802801C: .4byte gBattleMons\n\ +_08028020: .4byte gBattleTextBuff1\n\ +_08028024:\n\ + movs r4, 0\n\ + mov r8, r4\n\ + movs r7, 0x7F\n\ + mov r9, r7\n\ +_0802802C:\n\ + bl Random\n\ + mov r4, r9\n\ + ands r4, r0\n\ + cmp r4, 0x70\n\ + bhi _0802802C\n\ + lsls r0, r4, 1\n\ + adds r4, r0, r4\n\ + ldr r6, _08028120 @ =gTypeEffectiveness\n\ + adds r3, r4, r6\n\ + ldr r1, _08028124 @ =gUnknown_02024C44\n\ + ldr r2, _08028128 @ =gBankAttacker\n\ + ldrb r5, [r2]\n\ + lsls r0, r5, 1\n\ + adds r0, r1\n\ + ldrb r1, [r3]\n\ + mov r10, r2\n\ + ldrh r0, [r0]\n\ + cmp r1, r0\n\ + bne _08028088\n\ + adds r0, r4, 0x2\n\ + adds r0, r6\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x5\n\ + bhi _08028088\n\ + ldr r7, _0802812C @ =gBattleMons\n\ + movs r2, 0x58\n\ + adds r0, r5, 0\n\ + muls r0, r2\n\ + adds r3, r0, r7\n\ + movs r0, 0x21\n\ + adds r0, r3\n\ + mov r12, r0\n\ + adds r0, r4, 0x1\n\ + adds r0, r6\n\ + ldrb r5, [r0]\n\ + mov r1, r12\n\ + ldrb r0, [r1]\n\ + adds r1, r5, 0\n\ + cmp r0, r1\n\ + beq _08028088\n\ + adds r0, r3, 0\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r0, r1\n\ + bne _08027FBC\n\ +_08028088:\n\ + movs r7, 0x1\n\ + add r8, r7\n\ + ldr r0, _08028130 @ =0x000003e7\n\ + cmp r8, r0\n\ + ble _0802802C\n\ + movs r0, 0\n\ + mov r8, r0\n\ + ldr r1, _08028134 @ =gBattlescriptCurrInstr\n\ + mov r12, r1\n\ + ldr r3, _08028120 @ =gTypeEffectiveness\n\ + adds r0, r4, 0x1\n\ + adds r0, r3\n\ + mov r9, r0\n\ + adds r5, r3, 0\n\ +_080280A4:\n\ + ldrb r1, [r5]\n\ + cmp r1, 0xFF\n\ + bgt _080280AE\n\ + cmp r1, 0xFE\n\ + bge _080280E8\n\ +_080280AE:\n\ + mov r4, r10\n\ + ldrb r2, [r4]\n\ + lsls r0, r2, 1\n\ + ldr r7, _08028124 @ =gUnknown_02024C44\n\ + adds r0, r7\n\ + ldrh r0, [r0]\n\ + cmp r1, r0\n\ + bne _080280E8\n\ + ldrb r0, [r5, 0x2]\n\ + cmp r0, 0x5\n\ + bhi _080280E8\n\ + movs r6, 0x58\n\ + adds r0, r2, 0\n\ + muls r0, r6\n\ + ldr r1, _0802812C @ =gBattleMons\n\ + adds r2, r0, r1\n\ + adds r4, r2, 0\n\ + adds r4, 0x21\n\ + ldrb r0, [r4]\n\ + mov r7, r9\n\ + ldrb r1, [r7]\n\ + cmp r0, r1\n\ + beq _080280E8\n\ + adds r0, r2, 0\n\ + adds r0, 0x22\n\ + ldrb r0, [r0]\n\ + cmp r0, r1\n\ + beq _080280E8\n\ + b _08027FE8\n\ +_080280E8:\n\ + adds r5, 0x3\n\ + movs r0, 0x3\n\ + add r8, r0\n\ + ldr r0, _08028138 @ =0x0000014f\n\ + cmp r8, r0\n\ + bls _080280A4\n\ + mov r1, r12\n\ + ldr r2, [r1]\n\ + ldrb r1, [r2, 0x1]\n\ + ldrb r0, [r2, 0x2]\n\ + lsls r0, 8\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x3]\n\ + lsls r0, 16\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x4]\n\ + lsls r0, 24\n\ + orrs r1, r0\n\ + mov r4, r12\n\ + str r1, [r4]\n\ +_08028110:\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08028120: .4byte gTypeEffectiveness\n\ +_08028124: .4byte gUnknown_02024C44\n\ +_08028128: .4byte gBankAttacker\n\ +_0802812C: .4byte gBattleMons\n\ +_08028130: .4byte 0x000003e7\n\ +_08028134: .4byte gBattlescriptCurrInstr\n\ +_08028138: .4byte 0x0000014f\n\ + .syntax divided"); +} +#endif // NONMATCHING + +static void atkA7_setalwayshitflag(void) +{ + gStatuses3[gBankTarget] &= ~(STATUS3_ALWAYS_HITS); + gStatuses3[gBankTarget] |= 0x10; + gDisableStructs[gBankTarget].bankWithSureHit = gBankAttacker; + gBattlescriptCurrInstr++; +} + +struct move_pp +{ + u16 move[4]; + u8 pp[4]; + u8 ppBonuses; +}; + +static void atkA8_copymovepermanently(void) +{ + gUnknown_02024BE8 = 0xFFFF; + if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED) && gUnknown_02024C2C[gBankTarget] != MOVE_STRUGGLE && gUnknown_02024C2C[gBankTarget] != 0 && gUnknown_02024C2C[gBankTarget] != 0xFFFF && gUnknown_02024C2C[gBankTarget] != MOVE_SKETCH) + { + int i; + for (i = 0; i < 4; i++) + { + if (gBattleMons[gBankAttacker].moves[i] == MOVE_SKETCH) + continue; + if (gBattleMons[gBankAttacker].moves[i] == gUnknown_02024C2C[gBankTarget]) + break; + } + if (i != 4) //sketch fail + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else //sketch worked + { + struct move_pp moves_data; + gBattleMons[gBankAttacker].moves[gCurrMovePos] = gUnknown_02024C2C[gBankTarget]; + gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gUnknown_02024C2C[gBankTarget]].pp; + gActiveBank = gBankAttacker; + for (i = 0; i < 4; i++) + { + moves_data.move[i] = gBattleMons[gBankAttacker].moves[i]; + moves_data.pp[i] = gBattleMons[gBankAttacker].pp[i]; + } + moves_data.ppBonuses = gBattleMons[gBankAttacker].ppBonuses; + EmitSetAttributes(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct move_pp), &moves_data); + MarkBufferBankForExecution(gActiveBank); + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = gUnknown_02024C2C[gBankTarget]; + gBattleTextBuff1[3] = gUnknown_02024C2C[gBankTarget] >> 8; + gBattleTextBuff1[4] = 0xFF; + gBattlescriptCurrInstr += 5; + } + } + else //sketch fail + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static bool8 IsTwoTurnsMove(u16 move) +{ + u8 effect = gBattleMoves[move].effect; + if (effect == EFFECT_SKULL_BASH || effect == EFFECT_RAZOR_WIND || effect == EFFECT_SKY_ATTACK || effect == EFFECT_SOLARBEAM || effect == EFFECT_FLY || effect == EFFECT_BIDE) + return 1; + else + return 0; +} + +static bool8 IsMoveUnchoosable(u16 move) +{ + if (move == 0 || move == MOVE_SLEEP_TALK || move == MOVE_ASSIST || move == MOVE_MIRROR_MOVE || move == MOVE_METRONOME) + return 1; + else + return 0; +} + +static u8 AttacksThisTurn(u8 bank, u16 move) //Note: returns 1 if it's a charging turn, otherwise 2 +{ + //first argument is unused + u8 effect; + if (gBattleMoves[move].effect == EFFECT_SOLARBEAM && (gBattleWeather & WEATHER_SUN_ANY)) + return 2; + effect = gBattleMoves[move].effect; + if (effect == EFFECT_SKULL_BASH || effect == EFFECT_RAZOR_WIND || effect == EFFECT_SKY_ATTACK || effect == EFFECT_SOLARBEAM || effect == EFFECT_FLY || effect == EFFECT_BIDE) + { + if ((gHitMarker & HITMARKER_x8000000)) + return 1; + } + return 2; +} + +static void atkA9_sleeptalk_choose_move(void) +{ + u8 unusable_moves = 0; + int i; + + for (i = 0; i < 4; i++) + { + if (IsMoveUnchoosable(gBattleMons[gBankAttacker].moves[i]) || gBattleMons[gBankAttacker].moves[i] == MOVE_FOCUS_PUNCH + || gBattleMons[gBankAttacker].moves[i] == MOVE_UPROAR || IsTwoTurnsMove(gBattleMons[gBankAttacker].moves[i])) + unusable_moves |= gBitTable[i]; + } + unusable_moves = sub_8015A98(gBankAttacker, unusable_moves, 0xFD); + if (unusable_moves == 0xF) //all 4 moves cannot be chosen + gBattlescriptCurrInstr += 5; + else //at least one move can be chosen + { + u32 random_pos; + do + { + random_pos = Random() & 3; + } while ((gBitTable[random_pos] & unusable_moves)); + + gRandomMove = gBattleMons[gBankAttacker].moves[random_pos]; + gCurrMovePos = random_pos; + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gBankTarget = sub_801B5C0(gRandomMove, 0); + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } +} + +static void atkAA_set_destinybond(void) +{ + gBattleMons[gBankAttacker].status2 |= STATUS2_DESTINY_BOND; + gBattlescriptCurrInstr++; +} + +static void DestinyBondFlagUpdate(void) +{ + u8 atk_side = GetBankSide(gBankAttacker); + u8 def_side = GetBankSide(gBankTarget); + if (gBattleMons[gBankTarget].status2 & STATUS2_DESTINY_BOND && atk_side != def_side && !(gHitMarker & HITMARKER_GRUDGE)) + gHitMarker |= HITMARKER_DESTINYBOND; +} + +static void atkAB_DestinyBondFlagUpdate(void) +{ + DestinyBondFlagUpdate(); + gBattlescriptCurrInstr++; +} + +static void atkAC_remaininghptopower(void) +{ + s32 hp_fraction = GetScaledHPFraction(gBattleMons[gBankAttacker].hp, gBattleMons[gBankAttacker].maxHP, 48); + int i; + for (i = 0; i < 12; i += 2) + { + if (hp_fraction <= sUnknown_081FAD26[i]) + break; + } + gDynamicBasePower = sUnknown_081FAD26[i + 1]; + gBattlescriptCurrInstr++; +} + +static void atkAD_spite_ppreduce(void) +{ + if (gLastUsedMove[gBankTarget] != 0 && gLastUsedMove[gBankTarget] != 0xFFFF && !(gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE)) + { + int i; + for (i = 0; i < 4; i++) + { + if (gLastUsedMove[gBankTarget] == gBattleMons[gBankTarget].moves[i]) + break; + } + if (i != 4 && gBattleMons[gBankTarget].pp[i] > 1) + { + s32 lost_pp = (Random() & 3) + 2; + if (gBattleMons[gBankTarget].pp[i] < lost_pp) + lost_pp = gBattleMons[gBankTarget].pp[i]; + + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = gLastUsedMove[gBankTarget]; + gBattleTextBuff1[3] = gLastUsedMove[gBankTarget] >> 8; + gBattleTextBuff1[4] = 0xFF; + ConvertIntToDecimalStringN(gBattleTextBuff2, lost_pp, 0, 1); + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 1; + gBattleTextBuff2[2] = 1; + gBattleTextBuff2[3] = 1; + gBattleTextBuff2[4] = lost_pp; + gBattleTextBuff2[5] = 0xFF; + + gBattleMons[gBankTarget].pp[i] -= lost_pp; + gActiveBank = gBankTarget; + if (!(gDisableStructs[gActiveBank].unk18_b & gBitTable[i]) + && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) + { + EmitSetAttributes(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]); + MarkBufferBankForExecution(gActiveBank); + } + gBattlescriptCurrInstr += 5; + if (gBattleMons[gBankTarget].pp[i] == 0) + CancelMultiTurnMoves(gBankTarget); + return; + } + } + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atkAE_heal_party_status(void) +{ + register u32 zero2 asm("r4") = 0; + u32 zero = zero2; + u8 to_heal = 0; + if (gCurrentMove == MOVE_HEAL_BELL) + { + struct Pokemon* party; + int i; + + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + if (GetBankSide(gBankAttacker) == 0) + party = gPlayerParty; + else + party = gEnemyParty; + + if (gBattleMons[gBankAttacker].ability != ABILITY_SOUNDPROOF) + { + gBattleMons[gBankAttacker].status1 = 0; + } + else + { + RecordAbilityBattle(gBankAttacker, gBattleMons[gBankAttacker].ability); + gBattleCommunication[MULTISTRING_CHOOSER] |= 1; + } + + gActiveBank = BATTLE_STRUCT->scriptingActive = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank])) + { + if (gBattleMons[gActiveBank].ability != ABILITY_SOUNDPROOF) + { + gBattleMons[gActiveBank].status1 = 0; + } + else + { + RecordAbilityBattle(gActiveBank, gBattleMons[gActiveBank].ability); + gBattleCommunication[MULTISTRING_CHOOSER] |= 2; + } + } + + for (i = 0; i < 6; i++) + { + u16 species = GetMonData(&party[i], MON_DATA_SPECIES2); + u8 abilityBit = GetMonData(&party[i], MON_DATA_ALT_ABILITY); + if (species != 0 && species != SPECIES_EGG) + { + u8 ability; + if (gBattlePartyID[gBankAttacker] == i) + ability = gBattleMons[gBankAttacker].ability; + else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlePartyID[gActiveBank] == i && !(gAbsentBankFlags & gBitTable[gActiveBank])) + ability = gBattleMons[gActiveBank].ability; + else + ability = GetAbilityBySpecies(species, abilityBit); + if (ability != ABILITY_SOUNDPROOF) + to_heal |= (1 << i); + } + } + } + else //Aromatherapy + { + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + to_heal = 0x3F; + gBattleMons[gBankAttacker].status1 = zero2; + + gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank])) + gBattleMons[gActiveBank].status1 = 0; + + } + //missing check? + gActiveBank = gBankAttacker; + EmitSetAttributes(0, REQUEST_STATUS_BATTLE, to_heal, 4, &zero); + MarkBufferBankForExecution(gActiveBank); + + gBattlescriptCurrInstr++; +} + +static void atkAF_cursetarget(void) +{ + if (gBattleMons[gBankTarget].status2 & STATUS2_CURSED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE) + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } + else + { + gBattleMons[gBankTarget].status2 |= STATUS2_CURSED; + gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattlescriptCurrInstr += 5; + } +} + +static void atkB0_set_spikes(void) +{ + u8 side = GetBankSide(gBankAttacker) ^ 1; + if (gSideTimer[side].spikesAmount == 3) + { + gSpecialStatuses[gBankAttacker].flag20 = 1; + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } + else + { + gSideAffecting[side] |= SIDE_STATUS_SPIKES; + gSideTimer[side].spikesAmount++; + gBattlescriptCurrInstr += 5; + } +} + +static void atkB1_set_foresight(void) +{ + gBattleMons[gBankTarget].status2 |= STATUS2_FORESIGHT; + gBattlescriptCurrInstr++; +} + +static void atkB2_setperishsong(void) +{ + int not_affected_pokes = 0, i; + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gStatuses3[i] & STATUS3_PERISH_SONG || gBattleMons[i].ability == ABILITY_SOUNDPROOF) + not_affected_pokes++; + else + { + gStatuses3[i] |= STATUS3_PERISH_SONG; + gDisableStructs[i].perishSong1 = 3; + gDisableStructs[i].perishSong2 = 3; + } + } + + sub_80153D0(gBankAttacker); + if (not_affected_pokes == gNoOfAllBanks) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; +} + +static void atkB3_rolloutdamagecalculation(void) +{ + if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) + { + CancelMultiTurnMoves(gBankAttacker); + gBattlescriptCurrInstr = BattleScript_1D6F74; + } + else + { + int i; + if (!(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) //first hit + { + gDisableStructs[gBankAttacker].rolloutTimer1 = 5; + gDisableStructs[gBankAttacker].rolloutTimer2 = 5; + gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS; + gLockedMove[gBankAttacker] = gCurrentMove; + } + if (--gDisableStructs[gBankAttacker].rolloutTimer1 == 0) + gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS); + + gDynamicBasePower = gBattleMoves[gCurrentMove].power; + for (i = 1; i < (5 - gDisableStructs[gBankAttacker].rolloutTimer1); i++) + gDynamicBasePower *= 2; + + if (gBattleMons[gBankAttacker].status2 & STATUS2_DEFENSE_CURL) + gDynamicBasePower *= 2; + + gBattlescriptCurrInstr++; + } +} + +static void atkB4_jumpifconfusedandstatmaxed(void) +{ + if (gBattleMons[gBankTarget].status2 & STATUS2_CONFUSION && gBattleMons[gBankTarget].statStages[BSScriptRead8(gBattlescriptCurrInstr + 1)] == 0xC) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + else + gBattlescriptCurrInstr += 6; +} + +static void atkB5_furycuttercalc(void) +{ + if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) + { + gDisableStructs[gBankAttacker].furyCutterCounter = 0; + gBattlescriptCurrInstr = BattleScript_1D6F74; + } + else + { + int i; + + if (gDisableStructs[gBankAttacker].furyCutterCounter != 5) + gDisableStructs[gBankAttacker].furyCutterCounter++; + + gDynamicBasePower = gBattleMoves[gCurrentMove].power; + for (i = 1; i < gDisableStructs[gBankAttacker].furyCutterCounter; i++) + gDynamicBasePower *= 2; + + gBattlescriptCurrInstr++; + } +} + +static void atkB6_happinesstodamagecalculation(void) +{ + if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN) + gDynamicBasePower = 10 * (gBattleMons[gBankAttacker].friendship) / 25; + else //EFFECT_FRUSTRATION + gDynamicBasePower = 10 * (255 - gBattleMons[gBankAttacker].friendship) / 25; + gBattlescriptCurrInstr++; +} + +static void atkB7_presentdamagecalculation(void) +{ + s32 rand = Random() & 0xFF; + if (rand < 102) + gDynamicBasePower = 40; + else if (rand < 178) + gDynamicBasePower = 80; + else if (rand < 204) + gDynamicBasePower = 120; + else + { + gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + } + if (rand < 204) + gBattlescriptCurrInstr = BattleScript_1D6F44; + else if (gBattleMons[gBankTarget].maxHP == gBattleMons[gBankTarget].hp) + gBattlescriptCurrInstr = BattleScript_1D83B5; + else + { + //gBattleMoveFlags &= ~(MOVESTATUS_NOTAFFECTED); only in Emerald + gBattlescriptCurrInstr = BattleScript_1D839B; + } +} + +static void atkB8_set_safeguard(void) +{ + if (gSideAffecting[GetBankIdentity(gBankAttacker) & 1] & SIDE_STATUS_SAFEGUARD) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else + { + gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_SAFEGUARD; + gSideTimer[GetBankIdentity(gBankAttacker) & 1].safeguardTimer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + } + gBattlescriptCurrInstr++; +} + +static void atkB9_magnitudedamagecalculation(void) +{ + s32 magnitude = Random() % 100; + if (magnitude < 5) + { + gDynamicBasePower = 10; + magnitude = 4; + } + else if (magnitude < 15) + { + gDynamicBasePower = 30; + magnitude = 5; + } + else if (magnitude < 35) + { + gDynamicBasePower = 50; + magnitude = 6; + } + else if (magnitude < 65) + { + gDynamicBasePower = 70; + magnitude = 7; + } + else if (magnitude < 85) + { + gDynamicBasePower = 90; + magnitude = 8; + } + else if (magnitude < 95) + { + gDynamicBasePower = 110; + magnitude = 9; + } + else + { + gDynamicBasePower = 150; + magnitude = 10; + } + + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 1; + gBattleTextBuff1[2] = 1; + gBattleTextBuff1[3] = 2; + gBattleTextBuff1[4] = magnitude; + gBattleTextBuff1[5] = 0xFF; + + for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++) + { + if (gBankTarget == gBankAttacker) + continue; + if (!(gAbsentBankFlags & gBitTable[gBankTarget])) //a valid target was found + break; + } + gBattlescriptCurrInstr++; +} + +static void atkBA_jumpifnopursuitswitchdmg(void) +{ + if (gMultiHitCounter == 1) + { + if (GetBankSide(gBankAttacker) == 0) + gBankTarget = GetBankByPlayerAI(1); + else + gBankTarget = GetBankByPlayerAI(0); + } + else + { + if (GetBankSide(gBankAttacker) == 0) + gBankTarget = GetBankByPlayerAI(3); + else + gBankTarget = GetBankByPlayerAI(2); + } + + if (gActionForBanks[gBankTarget] == 0 && gBankAttacker == ewram[gBankTarget + 0x16010] && !(gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE)) + && gBattleMons[gBankAttacker].hp && !gDisableStructs[gBankTarget].truantCounter && gChosenMovesByBanks[gBankTarget] == MOVE_PURSUIT) + { + int i; + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gTurnOrder[i] == gBankTarget) + gUnknown_02024A76[i] = 11; + } + gCurrentMove = MOVE_PURSUIT; + gBattlescriptCurrInstr += 5; + BATTLE_STRUCT->animTurn = 1; + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + } + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atkBB_setsunny(void) +{ + if (gBattleWeather & WEATHER_SUN_ANY) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + } + else + { + gBattleWeather = WEATHER_SUN_TEMPORARY; + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gWishFutureKnock.weatherDuration = 5; + } + gBattlescriptCurrInstr++; +} + +static void atkBC_maxattackhalvehp(void) //belly drum +{ + u32 half_hp = gBattleMons[gBankAttacker].maxHP / 2; + if (!(gBattleMons[gBankAttacker].maxHP / 2)) + half_hp = 1; + + if (gBattleMons[gBankAttacker].statStages[STAT_STAGE_ATK] < 12 && gBattleMons[gBankAttacker].hp > half_hp) + { + gBattleMons[gBankAttacker].statStages[STAT_STAGE_ATK] = 12; + gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattlescriptCurrInstr += 5; + } + else + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } +} + +static void atkBD_copyfoestats(void) //psych up +{ + int i; + for (i = 0; i < 8; i++) + { + gBattleMons[gBankAttacker].statStages[i] = gBattleMons[gBankTarget].statStages[i]; + } + gBattlescriptCurrInstr += 5; //why not 1? possible unused fail possibility? +} + +static void atkBE_breakfree(void) //rapid spin +{ + if (gBattleMons[gBankAttacker].status2 & STATUS2_WRAPPED) + { + gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED); + gBankTarget = ewram[gBankAttacker + 0x16020]; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = ewram[gBankAttacker * 2 + 0x16004]; + gBattleTextBuff1[3] = ewram[gBankAttacker * 2 + 0x16005]; + gBattleTextBuff1[4] = 0xFF; + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = BattleScript_WrapFree; + } + else if (gStatuses3[gBankAttacker] & STATUS3_LEECHSEED) + { + gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED); + gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED_BANK); + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = BattleScript_LeechSeedFree; + } + else if (gSideAffecting[GetBankSide(gBankAttacker)] & SIDE_STATUS_SPIKES) + { + gSideAffecting[GetBankSide(gBankAttacker)] &= ~(SIDE_STATUS_SPIKES); + gSideTimer[GetBankSide(gBankAttacker)].spikesAmount = 0; + b_movescr_stack_push_cursor(); + gBattlescriptCurrInstr = BattleScript_SpikesFree; + } + else + gBattlescriptCurrInstr++; +} + +static void atkBF_set_defense_curl(void) +{ + gBattleMons[gBankAttacker].status2 |= STATUS2_DEFENSE_CURL; + gBattlescriptCurrInstr++; +} + +static void atkC0_recoverbasedonsunlight(void) +{ + gBankTarget = gBankAttacker; + if (gBattleMons[gBankAttacker].hp != gBattleMons[gBankAttacker].maxHP) + { + if (!gBattleWeather || !WEATHER_HAS_EFFECT) + gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2; + else if (gBattleWeather & WEATHER_SUN_ANY) + gBattleMoveDamage = 20 * gBattleMons[gBankAttacker].maxHP / 30; + else //not sunny weather + gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + gBattlescriptCurrInstr += 5; + } + else + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } +} + +__attribute__((naked)) +static void atkC1_hidden_power(void) +{ + asm(".syntax unified\n\ +push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + ldr r2, _08029894 @ =gBattleMons\n\ + ldr r0, _08029898 @ =gBankAttacker\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + adds r4, r1, 0\n\ + muls r4, r0\n\ + adds r4, r2\n\ + ldrb r0, [r4, 0x14]\n\ + mov r10, r0\n\ + mov r7, r10\n\ + lsls r7, 27\n\ + adds r0, r7, 0\n\ + lsrs r0, 27\n\ + mov r10, r0\n\ + movs r1, 0x2\n\ + mov r2, r10\n\ + ands r2, r1\n\ + asrs r2, 1\n\ + ldrh r7, [r4, 0x14]\n\ + mov r9, r7\n\ + mov r0, r9\n\ + lsls r0, 22\n\ + mov r9, r0\n\ + lsrs r3, r0, 27\n\ + adds r0, r1, 0\n\ + ands r0, r3\n\ + orrs r2, r0\n\ + ldrb r7, [r4, 0x15]\n\ + mov r8, r7\n\ + mov r0, r8\n\ + lsls r0, 25\n\ + mov r8, r0\n\ + lsrs r3, r0, 27\n\ + adds r0, r1, 0\n\ + ands r0, r3\n\ + lsls r0, 1\n\ + orrs r2, r0\n\ + ldr r6, [r4, 0x14]\n\ + lsls r6, 12\n\ + lsrs r3, r6, 27\n\ + adds r0, r1, 0\n\ + ands r0, r3\n\ + lsls r0, 2\n\ + orrs r2, r0\n\ + ldrh r5, [r4, 0x16]\n\ + lsls r5, 23\n\ + lsrs r3, r5, 27\n\ + adds r0, r1, 0\n\ + ands r0, r3\n\ + lsls r0, 3\n\ + orrs r2, r0\n\ + ldrb r3, [r4, 0x17]\n\ + lsls r3, 26\n\ + lsrs r0, r3, 27\n\ + ands r1, r0\n\ + lsls r1, 4\n\ + orrs r2, r1\n\ + movs r1, 0x1\n\ + adds r4, r1, 0\n\ + mov r7, r10\n\ + ands r4, r7\n\ + mov r0, r9\n\ + lsrs r0, 27\n\ + mov r9, r0\n\ + adds r0, r1, 0\n\ + mov r7, r9\n\ + ands r0, r7\n\ + lsls r0, 1\n\ + orrs r4, r0\n\ + mov r0, r8\n\ + lsrs r0, 27\n\ + mov r8, r0\n\ + adds r0, r1, 0\n\ + mov r7, r8\n\ + ands r0, r7\n\ + lsls r0, 2\n\ + orrs r4, r0\n\ + lsrs r6, 27\n\ + adds r0, r1, 0\n\ + ands r0, r6\n\ + lsls r0, 3\n\ + orrs r4, r0\n\ + lsrs r5, 27\n\ + adds r0, r1, 0\n\ + ands r0, r5\n\ + lsls r0, 4\n\ + orrs r4, r0\n\ + lsrs r3, 27\n\ + ands r1, r3\n\ + lsls r1, 5\n\ + orrs r4, r1\n\ + ldr r5, _0802989C @ =gDynamicBasePower\n\ + lsls r0, r2, 2\n\ + adds r0, r2\n\ + lsls r0, 3\n\ + movs r1, 0x3F\n\ + bl __divsi3\n\ + adds r0, 0x1E\n\ + strh r0, [r5]\n\ + ldr r5, _080298A0 @ =0x02000000\n\ + lsls r0, r4, 4\n\ + subs r0, r4\n\ + movs r1, 0x3F\n\ + bl __divsi3\n\ + adds r1, r0, 0x1\n\ + ldr r0, _080298A4 @ =0x0001601c\n\ + adds r5, r0\n\ + strb r1, [r5]\n\ + lsls r0, r1, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x8\n\ + bls _08029876\n\ + adds r0, r1, 0x1\n\ + strb r0, [r5]\n\ +_08029876:\n\ + ldrb r0, [r5]\n\ + movs r1, 0xC0\n\ + orrs r0, r1\n\ + strb r0, [r5]\n\ + ldr r1, _080298A8 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x1\n\ + str r0, [r1]\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08029894: .4byte gBattleMons\n\ +_08029898: .4byte gBankAttacker\n\ +_0802989C: .4byte gDynamicBasePower\n\ +_080298A0: .4byte 0x02000000\n\ +_080298A4: .4byte 0x0001601c\n\ +_080298A8: .4byte gBattlescriptCurrInstr\n\ + .syntax divided"); +} + +static void atkC2_selectnexttarget(void) +{ + for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++) + { + if (gBankTarget == gBankAttacker) + continue; + if (!(gAbsentBankFlags & gBitTable[gBankTarget])) + break; + } + gBattlescriptCurrInstr++; +} + +static void atkC3_setfutureattack(void) +{ + if (gWishFutureKnock.futureSightCounter[gBankTarget] != 0) + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } + else + { + gWishFutureKnock.futureSightMove[gBankTarget] = gCurrentMove; + gWishFutureKnock.futureSightAttacker[gBankTarget] = gBankAttacker; + gWishFutureKnock.futureSightCounter[gBankTarget] = 3; + gWishFutureKnock.futureSightDmg[gBankTarget] = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, + gSideAffecting[GetBankIdentity(gBankTarget) & 1], 0, + 0, gBankAttacker, gBankTarget); + + if (gProtectStructs[gBankAttacker].helpingHand) + gWishFutureKnock.futureSightDmg[gBankTarget] = gWishFutureKnock.futureSightDmg[gBankTarget] * 15 / 10; + + if (gCurrentMove == MOVE_DOOM_DESIRE) + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + + gBattlescriptCurrInstr += 5; + } +} + +#ifdef NONMATCHING +static void atkC4_beat_up(void) +{ + register struct Pokemon* party asm("r7"); + if (GetBankSide(gBankAttacker) == 0) + party = gPlayerParty; + else + party = gEnemyParty; + + if (gBattleMons[gBankTarget].hp == 0) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + { + while (gBattleCommunication[0] < 6) + { + if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) + && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) != SPECIES_EGG && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) + break; + gBattleCommunication[0]++; + } + if (gBattleCommunication[0] < 6) + { + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 4; + gBattleTextBuff1[2] = gBankAttacker; + gBattleTextBuff1[3] = gBattleCommunication[0]; + gBattleTextBuff1[4] = 0xFF; + gBattlescriptCurrInstr += 9; + + gBattleMoveDamage = gBaseStats[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack; + gBattleMoveDamage *= gBattleMoves[gCurrentMove].power; + gBattleMoveDamage *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2); + gBattleMoveDamage /= gBaseStats[gBattleMons[gBankTarget].species].baseDefense; + gBattleMoveDamage = (gBattleMoveDamage / 50) + 2; + if (gProtectStructs[gBankAttacker].helpingHand) + gBattleMoveDamage = gBattleMoveDamage * 15 / 10; + + gBattleCommunication[0]++; + } + else if (gBattleCommunication[0] != 0) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 5); + } +} +#else +__attribute__((naked)) +static void atkC4_beat_up(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + ldr r0, _08029A8C @ =gBankAttacker\n\ + ldrb r0, [r0]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + ldr r7, _08029A90 @ =gEnemyParty\n\ + cmp r0, 0\n\ + bne _08029A62\n\ + ldr r7, _08029A94 @ =gPlayerParty\n\ +_08029A62:\n\ + ldr r2, _08029A98 @ =gBattleMons\n\ + ldr r0, _08029A9C @ =gBankTarget\n\ + ldrb r1, [r0]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + adds r0, r2\n\ + ldrh r0, [r0, 0x28]\n\ + cmp r0, 0\n\ + bne _08029AA4\n\ + ldr r3, _08029AA0 @ =gBattlescriptCurrInstr\n\ + ldr r2, [r3]\n\ + ldrb r1, [r2, 0x1]\n\ + ldrb r0, [r2, 0x2]\n\ + lsls r0, 8\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x3]\n\ + lsls r0, 16\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x4]\n\ + b _08029C40\n\ + .align 2, 0\n\ +_08029A8C: .4byte gBankAttacker\n\ +_08029A90: .4byte gEnemyParty\n\ +_08029A94: .4byte gPlayerParty\n\ +_08029A98: .4byte gBattleMons\n\ +_08029A9C: .4byte gBankTarget\n\ +_08029AA0: .4byte gBattlescriptCurrInstr\n\ +_08029AA4:\n\ + ldr r6, _08029BE0 @ =gBattleCommunication\n\ + ldrb r0, [r6]\n\ + mov r8, r0\n\ + cmp r0, 0x5\n\ + bls _08029AB0\n\ + b _08029C0C\n\ +_08029AB0:\n\ + adds r4, r6, 0\n\ + movs r5, 0x64\n\ +_08029AB4:\n\ + ldrb r0, [r4]\n\ + muls r0, r5\n\ + adds r0, r7, r0\n\ + movs r1, 0x39\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _08029AF8\n\ + ldrb r0, [r6]\n\ + muls r0, r5\n\ + adds r0, r7, r0\n\ + movs r1, 0x41\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _08029AF8\n\ + ldrb r0, [r4]\n\ + muls r0, r5\n\ + adds r0, r7, r0\n\ + movs r1, 0x41\n\ + bl GetMonData\n\ + movs r1, 0xCE\n\ + lsls r1, 1\n\ + cmp r0, r1\n\ + beq _08029AF8\n\ + ldrb r0, [r4]\n\ + muls r0, r5\n\ + adds r0, r7, r0\n\ + movs r1, 0x37\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _08029B08\n\ +_08029AF8:\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ + adds r6, r4, 0\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x5\n\ + bls _08029AB4\n\ +_08029B08:\n\ + ldr r1, _08029BE0 @ =gBattleCommunication\n\ + mov r9, r1\n\ + ldrb r2, [r1]\n\ + cmp r2, 0x5\n\ + bhi _08029C0C\n\ + ldr r1, _08029BE4 @ =gBattleTextBuff1\n\ + movs r0, 0xFD\n\ + strb r0, [r1]\n\ + movs r0, 0x4\n\ + strb r0, [r1, 0x1]\n\ + ldr r6, _08029BE8 @ =gBankAttacker\n\ + ldrb r0, [r6]\n\ + strb r0, [r1, 0x2]\n\ + strb r2, [r1, 0x3]\n\ + movs r0, 0xFF\n\ + strb r0, [r1, 0x4]\n\ + ldr r1, _08029BEC @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x9\n\ + str r0, [r1]\n\ + ldr r2, _08029BF0 @ =gBattleMoveDamage\n\ + mov r8, r2\n\ + ldr r5, _08029BF4 @ =gBaseStats\n\ + mov r1, r9\n\ + ldrb r0, [r1]\n\ + movs r4, 0x64\n\ + muls r0, r4\n\ + adds r0, r7, r0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + lsls r1, r0, 3\n\ + subs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r5\n\ + ldrb r3, [r1, 0x1]\n\ + mov r2, r8\n\ + str r3, [r2]\n\ + ldr r2, _08029BF8 @ =gBattleMoves\n\ + ldr r0, _08029BFC @ =gCurrentMove\n\ + ldrh r1, [r0]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldrb r0, [r0, 0x1]\n\ + muls r0, r3\n\ + mov r1, r8\n\ + str r0, [r1]\n\ + mov r2, r9\n\ + ldrb r0, [r2]\n\ + muls r0, r4\n\ + adds r0, r7, r0\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + lsls r0, 1\n\ + movs r1, 0x5\n\ + bl __udivsi3\n\ + adds r0, 0x2\n\ + mov r2, r8\n\ + ldr r1, [r2]\n\ + muls r0, r1\n\ + str r0, [r2]\n\ + ldr r3, _08029C00 @ =gBattleMons\n\ + ldr r1, _08029C04 @ =gBankTarget\n\ + ldrb r2, [r1]\n\ + movs r1, 0x58\n\ + muls r1, r2\n\ + adds r1, r3\n\ + ldrh r2, [r1]\n\ + lsls r1, r2, 3\n\ + subs r1, r2\n\ + lsls r1, 2\n\ + adds r1, r5\n\ + ldrb r1, [r1, 0x2]\n\ + bl __divsi3\n\ + mov r1, r8\n\ + str r0, [r1]\n\ + movs r1, 0x32\n\ + bl __divsi3\n\ + adds r2, r0, 0x2\n\ + mov r0, r8\n\ + str r2, [r0]\n\ + ldr r1, _08029C08 @ =gProtectStructs\n\ + ldrb r0, [r6]\n\ + lsls r0, 4\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + lsls r0, 28\n\ + cmp r0, 0\n\ + bge _08029BD4\n\ + lsls r0, r2, 4\n\ + subs r0, r2\n\ + movs r1, 0xA\n\ + bl __divsi3\n\ + mov r1, r8\n\ + str r0, [r1]\n\ +_08029BD4:\n\ + mov r2, r9\n\ + ldrb r0, [r2]\n\ + adds r0, 0x1\n\ + strb r0, [r2]\n\ + b _08029C46\n\ + .align 2, 0\n\ +_08029BE0: .4byte gBattleCommunication\n\ +_08029BE4: .4byte gBattleTextBuff1\n\ +_08029BE8: .4byte gBankAttacker\n\ +_08029BEC: .4byte gBattlescriptCurrInstr\n\ +_08029BF0: .4byte gBattleMoveDamage\n\ +_08029BF4: .4byte gBaseStats\n\ +_08029BF8: .4byte gBattleMoves\n\ +_08029BFC: .4byte gCurrentMove\n\ +_08029C00: .4byte gBattleMons\n\ +_08029C04: .4byte gBankTarget\n\ +_08029C08: .4byte gProtectStructs\n\ +_08029C0C:\n\ + mov r0, r8\n\ + cmp r0, 0\n\ + beq _08029C2C\n\ + ldr r3, _08029C28 @ =gBattlescriptCurrInstr\n\ + ldr r2, [r3]\n\ + ldrb r1, [r2, 0x1]\n\ + ldrb r0, [r2, 0x2]\n\ + lsls r0, 8\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x3]\n\ + lsls r0, 16\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x4]\n\ + b _08029C40\n\ + .align 2, 0\n\ +_08029C28: .4byte gBattlescriptCurrInstr\n\ +_08029C2C:\n\ + ldr r3, _08029C54 @ =gBattlescriptCurrInstr\n\ + ldr r2, [r3]\n\ + ldrb r1, [r2, 0x5]\n\ + ldrb r0, [r2, 0x6]\n\ + lsls r0, 8\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x7]\n\ + lsls r0, 16\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x8]\n\ +_08029C40:\n\ + lsls r0, 24\n\ + orrs r1, r0\n\ + str r1, [r3]\n\ +_08029C46:\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08029C54: .4byte gBattlescriptCurrInstr\n\ + .syntax divided"); +} +#endif // NONMATCHING + +static void atkC5_hidepreattack(void) +{ + switch (gCurrentMove) + { + case MOVE_FLY: + case MOVE_BOUNCE: + gStatuses3[gBankAttacker] |= STATUS3_ON_AIR; + break; + case MOVE_DIG: + gStatuses3[gBankAttacker] |= STATUS3_UNDERGROUND; + break; + case MOVE_DIVE: + gStatuses3[gBankAttacker] |= STATUS3_UNDERWATER; + break; + } + gBattlescriptCurrInstr++; +} + +static void atkC6_unhidepostattack(void) +{ + switch (gCurrentMove) + { + case MOVE_FLY: + case MOVE_BOUNCE: + gStatuses3[gBankAttacker] &= ~STATUS3_ON_AIR; + break; + case MOVE_DIG: + gStatuses3[gBankAttacker] &= ~STATUS3_UNDERGROUND; + break; + case MOVE_DIVE: + gStatuses3[gBankAttacker] &= ~STATUS3_UNDERWATER; + break; + } + gBattlescriptCurrInstr++; +} + +static void atkC7_setminimize(void) +{ + if (gHitMarker & HITMARKER_OBEYS) + gStatuses3[gBankAttacker] |= STATUS3_MINIMIZED; + gBattlescriptCurrInstr++; +} + +static void atkC8_sethail(void) +{ + if (gBattleWeather & WEATHER_HAIL) + { + gBattleMoveFlags |= MOVESTATUS_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + } + else + { + gBattleWeather = WEATHER_HAIL; + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + gWishFutureKnock.weatherDuration = 5; + } + gBattlescriptCurrInstr++; +} + +static void atkC9_jumpifattackandspecialattackcannotfall(void) //memento +{ + if (gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] == 0 + && gBattleMons[gBankTarget].statStages[STAT_STAGE_SPATK] == 0 + && gBattleCommunication[6] != 1) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + { + gActiveBank = gBankAttacker; + gBattleMoveDamage = gBattleMons[gActiveBank].hp; + EmitHealthBarUpdate(0, 0x7FFF); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 5; + } +} + +static void atkCA_setforcedtarget(void) //follow me +{ + gSideTimer[GetBankSide(gBankAttacker)].followmeTimer = 1; + gSideTimer[GetBankSide(gBankAttacker)].followmeTarget = gBankAttacker; + gBattlescriptCurrInstr++; +} + +static void atkCB_setcharge(void) +{ + gStatuses3[gBankAttacker] |= STATUS3_CHARGED_UP; + gDisableStructs[gBankAttacker].chargeTimer1 = 2; + gDisableStructs[gBankAttacker].chargeTimer2 = 2; + gBattlescriptCurrInstr++; +} + +static void atkCC_callterrainattack(void) //nature power +{ + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gCurrentMove = sNaturePowerMoves[gBattleTerrain]; + gBankTarget = sub_801B5C0(gCurrentMove, 0); + b_movescr_stack_push(gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]); + gBattlescriptCurrInstr++; +} + +static void atkCD_cureifburnedparalysedorpoisoned(void) //refresh +{ + if (gBattleMons[gBankAttacker].status1 & (STATUS_POISON | STATUS_BURN | STATUS_PARALYSIS | STATUS_TOXIC_POISON)) + { + gBattleMons[gBankAttacker].status1 = 0; + gBattlescriptCurrInstr += 5; + gActiveBank = gBankAttacker; + EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); + MarkBufferBankForExecution(gActiveBank); + } + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atkCE_settorment(void) +{ + if (gBattleMons[gBankTarget].status2 & STATUS2_TORMENT) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + { + gBattleMons[gBankTarget].status2 |= STATUS2_TORMENT; + gBattlescriptCurrInstr += 5; + } +} + +static void atkCF_jumpifnodamage(void) +{ + if (gProtectStructs[gBankAttacker].physicalDmg || gProtectStructs[gBankAttacker].specialDmg) + gBattlescriptCurrInstr += 5; + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atkD0_settaunt(void) +{ + if (gDisableStructs[gBankTarget].tauntTimer1 == 0) + { + gDisableStructs[gBankTarget].tauntTimer1 = 2; + gDisableStructs[gBankTarget].tauntTimer2 = 2; + gBattlescriptCurrInstr += 5; + } + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atkD1_set_helpinghand(void) +{ + gBankTarget = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gBankTarget]) + && !gProtectStructs[gBankAttacker].helpingHand && !gProtectStructs[gBankTarget].helpingHand) + { + gProtectStructs[gBankTarget].helpingHand = 1; + gBattlescriptCurrInstr += 5; + } + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +#ifdef NONMATCHING +static void atkD2_swap_items(void) +{ + if ((GetBankSide(gBankAttacker) != 1 || gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER) || gTrainerBattleOpponent == 0x400)) + { + u8 side = GetBankSide(gBankAttacker); + if (gBattleTypeFlags) + } + + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +#else +__attribute__((naked)) +static void atkD2_swap_items(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + ldr r0, _0802A30C @ =gBankAttacker\n\ + ldrb r0, [r0]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _0802A24C\n\ + ldr r0, _0802A310 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + ldr r0, _0802A314 @ =0x00000902\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0802A24C\n\ + ldr r0, _0802A318 @ =gTrainerBattleOpponent\n\ + ldrh r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + cmp r1, r0\n\ + bne _0802A2EE\n\ +_0802A24C:\n\ + ldr r4, _0802A30C @ =gBankAttacker\n\ + ldrb r0, [r4]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + ldr r0, _0802A310 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + ldr r0, _0802A314 @ =0x00000902\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0802A290\n\ + ldr r0, _0802A318 @ =gTrainerBattleOpponent\n\ + ldrh r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + cmp r1, r0\n\ + beq _0802A290\n\ + ldr r0, _0802A31C @ =gWishFutureKnock\n\ + adds r0, 0x29\n\ + adds r0, r2, r0\n\ + ldrb r1, [r0]\n\ + ldr r3, _0802A320 @ =gBitTable\n\ + ldr r2, _0802A324 @ =gBattlePartyID\n\ + ldrb r0, [r4]\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + ldrh r0, [r0]\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + ldr r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + bne _0802A2EE\n\ +_0802A290:\n\ + ldr r0, _0802A328 @ =gBattleMons\n\ + mov r9, r0\n\ + ldr r1, _0802A30C @ =gBankAttacker\n\ + ldrb r4, [r1]\n\ + movs r2, 0x58\n\ + mov r8, r2\n\ + mov r0, r8\n\ + muls r0, r4\n\ + mov r3, r9\n\ + adds r5, r0, r3\n\ + ldrh r3, [r5, 0x2E]\n\ + adds r1, r3, 0\n\ + cmp r1, 0\n\ + bne _0802A2BE\n\ + ldr r0, _0802A32C @ =gBankTarget\n\ + ldrb r0, [r0]\n\ + mov r2, r8\n\ + muls r2, r0\n\ + adds r0, r2, 0\n\ + add r0, r9\n\ + ldrh r0, [r0, 0x2E]\n\ + cmp r0, 0\n\ + beq _0802A2EE\n\ +_0802A2BE:\n\ + cmp r1, 0xAF\n\ + beq _0802A2EE\n\ + ldr r7, _0802A32C @ =gBankTarget\n\ + ldrb r0, [r7]\n\ + mov r1, r8\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + mov r1, r9\n\ + adds r2, r0, r1\n\ + ldrh r1, [r2, 0x2E]\n\ + cmp r1, 0xAF\n\ + beq _0802A2EE\n\ + adds r0, r3, 0\n\ + subs r0, 0x79\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0xB\n\ + bls _0802A2EE\n\ + adds r0, r1, 0\n\ + subs r0, 0x79\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0xB\n\ + bhi _0802A334\n\ +_0802A2EE:\n\ + ldr r3, _0802A330 @ =gBattlescriptCurrInstr\n\ + ldr r2, [r3]\n\ + ldrb r1, [r2, 0x1]\n\ + ldrb r0, [r2, 0x2]\n\ + lsls r0, 8\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x3]\n\ + lsls r0, 16\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x4]\n\ + lsls r0, 24\n\ + orrs r1, r0\n\ + str r1, [r3]\n\ + b _0802A49A\n\ + .align 2, 0\n\ +_0802A30C: .4byte gBankAttacker\n\ +_0802A310: .4byte gBattleTypeFlags\n\ +_0802A314: .4byte 0x00000902\n\ +_0802A318: .4byte gTrainerBattleOpponent\n\ +_0802A31C: .4byte gWishFutureKnock\n\ +_0802A320: .4byte gBitTable\n\ +_0802A324: .4byte gBattlePartyID\n\ +_0802A328: .4byte gBattleMons\n\ +_0802A32C: .4byte gBankTarget\n\ +_0802A330: .4byte gBattlescriptCurrInstr\n\ +_0802A334:\n\ + adds r0, r2, 0\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x3C\n\ + bne _0802A36C\n\ + ldr r1, _0802A360 @ =gBattlescriptCurrInstr\n\ + ldr r0, _0802A364 @ =BattleScript_NoItemSteal\n\ + str r0, [r1]\n\ + ldr r1, _0802A368 @ =gLastUsedAbility\n\ + ldrb r0, [r7]\n\ + mov r2, r8\n\ + muls r2, r0\n\ + adds r0, r2, 0\n\ + add r0, r9\n\ + adds r0, 0x20\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldrb r0, [r7]\n\ + ldrb r1, [r1]\n\ + bl RecordAbilityBattle\n\ + b _0802A49A\n\ + .align 2, 0\n\ +_0802A360: .4byte gBattlescriptCurrInstr\n\ +_0802A364: .4byte BattleScript_NoItemSteal\n\ +_0802A368: .4byte gLastUsedAbility\n\ +_0802A36C:\n\ + lsls r0, r4, 1\n\ + ldr r4, _0802A458 @ =0x020160f0\n\ + adds r6, r0, r4\n\ + ldrh r5, [r5, 0x2E]\n\ + mov r10, r5\n\ + strh r1, [r6]\n\ + ldr r3, _0802A45C @ =gBankAttacker\n\ + ldrb r0, [r3]\n\ + mov r1, r8\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + add r0, r9\n\ + movs r1, 0\n\ + strh r1, [r0, 0x2E]\n\ + ldrb r0, [r7]\n\ + mov r2, r8\n\ + muls r2, r0\n\ + adds r0, r2, 0\n\ + add r0, r9\n\ + mov r3, r10\n\ + strh r3, [r0, 0x2E]\n\ + ldr r5, _0802A460 @ =gActiveBank\n\ + ldr r1, _0802A45C @ =gBankAttacker\n\ + ldrb r0, [r1]\n\ + strb r0, [r5]\n\ + str r6, [sp]\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + movs r2, 0\n\ + movs r3, 0x2\n\ + bl EmitSetAttributes\n\ + ldr r2, _0802A45C @ =gBankAttacker\n\ + ldrb r0, [r2]\n\ + bl MarkBufferBankForExecution\n\ + ldrb r0, [r7]\n\ + strb r0, [r5]\n\ + ldrb r0, [r7]\n\ + mov r3, r8\n\ + muls r3, r0\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + adds r1, 0x2E\n\ + adds r0, r1\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + movs r2, 0\n\ + movs r3, 0x2\n\ + bl EmitSetAttributes\n\ + ldrb r0, [r7]\n\ + bl MarkBufferBankForExecution\n\ + ldr r0, _0802A464 @ =0xfffe9f10\n\ + adds r4, r0\n\ + ldrb r0, [r7]\n\ + lsls r0, 1\n\ + ldr r2, _0802A468 @ =0x000160e8\n\ + adds r0, r2\n\ + adds r0, r4\n\ + movs r1, 0\n\ + strb r1, [r0]\n\ + ldrb r0, [r7]\n\ + lsls r0, 1\n\ + ldr r1, _0802A46C @ =0x000160e9\n\ + adds r0, r1\n\ + adds r0, r4\n\ + movs r3, 0\n\ + strb r3, [r0]\n\ + ldr r3, _0802A45C @ =gBankAttacker\n\ + ldrb r0, [r3]\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + adds r0, r4\n\ + movs r2, 0\n\ + strb r2, [r0]\n\ + ldrb r0, [r3]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + adds r0, r4\n\ + strb r2, [r0]\n\ + ldr r1, _0802A470 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x5\n\ + str r0, [r1]\n\ + ldr r1, _0802A474 @ =gBattleTextBuff1\n\ + movs r3, 0xFD\n\ + strb r3, [r1]\n\ + movs r2, 0xA\n\ + strb r2, [r1, 0x1]\n\ + ldrh r0, [r6]\n\ + strb r0, [r1, 0x2]\n\ + ldrh r0, [r6]\n\ + lsrs r0, 8\n\ + strb r0, [r1, 0x3]\n\ + movs r0, 0xFF\n\ + strb r0, [r1, 0x4]\n\ + ldr r1, _0802A478 @ =gBattleTextBuff2\n\ + strb r3, [r1]\n\ + strb r2, [r1, 0x1]\n\ + mov r3, r10\n\ + strb r3, [r1, 0x2]\n\ + mov r2, r10\n\ + lsrs r0, r2, 8\n\ + strb r0, [r1, 0x3]\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + strb r0, [r1, 0x4]\n\ + cmp r2, 0\n\ + beq _0802A480\n\ + ldrh r0, [r6]\n\ + cmp r0, 0\n\ + beq _0802A494\n\ + ldr r1, _0802A47C @ =gBattleCommunication\n\ + movs r0, 0x2\n\ + b _0802A498\n\ + .align 2, 0\n\ +_0802A458: .4byte 0x020160f0\n\ +_0802A45C: .4byte gBankAttacker\n\ +_0802A460: .4byte gActiveBank\n\ +_0802A464: .4byte 0xfffe9f10\n\ +_0802A468: .4byte 0x000160e8\n\ +_0802A46C: .4byte 0x000160e9\n\ +_0802A470: .4byte gBattlescriptCurrInstr\n\ +_0802A474: .4byte gBattleTextBuff1\n\ +_0802A478: .4byte gBattleTextBuff2\n\ +_0802A47C: .4byte gBattleCommunication\n\ +_0802A480:\n\ + ldrh r0, [r6]\n\ + cmp r0, 0\n\ + beq _0802A494\n\ + ldr r0, _0802A490 @ =gBattleCommunication\n\ + movs r3, 0\n\ + strb r3, [r0, 0x5]\n\ + b _0802A49A\n\ + .align 2, 0\n\ +_0802A490: .4byte gBattleCommunication\n\ +_0802A494:\n\ + ldr r1, _0802A4AC @ =gBattleCommunication\n\ + movs r0, 0x1\n\ +_0802A498:\n\ + strb r0, [r1, 0x5]\n\ +_0802A49A:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0802A4AC: .4byte gBattleCommunication\n\ + .syntax divided"); +} +#endif // NONMATCHING + +static void atkD3_copy_ability(void) //role play +{ + if (gBattleMons[gBankTarget].ability != 0 && gBattleMons[gBankTarget].ability != ABILITY_WONDER_GUARD) + { + gBattleMons[gBankAttacker].ability = gBattleMons[gBankTarget].ability; + gLastUsedAbility = gBattleMons[gBankTarget].ability; + gBattlescriptCurrInstr += 5; + } + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atkD4_wish_effect(void) +{ + switch (BSScriptRead8(gBattlescriptCurrInstr + 1)) + { + case 0: //use wish + if (gWishFutureKnock.wishCounter[gBankAttacker] == 0) + { + gWishFutureKnock.wishCounter[gBankAttacker] = 2; + gWishFutureKnock.wishUserID[gBankAttacker] = gBattlePartyID[gBankAttacker]; + gBattlescriptCurrInstr += 6; + } + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + break; + case 1: //heal effect + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 4; + gBattleTextBuff1[2] = gBankTarget; + gBattleTextBuff1[3] = gWishFutureKnock.wishUserID[gBankTarget]; + gBattleTextBuff1[4] = 0xFF; + gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + else + gBattlescriptCurrInstr += 6; + break; + } +} + +static void atkD5_setroots(void) //ingrain +{ + if (gStatuses3[gBankAttacker] & STATUS3_ROOTED) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + { + gStatuses3[gBankAttacker] |= STATUS3_ROOTED; + gBattlescriptCurrInstr += 5; + } +} + +static void atkD6_doubledamagedealtifdamaged(void) +{ + if ((gProtectStructs[gBankAttacker].physicalDmg && gProtectStructs[gBankAttacker].physicalBank == gBankTarget) + || (gProtectStructs[gBankAttacker].specialDmg && gProtectStructs[gBankAttacker].specialBank == gBankTarget)) + BATTLE_STRUCT->dmgMultiplier = 2; + gBattlescriptCurrInstr++; +} + +static void atkD7_setyawn(void) +{ + if (gStatuses3[gBankTarget] & STATUS3_YAWN || (u8) gBattleMons[gBankTarget].status1) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + { + gStatuses3[gBankTarget] |= 0x1000; + gBattlescriptCurrInstr += 5; + } +} + +static void atkD8_setdamagetohealthdifference(void) +{ + if (gBattleMons[gBankTarget].hp <= gBattleMons[gBankAttacker].hp) + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } + else + { + gBattleMoveDamage = gBattleMons[gBankTarget].hp - gBattleMons[gBankAttacker].hp; + gBattlescriptCurrInstr += 5; + } +} + +static void atkD9_scaledamagebyhealthratio(void) +{ + if (gDynamicBasePower == 0) + { + u8 power = gBattleMoves[gCurrentMove].power; + gDynamicBasePower = gBattleMons[gBankAttacker].hp * power / gBattleMons[gBankAttacker].maxHP; + if (gDynamicBasePower == 0) + gDynamicBasePower = 1; + } + gBattlescriptCurrInstr++; +} + +static void atkDA_abilityswap(void) +{ + if ((gBattleMons[gBankAttacker].ability == 0 && gBattleMons[gBankTarget].ability == 0) + || gBattleMons[gBankAttacker].ability == ABILITY_WONDER_GUARD || gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD + || gBattleMoveFlags & MOVESTATUS_NOEFFECT) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + { + u8 atk_ability = gBattleMons[gBankAttacker].ability; + gBattleMons[gBankAttacker].ability = gBattleMons[gBankTarget].ability; + gBattleMons[gBankTarget].ability = atk_ability; + gBattlescriptCurrInstr += 5; + } +} + +static void atkDB_imprisoneffect(void) +{ + u8 r8 = 0; + if ((gStatuses3[gBankAttacker] & STATUS3_IMPRISIONED)) + { + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } + else + { + u8 bank; + sub_801529C(gBankAttacker); + for (bank = 0; bank < gNoOfAllBanks; bank++) + { + if (r8 != GetBankSide(bank)) + { + int j; + for (j = 0; j < 4; j++) + { + int k; + for (k = 0; k < 4; k++) + { + if (gBattleMons[gBankAttacker].moves[j] == gBattleMons[bank].moves[k] && gBattleMons[gBankAttacker].moves[j]) + break; + } + if (k != 4) + break; + } + if (j != 4) + { + gStatuses3[gBankAttacker] |= STATUS3_IMPRISIONED; + gBattlescriptCurrInstr += 5; + break; + } + } + } + if (bank == gNoOfAllBanks) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } +} + +static void atkDC_setgrudge(void) +{ + if (gStatuses3[gBankAttacker] & STATUS3_GRUDGE) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + { + gStatuses3[gBankAttacker] |= STATUS3_GRUDGE; + gBattlescriptCurrInstr += 5; + } +} + +static void atkDD_weightdamagecalculation(void) +{ + int i; + for (i = 0; sWeightDamage[i] != 0xFFFF; i += 2) + { + if (sWeightDamage[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) + break; + } + if (sWeightDamage[i] != 0xFFFF) + gDynamicBasePower = sWeightDamage[i + 1]; + else + gDynamicBasePower = 120; + gBattlescriptCurrInstr++; +} + +#ifdef NONMATCHING +static void atkDE_asistattackselect(void) +{ + u32 chooseable_moves_no = 0; + struct Pokemon* party; + int i, j; + u16* chooseable_moves; + if (GetBankIdentity(gBankAttacker) & 1) + party = gEnemyParty; + else + party = gPlayerParty; + + for (i = 0; i < 6; i++) + { + if (i == gBattlePartyID[gBankAttacker]) + break; + if (!GetMonData(&party[i], MON_DATA_SPECIES2) || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) + break; + chooseable_moves = &BATTLE_STRUCT->assistMove[chooseable_moves_no]; + for (j = 0; j < 4; j++) + { + int k; + u16 move = GetMonData(&party[i], MON_DATA_MOVE1 + i); + if (IsMoveUnchoosable(move)) + break; + //sUnknown_081FACFE[k] + for (k = 0; ;k++) + { + if (sUnknown_081FACFE[k] == 0xFFFF) + { + if (move) + { + *chooseable_moves = move; + chooseable_moves++; + chooseable_moves_no++; + } + break; + } + if (sUnknown_081FACFE[k] == move) + break; + } + } + } + if (chooseable_moves_no) + { + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gRandomMove = BATTLE_STRUCT->assistMove[Random() % chooseable_moves_no]; + gBankTarget = sub_801B5C0(gRandomMove, 0); + gBattlescriptCurrInstr += 5; + } + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +#else +__attribute__((naked)) +static void atkDE_asistattackselect(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + movs r0, 0\n\ + mov r10, r0\n\ + ldr r0, _0802AB9C @ =gBankAttacker\n\ + ldrb r0, [r0]\n\ + bl GetBankIdentity\n\ + movs r1, 0x1\n\ + ands r1, r0\n\ + ldr r0, _0802ABA0 @ =gPlayerParty\n\ + str r0, [sp]\n\ + cmp r1, 0\n\ + beq _0802AAAC\n\ + ldr r1, _0802ABA4 @ =gEnemyParty\n\ + str r1, [sp]\n\ +_0802AAAC:\n\ + movs r2, 0\n\ +_0802AAAE:\n\ + ldr r1, _0802ABA8 @ =gBattlePartyID\n\ + ldr r0, _0802AB9C @ =gBankAttacker\n\ + ldrb r0, [r0]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + adds r1, r2, 0x1\n\ + str r1, [sp, 0x4]\n\ + ldrh r0, [r0]\n\ + cmp r2, r0\n\ + beq _0802AB54\n\ + movs r0, 0x64\n\ + adds r6, r2, 0\n\ + muls r6, r0\n\ + ldr r0, [sp]\n\ + adds r4, r0, r6\n\ + adds r0, r4, 0\n\ + movs r1, 0x41\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0802AB54\n\ + adds r0, r4, 0\n\ + movs r1, 0x41\n\ + bl GetMonData\n\ + movs r1, 0xCE\n\ + lsls r1, 1\n\ + cmp r0, r1\n\ + beq _0802AB54\n\ + movs r5, 0\n\ + ldr r1, _0802ABAC @ =0x0000ffff\n\ + mov r8, r1\n\ + mov r9, r6\n\ + mov r1, r10\n\ + lsls r0, r1, 1\n\ + ldr r1, _0802ABB0 @ =0x02016024\n\ + adds r6, r0, r1\n\ +_0802AAF8:\n\ + movs r7, 0\n\ + adds r1, r5, 0\n\ + adds r1, 0xD\n\ + ldr r0, [sp]\n\ + add r0, r9\n\ + bl GetMonData\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + adds r0, r4, 0\n\ + bl IsMoveUnchoosable\n\ + lsls r0, 24\n\ + adds r1, r5, 0x1\n\ + cmp r0, 0\n\ + bne _0802AB4E\n\ + ldr r0, _0802ABB4 @ =sUnknown_081FACFE\n\ + ldrh r2, [r0]\n\ + adds r3, r0, 0\n\ + cmp r2, r8\n\ + beq _0802AB42\n\ + cmp r4, r2\n\ + beq _0802AB38\n\ + ldr r5, _0802ABAC @ =0x0000ffff\n\ + adds r2, r3, 0\n\ +_0802AB2A:\n\ + adds r2, 0x2\n\ + adds r7, 0x1\n\ + ldrh r0, [r2]\n\ + cmp r0, r5\n\ + beq _0802AB42\n\ + cmp r4, r0\n\ + bne _0802AB2A\n\ +_0802AB38:\n\ + lsls r0, r7, 1\n\ + adds r0, r3\n\ + ldrh r0, [r0]\n\ + cmp r0, r8\n\ + bne _0802AB4E\n\ +_0802AB42:\n\ + cmp r4, 0\n\ + beq _0802AB4E\n\ + strh r4, [r6]\n\ + adds r6, 0x2\n\ + movs r0, 0x1\n\ + add r10, r0\n\ +_0802AB4E:\n\ + adds r5, r1, 0\n\ + cmp r5, 0x3\n\ + ble _0802AAF8\n\ +_0802AB54:\n\ + ldr r2, [sp, 0x4]\n\ + cmp r2, 0x5\n\ + ble _0802AAAE\n\ + mov r1, r10\n\ + cmp r1, 0\n\ + beq _0802ABCC\n\ + ldr r2, _0802ABB8 @ =gHitMarker\n\ + ldr r0, [r2]\n\ + ldr r1, _0802ABBC @ =0xfffffbff\n\ + ands r0, r1\n\ + str r0, [r2]\n\ + ldr r4, _0802ABC0 @ =gRandomMove\n\ + bl Random\n\ + movs r1, 0xFF\n\ + ands r1, r0\n\ + mov r0, r10\n\ + muls r0, r1\n\ + asrs r0, 8\n\ + lsls r0, 1\n\ + ldr r1, _0802ABB0 @ =0x02016024\n\ + adds r0, r1\n\ + ldrh r0, [r0]\n\ + strh r0, [r4]\n\ + ldrh r0, [r4]\n\ + movs r1, 0\n\ + bl sub_801B5C0\n\ + ldr r1, _0802ABC4 @ =gBankTarget\n\ + strb r0, [r1]\n\ + ldr r1, _0802ABC8 @ =gBattlescriptCurrInstr\n\ + ldr r0, [r1]\n\ + adds r0, 0x5\n\ + str r0, [r1]\n\ + b _0802ABE6\n\ + .align 2, 0\n\ +_0802AB9C: .4byte gBankAttacker\n\ +_0802ABA0: .4byte gPlayerParty\n\ +_0802ABA4: .4byte gEnemyParty\n\ +_0802ABA8: .4byte gBattlePartyID\n\ +_0802ABAC: .4byte 0x0000ffff\n\ +_0802ABB0: .4byte 0x02016024\n\ +_0802ABB4: .4byte sUnknown_081FACFE\n\ +_0802ABB8: .4byte gHitMarker\n\ +_0802ABBC: .4byte 0xfffffbff\n\ +_0802ABC0: .4byte gRandomMove\n\ +_0802ABC4: .4byte gBankTarget\n\ +_0802ABC8: .4byte gBattlescriptCurrInstr\n\ +_0802ABCC:\n\ + ldr r3, _0802ABF8 @ =gBattlescriptCurrInstr\n\ + ldr r2, [r3]\n\ + ldrb r1, [r2, 0x1]\n\ + ldrb r0, [r2, 0x2]\n\ + lsls r0, 8\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x3]\n\ + lsls r0, 16\n\ + orrs r1, r0\n\ + ldrb r0, [r2, 0x4]\n\ + lsls r0, 24\n\ + orrs r1, r0\n\ + str r1, [r3]\n\ +_0802ABE6:\n\ + add sp, 0x8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0802ABF8: .4byte gBattlescriptCurrInstr\n\ + .syntax divided"); +} + +#endif // NONMATCHING + +static void atkDF_setmagiccoat(void) +{ + gBankTarget = gBankAttacker; + gSpecialStatuses[gBankAttacker].flag20 = 1; + if (gCurrentMoveTurn == gNoOfAllBanks - 1) //last turn + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + { + gProtectStructs[gBankAttacker].bounceMove = 1; + gBattlescriptCurrInstr += 5; + } +} + +static void atkE0_setstealstatchange(void) +{ + gSpecialStatuses[gBankAttacker].flag20 = 1; + if (gCurrentMoveTurn == gNoOfAllBanks - 1) //last turn + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + { + gProtectStructs[gBankAttacker].stealMove = 1; + gBattlescriptCurrInstr += 5; + } +} + +static void atkE1_intimidate_string_loader(void) +{ + u8 side; + + BATTLE_STRUCT->scriptingActive = ewram[0x160dd]; + side = GetBankSide(BATTLE_STRUCT->scriptingActive); + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 9; + gBattleTextBuff1[2] = gBattleMons[BATTLE_STRUCT->scriptingActive].ability; + gBattleTextBuff1[3] = 0xFF; + + for (;gBankTarget < gNoOfAllBanks; gBankTarget++) + { + if (GetBankSide(gBankTarget) == side) + continue; + if (!(gAbsentBankFlags & gBitTable[gBankTarget])) + break; + } + + if (gBankTarget >= gNoOfAllBanks) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; +} + +static void atkE2_switchout_abilities(void) +{ + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + switch (gBattleMons[gActiveBank].ability) + { + case ABILITY_NATURAL_CURE: + gBattleMons[gActiveBank].status1 = 0; + EmitSetAttributes(0, REQUEST_STATUS_BATTLE, gBitTable[ewram[gActiveBank + 0x16064]], 4, &gBattleMons[gActiveBank].status1); + MarkBufferBankForExecution(gActiveBank); + break; + } + gBattlescriptCurrInstr += 2; +} + +static void atkE3_jumpiffainted(void) +{ + gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + if (gBattleMons[gActiveBank].hp == 0) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + else + gBattlescriptCurrInstr += 6; +} + +static void atkE4_getsecretpowereffect(void) +{ + switch (gBattleTerrain) + { + case 0: + gBattleCommunication[MOVE_EFFECT_BYTE] = 2; + break; + case 1: + gBattleCommunication[MOVE_EFFECT_BYTE] = 1; + break; + case 2: + gBattleCommunication[MOVE_EFFECT_BYTE] = 27; + break; + case 3: + gBattleCommunication[MOVE_EFFECT_BYTE] = 23; + break; + case 4: + gBattleCommunication[MOVE_EFFECT_BYTE] = 22; + break; + case 5: + gBattleCommunication[MOVE_EFFECT_BYTE] = 24; + break; + case 6: + gBattleCommunication[MOVE_EFFECT_BYTE] = 7; + break; + case 7: + gBattleCommunication[MOVE_EFFECT_BYTE] = 8; + break; + default: + gBattleCommunication[MOVE_EFFECT_BYTE] = 5; + break; + } + gBattlescriptCurrInstr++; +} + +static void atkE5_pickup(void) +{ + int i; + for (i = 0; i < 6; i++) + { + u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); + u16 held_item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + u8 ability; + if (GetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY)) + ability = gBaseStats[species].ability2; + else + ability = gBaseStats[species].ability1; + + if (ability == ABILITY_PICKUP && species != 0 && species != SPECIES_EGG && held_item == 0 && (Random() % 10) == 0) + { + s32 chance = Random() % 100; + s32 j; + for (j = 0; j < 18; j += 2) + { + if (sPickupItems[j + 1] > chance) + break; + } + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, (const void*) &sPickupItems[j]); + } + } + gBattlescriptCurrInstr++; +} + +static void atkE6_castform_change_animation(void) +{ + gActiveBank = BATTLE_STRUCT->scriptingActive; + if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE) + BATTLE_STRUCT->castformToChangeInto |= 0x80; + EmitBattleAnimation(0, 0, BATTLE_STRUCT->castformToChangeInto); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr++; +} + +static void atkE7_castform_data_change(void) +{ + u8 form; + gBattlescriptCurrInstr++; + form = castform_switch(BATTLE_STRUCT->scriptingActive); + if (form) + { + b_push_move_exec(gUnknown_081D977D); + BATTLE_STRUCT->castformToChangeInto = form - 1; + } +} + +static void atkE8_settypebasedhalvers(void) //water/mud sport +{ + bool8 worked = FALSE; + if (gBattleMoves[gCurrentMove].effect == EFFECT_MUD_SPORT) + { + if (!(gStatuses3[gBankAttacker] & STATUS3_MUDSPORT)) + { + gStatuses3[gBankAttacker] |= STATUS3_MUDSPORT; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + worked = TRUE; + } + } + else //water sport + { + if (!(gStatuses3[gBankAttacker] & STATUS3_WATERSPORT)) + { + gStatuses3[gBankAttacker] |= STATUS3_WATERSPORT; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + worked = TRUE; + } + } + if (worked) + gBattlescriptCurrInstr += 5; + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atkE9_setweatherballtype(void) +{ + if (WEATHER_HAS_EFFECT) + { + if ((u8)(gBattleWeather)) + BATTLE_STRUCT->dmgMultiplier = 2; + if (gBattleWeather & WEATHER_RAIN_ANY) + BATTLE_STRUCT->dynamicMoveType = TYPE_WATER | 0x80; + else if (gBattleWeather & WEATHER_SANDSTORM_ANY) + BATTLE_STRUCT->dynamicMoveType = TYPE_ROCK | 0x80; + else if (gBattleWeather & WEATHER_SUN_ANY) + BATTLE_STRUCT->dynamicMoveType = TYPE_FIRE | 0x80; + else if (gBattleWeather & WEATHER_HAIL) + BATTLE_STRUCT->dynamicMoveType = TYPE_ICE | 0x80; + else + BATTLE_STRUCT->dynamicMoveType = TYPE_NORMAL | 0x80; + } + gBattlescriptCurrInstr++; +} + +static void atkEA_recycleitem(void) +{ + u16* used_item; + gActiveBank = gBankAttacker; + used_item = USED_HELD_ITEM(gActiveBank); + if (*used_item && gBattleMons[gActiveBank].item == 0) + { + gLastUsedItem = *used_item; + *used_item = 0; + gBattleMons[gActiveBank].item = gLastUsedItem; + EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 5; + } + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atkEB_settypetoterrain(void) +{ + if (gBattleMons[gBankAttacker].type1 != sTerrainToType[gBattleTerrain] && gBattleMons[gBankAttacker].type2 != sTerrainToType[gBattleTerrain]) + { + gBattleMons[gBankAttacker].type1 = sTerrainToType[gBattleTerrain]; + gBattleMons[gBankAttacker].type2 = sTerrainToType[gBattleTerrain]; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 3; + gBattleTextBuff1[2] = sTerrainToType[gBattleTerrain]; + gBattleTextBuff1[3] = 0xFF; + gBattlescriptCurrInstr += 5; + } + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atkEC_pursuit_sth(void) +{ + gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank]) && gActionForBanks[gActiveBank] == 0 && gChosenMovesByBanks[gActiveBank] == MOVE_PURSUIT) + { + gUnknown_02024A76[gActiveBank] = 11; + gCurrentMove = MOVE_PURSUIT; + gBattlescriptCurrInstr += 5; + BATTLE_STRUCT->animTurn = 1; + BATTLE_STRUCT->unk160A7 = gBankAttacker; + gBankAttacker = gActiveBank; + } + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); +} + +static void atkED_802B4B4(void) +{ + gEffectBank = gBankAttacker; + if (gBankAttacker == gBankTarget) + gBankAttacker = gBankTarget = BATTLE_STRUCT->scriptingActive; + else + gBankTarget = BATTLE_STRUCT->scriptingActive; + BATTLE_STRUCT->scriptingActive = gEffectBank; + gBattlescriptCurrInstr++; +} + +static void atkEE_removelightscreenreflect(void) //brick break +{ + u8 side = GetBankSide(gBankAttacker) ^ 1; + if (gSideTimer[side].reflectTimer || gSideTimer[side].lightscreenTimer) + { + gSideAffecting[side] &= ~(SIDE_STATUS_REFLECT); + gSideAffecting[side] &= ~(SIDE_STATUS_LIGHTSCREEN); + gSideTimer[side].reflectTimer = 0; + gSideTimer[side].lightscreenTimer = 0; + BATTLE_STRUCT->animTurn = 1; + BATTLE_STRUCT->animTargetsHit = 1; + } + else + { + BATTLE_STRUCT->animTurn = 0; + BATTLE_STRUCT->animTargetsHit = 0; + } + gBattlescriptCurrInstr++; +} + +void atkEF_pokeball_catch_calculation(void) +{ + u8 ball_multiplier = 0; + if (gBattleExecBuffer) + return; + + gActiveBank = gBankAttacker; + gBankTarget = gBankAttacker ^ 1; + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + EmitBallThrowAnim(0, 5); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; + } + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) + { + EmitBallThrowAnim(0, 4); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr = BattleScript_WallyBallThrow; + } + else + { + u32 odds; + u8 catch_rate; + if (gLastUsedItem == ITEM_SAFARI_BALL) + catch_rate = BATTLE_STRUCT->unk16089 * 1275 / 100; //correct the name to safariFleeRate + else + catch_rate = gBaseStats[gBattleMons[gBankTarget].species].catchRate; + if (gLastUsedItem > 5) + { + switch (gLastUsedItem) + { + case ITEM_NET_BALL: + if (gBattleMons[gBankTarget].type1 == TYPE_WATER || gBattleMons[gBankTarget].type2 == TYPE_WATER || gBattleMons[gBankTarget].type1 == TYPE_BUG || gBattleMons[gBankTarget].type2 == TYPE_BUG) + ball_multiplier = 30; + else + ball_multiplier = 10; + break; + case ITEM_DIVE_BALL: + if (sav1_map_get_light_level() == 5) + ball_multiplier = 35; + else + ball_multiplier = 10; + break; + case ITEM_NEST_BALL: + if (gBattleMons[gBankTarget].level <= 39) + { + ball_multiplier = 40 - gBattleMons[gBankTarget].level; + if (ball_multiplier <= 9) + ball_multiplier = 10; + } + else + ball_multiplier = 10; + break; + case ITEM_REPEAT_BALL: + if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) + ball_multiplier = 30; + else + ball_multiplier = 10; + break; + case ITEM_TIMER_BALL: + ball_multiplier = gBattleResults.battleTurnCounter + 10; + if (ball_multiplier > 40) + ball_multiplier = 40; + break; + case ITEM_LUXURY_BALL: + case ITEM_PREMIER_BALL: + ball_multiplier = 10; + break; + } + } + else + ball_multiplier = sBallCatchBonuses[gLastUsedItem - 2]; + + odds = (catch_rate * ball_multiplier / 10) * (gBattleMons[gBankTarget].maxHP * 3 - gBattleMons[gBankTarget].hp * 2) / (3 * gBattleMons[gBankTarget].maxHP); + if (gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE)) + odds *= 2; + if (gBattleMons[gBankTarget].status1 & (STATUS_POISON | STATUS_BURN | STATUS_PARALYSIS /*| STATUS_TOXIC_POISON */)) //nice one gf + odds = (odds * 15) / 10; + + if (gLastUsedItem != ITEM_SAFARI_BALL) + { + if (gLastUsedItem == ITEM_MASTER_BALL) + { + gBattleResults.unk5_1 = 1; + } + else + { + if (gBattleResults.unk36[gLastUsedItem - ITEM_ULTRA_BALL] < 0xFF) + gBattleResults.unk36[gLastUsedItem - ITEM_ULTRA_BALL]++; + } + } + if (odds > 254) //poke caught + { + EmitBallThrowAnim(0, 4); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; + SetMonData(&gEnemyParty[gBattlePartyID[gBankTarget]], MON_DATA_POKEBALL, (const void*) &gLastUsedItem); + if (CalculatePlayerPartyCount() == 6) + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else //poke may be caught, calculate shakes + { + u8 shakes; + odds = Sqrt(Sqrt(16711680 / odds)); + odds = 1048560 / odds; + for (shakes = 0; shakes < 4 && Random() < odds; shakes++) {} + if (gLastUsedItem == ITEM_MASTER_BALL) + shakes = 4; //why calculate the shakes before that check? + EmitBallThrowAnim(0, shakes); + MarkBufferBankForExecution(gActiveBank); + if (shakes == 4) //poke caught, copy of the code above + { + gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; + SetMonData(&gEnemyParty[gBattlePartyID[gBankTarget]], MON_DATA_POKEBALL, (const void*) &gLastUsedItem); + if (CalculatePlayerPartyCount() == 6) + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else //rip + { + gBattleCommunication[MULTISTRING_CHOOSER] = shakes; + gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; + } + } + } +} + +static void atkF0_copy_caught_poke(void) +{ + GiveMonToPlayer(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]]); + gBattleResults.caughtPoke = gBattleMons[gBankAttacker ^ 1].species; + GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleResults.caughtNick); + gBattlescriptCurrInstr++; +} + +static void atkF1_setpoke_as_caught(void) +{ + if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + else + { + GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 3); + if (gBattleMons[gBankTarget].species == SPECIES_UNOWN) + gSaveBlock2.pokedex.unownPersonality = gBattleMons[gBankTarget].personality; + if (gBattleMons[gBankTarget].species == SPECIES_SPINDA) //else if + gSaveBlock2.pokedex.spindaPersonality = gBattleMons[gBankTarget].personality; + gBattlescriptCurrInstr += 5; + } +} + +extern const u32 gBattleTerrainTiles_Building[]; +extern const u32 gBattleTerrainTilemap_Building[]; +extern const u32 gBattleTerrainPalette_BattleTower[]; + +static void atkF2_display_dex_info(void) +{ + switch (gBattleCommunication[0]) + { + case 0: + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gBattleCommunication[0]++; + break; + case 1: + if (!gPaletteFade.active) + { + gBattleCommunication[1] = sub_809070C(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), gBattleMons[gBankTarget].otId, gBattleMons[gBankTarget].personality); + gBattleCommunication[0]++; + } + break; + case 2: + if (!gPaletteFade.active && gMain.callback2 == sub_800F808 && !gTasks[gBattleCommunication[1]].isActive) + { + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(0x06008000)); + LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(0x0600d000)); + LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); + REG_BG3CNT = 0x5a0b; + gUnknown_030041B0 = 0x100; + BeginNormalPaletteFade(0xfffc, 0, 0x10, 0, 0); + gBattleCommunication[0]++; + } + break; + case 3: + if (!gPaletteFade.active) + gBattlescriptCurrInstr++; + break; + } +} + +__attribute__((naked)) +void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + ldr r4, [sp, 0x20]\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r12, r1\n\ + lsls r2, 24\n\ + lsrs r5, r2, 24\n\ + lsls r3, 24\n\ + lsrs r7, r3, 24\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + mov r8, r4\n\ + mov r2, r12\n\ + cmp r2, r7\n\ + bgt _0802BC5A\n\ + lsls r1, r6, 1\n\ + ldr r0, _0802BC20 @ =0x0600c000\n\ + adds r1, r0\n\ + mov r9, r1\n\ +_0802BC06:\n\ + adds r1, r6, 0\n\ + adds r0, r2, 0x1\n\ + mov r10, r0\n\ + cmp r1, r5\n\ + bgt _0802BC54\n\ + lsls r0, r2, 6\n\ + mov r4, r9\n\ + adds r3, r4, r0\n\ +_0802BC16:\n\ + cmp r2, r12\n\ + bne _0802BC28\n\ + ldr r0, _0802BC24 @ =0x00001022\n\ + b _0802BC36\n\ + .align 2, 0\n\ +_0802BC20: .4byte 0x0600c000\n\ +_0802BC24: .4byte 0x00001022\n\ +_0802BC28:\n\ + cmp r2, r7\n\ + bne _0802BC34\n\ + ldr r0, _0802BC30 @ =0x00001028\n\ + b _0802BC36\n\ + .align 2, 0\n\ +_0802BC30: .4byte 0x00001028\n\ +_0802BC34:\n\ + ldr r0, _0802BC68 @ =0x00001025\n\ +_0802BC36:\n\ + cmp r1, r6\n\ + beq _0802BC42\n\ + adds r0, 0x1\n\ + cmp r1, r5\n\ + bne _0802BC42\n\ + adds r0, 0x1\n\ +_0802BC42:\n\ + mov r4, r8\n\ + cmp r4, 0\n\ + beq _0802BC4A\n\ + movs r0, 0\n\ +_0802BC4A:\n\ + strh r0, [r3]\n\ + adds r3, 0x2\n\ + adds r1, 0x1\n\ + cmp r1, r5\n\ + ble _0802BC16\n\ +_0802BC54:\n\ + mov r2, r10\n\ + cmp r2, r7\n\ + ble _0802BC06\n\ +_0802BC5A:\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0802BC68: .4byte 0x00001025\n\ + .syntax divided"); +} + +void sub_802BC6C(void) +{ + sub_814A880(0xC8, ((gBattleCommunication[1] << 28) + 1207959552) >> 24); //what could that be? +} + +void nullsub_6(void) +{ + return; +} + +static void atkF3_nickname_caught_poke(void) +{ + switch (gBattleCommunication[0]) + { + case 0: + sub_8023A80(); + gBattleCommunication[0]++; + gBattleCommunication[1] = 0; + sub_802BC6C(); + break; + case 1: + if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) + { + PlaySE(SE_SELECT); + nullsub_6(); + gBattleCommunication[1] = 0; + sub_802BC6C(); + } + if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) + { + PlaySE(SE_SELECT); + nullsub_6(); + gBattleCommunication[1] = 1; + sub_802BC6C(); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gBattleCommunication[1] == 0) + { + gBattleCommunication[0]++; + BeginFastPaletteFade(3); + } + else + gBattleCommunication[0] = 4; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gBattleCommunication[0] = 4; + } + break; + case 2: + if (!gPaletteFade.active) + { + GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, BATTLE_STRUCT->caughtNick); + DoNamingScreen(2, BATTLE_STRUCT->caughtNick, GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]]), GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_PERSONALITY, 0), sub_800F808); + gBattleCommunication[0]++; + } + break; + case 3: + if (gMain.callback2 == sub_800F808 && !gPaletteFade.active ) + { + SetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, BATTLE_STRUCT->caughtNick); + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + } + break; + case 4: + if (CalculatePlayerPartyCount() == 6) + gBattlescriptCurrInstr += 5; + else + gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + break; + } +} + +static void atkF4_802BEF0(void) +{ + gBattleMons[gBankAttacker].hp -= gBattleMoveDamage; + gBattlescriptCurrInstr++; +} + +static void atkF5_removeattackerstatus1(void) +{ + gBattleMons[gBankAttacker].status1 = 0; + gBattlescriptCurrInstr++; +} + +static void atkF6_802BF48(void) +{ + gFightStateTracker = 0xC; +} + +static void atkF7_802BF54(void) +{ + gFightStateTracker = 0xC; + gCurrentMoveTurn = gNoOfAllBanks; +} diff --git a/src/battle/battle_6.c b/src/battle/battle_6.c new file mode 100644 index 000000000..c833aef5e --- /dev/null +++ b/src/battle/battle_6.c @@ -0,0 +1,1507 @@ +#include "global.h" +#include "battle.h" +#include "battle_interface.h" +#include "battle_message.h" +#include "data2.h" +#include "menu_cursor.h" +#include "palette.h" +#include "pokemon.h" +#include "rom3.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "util.h" + +//Possibly PokemonSubstruct1 +struct UnknownStruct3 +{ + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; +}; + +extern u16 gUnknown_030042A4; +extern u16 gUnknown_030042A0; + +extern struct Window gUnknown_03004210; + +extern void (*gBattleBankFunc[])(void); + +extern u8 gActiveBank; +extern u8 gActionSelectionCursor[]; +extern u8 gDisplayedStringBattle[]; +extern u8 gMoveSelectionCursor[]; +extern u8 gBattleBufferA[][0x200]; +extern u8 gBankInMenu; +extern u16 gBattlePartyID[]; +extern u8 gHealthboxIDs[]; +extern u8 gDoingBattleAnim; +extern u8 gObjectBankIDs[]; +extern u16 gBattleTypeFlags; +extern u8 gBattleOutcome; +extern void (*gAnimScriptCallback)(void); +extern bool8 gAnimScriptActive; +extern u16 gMovePowerMoveAnim; +extern u32 gMoveDmgMoveAnim; +extern u8 gHappinessMoveAnim; +extern u16 gWeatherMoveAnim; +extern u32 *gDisableStructMoveAnim; +extern u32 gPID_perBank[]; +extern u8 gBattleMonForms[]; +extern u16 gUnknown_02024DE8; +extern u8 gUnknown_02024E68[]; +extern struct SpriteTemplate gUnknown_02024E8C; +extern u8 gUnknown_0202F7C4; +extern u8 gUnknown_02038470[]; +extern u16 gUnknown_030041B0; +extern u16 gUnknown_030041B4; +extern u16 gUnknown_030041B8; +extern u16 gUnknown_03004280; +extern u16 gUnknown_03004288; +extern u16 gUnknown_030042A4; +extern u16 gUnknown_030042C0; +extern u8 gUnknown_03004344; +extern u8 gUnknown_0300434C[]; + +extern const u8 gUnknown_08400CA8[]; +extern const u8 gUnknown_08400CF3[]; +extern const u8 gUnknown_08400D38[]; + +#if ENGLISH +#define SUB_803037C_TILE_DATA_OFFSET 440 +#elif GERMAN +#define SUB_803037C_TILE_DATA_OFFSET 444 +#endif + +extern void sub_802C68C(void); +extern void sub_802E1B0(void); +extern void sub_802E3B4(); +extern void sub_802E220(); +extern void sub_802E2D4(); +extern void sub_802E004(void); +extern void sub_802DF30(void); +extern void BattleMusicStop(void); +extern void PlayerBufferExecCompleted(void); +extern void bx_t1_healthbar_update(void); +extern void nullsub_91(void); +extern void sub_802D924(u8); +extern void sub_802E434(void); +extern bool8 mplay_80342A4(u8); +extern void move_anim_start_t2_for_situation(); +extern void bx_blink_t1(void); +extern void sub_8047858(); +extern u8 GetBankSide(u8); +extern void sub_80E43C0(); +extern void oamt_add_pos2_onto_pos1(); +extern void sub_8078B34(struct Sprite *); +extern void oamt_set_x3A_32(); +extern void sub_80318FC(); +extern bool8 IsDoubleBattle(void); +extern void sub_802D500(void); +extern void dp11b_obj_free(); +extern bool8 sub_8078874(u8); +extern bool8 move_anim_start_t3(); +extern void sub_802E460(void); +extern void b_link_standby_message(void); +extern void sub_802D18C(void); +extern void sub_802DF18(void); +extern void BufferStringBattle(); +extern void sub_80326EC(); +extern void ExecuteMoveAnim(); +extern void sub_8031F24(void); +extern void sub_80324BC(); +extern u8 sub_8031720(); +extern void bx_wait_t1(void); +extern u8 GetBankByPlayerAI(u8); +extern void sub_802DE10(void); +extern void sub_80105EC(struct Sprite *); +extern void sub_802D274(void); +extern void sub_802D23C(void); +extern u8 GetBankIdentity(u8); +extern void sub_8031AF4(); +extern void sub_80313A0(struct Sprite *); +extern void sub_802D204(void); +extern u8 sub_8079E90(); +extern void sub_802DEAC(void); +extern void sub_80312F0(struct Sprite *); +extern u8 sub_8077ABC(); +extern u8 sub_8077F68(); +extern u8 sub_8046400(); +extern void sub_802D798(void); +extern void bx_0802E404(void); + +u32 dp01_getattr_by_ch1_for_player_pokemon_(u8, u8 *); +void dp01_setattr_by_ch1_for_player_pokemon(u8); +void sub_802F934(u8, u8); +void sub_802FB2C(void); +void sub_8030190(void); +void sub_80304A8(void); +void sub_8030E38(struct Sprite *); +void task05_08033660(u8); +void sub_8031064(void); + +void PlayerHandleGetAttributes(void) +{ + u8 unkData[0x100]; + u32 offset = 0; + u8 r4; + s32 i; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + offset += dp01_getattr_by_ch1_for_player_pokemon_(gBattlePartyID[gActiveBank], unkData); + } + else + { + r4 = gBattleBufferA[gActiveBank][2]; + for (i = 0; i < 6; i++) + { + if (r4 & 1) + offset += dp01_getattr_by_ch1_for_player_pokemon_(i, unkData + offset); + r4 >>= 1; + } + } + dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, offset, unkData); + PlayerBufferExecCompleted(); +} + +// Duplicate of dp01_getattr_by_ch1_for_player_pokemon +u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) +{ + struct BattlePokemon battlePokemon; + struct UnknownStruct3 moveData; + u8 nickname[20]; + u8 *src; + s16 data16; + u32 data32; + s32 size = 0; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); + battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); + for (size = 0; size < 4; size++) + { + battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); + battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + } + battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); + battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP); + battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); + battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); + battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); + battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP); + battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); + battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); + battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); + battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); + battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); + battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); + battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY); + battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); + GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); + StringCopy10(battlePokemon.nickname, nickname); + GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); + src = (u8 *)&battlePokemon; + for (size = 0; size < sizeof(battlePokemon); size++) + buffer[size] = src[size]; + break; + case 1: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 2: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 3: + for (size = 0; size < 4; size++) + { + moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); + moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + } + moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + src = (u8 *)&moveData; + for (size = 0; size < sizeof(moveData); size++) + buffer[size] = src[size]; + break; + case 4: + case 5: + case 6: + case 7: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 8: + for (size = 0; size < 4; size++) + buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + size++; + break; + case 9: + case 10: + case 11: + case 12: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); + size = 1; + break; + case 17: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 18: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 19: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV); + size = 1; + break; + case 20: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV); + size = 1; + break; + case 21: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV); + size = 1; + break; + case 22: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV); + size = 1; + break; + case 23: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV); + size = 1; + break; + case 24: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV); + size = 1; + break; + case 25: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); + size = 1; + break; + case 26: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS); + size = 1; + break; + case 27: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION); + size = 1; + break; + case 28: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL); + size = 1; + break; + case 29: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME); + size = 1; + break; + case 30: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL); + size = 1; + break; + case 31: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + size = 6; + break; + case 32: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + size = 1; + break; + case 33: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + size = 1; + break; + case 34: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + size = 1; + break; + case 35: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + size = 1; + break; + case 36: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + size = 1; + break; + case 37: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + size = 1; + break; + case 38: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 39: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 40: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 41: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); + size = 1; + break; + case 42: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 43: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 44: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 45: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 46: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 47: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 48: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 49: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL); + size = 1; + break; + case 50: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY); + size = 1; + break; + case 51: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE); + size = 1; + break; + case 52: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART); + size = 1; + break; + case 53: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH); + size = 1; + break; + case 54: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN); + size = 1; + break; + case 55: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON); + size = 1; + break; + case 56: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON); + size = 1; + break; + case 57: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON); + size = 1; + break; + case 58: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON); + size = 1; + break; + case 59: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON); + size = 1; + break; + } + return size; +} + +void sub_802ECF0(void) +{ + struct BattlePokemon battleMon; // I think this is a BattlePokemon + u8 *src = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; + u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBank][1]; + u8 i; + + for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) + dst[i] = src[i]; + dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, gBattleBufferA[gActiveBank][2], dst); + PlayerBufferExecCompleted(); +} + +void PlayerHandleSetAttributes(void) +{ + u8 r4; + u8 i; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + dp01_setattr_by_ch1_for_player_pokemon(gBattlePartyID[gActiveBank]); + } + else + { + r4 = gBattleBufferA[gActiveBank][2]; + for (i = 0; i < 6; i++) + { + if (r4 & 1) + dp01_setattr_by_ch1_for_player_pokemon(i); + r4 >>= 1; + } + } + PlayerBufferExecCompleted(); +} + +// Duplicate of sub_811EC68 +void dp01_setattr_by_ch1_for_player_pokemon(u8 a) +{ + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; + struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; + s32 i; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + { + u8 iv; + + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + for (i = 0; i < 4; i++) + { + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + } + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); + SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + iv = battlePokemon->hpIV; + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); + iv = battlePokemon->attackIV; + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + iv = battlePokemon->defenseIV; + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + iv = battlePokemon->speedIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + iv = battlePokemon->spAttackIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + iv = battlePokemon->spDefenseIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); + SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); + SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); + SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); + SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + } + break; + case 1: + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); + break; + case 2: + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); + break; + case 3: + for (i = 0; i < 4; i++) + { + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + } + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); + break; + case 4: + case 5: + case 6: + case 7: + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); + break; + case 8: + SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); + break; + case 9: + case 10: + case 11: + case 12: + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); + break; + case 17: + SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); + break; + case 18: + SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); + break; + case 19: + SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 20: + SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 21: + SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 22: + SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 23: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 24: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 25: + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); + break; + case 26: + SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); + break; + case 27: + SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); + break; + case 28: + SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 29: + SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); + break; + case 30: + SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); + break; + case 31: + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); + break; + case 32: + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 33: + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 34: + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 35: + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 36: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 37: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 38: + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); + break; + case 39: + SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); + break; + case 40: + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); + break; + case 41: + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 42: + SetMonData(&gPlayerParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 43: + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 44: + SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); + break; + case 45: + SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); + break; + case 46: + SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); + break; + case 47: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); + break; + case 48: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); + break; + case 49: + SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); + break; + case 50: + SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); + break; + case 51: + SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); + break; + case 52: + SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); + break; + case 53: + SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); + break; + case 54: + SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); + break; + case 55: + SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 56: + SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 57: + SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 58: + SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 59: + SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + } + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); +} + +void sub_802F7CC(void) +{ + u8 *dst = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; + u8 i; + + for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) + dst[i] = gBattleBufferA[gActiveBank][3 + i]; + PlayerBufferExecCompleted(); +} + +void PlayerHandleLoadPokeSprite(void) +{ + sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + gBattleBankFunc[gActiveBank] = bx_0802E404; +} + +void PlayerHandleSendOutPoke(void) +{ + sub_8032AA8(gActiveBank, gBattleBufferA[gActiveBank][2]); + gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1]; + sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + gActionSelectionCursor[gActiveBank] = 0; + gMoveSelectionCursor[gActiveBank] = 0; + sub_802F934(gActiveBank, gBattleBufferA[gActiveBank][2]); + gBattleBankFunc[gActiveBank] = sub_802D798; +} + +void sub_802F934(u8 bank, u8 b) +{ + u16 species; + + sub_8032AA8(bank, b); + gBattlePartyID[bank] = gBattleBufferA[bank][1]; + species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0); + GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank)); + gObjectBankIDs[bank] = CreateSprite( + &gUnknown_02024E8C, + sub_8077ABC(bank, 2), + sub_8077F68(bank), + sub_8079E90(bank)); + gSprites[gUnknown_0300434C[bank]].data1 = gObjectBankIDs[bank]; + gSprites[gObjectBankIDs[bank]].data0 = bank; + gSprites[gObjectBankIDs[bank]].data2 = species; + gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; + StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); + gSprites[gObjectBankIDs[bank]].invisible = TRUE; + gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; + gSprites[gUnknown_0300434C[bank]].data0 = sub_8046400(0, 0xFF); +} + +void PlayerHandleReturnPokeToBall(void) +{ + if (gBattleBufferA[gActiveBank][1] == 0) + { + ewram17810[gActiveBank].unk4 = 0; + gBattleBankFunc[gActiveBank] = sub_802FB2C; + } + else + { + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8043DB0(gHealthboxIDs[gActiveBank]); + PlayerBufferExecCompleted(); + } +} + +void sub_802FB2C(void) +{ + switch (ewram17810[gActiveBank].unk4) + { + case 0: + if (ewram17800[gActiveBank].unk0_2) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + ewram17810[gActiveBank].unk4 = 1; + break; + case 1: + if (!ewram17810[gActiveBank].unk0_6) + { + ewram17810[gActiveBank].unk4 = 0; + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 1); + gBattleBankFunc[gActiveBank] = sub_802DEAC; + } + } +} + +void PlayerHandleTrainerThrow(void) +{ + s16 r7; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (GetBankIdentity(gActiveBank) & 2) + r7 = 16; + else + r7 = -16; + } + else + { + r7 = 0; + } + sub_8031AF4(gSaveBlock2.playerGender, gActiveBank); + GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + r7 + 80, + (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, + sub_8079E90(gActiveBank)); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; + gSprites[gObjectBankIDs[gActiveBank]].data0 = -2; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gBattleBankFunc[gActiveBank] = sub_802D204; +} + +void PlayerHandleTrainerSlide(void) +{ + sub_8031AF4(gSaveBlock2.playerGender, gActiveBank); + GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + 80, + (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, + 30); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96; + gSprites[gObjectBankIDs[gActiveBank]].data0 = 2; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gBattleBankFunc[gActiveBank] = sub_802D23C; +} + +void PlayerHandleTrainerSlideBack(void) +{ + oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); + gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; + gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; + gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; + oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); + gBattleBankFunc[gActiveBank] = sub_802D274; +} + +void sub_802FE7C(void) +{ + if (ewram17810[gActiveBank].unk4 == 0) + { + if (ewram17800[gActiveBank].unk0_2) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + ewram17810[gActiveBank].unk4++; + } + else + { + if (ewram17810[gActiveBank].unk0_6 == 0) + { + ewram17810[gActiveBank].unk4 = 0; + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + PlaySE12WithPanning(SE_POKE_DEAD, -64); + gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; + gSprites[gObjectBankIDs[gActiveBank]].data2 = 5; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80105EC; + gBattleBankFunc[gActiveBank] = sub_802DE10; + } + } +} + +void sub_802FF60(void) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0); + PlayerBufferExecCompleted(); +} + +void sub_802FF80(void) +{ + ewram17840.unk8 = 4; + gDoingBattleAnim = 1; + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3); + gBattleBankFunc[gActiveBank] = bx_wait_t1; +} + +void PlayerHandleBallThrow(void) +{ + u8 var = gBattleBufferA[gActiveBank][1]; + + ewram17840.unk8 = var; + gDoingBattleAnim = 1; + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3); + gBattleBankFunc[gActiveBank] = bx_wait_t1; +} + +void PlayerHandlePuase(void) +{ + u8 var = gBattleBufferA[gActiveBank][1]; + + // WTF is this?? + while (var != 0) + var--; + + PlayerBufferExecCompleted(); +} + +void PlayerHandleMoveAnimation(void) +{ + if (!mplay_80342A4(gActiveBank)) + { + u16 r0 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); + + gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; + gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8); + gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24); + gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; + gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8); + gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; + gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; + if (sub_8031720(r0, gUnknown_0202F7C4) != 0) + { + // Dead code. sub_8031720 always returns 0. + PlayerBufferExecCompleted(); + } + else + { + ewram17810[gActiveBank].unk4 = 0; + gBattleBankFunc[gActiveBank] = sub_8030190; + } + } +} + +void sub_8030190(void) +{ + u16 r4 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); + u8 r7 = gBattleBufferA[gActiveBank][11]; + + switch (ewram17810[gActiveBank].unk4) + { + case 0: + if (ewram17800[gActiveBank].unk0_2 == 1 && ewram17800[gActiveBank].unk0_3 == 0) + { + ewram17800[gActiveBank].unk0_3 = 1; + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + } + ewram17810[gActiveBank].unk4 = 1; + break; + case 1: + if (ewram17810[gActiveBank].unk0_6 == 0) + { + sub_80326EC(0); + ExecuteMoveAnim(r4); + ewram17810[gActiveBank].unk4 = 2; + } + break; + case 2: + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + sub_80326EC(1); + if (ewram17800[gActiveBank].unk0_2 == 1 && r7 < 2) + { + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); + ewram17800[gActiveBank].unk0_3 = 0; + } + ewram17810[gActiveBank].unk4 = 3; + } + break; + case 3: + if (ewram17810[gActiveBank].unk0_6 == 0) + { + sub_8031F24(); + sub_80324BC(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + ewram17810[gActiveBank].unk4 = 0; + PlayerBufferExecCompleted(); + } + break; + } +} + +void PlayerHandlePrintString(void) +{ + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); + sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); + gBattleBankFunc[gActiveBank] = sub_802DF18; +} + +void PlayerHandlePrintStringPlayerOnly(void) +{ + if (GetBankSide(gActiveBank) == 0) + PlayerHandlePrintString(); + else + PlayerBufferExecCompleted(); +} + +void sub_803037C(void) +{ + int r4; + + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 160; + FillWindowRect(&gUnknown_03004210, 10, 2, 15, 27, 18); + FillWindowRect(&gUnknown_03004210, 10, 2, 35, 16, 38); + + gBattleBankFunc[gActiveBank] = sub_802C098; + + InitWindow(&gUnknown_03004210, gUnknown_08400CF3, 400, 18, 35); + sub_8002F44(&gUnknown_03004210); + sub_814A5C0(0, 0xFFFF, 12, 11679, 0); + + for (r4 = 0; r4 < 4; r4++) + nullsub_8(r4); + + sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); + + StrCpyDecodeToDisplayedStringBattle((u8 *) gUnknown_08400CA8); + InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_803037C_TILE_DATA_OFFSET, 2, 35); + sub_8002F44(&gUnknown_03004210); +} + +void nullsub_42() +{ +} + +void sub_8030468(void) +{ + sub_814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); + sub_80304A8(); + gBattleBankFunc[gActiveBank] = sub_802C68C; +} + +void sub_80304A8(void) +{ + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 320; + sub_802E1B0(); + gUnknown_03004344 = 0xFF; + sub_802E3B4(gMoveSelectionCursor[gActiveBank], 0); + if (gBattleBufferA[gActiveBank][2] != 1) + { + InitWindow(&gUnknown_03004210, gUnknown_08400D38, 656, 23, 55); + sub_8002F44(&gUnknown_03004210); + } + sub_802E220(); + sub_802E2D4(); +} + +void PlayerHandleOpenBag(void) +{ + s32 i; + + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gBattleBankFunc[gActiveBank] = sub_802E004; + gBankInMenu = gActiveBank; + for (i = 0; i < 3; i++) + gUnknown_02038470[i] = gBattleBufferA[gActiveBank][1 + i]; +} + +void sub_8030594(void) +{ + s32 i; + + gUnknown_0300434C[gActiveBank] = CreateTask(TaskDummy, 0xFF); + gTasks[gUnknown_0300434C[gActiveBank]].data[0] = gBattleBufferA[gActiveBank][1] & 0xF; + ewram[0x16054] = gBattleBufferA[gActiveBank][1] >> 4; + ewram[0x1609D] = gBattleBufferA[gActiveBank][2]; + ewram[0x160C0] = gBattleBufferA[gActiveBank][3]; + for (i = 0; i < 3; i++) + gUnknown_02038470[i] = gBattleBufferA[gActiveBank][4 + i]; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gBattleBankFunc[gActiveBank] = sub_802DF30; + gBankInMenu = gActiveBank; +} + +void sub_8030674(void) +{ + BattleMusicStop(); + BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0); + PlayerBufferExecCompleted(); +} + +void PlayerHandleHealthBarUpdate(void) +{ + s16 r7; + + load_gfxc_health_bar(0); + r7 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + if (r7 != 0x7FFF) + { + u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + u32 curHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, curHP, r7); + } + else + { + u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); + sub_80440EC(gHealthboxIDs[gActiveBank], 0, 0); + } + gBattleBankFunc[gActiveBank] = bx_t1_healthbar_update; +} + +void PlayerHandleExpBarUpdate(void) +{ + u8 r7 = gBattleBufferA[gActiveBank][1]; + + if (GetMonData(&gPlayerParty[r7], MON_DATA_LEVEL) >= 100) + { + PlayerBufferExecCompleted(); + } + else + { + u16 r4; + u8 taskId; + + load_gfxc_health_bar(1); + GetMonData(&gPlayerParty[r7], MON_DATA_SPECIES); // unused return value + r4 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + taskId = CreateTask(sub_802D924, 10); + gTasks[taskId].data[0] = r7; + gTasks[taskId].data[1] = r4; + gTasks[taskId].data[2] = gActiveBank; + gBattleBankFunc[gActiveBank] = nullsub_91; + } +} + +void PlayerHandleStatusIconUpdate(void) +{ + if (!mplay_80342A4(gActiveBank)) + { + sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 9); + ewram17810[gActiveBank].unk0_4 = 0; + gBattleBankFunc[gActiveBank] = sub_802E434; + } +} + +void PlayerHandleStatusAnimation(void) +{ + if (!mplay_80342A4(gActiveBank)) + { + move_anim_start_t2_for_situation( + gBattleBufferA[gActiveBank][1], + gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24)); + gBattleBankFunc[gActiveBank] = sub_802E434; + } +} + +void PlayerHandleStatusXor(void) +{ + u8 val = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_STATUS) ^ gBattleBufferA[gActiveBank][1]; + + SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_STATUS, &val); + PlayerBufferExecCompleted(); +} + +void sub_803097C(void) +{ + PlayerBufferExecCompleted(); +} + +void PlayerHandleDMATransfer(void) +{ + u32 val1 = gBattleBufferA[gActiveBank][1] + | (gBattleBufferA[gActiveBank][2] << 8) + | (gBattleBufferA[gActiveBank][3] << 16) + | (gBattleBufferA[gActiveBank][4] << 24); + u16 val2 = gBattleBufferA[gActiveBank][5] | (gBattleBufferA[gActiveBank][6] << 8); + + const u8 *src = &gBattleBufferA[gActiveBank][7]; + u8 *dst = (u8 *)val1; + u32 size = val2; + + while (1) + { + if (size <= 0x1000) + { + DmaCopy16(3, src, dst, size); + break; + } + DmaCopy16(3, src, dst, 0x1000); + src += 0x1000; + dst += 0x1000; + size -= 0x1000; + } + PlayerBufferExecCompleted(); +} + +void sub_8030A3C(void) +{ + PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + PlayerBufferExecCompleted(); +} + +void sub_8030A6C(void) +{ + PlayerBufferExecCompleted(); +} + +void sub_8030A78(void) +{ + dp01_build_cmdbuf_x21_a_bb(1, 0, 0); + PlayerBufferExecCompleted(); +} + +void sub_8030A8C(void) +{ + dp01_build_cmdbuf_x22_a_three_bytes(1, 0, 0); + PlayerBufferExecCompleted(); +} + +void sub_8030AA0(void) +{ + dp01_build_cmdbuf_x23_aa_0(1, 0); + PlayerBufferExecCompleted(); +} + +void sub_8030AB4(void) +{ + dp01_build_cmdbuf_x24_aa_0(1, 0); + PlayerBufferExecCompleted(); +} + +void sub_8030AC8(void) +{ + gUnknown_020238C8.unk0_0 = 0; + PlayerBufferExecCompleted(); +} + +void sub_8030AE4(void) +{ + gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBank][1]; + PlayerBufferExecCompleted(); +} + +void sub_8030B1C(void) +{ + gUnknown_020238C8.unk0_7 = 0; + PlayerBufferExecCompleted(); +} + +void sub_8030B34(void) +{ + gUnknown_020238C8.unk0_7 ^= 1; + PlayerBufferExecCompleted(); +} + +void PlayerHandleHitAnimation(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) + { + PlayerBufferExecCompleted(); + } + else + { + gDoingBattleAnim = 1; + gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; + sub_8047858(gActiveBank); + gBattleBankFunc[gActiveBank] = bx_blink_t1; + } +} + +void sub_8030BCC(void) +{ + PlayerBufferExecCompleted(); +} + +void PlayerHandleEffectivenessSound(void) +{ + s8 pan; + + if (GetBankSide(gActiveBank) == 0) + pan = -64; + else + pan = 63; + PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan); + PlayerBufferExecCompleted(); +} + +void sub_8030C1C(void) +{ + PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + PlayerBufferExecCompleted(); +} + +void PlayerHandleFaintingCry(void) +{ + u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES); + + PlayCry3(species, -25, 5); + PlayerBufferExecCompleted(); +} + +void PlayerHandleIntroSlide(void) +{ + sub_80E43C0(gBattleBufferA[gActiveBank][1]); + gUnknown_02024DE8 |= 1; + PlayerBufferExecCompleted(); +} + +void PlayerHandleTrainerBallThrow(void) +{ + u8 paletteNum; + u8 taskId; + + oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); + gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; + gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; + gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; + gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; + oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); + StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); + paletteNum = AllocSpritePalette(0xD6F8); + LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2.playerGender].data, 0x100 + paletteNum * 16, 32); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = paletteNum; + taskId = CreateTask(task05_08033660, 5); + gTasks[taskId].data[0] = gActiveBank; + if (ewram17810[gActiveBank].unk0_0) + gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; + ewram17810[4].unk9 |= 1; + gBattleBankFunc[gActiveBank] = nullsub_91; +} + +void sub_8030E38(struct Sprite *sprite) +{ + u8 r4 = sprite->data5; + + FreeSpriteOamMatrix(sprite); + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); + DestroySprite(sprite); + sub_80318FC(&gPlayerParty[gBattlePartyID[r4]], r4); + StartSpriteAnim(&gSprites[gObjectBankIDs[r4]], 0); +} + +void task05_08033660(u8 taskId) +{ + if (gTasks[taskId].data[1] < 31) + { + gTasks[taskId].data[1]++; + } + else + { + u8 savedActiveBank = gActiveBank; + + gActiveBank = gTasks[taskId].data[0]; + if (!IsDoubleBattle() || (gBattleTypeFlags & 0x40)) + { + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_802F934(gActiveBank, 0); + } + else + { + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_802F934(gActiveBank, 0); + gActiveBank ^= 2; + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + sub_802F934(gActiveBank, 0); + gActiveBank ^= 2; + } + gBattleBankFunc[gActiveBank] = sub_802D500; + gActiveBank = savedActiveBank; + DestroyTask(taskId); + } +} + +void sub_8030FAC(void) +{ + if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) + { + PlayerBufferExecCompleted(); + } + else + { + ewram17810[gActiveBank].unk0_0 = 1; + gUnknown_02024E68[gActiveBank] = sub_8044804(gActiveBank, (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]); + ewram17810[gActiveBank].unk5 = 0; + if (gBattleBufferA[gActiveBank][2] != 0) + ewram17810[gActiveBank].unk5 = 0x5D; + gBattleBankFunc[gActiveBank] = sub_8031064; + } +} + +void sub_8031064(void) +{ + if (ewram17810[gActiveBank].unk5++ > 0x5C) + { + ewram17810[gActiveBank].unk5 = 0; + PlayerBufferExecCompleted(); + } +} + +void sub_80310A4(void) +{ + if (ewram17810[gActiveBank].unk0_0) + gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; + PlayerBufferExecCompleted(); +} + +void sub_80310F0(void) +{ + dp11b_obj_free(gActiveBank, 1); + dp11b_obj_free(gActiveBank, 0); + PlayerBufferExecCompleted(); +} + +void PlayerHandleSpriteInvisibility(void) +{ + if (sub_8078874(gActiveBank)) + { + gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; + sub_8031F88(gActiveBank); + } + PlayerBufferExecCompleted(); +} + +void PlayerHandleBattleAnimation(void) +{ + if (!mplay_80342A4(gActiveBank)) + { + u8 val2 = gBattleBufferA[gActiveBank][1]; + u16 val = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + + if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, val2, val)) + PlayerBufferExecCompleted(); + else + gBattleBankFunc[gActiveBank] = sub_802E460; + } +} + +void PlayerHandleLinkStandbyMsg(void) +{ + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + b_link_standby_message(); + // fall through + case 1: + dp11b_obj_free(gActiveBank, 1); + dp11b_obj_free(gActiveBank, 0); + break; + case 2: + b_link_standby_message(); + break; + } + PlayerBufferExecCompleted(); +} + +void PlayerHandleResetActionMoveSelection(void) +{ + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + gActionSelectionCursor[gActiveBank] = 0; + gMoveSelectionCursor[gActiveBank] = 0; + break; + case 1: + gActionSelectionCursor[gActiveBank] = 0; + break; + case 2: + gMoveSelectionCursor[gActiveBank] = 0; + break; + } + PlayerBufferExecCompleted(); +} + +void sub_80312A0(void) +{ + gBattleOutcome = gBattleBufferA[gActiveBank][1]; + FadeOutMapMusic(5); + BeginFastPaletteFade(3); + PlayerBufferExecCompleted(); + gBattleBankFunc[gActiveBank] = sub_802D18C; +} + +void nullsub_43(void) +{ +} diff --git a/src/battle/battle_7.c b/src/battle/battle_7.c new file mode 100644 index 000000000..f2838467e --- /dev/null +++ b/src/battle/battle_7.c @@ -0,0 +1,1235 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "battle_interface.h" +#include "blend_palette.h" +#include "data2.h" +#include "decompress.h" +#include "main.h" +#include "m4a.h" +#include "palette.h" +#include "pokemon.h" +#include "rom_8077ABC.h" +#include "rom_8094928.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "sprite.h" +#include "task.h" +#include "text.h" +#include "gba/m4a_internal.h" + +struct Struct2019348 +{ + u8 filler0[2]; + u16 unk2; + u8 filler4[4]; + u32 unk8; + u32 unkC; + u32 unk10; +}; + +extern u8 gBattleBufferA[][0x200]; +extern u8 gActiveBank; +extern u32 gBattleExecBuffer; +extern u8 gNoOfAllBanks; +extern u16 gBattlePartyID[]; +extern u8 gBanksBySide[]; +extern u8 gObjectBankIDs[]; +extern u16 gUnknown_02024DE8; +extern u8 gDoingBattleAnim; +extern u32 gPID_perBank[]; +extern struct Window gUnknown_03004210; +extern void (*gBattleBankFunc[])(void); +extern u8 gHealthboxIDs[]; +extern u8 gUnknown_0300434C[]; +extern struct MusicPlayerInfo gMPlay_SE1; +extern struct MusicPlayerInfo gMPlay_SE2; +extern struct MusicPlayerInfo gMPlay_BGM; +extern u32 gBitTable[]; +extern u16 gBattleTypeFlags; +extern u8 gBattleMonForms[]; +extern u8 gBattleAnimPlayerMonIndex; +extern u8 gBattleAnimEnemyMonIndex; +extern void (*gAnimScriptCallback)(void); +extern u8 gAnimScriptActive; +extern const u8 *const gBattleAnims_Unknown1[]; +extern const u8 *const gBattleAnims_Unknown2[]; +extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; +extern const struct MonCoords gTrainerFrontPicCoords[]; +extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; +extern const u8 gSubstituteDollTilemap[]; +extern const u8 gSubstituteDollGfx[]; +extern const u8 gSubstituteDollPal[]; +extern const struct CompressedSpriteSheet gUnknown_081FAF24; +extern const struct SpriteTemplate gSpriteTemplate_81FAF34; +extern void (*const gOpponentBufferCommands[])(void); +extern const struct CompressedSpriteSheet gUnknown_0820A47C; +extern const struct CompressedSpriteSheet gUnknown_0820A484; +extern const struct CompressedSpriteSheet gUnknown_0820A48C[]; +extern const struct CompressedSpriteSheet gUnknown_0820A49C[]; +extern const struct CompressedSpriteSheet gUnknown_0820A4AC; +extern const struct CompressedSpriteSheet gUnknown_0820A4B4[]; +extern const struct SpritePalette gUnknown_0820A4D4[]; +extern const u8 gUnknown_08D09C48[]; + +#define ewram19348 (*(struct Struct2019348 *)(ewram + 0x19348)) + +extern void c3_0802FDF4(u8); +extern void sub_80440EC(); +extern void sub_804777C(); +extern void sub_8141828(); +extern u8 sub_8077ABC(); +extern u8 sub_8078874(u8); +extern u8 sub_8077F68(u8); +extern u8 sub_8077F7C(u8); +extern void sub_8094958(void); +extern void sub_80105DC(struct Sprite *); +extern void move_anim_start_t2(); + +void sub_80315E8(u8); +u8 sub_803163C(u8); +void sub_80316CC(u8); +void sub_8031F0C(void); +void refresh_graphics_maybe(u8, u8, u8); +void sub_80324E0(u8 a); +void sub_80327CC(void); +void sub_8032978(struct Sprite *); +void sub_80328A4(struct Sprite *); +void OpponentBufferRunCommand(void); +void sub_80332D0(void); +void OpponentBufferExecCompleted(void); + +void sub_80312F0(struct Sprite *sprite) +{ + u8 spriteId = sprite->data1; + + if (gSprites[spriteId].affineAnimEnded && !gSprites[spriteId].invisible) + { + if (gSprites[spriteId].animPaused) + gSprites[spriteId].animPaused = FALSE; + else if (gSprites[spriteId].animEnded) + { + gSprites[spriteId].callback = sub_80105DC; + StartSpriteAffineAnim(&gSprites[spriteId], 0); + sprite->callback = SpriteCallbackDummy; + } + } +} + +void unref_sub_8031364(struct Sprite *sprite, bool8 stupid) +{ + sprite->animPaused = TRUE; + sprite->callback = SpriteCallbackDummy; + if (!stupid) + StartSpriteAffineAnim(sprite, 1); + else + StartSpriteAffineAnim(sprite, 1); + AnimateSprite(sprite); +} + +void sub_80313A0(struct Sprite *sprite) +{ + if (!(gUnknown_02024DE8 & 1)) + { + sprite->pos2.x += sprite->data0; + if (sprite->pos2.x == 0) + sprite->callback = SpriteCallbackDummy; + } +} + +void move_anim_start_t2_for_situation(u8 a, u32 b) +{ + ewram17810[gActiveBank].unk0_4 = 1; + if (a == 0) + { + if (b == 0x20) + move_anim_start_t2(gActiveBank, 6); + else if (b == 8 || (b & 0x80)) + move_anim_start_t2(gActiveBank, 0); + else if (b == 0x10) + move_anim_start_t2(gActiveBank, 2); + else if (b & 7) + move_anim_start_t2(gActiveBank, 4); + else if (b == 0x40) + move_anim_start_t2(gActiveBank, 5); + else + ewram17810[gActiveBank].unk0_4 = 0; + } + else + { + if (b & 0x000F0000) + move_anim_start_t2(gActiveBank, 3); + else if (b & 7) + move_anim_start_t2(gActiveBank, 1); + else if (b & 0x10000000) + move_anim_start_t2(gActiveBank, 7); + else if (b & 0x08000000) + move_anim_start_t2(gActiveBank, 8); + else if (b & 0x0000E000) + move_anim_start_t2(gActiveBank, 9); + else + ewram17810[gActiveBank].unk0_4 = 0; + } +} + +bool8 move_anim_start_t3(u8 a, u8 b, u8 c, u8 d, u16 e) +{ + u8 taskId; + + if (d == 0 && (e & 0x80)) + { + gBattleMonForms[a] = e & 0x7F; + return TRUE; + } + if (ewram17800[a].unk0_2 && sub_803163C(d) == 0) + return TRUE; + if (ewram17800[a].unk0_2 && d == 2 && gSprites[gObjectBankIDs[a]].invisible) + { + refresh_graphics_maybe(a, 1, gObjectBankIDs[a]); + sub_80324E0(a); + return TRUE; + } + gBattleAnimPlayerMonIndex = b; + gBattleAnimEnemyMonIndex = c; + ewram17840.unk0 = e; + DoMoveAnim(gBattleAnims_Unknown1, d, 0); + taskId = CreateTask(sub_80315E8, 10); + gTasks[taskId].data[0] = a; + ewram17810[gTasks[taskId].data[0]].unk0_5 = 1; + return FALSE; +} + +void sub_80315E8(u8 taskId) +{ + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + ewram17810[gTasks[taskId].data[0]].unk0_5 = 0; + DestroyTask(taskId); + } +} + +u8 sub_803163C(u8 a) +{ + switch (a) + { + case 2: + case 10: + case 11: + case 12: + case 13: + case 17: + return 1; + default: + return 0; + } +} + +void move_anim_start_t4(u8 a, u8 b, u8 c, u8 d) +{ + u8 taskId; + + gBattleAnimPlayerMonIndex = b; + gBattleAnimEnemyMonIndex = c; + DoMoveAnim(gBattleAnims_Unknown2, d, 0); + taskId = CreateTask(sub_80316CC, 10); + gTasks[taskId].data[0] = a; + ewram17810[gTasks[taskId].data[0]].unk0_6 = 1; +} + +void sub_80316CC(u8 taskId) +{ + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + ewram17810[gTasks[taskId].data[0]].unk0_6 = 0; + DestroyTask(taskId); + } +} + +u8 sub_8031720(int unused1, int unused2) +{ + return 0; +} + +bool8 mplay_80342A4(u8 a) +{ + u8 zero = 0; + + if (IsSEPlaying()) + { + ewram17810[a].unk8++; + if (ewram17810[gActiveBank].unk8 < 30) + return TRUE; + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + } + if (zero == 0) + { + ewram17810[a].unk8 = 0; + return FALSE; + } + return TRUE; +} + +void sub_8031794(struct Pokemon *pkmn, u8 b) +{ + u32 personalityValue; + u16 species; + u32 r7; + u32 otId; + u8 var; + u16 paletteOffset; + const u8 *lzPaletteData; + + personalityValue = GetMonData(pkmn, MON_DATA_PERSONALITY); + if (ewram17800[b].unk2 == 0) + { + species = GetMonData(pkmn, MON_DATA_SPECIES); + r7 = personalityValue; + } + else + { + species = ewram17800[b].unk2; + r7 = gPID_perBank[b]; + } + otId = GetMonData(pkmn, MON_DATA_OT_ID); + var = GetBankIdentity(b); + HandleLoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, + gMonFrontPicCoords[species].y_offset, + 0x02000000, + gUnknown_081FAF4C[var], + species, + r7); + paletteOffset = 0x100 + b * 16; + if (ewram17800[b].unk2 == 0) + lzPaletteData = pokemon_get_pal(pkmn); + else + lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue); + sub_800D238(lzPaletteData, ewram); + LoadPalette(ewram, paletteOffset, 0x20); + LoadPalette(ewram, 0x80 + b * 16, 0x20); + if (species == SPECIES_CASTFORM) + { + paletteOffset = 0x100 + b * 16; + sub_800D238(lzPaletteData, ewram + 0x16400); + LoadPalette(ewram + 0x16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20); + } + if (ewram17800[b].unk2 != 0) + { + BlendPalette(paletteOffset, 16, 6, 0x7FFF); + CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); + } +} + +void sub_80318FC(struct Pokemon *pkmn, u8 b) +{ + u32 personalityValue; + u16 species; + u32 r7; + u32 otId; + u8 var; + u16 paletteOffset; + const u8 *lzPaletteData; + + personalityValue = GetMonData(pkmn, MON_DATA_PERSONALITY); + if (ewram17800[b].unk2 == 0) + { + species = GetMonData(pkmn, MON_DATA_SPECIES); + r7 = personalityValue; + } + else + { + species = ewram17800[b].unk2; + r7 = gPID_perBank[b]; + } + otId = GetMonData(pkmn, MON_DATA_OT_ID); + var = GetBankIdentity(b); + HandleLoadSpecialPokePic( + &gMonBackPicTable[species], + gMonBackPicCoords[species].coords, + gMonBackPicCoords[species].y_offset, + 0x02000000, + gUnknown_081FAF4C[var], + species, + r7); + paletteOffset = 0x100 + b * 16; + if (ewram17800[b].unk2 == 0) + lzPaletteData = pokemon_get_pal(pkmn); + else + lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue); + sub_800D238(lzPaletteData, ewram); + LoadPalette(ewram, paletteOffset, 0x20); + LoadPalette(ewram, 0x80 + b * 16, 0x20); + if (species == SPECIES_CASTFORM) + { + paletteOffset = 0x100 + b * 16; + sub_800D238(lzPaletteData, ewram + 0x16400); + LoadPalette(ewram + 0x16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20); + } + if (ewram17800[b].unk2 != 0) + { + BlendPalette(paletteOffset, 16, 6, 0x7FFF); + CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); + } +} + +void unref_sub_8031A64(void) +{ +} + +void nullsub_9(u16 unused) +{ +} + +void sub_8031A6C(u16 a, u8 b) +{ + u8 status; + struct CompressedSpriteSheet spriteSheet; + + status = GetBankIdentity(b); + DecompressPicFromTable_2( + &gTrainerFrontPicTable[a], + gTrainerFrontPicCoords[a].coords, + gTrainerFrontPicCoords[a].y_offset, + (void *)0x02000000, + gUnknown_081FAF4C[status], + 0); + spriteSheet.data = gUnknown_081FAF4C[status]; + spriteSheet.size = gTrainerFrontPicTable[a].size; + spriteSheet.tag = gTrainerFrontPicTable[a].tag; + LoadCompressedObjectPic(&spriteSheet); + LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[a]); +} + +void sub_8031AF4(u16 a, u8 b) +{ + u8 status; + + status = GetBankIdentity(b); + DecompressPicFromTable_2( + &gTrainerBackPicTable[a], + gTrainerBackPicCoords[a].coords, + gTrainerBackPicCoords[a].y_offset, + (void *)0x02000000, + gUnknown_081FAF4C[status], + 0); + LoadCompressedPalette(gTrainerBackPicPaletteTable[a].data, 0x100 + b * 16, 32); +} + +void nullsub_10(int unused) +{ +} + +void sub_8031B74(u16 a) +{ + FreeSpritePaletteByTag(gTrainerFrontPicPaletteTable[a].tag); + FreeSpriteTilesByTag(gTrainerFrontPicTable[a].tag); +} + +void unref_sub_8031BA0(void) +{ + u8 count; + u8 i; + + LoadSpritePalette(&gUnknown_0820A4D4[0]); + LoadSpritePalette(&gUnknown_0820A4D4[1]); + if (!IsDoubleBattle()) + { + LoadCompressedObjectPic(&gUnknown_0820A47C); + LoadCompressedObjectPic(&gUnknown_0820A484); + count = 2; + } + else + { + LoadCompressedObjectPic(&gUnknown_0820A48C[0]); + LoadCompressedObjectPic(&gUnknown_0820A48C[1]); + LoadCompressedObjectPic(&gUnknown_0820A49C[0]); + LoadCompressedObjectPic(&gUnknown_0820A49C[1]); + count = 4; + } + for (i = 0; i < count; i++) + LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[i]]); +} + +bool8 sub_8031C30(u8 a) +{ + bool8 retVal = FALSE; + + if (a != 0) + { + if (a == 1) + { + LoadSpritePalette(&gUnknown_0820A4D4[0]); + LoadSpritePalette(&gUnknown_0820A4D4[1]); + } + else if (!IsDoubleBattle()) + { + if (a == 2) + { + if (gBattleTypeFlags & 0x80) + LoadCompressedObjectPic(&gUnknown_0820A4AC); + else + LoadCompressedObjectPic(&gUnknown_0820A47C); + } + else if (a == 3) + LoadCompressedObjectPic(&gUnknown_0820A484); + else if (a == 4) + LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[0]]); + else if (a == 5) + LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[1]]); + else + retVal = TRUE; + } + else + { + if (a == 2) + LoadCompressedObjectPic(&gUnknown_0820A48C[0]); + else if (a == 3) + LoadCompressedObjectPic(&gUnknown_0820A48C[1]); + else if (a == 4) + LoadCompressedObjectPic(&gUnknown_0820A49C[0]); + else if (a == 5) + LoadCompressedObjectPic(&gUnknown_0820A49C[1]); + else if (a == 6) + LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[0]]); + else if (a == 7) + LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[1]]); + else if (a == 8) + LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[2]]); + else if (a == 9) + LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[3]]); + else + retVal = TRUE; + } + } + return retVal; +} + +void load_gfxc_health_bar(void) +{ + sub_800D238(gUnknown_08D09C48, (void *)0x02000000); +} + +u8 battle_load_something(u8 *pState, u8 *b) +{ + bool8 retVal = FALSE; + + switch (*pState) + { + case 0: + sub_8031F0C(); + (*pState)++; + break; + case 1: + if (sub_8031C30(*b) == 0) + { + (*b)++; + } + else + { + *b = 0; + (*pState)++; + } + break; + case 2: + (*pState)++; + break; + case 3: + if ((gBattleTypeFlags & 0x80) && *b == 0) + gHealthboxIDs[*b] = battle_make_oam_safari_battle(); + else + gHealthboxIDs[*b] = battle_make_oam_normal_battle(*b); + (*b)++; + if (*b == gNoOfAllBanks) + { + *b = 0; + (*pState)++; + } + break; + case 4: + sub_8043F44(*b); + if (gBanksBySide[*b] <= 1) + nullsub_11(gHealthboxIDs[*b], 0); + else + nullsub_11(gHealthboxIDs[*b], 1); + (*b)++; + if (*b == gNoOfAllBanks) + { + *b = 0; + (*pState)++; + } + break; + case 5: + if (GetBankSide(*b) == 0) + { + if (!(gBattleTypeFlags & 0x80)) + sub_8045A5C(gHealthboxIDs[*b], &gPlayerParty[gBattlePartyID[*b]], 0); + } + else + { + sub_8045A5C(gHealthboxIDs[*b], &gEnemyParty[gBattlePartyID[*b]], 0); + } + sub_8043DB0(gHealthboxIDs[*b]); + (*b)++; + if (*b == gNoOfAllBanks) + { + *b = 0; + (*pState)++; + } + break; + case 6: + sub_80327CC(); + sub_8094958(); + retVal = TRUE; + break; + } + return retVal; +} + +void sub_8031EE8(void) +{ + memset(ewram17810, 0, 0x30); + memset(&ewram17840, 0, 0x10); +} + +void sub_8031F0C(void) +{ + sub_8031EE8(); + memset(ewram17800, 0, 0x10); +} + +void sub_8031F24(void) +{ + s32 i; + + for (i = 0; i < gNoOfAllBanks; i++) + ewram17800[i].unk0_0 = gSprites[gObjectBankIDs[i]].invisible; +} + +void sub_8031F88(u8 a) +{ + ewram17800[a].unk0_0 = gSprites[gObjectBankIDs[a]].invisible; +} + +void sub_8031FC4(u8 a, u8 b, bool8 c) +{ + u16 paletteOffset; + u16 species; + u32 personalityValue; + u32 otId; + u8 r10; + const u8 *lzPaletteData; + + if (c) + { + StartSpriteAnim(&gSprites[gObjectBankIDs[a]], ewram17840.unk0); + paletteOffset = 0x100 + a * 16; + LoadPalette(ewram + 0x16400 + ewram17840.unk0 * 32, paletteOffset, 32); + gBattleMonForms[a] = ewram17840.unk0; + if (ewram17800[a].unk2 != 0) + { + BlendPalette(paletteOffset, 16, 6, 0x7FFF); + CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); + } + gSprites[gObjectBankIDs[a]].pos1.y = sub_8077F68(a); + } + else + { + const void *src; + void *dst; + + if (IsContest()) + { + r10 = 0; + species = ewram19348.unk2; + personalityValue = ewram19348.unk8; + otId = ewram19348.unkC; + HandleLoadSpecialPokePic( + &gMonBackPicTable[species], + gMonBackPicCoords[species].coords, + gMonBackPicCoords[species].y_offset, + 0x02000000, + gUnknown_081FAF4C[0], + species, + ewram19348.unk10); + } + else + { + r10 = GetBankIdentity(a); + if (GetBankSide(b) == 1) + species = GetMonData(&gEnemyParty[gBattlePartyID[b]], MON_DATA_SPECIES); + else + species = GetMonData(&gPlayerParty[gBattlePartyID[b]], MON_DATA_SPECIES); + if (GetBankSide(a) == 0) + { + personalityValue = GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_PERSONALITY); + otId = GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_OT_ID); + HandleLoadSpecialPokePic( + &gMonBackPicTable[species], + gMonBackPicCoords[species].coords, + gMonBackPicCoords[species].y_offset, + 0x02000000, + gUnknown_081FAF4C[r10], + species, + gPID_perBank[a]); + } + else + { + personalityValue = GetMonData(&gEnemyParty[gBattlePartyID[a]], MON_DATA_PERSONALITY); + otId = GetMonData(&gEnemyParty[gBattlePartyID[a]], MON_DATA_OT_ID); + HandleLoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, + gMonFrontPicCoords[species].y_offset, + 0x02000000, + gUnknown_081FAF4C[r10], + species, + gPID_perBank[a]); + } + } + src = gUnknown_081FAF4C[r10]; + dst = (void *)(VRAM + 0x10000 + gSprites[gObjectBankIDs[a]].oam.tileNum * 32); + DmaCopy32(3, src, dst, 0x800); + paletteOffset = 0x100 + a * 16; + lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue); + sub_800D238(lzPaletteData, ewram); + LoadPalette(ewram, paletteOffset, 32); + if (species == SPECIES_CASTFORM) + { + u16 *paletteSrc = (u16 *)(ewram + 0x16400); + + sub_800D238(lzPaletteData, paletteSrc); + LoadPalette(paletteSrc + gBattleMonForms[b] * 16, paletteOffset, 32); + } + BlendPalette(paletteOffset, 16, 6, 0x7FFF); + CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); + if (!IsContest()) + { + ewram17800[a].unk2 = species; + gBattleMonForms[a] = gBattleMonForms[b]; + } + gSprites[gObjectBankIDs[a]].pos1.y = sub_8077F68(a); + StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]); + } +} + +void sub_8032350(u8 a, u8 b) +{ + u8 r4; + u16 foo; + const u8 *gSubstituteDollPal_; + void *src; + s32 i; + + if (b == 0) + { + if (IsContest()) + r4 = 0; + else + r4 = GetBankIdentity(a); + if (IsContest()) + LZDecompressVram(gSubstituteDollTilemap, gUnknown_081FAF4C[r4]); + else if (GetBankSide(a) != 0) + LZDecompressVram(gSubstituteDollGfx, gUnknown_081FAF4C[r4]); + else + LZDecompressVram(gSubstituteDollTilemap, gUnknown_081FAF4C[r4]); + // There is probably a way to do this without all the temp variables, but I couldn't figure it out. + foo = a * 16; + gSubstituteDollPal_ = gSubstituteDollPal; + src = gUnknown_081FAF4C[r4]; + for (i = 0; i < 3; i++) + DmaCopy32(3, src, src + i * 0x800 + 0x800, 0x800); + LoadCompressedPalette(gSubstituteDollPal_, 0x100 + foo, 32); + } + else + { + if (!IsContest()) + { + if (GetBankSide(a) != 0) + sub_8031794(&gEnemyParty[gBattlePartyID[a]], a); + else + sub_80318FC(&gPlayerParty[gBattlePartyID[a]], a); + } + } +} + +void refresh_graphics_maybe(u8 a, u8 b, u8 spriteId) +{ + sub_8032350(a, b); + StartSpriteAnim(&gSprites[spriteId], gBattleMonForms[a]); + if (b == 0) + gSprites[spriteId].pos1.y = sub_8077F7C(a); + else + gSprites[spriteId].pos1.y = sub_8077F68(a); +} + +void sub_80324BC(u8 a, u16 b) +{ + if (b == 0xA4) + ewram17800[a].unk0_2 = 1; +} + +void sub_80324E0(u8 a) +{ + ewram17800[a].unk0_2 = 0; +} + +void sub_80324F8(struct Pokemon *pkmn, u8 b) +{ + u16 hp = GetMonData(pkmn, MON_DATA_HP); + u16 maxHP = GetMonData(pkmn, MON_DATA_MAX_HP); + + if (GetHPBarLevel(hp, maxHP) == 1) + { + if (!ewram17800[b].unk0_1) + { + if (!ewram17800[b ^ 2].unk0_1) + PlaySE(SE_HINSI); + ewram17800[b].unk0_1 = 1; + } + } + else + { + ewram17800[b].unk0_1 = 0; + if (!IsDoubleBattle()) + { + m4aSongNumStop(SE_HINSI); + return; + } + if (IsDoubleBattle() && !ewram17800[b ^ 2].unk0_1) + { + m4aSongNumStop(SE_HINSI); + return; + } + } +} + +void BattleMusicStop(void) +{ + u8 r4 = GetBankByPlayerAI(0); + + ewram17800[r4].unk0_1 = 0; + if (IsDoubleBattle()) + ewram17800[r4 ^ 2].unk0_1 = 0; + m4aSongNumStop(SE_HINSI); +} + +u8 unref_sub_8032604(struct Pokemon *pkmn) +{ + u16 hp = GetMonData(pkmn, MON_DATA_HP); + u16 maxHP = GetMonData(pkmn, MON_DATA_MAX_HP); + + return GetHPBarLevel(hp, maxHP); +} + +void sub_8032638(void) +{ + if (gMain.inBattle) + { + u8 r8 = GetBankByPlayerAI(0); + u8 r9 = GetBankByPlayerAI(2); + u8 r4 = pokemon_order_func(gBattlePartyID[r8]); + u8 r5 = pokemon_order_func(gBattlePartyID[r9]); + + if (GetMonData(&gPlayerParty[r4], MON_DATA_HP) != 0) + sub_80324F8(&gPlayerParty[r4], r8); + if (IsDoubleBattle()) + { + if (GetMonData(&gPlayerParty[r5], MON_DATA_HP) != 0) + sub_80324F8(&gPlayerParty[r5], r9); + } + } +} + +void sub_80326EC(u8 a) +{ + s32 i; + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (sub_8078874(i) != 0) + { + gSprites[gObjectBankIDs[i]].oam.affineMode = a; + if (a == 0) + { + ewram17810[i].unk6 = gSprites[gObjectBankIDs[i]].oam.matrixNum; + gSprites[gObjectBankIDs[i]].oam.matrixNum = 0; + } + else + { + gSprites[gObjectBankIDs[i]].oam.matrixNum = ewram17810[i].unk6; + } + } + } +} + +void sub_80327CC(void) +{ + u8 r5; + + LoadCompressedObjectPic(&gUnknown_081FAF24); + r5 = GetBankByPlayerAI(1); + ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, sub_8077ABC(r5, 0), sub_8077ABC(r5, 1) + 32, 0xC8); + gSprites[ewram17810[r5].unk7].data0 = r5; + if (IsDoubleBattle()) + { + r5 = GetBankByPlayerAI(3); + ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, sub_8077ABC(r5, 0), sub_8077ABC(r5, 1) + 32, 0xC8); + gSprites[ewram17810[r5].unk7].data0 = r5; + } +} + +void sub_80328A4(struct Sprite *sprite) +{ + bool8 invisible = FALSE; + u8 r4 = sprite->data0; + struct Sprite *r7 = &gSprites[gObjectBankIDs[r4]]; + + if (!r7->inUse || sub_8078874(r4) == 0) + { + sprite->callback = sub_8032978; + return; + } + if (gAnimScriptActive || r7->invisible) + invisible = TRUE; + else if (ewram17800[r4].unk2 != 0 && gEnemyMonElevation[ewram17800[r4].unk2] == 0) + invisible = TRUE; + if (ewram17800[r4].unk0_2) + invisible = TRUE; + sprite->pos1.x = r7->pos1.x; + sprite->pos2.x = r7->pos2.x; + sprite->invisible = invisible; +} + +void sub_8032978(struct Sprite *sprite) +{ + sprite->invisible = TRUE; +} + +void sub_8032984(u8 a, u16 b) +{ + if (GetBankSide(a) != 0) + { + if (ewram17800[a].unk2 != 0) + b = ewram17800[a].unk2; + if (gEnemyMonElevation[b] != 0) + gSprites[ewram17810[a].unk7].callback = sub_80328A4; + else + gSprites[ewram17810[a].unk7].callback = sub_8032978; + } +} + +void sub_8032A08(u8 a) +{ + gSprites[ewram17810[a].unk7].callback = sub_8032978; +} + +void sub_8032A38(void) +{ + u16 *ptr = (u16 *)(VRAM + 0x240); + s32 i; + s32 j; + + for (i = 0; i < 9; i++) + { + for (j = 0; j < 16; j++) + { + if (!(*ptr & 0xF000)) + *ptr |= 0xF000; + if (!(*ptr & 0x0F00)) + *ptr |= 0x0F00; + if (!(*ptr & 0x00F0)) + *ptr |= 0x00F0; + if (!(*ptr & 0x000F)) + *ptr |= 0x000F; + ptr++; + } + } +} + +void sub_8032AA8(u8 a, u8 b) +{ + ewram17800[a].unk2 = 0; + gBattleMonForms[a] = 0; + if (b == 0) + sub_80324E0(a); +} + +void nullsub_45(void) +{ +} + +void SetBankFuncToOpponentBufferRunCommand(void) +{ + gBattleBankFunc[gActiveBank] = OpponentBufferRunCommand; +} + +void OpponentBufferRunCommand(void) +{ + if (gBattleExecBuffer & gBitTable[gActiveBank]) + { + if (gBattleBufferA[gActiveBank][0] <= 0x38) + gOpponentBufferCommands[gBattleBufferA[gActiveBank][0]](); + else + OpponentBufferExecCompleted(); + } +} + +void sub_8032B4C(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + OpponentBufferExecCompleted(); +} + +// Duplicate of sub_8032B4C +void sub_8032B84(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + OpponentBufferExecCompleted(); +} + +void sub_8032BBC(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + { + sub_8031B74(gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam); + gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = gSprites[gObjectBankIDs[gActiveBank]].data5; + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + OpponentBufferExecCompleted(); + } +} + +void sub_8032C4C(void) +{ + if ((--ewram17810[gActiveBank].unk9) == 0xFF) + { + ewram17810[gActiveBank].unk9 = 0; + OpponentBufferExecCompleted(); + } +} + +void sub_8032C88(void) +{ + bool8 r6 = FALSE; + + if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) + { + if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy) + r6 = TRUE; + } + else + { + if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy + && gSprites[gHealthboxIDs[gActiveBank ^ 2]].callback == SpriteCallbackDummy) + r6 = TRUE; + } + if (IsCryPlayingOrClearCrySongs()) + r6 = FALSE; + + if (r6 && ewram17810[gActiveBank].unk1_0 && ewram17810[gActiveBank ^ 2].unk1_0) + { + ewram17810[gActiveBank].unk0_7 = 0; + ewram17810[gActiveBank].unk1_0 = 0; + ewram17810[gActiveBank ^ 2].unk0_7 = 0; + ewram17810[gActiveBank ^ 2].unk1_0 = 0; + FreeSpriteTilesByTag(0x27F9); + FreeSpritePaletteByTag(0x27F9); + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + m4aMPlayContinue(&gMPlay_BGM); + else + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); + ewram17810[gActiveBank].unk9 = 3; + gBattleBankFunc[gActiveBank] = sub_8032C4C; + } +} + +void sub_8032E2C(void) +{ + if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank].unk0_7) + sub_8141828(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]); + if (!ewram17810[gActiveBank ^ 2].unk0_3 && !ewram17810[gActiveBank ^ 2].unk0_7) + sub_8141828(gActiveBank ^ 2, &gEnemyParty[gBattlePartyID[gActiveBank ^ 2]]); + if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank ^ 2].unk0_3) + { + if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank ^ 2]]); + sub_8045A5C( + gHealthboxIDs[gActiveBank ^ 2], + &gEnemyParty[gBattlePartyID[gActiveBank ^ 2]], + 0); + sub_804777C(gActiveBank ^ 2); + sub_8043DFC(gHealthboxIDs[gActiveBank ^ 2]); + sub_8032984( + gActiveBank ^ 2, + GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank ^ 2]], MON_DATA_SPECIES)); + } + DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]); + sub_8045A5C( + gHealthboxIDs[gActiveBank], + &gEnemyParty[gBattlePartyID[gActiveBank]], + 0); + sub_804777C(gActiveBank); + sub_8043DFC(gHealthboxIDs[gActiveBank]); + sub_8032984( + gActiveBank, + GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); + + ewram17840.unk9_0 = 0; + gBattleBankFunc[gActiveBank] = sub_8032C88; + } +} + +void sub_8033018(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].animEnded == TRUE + && gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0) + { + if (!ewram17810[gActiveBank].unk0_7) + { + sub_8141828(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]); + return; + } + if (ewram17810[gActiveBank].unk1_0) + { + ewram17810[gActiveBank].unk0_7 = 0; + ewram17810[gActiveBank].unk1_0 = 0; + FreeSpriteTilesByTag(0x27F9); + FreeSpritePaletteByTag(0x27F9); + OpponentBufferExecCompleted(); + return; + } + } +} + +void sub_80330C8(void) +{ + s16 r4 = sub_8045C78(gActiveBank, gHealthboxIDs[gActiveBank], 0, 0); + + sub_8043DFC(gHealthboxIDs[gActiveBank]); + if (r4 != -1) + sub_80440EC(gHealthboxIDs[gActiveBank], r4, 0); + else + OpponentBufferExecCompleted(); +} + +void sub_803311C(void) +{ + if (!gSprites[gObjectBankIDs[gActiveBank]].inUse) + { + sub_8043DB0(gHealthboxIDs[gActiveBank]); + OpponentBufferExecCompleted(); + } +} + +void sub_8033160(void) +{ + if (!ewram17810[gActiveBank].unk0_6) + { + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8032A08(gActiveBank); + sub_8043DB0(gHealthboxIDs[gActiveBank]); + OpponentBufferExecCompleted(); + } +} + +void sub_80331D0(void) +{ + if (gUnknown_03004210.state == 0) + OpponentBufferExecCompleted(); +} + +void bx_blink_t7(void) +{ + u8 spriteId = gObjectBankIDs[gActiveBank]; + + if (gSprites[spriteId].data1 == 32) + { + gSprites[spriteId].data1 = 0; + gSprites[spriteId].invisible = FALSE; + gDoingBattleAnim = 0; + OpponentBufferExecCompleted(); + } + else + { + if (((u16)gSprites[spriteId].data1 % 4) == 0) + gSprites[spriteId].invisible ^= 1; + gSprites[spriteId].data1++; + } +} + +void sub_8033264(void) +{ + if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy) + { + if (ewram17800[gActiveBank].unk0_2) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); + gBattleBankFunc[gActiveBank] = sub_80332D0; + } +} + +void sub_80332D0(void) +{ + if (!ewram17810[gActiveBank].unk0_6) + { + CreateTask(c3_0802FDF4, 10); + OpponentBufferExecCompleted(); + } +} + +void sub_8033308(void) +{ + if (ewram17810[gActiveBank].unk1_0) + { + ewram17810[gActiveBank].unk0_7 = 0; + ewram17810[gActiveBank].unk1_0 = 0; + FreeSpriteTilesByTag(0x27F9); + FreeSpritePaletteByTag(0x27F9); + StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 0); + sub_8045A5C( + gHealthboxIDs[gActiveBank], + &gEnemyParty[gBattlePartyID[gActiveBank]], + 0); + sub_804777C(gActiveBank); + sub_8043DFC(gHealthboxIDs[gActiveBank]); + sub_8031F88(gActiveBank); + gBattleBankFunc[gActiveBank] = sub_8033264; + } +} + +void sub_80333D4(void) +{ + if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank].unk0_7) + sub_8141828(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]); + if (gSprites[gUnknown_0300434C[gActiveBank]].callback == SpriteCallbackDummy + && !ewram17810[gActiveBank].unk0_3) + { + DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]); + sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); + gBattleBankFunc[gActiveBank] = sub_8033308; + } +} + +void sub_8033494(void) +{ + if (!ewram17810[gActiveBank].unk0_4) + OpponentBufferExecCompleted(); +} + +void sub_80334C0(void) +{ + if (!ewram17810[gActiveBank].unk0_5) + OpponentBufferExecCompleted(); +} + +void OpponentBufferExecCompleted(void) +{ + gBattleBankFunc[gActiveBank] = OpponentBufferRunCommand; + gBattleExecBuffer &= ~gBitTable[gActiveBank]; +} diff --git a/src/battle/battle_8.c b/src/battle/battle_8.c new file mode 100644 index 000000000..75f10c4b1 --- /dev/null +++ b/src/battle/battle_8.c @@ -0,0 +1,1642 @@ +#include "global.h" +#include "battle.h" +#include "battle_ai.h" +#include "battle_interface.h" +#include "data2.h" +#include "graphics.h" +#include "main.h" +#include "pokemon.h" +#include "rng.h" +#include "rom3.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "util.h" + +struct UnknownStruct3 +{ + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; +}; + +extern u8 gActiveBank; +extern u8 gBattleBufferA[][0x200]; +extern u16 gBattlePartyID[]; +extern u8 gObjectBankIDs[]; +extern u8 gBattleMonForms[]; +extern struct SpriteTemplate gUnknown_02024E8C; +extern void (*gBattleBankFunc[])(void); +extern u8 gUnknown_0300434C[]; +extern u8 gHealthboxIDs[]; +extern u16 gBattleTypeFlags; +extern u16 gTrainerBattleOpponent; +extern u32 *gDisableStructMoveAnim; +extern u32 gMoveDmgMoveAnim; +extern u16 gMovePowerMoveAnim; +extern u8 gHappinessMoveAnim; +extern u16 gWeatherMoveAnim; +extern u32 gPID_perBank[]; +extern u8 gUnknown_0202F7C4; +extern u8 gAnimScriptActive; +extern void (*gAnimScriptCallback)(void); +extern struct Window gUnknown_03004210; +extern u16 gUnknown_030042A0; +extern u16 gUnknown_030042A4; +extern u8 gDisplayedStringBattle[]; +extern u8 gBankTarget; +extern u8 gAbsentBankFlags; +extern bool8 gDoingBattleAnim; +extern u16 gUnknown_02024DE8; +extern u8 gUnknown_02024E68[]; +extern MainCallback gPreBattleCallback1; + +extern u8 sub_8077ABC(); +extern u8 sub_8077F68(); +extern u8 sub_8079E90(); +extern void sub_8033018(void); +extern void sub_8031794(); +extern u8 GetBankIdentity(u8); +extern void sub_8032984(u8, u16); +extern void sub_80333D4(void); +extern void sub_80312F0(struct Sprite *); +extern u8 sub_8046400(); +extern void sub_8032A08(); +extern void sub_8043DB0(); +extern void sub_8033160(void); +extern u8 sub_8135FBC(void); +extern u8 get_trainer_class_pic_index(void); +extern void sub_80313A0(struct Sprite *); +extern void sub_8032B4C(void); +extern void sub_8031A6C(u16, u8); +extern void sub_8032B84(void); +extern void sub_8078B34(struct Sprite *); +extern void sub_8032BBC(void); +extern void oamt_add_pos2_onto_pos1(); +extern void oamt_set_x3A_32(); +extern void sub_803311C(void); +extern void sub_8010384(struct Sprite *); +extern bool8 mplay_80342A4(u8); +extern u8 sub_8031720(); +extern void ExecuteMoveAnim(); +extern void sub_80326EC(); +extern void sub_8031F24(void); +extern void sub_80324BC(); +extern void BufferStringBattle(); +extern void sub_80331D0(void); +extern void sub_8036B0C(void); +extern u8 GetBankByPlayerAI(u8); +extern u8 sub_8036CD4(void); +extern void sub_80330C8(void); +extern void sub_8043D84(); +extern void sub_8045A5C(); +void sub_8033494(void); +extern void move_anim_start_t2_for_situation(); +extern void bx_blink_t7(void); +extern void sub_8047858(); +extern u8 GetBankSide(u8); +extern void sub_80E43C0(); +extern void sub_8044CA0(u8); +extern void nullsub_45(void); +extern void sub_8031B74(); +extern bool8 IsDoubleBattle(void); +extern void sub_8032E2C(void); +extern u8 sub_8078874(); +extern u8 move_anim_start_t3(); +extern void sub_80334C0(void); +extern void OpponentBufferExecCompleted(void); + +u32 sub_8033598(u8, u8 *); +void sub_8033E24(u8); +void sub_803495C(u8, u8); +void sub_8034B74(void); +void sub_8035238(void); +void sub_8035C10(struct Sprite *); +void sub_8035C44(u8); +void sub_8035E2C(void); + +void OpponentHandleGetAttributes(void) +{ + u8 buffer[256]; + int r6 = 0; + s32 i; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + r6 = sub_8033598(gBattlePartyID[gActiveBank], buffer); + } + else + { + u8 r4 = gBattleBufferA[gActiveBank][2]; + + for (i = 0; i < 6; i++) + { + if (r4 & 1) + r6 += sub_8033598(i, buffer + r6); + r4 >>= 1; + } + } + dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, r6, buffer); + OpponentBufferExecCompleted(); +} + +u32 sub_8033598(u8 a, u8 *buffer) +{ + struct BattlePokemon battlePokemon; + struct UnknownStruct3 moveData; + u8 nickname[20]; + u8 *src; + s16 data16; + u32 data32; + s32 size = 0; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + battlePokemon.species = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); + battlePokemon.item = GetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM); + for (size = 0; size < 4; size++) + { + battlePokemon.moves[size] = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + size); + battlePokemon.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); + } + battlePokemon.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); + battlePokemon.friendship = GetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP); + battlePokemon.experience = GetMonData(&gEnemyParty[a], MON_DATA_EXP); + battlePokemon.hpIV = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); + battlePokemon.attackIV = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); + battlePokemon.defenseIV = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); + battlePokemon.speedIV = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); + battlePokemon.spAttackIV = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); + battlePokemon.spDefenseIV = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); + battlePokemon.personality = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); + battlePokemon.status1 = GetMonData(&gEnemyParty[a], MON_DATA_STATUS); + battlePokemon.level = GetMonData(&gEnemyParty[a], MON_DATA_LEVEL); + battlePokemon.hp = GetMonData(&gEnemyParty[a], MON_DATA_HP); + battlePokemon.maxHP = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); + battlePokemon.attack = GetMonData(&gEnemyParty[a], MON_DATA_ATK); + battlePokemon.defense = GetMonData(&gEnemyParty[a], MON_DATA_DEF); + battlePokemon.speed = GetMonData(&gEnemyParty[a], MON_DATA_SPD); + battlePokemon.spAttack = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); + battlePokemon.spDefense = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); + battlePokemon.isEgg = GetMonData(&gEnemyParty[a], MON_DATA_IS_EGG); + battlePokemon.altAbility = GetMonData(&gEnemyParty[a], MON_DATA_ALT_ABILITY); + battlePokemon.otId = GetMonData(&gEnemyParty[a], MON_DATA_OT_ID); + GetMonData(&gEnemyParty[a], MON_DATA_NICKNAME, nickname); + StringCopy10(battlePokemon.nickname, nickname); + GetMonData(&gEnemyParty[a], MON_DATA_OT_NAME, battlePokemon.otName); + src = (u8 *)&battlePokemon; + for (size = 0; size < sizeof(battlePokemon); size++) + buffer[size] = src[size]; + break; + case 1: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 2: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 3: + for (size = 0; size < 4; size++) + { + moveData.moves[size] = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + size); + moveData.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); + } + moveData.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); + src = (u8 *)&moveData; + for (size = 0; size < sizeof(moveData); size++) + buffer[size] = src[size]; + break; + case 4: + case 5: + case 6: + case 7: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 8: + for (size = 0; size < 4; size++) + buffer[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); + buffer[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); + size++; + break; + case 9: + case 10: + case 11: + case 12: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); + size = 1; + break; + case 17: + data32 = GetMonData(&gEnemyParty[a], MON_DATA_OT_ID); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 18: + data32 = GetMonData(&gEnemyParty[a], MON_DATA_EXP); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 19: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_EV); + size = 1; + break; + case 20: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_EV); + size = 1; + break; + case 21: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_EV); + size = 1; + break; + case 22: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_EV); + size = 1; + break; + case 23: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV); + size = 1; + break; + case 24: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_EV); + size = 1; + break; + case 25: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP); + size = 1; + break; + case 26: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_POKERUS); + size = 1; + break; + case 27: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_LOCATION); + size = 1; + break; + case 28: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_LEVEL); + size = 1; + break; + case 29: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_GAME); + size = 1; + break; + case 30: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_POKEBALL); + size = 1; + break; + case 31: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); + buffer[1] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); + buffer[2] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); + buffer[3] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); + buffer[4] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); + buffer[5] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); + size = 6; + break; + case 32: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); + size = 1; + break; + case 33: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); + size = 1; + break; + case 34: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); + size = 1; + break; + case 35: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); + size = 1; + break; + case 36: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); + size = 1; + break; + case 37: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); + size = 1; + break; + case 38: + data32 = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 39: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_CHECKSUM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 40: + data32 = GetMonData(&gEnemyParty[a], MON_DATA_STATUS); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 41: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_LEVEL); + size = 1; + break; + case 42: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 43: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 44: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_ATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 45: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_DEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 46: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPD); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 47: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 48: + data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 49: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_COOL); + size = 1; + break; + case 50: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_BEAUTY); + size = 1; + break; + case 51: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_CUTE); + size = 1; + break; + case 52: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SMART); + size = 1; + break; + case 53: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_TOUGH); + size = 1; + break; + case 54: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SHEEN); + size = 1; + break; + case 55: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_COOL_RIBBON); + size = 1; + break; + case 56: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_BEAUTY_RIBBON); + size = 1; + break; + case 57: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_CUTE_RIBBON); + size = 1; + break; + case 58: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SMART_RIBBON); + size = 1; + break; + case 59: + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_TOUGH_RIBBON); + size = 1; + break; + } + return size; +} + +void dp01t_01_2_read_pokmon_data_slice(void) +{ + struct BattlePokemon buffer; + u8 *src = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; + u8 *dst = (u8 *)&buffer + gBattleBufferA[gActiveBank][1]; + u8 i; + + for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) + dst[i] = src[i]; + dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, gBattleBufferA[gActiveBank][2], dst); + OpponentBufferExecCompleted(); +} + +void OpponentHandleSetAttributes(void) +{ + u8 i; + u8 r4; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + sub_8033E24(gBattlePartyID[gActiveBank]); + } + else + { + r4 = gBattleBufferA[gActiveBank][2]; + for (i = 0; i < 6; i++) + { + if (r4 & 1) + sub_8033E24(i); + r4 >>= 1; + } + } + OpponentBufferExecCompleted(); +} + +void sub_8033E24(u8 a) +{ + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; + struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; + s32 i; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + { + u8 iv; + + SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); + SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + for (i = 0; i < 4; i++) + { + SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); + SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + } + SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); + SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); + SetMonData(&gEnemyParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + iv = battlePokemon->hpIV; + SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, (u8 *)&iv); + iv = battlePokemon->attackIV; + SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + iv = battlePokemon->defenseIV; + SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + iv = battlePokemon->speedIV; + SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + iv = battlePokemon->spAttackIV; + SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + iv = battlePokemon->spDefenseIV; + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); + SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); + SetMonData(&gEnemyParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); + SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); + SetMonData(&gEnemyParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); + SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); + SetMonData(&gEnemyParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); + SetMonData(&gEnemyParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); + SetMonData(&gEnemyParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); + SetMonData(&gEnemyParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + } + break; + case 1: + SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); + break; + case 2: + SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); + break; + case 3: + for (i = 0; i < 4; i++) + { + SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); + SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + } + SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); + break; + case 4: + case 5: + case 6: + case 7: + SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); + break; + case 8: + SetMonData(&gEnemyParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gEnemyParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gEnemyParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gEnemyParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); + break; + case 9: + case 10: + case 11: + case 12: + SetMonData(&gEnemyParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); + break; + case 17: + SetMonData(&gEnemyParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); + break; + case 18: + SetMonData(&gEnemyParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); + break; + case 19: + SetMonData(&gEnemyParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 20: + SetMonData(&gEnemyParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 21: + SetMonData(&gEnemyParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 22: + SetMonData(&gEnemyParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 23: + SetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 24: + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 25: + SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); + break; + case 26: + SetMonData(&gEnemyParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); + break; + case 27: + SetMonData(&gEnemyParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); + break; + case 28: + SetMonData(&gEnemyParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 29: + SetMonData(&gEnemyParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); + break; + case 30: + SetMonData(&gEnemyParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); + break; + case 31: + SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); + break; + case 32: + SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 33: + SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 34: + SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 35: + SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 36: + SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 37: + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 38: + SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); + break; + case 39: + SetMonData(&gEnemyParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); + break; + case 40: + SetMonData(&gEnemyParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); + break; + case 41: + SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 42: + SetMonData(&gEnemyParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 43: + SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 44: + SetMonData(&gEnemyParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); + break; + case 45: + SetMonData(&gEnemyParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); + break; + case 46: + SetMonData(&gEnemyParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); + break; + case 47: + SetMonData(&gEnemyParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); + break; + case 48: + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); + break; + case 49: + SetMonData(&gEnemyParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); + break; + case 50: + SetMonData(&gEnemyParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); + break; + case 51: + SetMonData(&gEnemyParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); + break; + case 52: + SetMonData(&gEnemyParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); + break; + case 53: + SetMonData(&gEnemyParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); + break; + case 54: + SetMonData(&gEnemyParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); + break; + case 55: + SetMonData(&gEnemyParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 56: + SetMonData(&gEnemyParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 57: + SetMonData(&gEnemyParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 58: + SetMonData(&gEnemyParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 59: + SetMonData(&gEnemyParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + } +} + +void sub_8034744(void) +{ + u8 *dst; + u8 i; + + dst = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; + for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) + dst[i] = gBattleBufferA[gActiveBank][3 + i]; + OpponentBufferExecCompleted(); +} + +void OpponentHandleLoadPokeSprite(void) +{ + u16 species = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES); + + sub_8031794(&gEnemyParty[gBattlePartyID[gActiveBank]], gActiveBank); + GetMonSpriteTemplate_803C56C(species, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + sub_8077ABC(gActiveBank, 2), + sub_8077F68(gActiveBank), + sub_8079E90(gActiveBank)); + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; + gSprites[gObjectBankIDs[gActiveBank]].data0 = gActiveBank; + gSprites[gObjectBankIDs[gActiveBank]].data2 = species; + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]); + sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); + gBattleBankFunc[gActiveBank] = sub_8033018; +} + +void OpponentHandleSendOutPoke(void) +{ + gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1]; + + sub_803495C(gActiveBank, gBattleBufferA[gActiveBank][2]); + gBattleBankFunc[gActiveBank] = sub_80333D4; +} + +void sub_803495C(u8 a, u8 b) +{ + u16 species; + + sub_8032AA8(a, b); + gBattlePartyID[a] = gBattleBufferA[a][1]; + species = GetMonData(&gEnemyParty[gBattlePartyID[a]], MON_DATA_SPECIES); + gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); + sub_8031794(&gEnemyParty[gBattlePartyID[a]], a); + GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a)); + gObjectBankIDs[a] = CreateSprite( + &gUnknown_02024E8C, + sub_8077ABC(a, 2), + sub_8077F68(a), + sub_8079E90(a)); + gSprites[gObjectBankIDs[a]].data0 = a; + gSprites[gObjectBankIDs[a]].data2 = species; + gSprites[gUnknown_0300434C[a]].data1 = gObjectBankIDs[a]; + gSprites[gObjectBankIDs[a]].oam.paletteNum = a; + StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]); + gSprites[gObjectBankIDs[a]].invisible = TRUE; + gSprites[gObjectBankIDs[a]].callback = SpriteCallbackDummy; + gSprites[gUnknown_0300434C[a]].data0 = sub_8046400(0, 0xFE); +} + +void OpponentHandleReturnPokeToBall(void) +{ + if (gBattleBufferA[gActiveBank][1] == 0) + { + ewram17810[gActiveBank].unk4 = 0; + gBattleBankFunc[gActiveBank] = sub_8034B74; + } + else + { + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8032A08(gActiveBank); + sub_8043DB0(gHealthboxIDs[gActiveBank]); + OpponentBufferExecCompleted(); + } +} + +void sub_8034B74(void) +{ + switch (ewram17810[gActiveBank].unk4) + { + case 0: + if (ewram17800[gActiveBank].unk0_2) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + ewram17810[gActiveBank].unk4 = 1; + break; + case 1: + if (!ewram17810[gActiveBank].unk0_6) + { + ewram17810[gActiveBank].unk4 = 0; + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 2); + gBattleBankFunc[gActiveBank] = sub_8033160; + } + break; + } +} + +void OpponentHandleTrainerThrow(void) +{ + u32 trainerPicIndex; + + if (gTrainerBattleOpponent == 0x400) + trainerPicIndex = GetSecretBaseTrainerPicIndex(); + else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + trainerPicIndex = get_trainer_class_pic_index(); + else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) + trainerPicIndex = sub_8135FBC(); + else + trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; + + sub_8031A6C(trainerPicIndex, gActiveBank); + GetMonSpriteTemplate_803C5A0(trainerPicIndex, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + 0xB0, + 40 + 4 * (8 - gTrainerFrontPicCoords[trainerPicIndex].coords), + sub_8079E90(gActiveBank)); + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; + gSprites[gObjectBankIDs[gActiveBank]].data0 = 2; + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag); + gSprites[gObjectBankIDs[gActiveBank]].data5 = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum; + gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag); + gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam = trainerPicIndex; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gBattleBankFunc[gActiveBank] = sub_8032B4C; +} + +void OpponentHandleTrainerSlide(void) +{ + u32 trainerPicIndex; + + if (gTrainerBattleOpponent == 0x400) + trainerPicIndex = GetSecretBaseTrainerPicIndex(); + else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + trainerPicIndex = get_trainer_class_pic_index(); + else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) + trainerPicIndex = sub_8135FBC(); + else + trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; + + sub_8031A6C(trainerPicIndex, gActiveBank); + GetMonSpriteTemplate_803C5A0(trainerPicIndex, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + 0xB0, + 40 + 4 * (8 - gTrainerFrontPicCoords[trainerPicIndex].coords), + 0x1E); + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 96; + gSprites[gObjectBankIDs[gActiveBank]].pos1.x += 32; + gSprites[gObjectBankIDs[gActiveBank]].data0 = -2; + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag); + gSprites[gObjectBankIDs[gActiveBank]].data5 = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum; + gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag); + gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam = trainerPicIndex; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gBattleBankFunc[gActiveBank] = sub_8032B84; +} + +void OpponentHandleTrainerSlideBack(void) +{ + oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); + gSprites[gObjectBankIDs[gActiveBank]].data0 = 35; + gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; + gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; + oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + gBattleBankFunc[gActiveBank] = sub_8032BBC; +} + +void sub_8035030(void) +{ + if (ewram17810[gActiveBank].unk4 == 0) + { + if (ewram17800[gActiveBank].unk0_2) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + ewram17810[gActiveBank].unk4++; + } + else if (!ewram17810[gActiveBank].unk0_6) + { + ewram17810[gActiveBank].unk4 = 0; + PlaySE12WithPanning(SE_POKE_DEAD, 63); + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8010384; + gBattleBankFunc[gActiveBank] = sub_803311C; + } +} + +void sub_80350D4(void) +{ + OpponentBufferExecCompleted(); +} + +void sub_80350E0(void) +{ + OpponentBufferExecCompleted(); +} + +void OpponentHandleBallThrow(void) +{ + OpponentBufferExecCompleted(); +} + +void OpponentHandlePause(void) +{ + OpponentBufferExecCompleted(); +} + +void OpponentHandleMoveAnimation(void) +{ + if (!mplay_80342A4(gActiveBank)) + { + u32 r0 = gBattleBufferA[gActiveBank][1] + | (gBattleBufferA[gActiveBank][2] << 8); + + gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; + gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] + | (gBattleBufferA[gActiveBank][5] << 8); + gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] + | (gBattleBufferA[gActiveBank][7] << 8) + | (gBattleBufferA[gActiveBank][8] << 16) + | (gBattleBufferA[gActiveBank][9] << 24); + gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; + gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] + | (gBattleBufferA[gActiveBank][13] << 8); + gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; + gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; + + // Dead code. sub_8031720 always returns 0. + if (sub_8031720(r0, gUnknown_0202F7C4) != 0) + { + OpponentBufferExecCompleted(); + } + else + { + ewram17810[gActiveBank].unk4 = 0; + gBattleBankFunc[gActiveBank] = sub_8035238; + } + } +} + +void sub_8035238(void) +{ + u16 r4 = gBattleBufferA[gActiveBank][1] + | (gBattleBufferA[gActiveBank][2] << 8); + u8 r7 = gBattleBufferA[gActiveBank][11]; + + switch (ewram17810[gActiveBank].unk4) + { + case 0: + if (ewram17800[gActiveBank].unk0_2 && !ewram17800[gActiveBank].unk0_3) + { + ewram17800[gActiveBank].unk0_3 = 1; + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + } + ewram17810[gActiveBank].unk4 = 1; + break; + case 1: + if (!ewram17810[gActiveBank].unk0_6) + { + sub_80326EC(0); + ExecuteMoveAnim(r4); + ewram17810[gActiveBank].unk4 = 2; + } + break; + case 2: + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + sub_80326EC(1); + if ((ewram17800[gActiveBank].unk0_2) && r7 <= 1) + { + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); + ewram17800[gActiveBank].unk0_3 = 0; + } + ewram17810[gActiveBank].unk4 = 3; + } + break; + case 3: + if (!ewram17810[gActiveBank].unk0_6) + { + sub_8031F24(); + sub_80324BC( + gActiveBank, + gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + ewram17810[gActiveBank].unk4 = 0; + OpponentBufferExecCompleted(); + } + break; + } +} + +void OpponentHandlePrintString(void) +{ + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); + sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gBattleBankFunc[gActiveBank] = sub_80331D0; +} + +void OpponentHandlePrintStringPlayerOnly(void) +{ + OpponentBufferExecCompleted(); +} + +void sub_803540C(void) +{ + sub_8036B0C(); + OpponentBufferExecCompleted(); +} + +void sub_803541C(void) +{ + OpponentBufferExecCompleted(); +} + +#ifdef NONMATCHING +void sub_8035428(void) +{ + u16 r4; + // Needed to match closer + struct {u16 moves[4];} *r5 = (void *)&gBattleBufferA[gActiveBank][4]; + + if (gBattleTypeFlags & 0x498) + { + BattleAI_SetupAIData(); + r4 = BattleAI_GetAIActionToUse(); + switch (r4) + { + case 5: + dp01_build_cmdbuf_x21_a_bb(1, 4, 0); + break; + case 4: + dp01_build_cmdbuf_x21_a_bb(1, 3, 0); + break; + default: + if (gBattleMoves[r5->moves[r4]].target & 0x12) + gBankTarget = gActiveBank; + if (gBattleMoves[r5->moves[r4]].target & 8) + { + gBankTarget = GetBankByPlayerAI(0); + if (gAbsentBankFlags & gBitTable[gBankTarget]) + gBankTarget = GetBankByPlayerAI(2); + } + r4 |= gBankTarget << 8; + dp01_build_cmdbuf_x21_a_bb(1, 10, r4); + break; + } + OpponentBufferExecCompleted(); + } + else + { + u16 r2; + + do + { + // Can't for the life of me get this to match. + r4 = Random() % 4; + r2 = r5->moves[r4]; + } while (r2 == 0); + + if (gBattleMoves[r2].target & 0x12) + { + r4 |= gActiveBank << 8; + dp01_build_cmdbuf_x21_a_bb(1, 10, r4); + } + else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + u16 r2 = GetBankByPlayerAI(Random() & 2) << 8; + + dp01_build_cmdbuf_x21_a_bb(1, 10, r4 | r2); + } + else + { + u16 r2 = GetBankByPlayerAI(0) << 8; + + dp01_build_cmdbuf_x21_a_bb(1, 10, r4 | r2); + } + OpponentBufferExecCompleted(); + } +} +#else +__attribute__((naked)) +void sub_8035428(void) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + ldr r6, _0803545C @ =gActiveBank\n\ + ldrb r0, [r6]\n\ + lsls r0, 9\n\ + ldr r1, _08035460 @ =gUnknown_02023A64\n\ + adds r5, r0, r1\n\ + ldr r0, _08035464 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x93\n\ + lsls r0, 3\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080354F8\n\ + bl BattleAI_SetupAIData\n\ + bl BattleAI_GetAIActionToUse\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0x4\n\ + beq _08035468\n\ + cmp r4, 0x5\n\ + bne _08035474\n\ + movs r0, 0x1\n\ + movs r1, 0x4\n\ + b _0803546C\n\ + .align 2, 0\n\ +_0803545C: .4byte gActiveBank\n\ +_08035460: .4byte gUnknown_02023A64\n\ +_08035464: .4byte gBattleTypeFlags\n\ +_08035468:\n\ + movs r0, 0x1\n\ + movs r1, 0x3\n\ +_0803546C:\n\ + movs r2, 0\n\ + bl dp01_build_cmdbuf_x21_a_bb\n\ + b _080354E0\n\ +_08035474:\n\ + ldr r3, _080354E8 @ =gBattleMoves\n\ + lsls r0, r4, 1\n\ + adds r2, r5, r0\n\ + ldrh r1, [r2]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + ldrb r1, [r0, 0x6]\n\ + movs r0, 0x12\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08035494\n\ + ldr r1, _080354EC @ =gBankTarget\n\ + ldrb r0, [r6]\n\ + strb r0, [r1]\n\ +_08035494:\n\ + ldrh r1, [r2]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + ldrb r1, [r0, 0x6]\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080354CE\n\ + movs r0, 0\n\ + bl GetBankByPlayerAI\n\ + ldr r5, _080354EC @ =gBankTarget\n\ + strb r0, [r5]\n\ + ldr r0, _080354F0 @ =gAbsentBankFlags\n\ + ldrb r1, [r0]\n\ + ldr r2, _080354F4 @ =gBitTable\n\ + ldrb r0, [r5]\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldr r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _080354CE\n\ + movs r0, 0x2\n\ + bl GetBankByPlayerAI\n\ + strb r0, [r5]\n\ +_080354CE:\n\ + ldr r0, _080354EC @ =gBankTarget\n\ + ldrb r0, [r0]\n\ + lsls r0, 8\n\ + orrs r4, r0\n\ + movs r0, 0x1\n\ + movs r1, 0xA\n\ + adds r2, r4, 0\n\ + bl dp01_build_cmdbuf_x21_a_bb\n\ +_080354E0:\n\ + bl OpponentBufferExecCompleted\n\ + b _0803558A\n\ + .align 2, 0\n\ +_080354E8: .4byte gBattleMoves\n\ +_080354EC: .4byte gBankTarget\n\ +_080354F0: .4byte gAbsentBankFlags\n\ +_080354F4: .4byte gBitTable\n\ +_080354F8:\n\ + movs r6, 0x3\n\ +_080354FA:\n\ + bl Random\n\ + adds r4, r0, 0\n\ + ands r4, r6\n\ + lsls r0, r4, 1\n\ + adds r0, r5, r0\n\ + ldrh r2, [r0]\n\ + cmp r2, 0\n\ + beq _080354FA\n\ + ldr r1, _08035534 @ =gBattleMoves\n\ + lsls r0, r2, 1\n\ + adds r0, r2\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r1, [r0, 0x6]\n\ + movs r0, 0x12\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803553C\n\ + ldr r0, _08035538 @ =gActiveBank\n\ + ldrb r0, [r0]\n\ + lsls r0, 8\n\ + orrs r4, r0\n\ + movs r0, 0x1\n\ + movs r1, 0xA\n\ + adds r2, r4, 0\n\ + bl dp01_build_cmdbuf_x21_a_bb\n\ + b _08035586\n\ + .align 2, 0\n\ +_08035534: .4byte gBattleMoves\n\ +_08035538: .4byte gActiveBank\n\ +_0803553C:\n\ + ldr r0, _0803556C @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08035570\n\ + bl Random\n\ + movs r1, 0x2\n\ + ands r1, r0\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + adds r0, r1, 0\n\ + bl GetBankByPlayerAI\n\ + adds r2, r0, 0\n\ + lsls r2, 24\n\ + lsrs r2, 16\n\ + orrs r2, r4\n\ + movs r0, 0x1\n\ + movs r1, 0xA\n\ + bl dp01_build_cmdbuf_x21_a_bb\n\ + b _08035586\n\ + .align 2, 0\n\ +_0803556C: .4byte gBattleTypeFlags\n\ +_08035570:\n\ + movs r0, 0\n\ + bl GetBankByPlayerAI\n\ + adds r2, r0, 0\n\ + lsls r2, 24\n\ + lsrs r2, 16\n\ + orrs r2, r4\n\ + movs r0, 0x1\n\ + movs r1, 0xA\n\ + bl dp01_build_cmdbuf_x21_a_bb\n\ +_08035586:\n\ + bl OpponentBufferExecCompleted\n\ +_0803558A:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +void sub_8035590(void) +{ + // What is this? + dp01_build_cmdbuf_x23_aa_0(1, ewram[0x160D4 + gActiveBank / 2 * 2]); + OpponentBufferExecCompleted(); +} + +void sub_80355C0(void) +{ + s32 r4; + + if (ewram[0x160C8 + GetBankIdentity(gActiveBank) / 2] == 6) + { + u8 r6; + u8 r5; + + r4 = sub_8036CD4(); + if (r4 == 6) + { + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + r5 = GetBankByPlayerAI(1); + r6 = r5; + } + else + { + r6 = GetBankByPlayerAI(1); + r5 = GetBankByPlayerAI(3); + } + for (r4 = 0; r4 < 6; r4++) + { + if (GetMonData(&gEnemyParty[r4], MON_DATA_HP) != 0 + && r4 != gBattlePartyID[r6] + && r4 != gBattlePartyID[r5]) + break; + } + } + } + else + { + r4 = ewram[0x160C8 + GetBankIdentity(gActiveBank) / 2]; + ewram[0x160C8 + GetBankIdentity(gActiveBank) / 2] = 6; + } + ewram[0x16068 + gActiveBank] = r4; + dp01_build_cmdbuf_x22_a_three_bytes(1, r4, 0); + OpponentBufferExecCompleted(); +} + +void sub_80356C0(void) +{ + OpponentBufferExecCompleted(); +} + +void OpponentHandleHealthBarUpdate(void) +{ + s16 r7; + + load_gfxc_health_bar(0); + r7 = (gBattleBufferA[gActiveBank][3] << 8) | gBattleBufferA[gActiveBank][2]; + if (r7 != 0x7FFF) + { + u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + u32 hp = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, hp, r7); + } + else + { + u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); + } + gBattleBankFunc[gActiveBank] = sub_80330C8; +} + +void OpponentHandleExpBarUpdate(void) +{ + OpponentBufferExecCompleted(); +} + +void OpponentHandleStatusIconUpdate(void) +{ + if (mplay_80342A4(gActiveBank) == 0) + { + sub_8045A5C(gHealthboxIDs[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], 9); + ewram17810[gActiveBank].unk0_4 = 0; + gBattleBankFunc[gActiveBank] = sub_8033494; + } +} + +void OpponentHandleStatusAnimation(void) +{ + if (mplay_80342A4(gActiveBank) == 0) + { + move_anim_start_t2_for_situation( + gBattleBufferA[gActiveBank][1], + gBattleBufferA[gActiveBank][2] + | (gBattleBufferA[gActiveBank][3] << 8) + | (gBattleBufferA[gActiveBank][4] << 16) + | (gBattleBufferA[gActiveBank][5] << 24)); + gBattleBankFunc[gActiveBank] = sub_8033494; + } +} + +void OpponentHandleStatusXor(void) +{ + OpponentBufferExecCompleted(); +} + +void sub_80358B0(void) +{ + OpponentBufferExecCompleted(); +} + +void OpponentHandleDMATransfer(void) +{ + OpponentBufferExecCompleted(); +} + +void sub_80358C8(void) +{ + OpponentBufferExecCompleted(); +} + +void sub_80358D4(void) +{ + OpponentBufferExecCompleted(); +} + +void sub_80358E0(void) +{ + OpponentBufferExecCompleted(); +} + +void sub_80358EC(void) +{ + OpponentBufferExecCompleted(); +} + +void sub_80358F8(void) +{ + OpponentBufferExecCompleted(); +} + +void sub_8035904(void) +{ + OpponentBufferExecCompleted(); +} + +void sub_8035910(void) +{ + gUnknown_020238C8.unk0_0 = 0; + OpponentBufferExecCompleted(); +} + +void sub_803592C(void) +{ + gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBank][1]; + OpponentBufferExecCompleted(); +} + +void sub_8035964(void) +{ + gUnknown_020238C8.unk0_7 = 0; + OpponentBufferExecCompleted(); +} + +void sub_803597C(void) +{ + gUnknown_020238C8.unk0_7 ^= 1; + OpponentBufferExecCompleted(); +} + +void OpponentHandleHitAnimation(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) + { + OpponentBufferExecCompleted(); + } + else + { + gDoingBattleAnim = TRUE; + gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; + sub_8047858(gActiveBank); + gBattleBankFunc[gActiveBank] = bx_blink_t7; + } +} + +void sub_8035A14(void) +{ + OpponentBufferExecCompleted(); +} + +void OpponentHandleEffectivenessSound(void) +{ + s8 pan; + + if (GetBankSide(gActiveBank) == 0) + pan = -64; + else + pan = 63; + PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan); + OpponentBufferExecCompleted(); +} + +void sub_8035A64(void) +{ + PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + OpponentBufferExecCompleted(); +} + +void OpponentHandleFaintingCry(void) +{ + PlayCry3( + GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES), + 25, 5); + OpponentBufferExecCompleted(); +} + +void dp01t_2E_7_battle_intro(void) +{ + sub_80E43C0(gBattleBufferA[gActiveBank][1]); + gUnknown_02024DE8 |= 1; + OpponentBufferExecCompleted(); +} + +void sub_8035B04(void) +{ + u8 taskId; + + oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); + gSprites[gObjectBankIDs[gActiveBank]].data0 = 35; + gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; + gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; + oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8035C10); + taskId = CreateTask(sub_8035C44, 5); + gTasks[taskId].data[0] = gActiveBank; + if (ewram17810[gActiveBank].unk0_0) + gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; + ewram17840.unk9_0 = 1; + gBattleBankFunc[gActiveBank] = nullsub_45; +} + +void sub_8035C10(struct Sprite *sprite) +{ + sub_8031B74(sprite->oam.affineParam); + sprite->oam.tileNum = sprite->data5; + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); +} + +void sub_8035C44(u8 taskId) +{ + u8 r9; + + r9 = gActiveBank; + gActiveBank = gTasks[taskId].data[0]; + if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_803495C(gActiveBank, 0); + } + else + { + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_803495C(gActiveBank, 0); + gActiveBank ^= 2; + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_803495C(gActiveBank, 0); + gActiveBank ^= 2; + } + gBattleBankFunc[gActiveBank] = sub_8032E2C; + gActiveBank = r9; + DestroyTask(taskId); +} + +void dp01t_30_7_0803D67C(void) +{ + if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) + { + OpponentBufferExecCompleted(); + return; + } + + ewram17810[gActiveBank].unk0_0 = 1; + if (gBattleBufferA[gActiveBank][2] != 0) + { + if (ewram17810[gActiveBank].unk1_1 < 2) + { + ewram17810[gActiveBank].unk1_1++; + return; + } + else + { + ewram17810[gActiveBank].unk1_1 = 0; + } + } + gUnknown_02024E68[gActiveBank] = sub_8044804( + gActiveBank, + (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], + gBattleBufferA[gActiveBank][1], + gBattleBufferA[gActiveBank][2]); + ewram17810[gActiveBank].unk5 = 0; + if (gBattleBufferA[gActiveBank][2] != 0) + ewram17810[gActiveBank].unk5 = 0x5D; + gBattleBankFunc[gActiveBank] = sub_8035E2C; +} + +void sub_8035E2C(void) +{ + if (ewram17810[gActiveBank].unk5++ >= 93) + { + ewram17810[gActiveBank].unk5 = 0; + OpponentBufferExecCompleted(); + } +} + +void sub_8035E6C(void) +{ + if (ewram17810[gActiveBank].unk0_0) + gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; + OpponentBufferExecCompleted(); +} + +void sub_8035EB8(void) +{ + OpponentBufferExecCompleted(); +} + +void OpponentHandleSpriteInvisibility(void) +{ + if (sub_8078874(gActiveBank) != 0) + { + gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; + sub_8031F88(gActiveBank); + } + OpponentBufferExecCompleted(); +} + +void OpponentHandleBattleAnimation(void) +{ + if (mplay_80342A4(gActiveBank) == 0) + { + u8 r3 = gBattleBufferA[gActiveBank][1]; + u16 r4 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + + if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, r3, r4) != 0) + OpponentBufferExecCompleted(); + else + gBattleBankFunc[gActiveBank] = sub_80334C0; + } +} + +void OpponentHandleLinkStandbyMsg(void) +{ + OpponentBufferExecCompleted(); +} + +void OpponentHandleResetActionMoveSelection(void) +{ + OpponentBufferExecCompleted(); +} + +void sub_8035FA4(void) +{ + if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_WILD)) + { + gMain.inBattle = FALSE; + gMain.callback1 = gPreBattleCallback1; + SetMainCallback2(gMain.savedCallback); + } + OpponentBufferExecCompleted(); +} + +void nullsub_46(void) +{ +} diff --git a/src/battle/battle_811DA74.c b/src/battle/battle_811DA74.c new file mode 100644 index 000000000..36a287efc --- /dev/null +++ b/src/battle/battle_811DA74.c @@ -0,0 +1,1606 @@ +#include "global.h" +#include "battle.h" +#include "battle_interface.h" +#include "data2.h" +#include "battle_811DA74.h" +#include "battle_anim_813F0F4.h" +#include "link.h" +#include "m4a.h" +#include "main.h" +#include "palette.h" +#include "pokeball.h" +#include "pokemon.h" +#include "rom3.h" +#include "rom_8077ABC.h" +#include "sound.h" +#include "songs.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "util.h" + +struct UnknownStruct1 +{ + u8 unk0; + u8 unk1; + u8 unk2[0x1FE]; +}; + +//Possibly PokemonSubstruct1 +struct UnknownStruct3 +{ + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; +}; + +extern u16 gBattleTypeFlags; +extern u8 gDisplayedStringBattle[]; +extern u8 gBattleBufferA[][0x200]; +extern u8 gActiveBank; +extern u32 gBattleExecBuffer; +extern u16 gBattlePartyID[]; +extern u8 gObjectBankIDs[]; +extern u8 gBattleOutcome; +extern u16 gUnknown_02024DE8; +extern u8 gUnknown_02024E68[]; +extern u8 gDoingBattleAnim; +extern u32 gPID_perBank[]; +extern struct SpriteTemplate gUnknown_02024E8C; +extern u32 *gDisableStructMoveAnim; +extern u32 gMoveDmgMoveAnim; +extern u16 gMovePowerMoveAnim; +extern u8 gHappinessMoveAnim; +extern u16 gWeatherMoveAnim; +extern u8 gUnknown_0202F7C4; +extern struct Window gUnknown_03004210; +extern u16 gUnknown_030042A0; +extern u16 gUnknown_030042A4; +extern MainCallback gPreBattleCallback1; +extern void (*gBattleBankFunc[])(void); +extern u8 gHealthboxIDs[]; +extern u8 gUnknown_0300434C[]; +extern u8 gBattleMonForms[]; +extern u8 gAnimScriptActive; +extern void (*gAnimScriptCallback)(void); +extern void (*const gLinkPartnerBufferCommands[])(void); + +extern u8 move_anim_start_t3(); +extern u8 sub_8078874(); +extern void sub_8044CA0(u8); +extern void sub_8030E38(struct Sprite *); +extern void sub_80E43C0(); +extern void sub_8047858(); +extern void move_anim_start_t2_for_situation(); +extern void load_gfxc_health_bar(); +extern void sub_8043D84(); +extern void BufferStringBattle(); +extern void sub_8031F24(void); +extern void sub_80326EC(); +extern void ExecuteMoveAnim(); +extern void sub_80324BC(); +extern u8 sub_8031720(); +extern u8 mplay_80342A4(); +extern void oamt_add_pos2_onto_pos1(); +extern void oamt_set_x3A_32(); +extern void sub_8078B34(struct Sprite *); +extern void sub_80105EC(struct Sprite *); +extern s32 sub_803FC34(u16); +extern void sub_8031AF4(); +extern void sub_80313A0(struct Sprite *); +extern u8 sub_8046400(); +extern void sub_80312F0(struct Sprite *); +extern u8 CreateInvisibleSpriteWithCallback(); +extern void sub_80318FC(); +extern u8 sub_8077ABC(); +extern u8 sub_8077F68(); +extern u8 sub_8079E90(); +extern void nullsub_10(); +extern void sub_8045A5C(); +extern void sub_804777C(); +extern void sub_8043DFC(); +//extern s16 sub_8045C78(); +extern void sub_80440EC(); +extern void sub_80324F8(); +extern void nullsub_9(u16); +extern void sub_8043DB0(); +extern void move_anim_start_t4(); +extern void c3_0802FDF4(u8); +extern void sub_8031F88(); +extern void sub_8141828(); +extern void c2_8011A1C(void); + +void LinkPartnerBufferRunCommand(void); +void sub_811E0A0(void); +void LinkPartnerBufferExecCompleted(void); +u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *b); +void sub_811EC68(u8); +void sub_811F864(u8, u8); +void sub_811FA5C(void); +void sub_811FF30(void); +void sub_812071C(u8); +void sub_81208E0(void); + + +void nullsub_74(void) +{ +} + +void SetBankFuncToLinkPartnerBufferRunCommand(void) +{ + gBattleBankFunc[gActiveBank] = LinkPartnerBufferRunCommand; +} + +void LinkPartnerBufferRunCommand(void) +{ + if (gBattleExecBuffer & gBitTable[gActiveBank]) + { + if (gBattleBufferA[gActiveBank][0] <= 0x38) + gLinkPartnerBufferCommands[gBattleBufferA[gActiveBank][0]](); + else + LinkPartnerBufferExecCompleted(); + } +} + +void sub_811DAE4(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + LinkPartnerBufferExecCompleted(); +} + +void sub_811DB1C(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + { + nullsub_10(0); + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + LinkPartnerBufferExecCompleted(); + } +} + +void sub_811DB84(void) +{ + if ((--ewram17810[gActiveBank].unk9) == 0xFF) + { + ewram17810[gActiveBank].unk9 = 0; + LinkPartnerBufferExecCompleted(); + } +} + +void sub_811DBC0(void) +{ + bool8 r6 = FALSE; + + if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & 0x40))) + { + if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy) + r6 = TRUE; + } + else + { + if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy + && gSprites[gHealthboxIDs[gActiveBank ^ 2]].callback == SpriteCallbackDummy) + r6 = TRUE; + } + if (IsCryPlayingOrClearCrySongs()) + r6 = FALSE; + if (r6) + { + ewram17810[gActiveBank].unk9 = 3; + gBattleBankFunc[gActiveBank] = sub_811DB84; + } +} + +void sub_811DCA0(void) +{ + u8 r2; + + if (!ewram17810[gActiveBank].unk0_3) + { + // I couldn't get it to work as a bitfield here + r2 = *((u8 *)&ewram17810[gActiveBank ^ 2]) & 8; + if (!r2 && (++ewram17810[gActiveBank].unk9) != 1) + { + ewram17810[gActiveBank].unk9 = r2; + if (IsDoubleBattle() && !(gBattleTypeFlags & 0x40)) + { + DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank ^ 2]]); + sub_8045A5C(gHealthboxIDs[gActiveBank ^ 2], &gPlayerParty[gBattlePartyID[gActiveBank ^ 2]], 0); + sub_804777C(gActiveBank ^ 2); + sub_8043DFC(gHealthboxIDs[gActiveBank ^ 2]); + } + DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]); + sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 0); + sub_804777C(gActiveBank); + sub_8043DFC(gHealthboxIDs[gActiveBank]); + (s8)ewram17810[4].unk9 &= ~1; + gBattleBankFunc[gActiveBank] = sub_811DBC0; + } + } +} + +void sub_811DDE8(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].animEnded + && gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0) + LinkPartnerBufferExecCompleted(); +} + +void bx_t3_healthbar_update(void) +{ + s16 r4; + + r4 = sub_8045C78(gActiveBank, gHealthboxIDs[gActiveBank], 0, 0); + sub_8043DFC(gHealthboxIDs[gActiveBank]); + if (r4 != -1) + { + sub_80440EC(gHealthboxIDs[gActiveBank], r4, 0); + } + else + { + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + LinkPartnerBufferExecCompleted(); + } +} + +void sub_811DE98(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].pos1.y + gSprites[gObjectBankIDs[gActiveBank]].pos2.y > 160) + { + nullsub_9(GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); + FreeOamMatrix(gSprites[gObjectBankIDs[gActiveBank]].oam.matrixNum); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8043DB0(gHealthboxIDs[gActiveBank]); + LinkPartnerBufferExecCompleted(); + } +} + +void sub_811DF34(void) +{ + if (!ewram17810[gActiveBank].unk0_6) + { + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8043DB0(gHealthboxIDs[gActiveBank]); + LinkPartnerBufferExecCompleted(); + } +} + +void sub_811DFA0(void) +{ + if (gUnknown_03004210.state == 0) + LinkPartnerBufferExecCompleted(); +} + +void bx_blink_t3(void) +{ + u8 spriteId = gObjectBankIDs[gActiveBank]; + if (gSprites[spriteId].data1 == 32) + { + gSprites[spriteId].data1 = 0; + gSprites[spriteId].invisible = FALSE; + gDoingBattleAnim = 0; + LinkPartnerBufferExecCompleted(); + } + else + { + if ((gSprites[spriteId].data1 % 4) == 0) + { + gSprites[spriteId].invisible ^= 1; + } + gSprites[spriteId].data1++; + } +} + +void sub_811E034(void) +{ + if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy) + { + if (ewram17800[gActiveBank].unk0_2) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); + gBattleBankFunc[gActiveBank] = sub_811E0A0; + } +} + +void sub_811E0A0(void) +{ + if (!ewram17810[gActiveBank].unk0_6) + LinkPartnerBufferExecCompleted(); +} + +void sub_811E0CC(void) +{ + if (ewram17810[gActiveBank].unk1_0) + { + ewram17810[gActiveBank].unk0_7 = 0; + ewram17810[gActiveBank].unk1_0 = 0; + FreeSpriteTilesByTag(0x27F9); + FreeSpritePaletteByTag(0x27F9); + CreateTask(c3_0802FDF4, 10); + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 0); + sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 0); + sub_804777C(gActiveBank); + sub_8043DFC(gHealthboxIDs[gActiveBank]); + sub_8031F88(gActiveBank); + gBattleBankFunc[gActiveBank] = sub_811E034; + } +} + +void sub_811E1BC(void) +{ + if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank].unk0_7) + sub_8141828(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]); + if (gSprites[gUnknown_0300434C[gActiveBank]].callback == SpriteCallbackDummy + && !ewram17810[gActiveBank].unk0_3) + { + DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]); + gBattleBankFunc[gActiveBank] = sub_811E0CC; + } +} + +void sub_811E258(void) +{ + if (gReceivedRemoteLinkPlayers == 0) + { + m4aSongNumStop(0x5A); + gMain.inBattle = FALSE; + gMain.callback1 = gPreBattleCallback1; + SetMainCallback2(c2_8011A1C); + } +} + +void sub_811E29C(void) +{ + if (!gPaletteFade.active) + { + if (gBattleTypeFlags & 2) + { + sub_800832C(); + gBattleBankFunc[gActiveBank] = sub_811E258; + } + else + { + m4aSongNumStop(0x5A); + gMain.inBattle = FALSE; + gMain.callback1 = gPreBattleCallback1; + SetMainCallback2(gMain.savedCallback); + } + } +} + +void LinkPartnerBufferExecCompleted(void) +{ + u8 multiplayerId; + + gBattleBankFunc[gActiveBank] = LinkPartnerBufferRunCommand; + if (gBattleTypeFlags & 2) + { + multiplayerId = GetMultiplayerId(); + dp01_prepare_buffer_wireless_probably(2, 4, &multiplayerId); + gBattleBufferA[gActiveBank][0] = 0x38; + } + else + { + gBattleExecBuffer &= ~gBitTable[gActiveBank]; + } +} + +void sub_811E38C(void) +{ + if (!ewram17810[gActiveBank].unk0_4) + LinkPartnerBufferExecCompleted(); +} + +void sub_811E3B8(void) +{ + if (!ewram17810[gActiveBank].unk0_5) + LinkPartnerBufferExecCompleted(); +} + +void LinkPartnerHandleGetAttributes(void) +{ + u8 unk[256]; + int r6 = 0; + s32 i; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + r6 = dp01_getattr_by_ch1_for_player_pokemon(gBattlePartyID[gActiveBank], unk); + } + else + { + u8 r4 = gBattleBufferA[gActiveBank][2]; + + for (i = 0; i < 6; i++) + { + if (r4 & 1) + r6 += dp01_getattr_by_ch1_for_player_pokemon(i, unk + r6); + r4 >>= 1; + } + } + dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, r6, unk); + LinkPartnerBufferExecCompleted(); +} + +// Duplicate of dp01_getattr_by_ch1_for_player_pokemon_ +u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) +{ + struct BattlePokemon battlePokemon; + struct UnknownStruct3 moveData; + u8 nickname[20]; + u8 *src; + s16 data16; + u32 data32; + s32 size = 0; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); + battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); + for (size = 0; size < 4; size++) + { + battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); + battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + } + battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); + battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP); + battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); + battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); + battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); + battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP); + battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); + battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); + battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); + battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); + battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); + battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); + battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY); + battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); + GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); + StringCopy10(battlePokemon.nickname, nickname); + GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); + src = (u8 *)&battlePokemon; + for (size = 0; size < sizeof(battlePokemon); size++) + buffer[size] = src[size]; + break; + case 1: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 2: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 3: + for (size = 0; size < 4; size++) + { + moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); + moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + } + moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + src = (u8 *)&moveData; + for (size = 0; size < sizeof(moveData); size++) + buffer[size] = src[size]; + break; + case 4: + case 5: + case 6: + case 7: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 8: + for (size = 0; size < 4; size++) + buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + size++; + break; + case 9: + case 10: + case 11: + case 12: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); + size = 1; + break; + case 17: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 18: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 19: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV); + size = 1; + break; + case 20: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV); + size = 1; + break; + case 21: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV); + size = 1; + break; + case 22: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV); + size = 1; + break; + case 23: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV); + size = 1; + break; + case 24: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV); + size = 1; + break; + case 25: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); + size = 1; + break; + case 26: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS); + size = 1; + break; + case 27: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION); + size = 1; + break; + case 28: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL); + size = 1; + break; + case 29: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME); + size = 1; + break; + case 30: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL); + size = 1; + break; + case 31: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + size = 6; + break; + case 32: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + size = 1; + break; + case 33: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + size = 1; + break; + case 34: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + size = 1; + break; + case 35: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + size = 1; + break; + case 36: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + size = 1; + break; + case 37: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + size = 1; + break; + case 38: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 39: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 40: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 41: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); + size = 1; + break; + case 42: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 43: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 44: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 45: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 46: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 47: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 48: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 49: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL); + size = 1; + break; + case 50: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY); + size = 1; + break; + case 51: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE); + size = 1; + break; + case 52: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART); + size = 1; + break; + case 53: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH); + size = 1; + break; + case 54: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN); + size = 1; + break; + case 55: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON); + size = 1; + break; + case 56: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON); + size = 1; + break; + case 57: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON); + size = 1; + break; + case 58: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON); + size = 1; + break; + case 59: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON); + size = 1; + break; + } + return size; +} + +void sub_811EC04(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void LinkPartnerHandleSetAttributes(void) +{ + u8 i; + u8 r4; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + sub_811EC68(gBattlePartyID[gActiveBank]); + } + else + { + r4 = gBattleBufferA[gActiveBank][2]; + for (i = 0; i < 6; i++) + { + if (r4 & 1) + sub_811EC68(i); + r4 >>= 1; + } + } + LinkPartnerBufferExecCompleted(); +} + +// Duplicate of dp01_setattr_by_ch1_for_player_pokemon +void sub_811EC68(u8 a) +{ + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; + struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; + s32 i; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + { + u8 iv; + + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + for (i = 0; i < 4; i++) + { + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + } + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); + SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + iv = battlePokemon->hpIV; + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); + iv = battlePokemon->attackIV; + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + iv = battlePokemon->defenseIV; + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + iv = battlePokemon->speedIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + iv = battlePokemon->spAttackIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + iv = battlePokemon->spDefenseIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); + SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); + SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); + SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); + SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + } + break; + case 1: + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); + break; + case 2: + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); + break; + case 3: + for (i = 0; i < 4; i++) + { + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + } + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); + break; + case 4: + case 5: + case 6: + case 7: + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); + break; + case 8: + SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); + break; + case 9: + case 10: + case 11: + case 12: + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); + break; + case 17: + SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); + break; + case 18: + SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); + break; + case 19: + SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 20: + SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 21: + SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 22: + SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 23: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 24: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 25: + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); + break; + case 26: + SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); + break; + case 27: + SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); + break; + case 28: + SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 29: + SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); + break; + case 30: + SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); + break; + case 31: + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); + break; + case 32: + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 33: + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 34: + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 35: + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 36: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 37: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 38: + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); + break; + case 39: + SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); + break; + case 40: + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); + break; + case 41: + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 42: + SetMonData(&gPlayerParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 43: + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 44: + SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); + break; + case 45: + SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); + break; + case 46: + SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); + break; + case 47: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); + break; + case 48: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); + break; + case 49: + SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); + break; + case 50: + SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); + break; + case 51: + SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); + break; + case 52: + SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); + break; + case 53: + SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); + break; + case 54: + SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); + break; + case 55: + SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 56: + SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 57: + SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 58: + SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 59: + SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + } + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); +} + +void sub_811F664(void) +{ + u8 *dst; + u8 i; + + dst = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; + for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) + dst[i] = gBattleBufferA[gActiveBank][3 + i]; + LinkPartnerBufferExecCompleted(); +} + +void sub_811F6D8(void) +{ + sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + GetMonSpriteTemplate_803C56C( + GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES), + GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + sub_8077ABC(gActiveBank, 2), + sub_8077F68(gActiveBank), + sub_8079E90(gActiveBank)); + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; + gSprites[gObjectBankIDs[gActiveBank]].data0 = gActiveBank; + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]); + gBattleBankFunc[gActiveBank] = sub_811DDE8; +} + +void sub_811F7F4(void) +{ + sub_8032AA8(gActiveBank, gBattleBufferA[gActiveBank][2]); + gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1]; + sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + sub_811F864(gActiveBank, gBattleBufferA[gActiveBank][2]); + gBattleBankFunc[gActiveBank] = sub_811E1BC; +} + +void sub_811F864(u8 a, u8 b) +{ + u16 species; + + sub_8032AA8(a, b); + gBattlePartyID[a] = gBattleBufferA[a][1]; + species = GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_SPECIES); + gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); + GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a)); + gObjectBankIDs[a] = CreateSprite( + &gUnknown_02024E8C, + sub_8077ABC(a, 2), + sub_8077F68(a), + sub_8079E90(a)); + gSprites[gUnknown_0300434C[a]].data1 = gObjectBankIDs[a]; + gSprites[gObjectBankIDs[a]].data0 = a; + gSprites[gObjectBankIDs[a]].data2 = species; + gSprites[gObjectBankIDs[a]].oam.paletteNum = a; + StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]); + gSprites[gObjectBankIDs[a]].invisible = TRUE; + gSprites[gObjectBankIDs[a]].callback = SpriteCallbackDummy; + gSprites[gUnknown_0300434C[a]].data0 = sub_8046400(0, 0xFF); +} + +void sub_811F9D0(void) +{ + if (gBattleBufferA[gActiveBank][1] == 0) + { + ewram17810[gActiveBank].unk4 = 0; + gBattleBankFunc[gActiveBank] = sub_811FA5C; + } + else + { + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8043DB0(gHealthboxIDs[gActiveBank]); + LinkPartnerBufferExecCompleted(); + } +} + +void sub_811FA5C(void) +{ + switch (ewram17810[gActiveBank].unk4) + { + case 0: + if (ewram17800[gActiveBank].unk0_2) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + ewram17810[gActiveBank].unk4 = 1; + break; + case 1: + if (!ewram17810[gActiveBank].unk0_6) + { + ewram17810[gActiveBank].unk4 = 0; + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 1); + gBattleBankFunc[gActiveBank] = sub_811DF34; + } + break; + } +} + +void sub_811FAE4(void) +{ + s16 xOffset; + u32 gender; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (GetBankIdentity(gActiveBank) & 2) + xOffset = 16; + else + xOffset = -16; + gender = gLinkPlayers[sub_803FC34(gActiveBank)].gender; + } + else + { + xOffset = 0; + gender = gLinkPlayers[GetMultiplayerId() ^ 1].gender; + } + sub_8031AF4(gender, gActiveBank); + GetMonSpriteTemplate_803C5A0(gender, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + 80 + xOffset, 80 + 4 * (8 - gTrainerBackPicCoords[gender].coords), + sub_8079E90(gActiveBank)); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; + gSprites[gObjectBankIDs[gActiveBank]].data0 = -2; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gBattleBankFunc[gActiveBank] = sub_811DAE4; +} + +void sub_811FC30(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_811FC3C(void) +{ + oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); + gSprites[gObjectBankIDs[gActiveBank]].data0 = 35; + gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; + gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; + oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + gBattleBankFunc[gActiveBank] = sub_811DB1C; +} + +void sub_811FCE8(void) +{ + if (ewram17810[gActiveBank].unk4 == 0) + { + if (ewram17800[gActiveBank].unk0_2) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + ewram17810[gActiveBank].unk4++; + } + else if (!ewram17810[gActiveBank].unk0_6) + { + ewram17810[gActiveBank].unk4 = 0; + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + PlaySE12WithPanning(SE_POKE_DEAD, -64); + gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; + gSprites[gObjectBankIDs[gActiveBank]].data2 = 5; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80105EC; + gBattleBankFunc[gActiveBank] = sub_811DE98; + } +} + +void sub_811FDCC(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_811FDD8(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_811FDE4(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_811FDF0(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_811FDFC(void) +{ + if (!mplay_80342A4(gActiveBank)) + { + u32 r0 = gBattleBufferA[gActiveBank][1] + | (gBattleBufferA[gActiveBank][2] << 8); + + gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; + gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] + | (gBattleBufferA[gActiveBank][5] << 8); + gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] + | (gBattleBufferA[gActiveBank][7] << 8) + | (gBattleBufferA[gActiveBank][8] << 16) + | (gBattleBufferA[gActiveBank][9] << 24); + gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; + gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] + | (gBattleBufferA[gActiveBank][13] << 8); + gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; + gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; + + if (sub_8031720(r0, gUnknown_0202F7C4) != 0) + LinkPartnerBufferExecCompleted(); + else + { + ewram17810[gActiveBank].unk4 = 0; + gBattleBankFunc[gActiveBank] = sub_811FF30; + } + } +} + +void sub_811FF30(void) +{ + u16 r4 = gBattleBufferA[gActiveBank][1] + | (gBattleBufferA[gActiveBank][2] << 8); + u8 r7 = gBattleBufferA[gActiveBank][11]; + + switch (ewram17810[gActiveBank].unk4) + { + case 0: + if (ewram17800[gActiveBank].unk0_2 && !ewram17800[gActiveBank].unk0_3) + { + ewram17800[gActiveBank].unk0_3 = 1; + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + } + ewram17810[gActiveBank].unk4 = 1; + break; + case 1: + if (!ewram17810[gActiveBank].unk0_6) + { + sub_80326EC(0); + ExecuteMoveAnim(r4); + ewram17810[gActiveBank].unk4 = 2; + } + break; + case 2: + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + sub_80326EC(1); + if ((ewram17800[gActiveBank].unk0_2) && r7 <= 1) + { + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); + ewram17800[gActiveBank].unk0_3 = 0; + } + ewram17810[gActiveBank].unk4 = 3; + } + break; + case 3: + if (!ewram17810[gActiveBank].unk0_6) + { + sub_8031F24(); + sub_80324BC( + gActiveBank, + gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + ewram17810[gActiveBank].unk4 = 0; + LinkPartnerBufferExecCompleted(); + } + break; + } +} + +void sub_8120094(void) +{ + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); + sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gBattleBankFunc[gActiveBank] = sub_811DFA0; +} + +void sub_81200F8(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120104(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120110(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_812011C(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120128(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120134(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120140(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void LinkPartnerHandleHealthBarUpdate(void) +{ + s16 r7; + + load_gfxc_health_bar(0); + r7 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + if (r7 != 0x7FFF) + { + u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + u32 hp = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, hp, r7); + } + else + { + u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); + } + gBattleBankFunc[gActiveBank] = bx_t3_healthbar_update; +} + +void LinkPartnerHandleExpBarUpdate(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void LinkPartnerHandleStatusIconUpdate(void) +{ + if (mplay_80342A4(gActiveBank) == 0) + { + sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 9); + ewram17810[gActiveBank].unk0_4 = 0; + gBattleBankFunc[gActiveBank] = sub_811E38C; + } +} + +void LinkPartnerHandleStatusAnimation(void) +{ + if (mplay_80342A4(gActiveBank) == 0) + { + move_anim_start_t2_for_situation( + gBattleBufferA[gActiveBank][1], + gBattleBufferA[gActiveBank][2] + | (gBattleBufferA[gActiveBank][3] << 8) + | (gBattleBufferA[gActiveBank][4] << 16) + | (gBattleBufferA[gActiveBank][5] << 24)); + gBattleBankFunc[gActiveBank] = sub_811E38C; + } +} + +void sub_8120324(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120330(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_812033C(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120348(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120354(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120360(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_812036C(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120378(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120384(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120390(void) +{ + gUnknown_020238C8.unk0_0 = 0; + LinkPartnerBufferExecCompleted(); +} + +void sub_81203AC(void) +{ + gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBank][1]; + LinkPartnerBufferExecCompleted(); +} + +void sub_81203E4(void) +{ + gUnknown_020238C8.unk0_7 = 0; + LinkPartnerBufferExecCompleted(); +} + +void sub_81203FC(void) +{ + gUnknown_020238C8.unk0_7 ^= 1; + LinkPartnerBufferExecCompleted(); +} + +void LinkPartnerHandleHitAnimation(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) + { + LinkPartnerBufferExecCompleted(); + } + else + { + gDoingBattleAnim = TRUE; + gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; + sub_8047858(gActiveBank); + gBattleBankFunc[gActiveBank] = bx_blink_t3; + } +} + +void sub_8120494(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void LinkPartnerHandleEffectivenessSound(void) +{ + s8 pan; + + if (GetBankSide(gActiveBank) == 0) + pan = -64; + else + pan = 63; + PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan); + LinkPartnerBufferExecCompleted(); +} + +void sub_81204E4(void) +{ + PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + LinkPartnerBufferExecCompleted(); +} + +void LinkPartnerHandleFaintingCry(void) +{ + PlayCry3( + GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES), + -25, 5); + LinkPartnerBufferExecCompleted(); +} + +void dp01t_2E_3_battle_intro(void) +{ + sub_80E43C0(gBattleBufferA[gActiveBank][1]); + gUnknown_02024DE8 |= 1; + LinkPartnerBufferExecCompleted(); +} + +void sub_8120588(void) +{ + u8 r4; + u8 taskId; + + oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); + gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; + gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; + gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; + gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; + oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); + StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); + r4 = AllocSpritePalette(0xD6F9); + LoadCompressedPalette( + gTrainerBackPicPaletteTable[gLinkPlayers[sub_803FC34(gActiveBank)].gender].data, + 0x100 + r4 * 16, 0x20); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = r4; + taskId = CreateTask(sub_812071C, 5); + gTasks[taskId].data[0] = gActiveBank; + if (ewram17810[gActiveBank].unk0_0) + gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; + ewram17840.unk9_0 = 1; + gBattleBankFunc[gActiveBank] = nullsub_74; +} + +void sub_812071C(u8 taskId) +{ + u8 r9; + + if (gTasks[taskId].data[1] < 24) + { + gTasks[taskId].data[1]++; + return; + } + + r9 = gActiveBank; + gActiveBank = gTasks[taskId].data[0]; + if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_811F864(gActiveBank, 0); + } + else + { + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_811F864(gActiveBank, 0); + gActiveBank ^= 2; + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + sub_811F864(gActiveBank, 0); + gActiveBank ^= 2; + } + gBattleBankFunc[gActiveBank] = sub_811DCA0; + gActiveBank = r9; + DestroyTask(taskId); +} + +void dp01t_30_3_80EB11C(void) +{ + if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) + { + LinkPartnerBufferExecCompleted(); + return; + } + + ewram17810[gActiveBank].unk0_0 = 1; + gUnknown_02024E68[gActiveBank] = sub_8044804( + gActiveBank, + (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], + gBattleBufferA[gActiveBank][1], + gBattleBufferA[gActiveBank][2]); + ewram17810[gActiveBank].unk5 = 0; + if (gBattleBufferA[gActiveBank][2] != 0) + ewram17810[gActiveBank].unk5 = 0x5D; + gBattleBankFunc[gActiveBank] = sub_81208E0; +} + +void sub_81208E0(void) +{ + if (ewram17810[gActiveBank].unk5++ >= 93) + { + ewram17810[gActiveBank].unk5 = 0; + LinkPartnerBufferExecCompleted(); + } +} + +void sub_8120920(void) +{ + if (ewram17810[gActiveBank].unk0_0) + gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; + LinkPartnerBufferExecCompleted(); +} + +void sub_812096C(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120978(void) +{ + if (sub_8078874(gActiveBank) != 0) + { + gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; + sub_8031F88(gActiveBank); + } + LinkPartnerBufferExecCompleted(); +} + +void sub_81209D8(void) +{ + if (mplay_80342A4(gActiveBank) == 0) + { + u8 r3 = gBattleBufferA[gActiveBank][1]; + u16 r4 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + + if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, r3, r4) != 0) + LinkPartnerBufferExecCompleted(); + else + gBattleBankFunc[gActiveBank] = sub_811E3B8; + } +} + +void sub_8120A40(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120A4C(void) +{ + LinkPartnerBufferExecCompleted(); +} + +void sub_8120A58(void) +{ + gBattleOutcome = gBattleBufferA[gActiveBank][1]; + FadeOutMapMusic(5); + BeginFastPaletteFade(3); + LinkPartnerBufferExecCompleted(); + gBattleBankFunc[gActiveBank] = sub_811E29C; +} + +void nullsub_75(void) +{ +} diff --git a/src/battle/battle_ai.c b/src/battle/battle_ai.c new file mode 100644 index 000000000..a1cb805d9 --- /dev/null +++ b/src/battle/battle_ai.c @@ -0,0 +1,2150 @@ +#include "global.h" +#include "battle_ai.h" +#include "abilities.h" +#include "battle.h" +#include "battle_move_effects.h" +#include "data2.h" +#include "item.h" +#include "moves.h" +#include "pokemon.h" +#include "rng.h" +#include "rom_8077ABC.h" +#include "species.h" +#include "util.h" + +extern u16 gBattleTypeFlags; +extern u16 gBattleWeather; +extern u8 gActiveBank; +extern u16 gBattlePartyID[MAX_BANKS_BATTLE]; +extern u16 gCurrentMove; +extern int gBattleMoveDamage; +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u8 gAbsentBankFlags; +extern u8 gBattleMoveFlags; +extern u16 gDynamicBasePower; +extern u16 gLastUsedMove[MAX_BANKS_BATTLE]; +extern u32 gStatuses3[MAX_BANKS_BATTLE]; +extern u16 gSideAffecting[2]; +extern struct BattlePokemon gBattleMons[MAX_BANKS_BATTLE]; +extern u8 gCritMultiplier; +extern u16 gTrainerBattleOpponent; +extern u8 *BattleAIs[]; + +enum +{ + WEATHER_TYPE_SUN, + WEATHER_TYPE_RAIN, + WEATHER_TYPE_SANDSTORM, + WEATHER_TYPE_HAIL, +}; + +/* +gAIScriptPtr is a pointer to the next battle AI cmd command to read. +when a command finishes processing, gAIScriptPtr is incremented by +the number of bytes that the current command had reserved for arguments +in order to read the next command correctly. refer to battle_ai_scripts.s for the +AI scripts. +*/ +EWRAM_DATA u8 *gAIScriptPtr = NULL; + +static void BattleAICmd_if_random_less_than(void); +static void BattleAICmd_if_random_greater_than(void); +static void BattleAICmd_if_random_equal(void); +static void BattleAICmd_if_random_not_equal(void); +static void BattleAICmd_score(void); +static void BattleAICmd_if_hp_less_than(void); +static void BattleAICmd_if_hp_more_than(void); +static void BattleAICmd_if_hp_equal(void); +static void BattleAICmd_if_hp_not_equal(void); +static void BattleAICmd_if_status(void); +static void BattleAICmd_if_not_status(void); +static void BattleAICmd_if_status2(void); +static void BattleAICmd_if_not_status2(void); +static void BattleAICmd_if_status3(void); +static void BattleAICmd_if_not_status3(void); +static void BattleAICmd_if_status4(void); +static void BattleAICmd_if_not_status4(void); +static void BattleAICmd_if_less_than(void); +static void BattleAICmd_if_more_than(void); +static void BattleAICmd_if_equal(void); +static void BattleAICmd_if_not_equal(void); +static void BattleAICmd_if_less_than_32(void); +static void BattleAICmd_if_more_than_32(void); +static void BattleAICmd_if_equal_32(void); +static void BattleAICmd_if_not_equal_32(void); +static void BattleAICmd_if_move(void); +static void BattleAICmd_if_not_move(void); +static void BattleAICmd_if_in_bytes(void); +static void BattleAICmd_if_not_in_bytes(void); +static void BattleAICmd_if_in_words(void); +static void BattleAICmd_if_not_in_words(void); +static void BattleAICmd_if_user_can_damage(void); +static void BattleAICmd_if_user_cant_damage(void); +static void BattleAICmd_get_turn_count(void); +static void BattleAICmd_get_type(void); +static void BattleAICmd_get_move_power(void); +static void BattleAICmd_is_most_powerful_move(void); +static void BattleAICmd_get_move(void); +static void BattleAICmd_if_arg_equal(void); +static void BattleAICmd_if_arg_not_equal(void); +static void BattleAICmd_if_would_go_first(void); +static void BattleAICmd_if_would_not_go_first(void); +static void BattleAICmd_nullsub_2A(void); +static void BattleAICmd_nullsub_2B(void); +static void BattleAICmd_count_alive_pokemon(void); +static void BattleAICmd_get_considered_move(void); +static void BattleAICmd_get_considered_move_effect(void); +static void BattleAICmd_get_ability(void); +static void BattleAICmd_get_highest_possible_damage(void); +static void BattleAICmd_if_damage_bonus(void); +static void BattleAICmd_nullsub_32(void); +static void BattleAICmd_nullsub_33(void); +static void BattleAICmd_if_status_in_party(void); +static void BattleAICmd_if_status_not_in_party(void); +static void BattleAICmd_get_weather(void); +static void BattleAICmd_if_effect(void); +static void BattleAICmd_if_not_effect(void); +static void BattleAICmd_if_stat_level_less_than(void); +static void BattleAICmd_if_stat_level_more_than(void); +static void BattleAICmd_if_stat_level_equal(void); +static void BattleAICmd_if_stat_level_not_equal(void); +static void BattleAICmd_if_can_faint(void); +static void BattleAICmd_if_cant_faint(void); +static void BattleAICmd_if_has_move(void); +static void BattleAICmd_if_dont_have_move(void); +static void BattleAICmd_if_move_effect(void); +static void BattleAICmd_if_not_move_effect(void); +static void BattleAICmd_if_last_move_did_damage(void); +static void BattleAICmd_if_encored(void); +static void BattleAICmd_flee(void); +static void BattleAICmd_if_random_100(void); +static void BattleAICmd_watch(void); +static void BattleAICmd_get_hold_effect(void); +static void BattleAICmd_get_gender(void); +static void BattleAICmd_is_first_turn(void); +static void BattleAICmd_get_stockpile_count(void); +static void BattleAICmd_is_double_battle(void); +static void BattleAICmd_get_used_item(void); +static void BattleAICmd_get_move_type_from_result(void); +static void BattleAICmd_get_move_power_from_result(void); +static void BattleAICmd_get_move_effect_from_result(void); +static void BattleAICmd_get_protect_count(void); +static void BattleAICmd_nullsub_52(void); +static void BattleAICmd_nullsub_53(void); +static void BattleAICmd_nullsub_54(void); +static void BattleAICmd_nullsub_55(void); +static void BattleAICmd_nullsub_56(void); +static void BattleAICmd_nullsub_57(void); +static void BattleAICmd_call(void); +static void BattleAICmd_jump(void); +static void BattleAICmd_end(void); +static void BattleAICmd_if_level_compare(void); +static void BattleAICmd_if_taunted(void); +static void BattleAICmd_if_not_taunted(void); + +typedef void (*BattleAICmdFunc)(void); + +static const BattleAICmdFunc sBattleAICmdTable[] = +{ + BattleAICmd_if_random_less_than, // 0x0 + BattleAICmd_if_random_greater_than, // 0x1 + BattleAICmd_if_random_equal, // 0x2 + BattleAICmd_if_random_not_equal, // 0x3 + BattleAICmd_score, // 0x4 + BattleAICmd_if_hp_less_than, // 0x5 + BattleAICmd_if_hp_more_than, // 0x6 + BattleAICmd_if_hp_equal, // 0x7 + BattleAICmd_if_hp_not_equal, // 0x8 + BattleAICmd_if_status, // 0x9 + BattleAICmd_if_not_status, // 0xA + BattleAICmd_if_status2, // 0xB + BattleAICmd_if_not_status2, // 0xC + BattleAICmd_if_status3, // 0xD + BattleAICmd_if_not_status3, // 0xE + BattleAICmd_if_status4, // 0xF + BattleAICmd_if_not_status4, // 0x10 + BattleAICmd_if_less_than, // 0x11 + BattleAICmd_if_more_than, // 0x12 + BattleAICmd_if_equal, // 0x13 + BattleAICmd_if_not_equal, // 0x14 + BattleAICmd_if_less_than_32, // 0x15 + BattleAICmd_if_more_than_32, // 0x16 + BattleAICmd_if_equal_32, // 0x17 + BattleAICmd_if_not_equal_32, // 0x18 + BattleAICmd_if_move, // 0x19 + BattleAICmd_if_not_move, // 0x1A + BattleAICmd_if_in_bytes, // 0x1B + BattleAICmd_if_not_in_bytes, // 0x1C + BattleAICmd_if_in_words, // 0x1D + BattleAICmd_if_not_in_words, // 0x1E + BattleAICmd_if_user_can_damage, // 0x1F + BattleAICmd_if_user_cant_damage, // 0x20 + BattleAICmd_get_turn_count, // 0x21 + BattleAICmd_get_type, // 0x22 + BattleAICmd_get_move_power, // 0x23 + BattleAICmd_is_most_powerful_move, // 0x24 + BattleAICmd_get_move, // 0x25 + BattleAICmd_if_arg_equal, // 0x26 + BattleAICmd_if_arg_not_equal, // 0x27 + BattleAICmd_if_would_go_first, // 0x28 + BattleAICmd_if_would_not_go_first, // 0x29 + BattleAICmd_nullsub_2A, // 0x2A + BattleAICmd_nullsub_2B, // 0x2B + BattleAICmd_count_alive_pokemon, // 0x2C + BattleAICmd_get_considered_move, // 0x2D + BattleAICmd_get_considered_move_effect, // 0x2E + BattleAICmd_get_ability, // 0x2F + BattleAICmd_get_highest_possible_damage, // 0x30 + BattleAICmd_if_damage_bonus, // 0x31 + BattleAICmd_nullsub_32, // 0x32 + BattleAICmd_nullsub_33, // 0x33 + BattleAICmd_if_status_in_party, // 0x34 + BattleAICmd_if_status_not_in_party, // 0x35 + BattleAICmd_get_weather, // 0x36 + BattleAICmd_if_effect, // 0x37 + BattleAICmd_if_not_effect, // 0x38 + BattleAICmd_if_stat_level_less_than, // 0x39 + BattleAICmd_if_stat_level_more_than, // 0x3A + BattleAICmd_if_stat_level_equal, // 0x3B + BattleAICmd_if_stat_level_not_equal, // 0x3C + BattleAICmd_if_can_faint, // 0x3D + BattleAICmd_if_cant_faint, // 0x3E + BattleAICmd_if_has_move, // 0x3F + BattleAICmd_if_dont_have_move, // 0x40 + BattleAICmd_if_move_effect, // 0x41 + BattleAICmd_if_not_move_effect, // 0x42 + BattleAICmd_if_last_move_did_damage, // 0x43 + BattleAICmd_if_encored, // 0x44 + BattleAICmd_flee, // 0x45 + BattleAICmd_if_random_100, // 0x46 + BattleAICmd_watch, // 0x47 + BattleAICmd_get_hold_effect, // 0x48 + BattleAICmd_get_gender, // 0x49 + BattleAICmd_is_first_turn, // 0x4A + BattleAICmd_get_stockpile_count, // 0x4B + BattleAICmd_is_double_battle, // 0x4C + BattleAICmd_get_used_item, // 0x4D + BattleAICmd_get_move_type_from_result, // 0x4E + BattleAICmd_get_move_power_from_result, // 0x4F + BattleAICmd_get_move_effect_from_result, // 0x50 + BattleAICmd_get_protect_count, // 0x51 + BattleAICmd_nullsub_52, // 0x52 + BattleAICmd_nullsub_53, // 0x53 + BattleAICmd_nullsub_54, // 0x54 + BattleAICmd_nullsub_55, // 0x55 + BattleAICmd_nullsub_56, // 0x56 + BattleAICmd_nullsub_57, // 0x57 + BattleAICmd_call, // 0x58 + BattleAICmd_jump, // 0x59 + BattleAICmd_end, // 0x5A + BattleAICmd_if_level_compare, // 0x5B + BattleAICmd_if_taunted, // 0x5C + BattleAICmd_if_not_taunted, // 0x5D +}; + +#ifdef NONMATCHING +static +#endif +const u16 sDiscouragedPowerfulMoveEffects[] = +{ + EFFECT_EXPLOSION, + EFFECT_DREAM_EATER, + EFFECT_RAZOR_WIND, + EFFECT_SKY_ATTACK, + EFFECT_RECHARGE, + EFFECT_SKULL_BASH, + EFFECT_SOLARBEAM, + EFFECT_SPIT_UP, + EFFECT_FOCUS_PUNCH, + EFFECT_SUPERPOWER, + EFFECT_ERUPTION, + EFFECT_OVERHEAT, + 0xFFFF +}; + +// if the AI is a Link battle, safari, battle tower, or ereader, it will ignore considering item uses. +void BattleAI_HandleItemUseBeforeAISetup(void) +{ + s32 i; + u8 *data = (u8 *)UNK_2016A00_STRUCT; + + for (i = 0; (u32)i < sizeof(struct UnkBattleStruct1); i++) + data[i] = 0; + + if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) + && gTrainerBattleOpponent != 0x400 + && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) + { + for (i = 0; i < MAX_TRAINER_ITEMS; i++) + { + if (gTrainers[gTrainerBattleOpponent].items[i] != 0) + { + UNK_2016A00_STRUCT->items[UNK_2016A00_STRUCT->numOfItems] = gTrainers[gTrainerBattleOpponent].items[i]; + UNK_2016A00_STRUCT->numOfItems++; + } + } + } + + BattleAI_SetupAIData(); +} + +void BattleAI_SetupAIData(void) +{ + s32 i; + u8 *data = (u8 *)AI_THINKING_STRUCT; + u8 r7; + + // clear AI data and set default move score to 100. strange that they didn't use memset here. + for (i = 0; (u32)i < sizeof(struct AI_ThinkingStruct); i++) + data[i] = 0; + for (i = 0; i < MAX_MON_MOVES; i++) + AI_THINKING_STRUCT->score[i] = 100; + + r7 = sub_8015A98(gActiveBank, 0, 0xFF); + + // probably sets up the moves to consider and ignores non-valid moves such as NO_MOVE or glitch moves. + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBitTable[i] & r7) + AI_THINKING_STRUCT->score[i] = 0; + + AI_THINKING_STRUCT->simulatedRNG[i] = 100 - (Random() % 16); + } + + // clear AI stack. + AI_STACK->size = 0; + gBankAttacker = gActiveBank; + + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + gBankTarget = Random() & 2; // just pick somebody to target. + + if (gAbsentBankFlags & gBitTable[gBankTarget]) + gBankTarget ^= 2; + } + else + gBankTarget = gActiveBank ^ 1; + + // special AI flag cases. + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + AI_THINKING_STRUCT->aiFlags = 0x40000000; + else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) + AI_THINKING_STRUCT->aiFlags = 0x20000000; + else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) + AI_THINKING_STRUCT->aiFlags = 0x80000000; +#ifdef GERMAN + else if (gBattleTypeFlags & 0x900 || gTrainerBattleOpponent == 0x400) + AI_THINKING_STRUCT->aiFlags = 7; +#endif + else // otherwise, just set aiFlags to whatever flags the trainer has set in their data. + AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent].aiFlags; +} + +u8 BattleAI_GetAIActionToUse(void) +{ + u8 currentMoveArray[MAX_MON_MOVES]; + u8 consideredMoveArray[MAX_MON_MOVES]; + u8 numOfBestMoves; + s32 i; + + sub_810745C(); + while (AI_THINKING_STRUCT->aiFlags != 0) + { + if (AI_THINKING_STRUCT->aiFlags & 1) + { + AI_THINKING_STRUCT->aiState = AIState_SettingUp; + BattleAI_DoAIProcessing(); + } + AI_THINKING_STRUCT->aiFlags >>= 1; + AI_THINKING_STRUCT->aiLogicId++; + AI_THINKING_STRUCT->movesetIndex = 0; + } + + // special flee or watch cases for safari. + if (AI_THINKING_STRUCT->aiAction & (AI_ACTION_FLEE)) // flee + return 4; + if (AI_THINKING_STRUCT->aiAction & (AI_ACTION_WATCH)) // watch + return 5; + + numOfBestMoves = 1; + currentMoveArray[0] = AI_THINKING_STRUCT->score[0]; + consideredMoveArray[0] = 0; + + for (i = 1; i < MAX_MON_MOVES; i++) + { + if (currentMoveArray[0] < AI_THINKING_STRUCT->score[i]) + { + numOfBestMoves = 1; + currentMoveArray[0] = AI_THINKING_STRUCT->score[i]; + consideredMoveArray[0] = i; + } + if (currentMoveArray[0] == AI_THINKING_STRUCT->score[i]) + { + currentMoveArray[numOfBestMoves] = AI_THINKING_STRUCT->score[i]; + consideredMoveArray[numOfBestMoves++] = i; + } + } + + return consideredMoveArray[Random() % numOfBestMoves]; // break any ties that exist. +} + +void BattleAI_DoAIProcessing(void) +{ + while (AI_THINKING_STRUCT->aiState != AIState_FinishedProcessing) + { + switch (AI_THINKING_STRUCT->aiState) + { + case AIState_DoNotProcess: //Needed to match. + break; + case AIState_SettingUp: + gAIScriptPtr = BattleAIs[AI_THINKING_STRUCT->aiLogicId]; // set the AI ptr. + if (gBattleMons[gBankAttacker].pp[AI_THINKING_STRUCT->movesetIndex] == 0) + { + AI_THINKING_STRUCT->moveConsidered = MOVE_NONE; // don't consider a move you have 0 PP for, idiot. + } + else + { + AI_THINKING_STRUCT->moveConsidered = gBattleMons[gBankAttacker].moves[AI_THINKING_STRUCT->movesetIndex]; + } + AI_THINKING_STRUCT->aiState++; + break; + case AIState_Processing: + if (AI_THINKING_STRUCT->moveConsidered != MOVE_NONE) + sBattleAICmdTable[*(u8 *)gAIScriptPtr](); // run AI command. + else + { + AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; // definitely do not consider any move that has 0 PP. + AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE; + } + if (AI_THINKING_STRUCT->aiAction & AI_ACTION_DONE) + { + AI_THINKING_STRUCT->movesetIndex++; + if (AI_THINKING_STRUCT->movesetIndex < MAX_MON_MOVES && (AI_THINKING_STRUCT->aiAction & AI_ACTION_DO_NOT_ATTACK) == 0) + AI_THINKING_STRUCT->aiState = AIState_SettingUp; // as long as their are more moves to process, keep setting this to setup state. + else + AI_THINKING_STRUCT->aiState++; // done processing. + AI_THINKING_STRUCT->aiAction &= (AI_ACTION_FLEE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK | + AI_ACTION_UNK5 | AI_ACTION_UNK6 | AI_ACTION_UNK7 | AI_ACTION_UNK8); // disable AI_ACTION_DONE. + } + break; + } + } +} + +void sub_810745C(void) +{ + s32 i; + + for (i = 0; i < 8; i++) + { + if (UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i] == 0) + { + UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i] = gLastUsedMove[gBankTarget]; + return; + } + } +} + +void unref_sub_81074A0(u8 a) +{ + s32 i; + + for (i = 0; i < 8; i++) + UNK_2016A00_STRUCT->movesUsed[a / 2][i] = 0; +} + +void RecordAbilityBattle(u8 a, u8 b) +{ + if (GetBankSide(a) == 0) + UNK_2016A00_STRUCT->unk20[GetBankIdentity(a) & 1] = b; +} + +void RecordItemBattle(u8 a, u8 b) +{ + if (GetBankSide(a) == 0) + UNK_2016A00_STRUCT->unk22[GetBankIdentity(a) & 1] = b; +} + +static void BattleAICmd_if_random_less_than(void) +{ + if (Random() % 256 < gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_if_random_greater_than(void) +{ + if (Random() % 256 > gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_if_random_equal(void) +{ + if (Random() % 256 == gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_if_random_not_equal(void) +{ + if (Random() % 256 != gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_score(void) +{ + AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] += gAIScriptPtr[1]; // add the result to the array of the move consider's score. + + if (AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] < 0) // if the score is negative, flatten it to 0. + AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; + + gAIScriptPtr += 2; // AI return. +} + +static void BattleAICmd_if_hp_less_than(void) +{ + u16 index; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) < gAIScriptPtr[2]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +static void BattleAICmd_if_hp_more_than(void) +{ + u16 index; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) > gAIScriptPtr[2]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +static void BattleAICmd_if_hp_equal(void) +{ + u16 index; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) == gAIScriptPtr[2]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +static void BattleAICmd_if_hp_not_equal(void) +{ + u16 index; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) != gAIScriptPtr[2]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +static void BattleAICmd_if_status(void) +{ + u16 index; + u32 arg; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + arg = AIScriptRead32(gAIScriptPtr + 2); + + if ((gBattleMons[index].status1 & arg) != 0) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + else + gAIScriptPtr += 10; +} + +static void BattleAICmd_if_not_status(void) +{ + u16 index; + u32 arg; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + arg = AIScriptRead32(gAIScriptPtr + 2); + + if ((gBattleMons[index].status1 & arg) == 0) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + else + gAIScriptPtr += 10; +} + +static void BattleAICmd_if_status2(void) +{ + u16 index; + u32 arg; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + arg = AIScriptRead32(gAIScriptPtr + 2); + + if ((gBattleMons[index].status2 & arg) != 0) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + else + gAIScriptPtr += 10; +} + +static void BattleAICmd_if_not_status2(void) +{ + u16 index; + u32 arg; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + arg = AIScriptRead32(gAIScriptPtr + 2); + + if ((gBattleMons[index].status2 & arg) == 0) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + else + gAIScriptPtr += 10; +} + +static void BattleAICmd_if_status3(void) +{ + u16 index; + u32 arg; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + arg = AIScriptRead32(gAIScriptPtr + 2); + + if ((gStatuses3[index] & arg) != 0) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + else + gAIScriptPtr += 10; +} + +static void BattleAICmd_if_not_status3(void) +{ + u16 index; + u32 arg; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + arg = AIScriptRead32(gAIScriptPtr + 2); + + if ((gStatuses3[index] & arg) == 0) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + else + gAIScriptPtr += 10; +} + +static void BattleAICmd_if_status4(void) +{ + u16 index; + u32 arg1, arg2; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + arg1 = GetBankIdentity(index) & 1; + arg2 = AIScriptRead32(gAIScriptPtr + 2); + + if ((gSideAffecting[arg1] & arg2) != 0) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + else + gAIScriptPtr += 10; +} + +static void BattleAICmd_if_not_status4(void) +{ + u16 index; + u32 arg1, arg2; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + arg1 = GetBankIdentity(index) & 1; + arg2 = AIScriptRead32(gAIScriptPtr + 2); + + if ((gSideAffecting[arg1] & arg2) == 0) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + else + gAIScriptPtr += 10; +} + +static void BattleAICmd_if_less_than(void) +{ + if (AI_THINKING_STRUCT->funcResult < gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_if_more_than(void) +{ + if (AI_THINKING_STRUCT->funcResult > gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_if_equal(void) +{ + if (AI_THINKING_STRUCT->funcResult == gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_if_not_equal(void) +{ + if (AI_THINKING_STRUCT->funcResult != gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_if_less_than_32(void) +{ + u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); + + if (AI_THINKING_STRUCT->funcResult < *temp) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + else + gAIScriptPtr += 9; +} + +static void BattleAICmd_if_more_than_32(void) +{ + u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); + + if (AI_THINKING_STRUCT->funcResult > *temp) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + else + gAIScriptPtr += 9; +} + +static void BattleAICmd_if_equal_32(void) +{ + u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); + + if (AI_THINKING_STRUCT->funcResult == *temp) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + else + gAIScriptPtr += 9; +} + +static void BattleAICmd_if_not_equal_32(void) +{ + u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); + + if (AI_THINKING_STRUCT->funcResult != *temp) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + else + gAIScriptPtr += 9; +} + +static void BattleAICmd_if_move(void) +{ + u16 move = AIScriptRead16(gAIScriptPtr + 1); + + if (AI_THINKING_STRUCT->moveConsidered == move) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +static void BattleAICmd_if_not_move(void) +{ + u16 move = AIScriptRead16(gAIScriptPtr + 1); + + if (AI_THINKING_STRUCT->moveConsidered != move) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +static void BattleAICmd_if_in_bytes(void) +{ + u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1); + + while (*ptr != 0xFF) + { + if (AI_THINKING_STRUCT->funcResult == *ptr) + { + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + return; + } + ptr++; + } + gAIScriptPtr += 9; +} + +static void BattleAICmd_if_not_in_bytes(void) +{ + u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1); + + while (*ptr != 0xFF) + { + if (AI_THINKING_STRUCT->funcResult == *ptr) + { + gAIScriptPtr += 9; + return; + } + ptr++; + } + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); +} + +static void BattleAICmd_if_in_words(void) +{ + u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1); + + while (*ptr != 0xFFFF) + { + if (AI_THINKING_STRUCT->funcResult == *ptr) + { + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + return; + } + ptr++; + } + gAIScriptPtr += 9; +} + +static void BattleAICmd_if_not_in_words(void) +{ + u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1); + + while (*ptr != 0xFFFF) + { + if (AI_THINKING_STRUCT->funcResult == *ptr) + { + gAIScriptPtr += 9; + return; + } + ptr++; + } + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); +} + +static void BattleAICmd_if_user_can_damage(void) +{ + s32 i; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBankAttacker].moves[i] != 0 + && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power != 0) + break; + } + if (i == MAX_MON_MOVES) + gAIScriptPtr += 5; + else + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); +} + +static void BattleAICmd_if_user_cant_damage(void) +{ + s32 i; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBankAttacker].moves[i] != 0 + && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power != 0) + break; + } + if (i != MAX_MON_MOVES) + gAIScriptPtr += 5; + else + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); +} + +static void BattleAICmd_get_turn_count(void) +{ + AI_THINKING_STRUCT->funcResult = gBattleResults.battleTurnCounter; + gAIScriptPtr += 1; +} + +static void BattleAICmd_get_type(void) +{ + switch (gAIScriptPtr[1]) + { + case 1: // player primary type + AI_THINKING_STRUCT->funcResult = gBattleMons[gBankAttacker].type1; + break; + case 0: // enemy primary type + AI_THINKING_STRUCT->funcResult = gBattleMons[gBankTarget].type1; + break; + case 3: // player secondary type + AI_THINKING_STRUCT->funcResult = gBattleMons[gBankAttacker].type2; + break; + case 2: // enemy secondary type + AI_THINKING_STRUCT->funcResult = gBattleMons[gBankTarget].type2; + break; + case 4: // type of move being pointed to + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].type; + break; + } + gAIScriptPtr += 2; +} + +static void BattleAICmd_get_move_power(void) +{ + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power; + gAIScriptPtr += 1; +} + +#ifdef NONMATCHING +static void BattleAICmd_is_most_powerful_move(void) +{ + int i, j; + s32 damages[MAX_MON_MOVES]; + + for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i]) + break; + + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1 + && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) + { + gDynamicBasePower = 0; + ewram[0x1601C] = 0; // why is this a manual array? + ewram[0x1601F] = 1; + gBattleMoveFlags = 0; + gCritMultiplier = 1; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + for (j = 0; sDiscouragedPowerfulMoveEffects[j] != 0xFFFF; j++) + { // _08108276 + if (gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j]) + break; + } + + // _081082BA + if (gBattleMons[gBankAttacker].moves[i] + && sDiscouragedPowerfulMoveEffects[j] == 0xFFFF + && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power > 1) + { + gCurrentMove = gBattleMons[gBankAttacker].moves[i]; + AI_CalcDmg(gBankAttacker, gBankTarget); + TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); + damages[i] = (gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[i]) / 100; + + if (damages[i] == 0) // moves always do at least 1 damage. + damages[i] = 1; + } + else + { + damages[i] = 0; + } + } + + for (i = 0; i < MAX_MON_MOVES; i++) + if (damages[i] > damages[AI_THINKING_STRUCT->movesetIndex]) + break; + + if (i == MAX_MON_MOVES) + AI_THINKING_STRUCT->funcResult = 2; + else + AI_THINKING_STRUCT->funcResult = 1; + } + else + { + AI_THINKING_STRUCT->funcResult = 0; + } + + gAIScriptPtr += 1; +} +#else +__attribute__((naked)) +static void BattleAICmd_is_most_powerful_move(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + movs r3, 0\n\ + ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ + ldrh r1, [r0]\n\ + ldr r4, _0810832C @ =0x0000ffff\n\ + ldr r6, _08108330 @ =gBattleMoves\n\ + ldr r5, _08108334 @ =0x02016800\n\ + cmp r1, r4\n\ + beq _0810822E\n\ + ldrh r1, [r5, 0x2]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldrb r2, [r0]\n\ + ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ +_0810821E:\n\ + ldrh r0, [r1]\n\ + cmp r2, r0\n\ + beq _0810822E\n\ + adds r1, 0x2\n\ + adds r3, 0x1\n\ + ldrh r0, [r1]\n\ + cmp r0, r4\n\ + bne _0810821E\n\ +_0810822E:\n\ + ldrh r0, [r5, 0x2]\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r6\n\ + ldrb r0, [r1, 0x1]\n\ + cmp r0, 0x1\n\ + bhi _08108240\n\ + b _081083B2\n\ +_08108240:\n\ + lsls r0, r3, 1\n\ + ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ + adds r0, r1\n\ + ldrh r3, [r0]\n\ + ldr r0, _0810832C @ =0x0000ffff\n\ + cmp r3, r0\n\ + beq _08108250\n\ + b _081083B2\n\ +_08108250:\n\ + ldr r0, _08108338 @ =gDynamicBasePower\n\ + movs r1, 0\n\ + strh r1, [r0]\n\ + ldr r2, _0810833C @ =0xfffff81c\n\ + adds r0, r5, r2\n\ + strb r1, [r0]\n\ + adds r2, 0x3\n\ + adds r0, r5, r2\n\ + movs r2, 0x1\n\ + strb r2, [r0]\n\ + ldr r0, _08108340 @ =gBattleMoveFlags\n\ + strb r1, [r0]\n\ + ldr r0, _08108344 @ =gCritMultiplier\n\ + strb r2, [r0]\n\ + movs r6, 0\n\ + mov r9, r3\n\ + ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ + ldrh r0, [r0]\n\ + str r0, [sp, 0x10]\n\ +_08108276:\n\ + movs r3, 0\n\ + ldr r5, _08108348 @ =gBattleMons\n\ + lsls r4, r6, 1\n\ + ldr r7, _0810834C @ =gBankAttacker\n\ + lsls r1, r6, 2\n\ + mov r8, r1\n\ + adds r2, r6, 0x1\n\ + mov r10, r2\n\ + ldr r0, [sp, 0x10]\n\ + cmp r0, r9\n\ + beq _081082BA\n\ + ldr r2, _08108330 @ =gBattleMoves\n\ + ldrb r1, [r7]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + adds r0, r4, r0\n\ + adds r1, r5, 0\n\ + adds r1, 0xC\n\ + adds r0, r1\n\ + ldrh r1, [r0]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldrb r2, [r0]\n\ + ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ +_081082AA:\n\ + ldrh r0, [r1]\n\ + cmp r2, r0\n\ + beq _081082BA\n\ + adds r1, 0x2\n\ + adds r3, 0x1\n\ + ldrh r0, [r1]\n\ + cmp r0, r9\n\ + bne _081082AA\n\ +_081082BA:\n\ + ldrb r1, [r7]\n\ + movs r0, 0x58\n\ + muls r0, r1\n\ + adds r0, r4, r0\n\ + adds r1, r5, 0\n\ + adds r1, 0xC\n\ + adds r1, r0, r1\n\ + ldrh r0, [r1]\n\ + cmp r0, 0\n\ + beq _0810835C\n\ + lsls r0, r3, 1\n\ + ldr r2, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ + adds r0, r2\n\ + ldrh r0, [r0]\n\ + cmp r0, r9\n\ + bne _0810835C\n\ + ldr r0, _08108330 @ =gBattleMoves\n\ + ldrh r2, [r1]\n\ + lsls r1, r2, 1\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x1]\n\ + cmp r0, 0x1\n\ + bls _0810835C\n\ + ldr r5, _08108350 @ =gCurrentMove\n\ + strh r2, [r5]\n\ + ldrb r0, [r7]\n\ + ldr r4, _08108354 @ =gBankTarget\n\ + ldrb r1, [r4]\n\ + bl AI_CalcDmg\n\ + ldrh r0, [r5]\n\ + ldrb r1, [r7]\n\ + ldrb r2, [r4]\n\ + bl TypeCalc\n\ + mov r4, sp\n\ + add r4, r8\n\ + ldr r2, _08108358 @ =gBattleMoveDamage\n\ + ldr r0, _08108334 @ =0x02016800\n\ + adds r0, 0x18\n\ + adds r0, r6, r0\n\ + ldrb r1, [r0]\n\ + ldr r0, [r2]\n\ + muls r0, r1\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + str r0, [r4]\n\ + cmp r0, 0\n\ + bne _08108364\n\ + movs r0, 0x1\n\ + str r0, [r4]\n\ + b _08108364\n\ + .align 2, 0\n\ +_08108328: .4byte sDiscouragedPowerfulMoveEffects\n\ +_0810832C: .4byte 0x0000ffff\n\ +_08108330: .4byte gBattleMoves\n\ +_08108334: .4byte 0x02016800\n\ +_08108338: .4byte gDynamicBasePower\n\ +_0810833C: .4byte 0xfffff81c\n\ +_08108340: .4byte gBattleMoveFlags\n\ +_08108344: .4byte gCritMultiplier\n\ +_08108348: .4byte gBattleMons\n\ +_0810834C: .4byte gBankAttacker\n\ +_08108350: .4byte gCurrentMove\n\ +_08108354: .4byte gBankTarget\n\ +_08108358: .4byte gBattleMoveDamage\n\ +_0810835C:\n\ + mov r1, sp\n\ + add r1, r8\n\ + movs r0, 0\n\ + str r0, [r1]\n\ +_08108364:\n\ + mov r6, r10\n\ + cmp r6, 0x3\n\ + ble _08108276\n\ + movs r6, 0\n\ + ldr r1, _081083A4 @ =0x02016800\n\ + ldrb r0, [r1, 0x1]\n\ + lsls r0, 2\n\ + add r0, sp\n\ + ldr r2, [sp]\n\ + ldr r0, [r0]\n\ + adds r5, r1, 0\n\ + ldr r4, _081083A8 @ =gAIScriptPtr\n\ + cmp r2, r0\n\ + bgt _0810839A\n\ + adds r3, r5, 0\n\ + mov r2, sp\n\ +_08108384:\n\ + adds r2, 0x4\n\ + adds r6, 0x1\n\ + cmp r6, 0x3\n\ + bgt _0810839A\n\ + ldrb r0, [r3, 0x1]\n\ + lsls r0, 2\n\ + add r0, sp\n\ + ldr r1, [r2]\n\ + ldr r0, [r0]\n\ + cmp r1, r0\n\ + ble _08108384\n\ +_0810839A:\n\ + cmp r6, 0x4\n\ + bne _081083AC\n\ + movs r0, 0x2\n\ + str r0, [r5, 0x8]\n\ + b _081083B8\n\ + .align 2, 0\n\ +_081083A4: .4byte 0x02016800\n\ +_081083A8: .4byte gAIScriptPtr\n\ +_081083AC:\n\ + movs r0, 0x1\n\ + str r0, [r5, 0x8]\n\ + b _081083B8\n\ +_081083B2:\n\ + movs r0, 0\n\ + str r0, [r5, 0x8]\n\ + ldr r4, _081083D0 @ =gAIScriptPtr\n\ +_081083B8:\n\ + ldr r0, [r4]\n\ + adds r0, 0x1\n\ + str r0, [r4]\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_081083D0: .4byte gAIScriptPtr\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +static void BattleAICmd_get_move(void) +{ + if (gAIScriptPtr[1] == USER) + AI_THINKING_STRUCT->funcResult = gLastUsedMove[gBankAttacker]; + else + AI_THINKING_STRUCT->funcResult = gLastUsedMove[gBankTarget]; + + gAIScriptPtr += 2; +} + +static void BattleAICmd_if_arg_equal(void) +{ + if (gAIScriptPtr[1] == AI_THINKING_STRUCT->funcResult) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_if_arg_not_equal(void) +{ + if (gAIScriptPtr[1] != AI_THINKING_STRUCT->funcResult) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_if_would_go_first(void) +{ + if (b_first_side(gBankAttacker, gBankTarget, 1) == gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_if_would_not_go_first(void) +{ + if (b_first_side(gBankAttacker, gBankTarget, 1) != gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_nullsub_2A(void) +{ +} + +static void BattleAICmd_nullsub_2B(void) +{ +} + +static void BattleAICmd_count_alive_pokemon(void) +{ + struct Pokemon *party; + int i; + u8 index; + u8 var, var2; + + AI_THINKING_STRUCT->funcResult = 0; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + if (GetBankSide(index) == 0) + party = gPlayerParty; + else + party = gEnemyParty; + + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + u32 status; + var = gBattlePartyID[index]; + status = GetBankIdentity(index) ^ 2; + var2 = gBattlePartyID[GetBankByPlayerAI(status)]; + } + else + { + var = gBattlePartyID[index]; + var2 = gBattlePartyID[index]; + } + + for (i = 0; i < 6; i++) + { + if (i != var && i != var2 + && GetMonData(&party[i], MON_DATA_HP) != 0 + && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE + && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) + { + AI_THINKING_STRUCT->funcResult++; + } + } + + gAIScriptPtr += 2; +} + +static void BattleAICmd_get_considered_move(void) +{ + AI_THINKING_STRUCT->funcResult = AI_THINKING_STRUCT->moveConsidered; + gAIScriptPtr += 1; +} + +static void BattleAICmd_get_considered_move_effect(void) +{ + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect; + gAIScriptPtr += 1; +} + +static void BattleAICmd_get_ability(void) +{ + u8 index; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + if (GetBankSide(index) == TARGET) + { + u16 unk = GetBankIdentity(index) & 1; + + if (UNK_2016A00_STRUCT->unk20[unk] != 0) + { + AI_THINKING_STRUCT->funcResult = UNK_2016A00_STRUCT->unk20[unk]; + gAIScriptPtr += 2; + return; + } + + // abilities that prevent fleeing. + if (gBattleMons[index].ability == ABILITY_SHADOW_TAG + || gBattleMons[index].ability == ABILITY_MAGNET_PULL + || gBattleMons[index].ability == ABILITY_ARENA_TRAP) + { + AI_THINKING_STRUCT->funcResult = gBattleMons[index].ability; + gAIScriptPtr += 2; + return; + } + + if (gBaseStats[gBattleMons[index].species].ability1 != ABILITY_NONE) + { + if (gBaseStats[gBattleMons[index].species].ability2 != ABILITY_NONE) + { + // AI has no knowledge of opponent, so it guesses which ability. + if (Random() % 2) + { + AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1; + } + else + { + AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2; + } + } + else + { + AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1; // it's definitely ability 1. + } + } + else + { + AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability. + } + } + else + { + // The AI knows its own ability. + AI_THINKING_STRUCT->funcResult = gBattleMons[index].ability; + } + gAIScriptPtr += 2; +} + +static void BattleAICmd_get_highest_possible_damage(void) +{ + s32 i; + + gDynamicBasePower = 0; + BATTLE_STRUCT->dynamicMoveType = 0; + BATTLE_STRUCT->dmgMultiplier = 1; + gBattleMoveFlags = 0; + gCritMultiplier = 1; + AI_THINKING_STRUCT->funcResult = 0; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + gBattleMoveDamage = 40; + gCurrentMove = gBattleMons[gBankAttacker].moves[i]; + + if (gCurrentMove) + { + TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); + + // reduce by 1/3. + if (gBattleMoveDamage == 120) + gBattleMoveDamage = 80; + if (gBattleMoveDamage == 240) + gBattleMoveDamage = 160; + if (gBattleMoveDamage == 30) + gBattleMoveDamage = 20; + if (gBattleMoveDamage == 15) + gBattleMoveDamage = 10; + + if (gBattleMoveFlags & 8) // if it's a status move, it wont do anything. + gBattleMoveDamage = 0; + + if (AI_THINKING_STRUCT->funcResult < gBattleMoveDamage) + AI_THINKING_STRUCT->funcResult = gBattleMoveDamage; + } + } + gAIScriptPtr += 1; +} + +static void BattleAICmd_if_damage_bonus(void) +{ + u8 damageVar; + + gDynamicBasePower = 0; + BATTLE_STRUCT->dynamicMoveType = 0; + BATTLE_STRUCT->dmgMultiplier = 1; + gBattleMoveFlags = 0; + gCritMultiplier = 1; + + gBattleMoveDamage = 40; + gCurrentMove = AI_THINKING_STRUCT->moveConsidered; + + TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); + + if (gBattleMoveDamage == 120) + gBattleMoveDamage = 80; + if (gBattleMoveDamage == 240) + gBattleMoveDamage = 160; + if (gBattleMoveDamage == 30) + gBattleMoveDamage = 20; + if (gBattleMoveDamage == 15) + gBattleMoveDamage = 10; + + if (gBattleMoveFlags & 8) + gBattleMoveDamage = 0; + + // store gBattleMoveDamage in a u8 variable because gAIScriptPtr[1] is a u8. + damageVar = gBattleMoveDamage; + + if (damageVar == gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_nullsub_32(void) +{ +} + +static void BattleAICmd_nullsub_33(void) +{ +} + +static void BattleAICmd_if_status_in_party(void) +{ + struct Pokemon *party; + struct Pokemon *partyPtr; + int i; + u32 statusToCompareTo; + + // for whatever reason, game freak put the party pointer into 2 variables instead of 1. it's possible at some point the switch encompassed the whole function and used each respective variable creating largely duplicate code. + switch (gAIScriptPtr[1]) + { + case 1: + party = partyPtr = gEnemyParty; + break; + default: + party = partyPtr = gPlayerParty; + break; + } + + statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2); + + for (i = 0; i < 6; i++) + { + u16 species = GetMonData(&party[i], MON_DATA_SPECIES); + u16 hp = GetMonData(&party[i], MON_DATA_HP); + u32 status = GetMonData(&party[i], MON_DATA_STATUS); + + if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) + { + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); // WHAT. why is this being merged into the above switch + return; + } + } + + gAIScriptPtr += 10; +} + +// bugged, doesnt return properly. also unused +static void BattleAICmd_if_status_not_in_party(void) +{ + struct Pokemon *party; + struct Pokemon *partyPtr; + int i; + u32 statusToCompareTo; + + switch (gAIScriptPtr[1]) + { + case 1: + party = partyPtr = gEnemyParty; + break; + default: + party = partyPtr = gPlayerParty; + break; + } + + statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2); + + for (i = 0; i < 6; i++) + { + u16 species = GetMonData(&party[i], MON_DATA_SPECIES); + u16 hp = GetMonData(&party[i], MON_DATA_HP); + u32 status = GetMonData(&party[i], MON_DATA_STATUS); + + // everytime the status is found, the AI's logic jumps further and further past its intended destination. this results in a broken AI macro and is probably why it is unused. + if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) + gAIScriptPtr += 10; // doesnt return? + } + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); +} + +static void BattleAICmd_get_weather(void) +{ + if (gBattleWeather & WEATHER_RAIN_ANY) + AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_RAIN; + if (gBattleWeather & WEATHER_SANDSTORM_ANY) + AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_SANDSTORM; + if (gBattleWeather & WEATHER_SUN_ANY) + AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_SUN; + if (gBattleWeather & WEATHER_HAIL) + AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_HAIL; + + gAIScriptPtr += 1; +} + +static void BattleAICmd_if_effect(void) +{ + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_if_not_effect(void) +{ + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect != gAIScriptPtr[1]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_if_stat_level_less_than(void) +{ + u32 party; + + if (gAIScriptPtr[1] == USER) + party = gBankAttacker; + else + party = gBankTarget; + + if (gBattleMons[party].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + else + gAIScriptPtr += 8; +} + +static void BattleAICmd_if_stat_level_more_than(void) +{ + u32 party; + + if (gAIScriptPtr[1] == USER) + party = gBankAttacker; + else + party = gBankTarget; + + if (gBattleMons[party].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + else + gAIScriptPtr += 8; +} + +static void BattleAICmd_if_stat_level_equal(void) +{ + u32 party; + + if (gAIScriptPtr[1] == USER) + party = gBankAttacker; + else + party = gBankTarget; + + if (gBattleMons[party].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + else + gAIScriptPtr += 8; +} + +static void BattleAICmd_if_stat_level_not_equal(void) +{ + u32 party; + + if (gAIScriptPtr[1] == USER) + party = gBankAttacker; + else + party = gBankTarget; + + if (gBattleMons[party].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3]) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + else + gAIScriptPtr += 8; +} + +static void BattleAICmd_if_can_faint(void) +{ + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) + { + gAIScriptPtr += 5; + return; + } + + gDynamicBasePower = 0; + BATTLE_STRUCT->dynamicMoveType = 0; + BATTLE_STRUCT->dmgMultiplier = 1; + gBattleMoveFlags = 0; + gCritMultiplier = 1; + gCurrentMove = AI_THINKING_STRUCT->moveConsidered; + AI_CalcDmg(gBankAttacker, gBankTarget); + TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); + + gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; + + // moves always do at least 1 damage. + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + + if (gBattleMons[gBankTarget].hp <= gBattleMoveDamage) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void BattleAICmd_if_cant_faint(void) +{ + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) + { + gAIScriptPtr += 5; + return; + } + + gDynamicBasePower = 0; + BATTLE_STRUCT->dynamicMoveType = 0; + BATTLE_STRUCT->dmgMultiplier = 1; + gBattleMoveFlags = 0; + gCritMultiplier = 1; + gCurrentMove = AI_THINKING_STRUCT->moveConsidered; + AI_CalcDmg(gBankAttacker, gBankTarget); + TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); + + gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; + + // this macro is missing the damage 0 = 1 assumption. + + if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void BattleAICmd_if_has_move(void) +{ + int i; + u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2); + + switch (gAIScriptPtr[1]) + { + case 1: + case 3: + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBankAttacker].moves[i] == *temp_ptr) + break; + } + if (i == MAX_MON_MOVES) + gAIScriptPtr += 8; + else + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + break; + case 0: + case 2: + for (i = 0; i < 8; i++) + { + if (UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i] == *temp_ptr) + break; + } + if (i == 8) + gAIScriptPtr += 8; + else + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + break; + } +} + +static void BattleAICmd_if_dont_have_move(void) +{ + int i; + u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2); + + switch (gAIScriptPtr[1]) + { + case 1: + case 3: + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBankAttacker].moves[i] == *temp_ptr) + break; + } + if (i != MAX_MON_MOVES) + gAIScriptPtr += 8; + else + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + break; + case 0: + case 2: + for (i = 0; i < 8; i++) + { + if (UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i] == *temp_ptr) + break; + } + if (i != 8) + gAIScriptPtr += 8; + else + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + break; + } +} + +static void BattleAICmd_if_move_effect(void) +{ + int i; + + switch (gAIScriptPtr[1]) + { + case 1: + case 3: + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBankAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == gAIScriptPtr[2]) + break; + } + if (i != MAX_MON_MOVES) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; + break; + case 0: + case 2: + for (i = 0; i < 8; i++) + { + if (gBattleMons[gBankAttacker].moves[i] != 0 && gBattleMoves[UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i]].effect == gAIScriptPtr[2]) + break; + } + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + } +} + +static void BattleAICmd_if_not_move_effect(void) +{ + int i; + + switch (gAIScriptPtr[1]) + { + case 1: + case 3: + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBankAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == gAIScriptPtr[2]) + break; + } + if (i != MAX_MON_MOVES) + gAIScriptPtr += 7; + else + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + break; + case 0: + case 2: + for (i = 0; i < 8; i++) + { + if (UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i] != 0 && gBattleMoves[UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i]].effect == gAIScriptPtr[2]) + break; + } + gAIScriptPtr += 7; + } +} + +static void BattleAICmd_if_last_move_did_damage(void) +{ + u8 index; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + if (gAIScriptPtr[2] == 0) + { + if (gDisableStructs[index].disabledMove == 0) + { + gAIScriptPtr += 7; + return; + } + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + return; + } + else if (gAIScriptPtr[2] != 1) // ignore the macro if its not 0 or 1. + { + gAIScriptPtr += 7; + return; + } + else if (gDisableStructs[index].encoredMove != 0) + { + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + return; + } + gAIScriptPtr += 7; +} + +static void BattleAICmd_if_encored(void) +{ + switch (gAIScriptPtr[1]) + { + case 0: // _08109348 + if (gDisableStructs[gActiveBank].disabledMove == AI_THINKING_STRUCT->moveConsidered) + { + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + return; + } + gAIScriptPtr += 6; + return; + case 1: // _08109370 + if (gDisableStructs[gActiveBank].encoredMove == AI_THINKING_STRUCT->moveConsidered) + { + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + return; + } + gAIScriptPtr += 6; + return; + default: + gAIScriptPtr += 6; + return; + } +} + +static void BattleAICmd_flee(void) +{ + AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_FLEE being enabled. +} + +static void BattleAICmd_if_random_100(void) +{ + u8 safariFleeRate = BATTLE_STRUCT->safariFleeRate * 5; // safari flee rate, from 0-20 + + if ((u8)(Random() % 100) < safariFleeRate) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void BattleAICmd_watch(void) +{ + AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_WATCH being enabled. +} + +static void BattleAICmd_get_hold_effect(void) +{ + u8 index; + u16 status; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + if (GetBankSide(index) == 0) + { + status = (GetBankIdentity(index) & 1); + AI_THINKING_STRUCT->funcResult = UNK_2016A00_STRUCT->unk22[status]; + } + else + AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[index].item); + + gAIScriptPtr += 2; +} + +static void BattleAICmd_get_gender(void) +{ + u8 index; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[index].species, gBattleMons[index].personality); + + gAIScriptPtr += 2; +} + +static void BattleAICmd_is_first_turn(void) +{ + u8 index; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + AI_THINKING_STRUCT->funcResult = gDisableStructs[index].isFirstTurn; + + gAIScriptPtr += 2; +} + +static void BattleAICmd_get_stockpile_count(void) +{ + u8 index; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + AI_THINKING_STRUCT->funcResult = gDisableStructs[index].stockpileCounter; + + gAIScriptPtr += 2; +} + +static void BattleAICmd_is_double_battle(void) +{ + AI_THINKING_STRUCT->funcResult = gBattleTypeFlags & BATTLE_TYPE_DOUBLE; + + gAIScriptPtr += 1; +} + +static void BattleAICmd_get_used_item(void) +{ + u8 index; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + // this hack and a half matches. whatever. i dont care. someone else fix this mess later. PS: still cant fix this. + AI_THINKING_STRUCT->funcResult = ewram[MULTI_DIM_ARR(index, B_16, 0x160CC)]; + + gAIScriptPtr += 2; +} + +static void BattleAICmd_get_move_type_from_result(void) +{ + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].type; + + gAIScriptPtr += 1; +} + +static void BattleAICmd_get_move_power_from_result(void) +{ + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].power; + + gAIScriptPtr += 1; +} + +static void BattleAICmd_get_move_effect_from_result(void) +{ + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].effect; + + gAIScriptPtr += 1; +} + +static void BattleAICmd_get_protect_count(void) +{ + u8 index; + + if (gAIScriptPtr[1] == USER) + index = gBankAttacker; + else + index = gBankTarget; + + AI_THINKING_STRUCT->funcResult = gDisableStructs[index].protectUses; + + gAIScriptPtr += 2; +} + +static void BattleAICmd_nullsub_52(void) +{ +} + +static void BattleAICmd_nullsub_53(void) +{ +} + +static void BattleAICmd_nullsub_54(void) +{ +} + +static void BattleAICmd_nullsub_55(void) +{ +} + +static void BattleAICmd_nullsub_56(void) +{ +} + +static void BattleAICmd_nullsub_57(void) +{ +} + +static void BattleAICmd_call(void) +{ + AIStackPushVar(gAIScriptPtr + 5); + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); +} + +static void BattleAICmd_jump(void) +{ + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); +} + +static void BattleAICmd_end(void) +{ + if (AIStackPop() == FALSE) + AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE; +} + +static void BattleAICmd_if_level_compare(void) +{ + switch (gAIScriptPtr[1]) + { + case 0: // greater than + if (gBattleMons[gBankAttacker].level > gBattleMons[gBankTarget].level) + { + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + return; + } + gAIScriptPtr += 6; + return; + case 1: // less than + if (gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) + { + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + return; + } + gAIScriptPtr += 6; + return; + case 2: // equal + if (gBattleMons[gBankAttacker].level == gBattleMons[gBankTarget].level) + { + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + return; + } + gAIScriptPtr += 6; + return; + } +} + +static void BattleAICmd_if_taunted(void) +{ + if (gDisableStructs[gBankTarget].tauntTimer1 != 0) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +static void BattleAICmd_if_not_taunted(void) +{ + if (gDisableStructs[gBankTarget].tauntTimer1 == 0) + gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} + +void AIStackPushVar(u8 *var) +{ + AI_STACK->ptr[AI_STACK->size++] = var; +} + +// unused +void AIStackPushAIPtr(void) +{ + AI_STACK->ptr[AI_STACK->size++] = gAIScriptPtr; +} + +bool8 AIStackPop(void) +{ + if (AI_STACK->size != 0) + { + --AI_STACK->size; + gAIScriptPtr = AI_STACK->ptr[AI_STACK->size]; + return TRUE; + } + else + return FALSE; +} diff --git a/src/battle/battle_anim.c b/src/battle/battle_anim.c new file mode 100644 index 000000000..6bd98099a --- /dev/null +++ b/src/battle/battle_anim.c @@ -0,0 +1,2270 @@ +#include "global.h" +#include "battle_anim.h" +#include "battle.h" +#include "battle_anim_80CA710.h" +#include "battle_interface.h" +#include "contest.h" +#include "decompress.h" +#include "m4a.h" +#include "main.h" +#include "palette.h" +#include "rom_8077ABC.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" + +// sprites start at 10000 and thus must be subtracted of 10000 to account for the true index. +#define GET_TRUE_SPRITE_INDEX(i) (i - 10000) + +extern u8 unk_2000000[]; +extern u16 gBattlePartyID[4]; +extern u8 gObjectBankIDs[]; +extern u8 gBankAttacker; +extern u8 gBankTarget; +EWRAM_DATA const u8 *gBattleAnimScriptPtr = NULL; +EWRAM_DATA const u8 *gBattleAnimScriptRetAddr = NULL; +EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL; +EWRAM_DATA s8 gAnimFramesToWait = 0; +EWRAM_DATA u8 gAnimScriptActive = FALSE; +EWRAM_DATA u8 gAnimVisualTaskCount = 0; +EWRAM_DATA u8 gAnimSoundTaskCount = 0; +EWRAM_DATA u32 gDisableStructMoveAnim = 0; +EWRAM_DATA u32 gMoveDmgMoveAnim = 0; +EWRAM_DATA u16 gMovePowerMoveAnim = 0; +EWRAM_DATA u8 gHappinessMoveAnim = 0; +EWRAM_DATA u16 gWeatherMoveAnim = 0; +EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0}; +EWRAM_DATA u8 gUnknown_0202F7C4 = 0; +EWRAM_DATA u8 gUnknown_0202F7C5 = 0; +EWRAM_DATA u16 gAnimMoveIndex = 0; // set but unused. +EWRAM_DATA u8 gBattleAnimPlayerMonIndex = 0; +EWRAM_DATA u8 gBattleAnimEnemyMonIndex = 0; +EWRAM_DATA u16 gUnknown_0202F7CA[4] = {0}; +EWRAM_DATA u8 gUnknown_0202F7D2 = 0; +extern u16 gUnknown_030041B4; +extern u16 gUnknown_03004200; +extern u16 gUnknown_03004240; +extern u16 gUnknown_03004244; +extern u16 gUnknown_03004280; +extern u16 gUnknown_03004288; +extern u16 gUnknown_030042C0; +extern u16 gUnknown_030042C4; + +u16 gSoundAnimFramesToWait; +s16 gBattleAnimArgs[8]; +u16 gAnimSpriteIndexArray[8]; + +extern struct MusicPlayerInfo gMPlay_BGM; +extern struct MusicPlayerInfo gMPlay_SE1; +extern struct MusicPlayerInfo gMPlay_SE2; + +extern const u16 gUnknown_081C7160[]; +extern const u8 *const gBattleAnims_Moves[]; +extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; +extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; +extern const struct BattleAnimBackground gBattleAnimBackgroundTable[]; + +static void RunAnimScriptCommand(void); +static void ScriptCmd_loadsprite(void); +static void ScriptCmd_unloadsprite(void); +static void ScriptCmd_sprite(void); +static void ScriptCmd_createtask(void); +static void ScriptCmd_delay(void); +static void ScriptCmd_waitforvisualfinish(void); +static void ScriptCmd_hang1(void); +static void ScriptCmd_hang2(void); +static void ScriptCmd_end(void); +static void ScriptCmd_playse(void); +static void ScriptCmd_monbg(void); +static void sub_8076380(void); +static void task_pA_ma0A_obj_to_bg_pal(u8); +static void ScriptCmd_clearmonbg(void); +static void sub_807672C(u8); +static void ScriptCmd_monbg_22(void); +static void ScriptCmd_clearmonbg_23(void); +static void sub_80769A4(u8); +static void ScriptCmd_setalpha(void); +static void ScriptCmd_setbldcnt(void); +static void ScriptCmd_blendoff(void); +static void ScriptCmd_call(void); +static void ScriptCmd_return(void); +static void ScriptCmd_setvar(void); +static void ScriptCmd_ifelse(void); +static void ScriptCmd_jumpif(void); +static void ScriptCmd_jump(void); +static void ScriptCmd_fadetobg(void); +static void ScriptCmd_fadetobg_25(void); +static void task_p5_load_battle_screen_elements(u8); +static void sub_8076DB8(u16); +static void dp01t_11_3_message_for_player_only(void); +static void ScriptCmd_restorebg(void); +static void ScriptCmd_waitbgfadeout(void); +static void ScriptCmd_waitbgfadein(void); +static void ScriptCmd_changebg(void); +static void ScriptCmd_panse_19(void); +static void ScriptCmd_setpan(void); +static void ScriptCmd_panse_1B(void); +static void c3_08073CEC(u8); +static void ScriptCmd_panse_26(void); +static void ScriptCmd_panse_27(void); +static void ScriptCmd_panse_1C(void); +static void sub_80774FC(u8); +static void ScriptCmd_panse_1D(void); +static void sub_80775CC(u8); +static void ScriptCmd_createtask_1F(void); +static void ScriptCmd_waitsound(void); +static void ScriptCmd_jumpvareq(void); +static void ScriptCmd_jumpunkcond(void); +static void ScriptCmd_monbgprio_28(void); +static void ScriptCmd_monbgprio_29(void); +static void ScriptCmd_monbgprio_2A(void); +static void ScriptCmd_invisible(void); +static void ScriptCmd_visible(void); +static void ScriptCmd_doublebattle_2D(void); +static void ScriptCmd_doublebattle_2E(void); +static void ScriptCmd_stopsound(void); + +static void (*const sScriptCmdTable[])(void) = { + ScriptCmd_loadsprite, + ScriptCmd_unloadsprite, + ScriptCmd_sprite, + ScriptCmd_createtask, + ScriptCmd_delay, + ScriptCmd_waitforvisualfinish, + ScriptCmd_hang1, + ScriptCmd_hang2, + ScriptCmd_end, + ScriptCmd_playse, + ScriptCmd_monbg, + ScriptCmd_clearmonbg, + ScriptCmd_setalpha, + ScriptCmd_blendoff, + ScriptCmd_call, + ScriptCmd_return, + ScriptCmd_setvar, + ScriptCmd_ifelse, + ScriptCmd_jumpif, + ScriptCmd_jump, + ScriptCmd_fadetobg, + ScriptCmd_restorebg, + ScriptCmd_waitbgfadeout, + ScriptCmd_waitbgfadein, + ScriptCmd_changebg, + ScriptCmd_panse_19, + ScriptCmd_setpan, + ScriptCmd_panse_1B, + ScriptCmd_panse_1C, + ScriptCmd_panse_1D, + ScriptCmd_setbldcnt, + ScriptCmd_createtask_1F, + ScriptCmd_waitsound, + ScriptCmd_jumpvareq, + ScriptCmd_monbg_22, + ScriptCmd_clearmonbg_23, + ScriptCmd_jumpunkcond, + ScriptCmd_fadetobg_25, + ScriptCmd_panse_26, + ScriptCmd_panse_27, + ScriptCmd_monbgprio_28, + ScriptCmd_monbgprio_29, + ScriptCmd_monbgprio_2A, + ScriptCmd_invisible, + ScriptCmd_visible, + ScriptCmd_doublebattle_2D, + ScriptCmd_doublebattle_2E, + ScriptCmd_stopsound, +}; + +void battle_anim_clear_some_data(void) +{ + s32 i; + + gAnimFramesToWait = 0; + gAnimScriptActive = FALSE; + gAnimVisualTaskCount = 0; + gAnimSoundTaskCount = 0; + gDisableStructMoveAnim = 0; + gMoveDmgMoveAnim = 0; + gMovePowerMoveAnim = 0; + gHappinessMoveAnim = 0; + + // clear index array. + for (i = 0; i < 8; i++) + gAnimSpriteIndexArray[i] |= 0xFFFF; + + // clear anim args. + for (i = 0; i < 8; i++) + gBattleAnimArgs[i] = 0; + + gMonAnimTaskIdArray[0] = 0xFF; + gMonAnimTaskIdArray[1] = 0xFF; + gUnknown_0202F7C4 = 0; + gUnknown_0202F7C5 = 0; + gAnimMoveIndex = 0; + gBattleAnimPlayerMonIndex = 0; + gBattleAnimEnemyMonIndex = 0; + gUnknown_0202F7D2 = 0; +} + +void ExecuteMoveAnim(u16 move) +{ + gBattleAnimPlayerMonIndex = gBankAttacker; + gBattleAnimEnemyMonIndex = gBankTarget; + DoMoveAnim(gBattleAnims_Moves, move, 1); +} + +void DoMoveAnim(const u8 *const moveAnims[], u16 move, u8 c) +{ + s32 i; + + if (IsContest() == 0) + { + sub_8079E24(); + sub_8043EB4(0); + for (i = 0; i < 4; i++) + { + if (GetBankSide(i) != 0) + gUnknown_0202F7CA[i] = GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_SPECIES); + else + gUnknown_0202F7CA[i] = GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_SPECIES); + } + } + else + { + for (i = 0; i < 4; i++) + gUnknown_0202F7CA[i] = EWRAM_19348; + } + + if (c == 0) + gAnimMoveIndex = 0; + else + gAnimMoveIndex = move; + + for (i = 0; i < 8; i++) + gBattleAnimArgs[i] = 0; + + gMonAnimTaskIdArray[0] = 0xFF; + gMonAnimTaskIdArray[1] = 0xFF; + gBattleAnimScriptPtr = moveAnims[move]; + gAnimScriptActive = TRUE; + gAnimFramesToWait = 0; + gAnimScriptCallback = RunAnimScriptCommand; + + for (i = 0; i < 8; i++) + gAnimSpriteIndexArray[i] |= 0xFFFF; + + if (c != 0) + { + for (i = 0; gUnknown_081C7160[i] != 0xFFFF; i++) + { + if (move == gUnknown_081C7160[i]) + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128); + break; + } + } + } + + gUnknown_030042C4 = 0; + gUnknown_03004240 = 0; + gUnknown_03004200 = 0; + gUnknown_03004244 = 0; +} + +void move_anim_8072740(struct Sprite *sprite) +{ + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + gAnimVisualTaskCount--; +} + +void DestroyAnimVisualTask(u8 taskId) +{ + DestroyTask(taskId); + gAnimVisualTaskCount--; +} + +void DestroyAnimSoundTask(u8 taskId) +{ + DestroyTask(taskId); + gAnimSoundTaskCount--; +} + +static void AddSpriteIndex(u16 index) +{ + s32 i; + + for (i = 0; i < 8; i++) + { + if (gAnimSpriteIndexArray[i] == 0xFFFF) + { + gAnimSpriteIndexArray[i] = index; + return; + } + } +} + +static void ClearSpriteIndex(u16 index) +{ + s32 i; + + for (i = 0; i < 8; i++) + { + if (gAnimSpriteIndexArray[i] == index) + { + gAnimSpriteIndexArray[i] |= 0xFFFF; + return; + } + } +} + +static void WaitAnimFrameCount(void) +{ + if (gAnimFramesToWait <= 0) + { + gAnimScriptCallback = RunAnimScriptCommand; + gAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait--; + } +} + +static void RunAnimScriptCommand(void) +{ + do + { + sScriptCmdTable[SCRIPT_READ_8(gBattleAnimScriptPtr)](); + } while (gAnimFramesToWait == 0 && gAnimScriptActive != FALSE); +} + +static void ScriptCmd_loadsprite(void) +{ + u16 index; + + gBattleAnimScriptPtr++; + index = SCRIPT_READ_16(gBattleAnimScriptPtr); + LoadCompressedObjectPic(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]); + LoadCompressedObjectPalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]); + gBattleAnimScriptPtr += 2; + AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); + gAnimFramesToWait = 1; + gAnimScriptCallback = WaitAnimFrameCount; +} + +static void ScriptCmd_unloadsprite(void) +{ + u16 index; + + gBattleAnimScriptPtr++; + index = SCRIPT_READ_16(gBattleAnimScriptPtr); + FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); + FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); + gBattleAnimScriptPtr += 2; + ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); +} + +#ifdef NONMATCHING +static void ScriptCmd_sprite(void) +{ + s32 i; + struct SpriteTemplate *r7; + u8 r4; + u8 r0; + u8 _r0; + u16 r6; + u8 r2; + s8 r1; + + gBattleAnimScriptPtr++; + r7 = (struct SpriteTemplate *)(SCRIPT_READ_32(gBattleAnimScriptPtr)); + gBattleAnimScriptPtr += 4; + r4 = SCRIPT_READ_8(gBattleAnimScriptPtr); + gBattleAnimScriptPtr++; + r0 = SCRIPT_READ_8(gBattleAnimScriptPtr); + gBattleAnimScriptPtr++; + for (i = 0; i < r0; i++) + { + gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimScriptPtr += 2; + } + if (r4 & 0x80) + { + r4 ^= 0x80; + if (r4 > 0x3F) + r4 -= 0x40; + else + r4 = -r4; + _r0 = sub_8079E90(gBattleAnimEnemyMonIndex); + r1 = r4; + + } + else + { + //_08075B44 + if (r4 > 0x3F) + r4 -= 0x40; + else + r4 = -r4; + _r0 = sub_8079E90(gBattleAnimPlayerMonIndex); + r1 = r4; + } + r6 = _r0 + r1; + if ((s16)r6 < 3) + r6 = 3; + + r4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2); + r2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3); + CreateSpriteAndAnimate(r7, r4, r2, r6); + gAnimVisualTaskCount++; +} +#else +__attribute__((naked)) +static void ScriptCmd_sprite(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + ldr r5, _08075B2C @ =gBattleAnimScriptPtr\n\ + ldr r1, [r5]\n\ + adds r3, r1, 0x1\n\ + str r3, [r5]\n\ + ldrb r2, [r1, 0x1]\n\ + ldrb r0, [r3, 0x1]\n\ + lsls r0, 8\n\ + adds r2, r0\n\ + ldrb r0, [r3, 0x2]\n\ + lsls r0, 16\n\ + adds r2, r0\n\ + ldrb r0, [r3, 0x3]\n\ + lsls r0, 24\n\ + adds r7, r2, r0\n\ + adds r0, r1, 0x5\n\ + str r0, [r5]\n\ + ldrb r4, [r1, 0x5]\n\ + adds r0, r1, 0x6\n\ + str r0, [r5]\n\ + ldrb r0, [r1, 0x6]\n\ + adds r1, 0x7\n\ + str r1, [r5]\n\ + cmp r0, 0\n\ + beq _08075B14\n\ + adds r6, r5, 0\n\ + ldr r5, _08075B30 @ =gBattleAnimArgs\n\ + adds r3, r0, 0\n\ +_08075AFC:\n\ + ldr r2, [r6]\n\ + ldrb r1, [r2]\n\ + ldrb r0, [r2, 0x1]\n\ + lsls r0, 8\n\ + orrs r1, r0\n\ + strh r1, [r5]\n\ + adds r2, 0x2\n\ + str r2, [r6]\n\ + adds r5, 0x2\n\ + subs r3, 0x1\n\ + cmp r3, 0\n\ + bne _08075AFC\n\ +_08075B14:\n\ + movs r0, 0x80\n\ + ands r0, r4\n\ + cmp r0, 0\n\ + beq _08075B44\n\ + movs r0, 0x80\n\ + eors r4, r0\n\ + cmp r4, 0x3F\n\ + bls _08075B34\n\ + adds r0, r4, 0\n\ + subs r0, 0x40\n\ + b _08075B36\n\ + .align 2, 0\n\ +_08075B2C: .4byte gBattleAnimScriptPtr\n\ +_08075B30: .4byte gBattleAnimArgs\n\ +_08075B34:\n\ + negs r0, r4\n\ +_08075B36:\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + ldr r0, _08075B40 @ =gBattleAnimEnemyMonIndex\n\ + b _08075B56\n\ + .align 2, 0\n\ +_08075B40: .4byte gBattleAnimEnemyMonIndex\n\ +_08075B44:\n\ + cmp r4, 0x3F\n\ + bls _08075B4E\n\ + adds r0, r4, 0\n\ + subs r0, 0x40\n\ + b _08075B50\n\ +_08075B4E:\n\ + negs r0, r4\n\ +_08075B50:\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + ldr r0, _08075BAC @ =gBattleAnimPlayerMonIndex\n\ +_08075B56:\n\ + ldrb r0, [r0]\n\ + bl sub_8079E90\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, r4, 24\n\ + asrs r1, 24\n\ + adds r0, r1\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + lsls r0, r6, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x2\n\ + bgt _08075B74\n\ + movs r6, 0x3\n\ +_08075B74:\n\ + ldr r5, _08075BB0 @ =gBattleAnimEnemyMonIndex\n\ + ldrb r0, [r5]\n\ + movs r1, 0x2\n\ + bl sub_8077ABC\n\ + adds r4, r0, 0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + ldrb r0, [r5]\n\ + movs r1, 0x3\n\ + bl sub_8077ABC\n\ + adds r2, r0, 0\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + lsls r3, r6, 24\n\ + lsrs r3, 24\n\ + adds r0, r7, 0\n\ + adds r1, r4, 0\n\ + bl CreateSpriteAndAnimate\n\ + ldr r1, _08075BB4 @ =gAnimVisualTaskCount\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08075BAC: .4byte gBattleAnimPlayerMonIndex\n\ +_08075BB0: .4byte gBattleAnimEnemyMonIndex\n\ +_08075BB4: .4byte gAnimVisualTaskCount\n\ + .syntax divided\n"); +} +#endif + +static void ScriptCmd_createtask(void) +{ + TaskFunc taskFunc; + u8 taskPriority; + u8 taskId; + u8 numArgs; + s32 i; + + gBattleAnimScriptPtr++; + taskFunc = (TaskFunc)SCRIPT_READ_32(gBattleAnimScriptPtr); + gBattleAnimScriptPtr += 4; + taskPriority = SCRIPT_READ_8(gBattleAnimScriptPtr); + gBattleAnimScriptPtr++; + numArgs = SCRIPT_READ_8(gBattleAnimScriptPtr); + gBattleAnimScriptPtr++; + + for (i = 0; i < numArgs; i++) + { + gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimScriptPtr += 2; + } + + taskId = CreateTask(taskFunc, taskPriority); + taskFunc(taskId); + gAnimVisualTaskCount++; +} + +static void ScriptCmd_delay(void) +{ + gBattleAnimScriptPtr++; + gAnimFramesToWait = SCRIPT_READ_8(gBattleAnimScriptPtr); + if (gAnimFramesToWait == 0) + gAnimFramesToWait = -1; + gBattleAnimScriptPtr++; + gAnimScriptCallback = WaitAnimFrameCount; +} + +// wait for visual tasks to finish. +static void ScriptCmd_waitforvisualfinish(void) +{ + if (gAnimVisualTaskCount == 0) + { + gBattleAnimScriptPtr++; + gAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait = 1; + } +} + +static void ScriptCmd_hang1(void) +{ +} + +static void ScriptCmd_hang2(void) +{ +} + +static void ScriptCmd_end(void) +{ + s32 i; + bool32 continuousAnim = FALSE; + + // keep waiting as long as there is animations to be done. + if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0 + || gMonAnimTaskIdArray[0] != 0xFF || gMonAnimTaskIdArray[1] != 0xFF) + { + gSoundAnimFramesToWait = 0; + gAnimFramesToWait = 1; + return; + } + + // finish the sound effects. + if (IsSEPlaying()) + { + if (++gSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect. + { + gAnimFramesToWait = 1; + return; + } + else + { + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + } + } + + // the SE has halted, so set the SE Frame Counter to 0 and continue. + gSoundAnimFramesToWait = 0; + + for (i = 0; i < 8; i++) + { + if (gAnimSpriteIndexArray[i] != 0xFFFF) + { + FreeSpriteTilesByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); + FreeSpritePaletteByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); + gAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator. + } + } + + if (continuousAnim == FALSE) // may have been used for debug? + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); + if (IsContest() == 0) + { + sub_8079E24(); + sub_8043EB4(1); + } + gAnimScriptActive = FALSE; + } +} + +static void ScriptCmd_playse(void) +{ + gBattleAnimScriptPtr++; + PlaySE(SCRIPT_READ_16(gBattleAnimScriptPtr)); + gBattleAnimScriptPtr += 2; +} + +static void ScriptCmd_monbg(void) +{ + u8 r6; + u8 r5; + u8 r0; + u8 r7; + u16 r4; + u8 taskId; + + gBattleAnimScriptPtr++; + r6 = SCRIPT_READ_8(gBattleAnimScriptPtr); + if (r6 == 0) + r6 = 2; + else if (r6 == 1) + r6 = 3; + if (r6 == 0 || r6 == 2) + r5 = gBattleAnimPlayerMonIndex; + else + r5 = gBattleAnimEnemyMonIndex; + if (b_side_obj__get_some_boolean(r5)) + { + r0 = GetBankIdentity(r5); + r0 += 0xFF; + if (r0 <= 1 || IsContest() != 0) + r7 = 0; + else + r7 = 1; + sub_8076034(r5, r7); + r4 = gObjectBankIDs[r5]; + taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10); + gTasks[taskId].data[0] = r4; + gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x; + gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y; + if (r7 == 0) + { + gTasks[taskId].data[3] = gUnknown_030042C0; + gTasks[taskId].data[4] = gUnknown_030041B4; + } + else + { + gTasks[taskId].data[3] = gUnknown_03004288; + gTasks[taskId].data[4] = gUnknown_03004280; + } + gTasks[taskId].data[5] = r7; + gTasks[taskId].data[6] = r5; + gMonAnimTaskIdArray[0] = taskId; + + } + r5 ^= 2; + if (r6 > 1 && b_side_obj__get_some_boolean(r5)) + { + r0 = GetBankIdentity(r5); + r0 += 0xFF; + if (r0 <= 1 || IsContest() != 0) + r7 = 0; + else + r7 = 1; + sub_8076034(r5, r7); + r4 = gObjectBankIDs[r5]; + taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10); + gTasks[taskId].data[0] = r4; + gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x; + gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y; + if (r7 == 0) + { + gTasks[taskId].data[3] = gUnknown_030042C0; + gTasks[taskId].data[4] = gUnknown_030041B4; + } + else + { + gTasks[taskId].data[3] = gUnknown_03004288; + gTasks[taskId].data[4] = gUnknown_03004280; + } + gTasks[taskId].data[5] = r7; + gTasks[taskId].data[6] = r5; + gMonAnimTaskIdArray[1] = taskId; + } + gBattleAnimScriptPtr++; +} + +#ifdef NONMATCHING +bool8 b_side_obj__get_some_boolean(u8 a) +{ + if (IsContest() != 0) + { + if (a == gBattleAnimPlayerMonIndex) + return TRUE; + else + return FALSE; + } + if (sub_8078874(a) == 0) + return FALSE; + if (IsContest() != 0) + return TRUE; // this line wont ever be reached. + if ((EWRAM_17800[a].unk0 & 1) == 0) + return TRUE; + if (gSprites[gObjectBankIDs[a]].invisible) + return FALSE; + return TRUE; +} +#else +__attribute__((naked)) +bool8 b_side_obj__get_some_boolean(u8 a) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + adds r5, r4, 0\n\ + bl IsContest\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08075FDC\n\ + ldr r0, _08075FD8 @ =gBattleAnimPlayerMonIndex\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + beq _0807601C\n\ + b _0807602C\n\ + .align 2, 0\n\ +_08075FD8: .4byte gBattleAnimPlayerMonIndex\n\ +_08075FDC:\n\ + adds r0, r4, 0\n\ + bl sub_8078874\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0807602C\n\ + bl IsContest\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0807601C\n\ + lsls r0, r5, 2\n\ + ldr r1, _08076020 @ =0x02017800\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0807601C\n\ + ldr r2, _08076024 @ =gSprites\n\ + ldr r0, _08076028 @ =gObjectBankIDs\n\ + adds r0, r5, r0\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + adds r0, 0x3E\n\ + ldrb r0, [r0]\n\ + lsls r0, 29\n\ + cmp r0, 0\n\ + blt _0807602C\n\ +_0807601C:\n\ + movs r0, 0x1\n\ + b _0807602E\n\ + .align 2, 0\n\ +_08076020: .4byte 0x02017800\n\ +_08076024: .4byte gSprites\n\ +_08076028: .4byte gObjectBankIDs\n\ +_0807602C:\n\ + movs r0, 0\n\ +_0807602E:\n\ + pop {r4,r5}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif + +void sub_8076034(u8 a, u8 b) +{ + volatile u8 pointlessZero; + u16 *addr2; + u8 spriteId; + + if (b == 0) + { + struct UnknownStruct2 s; + u8 *addr; + u32 size; + u8 r2; + u16 *addr3; + + sub_8078914(&s); + addr = s.unk0; + size = 0x2000; + while (1) + { + DmaFill32(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaFill32(3, 0, addr, size); + break; + } + } + pointlessZero = 0; + pointlessZero = 0; + addr2 = (void *)s.unk4; + DmaFill16(3, 0xFF, addr2, 0x1000); + + REG_BG1CNT_BITFIELD.priority = 2; + REG_BG1CNT_BITFIELD.screenSize = 1; + REG_BG1CNT_BITFIELD.areaOverflowMode = 0; + + spriteId = gObjectBankIDs[a]; + gUnknown_030042C0 = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32; + if (IsContest() != 0 && sub_80AEB1C(EWRAM_19348) != 0) + gUnknown_030042C0--; + gUnknown_030041B4 = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32; + gSprites[gObjectBankIDs[a]].invisible = TRUE; + + REG_BG1HOFS = gUnknown_030042C0; + REG_BG1VOFS = gUnknown_030041B4; + + LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, s.unk8 * 16, 32); + addr3 = (u16 *)PLTT + s.unk8 * 16; + DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32); + + if (IsContest() != 0) + r2 = 0; + else + r2 = GetBankIdentity(a); + sub_80E4EF8(0, 0, r2, s.unk8, (u32)s.unk0, (((s32)s.unk4 - VRAM) / 2048), REG_BG1CNT_BITFIELD.charBaseBlock); + if (IsContest() != 0) + sub_8076380(); + } + else + { + u8 *addr; + u32 size; + u16 *addr3; + + addr = (void *)(VRAM + 0x6000); + size = 0x2000; + while (1) + { + DmaFill32(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaFill32(3, 0, addr, size); + break; + } + } + pointlessZero = 0; + pointlessZero = 0; + addr2 = (void *)(VRAM + 0xF000); + DmaFill32(3, 0, addr2, 0x800); + + REG_BG2CNT_BITFIELD.priority = 2; + REG_BG2CNT_BITFIELD.screenSize = 1; + REG_BG2CNT_BITFIELD.areaOverflowMode = 0; + + spriteId = gObjectBankIDs[a]; + gUnknown_03004288 = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32; + gUnknown_03004280 = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32; + gSprites[gObjectBankIDs[a]].invisible = TRUE; + + REG_BG2HOFS = gUnknown_03004288; + REG_BG2VOFS = gUnknown_03004280; + + LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, 0x90, 32); + addr3 = (void *)(PLTT + 0x120); + DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32); + + sub_80E4EF8(0, 0, GetBankIdentity(a), 9, 0x6000, 0x1E, REG_BG2CNT_BITFIELD.charBaseBlock); + } +} + +static void sub_8076380(void) +{ + int i; + int j; + struct UnknownStruct2 s; + u16 *ptr; + + if (sub_80AEB1C(EWRAM_19348) != 0) + { + sub_8078914(&s); + ptr = s.unk4; + for (i = 0; i < 8; i++) + { + for (j = 0; j < 4; j++) + { + u16 temp = ptr[j + i * 32]; + + ptr[j + i * 32] = ptr[7 - j + i * 32]; + ptr[7 - j + i * 32] = temp; + } + } + for (i = 0; i < 8; i++) + { + for (j = 0; j < 8; j++) + ptr[j + i * 32] ^= 0x400; + } + } +} + +void sub_80763FC(u16 a, u16 *b, u32 c, u8 d) +{ + u8 i; + u8 j; + u32 r9; + + if (d == 0) + r9 = 32; + else + r9 = 64; + a <<= 12; + for (i = 0; i < r9; i++) + { + for (j = 0; j < 32; j++) + b[j + i * 32] = ((b[j + i * 32] & 0xFFF) | a) + c; + } +} + +void sub_8076464(u8 a) +{ + u8 *addr; + u32 size; + volatile u8 pointlessZero; + struct UnknownStruct2 s; + + sub_8078914(&s); + if (a == 0 || IsContest() != 0) + { + u16 *addr2; + + addr = s.unk0; + size = 0x2000; + while (1) + { + DmaFill32(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaFill32(3, 0, addr, size); + break; + } + } + pointlessZero = 0; + pointlessZero = 0; + addr2 = s.unk4; + DmaFill32(3, 0, addr2, 0x800); + gUnknown_030042C0 = 0; + gUnknown_030041B4 = 0; + } + else + { + u16 *addr2; + + addr = (void *)(VRAM + 0x6000); + size = 0x2000; + while (1) + { + DmaFill32(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaFill32(3, 0, addr, size); + break; + } + } + pointlessZero = 0; + pointlessZero = 0; + addr2 = (void *)(VRAM + 0xF000); + DmaFill32(3, 0, addr2, 0x800); + gUnknown_03004288 = 0; + gUnknown_03004280 = 0; + } +} + +static void task_pA_ma0A_obj_to_bg_pal(u8 taskId) +{ + u8 r4; + u8 r6; + s16 r3; + s16 r2; + struct UnknownStruct2 s; + + r4 = gTasks[taskId].data[0]; + r6 = gTasks[taskId].data[6]; + sub_8078914(&s); + r3 = gTasks[taskId].data[1] - (gSprites[r4].pos1.x + gSprites[r4].pos2.x); + r2 = gTasks[taskId].data[2] - (gSprites[r4].pos1.y + gSprites[r4].pos2.y); + if (gTasks[taskId].data[5] == 0) + { + u16 *src; + u16 *dst; + + gUnknown_030042C0 = r3 + gTasks[taskId].data[3]; + gUnknown_030041B4 = r2 + gTasks[taskId].data[4]; + src = gPlttBufferFaded + 0x100 + r6 * 16; + dst = gPlttBufferFaded + 0x100 + s.unk8 * 16 - 256; + DmaCopy32(3, src, dst, 32); + } + else + { + u16 *src; + u16 *dst; + + gUnknown_03004288 = r3 + gTasks[taskId].data[3]; + gUnknown_03004280 = r2 + gTasks[taskId].data[4]; + src = gPlttBufferFaded + 0x100 + r6 * 16; + dst = gPlttBufferFaded + 0x100 - 112; + DmaCopy32(3, src, dst, 32); + } +} + +static void ScriptCmd_clearmonbg(void) +{ + u8 r4; + u8 r5; + u8 taskId; + + gBattleAnimScriptPtr++; + r4 = SCRIPT_READ_8(gBattleAnimScriptPtr); + if (r4 == 0) + r4 = 2; + else if (r4 == 1) + r4 = 3; + if (r4 == 0 || r4 == 2) + r5 = gBattleAnimPlayerMonIndex; + else + r5 = gBattleAnimEnemyMonIndex; + if (gMonAnimTaskIdArray[0] != 0xFF) + gSprites[gObjectBankIDs[r5]].invisible = FALSE; + if (r4 > 1 && gMonAnimTaskIdArray[1] != 0xFF) + gSprites[gObjectBankIDs[r5 ^ 2]].invisible = FALSE; + else + r4 = 0; + taskId = CreateTask(sub_807672C, 5); + gTasks[taskId].data[0] = r4; + gTasks[taskId].data[2] = r5; + gBattleAnimScriptPtr++; +} + +static void sub_807672C(u8 taskId) +{ + u8 var; + u8 r4; + + gTasks[taskId].data[1]++; + if (gTasks[taskId].data[1] != 1) + { + var = GetBankIdentity(gTasks[taskId].data[2]); + var += 0xFF; + if (var <= 1 || IsContest() != 0) + r4 = 0; + else + r4 = 1; + if (gMonAnimTaskIdArray[0] != 0xFF) + { + sub_8076464(r4); + DestroyTask(gMonAnimTaskIdArray[0]); + gMonAnimTaskIdArray[0] = 0xFF; + } + if (gTasks[taskId].data[0] > 1) + { + sub_8076464(r4 ^ 1); + DestroyTask(gMonAnimTaskIdArray[1]); + gMonAnimTaskIdArray[1] = 0xFF; + } + DestroyTask(taskId); + } +} + +static void ScriptCmd_monbg_22(void) +{ + u8 r5; + u8 r4; + u8 r0; + u8 r1; + + gBattleAnimScriptPtr++; + r5 = SCRIPT_READ_8(gBattleAnimScriptPtr); + if (r5 == 0) + r5 = 2; + else if (r5 == 1) + r5 = 3; + if (r5 == 0 || r5 == 2) + r4 = gBattleAnimPlayerMonIndex; + else + r4 = gBattleAnimEnemyMonIndex; + if (b_side_obj__get_some_boolean(r4)) + { + r0 = GetBankIdentity(r4); + r0 += 0xFF; + if (r0 <= 1 || IsContest() != 0) + r1 = 0; + else + r1 = 1; + sub_8076034(r4, r1); + gSprites[gObjectBankIDs[r4]].invisible = FALSE; + } + r4 ^= 2; + if (r5 > 1 && b_side_obj__get_some_boolean(r4)) + { + r0 = GetBankIdentity(r4); + r0 += 0xFF; + if (r0 <= 1 || IsContest() != 0) + r1 = 0; + else + r1 = 1; + sub_8076034(r4, r1); + gSprites[gObjectBankIDs[r4]].invisible = FALSE; + } + gBattleAnimScriptPtr++; +} + +static void ScriptCmd_clearmonbg_23(void) +{ + u8 r5; + u8 r6; + u8 taskId; + + gBattleAnimScriptPtr++; + r5 = SCRIPT_READ_8(gBattleAnimScriptPtr); + if (r5 == 0) + r5 = 2; + else if (r5 == 1) + r5 = 3; + if (r5 == 0 || r5 == 2) + r6 = gBattleAnimPlayerMonIndex; + else + r6 = gBattleAnimEnemyMonIndex; + if (b_side_obj__get_some_boolean(r6)) + gSprites[gObjectBankIDs[r6]].invisible = FALSE; + if (r5 > 1 && b_side_obj__get_some_boolean(r6 ^ 2)) + gSprites[gObjectBankIDs[r6 ^ 2]].invisible = FALSE; + else + r5 = 0; + taskId = CreateTask(sub_80769A4, 5); + gTasks[taskId].data[0] = r5; + gTasks[taskId].data[2] = r6; + gBattleAnimScriptPtr++; +} + +static void sub_80769A4(u8 taskId) +{ + u8 r0; + u8 r4; + u8 r5; + + gTasks[taskId].data[1]++; + if (gTasks[taskId].data[1] != 1) + { + r4 = gTasks[taskId].data[2]; + r0 = GetBankIdentity(r4); + r0 += 0xFF; + if (r0 <= 1 || IsContest() != 0) + r5 = 0; + else + r5 = 1; + if (b_side_obj__get_some_boolean(r4)) + sub_8076464(r5); + if (gTasks[taskId].data[0] > 1 && b_side_obj__get_some_boolean(r4 ^ 2)) + sub_8076464(r5 ^ 1); + DestroyTask(taskId); + } +} + +static void ScriptCmd_setalpha(void) +{ + u16 r3; + u16 r1; + + gBattleAnimScriptPtr++; + r3 = *(gBattleAnimScriptPtr++); + r1 = *(gBattleAnimScriptPtr++) << 8; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = r3 | r1; +} + +static void ScriptCmd_setbldcnt(void) +{ + u16 r3; + u16 r1; + + gBattleAnimScriptPtr++; + r3 = *(gBattleAnimScriptPtr++); + r1 = *(gBattleAnimScriptPtr++) << 8; + REG_BLDCNT = r3 | r1; +} + +static void ScriptCmd_blendoff(void) +{ + gBattleAnimScriptPtr++; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; +} + +static void ScriptCmd_call(void) +{ + u32 addr; + + gBattleAnimScriptPtr++; + gBattleAnimScriptRetAddr = gBattleAnimScriptPtr + 4; + addr = SCRIPT_READ_32(gBattleAnimScriptPtr); + gBattleAnimScriptPtr = (u8 *)addr; +} + +static void ScriptCmd_return(void) +{ + gBattleAnimScriptPtr = gBattleAnimScriptRetAddr; +} + +static void ScriptCmd_setvar(void) +{ + const u8 *addr = gBattleAnimScriptPtr; + u16 r4; + u8 r2; + + gBattleAnimScriptPtr++; + r2 = SCRIPT_READ_8(gBattleAnimScriptPtr); + gBattleAnimScriptPtr++; + r4 = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimScriptPtr = addr + 4; + gBattleAnimArgs[r2] = r4; +} + +static void ScriptCmd_ifelse(void) +{ + u32 addr; + + gBattleAnimScriptPtr++; + if (gUnknown_0202F7C4 & 1) + gBattleAnimScriptPtr += 4; + addr = SCRIPT_READ_32(gBattleAnimScriptPtr); + gBattleAnimScriptPtr = (u8 *)addr; +} + +static void ScriptCmd_jumpif(void) +{ + u8 r1; + u32 addr; + + gBattleAnimScriptPtr++; + r1 = SCRIPT_READ_8(gBattleAnimScriptPtr); + gBattleAnimScriptPtr++; + if (r1 == gUnknown_0202F7C4) + { + addr = SCRIPT_READ_32(gBattleAnimScriptPtr); + gBattleAnimScriptPtr = (u8 *)addr; + } + else + { + gBattleAnimScriptPtr += 4; + } +} + +static void ScriptCmd_jump(void) +{ + u32 addr; + + gBattleAnimScriptPtr++; + addr = SCRIPT_READ_32(gBattleAnimScriptPtr); + gBattleAnimScriptPtr = (u8 *)addr; +} + +// Uses of this function that rely on a TRUE return are expecting inBattle to not be ticked as defined in contest behavior. As a result, if misused, this function cannot reliably discern between field and contest status and could result in undefined behavior. +bool8 IsContest(void) +{ + if (!gMain.inBattle) + return TRUE; + else + return FALSE; +} + +static void ScriptCmd_fadetobg(void) +{ + u8 r4; + u8 taskId; + + gBattleAnimScriptPtr++; + r4 = SCRIPT_READ_8(gBattleAnimScriptPtr); + gBattleAnimScriptPtr++; + taskId = CreateTask(task_p5_load_battle_screen_elements, 5); + gTasks[taskId].data[0] = r4; + gUnknown_0202F7C5 = 1; +} + +static void ScriptCmd_fadetobg_25(void) +{ + u8 r8; + u8 r7; + u8 r6; + u8 taskId; + + gBattleAnimScriptPtr++; + r8 = gBattleAnimScriptPtr[0]; + r7 = gBattleAnimScriptPtr[1]; + r6 = gBattleAnimScriptPtr[2]; + gBattleAnimScriptPtr += 3; + taskId = CreateTask(task_p5_load_battle_screen_elements, 5); + if (IsContest() != 0) + gTasks[taskId].data[0] = r6; + else if (GetBankSide(gBattleAnimEnemyMonIndex) == 0) + gTasks[taskId].data[0] = r7; + else + gTasks[taskId].data[0] = r8; + gUnknown_0202F7C5 = 1; +} + +static void task_p5_load_battle_screen_elements(u8 taskId) +{ + if (gTasks[taskId].data[10] == 0) + { + BeginHardwarePaletteFade(0xE8, 0, 0, 16, 0); + gTasks[taskId].data[10]++; + return; + } + if (gPaletteFade.active) + return; + if (gTasks[taskId].data[10] == 1) + { + gTasks[taskId].data[10]++; + gUnknown_0202F7C5 = 2; + } + else if (gTasks[taskId].data[10] == 2) + { + s16 data0 = (u16)gTasks[taskId].data[0]; + + if (data0 == -1) + dp01t_11_3_message_for_player_only(); + else + sub_8076DB8(data0); + BeginHardwarePaletteFade(0xE8, 0, 16, 0, 1); + gTasks[taskId].data[10]++; + return; + } + if (gPaletteFade.active) + return; + if (gTasks[taskId].data[10] == 3) + { + DestroyTask(taskId); + gUnknown_0202F7C5 = 0; + } +} + +static void sub_8076DB8(u16 a) +{ + if (IsContest()) + { + void *tilemap = gBattleAnimBackgroundTable[a].tilemap; + void *dmaSrc; + void *dmaDest; + + sub_800D238(tilemap, IsContest() ? EWRAM_14800 : EWRAM_18000); + sub_80763FC(sub_80789BC(), IsContest() ? EWRAM_14800 : EWRAM_18000, 0x100, 0); + dmaSrc = IsContest() ? EWRAM_14800 : EWRAM_18000; + dmaDest = (void *)(VRAM + 0xD000); + DmaCopy32(3, dmaSrc, dmaDest, 0x800); + LZDecompressVram(gBattleAnimBackgroundTable[a].image, (void *)(VRAM + 0x2000)); + LoadCompressedPalette(gBattleAnimBackgroundTable[a].palette, sub_80789BC() * 16, 32); + } + else + { + LZDecompressVram(gBattleAnimBackgroundTable[a].tilemap, (void *)(VRAM + 0xD000)); + LZDecompressVram(gBattleAnimBackgroundTable[a].image, (void *)(VRAM + 0x8000)); + LoadCompressedPalette(gBattleAnimBackgroundTable[a].palette, 32, 32); + } +} + +static void dp01t_11_3_message_for_player_only(void) +{ + if (IsContest()) + sub_80AB2AC(); + else + sub_800D7B8(); +} + +static void ScriptCmd_restorebg(void) +{ + u8 taskId; + + gBattleAnimScriptPtr++; + taskId = CreateTask(task_p5_load_battle_screen_elements, 5); + gTasks[taskId].data[0] = 0xFFFF; + gUnknown_0202F7C5 = 1; +} + +static void ScriptCmd_waitbgfadeout(void) +{ + if (gUnknown_0202F7C5 == 2) + { + gBattleAnimScriptPtr++; + gAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait = 1; + } +} + +static void ScriptCmd_waitbgfadein(void) +{ + if (gUnknown_0202F7C5 == 0) + { + gBattleAnimScriptPtr++; + gAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait = 1; + } +} + +static void ScriptCmd_changebg(void) +{ + gBattleAnimScriptPtr++; + sub_8076DB8(SCRIPT_READ_8(gBattleAnimScriptPtr)); + gBattleAnimScriptPtr++; +} + +//Weird control flow +/* +s8 sub_8076F98(s8 a) +{ + if (!IsContest() && (EWRAM_17810[gBattleAnimPlayerMonIndex].unk0 & 0x10)) + { + a = GetBankSide(gBattleAnimPlayerMonIndex) ? 0xC0 : 0x3F; + } + //_08076FDC + else + { + if (IsContest()) + { + if (gBattleAnimPlayerMonIndex == gBattleAnimEnemyMonIndex && gBattleAnimPlayerMonIndex == 2 + && a == 0x3F) + { + //jump to _0807707A + if (a < -0x40) + a = 0xC0; + return a; + } + } + //_08077004 + else + { + if (GetBankSide(gBattleAnimPlayerMonIndex) == 0) + { + if (GetBankSide(gBattleAnimEnemyMonIndex) == 0) + } + //_08077042 + else + { + + } + //_0807706C + } + } + //_0807706E +} +*/ +__attribute__((naked)) +s8 sub_8076F98(s8 a) +{ + asm(".syntax unified\n\ + push {r4,lr}\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + bl IsContest\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08076FDC\n\ + ldr r0, _08076FD4 @ =gBattleAnimPlayerMonIndex\n\ + ldrb r2, [r0]\n\ + lsls r0, r2, 1\n\ + adds r0, r2\n\ + lsls r0, 2\n\ + ldr r1, _08076FD8 @ =0x02017810\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08076FDC\n\ + adds r0, r2, 0\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + movs r4, 0xC0\n\ + cmp r0, 0\n\ + beq _0807706E\n\ + movs r4, 0x3F\n\ + b _0807706E\n\ + .align 2, 0\n\ +_08076FD4: .4byte gBattleAnimPlayerMonIndex\n\ +_08076FD8: .4byte 0x02017810\n\ +_08076FDC:\n\ + bl IsContest\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08077004\n\ + ldr r0, _08076FFC @ =gBattleAnimPlayerMonIndex\n\ + ldr r1, _08077000 @ =gBattleAnimEnemyMonIndex\n\ + ldrb r0, [r0]\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bne _08077068\n\ + cmp r0, 0x2\n\ + bne _08077068\n\ + cmp r4, 0x3F\n\ + beq _0807707A\n\ + b _08077068\n\ + .align 2, 0\n\ +_08076FFC: .4byte gBattleAnimPlayerMonIndex\n\ +_08077000: .4byte gBattleAnimEnemyMonIndex\n\ +_08077004:\n\ + ldr r0, _0807702C @ =gBattleAnimPlayerMonIndex\n\ + ldrb r0, [r0]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08077042\n\ + ldr r0, _08077030 @ =gBattleAnimEnemyMonIndex\n\ + ldrb r0, [r0]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0807706E\n\ + lsls r0, r4, 24\n\ + asrs r1, r0, 24\n\ + cmp r1, 0x3F\n\ + bne _08077034\n\ + movs r4, 0xC0\n\ + b _0807706E\n\ + .align 2, 0\n\ +_0807702C: .4byte gBattleAnimPlayerMonIndex\n\ +_08077030: .4byte gBattleAnimEnemyMonIndex\n\ +_08077034:\n\ + movs r0, 0x40\n\ + negs r0, r0\n\ + cmp r1, r0\n\ + beq _0807706E\n\ + negs r0, r1\n\ + lsls r0, 24\n\ + b _0807706C\n\ +_08077042:\n\ + ldr r0, _08077064 @ =gBattleAnimEnemyMonIndex\n\ + ldrb r0, [r0]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _08077068\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + movs r1, 0x40\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + bne _0807706E\n\ + movs r4, 0x3F\n\ + b _0807706E\n\ + .align 2, 0\n\ +_08077064: .4byte gBattleAnimEnemyMonIndex\n\ +_08077068:\n\ + lsls r0, r4, 24\n\ + negs r0, r0\n\ +_0807706C:\n\ + lsrs r4, r0, 24\n\ +_0807706E:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3F\n\ + ble _0807707A\n\ + movs r4, 0x3F\n\ + b _08077088\n\ +_0807707A:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + movs r1, 0x40\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + bge _08077088\n\ + movs r4, 0xC0\n\ +_08077088:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} + +s8 sub_8077094(s8 a) +{ + if (!IsContest() && (EWRAM_17810[gBattleAnimPlayerMonIndex].unk0 & 0x10)) + { + if (GetBankSide(gBattleAnimPlayerMonIndex) != 0) + a = 0x3F; + else + a = 0xC0; + } + else + { + if (GetBankSide(gBattleAnimPlayerMonIndex) != 0 || IsContest() != 0) + a = -a; + } + return a; +} + +s16 sub_8077104(s16 a) +{ + s16 var = a; + + if (var > 63) + var = 63; + else if (var < -64) + var = -64; + return var; +} + +s16 sub_807712C(s16 a, s16 b, s16 c) +{ + u16 var; + + if (a < b) + var = ((c < 0) ? -c : c); + else if (a > b) + var = -((c < 0) ? -c : c); + else + var = 0; + return var; +} + +static void ScriptCmd_panse_19(void) +{ + u16 r4; + s8 r0; + + gBattleAnimScriptPtr++; + r4 = SCRIPT_READ_16(gBattleAnimScriptPtr); + r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); + PlaySE12WithPanning(r4, sub_8076F98(r0)); + gBattleAnimScriptPtr += 3; +} + +static void ScriptCmd_setpan(void) +{ + s8 r0; + + gBattleAnimScriptPtr++; + r0 = SCRIPT_READ_8(gBattleAnimScriptPtr); + SE12PanpotControl(sub_8076F98(r0)); + gBattleAnimScriptPtr++; +} + +static void ScriptCmd_panse_1B(void) +{ + u16 songNum; + s8 r0; + s8 r4; + s8 r6; + u8 r7; + s8 panning; + s8 r8; + u8 taskId; + + gBattleAnimScriptPtr++; + songNum = SCRIPT_READ_16(gBattleAnimScriptPtr); + r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); + r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); + r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4); + r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5); + panning = sub_8076F98(r0); + r8 = sub_8076F98(r4); + r4 = sub_807712C(panning, r8, r6); + taskId = CreateTask(c3_08073CEC, 1); + gTasks[taskId].data[0] = panning; + gTasks[taskId].data[1] = r8; + gTasks[taskId].data[2] = r4; + gTasks[taskId].data[3] = r7; + gTasks[taskId].data[4] = panning; + PlaySE12WithPanning(songNum, panning); + gAnimSoundTaskCount++; + gBattleAnimScriptPtr += 6; +} + +#ifdef NONMATCHING +static void c3_08073CEC(u8 taskId) +{ + u16 r7 = 0; + s16 r0; + s16 r6; + s16 r3; + s16 r4; + int foo; + + r0 = gTasks[taskId].data[8]; + gTasks[taskId].data[8]++; + if (r0 >= gTasks[taskId].data[3]) + { + gTasks[taskId].data[8] = r7; + r6 = gTasks[taskId].data[0]; + r3 = gTasks[taskId].data[1]; + foo = gTasks[taskId].data[4] + gTasks[taskId].data[2]; + r4 = foo; + gTasks[taskId].data[4] = r4; + if (gTasks[taskId].data[2] == 0) + { + r4 = r3; + DestroyTask(taskId); + gAnimSoundTaskCount--; + } + //_080772D8 + else + { + if (r6 < r3) + { + if (r4 < r3) + goto check; + DestroyTask(taskId); + gAnimSoundTaskCount--; + } + else + { + if (r4 <= r3) + r7 = 1; + check: + if (r7 != 0) + { + DestroyTask(taskId); + gAnimSoundTaskCount--; + } + } + } + //_080772F8 + SE12PanpotControl(r4); + } + //_08077314 +} +#else +__attribute__((naked)) +static void c3_08073CEC(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + movs r7, 0\n\ + ldr r1, _080772D4 @ =gTasks\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r2, r0, r1\n\ + ldrh r0, [r2, 0x18]\n\ + adds r1, r0, 0x1\n\ + strh r1, [r2, 0x18]\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + movs r3, 0xE\n\ + ldrsh r1, [r2, r3]\n\ + cmp r0, r1\n\ + blt _08077314\n\ + strh r7, [r2, 0x18]\n\ + ldrh r6, [r2, 0x8]\n\ + ldrh r3, [r2, 0xA]\n\ + movs r4, 0x10\n\ + ldrsh r0, [r2, r4]\n\ + movs r4, 0xC\n\ + ldrsh r1, [r2, r4]\n\ + adds r0, r1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + strh r4, [r2, 0x10]\n\ + cmp r1, 0\n\ + bne _080772D8\n\ + lsls r2, r3, 16\n\ + b _080772FC\n\ + .align 2, 0\n\ +_080772D4: .4byte gTasks\n\ +_080772D8:\n\ + lsls r1, r6, 16\n\ + lsls r0, r3, 16\n\ + asrs r3, r0, 16\n\ + adds r2, r0, 0\n\ + cmp r1, r2\n\ + bge _080772EE\n\ + lsls r0, r4, 16\n\ + asrs r0, 16\n\ + cmp r0, r3\n\ + blt _080772F8\n\ + b _080772FC\n\ +_080772EE:\n\ + lsls r0, r4, 16\n\ + asrs r0, 16\n\ + cmp r0, r3\n\ + bgt _080772F8\n\ + movs r7, 0x1\n\ +_080772F8:\n\ + cmp r7, 0\n\ + beq _0807730C\n\ +_080772FC:\n\ + lsrs r4, r2, 16\n\ + adds r0, r5, 0\n\ + bl DestroyTask\n\ + ldr r1, _0807731C @ =gAnimSoundTaskCount\n\ + ldrb r0, [r1]\n\ + subs r0, 0x1\n\ + strb r0, [r1]\n\ +_0807730C:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + bl SE12PanpotControl\n\ +_08077314:\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0807731C: .4byte gAnimSoundTaskCount\n\ + .syntax divided\n"); +} +#endif + +static void ScriptCmd_panse_26(void) +{ + u16 r8; + s8 r4; + s8 r5; + s8 r6; + u8 r10; + u8 taskId; + + gBattleAnimScriptPtr++; + r8 = SCRIPT_READ_16(gBattleAnimScriptPtr); + r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); + r5 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); + r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4); + r10 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5); + taskId = CreateTask(c3_08073CEC, 1); + gTasks[taskId].data[0] = r4; + gTasks[taskId].data[1] = r5; + gTasks[taskId].data[2] = r6; + gTasks[taskId].data[3] = r10; + gTasks[taskId].data[4] = r4; + PlaySE12WithPanning(r8, r4); + gAnimSoundTaskCount++; + gBattleAnimScriptPtr += 6; +} + +static void ScriptCmd_panse_27(void) +{ + u16 r9; + u8 r4; + u8 r8; + u8 r7; + u8 r0; + s8 r6; + s8 r5; + s8 r4_2; + u8 taskId; + + gBattleAnimScriptPtr++; + r9 = SCRIPT_READ_16(gBattleAnimScriptPtr); + r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); + r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); + r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4); + r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5); + r6 = sub_8077094(r0); + r5 = sub_8077094(r4); + r4_2 = sub_8077094(r8); + taskId = CreateTask(c3_08073CEC, 1); + gTasks[taskId].data[0] = r6; + gTasks[taskId].data[1] = r5; + gTasks[taskId].data[2] = r4_2; + gTasks[taskId].data[3] = r7; + gTasks[taskId].data[4] = r6; + PlaySE12WithPanning(r9, r6); + gAnimSoundTaskCount++; + gBattleAnimScriptPtr += 6; +} + +static void ScriptCmd_panse_1C(void) +{ + u16 r5; + u8 r0; + u8 r8; + u8 r9; + s8 r4; + u8 taskId; + + gBattleAnimScriptPtr++; + r5 = SCRIPT_READ_16(gBattleAnimScriptPtr); + r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); + r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); + r9 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4); + r4 = sub_8076F98(r0); + taskId = CreateTask(sub_80774FC, 1); + gTasks[taskId].data[0] = r5; + gTasks[taskId].data[1] = r4; + gTasks[taskId].data[2] = r8; + gTasks[taskId].data[3] = r9; + gTasks[taskId].data[8] = r8; + gTasks[taskId].func(taskId); + gAnimSoundTaskCount++; + gBattleAnimScriptPtr += 5; +} + +static void sub_80774FC(u8 taskId) +{ + s16 data8; + u16 r0; + s8 r1; + u8 r4; + + data8 = gTasks[taskId].data[8]; + gTasks[taskId].data[8]++; + if (data8 >= gTasks[taskId].data[2]) + { + gTasks[taskId].data[8] = 0; + r0 = gTasks[taskId].data[0]; + r1 = gTasks[taskId].data[1]; + gTasks[taskId].data[3]--; + r4 = gTasks[taskId].data[3]; + PlaySE12WithPanning(r0, r1); + if (r4 == 0) + { + DestroyTask(taskId); + gAnimSoundTaskCount--; + } + } +} + +static void ScriptCmd_panse_1D(void) +{ + u16 r5; + u8 r0; + u8 r8; + s8 r4; + u8 taskId; + + gBattleAnimScriptPtr++; + r5 = SCRIPT_READ_16(gBattleAnimScriptPtr); + r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); + r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); + r4 = sub_8076F98(r0); + taskId = CreateTask(sub_80775CC, 1); + gTasks[taskId].data[0] = r5; + gTasks[taskId].data[1] = r4; + gTasks[taskId].data[2] = r8; + gAnimSoundTaskCount++; + gBattleAnimScriptPtr += 4; +} + +static void sub_80775CC(u8 taskId) +{ + s16 r0; + + r0 = gTasks[taskId].data[2]; + gTasks[taskId].data[2]--; + if (r0 <= 0) + { + PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[1]); + DestroyTask(taskId); + gAnimSoundTaskCount--; + } +} + +static void ScriptCmd_createtask_1F(void) +{ + TaskFunc func; + u8 numArgs; + int i; + u8 taskId; + + gBattleAnimScriptPtr++; + func = (TaskFunc)SCRIPT_READ_32(gBattleAnimScriptPtr); + gBattleAnimScriptPtr += 4; + numArgs = SCRIPT_READ_8(gBattleAnimScriptPtr); + gBattleAnimScriptPtr++; + for (i = 0; i < numArgs; i++) + { + gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimScriptPtr += 2; + } + taskId = CreateTask(func, 1); + func(taskId); + gAnimSoundTaskCount++; +} + +static void ScriptCmd_waitsound(void) +{ + if (gAnimSoundTaskCount != 0) + { + gSoundAnimFramesToWait = 0; + gAnimFramesToWait = 1; + } + else if (IsSEPlaying()) + { + if (++gSoundAnimFramesToWait > 90) + { + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + gSoundAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait = 1; + } + } + else + { + gSoundAnimFramesToWait = 0; + gBattleAnimScriptPtr++; + gAnimFramesToWait = 0; + } +} + +static void ScriptCmd_jumpvareq(void) +{ + u8 r2; + s16 r1; + u8 *addr; + + gBattleAnimScriptPtr++; + r2 = SCRIPT_READ_8(gBattleAnimScriptPtr); + r1 = SCRIPT_READ_16(gBattleAnimScriptPtr + 1); + if (r1 == gBattleAnimArgs[r2]) + { + addr = (u8 *)SCRIPT_READ_32(gBattleAnimScriptPtr + 3); + gBattleAnimScriptPtr = addr; + } + else + { + gBattleAnimScriptPtr += 7; + } +} + +static void ScriptCmd_jumpunkcond(void) +{ + u8 *addr; + + gBattleAnimScriptPtr++; + if (IsContest()) + { + addr = (u8 *)SCRIPT_READ_32(gBattleAnimScriptPtr); + gBattleAnimScriptPtr = addr; + } + else + { + gBattleAnimScriptPtr += 4; + } +} + +static void ScriptCmd_monbgprio_28(void) +{ + u8 r2; + u8 r0; + u8 r4; + + r2 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); + gBattleAnimScriptPtr += 2; + if (r2 != 0) + r0 = gBattleAnimEnemyMonIndex; + else + r0 = gBattleAnimPlayerMonIndex; + r4 = GetBankIdentity(r0); + if (!IsContest() && (r4 == 0 || r4 == 3)) + { + REG_BG1CNT_BITFIELD.priority = 1; + REG_BG2CNT_BITFIELD.priority = 2; + } +} + +static void ScriptCmd_monbgprio_29(void) +{ + gBattleAnimScriptPtr++; + if (!IsContest()) + { + REG_BG1CNT_BITFIELD.priority = 1; + REG_BG2CNT_BITFIELD.priority = 2; + } +} + +static void ScriptCmd_monbgprio_2A(void) +{ + u8 r6; + u8 r4; + u8 r0; + + r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); + gBattleAnimScriptPtr += 2; + if (GetBankSide(gBattleAnimPlayerMonIndex) != GetBankSide(gBattleAnimEnemyMonIndex)) + { + if (r6 != 0) + r0 = gBattleAnimEnemyMonIndex; + else + r0 = gBattleAnimPlayerMonIndex; + r4 = GetBankIdentity(r0); + if (!IsContest() && (r4 == 0 || r4 == 3)) + { + REG_BG1CNT_BITFIELD.priority = 1; + REG_BG2CNT_BITFIELD.priority = 2; + } + } +} + +static void ScriptCmd_invisible(void) +{ + u8 r0; + u8 spriteId; + + r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); + spriteId = obj_id_for_side_relative_to_move(r0); + if (spriteId != 0xFF) + { + gSprites[spriteId].invisible = TRUE; + } + gBattleAnimScriptPtr += 2; +} + +static void ScriptCmd_visible(void) +{ + u8 r0; + u8 spriteId; + + r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); + spriteId = obj_id_for_side_relative_to_move(r0); + if (spriteId != 0xFF) + { + gSprites[spriteId].invisible = FALSE; + } + gBattleAnimScriptPtr += 2; +} + +static void ScriptCmd_doublebattle_2D(void) +{ + u8 r7; + u8 r4; + u8 spriteId; + + r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); + gBattleAnimScriptPtr += 2; + if (!IsContest() && IsDoubleBattle() + && GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex)) + { + if (r7 == 0) + { + r4 = GetBankIdentity_permutated(gBattleAnimPlayerMonIndex); + spriteId = obj_id_for_side_relative_to_move(0); + } + else + { + r4 = GetBankIdentity_permutated(gBattleAnimEnemyMonIndex); + spriteId = obj_id_for_side_relative_to_move(1); + } + if (spriteId != 0xFF) + { + gSprites[spriteId].invisible = FALSE; + if (r4 == 2) + gSprites[spriteId].oam.priority = 3; + if (r4 == 1) + sub_8076464(0); + else + sub_8076464(1); + } + } +} + +static void ScriptCmd_doublebattle_2E(void) +{ + u8 r7; + u8 r4; + u8 spriteId; + + r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); + gBattleAnimScriptPtr += 2; + if (!IsContest() && IsDoubleBattle() + && GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex)) + { + if (r7 == 0) + { + r4 = GetBankIdentity_permutated(gBattleAnimPlayerMonIndex); + spriteId = obj_id_for_side_relative_to_move(0); + } + else + { + r4 = GetBankIdentity_permutated(gBattleAnimEnemyMonIndex); + spriteId = obj_id_for_side_relative_to_move(1); + } + if (spriteId != 0xFF && r4 == 2) + { + gSprites[spriteId].oam.priority = 2; + } + } +} + +static void ScriptCmd_stopsound(void) +{ + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + gBattleAnimScriptPtr++; +} diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c new file mode 100644 index 000000000..31984977f --- /dev/null +++ b/src/battle/battle_anim_80A7E7C.c @@ -0,0 +1,940 @@ +#include "global.h" +#include "battle_anim.h" +#include "rom_8077ABC.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" + +#define SPRITE gSprites[TASK.data[0]] + +extern s16 gBattleAnimArgs[8]; + +extern u8 gObjectBankIDs[]; +extern s32 gMoveDmgMoveAnim; +extern u16 gMovePowerMoveAnim; +extern u8 gBattleAnimPlayerMonIndex; +extern u8 gBattleAnimEnemyMonIndex; + +static void sub_80A7EF0(u8 taskId); +static void sub_80A808C(u8 taskId); +static void sub_80A81D8(u8 taskId); +static void sub_80A8374(u8 taskId); +static void sub_80A8488(u8 taskId); +static void sub_80A85A4(struct Sprite *sprite); +void sub_80A8614(struct Sprite* sprite); +static void sub_80A86F4(struct Sprite *sprite); +static void sub_80A88F0(struct Sprite *sprite); +static void sub_80A89B4(u8 taskId); +static void sub_80A8A18(u8 taskId); +static void sub_80A8C0C(u8 taskId); +static void sub_80A8D8C(u8 taskId); +void sub_80A8FD8(u8 taskId); +static void sub_80A913C(u8 taskId); + +void sub_80A7E7C(u8 taskId) +{ + u8 sprite; + sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + if (sprite == 0xff) + { + DestroyAnimVisualTask(taskId); + return; + } + gSprites[sprite].pos2.x = gBattleAnimArgs[1]; + gSprites[sprite].pos2.y = gBattleAnimArgs[2]; + TASK.data[0] = sprite; + TASK.data[1] = gBattleAnimArgs[3]; + TASK.data[2] = gBattleAnimArgs[4]; + TASK.data[3] = gBattleAnimArgs[4]; + TASK.data[4] = gBattleAnimArgs[1]; + TASK.data[5] = gBattleAnimArgs[2]; + TASK.func = sub_80A7EF0; + sub_80A7EF0(taskId); +} + +static void sub_80A7EF0(u8 taskId) +{ + if (TASK.data[3] == 0) + { + if (SPRITE.pos2.x == 0) + { + SPRITE.pos2.x = TASK.data[4]; + } + else + { + SPRITE.pos2.x = 0; + } + if (SPRITE.pos2.y == 0) + { + SPRITE.pos2.y = TASK.data[5]; + } + else + { + SPRITE.pos2.y = 0; + } + TASK.data[3] = TASK.data[2]; + if (--TASK.data[1] == 0) + { + SPRITE.pos2.x = 0; + SPRITE.pos2.y = 0; + DestroyAnimVisualTask(taskId); + return; + } + } + else + { + TASK.data[3]--; + } +} + + +void sub_80A7FA0(u8 taskId) +{ + u8 sprite; + bool8 r6; + u8 side; + r6 = 0; + if (gBattleAnimArgs[0] < 4) + { + sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + if (sprite == 0xff) + { + DestroyAnimVisualTask(taskId); + return; + } + } + else if (gBattleAnimArgs[0] != 8) + { + switch (gBattleAnimArgs[0]) + { + case 4: + side = GetBankByPlayerAI(0); + break; + case 5: + side = GetBankByPlayerAI(2); + break; + case 6: + side = GetBankByPlayerAI(1); + break; + case 7: + default: + side = GetBankByPlayerAI(3); + break; + } + if (b_side_obj__get_some_boolean(side) == FALSE) + { + r6 = 1; + } + sprite = gObjectBankIDs[side]; + } + else + { + sprite = gObjectBankIDs[gBattleAnimPlayerMonIndex]; + } + if (r6) + { + DestroyAnimVisualTask(taskId); + return; + } + gSprites[sprite].pos2.x = gBattleAnimArgs[1]; + gSprites[sprite].pos2.y = gBattleAnimArgs[2]; + TASK.data[0] = sprite; + TASK.data[1] = gBattleAnimArgs[3]; + TASK.data[2] = gBattleAnimArgs[4]; + TASK.data[3] = gBattleAnimArgs[4]; + TASK.data[4] = gBattleAnimArgs[1]; + TASK.data[5] = gBattleAnimArgs[2]; + TASK.func = sub_80A808C; + sub_80A808C(taskId); +} + +static void sub_80A808C(u8 taskId) +{ + if (TASK.data[3] == 0) + { + if (SPRITE.pos2.x == TASK.data[4]) + { + SPRITE.pos2.x = -TASK.data[4]; + } + else + { + SPRITE.pos2.x = TASK.data[4]; + } + if (SPRITE.pos2.y == TASK.data[5]) + { + SPRITE.pos2.y = -TASK.data[5]; + } + else + { + SPRITE.pos2.y = TASK.data[5]; + } + TASK.data[3] = TASK.data[2]; + if (--TASK.data[1] == 0) + { + SPRITE.pos2.x = 0; + SPRITE.pos2.y = 0; + DestroyAnimVisualTask(taskId); + return; + } + } + else + { + TASK.data[3]--; + } +} + +void sub_80A8154(u8 taskId) +{ + u8 sprite; + sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + if (sprite == 0xff) + { + DestroyAnimVisualTask(taskId); + return; + } + gSprites[sprite].pos2.x += gBattleAnimArgs[1]; + gSprites[sprite].pos2.y += gBattleAnimArgs[2]; + TASK.data[0] = sprite; + TASK.data[1] = 0; + TASK.data[2] = gBattleAnimArgs[3]; + TASK.data[3] = 0; + TASK.data[4] = gBattleAnimArgs[4]; + TASK.data[5] = gBattleAnimArgs[1] * 2; + TASK.data[6] = gBattleAnimArgs[2] * 2; + TASK.func = sub_80A81D8; + sub_80A81D8(taskId); +} + +static void sub_80A81D8(u8 taskId) +{ + if (TASK.data[3] == 0) + { + if (TASK.data[1] & 1) + { + SPRITE.pos2.x += TASK.data[5]; + SPRITE.pos2.y += TASK.data[6]; + } + else + { + SPRITE.pos2.x -= TASK.data[5]; + SPRITE.pos2.y -= TASK.data[6]; + } + TASK.data[3] = TASK.data[4]; + if (++TASK.data[1] >= TASK.data[2]) + { + if (TASK.data[1] & 1) + { + SPRITE.pos2.x += TASK.data[5] / 2; + SPRITE.pos2.y += TASK.data[6] / 2; + } + else + { + SPRITE.pos2.x -= TASK.data[5] / 2; + SPRITE.pos2.y -= TASK.data[6] / 2; + } + DestroyAnimVisualTask(taskId); + return; + } + } + else + { + TASK.data[3]--; + } +} + +void sub_80A8314(u8 taskId) +{ + u8 sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + gSprites[sprite].pos2.x = gBattleAnimArgs[1]; + TASK.data[0] = sprite; + TASK.data[1] = gBattleAnimArgs[1]; + TASK.data[2] = gBattleAnimArgs[2]; + TASK.data[3] = gBattleAnimArgs[3]; + TASK.data[4] = gBattleAnimArgs[4]; + TASK.func = sub_80A8374; + sub_80A8374(taskId); +} + +static void sub_80A8374(u8 taskId) +{ + s16 x; + u8 sprite; + sprite = TASK.data[0]; + x = TASK.data[1]; + if (TASK.data[2] == TASK.data[8]++) + { + TASK.data[8] = 0; + if (gSprites[sprite].pos2.x == x) + { + x = -x; + } + gSprites[sprite].pos2.x += x; + } + TASK.data[1] = x; + TASK.data[9] += TASK.data[3]; + gSprites[sprite].pos2.y = TASK.data[9] >> 8; + if (--TASK.data[4] == 0) + { + DestroyAnimVisualTask(taskId); + return; + } +} + +void sub_80A8408(u8 taskId) +{ + u8 i; + u8 sprite; + u8 v1; + v1 = 1; + sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + if (gBattleAnimArgs[4] > 5) + { + gBattleAnimArgs[4] = 5; + } + for (i = 0; i < gBattleAnimArgs[4]; i++) + { + v1 <<= 1; + } + TASK.data[0] = sprite; + TASK.data[1] = gBattleAnimArgs[1]; + TASK.data[2] = gBattleAnimArgs[2]; + TASK.data[3] = gBattleAnimArgs[3]; + TASK.data[4] = v1; + TASK.func = sub_80A8488; + sub_80A8488(taskId); +} + +static void sub_80A8488(u8 taskId) +{ + u8 sprite; + sprite = TASK.data[0]; + gSprites[sprite].pos2.x = Sin(TASK.data[5], TASK.data[1]); + gSprites[sprite].pos2.y = -Cos(TASK.data[5], TASK.data[2]); + gSprites[sprite].pos2.y += TASK.data[2]; + TASK.data[5] += TASK.data[4]; + TASK.data[5] &= 0xff; + if (TASK.data[5] == 0) + { + TASK.data[3]--; + } + if (TASK.data[3] == 0) + { + gSprites[sprite].pos2.x = 0; + gSprites[sprite].pos2.y = 0; + DestroyAnimVisualTask(taskId); + return; + } +} + +void sub_80A8500(u8 taskId) +{ + if (GetBankSide(gBattleAnimPlayerMonIndex)) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + } + sub_80A8408(taskId); +} + +void sub_80A8530(struct Sprite *sprite) +{ + sprite->invisible = TRUE; + if (GetBankSide(gBattleAnimPlayerMonIndex)) + { + sprite->data1 = -gBattleAnimArgs[1]; + } + else + { + sprite->data1 = gBattleAnimArgs[1]; + } + sprite->data0 = gBattleAnimArgs[0]; + sprite->data2 = 0; + sprite->data3 = gObjectBankIDs[gBattleAnimPlayerMonIndex]; + sprite->data4 = gBattleAnimArgs[0]; + oamt_set_x3A_32(sprite, sub_80A85A4); + sprite->callback = sub_8078458; +} + +static void sub_80A85A4(struct Sprite *sprite) +{ + sprite->data0 = sprite->data4; + sprite->data1 = -sprite->data1; + sprite->callback = sub_8078458; + oamt_set_x3A_32(sprite, move_anim_8072740); +} + +void sub_80A85C8(struct Sprite *sprite) +{ + u8 spriteId; + sprite->invisible = TRUE; + spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]); + sprite->data0 = gBattleAnimArgs[0]; + sprite->data1 = 0; + sprite->data2 = gBattleAnimArgs[1]; + sprite->data3 = spriteId; + sprite->data4 = gBattleAnimArgs[0]; + oamt_set_x3A_32(sprite, sub_80A8614); + sprite->callback = sub_8078458; +} + +void sub_80A8614(struct Sprite *sprite) +{ + sprite->data0 = sprite->data4; + sprite->data2 = -sprite->data2; + sprite->callback = sub_8078458; + oamt_set_x3A_32(sprite, move_anim_8072740); +} + +void sub_80A8638(struct Sprite *sprite) +{ + int something; + int spriteId; + if (!gBattleAnimArgs[0]) + { + spriteId = gObjectBankIDs[gBattleAnimPlayerMonIndex]; + } + else + { + spriteId = gObjectBankIDs[gBattleAnimEnemyMonIndex]; + } + sprite->data0 = gBattleAnimArgs[2]; + sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; + sprite->data2 = gSprites[spriteId].pos1.x; + sprite->data3 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; + sprite->data4 = gSprites[spriteId].pos1.y; + something = 0; + sub_8078A5C(sprite); + sprite->data3 = something; + sprite->data4 = something; + sprite->data5 = gSprites[spriteId].pos2.x; + sprite->data6 = gSprites[spriteId].pos2.y; + sprite->invisible = TRUE; + if (gBattleAnimArgs[1] == 1) + { + sprite->data2 = something; + } + else if (gBattleAnimArgs[1] == 2) + { + sprite->data1 = something; + } + sprite->data7 = gBattleAnimArgs[1]; + sprite->data7 |= spriteId << 8; + sprite->callback = sub_80A86F4; +} + +static void sub_80A86F4(struct Sprite *sprite) +{ + s8 spriteId; + u8 lo; + struct Sprite *sprite2; + lo = sprite->data7 & 0xff; + spriteId = sprite->data7 >> 8; + sprite2 = &gSprites[spriteId]; + if (sprite->data0 == 0) + { + if (lo < 2) + { + sprite2->pos2.x = 0; + } + if (lo == 2 || lo == 0) + { + sprite2->pos2.y = 0; + } + move_anim_8072740(sprite); + } + else + { + sprite->data0--; + sprite->data3 += sprite->data1; + sprite->data4 += sprite->data2; + sprite2->pos2.x = (s8)(sprite->data3 >> 8) + sprite->data5; + sprite2->pos2.y = (s8)(sprite->data4 >> 8) + sprite->data6; + } +} + +void sub_80A8764(struct Sprite *sprite) +{ + u8 v1; + u8 spriteId; + if (!gBattleAnimArgs[0]) + { + v1 = gBattleAnimPlayerMonIndex; + } + else + { + v1 = gBattleAnimEnemyMonIndex; + } + spriteId = gObjectBankIDs[v1]; + if (GetBankSide(v1)) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + if (gBattleAnimArgs[3] == 1) + { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + } + sprite->data0 = gBattleAnimArgs[4]; + sprite->data1 = gSprites[spriteId].pos1.x; + sprite->data2 = gSprites[spriteId].pos1.x + gBattleAnimArgs[1]; + sprite->data3 = gSprites[spriteId].pos1.y; + sprite->data4 = gSprites[spriteId].pos1.y + gBattleAnimArgs[2]; + sub_8078A5C(sprite); + sprite->data3 = 0; + sprite->data4 = 0; + sprite->data5 = spriteId; + sprite->invisible = TRUE; + oamt_set_x3A_32(sprite, move_anim_8072740); + sprite->callback = sub_80784A8; +} + +void sub_80A8818(struct Sprite *sprite) +{ + u8 spriteId; + u8 v1; + sprite->invisible = TRUE; + if (!gBattleAnimArgs[0]) + { + v1 = gBattleAnimPlayerMonIndex; + } + else + { + v1 = gBattleAnimEnemyMonIndex; + } + spriteId = gObjectBankIDs[v1]; + if (GetBankSide(v1)) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + if (gBattleAnimArgs[3] == 1) + { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + } + sprite->data0 = gBattleAnimArgs[4]; + sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; + sprite->data2 = sprite->data1 + gBattleAnimArgs[1]; + sprite->data3 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; + sprite->data4 = sprite->data3 + gBattleAnimArgs[2]; + sub_8078A5C(sprite); + sprite->data3 = gSprites[spriteId].pos2.x << 8; + sprite->data4 = gSprites[spriteId].pos2.y << 8; + sprite->data5 = spriteId; + sprite->data6 = gBattleAnimArgs[5]; + if (!gBattleAnimArgs[5]) + { + oamt_set_x3A_32(sprite, move_anim_8072740); + } + else + { + oamt_set_x3A_32(sprite, sub_80A88F0); + } + sprite->callback = sub_80784A8; +} + + +static void sub_80A88F0(struct Sprite *sprite) +{ + gSprites[sprite->data5].pos2.x = 0; + gSprites[sprite->data5].pos2.y = 0; + move_anim_8072740(sprite); +} + +void sub_80A8920(u8 taskId) +{ + s16 r7; + r7 = 0x8000 / gBattleAnimArgs[3]; + if (GetBankSide(gBattleAnimPlayerMonIndex)) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[5] = -gBattleAnimArgs[5]; + } + TASK.data[0] = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + TASK.data[1] = (gBattleAnimArgs[1] << 8) / gBattleAnimArgs[3]; + TASK.data[2] = gBattleAnimArgs[2]; + TASK.data[3] = gBattleAnimArgs[3]; + TASK.data[4] = gBattleAnimArgs[4]; + TASK.data[5] = (gBattleAnimArgs[5] << 8) / gBattleAnimArgs[6]; + TASK.data[6] = gBattleAnimArgs[6]; + TASK.data[7] = r7; + TASK.func = sub_80A89B4; +} + +static void sub_80A89B4(u8 taskId) +{ + u8 spriteId; + spriteId = TASK.data[0]; + TASK.data[11] += TASK.data[1]; + gSprites[spriteId].pos2.x = TASK.data[11] >> 8; + gSprites[spriteId].pos2.y = Sin((u8)(TASK.data[10] >> 8), TASK.data[2]); + TASK.data[10] += TASK.data[7]; + if (--TASK.data[3] == 0) + { + TASK.func = sub_80A8A18; + } +} + +static void sub_80A8A18(u8 taskId) +{ + u8 spriteId; + if (TASK.data[4] > 0) + { + TASK.data[4]--; + } + else + { + spriteId = TASK.data[0]; + TASK.data[12] += TASK.data[5]; + gSprites[spriteId].pos2.x = (TASK.data[12] >> 8) + (TASK.data[11] >> 8); + if (--TASK.data[6] == 0) + { + DestroyAnimVisualTask(taskId); + return; + } + } +} + +static void sub_80A8B3C(u8 taskId); + +void sub_80A8A80(u8 taskId) +{ + u8 spriteId; + switch (gBattleAnimArgs[0]) + { + case 0: + case 1: + spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + break; + case 2: + if (!b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) + { + DestroyAnimVisualTask(taskId); + return; + } + spriteId = gObjectBankIDs[gBattleAnimPlayerMonIndex ^ 2]; + break; + case 3: + if (!b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) + { + DestroyAnimVisualTask(taskId); + return; + } + spriteId = gObjectBankIDs[gBattleAnimEnemyMonIndex ^ 2]; + break; + default: + DestroyAnimVisualTask(taskId); + return; + } + TASK.data[0] = spriteId; + if (GetBankSide(gBattleAnimEnemyMonIndex)) + { + TASK.data[1] = gBattleAnimArgs[1]; + } + else + { + TASK.data[1] = -gBattleAnimArgs[1]; + } + TASK.func = sub_80A8B3C; +} + +static void sub_80A8B3C(u8 taskId) +{ + u8 spriteId = TASK.data[0]; + gSprites[spriteId].pos2.x += TASK.data[1]; + if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x + 0x20 > 0x130u) + { + DestroyAnimVisualTask(taskId); + return; + } +} + +void sub_80A8B88(u8 taskId) +{ + u8 spriteId; + if (GetBankSide(gBattleAnimPlayerMonIndex)) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + } + spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[4]); + TASK.data[0] = gBattleAnimArgs[0]; + TASK.data[1] = gBattleAnimArgs[1]; + TASK.data[2] = gBattleAnimArgs[2]; + TASK.data[3] = gBattleAnimArgs[3]; + TASK.data[4] = spriteId; + if (gBattleAnimArgs[4] == 0) + { + TASK.data[5] = gBattleAnimPlayerMonIndex; + } + else + { + TASK.data[5] = gBattleAnimEnemyMonIndex; + } + TASK.data[12] = 1; + TASK.func = sub_80A8C0C; +} + +static void sub_80A8C0C(u8 taskId) +{ + s16 y; + u8 spriteId; + int index; + u16 val; + spriteId = TASK.data[4]; + val = TASK.data[10] + TASK.data[2]; + TASK.data[10] = val; + index = val >> 8; + y = Sin(index, TASK.data[1]); + if (TASK.data[0] == 0) + { + gSprites[spriteId].pos2.x = y; + } + else + { + if (GetBankSide(TASK.data[5]) == 0) + { + gSprites[spriteId].pos2.y = (y >= 0) ? y : -y; + } + else + { + gSprites[spriteId].pos2.y = (y >= 0) ? -y : y; + } + } + if (((index >= 0x80u) && (TASK.data[11] == 0) && (TASK.data[12] == 1)) + || ((index < 0x7fu) && (TASK.data[11] == 1) && (TASK.data[12] == 0))) + { + TASK.data[11] ^= 1; + TASK.data[12] ^= 1; + if (--TASK.data[3] == 0) + { + gSprites[spriteId].pos2.x = 0; + gSprites[spriteId].pos2.y = 0; + DestroyAnimVisualTask(taskId); + return; + } + } +} + +void sub_80A8D34(u8 taskId) +{ + u8 spriteId; + spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[3]); + sub_8078E70(spriteId, gBattleAnimArgs[4]); + TASK.data[0] = gBattleAnimArgs[0]; + TASK.data[1] = gBattleAnimArgs[1]; + TASK.data[2] = gBattleAnimArgs[2]; + TASK.data[3] = gBattleAnimArgs[2]; + TASK.data[4] = spriteId; + TASK.data[10] = 0x100; + TASK.data[11] = 0x100; + TASK.func = sub_80A8D8C; +} + +static void sub_80A8D8C(u8 taskId) +{ + u8 spriteId; + TASK.data[10] += TASK.data[0]; + TASK.data[11] += TASK.data[1]; + spriteId = TASK.data[4]; + obj_id_set_rotscale(spriteId, TASK.data[10], TASK.data[11], 0); + if (--TASK.data[2] == 0) + { + if (TASK.data[3] > 0) + { + TASK.data[0] = -TASK.data[0]; + TASK.data[1] = -TASK.data[1]; + TASK.data[2] = TASK.data[3]; + TASK.data[3] = 0; + } + else + { + sub_8078F40(spriteId); + DestroyAnimVisualTask(taskId); + return; + } + } +} + +void sub_80A8E04(u8 taskId) +{ + u8 spriteId; + spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]); + sub_8078E70(spriteId, 0); + TASK.data[1] = 0; + TASK.data[2] = gBattleAnimArgs[0]; + if (gBattleAnimArgs[3] != 1) + { + TASK.data[3] = 0; + } + else + { + TASK.data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1]; + } + TASK.data[4] = gBattleAnimArgs[1]; + TASK.data[5] = spriteId; + TASK.data[6] = gBattleAnimArgs[3]; + if (IsContest()) + { + TASK.data[7] = 1; + } + else + { + if (gBattleAnimArgs[2] == 0) + { + TASK.data[7] = !GetBankSide(gBattleAnimPlayerMonIndex); + } + else + { + TASK.data[7] = !GetBankSide(gBattleAnimEnemyMonIndex); + } + } + if (TASK.data[7]) + { + if (!IsContest()) + { + TASK.data[3] *= -1; + TASK.data[4] *= -1; + } + } + TASK.func = sub_80A8FD8; +} + +void sub_80A8EFC(u8 taskId) +{ + u8 spriteId; + spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]); + sub_8078E70(spriteId, 0); + TASK.data[1] = 0; + TASK.data[2] = gBattleAnimArgs[0]; + if (gBattleAnimArgs[2] == 0) + { + if (GetBankSide(gBattleAnimPlayerMonIndex)) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + } + } + else + { + if (GetBankSide(gBattleAnimEnemyMonIndex)) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + } + } + if (gBattleAnimArgs[3] != 1) + { + TASK.data[3] = 0; + } + else + { + TASK.data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1]; + } + TASK.data[4] = gBattleAnimArgs[1]; + TASK.data[5] = spriteId; + TASK.data[6] = gBattleAnimArgs[3]; + TASK.data[7] = 1; + TASK.data[3] *= -1; + TASK.data[4] *= -1; + TASK.func = sub_80A8FD8; +} + +void sub_80A8FD8(u8 taskId) +{ + TASK.data[3] += TASK.data[4]; + obj_id_set_rotscale(TASK.data[5], 0x100, 0x100, TASK.data[3]); + if (TASK.data[7]) + { + sub_8078F9C(TASK.data[5]); + } + if (++TASK.data[1] >= TASK.data[2]) + { + switch (TASK.data[6]) + { + case 1: + sub_8078F40(TASK.data[5]); + case 0: + default: + DestroyAnimVisualTask(taskId); + return; + case 2: + TASK.data[1] = 0; + TASK.data[4] *= -1; + TASK.data[6] = 1; + break; + } + } +} + +void sub_80A9058(u8 taskId) +{ + if (!gBattleAnimArgs[0]) + { + TASK.data[15] = gMovePowerMoveAnim / 12; + if (TASK.data[15] < 1) + { + TASK.data[15] = 1; + } + if (TASK.data[15] > 16) + { + TASK.data[15] = 16; + } + } + else + { + TASK.data[15] = gMoveDmgMoveAnim / 12; + if (TASK.data[15] < 1) + { + TASK.data[15] = 1; + } + if (TASK.data[15] > 16) + { + TASK.data[15] = 16; + } + } + TASK.data[14] = TASK.data[15] / 2; + TASK.data[13] = TASK.data[14] + (TASK.data[15] & 1); + TASK.data[12] = 0; + TASK.data[10] = gBattleAnimArgs[3]; + TASK.data[11] = gBattleAnimArgs[4]; + TASK.data[7] = obj_id_for_side_relative_to_move(1); + TASK.data[8] = gSprites[TASK.data[7]].pos2.x; + TASK.data[9] = gSprites[TASK.data[7]].pos2.y; + TASK.data[0] = 0; + TASK.data[1] = gBattleAnimArgs[1]; + TASK.data[2] = gBattleAnimArgs[2]; + TASK.func = sub_80A913C; +} + +static void sub_80A913C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + if (++task->data[0] > task->data[1]) + { + task->data[0] = 0; + task->data[12] = (task->data[12] + 1) & 1; + if (task->data[10]) + { + if (task->data[12]) + { + gSprites[task->data[7]].pos2.x = task->data[8] + task->data[13]; + } + else + { + gSprites[task->data[7]].pos2.x = task->data[8] - task->data[14]; + } + } + if (task->data[11]) + { + if (task->data[12]) + { + gSprites[task->data[7]].pos2.y = task->data[15]; + } + else + { + gSprites[task->data[7]].pos2.y = 0; + } + } + if (!--task->data[2]) + { + gSprites[task->data[7]].pos2.x = 0; + gSprites[task->data[7]].pos2.y = 0; + DestroyAnimVisualTask(taskId); + return; + } + } +} diff --git a/src/battle/battle_anim_81258BC.c b/src/battle/battle_anim_81258BC.c new file mode 100644 index 000000000..5bdbb4946 --- /dev/null +++ b/src/battle/battle_anim_81258BC.c @@ -0,0 +1,50 @@ +#include "global.h" +#include "battle_anim_81258BC.h" +#include "battle.h" +#include "battle_message.h" +#include "menu_cursor.h" +#include "text.h" + +extern struct Window gUnknown_03004210; +extern u8 gDisplayedStringBattle[]; +extern u8 gActionSelectionCursor[]; + +extern const u8 gUnknown_08400CBB[]; +extern u8 gActiveBank; +extern const u8 gUnknown_08400D15[]; + +extern void *gBattleBankFunc[]; +extern u16 gUnknown_030042A0; +extern u16 gUnknown_030042A4; + +#if ENGLISH +#define SUB_812BB10_TILE_DATA_OFFSET 440 +#elif GERMAN +#define SUB_812BB10_TILE_DATA_OFFSET 444 +#endif + +void sub_812BB10(void) { + int i; + + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 160; + gUnknown_03004210.paletteNum = 0; + FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); + FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); + gBattleBankFunc[gActiveBank] = bx_battle_menu_t6_2; + + InitWindow(&gUnknown_03004210, gUnknown_08400D15, 400, 18, 35); + sub_8002F44(&gUnknown_03004210); + sub_814A5C0(0, 0xFFFF, 12, 11679, 0); + + for (i = 0; i < 4; i++) + { + nullsub_8(i); + } + + sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); + StrCpyDecodeToDisplayedStringBattle((u8 *) gUnknown_08400CBB); + + InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_812BB10_TILE_DATA_OFFSET, 2, 35); + sub_8002F44(&gUnknown_03004210); +} \ No newline at end of file diff --git a/src/battle/battle_anim_8137220.c b/src/battle/battle_anim_8137220.c new file mode 100644 index 000000000..bb181d5fb --- /dev/null +++ b/src/battle/battle_anim_8137220.c @@ -0,0 +1,1486 @@ +#include "global.h" +#include "battle.h" +#include "battle_interface.h" +#include "battle_message.h" +#include "data2.h" +#include "link.h" +#include "main.h" +#include "menu_cursor.h" +#include "palette.h" +#include "pokemon.h" +#include "rom3.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "item_use.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "util.h" + +//Possibly PokemonSubstruct1 +struct UnknownStruct3 +{ + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; +}; + +extern u8 gActiveBank; +extern void (*gBattleBankFunc[])(void); +extern u32 gBattleExecBuffer; +extern void (*gWallyBufferCommands[])(void); +extern u8 gBattleBufferA[][0x200]; +extern u8 gObjectBankIDs[]; +extern MainCallback gPreBattleCallback1; +extern bool8 gDoingBattleAnim; +extern u16 gBattlePartyID[]; +extern u8 gHealthboxIDs[]; +extern u16 gBattleTypeFlags; +extern u16 gMovePowerMoveAnim; +extern u32 gMoveDmgMoveAnim; +extern u8 gHappinessMoveAnim; +extern u16 gWeatherMoveAnim; +extern u32 *gDisableStructMoveAnim; +extern u32 gPID_perBank[]; +extern void (*gAnimScriptCallback)(void); +extern bool8 gAnimScriptActive; +extern u8 gDisplayedStringBattle[]; +extern u8 gBankInMenu; +extern u8 gBattleMonForms[]; +extern u8 gBattleOutcome; +extern u16 gUnknown_02024DE8; +extern u8 gUnknown_02024E68[]; +extern struct SpriteTemplate gUnknown_02024E8C; +extern u8 gUnknown_0202F7C4; +extern struct Window gUnknown_03004210; +extern u16 gUnknown_030042A0; +extern u16 gUnknown_030042A4; +extern u8 gUnknown_0300434C[]; +extern const u8 gUnknown_08400CCC[]; +extern const u8 gUnknown_08400CF3[]; + +// TODO: include rom3.h when my other PR gets merged +extern void dp01_build_cmdbuf_x21_a_bb(u8, u8, u16); +extern void dp01_build_cmdbuf_x23_aa_0(u8, u16); + +extern void nullsub_14(void); +extern void PrepareBagForWallyTutorial(void); +extern void sub_8141828(); +extern void sub_8045A5C(); +extern void sub_804777C(); +extern void sub_8043DFC(); +extern bool8 IsDoubleBattle(void); +extern void c3_0802FDF4(u8); +extern void sub_802ECF0(void); +extern void sub_8031AF4(); +extern u8 GetBankIdentity(u8); +extern void sub_80313A0(struct Sprite *); +extern u8 GetBankByPlayerAI(u8); +extern u8 sub_8031720(); +extern void ExecuteMoveAnim(); +extern void sub_80326EC(); +extern void sub_8031F24(void); +extern void sub_80324BC(); +extern void BufferStringBattle(); +extern u8 GetBankSide(u8); +extern void sub_80304A8(void); +extern void sub_8047858(); +extern void sub_80E43C0(); +extern void oamt_add_pos2_onto_pos1(); +extern void sub_8078B34(struct Sprite *); +extern void sub_8030E38(struct Sprite *); +extern void oamt_set_x3A_32(); +extern u8 sub_8046400(); +extern u8 sub_8077ABC(); +extern u8 sub_8077F68(); +extern u8 sub_8079E90(); +extern void sub_80312F0(struct Sprite *); +extern bool8 move_anim_start_t3(); + +void WallyBufferRunCommand(void); +void sub_81374FC(void); +void sub_81376B8(void); +void WallyBufferExecCompleted(void); +u32 sub_8137A84(u8, u8 *); +void sub_8138294(u8); +void sub_81390D0(void); +void sub_8139A2C(u8); + +void unref_sub_8137220(void) +{ +} + +void SetBankFuncToWallyBufferRunCommand(void) +{ + gBattleBankFunc[gActiveBank] = WallyBufferRunCommand; + ewram[0x160A8] = 0; + ewram[0x160A9] = 0; + ewram[0x160AA] = 0; + ewram[0x160AB] = 0; +} + +void WallyBufferRunCommand(void) +{ + if (gBattleExecBuffer & gBitTable[gActiveBank]) + { + if (gBattleBufferA[gActiveBank][0] < 0x39) + gWallyBufferCommands[gBattleBufferA[gActiveBank][0]](); + else + WallyBufferExecCompleted(); + } +} + +void sub_81372BC(void) +{ + u8 r4; + + switch (ewram[0x160A8]) + { + case 0: + ewram[0x160AA] = 64; + ewram[0x160A8]++; + // fall through + case 1: + r4 = --ewram[0x160AA]; + if (r4 == 0) + { + PlaySE(SE_SELECT); + dp01_build_cmdbuf_x21_a_bb(1, 0, 0); + WallyBufferExecCompleted(); + ewram[0x160A8]++; + ewram[0x160A9] = r4; + ewram[0x160AA] = 64; + } + break; + case 2: + r4 = --ewram[0x160AA]; + if (r4 == 0) + { + PlaySE(SE_SELECT); + dp01_build_cmdbuf_x21_a_bb(1, 0, 0); + WallyBufferExecCompleted(); + ewram[0x160A8]++; + ewram[0x160A9] = r4; + ewram[0x160AA] = 64; + } + break; + case 3: + r4 = --ewram[0x160AA]; + if (r4 == 0) + { + dp01_build_cmdbuf_x21_a_bb(1, 9, 0); + WallyBufferExecCompleted(); + ewram[0x160A8]++; + ewram[0x160A9] = r4; + ewram[0x160AA] = 64; + } + break; + case 4: + if (--ewram[0x160AA] == 0) + { + PlaySE(SE_SELECT); + nullsub_8(0); + sub_802E3E4(1, 0); + ewram[0x160AA] = 64; + ewram[0x160A8]++; + } + break; + case 5: + if (--ewram[0x160AA] == 0) + { + PlaySE(SE_SELECT); + DestroyMenuCursor(); + dp01_build_cmdbuf_x21_a_bb(1, 1, 0); + WallyBufferExecCompleted(); + } + break; + } +} + +void sub_813741C(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + WallyBufferExecCompleted(); +} + +void sub_8137454(void) +{ + if (gUnknown_03004210.state == 0) + WallyBufferExecCompleted(); +} + +void sub_813746C(void) +{ + if (!gPaletteFade.active) + { + gMain.inBattle = FALSE; + gMain.callback1 = gPreBattleCallback1; + SetMainCallback2(gMain.savedCallback); + } +} + +void bx_wait_t5(void) +{ + if (!gDoingBattleAnim) + WallyBufferExecCompleted(); +} + +void sub_81374C4(void) +{ + if (!gPaletteFade.active) + { + gBattleBankFunc[gActiveBank] = sub_81374FC; + nullsub_14(); + PrepareBagForWallyTutorial(); + } +} + +void sub_81374FC(void) +{ + if (gMain.callback2 == sub_800F808 + && !gPaletteFade.active) + { + dp01_build_cmdbuf_x23_aa_0(1, gScriptItemId); + WallyBufferExecCompleted(); + } +} + +void sub_8137538(void) +{ + if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank].unk0_7) + sub_8141828(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]); + + if (!ewram17810[gActiveBank ^ 2].unk0_3 && !ewram17810[gActiveBank ^ 2].unk0_7) + sub_8141828(gActiveBank ^ 2, &gPlayerParty[gBattlePartyID[gActiveBank ^ 2]]); + + if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank ^ 2].unk0_3) + { + if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank ^ 2]]); + sub_8045A5C(gHealthboxIDs[gActiveBank ^ 2], &gPlayerParty[gBattlePartyID[gActiveBank ^ 2]], 0); + sub_804777C(gActiveBank ^ 2); + sub_8043DFC(gHealthboxIDs[gActiveBank ^ 2]); + } + DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]); + sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 0); + sub_804777C(gActiveBank); + sub_8043DFC(gHealthboxIDs[gActiveBank]); + ewram17840.unk9_0 = 0; + gBattleBankFunc[gActiveBank] = sub_81376B8; + } +} + +void sub_81376B8(void) +{ + bool8 r4 = FALSE; + + if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy) + r4 = TRUE; + if (r4 && ewram17810[gActiveBank].unk1_0 && ewram17810[gActiveBank ^ 2].unk1_0) + { + ewram17810[gActiveBank].unk0_7 = 0; + ewram17810[gActiveBank].unk1_0 = 0; + ewram17810[gActiveBank ^ 2].unk0_7 = 0; + ewram17810[gActiveBank ^ 2].unk1_0 = 0; + FreeSpriteTilesByTag(0x27F9); + FreeSpritePaletteByTag(0x27F9); + CreateTask(c3_0802FDF4, 10); + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + WallyBufferExecCompleted(); + } +} + +void sub_81377B0(void) +{ + s16 r4; + + r4 = sub_8045C78(gActiveBank, gHealthboxIDs[gActiveBank], 0, 0); + sub_8043DFC(gHealthboxIDs[gActiveBank]); + if (r4 != -1) + { + sub_80440EC(gHealthboxIDs[gActiveBank], r4, 0); + } + else + { + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + WallyBufferExecCompleted(); + } +} + +void bx_blink_t5(void) +{ + u8 spriteId = gObjectBankIDs[gActiveBank]; + + if (gSprites[spriteId].data1 == 32) + { + gSprites[spriteId].data1 = 0; + gSprites[spriteId].invisible = FALSE; + gDoingBattleAnim = FALSE; + WallyBufferExecCompleted(); + } + else + { + if (((u16)gSprites[spriteId].data1 % 4) == 0) + gSprites[spriteId].invisible ^= 1; + gSprites[spriteId].data1++; + } +} + +void sub_813789C(void) +{ + if (!ewram17810[gActiveBank].unk0_6) + { + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8043DB0(gHealthboxIDs[gActiveBank]); + WallyBufferExecCompleted(); + } +} + +// Duplicate of sub_813741C +void sub_8137908(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + WallyBufferExecCompleted(); +} + +void sub_8137940(void) +{ + if (!ewram17810[gActiveBank].unk0_5) + WallyBufferExecCompleted(); +} + +void WallyBufferExecCompleted(void) +{ + gBattleBankFunc[gActiveBank] = WallyBufferRunCommand; + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + u8 multiplayerId = GetMultiplayerId(); + + dp01_prepare_buffer_wireless_probably(2, 4, &multiplayerId); + gBattleBufferA[gActiveBank][0] = 0x38; + } + else + { + gBattleExecBuffer &= ~gBitTable[gActiveBank]; + } +} + +void unref_sub_81379E4(void) +{ + if (!ewram17810[gActiveBank].unk0_4) + WallyBufferExecCompleted(); +} + +void dp01t_00_5_getattr(void) +{ + u8 arr[0x100]; + u32 r6 = 0; + u8 r4; + s32 i; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + r6 = sub_8137A84(gBattlePartyID[gActiveBank], arr); + } + else + { + r4 = gBattleBufferA[gActiveBank][2]; + for (i = 0; i < 6; i++) + { + if (r4 & 1) + r6 += sub_8137A84(i, arr + r6); + r4 >>= 1; + } + } + dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, r6, arr); + WallyBufferExecCompleted(); +} + +u32 sub_8137A84(u8 a, u8 *buffer) +{ + struct BattlePokemon battlePokemon; + struct UnknownStruct3 moveData; + u8 nickname[20]; + u8 *src; + s16 data16; + u32 data32; + s32 size = 0; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); + battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); + for (size = 0; size < 4; size++) + { + battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); + battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + } + battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); + battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP); + battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); + battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); + battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); + battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP); + battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); + battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); + battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); + battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); + battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); + battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); + battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY); + battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); + GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); + StringCopy10(battlePokemon.nickname, nickname); + GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); + src = (u8 *)&battlePokemon; + for (size = 0; size < sizeof(battlePokemon); size++) + buffer[size] = src[size]; + break; + case 1: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 2: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 3: + for (size = 0; size < 4; size++) + { + moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); + moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + } + moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + src = (u8 *)&moveData; + for (size = 0; size < sizeof(moveData); size++) + buffer[size] = src[size]; + break; + case 4: + case 5: + case 6: + case 7: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 8: + for (size = 0; size < 4; size++) + buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + size++; + break; + case 9: + case 10: + case 11: + case 12: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); + size = 1; + break; + case 17: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 18: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 19: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV); + size = 1; + break; + case 20: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV); + size = 1; + break; + case 21: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV); + size = 1; + break; + case 22: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV); + size = 1; + break; + case 23: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV); + size = 1; + break; + case 24: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV); + size = 1; + break; + case 25: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); + size = 1; + break; + case 26: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS); + size = 1; + break; + case 27: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION); + size = 1; + break; + case 28: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL); + size = 1; + break; + case 29: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME); + size = 1; + break; + case 30: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL); + size = 1; + break; + case 31: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + size = 6; + break; + case 32: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + size = 1; + break; + case 33: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + size = 1; + break; + case 34: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + size = 1; + break; + case 35: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + size = 1; + break; + case 36: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + size = 1; + break; + case 37: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + size = 1; + break; + case 38: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 39: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 40: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 41: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); + size = 1; + break; + case 42: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 43: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 44: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 45: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 46: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 47: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 48: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 49: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL); + size = 1; + break; + case 50: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY); + size = 1; + break; + case 51: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE); + size = 1; + break; + case 52: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART); + size = 1; + break; + case 53: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH); + size = 1; + break; + case 54: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN); + size = 1; + break; + case 55: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON); + size = 1; + break; + case 56: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON); + size = 1; + break; + case 57: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON); + size = 1; + break; + case 58: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON); + size = 1; + break; + case 59: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON); + size = 1; + break; + } + return size; +} + +void sub_8138230(void) +{ + sub_802ECF0(); +} + +void sub_813823C(void) +{ + u8 r4; + u8 i; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + sub_8138294(gBattlePartyID[gActiveBank]); + } + else + { + r4 = gBattleBufferA[gActiveBank][2]; + for (i = 0; i < 6; i++) + { + if (r4 & 1) + sub_8138294(i); + r4 >>= 1; + } + } + WallyBufferExecCompleted(); +} + +void sub_8138294(u8 a) +{ + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; + struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; + s32 i; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + { + u8 iv; + + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + for (i = 0; i < 4; i++) + { + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + } + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); + SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + iv = battlePokemon->hpIV; + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); + iv = battlePokemon->attackIV; + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + iv = battlePokemon->defenseIV; + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + iv = battlePokemon->speedIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + iv = battlePokemon->spAttackIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + iv = battlePokemon->spDefenseIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); + SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); + SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); + SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); + SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + } + break; + case 1: + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); + break; + case 2: + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); + break; + case 3: + for (i = 0; i < 4; i++) + { + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + } + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); + break; + case 4: + case 5: + case 6: + case 7: + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); + break; + case 8: + SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); + break; + case 9: + case 10: + case 11: + case 12: + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); + break; + case 17: + SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); + break; + case 18: + SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); + break; + case 19: + SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 20: + SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 21: + SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 22: + SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 23: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 24: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 25: + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); + break; + case 26: + SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); + break; + case 27: + SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); + break; + case 28: + SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 29: + SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); + break; + case 30: + SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); + break; + case 31: + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); + break; + case 32: + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 33: + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 34: + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 35: + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 36: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 37: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 38: + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); + break; + case 39: + SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); + break; + case 40: + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); + break; + case 41: + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 42: + SetMonData(&gPlayerParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 43: + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 44: + SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); + break; + case 45: + SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); + break; + case 46: + SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); + break; + case 47: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); + break; + case 48: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); + break; + case 49: + SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); + break; + case 50: + SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); + break; + case 51: + SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); + break; + case 52: + SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); + break; + case 53: + SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); + break; + case 54: + SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); + break; + case 55: + SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 56: + SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 57: + SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 58: + SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 59: + SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + } + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); +} + +void sub_8138C90(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138C9C(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138CA8(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138CB4(void) +{ + if (gBattleBufferA[gActiveBank][1] == 0) + { + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 1); + gBattleBankFunc[gActiveBank] = sub_813789C; + } + else + { + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8043DB0(gHealthboxIDs[gActiveBank]); + WallyBufferExecCompleted(); + } +} + +void sub_8138D38(void) +{ + sub_8031AF4(2, gActiveBank); + GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + 80, 80 + 4 * (8 - gTrainerBackPicCoords[2].coords), + 30); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; + gSprites[gObjectBankIDs[gActiveBank]].data0 = -2; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gBattleBankFunc[gActiveBank] = sub_813741C; +} + +void sub_8138E04(void) +{ + sub_8031AF4(2, gActiveBank); + GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + 80, 80 + 4 * (8 - gTrainerBackPicCoords[2].coords), + 30); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96; + gSprites[gObjectBankIDs[gActiveBank]].data0 = 2; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gBattleBankFunc[gActiveBank] = sub_8137908; +} + +void sub_8138ED0(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138EDC(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138EE8(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138EF4(void) +{ + ewram17840.unk8 = 4; + gDoingBattleAnim = TRUE; + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); + gBattleBankFunc[gActiveBank] = bx_wait_t5; +} + +void sub_8138F44(void) +{ + u8 val = gBattleBufferA[gActiveBank][1]; + + ewram17840.unk8 = val; + gDoingBattleAnim = TRUE; + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); + gBattleBankFunc[gActiveBank] = bx_wait_t5; +} + +void sub_8138FA0(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138FAC(void) +{ + u16 r0 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); + + gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; + gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8); + gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24); + gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; + gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8); + gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; + gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; + if (sub_8031720(r0, gUnknown_0202F7C4) != 0) + { + // Dead code. sub_8031720 always returns 0. + WallyBufferExecCompleted(); + } + else + { + ewram17810[gActiveBank].unk4 = 0; + gBattleBankFunc[gActiveBank] = sub_81390D0; + } +} + +void sub_81390D0(void) +{ + u16 r4 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); + +#ifndef NONMATCHING + asm("":::"r6"); +#endif + + switch (ewram17810[gActiveBank].unk4) + { + case 0: + if (ewram17800[gActiveBank].unk0_2 == 1) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + ewram17810[gActiveBank].unk4 = 1; + break; + case 1: + if (ewram17810[gActiveBank].unk0_6 == 0) + { + sub_80326EC(0); + ExecuteMoveAnim(r4); + ewram17810[gActiveBank].unk4 = 2; + } + break; + case 2: + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + sub_80326EC(1); + if (ewram17800[gActiveBank].unk0_2 == 1) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); + ewram17810[gActiveBank].unk4 = 3; + } + break; + case 3: + if (ewram17810[gActiveBank].unk0_6 == 0) + { + sub_8031F24(); + sub_80324BC(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + ewram17810[gActiveBank].unk4 = 0; + WallyBufferExecCompleted(); + } + break; + } +} + +void sub_8139208(void) +{ + u16 *ptr; + + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + ptr = (u16 *)&gBattleBufferA[gActiveBank][2]; + if (*ptr == 2) + DestroyMenuCursor(); + BufferStringBattle(*ptr); + sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); + gBattleBankFunc[gActiveBank] = sub_8137454; +} + +void dp01t_11_5_message_for_player_only(void) +{ + if (GetBankSide(gActiveBank) == 0) + sub_8139208(); + else + WallyBufferExecCompleted(); +} + +void sub_8139298(void) +{ + s32 i; + + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 160; + gUnknown_03004210.paletteNum = 0; + FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); + FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); + gBattleBankFunc[gActiveBank] = sub_81372BC; + InitWindow(&gUnknown_03004210, gUnknown_08400CF3, 400, 18, 35); + sub_8002F44(&gUnknown_03004210); + sub_814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); + for (i = 0; i < 4; i++) + nullsub_8(i); + sub_802E3E4(0, 0); + StrCpyDecodeToDisplayedStringBattle(gUnknown_08400CCC); +#ifdef ENGLISH + InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 440, 2, 35); +#else + InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 444, 2, 35); +#endif + sub_8002F44(&gUnknown_03004210); +} + +void sub_8139378(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139384(void) +{ + switch (ewram[0x160A9]) + { + case 0: + sub_80304A8(); + ewram[0x160A9]++; + ewram[0x160AB] = 80; + // fall through + case 1: + ewram[0x160AB]--; + if (ewram[0x160AB] == 0) + { + DestroyMenuCursor(); + PlaySE(SE_SELECT); + dp01_build_cmdbuf_x21_a_bb(1, 10, 256); + WallyBufferExecCompleted(); + } + break; + } +} + +void sub_81393EC(void) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gBattleBankFunc[gActiveBank] = sub_81374C4; + gBankInMenu = gActiveBank; +} + +void sub_813942C(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139438(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139444(void) +{ + s16 r7; + + load_gfxc_health_bar(0); + r7 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + if (r7 != 0x7FFF) + { + u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + u32 curHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, curHP, r7); + } + else + { + u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); + sub_80440EC(gHealthboxIDs[gActiveBank], 0, 0); + } + gBattleBankFunc[gActiveBank] = sub_81377B0; +} + +void sub_8139544(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139550(void) +{ + WallyBufferExecCompleted(); +} + +void sub_813955C(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139568(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139574(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139580(void) +{ + WallyBufferExecCompleted(); +} + +void sub_813958C(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139598(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395A4(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395B0(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395BC(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395C8(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395D4(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395E0(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395EC(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395F8(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139604(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) + { + WallyBufferExecCompleted(); + } + else + { + gDoingBattleAnim = 1; + gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; + sub_8047858(gActiveBank); + gBattleBankFunc[gActiveBank] = bx_blink_t5; + } +} + +void sub_8139674(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139680(void) +{ + PlaySE(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + WallyBufferExecCompleted(); +} + +void sub_81396B0(void) +{ + PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + WallyBufferExecCompleted(); +} + +void sub_81396E0(void) +{ + PlayCry1(GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES), 25); + WallyBufferExecCompleted(); +} + +void dp01t_2E_5_battle_intro(void) +{ + sub_80E43C0(gBattleBufferA[gActiveBank][1]); + gUnknown_02024DE8 |= 1; + WallyBufferExecCompleted(); +} + +void sub_8139750(void) +{ + u8 paletteNum; + u8 taskId; + + oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); + gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; + gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; + gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; + gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; + oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); + StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); + paletteNum = AllocSpritePalette(0xD6F8); + LoadCompressedPalette(gTrainerBackPicPaletteTable[2].data, 0x100 + paletteNum * 16, 32); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = paletteNum; + taskId = CreateTask(sub_8139A2C, 5); + gTasks[taskId].data[0] = gActiveBank; + if (ewram17810[gActiveBank].unk0_0) + gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; + ewram17810[4].unk9 |= 1; + gBattleBankFunc[gActiveBank] = nullsub_91; +} + +void sub_81398BC(u8 bank) +{ + u16 species; + + ewram17800[bank].unk2 = 0; + gBattlePartyID[bank] = gBattleBufferA[bank][1]; + species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0); + GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank)); + gObjectBankIDs[bank] = CreateSprite( + &gUnknown_02024E8C, + sub_8077ABC(bank, 2), + sub_8077F68(bank), + sub_8079E90(bank)); + gSprites[gUnknown_0300434C[bank]].data1 = gObjectBankIDs[bank]; + gSprites[gObjectBankIDs[bank]].data0 = bank; + gSprites[gObjectBankIDs[bank]].data2 = species; + gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; + StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); + gSprites[gObjectBankIDs[bank]].invisible = TRUE; + gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; + gSprites[gUnknown_0300434C[bank]].data0 = sub_8046400(0, 0xFF); +} + +void sub_8139A2C(u8 taskId) +{ + if (gTasks[taskId].data[1] < 31) + { + gTasks[taskId].data[1]++; + } + else + { + u8 savedActiveBank = gActiveBank; + + gActiveBank = gTasks[taskId].data[0]; + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_81398BC(gActiveBank); + gBattleBankFunc[gActiveBank] = sub_8137538; + gActiveBank = savedActiveBank; + DestroyTask(taskId); + } +} + +void sub_8139AA0(void) +{ + if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) + { + WallyBufferExecCompleted(); + } + else + { + ewram17810[gActiveBank].unk0_0 = 1; + gUnknown_02024E68[gActiveBank] = sub_8044804(gActiveBank, (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]); + WallyBufferExecCompleted(); + } +} + +void sub_8139B20(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139B2C(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139B38(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139B44(void) +{ + u8 val2 = gBattleBufferA[gActiveBank][1]; + u16 val = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + + if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, val2, val)) + WallyBufferExecCompleted(); + else + gBattleBankFunc[gActiveBank] = sub_8137940; +} + +void sub_8139BA0(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139BAC(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139BB8(void) +{ + gBattleOutcome = gBattleBufferA[gActiveBank][1]; + FadeOutMapMusic(5); + BeginFastPaletteFade(3); + WallyBufferExecCompleted(); + if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_WILD)) + gBattleBankFunc[gActiveBank] = sub_813746C; +} + +void nullsub_80(void) +{ +} diff --git a/src/battle/battle_interface.c b/src/battle/battle_interface.c new file mode 100644 index 000000000..246bda62b --- /dev/null +++ b/src/battle/battle_interface.c @@ -0,0 +1,3049 @@ +#include "global.h" +#include "battle.h" +#include "battle_interface.h" +#include "decompress.h" +#include "palette.h" +#include "pokedex.h" +#include "pokemon.h" +#include "rom_8077ABC.h" +#include "safari_zone.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h" +#include "text.h" + +struct UnknownStruct5 +{ + u8 unk0; + u32 unk4; + u32 unk8; + u32 unkC; + u32 unk10; +}; + +struct UnknownStruct7 +{ + u8 filler0[0x180]; +}; + +extern u8 ewram[]; +#define ewram520 ((struct UnknownStruct7 *)(ewram + 0x00520)) +#define ewram16088 (*(u8 *) (ewram + 0x16088)) +#define ewram16089 (*(u8 *) (ewram + 0x16089)) +#define ewram17850 ((struct UnknownStruct5 *)(ewram + 0x17850)) + +extern u8 gDisplayedStringBattle[]; +extern u8 gNoOfAllBanks; +extern u16 gBattlePartyID[]; +extern u8 gBanksBySide[]; +extern u8 gHealthboxIDs[]; + +extern u16 gBattleTypeFlags; + +extern const struct SpriteTemplate gSpriteTemplate_820A4EC[]; +extern const struct SpriteTemplate gSpriteTemplate_820A51C[]; +extern const struct SpriteTemplate gSpriteTemplate_820A54C; +extern const struct SpriteTemplate gSpriteTemplate_820A56C[]; +extern const struct SubspriteTable gSubspriteTables_820A684[]; +extern const struct SubspriteTable gSubspriteTables_820A6E4[]; +extern const struct SubspriteTable gSubspriteTables_820A6EC[]; +extern const struct SpriteSheet gUnknown_0820A754[]; +extern const struct SpritePalette gUnknown_0820A764[]; +extern const struct SpritePalette gUnknown_0820A774[]; +extern const struct SpriteSheet gUnknown_0820A784[]; +extern const struct SpriteTemplate gSpriteTemplate_820A7A4[]; +extern const struct SpriteTemplate gSpriteTemplate_820A7D4[]; +extern void *const gUnknown_0820A804[]; +extern void *const gUnknown_0820A80C[]; +extern void *const gUnknown_0820A814[]; +extern void *const gUnknown_0820A83C[]; +extern void *const gUnknown_0820A848[]; +extern void *const gUnknown_0820A854[]; +extern void *const gUnknown_0820A85C[]; +extern void *const gUnknown_0820A87C[]; +extern void *const gUnknown_0820A894[]; +extern void *const gUnknown_0820A8B4[]; +extern void *const gUnknown_0820A8DC[]; +extern void *const gUnknown_0820A904[]; +extern const u8 gUnknown_0820A81C[]; +extern const u8 gUnknown_0820A864[]; +extern const u8 gUnknown_0820A89C[]; +extern const u8 gUnknown_0820A8B0[]; +extern const u8 BattleText_SafariBalls[]; +extern const u8 BattleText_SafariBallsLeft[]; +extern const u8 BattleText_HighlightRed[]; +extern const u8 gUnknown_08D1216C[][32]; + +extern const u16 gBattleInterfaceStatusIcons_DynPal[]; + +#define ABS(n) ((n) >= 0 ? (n) : -(n)) +// Used for computing copy destination addresses +#define MACRO1(n) ((n) - (n) / 8 * 8) + 64 * ((n) / 8) + +static void sub_8043D5C(struct Sprite *); +static const void *sub_8043CDC(u8); +static void sub_8044210(u8, s16, u8); +static void draw_status_ailment_maybe(u8); +extern void sub_8045180(struct Sprite *); +static void sub_8045110(struct Sprite *); +static void sub_8045048(struct Sprite *); +static void sub_8044F70(u8 taskId); +static void sub_8044E74(u8 taskId); +static void sub_8044ECC(u8 taskId); +static u8 sub_80457E8(u8, u8); +static int sub_8045F58(s32, s32, int, int *, u8, u16); +static u8 GetScaledExpFraction(int, int, int, u8); +static void sub_8045D58(u8, u8); +static u8 sub_804602C(int, int, int, int *, u8 *, u8); +static void sub_8046128(struct BattleInterfaceStruct1 *a, int *b, void *c); + +static int do_nothing(s16 unused1, s16 unused2, int unused3) +{ + return 9; +} + +#ifdef NONMATCHING +void sub_8043740(s16 a, u16 *b, u8 c) +{ + u8 sp0[4]; + s8 i; + s8 j; + s32 r9; + + for (i = 0; i < 4; i++) + sp0[i] = 0; + + //_0804377C + //i = 3; + //r9 = -1; + for (i = 3, r9 = -1;;) + { + if (a > 0) + { + sp0[i] = a % 10; + a /= 10; + i--; + } + else + break; + asm(""::"r"(r9)); + } + + //_080437AA + for (; i > r9; i--) + { + //asm("":"=r"(r9)); + sp0[i] = -1; + } + //_080437CE + if (sp0[3] == 0xFF) + sp0[3] = 0; + + //_080437DA + if (c == 0) + { + for (i = 0, j = 0; i < 4; i++) + { + if (sp0[j] == 0xFF) + { + b[j] = (b[j] & 0xFC00) | 0x1E; + b[i + 0x20] = (b[i + 0x20] & 0xFC00) | 0x1E; + } + else + { + b[j] = (b[j] & 0xFC00) | (sp0[j] + 0x14); + b[i + 0x20] = (b[i + 0x20] & 0xFC00) | (sp0[i] + 0x34); + } + j++; + } + + } + //_0804386A + else + { + for (i = 0; i < 4; i++) + { + if (sp0[i] == 0xFF) + { + b[i] = (b[i] & 0xFC00) | 0x1E; + b[i + 0x20] = (b[i + 0x20] & 0xFC00) | 0x1E; + } + else + { + b[i] = (b[i] & 0xFC00) | (sp0[i] + 0x14); + b[i + 0x20] = (b[i + 0x20] & 0xFC00) | (sp0[i] + 0x34); + } + } + } + asm(""::"r"(r9)); +} +#else +__attribute__((naked)) +void sub_8043740(s16 a, u16 *b, u8 c) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + adds r7, r1, 0\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + mov r10, r2\n\ + movs r3, 0\n\ + movs r2, 0\n\ +_0804375C:\n\ + lsls r0, r3, 24\n\ + asrs r0, 24\n\ + mov r3, sp\n\ + adds r1, r3, r0\n\ + strb r2, [r1]\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3\n\ + ble _0804375C\n\ + movs r3, 0x3\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + mov r9, r0\n\ + mov r8, sp\n\ +_0804377C:\n\ + lsls r0, r5, 16\n\ + asrs r6, r0, 16\n\ + cmp r6, 0\n\ + ble _080437AA\n\ + lsls r4, r3, 24\n\ + asrs r4, 24\n\ + mov r1, sp\n\ + adds r5, r1, r4\n\ + adds r0, r6, 0\n\ + movs r1, 0xA\n\ + bl __modsi3\n\ + strb r0, [r5]\n\ + adds r0, r6, 0\n\ + movs r1, 0xA\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + subs r4, 0x1\n\ + lsls r4, 24\n\ + lsrs r3, r4, 24\n\ + b _0804377C\n\ +_080437AA:\n\ + lsls r1, r3, 24\n\ + asrs r0, r1, 24\n\ + cmp r0, r9\n\ + ble _080437CE\n\ + movs r4, 0xFF\n\ + movs r3, 0x1\n\ + negs r3, r3\n\ +_080437B8:\n\ + asrs r2, r1, 24\n\ + mov r5, sp\n\ + adds r1, r5, r2\n\ + ldrb r0, [r1]\n\ + orrs r0, r4\n\ + strb r0, [r1]\n\ + subs r2, 0x1\n\ + lsls r1, r2, 24\n\ + asrs r0, r1, 24\n\ + cmp r0, r3\n\ + bgt _080437B8\n\ +_080437CE:\n\ + mov r1, r8\n\ + ldrb r0, [r1, 0x3]\n\ + cmp r0, 0xFF\n\ + bne _080437DA\n\ + movs r0, 0\n\ + strb r0, [r1, 0x3]\n\ +_080437DA:\n\ + mov r2, r10\n\ + cmp r2, 0\n\ + bne _0804386A\n\ + movs r3, 0\n\ + movs r1, 0\n\ + movs r6, 0xFC\n\ + lsls r6, 8\n\ + movs r5, 0x1E\n\ + mov r12, r5\n\ +_080437EC:\n\ + lsls r1, 24\n\ + asrs r2, r1, 24\n\ + mov r0, sp\n\ + adds r5, r0, r2\n\ + ldrb r0, [r5]\n\ + mov r8, r1\n\ + cmp r0, 0xFF\n\ + bne _08043822\n\ + lsls r1, r2, 1\n\ + adds r1, r7\n\ + ldrh r2, [r1]\n\ + adds r0, r6, 0\n\ + ands r0, r2\n\ + mov r2, r12\n\ + orrs r0, r2\n\ + strh r0, [r1]\n\ + lsls r3, 24\n\ + asrs r1, r3, 23\n\ + adds r1, r7\n\ + adds r1, 0x40\n\ + ldrh r2, [r1]\n\ + adds r0, r6, 0\n\ + ands r0, r2\n\ + mov r5, r12\n\ + orrs r0, r5\n\ + strh r0, [r1]\n\ + b _08043852\n\ +_08043822:\n\ + lsls r2, 1\n\ + adds r2, r7\n\ + ldrh r0, [r2]\n\ + adds r1, r6, 0\n\ + ands r1, r0\n\ + ldrb r0, [r5]\n\ + adds r0, 0x14\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ + lsls r4, r3, 24\n\ + asrs r3, r4, 24\n\ + lsls r2, r3, 1\n\ + adds r2, r7\n\ + adds r2, 0x40\n\ + ldrh r0, [r2]\n\ + adds r1, r6, 0\n\ + ands r1, r0\n\ + mov r5, sp\n\ + adds r0, r5, r3\n\ + ldrb r0, [r0]\n\ + adds r0, 0x34\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ + adds r3, r4, 0\n\ +_08043852:\n\ + movs r0, 0x80\n\ + lsls r0, 17\n\ + add r0, r8\n\ + lsrs r1, r0, 24\n\ + movs r2, 0x80\n\ + lsls r2, 17\n\ + adds r0, r3, r2\n\ + lsrs r3, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3\n\ + ble _080437EC\n\ + b _080438CE\n\ +_0804386A:\n\ + movs r3, 0\n\ + movs r4, 0xFC\n\ + lsls r4, 8\n\ + movs r6, 0x1E\n\ +_08043872:\n\ + lsls r1, r3, 24\n\ + asrs r2, r1, 24\n\ + mov r3, sp\n\ + adds r5, r3, r2\n\ + ldrb r0, [r5]\n\ + adds r3, r1, 0\n\ + cmp r0, 0xFF\n\ + bne _0804389E\n\ + lsls r1, r2, 1\n\ + adds r1, r7\n\ + ldrh r2, [r1]\n\ + adds r0, r4, 0\n\ + ands r0, r2\n\ + orrs r0, r6\n\ + strh r0, [r1]\n\ + adds r1, 0x40\n\ + ldrh r2, [r1]\n\ + adds r0, r4, 0\n\ + ands r0, r2\n\ + orrs r0, r6\n\ + strh r0, [r1]\n\ + b _080438C0\n\ +_0804389E:\n\ + lsls r2, 1\n\ + adds r2, r7\n\ + ldrh r0, [r2]\n\ + adds r1, r4, 0\n\ + ands r1, r0\n\ + ldrb r0, [r5]\n\ + adds r0, 0x14\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ + adds r2, 0x40\n\ + ldrh r0, [r2]\n\ + adds r1, r4, 0\n\ + ands r1, r0\n\ + ldrb r0, [r5]\n\ + adds r0, 0x34\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ +_080438C0:\n\ + movs r5, 0x80\n\ + lsls r5, 17\n\ + adds r0, r3, r5\n\ + lsrs r3, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3\n\ + ble _08043872\n\ +_080438CE:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +void unref_sub_80438E0(s16 a, s16 b, u16 *c) +{ + c[4] = 0x1E; + sub_8043740(b, c, 0); + sub_8043740(a, c + 5, 1); +} + +u8 battle_make_oam_normal_battle(u8 a) +{ + int sp0 = 0; + u8 spriteId1; + u8 spriteId2; + u8 spriteId3; + struct Sprite *sprite; + + if (!IsDoubleBattle()) + { + if (GetBankSide(a) == 0) + { + spriteId1 = CreateSprite(&gSpriteTemplate_820A4EC[0], 240, 160, 1); + spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A4EC[0], 240, 160, 1); + + gSprites[spriteId1].oam.shape = 0; + gSprites[spriteId2].oam.shape = 0; + gSprites[spriteId2].oam.tileNum += 64; + } + else + { + spriteId1 = CreateSprite(&gSpriteTemplate_820A51C[0], 240, 160, 1); + spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A51C[0], 240, 160, 1); + + gSprites[spriteId2].oam.tileNum += 32; + sp0 = 2; + } + //_080439F2 + + gSprites[spriteId1].oam.affineParam = spriteId2; + gSprites[spriteId2].data5 = spriteId1; + gSprites[spriteId2].callback = sub_8043D5C; + } + //_08043A28 + else + { + if (GetBankSide(a) == 0) + { + spriteId1 = CreateSprite(&gSpriteTemplate_820A4EC[GetBankIdentity(a) / 2], 240, 160, 1); + spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A4EC[GetBankIdentity(a) / 2], 240, 160, 1); + + gSprites[spriteId1].oam.affineParam = spriteId2; + gSprites[spriteId2].data5 = spriteId1; + gSprites[spriteId2].oam.tileNum += 32; + gSprites[spriteId2].callback = sub_8043D5C; + sp0 = 1; + } + //_08043ACC + else + { + spriteId1 = CreateSprite(&gSpriteTemplate_820A51C[GetBankIdentity(a) / 2], 240, 160, 1); + spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A51C[GetBankIdentity(a) / 2], 240, 160, 1); + + gSprites[spriteId1].oam.affineParam = spriteId2; + gSprites[spriteId2].data5 = spriteId1; + gSprites[spriteId2].oam.tileNum += 32; + gSprites[spriteId2].callback = sub_8043D5C; + sp0 = 2; + } + //_08043B4E + } + //_08043B50 + + spriteId3 = CreateSpriteAtEnd(&gSpriteTemplate_820A56C[gBanksBySide[a]], 140, 60, 0); + sprite = &gSprites[spriteId3]; + SetSubspriteTables(sprite, &gSubspriteTables_820A684[GetBankSide(a)]); + sprite->subspriteMode = 2; + sprite->oam.priority = 1; + CpuCopy32(sub_8043CDC(1), (void *)(OBJ_VRAM0 + sprite->oam.tileNum * 32), 64); + + gSprites[spriteId1].data5 = spriteId3; + gSprites[spriteId1].data6 = a; + gSprites[spriteId1].invisible = TRUE; + gSprites[spriteId2].invisible = TRUE; + sprite->data5 = spriteId1; + sprite->data6 = sp0; + sprite->invisible = TRUE; + + return spriteId1; +} + +u8 battle_make_oam_safari_battle(void) +{ + u8 spriteId1 = CreateSprite(&gSpriteTemplate_820A54C, 240, 160, 1); + u8 spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A54C, 240, 160, 1); + + gSprites[spriteId1].oam.shape = 0; + gSprites[spriteId2].oam.shape = 0; + gSprites[spriteId2].oam.tileNum += 0x40; + gSprites[spriteId1].oam.affineParam = spriteId2; + gSprites[spriteId2].data5 = spriteId1; + gSprites[spriteId2].callback = sub_8043D5C; + return spriteId1; +} + +static const void *sub_8043CDC(u8 a) +{ + return gUnknown_08D1216C[a]; +} + +void sub_8043CEC(struct Sprite *sprite) +{ + u8 r5 = sprite->data5; + + switch (sprite->data6) + { + case 0: + sprite->pos1.x = gSprites[r5].pos1.x + 16; + sprite->pos1.y = gSprites[r5].pos1.y; + break; + case 1: + sprite->pos1.x = gSprites[r5].pos1.x + 16; + sprite->pos1.y = gSprites[r5].pos1.y; + break; + default: + case 2: + sprite->pos1.x = gSprites[r5].pos1.x + 8; + sprite->pos1.y = gSprites[r5].pos1.y; + break; + } + sprite->pos2.x = gSprites[r5].pos2.x; + sprite->pos2.y = gSprites[r5].pos2.y; +} + +static void sub_8043D5C(struct Sprite *sprite) +{ + u8 data5 = sprite->data5; + + sprite->pos1.x = gSprites[data5].pos1.x + 64; + sprite->pos1.y = gSprites[data5].pos1.y; + sprite->pos2.x = gSprites[data5].pos2.x; + sprite->pos2.y = gSprites[data5].pos2.y; +} + +void sub_8043D84(u8 a, u8 b, u32 c, u32 d, u32 e) +{ + ewram17850[a].unk0 = b; + ewram17850[a].unk4 = c; + ewram17850[a].unk8 = d; + ewram17850[a].unkC = e; + ewram17850[a].unk10 = 0xFFFF8000; +} + +void sub_8043DB0(u8 a) +{ + gSprites[a].invisible = TRUE; + gSprites[gSprites[a].data5].invisible = TRUE; + gSprites[gSprites[a].oam.affineParam].invisible = TRUE; +} + +void sub_8043DFC(u8 a) +{ + gSprites[a].invisible = FALSE; + gSprites[gSprites[a].data5].invisible = FALSE; + gSprites[gSprites[a].oam.affineParam].invisible = FALSE; +} + +static void sub_8043E50(u8 spriteId, s16 x, s16 y) +{ + gSprites[spriteId].pos1.x = x; + gSprites[spriteId].pos1.y = y; +} + +void unref_sub_8043E70(u8 a) +{ + DestroySprite(&gSprites[gSprites[a].oam.affineParam]); + DestroySprite(&gSprites[gSprites[a].data5]); + DestroySprite(&gSprites[a]); +} + +void nullsub_11() +{ +} + +void sub_8043EB4(u8 priority) +{ + s32 i; + + for (i = 0; i < gNoOfAllBanks; i++) + { + u8 spriteId1; + u8 spriteId2; + u8 spriteId3; + + spriteId1 = gHealthboxIDs[i]; + spriteId2 = gSprites[spriteId1].oam.affineParam; + spriteId3 = gSprites[spriteId1].data5; + gSprites[spriteId1].oam.priority = priority; + gSprites[spriteId2].oam.priority = priority; + gSprites[spriteId3].oam.priority = priority; + } +} + +void sub_8043F44(u8 a) +{ + s16 x = 0; + s16 y = 0; + + if (!IsDoubleBattle()) + { + if (GetBankSide(a) != 0) + { + x = 44; + y = 30; + } + else + { + x = 158; + y = 88; + } + } + else + { + switch (GetBankIdentity(a)) + { + case 0: + x = 159; + y = 77; + break; + case 2: + x = 171; + y = 102; + break; + case 1: + x = 44; + y = 19; + break; + case 3: + x = 32; + y = 44; + break; + } + } + sub_8043E50(gHealthboxIDs[a], x, y); +} + +#if ENGLISH +#define CHAR_LV_SEPARATOR CHAR_COLON +#elif GERMAN +#define CHAR_LV_SEPARATOR CHAR_PERIOD +#endif + +static void sub_8043FC0(u8 a, u8 b) +{ + u8 str[30]; + void *const *r7; + u8 *ptr; + s32 i; + s32 two; + + // TODO: Make this a local variable + memcpy(str, gUnknown_0820A81C, sizeof(str)); + if (!IsDoubleBattle()) + { + if (GetBankSide(gSprites[a].data6) == 0) + r7 = gUnknown_0820A804; + else + r7 = gUnknown_0820A80C; + } + else + { + if (GetBankSide(gSprites[a].data6) == 0) + r7 = gUnknown_0820A814; + else + r7 = gUnknown_0820A80C; + } + + ptr = str + 6; + if (b == 100) + { + ptr = ConvertIntToDecimalStringN(ptr, 100, 0, 3); + } + else + { + *(ptr++) = EXT_CTRL_CODE_BEGIN; + *(ptr++) = 0x11; + *(ptr++) = 1; + *(ptr++) = EXT_CTRL_CODE_BEGIN; + *(ptr++) = 0x14; + *(ptr++) = 4; + *(ptr++) = CHAR_LV_SEPARATOR; + *(ptr++) = EXT_CTRL_CODE_BEGIN; + *(ptr++) = 0x14; + *(ptr++) = 0; + ptr = ConvertIntToDecimalStringN(ptr, b, 0, 2); + } + + *(ptr++) = EXT_CTRL_CODE_BEGIN; + *(ptr++) = 0x13; + *(ptr++) = 0xF; + *(ptr++) = EOS; + sub_80034D4((u8 *)0x02000000, str); + + two = 2; + for (i = 0; i < two; i++) + CpuCopy32((void *)(0x02000020 + i * 64), r7[i] + gSprites[a].oam.tileNum * 32, 32); +} + +#ifdef NONMATCHING +void sub_80440EC(u8 a, s16 b, u8 c) +{ + u8 str[0x14]; + u8 *ptr; + s32 foo; + void *const *r4; + s32 i; + + // TODO: make this a local variable + memcpy(str, gUnknown_0820A864, sizeof(str)); + foo = gSprites[a].data6; + + if (IsDoubleBattle() == TRUE || GetBankSide(foo) == 1) + { + //_08044136 + sub_8044210(a, b, c); + return; + } + // + ptr = str + 6; + if (c == 0) + { + if (GetBankSide(gSprites[a].data6) == 0) + r4 = gUnknown_0820A83C; + else + r4 = gUnknown_0820A848; + c = 3; + ptr = sub_8003504(ptr, b, 0x13, 1); + *(ptr++) = 0xBA; + *(ptr++) = 0xFF; + sub_80034D4((u8 *)0x02000000, str); + } + else + { + if (GetBankSide(gSprites[a].data6) == 0) + r4 = gUnknown_0820A854; + else + r4 = gUnknown_0820A85C; + c = 2; + sub_8003504(ptr, b, 0xF, 1); + sub_80034D4((u8 *)0x02000000, str); + } + //asm(""::"r"(a)); + //_080441B6 + for (i = 0; i < c; i++) // _080440BC + { + void *temp = r4[i] + gSprites[a].oam.tileNum * 32; + CpuCopy32((void *)(0x02000020 + i * 0x40), temp, 0x20); + } +} +#else +__attribute__((naked)) +void sub_80440EC(u8 a, s16 b, u8 c) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0x14\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + lsls r1, 16\n\ + lsrs r6, r1, 16\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + mov r8, r2\n\ + ldr r1, _08044144 @ =gUnknown_0820A864\n\ + mov r0, sp\n\ + movs r2, 0x14\n\ + bl memcpy\n\ + ldr r1, _08044148 @ =gSprites\n\ + lsls r0, r7, 4\n\ + adds r0, r7\n\ + lsls r0, 2\n\ + adds r4, r0, r1\n\ + movs r0, 0x3A\n\ + ldrsh r5, [r4, r0]\n\ + bl IsDoubleBattle\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _08044136\n\ + lsls r0, r5, 24\n\ + lsrs r0, 24\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _0804414C\n\ +_08044136:\n\ + lsls r1, r6, 16\n\ + asrs r1, 16\n\ + adds r0, r7, 0\n\ + mov r2, r8\n\ + bl sub_8044210\n\ + b _080441F0\n\ + .align 2, 0\n\ +_08044144: .4byte gUnknown_0820A864\n\ +_08044148: .4byte gSprites\n\ +_0804414C:\n\ + mov r5, sp\n\ + adds r5, 0x6\n\ + mov r0, r8\n\ + cmp r0, 0\n\ + bne _08044190\n\ + ldrh r0, [r4, 0x3A]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + ldr r4, _08044188 @ =gUnknown_0820A848\n\ + cmp r0, 0\n\ + bne _0804416A\n\ + ldr r4, _0804418C @ =gUnknown_0820A83C\n\ +_0804416A:\n\ + movs r0, 0x3\n\ + mov r8, r0\n\ + lsls r1, r6, 16\n\ + asrs r1, 16\n\ + adds r0, r5, 0\n\ + movs r2, 0x13\n\ + movs r3, 0x1\n\ + bl sub_8003504\n\ + adds r5, r0, 0\n\ + movs r0, 0xBA\n\ + strb r0, [r5]\n\ + movs r0, 0xFF\n\ + strb r0, [r5, 0x1]\n\ + b _080441B6\n\ + .align 2, 0\n\ +_08044188: .4byte gUnknown_0820A848\n\ +_0804418C: .4byte gUnknown_0820A83C\n\ +_08044190:\n\ + ldrh r0, [r4, 0x3A]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + ldr r4, _080441FC @ =gUnknown_0820A85C\n\ + cmp r0, 0\n\ + bne _080441A4\n\ + ldr r4, _08044200 @ =gUnknown_0820A854\n\ +_080441A4:\n\ + movs r0, 0x2\n\ + mov r8, r0\n\ + lsls r1, r6, 16\n\ + asrs r1, 16\n\ + adds r0, r5, 0\n\ + movs r2, 0xF\n\ + movs r3, 0x1\n\ + bl sub_8003504\n\ +_080441B6:\n\ + movs r0, 0x80\n\ + lsls r0, 18\n\ + mov r1, sp\n\ + bl sub_80034D4\n\ + mov r0, r8\n\ + cmp r0, 0\n\ + beq _080441F0\n\ + ldr r1, _08044204 @ =gSprites\n\ + lsls r0, r7, 4\n\ + adds r0, r7\n\ + lsls r0, 2\n\ + adds r6, r0, r1\n\ + adds r7, r4, 0\n\ + ldr r5, _08044208 @ =0x02000020\n\ + mov r4, r8\n\ +_080441D6:\n\ + ldrh r0, [r6, 0x4]\n\ + lsls r0, 22\n\ + lsrs r0, 17\n\ + ldm r7!, {r1}\n\ + adds r1, r0\n\ + adds r0, r5, 0\n\ + ldr r2, _0804420C @ =REG_BG0CNT\n\ + bl CpuSet\n\ + adds r5, 0x40\n\ + subs r4, 0x1\n\ + cmp r4, 0\n\ + bne _080441D6\n\ +_080441F0:\n\ + add sp, 0x14\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080441FC: .4byte gUnknown_0820A85C\n\ +_08044200: .4byte gUnknown_0820A854\n\ +_08044204: .4byte gSprites\n\ +_08044208: .4byte 0x02000020\n\ +_0804420C: .4byte 0x04000008\n\ + .syntax divided\n"); +} +#endif + +static void sub_8044210(u8 a, s16 b, u8 c) +{ + u8 str[0x14]; + u8 *ptr; + void *const *r7; + int r10; + int r4; + int i; + + // TODO: make this a local variable + memcpy(str, gUnknown_0820A89C, sizeof(str)); + r4 = gSprites[a].data6; + if ((ewram17800[r4].unk0_4) == 0) + return; + ptr = str + 6; + if (c == 0) + { + r7 = gUnknown_0820A87C; + r10 = 6; + ptr = sub_8003504(ptr, b, 0x2B, 1); + *(ptr++) = CHAR_SLASH; + *(ptr++) = EOS; + } + else + { + r7 = gUnknown_0820A894; + r10 = 2; + sub_8003504(ptr, b, 0xF, 1); + if (GetBankSide(r4) == 0) + { + CpuCopy32(sub_8043CDC(0x74), (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + 0x34) * 32), 32); + } + } + r4 = gSprites[a].data5; + sub_80034D4((u8 *)0x02000000, str); + for (i = 0; i < r10; i++) + { + CpuCopy32((void *)(0x02000020 + i * 0x40), r7[i] + gSprites[r4].oam.tileNum * 32, 0x20); + } +} + +#ifdef NONMATCHING +void sub_8044338(u8 a, struct Pokemon *pkmn) +{ + u8 str[0x14]; + u8 *r6; + s32 r8; + u8 nature; // = GetNature(pkmn); + s32 r7; + u8 i; + u8 r5; + + // TODO: make this a local variable + memcpy(str, gUnknown_0820A864, sizeof(str)); + r6 = ewram520[GetBankIdentity(gSprites[a].data6)].filler0; + r8 = 5; + nature = GetNature(pkmn); + StringCopy(str + 6, gNatureNames[nature]); + sub_80034D4(r6, str); + r7 = 6; + for (i = 0; i < (u32)r8; i++, r7++) //_080443AA + { + u8 val; + + if ((u8)(str[r7] - 0x37) <= 0x13 || (u8)(str[r7] + 0x79) <= 0x13) + val = 0x2C; + //_080443DC + else if ((u8)(str[r7] - 0x4B) <= 4 || (u8)(str[r7] + 0x65) <= 4) + val = 0x2D; + else + val = 0x2B; + + CpuCopy32(sub_8043CDC(val), r6 + i * 64, 32); + } + //r7 = 1; + //sp18 = a * 16; + for (r7 = 1; r7 < r8 + 1; r7++) + { + int foo; + + foo = gSprites[a].oam.tileNum + MACRO1(r7); + CpuCopy32(r6, (u8 *)0x06010000 + foo * 32, 32); + r6 += 32; + + foo = gSprites[a].oam.tileNum + 8 + MACRO1(r7); + CpuCopy32(r6, (u8 *)0x06010000 + foo * 32, 32); + r6 += 32; + } + //_08044486 + r5 = gSprites[a].data5; + ConvertIntToDecimalStringN(str + 6, ewram[0x16089], 1, 2); + ConvertIntToDecimalStringN(str + 9, ewram[0x16088], 1, 2); + str[5] = 0; + str[8] = 0xBA; + sub_80034D4((u8 *)0x02000000, str); + + for (r7 = 0; r7 < 5; r7++) + { + if (r7 <= 1) + { + int foo = (gSprites[r5].oam.tileNum + 2 + r7); + CpuCopy32((u8 *)0x02000020 + r7 * 0x40, (u8 *)0x06010000 + foo * 32, 32); + } + else + { + int foo = (r7 + gSprites[r5].oam.tileNum); + CpuCopy32((u8 *)0x02000020 + r7 * 0x40, (u8 *)0x060100C0 + foo * 32, 32); + } + } +} +#else +__attribute__((naked)) +void sub_8044338(u8 a, struct Pokemon *pkmn) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x20\n\ + adds r4, r1, 0\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x14]\n\ + ldr r1, _080443CC @ =gUnknown_0820A864\n\ + mov r0, sp\n\ + movs r2, 0x14\n\ + bl memcpy\n\ + ldr r1, _080443D0 @ =gSprites\n\ + ldr r2, [sp, 0x14]\n\ + lsls r0, r2, 4\n\ + adds r0, r2\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x3A]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetBankIdentity\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + lsls r1, 7\n\ + ldr r3, _080443D4 @ =0x02000520\n\ + adds r6, r1, r3\n\ + movs r0, 0x5\n\ + mov r8, r0\n\ + adds r0, r4, 0\n\ + bl GetNature\n\ + lsls r0, 24\n\ + mov r4, sp\n\ + adds r4, 0x6\n\ + ldr r1, _080443D8 @ =gNatureNames\n\ + lsrs r0, 22\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ + adds r0, r4, 0\n\ + bl StringCopy\n\ + adds r0, r6, 0\n\ + mov r1, sp\n\ + bl sub_80034D4\n\ + movs r7, 0x6\n\ + movs r5, 0\n\ + mov r1, sp\n\ + adds r1, 0x9\n\ + str r1, [sp, 0x1C]\n\ +_080443AA:\n\ + mov r2, sp\n\ + adds r0, r2, r7\n\ + ldrb r1, [r0]\n\ + adds r0, r1, 0\n\ + subs r0, 0x37\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x13\n\ + bls _080443C8\n\ + adds r0, r1, 0\n\ + adds r0, 0x79\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x13\n\ + bhi _080443DC\n\ +_080443C8:\n\ + movs r0, 0x2C\n\ + b _080443FA\n\ + .align 2, 0\n\ +_080443CC: .4byte gUnknown_0820A864\n\ +_080443D0: .4byte gSprites\n\ +_080443D4: .4byte 0x02000520\n\ +_080443D8: .4byte gNatureNames\n\ +_080443DC:\n\ + adds r0, r1, 0\n\ + subs r0, 0x4B\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x4\n\ + bls _080443F4\n\ + adds r0, r1, 0\n\ + adds r0, 0x65\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x4\n\ + bhi _080443F8\n\ +_080443F4:\n\ + movs r0, 0x2D\n\ + b _080443FA\n\ +_080443F8:\n\ + movs r0, 0x2B\n\ +_080443FA:\n\ + bl sub_8043CDC\n\ + lsls r1, r5, 6\n\ + adds r1, r6, r1\n\ + ldr r2, _080444F8 @ =REG_BG0CNT\n\ + bl CpuSet\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + adds r7, 0x1\n\ + cmp r5, r8\n\ + bcc _080443AA\n\ + movs r7, 0x1\n\ + ldr r3, [sp, 0x14]\n\ + lsls r3, 4\n\ + str r3, [sp, 0x18]\n\ + movs r0, 0x1\n\ + add r0, r8\n\ + mov r9, r0\n\ + cmp r7, r9\n\ + bge _08044486\n\ + ldr r1, _080444FC @ =gSprites\n\ + ldr r2, _080444F8 @ =REG_BG0CNT\n\ + mov r10, r2\n\ + ldr r2, [sp, 0x14]\n\ + adds r0, r3, r2\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + mov r8, r0\n\ +_08044436:\n\ + mov r3, r8\n\ + ldrh r0, [r3, 0x4]\n\ + lsls r0, 22\n\ + lsrs r0, 22\n\ + adds r5, r7, 0\n\ + cmp r7, 0\n\ + bge _08044446\n\ + adds r5, r7, 0x7\n\ +_08044446:\n\ + asrs r5, 3\n\ + lsls r4, r5, 3\n\ + subs r4, r7, r4\n\ + adds r0, r4\n\ + lsls r5, 6\n\ + adds r0, r5\n\ + lsls r0, 5\n\ + ldr r2, _08044500 @ =0x06010000\n\ + adds r1, r0, r2\n\ + adds r0, r6, 0\n\ + mov r2, r10\n\ + bl CpuSet\n\ + adds r6, 0x20\n\ + mov r3, r8\n\ + ldrh r0, [r3, 0x4]\n\ + lsls r0, 22\n\ + lsrs r0, 22\n\ + adds r4, 0x8\n\ + adds r0, r4\n\ + adds r0, r5\n\ + lsls r0, 5\n\ + ldr r2, _08044500 @ =0x06010000\n\ + adds r1, r0, r2\n\ + adds r0, r6, 0\n\ + mov r2, r10\n\ + bl CpuSet\n\ + adds r6, 0x20\n\ + adds r7, 0x1\n\ + cmp r7, r9\n\ + blt _08044436\n\ +_08044486:\n\ + ldr r6, _080444FC @ =gSprites\n\ + ldr r3, [sp, 0x18]\n\ + ldr r1, [sp, 0x14]\n\ + adds r0, r3, r1\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldrh r5, [r0, 0x38]\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + ldr r4, _08044504 @ =0x02000000\n\ + ldr r2, _08044508 @ =0x00016089\n\ + adds r0, r4, r2\n\ + ldrb r1, [r0]\n\ + mov r0, sp\n\ + adds r0, 0x6\n\ + movs r2, 0x1\n\ + movs r3, 0x2\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r3, _0804450C @ =0x00016088\n\ + adds r4, r3\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp, 0x1C]\n\ + movs r2, 0x1\n\ + movs r3, 0x2\n\ + bl ConvertIntToDecimalStringN\n\ + mov r1, sp\n\ + movs r0, 0\n\ + strb r0, [r1, 0x5]\n\ + movs r0, 0xBA\n\ + strb r0, [r1, 0x8]\n\ + movs r0, 0x80\n\ + lsls r0, 18\n\ + bl sub_80034D4\n\ + movs r7, 0\n\ + lsls r0, r5, 4\n\ + adds r0, r5\n\ + lsls r0, 2\n\ + adds r5, r0, r6\n\ + ldr r4, _08044510 @ =0x02000020\n\ +_080444DA:\n\ + cmp r7, 0x1\n\ + bgt _08044514\n\ + ldrh r1, [r5, 0x4]\n\ + lsls r1, 22\n\ + lsrs r1, 22\n\ + adds r0, r7, 0x2\n\ + adds r1, r0\n\ + lsls r1, 5\n\ + ldr r0, _08044500 @ =0x06010000\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + ldr r2, _080444F8 @ =REG_BG0CNT\n\ + bl CpuSet\n\ + b _0804452A\n\ + .align 2, 0\n\ +_080444F8: .4byte 0x04000008\n\ +_080444FC: .4byte gSprites\n\ +_08044500: .4byte 0x06010000\n\ +_08044504: .4byte 0x02000000\n\ +_08044508: .4byte 0x00016089\n\ +_0804450C: .4byte 0x00016088\n\ +_08044510: .4byte 0x02000020\n\ +_08044514:\n\ + ldrh r1, [r5, 0x4]\n\ + lsls r1, 22\n\ + lsrs r1, 22\n\ + adds r1, r7, r1\n\ + lsls r1, 5\n\ + ldr r2, _08044544 @ =0x060100c0\n\ + adds r1, r2\n\ + adds r0, r4, 0\n\ + ldr r2, _08044548 @ =REG_BG0CNT\n\ + bl CpuSet\n\ +_0804452A:\n\ + adds r4, 0x40\n\ + adds r7, 0x1\n\ + cmp r7, 0x4\n\ + ble _080444DA\n\ + add sp, 0x20\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08044544: .4byte 0x060100c0\n\ +_08044548: .4byte 0x04000008\n\ + .syntax divided\n"); +} +#endif + +void sub_804454C(void) +{ + s32 i; + u8 spriteId; + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gSprites[gHealthboxIDs[i]].callback == SpriteCallbackDummy + && GetBankSide(i) != 1 + && (IsDoubleBattle() || GetBankSide(i) != 0)) + { + u8 r6; + + ewram17800[i].unk0_4 ^= 1; + r6 = ewram17800[i].unk0_4; + if (GetBankSide(i) == 0) + { + + if (!IsDoubleBattle()) + continue; + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + continue; + + if (r6 == 1) + { + spriteId = gSprites[gHealthboxIDs[i]].data5; + + CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); + sub_8044210(gHealthboxIDs[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_HP), 0); + sub_8044210(gHealthboxIDs[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_MAX_HP), 1); + } + else + { + draw_status_ailment_maybe(gHealthboxIDs[i]); + sub_8045A5C(gHealthboxIDs[i], &gPlayerParty[gBattlePartyID[i]], 5); + CpuCopy32(sub_8043CDC(0x75), (void *)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxIDs[i]].oam.tileNum * 32), 32); + } + } + else + { + if (r6 == 1) + { + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + { + sub_8044338(gHealthboxIDs[i], &gEnemyParty[gBattlePartyID[i]]); + } + else + { + spriteId = gSprites[gHealthboxIDs[i]].data5; + + CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); + sub_8044210(gHealthboxIDs[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_HP), 0); + sub_8044210(gHealthboxIDs[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_MAX_HP), 1); + } + } + else + { + draw_status_ailment_maybe(gHealthboxIDs[i]); + sub_8045A5C(gHealthboxIDs[i], &gEnemyParty[gBattlePartyID[i]], 5); + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + sub_8045A5C(gHealthboxIDs[i], &gEnemyParty[gBattlePartyID[i]], 4); + } + } + gSprites[gHealthboxIDs[i]].data7 ^= 1; + } + } +} + +// This function almost matches except for just two instructions around 0x08044B52 that are swapped. +#ifdef NONMATCHING +u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d) +{ + u8 r7; + s16 x; + s16 y; + s16 r8; + s16 r5; + + int i; + u8 sp[6]; + s8 sp14; + u8 sp18; + u8 taskId; + + if (c == 0 || GetBankIdentity(a) != 3) + { + if (GetBankSide(a) == 0) + { + r7 = 0; + x = 136; + y = 96; + r8 = 100; + r5 = -5; + } + else + { + r7 = 1; + if (c == 0 || !IsDoubleBattle()) + { + x = 104; + y = 40; + } + else + { + x = 104; + y = 16; + } + r8 = -100; + r5 = 5; + } + } + else + { + r7 = 1; + x = 104; + y = 40; + r8 = -100; + r5 = 5; + } + //_08044884 + + sp14 = 0; + for (i = 0; i < 6; i++) //_080448A0 + { + if (b[i].unk0 != 0xFFFF) + sp14++; + } + + LoadCompressedObjectPic(&gUnknown_0820A754[r7]); + LoadSpriteSheet(&gUnknown_0820A784[r7]); + LoadSpritePalette(&gUnknown_0820A764[r7]); + LoadSpritePalette(&gUnknown_0820A774[r7]); + + sp18 = CreateSprite(&gSpriteTemplate_820A7A4[r7], x, y, 10); + SetSubspriteTables(&gSprites[sp18], gSubspriteTables_820A6E4); + gSprites[sp18].pos2.x = r8; + gSprites[sp18].data0 = r5; + if (r7 != 0) + { + gSprites[sp18].pos1.x -= 96; + gSprites[sp18].oam.matrixNum = 8; + } + else + { + gSprites[sp18].pos1.x += 0x60; + } + //_0804495A + for (i = 0; i < 6; i++) //_08044970 + { + sp[i] = CreateSpriteAtEnd(&gSpriteTemplate_820A7D4[r7], x, y - 4, 9); + if (d == 0) + { + gSprites[sp[i]].callback = sub_8045180; + } + //_080449A0 + if (r7 == 0) + { + gSprites[sp[i]].pos2.x = 0; + gSprites[sp[i]].pos2.y = 0; + } + //_080449BE + gSprites[sp[i]].data0 = sp18; + if (r7 == 0) + { + gSprites[sp[i]].pos1.x += 10 * i + 24; + gSprites[sp[i]].data1 = i * 7 + 10; + gSprites[sp[i]].pos2.x = 120; + } + //_08044A18 + else + { + gSprites[sp[i]].pos1.x -= 10 * (5 - i) + 24; + gSprites[sp[i]].data1 = (6 - i) * 7 + 10; + gSprites[sp[i]].pos2.x = -120; + } + //_08044A56 + gSprites[sp[i]].data2 = r7; + } + //_08044A76 + if (GetBankSide(a) == 0) + { + for (i = 0; i < 6; i++) //_08044A9A + { + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) // && b[i] != 0xFFFF && b[i] + { + if (b[i].unk0 == 0xFFFF) + { + //_08044AE6 + gSprites[sp[i]].oam.tileNum += 1; + gSprites[sp[i]].data7 = 1; + // to _08044B52 + } + else if (b[i].unk0 == 0) + { + gSprites[sp[i]].oam.tileNum += 3; + // to _08044B46 + } + else if (b[i].unk4 != 0) + { + gSprites[sp[i]].oam.tileNum += 2; + } + } + //_08044ADC + else + { + if (i >= sp14) + { + //_08044AE6 + gSprites[sp[i]].oam.tileNum += 1; + gSprites[sp[i]].data7 = 1; + // to _08044B52 + } + else if (b[i].unk0 == 0) + { + //_08044B14 + gSprites[sp[i]].oam.tileNum += 3; + // to _08044B46 + } + else if (b[i].unk4 != 0) + { + gSprites[sp[i]].oam.tileNum += 2; + } + } + } + } + //_08044B5E + else + { + // Mismatch occurrs in this loop initialization + for (i = 0; i < 6; i++) + { + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (b[i].unk0 == 0xFFFF) + { + gSprites[sp[5 - i]].oam.tileNum += 1; + gSprites[sp[5 - i]].data7 = 1; + } + else if (b[i].unk0 == 0) + { + gSprites[sp[5 - i]].oam.tileNum += 3; + } + else if (b[i].unk4 != 0) + { + gSprites[sp[5 - i]].oam.tileNum += 2; + } + } + else + { + if (i >= sp14) + { + gSprites[sp[5 - i]].oam.tileNum += 1; + gSprites[sp[5 - i]].data7 = 1; + } + else if (b[i].unk0 == 0) + { + gSprites[sp[5 - i]].oam.tileNum += 3; + } + else if (b[i].unk4 != 0) + { + gSprites[sp[5 - i]].oam.tileNum += 2; + } + } + // This corrects the initialization order, but messes up the counter update order + asm(""::"r"(&b[i])); + } + } + //_08044C38 + taskId = CreateTask(TaskDummy, 5); + gTasks[taskId].data[0] = a; + gTasks[taskId].data[1] = sp18; + for (i = 0; i < 6; i++) + gTasks[taskId].data[3 + i] = sp[i]; + gTasks[taskId].data[10] = d; + PlaySE12WithPanning(SE_TB_START, 0); + return taskId; +} +#else +__attribute__((naked)) +u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x28\n\ + str r1, [sp, 0xC]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x8]\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r4, r2, 0\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + str r3, [sp, 0x10]\n\ + cmp r4, 0\n\ + beq _08044834\n\ + bl GetBankIdentity\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x3\n\ + beq _08044878\n\ +_08044834:\n\ + ldr r0, [sp, 0x8]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08044854\n\ + movs r7, 0\n\ + movs r1, 0x88\n\ + movs r2, 0x60\n\ + movs r0, 0x64\n\ + mov r8, r0\n\ + ldr r5, _08044850 @ =0x0000fffb\n\ + b _08044884\n\ + .align 2, 0\n\ +_08044850: .4byte 0x0000fffb\n\ +_08044854:\n\ + movs r7, 0x1\n\ + cmp r4, 0\n\ + beq _08044864\n\ + bl IsDoubleBattle\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0804486A\n\ +_08044864:\n\ + movs r1, 0x68\n\ + movs r2, 0x28\n\ + b _0804486E\n\ +_0804486A:\n\ + movs r1, 0x68\n\ + movs r2, 0x10\n\ +_0804486E:\n\ + ldr r3, _08044874 @ =0x0000ff9c\n\ + mov r8, r3\n\ + b _08044882\n\ + .align 2, 0\n\ +_08044874: .4byte 0x0000ff9c\n\ +_08044878:\n\ + movs r7, 0x1\n\ + movs r1, 0x68\n\ + movs r2, 0x28\n\ + ldr r5, _08044930 @ =0x0000ff9c\n\ + mov r8, r5\n\ +_08044882:\n\ + movs r5, 0x5\n\ +_08044884:\n\ + movs r6, 0\n\ + str r6, [sp, 0x14]\n\ + lsls r4, r7, 3\n\ + ldr r0, _08044934 @ =gUnknown_0820A754\n\ + mov r10, r0\n\ + lsls r3, r7, 1\n\ + mov r9, r3\n\ + lsls r1, 16\n\ + str r1, [sp, 0x20]\n\ + lsls r2, 16\n\ + str r2, [sp, 0x24]\n\ + ldr r2, _08044938 @ =0x0000ffff\n\ + ldr r1, [sp, 0xC]\n\ + movs r6, 0x5\n\ +_080448A0:\n\ + ldrh r0, [r1]\n\ + cmp r0, r2\n\ + beq _080448B4\n\ + ldr r3, [sp, 0x14]\n\ + lsls r0, r3, 24\n\ + movs r3, 0x80\n\ + lsls r3, 17\n\ + adds r0, r3\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x14]\n\ +_080448B4:\n\ + adds r1, 0x8\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _080448A0\n\ + mov r6, r10\n\ + adds r0, r4, r6\n\ + bl LoadCompressedObjectPic\n\ + ldr r0, _0804493C @ =gUnknown_0820A784\n\ + adds r0, r4, r0\n\ + bl LoadSpriteSheet\n\ + ldr r0, _08044940 @ =gUnknown_0820A764\n\ + adds r0, r4, r0\n\ + bl LoadSpritePalette\n\ + ldr r0, _08044944 @ =gUnknown_0820A774\n\ + adds r0, r4, r0\n\ + bl LoadSpritePalette\n\ + mov r1, r9\n\ + adds r0, r1, r7\n\ + lsls r0, 3\n\ + ldr r1, _08044948 @ =gSpriteTemplate_820A7A4\n\ + adds r0, r1\n\ + ldr r2, [sp, 0x20]\n\ + asrs r1, r2, 16\n\ + ldr r3, [sp, 0x24]\n\ + asrs r2, r3, 16\n\ + movs r3, 0xA\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x18]\n\ + lsls r0, 4\n\ + ldr r6, [sp, 0x18]\n\ + adds r0, r6\n\ + lsls r0, 2\n\ + ldr r1, _0804494C @ =gSprites\n\ + adds r4, r0, r1\n\ + ldr r1, _08044950 @ =gSubspriteTables_820A6E4\n\ + adds r0, r4, 0\n\ + bl SetSubspriteTables\n\ + mov r0, r8\n\ + strh r0, [r4, 0x24]\n\ + strh r5, [r4, 0x2E]\n\ + cmp r7, 0\n\ + beq _08044954\n\ + ldrh r0, [r4, 0x20]\n\ + subs r0, 0x60\n\ + strh r0, [r4, 0x20]\n\ + ldrb r1, [r4, 0x3]\n\ + movs r0, 0x3F\n\ + negs r0, r0\n\ + ands r0, r1\n\ + movs r1, 0x10\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x3]\n\ + b _0804495A\n\ + .align 2, 0\n\ +_08044930: .4byte 0x0000ff9c\n\ +_08044934: .4byte gUnknown_0820A754\n\ +_08044938: .4byte 0x0000ffff\n\ +_0804493C: .4byte gUnknown_0820A784\n\ +_08044940: .4byte gUnknown_0820A764\n\ +_08044944: .4byte gUnknown_0820A774\n\ +_08044948: .4byte gSpriteTemplate_820A7A4\n\ +_0804494C: .4byte gSprites\n\ +_08044950: .4byte gSubspriteTables_820A6E4\n\ +_08044954:\n\ + ldrh r0, [r4, 0x20]\n\ + adds r0, 0x60\n\ + strh r0, [r4, 0x20]\n\ +_0804495A:\n\ + movs r6, 0\n\ + ldr r1, _08044A04 @ =gSprites\n\ + mov r10, r1\n\ + mov r4, sp\n\ + mov r2, r9\n\ + adds r0, r2, r7\n\ + lsls r0, 3\n\ + str r0, [sp, 0x1C]\n\ + movs r3, 0xA\n\ + mov r9, r3\n\ + mov r8, r6\n\ +_08044970:\n\ + ldr r0, _08044A08 @ =gSpriteTemplate_820A7D4\n\ + ldr r5, [sp, 0x24]\n\ + ldr r1, _08044A0C @ =0xfffc0000\n\ + adds r2, r5, r1\n\ + ldr r3, [sp, 0x1C]\n\ + adds r0, r3, r0\n\ + ldr r5, [sp, 0x20]\n\ + asrs r1, r5, 16\n\ + asrs r2, 16\n\ + movs r3, 0x9\n\ + bl CreateSpriteAtEnd\n\ + strb r0, [r4]\n\ + ldr r0, [sp, 0x10]\n\ + cmp r0, 0\n\ + bne _080449A0\n\ + ldrb r0, [r4]\n\ + lsls r1, r0, 4\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + ldr r2, _08044A10 @ =gSprites + 0x1C\n\ + adds r1, r2\n\ + ldr r0, _08044A14 @ =sub_8045180\n\ + str r0, [r1]\n\ +_080449A0:\n\ + ldr r5, _08044A04 @ =gSprites\n\ + cmp r7, 0\n\ + bne _080449BE\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + add r0, r10\n\ + strh r7, [r0, 0x24]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + add r0, r10\n\ + strh r7, [r0, 0x26]\n\ +_080449BE:\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + movs r1, 0\n\ + mov r3, sp\n\ + ldrh r3, [r3, 0x18]\n\ + strh r3, [r0, 0x2E]\n\ + cmp r7, 0\n\ + bne _08044A18\n\ + ldrb r0, [r4]\n\ + lsls r1, r0, 4\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r5\n\ + ldrh r0, [r1, 0x20]\n\ + adds r0, 0x18\n\ + add r0, r8\n\ + strh r0, [r1, 0x20]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + mov r1, r9\n\ + strh r1, [r0, 0x30]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + movs r1, 0x78\n\ + b _08044A56\n\ + .align 2, 0\n\ +_08044A04: .4byte gSprites\n\ +_08044A08: .4byte gSpriteTemplate_820A7D4\n\ +_08044A0C: .4byte 0xfffc0000\n\ +_08044A10: .4byte gSprites + 0x1C\n\ +_08044A14: .4byte sub_8045180\n\ +_08044A18:\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r5\n\ + ldrh r3, [r2, 0x20]\n\ + subs r3, 0x18\n\ + movs r1, 0x5\n\ + subs r1, r6\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 1\n\ + subs r3, r0\n\ + strh r3, [r2, 0x20]\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r5\n\ + movs r1, 0x6\n\ + subs r1, r6\n\ + lsls r0, r1, 3\n\ + subs r0, r1\n\ + adds r0, 0xA\n\ + strh r0, [r2, 0x30]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + ldr r1, _08044AC4 @ =0x0000ff88\n\ +_08044A56:\n\ + strh r1, [r0, 0x24]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + strh r7, [r0, 0x32]\n\ + adds r4, 0x1\n\ + movs r2, 0x7\n\ + add r9, r2\n\ + movs r3, 0xA\n\ + add r8, r3\n\ + adds r6, 0x1\n\ + cmp r6, 0x5\n\ + bgt _08044A76\n\ + b _08044970\n\ +_08044A76:\n\ + ldr r0, [sp, 0x8]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08044B5E\n\ + movs r6, 0\n\ + ldr r5, _08044AC8 @ =gBattleTypeFlags\n\ + mov r10, r5\n\ + ldr r0, _08044ACC @ =0x0000ffff\n\ + mov r9, r0\n\ + ldr r7, _08044AD0 @ =gSprites\n\ + ldr r1, _08044AD4 @ =0x000003ff\n\ + mov r12, r1\n\ + ldr r2, _08044AD8 @ =0xfffffc00\n\ + mov r8, r2\n\ + mov r4, sp\n\ + ldr r5, [sp, 0xC]\n\ +_08044A9A:\n\ + mov r3, r10\n\ + ldrh r1, [r3]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08044ADC\n\ + ldrh r0, [r5]\n\ + cmp r0, r9\n\ + beq _08044AE6\n\ + cmp r0, 0\n\ + bne _08044B2E\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x3\n\ + b _08044B46\n\ + .align 2, 0\n\ +_08044AC4: .4byte 0x0000ff88\n\ +_08044AC8: .4byte gBattleTypeFlags\n\ +_08044ACC: .4byte 0x0000ffff\n\ +_08044AD0: .4byte gSprites\n\ +_08044AD4: .4byte 0x000003ff\n\ +_08044AD8: .4byte 0xfffffc00\n\ +_08044ADC:\n\ + ldr r1, [sp, 0x14]\n\ + lsls r0, r1, 24\n\ + asrs r0, 24\n\ + cmp r6, r0\n\ + blt _08044B14\n\ +_08044AE6:\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x1\n\ + mov r0, r12\n\ + ands r1, r0\n\ + mov r0, r8\n\ + ands r0, r3\n\ + orrs r0, r1\n\ + strh r0, [r2, 0x4]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r7\n\ + movs r1, 0x1\n\ + strh r1, [r0, 0x3C]\n\ + b _08044B52\n\ +_08044B14:\n\ + ldrh r0, [r5]\n\ + cmp r0, 0\n\ + bne _08044B2E\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x3\n\ + b _08044B46\n\ +_08044B2E:\n\ + ldr r0, [r5, 0x4]\n\ + cmp r0, 0\n\ + beq _08044B52\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x2\n\ +_08044B46:\n\ + mov r0, r12\n\ + ands r1, r0\n\ + mov r0, r8\n\ + ands r0, r3\n\ + orrs r0, r1\n\ + strh r0, [r2, 0x4]\n\ +_08044B52:\n\ + adds r4, 0x1\n\ + adds r5, 0x8\n\ + adds r6, 0x1\n\ + cmp r6, 0x5\n\ + ble _08044A9A\n\ + b _08044C38\n\ +_08044B5E:\n\ + movs r6, 0\n\ + ldr r1, _08044BA4 @ =gBattleTypeFlags\n\ + mov r10, r1\n\ + ldr r2, _08044BA8 @ =0x0000ffff\n\ + mov r9, r2\n\ + ldr r7, _08044BAC @ =gSprites\n\ + ldr r3, _08044BB0 @ =0x000003ff\n\ + mov r12, r3\n\ + ldr r5, _08044BB4 @ =0xfffffc00\n\ + mov r8, r5\n\ + ldr r5, [sp, 0xC]\n\ + mov r4, sp\n\ + adds r4, 0x5\n\ +_08044B78:\n\ + mov r0, r10\n\ + ldrh r1, [r0]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08044BB8\n\ + ldrh r0, [r5]\n\ + cmp r0, r9\n\ + beq _08044BC2\n\ + cmp r0, 0\n\ + bne _08044C0A\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x3\n\ + b _08044C22\n\ + .align 2, 0\n\ +_08044BA4: .4byte gBattleTypeFlags\n\ +_08044BA8: .4byte 0x0000ffff\n\ +_08044BAC: .4byte gSprites\n\ +_08044BB0: .4byte 0x000003ff\n\ +_08044BB4: .4byte 0xfffffc00\n\ +_08044BB8:\n\ + ldr r1, [sp, 0x14]\n\ + lsls r0, r1, 24\n\ + asrs r0, 24\n\ + cmp r6, r0\n\ + blt _08044BF0\n\ +_08044BC2:\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x1\n\ + mov r0, r12\n\ + ands r1, r0\n\ + mov r0, r8\n\ + ands r0, r3\n\ + orrs r0, r1\n\ + strh r0, [r2, 0x4]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r7\n\ + movs r1, 0x1\n\ + strh r1, [r0, 0x3C]\n\ + b _08044C2E\n\ +_08044BF0:\n\ + ldrh r0, [r5]\n\ + cmp r0, 0\n\ + bne _08044C0A\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x3\n\ + b _08044C22\n\ +_08044C0A:\n\ + ldr r0, [r5, 0x4]\n\ + cmp r0, 0\n\ + beq _08044C2E\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x2\n\ +_08044C22:\n\ + mov r0, r12\n\ + ands r1, r0\n\ + mov r0, r8\n\ + ands r0, r3\n\ + orrs r0, r1\n\ + strh r0, [r2, 0x4]\n\ +_08044C2E:\n\ + subs r4, 0x1\n\ + adds r5, 0x8\n\ + adds r6, 0x1\n\ + cmp r6, 0x5\n\ + ble _08044B78\n\ +_08044C38:\n\ + ldr r0, _08044C98 @ =TaskDummy\n\ + movs r1, 0x5\n\ + bl CreateTask\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + ldr r2, _08044C9C @ =gTasks\n\ + lsls r3, r4, 2\n\ + adds r1, r3, r4\n\ + lsls r1, 3\n\ + adds r0, r1, r2\n\ + mov r5, sp\n\ + ldrh r5, [r5, 0x8]\n\ + strh r5, [r0, 0x8]\n\ + mov r6, sp\n\ + ldrh r6, [r6, 0x18]\n\ + strh r6, [r0, 0xA]\n\ + movs r6, 0\n\ + adds r0, r2, 0\n\ + adds r0, 0xE\n\ + adds r1, r0\n\ +_08044C62:\n\ + mov r5, sp\n\ + adds r0, r5, r6\n\ + ldrb r0, [r0]\n\ + strh r0, [r1]\n\ + adds r1, 0x2\n\ + adds r6, 0x1\n\ + cmp r6, 0x5\n\ + ble _08044C62\n\ + adds r0, r3, r4\n\ + lsls r0, 3\n\ + adds r0, r2\n\ + ldrh r6, [r5, 0x10]\n\ + strh r6, [r0, 0x1C]\n\ + movs r0, 0x72\n\ + movs r1, 0\n\ + bl PlaySE12WithPanning\n\ + adds r0, r4, 0\n\ + add sp, 0x28\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08044C98: .4byte TaskDummy\n\ +_08044C9C: .4byte gTasks\n\ + .syntax divided\n"); +} +#endif + +void sub_8044CA0(u8 taskId) +{ + u8 sp[6]; + u8 r9; + u8 r10; + u8 sp8; + s32 i; + + r9 = gTasks[taskId].data[10]; + r10 = gTasks[taskId].data[1]; + sp8 = gTasks[taskId].data[0]; + for (i = 0; i < 6; i++) + sp[i] = gTasks[taskId].data[3 + i]; + + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 0x10; + gTasks[taskId].data[15] = 16; + for (i = 0; i < 6; i++) + gSprites[sp[i]].oam.objMode = 1; + gSprites[r10].oam.objMode = 1; + if (r9 != 0) + { + for (i = 0; i < 6; i++) + { + if (GetBankSide(sp8) != 0) + { + gSprites[sp[5 - i]].data1 = 7 * i; + gSprites[sp[5 - i]].data3 = 0; + gSprites[sp[5 - i]].data4 = 0; + gSprites[sp[5 - i]].callback = sub_8045110; + } + else + { + gSprites[sp[i]].data1 = 7 * i; + gSprites[sp[i]].data3 = 0; + gSprites[sp[i]].data4 = 0; + gSprites[sp[i]].callback = sub_8045110; + } + } + gSprites[r10].data0 /= 2; + gSprites[r10].data1 = 0; + gSprites[r10].callback = sub_8045048; + SetSubspriteTables(&gSprites[r10], gSubspriteTables_820A6EC); + gTasks[taskId].func = sub_8044E74; + } + else + { + gTasks[taskId].func = sub_8044F70; + } +} + +static void sub_8044E74(u8 taskId) +{ + u16 temp = gTasks[taskId].data[11]++; + + if ((temp & 1) == 0) + { + gTasks[taskId].data[15]--; + if (gTasks[taskId].data[15] < 0) + return; + REG_BLDALPHA = (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8); + } + if (gTasks[taskId].data[15] == 0) + gTasks[taskId].func = sub_8044ECC; +} + +static void sub_8044ECC(u8 taskId) +{ + u8 sp[6]; + s32 i; + + gTasks[taskId].data[15]--; + if (gTasks[taskId].data[15] == -1) + { + u8 var = gTasks[taskId].data[1]; + + for (i = 0; i < 6; i++) + sp[i] = gTasks[taskId].data[3 + i]; + DestroySpriteAndFreeResources(&gSprites[var]); + DestroySpriteAndFreeResources(&gSprites[sp[0]]); + for (i = 1; i < 6; i++) + DestroySprite(&gSprites[sp[i]]); + } + else if (gTasks[taskId].data[15] == -3) + { + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyTask(taskId); + } +} + +static void sub_8044F70(u8 taskId) +{ + u8 sp[6]; + s32 i; + + gTasks[taskId].data[15]--; + // Same as above function except with this check. + if (gTasks[taskId].data[15] >= 0) + { + REG_BLDALPHA = (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8); + } + else if (gTasks[taskId].data[15] == -1) + { + u8 var = gTasks[taskId].data[1]; + + for (i = 0; i < 6; i++) + sp[i] = gTasks[taskId].data[3 + i]; + DestroySpriteAndFreeResources(&gSprites[var]); + DestroySpriteAndFreeResources(&gSprites[sp[0]]); + for (i = 1; i < 6; i++) + DestroySprite(&gSprites[sp[i]]); + } + else if (gTasks[taskId].data[15] == -3) + { + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyTask(taskId); + } +} + +void sub_8045030(struct Sprite *sprite) +{ + if (sprite->pos2.x != 0) + sprite->pos2.x += sprite->data0; +} + +static void sub_8045048(struct Sprite *sprite) +{ + sprite->data1 += 32; + if (sprite->data0 > 0) + sprite->pos2.x += sprite->data1 >> 4; + else + sprite->pos2.x -= sprite->data1 >> 4; + sprite->data1 &= 0xF; +} + +void sub_804507C(struct Sprite *sprite) +{ + u8 r3; + u16 r2; + s8 pan; + + if (sprite->data1 > 0) + { + sprite->data1--; + return; + } + r3 = sprite->data2; + r2 = sprite->data3; + r2 += 56; + sprite->data3 = r2 & 0xFFF0; + if (r3 != 0) + { + sprite->pos2.x += r2 >> 4; + if (sprite->pos2.x > 0) + sprite->pos2.x = 0; + } + else + { + sprite->pos2.x -= r2 >> 4; + if (sprite->pos2.x < 0) + sprite->pos2.x = 0; + } + if (sprite->pos2.x == 0) + { + pan = 63; + if (r3 != 0) + pan = -64; + if (sprite->data7 != 0) + PlaySE2WithPanning(SE_TB_KARA, pan); + else + PlaySE1WithPanning(SE_TB_KON, pan); + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_8045110(struct Sprite *sprite) +{ + u8 r0; + u16 r2; + + if (sprite->data1 > 0) + { + sprite->data1--; + return; + } + r0 = sprite->data2; + r2 = sprite->data3; + r2 += 56; + sprite->data3 = r2 & 0xFFF0; + if (r0 != 0) + sprite->pos2.x += r2 >> 4; + else + sprite->pos2.x -= r2 >> 4; + if (sprite->pos2.x + sprite->pos1.x > 248 + || sprite->pos2.x + sprite->pos1.x < -8) + { + sprite->invisible = TRUE; + sprite->callback = SpriteCallbackDummy; + } +} + +void sub_8045180(struct Sprite *sprite) +{ + u8 spriteId = sprite->data0; + + sprite->pos2.x = gSprites[spriteId].pos2.x; + sprite->pos2.y = gSprites[spriteId].pos2.y; +} + +static void sub_80451A0(u8 a, struct Pokemon *pkmn) +{ + u8 nickname[POKEMON_NAME_LENGTH]; + u8 gender; + u16 species; + u8 language; + u8 *ptr; + s32 i; + s32 _7; + u8 *const *r1; + + StringCopy(gDisplayedStringBattle, gUnknown_0820A8B0); + GetMonData(pkmn, MON_DATA_NICKNAME, nickname); + StringGetEnd10(nickname); + ptr = StringCopy(gDisplayedStringBattle + 3, nickname); + ptr[0] = EXT_CTRL_CODE_BEGIN; + ptr[1] = 3; + ptr[2] = 2; + ptr[3] = EXT_CTRL_CODE_BEGIN; + ptr[4] = 1; + ptr += 5; + gender = GetMonGender(pkmn); + species = GetMonData(pkmn, MON_DATA_SPECIES); + language = GetMonData(pkmn, MON_DATA_LANGUAGE); + if (sub_8040D3C(species, nickname, language)) + gender = 100; + switch (gender) + { + default: + ptr[0] = 0xB; + ptr[1] = EOS; + ptr += 1; + break; + case MON_MALE: + ptr[0] = 0xB; + ptr[1] = CHAR_MALE; + ptr[2] = EOS; + ptr += 2; + break; + case MON_FEMALE: + ptr[0] = 0xA; + ptr[1] = CHAR_FEMALE; + ptr[2] = EOS; + ptr += 2; + break; + } + ptr[0] = EXT_CTRL_CODE_BEGIN; + ptr[1] = 0x13; + ptr[2] = 0x37; + ptr[3] = EOS; + ptr = (u8 *)0x02000520 + GetBankIdentity(gSprites[a].data6) * 0x180; + sub_80034D4(ptr, gDisplayedStringBattle); + + i = 0; + _7 = 7; + if (GetMonData(pkmn, MON_DATA_LANGUAGE) == 1 + && GetMonData(pkmn, MON_DATA_IS_EGG) == 0) + { + u8 *p = gDisplayedStringBattle; + + while (*p != EOS) + { + if (*p == EXT_CTRL_CODE_BEGIN) + { + p += GetExtCtrlCodeLength(p[1]) + 1; + } + else + { + u8 r0; + + if ((*p >= 0x37 && *p <= 0x4A) || (*p >= 0x87 && *p <= 0x9A)) + r0 = 0x2C; + else if ((*p >= 0x4B && *p <= 0x4F) || (*p >= 0x9B && *p <= 0x9F)) + r0 = 0x2D; + else + r0 = 0x2B; + + CpuCopy32(sub_8043CDC(r0), ptr + 0x40 * i, 32); + i++; + p++; + } + } + } + + for (; i < _7; i++) + CpuCopy32(sub_8043CDC(0x2B), ptr + 64 * i, 32); + + if (GetBankSide(gSprites[a].data6) == 0 && !IsDoubleBattle()) + { + r1 = (u8 *const *)gUnknown_0820A8B4; + for (i = 0; i < _7; i++) + { + u8 *r4 = r1[i]; + + r4 += gSprites[a].oam.tileNum * 32; + CpuCopy32(ptr, r4, 32); + ptr += 32; + + r4 += 0x100; + CpuCopy32(ptr, r4, 32); + ptr += 32; + } + } + else + { + if (GetBankSide(gSprites[a].data6) == 0) + r1 = (u8 *const *)gUnknown_0820A904; + else + r1 = (u8 *const *)gUnknown_0820A8DC; + for (i = 0; i < _7; i++) + { + u8 *r4 = r1[i]; + + r4 += gSprites[a].oam.tileNum * 32; + CpuCopy32(ptr, r4, 32); + ptr += 32; + + r4 += 0x100; + CpuCopy32(ptr, r4, 32); + ptr += 32; + } + } +} + +static void sub_8045458(u8 a, u8 b) +{ + u8 r4; + + if (gBattleTypeFlags & 0x200) + return; + if (gBattleTypeFlags & 8) + return; + + r4 = gSprites[a].data6; + if (GetBankSide(r4) != 0) + { + u16 species = GetMonData(&gEnemyParty[gBattlePartyID[r4]], MON_DATA_SPECIES); + if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(species), 1) != 0) + { + r4 = gSprites[a].data5; + if (b != 0) + CpuCopy32(sub_8043CDC(0x46), (void *)(OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 8) * 32), 32); + else + CpuFill32(0, (void *)(OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 8) * 32), 32); + } + } +} + +static void draw_status_ailment_maybe(u8 a) +{ + s32 r4; + s32 r4_2; + u8 r7; + u8 r10; + s16 r8; + const u8 *r6; + u8 r0; + s32 i; + + r7 = gSprites[a].data6; + r10 = gSprites[a].data5; + if (GetBankSide(r7) == 0) + { + r4 = GetMonData(&gPlayerParty[gBattlePartyID[r7]], MON_DATA_STATUS); + if (!IsDoubleBattle()) + r8 = 0x1A; + else + r8 = 0x12; + } + else + { + r4 = GetMonData(&gEnemyParty[gBattlePartyID[r7]], MON_DATA_STATUS); + r8 = 0x11; + } + if (r4 & 7) + { + r6 = sub_8043CDC(sub_80457E8(0x1B, r7)); + r0 = 2; + } + else if (r4 & 0x88) + { + r6 = sub_8043CDC(sub_80457E8(0x15, r7)); + r0 = 0; + } + else if (r4 & 0x10) + { + r6 = sub_8043CDC(sub_80457E8(0x21, r7)); + r0 = 4; + } + else if (r4 & 0x20) + { + r6 = sub_8043CDC(sub_80457E8(0x1E, r7)); + r0 = 3; + } + else if (r4 & 0x40) + { + r6 = sub_8043CDC(sub_80457E8(0x18, r7)); + r0 = 1; + } + else + { + r6 = sub_8043CDC(0x27); + + for (i = 0; i < 3; i++) + CpuCopy32(r6, (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + r8 + i) * 32), 32); + + if (!ewram17800[r7].unk0_4) + CpuCopy32(sub_8043CDC(1), (void *)(OBJ_VRAM0 + gSprites[r10].oam.tileNum * 32), 64); + + sub_8045458(a, 1); + return; + } + + r4_2 = gSprites[a].oam.paletteNum * 16; + r4_2 += r7 + 12; + // I don't like writing the array index like this, but I can't get it to match otherwise. + FillPalette(r0[gBattleInterfaceStatusIcons_DynPal], r4_2 + 0x100, 2); + CpuCopy16(gPlttBufferUnfaded + 0x100 + r4_2, (void *)(OBJ_PLTT + r4_2 * 2), 2); + CpuCopy32(r6, (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + r8) * 32), 96); + if (IsDoubleBattle() == TRUE || GetBankSide(r7) == TRUE) + { + if (!ewram17800[r7].unk0_4) + { + CpuCopy32(sub_8043CDC(0), (void *)(OBJ_VRAM0 + gSprites[r10].oam.tileNum * 32), 32); + CpuCopy32(sub_8043CDC(0x41), (void *)(OBJ_VRAM0 + (gSprites[r10].oam.tileNum + 1) * 32), 32); + } + } + sub_8045458(a, 0); +} + +static u8 sub_80457E8(u8 a, u8 b) +{ + u8 ret = a; + + switch (a) + { + case 21: + if (b == 0) + ret = 21; + else if (b == 1) + ret = 71; + else if (b == 2) + ret = 86; + else + ret = 101; + break; + case 24: + if (b == 0) + ret = 24; + else if (b == 1) + ret = 74; + else if (b == 2) + ret = 89; + else + ret = 104; + break; + case 27: + if (b == 0) + ret = 27; + else if (b == 1) + ret = 77; + else if (b == 2) + ret = 92; + else + ret = 107; + break; + case 30: + if (b == 0) + ret = 30; + else if (b == 1) + ret = 80; + else if (b == 2) + ret = 95; + else + ret = 110; + break; + case 33: + if (b == 0) + ret = 33; + else if (b == 1) + ret = 83; + else if (b == 2) + ret = 98; + else + ret = 113; + break; + } + return ret; +} + +static void sub_80458B0(u8 a) +{ + u8 *r6; + u8 r8; + u8 i; + s32 r7; + u8 *addr; + + r6 = (u8 *)0x02000520 + GetBankIdentity(gSprites[a].data6) * 0x180; + r8 = 7; + sub_80034D4(r6, BattleText_SafariBalls); + for (i = 0; i < r8; i++) + CpuCopy32(sub_8043CDC(0x2B), r6 + i * 64, 32); + for (r7 = 3; r7 < 3 + r8; r7++) + { + addr = (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + MACRO1(r7)) * 32); + CpuCopy32(r6, addr, 32); + r6 += 32; + + addr = (void *)(OBJ_VRAM0 + (8 + gSprites[a].oam.tileNum + MACRO1(r7)) * 32); + CpuCopy32(r6, addr, 32); + r6 += 32; + } + +} + +static void sub_8045998(u8 a) +{ + u8 *r7; + u8 status; + s32 r6; + s32 i; + + r7 = StringCopy(gDisplayedStringBattle, BattleText_SafariBallsLeft); + r7 = sub_8003504(r7, gNumSafariBalls, 10, 1); + StringAppend(r7, BattleText_HighlightRed); + status = GetBankIdentity(gSprites[a].data6); + r7 = (u8 *)0x02000520 + status * 0x180; + r6 = 5; + sub_80034D4(r7, gDisplayedStringBattle); + r7 = (u8 *)0x02000520 + status * 0x180 + 32; + for (i = 6; i < 6 + r6; i++) + { + CpuCopy32(r7, (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + 0x18 + MACRO1(i)) * 32), 32); + r7 += 64; + } +} + +void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) +{ + u8 r10; + u32 maxhp; + u32 currhp; + + r10 = gSprites[a].data6; + if (GetBankSide(r10) == 0) + { + if (c == 3 || c == 0) + sub_8043FC0(a, GetMonData(pkmn, MON_DATA_LEVEL)); + if (c == 1 || c == 0) + sub_80440EC(a, GetMonData(pkmn, MON_DATA_HP), 0); + if (c == 2 || c == 0) + sub_80440EC(a, GetMonData(pkmn, MON_DATA_MAX_HP), 1); + if (c == 5 || c == 0) + { + load_gfxc_health_bar(0); + maxhp = GetMonData(pkmn, MON_DATA_MAX_HP); + currhp = GetMonData(pkmn, MON_DATA_HP); + sub_8043D84(r10, a, maxhp, currhp, 0); + sub_8045C78(r10, a, 0, 0); + } + if (!IsDoubleBattle() && (c == 6 || c == 0)) + { + u16 species; + u8 level; + u32 exp; + u32 var1; + u32 var2; + u32 currLevelExp; + + load_gfxc_health_bar(3); + species = GetMonData(pkmn, MON_DATA_SPECIES); + level = GetMonData(pkmn, MON_DATA_LEVEL); + exp = GetMonData(pkmn, MON_DATA_EXP); + currLevelExp = gExperienceTables[gBaseStats[species].growthRate][level]; + var1 = exp - currLevelExp; + var2 = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLevelExp; + sub_8043D84(r10, a, var2, var1, 0); + sub_8045C78(r10, a, 1, 0); + } + if (c == 4 || c == 0) + sub_80451A0(a, pkmn); + if (c == 9 || c == 0) + draw_status_ailment_maybe(a); + if (c == 10) + sub_80458B0(a); + if (c == 10 || c == 11) + sub_8045998(a); + } + else + { + if (c == 3 || c == 0) + sub_8043FC0(a, GetMonData(pkmn, MON_DATA_LEVEL)); + if (c == 5 || c == 0) + { + load_gfxc_health_bar(0); + maxhp = GetMonData(pkmn, MON_DATA_MAX_HP); + currhp = GetMonData(pkmn, MON_DATA_HP); + sub_8043D84(r10, a, maxhp, currhp, 0); + sub_8045C78(r10, a, 0, 0); + } + if (c == 4 || c == 0) + sub_80451A0(a, pkmn); + if (c == 9 || c == 0) + draw_status_ailment_maybe(a); + } +} + +s32 sub_8045C78(u8 a, u8 unused1, u8 c, u8 unused2) +{ + s32 r6; + + if (c == 0) + { + r6 = sub_8045F58(ewram17850[a].unk4, ewram17850[a].unk8, ewram17850[a].unkC, &ewram17850[a].unk10, 6, 1); + } + else + { + u16 r5; + s32 r8; + + r5 = GetScaledExpFraction(ewram17850[a].unk8, ewram17850[a].unkC, ewram17850[a].unk4, 8); + if (r5 == 0) + r5 = 1; + r8 = ewram17850[a].unkC; + r5 = ABS(r8 / r5); + r6 = sub_8045F58(ewram17850[a].unk4, ewram17850[a].unk8, r8, &ewram17850[a].unk10, 8, r5); + } + if (c == 1 || (c == 0 && (!ewram17800[a].unk0_4))) + sub_8045D58(a, c); + if (r6 == -1) + ewram17850[a].unk10 = 0; + return r6; +} + +static void sub_8045D58(u8 a, u8 b) +{ + u8 sp8[7]; + u8 r0; + u8 r8; + u8 i; + + switch (b) + { + case 0: + r0 = sub_804602C(ewram17850[a].unk4, ewram17850[a].unk8, ewram17850[a].unkC, &ewram17850[a].unk10, sp8, 6); + r8 = 3; + if (r0 <= 0x18) + { + r8 = 0x38; + if (r0 > 9) + r8 = 0x2F; + } + for (i = 0; i < 6; i++) + { + u8 r4 = gSprites[ewram17850[a].unk0].data5; + if (i < 2) + CpuCopy32(sub_8043CDC(r8) + sp8[i] * 32, (void *)(OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 2 + i) * 32), 32); + else + CpuCopy32(sub_8043CDC(r8) + sp8[i] * 32, (void *)(OBJ_VRAM0 + 64 + (i + gSprites[r4].oam.tileNum) * 32), 32); + } + break; + case 1: + sub_804602C(ewram17850[a].unk4, ewram17850[a].unk8, ewram17850[a].unkC, &ewram17850[a].unk10, sp8, 8); + r0 = GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_LEVEL); + if (r0 == 100) + { + for (i = 0; i < 8; i++) + sp8[i] = 0; + } + for (i = 0; i < 8; i++) + { + if (i < 4) + CpuCopy32(sub_8043CDC(0xC) + sp8[i] * 32, (void *)(OBJ_VRAM0 + (gSprites[ewram17850[a].unk0].oam.tileNum + 0x24 + i) * 32), 32); + else + CpuCopy32(sub_8043CDC(0xC) + sp8[i] * 32, (void *)(OBJ_VRAM0 + 0xB80 + (i + gSprites[ewram17850[a].unk0].oam.tileNum) * 32), 32); + } + break; + } +} + +static int sub_8045F58(s32 a, s32 b, int c, int *d, u8 e, u16 f) +{ + u8 r2 = e << 3; + int r6; + int ret; + + if (*d == -32768) + { + if (a < r2) + *d = b << 8; + else + *d = b; + } + //_08045F8A + b -= c; + if (b < 0) + b = 0; + else if (b > a) + b = a; + if (a < r2) + { + int var = *d >> 8; + + r6 = *d; + if (b == var && (r6 & 0xFF) == 0) + return -1; + } + else + { + r6 = *d; + if (b == r6) + return -1; + } + //_08045FC4 + if (a < r2) + { + int r0 = (a << 8) / r2; + + if (c < 0) + { + *d = r6 + r0; + ret = *d >> 8; + if (ret >= b) + { + *d = b << 8; + ret = b; + } + } + //_08045FE2 + else + { + *d = r6 - r0; + ret = *d >> 8; + if ((*d & 0xFF) > 0) + ret++; + if (ret <= b) + { + *d = b << 8; + ret = b; + } + } + } + else + { + //_08045FFE + if (c < 0) + { + *d += f; + if (*d > b) + *d = b; + ret = *d; + } + //_08046010 + else + { + *d -= f; + if (*d < b) + *d = b; + ret = *d; + } + } + return ret; +} + +static u8 sub_804602C(int a, int b, int c, int *d, u8 *e, u8 f) +{ + s32 r5 = b - c; + u8 r3; + u8 i; + u8 r2; + + if (r5 < 0) + r5 = 0; + else if (r5 > a) + r5 = a; + r3 = f << 3; + for (i = 0; i < f; i++) + e[i] = 0; + if (a < r3) + r2 = *d * r3 / a >> 8; + else + r2 = *d * r3 / a; + r3 = r2; + if (r3 == 0 && r5 > 0) + { + e[0] = 1; + r3 = 1; + } + else + { + for (i = 0; i < f; i++) + { + if (r2 >= 8) + { + e[i] = 8; + } + else + { + e[i] = r2; + break; + } + r2 -= 8; + } + } + return r3; +} + +s16 sub_80460C8(struct BattleInterfaceStruct1 *a, int *b, void *c, int d) +{ + u16 r7; + s16 r1; + + r7 = sub_8045F58(a->unk0, a->unk4, a->unk8, b, 6, 1); + sub_8046128(a, b, c); + if (a->unk0 < 0x30) + r1 = *b >> 8; + else + r1 = *b; + do_nothing(a->unk0, r1, d); + return r7; +} + +static void sub_8046128(struct BattleInterfaceStruct1 *a, int *b, void *c) +{ + u8 sp8[6]; + u16 sp10[6]; + u8 i; + + sub_804602C(a->unk0, a->unk4, a->unk8, b, (u8 *)sp8, 6); + for (i = 0; i < 6; i++) + sp10[i] = (a->unkC_0 << 12) | (a->unk10 + sp8[i]); + CpuCopy16(sp10, c, sizeof(sp10)); +} + +static u8 GetScaledExpFraction(int a, int b, int c, u8 d) +{ + u8 r7 = d * 8; + int r5 = a - b; + s8 r4; + s8 r0; + s32 result; + + if (r5 < 0) + r5 = 0; + else if (r5 > c) + r5 = c; + + r4 = a * r7 / c; + r0 = r5 * r7 / c; + result = r4 - r0; + return ABS(result); +} + +u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale) +{ + u8 result = hp * scale / maxhp; + + if (result == 0 && hp > 0) + return 1; + return result; +} + +u8 GetHPBarLevel(s16 hp, s16 maxhp) +{ + int result; + + if (hp == maxhp) + result = 4; + else + { + u8 fraction = GetScaledHPFraction(hp, maxhp, 48); + if (fraction > 24) + result = 3; + else if (fraction > 9) + result = 2; + else if (fraction > 0) + result = 1; + else + result = 0; + } + return result; +} diff --git a/src/battle/battle_party_menu.c b/src/battle/battle_party_menu.c new file mode 100644 index 000000000..73b847713 --- /dev/null +++ b/src/battle/battle_party_menu.c @@ -0,0 +1,756 @@ +#include "global.h" +#include "battle_party_menu.h" +#include "battle.h" +#include "item_menu.h" +#include "item_use.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "palette.h" +#include "party_menu.h" +#include "pokemon.h" +#include "pokemon_summary_screen.h" +#include "rom_8077ABC.h" +#include "rom_8094928.h" +#include "songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" + +extern u8 ewram[]; +#define UNK_201606C_ARRAY (ewram + 0x1606C) // lazy define but whatever. + +extern u8 IsLinkDoubleBattle(void); +extern void TryCreatePartyMenuMonIcon(u8, u8, struct Pokemon *); +extern void LoadHeldItemIconGraphics(void); +extern void CreateHeldItemIcons_806DC34(); +extern u8 sub_806BD58(u8, u8); +extern void PartyMenuPrintMonsLevelOrStatus(void); +extern void PrintPartyMenuMonNicknames(void); +extern void PartyMenuTryPrintMonsHP(void); +extern void nullsub_13(void); +extern void PartyMenuDrawHPBars(void); +extern u8 sub_806B58C(u8); +extern u8 GetItemEffectType(); +extern void sub_806E750(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, int); +extern u16 sub_806BD80(); +extern u8 sub_806CA38(); +extern void sub_806D5A4(void); +extern void sub_802E414(void); +extern void sub_80A6DCC(void); +extern void sub_806AF4C(); +extern u8 sub_80F9344(void); +extern u8 sub_806B124(void); +extern void sub_806C994(); +extern void sub_806BF74(); +extern void sub_806AEDC(void); +extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, u8); +extern void sub_806E7D0(u8, const struct PartyPopupMenu *); +extern u8 *sub_8040D08(); +extern void sub_8040B8C(void); +extern void sub_806E6F0(); +extern void sub_806D538(); +extern void nullsub_14(); +extern void OpenPartyMenu(); +extern u8 sub_803FBBC(void); + +extern u8 gPlayerPartyCount; +extern u8 gNoOfAllBanks; +extern u16 gBattlePartyID[]; +extern u8 gBankInMenu; +extern u8 gUnknown_0202E8F4; +extern u8 gUnknown_0202E8F5; +extern u8 gUnknown_0202E8F6; +extern u8 gUnknown_02038470[3]; +extern u8 gUnknown_02038473; +extern u8 gUnknown_020384F0; +extern void (*gUnknown_03004AE4)(); //don't know types yet +extern struct PokemonStorage gPokemonStorage; +extern void nullsub_14(); + +void sub_8094C98(u8, u8); +u8 pokemon_order_func(u8); + +static void sub_8094998(u8[3], u8); +static void sub_8094A74(u8[3], u8, u32); +static void sub_8094D60(void); +static void Task_809527C(u8); +static void Task_80952B4(u8); +static void Task_80952E4(u8); +static void Task_8095330(u8); +static void Task_809538C(void); +static void Task_HandlePopupMenuInput(u8); +static void Task_BattlePartyMenuSummary(u8 taskId); +static void Task_BattlePartyMenuShift(u8 taskId); +static void Task_BattlePartyMenuCancel(u8 taskId); + +static const struct PartyMenuItem sBattlePartyMenuActions[] = +{ + {OtherText_Summary, Task_BattlePartyMenuSummary}, + {gOtherText_CancelNoTerminator, Task_BattlePartyMenuCancel}, + {OtherText_Shift, Task_BattlePartyMenuShift}, + {OtherText_SendOut, Task_BattlePartyMenuShift}, +}; +static const u8 Unknown_83B5FEC[] = {2, 0, 1}; //SHIFT, SUMMARY, CANCEL +static const u8 Unknown_83B5FEF[] = {3, 0, 1}; //SEND OUT, SUMMARY, CANCEL +static const u8 Unknown_83B5FF2[] = {0, 1}; //SUMMARY, CANCEL +static const struct PartyPopupMenu sBattlePartyPopupMenus[] = +{ + {ARRAY_COUNT(Unknown_83B5FEC), 9, Unknown_83B5FEC}, + {ARRAY_COUNT(Unknown_83B5FEF), 9, Unknown_83B5FEF}, + {ARRAY_COUNT(Unknown_83B5FF2), 9, Unknown_83B5FF2}, +}; + +void unref_sub_8094928(struct PokemonStorage *ptr) +{ + *ptr = gPokemonStorage; +} + +void unref_sub_8094940(struct PokemonStorage *ptr) +{ + gPokemonStorage = *ptr; +} + +void sub_8094958(void) +{ + sub_8094998(gUnknown_02038470, sub_803FBBC()); +} + +void sub_8094978(u8 arg1, u8 arg2) +{ + sub_8094A74((UNK_201606C_ARRAY) + arg1 * 3, arg2, arg1); +} + +static void sub_8094998(u8 arg[3], u8 player_number) +{ + int i; + u32 pos; + u8 temp[6]; + if (IsLinkDoubleBattle() == TRUE) + { + if (player_number) + { + *arg = 0x30; + arg[1] = 0x45; + arg[2] = 0x12; + } + else + { + *arg = 0x03; + arg[1] = 0x12; + arg[2] = 0x45; + } + } + else + { + if (!IsDoubleBattle()) + { + pos = 1; + *temp = gBattlePartyID[GetBankByPlayerAI(0)]; + for (i = 0; i <= 5; i++) + if (i != *temp) + temp[pos++] = i; + } + else + { + pos = 2; + *temp = gBattlePartyID[GetBankByPlayerAI(0)]; + temp[1] = gBattlePartyID[GetBankByPlayerAI(2)]; + for (i = 0; i <= 5; i++) + if ((i != *temp) && (i != temp[1])) + temp[pos++] = i; + } + for (i = 0; i <= 2; i++) + arg[i] = (temp[i << 1] << 4) | temp[(i << 1) + 1]; + } +} + +static void sub_8094A74(u8 arg[3], u8 player_number, u32 arg3) +{ + int i, j; + u8 temp[6]; + if (!GetBankSide(arg3)) + { + i = GetBankByPlayerAI(0); + j = GetBankByPlayerAI(2); + } + else + { + i = GetBankByPlayerAI(1); + j = GetBankByPlayerAI(3); + } + if (IsLinkDoubleBattle() == TRUE) + { + if (player_number) + { + *arg = 0x30; + arg[1] = 0x45; + arg[2] = 0x12; + } + else + { + *arg = 0x03; + arg[1] = 0x12; + arg[2] = 0x45; + } + } + else + { + if (!IsDoubleBattle()) + { + int pos = 1; + *temp = gBattlePartyID[i]; + for (i = 0; i <= 5; i++) + if (i != *temp) + temp[pos++] = i; + } + else + { + int pos = 2; + *temp = gBattlePartyID[i]; + temp[1] = gBattlePartyID[j]; + for (i = 0; i <= 5; i++) + if ((i != *temp) && (i != temp[1])) + temp[pos++] = i; + } + for (i = 0; i <= 2; i++) + arg[i] = (temp[i << 1] << 4) | temp[(i << 1) + 1]; + } +} + +void sub_8094B6C(u8 a, u8 b, u8 c) +{ + s32 i; + s32 j; + u8 temp[6]; + u8 r3; + u8 r7 = 0; + + if (IsLinkDoubleBattle()) + { + u8 *arr = ewram + 0x1606C + a * 3; + + for (i = 0, j = 0; i < 3; i++) + { + temp[j++] = arr[i] >> 4; + temp[j++] = arr[i] & 0xF; + } + r3 = temp[c]; + for (i = 0; i < 6; i++) + { + if (temp[i] == b) + { + r7 = temp[i]; + temp[i] = r3; + break; + } + } + if (i != 6) + { + temp[c] = r7; + + arr[0] = (temp[0] << 4) | temp[1]; + arr[1] = (temp[2] << 4) | temp[3]; + arr[2] = (temp[4] << 4) | temp[5]; + } + } +} + +u8 sub_8094C20(u8 a) +{ + u8 retVal; + u8 val = a & 1; + + a /= 2; + if (val) + retVal = gUnknown_02038470[a] & 0xF; + else + retVal = gUnknown_02038470[a] >> 4; + return retVal; +} + +void sub_8094C54(u8 a, u8 b) +{ + u8 val = a & 1; + + a /= 2; + if (val) + gUnknown_02038470[a] = (gUnknown_02038470[a] & 0xF0) | b; + else + gUnknown_02038470[a] = (gUnknown_02038470[a] & 0xF) | (b << 4); +} + +void sub_8094C98(u8 a, u8 b) +{ + u8 r4 = sub_8094C20(a); + u8 r1 = sub_8094C20(b); + + sub_8094C54(a, r1); + sub_8094C54(b, r4); +} + +u8 pokemon_order_func(u8 a) +{ + u8 i; + u8 r2; + + for (i = 0, r2 = 0; i < 3; i++) + { + if ((gUnknown_02038470[i] >> 4) == a) + return r2; + r2++; + if ((gUnknown_02038470[i] & 0xF) == a) + return r2; + r2++; + } + return 0; +} + +void pokemon_change_order(void) +{ + u8 i; + + memcpy(ewram1B000.unk0, gPlayerParty, sizeof(gPlayerParty)); + for (i = 0; i < 6; i++) + { + u8 n = pokemon_order_func(i); + + memcpy(&gPlayerParty[n], &ewram1B000.unk0[i], sizeof(struct Pokemon)); + } +} + +static void sub_8094D60(void) +{ + struct Pokemon temp[6]; + u8 i; + + memcpy(temp, gPlayerParty, sizeof(gPlayerParty)); + for (i = 0; i < 6; i++) + { + u8 n = sub_8094C20(i); + + memcpy(&gPlayerParty[n], &temp[i], sizeof(struct Pokemon)); + } +} + +void unref_sub_8094DB0(void) +{ + u8 i; + u8 r4; + + for (i = 1; i < 6; i++) + { + u8 n = sub_8094C20(i); + + if (GetMonData(&gPlayerParty[n], MON_DATA_SPECIES) != 0 + && GetMonData(&gPlayerParty[n], MON_DATA_HP) != 0) + { + r4 = sub_8094C20(0); + sub_8094C98(0, i); + sub_806E6F0(&gPlayerParty[r4], &gPlayerParty[n]); + break; + } + } +} + +void sub_8094E20(u8 a) +{ + gPaletteFade.bufferTransferDisabled = TRUE; + gUnknown_02038473 = a; + nullsub_14(); + pokemon_change_order(); + OpenPartyMenu(1, 0xFF); +} + +void sub_8094E4C(void) +{ + sub_8094E20(3); +} + +int SetUpBattlePartyMenu(void) +{ + switch (EWRAM_1B000.unk264) + //switch (ewram1B000.unk264[0]) + { + case 0: + //TODO: try to get rid of this duplicate code + if (IsLinkDoubleBattle() == TRUE) + { + if (EWRAM_1B000.unk266 != 6) + { + TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); + EWRAM_1B000.unk266++; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264++; + } + } + else + { + if (EWRAM_1B000.unk266 < 6) + { + TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); + EWRAM_1B000.unk266++; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264++; + } + } + break; + case 1: + LoadHeldItemIconGraphics(); + EWRAM_1B000.unk264++; + break; + case 2: + CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); + EWRAM_1B000.unk264++; + break; + case 3: + if (sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) == 1) + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264++; + } + else + EWRAM_1B000.unk266++; + break; + case 4: + PartyMenuPrintMonsLevelOrStatus(); + EWRAM_1B000.unk264++; + break; + case 5: + PrintPartyMenuMonNicknames(); + EWRAM_1B000.unk264++; + break; + case 6: + PartyMenuTryPrintMonsHP(); + EWRAM_1B000.unk264++; + break; + case 7: + nullsub_13(); + EWRAM_1B000.unk264++; + break; + case 8: + PartyMenuDrawHPBars(); + EWRAM_1B000.unk264++; + break; + case 9: + if (sub_806B58C(EWRAM_1B000.unk266) == 1) + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264++; + } + else + EWRAM_1B000.unk266++; + break; + case 10: + if (gUnknown_02038473 == 3) + { + if (GetItemEffectType(gScriptItemId) == 10) + ewram1B000.unk259 = 0xFF; + else + ewram1B000.unk259 = 3; + } + return TRUE; + } + return FALSE; +} + +static void sub_8095050(u8 a, u8 b) +{ + if (!GetMonData(&gPlayerParty[b], MON_DATA_IS_EGG)) + { + if (gUnknown_02038473 == 1) + { + gTasks[EWRAM_1B000.unk260].data[4] = 1; + gTasks[EWRAM_1B000.unk260].data[5] = 1; + } + else + { + gTasks[EWRAM_1B000.unk260].data[4] = 0; + gTasks[EWRAM_1B000.unk260].data[5] = 0; + } + } + else + { + gTasks[EWRAM_1B000.unk260].data[4] = 2; + gTasks[EWRAM_1B000.unk260].data[5] = 2; + } + sub_806E750(gTasks[a].data[4], sBattlePartyPopupMenus, sBattlePartyMenuActions, 0); +} + +void SetUpBattlePokemonMenu(u8 a) +{ + if (!gPaletteFade.active) + { + if (gUnknown_02038473 == 3 && GetItemEffectType(gScriptItemId) == 10) + { + gUnknown_03004AE4(a, gScriptItemId, Task_80952E4); + return; + } + + switch (sub_806BD80(a)) + { + case 1: + if (gUnknown_02038473 == 3) + { + if (GetMonData(&gPlayerParty[sub_806CA38(a)], MON_DATA_IS_EGG)) + PlaySE(SE_HAZURE); + else + { + sub_806D5A4(); + gUnknown_03004AE4(a, gScriptItemId, Task_80952E4); + } + } + else + { + PlaySE(SE_SELECT); + GetMonNickname(&gPlayerParty[sub_806CA38(a)], gStringVar1); + sub_8095050(a, sub_806CA38(a)); + SetTaskFuncWithFollowupFunc(a, Task_HandlePopupMenuInput, SetUpBattlePokemonMenu); + } + break; + case 2: + if (gUnknown_02038473 == 1) + PlaySE(SE_HAZURE); + else + { + PlaySE(SE_SELECT); + if (gUnknown_02038473 == 3) + { + gUnknown_0202E8F4 = 0; + gTasks[a].func = Task_80952E4; + } + else + { + gUnknown_0202E8F4 = 0; + gTasks[a].func = Task_809527C; + } + } + break; + } + } +} + +static void Task_809527C(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = Task_80952B4; +} + +static void Task_80952B4(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_8094D60(); + DestroyTask(taskId); + SetMainCallback2(sub_802E414); + } +} + +static void Task_80952E4(u8 taskId) +{ + if (gUnknown_0202E8F4 != 0) + Task_809527C(taskId); + else + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = Task_8095330; + } +} + +static void Task_8095330(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_8094D60(); + DestroyTask(taskId); + sub_80A6DCC(); + } +} + +static void Task_809535C(void) +{ + gPaletteFade.bufferTransferDisabled = TRUE; + sub_806AF4C(1, 0xFF, SetUpBattlePokemonMenu, 5); + SetMainCallback2(Task_809538C); +} + +static void Task_809538C(void) +{ + do + { + if (sub_806B124() == 1) + { + sub_806C994(EWRAM_1B000.unk260, gUnknown_020384F0); + sub_806BF74(EWRAM_1B000.unk260, 0); + GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); + sub_8095050(EWRAM_1B000.unk260, gUnknown_020384F0); + SetTaskFuncWithFollowupFunc(EWRAM_1B000.unk260, Task_HandlePopupMenuInput, SetUpBattlePokemonMenu); + SetMainCallback2(sub_806AEDC); + return; + } + } while (sub_80F9344() != 1); +} + +static void Task_HandlePopupMenuInput(u8 taskId) +{ + TaskFunc func; + + if (!gPaletteFade.active) + { + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + return; + } + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + return; + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + func = PartyMenuGetPopupMenuFunc(gTasks[taskId].data[4], + sBattlePartyPopupMenus, + sBattlePartyMenuActions, + GetMenuCursorPos()); + func(taskId); + return; + } + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + Task_BattlePartyMenuCancel(taskId); + return; + } + } +} + +static void Task_80954C0(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + Task_BattlePartyMenuCancel(taskId); +} + +static void Task_ShowSummaryScreen(u8 taskId) +{ + u8 partySelection = sub_806CA38(taskId); + + if (!gPaletteFade.active) + { + DestroyTask(taskId); + EWRAM_1B000.unk262 = 1; + ShowPokemonSummaryScreen(gPlayerParty, partySelection, gPlayerPartyCount - 1, Task_809535C, 4); + } +} + +static void Task_BattlePartyMenuSummary(u8 taskId) +{ + sub_806CA38(taskId); //an unused variable was probably set with this. + gTasks[taskId].func = Task_ShowSummaryScreen; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +static void Task_BattlePartyMenuShift(u8 taskId) +{ + u8 partySelection; + u8 i; + u8 r4; + + sub_806E7D0(gTasks[taskId].data[4], sBattlePartyPopupMenus); + partySelection = sub_806CA38(taskId); + if (IsLinkDoubleBattle() == TRUE && (partySelection == 1 || partySelection == 4 || partySelection == 5)) + { + sub_806D5A4(); + StringCopy(gStringVar1, sub_8040D08()); + StringExpandPlaceholders(gStringVar4, gOtherText_CantSwitchPokeWithYours); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + if (GetMonData(&gPlayerParty[partySelection], MON_DATA_HP) == 0) + { + sub_806D5A4(); + GetMonNickname(&gPlayerParty[partySelection], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_NoEnergyLeft); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + for (i = 0; i < gNoOfAllBanks; i++) + { + if (GetBankSide(i) == 0 + && sub_8094C20(partySelection) == gBattlePartyID[i]) + { + sub_806D5A4(); + GetMonNickname(&gPlayerParty[partySelection], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyBattle); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + } + if (GetMonData(&gPlayerParty[partySelection], MON_DATA_IS_EGG)) + { + sub_806D5A4(); + StringExpandPlaceholders(gStringVar4, gOtherText_EGGCantBattle); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + if (sub_8094C20(partySelection) == EWRAM_1609D) + { + sub_806D5A4(); + GetMonNickname(&gPlayerParty[partySelection], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_AlreadySelected); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + if (gUnknown_02038473 == 4) + { + sub_806D5A4(); + sub_8040B8C(); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + if (gUnknown_02038473 == 2) + { + u8 r0; + u8 r4 = gBankInMenu; + + sub_806D5A4(); + r0 = pokemon_order_func(gBattlePartyID[r4]); + GetMonNickname(&gPlayerParty[r0], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_CantBeSwitched); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + gUnknown_0202E8F5 = sub_8094C20(partySelection); + gUnknown_0202E8F4 = 1; + r4 = pokemon_order_func(gBattlePartyID[gBankInMenu]); + sub_8094C98(r4, partySelection); + sub_806E6F0(&gPlayerParty[r4], &gPlayerParty[partySelection]); + gTasks[taskId].func = Task_809527C; +} + +static void Task_BattlePartyMenuCancel(u8 taskId) +{ + HandleDestroyMenuCursors(); + sub_806E7D0(gTasks[taskId].data[4], sBattlePartyPopupMenus); + gTasks[taskId].data[4] = gTasks[taskId].data[5]; + sub_806D538(0, 0); + SwitchTaskToFollowupFunc(taskId); +} diff --git a/src/battle/battle_records.c b/src/battle/battle_records.c new file mode 100644 index 000000000..61dc09792 --- /dev/null +++ b/src/battle/battle_records.c @@ -0,0 +1,334 @@ +#include "global.h" +#include "battle_records.h" +#include "game_stat.h" +#include "link.h" +#include "menu.h" +#include "rom4.h" +#include "string_util.h" +#include "strings2.h" +#include "trainer_card.h" + +extern struct LinkPlayerMapObject gLinkPlayerMapObjects[4]; +extern u8 gBattleOutcome; + +static void InitLinkBattleRecord(struct LinkBattleRecord *record) +{ + CpuFill16(0, record, sizeof(struct LinkBattleRecord)); + record->name[0] = 0xFF; + record->trainerId = 0; + record->wins = 0; + record->losses = 0; + record->draws = 0; +} + +static void InitLinkBattleRecords_(struct LinkBattleRecord *records) +{ + int i; + for (i = 0; i < 5; i++) + { + InitLinkBattleRecord(records + i); + } + SetGameStat(GAME_STAT_LINK_BATTLE_WINS, 0); + SetGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 0); + SetGameStat(GAME_STAT_LINK_BATTLE_DRAWS, 0); +} + +static int GetLinkBattleRecordTotalBattles(struct LinkBattleRecord *record) +{ + return record->wins + record->losses + record->draws; +} + +static int FindLinkBattleRecord(struct LinkBattleRecord *records, u8 *name, u16 trainerId) +{ + int i; + + for (i = 0; i < 5; i++) + { + memcpy(gStringVar1, records[i].name, 7); + gStringVar1[7] = EOS; + if (!StringCompareWithoutExtCtrlCodes(gStringVar1, name) && records[i].trainerId == trainerId) + return i; + } + + return 5; +} + +static void SortLinkBattleRecords(struct LinkBattleRecord *records) +{ + int i, j; + + for (i = 4; i > 0; i--) + { + for (j = i - 1; j >= 0; j--) + { + int totalBattlesI = GetLinkBattleRecordTotalBattles(records + i); + int totalBattlesJ = GetLinkBattleRecordTotalBattles(records + j); + + if (totalBattlesI > totalBattlesJ) + { + struct LinkBattleRecord temp = *(records + i); + *(records + i) = *(records + j); + *(records + j) = temp; + } + } + } +} + +static void UpdateLinkBattleRecord(struct LinkBattleRecord *record, int battleOutcome) +{ + switch (battleOutcome) + { + case 1: + record->wins++; + if (record->wins > 9999) + record->wins = 9999; + break; + case 2: + record->losses++; + if (record->losses > 9999) + record->losses = 9999; + break; + case 3: + record->draws++; + if (record->draws > 9999) + record->draws = 9999; + break; + } +} + +static void UpdateLinkBattleGameStats(int battleOutcome) +{ + u8 stat; + + switch (battleOutcome) + { + case 1: + stat = GAME_STAT_LINK_BATTLE_WINS; + break; + case 2: + stat = GAME_STAT_LINK_BATTLE_LOSSES; + break; + case 3: + stat = GAME_STAT_LINK_BATTLE_DRAWS; + break; + default: + return; + } + + if (GetGameStat(stat) < 9999) + IncrementGameStat(stat); +} + +static void UpdateLinkBattleRecords_(struct LinkBattleRecord *records, u8 *name, u16 trainerId, int battleOutcome, u8 language) +{ + int index; + UpdateLinkBattleGameStats(battleOutcome); + SortLinkBattleRecords(records); + index = FindLinkBattleRecord(records, name, trainerId); + if (index == 5) + { + index = 4; + InitLinkBattleRecord(records + index); + if (language == LANGUAGE_JAPANESE) + { + records[index].name[0] = EXT_CTRL_CODE_BEGIN; + records[index].name[1] = 0x15; + StringCopyN(records[index].name + 2, name, 5); + } + else + { + StringCopyN(records[index].name, name, 7); + } + + // needed block to match + { + struct LinkBattleRecord *record = records + index; + record->trainerId = trainerId; + } + } + UpdateLinkBattleRecord(records + index, battleOutcome); + SortLinkBattleRecords(records); +} + +void InitLinkBattleRecords(void) +{ + InitLinkBattleRecords_(gSaveBlock1.linkBattleRecords); +} + +static void IncTrainerCardWins(int id) +{ + u16 *wins = &gTrainerCards[id].linkBattleWins; + (*wins)++; + if (*wins > 9999) + *wins = 9999; +} + +static void IncTrainerCardLosses(int id) +{ + u16 *losses = &gTrainerCards[id].linkBattleLosses; + (*losses)++; + if (*losses > 9999) + *losses = 9999; +} + +static void UpdateTrainerCardWinsLosses(int id) +{ + switch (gBattleOutcome) + { + case 1: + IncTrainerCardWins(id ^ 1); + IncTrainerCardLosses(id); + break; + case 2: + IncTrainerCardLosses(id ^ 1); + IncTrainerCardWins(id); + break; + } +} + +void UpdateLinkBattleRecords(int id) +{ + UpdateTrainerCardWinsLosses(id); + UpdateLinkBattleRecords_( + gSaveBlock1.linkBattleRecords, + gTrainerCards[id].playerName, + gTrainerCards[id].trainerId, + gBattleOutcome, + gLinkPlayers[gLinkPlayerMapObjects[id].linkPlayerId].language); +} + +static void PrintLinkBattleWinsLossesDraws(struct LinkBattleRecord *records) +{ + ConvertIntToDecimalStringN_DigitWidth6(gStringVar1, GetGameStat(GAME_STAT_LINK_BATTLE_WINS), STR_CONV_MODE_RIGHT_ALIGN, 4); + ConvertIntToDecimalStringN_DigitWidth6(gStringVar2, GetGameStat(GAME_STAT_LINK_BATTLE_LOSSES), STR_CONV_MODE_RIGHT_ALIGN, 4); + ConvertIntToDecimalStringN_DigitWidth6(gStringVar3, GetGameStat(GAME_STAT_LINK_BATTLE_DRAWS), STR_CONV_MODE_RIGHT_ALIGN, 4); + MenuPrint(gOtherText_WinRecord, 3, 3); +} + +static void PrintLinkBattleRecord(struct LinkBattleRecord *record, u8 y) +{ + if (!record->wins && !record->losses && !record->draws) + { + u8 buffer[16]; + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x14; + buffer[2] = 6; + buffer[3] = EXT_CTRL_CODE_BEGIN; + buffer[4] = 0x11; + buffer[5] = 1; + StringCopy(buffer + 6, gOtherText_SevenDashes); + MenuPrint(buffer, 3, y); + StringCopy(buffer + 6, gOtherText_FourDashes); + MenuPrint(buffer, 11, y); + MenuPrint(buffer, 17, y); + MenuPrint(buffer, 23, y); + } + else + { + StringFillWithTerminator(gStringVar1, 8); + StringCopyN(gStringVar1, record->name, 7); + MenuPrint(gStringVar1, 3, y); + gStringVar1[0] = EXT_CTRL_CODE_BEGIN; + gStringVar1[1] = 0x14; + gStringVar1[2] = 6; + ConvertIntToDecimalStringN(gStringVar1 + 3, record->wins, STR_CONV_MODE_RIGHT_ALIGN, 4); + MenuPrint(gStringVar1, 11, y); + ConvertIntToDecimalStringN(gStringVar1 + 3, record->losses, STR_CONV_MODE_RIGHT_ALIGN, 4); + MenuPrint(gStringVar1, 17, y); + ConvertIntToDecimalStringN(gStringVar1 + 3, record->draws, STR_CONV_MODE_RIGHT_ALIGN, 4); + MenuPrint(gStringVar1, 23, y); + } +} + +void ShowLinkBattleRecords(void) { + s32 i; + MenuDrawTextWindow(1, 0, 28, 18); + sub_8072BD8((u8 *) gOtherText_BattleResults, 0, 1, 240); + + PrintLinkBattleWinsLossesDraws(gSaveBlock1.linkBattleRecords); +#if ENGLISH + MenuPrint(gOtherText_WinLoseDraw, 12, 6); +#elif GERMAN + MenuPrint_PixelCoords(gOtherText_WinLoseDraw, 88, 48, 1); +#endif + + for (i = 0; i < 5; i++) + { + PrintLinkBattleRecord(&gSaveBlock1.linkBattleRecords[i], 6 + (i + 1) * 2); + } +} + +static bool32 sub_8110494(u8 level) +{ + struct SaveBlock2_Sub *sb2sub = &gSaveBlock2.filler_A8; + + switch (sb2sub->var_4AE[level]) + { + case 0: + return FALSE; + case 1: + return FALSE; + case 2: + return TRUE; + case 4: + return FALSE; + case 3: + return TRUE; + case 5: + return FALSE; + case 6: + return TRUE; + default: + return FALSE; + } +} + +static void PrintWinStreak(const u8 *str, u16 streak, u8 left, u8 top) +{ + MenuPrint(str, left, top); + if (streak > 9999) + streak = 9999; + sub_8072C14(gStringVar1, streak, 24, 1); + MenuPrint(gOtherText_WinStreak, left + 7, top); +} + +static void PrintRecordWinStreak(u8 level, u8 left, u8 top) +{ + struct SaveBlock2_Sub *sb2sub = &gSaveBlock2.filler_A8; + u16 winStreak = sb2sub->recordWinStreak[level]; + PrintWinStreak(gOtherText_Record, winStreak, left, top); +} + +static u16 GetLastWinStreak(u8 level) +{ + u16 result = gSaveBlock2.filler_A8.winStreak[level]; + if (result > 9999) + result = 9999; + return result; +} + +static void PrintLastWinStreak(u8 level, u8 left, u8 top) +{ + u16 winStreak = GetLastWinStreak(level); + if (sub_8110494(level) == TRUE) + PrintWinStreak(gOtherText_Current, winStreak, left, top); + else + PrintWinStreak(gOtherText_Prev, winStreak, left, top); +} + +void ShowBattleTowerRecords(void) +{ + u16 i; + MenuDrawTextWindow(3, 1, 27, 17); + sub_8072BD8(gOtherText_BattleTowerResults, 3, 2, 0xC8); + MenuPrint(gOtherText_Lv50, 5, 6); + MenuPrint(gOtherText_Lv100, 5, 12); + for (i = 5; i < 26; i++) + { + sub_8071F60(CHAR_HYPHEN, i, 10); + } + PrintLastWinStreak(0, 10, 6); + PrintRecordWinStreak(0, 10, 8); + PrintLastWinStreak(1, 10, 12); + PrintRecordWinStreak(1, 10, 14); +} diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c new file mode 100644 index 000000000..04674e739 --- /dev/null +++ b/src/battle/battle_setup.c @@ -0,0 +1,1416 @@ +#include "global.h" +#include "battle_setup.h" +#include "battle.h" +#include "battle_transition.h" +#include "data2.h" +#include "event_data.h" +#include "field_control_avatar.h" +#include "field_fadetransition.h" +#include "field_map_obj_helpers.h" +#include "field_message_box.h" +#include "field_player_avatar.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "fldeff_80C5CD4.h" +#include "main.h" +#include "map_constants.h" +#include "metatile_behavior.h" +#include "opponent_constants.h" +#include "palette.h" +#include "rng.h" +#include "rom4.h" +#include "safari_zone.h" +#include "script.h" +#include "script_pokemon_80C4.h" +#include "secret_base.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "starter_choose.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "trainer.h" + +extern u16 gScriptResult; + +extern void (*gFieldCallback)(void); + +EWRAM_DATA u16 gTrainerBattleMode = 0; +EWRAM_DATA u16 gTrainerBattleOpponent = 0; +EWRAM_DATA u16 gTrainerMapObjectLocalId = 0; +EWRAM_DATA u8 *gTrainerIntroSpeech = NULL; +EWRAM_DATA u8 *gTrainerDefeatSpeech = NULL; +EWRAM_DATA u8 *gTrainerVictorySpeech = NULL; +EWRAM_DATA u8 *gTrainerCannotBattleSpeech = NULL; +EWRAM_DATA u8 *gTrainerBattleScriptReturnAddress = NULL; +EWRAM_DATA u8 *gTrainerBattleEndScript = NULL; + +extern u16 gBattleTypeFlags; +extern u16 gScriptLastTalked; +extern u8 gBattleOutcome; + +extern struct MapObject gMapObjects[]; + +extern u8 gUnknown_0819F818[]; +extern u8 gUnknown_0819F840[]; +extern u8 gUnknown_0819F878[]; +extern u8 gUnknown_0819F887[]; +extern u8 gUnknown_0819F8AE[]; + +extern u8 gUnknown_0819F80B[]; +extern u8 gUnknown_081C6C02[]; + + +static const u8 gBattleTransitionTable_Wild[][2] = +{ + {8, 9}, + {5, 10}, + {0, 10}, + {7, 6}, +}; +static const u8 gBattleTransitionTable_Trainer[][2] = +{ + {4, 11}, + {2, 3}, + {0, 10}, + {1, 6}, +}; +static const struct TrainerBattleSpec gTrainerBattleSpecs_0[] = +{ + {&gTrainerBattleMode, 0}, + {&gTrainerBattleOpponent, 1}, + {&gTrainerMapObjectLocalId, 1}, + {&gTrainerIntroSpeech, 2}, + {&gTrainerDefeatSpeech, 2}, + {&gTrainerVictorySpeech, 5}, + {&gTrainerCannotBattleSpeech, 5}, + {&gTrainerBattleEndScript, 5}, + {&gTrainerBattleScriptReturnAddress, 6}, +}; +static const struct TrainerBattleSpec gTrainerBattleSpecs_1[] = +{ + {&gTrainerBattleMode, 0}, + {&gTrainerBattleOpponent, 1}, + {&gTrainerMapObjectLocalId, 1}, + {&gTrainerIntroSpeech, 2}, + {&gTrainerDefeatSpeech, 2}, + {&gTrainerVictorySpeech, 5}, + {&gTrainerCannotBattleSpeech, 5}, + {&gTrainerBattleEndScript, 2}, + {&gTrainerBattleScriptReturnAddress, 6}, +}; +static const struct TrainerBattleSpec gTrainerBattleSpecs_2[] = +{ + {&gTrainerBattleMode, 0}, + {&gTrainerBattleOpponent, 1}, + {&gTrainerMapObjectLocalId, 1}, + {&gTrainerIntroSpeech, 2}, + {&gTrainerDefeatSpeech, 2}, + {&gTrainerVictorySpeech, 5}, + {&gTrainerCannotBattleSpeech, 2}, + {&gTrainerBattleEndScript, 5}, + {&gTrainerBattleScriptReturnAddress, 6}, +}; +static const struct TrainerBattleSpec gTrainerBattleSpecs_3[] = +{ + {&gTrainerBattleMode, 0}, + {&gTrainerBattleOpponent, 1}, + {&gTrainerMapObjectLocalId, 1}, + {&gTrainerIntroSpeech, 5}, + {&gTrainerDefeatSpeech, 2}, + {&gTrainerVictorySpeech, 5}, + {&gTrainerCannotBattleSpeech, 5}, + {&gTrainerBattleEndScript, 5}, + {&gTrainerBattleScriptReturnAddress, 6}, +}; +static const struct TrainerBattleSpec gTrainerBattleSpecs_4[] = +{ + {&gTrainerBattleMode, 0}, + {&gTrainerBattleOpponent, 1}, + {&gTrainerMapObjectLocalId, 1}, + {&gTrainerIntroSpeech, 2}, + {&gTrainerDefeatSpeech, 2}, + {&gTrainerVictorySpeech, 5}, + {&gTrainerCannotBattleSpeech, 2}, + {&gTrainerBattleEndScript, 2}, + {&gTrainerBattleScriptReturnAddress, 6}, +}; + +const struct TrainerEyeTrainer gTrainerEyeTrainers[] = +{ + { + {OPPONENT_ROSE_1, OPPONENT_ROSE_2, OPPONENT_ROSE_3, OPPONENT_ROSE_4, OPPONENT_ROSE_5}, + MAP_GROUP_ROUTE118, + MAP_ID_ROUTE118, + }, + { + {OPPONENT_DUSTY_1, OPPONENT_DUSTY_2, OPPONENT_DUSTY_3, OPPONENT_DUSTY_4, OPPONENT_DUSTY_5}, + MAP_GROUP_ROUTE111, + MAP_ID_ROUTE111, + }, + { + {OPPONENT_LOLA_1, OPPONENT_LOLA_2, OPPONENT_LOLA_3, OPPONENT_LOLA_4, OPPONENT_LOLA_5}, + MAP_GROUP_ROUTE109, + MAP_ID_ROUTE109, + }, + { + {OPPONENT_RICKY_1, OPPONENT_RICKY_2, OPPONENT_RICKY_3, OPPONENT_RICKY_4, OPPONENT_RICKY_5}, + MAP_GROUP_ROUTE109, + MAP_ID_ROUTE109, + }, + { + {OPPONENT_RITA_AND_SAM_1, OPPONENT_RITA_AND_SAM_2, OPPONENT_RITA_AND_SAM_3, OPPONENT_RITA_AND_SAM_4, OPPONENT_RITA_AND_SAM_5}, + MAP_GROUP_ROUTE124, + MAP_ID_ROUTE124, + }, + { + {OPPONENT_BROOKE_1, OPPONENT_BROOKE_2, OPPONENT_BROOKE_3, OPPONENT_BROOKE_4, OPPONENT_BROOKE_5}, + MAP_GROUP_ROUTE111, + MAP_ID_ROUTE111, + }, + { + {OPPONENT_WILTON_1, OPPONENT_WILTON_2, OPPONENT_WILTON_3, OPPONENT_WILTON_4, OPPONENT_WILTON_5}, + MAP_GROUP_ROUTE111, + MAP_ID_ROUTE111, + }, + { + {OPPONENT_VALERIE_1, OPPONENT_VALERIE_2, OPPONENT_VALERIE_3, OPPONENT_VALERIE_4, OPPONENT_VALERIE_5}, + MAP_GROUP_MT_PYRE_6F, + MAP_ID_MT_PYRE_6F, + }, + { + {OPPONENT_CINDY_1, OPPONENT_CINDY_3, OPPONENT_CINDY_4, OPPONENT_CINDY_5, OPPONENT_CINDY_6}, + MAP_GROUP_ROUTE104, + MAP_ID_ROUTE104, + }, + { + {OPPONENT_JESSICA_1, OPPONENT_JESSICA_2, OPPONENT_JESSICA_3, OPPONENT_JESSICA_4, OPPONENT_JESSICA_5}, + MAP_GROUP_ROUTE121, + MAP_ID_ROUTE121, + }, + { + {OPPONENT_WINSTON_1, OPPONENT_WINSTON_2, OPPONENT_WINSTON_3, OPPONENT_WINSTON_4, OPPONENT_WINSTON_5}, + MAP_GROUP_ROUTE104, + MAP_ID_ROUTE104, + }, + { + {OPPONENT_STEVE_1, OPPONENT_STEVE_2, OPPONENT_STEVE_3, OPPONENT_STEVE_4, OPPONENT_STEVE_5}, + MAP_GROUP_ROUTE114, + MAP_ID_ROUTE114, + }, + { + {OPPONENT_TONY_1, OPPONENT_TONY_2, OPPONENT_TONY_3, OPPONENT_TONY_4, OPPONENT_TONY_5}, + MAP_GROUP_ROUTE107, + MAP_ID_ROUTE107, + }, + { + {OPPONENT_NOB_1, OPPONENT_NOB_2, OPPONENT_NOB_3, OPPONENT_NOB_4, OPPONENT_NOB_5}, + MAP_GROUP_ROUTE115, + MAP_ID_ROUTE115, + }, + { + {OPPONENT_DALTON_1, OPPONENT_DALTON_2, OPPONENT_DALTON_3, OPPONENT_DALTON_4, OPPONENT_DALTON_5}, + MAP_GROUP_ROUTE118, + MAP_ID_ROUTE118, + }, + { + {OPPONENT_BERNIE_1, OPPONENT_BERNIE_2, OPPONENT_BERNIE_3, OPPONENT_BERNIE_4, OPPONENT_BERNIE_5}, + MAP_GROUP_ROUTE114, + MAP_ID_ROUTE114, + }, + { + {OPPONENT_ETHAN_1, OPPONENT_ETHAN_2, OPPONENT_ETHAN_3, OPPONENT_ETHAN_4, OPPONENT_ETHAN_5}, + MAP_GROUP_JAGGED_PASS, + MAP_ID_JAGGED_PASS, + }, + { + {OPPONENT_JOHN_AND_JAY_1, OPPONENT_JOHN_AND_JAY_2, OPPONENT_JOHN_AND_JAY_3, OPPONENT_JOHN_AND_JAY_4, OPPONENT_JOHN_AND_JAY_5}, + MAP_GROUP_METEOR_FALLS_1F_2R, + MAP_ID_METEOR_FALLS_1F_2R, + }, + { + {OPPONENT_BRANDON_1, OPPONENT_BRANDON_2, OPPONENT_BRANDON_3, OPPONENT_BRANDON_4, OPPONENT_BRANDON_5}, + MAP_GROUP_ROUTE120, + MAP_ID_ROUTE120, + }, + { + {OPPONENT_CAMERON_1, OPPONENT_CAMERON_2, OPPONENT_CAMERON_3, OPPONENT_CAMERON_4, OPPONENT_CAMERON_5}, + MAP_GROUP_ROUTE123, + MAP_ID_ROUTE123, + }, + { + {OPPONENT_JACKI_1, OPPONENT_JACKI_2, OPPONENT_JACKI_3, OPPONENT_JACKI_4, OPPONENT_JACKI_5}, + MAP_GROUP_ROUTE123, + MAP_ID_ROUTE123, + }, + { + {OPPONENT_WALTER_1, OPPONENT_WALTER_2, OPPONENT_WALTER_3, OPPONENT_WALTER_4, OPPONENT_WALTER_5}, + MAP_GROUP_ROUTE121, + MAP_ID_ROUTE121, + }, + { + {OPPONENT_KAREN_1, OPPONENT_KAREN_2, OPPONENT_KAREN_3, OPPONENT_KAREN_4, OPPONENT_KAREN_5}, + MAP_GROUP_ROUTE116, + MAP_ID_ROUTE116, + }, + { + {OPPONENT_JERRY_1, OPPONENT_JERRY_2, OPPONENT_JERRY_3, OPPONENT_JERRY_4, OPPONENT_JERRY_5}, + MAP_GROUP_ROUTE116, + MAP_ID_ROUTE116, + }, + { + {OPPONENT_ANNA_AND_MEG_1, OPPONENT_ANNA_AND_MEG_2, OPPONENT_ANNA_AND_MEG_3, OPPONENT_ANNA_AND_MEG_4, OPPONENT_ANNA_AND_MEG_5}, + MAP_GROUP_ROUTE117, + MAP_ID_ROUTE117, + }, + { + {OPPONENT_ISABEL_1, OPPONENT_ISABEL_2, OPPONENT_ISABEL_3, OPPONENT_ISABEL_4, OPPONENT_ISABEL_5}, + MAP_GROUP_ROUTE110, + MAP_ID_ROUTE110, + }, + { + {OPPONENT_MIGUEL_1, OPPONENT_MIGUEL_2, OPPONENT_MIGUEL_3, OPPONENT_MIGUEL_4, OPPONENT_MIGUEL_5}, + MAP_GROUP_ROUTE103, + MAP_ID_ROUTE103, + }, + { + {OPPONENT_TIMOTHY_1, OPPONENT_TIMOTHY_2, OPPONENT_TIMOTHY_3, OPPONENT_TIMOTHY_4, OPPONENT_TIMOTHY_5}, + MAP_GROUP_ROUTE115, + MAP_ID_ROUTE115, + }, + { + {OPPONENT_SHELBY_1, OPPONENT_SHELBY_2, OPPONENT_SHELBY_3, OPPONENT_SHELBY_4, OPPONENT_SHELBY_5}, + MAP_GROUP_MT_CHIMNEY, + MAP_ID_MT_CHIMNEY, + }, + { + {OPPONENT_CALVIN_1, OPPONENT_CALVIN_2, OPPONENT_CALVIN_3, OPPONENT_CALVIN_4, OPPONENT_CALVIN_5}, + MAP_GROUP_ROUTE102, + MAP_ID_ROUTE102, + }, + { + {OPPONENT_ELLIOT_1, OPPONENT_ELLIOT_2, OPPONENT_ELLIOT_3, OPPONENT_ELLIOT_4, OPPONENT_ELLIOT_5}, + MAP_GROUP_ROUTE106, + MAP_ID_ROUTE106, + }, + { + {OPPONENT_ABIGAIL_1, OPPONENT_ABIGAIL_2, OPPONENT_ABIGAIL_3, OPPONENT_ABIGAIL_4, OPPONENT_ABIGAIL_5}, + MAP_GROUP_ROUTE110, + MAP_ID_ROUTE110, + }, + { + {OPPONENT_BENJAMIN_1, OPPONENT_BENJAMIN_2, OPPONENT_BENJAMIN_3, OPPONENT_BENJAMIN_4, OPPONENT_BENJAMIN_5}, + MAP_GROUP_ROUTE110, + MAP_ID_ROUTE110, + }, + { + {OPPONENT_ISAIAH_1, OPPONENT_ISAIAH_2, OPPONENT_ISAIAH_3, OPPONENT_ISAIAH_4, OPPONENT_ISAIAH_5}, + MAP_GROUP_ROUTE128, + MAP_ID_ROUTE128, + }, + { + {OPPONENT_KATELYN_1, OPPONENT_KATELYN_2, OPPONENT_KATELYN_3, OPPONENT_KATELYN_4, OPPONENT_KATELYN_5}, + MAP_GROUP_ROUTE128, + MAP_ID_ROUTE128, + }, + { + {OPPONENT_MARIA_1, OPPONENT_MARIA_2, OPPONENT_MARIA_3, OPPONENT_MARIA_4, OPPONENT_MARIA_5}, + MAP_GROUP_ROUTE117, + MAP_ID_ROUTE117, + }, + { + {OPPONENT_DYLAN_1, OPPONENT_DYLAN_2, OPPONENT_DYLAN_3, OPPONENT_DYLAN_4, OPPONENT_DYLAN_5}, + MAP_GROUP_ROUTE117, + MAP_ID_ROUTE117, + }, + { + {OPPONENT_NICOLAS_1, OPPONENT_NICOLAS_2, OPPONENT_NICOLAS_3, OPPONENT_NICOLAS_4, OPPONENT_NICOLAS_5}, + MAP_GROUP_METEOR_FALLS_1F_2R, + MAP_ID_METEOR_FALLS_1F_2R, + }, + { + {OPPONENT_ROBERT_1, OPPONENT_ROBERT_2, OPPONENT_ROBERT_3, OPPONENT_ROBERT_4, OPPONENT_ROBERT_5}, + MAP_GROUP_ROUTE120, + MAP_ID_ROUTE120, + }, + { + {OPPONENT_LAO_1, OPPONENT_LAO_2, OPPONENT_LAO_3, OPPONENT_LAO_4, OPPONENT_LAO_5}, + MAP_GROUP_ROUTE113, + MAP_ID_ROUTE113, + }, + { + {OPPONENT_CYNDY_1, OPPONENT_CYNDY_2, OPPONENT_CYNDY_3, OPPONENT_CYNDY_4, OPPONENT_CYNDY_5}, + MAP_GROUP_ROUTE115, + MAP_ID_ROUTE115, + }, + { + {OPPONENT_MADELINE_1, OPPONENT_MADELINE_2, OPPONENT_MADELINE_3, OPPONENT_MADELINE_4, OPPONENT_MADELINE_5}, + MAP_GROUP_ROUTE113, + MAP_ID_ROUTE113, + }, + { + {OPPONENT_JENNY_1, OPPONENT_JENNY_2, OPPONENT_JENNY_3, OPPONENT_JENNY_4, OPPONENT_JENNY_5}, + MAP_GROUP_ROUTE124, + MAP_ID_ROUTE124, + }, + { + {OPPONENT_DIANA_1, OPPONENT_DIANA_2, OPPONENT_DIANA_3, OPPONENT_DIANA_4, OPPONENT_DIANA_5}, + MAP_GROUP_JAGGED_PASS, + MAP_ID_JAGGED_PASS, + }, + { + {OPPONENT_AMY_AND_LIV_1, OPPONENT_AMY_AND_LIV_2, OPPONENT_AMY_AND_LIV_4, OPPONENT_AMY_AND_LIV_5, OPPONENT_AMY_AND_LIV_6}, + MAP_GROUP_ROUTE103, + MAP_ID_ROUTE103, + }, + { + {OPPONENT_ERNEST_1, OPPONENT_ERNEST_2, OPPONENT_ERNEST_3, OPPONENT_ERNEST_4, OPPONENT_ERNEST_5}, + MAP_GROUP_ROUTE125, + MAP_ID_ROUTE125, + }, + { + {OPPONENT_EDWIN_1, OPPONENT_EDWIN_2, OPPONENT_EDWIN_3, OPPONENT_EDWIN_4, OPPONENT_EDWIN_5}, + MAP_GROUP_ROUTE110, + MAP_ID_ROUTE110, + }, + { + {OPPONENT_LYDIA_1, OPPONENT_LYDIA_2, OPPONENT_LYDIA_3, OPPONENT_LYDIA_4, OPPONENT_LYDIA_5}, + MAP_GROUP_ROUTE117, + MAP_ID_ROUTE117, + }, + { + {OPPONENT_ISAAC_1, OPPONENT_ISAAC_2, OPPONENT_ISAAC_3, OPPONENT_ISAAC_4, OPPONENT_ISAAC_5}, + MAP_GROUP_ROUTE117, + MAP_ID_ROUTE117, + }, + { + {OPPONENT_CATHERINE_1, OPPONENT_CATHERINE_2, OPPONENT_CATHERINE_3, OPPONENT_CATHERINE_4, OPPONENT_CATHERINE_5}, + MAP_GROUP_ROUTE119, + MAP_ID_ROUTE119, + }, + { + {OPPONENT_JACKSON_1, OPPONENT_JACKSON_2, OPPONENT_JACKSON_3, OPPONENT_JACKSON_4, OPPONENT_JACKSON_5}, + MAP_GROUP_ROUTE119, + MAP_ID_ROUTE119, + }, + { + {OPPONENT_HALEY_1, OPPONENT_HALEY_2, OPPONENT_HALEY_3, OPPONENT_HALEY_4, OPPONENT_HALEY_5}, + MAP_GROUP_ROUTE104, + MAP_ID_ROUTE104, + }, + { + {OPPONENT_JAMES_1, OPPONENT_JAMES_2, OPPONENT_JAMES_3, OPPONENT_JAMES_4, OPPONENT_JAMES_5}, + MAP_GROUP_PETALBURG_WOODS, + MAP_ID_PETALBURG_WOODS, + }, + { + {OPPONENT_TRENT_1, OPPONENT_TRENT_2, OPPONENT_TRENT_3, OPPONENT_TRENT_4, OPPONENT_TRENT_5}, + MAP_GROUP_ROUTE112, + MAP_ID_ROUTE112, + }, + { + {OPPONENT_LOIS_AND_HAL_1, OPPONENT_LOIS_AND_HAL_2, OPPONENT_LOIS_AND_HAL_3, OPPONENT_LOIS_AND_HAL_4, OPPONENT_LOIS_AND_HAL_5}, + MAP_GROUP_ABANDONED_SHIP_ROOMS2_1F, + MAP_ID_ABANDONED_SHIP_ROOMS2_1F, + }, + { + {OPPONENT_WALLY_3, OPPONENT_WALLY_4, OPPONENT_WALLY_5, OPPONENT_WALLY_6, OPPONENT_NONE}, + MAP_GROUP_VICTORY_ROAD_1F, + MAP_ID_VICTORY_ROAD_1F, + }, +}; + +static const u16 sBadgeFlags[] = {BADGE01_GET, BADGE02_GET, BADGE03_GET, BADGE04_GET, BADGE05_GET, BADGE06_GET, BADGE07_GET, BADGE08_GET}; + +void task01_battle_start(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + if (!FieldPoisonEffectIsRunning()) // is poison not active? + { + sub_811AABC(data[1]); + data[0]++; // go to case 1. + } + break; + case 1: + if (sub_811AAE8() == TRUE) + { + SetMainCallback2(sub_800E7C4); + prev_quest_postbuffer_cursor_backup_reset(); + overworld_poison_timer_set(); + DestroyTask(taskId); + } + break; + } +} + +void task_add_01_battle_start(u8 transition, u16 song) +{ + u8 taskId = CreateTask(task01_battle_start, 1); + + gTasks[taskId].data[1] = transition; + current_map_music_set__default_for_battle(song); +} + +void CheckForSafariZoneAndProceed(void) +{ + if (GetSafariZoneFlag()) + StartBattle_Safari(); + else + StartBattle_StandardWild(); +} + +void StartBattle_StandardWild(void) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + sub_80597F4(); + gMain.savedCallback = HandleWildBattleEnd; + gBattleTypeFlags = 0; + task_add_01_battle_start(GetWildBattleTransition(), 0); + IncrementGameStat(7); + IncrementGameStat(8); +} + +void StartBattle_Roamer(void) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + sub_80597F4(); + gMain.savedCallback = HandleWildBattleEnd; + gBattleTypeFlags = BATTLE_TYPE_ROAMER; + task_add_01_battle_start(GetWildBattleTransition(), 0); + IncrementGameStat(7); + IncrementGameStat(8); +} + +void StartBattle_Safari(void) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + sub_80597F4(); + gMain.savedCallback = sub_80C824C; + gBattleTypeFlags = BATTLE_TYPE_SAFARI; + task_add_01_battle_start(GetWildBattleTransition(), 0); +} + +void task_add_01_battle_start_with_music_and_stats(void) +{ + task_add_01_battle_start(GetTrainerBattleTransition(), 0); + IncrementGameStat(7); + IncrementGameStat(9); +} + +//Initiates battle where Wally catches Ralts +void StartBattle_WallyTutorial(void) +{ + CreateMaleMon(&gEnemyParty[0], SPECIES_RALTS, 5); + ScriptContext2_Enable(); + gMain.savedCallback = c2_exit_to_overworld_1_continue_scripts_restart_music; + gBattleTypeFlags = BATTLE_TYPE_WALLY_TUTORIAL; + task_add_01_battle_start(8, 0); +} + +void StartBattle_ScriptedWild(void) +{ + ScriptContext2_Enable(); + gMain.savedCallback = HandleScriptedWildBattleEnd; + gBattleTypeFlags = 0; + task_add_01_battle_start(GetWildBattleTransition(), 0); + IncrementGameStat(7); + IncrementGameStat(8); +} + +void StartBattle_SouthernIsland(void) +{ + ScriptContext2_Enable(); + gMain.savedCallback = HandleScriptedWildBattleEnd; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; + task_add_01_battle_start(GetWildBattleTransition(), 0); + IncrementGameStat(7); + IncrementGameStat(8); +} + +void StartBattle_Rayquaza(void) +{ + ScriptContext2_Enable(); + gMain.savedCallback = HandleScriptedWildBattleEnd; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; + task_add_01_battle_start(0, BGM_BATTLE34); + IncrementGameStat(7); + IncrementGameStat(8); +} + +void StartBattle_GroudonKyogre(void) +{ + ScriptContext2_Enable(); + gMain.savedCallback = HandleScriptedWildBattleEnd; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON; + if (gGameVersion == 2) + task_add_01_battle_start(0xB, BGM_BATTLE34); // KYOGRE + else + task_add_01_battle_start(0x6, BGM_BATTLE34); // GROUDON + IncrementGameStat(7); + IncrementGameStat(8); +} + +void StartBattle_Regi(void) +{ + ScriptContext2_Enable(); + gMain.savedCallback = HandleScriptedWildBattleEnd; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI; + task_add_01_battle_start(0xA, BGM_BATTLE36); + IncrementGameStat(7); + IncrementGameStat(8); +} + +void HandleWildBattleEnd(void) +{ + CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE); + ResetOamRange(0, 128); + + if (battle_exit_is_player_defeat(gBattleOutcome) == TRUE) + { + SetMainCallback2(CB2_WhiteOut); + } + else + { + SetMainCallback2(c2_exit_to_overworld_2_switch); + gFieldCallback = sub_8080E44; + } +} + +void HandleScriptedWildBattleEnd(void) +{ + CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE); + ResetOamRange(0, 128); + + if (battle_exit_is_player_defeat(gBattleOutcome) == TRUE) + SetMainCallback2(CB2_WhiteOut); + else + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +s8 GetBattleTerrain(void) +{ + u16 tileBehavior; + s16 x, y; + + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + + if (MetatileBehavior_IsTallGrass(tileBehavior)) + return 0; + if (MetatileBehavior_IsLongGrass(tileBehavior)) + return 1; + if (MetatileBehavior_IsSandOrDeepSand(tileBehavior)) + return 2; + switch (gMapHeader.mapType) + { + case MAP_TYPE_TOWN: + case MAP_TYPE_CITY: + case MAP_TYPE_ROUTE: + break; + case MAP_TYPE_UNDERGROUND: + if (sub_80574C4(tileBehavior)) + return 8; + if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) + return 5; + return 7; + case MAP_TYPE_INDOOR: + case MAP_TYPE_SECRET_BASE: + return 8; + case MAP_TYPE_UNDERWATER: + return 3; + case MAP_TYPE_6: + if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) + return 4; + return 9; + } + if (sub_8057568(tileBehavior)) + return 4; + if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) + return 5; + if (sub_80574D8(tileBehavior)) + return 6; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + { + if (sub_8057450(tileBehavior)) + return 5; + if (MetatileBehavior_IsBridge(tileBehavior) == TRUE) + return 4; + } + if (gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 28) + return 2; + if (GetSav1Weather() == 8) + return 2; + return 9; +} + +s8 GetBattleTransitionTypeByMap(void) +{ + u8 flashUsed; + u16 tileBehavior; + s16 x, y; + + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + + flashUsed = sav1_get_flash_used_on_map(); + + if (flashUsed) + return 2; + + if (!MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) + { + switch (gMapHeader.mapType) + { + case MAP_TYPE_UNDERGROUND: + return 1; + case MAP_TYPE_UNDERWATER: + return 3; + default: + return 0; + } + } + return 3; +} + +u16 GetSumOfPartyMonLevel(u8 numMons) +{ + u8 sum = 0; + int i; + + for (i = 0; i < 6; i++) + { + u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); + + if (species != SPECIES_EGG && species != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0) + { + sum += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); + numMons--; + if (numMons == 0) + break; + } + } + return sum; +} + +u8 GetSumOfEnemyPartyLevel(u16 trainerNum, u8 numMons) +{ + u8 i; + u8 sum; + u32 count = numMons; + void *party; + + if (gTrainers[trainerNum].partySize < count) + count = gTrainers[trainerNum].partySize; + + sum = 0; + + switch (gTrainers[trainerNum].partyFlags) + { + case 0: + party = gTrainers[trainerNum].party; + for (i = 0; i < count; i++) + sum += ((struct TrainerPartyMember0 *)party)[i].level; + break; + case 1: + party = gTrainers[trainerNum].party; + for (i = 0; i < count; i++) + sum += ((struct TrainerPartyMember1 *)party)[i].level; + break; + case 2: + party = gTrainers[trainerNum].party; + for (i = 0; i < count; i++) + sum += ((struct TrainerPartyMember2 *)party)[i].level; + break; + case 3: + party = gTrainers[trainerNum].party; + for (i = 0; i < count; i++) + sum += ((struct TrainerPartyMember3 *)party)[i].level; + break; + } + + return sum; +} + +u8 GetWildBattleTransition(void) +{ + u8 flashVar = GetBattleTransitionTypeByMap(); + u8 level = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); + + if (level < (u8)GetSumOfPartyMonLevel(1)) // is wild mon level than the player's mon level? + return gBattleTransitionTable_Wild[flashVar][0]; + else + return gBattleTransitionTable_Wild[flashVar][1]; // use a white fade in instead of normal transition. +} + +u8 GetTrainerBattleTransition(void) +{ + const struct Trainer *trainer; + u8 minPartyCount; + u8 flashVar; + u8 level; + + if (gTrainerBattleOpponent == 1024) // link battle? + return 16; + + trainer = gTrainers; + + if (trainer[gTrainerBattleOpponent].trainerClass == 24) // league? + { + if (gTrainerBattleOpponent == 261) + return 12; + if (gTrainerBattleOpponent == 262) + return 13; + if (gTrainerBattleOpponent == 263) + return 14; + if (gTrainerBattleOpponent == 264) + return 15; + return 16; + } + + if (trainer[gTrainerBattleOpponent].trainerClass == 32) // team leader? + return 16; + + if (trainer[gTrainerBattleOpponent].doubleBattle == TRUE) + minPartyCount = 2; // double battles always at least have 2 pokemon. + else + minPartyCount = 1; + + flashVar = GetBattleTransitionTypeByMap(); + level = GetSumOfEnemyPartyLevel(gTrainerBattleOpponent, minPartyCount); + + if (level < (u8)GetSumOfPartyMonLevel(minPartyCount)) // is wild mon level than the player's mon level? + return gBattleTransitionTable_Trainer[flashVar][0]; + else + return gBattleTransitionTable_Trainer[flashVar][1]; +} + +u8 GetBattleTowerBattleTransition(void) +{ + u8 monData = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); + + if (monData < (u8)GetSumOfPartyMonLevel(1)) + return 4; + else + return 3; +} + +void ChooseStarter(void) +{ + SetMainCallback2(CB2_ChooseStarter); + gMain.savedCallback = CB2_GiveStarter; +} + +void CB2_GiveStarter(void) +{ + u16 starterPoke; + + *GetVarPointer(0x4023) = gScriptResult; + starterPoke = GetStarterPokemon(gScriptResult); + ScriptGiveMon(starterPoke, 5, 0, 0, 0, 0); + ResetTasks(); + sub_80408BC(); + SetMainCallback2(CB2_StartFirstBattle); + sub_811AAD8(0); +} + +void CB2_StartFirstBattle(void) +{ + UpdatePaletteFade(); + RunTasks(); + + if (sub_811AAE8() == TRUE) + { + gBattleTypeFlags = BATTLE_TYPE_FIRST_BATTLE; + gMain.savedCallback = HandleFirstBattleEnd; + SetMainCallback2(sub_800E7C4); + prev_quest_postbuffer_cursor_backup_reset(); + overworld_poison_timer_set(); + IncrementGameStat(7); + IncrementGameStat(8); + } +} + +void HandleFirstBattleEnd(void) +{ + sav1_reset_battle_music_maybe(); + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +u32 TrainerBattleLoadArg32(const u8 *ptr) +{ + return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); +} + +u16 TrainerBattleLoadArg16(const u8 *ptr) +{ + return ptr[0] | (ptr[1] << 8); +} + +u8 TrainerBattleLoadArg8(const u8 *ptr) +{ + return ptr[0]; +} + +u16 trainerflag_opponent(void) +{ + return TRAINER_FLAG_START + gTrainerBattleOpponent; +} + +bool32 battle_exit_is_player_defeat(u32 a1) +{ + switch (a1) + { + case 2: + case 3: + return TRUE; + case 1: + case 4: + case 5: + case 6: + case 7: + return FALSE; + } + return FALSE; +} + +void sub_80822BC(void) +{ + gTrainerBattleMode = 0; + gTrainerBattleOpponent = 0; + gTrainerMapObjectLocalId = 0; + gTrainerIntroSpeech = 0; + gTrainerDefeatSpeech = 0; + gTrainerVictorySpeech = 0; + gTrainerCannotBattleSpeech = 0; + gTrainerBattleScriptReturnAddress = 0; + gTrainerBattleEndScript = 0; +} + +void TrainerBattleLoadArgs(const struct TrainerBattleSpec *specs, const u8 *data) +{ + while (1) + { + switch (specs->ptrType) + { + case 0: + *(u8 *)specs->ptr = TrainerBattleLoadArg8(data); + data++; + break; + case 1: + *(u16 *)specs->ptr = TrainerBattleLoadArg16(data); + data += 2; + break; + case 2: + *(u32 *)specs->ptr = TrainerBattleLoadArg32(data); + data += 4; + break; + case 3: + *(u8 *)specs->ptr = 0; + break; + case 4: + *(u16 *)specs->ptr = 0; + break; + case 5: + *(u32 *)specs->ptr = 0; + break; + case 6: + *(const u8 **)specs->ptr = data; + return; + } + specs++; + } +} + +void battle_80801F0(void) +{ + if (gTrainerMapObjectLocalId) + { + gScriptLastTalked = gTrainerMapObjectLocalId; + gSelectedMapObject = GetFieldObjectIdByLocalIdAndMap(gTrainerMapObjectLocalId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + } +} + +u8 *TrainerBattleConfigure(const u8 *data) +{ + sub_80822BC(); + gTrainerBattleMode = TrainerBattleLoadArg8(data); + + switch (gTrainerBattleMode) + { + case 3: + TrainerBattleLoadArgs(gTrainerBattleSpecs_3, data); + return gUnknown_0819F878; + case 4: + TrainerBattleLoadArgs(gTrainerBattleSpecs_2, data); + battle_80801F0(); + return gUnknown_0819F840; + case 1: + case 2: + TrainerBattleLoadArgs(gTrainerBattleSpecs_1, data); + battle_80801F0(); + return gUnknown_0819F818; + case 6: + case 8: + TrainerBattleLoadArgs(gTrainerBattleSpecs_4, data); + battle_80801F0(); + return gUnknown_0819F840; + case 7: + TrainerBattleLoadArgs(gTrainerBattleSpecs_2, data); + battle_80801F0(); + gTrainerBattleOpponent = sub_8082C4C(gTrainerBattleOpponent); + return gUnknown_0819F8AE; + case 5: + TrainerBattleLoadArgs(gTrainerBattleSpecs_0, data); + battle_80801F0(); + gTrainerBattleOpponent = sub_8082C4C(gTrainerBattleOpponent); + return gUnknown_0819F887; + default: + TrainerBattleLoadArgs(gTrainerBattleSpecs_0, data); + battle_80801F0(); + return gUnknown_0819F818; + } +} + +void TrainerWantsBattle(u8 trainerMapObjId, u8 *trainerScript) +{ + gSelectedMapObject = trainerMapObjId; + gScriptLastTalked = gMapObjects[trainerMapObjId].localId; + TrainerBattleConfigure(trainerScript + 1); + ScriptContext1_SetupScript(gUnknown_0819F80B); + ScriptContext2_Enable(); +} + +bool32 GetTrainerFlagFromScriptPointer(u8 *data) +{ + u32 flag = TrainerBattleLoadArg16(data + 2); + return FlagGet(TRAINER_FLAG_START + flag); +} + +void sub_8082524(void) +{ + struct MapObject *mapObject = &gMapObjects[gSelectedMapObject]; + + npc_set_running_behaviour_etc(mapObject, npc_running_behaviour_by_direction(mapObject->mapobj_unk_18)); +} + +u8 sub_8082558(void) +{ + return gTrainerBattleMode; +} + +u8 sub_8082564(void) +{ + return FlagGet(trainerflag_opponent()); +} + +void sub_808257C(void) +{ + FlagSet(trainerflag_opponent()); +} + +void unref_sub_8082590(void) +{ + FlagSet(trainerflag_opponent()); // duplicate function +} + +u8 trainer_flag_check(u16 flag) +{ + return FlagGet(TRAINER_FLAG_START + flag); +} + +void trainer_flag_set(u16 flag) +{ + FlagSet(TRAINER_FLAG_START + flag); +} + +void trainer_flag_clear(u16 flag) +{ + FlagReset(TRAINER_FLAG_START + flag); +} + +void sub_80825E4(void) +{ + gBattleTypeFlags = BATTLE_TYPE_TRAINER; + gMain.savedCallback = sub_808260C; + task_add_01_battle_start_with_music_and_stats(); + ScriptContext1_Stop(); +} + +void sub_808260C(void) +{ + if (gTrainerBattleOpponent == 1024) + { + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); // link battle? + } + else if (battle_exit_is_player_defeat(gBattleOutcome) == TRUE) + { + SetMainCallback2(CB2_WhiteOut); + } + else + { + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + sub_808257C(); + } +} + +void do_choose_name_or_words_screen(void) +{ + if (gTrainerBattleOpponent == 1024) + { + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); // link battle? + } + else if (battle_exit_is_player_defeat(gBattleOutcome) == TRUE) + { + SetMainCallback2(CB2_WhiteOut); + } + else + { + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + sub_808257C(); + sub_8082CB8(); + } +} + +void sub_80826B0(void) +{ + gBattleTypeFlags = BATTLE_TYPE_TRAINER; + gMain.savedCallback = do_choose_name_or_words_screen; + task_add_01_battle_start_with_music_and_stats(); + ScriptContext1_Stop(); +} + +void sub_80826D8(void) +{ + ShowFieldMessage(sub_808281C()); +} + +u8 *sub_80826E8(void) +{ + if (gTrainerBattleScriptReturnAddress) + return gTrainerBattleScriptReturnAddress; + else + return gUnknown_081C6C02; +} + +u8 *sub_8082700(void) +{ + if (gTrainerBattleEndScript) + return gTrainerBattleEndScript; + else + return gUnknown_081C6C02; +} + +void sub_8082718(void) +{ + ShowFieldMessage(sub_8082880()); +} + +void PlayTrainerEncounterMusic(void) +{ + u16 music; + + if (gTrainerBattleMode != 1 && gTrainerBattleMode != 8) + { + switch (sub_803FC58(gTrainerBattleOpponent)) + { + case TRAINER_ENCOUNTER_MUSIC_MALE: + music = BGM_BOYEYE; + break; + case TRAINER_ENCOUNTER_MUSIC_FEMALE: + music = BGM_GIRLEYE; + break; + case TRAINER_ENCOUNTER_MUSIC_GIRL: + music = BGM_SYOUJOEYE; + break; + case TRAINER_ENCOUNTER_MUSIC_INTENSE: + music = BGM_HAGESHII; + break; + case TRAINER_ENCOUNTER_MUSIC_COOL: + music = BGM_KAKKOII; + break; + case TRAINER_ENCOUNTER_MUSIC_AQUA: + music = BGM_AQA_0; + break; + case TRAINER_ENCOUNTER_MUSIC_MAGMA: + music = BGM_MGM0; + break; + case TRAINER_ENCOUNTER_MUSIC_SWIMMER: + music = BGM_SWIMEYE; + break; + case TRAINER_ENCOUNTER_MUSIC_TWINS: + music = BGM_HUTAGO; + break; + case TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR: + music = BGM_SITENNOU; + break; + case TRAINER_ENCOUNTER_MUSIC_HIKER: + music = BGM_YAMA_EYE; + break; + case TRAINER_ENCOUNTER_MUSIC_INTERVIEWER: + music = BGM_INTER_V; + break; + case TRAINER_ENCOUNTER_MUSIC_RICH: + music = BGM_TEST; + break; + default: + music = BGM_AYASII; + } + PlayNewMapMusic(music); + } +} + +//Returns an empty string if a null pointer was passed, otherwise returns str +u8 *SanitizeString(const u8 *str) +{ + if (str) + return (u8 *) str; + else + return (u8 *) gOtherText_CancelWithTerminator; +} + +u8 *sub_808281C(void) +{ + return SanitizeString(gTrainerIntroSpeech); +} + +u8 *sub_8082830(void) +{ + u8 *str; + + if (gTrainerBattleOpponent == 1024) + str = sub_80BCCE8(); + else + str = gTrainerDefeatSpeech; + + StringExpandPlaceholders(gStringVar4, SanitizeString(str)); + return gStringVar4; +} + +u8 *unref_sub_808286C(void) +{ + return SanitizeString(gTrainerVictorySpeech); +} + +u8 *sub_8082880(void) +{ + return SanitizeString(gTrainerCannotBattleSpeech); +} + +s32 sub_8082894(const struct TrainerEyeTrainer *trainers, u16 trainerNum) +{ + s32 i; + + for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) + { + if (trainers[i].trainerNums[0] == trainerNum) + return i; + } + return -1; +} + +s32 sub_80828B8(const struct TrainerEyeTrainer *trainers, u16 trainerNum) +{ + s32 i; + s32 j; + + for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) + { + for (j = 0; j < 5 && trainers[i].trainerNums[j] != 0; j++) + { + if (trainers[i].trainerNums[j] == trainerNum) + return i; + } + } + return -1; +} + +bool32 sub_80828FC(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum) +{ + int i; + bool32 ret = FALSE; + + for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) + { + if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum) + { + if (gSaveBlock1.trainerRematches[i] != 0) + ret = TRUE; + else if (trainer_flag_check(trainers[i].trainerNums[0]) == TRUE && (Random() % 100) <= 30) + { + int j = 1; + + while (j < 5 && trainers[i].trainerNums[j] != 0 && trainer_flag_check(trainers[i].trainerNums[j])) + j++; + gSaveBlock1.trainerRematches[i] = j; + ret = TRUE; + } + } + } + return ret; +} + +s32 sub_80829A8(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum) +{ + s32 i; + + for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) + { + if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum && gSaveBlock1.trainerRematches[i]) + return 1; + } + return 0; +} + +s32 sub_80829E8(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum) +{ + s32 i; + + for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) + { + if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum) + return 1; + } + return 0; +} + +bool8 sub_8082A18(const struct TrainerEyeTrainer *trainers, u16 trainerNum) +{ + s32 trainerEyeIndex = sub_8082894(trainers, trainerNum); + + if (trainerEyeIndex != -1 && trainerEyeIndex < 100 && gSaveBlock1.trainerRematches[trainerEyeIndex]) + return TRUE; + else + return FALSE; +} + +bool8 sub_8082A54(const struct TrainerEyeTrainer *trainers, u16 trainerNum) +{ + s32 trainerEyeIndex = sub_80828B8(trainers, trainerNum); + + if (trainerEyeIndex != -1 && trainerEyeIndex < 100 && gSaveBlock1.trainerRematches[trainerEyeIndex]) + return TRUE; + else + return FALSE; +} + +u16 sub_8082A90(const struct TrainerEyeTrainer *trainers, u16 trainerNum) +{ + int i; + const struct TrainerEyeTrainer *trainer; + s32 trainerEyeIndex = sub_8082894(trainers, trainerNum); + + if (trainerEyeIndex == -1) + return 0; + trainer = &trainers[trainerEyeIndex]; + for (i = 1; i < 5; i++) + { + if (!trainer->trainerNums[i]) + return trainer->trainerNums[i - 1]; + if (!trainer_flag_check(trainer->trainerNums[i])) + return trainer->trainerNums[i]; + } + return trainer->trainerNums[4]; +} + +void sub_8082AE4(const struct TrainerEyeTrainer *trainers, u16 trainerNum) +{ + s32 trainerEyeIndex = sub_80828B8(trainers, trainerNum); + + if (trainerEyeIndex != -1) + gSaveBlock1.trainerRematches[trainerEyeIndex] = 0; +} + +bool8 sub_8082B10(const struct TrainerEyeTrainer *trainers, u16 trainerNum) +{ + s32 trainerEyeIndex = sub_8082894(trainers, trainerNum); + + if (trainerEyeIndex != -1 && trainer_flag_check(trainers[trainerEyeIndex].trainerNums[1])) + return TRUE; + else + return FALSE; +} + +bool32 sub_8082B44(void) +{ + int badgeCount = 0; + u32 i; + + for (i = 0; i < 8; i++) + { + if (FlagGet(sBadgeFlags[i]) == TRUE) + { + badgeCount++; + if (badgeCount >= 5) + return TRUE; + } + } + return FALSE; +} + +void sub_8082B78(void) +{ + if (sub_8082B44()) + { + if (gSaveBlock1.trainerRematchStepCounter >= TRAINER_REMATCH_STEPS) + gSaveBlock1.trainerRematchStepCounter = TRAINER_REMATCH_STEPS; + else + gSaveBlock1.trainerRematchStepCounter++; + } +} + +bool32 sub_8082BA4(void) +{ + if (sub_8082B44() && gSaveBlock1.trainerRematchStepCounter >= TRAINER_REMATCH_STEPS) + return TRUE; + else + return FALSE; +} + +void sub_8082BD0(u16 mapGroup, u16 mapNum) +{ + if (sub_8082BA4() && sub_80828FC(gTrainerEyeTrainers, mapGroup, mapNum) == TRUE) + gSaveBlock1.trainerRematchStepCounter = 0; +} + +s32 sub_8082C0C(u16 mapGroup, u16 mapNum) +{ + return sub_80829A8(gTrainerEyeTrainers, mapGroup, mapNum); +} + +s32 unref_sub_8082C2C(u16 mapGroup, u16 mapNum) +{ + return sub_80829E8(gTrainerEyeTrainers, mapGroup, mapNum); +} + +u16 sub_8082C4C(u16 trainerNum) +{ + return sub_8082A90(gTrainerEyeTrainers, trainerNum); +} + +s32 sub_8082C68(void) +{ + if (sub_8082A18(gTrainerEyeTrainers, gTrainerBattleOpponent)) + return 1; + else + return sub_8082B10(gTrainerEyeTrainers, gTrainerBattleOpponent); +} + +u8 sub_8082C9C(void) +{ + return sub_8082A54(gTrainerEyeTrainers, gTrainerBattleOpponent); +} + +void sub_8082CB8(void) +{ + sub_8082AE4(gTrainerEyeTrainers, gTrainerBattleOpponent); + sub_808257C(); +} diff --git a/src/battle/calculate_base_damage.c b/src/battle/calculate_base_damage.c new file mode 100644 index 000000000..0f2605e5b --- /dev/null +++ b/src/battle/calculate_base_damage.c @@ -0,0 +1,1474 @@ +#include "global.h" +#include "abilities.h" +#include "battle.h" +#include "berry.h" +#include "data2.h" +#include "event_data.h" +#include "hold_effects.h" +#include "item.h" +#include "items.h" +#include "main.h" +#include "pokemon.h" +#include "species.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "text.h" + +extern u8 gPlayerPartyCount; +extern u8 gEnemyPartyCount; + +extern u16 unk_20160BC[]; +extern struct SecretBaseRecord gSecretBaseRecord; +extern u32 dword_2017100[]; +extern u16 gBattleTypeFlags; +extern struct BattlePokemon gBattleMons[4]; +extern u16 gCurrentMove; +extern u8 gLastUsedAbility; +extern u8 gCritMultiplier; +extern u16 gBattleWeather; +extern struct BattleEnigmaBerry gEnigmaBerries[]; +extern u16 gBattleMovePower; +extern struct SpriteTemplate gUnknown_02024E8C; +extern u16 gTrainerBattleOpponent; +extern struct PokemonStorage gPokemonStorage; + +extern u8 gBadEggNickname[]; +extern struct SpriteTemplate gSpriteTemplate_8208288[]; +extern u8 gTrainerClassToPicIndex[]; +extern u8 gTrainerClassToNameIndex[]; +extern u8 gUnknown_08208238[]; +extern u8 gUnknown_0820823C[]; +extern u8 gStatStageRatios[]; +extern u8 gHoldEffectToType[][2]; + +#define APPLY_STAT_MOD(var, mon, stat, statIndex) \ +{ \ + (var) = (stat) * (gStatStageRatios)[(mon)->statStages[(statIndex)] * 2]; \ + (var) /= (gStatStageRatios + 1)[(mon)->statStages[(statIndex)] * 2]; \ +} + +#ifdef NONMATCHING +s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 a7, u8 a8) +{ + s32 i; + s32 damage = 0; + u8 type; + u16 attack, defense; + u16 spAttack, spDefense; + u8 defenderHoldEffect; + u8 defenderHoldEffectParam; + u8 attackerHoldEffect; + u8 attackerHoldEffectParam; + s32 a, b; + + if (!powerOverride) + gBattleMovePower = gBattleMoves[move].power; + else + gBattleMovePower = powerOverride; + + if (!typeOverride) + type = gBattleMoves[move].type; + else + type = typeOverride & 0x3F; + + attack = attacker->attack; + defense = defender->defense; + spAttack = attacker->spAttack; + spDefense = defender->spDefense; + + if (attacker->item == ITEM_ENIGMA_BERRY) + { + attackerHoldEffect = gEnigmaBerries[a7].holdEffect; + attackerHoldEffectParam = gEnigmaBerries[a7].holdEffectParam; + } + else + { + attackerHoldEffect = ItemId_GetHoldEffect(attacker->item); + attackerHoldEffectParam = ItemId_GetHoldEffectParam(attacker->item); + } + + if (defender->item == ITEM_ENIGMA_BERRY) + { + defenderHoldEffect = gEnigmaBerries[a8].holdEffect; + defenderHoldEffectParam = gEnigmaBerries[a8].holdEffectParam; + } + else + { + defenderHoldEffect = ItemId_GetHoldEffect(defender->item); + defenderHoldEffectParam = ItemId_GetHoldEffectParam(defender->item); + } + + if (attacker->ability == ABILITY_HUGE_POWER || attacker->ability == ABILITY_PURE_POWER) + attack *= 2; + + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) + { + if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) + && gTrainerBattleOpponent != 1024 + && FlagGet(BADGE01_GET) + && !GetBankSide(a7)) + attack = (110 * attack) / 100; + + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) + { + if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) + && gTrainerBattleOpponent != 1024 + && FlagGet(BADGE05_GET) + && !GetBankSide(a8)) + defense = (110 * defense) / 100; + + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) + { + if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) + && gTrainerBattleOpponent != 1024 + && FlagGet(BADGE07_GET) + && !GetBankSide(a7)) + spAttack = (110 * spAttack) / 100; + + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) + { + if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) + && gTrainerBattleOpponent != 1024 + && FlagGet(BADGE07_GET) + && !GetBankSide(a8)) + spDefense = (110 * spDefense) / 100; + } + } + } + } + + for (i = 0; i < 17; i++) + { + if (attackerHoldEffect == gHoldEffectToType[i][0] + && type == gHoldEffectToType[i][1]) + { + if (type <= 8) + attack = (attack * (attackerHoldEffectParam + 100)) / 100; + else + spAttack = (spAttack * (attackerHoldEffectParam + 100)) / 100; + break; + } + } + + if (attackerHoldEffect == HOLD_EFFECT_CHOICE_BAND) + attack = (150 * attack) / 100; + if (attackerHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) && (attacker->species == SPECIES_LATIAS || attacker->species == SPECIES_LATIOS)) + spAttack = (150 * spAttack) / 100; + if (defenderHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) && (defender->species == SPECIES_LATIAS || defender->species == SPECIES_LATIOS)) + spDefense = (150 * spDefense) / 100; + if (attackerHoldEffect == HOLD_EFFECT_DEEP_SEA_TOOTH && attacker->species == SPECIES_CLAMPERL) + spAttack *= 2; + if (defenderHoldEffect == HOLD_EFFECT_DEEP_SEA_SCALE && defender->species == SPECIES_CLAMPERL) + spDefense *= 2; + if (attackerHoldEffect == HOLD_EFFECT_LIGHT_BALL && attacker->species == SPECIES_PIKACHU) + spAttack *= 2; + if (defenderHoldEffect == HOLD_EFFECT_METAL_POWDER && defender->species == SPECIES_DITTO) + defense *= 2; + if (attackerHoldEffect == HOLD_EFFECT_THICK_CLUB && (attacker->species == SPECIES_CUBONE || attacker->species == SPECIES_MAROWAK)) + attack *= 2; + if (defender->ability == ABILITY_THICK_FAT && (type == TYPE_FIRE || type == TYPE_ICE)) + spAttack /= 2; + if (attacker->ability == ABILITY_HUSTLE) + attack = (150 * attack) / 100; + if (attacker->ability == ABILITY_PLUS && AbilityBattleEffects(0xE, 0, ABILITY_MINUS, 0, 0)) + spAttack = (150 * spAttack) / 100; + if (attacker->ability == ABILITY_MINUS && AbilityBattleEffects(0xE, 0, ABILITY_PLUS, 0, 0)) + spAttack = (150 * spAttack) / 100; + if (attacker->ability == ABILITY_GUTS && attacker->status1) + attack = (150 * attack) / 100; + if (defender->ability == ABILITY_MARVEL_SCALE && defender->status1) + defense = (150 * defense) / 100; + if (type == TYPE_ELECTRIC && AbilityBattleEffects(0xE, 0, 0, 0xFD, 0)) + gBattleMovePower /= 2; + if (type == TYPE_FIRE && AbilityBattleEffects(0xE, 0, 0, 0xFE, 0)) + gBattleMovePower /= 2; + if (type == TYPE_GRASS && attacker->ability == ABILITY_OVERGROW && attacker->hp <= (attacker->maxHP / 3)) + gBattleMovePower = (150 * gBattleMovePower) / 100; + if (type == TYPE_FIRE && attacker->ability == ABILITY_BLAZE && attacker->hp <= (attacker->maxHP / 3)) + gBattleMovePower = (150 * gBattleMovePower) / 100; + if (type == TYPE_WATER && attacker->ability == ABILITY_TORRENT && attacker->hp <= (attacker->maxHP / 3)) + gBattleMovePower = (150 * gBattleMovePower) / 100; + if (type == TYPE_BUG && attacker->ability == ABILITY_SWARM && attacker->hp <= (attacker->maxHP / 3)) + gBattleMovePower = (150 * gBattleMovePower) / 100; + if (gBattleMoves[gCurrentMove].effect == 7) + defense /= 2; + + if (type < TYPE_MYSTERY) // is physical? + { + if (gCritMultiplier == 2) + { + if (attacker->statStages[1] > 6) + APPLY_STAT_MOD(a, attacker, attack, 1) + else + a = attack; + } + else + APPLY_STAT_MOD(a, attacker, attack, 1) + + a = a * gBattleMovePower * (2 * attacker->level / 5 + 2); + + if (gCritMultiplier == 2) + { + if (defender->statStages[2] < 6) + APPLY_STAT_MOD(b, defender, defense, 2) + else + b = defense; + } + else + APPLY_STAT_MOD(b, defender, defense, 2) + + damage = (a / b) / 50; + + if ((attacker->status1 & 0x10) && attacker->ability != ABILITY_GUTS) + damage /= 2; + + if ((a4 & 1) && gCritMultiplier == 1) + { + if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMons(2) == 2) + damage = 2 * (damage / 3); + else + damage /= 2; + } + + if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMons(2) == 2) + damage /= 2; + + // moves always do at least 1 damage. + if (damage == 0) + damage = 1; + } + + if (type == TYPE_MYSTERY) + damage = 0; // is ??? type. does 0 damage. + + if (type > TYPE_MYSTERY) // is special? + { + if (gCritMultiplier == 2) + { + if (attacker->statStages[4] > 6) + APPLY_STAT_MOD(a, attacker, spAttack, 4) + else + a = spAttack; + } + else + APPLY_STAT_MOD(a, attacker, spAttack, 4) + + a = a * gBattleMovePower * (2 * attacker->level / 5 + 2); + + if (gCritMultiplier == 2) + { + if (defender->statStages[5] < 6) + APPLY_STAT_MOD(b, defender, spDefense, 5) + else + b = spDefense; + } + else + APPLY_STAT_MOD(b, defender, spDefense, 5) + + damage = (a / b) / 50; + + if ((a4 & 2) && gCritMultiplier == 1) + { + if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMons(2) == 2) + damage = 2 * (damage / 3); + else + damage /= 2; + } + + if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMons(2) == 2) + damage /= 2; + + // are effects of weather negated with cloud nine or air lock? + if (!AbilityBattleEffects(0xE, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(0xE, 0, ABILITY_AIR_LOCK, 0, 0)) + { + // rain? + if (gBattleWeather & 1) + { + if (type == TYPE_FIRE) + damage /= 2; + else if (type == TYPE_WATER) + damage = (15 * damage) / 10; + } + + // does lack of sun half solar beam damage? + if ((gBattleWeather & 0x9F) && gCurrentMove == 76) + damage /= 2; + + // sunny? + if (gBattleWeather & 0x60) + { + if (type == TYPE_FIRE) + damage = (15 * damage) / 10; + else if (type == TYPE_WATER) + damage /= 2; + } + } + + // flash fire triggered? + if ((dword_2017100[a7] & 1) && type == TYPE_FIRE) + damage = (15 * damage) / 10; + } + + return damage + 2; +} +#else +__attribute__((naked)) +s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 a7, u8 a8) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x2C\n\ + adds r7, r0, 0\n\ + str r1, [sp, 0x4]\n\ + str r2, [sp, 0x8]\n\ + ldr r0, [sp, 0x4C]\n\ + ldr r1, [sp, 0x50]\n\ + ldr r2, [sp, 0x54]\n\ + ldr r4, [sp, 0x58]\n\ + lsls r3, 16\n\ + lsrs r3, 16\n\ + str r3, [sp, 0xC]\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + lsls r1, 24\n\ + lsrs r6, r1, 24\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + str r2, [sp, 0x10]\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + movs r5, 0\n\ + cmp r3, 0\n\ + bne _0803BA80\n\ + ldr r2, _0803BA78 @ =gBattleMovePower\n\ + ldr r1, _0803BA7C @ =gBattleMoves\n\ + ldr r3, [sp, 0x8]\n\ + lsls r0, r3, 1\n\ + adds r0, r3\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r0, [r0, 0x1]\n\ + strh r0, [r2]\n\ + b _0803BA84\n\ + .align 2, 0\n\ +_0803BA78: .4byte gBattleMovePower\n\ +_0803BA7C: .4byte gBattleMoves\n\ +_0803BA80:\n\ + ldr r0, _0803BA9C @ =gBattleMovePower\n\ + strh r3, [r0]\n\ +_0803BA84:\n\ + cmp r6, 0\n\ + bne _0803BAA4\n\ + ldr r1, _0803BAA0 @ =gBattleMoves\n\ + ldr r6, [sp, 0x8]\n\ + lsls r0, r6, 1\n\ + adds r0, r6\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r0, [r0, 0x2]\n\ + mov r9, r0\n\ + b _0803BAAE\n\ + .align 2, 0\n\ +_0803BA9C: .4byte gBattleMovePower\n\ +_0803BAA0: .4byte gBattleMoves\n\ +_0803BAA4:\n\ + movs r0, 0x3F\n\ + mov r9, r0\n\ + mov r1, r9\n\ + ands r1, r6\n\ + mov r9, r1\n\ +_0803BAAE:\n\ + ldrh r6, [r7, 0x2]\n\ + ldr r2, [sp, 0x4]\n\ + ldrh r2, [r2, 0x4]\n\ + str r2, [sp, 0x14]\n\ + ldrh r3, [r7, 0x8]\n\ + mov r8, r3\n\ + ldr r0, [sp, 0x4]\n\ + ldrh r0, [r0, 0xA]\n\ + str r0, [sp, 0x18]\n\ + ldrh r0, [r7, 0x2E]\n\ + cmp r0, 0xAF\n\ + bne _0803BAE0\n\ + ldr r1, _0803BADC @ =gEnigmaBerries\n\ + ldr r2, [sp, 0x10]\n\ + lsls r0, r2, 3\n\ + subs r0, r2\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r3, [r0, 0x7]\n\ + mov r10, r3\n\ + ldrb r0, [r0, 0x1A]\n\ + b _0803BAF6\n\ + .align 2, 0\n\ +_0803BADC: .4byte gEnigmaBerries\n\ +_0803BAE0:\n\ + ldrh r0, [r7, 0x2E]\n\ + bl ItemId_GetHoldEffect\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ + ldrh r0, [r7, 0x2E]\n\ + bl ItemId_GetHoldEffectParam\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ +_0803BAF6:\n\ + str r0, [sp, 0x20]\n\ + ldr r1, [sp, 0x4]\n\ + ldrh r0, [r1, 0x2E]\n\ + cmp r0, 0xAF\n\ + bne _0803BB26\n\ + ldr r1, _0803BB10 @ =gEnigmaBerries\n\ + lsls r0, r4, 3\n\ + subs r0, r4\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r0, [r0, 0x7]\n\ + str r0, [sp, 0x1C]\n\ + b _0803BB3C\n\ + .align 2, 0\n\ +_0803BB10: .4byte gEnigmaBerries\n\ +_0803BB14:\n\ + ldr r0, [sp, 0x20]\n\ + adds r0, 0x64\n\ + muls r0, r6\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + b _0803BCDC\n\ +_0803BB26:\n\ + ldr r2, [sp, 0x4]\n\ + ldrh r0, [r2, 0x2E]\n\ + bl ItemId_GetHoldEffect\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x1C]\n\ + ldr r3, [sp, 0x4]\n\ + ldrh r0, [r3, 0x2E]\n\ + bl ItemId_GetHoldEffectParam\n\ +_0803BB3C:\n\ + adds r0, r7, 0\n\ + adds r0, 0x20\n\ + ldrb r1, [r0]\n\ + str r0, [sp, 0x24]\n\ + cmp r1, 0x25\n\ + beq _0803BB4C\n\ + cmp r1, 0x4A\n\ + bne _0803BB50\n\ +_0803BB4C:\n\ + lsls r0, r6, 17\n\ + lsrs r6, r0, 16\n\ +_0803BB50:\n\ + ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + ldr r0, _0803BCBC @ =0x00000902\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803BB5E\n\ + b _0803BC78\n\ +_0803BB5E:\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803BB98\n\ + ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\ + ldrh r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + cmp r1, r0\n\ + beq _0803BB98\n\ + ldr r0, _0803BCC4 @ =0x00000807\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0803BB98\n\ + ldr r0, [sp, 0x10]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0803BB98\n\ + movs r0, 0x6E\n\ + muls r0, r6\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ +_0803BB98:\n\ + ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + ldr r0, _0803BCBC @ =0x00000902\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0803BC78\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803BBE2\n\ + ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\ + ldrh r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + cmp r1, r0\n\ + beq _0803BBE2\n\ + ldr r0, _0803BCC8 @ =0x0000080b\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0803BBE2\n\ + adds r0, r4, 0\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0803BBE2\n\ + movs r0, 0x6E\n\ + ldr r1, [sp, 0x14]\n\ + muls r0, r1\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x14]\n\ +_0803BBE2:\n\ + ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + ldr r0, _0803BCBC @ =0x00000902\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0803BC78\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803BC2E\n\ + ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\ + ldrh r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + cmp r1, r0\n\ + beq _0803BC2E\n\ + ldr r0, _0803BCCC @ =0x0000080d\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0803BC2E\n\ + ldr r0, [sp, 0x10]\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0803BC2E\n\ + movs r0, 0x6E\n\ + mov r2, r8\n\ + muls r2, r0\n\ + adds r0, r2, 0\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r8, r0\n\ +_0803BC2E:\n\ + ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + ldr r0, _0803BCBC @ =0x00000902\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0803BC78\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803BC78\n\ + ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\ + ldrh r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + cmp r1, r0\n\ + beq _0803BC78\n\ + ldr r0, _0803BCCC @ =0x0000080d\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0803BC78\n\ + adds r0, r4, 0\n\ + bl GetBankSide\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0803BC78\n\ + movs r0, 0x6E\n\ + ldr r3, [sp, 0x18]\n\ + muls r0, r3\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x18]\n\ +_0803BC78:\n\ + movs r2, 0\n\ + ldr r4, _0803BCD0 @ =gHoldEffectToType\n\ + ldr r0, [sp, 0x4]\n\ + adds r0, 0x20\n\ + str r0, [sp, 0x28]\n\ + adds r3, r4, 0\n\ +_0803BC84:\n\ + lsls r1, r2, 1\n\ + ldrb r0, [r3]\n\ + cmp r10, r0\n\ + bne _0803BCD4\n\ + adds r0, r4, 0x1\n\ + adds r0, r1, r0\n\ + ldrb r0, [r0]\n\ + cmp r9, r0\n\ + bne _0803BCD4\n\ + mov r1, r9\n\ + cmp r1, 0x8\n\ + bhi _0803BC9E\n\ + b _0803BB14\n\ +_0803BC9E:\n\ + ldr r0, [sp, 0x20]\n\ + adds r0, 0x64\n\ + mov r2, r8\n\ + muls r2, r0\n\ + adds r0, r2, 0\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r8, r0\n\ + b _0803BCDC\n\ + .align 2, 0\n\ +_0803BCB8: .4byte gBattleTypeFlags\n\ +_0803BCBC: .4byte 0x00000902\n\ +_0803BCC0: .4byte gTrainerBattleOpponent\n\ +_0803BCC4: .4byte 0x00000807\n\ +_0803BCC8: .4byte 0x0000080b\n\ +_0803BCCC: .4byte 0x0000080d\n\ +_0803BCD0: .4byte gHoldEffectToType\n\ +_0803BCD4:\n\ + adds r3, 0x2\n\ + adds r2, 0x1\n\ + cmp r2, 0x10\n\ + bls _0803BC84\n\ +_0803BCDC:\n\ + mov r3, r10\n\ + cmp r3, 0x1D\n\ + bne _0803BCF0\n\ + movs r0, 0x96\n\ + muls r0, r6\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ +_0803BCF0:\n\ + mov r0, r10\n\ + cmp r0, 0x22\n\ + bne _0803BD28\n\ + ldr r0, _0803BFDC @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0803BD28\n\ + ldr r1, _0803BFE0 @ =0xfffffe69\n\ + adds r0, r1, 0\n\ + ldrh r2, [r7]\n\ + adds r0, r2\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bhi _0803BD28\n\ + movs r0, 0x96\n\ + mov r3, r8\n\ + muls r3, r0\n\ + adds r0, r3, 0\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r8, r0\n\ +_0803BD28:\n\ + ldr r0, [sp, 0x1C]\n\ + cmp r0, 0x22\n\ + bne _0803BD60\n\ + ldr r0, _0803BFDC @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0803BD60\n\ + ldr r1, _0803BFE0 @ =0xfffffe69\n\ + adds r0, r1, 0\n\ + ldr r2, [sp, 0x4]\n\ + ldrh r2, [r2]\n\ + adds r0, r2\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bhi _0803BD60\n\ + movs r0, 0x96\n\ + ldr r3, [sp, 0x18]\n\ + muls r0, r3\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x18]\n\ +_0803BD60:\n\ + mov r0, r10\n\ + cmp r0, 0x23\n\ + bne _0803BD76\n\ + ldrh r1, [r7]\n\ + ldr r0, _0803BFE4 @ =0x00000175\n\ + cmp r1, r0\n\ + bne _0803BD76\n\ + mov r1, r8\n\ + lsls r0, r1, 17\n\ + lsrs r0, 16\n\ + mov r8, r0\n\ +_0803BD76:\n\ + ldr r2, [sp, 0x1C]\n\ + cmp r2, 0x24\n\ + bne _0803BD8E\n\ + ldr r3, [sp, 0x4]\n\ + ldrh r1, [r3]\n\ + ldr r0, _0803BFE4 @ =0x00000175\n\ + cmp r1, r0\n\ + bne _0803BD8E\n\ + ldr r1, [sp, 0x18]\n\ + lsls r0, r1, 17\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x18]\n\ +_0803BD8E:\n\ + mov r2, r10\n\ + cmp r2, 0x2D\n\ + bne _0803BDA2\n\ + ldrh r0, [r7]\n\ + cmp r0, 0x19\n\ + bne _0803BDA2\n\ + mov r3, r8\n\ + lsls r0, r3, 17\n\ + lsrs r0, 16\n\ + mov r8, r0\n\ +_0803BDA2:\n\ + ldr r0, [sp, 0x1C]\n\ + cmp r0, 0x40\n\ + bne _0803BDB8\n\ + ldr r1, [sp, 0x4]\n\ + ldrh r0, [r1]\n\ + cmp r0, 0x84\n\ + bne _0803BDB8\n\ + ldr r2, [sp, 0x14]\n\ + lsls r0, r2, 17\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x14]\n\ +_0803BDB8:\n\ + mov r3, r10\n\ + cmp r3, 0x41\n\ + bne _0803BDCE\n\ + ldrh r0, [r7]\n\ + subs r0, 0x68\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bhi _0803BDCE\n\ + lsls r0, r6, 17\n\ + lsrs r6, r0, 16\n\ +_0803BDCE:\n\ + ldr r1, [sp, 0x28]\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x2F\n\ + bne _0803BDE6\n\ + mov r2, r9\n\ + cmp r2, 0xA\n\ + beq _0803BDE0\n\ + cmp r2, 0xF\n\ + bne _0803BDE6\n\ +_0803BDE0:\n\ + mov r3, r8\n\ + lsrs r3, 1\n\ + mov r8, r3\n\ +_0803BDE6:\n\ + ldr r0, [sp, 0x24]\n\ + ldrb r4, [r0]\n\ + cmp r4, 0x37\n\ + bne _0803BDFC\n\ + movs r0, 0x96\n\ + muls r0, r6\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ +_0803BDFC:\n\ + cmp r4, 0x39\n\ + bne _0803BE2A\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0xE\n\ + movs r1, 0\n\ + movs r2, 0x3A\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0803BE2A\n\ + movs r0, 0x96\n\ + mov r1, r8\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r8, r0\n\ +_0803BE2A:\n\ + ldr r2, [sp, 0x24]\n\ + ldrb r0, [r2]\n\ + cmp r0, 0x3A\n\ + bne _0803BE5C\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0xE\n\ + movs r1, 0\n\ + movs r2, 0x39\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0803BE5C\n\ + movs r0, 0x96\n\ + mov r3, r8\n\ + muls r3, r0\n\ + adds r0, r3, 0\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r8, r0\n\ +_0803BE5C:\n\ + ldr r1, [sp, 0x24]\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x3E\n\ + bne _0803BE78\n\ + ldr r0, [r7, 0x4C]\n\ + cmp r0, 0\n\ + beq _0803BE78\n\ + movs r0, 0x96\n\ + muls r0, r6\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ +_0803BE78:\n\ + ldr r2, [sp, 0x28]\n\ + ldrb r0, [r2]\n\ + cmp r0, 0x3F\n\ + bne _0803BE9A\n\ + ldr r3, [sp, 0x4]\n\ + ldr r0, [r3, 0x4C]\n\ + cmp r0, 0\n\ + beq _0803BE9A\n\ + movs r0, 0x96\n\ + ldr r1, [sp, 0x14]\n\ + muls r0, r1\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x14]\n\ +_0803BE9A:\n\ + mov r2, r9\n\ + cmp r2, 0xD\n\ + bne _0803BEBE\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0xE\n\ + movs r1, 0\n\ + movs r2, 0\n\ + movs r3, 0xFD\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0803BEBE\n\ + ldr r1, _0803BFE8 @ =gBattleMovePower\n\ + ldrh r0, [r1]\n\ + lsrs r0, 1\n\ + strh r0, [r1]\n\ +_0803BEBE:\n\ + mov r3, r9\n\ + cmp r3, 0xA\n\ + bne _0803BEE2\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0xE\n\ + movs r1, 0\n\ + movs r2, 0\n\ + movs r3, 0xFE\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0803BEE2\n\ + ldr r1, _0803BFE8 @ =gBattleMovePower\n\ + ldrh r0, [r1]\n\ + lsrs r0, 1\n\ + strh r0, [r1]\n\ +_0803BEE2:\n\ + mov r0, r9\n\ + cmp r0, 0xC\n\ + bne _0803BF12\n\ + ldr r1, [sp, 0x24]\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x41\n\ + bne _0803BF12\n\ + ldrh r0, [r7, 0x2C]\n\ + movs r1, 0x3\n\ + bl __udivsi3\n\ + ldrh r1, [r7, 0x28]\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r1, r0\n\ + bhi _0803BF12\n\ + ldr r4, _0803BFE8 @ =gBattleMovePower\n\ + ldrh r1, [r4]\n\ + movs r0, 0x96\n\ + muls r0, r1\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + strh r0, [r4]\n\ +_0803BF12:\n\ + mov r2, r9\n\ + cmp r2, 0xA\n\ + bne _0803BF42\n\ + ldr r3, [sp, 0x24]\n\ + ldrb r0, [r3]\n\ + cmp r0, 0x42\n\ + bne _0803BF42\n\ + ldrh r0, [r7, 0x2C]\n\ + movs r1, 0x3\n\ + bl __udivsi3\n\ + ldrh r1, [r7, 0x28]\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r1, r0\n\ + bhi _0803BF42\n\ + ldr r4, _0803BFE8 @ =gBattleMovePower\n\ + ldrh r1, [r4]\n\ + movs r0, 0x96\n\ + muls r0, r1\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + strh r0, [r4]\n\ +_0803BF42:\n\ + mov r0, r9\n\ + cmp r0, 0xB\n\ + bne _0803BF72\n\ + ldr r1, [sp, 0x24]\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x43\n\ + bne _0803BF72\n\ + ldrh r0, [r7, 0x2C]\n\ + movs r1, 0x3\n\ + bl __udivsi3\n\ + ldrh r1, [r7, 0x28]\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r1, r0\n\ + bhi _0803BF72\n\ + ldr r4, _0803BFE8 @ =gBattleMovePower\n\ + ldrh r1, [r4]\n\ + movs r0, 0x96\n\ + muls r0, r1\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + strh r0, [r4]\n\ +_0803BF72:\n\ + mov r2, r9\n\ + cmp r2, 0x6\n\ + bne _0803BFA2\n\ + ldr r3, [sp, 0x24]\n\ + ldrb r0, [r3]\n\ + cmp r0, 0x44\n\ + bne _0803BFA2\n\ + ldrh r0, [r7, 0x2C]\n\ + movs r1, 0x3\n\ + bl __udivsi3\n\ + ldrh r1, [r7, 0x28]\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r1, r0\n\ + bhi _0803BFA2\n\ + ldr r4, _0803BFE8 @ =gBattleMovePower\n\ + ldrh r1, [r4]\n\ + movs r0, 0x96\n\ + muls r0, r1\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + strh r0, [r4]\n\ +_0803BFA2:\n\ + ldr r2, _0803BFEC @ =gBattleMoves\n\ + ldr r0, _0803BFF0 @ =gCurrentMove\n\ + ldrh r1, [r0]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x7\n\ + bne _0803BFBC\n\ + ldr r0, [sp, 0x14]\n\ + lsrs r0, 1\n\ + str r0, [sp, 0x14]\n\ +_0803BFBC:\n\ + mov r1, r9\n\ + cmp r1, 0x8\n\ + bls _0803BFC4\n\ + b _0803C122\n\ +_0803BFC4:\n\ + ldr r0, _0803BFF4 @ =gCritMultiplier\n\ + ldrb r1, [r0]\n\ + adds r4, r0, 0\n\ + cmp r1, 0x2\n\ + bne _0803C000\n\ + movs r0, 0x19\n\ + ldrsb r0, [r7, r0]\n\ + cmp r0, 0x6\n\ + ble _0803BFFC\n\ + ldr r2, _0803BFF8 @ =gStatStageRatios\n\ + b _0803C006\n\ + .align 2, 0\n\ +_0803BFDC: .4byte gBattleTypeFlags\n\ +_0803BFE0: .4byte 0xfffffe69\n\ +_0803BFE4: .4byte 0x00000175\n\ +_0803BFE8: .4byte gBattleMovePower\n\ +_0803BFEC: .4byte gBattleMoves\n\ +_0803BFF0: .4byte gCurrentMove\n\ +_0803BFF4: .4byte gCritMultiplier\n\ +_0803BFF8: .4byte gStatStageRatios\n\ +_0803BFFC:\n\ + adds r5, r6, 0\n\ + b _0803C01E\n\ +_0803C000:\n\ + ldr r2, _0803C050 @ =gStatStageRatios\n\ + movs r0, 0x19\n\ + ldrsb r0, [r7, r0]\n\ +_0803C006:\n\ + lsls r0, 1\n\ + adds r1, r0, r2\n\ + ldrb r1, [r1]\n\ + adds r5, r6, 0\n\ + muls r5, r1\n\ + adds r2, 0x1\n\ + adds r0, r2\n\ + ldrb r1, [r0]\n\ + adds r0, r5, 0\n\ + bl __divsi3\n\ + adds r5, r0, 0\n\ +_0803C01E:\n\ + ldr r0, _0803C054 @ =gBattleMovePower\n\ + ldrh r0, [r0]\n\ + muls r5, r0\n\ + adds r0, r7, 0\n\ + adds r0, 0x2A\n\ + ldrb r0, [r0]\n\ + lsls r0, 1\n\ + movs r1, 0x5\n\ + bl __divsi3\n\ + adds r0, 0x2\n\ + muls r5, r0\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x2\n\ + bne _0803C05C\n\ + ldr r2, [sp, 0x4]\n\ + movs r0, 0x1A\n\ + ldrsb r0, [r2, r0]\n\ + cmp r0, 0x5\n\ + bgt _0803C058\n\ + ldr r2, _0803C050 @ =gStatStageRatios\n\ + ldr r3, [sp, 0x4]\n\ + movs r0, 0x1A\n\ + ldrsb r0, [r3, r0]\n\ + b _0803C064\n\ + .align 2, 0\n\ +_0803C050: .4byte gStatStageRatios\n\ +_0803C054: .4byte gBattleMovePower\n\ +_0803C058:\n\ + ldr r3, [sp, 0x14]\n\ + b _0803C07E\n\ +_0803C05C:\n\ + ldr r2, _0803C0DC @ =gStatStageRatios\n\ + ldr r1, [sp, 0x4]\n\ + movs r0, 0x1A\n\ + ldrsb r0, [r1, r0]\n\ +_0803C064:\n\ + lsls r0, 1\n\ + adds r1, r0, r2\n\ + ldrb r1, [r1]\n\ + ldr r6, [sp, 0x14]\n\ + adds r3, r6, 0\n\ + muls r3, r1\n\ + adds r2, 0x1\n\ + adds r0, r2\n\ + ldrb r1, [r0]\n\ + adds r0, r3, 0\n\ + bl __divsi3\n\ + adds r3, r0, 0\n\ +_0803C07E:\n\ + adds r0, r5, 0\n\ + adds r1, r3, 0\n\ + bl __divsi3\n\ + adds r5, r0, 0\n\ + movs r1, 0x32\n\ + bl __divsi3\n\ + adds r5, r0, 0\n\ + ldr r0, [r7, 0x4C]\n\ + movs r1, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803C0A8\n\ + ldr r1, [sp, 0x24]\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x3E\n\ + beq _0803C0A8\n\ + lsrs r0, r5, 31\n\ + adds r0, r5, r0\n\ + asrs r5, r0, 1\n\ +_0803C0A8:\n\ + movs r0, 0x1\n\ + ldr r2, [sp, 0xC]\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _0803C0EA\n\ + ldrb r1, [r4]\n\ + cmp r1, 0x1\n\ + bne _0803C0EA\n\ + ldr r0, _0803C0E0 @ =gBattleTypeFlags\n\ + ldrh r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _0803C0E4\n\ + movs r0, 0x2\n\ + bl CountAliveMons\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x2\n\ + bne _0803C0E4\n\ + adds r0, r5, 0\n\ + movs r1, 0x3\n\ + bl __divsi3\n\ + lsls r5, r0, 1\n\ + b _0803C0EA\n\ + .align 2, 0\n\ +_0803C0DC: .4byte gStatStageRatios\n\ +_0803C0E0: .4byte gBattleTypeFlags\n\ +_0803C0E4:\n\ + lsrs r0, r5, 31\n\ + adds r0, r5, r0\n\ + asrs r5, r0, 1\n\ +_0803C0EA:\n\ + ldr r0, _0803C148 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803C11C\n\ + ldr r0, _0803C14C @ =gBattleMoves\n\ + ldr r3, [sp, 0x8]\n\ + lsls r1, r3, 1\n\ + adds r1, r3\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x6]\n\ + cmp r0, 0x8\n\ + bne _0803C11C\n\ + movs r0, 0x2\n\ + bl CountAliveMons\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x2\n\ + bne _0803C11C\n\ + lsrs r0, r5, 31\n\ + adds r0, r5, r0\n\ + asrs r5, r0, 1\n\ +_0803C11C:\n\ + cmp r5, 0\n\ + bne _0803C122\n\ + movs r5, 0x1\n\ +_0803C122:\n\ + mov r6, r9\n\ + cmp r6, 0x9\n\ + bne _0803C12A\n\ + movs r5, 0\n\ +_0803C12A:\n\ + mov r0, r9\n\ + cmp r0, 0x9\n\ + bhi _0803C132\n\ + b _0803C330\n\ +_0803C132:\n\ + ldr r0, _0803C150 @ =gCritMultiplier\n\ + ldrb r1, [r0]\n\ + adds r4, r0, 0\n\ + cmp r1, 0x2\n\ + bne _0803C15C\n\ + movs r0, 0x1C\n\ + ldrsb r0, [r7, r0]\n\ + cmp r0, 0x6\n\ + ble _0803C158\n\ + ldr r2, _0803C154 @ =gStatStageRatios\n\ + b _0803C162\n\ + .align 2, 0\n\ +_0803C148: .4byte gBattleTypeFlags\n\ +_0803C14C: .4byte gBattleMoves\n\ +_0803C150: .4byte gCritMultiplier\n\ +_0803C154: .4byte gStatStageRatios\n\ +_0803C158:\n\ + mov r5, r8\n\ + b _0803C17A\n\ +_0803C15C:\n\ + ldr r2, _0803C1A8 @ =gStatStageRatios\n\ + movs r0, 0x1C\n\ + ldrsb r0, [r7, r0]\n\ +_0803C162:\n\ + lsls r0, 1\n\ + adds r1, r0, r2\n\ + ldrb r1, [r1]\n\ + mov r5, r8\n\ + muls r5, r1\n\ + adds r2, 0x1\n\ + adds r0, r2\n\ + ldrb r1, [r0]\n\ + adds r0, r5, 0\n\ + bl __divsi3\n\ + adds r5, r0, 0\n\ +_0803C17A:\n\ + ldr r0, _0803C1AC @ =gBattleMovePower\n\ + ldrh r0, [r0]\n\ + muls r5, r0\n\ + adds r0, r7, 0\n\ + adds r0, 0x2A\n\ + ldrb r0, [r0]\n\ + lsls r0, 1\n\ + movs r1, 0x5\n\ + bl __divsi3\n\ + adds r0, 0x2\n\ + muls r5, r0\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x2\n\ + bne _0803C1B4\n\ + ldr r1, [sp, 0x4]\n\ + movs r0, 0x1D\n\ + ldrsb r0, [r1, r0]\n\ + cmp r0, 0x5\n\ + bgt _0803C1B0\n\ + ldr r2, _0803C1A8 @ =gStatStageRatios\n\ + b _0803C1BC\n\ + .align 2, 0\n\ +_0803C1A8: .4byte gStatStageRatios\n\ +_0803C1AC: .4byte gBattleMovePower\n\ +_0803C1B0:\n\ + ldr r3, [sp, 0x18]\n\ + b _0803C1D6\n\ +_0803C1B4:\n\ + ldr r2, _0803C21C @ =gStatStageRatios\n\ + ldr r1, [sp, 0x4]\n\ + movs r0, 0x1D\n\ + ldrsb r0, [r1, r0]\n\ +_0803C1BC:\n\ + lsls r0, 1\n\ + adds r1, r0, r2\n\ + ldrb r1, [r1]\n\ + ldr r6, [sp, 0x18]\n\ + adds r3, r6, 0\n\ + muls r3, r1\n\ + adds r2, 0x1\n\ + adds r0, r2\n\ + ldrb r1, [r0]\n\ + adds r0, r3, 0\n\ + bl __divsi3\n\ + adds r3, r0, 0\n\ +_0803C1D6:\n\ + adds r0, r5, 0\n\ + adds r1, r3, 0\n\ + bl __divsi3\n\ + adds r5, r0, 0\n\ + movs r1, 0x32\n\ + bl __divsi3\n\ + adds r5, r0, 0\n\ + movs r0, 0x2\n\ + ldr r1, [sp, 0xC]\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803C22A\n\ + ldrb r1, [r4]\n\ + cmp r1, 0x1\n\ + bne _0803C22A\n\ + ldr r0, _0803C220 @ =gBattleTypeFlags\n\ + ldrh r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + beq _0803C224\n\ + movs r0, 0x2\n\ + bl CountAliveMons\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x2\n\ + bne _0803C224\n\ + adds r0, r5, 0\n\ + movs r1, 0x3\n\ + bl __divsi3\n\ + lsls r5, r0, 1\n\ + b _0803C22A\n\ + .align 2, 0\n\ +_0803C21C: .4byte gStatStageRatios\n\ +_0803C220: .4byte gBattleTypeFlags\n\ +_0803C224:\n\ + lsrs r0, r5, 31\n\ + adds r0, r5, r0\n\ + asrs r5, r0, 1\n\ +_0803C22A:\n\ + ldr r0, _0803C2A4 @ =gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803C25C\n\ + ldr r0, _0803C2A8 @ =gBattleMoves\n\ + ldr r2, [sp, 0x8]\n\ + lsls r1, r2, 1\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x6]\n\ + cmp r0, 0x8\n\ + bne _0803C25C\n\ + movs r0, 0x2\n\ + bl CountAliveMons\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x2\n\ + bne _0803C25C\n\ + lsrs r0, r5, 31\n\ + adds r0, r5, r0\n\ + asrs r5, r0, 1\n\ +_0803C25C:\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0xE\n\ + movs r1, 0\n\ + movs r2, 0xD\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0\n\ + bne _0803C30C\n\ + str r0, [sp]\n\ + movs r0, 0xE\n\ + movs r1, 0\n\ + movs r2, 0x4D\n\ + movs r3, 0\n\ + bl AbilityBattleEffects\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0803C30C\n\ + ldr r2, _0803C2AC @ =gBattleWeather\n\ + ldrh r1, [r2]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + adds r4, r2, 0\n\ + cmp r0, 0\n\ + beq _0803C2C4\n\ + mov r3, r9\n\ + cmp r3, 0xA\n\ + beq _0803C2B0\n\ + cmp r3, 0xB\n\ + beq _0803C2B8\n\ + b _0803C2C4\n\ + .align 2, 0\n\ +_0803C2A4: .4byte gBattleTypeFlags\n\ +_0803C2A8: .4byte gBattleMoves\n\ +_0803C2AC: .4byte gBattleWeather\n\ +_0803C2B0:\n\ + lsrs r0, r5, 31\n\ + adds r0, r5, r0\n\ + asrs r5, r0, 1\n\ + b _0803C2C4\n\ +_0803C2B8:\n\ + lsls r0, r5, 4\n\ + subs r0, r5\n\ + movs r1, 0xA\n\ + bl __divsi3\n\ + adds r5, r0, 0\n\ +_0803C2C4:\n\ + ldrh r1, [r4]\n\ + movs r0, 0x9F\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803C2DC\n\ + ldr r0, _0803C2F4 @ =gCurrentMove\n\ + ldrh r0, [r0]\n\ + cmp r0, 0x4C\n\ + bne _0803C2DC\n\ + lsrs r0, r5, 31\n\ + adds r0, r5, r0\n\ + asrs r5, r0, 1\n\ +_0803C2DC:\n\ + ldrh r1, [r4]\n\ + movs r0, 0x60\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803C30C\n\ + mov r6, r9\n\ + cmp r6, 0xA\n\ + beq _0803C2F8\n\ + cmp r6, 0xB\n\ + beq _0803C306\n\ + b _0803C30C\n\ + .align 2, 0\n\ +_0803C2F4: .4byte gCurrentMove\n\ +_0803C2F8:\n\ + lsls r0, r5, 4\n\ + subs r0, r5\n\ + movs r1, 0xA\n\ + bl __divsi3\n\ + adds r5, r0, 0\n\ + b _0803C30C\n\ +_0803C306:\n\ + lsrs r0, r5, 31\n\ + adds r0, r5, r0\n\ + asrs r5, r0, 1\n\ +_0803C30C:\n\ + ldr r1, _0803C344 @ =0x02017100\n\ + ldr r2, [sp, 0x10]\n\ + lsls r0, r2, 2\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + movs r1, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0803C330\n\ + mov r3, r9\n\ + cmp r3, 0xA\n\ + bne _0803C330\n\ + lsls r0, r5, 4\n\ + subs r0, r5\n\ + movs r1, 0xA\n\ + bl __divsi3\n\ + adds r5, r0, 0\n\ +_0803C330:\n\ + adds r0, r5, 0x2\n\ + add sp, 0x2C\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_0803C344: .4byte 0x02017100\n\ + .syntax divided"); +} +#endif diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c new file mode 100644 index 000000000..0ae98af09 --- /dev/null +++ b/src/battle/contest_link_80C857C.c @@ -0,0 +1,55 @@ +#include "global.h" +#include "link.h" + +#if GERMAN + +void de_sub_80C9274(bool32 arg0) { + if (deUnkValue2 != 1) + { + return; + } + + if (arg0) + { + deUnkValue2 = 3; + } + else + { + deUnkValue2 = 2; + } +} + +void de_sub_80C9294(bool32 arg0) { + if (deUnkValue2 == 1) + { + if (arg0) + { + deUnkValue2 = 3; + } + else + { + deUnkValue2 = 2; + } + + return; + } + + + if (deUnkValue2 == 2) + { + SendBlock(0, sBlockRequestLookupTable[deUnkValue1].address, sBlockRequestLookupTable[deUnkValue1].size); + + if (arg0) + { + deUnkValue2 = 0; + } + else + { + deUnkValue2 = 1; + } + + return; + } +} + +#endif diff --git a/src/battle/pokeball.c b/src/battle/pokeball.c new file mode 100644 index 000000000..ee3b95678 --- /dev/null +++ b/src/battle/pokeball.c @@ -0,0 +1,1193 @@ +#include "global.h" +#include "gba/m4a_internal.h" +#include "battle.h" +#include "decompress.h" +#include "graphics.h" +#include "m4a.h" +#include "main.h" +#include "pokeball.h" +#include "pokemon.h" +#include "rom_8077ABC.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" +#include "util.h" + +extern struct MusicPlayerInfo gMPlay_BGM; +extern u16 gBattleTypeFlags; +extern u8 gBankTarget; +extern u8 gActiveBank; +extern u16 gBattlePartyID[]; +extern u8 gObjectBankIDs[]; +extern u8 gDoingBattleAnim; +extern u8 gHealthboxIDs[]; + +#define GFX_TAG_POKEBALL 55000 +#define GFX_TAG_GREATBALL 55001 +#define GFX_TAG_SAFARIBALL 55002 +#define GFX_TAG_ULTRABALL 55003 +#define GFX_TAG_MASTERBALL 55004 +#define GFX_TAG_NETBALL 55005 +#define GFX_TAG_DIVEBALL 55006 +#define GFX_TAG_NESTBALL 55007 +#define GFX_TAG_REPEATBALL 55008 +#define GFX_TAG_TIMERBALL 55009 +#define GFX_TAG_LUXURYBALL 55010 +#define GFX_TAG_PREMIERBALL 55011 + +static const struct CompressedSpriteSheet sBallSpriteSheets[] = +{ + {gInterfaceGfx_PokeBall, 384, GFX_TAG_POKEBALL}, + {gInterfaceGfx_GreatBall, 384, GFX_TAG_GREATBALL}, + {gInterfaceGfx_SafariBall, 384, GFX_TAG_SAFARIBALL}, + {gInterfaceGfx_UltraBall, 384, GFX_TAG_ULTRABALL}, + {gInterfaceGfx_MasterBall, 384, GFX_TAG_MASTERBALL}, + {gInterfaceGfx_NetBall, 384, GFX_TAG_NETBALL}, + {gInterfaceGfx_DiveBall, 384, GFX_TAG_DIVEBALL}, + {gInterfaceGfx_NestBall, 384, GFX_TAG_NESTBALL}, + {gInterfaceGfx_RepeatBall, 384, GFX_TAG_REPEATBALL}, + {gInterfaceGfx_TimerBall, 384, GFX_TAG_TIMERBALL}, + {gInterfaceGfx_LuxuryBall, 384, GFX_TAG_LUXURYBALL}, + {gInterfaceGfx_PremierBall, 384, GFX_TAG_PREMIERBALL}, +}; + +static const struct CompressedSpritePalette sBallSpritePalettes[] = +{ + {gInterfacePal_PokeBall, GFX_TAG_POKEBALL}, + {gInterfacePal_GreatBall, GFX_TAG_GREATBALL}, + {gInterfacePal_SafariBall, GFX_TAG_SAFARIBALL}, + {gInterfacePal_UltraBall, GFX_TAG_ULTRABALL}, + {gInterfacePal_MasterBall, GFX_TAG_MASTERBALL}, + {gInterfacePal_NetBall, GFX_TAG_NETBALL}, + {gInterfacePal_DiveBall, GFX_TAG_DIVEBALL}, + {gInterfacePal_NestBall, GFX_TAG_NESTBALL}, + {gInterfacePal_RepeatBall, GFX_TAG_REPEATBALL}, + {gInterfacePal_TimerBall, GFX_TAG_TIMERBALL}, + {gInterfacePal_LuxuryBall, GFX_TAG_LUXURYBALL}, + {gInterfacePal_PremierBall, GFX_TAG_PREMIERBALL}, +}; + +static const struct OamData sBallOamData = +{ + .y = 0, + .affineMode = 3, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sBallAnimSeq3[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sBallAnimSeq5[] = +{ + ANIMCMD_FRAME(4, 1), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sBallAnimSeq4[] = +{ + ANIMCMD_FRAME(8, 5), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sBallAnimSeq6[] = +{ + ANIMCMD_FRAME(12, 1), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sBallAnimSeq0[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sBallAnimSeq1[] = +{ + ANIMCMD_FRAME(4, 5), + ANIMCMD_FRAME(8, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sBallAnimSeq2[] = +{ + ANIMCMD_FRAME(4, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +static const union AnimCmd *const sBallAnimSequences[] = +{ + sBallAnimSeq0, + sBallAnimSeq1, + sBallAnimSeq2, + + // unused? + sBallAnimSeq3, + sBallAnimSeq4, + sBallAnimSeq5, + sBallAnimSeq6, +}; + +static const union AffineAnimCmd sBallAffineAnimSeq0[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sBallAffineAnimSeq1[] = +{ + AFFINEANIMCMD_FRAME(0, 0, -3, 1), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sBallAffineAnimSeq2[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 3, 1), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sBallAffineAnimSeq3[] = +{ + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sBallAffineAnimSeq4[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 25, 1), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd *const sBallAffineAnimSequences[] = +{ + sBallAffineAnimSeq0, + sBallAffineAnimSeq1, + sBallAffineAnimSeq2, + sBallAffineAnimSeq3, + sBallAffineAnimSeq4, +}; + +static void objc_0804ABD4(struct Sprite *sprite); +const struct SpriteTemplate gBallSpriteTemplates[] = +{ + { + .tileTag = GFX_TAG_POKEBALL, + .paletteTag = GFX_TAG_POKEBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = objc_0804ABD4, + }, + { + .tileTag = GFX_TAG_GREATBALL, + .paletteTag = GFX_TAG_GREATBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = objc_0804ABD4, + }, + { + .tileTag = GFX_TAG_SAFARIBALL, + .paletteTag = GFX_TAG_SAFARIBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = objc_0804ABD4, + }, + { + .tileTag = GFX_TAG_ULTRABALL, + .paletteTag = GFX_TAG_ULTRABALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = objc_0804ABD4, + }, + { + .tileTag = GFX_TAG_MASTERBALL, + .paletteTag = GFX_TAG_MASTERBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = objc_0804ABD4, + }, + { + .tileTag = GFX_TAG_NETBALL, + .paletteTag = GFX_TAG_NETBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = objc_0804ABD4, + }, + { + .tileTag = GFX_TAG_DIVEBALL, + .paletteTag = GFX_TAG_DIVEBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = objc_0804ABD4, + }, + { + .tileTag = GFX_TAG_NESTBALL, + .paletteTag = GFX_TAG_NESTBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = objc_0804ABD4, + }, + { + .tileTag = GFX_TAG_REPEATBALL, + .paletteTag = GFX_TAG_REPEATBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = objc_0804ABD4, + }, + { + .tileTag = GFX_TAG_TIMERBALL, + .paletteTag = GFX_TAG_TIMERBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = objc_0804ABD4, + }, + { + .tileTag = GFX_TAG_LUXURYBALL, + .paletteTag = GFX_TAG_LUXURYBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = objc_0804ABD4, + }, + { + .tileTag = GFX_TAG_PREMIERBALL, + .paletteTag = GFX_TAG_PREMIERBALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sBallAffineAnimSequences, + .callback = objc_0804ABD4, + }, +}; + +extern u32 ball_number_to_ball_processing_index(u16); // not sure of return type +extern void sub_80786EC(); +extern bool8 sub_8078718(struct Sprite *); +extern u8 sub_814086C(u8, u8, int, int, u8); +extern u8 sub_8141314(u8, u8, int, u8); + +static void sub_8046464(u8); +static void sub_80466E8(struct Sprite *); +static void sub_80466F4(struct Sprite *); +static void sub_8046760(struct Sprite *); +static void sub_80467F8(struct Sprite *); +static void sub_804684C(struct Sprite *); +static void sub_8046944(struct Sprite *); +static void sub_8046984(struct Sprite *); +static void sub_8046C78(struct Sprite *); +static void sub_8046E7C(struct Sprite *); +static void sub_8046E9C(struct Sprite *); +static void sub_8046FBC(struct Sprite *); +static void sub_8047074(struct Sprite *); +static void sub_80470C4(struct Sprite *); +static void sub_8047230(struct Sprite *); +static void sub_8047254(struct Sprite *); +static void sub_80473D0(struct Sprite *); +static void sub_804748C(struct Sprite *); +static void sub_8047638(struct Sprite *); +static void sub_80476E0(struct Sprite *); +static void sub_8047754(struct Sprite *); +static void sub_804780C(struct Sprite *); +static void sub_8047830(struct Sprite *); +static void oamc_804BEB4(struct Sprite *); +static u16 sub_8047978(u8); + +u8 sub_8046400(u16 a, u8 b) +{ + u8 taskId; + + gDoingBattleAnim = 1; + ewram17810[gActiveBank].unk0_3 = 1; + taskId = CreateTask(sub_8046464, 5); + gTasks[taskId].data[1] = a; + gTasks[taskId].data[2] = b; + gTasks[taskId].data[3] = gActiveBank; + return 0; +} + +static void sub_8046464(u8 taskId) +{ + bool8 sp0 = FALSE; + u16 r8; + u8 r5; + u16 ball; + u8 r4; + u8 spriteId; + + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[0]++; + return; + } + r8 = gTasks[taskId].data[2]; + r5 = gTasks[taskId].data[3]; + if (GetBankSide(r5) != 0) + ball = GetMonData(&gEnemyParty[gBattlePartyID[r5]], MON_DATA_POKEBALL); + else + ball = GetMonData(&gPlayerParty[gBattlePartyID[r5]], MON_DATA_POKEBALL); + r4 = ball_number_to_ball_processing_index(ball); + sub_80478DC(r4); + spriteId = CreateSprite(&gBallSpriteTemplates[r4], 32, 80, 0x1D); + gSprites[spriteId].data0 = 0x80; + gSprites[spriteId].data1 = 0; + gSprites[spriteId].data7 = r8; + switch (r8) + { + case 0xFF: + gBankTarget = r5; + gSprites[spriteId].pos1.x = 24; + gSprites[spriteId].pos1.y = 68; + gSprites[spriteId].callback = sub_8047074; + break; + case 0xFE: + gSprites[spriteId].pos1.x = sub_8077ABC(r5, 0); + gSprites[spriteId].pos1.y = sub_8077ABC(r5, 1) + 24; + gBankTarget = r5; + gSprites[spriteId].data0 = 0; + gSprites[spriteId].callback = sub_8047254; + break; + default: + gBankTarget = GetBankByPlayerAI(1); + sp0 = TRUE; + break; + } + gSprites[spriteId].data6 = gBankTarget; + if (!sp0) + { + DestroyTask(taskId); + return; + } + gSprites[spriteId].data0 = 0x22; + gSprites[spriteId].data2 = sub_8077ABC(gBankTarget, 0); + gSprites[spriteId].data4 = sub_8077ABC(gBankTarget, 1) - 16; + gSprites[spriteId].data5 = -40; + sub_80786EC(&gSprites[spriteId]); + gSprites[spriteId].oam.affineParam = taskId; + gTasks[taskId].data[4] = gBankTarget; + gTasks[taskId].func = TaskDummy; + PlaySE(SE_NAGERU); +} + +static void objc_0804ABD4(struct Sprite *sprite) +{ + if (sub_8078718(sprite)) + { + u8 taskId = sprite->oam.affineParam; + u8 r5 = gTasks[taskId].data[4]; + u8 r8 = gTasks[taskId].data[2]; + u32 r4; // not sure of this type + + StartSpriteAnim(sprite, 1); + sprite->affineAnimPaused = TRUE; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->data5 = 0; + r4 = ball_number_to_ball_processing_index(sub_8047978(r5)); + sub_814086C(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, r4); + sprite->data0 = sub_8141314(0, r5, 14, r4); + sprite->data6 = r5; + sprite->data7 = r8; + DestroyTask(taskId); + sprite->callback = sub_80466E8; + } +} + +static void sub_80466E8(struct Sprite *sprite) +{ + sprite->callback = sub_80466F4; +} + +static void sub_80466F4(struct Sprite *sprite) +{ + sprite->data5++; + if (sprite->data5 == 10) + { + sprite->data5 = 0; + sprite->callback = sub_8046760; + StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data6]], 2); + AnimateSprite(&gSprites[gObjectBankIDs[sprite->data6]]); + gSprites[gObjectBankIDs[sprite->data6]].data1 = 0; + } +} + +static void sub_8046760(struct Sprite *sprite) +{ + sprite->data5++; + if (sprite->data5 == 11) + PlaySE(SE_SUIKOMU); + if (gSprites[gObjectBankIDs[sprite->data6]].affineAnimEnded) + { + StartSpriteAnim(sprite, 2); + gSprites[gObjectBankIDs[sprite->data6]].invisible = TRUE; + sprite->data5 = 0; + sprite->callback = sub_80467F8; + } + else + { + gSprites[gObjectBankIDs[sprite->data6]].data1 += 0x60; + gSprites[gObjectBankIDs[sprite->data6]].pos2.y = -gSprites[gObjectBankIDs[sprite->data6]].data1 >> 8; + } +} + +static void sub_80467F8(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + sprite->data5++; + if (sprite->data5 == 1) + { + sprite->data3 = 0; + sprite->data4 = 32; + sprite->data5 = 0; + sprite->pos1.y += Cos(0, 32); + sprite->pos2.y = -Cos(0, sprite->data4); + sprite->callback = sub_804684C; + } + } +} + +static void sub_804684C(struct Sprite *sprite) +{ + bool8 r5 = FALSE; + + switch (sprite->data3 & 0xFF) + { + case 0: + sprite->pos2.y = -Cos(sprite->data5, sprite->data4); + sprite->data5 += 4 + (sprite->data3 >> 8); + if (sprite->data5 >= 64) + { + sprite->data4 -= 10; + sprite->data3 += 0x101; + if (sprite->data3 >> 8 == 4) + r5 = TRUE; + switch (sprite->data3 >> 8) + { + case 1: + PlaySE(SE_KON); + break; + case 2: + PlaySE(SE_KON2); + break; + case 3: + PlaySE(SE_KON3); + break; + default: + PlaySE(SE_KON4); + break; + } + } + break; + case 1: + sprite->pos2.y = -Cos(sprite->data5, sprite->data4); + sprite->data5 -= 4 + (sprite->data3 >> 8); + if (sprite->data5 <= 0) + { + sprite->data5 = 0; + sprite->data3 &= 0xFF00; + } + break; + } + if (r5) + { + sprite->data3 = 0; + sprite->pos1.y += Cos(64, 32); + sprite->pos2.y = 0; + if (sprite->data7 == 0) + { + sprite->callback = sub_8046C78; + } + else + { + sprite->callback = sub_8046944; + sprite->data4 = 1; + sprite->data5 = 0; + } + } +} + +static void sub_8046944(struct Sprite *sprite) +{ + sprite->data3++; + if (sprite->data3 == 31) + { + sprite->data3 = 0; + sprite->affineAnimPaused = TRUE; + StartSpriteAffineAnim(sprite, 1); + sprite->callback = sub_8046984; + PlaySE(SE_BOWA); + } +} + +static void sub_8046984(struct Sprite *sprite) +{ + switch (sprite->data3 & 0xFF) + { + case 0: + case 2: + sprite->pos2.x += sprite->data4; + sprite->data5 += sprite->data4; + sprite->affineAnimPaused = FALSE; + if (sprite->data5 > 3 || sprite->data5 < -3) + { + sprite->data3++; + sprite->data5 = 0; + } + break; + case 1: + sprite->data5++; + if (sprite->data5 == 1) + { + sprite->data5 = 0; + sprite->data4 = -sprite->data4; + sprite->data3++; + sprite->affineAnimPaused = FALSE; + if (sprite->data4 < 0) + ChangeSpriteAffineAnim(sprite, 2); + else + ChangeSpriteAffineAnim(sprite, 1); + } + else + { + sprite->affineAnimPaused = TRUE; + } + break; + case 3: + sprite->data3 += 0x100; + if (sprite->data3 >> 8 == sprite->data7) + { + sprite->callback = sub_8046C78; + } + else + { + if (sprite->data7 == 4 && sprite->data3 >> 8 == 3) + { + sprite->callback = sub_8046E7C; + sprite->affineAnimPaused = TRUE; + } + else + { + sprite->data3++; + sprite->affineAnimPaused = TRUE; + } + } + break; + case 4: + default: + sprite->data5++; + if (sprite->data5 == 31) + { + sprite->data5 = 0; + sprite->data3 &= 0xFF00; + StartSpriteAffineAnim(sprite, 3); + if (sprite->data4 < 0) + StartSpriteAffineAnim(sprite, 2); + else + StartSpriteAffineAnim(sprite, 1); + PlaySE(SE_BOWA); + } + break; + } +} + +static void sub_8046AD0(u8 taskId) +{ + u8 r6 = gTasks[taskId].data[2]; + u8 r3 = gTasks[taskId].data[1]; + u16 species = gTasks[taskId].data[0]; + + switch (gTasks[taskId].data[15]) + { + case 0: + default: + if (gTasks[taskId].data[8] < 3) + gTasks[taskId].data[8]++; + else + gTasks[taskId].data[15] = r6 + 1; + break; + case 1: + PlayCry1(species, r3); + DestroyTask(taskId); + break; + case 2: + StopCryAndClearCrySongs(); + gTasks[taskId].data[10] = 3; + gTasks[taskId].data[15] = 20; + break; + case 20: + if (gTasks[taskId].data[10] != 0) + { + gTasks[taskId].data[10]--; + break; + } + PlayCry4(species, r3, 1); + DestroyTask(taskId); + break; + case 3: + gTasks[taskId].data[10] = 6; + gTasks[taskId].data[15] = 30; + break; + case 30: + if (gTasks[taskId].data[10] != 0) + { + gTasks[taskId].data[10]--; + break; + } + gTasks[taskId].data[15]++; + // fall through + case 31: + if (!IsCryPlayingOrClearCrySongs()) + { + StopCryAndClearCrySongs(); + gTasks[taskId].data[10] = 3; + gTasks[taskId].data[15]++; + } + break; + case 32: + if (gTasks[taskId].data[10] != 0) + { + gTasks[taskId].data[10]--; + break; + } + PlayCry4(species, r3, 0); + DestroyTask(taskId); + break; + } +} + +static void sub_8046C78(struct Sprite *sprite) +{ + u8 r5 = sprite->data6; + u32 r4; // not sure of this type + + StartSpriteAnim(sprite, 1); + r4 = ball_number_to_ball_processing_index(sub_8047978(r5)); + sub_814086C(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, r4); + sprite->data0 = sub_8141314(1, sprite->data6, 14, r4); + sprite->callback = sub_8046E9C; + if (gMain.inBattle) + { + struct Pokemon *pkmn; + u16 species; + s8 r8; + u16 r4_2; + u8 taskId; + + if (GetBankSide(r5) != 0) + { + pkmn = &gEnemyParty[gBattlePartyID[r5]]; + r8 = 25; + } + else + { + pkmn = &gPlayerParty[gBattlePartyID[r5]]; + r8 = -25; + } + species = GetMonData(pkmn, MON_DATA_SPECIES); + if ((r5 == GetBankByPlayerAI(0) || r5 == GetBankByPlayerAI(1)) + && IsDoubleBattle() && ewram17840.unk9_0) + { + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (IsBGMPlaying()) + m4aMPlayStop(&gMPlay_BGM); + } + else + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128); + } + } + if (!IsDoubleBattle() || !ewram17840.unk9_0) + r4_2 = 0; + else if (r5 == GetBankByPlayerAI(0) || r5 == GetBankByPlayerAI(1)) + r4_2 = 1; + else + r4_2 = 2; + taskId = CreateTask(sub_8046AD0, 3); + gTasks[taskId].data[0] = species; + gTasks[taskId].data[1] = r8; + gTasks[taskId].data[2] = r4_2; + gTasks[taskId].data[15] = 0; + } + StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data6]], 1); + AnimateSprite(&gSprites[gObjectBankIDs[sprite->data6]]); + gSprites[gObjectBankIDs[sprite->data6]].data1 = 0x1000; +} + +static void sub_8046E7C(struct Sprite *sprite) +{ + sprite->animPaused = TRUE; + sprite->callback = sub_8046FBC; + sprite->data3 = 0; + sprite->data4 = 0; + sprite->data5 = 0; +} + +static void sub_8046E9C(struct Sprite *sprite) +{ + bool8 r7 = FALSE; + u8 r4 = sprite->data6; + + gSprites[gObjectBankIDs[r4]].invisible = FALSE; + if (sprite->animEnded) + sprite->invisible = TRUE; + if (gSprites[gObjectBankIDs[r4]].affineAnimEnded) + { + StartSpriteAffineAnim(&gSprites[gObjectBankIDs[r4]], 0); + r7 = TRUE; + } + else + { + gSprites[gObjectBankIDs[r4]].data1 -= 288; + gSprites[gObjectBankIDs[r4]].pos2.y = gSprites[gObjectBankIDs[r4]].data1 >> 8; + } + if (sprite->animEnded && r7) + { + s32 i; + u32 r3; + + gSprites[gObjectBankIDs[r4]].pos2.y = 0; + gDoingBattleAnim = 0; + ewram17810[r4].unk0_3 = 0; + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + for (r3 = 0, i = 0; i < 4; i++) + { + if (ewram17810[i].unk0_3 == 0) + r3++; + } + if (r3 == 4) + { + for (i = 0; i < 12; i++) + sub_804794C(i); + } + } +} + +static void sub_8046FBC(struct Sprite *sprite) +{ + u8 r7 = sprite->data6; + + sprite->data4++; + if (sprite->data4 == 40) + { + return; + } + else if (sprite->data4 == 95) + { + gDoingBattleAnim = 0; + m4aMPlayAllStop(); + PlaySE(BGM_FANFA5); + } + else if (sprite->data4 == 315) + { + FreeOamMatrix(gSprites[gObjectBankIDs[sprite->data6]].oam.matrixNum); + DestroySprite(&gSprites[gObjectBankIDs[sprite->data6]]); + DestroySpriteAndFreeResources(sprite); + if (gMain.inBattle) + ewram17810[r7].unk0_3 = 0; + } +} + +static void sub_8047074(struct Sprite *sprite) +{ + sprite->data0 = 25; + sprite->data2 = sub_8077ABC(sprite->data6, 2); + sprite->data4 = sub_8077ABC(sprite->data6, 3) + 24; + sprite->data5 = -30; + sprite->oam.affineParam = sprite->data6; + sub_80786EC(sprite); + sprite->callback = sub_80470C4; +} + +#define HIBYTE(x) (((x) >> 8) & 0xFF) + +static void sub_80470C4(struct Sprite *sprite) +{ + u32 r6; + u32 r7; + + if (HIBYTE(sprite->data7) >= 35 && HIBYTE(sprite->data7) < 80) + { + s16 r4; + + if ((sprite->oam.affineParam & 0xFF00) == 0) + { + r6 = sprite->data1 & 1; + r7 = sprite->data2 & 1; + sprite->data1 = ((sprite->data1 / 3) & ~1) | r6; + sprite->data2 = ((sprite->data2 / 3) & ~1) | r7; + StartSpriteAffineAnim(sprite, 4); + } + r4 = sprite->data0; + sub_8078B5C(sprite); + sprite->data7 += sprite->data6 / 3; + sprite->pos2.y += Sin(HIBYTE(sprite->data7), sprite->data5); + sprite->oam.affineParam += 0x100; + if ((sprite->oam.affineParam >> 8) % 3 != 0) + sprite->data0 = r4; + else + sprite->data0 = r4 - 1; + if (HIBYTE(sprite->data7) >= 80) + { + r6 = sprite->data1 & 1; + r7 = sprite->data2 & 1; + sprite->data1 = ((sprite->data1 * 3) & ~1) | r6; + sprite->data2 = ((sprite->data2 * 3) & ~1) | r7; + } + } + else + { + if (sub_8078718(sprite)) + { + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + sprite->data6 = sprite->oam.affineParam & 0xFF; + sprite->data0 = 0; + if (IsDoubleBattle() && ewram17840.unk9_0 + && sprite->data6 == GetBankByPlayerAI(2)) + sprite->callback = sub_8047230; + else + sprite->callback = sub_8046C78; + StartSpriteAffineAnim(sprite, 0); + } + } +} + +static void sub_8047230(struct Sprite *sprite) +{ + if (sprite->data0++ > 24) + { + sprite->data0 = 0; + sprite->callback = sub_8046C78; + } +} + +static void sub_8047254(struct Sprite *sprite) +{ + sprite->data0++; + if (sprite->data0 > 15) + { + sprite->data0 = 0; + if (IsDoubleBattle() && ewram17840.unk9_0 + && sprite->data6 == GetBankByPlayerAI(3)) + sprite->callback = sub_8047230; + else + sprite->callback = sub_8046C78; + } +} + +static u8 sub_80472B0(u8 a, u8 b, u8 c, u8 d) +{ + return sub_814086C(a, b, c, d, 0); +} + +static u8 sub_80472D8(u8 a, u8 b, u32 c) +{ + return sub_8141314(a, b, c, 0); +} + +void CreatePokeballSprite(u8 a, u8 b, u8 x, u8 y, u8 e, u8 f, u8 g, u32 h) +{ + u8 spriteId; + + LoadCompressedObjectPic(&sBallSpriteSheets[0]); + LoadCompressedObjectPalette(&sBallSpritePalettes[0]); + spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, f); + gSprites[spriteId].data0 = a; + gSprites[spriteId].data5 = gSprites[a].pos1.x; + gSprites[spriteId].data6 = gSprites[a].pos1.y; + gSprites[a].pos1.x = x; + gSprites[a].pos1.y = y; + gSprites[spriteId].data1 = g; + gSprites[spriteId].data2 = b; + gSprites[spriteId].data3 = h; + gSprites[spriteId].data4 = h >> 16; + gSprites[spriteId].oam.priority = e; + gSprites[spriteId].callback = sub_80473D0; + gSprites[a].invisible = TRUE; +} + +static void sub_80473D0(struct Sprite *sprite) +{ + if (sprite->data1 == 0) + { + u8 r5; + u8 r7 = sprite->data0; + u8 r8 = sprite->data2; + u32 r4 = (u16)sprite->data3 | ((u16)sprite->data4 << 16); + + if (sprite->subpriority != 0) + r5 = sprite->subpriority - 1; + else + r5 = 0; + StartSpriteAnim(sprite, 1); + sub_80472B0(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r5); + sprite->data1 = sub_80472D8(1, r8, r4); + sprite->callback = sub_804748C; + gSprites[r7].invisible = FALSE; + StartSpriteAffineAnim(&gSprites[r7], 1); + AnimateSprite(&gSprites[r7]); + gSprites[r7].data1 = 0x1000; + sprite->data7 = 0; + } + else + { + sprite->data1--; + } +} + +static void sub_804748C(struct Sprite *sprite) +{ + bool8 r12 = FALSE; + bool8 r6 = FALSE; + u8 r3 = sprite->data0; + u16 var1; + u16 var2; + + if (sprite->animEnded) + sprite->invisible = TRUE; + if (gSprites[r3].affineAnimEnded) + { + StartSpriteAffineAnim(&gSprites[r3], 0); + r12 = TRUE; + } + var1 = (sprite->data5 - sprite->pos1.x) * sprite->data7 / 128 + sprite->pos1.x; + var2 = (sprite->data6 - sprite->pos1.y) * sprite->data7 / 128 + sprite->pos1.y; + gSprites[r3].pos1.x = var1; + gSprites[r3].pos1.y = var2; + if (sprite->data7 < 128) + { + s16 sine = -(gSineTable[(u8)sprite->data7] / 8); + + sprite->data7 += 4; + gSprites[r3].pos2.x = sine; + gSprites[r3].pos2.y = sine; + } + else + { + gSprites[r3].pos1.x = sprite->data5; + gSprites[r3].pos1.y = sprite->data6; + gSprites[r3].pos2.x = 0; + gSprites[r3].pos2.y = 0; + r6 = TRUE; + } + if (sprite->animEnded && r12 && r6) + DestroySpriteAndFreeResources(sprite); +} + +u8 sub_8047580(u8 a, u8 b, u8 x, u8 y, u8 e, u8 f, u8 g, u32 h) +{ + u8 spriteId; + + LoadCompressedObjectPic(&sBallSpriteSheets[0]); + LoadCompressedObjectPalette(&sBallSpritePalettes[0]); + spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, f); + gSprites[spriteId].data0 = a; + gSprites[spriteId].data1 = g; + gSprites[spriteId].data2 = b; + gSprites[spriteId].data3 = h; + gSprites[spriteId].data4 = h >> 16; + gSprites[spriteId].oam.priority = e; + gSprites[spriteId].callback = sub_8047638; + return spriteId; +} + +static void sub_8047638(struct Sprite *sprite) +{ + if (sprite->data1 == 0) + { + u8 r6; + u8 r7 = sprite->data0; + u8 r8 = sprite->data2; + u32 r5 = (u16)sprite->data3 | ((u16)sprite->data4 << 16); + + if (sprite->subpriority != 0) + r6 = sprite->subpriority - 1; + else + r6 = 0; + StartSpriteAnim(sprite, 1); + sub_80472B0(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r6); + sprite->data1 = sub_80472D8(1, r8, r5); + sprite->callback = sub_80476E0; + StartSpriteAffineAnim(&gSprites[r7], 2); + AnimateSprite(&gSprites[r7]); + gSprites[r7].data1 = 0; + } + else + { + sprite->data1--; + } +} + +static void sub_80476E0(struct Sprite *sprite) +{ + u8 r1; + + sprite->data5++; + if (sprite->data5 == 11) + PlaySE(SE_SUIKOMU); + r1 = sprite->data0; + if (gSprites[r1].affineAnimEnded) + { + StartSpriteAnim(sprite, 2); + gSprites[r1].invisible = TRUE; + sprite->data5 = 0; + sprite->callback = sub_8047754; + } + else + { + gSprites[r1].data1 += 96; + gSprites[r1].pos2.y = -gSprites[r1].data1 >> 8; + } +} + +static void sub_8047754(struct Sprite *sprite) +{ + if (sprite->animEnded) + sprite->callback = SpriteCallbackDummy; +} + +void obj_delete_and_free_associated_resources_(struct Sprite *sprite) +{ + DestroySpriteAndFreeResources(sprite); +} + +void sub_804777C(u8 a) +{ + struct Sprite *sprite = &gSprites[gHealthboxIDs[a]]; + + sprite->data0 = 5; + sprite->data1 = 0; + sprite->pos2.x = 0x73; + sprite->pos2.y = 0; + sprite->callback = sub_8047830; + if (GetBankSide(a) != 0) + { + sprite->data0 = -sprite->data0; + sprite->data1 = -sprite->data1; + sprite->pos2.x = -sprite->pos2.x; + sprite->pos2.y = -sprite->pos2.y; + } + gSprites[sprite->data5].callback(&gSprites[sprite->data5]); + if (GetBankIdentity(a) == 2) + sprite->callback = sub_804780C; +} + +static void sub_804780C(struct Sprite *sprite) +{ + sprite->data1++; + if (sprite->data1 == 20) + { + sprite->data1 = 0; + sprite->callback = sub_8047830; + } +} + +static void sub_8047830(struct Sprite *sprite) +{ + sprite->pos2.x -= sprite->data0; + sprite->pos2.y -= sprite->data1; + if (sprite->pos2.x == 0 && sprite->pos2.y == 0) + sprite->callback = SpriteCallbackDummy; +} + +void sub_8047858(u8 a) +{ + u8 spriteId; + + spriteId = CreateInvisibleSpriteWithCallback(oamc_804BEB4); + gSprites[spriteId].data0 = 1; + gSprites[spriteId].data1 = gHealthboxIDs[a]; + gSprites[spriteId].callback = oamc_804BEB4; +} + +static void oamc_804BEB4(struct Sprite *sprite) +{ + u8 r1 = sprite->data1; + + gSprites[r1].pos2.y = sprite->data0; + sprite->data0 = -sprite->data0; + sprite->data2++; + if (sprite->data2 == 21) + { + gSprites[r1].pos2.x = 0; + gSprites[r1].pos2.y = 0; + DestroySprite(sprite); + } +} + +void sub_80478DC(u8 a) +{ + u16 var; + + if (GetSpriteTileStartByTag(sBallSpriteSheets[a].tag) == 0xFFFF) + { + LoadCompressedObjectPic(&sBallSpriteSheets[a]); + LoadCompressedObjectPalette(&sBallSpritePalettes[a]); + } + switch (a) + { + case 6: + case 10: + case 11: + break; + default: + var = GetSpriteTileStartByTag(sBallSpriteSheets[a].tag); + LZDecompressVram(gUnknown_08D030D0, (void *)(VRAM + 0x10100 + var * 32)); + break; + } +} + +void sub_804794C(u8 a) +{ + FreeSpriteTilesByTag(sBallSpriteSheets[a].tag); + FreeSpritePaletteByTag(sBallSpritePalettes[a].tag); +} + +static u16 sub_8047978(u8 a) +{ + if (GetBankSide(a) == 0) + return GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_POKEBALL); + else + return GetMonData(&gEnemyParty[gBattlePartyID[a]], MON_DATA_POKEBALL); +} diff --git a/src/battle/post_battle_event_funcs.c b/src/battle/post_battle_event_funcs.c new file mode 100644 index 000000000..8d85705c8 --- /dev/null +++ b/src/battle/post_battle_event_funcs.c @@ -0,0 +1,69 @@ +#include "global.h" +#include "event_data.h" +#include "hall_of_fame.h" +#include "load_save.h" +#include "main.h" +#include "pokemon.h" +#include "rom4.h" +#include "script_pokemon_80C4.h" + +extern u8 gUnknown_02039324; + +int GameClear(void) +{ + int i; + bool32 ribbonGet; + + HealPlayerParty(); + + if (FlagGet(SYS_GAME_CLEAR) == TRUE) + { + gUnknown_02039324 = 1; + } + else + { + gUnknown_02039324 = 0; + FlagSet(SYS_GAME_CLEAR); + } + + if (!GetGameStat(1)) + SetGameStat(1, (gSaveBlock2.playTimeHours << 16) | (gSaveBlock2.playTimeMinutes << 8) | gSaveBlock2.playTimeSeconds); + + SetSecretBase2Field_9(); + + if (gSaveBlock2.playerGender == MALE) + sub_80537CC(1); + else + sub_80537CC(2); + + ribbonGet = FALSE; + + for (i = 0; i < 6; i++) + { + u8 val; + u8 *ptr = &val; + if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT2) + && !GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT3) + && !GetMonData(&gPlayerParty[i], MON_DATA_CHAMPION_RIBBON)) + { + *ptr = 1; + SetMonData(&gPlayerParty[i], MON_DATA_CHAMPION_RIBBON, ptr); + ribbonGet = TRUE; + } + } + + if (ribbonGet == TRUE) + { + IncrementGameStat(42); + FlagSet(SYS_RIBBON_GET); + } + + SetMainCallback2(sub_8141F90); + return 0; +} + +int sp0C8_whiteout_maybe(void) +{ + SetMainCallback2(CB2_WhiteOut); + return 0; +} diff --git a/src/battle/smokescreen.c b/src/battle/smokescreen.c new file mode 100644 index 000000000..8345cb6ad --- /dev/null +++ b/src/battle/smokescreen.c @@ -0,0 +1,73 @@ +#include "global.h" +#include "data2.h" +#include "decompress.h" +#include "sprite.h" +#include "util.h" + + +static void sub_8046388(struct Sprite *); + + +u8 sub_8046234(s16 x, s16 y, u8 a3) +{ + u8 mainSpriteId; + u8 spriteId1, spriteId2, spriteId3, spriteId4; + struct Sprite *mainSprite; + + if (GetSpriteTileStartByTag(gUnknown_081FAEA4.tag) == 0xFFFF) + { + LoadCompressedObjectPic(&gUnknown_081FAEA4); + LoadCompressedObjectPalette(&gUnknown_081FAEAC); + } + + mainSpriteId = CreateInvisibleSpriteWithCallback(sub_8046388); + mainSprite = &gSprites[mainSpriteId]; + mainSprite->data1 = a3; + + spriteId1 = CreateSprite(&gSpriteTemplate_81FAF0C, x - 16, y - 16, 2); + gSprites[spriteId1].data0 = mainSpriteId; + mainSprite->data0++; + AnimateSprite(&gSprites[spriteId1]); + + spriteId2 = CreateSprite(&gSpriteTemplate_81FAF0C, x, y - 16, 2); + gSprites[spriteId2].data0 = mainSpriteId; + mainSprite->data0++; + StartSpriteAnim(&gSprites[spriteId2], 1); + AnimateSprite(&gSprites[spriteId2]); + + spriteId3 = CreateSprite(&gSpriteTemplate_81FAF0C, x - 16, y, 2); + gSprites[spriteId3].data0 = mainSpriteId; + mainSprite->data0++; + StartSpriteAnim(&gSprites[spriteId3], 2); + AnimateSprite(&gSprites[spriteId3]); + + spriteId4 = CreateSprite(&gSpriteTemplate_81FAF0C, x, y, 2); + gSprites[spriteId4].data0 = mainSpriteId; + mainSprite->data0++; + StartSpriteAnim(&gSprites[spriteId4], 3); + AnimateSprite(&gSprites[spriteId4]); + + return mainSpriteId; +} + +static void sub_8046388(struct Sprite *sprite) +{ + if (!sprite->data0) + { + FreeSpriteTilesByTag(gUnknown_081FAEA4.tag); + FreeSpritePaletteByTag(gUnknown_081FAEAC.tag); + if (!sprite->data1) + DestroySprite(sprite); + else + sprite->callback = SpriteCallbackDummy; + } +} + +void sub_80463CC(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + gSprites[sprite->data0].data0--; + DestroySprite(sprite); + } +} diff --git a/src/battle_10.c b/src/battle_10.c deleted file mode 100644 index 0237bab4b..000000000 --- a/src/battle_10.c +++ /dev/null @@ -1,1323 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_interface.h" -#include "data2.h" -#include "link.h" -#include "palette.h" -#include "rom_8077ABC.h" -#include "rom3.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "util.h" - -struct UnknownStruct3 -{ - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -extern u8 gActiveBank; -extern u8 gBattleBufferA[][0x200]; -extern u8 gObjectBankIDs[]; -extern u16 gBattlePartyID[]; -extern u8 gHealthboxIDs[]; -extern u16 gBattleTypeFlags; -extern u8 gBattleMonForms[]; -extern void (*gBattleBankFunc[])(void); -extern u32 *gDisableStructMoveAnim; -extern u32 gMoveDmgMoveAnim; -extern u16 gMovePowerMoveAnim; -extern u8 gHappinessMoveAnim; -extern u16 gWeatherMoveAnim; -extern u32 gPID_perBank[]; -extern u8 gAnimScriptActive; -extern void (*gAnimScriptCallback)(void); -extern u8 gDisplayedStringBattle[]; -extern bool8 gDoingBattleAnim; -extern u8 gBattleOutcome; -extern u16 gUnknown_02024DE8; -extern u8 gUnknown_02024E68[]; -extern struct SpriteTemplate gUnknown_02024E8C; -extern u8 gUnknown_0202F7C4; -extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; -extern u8 gUnknown_0300434C[]; - -extern u8 sub_8077F68(); -extern u8 sub_8079E90(); -extern u8 GetBankIdentity(u8); -extern void sub_8031794(struct Pokemon *, u8); -extern void sub_8037A74(void); -extern void sub_8032984(u8, u16); -extern void sub_8037E30(void); -extern void sub_80312F0(struct Sprite *); -extern u8 sub_8046400(); -extern void sub_8032A08(); -extern void sub_8043DB0(); -extern void sub_8037BBC(void); -extern s32 sub_803FC34(u16); -extern void sub_8031A6C(u16, u8); -extern void sub_80313A0(struct Sprite *); -extern void sub_803757C(void); -extern void oamt_add_pos2_onto_pos1(); -extern void oamt_set_x3A_32(); -extern void sub_8078B34(struct Sprite *); -extern void sub_80375B4(void); -extern void sub_8010384(struct Sprite *); -extern void sub_8037B78(void); -extern u8 sub_8031720(); -extern bool8 mplay_80342A4(u8); -extern void ExecuteMoveAnim(); -extern void sub_80326EC(); -extern void sub_8031F24(void); -extern void sub_80324BC(); -extern void BufferStringBattle(); -extern void sub_8037C2C(void); -extern void sub_8043D84(); -extern void sub_8037B24(void); -extern void sub_8045A5C(); -extern void sub_8037FAC(void); -extern void move_anim_start_t2_for_situation(); -extern void dp01t_0F_4_move_anim(void); -extern void sub_8047858(); -extern u8 GetBankSide(u8); -extern void sub_80E43C0(); -extern void sub_803A3A8(struct Sprite *); -extern void sub_8044CA0(u8); -extern void nullsub_47(void); -extern bool8 IsDoubleBattle(void); -extern void sub_8037840(void); -extern void sub_8031B74(); -extern u8 sub_8078874(); -extern u8 move_anim_start_t3(); -extern void sub_8037FD8(void); -extern void sub_8037F34(void); -extern void dp01_tbl4_exec_completed(void); - -u32 dp01_getattr_by_ch1_for_player_pokemon__(u8, u8 *); -void sub_8038900(u8); -void sub_8039430(u8, u8); -void sub_8039648(void); -void sub_8039B64(void); -void sub_803A2C4(u8); -void sub_803A4E0(void); - -void LinkOpponentHandleGetAttributes(void) -{ - u8 buffer[0x100]; - u32 r6 = 0; - u8 r4; - s32 i; - - if (gBattleBufferA[gActiveBank][2] == 0) - { - r6 = dp01_getattr_by_ch1_for_player_pokemon__(gBattlePartyID[gActiveBank], buffer); - } - else - { - r4 = gBattleBufferA[gActiveBank][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - r6 += dp01_getattr_by_ch1_for_player_pokemon__(i, buffer + r6); - r4 >>= 1; - } - } - dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, r6, buffer); - dp01_tbl4_exec_completed(); -} - -u32 dp01_getattr_by_ch1_for_player_pokemon__(u8 a, u8 *buffer) -{ - struct BattlePokemon battlePokemon; - struct UnknownStruct3 moveData; - u8 nickname[20]; - u8 *src; - s16 data16; - u32 data32; - s32 size = 0; - - switch (gBattleBufferA[gActiveBank][1]) - { - case 0: - battlePokemon.species = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); - battlePokemon.item = GetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) - { - battlePokemon.moves[size] = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + size); - battlePokemon.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); - } - battlePokemon.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - battlePokemon.friendship = GetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP); - battlePokemon.experience = GetMonData(&gEnemyParty[a], MON_DATA_EXP); - battlePokemon.hpIV = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); - battlePokemon.attackIV = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); - battlePokemon.defenseIV = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); - battlePokemon.spAttackIV = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); - battlePokemon.spDefenseIV = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); - battlePokemon.personality = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); - battlePokemon.status1 = GetMonData(&gEnemyParty[a], MON_DATA_STATUS); - battlePokemon.level = GetMonData(&gEnemyParty[a], MON_DATA_LEVEL); - battlePokemon.hp = GetMonData(&gEnemyParty[a], MON_DATA_HP); - battlePokemon.maxHP = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); - battlePokemon.attack = GetMonData(&gEnemyParty[a], MON_DATA_ATK); - battlePokemon.defense = GetMonData(&gEnemyParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gEnemyParty[a], MON_DATA_SPD); - battlePokemon.spAttack = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); - battlePokemon.spDefense = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); - battlePokemon.isEgg = GetMonData(&gEnemyParty[a], MON_DATA_IS_EGG); - battlePokemon.altAbility = GetMonData(&gEnemyParty[a], MON_DATA_ALT_ABILITY); - battlePokemon.otId = GetMonData(&gEnemyParty[a], MON_DATA_OT_ID); - GetMonData(&gEnemyParty[a], MON_DATA_NICKNAME, nickname); - StringCopy10(battlePokemon.nickname, nickname); - GetMonData(&gEnemyParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - src = (u8 *)&battlePokemon; - for (size = 0; size < sizeof(battlePokemon); size++) - buffer[size] = src[size]; - break; - case 1: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 2: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 3: - for (size = 0; size < 4; size++) - { - moveData.moves[size] = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + size); - moveData.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); - } - moveData.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - src = (u8 *)&moveData; - for (size = 0; size < sizeof(moveData); size++) - buffer[size] = src[size]; - break; - case 4: - case 5: - case 6: - case 7: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 8: - for (size = 0; size < 4; size++) - buffer[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); - buffer[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - size++; - break; - case 9: - case 10: - case 11: - case 12: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); - size = 1; - break; - case 17: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_OT_ID); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 18: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_EXP); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 19: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_EV); - size = 1; - break; - case 20: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_EV); - size = 1; - break; - case 21: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_EV); - size = 1; - break; - case 22: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_EV); - size = 1; - break; - case 23: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV); - size = 1; - break; - case 24: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_EV); - size = 1; - break; - case 25: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP); - size = 1; - break; - case 26: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_POKERUS); - size = 1; - break; - case 27: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_LOCATION); - size = 1; - break; - case 28: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_LEVEL); - size = 1; - break; - case 29: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_GAME); - size = 1; - break; - case 30: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_POKEBALL); - size = 1; - break; - case 31: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); - buffer[1] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); - buffer[2] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); - buffer[4] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); - buffer[5] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); - size = 6; - break; - case 32: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); - size = 1; - break; - case 33: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); - size = 1; - break; - case 34: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - size = 1; - break; - case 35: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); - size = 1; - break; - case 36: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); - size = 1; - break; - case 37: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); - size = 1; - break; - case 38: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 39: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_CHECKSUM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 40: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_STATUS); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 41: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_LEVEL); - size = 1; - break; - case 42: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 43: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 44: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_ATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 45: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_DEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 46: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPD); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 47: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 48: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 49: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_COOL); - size = 1; - break; - case 50: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_BEAUTY); - size = 1; - break; - case 51: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_CUTE); - size = 1; - break; - case 52: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SMART); - size = 1; - break; - case 53: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_TOUGH); - size = 1; - break; - case 54: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SHEEN); - size = 1; - break; - case 55: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_COOL_RIBBON); - size = 1; - break; - case 56: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_BEAUTY_RIBBON); - size = 1; - break; - case 57: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_CUTE_RIBBON); - size = 1; - break; - case 58: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SMART_RIBBON); - size = 1; - break; - case 59: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_TOUGH_RIBBON); - size = 1; - break; - } - return size; -} - -void sub_803889C(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_80388A8(void) -{ - u8 i; - u8 r4; - - if (gBattleBufferA[gActiveBank][2] == 0) - { - sub_8038900(gBattlePartyID[gActiveBank]); - } - else - { - r4 = gBattleBufferA[gActiveBank][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - sub_8038900(i); - r4 >>= 1; - } - } - dp01_tbl4_exec_completed(); -} - -void sub_8038900(u8 a) -{ - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; - struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; - s32 i; - - switch (gBattleBufferA[gActiveBank][1]) - { - case 0: - { - u8 iv; - - SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); - SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); - for (i = 0; i < 4; i++) - { - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); - } - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); - SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); - SetMonData(&gEnemyParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); - iv = battlePokemon->hpIV; - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, (u8 *)&iv); - iv = battlePokemon->attackIV; - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, (u8 *)&iv); - iv = battlePokemon->defenseIV; - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, (u8 *)&iv); - iv = battlePokemon->speedIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, (u8 *)&iv); - iv = battlePokemon->spAttackIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); - iv = battlePokemon->spDefenseIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); - SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); - SetMonData(&gEnemyParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); - SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); - SetMonData(&gEnemyParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); - SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); - SetMonData(&gEnemyParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); - SetMonData(&gEnemyParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); - SetMonData(&gEnemyParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); - SetMonData(&gEnemyParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); - } - break; - case 1: - SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); - break; - case 2: - SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); - break; - case 3: - for (i = 0; i < 4; i++) - { - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); - } - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); - break; - case 4: - case 5: - case 6: - case 7: - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); - break; - case 8: - SetMonData(&gEnemyParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); - SetMonData(&gEnemyParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); - SetMonData(&gEnemyParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gEnemyParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); - break; - case 9: - case 10: - case 11: - case 12: - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); - break; - case 17: - SetMonData(&gEnemyParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); - break; - case 18: - SetMonData(&gEnemyParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); - break; - case 19: - SetMonData(&gEnemyParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 20: - SetMonData(&gEnemyParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 21: - SetMonData(&gEnemyParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 22: - SetMonData(&gEnemyParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 23: - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 24: - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 25: - SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); - break; - case 26: - SetMonData(&gEnemyParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); - break; - case 27: - SetMonData(&gEnemyParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); - break; - case 28: - SetMonData(&gEnemyParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); - break; - case 29: - SetMonData(&gEnemyParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); - break; - case 30: - SetMonData(&gEnemyParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); - break; - case 31: - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); - break; - case 32: - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 33: - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 34: - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 35: - SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 36: - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 37: - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 38: - SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); - break; - case 39: - SetMonData(&gEnemyParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); - break; - case 40: - SetMonData(&gEnemyParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); - break; - case 41: - SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); - break; - case 42: - SetMonData(&gEnemyParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); - break; - case 43: - SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); - break; - case 44: - SetMonData(&gEnemyParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); - break; - case 45: - SetMonData(&gEnemyParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); - break; - case 46: - SetMonData(&gEnemyParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); - break; - case 47: - SetMonData(&gEnemyParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); - break; - case 48: - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); - break; - case 49: - SetMonData(&gEnemyParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); - break; - case 50: - SetMonData(&gEnemyParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); - break; - case 51: - SetMonData(&gEnemyParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); - break; - case 52: - SetMonData(&gEnemyParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); - break; - case 53: - SetMonData(&gEnemyParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); - break; - case 54: - SetMonData(&gEnemyParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); - break; - case 55: - SetMonData(&gEnemyParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 56: - SetMonData(&gEnemyParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 57: - SetMonData(&gEnemyParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 58: - SetMonData(&gEnemyParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 59: - SetMonData(&gEnemyParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - } -} - -void sub_8039220(void) -{ - u8 *dst; - u8 i; - - dst = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; - for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) - dst[i] = gBattleBufferA[gActiveBank][3 + i]; - dp01_tbl4_exec_completed(); -} - -void sub_8039294(void) -{ - u16 species = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES); - - sub_8031794(&gEnemyParty[gBattlePartyID[gActiveBank]], gActiveBank); - GetMonSpriteTemplate_803C56C(species, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( - &gUnknown_02024E8C, - sub_8077ABC(gActiveBank, 2), - sub_8077F68(gActiveBank), - sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; - gSprites[gObjectBankIDs[gActiveBank]].data0 = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]); - sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); - gBattleBankFunc[gActiveBank] = sub_8037A74; -} - -void sub_80393E4(void) -{ - gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1]; - sub_8039430(gActiveBank, gBattleBufferA[gActiveBank][2]); - gBattleBankFunc[gActiveBank] = sub_8037E30; -} - -void sub_8039430(u8 a, u8 b) -{ - u16 species; - - sub_8032AA8(a, b); - gBattlePartyID[a] = gBattleBufferA[a][1]; - species = GetMonData(&gEnemyParty[gBattlePartyID[a]], MON_DATA_SPECIES); - gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); - sub_8031794(&gEnemyParty[gBattlePartyID[a]], a); - GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a)); - gObjectBankIDs[a] = CreateSprite( - &gUnknown_02024E8C, - sub_8077ABC(a, 2), - sub_8077F68(a), - sub_8079E90(a)); - gSprites[gUnknown_0300434C[a]].data1 = gObjectBankIDs[a]; - gSprites[gObjectBankIDs[a]].data0 = a; - gSprites[gObjectBankIDs[a]].data2 = species; - gSprites[gObjectBankIDs[a]].oam.paletteNum = a; - StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]); - gSprites[gObjectBankIDs[a]].invisible = TRUE; - gSprites[gObjectBankIDs[a]].callback = SpriteCallbackDummy; - gSprites[gUnknown_0300434C[a]].data0 = sub_8046400(0, 0xFE); -} - -void sub_80395B4(void) -{ - if (gBattleBufferA[gActiveBank][1] == 0) - { - ewram17810[gActiveBank].unk4 = 0; - gBattleBankFunc[gActiveBank] = sub_8039648; - } - else - { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); - sub_8032A08(gActiveBank); - sub_8043DB0(gHealthboxIDs[gActiveBank]); - dp01_tbl4_exec_completed(); - } -} - -void sub_8039648(void) -{ - switch (ewram17810[gActiveBank].unk4) - { - case 0: - if (ewram17800[gActiveBank].unk0_2) - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - ewram17810[gActiveBank].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBank].unk0_6) - { - ewram17810[gActiveBank].unk4 = 0; - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 2); - gBattleBankFunc[gActiveBank] = sub_8037BBC; - } - break; - } -} - -void sub_80396D0(void) -{ - s16 xOffset; - u32 gender; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (GetBankIdentity(gActiveBank) & 2) - xOffset = -16; - else - xOffset = 16; - gender = gLinkPlayers[sub_803FC34(gActiveBank)].gender; - } - else - { - xOffset = 0; - gender = gLinkPlayers[GetMultiplayerId() ^ 1].gender; - } - sub_8031A6C(gender, gActiveBank); - GetMonSpriteTemplate_803C5A0(gender, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( - &gUnknown_02024E8C, - 176 + xOffset, 40 + 4 * (8 - gTrainerFrontPicCoords[gender].coords), - sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; - gSprites[gObjectBankIDs[gActiveBank]].data0 = 2; - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[gender].tag); - gSprites[gObjectBankIDs[gActiveBank]].data5 = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum; - gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[gender].tag); - gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam = gender; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; - gBattleBankFunc[gActiveBank] = sub_803757C; -} - -void sub_80398A4(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_80398B0(void) -{ - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data0 = 35; - gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; - gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); - gBattleBankFunc[gActiveBank] = sub_80375B4; -} - -void sub_803995C(void) -{ - if (ewram17810[gActiveBank].unk4 == 0) - { - if (ewram17800[gActiveBank].unk0_2) - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - ewram17810[gActiveBank].unk4++; - } - else if (!ewram17810[gActiveBank].unk0_6) - { - ewram17810[gActiveBank].unk4 = 0; - PlaySE12WithPanning(SE_POKE_DEAD, 63); - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8010384; - gBattleBankFunc[gActiveBank] = sub_8037B78; - } -} - -void sub_8039A00(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039A0C(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039A18(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039A24(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039A30(void) -{ - if (!mplay_80342A4(gActiveBank)) - { - u32 r0 = gBattleBufferA[gActiveBank][1] - | (gBattleBufferA[gActiveBank][2] << 8); - - gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; - gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] - | (gBattleBufferA[gActiveBank][5] << 8); - gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] - | (gBattleBufferA[gActiveBank][7] << 8) - | (gBattleBufferA[gActiveBank][8] << 16) - | (gBattleBufferA[gActiveBank][9] << 24); - gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] - | (gBattleBufferA[gActiveBank][13] << 8); - gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; - gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; - - // Dead code. sub_8031720 always returns 0. - if (sub_8031720(r0, gUnknown_0202F7C4) != 0) - { - dp01_tbl4_exec_completed(); - } - else - { - ewram17810[gActiveBank].unk4 = 0; - gBattleBankFunc[gActiveBank] = sub_8039B64; - } - } -} - -void sub_8039B64(void) -{ - u16 r4 = gBattleBufferA[gActiveBank][1] - | (gBattleBufferA[gActiveBank][2] << 8); - u8 r7 = gBattleBufferA[gActiveBank][11]; - - switch (ewram17810[gActiveBank].unk4) - { - case 0: - if (ewram17800[gActiveBank].unk0_2 && !ewram17800[gActiveBank].unk0_3) - { - ewram17800[gActiveBank].unk0_3 = 1; - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - } - ewram17810[gActiveBank].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBank].unk0_6) - { - sub_80326EC(0); - ExecuteMoveAnim(r4); - ewram17810[gActiveBank].unk4 = 2; - } - break; - case 2: - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - sub_80326EC(1); - if ((ewram17800[gActiveBank].unk0_2) && r7 <= 1) - { - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); - ewram17800[gActiveBank].unk0_3 = 0; - } - ewram17810[gActiveBank].unk4 = 3; - } - break; - case 3: - if (!ewram17810[gActiveBank].unk0_6) - { - sub_8031F24(); - sub_80324BC( - gActiveBank, - gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); - ewram17810[gActiveBank].unk4 = 0; - dp01_tbl4_exec_completed(); - } - break; - } -} - -void sub_8039CC8(void) -{ - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; - BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gBattleBankFunc[gActiveBank] = sub_8037C2C; -} - -void sub_8039D2C(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039D38(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039D44(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039D50(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039D5C(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039D68(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039D74(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039D80(void) -{ - s16 r7; - - load_gfxc_health_bar(0); - r7 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (r7 != 0x7FFF) - { - u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); - u32 hp = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); - - sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, hp, r7); - } - else - { - u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); - - sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); - } - gBattleBankFunc[gActiveBank] = sub_8037B24; -} - -void sub_8039E70(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039E7C(void) -{ - if (mplay_80342A4(gActiveBank) == 0) - { - sub_8045A5C(gHealthboxIDs[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], 9); - ewram17810[gActiveBank].unk0_4 = 0; - gBattleBankFunc[gActiveBank] = sub_8037FAC; - } -} - -void sub_8039EF0(void) -{ - if (mplay_80342A4(gActiveBank) == 0) - { - move_anim_start_t2_for_situation( - gBattleBufferA[gActiveBank][1], - gBattleBufferA[gActiveBank][2] - | (gBattleBufferA[gActiveBank][3] << 8) - | (gBattleBufferA[gActiveBank][4] << 16) - | (gBattleBufferA[gActiveBank][5] << 24)); - gBattleBankFunc[gActiveBank] = sub_8037FAC; - } -} - -void sub_8039F58(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039F64(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039F70(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039F7C(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039F88(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039F94(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039FA0(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039FAC(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039FB8(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_8039FC4(void) -{ - gUnknown_020238C8.unk0_0 = 0; - dp01_tbl4_exec_completed(); -} - -void sub_8039FE0(void) -{ - gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBank][1]; - dp01_tbl4_exec_completed(); -} - -void sub_803A018(void) -{ - gUnknown_020238C8.unk0_7 = 0; - dp01_tbl4_exec_completed(); -} - -void sub_803A030(void) -{ - gUnknown_020238C8.unk0_7 ^= 1; - dp01_tbl4_exec_completed(); -} - -void dp01t_29_4_blink(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) - { - dp01_tbl4_exec_completed(); - } - else - { - gDoingBattleAnim = TRUE; - gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; - sub_8047858(gActiveBank); - gBattleBankFunc[gActiveBank] = dp01t_0F_4_move_anim; - } -} - -void sub_803A0C8(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_803A0D4(void) -{ - s8 pan; - - if (GetBankSide(gActiveBank) == 0) - pan = -64; - else - pan = 63; - PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan); - dp01_tbl4_exec_completed(); -} - -void sub_803A118(void) -{ - PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); - dp01_tbl4_exec_completed(); -} - -void sub_803A148(void) -{ - PlayCry3( - GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES), - 25, 5); - dp01_tbl4_exec_completed(); -} - -void dp01t_2E_4_battle_intro(void) -{ - sub_80E43C0(gBattleBufferA[gActiveBank][1]); - gUnknown_02024DE8 |= 1; - dp01_tbl4_exec_completed(); -} - -void sub_803A1B8(void) -{ - u8 taskId; - - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data0 = 35; - gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; - gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_803A3A8); - taskId = CreateTask(sub_803A2C4, 5); - gTasks[taskId].data[0] = gActiveBank; - if (ewram17810[gActiveBank].unk0_0) - gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; - ewram17840.unk9_0 = 1; - gBattleBankFunc[gActiveBank] = nullsub_47; -} - -void sub_803A2C4(u8 taskId) -{ - u8 r9; - - r9 = gActiveBank; - gActiveBank = gTasks[taskId].data[0]; - if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_8039430(gActiveBank, 0); - } - else - { - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_8039430(gActiveBank, 0); - gActiveBank ^= 2; - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_8039430(gActiveBank, 0); - gActiveBank ^= 2; - } - gBattleBankFunc[gActiveBank] = sub_8037840; - gActiveBank = r9; - DestroyTask(taskId); -} - -void sub_803A3A8(struct Sprite *sprite) -{ - sub_8031B74(sprite->oam.affineParam); - sprite->oam.tileNum = sprite->data5; - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); -} - -void sub_803A3DC(void) -{ - if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) - { - dp01_tbl4_exec_completed(); - return; - } - - ewram17810[gActiveBank].unk0_0 = 1; - if (gBattleBufferA[gActiveBank][2] != 0) - { - if (ewram17810[gActiveBank].unk1_1 < 2) - { - ewram17810[gActiveBank].unk1_1++; - return; - } - else - { - ewram17810[gActiveBank].unk1_1 = 0; - } - } - gUnknown_02024E68[gActiveBank] = sub_8044804( - gActiveBank, - (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], - gBattleBufferA[gActiveBank][1], - gBattleBufferA[gActiveBank][2]); - ewram17810[gActiveBank].unk5 = 0; - if (gBattleBufferA[gActiveBank][2] != 0) - ewram17810[gActiveBank].unk5 = 0x5D; - gBattleBankFunc[gActiveBank] = sub_803A4E0; -} - -void sub_803A4E0(void) -{ - if (ewram17810[gActiveBank].unk5++ >= 93) - { - ewram17810[gActiveBank].unk5 = 0; - dp01_tbl4_exec_completed(); - } -} - -void sub_803A520(void) -{ - if (ewram17810[gActiveBank].unk0_0) - gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; - dp01_tbl4_exec_completed(); -} - -void sub_803A56C(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_803A578(void) -{ - if (sub_8078874(gActiveBank) != 0) - { - gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; - sub_8031F88(gActiveBank); - } - dp01_tbl4_exec_completed(); -} - -void bx_exec_buffer_A_ch0_tbl4(void) -{ - if (mplay_80342A4(gActiveBank) == 0) - { - u8 r3 = gBattleBufferA[gActiveBank][1]; - u16 r4 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - - if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, r3, r4) != 0) - dp01_tbl4_exec_completed(); - else - gBattleBankFunc[gActiveBank] = sub_8037FD8; - } -} - -void sub_803A640(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_803A64C(void) -{ - dp01_tbl4_exec_completed(); -} - -void sub_803A658(void) -{ - if (gBattleBufferA[gActiveBank][1] == 3) - gBattleOutcome = gBattleBufferA[gActiveBank][1]; - else - gBattleOutcome = gBattleBufferA[gActiveBank][1] ^ 3; - FadeOutMapMusic(5); - BeginFastPaletteFade(3); - dp01_tbl4_exec_completed(); - gBattleBankFunc[gActiveBank] = sub_8037F34; -} - -void nullsub_48(void) -{ -} diff --git a/src/battle_2.c b/src/battle_2.c deleted file mode 100644 index 7772444d7..000000000 --- a/src/battle_2.c +++ /dev/null @@ -1,2441 +0,0 @@ -#include "global.h" -#include "abilities.h" -#include "battle.h" -#include "battle_interface.h" -#include "battle_setup.h" -#include "data2.h" -#include "item.h" -#include "link.h" -#include "main.h" -#include "name_string_util.h" -#include "palette.h" -#include "party_menu.h" -#include "pokeball.h" -#include "pokedex.h" -#include "pokemon.h" -#include "rng.h" -#include "rom3.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "songs.h" -#include "sound.h" -#include "species.h" -#include "sprite.h" -#include "task.h" -#include "text.h" -#include "trig.h" -#include "unknown_task.h" -#include "util.h" -#include "items.h" -#include "hold_effects.h" -#include "battle_move_effects.h" - -struct UnknownStruct6 -{ - u16 unk0[0xA0]; - u8 fillerA0[0x640]; - u16 unk780[0xA0]; -}; - -struct UnknownStruct7 -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; -}; - -struct UnknownStruct8 -{ - u8 unk0[7]; - u8 unk7; - u8 unk8[18]; - u8 unk1A; -}; - -struct UnknownPokemonStruct2 -{ - /*0x00*/ u16 species; - /*0x02*/ u16 heldItem; - /*0x04*/ u8 nickname[11]; - /*0x0F*/ u8 level; - /*0x10*/ u16 hp; - /*0x12*/ u16 maxhp; - /*0x14*/ u32 status; - /*0x18*/ u32 personality; - /*0x1C*/ u8 gender; - /*0x1D*/ u8 language; -}; - -struct UnknownStruct12 -{ - u32 unk0; - u8 filler4[0x54]; -}; - -extern const u16 gUnknown_08D004E0[]; -extern const struct MonCoords gCastformFrontSpriteCoords[]; - -extern u8 ewram[]; -#define ewram0 (*(struct UnknownStruct7 *)(ewram + 0x0)) -#define ewram4 (*(struct UnknownStruct8 *)(ewram + 0x4)) -#define ewram16000 (ewram[0x16000]) -#define ewram16001 (ewram[0x16001]) -#define ewram16002 (ewram[0x16002]) -#define ewram16003 (ewram[0x16003]) -#define ewram1600C (ewram[0x1600C]) -#define ewram1600E (ewram[0x1600E]) -#define ewram1601B (ewram[0x1601B]) -#define ewram16020 ((u8 *)(ewram + 0x16020)) -#define ewram16056 (ewram[0x16056]) -#define ewram16058 (ewram[0x16058]) -#define ewram16059 (ewram[0x16059]) -#define ewram16078 (ewram[0x16078]) -#define ewram16084 (ewram[0x16084]) -#define ewram16086 (ewram[0x16086]) -#define ewram16087 (ewram[0x16087]) -#define ewram16088 (ewram[0x16088]) -#define ewram16089 (ewram[0x16089]) -#define ewram160A1 (ewram[0x160A1]) -#define ewram160A6 (ewram[0x160A6]) -#define ewram160AC ((u8 *)(ewram + 0x160AC)) -#define ewram160BC ((u16 *)(ewram + 0x160BC)) // hp -#define ewram160C8 (ewram[0x160C8]) -#define ewram160C9 (ewram[0x160C9]) -#define ewram160CB (ewram[0x160CB]) -#define ewram160CC ((u8 *)(ewram + 0x160CC)) -#define ewram160E6 (ewram[0x160E6]) -#define ewram160E8 ((u8 *)(ewram + 0x160E8)) -#define ewram160F0 ((u8 *)(ewram + 0x160F0)) -#define ewram160F9 (ewram[0x160F9]) -#define ewram16100 ((u8 *)(ewram + 0x16100)) -#define ewram16108 ((u8 *)(ewram + 0x16108)) -#define ewram16110 (ewram[0x16110]) -#define ewram16111 (ewram[0x16111]) -#define ewram16113 (ewram[0x16113]) -#define ewram17100 ((u32 *)(ewram + 0x17100)) -#define ewram17130 (ewram[0x17130]) -#define ewram17160 (ewram[0x17160]) -#define ewram1D000 ((struct Pokemon *)(ewram + 0x1D000)) - -extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; -extern u8 gBattleBufferB[][0x200]; -extern u8 gActiveBank; -extern u32 gBattleExecBuffer; -extern u8 gNoOfAllBanks; -extern u16 gBattlePartyID[]; -extern u8 gFightStateTracker; -extern u8 gTurnOrder[]; -extern struct UnknownStruct12 gUnknown_02024AD0[]; -extern u8 gObjectBankIDs[]; -extern u16 gCurrentMove; -extern u8 gLastUsedAbility; -extern u8 gStringBank; -extern u8 gAbsentBankFlags; -extern u8 gMultiHitCounter; -extern u8 gActionForBanks[]; -extern u16 gUnknown_02024C2C[]; -extern u16 gLastUsedMove[]; -extern u16 gMoveHitWith[]; -extern u16 gUnknown_02024C44[]; -extern u16 gUnknown_02024C4C[]; -extern u16 gLockedMove[]; -extern u8 gUnknown_02024C5C[]; -extern u16 gChosenMovesByBanks[]; -extern u32 gHitMarker; -extern u8 gUnknown_02024C70[]; -extern u16 gSideAffecting[]; -extern u32 gStatuses3[]; -//extern u8 gDisableStructs[][0x1C]; -extern u16 gPauseCounterBattle; -extern u16 gPaydayMoney; -extern u16 gRandomTurnNumber; -extern u8 gBattleCommunication[]; -extern u8 gUnknown_02024D1F[]; // I don't actually know what type this is. -extern u8 gBattleOutcome; -extern u16 gUnknown_02024DE8; -extern u8 gActionSelectionCursor[]; -extern u8 gMoveSelectionCursor[]; -extern u8 gUnknown_02038470[]; -extern u16 gUnknown_030041B0; -extern u16 gUnknown_030041B4; -extern u16 gUnknown_030041B8; -extern struct Window gUnknown_030041D0; -extern u16 gUnknown_03004200; -extern struct Window gUnknown_03004210; -extern u16 gUnknown_03004244; -extern struct Window gUnknown_03004250; -extern u16 gUnknown_03004240; -extern u16 gUnknown_03004280; -extern u32 gUnknown_03004284; -extern u16 gUnknown_03004288; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; -extern u16 gUnknown_030042C0; -extern u16 gUnknown_030042C4; -extern MainCallback gPreBattleCallback1; -extern void (*gBattleMainFunc)(void); -extern u8 gLeveledUpInBattle; -extern void (*gBattleBankFunc[])(void); -extern u8 gHealthboxIDs[]; -extern struct UnknownStruct6 gUnknown_03004DE0; -//extern u16 gUnknown_03004DE0[][0xA0]; // possibly? -extern u16 gBattleTypeFlags; -extern s8 gBattleTerrain; // I'm not sure if this is supposed to be s8 or u8. Regardless, it must have the same type as the return value of GetBattleTerrain. -extern u8 gReservedSpritePaletteCount; -extern u16 gTrainerBattleOpponent; -extern struct BattleEnigmaBerry gEnigmaBerries[]; -extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2]; -extern u8 gBattleMonForms[]; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u16 gBattleWeather; -extern u32 gBattleMoveDamage; -extern struct BattlePokemon gBattleMons[]; -extern u8 gBattleMoveFlags; - -static void BattlePrepIntroSlide(void); - -void sub_800E7C4(void) -{ - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - sub_800B858(); - SetMainCallback2(sub_800F104); - gBattleCommunication[0] = 0; - } - else - { - InitBattle(); - } -} - -void InitBattle(void) -{ - s32 i; - - SetHBlankCallback(NULL); - SetVBlankCallback(NULL); - - CpuFill32(0, (void *)VRAM, VRAM_SIZE); - - REG_MOSAIC = 0; - REG_WIN0H = 0xF0; - REG_WIN0V = 0x5051; - REG_WININ = 0; - REG_WINOUT = 0; - gUnknown_030042C4 = 0xF0; - gUnknown_03004240 = 0x5051; - dp12_8087EA4(); - - for (i = 0; i < 80; i++) - { - gUnknown_03004DE0.unk0[i] = 0xF0; - gUnknown_03004DE0.unk780[i] = 0xF0; - } - for (i = 80; i < 160; i++) - { - asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter - gUnknown_03004DE0.unk0[i] = 0xFF10; - gUnknown_03004DE0.unk780[i] = 0xFF10; - } - sub_80895F8(gUnknown_081F9674.unk0, gUnknown_081F9674.unk4, gUnknown_081F9674.unk8); - SetUpWindowConfig(&gWindowConfig_81E6C58); - ResetPaletteFade(); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; - gUnknown_030042C0 = 0; - gUnknown_030041B4 = 0; - gUnknown_03004288 = 0; - gUnknown_03004280 = 0; - gUnknown_030041B0 = 0; - gUnknown_030041B8 = 0; - gBattleTerrain = GetBattleTerrain(); - InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58); - InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0); - InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC); - sub_800D6D4(); - sub_800DAB8(); - ResetSpriteData(); - ResetTasks(); - sub_800E23C(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 4; - SetVBlankCallback(sub_800FCFC); - setup_poochyena_battle(); - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - SetMainCallback2(sub_800F298); - else - SetMainCallback2(sub_800EC9C); - if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) - { - CreateNPCTrainerParty(gEnemyParty, gTrainerBattleOpponent); - SetWildMonHeldItem(); - } - gMain.inBattle = TRUE; - for (i = 0; i < 6; i++) - AdjustFriendship(&gPlayerParty[i], 3); - gBattleCommunication[0] = 0; -} - -void sub_800E9EC(void) -{ - u16 r6 = 0; - u16 species; - u16 hp; - u32 status; - s32 i; - - for (i = 0; i < 6; i++) - { - species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - - if (species == 0) - continue; - if (species != SPECIES_EGG && hp != 0 && status == 0) - r6 |= 1 << i * 2; - - if (species == 0) - continue; - if (hp != 0 && (species == SPECIES_EGG || status != 0)) - r6 |= 2 << i * 2; - - if (species == 0) - continue; - if (species != SPECIES_EGG && hp == 0) - r6 |= 3 << i * 2; - } - ewram0.unk2 = r6; - ewram0.unk3 = r6 >> 8; -} - -void sub_800EAAC(void) -{ - s32 i; - struct UnknownStruct8 *_ewram4 = &ewram4; - - for (i = 0; i < 7; i++) - _ewram4->unk0[i] = gSaveBlock1.enigmaBerry.berry.name[i]; - for (i = 0; i < 18; i++) - _ewram4->unk8[i] = gSaveBlock1.enigmaBerry.itemEffect[i]; - _ewram4->unk7 = gSaveBlock1.enigmaBerry.holdEffect; - _ewram4->unk1A = gSaveBlock1.enigmaBerry.holdEffectParam; -} - -void sub_800EB08(void) -{ - s32 i; - s32 j; - - if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) - { - for (i = 0; i < 7; i++) - { - gEnigmaBerries[0].name[i] = gSaveBlock1.enigmaBerry.berry.name[i]; - gEnigmaBerries[2].name[i] = gSaveBlock1.enigmaBerry.berry.name[i]; - } - for (i = 0; i < 18; i++) - { - gEnigmaBerries[0].itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i]; - gEnigmaBerries[2].itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i]; - } - gEnigmaBerries[0].holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - gEnigmaBerries[2].holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - gEnigmaBerries[0].holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam; - gEnigmaBerries[2].holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam; - } - else - { - s32 numPlayers; - struct BattleEnigmaBerry *src; - u8 r4; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - numPlayers = 4; - else - numPlayers = 2; - for (i = 0; i < numPlayers; i++) - { - src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2); - r4 = gLinkPlayers[i].lp_field_18; - - for (j = 0; j < 7; j++) - gEnigmaBerries[r4].name[j] = src->name[j]; - for (j = 0; j < 18; j++) - gEnigmaBerries[r4].itemEffect[j] = src->itemEffect[j]; - gEnigmaBerries[r4].holdEffect = src->holdEffect; - gEnigmaBerries[r4].holdEffectParam = src->holdEffectParam; - } - } -} - -void shedinja_something(struct Pokemon *pkmn) -{ - u8 nickname[POKEMON_NAME_LENGTH + 1]; - u8 language = 1; - - if (GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA - && GetMonData(pkmn, MON_DATA_LANGUAGE) != language) - { - GetMonData(pkmn, MON_DATA_NICKNAME, nickname); - if (StringCompareWithoutExtCtrlCodes(nickname, gUnknown_081F96C8) == 0) - SetMonData(pkmn, MON_DATA_LANGUAGE, &language); - } -} - -void sub_800EC9C(void) -{ - u8 playerId; - u8 enemyId; - - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - playerId = GetMultiplayerId(); - ewram160CB = playerId; - enemyId = playerId ^ 1; - - switch (gBattleCommunication[0]) - { - case 0: - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) - { - ewram0.unk0 = 1; - ewram0.unk1 = 1; - sub_800E9EC(); - sub_800EAAC(); - SendBlock(bitmask_all_link_players_but_self(), &ewram0, 32); - gBattleCommunication[0] = 1; - } - } - else - { - gBattleTypeFlags |= BATTLE_TYPE_WILD; - gBattleCommunication[0] = 8; - sub_800EB08(); - } - break; - case 1: - if ((GetBlockReceivedStatus() & 3) == 3) - { - s32 id; - u8 taskId; - - ResetBlockReceivedFlags(); - id = 0; - if (gBlockRecvBuffer[0][0] == 0x100) - { - if (playerId == 0) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - id++; - } - if (id == 0) - { - if (gBlockRecvBuffer[0][0] == gBlockRecvBuffer[1][0]) - { - if (playerId == 0) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - id++; - } - if (id == 0) - { - while (id < 2) - { - if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId) - break; - id++; - } - if (id == 2) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - } - } - sub_800EB08(); - taskId = CreateTask(sub_800DE30, 0); - gTasks[taskId].data[1] = 0x10E; - gTasks[taskId].data[2] = 0x5A; - gTasks[taskId].data[5] = 0; - gTasks[taskId].data[3] = ewram0.unk2 | (ewram0.unk3 << 8); - gTasks[taskId].data[4] = gBlockRecvBuffer[enemyId][1]; - gBattleCommunication[0]++; - } - break; - case 2: - if (sub_8007ECC()) - { - SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(*gPlayerParty) * 2); - gBattleCommunication[0]++; - } - break; - case 3: - if ((GetBlockReceivedStatus() & 3) == 3) - { - ResetBlockReceivedFlags(); - memcpy(gEnemyParty, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2); - gBattleCommunication[0]++; - } - break; - case 4: - if (sub_8007ECC()) - { - SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(*gPlayerParty) * 2); - gBattleCommunication[0]++; - } - break; - case 5: - if ((GetBlockReceivedStatus() & 3) == 3) - { - ResetBlockReceivedFlags(); - memcpy(gEnemyParty + 2, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2); - gBattleCommunication[0]++; - } - break; - case 6: - if (sub_8007ECC()) - { - SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(*gPlayerParty) * 2); - gBattleCommunication[0]++; - } - break; - case 7: - if ((GetBlockReceivedStatus() & 3) == 3) - { - ResetBlockReceivedFlags(); - memcpy(gEnemyParty + 4, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2); - shedinja_something(&gEnemyParty[0]); - shedinja_something(&gEnemyParty[1]); - shedinja_something(&gEnemyParty[2]); - shedinja_something(&gEnemyParty[3]); - shedinja_something(&gEnemyParty[4]); - shedinja_something(&gEnemyParty[5]); - gBattleCommunication[0]++; - } - break; - case 8: - sub_800B950(); - gBattleCommunication[0]++; - gBattleCommunication[1] = 0; - gBattleCommunication[2] = 0; - break; - case 9: - if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) - { - gPreBattleCallback1 = gMain.callback1; - gMain.callback1 = sub_8010824; - SetMainCallback2(sub_800F808); - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - gTrainerBattleOpponent = 0x800; - gBattleTypeFlags |= BATTLE_TYPE_20; - } - } - break; - } -} - -void sub_800F02C(void) -{ - s32 i; - - for (i = 0; i < 3; i++) - { - u8 *nickname = gUnknown_02023A00[i].nickname; - - gUnknown_02023A00[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES); - gUnknown_02023A00[i].heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nickname); - gUnknown_02023A00[i].level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); - gUnknown_02023A00[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - gUnknown_02023A00[i].maxhp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); - gUnknown_02023A00[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - gUnknown_02023A00[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); - gUnknown_02023A00[i].gender = GetMonGender(&gPlayerParty[i]); - StripExtCtrlCodes(nickname); - gUnknown_02023A00[i].language = GetMonData(&gPlayerParty[i], MON_DATA_LANGUAGE); - if (gUnknown_02023A00[i].language != 1) - PadNameString(nickname, 0); - } - memcpy(ewram, gUnknown_02023A00, 0x60); -} - -void sub_800F104(void) -{ - u8 playerId; - MainCallback *pSavedCallback; - u16 *pSavedBattleTypeFlags; - - playerId = GetMultiplayerId(); - ewram160CB = playerId; - // Seriously, Game Freak? - pSavedCallback = (MainCallback *)(ewram + 0x160C4); - pSavedBattleTypeFlags = (u16 *)(ewram + 0x160C2); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - - switch (gBattleCommunication[0]) - { - case 0: - if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) - { - sub_800F02C(); - SendBlock(bitmask_all_link_players_but_self(), ewram, 0x60); - gBattleCommunication[0]++; - } - break; - case 1: - if ((GetBlockReceivedStatus() & 0xF) == 0xF) - { - s32 i; - - ResetBlockReceivedFlags(); - for (i = 0; i < 4; i++) - { - if (i != playerId) - { - if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) - || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) - memcpy(gUnknown_02023A00, gBlockRecvBuffer[i], 0x60); - } - } - gBattleCommunication[0]++; - *pSavedCallback = gMain.savedCallback; - *pSavedBattleTypeFlags = gBattleTypeFlags; - gMain.savedCallback = sub_800F104; - OpenPartyMenu(5, 0); - } - break; - case 2: - if (!gPaletteFade.active) - { - gBattleCommunication[0] = 3; - sub_800832C(); - } - break; - case 3: - if (gReceivedRemoteLinkPlayers == 0) - { - gBattleTypeFlags = *pSavedBattleTypeFlags; - gMain.savedCallback = *pSavedCallback; - SetMainCallback2(InitBattle); - } - break; - } -} - -void sub_800F298(void) -{ - u8 playerId; - s32 id; - - playerId = GetMultiplayerId(); - ewram160CB = playerId; - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - switch (gBattleCommunication[0]) - { - case 0: - if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) - { - ewram0.unk0 = 1; - ewram0.unk1 = 1; - sub_800E9EC(); - sub_800EAAC(); - SendBlock(bitmask_all_link_players_but_self(), ewram, 0x20); - gBattleCommunication[0]++; - } - break; - case 1: - if ((GetBlockReceivedStatus() & 0xF) == 0xF) - { - u8 taskId; - - ResetBlockReceivedFlags(); - id = 0; - if (gBlockRecvBuffer[0][0] == 0x100) - { - if (playerId == 0) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - id++; - } - if (id == 0) - { - s32 i; - - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0]) - break; - } - if (i == MAX_LINK_PLAYERS) - { - if (playerId == 0) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - id++; - } - if (id == 0) - { - while (id < MAX_LINK_PLAYERS) - { - if (gBlockRecvBuffer[id][0] == 0x0101 && id != playerId) - if (id < playerId) - break; - if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId) - break; - id++; - } - if (id == MAX_LINK_PLAYERS) - gBattleTypeFlags |= 12; - else - gBattleTypeFlags |= 8; - } - } - sub_800EB08(); - memcpy(ewram1D000, gPlayerParty, sizeof(struct Pokemon) * 3); - taskId = CreateTask(sub_800DE30, 0); - gTasks[taskId].data[1] = 0x10E; - gTasks[taskId].data[2] = 0x5A; - gTasks[taskId].data[5] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = 0; - for (id = 0; id < MAX_LINK_PLAYERS; id++) - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F; - break; - case 1: - gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F; - break; - case 2: - gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; - break; - case 3: - gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; - break; - } - } - ZeroPlayerPartyMons(); - ZeroEnemyPartyMons(); - gBattleCommunication[0]++; - goto step_2; - } - break; - case 2: - step_2: - if (sub_8007ECC()) - { - SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2); - gBattleCommunication[0]++; - } - break; - case 3: - if ((GetBlockReceivedStatus() & 0xF) == 0xF) - { - ResetBlockReceivedFlags(); - for (id = 0; id < MAX_LINK_PLAYERS; id++) - { - if (id == playerId) - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - case 1: - case 2: - memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - } - } - else - { - if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) - || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - case 1: - case 2: - memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - } - } - else - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - case 1: - case 2: - memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); - break; - } - } - } - } - gBattleCommunication[0]++; - } - break; - case 4: - if (sub_8007ECC()) - { - SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon)); - gBattleCommunication[0]++; - } - break; - case 5: - if ((GetBlockReceivedStatus() & 0xF) == 0xF) - { - ResetBlockReceivedFlags(); - for (id = 0; id < MAX_LINK_PLAYERS; id++) - { - if (id == playerId) - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - case 1: - case 2: - memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - } - } - else - { - if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) - || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - case 1: - case 2: - memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - } - } - else - { - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - case 1: - case 2: - memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); - break; - } - } - } - } - - shedinja_something(&gPlayerParty[0]); - shedinja_something(&gPlayerParty[1]); - shedinja_something(&gPlayerParty[2]); - shedinja_something(&gPlayerParty[3]); - shedinja_something(&gPlayerParty[4]); - shedinja_something(&gPlayerParty[5]); - - shedinja_something(&gEnemyParty[0]); - shedinja_something(&gEnemyParty[1]); - shedinja_something(&gEnemyParty[2]); - shedinja_something(&gEnemyParty[3]); - shedinja_something(&gEnemyParty[4]); - shedinja_something(&gEnemyParty[5]); - - gBattleCommunication[0]++; - } - break; - case 6: - sub_800B950(); - gBattleCommunication[0]++; - gBattleCommunication[1] = 0; - gBattleCommunication[2] = 0; - break; - case 7: - if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) - { - gPreBattleCallback1 = gMain.callback1; - gMain.callback1 = sub_8010824; - SetMainCallback2(sub_800F808); - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - gTrainerBattleOpponent = 0x800; - gBattleTypeFlags |= BATTLE_TYPE_20; - } - } - break; - } -} - -void sub_800F808(void) -{ - AnimateSprites(); - BuildOamBuffer(); - sub_800374C(&gUnknown_03004210); - UpdatePaletteFade(); - RunTasks(); -} - -void sub_800F828(struct Sprite *sprite) -{ - sprite->data0 = 0; - sprite->callback = sub_800F838; -} - -void sub_800F838(struct Sprite *sprite) -{ - u16 *arr = (u16 *)ewram; - - switch (sprite->data0) - { - case 0: - sprite->data0++; - sprite->data1 = 0; - sprite->data2 = 0x281; - sprite->data3 = 0; - sprite->data4 = 1; - // fall through - case 1: - sprite->data4--; - if (sprite->data4 == 0) - { - s32 i; - s32 r2; - s32 r0; - - sprite->data4 = 2; - r2 = sprite->data1 + sprite->data3 * 32; - r0 = sprite->data2 - sprite->data3 * 32; - for (i = 0; i < 29; i += 2) - { - arr[r2 + i] = 0x3D; - arr[r0 + i] = 0x3D; - } - sprite->data3++; - if (sprite->data3 == 21) - { - sprite->data0++; - sprite->data1 = 32; - } - } - break; - case 2: - sprite->data1--; - if (sprite->data1 == 20) - SetMainCallback2(sub_800E7C4); - break; - } -} - -u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) -{ - u32 nameHash = 0; - s32 i; - - if (trainerNum == 0x400) - return 0; - - if ((gBattleTypeFlags & 0x908) == 8) - { - ZeroEnemyPartyMons(); - for (i = 0; i < gTrainers[trainerNum].partySize; i++) - { - u32 personalityValue; - s32 j; - u8 fixedIV; - - if (gTrainers[trainerNum].doubleBattle == TRUE) - personalityValue = 0x80; - else if (gTrainers[trainerNum].encounterMusic_gender & 0x80) - personalityValue = 0x78; - else - personalityValue = 0x88; - - for (j = 0; gTrainers[trainerNum].trainerName[j] != 0xFF; j++) - nameHash += gTrainers[trainerNum].trainerName[j]; - - switch (gTrainers[trainerNum].partyFlags) - { - case 0: - { - struct TrainerPartyMember0 *partyData = gTrainers[trainerNum].party; - - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) - nameHash += gSpeciesNames[partyData[i].species][j]; - personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); - break; - } - case 1: - { - struct TrainerPartyMember1 *partyData = gTrainers[trainerNum].party; - - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) - nameHash += gSpeciesNames[partyData[i].species][j]; - personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); - - for (j = 0; j < 4; j++) - { - SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]); - SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); - } - break; - } - case 2: - { - struct TrainerPartyMember2 *partyData = gTrainers[trainerNum].party; - - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) - nameHash += gSpeciesNames[partyData[i].species][j]; - personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); - - SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem); - break; - } - case 3: - { - struct TrainerPartyMember3 *partyData = gTrainers[trainerNum].party; - - for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++) - nameHash += gSpeciesNames[partyData[i].species][j]; - personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); - - SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem); - for (j = 0; j < 4; j++) - { - SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]); - SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); - } - break; - } - } - } - gBattleTypeFlags |= gTrainers[trainerNum].doubleBattle; - } - return gTrainers[trainerNum].partySize; -} - -void sub_800FCD4(void) -{ - if (REG_VCOUNT < 0xA0 && REG_VCOUNT >= 0x6F ) - REG_BG0CNT = 0x9800; -} - -void sub_800FCFC(void) -{ - Random(); // unused return value - REG_BG0HOFS = gUnknown_030042A4; - REG_BG0VOFS = gUnknown_030042A0; - REG_BG1HOFS = gUnknown_030042C0; - REG_BG1VOFS = gUnknown_030041B4; - REG_BG2HOFS = gUnknown_03004288; - REG_BG2VOFS = gUnknown_03004280; - REG_BG3HOFS = gUnknown_030041B0; - REG_BG3VOFS = gUnknown_030041B8; - REG_WIN0H = gUnknown_030042C4; - REG_WIN0V = gUnknown_03004240; - REG_WIN1H = gUnknown_03004200; - REG_WIN1V = gUnknown_03004244; - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - sub_8089668(); -} - -void nullsub_36(struct Sprite *sprite) -{ -} - -void sub_800FDB0(struct Sprite *sprite) -{ - if (sprite->data0 != 0) - sprite->pos1.x = sprite->data1 + ((sprite->data2 & 0xFF00) >> 8); - else - sprite->pos1.x = sprite->data1 - ((sprite->data2 & 0xFF00) >> 8); - sprite->data2 += 0x180; - if (sprite->affineAnimEnded) - { - FreeSpriteTilesByTag(0x2710); - FreeSpritePaletteByTag(0x2710); - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - } -} - -void sub_800FE20(struct Sprite *sprite) -{ - StartSpriteAffineAnim(sprite, 1); - sprite->callback = sub_800FDB0; - PlaySE(SE_BT_START); -} - -void sub_800FE40(u8 taskId) -{ - struct Pokemon *sp4 = NULL; - struct Pokemon *sp8 = NULL; - u8 r2 = ewram160CB; - u32 r7; - s32 i; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - switch (gLinkPlayers[r2].lp_field_18) - { - case 0: - case 2: - sp4 = gPlayerParty; - sp8 = gEnemyParty; - break; - case 1: - case 3: - sp4 = gEnemyParty; - sp8 = gPlayerParty; - break; - } - } - else - { - sp4 = gPlayerParty; - sp8 = gEnemyParty; - } - - r7 = 0; - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&sp4[i], MON_DATA_SPECIES2); - u16 hp = GetMonData(&sp4[i], MON_DATA_HP); - u32 status = GetMonData(&sp4[i], MON_DATA_STATUS); - - if (species == 0) - continue; - if (species != SPECIES_EGG && hp != 0 && status == 0) - r7 |= 1 << i * 2; - - if (species == 0) - continue; - if (hp != 0 && (species == SPECIES_EGG || status != 0)) - r7 |= 2 << i * 2; - - if (species == 0) - continue; - if (species != SPECIES_EGG && hp == 0) - r7 |= 3 << i * 2; - } - gTasks[taskId].data[3] = r7; - - r7 = 0; - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&sp8[i], MON_DATA_SPECIES2); - u16 hp = GetMonData(&sp8[i], MON_DATA_HP); - u32 status = GetMonData(&sp8[i], MON_DATA_STATUS); - - if (species == 0) - continue; - if (species != SPECIES_EGG && hp != 0 && status == 0) - r7 |= 1 << i * 2; - - if (species == 0) - continue; - if (hp != 0 && (species == SPECIES_EGG || status != 0)) - r7 |= 2 << i * 2; - - if (species == 0) - continue; - if (species != SPECIES_EGG && hp == 0) - r7 |= 3 << i * 2; - } - gTasks[taskId].data[4] = r7; -} - -void c2_8011A1C(void) -{ - s32 i; - u8 taskId; - - SetHBlankCallback(NULL); - SetVBlankCallback(NULL); - CpuFill32(0, (void *)VRAM, VRAM_SIZE); - REG_MOSAIC = 0; - REG_WIN0H = 0xF0; - REG_WIN0V = 0x5051; - REG_WININ = 0; - REG_WINOUT = 0; - gUnknown_030042C4 = 0xF0; - gUnknown_03004240 = 0x5051; - dp12_8087EA4(); - - for (i = 0; i < 80; i++) - { - gUnknown_03004DE0.unk0[i] = 0xF0; - gUnknown_03004DE0.unk780[i] = 0xF0; - } - for (i = 80; i < 160; i++) - { - asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter - gUnknown_03004DE0.unk0[i] = 0xFF10; - gUnknown_03004DE0.unk780[i] = 0xFF10; - } - SetUpWindowConfig(&gWindowConfig_81E6C58); - ResetPaletteFade(); - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; - gUnknown_030042C0 = 0; - gUnknown_030041B4 = 0; - gUnknown_03004288 = 0; - gUnknown_03004280 = 0; - gUnknown_030041B0 = 0; - gUnknown_030041B8 = 0; - - InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58); - InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0); - InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC); - sub_800D6D4(); - LoadCompressedPalette(gUnknown_08D004E0, 0, 64); - sub_800D74C(); - ResetSpriteData(); - ResetTasks(); - sub_800E23C(); - REG_WINOUT = 0x37; - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 4; - SetVBlankCallback(sub_800FCFC); - taskId = CreateTask(sub_800DE30, 0); - gTasks[taskId].data[1] = 0x10E; - gTasks[taskId].data[2] = 0x5A; - gTasks[taskId].data[5] = 1; - sub_800FE40(taskId); - SetMainCallback2(sub_80101B8); - gBattleCommunication[0] = 0; -} - -void sub_80101B8(void) -{ - c2_081284E0(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - RunTasks(); -} - -void c2_081284E0(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - gBattleCommunication[1] = 0xFF; - gBattleCommunication[0]++; - break; - case 1: - gBattleCommunication[1]--; - if (gBattleCommunication[1] == 0) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gBattleCommunication[0]++; - } - break; - case 2: - if (!gPaletteFade.active) - SetMainCallback2(gMain.savedCallback); - break; - } -} - -void oac_poke_opponent(struct Sprite *sprite) -{ - sprite->callback = sub_8010278; - StartSpriteAnimIfDifferent(sprite, 0); - BeginNormalPaletteFade(0x00020000, 0, 10, 10, 0x3DEF); -} - -void sub_8010278(struct Sprite *sprite) -{ - if ((gUnknown_02024DE8 & 1) == 0) - { - sprite->pos2.x += 2; - if (sprite->pos2.x == 0) - { - sprite->callback = sub_80102AC; - PlayCry1(sprite->data2, 25); - } - } -} - -void sub_80102AC(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - sub_804777C(sprite->data0); - sub_8043DFC(gHealthboxIDs[sprite->data0]); - sprite->callback = nullsub_37; - StartSpriteAnimIfDifferent(sprite, 0); - BeginNormalPaletteFade(0x00020000, 0, 10, 0, 0x3DEF); - } -} - -void nullsub_37(struct Sprite *sprite) -{ -} - -void unref_sub_801030C(struct Sprite *sprite) -{ - sprite->data3 = 6; - sprite->data4 = 1; - sprite->callback = sub_8010320; -} - -void sub_8010320(struct Sprite *sprite) -{ - sprite->data4--; - if (sprite->data4 == 0) - { - sprite->data4 = 8; - sprite->invisible ^= 1; - sprite->data3--; - if (sprite->data3 == 0) - { - sprite->invisible = FALSE; - sprite->callback = nullsub_37; - gUnknown_03004284 = 0; - } - } -} - -void sub_8010384(struct Sprite *sprite) -{ - u8 r6 = sprite->data0; - u16 species; - u8 yOffset; - - if (ewram17800[r6].unk2 != 0) - species = ewram17800[r6].unk2; - else - species = sprite->data2; - - GetMonData(&gEnemyParty[gBattlePartyID[r6]], MON_DATA_PERSONALITY); // Unused return value - - if (species == SPECIES_UNOWN) - { - u32 personalityValue = GetMonData(&gEnemyParty[gBattlePartyID[r6]], MON_DATA_PERSONALITY); - u16 unownForm = ((((personalityValue & 0x3000000) >> 18) | ((personalityValue & 0x30000) >> 12) | ((personalityValue & 0x300) >> 6) | (personalityValue & 3)) % 0x1C); - u16 unownSpecies; - - if (unownForm == 0) - unownSpecies = SPECIES_UNOWN; // Use the A Unown form - else - unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters - - yOffset = gMonFrontPicCoords[unownSpecies].y_offset; - } - else if (species == SPECIES_CASTFORM) - { - yOffset = gCastformFrontSpriteCoords[gBattleMonForms[r6]].y_offset; - } - else if (species > NUM_SPECIES) - { - yOffset = gMonFrontPicCoords[SPECIES_NONE].y_offset; - } - else - { - yOffset = gMonFrontPicCoords[species].y_offset; - } - - sprite->data3 = 8 - yOffset / 8; - sprite->data4 = 1; - sprite->callback = sub_8010494; -} - -void sub_8010494(struct Sprite *sprite) -{ - s32 i; - - sprite->data4--; - if (sprite->data4 == 0) - { - sprite->data4 = 2; - sprite->pos2.y += 8; - sprite->data3--; - if (sprite->data3 < 0) - { - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - } - else - { - u8 *dst = (u8 *)gUnknown_081FAF4C[GetBankIdentity(sprite->data0)] + (gBattleMonForms[sprite->data0] << 11) + (sprite->data3 << 8); - - for (i = 0; i < 0x100; i++) - *(dst++) = 0; - StartSpriteAnim(sprite, gBattleMonForms[sprite->data0]); - } - } -} - -void sub_8010520(struct Sprite *sprite) -{ - sprite->data3 = 8; - sprite->data4 = sprite->invisible; - sprite->callback = sub_801053C; -} - -void sub_801053C(struct Sprite *sprite) -{ - sprite->data3--; - if (sprite->data3 == 0) - { - sprite->invisible ^= 1; - sprite->data3 = 8; - } -} - -void sub_8010574(struct Sprite *sprite) -{ - sprite->invisible = sprite->data4; - sprite->data4 = FALSE; - sprite->callback = nullsub_37; -} - -void sub_80105A0(struct Sprite *sprite) -{ - sprite->callback = oac_poke_ally_; -} - -void oac_poke_ally_(struct Sprite *sprite) -{ - if ((gUnknown_02024DE8 & 1) == 0) - { - sprite->pos2.x -= 2; - if (sprite->pos2.x == 0) - { - sprite->callback = nullsub_86; - sprite->data1 = 0; - } - } -} - -void sub_80105DC(struct Sprite *sprite) -{ - sprite->callback = nullsub_86; -} - -void nullsub_86(struct Sprite *sprite) -{ -} - -void sub_80105EC(struct Sprite *sprite) -{ - if ((gUnknown_02024DE8 & 1) == 0) - { - sprite->pos2.x += sprite->data1; - sprite->pos2.y += sprite->data2; - } -} - -void dp11b_obj_instanciate(u8 bank, u8 b, s8 c, s8 d) -{ - u8 spriteId; - u8 objectID; - - if (b) - { - if (ewram17810[bank].unk0_1) - return; - } - else - { - if (ewram17810[bank].unk0_2) - return; - } - - spriteId = CreateInvisibleSpriteWithCallback(objc_dp11b_pingpong); - if (b == TRUE) - { - objectID = gHealthboxIDs[bank]; - ewram17810[bank].unk2 = spriteId; - ewram17810[bank].unk0_1 = 1; - gSprites[spriteId].data0 = 0x80; - } - else - { - objectID = gObjectBankIDs[bank]; - ewram17810[bank].unk3 = spriteId; - ewram17810[bank].unk0_2 = 1; - gSprites[spriteId].data0 = 0xC0; - } - gSprites[spriteId].data1 = c; - gSprites[spriteId].data2 = d; - gSprites[spriteId].data3 = objectID; - gSprites[spriteId].data4 = b; - gSprites[objectID].pos2.x = 0; - gSprites[objectID].pos2.y = 0; -} - -void dp11b_obj_free(u8 a, u8 b) -{ - u8 r4; - - if (b == TRUE) - { - if (!ewram17810[a].unk0_1) - return; - r4 = gSprites[ewram17810[a].unk2].data3; - DestroySprite(&gSprites[ewram17810[a].unk2]); - ewram17810[a].unk0_1 = 0; - } - else - { - if (!ewram17810[a].unk0_2) - return; - r4 = gSprites[ewram17810[a].unk3].data3; - DestroySprite(&gSprites[ewram17810[a].unk3]); - ewram17810[a].unk0_2 = 0; - } - gSprites[r4].pos2.x = 0; - gSprites[r4].pos2.y = 0; -} - -void objc_dp11b_pingpong(struct Sprite *sprite) -{ - u8 spriteId = sprite->data3; - s32 var; - - if (sprite->data4 == 1) - var = sprite->data0; - else - var = sprite->data0; - - gSprites[spriteId].pos2.y = Sin(var, sprite->data2) + sprite->data2; - sprite->data0 = (sprite->data0 + sprite->data1) & 0xFF; -} - -void nullsub_41(void) -{ -} - -void sub_8010800(void) -{ - sub_8010874(); - gBattleCommunication[1] = 0; - gBattleMainFunc = bc_8012FAC; -} - -void sub_8010824(void) -{ - gBattleMainFunc(); - - for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) - gBattleBankFunc[gActiveBank](); -} - -void sub_8010874(void) -{ - s32 i; - u32 j; - u8 *r4; - - TurnValuesCleanUp(0); - SpecialStatusesClear(); - - for (i = 0; i < 4; i++) - { - gStatuses3[i] = 0; - - r4 = (u8 *)&gDisableStructs[i]; - for (j = 0; j < (u32)0x1C; j++) - r4[j] = 0; - - gDisableStructs[i].isFirstTurn= 2; - gUnknown_02024C70[i] = 0; - gLastUsedMove[i] = 0; - gMoveHitWith[i] = 0; - gUnknown_02024C44[i] = 0; - gUnknown_02024C4C[i] = 0; - gUnknown_02024C5C[i] = 0xFF; - gLockedMove[i] = 0; - gUnknown_02024C2C[i] = 0; - ewram17100[i] = 0; - } - - for (i = 0; i < 2; i++) - { - gSideAffecting[i] = 0; - - r4 = (u8 *)&gSideTimer[i]; - for (j = 0; j < 12; j++) - r4[j] = 0; - } - - gBankAttacker = 0; - gBankTarget = 0; - gBattleWeather = 0; - - r4 = (u8 *)&gWishFutureKnock; - for (i = 0; i < (u32)0x2C; i++) - r4[i] = 0; - - gHitMarker = 0; - if ((gBattleTypeFlags & BATTLE_TYPE_LINK) == 0 && gSaveBlock2.optionsBattleSceneOff == TRUE) - gHitMarker = HITMARKER_NO_ANIMATIONS; - ewram16084 = gSaveBlock2.optionsBattleStyle; - gMultiHitCounter = 0; - gBattleOutcome = 0; - gBattleExecBuffer = 0; - gPaydayMoney = 0; - ewram17130 = 0; - ewram17160 = 0; - for (i = 0; i < 8; i++) - gBattleCommunication[i] = 0; - gPauseCounterBattle = 0; - gBattleMoveDamage = 0; - gUnknown_02024DE8 = 0; - ewram16002 = 0; - ewram160A1 = 0; - gLeveledUpInBattle = 0; - gAbsentBankFlags = 0; - ewram16078 = 0; - ewram16086 = 0; - ewram16087 = 0; - ewram16089 = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275; - ewram16088 = 3; - ewram1601B = 0; - ewram16056 = 1; - - for (i = 0; i < 8; i++) - { - ewram[i + 0x160AC] = 0; - ewram[i + 0x160CC] = 0; - ewram[i + 0x160E8] = 0; - ewram[i + 0x160F0] = 0; - ewram[i + 0x16100] = 0; - ewram[i + 0x16108] = 0; - } - - ewram160C8 = 6; - ewram160C9 = 6; - ewram16113 = 0; - for (i = 0; i < 11; i++) - gBattleResults.unk36[i] = 0; - gBattleResults.battleTurnCounter = 0; - gBattleResults.playerFaintCounter = 0; - gBattleResults.opponentFaintCounter = 0; - gBattleResults.unk2 = 0; - gBattleResults.unk3 = 0; - gBattleResults.unk4 = 0; - gBattleResults.unk5_0 = 0; - gBattleResults.unk5_1 = 0; - gBattleResults.lastOpponentSpecies = 0; - gBattleResults.lastUsedMove = 0; - gBattleResults.opponentMove = 0; - gBattleResults.poke1Species = 0; - gBattleResults.opponentSpecies = 0; - gBattleResults.caughtPoke = 0; - for (i = 0; i < 10; i++) - { - gBattleResults.pokeString1[i] = 0; - gBattleResults.pokeString2[i] = 0; - gBattleResults.caughtNick[i] = 0; - } -} - -void SwitchInClearStructs(void) -{ - struct DisableStruct sp0 = gDisableStructs[gActiveBank]; - s32 i; - u8 *ptr; - u32 *ptr2; - - if (gBattleMoves[gCurrentMove].effect != EFFECT_BATON_PASS) - { - for (i = 0; i < 8; i++) - gBattleMons[gActiveBank].statStages[i] = 6; - for (i = 0; i < gNoOfAllBanks; i++) - { - struct UnknownStruct12 *sp20 = &gUnknown_02024AD0[i]; - - if ((sp20->unk0 & 0x04000000) && gDisableStructs[i].bankPreventingEscape == gActiveBank) - sp20->unk0 &= ~0x04000000; - if ((gStatuses3[i] & STATUS3_ALWAYS_HITS) && gDisableStructs[i].bankWithSureHit == gActiveBank) - { - gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; - gDisableStructs[i].bankWithSureHit = 0; - } - } - } - if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) - { - gBattleMons[gActiveBank].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED); - gStatuses3[gActiveBank] &= (STATUS3_LEECHSEED_BANK | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT); - - for (i = 0; i < gNoOfAllBanks; i++) - { - if (GetBankSide(gActiveBank) != GetBankSide(i) - && (gStatuses3[i] & STATUS3_ALWAYS_HITS) != 0 - && (gDisableStructs[i].bankWithSureHit == gActiveBank)) - { - gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; - gStatuses3[i] |= 0x10; - } - } - } - else - { - gBattleMons[gActiveBank].status2 = 0; - gStatuses3[gActiveBank] = 0; - } - - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gUnknown_02024AD0[i].unk0 & (gBitTable[gActiveBank] << 16)) - gUnknown_02024AD0[i].unk0 &= ~(gBitTable[gActiveBank] << 16); - if ((gUnknown_02024AD0[i].unk0 & 0xE000) && ewram[0x16020 + i] == gActiveBank) - gUnknown_02024AD0[i].unk0 &= ~0xE000; - } - - gActionSelectionCursor[gActiveBank] = 0; - gMoveSelectionCursor[gActiveBank] = 0; - - ptr = (u8 *)&gDisableStructs[gActiveBank]; - for (i = 0; i < (u32)0x1C; i++) - ptr[i] = 0; - - if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) - { - gDisableStructs[gActiveBank].substituteHP = sp0.substituteHP; - gDisableStructs[gActiveBank].bankWithSureHit = sp0.bankWithSureHit; - gDisableStructs[gActiveBank].perishSong1 = sp0.perishSong1; - gDisableStructs[gActiveBank].perishSong2 = sp0.perishSong2; - } - - gDisableStructs[gActiveBank].isFirstTurn= 2; - gLastUsedMove[gActiveBank] = 0; - gMoveHitWith[gActiveBank] = 0; - gUnknown_02024C44[gActiveBank] = 0; - gUnknown_02024C4C[gActiveBank] = 0; - gUnknown_02024C2C[gActiveBank] = 0; - gUnknown_02024C5C[gActiveBank] = 0xFF; - - ewram[0x160AC + gActiveBank * 2 + 0] = 0; - ewram[0x160AC + gActiveBank * 2 + 1] = 0; - ewram[0x16100 + gActiveBank * 4 + 0] = 0; - ewram[0x16100 + gActiveBank * 4 + 1] = 0; - ewram[0x16100 + gActiveBank * 4 + 2] = 0; - ewram[0x16100 + gActiveBank * 4 + 3] = 0; - ewram[0x160E8 + gActiveBank * 2 + 0] = 0; - ewram[0x160E8 + gActiveBank * 2 + 1] = 0; - - ptr2 = (u32 *)(ewram + 0x17100); - ptr2[gActiveBank] = 0; - - gCurrentMove = 0; -} - -void UndoEffectsAfterFainting(void) -{ - s32 i; - u8 *ptr; - u32 *ptr2; - - for (i = 0; i < 8; i++) - gBattleMons[gActiveBank].statStages[i] = 6; - gBattleMons[gActiveBank].status2 = 0; - gStatuses3[gActiveBank] = 0; - for (i = 0; i < gNoOfAllBanks; i++) - { - if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].bankPreventingEscape == gActiveBank) - gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; - if (gBattleMons[i].status2 & (gBitTable[gActiveBank] << 16)) - gBattleMons[i].status2 &= ~(gBitTable[gActiveBank] << 16); - if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && ewram[0x16020 + i] == gActiveBank) - gBattleMons[i].status2 &= ~STATUS2_WRAPPED; - } - gActionSelectionCursor[gActiveBank] = 0; - gMoveSelectionCursor[gActiveBank] = 0; - - ptr = (u8 *)&gDisableStructs[gActiveBank]; - for (i = 0; i < (u32)0x1C; i++) - ptr[i] = 0; - gProtectStructs[gActiveBank].protected = 0; - gProtectStructs[gActiveBank].endured = 0; - gProtectStructs[gActiveBank].onlyStruggle = 0; - gProtectStructs[gActiveBank].helpingHand = 0; - gProtectStructs[gActiveBank].bounceMove = 0; - gProtectStructs[gActiveBank].stealMove = 0; - gProtectStructs[gActiveBank].flag0Unknown = 0; - gProtectStructs[gActiveBank].prlzImmobility = 0; - gProtectStructs[gActiveBank].confusionSelfDmg = 0; - gProtectStructs[gActiveBank].notEffective = 0; - gProtectStructs[gActiveBank].chargingTurn = 0; - gProtectStructs[gActiveBank].fleeFlag = 0; - gProtectStructs[gActiveBank].usedImprisionedMove = 0; - gProtectStructs[gActiveBank].loveImmobility = 0; - gProtectStructs[gActiveBank].usedDisabledMove = 0; - gProtectStructs[gActiveBank].usedTauntedMove = 0; - gProtectStructs[gActiveBank].flag2Unknown = 0; - gProtectStructs[gActiveBank].flinchImmobility = 0; - gProtectStructs[gActiveBank].notFirstStrike = 0; - - gDisableStructs[gActiveBank].isFirstTurn= 2; - gLastUsedMove[gActiveBank] = 0; - gMoveHitWith[gActiveBank] = 0; - gUnknown_02024C44[gActiveBank] = 0; - gUnknown_02024C4C[gActiveBank] = 0; - gUnknown_02024C2C[gActiveBank] = 0; - gUnknown_02024C5C[gActiveBank] = 0xFF; - - ewram[0x160E8 + gActiveBank * 2 + 0] = 0; - ewram[0x160E8 + gActiveBank * 2 + 1] = 0; - ewram[0x160AC + gActiveBank * 2 + 0] = 0; - ewram[0x160AC + gActiveBank * 2 + 1] = 0; - ewram[0x16100 + gActiveBank * 4 + 0] = 0; - ewram[0x16100 + gActiveBank * 4 + 1] = 0; - ewram[0x16100 + gActiveBank * 4 + 2] = 0; - ewram[0x16100 + gActiveBank * 4 + 3] = 0; - - ptr2 = (u32 *)(ewram + 0x17100); - ptr2[gActiveBank] = 0; - - gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1; - gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2; -} - -void bc_8012FAC(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - gActiveBank = gBattleCommunication[1]; - EmitGetAttributes(0, 0, 0); - MarkBufferBankForExecution(gActiveBank); - gBattleCommunication[0]++; - break; - case 1: - if (gBattleExecBuffer == 0) - { - gBattleCommunication[1]++; - if (gBattleCommunication[1] == gNoOfAllBanks) - gBattleMainFunc = BattlePrepIntroSlide; - else - gBattleCommunication[0] = 0; - } - break; - } -} - -static void BattlePrepIntroSlide(void) -{ - if (gBattleExecBuffer == 0) - { - gActiveBank = GetBankByPlayerAI(0); - EmitBattleIntroSlide(0, gBattleTerrain); - MarkBufferBankForExecution(gActiveBank); - gBattleMainFunc = sub_8011384; - gBattleCommunication[0] = 0; - gBattleCommunication[1] = 0; - } -} - -void sub_8011384(void) -{ - u8 *ptr; - s32 i; - - if (gBattleExecBuffer == 0) - { - for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) - { - if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) - && GetBankSide(gActiveBank) == 0) - { - ptr = (u8 *)&gBattleMons[gActiveBank]; - for (i = 0; i < (u32)0x58; i++) - ptr[i] = 0; - } - else - { - u8 r0; - - ptr = (u8 *)&gBattleMons[gActiveBank]; - for (i = 0; i < (u32)0x58; i++) - ptr[i] = gBattleBufferB[gActiveBank][4 + i]; - - gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1; - gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2; - gBattleMons[gActiveBank].ability = GetAbilityBySpecies(gBattleMons[gActiveBank].species, gBattleMons[gActiveBank].altAbility); - r0 = GetBankSide(gActiveBank); - ewram160BC[r0] = gBattleMons[gActiveBank].hp; - for (i = 0; i < 8; i++) - gBattleMons[gActiveBank].statStages[i] = 6; - gBattleMons[gActiveBank].status2 = 0; - } - - if (GetBankIdentity(gActiveBank) == 0) - { - dp01_build_cmdbuf_x07_7_7_7(0); - MarkBufferBankForExecution(gActiveBank); - } - - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - if (GetBankIdentity(gActiveBank) == 1) - { - dp01_build_cmdbuf_x07_7_7_7(0); - MarkBufferBankForExecution(gActiveBank); - } - if (GetBankSide(gActiveBank) == 1 - && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); - } - else - { - if (GetBankSide(gActiveBank) == 1 - && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) - { - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); - dp01_build_cmdbuf_x04_4_4_4(0); - MarkBufferBankForExecution(gActiveBank); - } - } - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (GetBankIdentity(gActiveBank) == 2 - || GetBankIdentity(gActiveBank) == 3) - { - dp01_build_cmdbuf_x07_7_7_7(0); - MarkBufferBankForExecution(gActiveBank); - } - } - } - gBattleMainFunc = bc_801333C; - } -} - -void bc_801333C(void) -{ - s32 i; - - if (gBattleExecBuffer == 0) - { - struct - { - u16 hp; - u32 status; - } sp0[6]; - - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - for (i = 0; i < 6; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == 0 - || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - sp0[i].hp = 0xFFFF; - sp0[i].status = 0; - } - else - { - sp0[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP); - sp0[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); - } - } - gActiveBank = GetBankByPlayerAI(1); - dp01_build_cmdbuf_x30_TODO(0, (u8 *)sp0, 0x80); - MarkBufferBankForExecution(gActiveBank); - - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0 - || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - sp0[i].hp = 0xFFFF; - sp0[i].status = 0; - } - else - { - sp0[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - sp0[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - } - } - gActiveBank = GetBankByPlayerAI(0); - dp01_build_cmdbuf_x30_TODO(0, (u8 *)sp0, 0x80); - MarkBufferBankForExecution(gActiveBank); - - gBattleMainFunc = bc_battle_begin_message; - } - else - { - // The array gets set here, but nothing is ever done with it. - // Likely unfinished code. - - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0 - || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - sp0[i].hp = 0xFFFF; - sp0[i].status = 0; - } - else - { - sp0[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - sp0[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - } - } - - gBattleMainFunc = bc_8013568; - } - } -} - -void bc_battle_begin_message(void) -{ - if (gBattleExecBuffer == 0) - { - gActiveBank = GetBankByPlayerAI(1); - PrepareStringBattle(0, gActiveBank); - gBattleMainFunc = sub_8011800; - } -} - -void bc_8013568(void) -{ - if (gBattleExecBuffer == 0) - { - gBattleMainFunc = sub_8011970; - PrepareStringBattle(0, 0); - } -} - -void sub_8011800(void) -{ - if (gBattleExecBuffer == 0) - { - PrepareStringBattle(1, GetBankByPlayerAI(1)); - gBattleMainFunc = sub_8011834; - } -} - -void sub_8011834(void) -{ - if (gBattleExecBuffer == 0) - { - for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) - { - if (GetBankIdentity(gActiveBank) == 1) - { - dp01_build_cmdbuf_x2F_2F_2F_2F(0); - MarkBufferBankForExecution(gActiveBank); - } - if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) - && GetBankIdentity(gActiveBank) == 3) - { - dp01_build_cmdbuf_x2F_2F_2F_2F(0); - MarkBufferBankForExecution(gActiveBank); - } - } - gBattleMainFunc = bc_801362C; - } -} - -void bc_801362C(void) -{ - if (gBattleExecBuffer == 0) - { - for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) - { - if (GetBankSide(gActiveBank) == 1 - && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); - } - gBattleMainFunc = sub_8011970; - } -} - -void unref_sub_8011950(void) -{ - if (gBattleExecBuffer == 0) - gBattleMainFunc = sub_8011970; -} - -void sub_8011970(void) -{ - if (gBattleExecBuffer == 0) - { - if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) - PrepareStringBattle(1, GetBankByPlayerAI(0)); - gBattleMainFunc = sub_80119B4; - } -} - -void sub_80119B4(void) -{ - if (gBattleExecBuffer == 0) - { - for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) - { - if (GetBankIdentity(gActiveBank) == 0) - { - dp01_build_cmdbuf_x2F_2F_2F_2F(0); - MarkBufferBankForExecution(gActiveBank); - } - if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) - && GetBankIdentity(gActiveBank) == 2) - { - dp01_build_cmdbuf_x2F_2F_2F_2F(0); - MarkBufferBankForExecution(gActiveBank); - } - } - ewram16058 = 0; - ewram160F9 = 0; - ewram160E6 = 0; - gBattleMainFunc = BattleBeginFirstTurn; - } -} - -void unref_sub_8011A68(void) -{ - if (gBattleExecBuffer == 0) - { - for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) - { - if (GetBankSide(gActiveBank) == 0) - { - EmitSwitchInAnim(0, gBattlePartyID[gActiveBank], 0); - MarkBufferBankForExecution(gActiveBank); - } - } - ewram16058 = 0; - ewram160F9 = 0; - ewram160E6 = 0; - gBattleMainFunc = BattleBeginFirstTurn; - } -} - -void BattleBeginFirstTurn(void) -{ - s32 i; - s32 j; - u8 r9 = 0; - - if (gBattleExecBuffer == 0) - { - if (ewram16058 == 0) - { - for (i = 0; i < gNoOfAllBanks; i++) - gTurnOrder[i] = i; - for (i = 0; i < gNoOfAllBanks - 1; i++) - { - for (j = i + 1; j < gNoOfAllBanks; j++) - { - if (b_first_side(gTurnOrder[i], gTurnOrder[j], 1) != 0) - sub_8012FBC(i, j); - } - } - } - if (ewram160E6 == 0 && AbilityBattleEffects(0, 0, 0, 0xFF, 0) != 0) - { - ewram160E6 = 1; - return; - } - while (ewram16058 < gNoOfAllBanks) - { - if (AbilityBattleEffects(0, gTurnOrder[ewram16058], 0, 0, 0) != 0) - r9++; - ewram16058++; - if (r9 != 0) - return; - } - if (AbilityBattleEffects(9, 0, 0, 0, 0) != 0) - return; - if (AbilityBattleEffects(11, 0, 0, 0, 0) != 0) - return; - while (ewram160F9 < gNoOfAllBanks) - { - if (ItemBattleEffects(0, gTurnOrder[ewram160F9], 0) != 0) - r9++; - ewram160F9++; - if (r9 != 0) - return; - } - // Absolutely pointless for-loop that somehow doesn't get optimized out - for (i = 0; i < gNoOfAllBanks; i++) - ; - for (i = 0; i < 4; i++) - { - ewram[0x16068 + i] = 6; - gActionForBanks[i] = 0xFF; - gChosenMovesByBanks[i] = 0; - } - TurnValuesCleanUp(0); - SpecialStatusesClear(); - ewram160A6 = gAbsentBankFlags; - gBattleMainFunc = sub_8012324; - sub_80156DC(); - for (i = 0; i < 8; i++) - gBattleCommunication[i] = 0; - for (i = 0; i < gNoOfAllBanks; i++) - gBattleMons[i].status2 &= ~8; - ewram16000 = 0; - ewram16001 = 0; - ewram16110 = 0; - ewram16111 = 0; - ewram1600C = 0; - ewram16059 = 0; - ewram1600E = 0; - gBattleMoveFlags = 0; - gRandomTurnNumber = Random(); - } -} - -void bc_8013B1C(void) -{ - s32 i; - - if (gBattleExecBuffer == 0) - { - gBattleMainFunc = BattleTurnPassed; - for (i = 0; i < 8; i++) - gBattleCommunication[i] = 0; - for (i = 0; i < gNoOfAllBanks; i++) - { - gBattleMons[i].status2 &= ~8; - if ((gBattleMons[i].status1 & 7) && (gBattleMons[i].status2 & 0x1000)) - CancelMultiTurnMoves(i); - } - ewram16000 = 0; - ewram16001 = 0; - ewram16110 = 0; - ewram16111 = 0; - ewram1600E = 0; - gBattleMoveFlags = 0; - } -} - -void BattleTurnPassed(void) -{ - s32 i; - - TurnValuesCleanUp(1); - if (gBattleOutcome == 0) - { - if (UpdateTurnCounters() != 0) - return; - if (TurnBasedEffects() != 0) - return; - } - if (sub_80173A4() != 0) - return; - ewram16059 = 0; - if (sub_80170DC() != 0) - return; - TurnValuesCleanUp(0); - gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; - gHitMarker &= ~0x80000; - gHitMarker &= ~0x400000; - gHitMarker &= ~0x100000; - ewram16002 = 0; - ewram160A1 = 0; - ewram1600C = 0; - gBattleMoveDamage = 0; - gBattleMoveFlags = 0; - for (i = 0; i < 5; i++) - gBattleCommunication[i] = 0; - if (gBattleOutcome != 0) - { - gFightStateTracker = 12; - gBattleMainFunc = sub_80138F0; - return; - } - if (gBattleResults.battleTurnCounter < 0xFF) - gBattleResults.battleTurnCounter++; - for (i = 0; i < gNoOfAllBanks; i++) - { - gActionForBanks[i] = 0xFF; - gChosenMovesByBanks[i] = 0; - } - for (i = 0; i < 4; i++) - ewram[0x16068 + i] = 6; - ewram160A6 = gAbsentBankFlags; - gBattleMainFunc = sub_8012324; - gRandomTurnNumber = Random(); -} - -u8 CanRunFromBattle(void) -{ - u8 r2; - u8 r6; - s32 i; - - if (gBattleMons[gActiveBank].item == ITEM_ENIGMA_BERRY) - r2 = gEnigmaBerries[gActiveBank].holdEffect; - else - r2 = ItemId_GetHoldEffect(gBattleMons[gActiveBank].item); - gStringBank = gActiveBank; - if (r2 == HOLD_EFFECT_CAN_ALWAYS_RUN) - return 0; - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - return 0; - if (gBattleMons[gActiveBank].ability == ABILITY_RUN_AWAY) - return 0; - r6 = GetBankSide(gActiveBank); - for (i = 0; i < gNoOfAllBanks; i++) - { - if (r6 != GetBankSide(i) - && gBattleMons[i].ability == ABILITY_SHADOW_TAG) - { - ewram16003 = i; - gLastUsedAbility = gBattleMons[i].ability; - gBattleCommunication[5] = 2; - return 2; - } - if (r6 != GetBankSide(i) - && gBattleMons[gActiveBank].ability != ABILITY_LEVITATE - && gBattleMons[gActiveBank].type1 != 2 - && gBattleMons[gActiveBank].type2 != 2 - && gBattleMons[i].ability == ABILITY_ARENA_TRAP) - { - ewram16003 = i; - gLastUsedAbility = gBattleMons[i].ability; - gBattleCommunication[5] = 2; - return 2; - } - } - i = AbilityBattleEffects(15, gActiveBank, ABILITY_MAGNET_PULL, 0, 0); - if (i != 0 && (gBattleMons[gActiveBank].type1 == 8 || gBattleMons[gActiveBank].type2 == 8)) - { - ewram16003 = i - 1; - gLastUsedAbility = gBattleMons[i - 1].ability; - gBattleCommunication[5] = 2; - return 2; - } - if ((gBattleMons[gActiveBank].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) || (gStatuses3[gActiveBank] & STATUS3_ROOTED)) - { - gBattleCommunication[5] = 0; - return 1; - } - if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) - { - gBattleCommunication[5] = 1; - return 1; - } - return 0; -} - -void sub_8012258(u8 a) -{ - s32 i; - u8 r4; - u8 r1; - - for (i = 0; i < 3; i++) - gUnknown_02038470[i] = ewram[0x1606C + i + a * 3]; - r4 = pokemon_order_func(gBattlePartyID[a]); - r1 = pokemon_order_func(ewram[0x16068 + a]); - sub_8094C98(r4, r1); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - for (i = 0; i < 3; i++) - { - ewram[0x1606C + i + a * 3] = gUnknown_02038470[i]; - ewram[0x1606C + i + (a ^ 2) * 3] = gUnknown_02038470[i]; - } - } - else - { - for (i = 0; i < 3; i++) - { - ewram[0x1606C + i + a * 3] = gUnknown_02038470[i]; - } - } -} - -/* -void sub_8012324(void) -{ - u8 r5; - - gBattleCommunication[4] = 0; - // inverted loop - //_0801234C - for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) - { - r5 = GetBankIdentity(gActiveBank); - switch (gBattleCommunication[gActiveBank]) - { - case 0: - ewram[0x016068 + gActiveBank] = 6; - if (!(gBattleTypeFlags & 0x40) - && (r5 & 2) - && !(ewram160A6 & gBitTable[GetBankByPlayerAI(r5 ^ 2)]) - && gBattleCommunication[GetBankByPlayerAI(r5)] != 4) - break; - //_080123F8 - if (ewram160A6 & gBitTable[gActiveBank]) - { - gActionForBanks[gActiveBank] = 13; - if (!(gBattleTypeFlags & 0x40)) - gBattleCommunication[gActiveBank] = 4; - //_08012454 - else - gBattleCommunication[gActiveBank] = 3; - break; - } - //_08012468 - if ((gBattleMons[gActiveBank].status2 & 0x1000) - || (gBattleMons[gActiveBank].status2 & 0x10000000)) - { - gActionForBanks[gActiveBank] = 0; - gBattleCommunication[gActiveBank] = 3; - } - else - { - dp01_build_cmdbuf_x12_a_bb(0, gActionForBanks[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8)); - MarkBufferBankForExecution(gActiveBank); - gBattleCommunication[gActiveBank]++; - } - break; - case 1: - } - } -} -*/ diff --git a/src/battle_4.c b/src/battle_4.c deleted file mode 100644 index d58ae4145..000000000 --- a/src/battle_4.c +++ /dev/null @@ -1,18196 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_move_effects.h" -#include "moves.h" -#include "abilities.h" -#include "item.h" -#include "items.h" -#include "data2.h" -#include "hold_effects.h" -#include "rng.h" -#include "rom3.h" -#include "species.h" -#include "pokemon.h" -#include "text.h" -#include "palette.h" -#include "main.h" -#include "songs.h" -#include "sound.h" -#include "task.h" -#include "decompress.h" -#include "naming_screen.h" - -//extern needed variables -extern u8 gCritMultiplier; -extern s32 gBattleMoveDamage; -extern u32 gStatuses3[4]; -extern u16 gBattleTypeFlags; -extern const u32 gBitTable[]; -extern const struct BaseStats gBaseStats[]; -extern struct BattleEnigmaBerry gEnigmaBerries[4]; -extern struct BattlePokemon gBattleMons[4]; -extern u8 gActiveBank; -extern u32 gBattleExecBuffer; -extern u8 gNoOfAllBanks; -extern u16 gBattlePartyID[4]; -extern u8 gTurnOrder[4]; -extern u8 gUnknown_02024A76[4]; -extern u16 gCurrentMove; -extern u8 gLastUsedAbility; -extern u16 gBattleWeather; -extern u8 gStringBank; -extern u8 gEffectBank; -extern u8 gAbsentBankFlags; -extern u8 gMultiHitCounter; -extern u16 gLastUsedMove[4]; -extern u16 gLockedMove[4]; -extern u16 gChosenMovesByBanks[4]; -extern u16 gSideAffecting[2]; -extern u16 gPauseCounterBattle; -extern u16 gPaydayMoney; -extern u16 gRandomTurnNumber; -extern u8 gBattleOutcome; -extern u8 gBattleTerrain; -extern u16 gTrainerBattleOpponent; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u8* gBattlescriptCurrInstr; -extern u8 gCurrMovePos; -extern u8 gFightStateTracker; -extern u32 gHitMarker; -extern u8 gBattleMoveFlags; -extern u8 gBattleCommunication[]; -extern u16 gMoveHitWith[4]; -extern u16 gUnknown_02024C44[4]; -extern u8 gStringBank; -extern u16 gDynamicBasePower; -extern const u8 gTypeEffectiveness[]; -extern u16 gLastUsedItem; -extern u16 gBattleMovePower; -extern s32 gHP_dealt; -extern s32 gTakenDmg[4]; -extern u8 gTakenDmgBanks[4]; -extern const u16 gMissStrings[]; -extern u8 gSentPokesToOpponent[2]; -extern u8 gBank1; -extern u16 gExpShareExp; -extern u8 gBattleTextBuff1[]; -extern u8 gBattleTextBuff2[]; -extern u8 gBattleTextBuff3[]; -extern u8 gLeveledUpInBattle; -extern void (*gBattleMainFunc)(void); -extern struct Window gUnknown_03004210; -extern const u8 gUnknown_08400D7A[]; -extern u8 gPlayerPartyCount; -extern u16 word_2024E82; //move to learn -extern const u8 gTrainerMoney[]; -extern u16 gRandomMove; -extern u8* gBattleScriptsEffectsTable[]; -extern u16 gUnknown_02024BE8; //last used move in battle -extern u8 gBankInMenu; -extern u8 gActionForBanks[4]; -extern u16 gUnknown_02024C2C[4]; //last used moves 2, used by sketch -extern u16 gUnknown_030041B0; -extern u16 gUnknown_02024C4C[4]; //last used moves by banks, another one -extern u8 gCurrentMoveTurn; - -//extern functions -bool8 CantUseMove(void); -void PressurePPLose(u8 bank_atk, u8 bank_def, u16 move); -void CancelMultiTurnMoves(u8 bank); -void b_movescr_stack_push(u8* BS_ptr); -void b_movescr_stack_push_cursor(void); -void RecordAbilityBattle(u8 bank, u8 ability); -void RecordItemBattle(u8 bank, u8 item); -int IsPokeDisobedient(void); -static bool8 IsTwoTurnsMove(u16 move); -static void DestinyBondFlagUpdate(void); -static void b_wonderguard_and_levitate(void); -u8 GetBankIdentity(u8 bank); -u8 GetBankSide(u8 bank); -u8 GetBattleBank(u8 bankValue); -s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 bank_atk, u8 bank_def); -static u8 AttacksThisTurn(u8 bank, u16 move); //Note: returns 1 if it's a charging turn, otherwise 2 -void UndoEffectsAfterFainting(void); -void BattleMusicStop(void); -void PlayBGM(u16 songID); -void MonGainEVs(struct Pokemon*, u16 defeatedSpecies); -extern u8 gBattleBufferB[4][0x200]; -void sub_80324F8(struct Pokemon*, u8 bank); -void AdjustFriendship(struct Pokemon*, u8 value); -bool8 IsTradedMon(struct Pokemon*); -void b_movescr_stack_pop_cursor(void); -void SwitchInClearStructs(void); -u8* ConvertIntToDecimalStringN(u8*, s32, u8, u8); -u8 GetNationalPokedexFlag(u16 nationalNum, u8 caseID); -u16 SpeciesToNationalPokedexNum(u16 species); -u8 sub_803FC34(u8 bank); -u16 sub_803FBFC(u8 a); -u8 GetBankByPlayerAI(u8 ID); -void sub_8012258(u8); -void sub_80157C4(u8 bank); //update sent pokes in battle -//sub_803B7C8 teach poke a move -u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move); -void IncrementGameStat(u8 index); -u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale); -u16 GetPokedexHeightWeight(u16 national_num, u8 heightweight); -u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5); -void DestroyMenuCursor(void); -void sub_802BC6C(void); -void sub_809D9F0(struct Pokemon *party, u8, u8, void *, u32); -u8 sub_809FA30(void); -bool32 IsHMMove2(u16 move); -void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0); -void nullsub_6(void); -void ReshowBattleScreenAfterMenu(void); -void sub_800F808(void); -void sub_80B79B8(u32* moneySaveblock, u32 to_give); -void sub_80156DC(void); //set sentpokes value -bool8 sub_8014AB8(u8 bank); //can run from battle -u8 CountAliveMons(u8 caseID); -void sub_803E1B0(struct Pokemon*, u16 item, u8 partyID, u8 r3, u8 sp); -u8 CanRunFromBattle(void); -u8 sub_801B5C0(u16 move, u8 targetbyte); //get target of move -void sub_80153D0(u8 atk); //pressure perish song pp decrement -u8 castform_switch(u8 bank); -void b_push_move_exec(u8* bs_ptr); -u8 sav1_map_get_light_level(void); -u8 CalculatePlayerPartyCount(void); -u16 Sqrt(u32 num); -u8 sub_809070C(u16 nationalNum, u32 TiD, u32 PiD); //task prepare poke dex display -void sub_814A880(u8 a1, u8 a2); -u8 sub_8015A98(u8 bank, u8 unusable_moves, u8 flags); //choose move limitations -void sub_801529C(u8 bank); -bool8 IsLinkDoubleBattle(void); -void sub_8094B6C(u8 bank, u8 partyID, u8 r2); - -//extern BattleScripts -extern u8 BattleScript_EndTurn[]; -extern u8 BattleScript_NoPPForMove[]; -extern u8 BattleScript_MagicCoatBounce[]; -extern u8 BattleScript_TookAttack[]; -extern u8 BattleScript_SnatchedMove[]; -extern u8 BattleScript_Pausex20[]; -extern u8 BattleScript_SubstituteFade[]; -extern u8 BattleScript_HangedOnMsg[]; -extern u8 BattleScript_OneHitKOMsg[]; -extern u8 BattleScript_EnduredMsg[]; -extern u8 BattleScript_PSNPrevention[]; -extern u8 BattleScript_BRNPrevention[]; -extern u8 BattleScript_PRLZPrevention[]; -extern u8 BattleScript_FlinchPrevention[]; -extern u8 BattleScript_StatUp[]; -extern u8 BattleScript_StatDown[]; -extern u8 BattleScript_NoItemSteal[]; -extern u8 BattleScript_ItemSteal[]; -extern u8 BattleScript_RapidSpinAway[]; -extern u8 BattleScript_TargetPRLZHeal[]; -extern u8 BattleScript_KnockedOff[]; -extern u8 BattleScript_LevelUp[]; -extern u8 BattleScript_WrapFree[]; -extern u8 BattleScript_LeechSeedFree[]; -extern u8 BattleScript_SpikesFree[]; -extern u8 BattleScript_ButItFailed[]; -extern u8 BattleScript_ObliviousPreventsAttraction[]; -extern u8 BattleScript_MistProtected[]; -extern u8 BattleScript_AbilityNoStatLoss[]; -extern u8 BattleScript_AbilityNoSpecificStatLoss[]; -extern u8 BattleScript_TrainerBallBlock[]; -extern u8 BattleScript_WallyBallThrow[]; -extern u8 BattleScript_SuccessBallThrow[]; -extern u8 BattleScript_ShakeBallThrow[]; - -extern u8 gUnknown_081D919F[]; //spikes1 -extern u8 gUnknown_081D9171[]; //spikes2 -extern u8 gUnknown_081D91CD[]; //spikes3 -extern u8 BattleScript_1D6F44[]; //present dmg -extern u8 BattleScript_1D83B5[]; //present full hp -extern u8 BattleScript_1D839B[]; //present hp heal -extern u8 BattleScript_1D6F74[]; -extern u8 gUnknown_081D977D[]; //castform change bs -extern u8 gUnknown_081D9834[]; -extern u8 gUnknown_081D90FC[]; //bs random switchout -extern u8 gUnknown_081D95DB[]; //bs payday money give - -//useful macros -//read via orr -#define BSScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) -#define BSScriptRead8(ptr) (((u8)((ptr)[0]))) -#define BSScriptReadPtr(ptr) ((void *)BSScriptRead32(ptr)) - -//read via add -#define BS2ScriptRead32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) -#define BS2ScriptRead16(ptr) ((ptr)[0] + ((ptr)[1] << 8)) -#define BS2ScriptReadPtr(ptr) ((void *)BS2ScriptRead32(ptr)) - - -#define MOVESTATUS_MISSED (1 << 0) -#define MOVESTATUS_SUPEREFFECTIVE (1 << 1) -#define MOVESTATUS_NOTVERYEFFECTIVE (1 << 2) -#define MOVESTATUS_NOTAFFECTED (1 << 3) -#define MOVESTATUS_ONEHITKO (1 << 4) -#define MOVESTATUS_FAILED (1 << 5) -#define MOVESTATUS_ENDURED (1 << 6) -#define MOVESTATUS_HUNGON (1 << 7) - -#define MOVESTATUS_NOEFFECT ((MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED | MOVESTATUS_FAILED)) - -#define TargetProtectAffected ((gProtectStructs[gBankTarget].protected && gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED)) - -#define ABILITYEFFECT_CONTACT 0x4 -#define ABILITYEFFECT_IMMUNITY 0x5 -#define ABILITYEFFECT_SYNCHRONIZE 0x7 -#define ABILITYEFFECT_ATK_SYNCHRONIZE 0x8 -#define ABILITYEFFECT_CHECK_OTHER_SIDE 0xC -#define ABILITYEFFECT_CHECK_BANK_SIDE 0xD -#define ABILITYEFFECT_COUNT_OTHER_SIZE 0x10 -#define ABILITYEFFECT_COUNT_BANK_SIDE 0x11 -#define ABILITYEFFECT_COUNT_ON_FIELD 0x12 -#define ABILITYEFFECT_CHECK_ON_FIELD 0x13 - -//array entries for battle communication -#define MOVE_EFFECT_BYTE 0x3 -#define MULTISTRING_CHOOSER 0x5 -#define MSG_DISPLAY 0x7 - -#define TARGET_SELECTED 0x0 -#define TARGET_DEPENDS 0x1 -#define TARGET_BOTH 0x8 -#define TARGET_FOES_AND_ALLY 0x20 -#define TARGET_OPPONENTS_FIELD 0x40 - -#define TYPE_FORESIGHT 0xFE -#define TYPE_ENDTABLE 0xFF - -#define CMP_EQUAL 0x0 -#define CMP_NOT_EQUAL 0x1 -#define CMP_GREATER_THAN 0x2 -#define CMP_LESS_THAN 0x3 -#define CMP_COMMON_BITS 0x4 -#define CMP_NO_COMMON_BITS 0x5 - -#define BATTLE_WON 0x1 -#define BATTLE_LOST 0x2 -#define BATTLE_DREW 0x3 -#define BATTLE_RAN 0x4 -#define BATTLE_PLAYER_TELEPORTED 0x5 -#define BATTLE_POKE_FLED 0x6 -#define BATTLE_CAUGHT 0x7 -#define BATTLE_OPPONENT_TELEPORTED 0xA - -#define uBYTE0_16(value)(( (u8) (((u16)(value) & (0x000000FF)) >> 0x00))) -#define uBYTE1_16(value)(( (u8) (((u16)(value) & (0x0000FF00)) >> 0x08))) - -#define uBYTE0_32(value)(( (u8) (((u32)(value) & (0x000000FF)) >> 0x00))) -#define uBYTE1_32(value)(( (u8) (((u32)(value) & (0x0000FF00)) >> 0x08))) -#define uBYTE2_32(value)(( (u8) (((u32)(value) & (0x00FF0000)) >> 0x10))) -#define uBYTE3_32(value)(( (u8) (((u32)(value) & (0xFF000000)) >> 0x18))) - -#define sBYTE0_16(value)(( (u8) (((s16)(value) & (0x000000FF)) >> 0x00))) -#define sBYTE1_16(value)(( (u8) (((s16)(value) & (0x0000FF00)) >> 0x08))) - -#define sBYTE0_32(value)(( (u8) (((s32)(value) & (0x000000FF)) >> 0x00))) -#define sBYTE1_32(value)(( (u8) (((s32)(value) & (0x0000FF00)) >> 0x08))) -#define sBYTE2_32(value)(( (u8) (((s32)(value) & (0x00FF0000)) >> 0x10))) -#define sBYTE3_32(value)(( (u8) (((s32)(value) & (0xFF000000)) >> 0x18))) - -#define USED_HELD_ITEM(bank)((((u16*)(&unk_2000000[bank * 2 + 0x160cc])))) - -#define RecordAbilitySetField6(ability, fieldValue) \ -(gLastUsedAbility = ability, gBattleCommunication[6] = fieldValue, RecordAbilityBattle(gBankTarget, ability)) - -#define WEATHER_HAS_EFFECT ((!AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_AIR_LOCK, 0, 0))) -#define TARGET_TURN_DAMAGED (((gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_physical.moveturnLostHP_special))) - -#define HP_ON_SWITCHOUT (((u16*)(0x020160bc))) - -static void atk00_attackcanceler(void); -static void atk01_accuracycheck(void); -static void atk02_attackstring(void); -static void atk03_ppreduce(void); -static void atk04_critcalc(void); -static void atk05_damagecalc1(void); -static void atk06_typecalc(void); -static void atk07_dmg_adjustment(void); -static void atk08_dmg_adjustment2(void); -static void atk09_attackanimation(void); -static void atk0A_waitanimation(void); -static void atk0B_healthbarupdate(void); -static void atk0C_datahpupdate(void); -static void atk0D_critmessage(void); -static void atk0E_effectiveness_sound(void); -static void atk0F_resultmessage(void); -static void atk10_printstring(void); -static void atk11_printstring_playeronly(void); -static void atk12_waitmessage(void); -static void atk13_printfromtable(void); -static void atk14_printfromtable_playeronly(void); -static void atk15_seteffectwithchancetarget(void); -static void atk16_seteffectprimary(void); -static void atk17_seteffectsecondary(void); -static void atk18_status_effect_clear(void); -static void atk19_faint_pokemon(void); -static void atk1A_faint_animation(void); -static void atk1B_faint_effects_clear(void); -static void atk1C_jumpifstatus(void); -static void atk1D_jumpifstatus2(void); -static void atk1E_jumpifability(void); -static void atk1F_jumpifsideaffecting(void); -static void atk20_jumpifstat(void); -static void atk21_jumpifstatus3(void); -static void atk22_jumpiftype(void); -static void atk23_getexp(void); -static void atk24(void); -static void atk25_move_values_cleanup(void); -static void atk26_set_multihit(void); -static void atk27_decrement_multihit(void); -static void atk28_goto(void); -static void atk29_jumpifbyte(void); -static void atk2A_jumpifhalfword(void); -static void atk2B_jumpifword(void); -static void atk2C_jumpifarrayequal(void); -static void atk2D_jumpifarraynotequal(void); -static void atk2E_setbyte(void); -static void atk2F_addbyte(void); -static void atk30_subbyte(void); -static void atk31_copyarray(void); -static void atk32_copyarray_withindex(void); -static void atk33_orbyte(void); -static void atk34_orhalfword(void); -static void atk35_orword(void); -static void atk36_bicbyte(void); -static void atk37_bichalfword(void); -static void atk38_bicword(void); -static void atk39_pause(void); -static void atk3A_waitstate(void); -static void atk3B_healthbar_update(void); -static void atk3C_return(void); -static void atk3D_end(void); -static void atk3E_end2(void); -static void atk3F_end3(void); -static void atk40_jump_if_move_affected_by_protect(void); -static void atk41_call(void); -static void atk42_jumpiftype2(void); -static void atk43_jumpifabilitypresent(void); -static void atk44(void); -static void atk45_playanimation(void); -static void atk46_playanimation2(void); -static void atk47_setgraphicalstatchangevalues(void); -static void atk48_playstatchangeanimation(void); -static void atk49_moveendturn(void); -static void atk4A_typecalc2(void); -static void atk4B_return_atk_to_ball(void); -static void atk4C_copy_poke_data(void); -static void atk4D_switch_data_update(void); -static void atk4E_switchin_anim(void); -static void atk4F_jump_if_cannot_switch(void); -static void atk50_openpartyscreen(void); -static void atk51_switch_handle_order(void); -static void atk52_switch_in_effects(void); -static void atk53_trainer_slide(void); -static void atk54_effectiveness_sound(void); -static void atk55_play_sound(void); -static void atk56_fainting_cry(void); -static void atk57(void); -static void atk58_return_to_ball(void); -void atk59_learnmove_inbattle(void); -static void atk5A(void); -static void atk5B_80256E0(void); -static void atk5C_hitanimation(void); -static void atk5D_getmoneyreward(void); -static void atk5E_8025A70(void); -static void atk5F_8025B24(void); -static void atk60_increment_gamestat(void); -static void atk61_8025BA4(void); -static void atk62_08025C6C(void); -static void atk63_jumptorandomattack(void); -static void atk64_statusanimation(void); -static void atk65_status2animation(void); -static void atk66_chosenstatusanimation(void); -static void atk67_8025ECC(void); -static void atk68_80246A0(void); -static void atk69_dmg_adjustment2(void); -void atk6A_removeitem(void); -static void atk6B_atknameinbuff1(void); -static void atk6C_lvlbox_display(void); -static void atk6D_set_sentpokes_values(void); -static void atk6E_set_atk_to_player0(void); -static void atk6F_set_visible(void); -static void atk70_record_ability(void); -static void atk71_buffer_move_to_learn(void); -static void atk72_jump_if_can_run_frombattle(void); -static void atk73_hp_thresholds(void); -static void atk74_hp_thresholds2(void); -static void atk75_8026A58(void); -static void atk76_various(void); -static void atk77_setprotect(void); -static void atk78_faintifabilitynotdamp(void); -static void atk79_setatkhptozero(void); -static void atk7A_jumpwhiletargetvalid(void); -static void atk7B_healhalfHP_if_possible(void); -static void atk7C_8025508(void); -static void atk7D_set_rain(void); -static void atk7E_setreflect(void); -static void atk7F_setseeded(void); -static void atk80_manipulatedamage(void); -static void atk81_setrest(void); -static void atk82_jumpifnotfirstturn(void); -static void atk83_nop(void); -static void atk84_jump_if_cant_sleep(void); -static void atk85_stockpile(void); -static void atk86_stockpiletobasedamage(void); -static void atk87_stockpiletohpheal(void); -static void atk88_negativedamage(void); -static void atk89_statbuffchange(void); -static void atk8A_normalisebuffs(void); -static void atk8B_setbide(void); -static void atk8C_confuseifrepeatingattackends(void); -static void atk8D_setmultihit_counter(void); -static void atk8E_prepare_multihit(void); -static void atk8F_forcerandomswitch(void); -static void atk90_conversion_type_change(void); -static void atk91_givepaydaymoney(void); -static void atk92_setlightscreen(void); -static void atk93_ko_move(void); -static void atk94_gethalfcurrentenemyhp(void); -static void atk95_setsandstorm(void); -static void atk96_weatherdamage(void); -static void atk97_try_infatuation(void); -static void atk98_status_icon_update(void); -static void atk99_setmist(void); -static void atk9A_set_focusenergy(void); -static void atk9B_transformdataexecution(void); -static void atk9C_set_substitute(void); -static void atk9D_copyattack(void); -static void atk9E_metronome(void); -static void atk9F_dmgtolevel(void); -static void atkA0_psywavedamageeffect(void); -static void atkA1_counterdamagecalculator(void); -static void atkA2_mirrorcoatdamagecalculator(void); -static void atkA3_disablelastusedattack(void); -static void atkA4_setencore(void); -static void atkA5_painsplitdmgcalc(void); -static void atkA6_settypetorandomresistance(void); -static void atkA7_setalwayshitflag(void); -static void atkA8_copymovepermanently(void); -static void atkA9_sleeptalk_choose_move(void); -static void atkAA_set_destinybond(void); -static void atkAB_DestinyBondFlagUpdate(void); -static void atkAC_remaininghptopower(void); -static void atkAD_spite_ppreduce(void); -static void atkAE_heal_party_status(void); -static void atkAF_cursetarget(void); -static void atkB0_set_spikes(void); -static void atkB1_set_foresight(void); -static void atkB2_setperishsong(void); -static void atkB3_rolloutdamagecalculation(void); -static void atkB4_jumpifconfusedandstatmaxed(void); -static void atkB5_furycuttercalc(void); -static void atkB6_happinesstodamagecalculation(void); -static void atkB7_presentdamagecalculation(void); -static void atkB8_set_safeguard(void); -static void atkB9_magnitudedamagecalculation(void); -static void atkBA_jumpifnopursuitswitchdmg(void); -static void atkBB_setsunny(void); -static void atkBC_maxattackhalvehp(void); -static void atkBD_copyfoestats(void); -static void atkBE_breakfree(void); -static void atkBF_set_defense_curl(void); -static void atkC0_recoverbasedonsunlight(void); -static void atkC1_hidden_power(void); -static void atkC2_selectnexttarget(void); -static void atkC3_setfutureattack(void); -static void atkC4_beat_up(void); -static void atkC5_hidepreattack(void); -static void atkC6_unhidepostattack(void); -static void atkC7_setminimize(void); -static void atkC8_sethail(void); -static void atkC9_jumpifattackandspecialattackcannotfall(void); -static void atkCA_setforcedtarget(void); -static void atkCB_setcharge(void); -static void atkCC_callterrainattack(void); -static void atkCD_cureifburnedparalysedorpoisoned(void); -static void atkCE_settorment(void); -static void atkCF_jumpifnodamage(void); -static void atkD0_settaunt(void); -static void atkD1_set_helpinghand(void); -static void atkD2_swap_items(void); -static void atkD3_copy_ability(void); -static void atkD4_wish_effect(void); -static void atkD5_setroots(void); -static void atkD6_doubledamagedealtifdamaged(void); -static void atkD7_setyawn(void); -static void atkD8_setdamagetohealthdifference(void); -static void atkD9_scaledamagebyhealthratio(void); -static void atkDA_abilityswap(void); -static void atkDB_imprisoneffect(void); -static void atkDC_setgrudge(void); -static void atkDD_weightdamagecalculation(void); -static void atkDE_asistattackselect(void); -static void atkDF_setmagiccoat(void); -static void atkE0_setstealstatchange(void); -static void atkE1_intimidate_string_loader(void); -static void atkE2_switchout_abilities(void); -static void atkE3_jumpiffainted(void); -static void atkE4_getsecretpowereffect(void); -static void atkE5_pickup(void); -static void atkE6_castform_change_animation(void); -static void atkE7_castform_data_change(void); -static void atkE8_settypebasedhalvers(void); -static void atkE9_setweatherballtype(void); -static void atkEA_recycleitem(void); -static void atkEB_settypetoterrain(void); -static void atkEC_pursuit_sth(void); -static void atkED_802B4B4(void); -static void atkEE_removelightscreenreflect(void); -void atkEF_pokeball_catch_calculation(void); -static void atkF0_copy_caught_poke(void); -static void atkF1_setpoke_as_caught(void); -static void atkF2_display_dex_info(void); -static void atkF3_nickname_caught_poke(void); -static void atkF4_802BEF0(void); -static void atkF5_removeattackerstatus1(void); -static void atkF6_802BF48(void); -static void atkF7_802BF54(void); - -typedef void (*BattleCmdFunc)(void); - -const BattleCmdFunc gBattleScriptingCommandsTable[] = -{ - atk00_attackcanceler, - atk01_accuracycheck, - atk02_attackstring, - atk03_ppreduce, - atk04_critcalc, - atk05_damagecalc1, - atk06_typecalc, - atk07_dmg_adjustment, - atk08_dmg_adjustment2, - atk09_attackanimation, - atk0A_waitanimation, - atk0B_healthbarupdate, - atk0C_datahpupdate, - atk0D_critmessage, - atk0E_effectiveness_sound, - atk0F_resultmessage, - atk10_printstring, - atk11_printstring_playeronly, - atk12_waitmessage, - atk13_printfromtable, - atk14_printfromtable_playeronly, - atk15_seteffectwithchancetarget, - atk16_seteffectprimary, - atk17_seteffectsecondary, - atk18_status_effect_clear, - atk19_faint_pokemon, - atk1A_faint_animation, - atk1B_faint_effects_clear, - atk1C_jumpifstatus, - atk1D_jumpifstatus2, - atk1E_jumpifability, - atk1F_jumpifsideaffecting, - atk20_jumpifstat, - atk21_jumpifstatus3, - atk22_jumpiftype, - atk23_getexp, - atk24, - atk25_move_values_cleanup, - atk26_set_multihit, - atk27_decrement_multihit, - atk28_goto, - atk29_jumpifbyte, - atk2A_jumpifhalfword, - atk2B_jumpifword, - atk2C_jumpifarrayequal, - atk2D_jumpifarraynotequal, - atk2E_setbyte, - atk2F_addbyte, - atk30_subbyte, - atk31_copyarray, - atk32_copyarray_withindex, - atk33_orbyte, - atk34_orhalfword, - atk35_orword, - atk36_bicbyte, - atk37_bichalfword, - atk38_bicword, - atk39_pause, - atk3A_waitstate, - atk3B_healthbar_update, - atk3C_return, - atk3D_end, - atk3E_end2, - atk3F_end3, - atk40_jump_if_move_affected_by_protect, - atk41_call, - atk42_jumpiftype2, - atk43_jumpifabilitypresent, - atk44, - atk45_playanimation, - atk46_playanimation2, - atk47_setgraphicalstatchangevalues, - atk48_playstatchangeanimation, - atk49_moveendturn, - atk4A_typecalc2, - atk4B_return_atk_to_ball, - atk4C_copy_poke_data, - atk4D_switch_data_update, - atk4E_switchin_anim, - atk4F_jump_if_cannot_switch, - atk50_openpartyscreen, - atk51_switch_handle_order, - atk52_switch_in_effects, - atk53_trainer_slide, - atk54_effectiveness_sound, - atk55_play_sound, - atk56_fainting_cry, - atk57, - atk58_return_to_ball, - atk59_learnmove_inbattle, - atk5A, - atk5B_80256E0, - atk5C_hitanimation, - atk5D_getmoneyreward, - atk5E_8025A70, - atk5F_8025B24, - atk60_increment_gamestat, - atk61_8025BA4, - atk62_08025C6C, - atk63_jumptorandomattack, - atk64_statusanimation, - atk65_status2animation, - atk66_chosenstatusanimation, - atk67_8025ECC, - atk68_80246A0, - atk69_dmg_adjustment2, - atk6A_removeitem, - atk6B_atknameinbuff1, - atk6C_lvlbox_display, - atk6D_set_sentpokes_values, - atk6E_set_atk_to_player0, - atk6F_set_visible, - atk70_record_ability, - atk71_buffer_move_to_learn, - atk72_jump_if_can_run_frombattle, - atk73_hp_thresholds, - atk74_hp_thresholds2, - atk75_8026A58, - atk76_various, - atk77_setprotect, - atk78_faintifabilitynotdamp, - atk79_setatkhptozero, - atk7A_jumpwhiletargetvalid, - atk7B_healhalfHP_if_possible, - atk7C_8025508, - atk7D_set_rain, - atk7E_setreflect, - atk7F_setseeded, - atk80_manipulatedamage, - atk81_setrest, - atk82_jumpifnotfirstturn, - atk83_nop, - atk84_jump_if_cant_sleep, - atk85_stockpile, - atk86_stockpiletobasedamage, - atk87_stockpiletohpheal, - atk88_negativedamage, - atk89_statbuffchange, - atk8A_normalisebuffs, - atk8B_setbide, - atk8C_confuseifrepeatingattackends, - atk8D_setmultihit_counter, - atk8E_prepare_multihit, - atk8F_forcerandomswitch, - atk90_conversion_type_change, - atk91_givepaydaymoney, - atk92_setlightscreen, - atk93_ko_move, - atk94_gethalfcurrentenemyhp, - atk95_setsandstorm, - atk96_weatherdamage, - atk97_try_infatuation, - atk98_status_icon_update, - atk99_setmist, - atk9A_set_focusenergy, - atk9B_transformdataexecution, - atk9C_set_substitute, - atk9D_copyattack, - atk9E_metronome, - atk9F_dmgtolevel, - atkA0_psywavedamageeffect, - atkA1_counterdamagecalculator, - atkA2_mirrorcoatdamagecalculator, - atkA3_disablelastusedattack, - atkA4_setencore, - atkA5_painsplitdmgcalc, - atkA6_settypetorandomresistance, - atkA7_setalwayshitflag, - atkA8_copymovepermanently, - atkA9_sleeptalk_choose_move, - atkAA_set_destinybond, - atkAB_DestinyBondFlagUpdate, - atkAC_remaininghptopower, - atkAD_spite_ppreduce, - atkAE_heal_party_status, - atkAF_cursetarget, - atkB0_set_spikes, - atkB1_set_foresight, - atkB2_setperishsong, - atkB3_rolloutdamagecalculation, - atkB4_jumpifconfusedandstatmaxed, - atkB5_furycuttercalc, - atkB6_happinesstodamagecalculation, - atkB7_presentdamagecalculation, - atkB8_set_safeguard, - atkB9_magnitudedamagecalculation, - atkBA_jumpifnopursuitswitchdmg, - atkBB_setsunny, - atkBC_maxattackhalvehp, - atkBD_copyfoestats, - atkBE_breakfree, - atkBF_set_defense_curl, - atkC0_recoverbasedonsunlight, - atkC1_hidden_power, - atkC2_selectnexttarget, - atkC3_setfutureattack, - atkC4_beat_up, - atkC5_hidepreattack, - atkC6_unhidepostattack, - atkC7_setminimize, - atkC8_sethail, - atkC9_jumpifattackandspecialattackcannotfall, - atkCA_setforcedtarget, - atkCB_setcharge, - atkCC_callterrainattack, - atkCD_cureifburnedparalysedorpoisoned, - atkCE_settorment, - atkCF_jumpifnodamage, - atkD0_settaunt, - atkD1_set_helpinghand, - atkD2_swap_items, - atkD3_copy_ability, - atkD4_wish_effect, - atkD5_setroots, - atkD6_doubledamagedealtifdamaged, - atkD7_setyawn, - atkD8_setdamagetohealthdifference, - atkD9_scaledamagebyhealthratio, - atkDA_abilityswap, - atkDB_imprisoneffect, - atkDC_setgrudge, - atkDD_weightdamagecalculation, - atkDE_asistattackselect, - atkDF_setmagiccoat, - atkE0_setstealstatchange, - atkE1_intimidate_string_loader, - atkE2_switchout_abilities, - atkE3_jumpiffainted, - atkE4_getsecretpowereffect, - atkE5_pickup, - atkE6_castform_change_animation, - atkE7_castform_data_change, - atkE8_settypebasedhalvers, - atkE9_setweatherballtype, - atkEA_recycleitem, - atkEB_settypetoterrain, - atkEC_pursuit_sth, - atkED_802B4B4, - atkEE_removelightscreenreflect, - atkEF_pokeball_catch_calculation, - atkF0_copy_caught_poke, - atkF1_setpoke_as_caught, - atkF2_display_dex_info, - atkF3_nickname_caught_poke, - atkF4_802BEF0, - atkF5_removeattackerstatus1, - atkF6_802BF48, - atkF7_802BF54, -}; - -struct statFractions -{ - u8 dividend; - u8 divisor; -}; - -static const struct statFractions gAccuracyStageRatios[] = -{ - { 33, 100}, // -6 - { 36, 100}, // -5 - { 43, 100}, // -4 - { 50, 100}, // -3 - { 60, 100}, // -2 - { 75, 100}, // -1 - { 1, 1}, // 0 - {133, 100}, // +1 - {166, 100}, // +2 - { 2, 1}, // +3 - {233, 100}, // +4 - {133, 50}, // +5 - { 3, 1}, // +6 -}; - -//The chance is 1/N for each stage. -static const u16 gCriticalHitChance[] = {16, 8, 4, 3, 2}; - -static const u32 gStatusFlagsForMoveEffects[] = -{ - 0x00000000, - 0x00000007, - 0x00000008, - 0x00000010, - 0x00000020, - 0x00000040, - 0x00000080, - 0x00000007, - 0x00000008, - 0x00000000, - 0x00000070, - 0x00000000, - 0x00001000, - 0x0000E000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00400000, - 0x00000000, - 0x00000000, - 0x04000000, - 0x08000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000C00, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000 -}; - -extern const u8 BattleScript_1D963E[]; -extern const u8 BattleScript_1D965A[]; -extern const u8 BattleScript_1D9669[]; -extern const u8 BattleScript_1D9678[]; -extern const u8 BattleScript_1D9687[]; -extern const u8 BattleScript_1D969D[]; -extern const u8 BattleScript_1D96BA[]; -extern const u8 BattleScript_1D9696[]; -extern const u8 BattleScript_1D96B1[]; -extern const u8 BattleScript_1D96AA[]; -extern const u8 BattleScript_1D96C8[]; - -const u8* const gMoveEffectBS_Ptrs[] = -{ - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D965A, - BattleScript_1D9669, - BattleScript_1D9678, - BattleScript_1D9687, - BattleScript_1D969D, - BattleScript_1D96BA, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D9696, - BattleScript_1D96AA, - BattleScript_1D963E, - BattleScript_1D96B1, - BattleScript_1D96C8, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D963E, - BattleScript_1D96C8 -}; - -const u8 sUnreferencedBitMask1[] = {0, 1, 3, 7, 0xF, 0x1F, 0x3F}; - -const u8 gLevelUpStatBoxStats[] = {MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK, MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPD}; - -static const u16 sProtectSuccessRates[] = {0xFFFF, 0x7FFF, 0x3FFF, 0x1FFF}; - -static const u16 sUnknown_081FACFE[] = //banned moves to copy -{ - MOVE_METRONOME, - MOVE_STRUGGLE, - MOVE_SKETCH, - MOVE_MIMIC, - 0xFFFE, - MOVE_COUNTER, - MOVE_MIRROR_COAT, - MOVE_PROTECT, - MOVE_DETECT, - MOVE_ENDURE, - MOVE_DESTINY_BOND, - MOVE_SLEEP_TALK, - MOVE_THIEF, - MOVE_FOLLOW_ME, - MOVE_SNATCH, - MOVE_HELPING_HAND, - MOVE_COVET, - MOVE_TRICK, - MOVE_FOCUS_PUNCH, - 0xFFFF -}; - -static const u8 sUnknown_081FAD26[] = -{ - 1, 200, - 4, 150, - 9, 100, - 16, 80, - 32, 40, - 48, 20 -}; - -static const u16 sNaturePowerMoves[] = -{ - MOVE_STUN_SPORE, - MOVE_RAZOR_LEAF, - MOVE_EARTHQUAKE, - MOVE_HYDRO_PUMP, - MOVE_SURF, - MOVE_BUBBLE_BEAM, - MOVE_ROCK_SLIDE, - MOVE_SHADOW_BALL, - MOVE_SWIFT, - MOVE_SWIFT -}; - -//weight-based damage table for Low Kick -//format: min. weight (hectograms), base power -static const u16 sWeightDamage[] = -{ - 100, 20, - 250, 40, - 500, 60, - 1000, 80, - 2000, 100, - -1, -1 -}; - -static const u16 sPickupItems[] = -{ - ITEM_SUPER_POTION, 30, - ITEM_FULL_HEAL, 40, - ITEM_ULTRA_BALL, 50, - ITEM_RARE_CANDY, 60, - ITEM_FULL_RESTORE, 70, - ITEM_REVIVE, 80, - ITEM_NUGGET, 90, - ITEM_PROTEIN, 95, - ITEM_PP_UP, 99, - ITEM_KINGS_ROCK, 1 -}; - -static const u8 sTerrainToType[] = -{ - TYPE_GRASS, // tall grass - TYPE_GRASS, // long grass - TYPE_GROUND, // sand - TYPE_WATER, // underwater - TYPE_WATER, // water - TYPE_WATER, // pond water - TYPE_ROCK , // rock - TYPE_ROCK , // cave - TYPE_NORMAL, // building - TYPE_NORMAL, // plain -}; - -static const u8 sBallCatchBonuses[] = -{ - 20, 15, 10, 15 //Ultra, Great, Poke, Safari -}; - -static void atk00_attackcanceler(void) -{ - int i; - if (gBattleOutcome) - { - gFightStateTracker = 0xC; - return; - } - if (gBattleMons[gBankAttacker].hp == 0 && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) - { - gHitMarker |= HITMARKER_x80000; - gBattlescriptCurrInstr = BattleScript_EndTurn; - return; - } - if (CantUseMove()) - return; - if (AbilityBattleEffects(2, gBankTarget, 0, 0, 0)) - return; - if (!gBattleMons[gBankAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & 0x800200) - && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) - { - gBattlescriptCurrInstr = BattleScript_NoPPForMove; - gBattleMoveFlags |= MOVESTATUS_MISSED; - return; - } - gHitMarker &= ~(HITMARKER_x800000); - if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) - { - u8 disobedient = IsPokeDisobedient(); - asm("":::"r0"); //It's impossible to match - asm("":::"r1"); - if ((disobedient)) - { - if (disobedient == 2) - gHitMarker |= HITMARKER_OBEYS; - else - gBattleMoveFlags |= MOVESTATUS_MISSED; - return; - } - } - gHitMarker |= HITMARKER_OBEYS; - if (gProtectStructs[gBankTarget].bounceMove && gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED) - { - PressurePPLose(gBankAttacker, gBankTarget, MOVE_MAGIC_COAT); - gProtectStructs[gBankTarget].bounceMove = 0; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; - return; - } - for (i = 0; i < gNoOfAllBanks; i++) - { - if ((gProtectStructs[gTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED) - { - PressurePPLose(gBankAttacker, gTurnOrder[i], MOVE_SNATCH); - gProtectStructs[gTurnOrder[i]].stealMove = 0; - BATTLE_STRUCT->scriptingActive = gTurnOrder[i]; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_SnatchedMove; - return; - } - } - if (gSpecialStatuses[gBankTarget].lightningRodRedirected) - { - gSpecialStatuses[gBankTarget].lightningRodRedirected = 0; - gLastUsedAbility = ABILITY_LIGHTNING_ROD; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_TookAttack; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else if (TargetProtectAffected - && (gCurrentMove != MOVE_CURSE || (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST)) - && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)))) - { - CancelMultiTurnMoves(gBankAttacker); - gBattleMoveFlags |= MOVESTATUS_MISSED; - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; - gBattleCommunication[6] = 1; - gBattlescriptCurrInstr++; - } - else - { - gBattlescriptCurrInstr++; - } -} - -static void JumpIfMoveFailed(u8 adder, u16 move) -{ - void* to_store = gBattlescriptCurrInstr + adder; - if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) - { - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; - to_store = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } - else - { - DestinyBondFlagUpdate(); - if (AbilityBattleEffects(3, gBankTarget, 0, 0, move)) - return; - } - gBattlescriptCurrInstr = to_store; -} - -static void atk40_jump_if_move_affected_by_protect(void) -{ - if (TargetProtectAffected) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - JumpIfMoveFailed(5, 0); - gBattleCommunication[6] = 1; - } - else - { - gBattlescriptCurrInstr += 5; - } -} - -static bool8 JumpIfMoveAffectedByProtect(u16 move) -{ - bool8 affected = 0; - if (TargetProtectAffected) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - JumpIfMoveFailed(7, move); - gBattleCommunication[6] = 1; - affected = 1; - } - return affected; -} - -static bool8 AccuracyCalcHelper(u16 move) -{ - if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker) - { - JumpIfMoveFailed(7, move); - return TRUE; - } - - if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBankTarget] & STATUS3_ON_AIR) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - JumpIfMoveFailed(7, move); - return TRUE; - } - gHitMarker &= ~HITMARKER_IGNORE_ON_AIR; - - if (!(gHitMarker & HITMARKER_IGNORE_UNDERGROUND) && gStatuses3[gBankTarget] & STATUS3_UNDERGROUND) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - JumpIfMoveFailed(7, move); - return TRUE; - } - gHitMarker &= ~HITMARKER_IGNORE_UNDERGROUND; - - if (!(gHitMarker & HITMARKER_IGNORE_UNDERWATER) && gStatuses3[gBankTarget] & STATUS3_UNDERWATER) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - JumpIfMoveFailed(7, move); - return TRUE; - } - gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER; - - if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && gBattleMoves[move].effect == EFFECT_THUNDER) - || (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW)) - { - JumpIfMoveFailed(7, move); - return TRUE; - } - return FALSE; -} - -static void atk01_accuracycheck(void) -{ - u16 move = BS2ScriptRead16(gBattlescriptCurrInstr + 5); - if (move == 0xFFFE || move == 0xFFFF) - { - if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && move == 0xFFFF && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker) - gBattlescriptCurrInstr += 7; - else if (gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else if (!JumpIfMoveAffectedByProtect(0)) - gBattlescriptCurrInstr += 7; - } - else - { - u8 type; s8 buff; u8 MoveAcc; u16 calc; u8 hold_effect; u8 quality; - if (move == 0) {move = gCurrentMove;} - - if (BATTLE_STRUCT->dynamicMoveType) - type = BATTLE_STRUCT->dynamicMoveType & 0x3F; - else - type = gBattleMoves[move].type; - - if (JumpIfMoveAffectedByProtect(move)) - return; - if (AccuracyCalcHelper(move)) - return; - - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) - { - u8 acc = gBattleMons[gBankAttacker].statStages[STAT_STAGE_ACC]; - buff = acc; - } - else - { - u8 acc = gBattleMons[gBankAttacker].statStages[STAT_STAGE_ACC]; - buff = acc + 6 - gBattleMons[gBankTarget].statStages[STAT_STAGE_EVASION]; - } - - if (buff < 0) {buff = 0;} - if (buff > 0xC) {buff = 0xC;} - - MoveAcc = gBattleMoves[move].accuracy; - //check Thunder on sunny weather - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && gBattleMoves[move].effect == EFFECT_THUNDER) - MoveAcc = 50; - - calc = gAccuracyStageRatios[buff].dividend * MoveAcc; - calc /= gAccuracyStageRatios[buff].divisor; - - if (gBattleMons[gBankAttacker].ability == ABILITY_COMPOUND_EYES) - calc = (calc * 130) / 100; //1.3 compound eyes boost - if (WEATHER_HAS_EFFECT && gBattleMons[gBankTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & WEATHER_SANDSTORM_ANY) - calc = (calc * 80) / 100; //1.2 sand veil loss; - if (gBattleMons[gBankAttacker].ability == ABILITY_HUSTLE && type < 9) - calc = (calc * 80) / 100; //1.2 hustle loss; - - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_EVASION_UP) - calc = (calc * (100 - quality)) / 100; - - //final calculation - if ((Random() % 100 + 1) > calc) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && (gBattleMoves[move].target == 0x8 || gBattleMoves[move].target == 0x20)) - gBattleCommunication[6] = 2; - else - gBattleCommunication[6] = 0; - b_wonderguard_and_levitate(); - - } - JumpIfMoveFailed(7, move); - } -} - -static void atk02_attackstring(void) -{ - if (gBattleExecBuffer) - return; - if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED))) - { - PrepareStringBattle(4, gBankAttacker); - gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; - } - gBattlescriptCurrInstr++; - gBattleCommunication[MSG_DISPLAY] = 0; -} - -static void atk03_ppreduce(void) -{ - int to_deduct = 1; - if (gBattleExecBuffer) - return; - if (!gSpecialStatuses[gBankAttacker].flag20) - { - switch (gBattleMoves[gCurrentMove].target) - { - case TARGET_FOES_AND_ALLY: - to_deduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBankAttacker, ABILITY_PRESSURE, 0, 0); - break; - case TARGET_BOTH: - case TARGET_OPPONENTS_FIELD: - to_deduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIZE, gBankAttacker, ABILITY_PRESSURE, 0, 0); - break; - default: - if (gBankAttacker != gBankTarget && gBattleMons[gBankTarget].ability == ABILITY_PRESSURE) - to_deduct++; - break; - } - } - if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBankAttacker].pp[gCurrMovePos]) - { - gProtectStructs[gBankAttacker].notFirstStrike = 1; - if (gBattleMons[gBankAttacker].pp[gCurrMovePos] > to_deduct) - gBattleMons[gBankAttacker].pp[gCurrMovePos] -= to_deduct; - else - gBattleMons[gBankAttacker].pp[gCurrMovePos] = 0; - - if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED) - && !((gDisableStructs[gBankAttacker].unk18_b) & gBitTable[gCurrMovePos])) - { - gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBankAttacker].pp[gCurrMovePos]); - MarkBufferBankForExecution(gBankAttacker); - } - } - gHitMarker &= ~(HITMARKER_NO_PPDEDUCT); - gBattlescriptCurrInstr++; -} - -static void atk04_critcalc(void) -{ - u8 hold_effect; u16 item; u16 crit_chance; int adderv3, adderv5, adderv6, adderv7, adderv8, adderv9, adderv10, adderv11; u16 adderv12; - item = gBattleMons[gBankAttacker].item; - if (item == ITEM_ENIGMA_BERRY) - hold_effect = gEnigmaBerries[gBankAttacker].holdEffect; - else - hold_effect = ItemId_GetHoldEffect(item); - - gStringBank = gBankAttacker; - - if (gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) - adderv3 = 2; - else - adderv3 = 0; - - if (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL) {adderv3++;} - adderv5 = adderv3; - if (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK) {adderv5 = adderv3 + 1;} - - if (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK) {adderv5++;} - adderv6 = adderv5; - if (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL) {adderv6 = adderv5 + 1;} - - adderv7 = 0; - if (hold_effect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBankAttacker].species == SPECIES_CHANSEY) {adderv7 = 1;} - adderv8 = 2 * adderv7; - adderv9 = 0; - if (hold_effect == HOLD_EFFECT_STICK && gBattleMons[gBankAttacker].species == SPECIES_FARFETCHD) {adderv9 = 1;} - adderv11 = 2 * adderv9; - if (hold_effect == HOLD_EFFECT_SCOPE_LENS) - {adderv10 = 1 + adderv6 + adderv8; adderv12 = adderv10 + adderv11;} - else - {adderv10 = adderv6 + adderv8; adderv12 = adderv10 + adderv11;} - - crit_chance = adderv12; - - if (crit_chance > 4) {crit_chance = 4;} - - if ((gBattleMons[gBankTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBankTarget].ability != ABILITY_SHELL_ARMOR) - && !(gStatuses3[gBankAttacker] & STATUS3_CANT_SCORE_A_CRIT) - && !(gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) - && !(Random() % gCriticalHitChance[crit_chance])) - gCritMultiplier = 2; - else - gCritMultiplier = 1; - gBattlescriptCurrInstr++; -} - -static void atk05_damagecalc1(void) -{ - u16 side_hword = gSideAffecting[GetBankIdentity(gBankTarget) & 1]; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, - side_hword, gDynamicBasePower, - BATTLE_STRUCT->dynamicMoveType, gBankAttacker, gBankTarget); - gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * BATTLE_STRUCT->dmgMultiplier; - - if (gStatuses3[gBankAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) - gBattleMoveDamage *= 2; - if (gProtectStructs[gBankAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - - gBattlescriptCurrInstr++; -} - -void AI_CalcDmg(u8 BankAtk, u8 BankDef) -{ - u16 side_hword = gSideAffecting[GetBankIdentity(BankDef) & 1]; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[BankAtk], &gBattleMons[BankDef], gCurrentMove, - side_hword, gDynamicBasePower, - BATTLE_STRUCT->dynamicMoveType, BankAtk, BankDef); - gDynamicBasePower = 0; - gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * BATTLE_STRUCT->dmgMultiplier; - - if (gStatuses3[BankAtk] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) - gBattleMoveDamage *= 2; - if (gProtectStructs[BankAtk].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; -} - -static void ModulateDmgByType(u8 multiplier) -{ - gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; - if (gBattleMoveDamage == 0 && multiplier != 0) - gBattleMoveDamage = 1; - - switch (multiplier) - { - case 0: //no effect - gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED; - gBattleMoveFlags &= ~MOVESTATUS_NOTVERYEFFECTIVE; - gBattleMoveFlags &= ~MOVESTATUS_SUPEREFFECTIVE; - break; - case 5: //not very effecting - if (gBattleMoves[gCurrentMove].power && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) - { - if (gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) - gBattleMoveFlags &= ~MOVESTATUS_SUPEREFFECTIVE; - else - gBattleMoveFlags |= MOVESTATUS_NOTVERYEFFECTIVE; - } - break; - case 20: //super effective - if (gBattleMoves[gCurrentMove].power && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) - { - if (gBattleMoveFlags & MOVESTATUS_NOTVERYEFFECTIVE) - gBattleMoveFlags &= ~MOVESTATUS_NOTVERYEFFECTIVE; - else - gBattleMoveFlags |= MOVESTATUS_SUPEREFFECTIVE; - } - break; - } -} - -static void atk06_typecalc(void) -{ - int i = 0; - u8 move_type; - if (gCurrentMove == MOVE_STRUGGLE) {goto END;} - - if (BATTLE_STRUCT->dynamicMoveType) - move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; - else - move_type = gBattleMoves[gCurrentMove].type; - - //check stab - if (gBattleMons[gBankAttacker].type1 == move_type || gBattleMons[gBankAttacker].type2 == move_type) - { - gBattleMoveDamage = gBattleMoveDamage * 15; - gBattleMoveDamage = gBattleMoveDamage / 10; - } - - if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; - gBattleCommunication[6] = move_type; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } - - else if (gTypeEffectiveness[i] == move_type) - { - //check type1 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) - ModulateDmgByType(gTypeEffectiveness[i + 2]); - //check type2 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && - gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2) - ModulateDmgByType(gTypeEffectiveness[i + 2]); - } - i += 3; - } - } - - if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 - && (!(gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) || ((gBattleMoveFlags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) - && gBattleMoves[gCurrentMove].power) - { - gLastUsedAbility = ABILITY_WONDER_GUARD; - gBattleMoveFlags |= MOVESTATUS_MISSED; - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; - gBattleCommunication[6] = 3; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) - gProtectStructs[gBankAttacker].notEffective = 1; - - END: - gBattlescriptCurrInstr++; -} - -static void b_wonderguard_and_levitate(void) -{ - u8 flags = 0; - int i = 0; - u8 move_type; - - if (gCurrentMove == MOVE_STRUGGLE || !gBattleMoves[gCurrentMove].power) - return; - - if (BATTLE_STRUCT->dynamicMoveType) - move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; - else - move_type = gBattleMoves[gCurrentMove].type; - - if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - RecordAbilitySetField6(ABILITY_LEVITATE, move_type); - return; - } - - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } - - if (gTypeEffectiveness[i] == move_type) - { - //check no effect - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 0) - { - gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED; - gProtectStructs[gBankAttacker].notEffective = 1; - } - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && - gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && - gTypeEffectiveness[i + 2] == 0) - { - gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED; - gProtectStructs[gBankAttacker].notEffective = 1; - } - - //check super effective - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 20) - flags |= 1; - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 - && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 - && gTypeEffectiveness[i + 2] == 20) - flags |= 1; - - //check not very effective - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1 && gTypeEffectiveness[i + 2] == 5) - flags |= 2; - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 - && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 - && gTypeEffectiveness[i + 2] == 5) - flags |= 2; - } - i += 3; - } - - if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2) - { - if (((flags & 2) || !(flags & 1)) && gBattleMoves[gCurrentMove].power) - { - RecordAbilitySetField6(ABILITY_WONDER_GUARD, 3); - } - } -} - -static void ModulateDmgByType2(u8 multiplier, u16 move, u8* flags) //a literal copy of the ModulateDmgbyType1 with different args... -{ - gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; - if (gBattleMoveDamage == 0 && multiplier != 0) - gBattleMoveDamage = 1; - - switch (multiplier) - { - case 0: //no effect - *flags |= MOVESTATUS_NOTAFFECTED; - *flags &= ~MOVESTATUS_NOTVERYEFFECTIVE; - *flags &= ~MOVESTATUS_SUPEREFFECTIVE; - break; - case 5: //not very effecting - if (gBattleMoves[move].power && !(*flags & MOVESTATUS_NOEFFECT)) - { - if (*flags & MOVESTATUS_SUPEREFFECTIVE) - *flags &= ~MOVESTATUS_SUPEREFFECTIVE; - else - *flags |= MOVESTATUS_NOTVERYEFFECTIVE; - } - break; - case 20: //super effective - if (gBattleMoves[move].power && !(*flags & MOVESTATUS_NOEFFECT)) - { - if (*flags & MOVESTATUS_NOTVERYEFFECTIVE) - *flags &= ~MOVESTATUS_NOTVERYEFFECTIVE; - else - *flags |= MOVESTATUS_SUPEREFFECTIVE; - } - break; - } -} - -#ifdef NONMATCHING -u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) -{ - int i = 0; - u8 flags = 0; - u8 move_type; - - if (move == MOVE_STRUGGLE) - return 0; - - move_type = gBattleMoves[move].type; - - //check stab - if (gBattleMons[bank_atk].type1 == move_type || gBattleMons[bank_atk].type2 == move_type) - { - gBattleMoveDamage = gBattleMoveDamage * 15; - gBattleMoveDamage = gBattleMoveDamage / 10; - } - - if (gBattleMons[bank_def].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - flags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); - } - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[bank_def].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } - - else if (gTypeEffectiveness[i] == move_type) - { - //check type1 - if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type1) - ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); - //check type2 - if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type2 && - gBattleMons[bank_def].type1 != gBattleMons[bank_def].type2) - ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); - } - i += 3; - } - } - - if (gBattleMons[bank_def].ability == ABILITY_WONDER_GUARD && !(flags & MOVESTATUS_MISSED) && - AttacksThisTurn(bank_atk, move) == 2 && - (!(flags & MOVESTATUS_SUPEREFFECTIVE) || ((flags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) && - gBattleMoves[move].power) - { - flags |= MOVESTATUS_MISSED; - } - return flags; -} -#else -__attribute__((naked)) -u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r10, r0\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - str r1, [sp, 0x4]\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - mov r9, r2\n\ - movs r7, 0\n\ - mov r0, sp\n\ - strb r7, [r0]\n\ - mov r0, r10\n\ - cmp r0, 0xA5\n\ - bne _0801D2AE\n\ - movs r0, 0\n\ - b _0801D43A\n\ - _0801D2AE:\n\ - ldr r1, _0801D31C @ =gBattleMoves\n\ - mov r3, r10\n\ - lsls r2, r3, 1\n\ - adds r0, r2, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - str r0, [sp, 0x8]\n\ - ldr r1, _0801D320 @ =gBattleMons\n\ - movs r0, 0x58\n\ - ldr r3, [sp, 0x4]\n\ - muls r0, r3\n\ - adds r3, r0, r1\n\ - adds r0, r3, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - str r2, [sp, 0xC]\n\ - adds r5, r1, 0\n\ - ldr r1, [sp, 0x8]\n\ - cmp r0, r1\n\ - beq _0801D2E2\n\ - adds r0, r3, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, r1\n\ - bne _0801D2F4\n\ - _0801D2E2:\n\ - ldr r4, _0801D324 @ =gBattleMoveDamage\n\ - ldr r1, [r4]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - str r0, [r4]\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - _0801D2F4:\n\ - movs r0, 0x58\n\ - mov r2, r9\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - adds r0, r5\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1A\n\ - bne _0801D328\n\ - ldr r3, [sp, 0x8]\n\ - cmp r3, 0x4\n\ - bne _0801D328\n\ - movs r1, 0x9\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ - orrs r0, r1\n\ - mov r1, sp\n\ - strb r0, [r1]\n\ - b _0801D3DC\n\ - .align 2, 0\n\ - _0801D31C: .4byte gBattleMoves\n\ - _0801D320: .4byte gBattleMons\n\ - _0801D324: .4byte gBattleMoveDamage\n\ - _0801D328:\n\ - ldr r1, _0801D344 @ =gTypeEffectiveness\n\ - adds r0, r7, r1\n\ - ldrb r0, [r0]\n\ - adds r2, r1, 0\n\ - cmp r0, 0xFF\n\ - beq _0801D3DC\n\ - cmp r0, 0xFE\n\ - bne _0801D34C\n\ - movs r0, 0x58\n\ - mov r1, r9\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - b _0801D3CA\n\ - .align 2, 0\n\ - _0801D344: .4byte gTypeEffectiveness\n\ - _0801D348:\n\ - adds r7, 0x3\n\ - b _0801D3B6\n\ - _0801D34C:\n\ - ldr r6, _0801D44C @ =gTypeEffectiveness\n\ - adds r0, r7, r6\n\ - ldrb r0, [r0]\n\ - ldr r2, [sp, 0x8]\n\ - cmp r0, r2\n\ - bne _0801D3B0\n\ - adds r1, r7, 0x1\n\ - adds r1, r6\n\ - ldr r3, _0801D450 @ =gBattleMons\n\ - mov r8, r3\n\ - movs r3, 0x58\n\ - mov r0, r9\n\ - muls r0, r3\n\ - mov r2, r8\n\ - adds r5, r0, r2\n\ - adds r0, r5, 0\n\ - adds r0, 0x21\n\ - ldrb r4, [r1]\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - bne _0801D388\n\ - adds r0, r7, 0x2\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - mov r1, r10\n\ - mov r2, sp\n\ - str r3, [sp, 0x10]\n\ - bl ModulateDmgByType2\n\ - ldr r3, [sp, 0x10]\n\ - _0801D388:\n\ - adds r0, r5, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - bne _0801D3B0\n\ - ldr r0, _0801D454 @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - muls r0, r3\n\ - add r0, r8\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, r4\n\ - beq _0801D3B0\n\ - adds r0, r7, 0x2\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - mov r1, r10\n\ - mov r2, sp\n\ - bl ModulateDmgByType2\n\ - _0801D3B0:\n\ - adds r7, 0x3\n\ - ldr r5, _0801D450 @ =gBattleMons\n\ - ldr r2, _0801D44C @ =gTypeEffectiveness\n\ - _0801D3B6:\n\ - adds r0, r7, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xFF\n\ - beq _0801D3DC\n\ - cmp r0, 0xFE\n\ - bne _0801D34C\n\ - movs r0, 0x58\n\ - mov r3, r9\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - _0801D3CA:\n\ - adds r1, r5, 0\n\ - adds r1, 0x50\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 22\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801D348\n\ - _0801D3DC:\n\ - movs r0, 0x58\n\ - mov r1, r9\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, r5\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x19\n\ - bne _0801D436\n\ - mov r0, sp\n\ - ldrb r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801D436\n\ - ldr r0, [sp, 0x4]\n\ - mov r1, r10\n\ - bl AttacksThisTurn\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - cmp r1, 0x2\n\ - bne _0801D436\n\ - mov r0, sp\n\ - ldrb r3, [r0]\n\ - adds r0, r1, 0\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _0801D41E\n\ - movs r0, 0x6\n\ - ands r0, r3\n\ - cmp r0, 0x6\n\ - bne _0801D436\n\ - _0801D41E:\n\ - ldr r0, _0801D458 @ =gBattleMoves\n\ - ldr r1, [sp, 0xC]\n\ - add r1, r10\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0\n\ - beq _0801D436\n\ - mov r0, sp\n\ - movs r1, 0x1\n\ - orrs r1, r3\n\ - strb r1, [r0]\n\ - _0801D436:\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ - _0801D43A:\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ - _0801D44C: .4byte gTypeEffectiveness\n\ - _0801D450: .4byte gBattleMons\n\ - _0801D454: .4byte gBankTarget\n\ - _0801D458: .4byte gBattleMoves\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -u8 AI_TypeCalc(u16 move, u16 species, u8 ability) -{ - int i = 0; - u8 flags = 0; - u8 type1 = gBaseStats[species].type1, type2 = gBaseStats[species].type2, move_type; - - if (move == MOVE_STRUGGLE) - return 0; - - move_type = gBattleMoves[move].type; - - if (ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - flags = MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED; - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - i += 3; - continue; - } - if (gTypeEffectiveness[i] == move_type) - { - //check type1 - if (gTypeEffectiveness[i + 1] == type1) - ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); - //check type2 - if (gTypeEffectiveness[i + 1] == type2 && gBattleMons[gBankTarget].type1 != type2) //gf you morons, you should check if (type1 != type2)... - ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); - } - i += 3; - } - } - if (ability == ABILITY_WONDER_GUARD - && (!(flags & MOVESTATUS_SUPEREFFECTIVE) || ((flags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) - && gBattleMoves[move].power) - flags |= MOVESTATUS_NOTAFFECTED; - return flags; -} - -// Multiplies the damage by a random factor between 85% to 100% inclusive -static inline void ApplyRandomDmgMultiplier(void) -{ - u16 rand = Random(); - u16 randPercent = 100 - (rand % 16); - - if (gBattleMoveDamage != 0) - { - gBattleMoveDamage *= randPercent; - gBattleMoveDamage /= 100; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } -} - -void Unused_ApplyRandomDmgMultiplier(void) -{ - ApplyRandomDmgMultiplier(); -} - -static void atk07_dmg_adjustment(void) -{ - u8 hold_effect, quality; - ApplyRandomDmgMultiplier(); - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - { - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - } - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) - { - RecordItemBattle(gBankTarget, hold_effect); - gSpecialStatuses[gBankTarget].focusBanded = 1; - } - if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE) - goto END; - if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBankTarget].endured - && !gSpecialStatuses[gBankTarget].focusBanded) - goto END; - - if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) - goto END; - - gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1; - - if (gProtectStructs[gBankTarget].endured) - { - gBattleMoveFlags |= MOVESTATUS_ENDURED; - goto END; - } - if (gSpecialStatuses[gBankTarget].focusBanded) - { - gBattleMoveFlags |= MOVESTATUS_HUNGON; - gLastUsedItem = gBattleMons[gBankTarget].item; - } - - END: - gBattlescriptCurrInstr++; -} - -static void atk08_dmg_adjustment2(void) //literally the same as 0x7 except it doesn't check for false swipe move effect... -{ - u8 hold_effect, quality; - ApplyRandomDmgMultiplier(); - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - { - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - } - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) - { - RecordItemBattle(gBankTarget, hold_effect); - gSpecialStatuses[gBankTarget].focusBanded = 1; - } - if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE) - goto END; - if (!gProtectStructs[gBankTarget].endured - && !gSpecialStatuses[gBankTarget].focusBanded) - goto END; - - if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) - goto END; - - gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1; - - if (gProtectStructs[gBankTarget].endured) - { - gBattleMoveFlags |= MOVESTATUS_ENDURED; - goto END; - } - if (gSpecialStatuses[gBankTarget].focusBanded) - { - gBattleMoveFlags |= MOVESTATUS_HUNGON; - gLastUsedItem = gBattleMons[gBankTarget].item; - } - - END: - gBattlescriptCurrInstr++; -} - -static void atk09_attackanimation(void) -{ - if (gBattleExecBuffer) - return; - - if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE)) - { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_Pausex20; - BATTLE_STRUCT->animTurn += 1; - BATTLE_STRUCT->animTargetsHit += 1; - } - else - { - if ((gBattleMoves[gCurrentMove].target & TARGET_BOTH || gBattleMoves[gCurrentMove].target & TARGET_FOES_AND_ALLY || gBattleMoves[gCurrentMove].target & TARGET_DEPENDS) && BATTLE_STRUCT->animTargetsHit) - { - gBattlescriptCurrInstr++; - return; - } - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) - { - gActiveBank = gBankAttacker; - - EmitMoveAnimation(0, gCurrentMove, BATTLE_STRUCT->animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBankAttacker].friendship, &gDisableStructs[gBankAttacker]); - BATTLE_STRUCT->animTurn += 1; - BATTLE_STRUCT->animTargetsHit += 1; - MarkBufferBankForExecution(gBankAttacker); - gBattlescriptCurrInstr++; - } - else - { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_Pausex20; - } - } -} - -static void atk0A_waitanimation(void) -{ - if (gBattleExecBuffer == 0) - gBattlescriptCurrInstr++; -} - -static void atk0B_healthbarupdate(void) -{ - if (gBattleExecBuffer) - return; - if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) - goto END; - - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - - if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBank].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) - { - PrepareStringBattle(0x80, gActiveBank); - goto END; - } - - EmitHealthBarUpdate(0, gBattleMoveDamage); - MarkBufferBankForExecution(gActiveBank); - - if (!GetBankSide(gActiveBank) && gBattleMoveDamage > 0) - gBattleResults.unk5_0 = 1; - - END: - gBattlescriptCurrInstr += 2; -} - -static void atk0C_datahpupdate(void) -{ - register u32 move_type asm("r6"); //no idea how to match it otherwise - u8 dynamic_move_type; - - if (gBattleExecBuffer) - return; - - dynamic_move_type = BATTLE_STRUCT->dynamicMoveType; - if (dynamic_move_type && !(dynamic_move_type & 0x40)) - { - move_type = 0x3F; - move_type &= dynamic_move_type; - } - else - { - move_type = gBattleMoves[gCurrentMove].type; - } - - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) - { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBank].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) - { - if (gDisableStructs[gActiveBank].substituteHP >= gBattleMoveDamage) - { - if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0) - gSpecialStatuses[gActiveBank].moveturnLostHP = gBattleMoveDamage; - gDisableStructs[gActiveBank].substituteHP -= gBattleMoveDamage; - gHP_dealt = gBattleMoveDamage; - } - else - { - if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0) - gSpecialStatuses[gActiveBank].moveturnLostHP = gDisableStructs[gActiveBank].substituteHP; - gHP_dealt = gDisableStructs[gActiveBank].substituteHP; - gDisableStructs[gActiveBank].substituteHP = 0; - } - //check substitute fading - if (gDisableStructs[gActiveBank].substituteHP == 0) - { - gBattlescriptCurrInstr += 2; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_SubstituteFade; - return; - } - } - else - { - gHitMarker &= ~(HITMARKER_IGNORE_SUBSTITUTE); - if (gBattleMoveDamage < 0) //hp goes up - { - gBattleMons[gActiveBank].hp -= gBattleMoveDamage; - if (gBattleMons[gActiveBank].hp > gBattleMons[gActiveBank].maxHP) - gBattleMons[gActiveBank].hp = gBattleMons[gActiveBank].maxHP; - - } - else //hp goes down - { - if (gHitMarker & HITMARKER_x20) - { - gHitMarker &= ~(HITMARKER_x20); - } - else - { - gTakenDmg[gActiveBank] += gBattleMoveDamage; - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0) - gTakenDmgBanks[gActiveBank] = gBankAttacker; - else - gTakenDmgBanks[gActiveBank] = gBankTarget; - } - - if (gBattleMons[gActiveBank].hp > gBattleMoveDamage) - { - gBattleMons[gActiveBank].hp -= gBattleMoveDamage; - gHP_dealt = gBattleMoveDamage; - } - else - { - gHP_dealt = gBattleMons[gActiveBank].hp; - gBattleMons[gActiveBank].hp = 0; - } - - if (!gSpecialStatuses[gActiveBank].moveturnLostHP && !(gHitMarker & HITMARKER_x100000)) - gSpecialStatuses[gActiveBank].moveturnLostHP = gHP_dealt; - - if (move_type <= 8 && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT) - { - gProtectStructs[gActiveBank].physicalDmg = gHP_dealt; - gSpecialStatuses[gActiveBank].moveturnLostHP_physical = gHP_dealt; - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0) - { - gProtectStructs[gActiveBank].physicalBank = gBankAttacker; - gSpecialStatuses[gActiveBank].moveturnPhysicalBank = gBankAttacker; - } - else - { - gProtectStructs[gActiveBank].physicalBank = gBankTarget; - gSpecialStatuses[gActiveBank].moveturnPhysicalBank = gBankTarget; - } - } - else if (move_type > 8 && !(gHitMarker & HITMARKER_x100000)) - { - gProtectStructs[gActiveBank].specialDmg = gHP_dealt; - gSpecialStatuses[gActiveBank].moveturnLostHP_special = gHP_dealt; - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0) - { - gProtectStructs[gActiveBank].specialBank = gBankAttacker; - gSpecialStatuses[gActiveBank].moveturnSpecialBank = gBankAttacker; - } - else - { - gProtectStructs[gActiveBank].specialBank = gBankTarget; - gSpecialStatuses[gActiveBank].moveturnSpecialBank = gBankTarget; - } - } - } - gHitMarker &= ~(HITMARKER_x100000); - EmitSetAttributes(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp); - MarkBufferBankForExecution(gActiveBank); - } - } - else - { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0) - gSpecialStatuses[gActiveBank].moveturnLostHP = 0xFFFF; - } - gBattlescriptCurrInstr += 2; -} - -static void atk0D_critmessage(void) -{ - if (gBattleExecBuffer == 0) - { - if (gCritMultiplier == 2 && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) - { - PrepareStringBattle(0xD9, gBankAttacker); - gBattleCommunication[MSG_DISPLAY] = 1; - } - gBattlescriptCurrInstr++; - } -} - -static void atk0E_effectiveness_sound(void) -{ - if (gBattleExecBuffer) - return; - gActiveBank = gBankTarget; - if (!(gBattleMoveFlags & MOVESTATUS_MISSED)) - { - u8 flag = ~MOVESTATUS_MISSED; - switch (gBattleMoveFlags & flag) - { - case MOVESTATUS_SUPEREFFECTIVE: - EmitEffectivenessSound(0, 14); - MarkBufferBankForExecution(gActiveBank); - break; - case MOVESTATUS_NOTVERYEFFECTIVE: - EmitEffectivenessSound(0, 12); - MarkBufferBankForExecution(gActiveBank); - break; - case MOVESTATUS_NOTAFFECTED: - case MOVESTATUS_FAILED: - break; - case MOVESTATUS_ENDURED: - case MOVESTATUS_ONEHITKO: - case MOVESTATUS_HUNGON: - default: - if (gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) - { - EmitEffectivenessSound(0, 14); - MarkBufferBankForExecution(gActiveBank); - } - else if (gBattleMoveFlags & MOVESTATUS_NOTVERYEFFECTIVE) - { - EmitEffectivenessSound(0, 12); - MarkBufferBankForExecution(gActiveBank); - } - else if (!(gBattleMoveFlags & (MOVESTATUS_NOTAFFECTED | MOVESTATUS_FAILED))) - { - EmitEffectivenessSound(0, 13); - MarkBufferBankForExecution(gActiveBank); - } - break; - } - } - gBattlescriptCurrInstr++; -} - -static void atk0F_resultmessage(void) -{ - u16 stringID = 0; - - if (gBattleExecBuffer) - return; - - if (gBattleMoveFlags & MOVESTATUS_MISSED && (!(gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) || gBattleCommunication[6] > 2)) - { - stringID = gMissStrings[gBattleCommunication[6]]; - gBattleCommunication[MSG_DISPLAY] = 1; - } - else - { - gBattleCommunication[MSG_DISPLAY] = 1; - switch (gBattleMoveFlags & 0xFE) - { - case MOVESTATUS_SUPEREFFECTIVE: - stringID = 0xDE; - break; - case MOVESTATUS_NOTVERYEFFECTIVE: - stringID = 0xDD; - break; - case MOVESTATUS_ONEHITKO: - stringID = 0xDA; - break; - case MOVESTATUS_ENDURED: - stringID = 0x99; - break; - case MOVESTATUS_FAILED: - goto FAILED; - case MOVESTATUS_NOTAFFECTED: - goto NOTAFFECTED; - case MOVESTATUS_HUNGON: - gLastUsedItem = gBattleMons[gBankTarget].item; - gStringBank = gBankTarget; - gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; - return; - default: - if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) - NOTAFFECTED: - stringID = 0x1B; - else if (gBattleMoveFlags & MOVESTATUS_ONEHITKO) - { - gBattleMoveFlags &= ~(MOVESTATUS_ONEHITKO); - gBattleMoveFlags &= ~(MOVESTATUS_SUPEREFFECTIVE); - gBattleMoveFlags &= ~(MOVESTATUS_NOTVERYEFFECTIVE); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; - return; - } - else if (gBattleMoveFlags & MOVESTATUS_ENDURED) - { - gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_EnduredMsg; - return; - } - else if (gBattleMoveFlags & MOVESTATUS_HUNGON) - { - gLastUsedItem = gBattleMons[gBankTarget].item; - gStringBank = gBankTarget; - gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; - return; - } - else if (gBattleMoveFlags & MOVESTATUS_FAILED) - FAILED: - stringID = 0xE5; - else - gBattleCommunication[MSG_DISPLAY] = 0; - } - } - - if (stringID) - { - register u16 dummy asm("r0") = stringID; //Can't match it otherwise - PrepareStringBattle(dummy, gBankAttacker); - } - gBattlescriptCurrInstr++; -} - -static void atk10_printstring(void) -{ - if (gBattleExecBuffer == 0) - { - u16 var = BS2ScriptRead16(gBattlescriptCurrInstr + 1); - PrepareStringBattle(var, gBankAttacker); - gBattlescriptCurrInstr += 3; - gBattleCommunication[MSG_DISPLAY] = 1; - } -} - -static void atk11_printstring_playeronly(void) -{ - gActiveBank = gBankAttacker; - EmitPrintStringPlayerOnly(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 3; - gBattleCommunication[MSG_DISPLAY] = 1; -} - -static void atk12_waitmessage(void) -{ - if (gBattleExecBuffer == 0) - { - if (!gBattleCommunication[MSG_DISPLAY]) - { - gBattlescriptCurrInstr += 3; - } - else - { - u16 to_wait = BS2ScriptRead16(gBattlescriptCurrInstr + 1); - if (++gPauseCounterBattle >= to_wait) - { - gPauseCounterBattle = 0; - gBattlescriptCurrInstr += 3; - gBattleCommunication[MSG_DISPLAY] = 0; - } - } - } -} - -static void atk13_printfromtable(void) -{ - if (gBattleExecBuffer == 0) - { - u16 *ptr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - ptr += gBattleCommunication[MULTISTRING_CHOOSER]; - PrepareStringBattle(*(u16*)ptr, gBankAttacker); - gBattlescriptCurrInstr += 5; - gBattleCommunication[MSG_DISPLAY] = 1; - } -} - -static void atk14_printfromtable_playeronly(void) -{ - if (gBattleExecBuffer == 0) - { - u16 *ptr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - ptr += gBattleCommunication[MULTISTRING_CHOOSER]; - gActiveBank = gBankAttacker; - EmitPrintStringPlayerOnly(0, *(u16*)ptr); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 5; - gBattleCommunication[MSG_DISPLAY] = 1; - } -} - -u8 BankGetTurnOrder(u8 bank) -{ - int i; - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gTurnOrder[i] == bank) - break; - } - return i; -} - -//Someone please decompile this monstrosity below... -#ifdef NONMATCHING -void SetMoveEffect(bool8 primary, u8 certainArg) -{ - #define EffectAffectsUser 0x40 - register u8 certain asm("r5") = certainArg; - register bool32 StatusChanged asm("r10") = 0; - register int AffectsUser asm("r6") = 0; //0x40 otherwise - bool32 NoSunCanFreeze = 1; - - if (gBattleCommunication[MOVE_EFFECT_BYTE] & EffectAffectsUser) - { - gEffectBank = gBankAttacker; //bank that effects get applied on - gBattleCommunication[MOVE_EFFECT_BYTE] &= ~(EffectAffectsUser); - AffectsUser = EffectAffectsUser; - BATTLE_STRUCT->scriptingActive = gBankTarget; //theoretically the attacker - } - else - { - gEffectBank = gBankTarget; - BATTLE_STRUCT->scriptingActive = gBankAttacker; - } - - if (gBattleMons[gEffectBank].ability_id == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && - !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) - {gBattlescriptCurrInstr++; return;} - - if (gSideAffecting[get_bank_identity(gEffectBank) & 1] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && - !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7) - {gBattlescriptCurrInstr++; return;} - - //make sure at least ONE HP except payday and thief - if (gBattleMons[gEffectBank].current_hp == 0 && gBattleCommunication[MOVE_EFFECT_BYTE] != 0xB && gBattleCommunication[MOVE_EFFECT_BYTE] != 0x1F) - {gBattlescriptCurrInstr++; return;} - - if (gBattleMons[gEffectBank].status2 & STATUS2_SUBSTITUTE && AffectsUser != EffectAffectsUser) - {gBattlescriptCurrInstr++; return;} - - if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) //status change - { - switch (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) - { - case STATUS_SLEEP: - //check active uproar - if (gBattleMons[gEffectBank].ability_id != ABILITY_SOUNDPROOF) - { - for (gActiveBank = 0; gActiveBank < gNoOfAllBanks && !(gBattleMons[gActiveBank].status2 & STATUS2_UPROAR); gActiveBank++) {} - } - else - gActiveBank = gNoOfAllBanks; - if (gBattleMons[gEffectBank].status) {break;} - if (gActiveBank != gNoOfAllBanks) {break;} //nice way of checking uproar... - if (gBattleMons[gEffectBank].ability_id == ABILITY_VITAL_SPIRIT) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_INSOMNIA) {break;} - - b_cancel_multi_turn_move_maybe(gEffectBank); - StatusChanged = 1; - break; - case STATUS_POISON: - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) - { - gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbility(gEffectBank, ABILITY_IMMUNITY); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - //_0801E664: - gBattlescriptCurrInstr = BS_PSN_PREVENTION; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication.multistring_chooser = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - return; - } - else - {gBattleCommunication.multistring_chooser = 0; return;} - } - if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) - && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) - { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_PSN_PREVENTION; - gBattleCommunication.multistring_chooser = 2; - return; - } - if (gBattleMons[gEffectBank].type1 == TYPE_POISON) {break;} - if (gBattleMons[gEffectBank].type2 == TYPE_POISON) {break;} - if (gBattleMons[gEffectBank].type1 == TYPE_STEEL) {break;} - if (gBattleMons[gEffectBank].type2 == TYPE_STEEL) {break;} - if (gBattleMons[gEffectBank].status) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY) {break;} - StatusChanged = 1; - break; - case STATUS_BURN: - if (gBattleMons[gEffectBank].ability_id == ABILITY_WATER_VEIL && (primary == 1 || certain == 0x80)) - { - gLastUsedAbility = ABILITY_WATER_VEIL; - RecordAbility(gEffectBank, ABILITY_WATER_VEIL); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - //_0801E664: - gBattlescriptCurrInstr = BS_BRN_PREVENTION; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication.multistring_chooser = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - return; - } - else - {gBattleCommunication.multistring_chooser = 0; return;} - } - if ((gBattleMons[gEffectBank].type1 == TYPE_FIRE || gBattleMons[gEffectBank].type2 == TYPE_FIRE) - && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) - { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_BRN_PREVENTION; - gBattleCommunication.multistring_chooser = 2; - return; - } - if (gBattleMons[gEffectBank].type1 == TYPE_FIRE) {break;} - if (gBattleMons[gEffectBank].type2 == TYPE_FIRE) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_WATER_VEIL) {break;} - if (gBattleMons[gEffectBank].status1 == 0) {break;} - StatusChanged = 1; - break; - case STATUS_FREEZE: - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) {NoSunCanFreeze = 0;} - if (gBattleMons[gEffectBank].type1 == TYPE_ICE) {break;} - if (gBattleMons[gEffectBank].type2 == TYPE_ICE) {break;} - if (gBattleMons[gEffectBank].status) {break;} - if (NoSunCanFreeze == 0) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_MAGMA_ARMOR) {break;} - - b_cancel_multi_turn_move_maybe(gEffectBank); - StatusChanged = 1; - break; - case STATUS_PARALYSIS: - if (gBattleMons[gEffectBank].ability_id == ABILITY_LIMBER) - { - if ((primary == 1 || certain == 0x80)) - { - gLastUsedAbility = ABILITY_LIMBER; - RecordAbility(gEffectBank, ABILITY_LIMBER); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - //_0801E664: - gBattlescriptCurrInstr = BS_PRLZ_PREVENTION; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication.multistring_chooser = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - return; - } - else - {gBattleCommunication.multistring_chooser = 0; return;} - } - else {break;} - } - if (gBattleMons[gEffectBank].status) {break;} - StatusChanged = 1; - break; - case STATUS_TOXIC_POISON: - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) - { - gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbility(gEffectBank, ABILITY_IMMUNITY); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - //_0801E664: - gBattlescriptCurrInstr = BS_PSN_PREVENTION; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication.multistring_chooser = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - return; - } - else - {gBattleCommunication.multistring_chooser = 0; return;} - } - if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) - && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) - { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_PSN_PREVENTION; - gBattleCommunication.multistring_chooser = 2; - return; - } - if (gBattleMons[gEffectBank].status) {break;} - if (gBattleMons[gEffectBank].type1 != TYPE_POISON && - gBattleMons[gEffectBank].type2 != TYPE_POISON && - gBattleMons[gEffectBank].type1 != TYPE_STEEL && - gBattleMons[gEffectBank].type2 != TYPE_STEEL) - { - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY) {break;} - gBattleMons[gEffectBank].status1 |= ~(STATUS_POISON); //TODO: fix OR to AND - StatusChanged = 1; - break; - } - else - gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED; - break; - } - if (StatusChanged == 1) - { - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - if (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS_SLEEP) - gBattleMons[gEffectBank].status1 |= ((Random() & 3) + 2); - else - gBattleMons[gEffectBank].status1 |= gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gActiveBank = gEffectBank; - bb2_setattributes_in_battle(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status); - mark_buffer_bank_for_execution(gActiveBank); - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - { - gBattleCommunication.multistring_chooser = 1; - gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); - } - else - gBattleCommunication.multistring_chooser = 0; - if (gBattleCommunication[MOVE_EFFECT_BYTE] == 2 || gBattleCommunication[MOVE_EFFECT_BYTE] == 6 || gBattleCommunication[MOVE_EFFECT_BYTE] == 5 || gBattleCommunication[MOVE_EFFECT_BYTE] == 3) - { - BATTLE_STRUCT->SynchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; - gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; - } - return; - } - else if (StatusChanged == 0) - {gBattlescriptCurrInstr++; return;} - } - else - { - if (gBattleMons[gEffectBank].status2 & gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) - { - gBattlescriptCurrInstr++; - return; - } - switch (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) - { - case 7: //confusion - if (gBattleMons[gEffectBank].ability_id == ABILITY_OWN_TEMPO) - {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gEffectBank].status2 & STATUS2_CONFUSION) - {gBattlescriptCurrInstr++; return;} - gBattleMons[gEffectBank].status2 |= (((Random()) % 0x4)) + 2; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 8: //flinch - if (gBattleMons[gEffectBank].ability_id == ABILITY_INNER_FOCUS) - { - if (primary == 1 || certain == 0x80) - { - gLastUsedAbility = ABILITY_INNER_FOCUS; - RecordAbility(gEffectBank, ABILITY_INNER_FOCUS); - gBattlescriptCurrInstr = BS_FLINCH_PREVENTION; - return; - } - else - {gBattlescriptCurrInstr++; return;} - } - else - { - if (BankGetTurnOrder(gEffectBank) > gCurrentMoveTurn) - gBattleMons[gEffectBank].status2 |= gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattlescriptCurrInstr++; return; - } - break; - case 10: //uproar - if (gBattleMons[gEffectBank].status2 & STATUS2_UPROAR) - {gBattlescriptCurrInstr++; return;} - gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gEffectBank] = gCurrentMove; - gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 11: //pay day - if (!(get_bank_identity(gEffectBank) & 1)) - { - u16 PayDay = gPaydayMoney; - gPaydayMoney += (gBattleMons[gEffectBank].level * 5); - if (PayDay > gPaydayMoney) - gPaydayMoney = 0xFFFF; - } - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 9: //tri attack - if (gBattleMons[gEffectBank].status) - {gBattlescriptCurrInstr++; return;} - gBattleCommunication[MOVE_EFFECT_BYTE] = Random() % 3 + 3; - SetMoveEffect(0, 0); - break; - case 12: //charging move - gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gEffectBank] = gCurrentMove; - gProtectStructs[gEffectBank].flag1_chargingturn = 1; - gBattlescriptCurrInstr++; - break; - case 13: //wrap - if (gBattleMons[gEffectBank].status2 & STATUS2_WRAPPED) - {gBattlescriptCurrInstr++; return;} - gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 0xD; - BATTLE_STRUCT->WrappedMove1[gEffectBank] = gCurrentMove; - BATTLE_STRUCT->WrappedMove2[gEffectBank] = gCurrentMove >> 8; - BATTLE_STRUCT->WrappedBy[gEffectBank] = gBankAttacker; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattleCommunication.multistring_chooser = 0; - while (gBattleCommunication.multistring_chooser <= 4 - && gCurrentMove != gTrappingMoves[gBattleCommunication.multistring_chooser]) - gBattleCommunication.multistring_chooser++; - break; - case 14: //recoil - gBattleMoveDamage = (gHP_dealt) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 15 ... 21: //stat + 1 - if (ChangeStats(0x10, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xF2, certain, 0)) {gBattlescriptCurrInstr++;} - else - { - BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; //TODO: the arg ptr is wrong by one - BATTLE_STRUCT->animArg2 = 0; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_UP; - } - break; - case 22 ... 28: //stat - 1 - if (ChangeStats(~(0x6f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xEB, certain, 0)) {gBattlescriptCurrInstr++;} //TODO: negation doesnt work correctly - else - { - BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; - BATTLE_STRUCT->animArg2 = 0; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_DOWN; - } - break; - case 39 ... 45: //stat + 2 - if (ChangeStats(0x20, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xDA, certain, 0)) {gBattlescriptCurrInstr++;} - else - { - BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; - BATTLE_STRUCT->animArg2 = 0; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_UP; - } - break; - case 46 ... 52: //stat - 2 - if (ChangeStats(~(0x5f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xD3, certain, 0)) {gBattlescriptCurrInstr++;} - else - { - BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; - BATTLE_STRUCT->animArg2 = 0; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_DOWN; - } - break; - case 29: //recharge - gBattleMons[gEffectBank].status2 |= STATUS2_RECHARGE; - gDisableStructs[gEffectBank].recharge_counter = 2; - gLockedMove[gEffectBank] = gCurrentMove; - gBattlescriptCurrInstr++; - break; - case 30: //rage - gBattleMons[gBankAttacker].status2 |= STATUS2_RAGE; - gBattlescriptCurrInstr++; - break; - case 31: //item steal - { - u8 side = battle_side_get_owner(gBankAttacker); - if (battle_side_get_owner(gBankAttacker) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400) - {gBattlescriptCurrInstr++; return;} - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400 && (gWishFutureKnock.KnockedOff[side] & gBitTable[gBattlePartyID[gBankAttacker]])) - {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].held_item && gBattleMons[gBankTarget].ability_id == ABILITY_STICKY_HOLD) - { - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BS_NO_ITEMSTEAL; - gLastUsedAbility = gBattleMons[gBankTarget].ability_id; - RecordAbility(gBankTarget, gLastUsedAbility); - return; - } - if (gBattleMons[gBankAttacker].held_item) - {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].held_item == ITEM_ENIGMA_BERRY) - {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].held_item == 0) - {gBattlescriptCurrInstr++; return;} - - CHANGED_HELDITEMS[gBankAttacker] = gLastUsedItem = gBattleMons[gBankTarget].held_item; - gBattleMons[gBankTarget].held_item = 0; - - gActiveBank = gBankAttacker; - bb2_setattributes_in_battle(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); - mark_buffer_bank_for_execution(gBankAttacker); - - gActiveBank = gBankTarget; - bb2_setattributes_in_battle(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].held_item); - mark_buffer_bank_for_execution(gBankTarget); - - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_ITEMSTEAL; - - STORE_CHOICEMOVE(gBankTarget, 0); - } - break; - case 32: //escape prevention - gBattleMons[gBankTarget].status2 |= STATUS2_RECHARGE; - gDisableStructs[gBankTarget].BankPreventingEscape = gBankAttacker; - gBattlescriptCurrInstr++; - break; - case 33: //nightmare - gBattleMons[gBankTarget].status2 |= STATUS2_NIGHTMARE; - gBattlescriptCurrInstr++; - break; - case 34: - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D9224; - return; - case 35: //break free rapidspin - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_RAPIDSPINAWAY; - return; - case 36: //paralysis removal - if (gBattleMons[gBankTarget].status1 & STATUS_PARALYSIS) - { - gBattleMons[gBankTarget].status1 &= ~(STATUS_PARALYSIS); - gActiveBank = gBankTarget; - bb2_setattributes_in_battle(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status); - mark_buffer_bank_for_execution(gActiveBank); - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_PARALYSISHEALED; - } - else - {gBattlescriptCurrInstr++; return;} - break; - case 37: // - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D93FA; - return; - case 38: //recoil plus paralysis - gBattleMoveDamage = gHP_dealt / 3; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; - case 53: //thrash - if (!(gBattleMons[gEffectBank].status2 & STATUS2_LOCK_CONFUSE)) - { - gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gEffectBank] = gCurrentMove; - gBattleMons[gEffectBank].status2 |= (((Random() & 1) + 2) << 0xA); - } - else - {gBattlescriptCurrInstr++; return;} - break; - case 54: //knock off - if (gBattleMons[gEffectBank].ability_id == ABILITY_STICKY_HOLD) - { - if (gBattleMons[gEffectBank].held_item == 0) - {gBattlescriptCurrInstr++; return;} - gLastUsedAbility = ABILITY_STICKY_HOLD; - gBattlescriptCurrInstr = BS_STICKYHOLD_ACTIVATES; - RecordAbility(gEffectBank, ABILITY_STICKY_HOLD); - return; - } - if (gBattleMons[gEffectBank].held_item == 0) - {gBattlescriptCurrInstr++; return;} - else - { - u8 side = battle_side_get_owner(gEffectBank); - gLastUsedItem = gBattleMons[gEffectBank].held_item; - gBattleMons[gEffectBank].held_item = 0; - gWishFutureKnock.KnockedOff[side] |= gBitTable[gBattlePartyID[gEffectBank]]; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_KNOCKEDOFF; - - STORE_CHOICEMOVE(gEffectBank, 0); - } - break; - case 59: //overheat I guess, dont remember - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D94B0; - return; - } - } -} -#else -__attribute__((naked)) -void SetMoveEffect(bool8 primary, u8 certainArg) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - lsls r1, 24\n\ - lsrs r5, r1, 24\n\ - movs r0, 0\n\ - mov r10, r0\n\ - movs r6, 0\n\ - movs r1, 0x1\n\ - str r1, [sp, 0x4]\n\ - ldr r1, _0801E430 @ =gBattleCommunication\n\ - ldrb r3, [r1, 0x3]\n\ - movs r0, 0x40\n\ - ands r0, r3\n\ - adds r7, r1, 0\n\ - cmp r0, 0\n\ - beq _0801E444\n\ - ldr r2, _0801E434 @ =gEffectBank\n\ - ldr r0, _0801E438 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - strb r0, [r2]\n\ - movs r0, 0xBF\n\ - ands r0, r3\n\ - strb r0, [r7, 0x3]\n\ - movs r6, 0x40\n\ - ldr r0, _0801E43C @ =0x02000000\n\ - ldr r1, _0801E440 @ =gBankTarget\n\ - b _0801E450\n\ - .align 2, 0\n\ -_0801E430: .4byte gBattleCommunication\n\ -_0801E434: .4byte gEffectBank\n\ -_0801E438: .4byte gBankAttacker\n\ -_0801E43C: .4byte 0x02000000\n\ -_0801E440: .4byte gBankTarget\n\ -_0801E444:\n\ - ldr r2, _0801E538 @ =gEffectBank\n\ - ldr r0, _0801E53C @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - strb r0, [r2]\n\ - ldr r0, _0801E540 @ =0x02000000\n\ - ldr r1, _0801E544 @ =gBankAttacker\n\ -_0801E450:\n\ - ldrb r1, [r1]\n\ - ldr r3, _0801E548 @ =0x00016003\n\ - adds r0, r3\n\ - strb r1, [r0]\n\ - mov r8, r2\n\ - ldr r2, _0801E54C @ =gBattleMons\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r2\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x13\n\ - bne _0801E48A\n\ - ldr r0, _0801E550 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801E48A\n\ - cmp r4, 0\n\ - bne _0801E48A\n\ - ldrb r0, [r7, 0x3]\n\ - cmp r0, 0x9\n\ - bhi _0801E48A\n\ - bl _0801F5DC\n\ -_0801E48A:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - bl GetBankIdentity\n\ - ldr r2, _0801E554 @ =gSideAffecting\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - lsls r1, 1\n\ - adds r1, r2\n\ - ldrh r1, [r1]\n\ - movs r0, 0x20\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E4C4\n\ - ldr r0, _0801E550 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801E4C4\n\ - cmp r4, 0\n\ - bne _0801E4C4\n\ - ldr r0, _0801E558 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - cmp r0, 0x7\n\ - bhi _0801E4C4\n\ - bl _0801F5DC\n\ -_0801E4C4:\n\ - ldr r3, _0801E54C @ =gBattleMons\n\ - ldr r2, _0801E538 @ =gEffectBank\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r3\n\ - ldrh r0, [r0, 0x28]\n\ - mov r8, r2\n\ - mov r9, r3\n\ - cmp r0, 0\n\ - bne _0801E4EA\n\ - ldr r0, _0801E558 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - cmp r0, 0xB\n\ - beq _0801E4EA\n\ - cmp r0, 0x1F\n\ - beq _0801E4EA\n\ - bl _0801F5DC\n\ -_0801E4EA:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - mov r1, r9\n\ - adds r1, 0x50\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 17\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E50C\n\ - cmp r6, 0x40\n\ - beq _0801E50C\n\ - bl _0801F5DC\n\ -_0801E50C:\n\ - ldr r0, _0801E558 @ =gBattleCommunication\n\ - ldrb r1, [r0, 0x3]\n\ - adds r7, r0, 0\n\ - cmp r1, 0x6\n\ - bls _0801E518\n\ - b _0801EB4A\n\ -_0801E518:\n\ - ldr r1, _0801E55C @ =gStatusFlagsForMoveEffects\n\ - ldrb r0, [r7, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - cmp r0, 0x10\n\ - bne _0801E528\n\ - b _0801E714\n\ -_0801E528:\n\ - cmp r0, 0x10\n\ - bhi _0801E560\n\ - cmp r0, 0x7\n\ - beq _0801E57A\n\ - cmp r0, 0x8\n\ - bne _0801E536\n\ - b _0801E630\n\ -_0801E536:\n\ - b _0801EA14\n\ - .align 2, 0\n\ -_0801E538: .4byte gEffectBank\n\ -_0801E53C: .4byte gBankTarget\n\ -_0801E540: .4byte 0x02000000\n\ -_0801E544: .4byte gBankAttacker\n\ -_0801E548: .4byte 0x00016003\n\ -_0801E54C: .4byte gBattleMons\n\ -_0801E550: .4byte gHitMarker\n\ -_0801E554: .4byte gSideAffecting\n\ -_0801E558: .4byte gBattleCommunication\n\ -_0801E55C: .4byte gStatusFlagsForMoveEffects\n\ -_0801E560:\n\ - cmp r0, 0x40\n\ - bne _0801E566\n\ - b _0801E888\n\ -_0801E566:\n\ - cmp r0, 0x40\n\ - bhi _0801E572\n\ - cmp r0, 0x20\n\ - bne _0801E570\n\ - b _0801E7EA\n\ -_0801E570:\n\ - b _0801EA14\n\ -_0801E572:\n\ - cmp r0, 0x80\n\ - bne _0801E578\n\ - b _0801E8E4\n\ -_0801E578:\n\ - b _0801EA14\n\ -_0801E57A:\n\ - mov r3, r8\n\ - ldrb r1, [r3]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x2B\n\ - beq _0801E5DC\n\ - ldr r0, _0801E5D4 @ =gActiveBank\n\ - movs r1, 0\n\ - strb r1, [r0]\n\ - ldr r1, _0801E5D8 @ =gNoOfAllBanks\n\ - ldrb r3, [r1]\n\ - adds r7, r0, 0\n\ - mov r12, r1\n\ - cmp r3, 0\n\ - beq _0801E5E8\n\ - mov r4, r9\n\ - ldr r0, [r4, 0x50]\n\ - movs r1, 0x70\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801E5E8\n\ - adds r1, r7, 0\n\ - mov r6, r9\n\ - adds r6, 0x50\n\ - movs r5, 0x58\n\ - movs r4, 0x70\n\ -_0801E5B4:\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, r3\n\ - bcs _0801E5E8\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - beq _0801E5B4\n\ - b _0801E5E8\n\ - .align 2, 0\n\ -_0801E5D4: .4byte gActiveBank\n\ -_0801E5D8: .4byte gNoOfAllBanks\n\ -_0801E5DC:\n\ - ldr r0, _0801E628 @ =gActiveBank\n\ - ldr r2, _0801E62C @ =gNoOfAllBanks\n\ - ldrb r1, [r2]\n\ - strb r1, [r0]\n\ - adds r7, r0, 0\n\ - mov r12, r2\n\ -_0801E5E8:\n\ - mov r0, r8\n\ - ldrb r2, [r0]\n\ - movs r0, 0x58\n\ - adds r1, r2, 0\n\ - muls r1, r0\n\ - mov r0, r9\n\ - adds r0, 0x4C\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E600\n\ - b _0801EA14\n\ -_0801E600:\n\ - ldrb r0, [r7]\n\ - mov r3, r12\n\ - ldrb r3, [r3]\n\ - cmp r0, r3\n\ - beq _0801E60C\n\ - b _0801EA14\n\ -_0801E60C:\n\ - mov r4, r9\n\ - adds r0, r1, r4\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x48\n\ - bne _0801E61A\n\ - b _0801EA14\n\ -_0801E61A:\n\ - cmp r0, 0xF\n\ - bne _0801E620\n\ - b _0801EA14\n\ -_0801E620:\n\ - adds r0, r2, 0\n\ - bl CancelMultiTurnMoves\n\ - b _0801EA04\n\ - .align 2, 0\n\ -_0801E628: .4byte gActiveBank\n\ -_0801E62C: .4byte gNoOfAllBanks\n\ -_0801E630:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - cmp r1, 0x11\n\ - bne _0801E688\n\ - cmp r4, 0x1\n\ - beq _0801E64A\n\ - cmp r5, 0x80\n\ - bne _0801E688\n\ -_0801E64A:\n\ - ldr r0, _0801E678 @ =gLastUsedAbility\n\ - strb r1, [r0]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r1, 0x11\n\ - bl RecordAbilityBattle\n\ - ldr r4, _0801E67C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801E680 @ =BattleScript_PSNPrevention\n\ -_0801E664:\n\ - str r0, [r4]\n\ - ldr r2, _0801E684 @ =gHitMarker\n\ - ldr r1, [r2]\n\ - movs r0, 0x80\n\ - lsls r0, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E676\n\ - b _0801E928\n\ -_0801E676:\n\ - b _0801E94C\n\ - .align 2, 0\n\ -_0801E678: .4byte gLastUsedAbility\n\ -_0801E67C: .4byte gBattlescriptCurrInstr\n\ -_0801E680: .4byte BattleScript_PSNPrevention\n\ -_0801E684: .4byte gHitMarker\n\ -_0801E688:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - movs r1, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r1, r0, 0\n\ - adds r1, 0x21\n\ - ldrb r1, [r1]\n\ - cmp r1, 0x3\n\ - beq _0801E6AC\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3\n\ - beq _0801E6AC\n\ - cmp r1, 0x8\n\ - beq _0801E6AC\n\ - cmp r0, 0x8\n\ - bne _0801E6C6\n\ -_0801E6AC:\n\ - ldr r0, _0801E710 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E6C6\n\ - cmp r4, 0x1\n\ - bne _0801E6C0\n\ - b _0801E98C\n\ -_0801E6C0:\n\ - cmp r5, 0x80\n\ - bne _0801E6C6\n\ - b _0801E98C\n\ -_0801E6C6:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - mov r4, r9\n\ - adds r3, r1, r4\n\ - adds r0, r3, 0\n\ - adds r0, 0x21\n\ - ldrb r4, [r0]\n\ - cmp r4, 0x3\n\ - bne _0801E6DE\n\ - b _0801EA14\n\ -_0801E6DE:\n\ - adds r0, 0x1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3\n\ - bne _0801E6E8\n\ - b _0801EA14\n\ -_0801E6E8:\n\ - cmp r4, 0x8\n\ - bne _0801E6EE\n\ - b _0801EA14\n\ -_0801E6EE:\n\ - cmp r0, 0x8\n\ - bne _0801E6F4\n\ - b _0801EA14\n\ -_0801E6F4:\n\ - mov r0, r9\n\ - adds r0, 0x4C\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E702\n\ - b _0801EA14\n\ -_0801E702:\n\ - adds r0, r3, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x11\n\ - bne _0801E70E\n\ - b _0801EA14\n\ -_0801E70E:\n\ - b _0801EA04\n\ - .align 2, 0\n\ -_0801E710: .4byte gHitMarker\n\ -_0801E714:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - cmp r1, 0x29\n\ - bne _0801E758\n\ - cmp r4, 0x1\n\ - beq _0801E72E\n\ - cmp r5, 0x80\n\ - bne _0801E758\n\ -_0801E72E:\n\ - ldr r0, _0801E74C @ =gLastUsedAbility\n\ - strb r1, [r0]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r1, 0x29\n\ - bl RecordAbilityBattle\n\ - ldr r4, _0801E750 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801E754 @ =BattleScript_BRNPrevention\n\ - b _0801E664\n\ - .align 2, 0\n\ -_0801E74C: .4byte gLastUsedAbility\n\ -_0801E750: .4byte gBattlescriptCurrInstr\n\ -_0801E754: .4byte BattleScript_BRNPrevention\n\ -_0801E758:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - mov r2, r9\n\ - adds r1, r0, r2\n\ - adds r0, r1, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xA\n\ - beq _0801E778\n\ - adds r0, r1, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xA\n\ - bne _0801E7A8\n\ -_0801E778:\n\ - ldr r0, _0801E79C @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E7A8\n\ - cmp r4, 0x1\n\ - beq _0801E78E\n\ - cmp r5, 0x80\n\ - bne _0801E7A8\n\ -_0801E78E:\n\ - ldr r4, _0801E7A0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801E7A4 @ =BattleScript_BRNPrevention\n\ - b _0801E998\n\ - .align 2, 0\n\ -_0801E79C: .4byte gHitMarker\n\ -_0801E7A0: .4byte gBattlescriptCurrInstr\n\ -_0801E7A4: .4byte BattleScript_BRNPrevention\n\ -_0801E7A8:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r1, 0x58\n\ - adds r2, r0, 0\n\ - muls r2, r1\n\ - mov r4, r9\n\ - adds r1, r2, r4\n\ - adds r0, r1, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xA\n\ - bne _0801E7C2\n\ - b _0801EA14\n\ -_0801E7C2:\n\ - adds r0, r1, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xA\n\ - bne _0801E7CE\n\ - b _0801EA14\n\ -_0801E7CE:\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x29\n\ - bne _0801E7DA\n\ - b _0801EA14\n\ -_0801E7DA:\n\ - mov r0, r9\n\ - adds r0, 0x4C\n\ - adds r0, r2, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E7E8\n\ - b _0801EA14\n\ -_0801E7E8:\n\ - b _0801EA04\n\ -_0801E7EA:\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0x13\n\ - movs r1, 0\n\ - movs r2, 0xD\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - bne _0801E826\n\ - str r0, [sp]\n\ - movs r0, 0x13\n\ - movs r1, 0\n\ - movs r2, 0x4D\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0801E826\n\ - ldr r0, _0801E87C @ =gBattleWeather\n\ - ldrh r1, [r0]\n\ - movs r0, 0x60\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E826\n\ - movs r1, 0\n\ - str r1, [sp, 0x4]\n\ -_0801E826:\n\ - ldr r4, _0801E880 @ =gBattleMons\n\ - ldr r0, _0801E884 @ =gEffectBank\n\ - ldrb r3, [r0]\n\ - movs r0, 0x58\n\ - adds r2, r3, 0\n\ - muls r2, r0\n\ - adds r1, r2, r4\n\ - adds r0, r1, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xF\n\ - bne _0801E840\n\ - b _0801EA14\n\ -_0801E840:\n\ - adds r0, r1, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xF\n\ - bne _0801E84C\n\ - b _0801EA14\n\ -_0801E84C:\n\ - adds r0, r4, 0\n\ - adds r0, 0x4C\n\ - adds r0, r2, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E85A\n\ - b _0801EA14\n\ -_0801E85A:\n\ - ldr r2, [sp, 0x4]\n\ - cmp r2, 0\n\ - bne _0801E862\n\ - b _0801EA14\n\ -_0801E862:\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x28\n\ - bne _0801E86E\n\ - b _0801EA14\n\ -_0801E86E:\n\ - adds r0, r3, 0\n\ - bl CancelMultiTurnMoves\n\ - movs r3, 0x1\n\ - mov r10, r3\n\ - b _0801EA14\n\ - .align 2, 0\n\ -_0801E87C: .4byte gBattleWeather\n\ -_0801E880: .4byte gBattleMons\n\ -_0801E884: .4byte gEffectBank\n\ -_0801E888:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - mov r2, r9\n\ - adds r0, r1, r2\n\ - adds r0, 0x20\n\ - ldrb r2, [r0]\n\ - cmp r2, 0x7\n\ - bne _0801E8D0\n\ - cmp r4, 0x1\n\ - beq _0801E8A6\n\ - cmp r5, 0x80\n\ - beq _0801E8A6\n\ - b _0801EA14\n\ -_0801E8A6:\n\ - ldr r0, _0801E8C4 @ =gLastUsedAbility\n\ - strb r2, [r0]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r1, 0x7\n\ - bl RecordAbilityBattle\n\ - ldr r4, _0801E8C8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801E8CC @ =BattleScript_PRLZPrevention\n\ - b _0801E664\n\ - .align 2, 0\n\ -_0801E8C4: .4byte gLastUsedAbility\n\ -_0801E8C8: .4byte gBattlescriptCurrInstr\n\ -_0801E8CC: .4byte BattleScript_PRLZPrevention\n\ -_0801E8D0:\n\ - mov r0, r9\n\ - adds r0, 0x4C\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801E8DE\n\ - b _0801EA14\n\ -_0801E8DE:\n\ - movs r4, 0x1\n\ - mov r10, r4\n\ - b _0801EA14\n\ -_0801E8E4:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - cmp r1, 0x11\n\ - bne _0801E952\n\ - cmp r4, 0x1\n\ - beq _0801E8FE\n\ - cmp r5, 0x80\n\ - bne _0801E952\n\ -_0801E8FE:\n\ - ldr r0, _0801E938 @ =gLastUsedAbility\n\ - strb r1, [r0]\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - movs r1, 0x11\n\ - bl RecordAbilityBattle\n\ - ldr r4, _0801E93C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801E940 @ =BattleScript_PSNPrevention\n\ - str r0, [r4]\n\ - ldr r2, _0801E944 @ =gHitMarker\n\ - ldr r1, [r2]\n\ - movs r0, 0x80\n\ - lsls r0, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E94C\n\ -_0801E928:\n\ - movs r0, 0x1\n\ - strb r0, [r7, 0x5]\n\ - ldr r0, _0801E948 @ =0xffffdfff\n\ - ands r1, r0\n\ - str r1, [r2]\n\ - bl _0801F5FA\n\ - .align 2, 0\n\ -_0801E938: .4byte gLastUsedAbility\n\ -_0801E93C: .4byte gBattlescriptCurrInstr\n\ -_0801E940: .4byte BattleScript_PSNPrevention\n\ -_0801E944: .4byte gHitMarker\n\ -_0801E948: .4byte 0xffffdfff\n\ -_0801E94C:\n\ - strb r0, [r7, 0x5]\n\ - bl _0801F5FA\n\ -_0801E952:\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - movs r1, 0x58\n\ - muls r0, r1\n\ - add r0, r9\n\ - adds r1, r0, 0\n\ - adds r1, 0x21\n\ - ldrb r1, [r1]\n\ - cmp r1, 0x3\n\ - beq _0801E976\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3\n\ - beq _0801E976\n\ - cmp r1, 0x8\n\ - beq _0801E976\n\ - cmp r0, 0x8\n\ - bne _0801E9B4\n\ -_0801E976:\n\ - ldr r0, _0801E9A4 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801E9B4\n\ - cmp r4, 0x1\n\ - beq _0801E98C\n\ - cmp r5, 0x80\n\ - bne _0801E9B4\n\ -_0801E98C:\n\ - ldr r4, _0801E9A8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801E9AC @ =BattleScript_PSNPrevention\n\ -_0801E998:\n\ - str r0, [r4]\n\ - ldr r1, _0801E9B0 @ =gBattleCommunication\n\ - movs r0, 0x2\n\ - strb r0, [r1, 0x5]\n\ - bl _0801F5FA\n\ - .align 2, 0\n\ -_0801E9A4: .4byte gHitMarker\n\ -_0801E9A8: .4byte gBattlescriptCurrInstr\n\ -_0801E9AC: .4byte BattleScript_PSNPrevention\n\ -_0801E9B0: .4byte gBattleCommunication\n\ -_0801E9B4:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r6, 0x58\n\ - muls r0, r6\n\ - mov r2, r9\n\ - adds r2, 0x4C\n\ - adds r5, r0, r2\n\ - ldr r4, [r5]\n\ - cmp r4, 0\n\ - bne _0801EA14\n\ - mov r3, r9\n\ - adds r1, r0, r3\n\ - adds r0, r1, 0\n\ - adds r0, 0x21\n\ - ldrb r3, [r0]\n\ - cmp r3, 0x3\n\ - beq _0801EA0A\n\ - adds r0, 0x1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3\n\ - beq _0801EA0A\n\ - cmp r3, 0x8\n\ - beq _0801EA0A\n\ - cmp r0, 0x8\n\ - beq _0801EA0A\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x11\n\ - beq _0801EA14\n\ - mov r4, r8\n\ - ldrb r0, [r4]\n\ - adds r1, r0, 0\n\ - muls r1, r6\n\ - adds r1, r2\n\ - ldr r0, [r1]\n\ - movs r2, 0x9\n\ - negs r2, r2\n\ - ands r0, r2\n\ - str r0, [r1]\n\ -_0801EA04:\n\ - movs r0, 0x1\n\ - mov r10, r0\n\ - b _0801EA14\n\ -_0801EA0A:\n\ - ldr r0, _0801EA58 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r2, 0x8\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_0801EA14:\n\ - mov r1, r10\n\ - cmp r1, 0x1\n\ - beq _0801EA1C\n\ - b _0801EB3C\n\ -_0801EA1C:\n\ - ldr r0, _0801EA5C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r1, _0801EA60 @ =gStatusFlagsForMoveEffects\n\ - ldr r0, _0801EA64 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r3, [r0]\n\ - cmp r3, 0x7\n\ - bne _0801EA70\n\ - bl Random\n\ - ldr r2, _0801EA68 @ =gBattleMons\n\ - ldr r1, _0801EA6C @ =gEffectBank\n\ - ldrb r3, [r1]\n\ - movs r1, 0x58\n\ - muls r3, r1\n\ - adds r2, 0x4C\n\ - adds r3, r2\n\ - movs r1, 0x3\n\ - ands r1, r0\n\ - adds r1, 0x2\n\ - ldr r0, [r3]\n\ - orrs r0, r1\n\ - str r0, [r3]\n\ - b _0801EA84\n\ - .align 2, 0\n\ -_0801EA58: .4byte gBattleMoveFlags\n\ -_0801EA5C: .4byte gBattlescriptCurrInstr\n\ -_0801EA60: .4byte gStatusFlagsForMoveEffects\n\ -_0801EA64: .4byte gBattleCommunication\n\ -_0801EA68: .4byte gBattleMons\n\ -_0801EA6C: .4byte gEffectBank\n\ -_0801EA70:\n\ - ldr r2, _0801EAD4 @ =gBattleMons\n\ - ldr r0, _0801EAD8 @ =gEffectBank\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - adds r2, 0x4C\n\ - adds r1, r2\n\ - ldr r0, [r1]\n\ - orrs r0, r3\n\ - str r0, [r1]\n\ -_0801EA84:\n\ - ldr r2, _0801EADC @ =gBattlescriptCurrInstr\n\ - ldr r1, _0801EAE0 @ =gMoveEffectBS_Ptrs\n\ - ldr r5, _0801EAE4 @ =gBattleCommunication\n\ - ldrb r0, [r5, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - str r0, [r2]\n\ - ldr r4, _0801EAE8 @ =gActiveBank\n\ - ldr r1, _0801EAD8 @ =gEffectBank\n\ - ldrb r0, [r1]\n\ - strb r0, [r4]\n\ - ldrb r1, [r1]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - ldr r1, _0801EAEC @ =gUnknown_02024ACC\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x28\n\ - movs r2, 0\n\ - movs r3, 0x4\n\ - bl EmitSetAttributes\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r2, _0801EAF0 @ =gHitMarker\n\ - ldr r1, [r2]\n\ - movs r0, 0x80\n\ - lsls r0, 6\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801EAF8\n\ - movs r0, 0x1\n\ - strb r0, [r5, 0x5]\n\ - ldr r0, _0801EAF4 @ =0xffffdfff\n\ - ands r1, r0\n\ - str r1, [r2]\n\ - b _0801EAFA\n\ - .align 2, 0\n\ -_0801EAD4: .4byte gBattleMons\n\ -_0801EAD8: .4byte gEffectBank\n\ -_0801EADC: .4byte gBattlescriptCurrInstr\n\ -_0801EAE0: .4byte gMoveEffectBS_Ptrs\n\ -_0801EAE4: .4byte gBattleCommunication\n\ -_0801EAE8: .4byte gActiveBank\n\ -_0801EAEC: .4byte gUnknown_02024ACC\n\ -_0801EAF0: .4byte gHitMarker\n\ -_0801EAF4: .4byte 0xffffdfff\n\ -_0801EAF8:\n\ - strb r0, [r5, 0x5]\n\ -_0801EAFA:\n\ - ldr r0, _0801EB2C @ =gBattleCommunication\n\ - ldrb r2, [r0, 0x3]\n\ - adds r7, r0, 0\n\ - cmp r2, 0x2\n\ - beq _0801EB14\n\ - cmp r2, 0x6\n\ - beq _0801EB14\n\ - cmp r2, 0x5\n\ - beq _0801EB14\n\ - cmp r2, 0x3\n\ - beq _0801EB14\n\ - bl _0801F5FA\n\ -_0801EB14:\n\ - ldr r0, _0801EB30 @ =0x02000000\n\ - ldrb r1, [r7, 0x3]\n\ - ldr r2, _0801EB34 @ =0x000160ca\n\ - adds r0, r2\n\ - strb r1, [r0]\n\ - ldr r2, _0801EB38 @ =gHitMarker\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 7\n\ - bl _0801F4F2\n\ - .align 2, 0\n\ -_0801EB2C: .4byte gBattleCommunication\n\ -_0801EB30: .4byte 0x02000000\n\ -_0801EB34: .4byte 0x000160ca\n\ -_0801EB38: .4byte gHitMarker\n\ -_0801EB3C:\n\ - mov r3, r10\n\ - cmp r3, 0\n\ - beq _0801EB46\n\ - bl _0801F5FA\n\ -_0801EB46:\n\ - bl _0801F5DC\n\ -_0801EB4A:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r1, r0\n\ - ldr r2, _0801EB84 @ =gStatusFlagsForMoveEffects\n\ - ldrb r3, [r7, 0x3]\n\ - lsls r0, r3, 2\n\ - adds r0, r2\n\ - ldr r1, [r1]\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _0801EB6E\n\ - bl _0801F5DC\n\ -_0801EB6E:\n\ - subs r0, r3, 0x7\n\ - cmp r0, 0x34\n\ - bls _0801EB78\n\ - bl _0801F5FA\n\ -_0801EB78:\n\ - lsls r0, 2\n\ - ldr r1, _0801EB88 @ =_0801EB8C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0801EB84: .4byte gStatusFlagsForMoveEffects\n\ -_0801EB88: .4byte _0801EB8C\n\ - .align 2, 0\n\ -_0801EB8C:\n\ - .4byte _0801EC60\n\ - .4byte _0801ECD4\n\ - .4byte _0801EE4C\n\ - .4byte _0801ED60\n\ - .4byte _0801EDDC\n\ - .4byte _0801EE84\n\ - .4byte _0801EECC\n\ - .4byte _0801EFA8\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801EFEC\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F040\n\ - .4byte _0801F13C\n\ - .4byte _0801F184\n\ - .4byte _0801F1A4\n\ - .4byte _0801F364\n\ - .4byte _0801F3A0\n\ - .4byte _0801F3BC\n\ - .4byte _0801F3D4\n\ - .4byte _0801F3EC\n\ - .4byte _0801F44C\n\ - .4byte _0801F464\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F094\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F0E8\n\ - .4byte _0801F4A8\n\ - .4byte _0801F500\n\ - .4byte _0801F5FA\n\ - .4byte _0801F5FA\n\ - .4byte _0801F5FA\n\ - .4byte _0801F5FA\n\ - .4byte _0801F5EC\n\ -_0801EC60:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - movs r5, 0x58\n\ - adds r1, r0, 0\n\ - muls r1, r5\n\ - mov r2, r9\n\ - adds r0, r1, r2\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x14\n\ - bne _0801EC7A\n\ - bl _0801F5DC\n\ -_0801EC7A:\n\ - mov r4, r9\n\ - adds r4, 0x50\n\ - adds r0, r1, r4\n\ - ldr r0, [r0]\n\ - movs r1, 0x7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801EC8E\n\ - bl _0801F5DC\n\ -_0801EC8E:\n\ - bl Random\n\ - mov r3, r8\n\ - ldrb r1, [r3]\n\ - adds r2, r1, 0\n\ - muls r2, r5\n\ - adds r2, r4\n\ - lsls r0, 16\n\ - movs r1, 0xC0\n\ - lsls r1, 10\n\ - ands r1, r0\n\ - lsrs r1, 16\n\ - adds r1, 0x2\n\ - ldr r0, [r2]\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r4, _0801ECC8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r1, _0801ECCC @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801ECD0 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - bl _0801F5F8\n\ - .align 2, 0\n\ -_0801ECC8: .4byte gBattlescriptCurrInstr\n\ -_0801ECCC: .4byte gMoveEffectBS_Ptrs\n\ -_0801ECD0: .4byte gBattleCommunication\n\ -_0801ECD4:\n\ - mov r0, r8\n\ - ldrb r2, [r0]\n\ - movs r6, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r6\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - cmp r1, 0x27\n\ - bne _0801ED18\n\ - cmp r4, 0x1\n\ - beq _0801ECF4\n\ - cmp r5, 0x80\n\ - beq _0801ECF4\n\ - bl _0801F5DC\n\ -_0801ECF4:\n\ - ldr r0, _0801ED0C @ =gLastUsedAbility\n\ - strb r1, [r0]\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - movs r1, 0x27\n\ - bl RecordAbilityBattle\n\ - ldr r1, _0801ED10 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0801ED14 @ =BattleScript_FlinchPrevention\n\ - str r0, [r1]\n\ - bl _0801F5FA\n\ - .align 2, 0\n\ -_0801ED0C: .4byte gLastUsedAbility\n\ -_0801ED10: .4byte gBattlescriptCurrInstr\n\ -_0801ED14: .4byte BattleScript_FlinchPrevention\n\ -_0801ED18:\n\ - adds r0, r2, 0\n\ - bl BankGetTurnOrder\n\ - ldr r1, _0801ED54 @ =gCurrentMoveTurn\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bhi _0801ED2E\n\ - bl _0801F5DC\n\ -_0801ED2E:\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - adds r2, r0, 0\n\ - muls r2, r6\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r1, _0801ED58 @ =gStatusFlagsForMoveEffects\n\ - ldr r0, _0801ED5C @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r1, [r2]\n\ - ldr r0, [r0]\n\ - orrs r1, r0\n\ - str r1, [r2]\n\ - bl _0801F5DC\n\ - .align 2, 0\n\ -_0801ED54: .4byte gCurrentMoveTurn\n\ -_0801ED58: .4byte gStatusFlagsForMoveEffects\n\ -_0801ED5C: .4byte gBattleCommunication\n\ -_0801ED60:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r5, 0x58\n\ - muls r0, r5\n\ - mov r4, r9\n\ - adds r4, 0x50\n\ - adds r2, r0, r4\n\ - ldr r1, [r2]\n\ - movs r0, 0x70\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801ED7C\n\ - bl _0801F5DC\n\ -_0801ED7C:\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - orrs r1, r0\n\ - str r1, [r2]\n\ - ldr r1, _0801EDC8 @ =gLockedMove\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldr r1, _0801EDCC @ =gCurrentMove\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ - bl Random\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - adds r2, r1, 0\n\ - muls r2, r5\n\ - adds r2, r4\n\ - movs r1, 0x3\n\ - ands r1, r0\n\ - adds r1, 0x2\n\ - lsls r1, 4\n\ - ldr r0, [r2]\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r4, _0801EDD0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r1, _0801EDD4 @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801EDD8 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - bl _0801F5F8\n\ - .align 2, 0\n\ -_0801EDC8: .4byte gLockedMove\n\ -_0801EDCC: .4byte gCurrentMove\n\ -_0801EDD0: .4byte gBattlescriptCurrInstr\n\ -_0801EDD4: .4byte gMoveEffectBS_Ptrs\n\ -_0801EDD8: .4byte gBattleCommunication\n\ -_0801EDDC:\n\ - ldr r5, _0801EE30 @ =gBankAttacker\n\ - ldrb r0, [r5]\n\ - bl GetBankIdentity\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _0801EE14\n\ - ldr r4, _0801EE34 @ =gPaydayMoney\n\ - ldrh r3, [r4]\n\ - ldr r2, _0801EE38 @ =gBattleMons\n\ - ldrb r1, [r5]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r2\n\ - adds r0, 0x2A\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - adds r0, r3, r0\n\ - strh r0, [r4]\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r3, r0\n\ - bls _0801EE14\n\ - ldr r3, _0801EE3C @ =0x0000ffff\n\ - adds r0, r3, 0\n\ - strh r0, [r4]\n\ -_0801EE14:\n\ - ldr r4, _0801EE40 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r1, _0801EE44 @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801EE48 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - bl _0801F5F8\n\ - .align 2, 0\n\ -_0801EE30: .4byte gBankAttacker\n\ -_0801EE34: .4byte gPaydayMoney\n\ -_0801EE38: .4byte gBattleMons\n\ -_0801EE3C: .4byte 0x0000ffff\n\ -_0801EE40: .4byte gBattlescriptCurrInstr\n\ -_0801EE44: .4byte gMoveEffectBS_Ptrs\n\ -_0801EE48: .4byte gBattleCommunication\n\ -_0801EE4C:\n\ - mov r4, r8\n\ - ldrb r1, [r4]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - mov r1, r9\n\ - adds r1, 0x4C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0801EE62\n\ - b _0801F5DC\n\ -_0801EE62:\n\ - bl Random\n\ - ldr r4, _0801EE80 @ =gBattleCommunication\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - adds r0, 0x3\n\ - strb r0, [r4, 0x3]\n\ - movs r0, 0\n\ - movs r1, 0\n\ - bl SetMoveEffect\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801EE80: .4byte gBattleCommunication\n\ -_0801EE84:\n\ - mov r0, r8\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 5\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r1, _0801EEC0 @ =gLockedMove\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldr r1, _0801EEC4 @ =gCurrentMove\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ - ldr r0, _0801EEC8 @ =gProtectStructs\n\ - ldrb r1, [r2]\n\ - lsls r1, 4\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - movs r2, 0x4\n\ - orrs r0, r2\n\ - strb r0, [r1, 0x1]\n\ - b _0801F5DC\n\ - .align 2, 0\n\ -_0801EEC0: .4byte gLockedMove\n\ -_0801EEC4: .4byte gCurrentMove\n\ -_0801EEC8: .4byte gProtectStructs\n\ -_0801EECC:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r6, 0x58\n\ - muls r0, r6\n\ - mov r4, r9\n\ - adds r4, 0x50\n\ - adds r0, r4\n\ - ldr r5, [r0]\n\ - movs r0, 0xE0\n\ - lsls r0, 8\n\ - ands r5, r0\n\ - cmp r5, 0\n\ - beq _0801EEE8\n\ - b _0801F5DC\n\ -_0801EEE8:\n\ - bl Random\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - adds r2, r1, 0\n\ - muls r2, r6\n\ - adds r2, r4\n\ - movs r1, 0x3\n\ - ands r1, r0\n\ - adds r1, 0x3\n\ - lsls r1, 13\n\ - ldr r0, [r2]\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r2, _0801EF80 @ =0x02000000\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - ldr r4, _0801EF84 @ =0x00016004\n\ - adds r0, r4\n\ - adds r0, r2\n\ - ldr r6, _0801EF88 @ =gCurrentMove\n\ - ldrh r1, [r6]\n\ - strb r1, [r0]\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - ldr r1, _0801EF8C @ =0x00016005\n\ - adds r0, r1\n\ - adds r0, r2\n\ - ldrh r1, [r6]\n\ - lsrs r1, 8\n\ - strb r1, [r0]\n\ - ldrb r0, [r3]\n\ - ldr r3, _0801EF90 @ =0x00016020\n\ - adds r0, r3\n\ - adds r0, r2\n\ - ldr r1, _0801EF94 @ =gBankAttacker\n\ - ldrb r1, [r1]\n\ - strb r1, [r0]\n\ - ldr r4, _0801EF98 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r1, _0801EF9C @ =gMoveEffectBS_Ptrs\n\ - ldr r2, _0801EFA0 @ =gBattleCommunication\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - str r0, [r4]\n\ - strb r5, [r2, 0x5]\n\ - ldr r1, _0801EFA4 @ =gTrappingMoves\n\ - ldrh r0, [r1]\n\ - ldrh r4, [r6]\n\ - cmp r0, r4\n\ - bne _0801EF5C\n\ - b _0801F5FA\n\ -_0801EF5C:\n\ - adds r3, r1, 0\n\ - adds r1, r6, 0\n\ -_0801EF60:\n\ - ldrb r0, [r2, 0x5]\n\ - adds r0, 0x1\n\ - strb r0, [r2, 0x5]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x4\n\ - bls _0801EF70\n\ - b _0801F5FA\n\ -_0801EF70:\n\ - ldrb r0, [r2, 0x5]\n\ - lsls r0, 1\n\ - adds r0, r3\n\ - ldrh r0, [r0]\n\ - ldrh r4, [r1]\n\ - cmp r0, r4\n\ - bne _0801EF60\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801EF80: .4byte 0x02000000\n\ -_0801EF84: .4byte 0x00016004\n\ -_0801EF88: .4byte gCurrentMove\n\ -_0801EF8C: .4byte 0x00016005\n\ -_0801EF90: .4byte 0x00016020\n\ -_0801EF94: .4byte gBankAttacker\n\ -_0801EF98: .4byte gBattlescriptCurrInstr\n\ -_0801EF9C: .4byte gMoveEffectBS_Ptrs\n\ -_0801EFA0: .4byte gBattleCommunication\n\ -_0801EFA4: .4byte gTrappingMoves\n\ -_0801EFA8:\n\ - ldr r1, _0801EFD8 @ =gBattleMoveDamage\n\ - ldr r0, _0801EFDC @ =gHP_dealt\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bge _0801EFB4\n\ - adds r0, 0x3\n\ -_0801EFB4:\n\ - asrs r0, 2\n\ - str r0, [r1]\n\ - cmp r0, 0\n\ - bne _0801EFC0\n\ - movs r0, 0x1\n\ - str r0, [r1]\n\ -_0801EFC0:\n\ - ldr r4, _0801EFE0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r1, _0801EFE4 @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801EFE8 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801EFD8: .4byte gBattleMoveDamage\n\ -_0801EFDC: .4byte gHP_dealt\n\ -_0801EFE0: .4byte gBattlescriptCurrInstr\n\ -_0801EFE4: .4byte gMoveEffectBS_Ptrs\n\ -_0801EFE8: .4byte gBattleCommunication\n\ -_0801EFEC:\n\ - ldrb r1, [r7, 0x3]\n\ - adds r1, 0xF2\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - movs r0, 0x10\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl ChangeStatBuffs\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0\n\ - beq _0801F008\n\ - b _0801F5DC\n\ -_0801F008:\n\ - ldr r2, _0801F02C @ =0x02000000\n\ - ldrb r1, [r7, 0x3]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - ldr r4, _0801F030 @ =0x000160a4\n\ - adds r1, r2, r4\n\ - strb r0, [r1]\n\ - ldr r0, _0801F034 @ =0x000160a5\n\ - adds r2, r0\n\ - strb r3, [r2]\n\ - ldr r4, _0801F038 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801F03C @ =BattleScript_StatUp\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F02C: .4byte 0x02000000\n\ -_0801F030: .4byte 0x000160a4\n\ -_0801F034: .4byte 0x000160a5\n\ -_0801F038: .4byte gBattlescriptCurrInstr\n\ -_0801F03C: .4byte BattleScript_StatUp\n\ -_0801F040:\n\ - movs r0, 0x70\n\ - negs r0, r0\n\ - ldrb r1, [r7, 0x3]\n\ - adds r1, 0xEB\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl ChangeStatBuffs\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0\n\ - beq _0801F05E\n\ - b _0801F5DC\n\ -_0801F05E:\n\ - ldr r2, _0801F080 @ =0x02000000\n\ - ldrb r1, [r7, 0x3]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - ldr r4, _0801F084 @ =0x000160a4\n\ - adds r1, r2, r4\n\ - strb r0, [r1]\n\ - ldr r0, _0801F088 @ =0x000160a5\n\ - adds r2, r0\n\ - strb r3, [r2]\n\ - ldr r4, _0801F08C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801F090 @ =BattleScript_StatDown\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F080: .4byte 0x02000000\n\ -_0801F084: .4byte 0x000160a4\n\ -_0801F088: .4byte 0x000160a5\n\ -_0801F08C: .4byte gBattlescriptCurrInstr\n\ -_0801F090: .4byte BattleScript_StatDown\n\ -_0801F094:\n\ - ldrb r1, [r7, 0x3]\n\ - adds r1, 0xDA\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - movs r0, 0x20\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl ChangeStatBuffs\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0\n\ - beq _0801F0B0\n\ - b _0801F5DC\n\ -_0801F0B0:\n\ - ldr r2, _0801F0D4 @ =0x02000000\n\ - ldrb r1, [r7, 0x3]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - ldr r4, _0801F0D8 @ =0x000160a4\n\ - adds r1, r2, r4\n\ - strb r0, [r1]\n\ - ldr r0, _0801F0DC @ =0x000160a5\n\ - adds r2, r0\n\ - strb r3, [r2]\n\ - ldr r4, _0801F0E0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801F0E4 @ =BattleScript_StatUp\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F0D4: .4byte 0x02000000\n\ -_0801F0D8: .4byte 0x000160a4\n\ -_0801F0DC: .4byte 0x000160a5\n\ -_0801F0E0: .4byte gBattlescriptCurrInstr\n\ -_0801F0E4: .4byte BattleScript_StatUp\n\ -_0801F0E8:\n\ - movs r0, 0x60\n\ - negs r0, r0\n\ - ldrb r1, [r7, 0x3]\n\ - adds r1, 0xD3\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl ChangeStatBuffs\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0\n\ - beq _0801F106\n\ - b _0801F5DC\n\ -_0801F106:\n\ - ldr r2, _0801F128 @ =0x02000000\n\ - ldrb r1, [r7, 0x3]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - ldr r4, _0801F12C @ =0x000160a4\n\ - adds r1, r2, r4\n\ - strb r0, [r1]\n\ - ldr r0, _0801F130 @ =0x000160a5\n\ - adds r2, r0\n\ - strb r3, [r2]\n\ - ldr r4, _0801F134 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801F138 @ =BattleScript_StatDown\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F128: .4byte 0x02000000\n\ -_0801F12C: .4byte 0x000160a4\n\ -_0801F130: .4byte 0x000160a5\n\ -_0801F134: .4byte gBattlescriptCurrInstr\n\ -_0801F138: .4byte BattleScript_StatDown\n\ -_0801F13C:\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 15\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r2, _0801F178 @ =gDisableStructs\n\ - mov r3, r8\n\ - ldrb r1, [r3]\n\ - lsls r0, r1, 3\n\ - subs r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - movs r1, 0x2\n\ - strb r1, [r0, 0x19]\n\ - ldr r1, _0801F17C @ =gLockedMove\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldr r1, _0801F180 @ =gCurrentMove\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ - b _0801F5DC\n\ - .align 2, 0\n\ -_0801F178: .4byte gDisableStructs\n\ -_0801F17C: .4byte gLockedMove\n\ -_0801F180: .4byte gCurrentMove\n\ -_0801F184:\n\ - ldr r0, _0801F1A0 @ =gBankAttacker\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 16\n\ -_0801F19A:\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - b _0801F5DC\n\ - .align 2, 0\n\ -_0801F1A0: .4byte gBankAttacker\n\ -_0801F1A4:\n\ - ldr r4, _0801F254 @ =gBankAttacker\n\ - ldrb r0, [r4]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldrb r0, [r4]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _0801F1D8\n\ - ldr r0, _0801F258 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0801F25C @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801F214\n\ - ldr r0, _0801F260 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0801F1D8\n\ - b _0801F5DC\n\ -_0801F1D8:\n\ - ldr r0, _0801F258 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0801F25C @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801F214\n\ - ldr r0, _0801F260 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0801F214\n\ - ldr r0, _0801F264 @ =gWishFutureKnock\n\ - adds r0, 0x29\n\ - adds r0, r6, r0\n\ - ldrb r1, [r0]\n\ - ldr r3, _0801F268 @ =gBitTable\n\ - ldr r2, _0801F26C @ =gBattlePartyID\n\ - ldr r0, _0801F254 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _0801F214\n\ - b _0801F5DC\n\ -_0801F214:\n\ - ldr r2, _0801F270 @ =gBattleMons\n\ - ldr r1, _0801F274 @ =gBankTarget\n\ - ldrb r0, [r1]\n\ - movs r3, 0x58\n\ - muls r0, r3\n\ - adds r4, r0, r2\n\ - ldrh r0, [r4, 0x2E]\n\ - adds r7, r1, 0\n\ - mov r9, r2\n\ - cmp r0, 0\n\ - beq _0801F284\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3C\n\ - bne _0801F284\n\ - ldr r1, _0801F278 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0801F27C @ =BattleScript_NoItemSteal\n\ - str r0, [r1]\n\ - ldr r1, _0801F280 @ =gLastUsedAbility\n\ - ldrb r0, [r7]\n\ - muls r0, r3\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r0, [r7]\n\ - ldrb r1, [r1]\n\ - bl RecordAbilityBattle\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F254: .4byte gBankAttacker\n\ -_0801F258: .4byte gBattleTypeFlags\n\ -_0801F25C: .4byte 0x00000902\n\ -_0801F260: .4byte gTrainerBattleOpponent\n\ -_0801F264: .4byte gWishFutureKnock\n\ -_0801F268: .4byte gBitTable\n\ -_0801F26C: .4byte gBattlePartyID\n\ -_0801F270: .4byte gBattleMons\n\ -_0801F274: .4byte gBankTarget\n\ -_0801F278: .4byte gBattlescriptCurrInstr\n\ -_0801F27C: .4byte BattleScript_NoItemSteal\n\ -_0801F280: .4byte gLastUsedAbility\n\ -_0801F284:\n\ - ldr r4, _0801F340 @ =gBankAttacker\n\ - mov r10, r4\n\ - ldrb r1, [r4]\n\ - movs r0, 0x58\n\ - mov r8, r0\n\ - mov r0, r8\n\ - muls r0, r1\n\ - add r0, r9\n\ - ldrh r3, [r0, 0x2E]\n\ - cmp r3, 0\n\ - beq _0801F29C\n\ - b _0801F5DC\n\ -_0801F29C:\n\ - ldrb r0, [r7]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - add r0, r9\n\ - ldrh r2, [r0, 0x2E]\n\ - adds r0, r2, 0\n\ - cmp r0, 0xAF\n\ - bne _0801F2B0\n\ - b _0801F5DC\n\ -_0801F2B0:\n\ - cmp r0, 0\n\ - bne _0801F2B6\n\ - b _0801F5DC\n\ -_0801F2B6:\n\ - lsls r0, r1, 1\n\ - ldr r5, _0801F344 @ =0x020160f0\n\ - adds r0, r5\n\ - ldr r1, _0801F348 @ =gLastUsedItem\n\ - strh r2, [r0]\n\ - strh r2, [r1]\n\ - ldrb r0, [r7]\n\ - mov r4, r8\n\ - muls r4, r0\n\ - adds r0, r4, 0\n\ - add r0, r9\n\ - movs r6, 0\n\ - strh r3, [r0, 0x2E]\n\ - ldr r4, _0801F34C @ =gActiveBank\n\ - mov r2, r10\n\ - ldrb r0, [r2]\n\ - strb r0, [r4]\n\ - str r1, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - movs r3, 0x2\n\ - bl EmitSetAttributes\n\ - mov r3, r10\n\ - ldrb r0, [r3]\n\ - bl MarkBufferBankForExecution\n\ - ldrb r0, [r7]\n\ - strb r0, [r4]\n\ - ldrb r0, [r7]\n\ - mov r4, r8\n\ - muls r4, r0\n\ - adds r0, r4, 0\n\ - mov r1, r9\n\ - adds r1, 0x2E\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - movs r3, 0x2\n\ - bl EmitSetAttributes\n\ - ldrb r0, [r7]\n\ - bl MarkBufferBankForExecution\n\ - ldr r4, _0801F350 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801F354 @ =BattleScript_ItemSteal\n\ - str r0, [r4]\n\ - ldr r0, _0801F358 @ =0xfffe9f10\n\ - adds r5, r0\n\ - ldrb r0, [r7]\n\ - lsls r0, 1\n\ - ldr r1, _0801F35C @ =0x000160e8\n\ - adds r0, r1\n\ - adds r0, r5\n\ - strb r6, [r0]\n\ - ldrb r0, [r7]\n\ - lsls r0, 1\n\ - ldr r2, _0801F360 @ =0x000160e9\n\ - adds r0, r2\n\ - adds r0, r5\n\ - strb r6, [r0]\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F340: .4byte gBankAttacker\n\ -_0801F344: .4byte 0x020160f0\n\ -_0801F348: .4byte gLastUsedItem\n\ -_0801F34C: .4byte gActiveBank\n\ -_0801F350: .4byte gBattlescriptCurrInstr\n\ -_0801F354: .4byte BattleScript_ItemSteal\n\ -_0801F358: .4byte 0xfffe9f10\n\ -_0801F35C: .4byte 0x000160e8\n\ -_0801F360: .4byte 0x000160e9\n\ -_0801F364:\n\ - ldr r3, _0801F394 @ =gBankTarget\n\ - ldrb r1, [r3]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 19\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - ldr r2, _0801F398 @ =gDisableStructs\n\ - ldrb r1, [r3]\n\ - lsls r0, r1, 3\n\ - subs r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldr r1, _0801F39C @ =gBankAttacker\n\ - ldrb r1, [r1]\n\ - strb r1, [r0, 0x14]\n\ - b _0801F5DC\n\ - .align 2, 0\n\ -_0801F394: .4byte gBankTarget\n\ -_0801F398: .4byte gDisableStructs\n\ -_0801F39C: .4byte gBankAttacker\n\ -_0801F3A0:\n\ - ldr r0, _0801F3B8 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - adds r2, r1, 0\n\ - muls r2, r0\n\ - mov r0, r9\n\ - adds r0, 0x50\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 20\n\ - b _0801F19A\n\ - .align 2, 0\n\ -_0801F3B8: .4byte gBankTarget\n\ -_0801F3BC:\n\ - ldr r4, _0801F3CC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801F3D0 @ =gUnknown_081D9224\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F3CC: .4byte gBattlescriptCurrInstr\n\ -_0801F3D0: .4byte gUnknown_081D9224\n\ -_0801F3D4:\n\ - ldr r4, _0801F3E4 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801F3E8 @ =BattleScript_RapidSpinAway\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F3E4: .4byte gBattlescriptCurrInstr\n\ -_0801F3E8: .4byte BattleScript_RapidSpinAway\n\ -_0801F3EC:\n\ - ldr r6, _0801F43C @ =gBankTarget\n\ - ldrb r0, [r6]\n\ - movs r2, 0x58\n\ - muls r0, r2\n\ - mov r1, r9\n\ - adds r1, 0x4C\n\ - adds r5, r0, r1\n\ - ldr r4, [r5]\n\ - movs r0, 0x40\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - bne _0801F406\n\ - b _0801F5DC\n\ -_0801F406:\n\ - movs r0, 0x41\n\ - negs r0, r0\n\ - ands r4, r0\n\ - str r4, [r5]\n\ - ldr r4, _0801F440 @ =gActiveBank\n\ - ldrb r0, [r6]\n\ - strb r0, [r4]\n\ - ldrb r0, [r4]\n\ - muls r0, r2\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x28\n\ - movs r2, 0\n\ - movs r3, 0x4\n\ - bl EmitSetAttributes\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r4, _0801F444 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801F448 @ =BattleScript_TargetPRLZHeal\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F43C: .4byte gBankTarget\n\ -_0801F440: .4byte gActiveBank\n\ -_0801F444: .4byte gBattlescriptCurrInstr\n\ -_0801F448: .4byte BattleScript_TargetPRLZHeal\n\ -_0801F44C:\n\ - ldr r4, _0801F45C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801F460 @ =gUnknown_081D93FA\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F45C: .4byte gBattlescriptCurrInstr\n\ -_0801F460: .4byte gUnknown_081D93FA\n\ -_0801F464:\n\ - ldr r4, _0801F494 @ =gBattleMoveDamage\n\ - ldr r0, _0801F498 @ =gHP_dealt\n\ - ldr r0, [r0]\n\ - movs r1, 0x3\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - cmp r0, 0\n\ - bne _0801F47A\n\ - movs r0, 0x1\n\ - str r0, [r4]\n\ -_0801F47A:\n\ - ldr r4, _0801F49C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r1, _0801F4A0 @ =gMoveEffectBS_Ptrs\n\ - ldr r0, _0801F4A4 @ =gBattleCommunication\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - b _0801F5F8\n\ - .align 2, 0\n\ -_0801F494: .4byte gBattleMoveDamage\n\ -_0801F498: .4byte gHP_dealt\n\ -_0801F49C: .4byte gBattlescriptCurrInstr\n\ -_0801F4A0: .4byte gMoveEffectBS_Ptrs\n\ -_0801F4A4: .4byte gBattleCommunication\n\ -_0801F4A8:\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - movs r5, 0x58\n\ - muls r0, r5\n\ - mov r4, r9\n\ - adds r4, 0x50\n\ - adds r2, r0, r4\n\ - ldr r1, [r2]\n\ - movs r0, 0xC0\n\ - lsls r0, 4\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801F4C4\n\ - b _0801F5DC\n\ -_0801F4C4:\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - orrs r1, r0\n\ - str r1, [r2]\n\ - ldr r1, _0801F4F8 @ =gLockedMove\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldr r1, _0801F4FC @ =gCurrentMove\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ - bl Random\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - adds r2, r1, 0\n\ - muls r2, r5\n\ - adds r2, r4\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - adds r1, 0x2\n\ - lsls r1, 10\n\ - ldr r0, [r2]\n\ -_0801F4F2:\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F4F8: .4byte gLockedMove\n\ -_0801F4FC: .4byte gCurrentMove\n\ -_0801F500:\n\ - mov r5, r8\n\ - ldrb r3, [r5]\n\ - movs r4, 0x58\n\ - adds r0, r3, 0\n\ - muls r0, r4\n\ - mov r2, r9\n\ - adds r1, r0, r2\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r2, [r0]\n\ - cmp r2, 0x3C\n\ - bne _0801F540\n\ - ldrh r0, [r1, 0x2E]\n\ - cmp r0, 0\n\ - beq _0801F5DC\n\ - ldr r0, _0801F534 @ =gLastUsedAbility\n\ - strb r2, [r0]\n\ - ldr r1, _0801F538 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0801F53C @ =BattleScript_NoItemSteal\n\ - str r0, [r1]\n\ - ldrb r0, [r5]\n\ - movs r1, 0x3C\n\ - bl RecordAbilityBattle\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F534: .4byte gLastUsedAbility\n\ -_0801F538: .4byte gBattlescriptCurrInstr\n\ -_0801F53C: .4byte BattleScript_NoItemSteal\n\ -_0801F540:\n\ - ldrh r0, [r1, 0x2E]\n\ - cmp r0, 0\n\ - beq _0801F5DC\n\ - adds r0, r3, 0\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldr r1, _0801F5B8 @ =gLastUsedItem\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - muls r0, r4\n\ - add r0, r9\n\ - ldrh r0, [r0, 0x2E]\n\ - strh r0, [r1]\n\ - ldrb r0, [r3]\n\ - muls r0, r4\n\ - add r0, r9\n\ - movs r5, 0\n\ - movs r1, 0\n\ - strh r1, [r0, 0x2E]\n\ - ldr r2, _0801F5BC @ =gWishFutureKnock\n\ - adds r2, 0x29\n\ - adds r2, r6, r2\n\ - ldr r3, _0801F5C0 @ =gBitTable\n\ - ldr r1, _0801F5C4 @ =gBattlePartyID\n\ - mov r4, r8\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r4, _0801F5C8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801F5CC @ =BattleScript_KnockedOff\n\ - str r0, [r4]\n\ - ldr r1, _0801F5D0 @ =0x02000000\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - ldr r3, _0801F5D4 @ =0x000160e8\n\ - adds r0, r3\n\ - adds r0, r1\n\ - strb r5, [r0]\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - ldr r4, _0801F5D8 @ =0x000160e9\n\ - adds r0, r4\n\ - adds r0, r1\n\ - strb r5, [r0]\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F5B8: .4byte gLastUsedItem\n\ -_0801F5BC: .4byte gWishFutureKnock\n\ -_0801F5C0: .4byte gBitTable\n\ -_0801F5C4: .4byte gBattlePartyID\n\ -_0801F5C8: .4byte gBattlescriptCurrInstr\n\ -_0801F5CC: .4byte BattleScript_KnockedOff\n\ -_0801F5D0: .4byte 0x02000000\n\ -_0801F5D4: .4byte 0x000160e8\n\ -_0801F5D8: .4byte 0x000160e9\n\ -_0801F5DC:\n\ - ldr r1, _0801F5E8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x1\n\ - str r0, [r1]\n\ - b _0801F5FA\n\ - .align 2, 0\n\ -_0801F5E8: .4byte gBattlescriptCurrInstr\n\ -_0801F5EC:\n\ - ldr r4, _0801F60C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801F610 @ =gUnknown_081D94B0\n\ -_0801F5F8:\n\ - str r0, [r4]\n\ -_0801F5FA:\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0801F60C: .4byte gBattlescriptCurrInstr\n\ -_0801F610: .4byte gUnknown_081D94B0\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -static void atk15_seteffectwithchancetarget(void) -{ - u32 PercentChance; - if (gBattleMons[gBankAttacker].ability == ABILITY_SERENE_GRACE) - PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance * 2; - else - PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance; - if (gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80 && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) - { - gBattleCommunication[MOVE_EFFECT_BYTE] &= 0x7F; - SetMoveEffect(0, 0x80); - } - else if (Random() % 100 <= PercentChance && gBattleCommunication[MOVE_EFFECT_BYTE] && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) - { - if (PercentChance >= 100) - SetMoveEffect(0, 0x80); - else - SetMoveEffect(0, 0); - } - else - gBattlescriptCurrInstr++; - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - BATTLE_STRUCT->filler2[0x3E] = 0; //TODO: to fix this later -} - -static void atk16_seteffectprimary(void) -{ - SetMoveEffect(1, 0); -} - -static void atk17_seteffectsecondary(void) -{ - SetMoveEffect(0, 0); -} - -static void atk18_status_effect_clear(void) -{ - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) - gBattleMons[gActiveBank].status1 &= (~gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); - else - gBattleMons[gActiveBank].status2 &= (~gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); - - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - gBattlescriptCurrInstr += 2; - BATTLE_STRUCT->filler2[0x3E] = 0; //TODO: to fix this later -} - -//Fuck this, Maybe later -__attribute__((naked)) -static void atk19_faint_pokemon(void) -{ - asm(".syntax unified\n\ -push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - ldr r0, _0801F81C @ =gBattlescriptCurrInstr\n\ - ldr r2, [r0]\n\ - ldrb r1, [r2, 0x2]\n\ - adds r6, r0, 0\n\ - cmp r1, 0\n\ - beq _0801F834\n\ - ldrb r0, [r2, 0x1]\n\ - bl GetBattleBank\n\ - ldr r5, _0801F820 @ =gActiveBank\n\ - strb r0, [r5]\n\ - ldr r2, _0801F824 @ =gHitMarker\n\ - ldr r1, _0801F828 @ =gBitTable\n\ - ldrb r0, [r5]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801F7E6\n\ - b _0801FB1C\n\ -_0801F7E6:\n\ - ldr r1, [r6]\n\ - ldrb r4, [r1, 0x3]\n\ - ldrb r0, [r1, 0x4]\n\ - lsls r0, 8\n\ - orrs r4, r0\n\ - ldrb r0, [r1, 0x5]\n\ - lsls r0, 16\n\ - orrs r4, r0\n\ - ldrb r0, [r1, 0x6]\n\ - lsls r0, 24\n\ - orrs r4, r0\n\ - bl b_movescr_stack_pop_cursor\n\ - str r4, [r6]\n\ - ldrb r0, [r5]\n\ - bl GetBankSide\n\ - ldr r1, _0801F82C @ =gSideAffecting\n\ - lsls r0, 24\n\ - lsrs r0, 23\n\ - adds r0, r1\n\ - ldrh r2, [r0]\n\ - ldr r1, _0801F830 @ =0x0000fdff\n\ - ands r1, r2\n\ - strh r1, [r0]\n\ - b _0801FB22\n\ - .align 2, 0\n\ -_0801F81C: .4byte gBattlescriptCurrInstr\n\ -_0801F820: .4byte gActiveBank\n\ -_0801F824: .4byte gHitMarker\n\ -_0801F828: .4byte gBitTable\n\ -_0801F82C: .4byte gSideAffecting\n\ -_0801F830: .4byte 0x0000fdff\n\ -_0801F834:\n\ - ldrb r0, [r2, 0x1]\n\ - cmp r0, 0x1\n\ - bne _0801F85C\n\ - ldr r1, _0801F84C @ =gActiveBank\n\ - ldr r0, _0801F850 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldr r0, _0801F854 @ =gBankTarget\n\ - ldrb r7, [r0]\n\ - ldr r4, _0801F858 @ =gUnknown_081D8C58\n\ - b _0801F86A\n\ - .align 2, 0\n\ -_0801F84C: .4byte gActiveBank\n\ -_0801F850: .4byte gBankAttacker\n\ -_0801F854: .4byte gBankTarget\n\ -_0801F858: .4byte gUnknown_081D8C58\n\ -_0801F85C:\n\ - ldr r1, _0801F954 @ =gActiveBank\n\ - ldr r0, _0801F958 @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldr r0, _0801F95C @ =gBankAttacker\n\ - ldrb r7, [r0]\n\ - ldr r4, _0801F960 @ =gUnknown_081D8C65\n\ -_0801F86A:\n\ - ldr r0, _0801F964 @ =gAbsentBankFlags\n\ - ldrb r1, [r0]\n\ - ldr r0, _0801F968 @ =gBitTable\n\ - mov r12, r0\n\ - ldr r2, _0801F954 @ =gActiveBank\n\ - mov r8, r2\n\ - ldrb r2, [r2]\n\ - lsls r0, r2, 2\n\ - add r0, r12\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _0801F886\n\ - b _0801FB1C\n\ -_0801F886:\n\ - ldr r3, _0801F96C @ =gBattleMons\n\ - mov r10, r3\n\ - movs r5, 0x58\n\ - mov r9, r5\n\ - mov r0, r9\n\ - muls r0, r2\n\ - add r0, r10\n\ - ldrh r3, [r0, 0x28]\n\ - cmp r3, 0\n\ - beq _0801F89C\n\ - b _0801FB1C\n\ -_0801F89C:\n\ - ldr r2, _0801F970 @ =0x02000000\n\ - lsls r1, r7, 1\n\ - ldr r5, _0801F974 @ =0x000160ac\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - ldr r0, _0801F978 @ =0x000160ad\n\ - adds r1, r0\n\ - adds r1, r2\n\ - strb r3, [r1]\n\ - lsls r1, r7, 2\n\ - adds r5, 0x54\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - adds r5, 0x1\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - adds r5, 0x1\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - ldr r0, _0801F97C @ =0x00016103\n\ - adds r1, r0\n\ - adds r1, r2\n\ - strb r3, [r1]\n\ - ldr r5, _0801F980 @ =gHitMarker\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - lsls r0, 2\n\ - add r0, r12\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r5]\n\ - orrs r0, r1\n\ - str r0, [r5]\n\ - ldr r0, [r6]\n\ - adds r0, 0x7\n\ - bl b_movescr_stack_push\n\ - str r4, [r6]\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0801F9B0\n\ - ldr r0, [r5]\n\ - movs r1, 0x80\n\ - lsls r1, 15\n\ - orrs r0, r1\n\ - str r0, [r5]\n\ - ldr r1, _0801F984 @ =gBattleResults\n\ - ldrb r0, [r1]\n\ - cmp r0, 0xFE\n\ - bhi _0801F914\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ -_0801F914:\n\ - mov r0, r9\n\ - muls r0, r7\n\ - add r0, r10\n\ - adds r3, r0, 0\n\ - adds r3, 0x2A\n\ - mov r4, r8\n\ - ldrb r2, [r4]\n\ - mov r0, r9\n\ - muls r0, r2\n\ - add r0, r10\n\ - adds r1, r0, 0\n\ - adds r1, 0x2A\n\ - ldrb r0, [r3]\n\ - ldrb r5, [r1]\n\ - cmp r0, r5\n\ - bls _0801F9CC\n\ - ldrb r1, [r1]\n\ - subs r0, r1\n\ - cmp r0, 0x1D\n\ - ble _0801F990\n\ - ldr r1, _0801F988 @ =gBattlePartyID\n\ - lsls r0, r2, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _0801F98C @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x8\n\ - bl AdjustFriendship\n\ - b _0801F9CC\n\ - .align 2, 0\n\ -_0801F954: .4byte gActiveBank\n\ -_0801F958: .4byte gBankTarget\n\ -_0801F95C: .4byte gBankAttacker\n\ -_0801F960: .4byte gUnknown_081D8C65\n\ -_0801F964: .4byte gAbsentBankFlags\n\ -_0801F968: .4byte gBitTable\n\ -_0801F96C: .4byte gBattleMons\n\ -_0801F970: .4byte 0x02000000\n\ -_0801F974: .4byte 0x000160ac\n\ -_0801F978: .4byte 0x000160ad\n\ -_0801F97C: .4byte 0x00016103\n\ -_0801F980: .4byte gHitMarker\n\ -_0801F984: .4byte gBattleResults\n\ -_0801F988: .4byte gBattlePartyID\n\ -_0801F98C: .4byte gPlayerParty\n\ -_0801F990:\n\ - ldr r1, _0801F9A8 @ =gBattlePartyID\n\ - lsls r0, r2, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _0801F9AC @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x6\n\ - bl AdjustFriendship\n\ - b _0801F9CC\n\ - .align 2, 0\n\ -_0801F9A8: .4byte gBattlePartyID\n\ -_0801F9AC: .4byte gPlayerParty\n\ -_0801F9B0:\n\ - ldr r1, _0801FAE0 @ =gBattleResults\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0xFE\n\ - bhi _0801F9BC\n\ - adds r0, 0x1\n\ - strb r0, [r1, 0x1]\n\ -_0801F9BC:\n\ - ldr r2, _0801FAE4 @ =gActiveBank\n\ - ldrb r0, [r2]\n\ - mov r3, r9\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - add r0, r10\n\ - ldrh r0, [r0]\n\ - strh r0, [r1, 0x20]\n\ -_0801F9CC:\n\ - ldr r0, _0801FAE8 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801FA02\n\ - ldr r6, _0801FAEC @ =gBattleMons\n\ - ldr r0, _0801FAF0 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - movs r5, 0x58\n\ - muls r0, r5\n\ - adds r0, r6\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _0801FA02\n\ - ldr r4, _0801FAF4 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - bl b_movescr_stack_push\n\ - ldr r1, _0801FAF8 @ =gBattleMoveDamage\n\ - adds r0, r7, 0\n\ - muls r0, r5\n\ - adds r0, r6\n\ - ldrh r0, [r0, 0x28]\n\ - str r0, [r1]\n\ - ldr r0, _0801FAFC @ =gUnknown_081D9156\n\ - str r0, [r4]\n\ -_0801FA02:\n\ - ldr r1, _0801FB00 @ =gStatuses3\n\ - ldr r6, _0801FB04 @ =gBankTarget\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801FA1A\n\ - b _0801FB22\n\ -_0801FA1A:\n\ - ldr r0, _0801FAE8 @ =gHitMarker\n\ - ldr r5, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 17\n\ - ands r5, r0\n\ - cmp r5, 0\n\ - bne _0801FB22\n\ - ldr r4, _0801FAF0 @ =gBankAttacker\n\ - mov r8, r4\n\ - ldrb r0, [r4]\n\ - bl GetBankSide\n\ - adds r4, r0, 0\n\ - ldrb r0, [r6]\n\ - bl GetBankSide\n\ - lsls r4, 24\n\ - lsls r0, 24\n\ - cmp r4, r0\n\ - beq _0801FB22\n\ - ldr r0, _0801FAEC @ =gBattleMons\n\ - mov r9, r0\n\ - mov r1, r8\n\ - ldrb r2, [r1]\n\ - movs r7, 0x58\n\ - adds r3, r2, 0\n\ - muls r3, r7\n\ - adds r0, r3, r0\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _0801FB22\n\ - ldr r0, _0801FB08 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - cmp r0, 0xA5\n\ - beq _0801FB22\n\ - ldr r1, _0801FB0C @ =0x02000000\n\ - ldr r4, _0801FB10 @ =0x0001608c\n\ - adds r0, r2, r4\n\ - adds r0, r1\n\ - ldrb r4, [r0]\n\ - adds r0, r4, r3\n\ - mov r6, r9\n\ - adds r6, 0x24\n\ - adds r0, r6\n\ - strb r5, [r0]\n\ - ldr r5, _0801FAF4 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r5]\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801FB14 @ =gUnknown_081D9468\n\ - str r0, [r5]\n\ - ldr r5, _0801FAE4 @ =gActiveBank\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - strb r0, [r5]\n\ - adds r1, r4, 0\n\ - adds r1, 0x9\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - ldrb r0, [r5]\n\ - muls r0, r7\n\ - adds r0, r6\n\ - adds r0, r4\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r2, 0\n\ - movs r3, 0x1\n\ - bl EmitSetAttributes\n\ - ldrb r0, [r5]\n\ - bl MarkBufferBankForExecution\n\ - ldr r1, _0801FB18 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x2\n\ - strb r0, [r1, 0x1]\n\ - lsls r4, 1\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - muls r0, r7\n\ - adds r0, r4, r0\n\ - mov r2, r9\n\ - adds r2, 0xC\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - strb r0, [r1, 0x2]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - muls r0, r7\n\ - adds r4, r0\n\ - adds r4, r2\n\ - ldrh r0, [r4]\n\ - lsrs r0, 8\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - b _0801FB22\n\ - .align 2, 0\n\ -_0801FAE0: .4byte gBattleResults\n\ -_0801FAE4: .4byte gActiveBank\n\ -_0801FAE8: .4byte gHitMarker\n\ -_0801FAEC: .4byte gBattleMons\n\ -_0801FAF0: .4byte gBankAttacker\n\ -_0801FAF4: .4byte gBattlescriptCurrInstr\n\ -_0801FAF8: .4byte gBattleMoveDamage\n\ -_0801FAFC: .4byte gUnknown_081D9156\n\ -_0801FB00: .4byte gStatuses3\n\ -_0801FB04: .4byte gBankTarget\n\ -_0801FB08: .4byte gCurrentMove\n\ -_0801FB0C: .4byte 0x02000000\n\ -_0801FB10: .4byte 0x0001608c\n\ -_0801FB14: .4byte gUnknown_081D9468\n\ -_0801FB18: .4byte gBattleTextBuff1\n\ -_0801FB1C:\n\ - ldr r0, [r6]\n\ - adds r0, 0x7\n\ - str r0, [r6]\n\ -_0801FB22:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} - -static void atk1A_faint_animation(void) -{ - if (gBattleExecBuffer == 0) - { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - EmitFaintAnimation(0); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 2; - } -} - -static void atk1B_faint_effects_clear(void) -{ - //Clears things like attraction or trapping to other banks - if (gBattleExecBuffer == 0) - { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - gBattleMons[gActiveBank].status1 = 0; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBank].status1); - MarkBufferBankForExecution(gActiveBank); - UndoEffectsAfterFainting(); - gBattlescriptCurrInstr += 2; - } -} - -static void atk1C_jumpifstatus(void) -{ - u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - u32 flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2); - void* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6); - if (gBattleMons[bank].status1 & flags && gBattleMons[bank].hp) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 10; -} - -static void atk1D_jumpifstatus2(void) -{ - u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - u32 flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2); - void* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6); - if (gBattleMons[bank].status2 & flags && gBattleMons[bank].hp) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 10; -} - -static void atk1E_jumpifability(void) -{ - u8 bank; - u8 ability = BSScriptRead8(gBattlescriptCurrInstr + 2); - void* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3); - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 8) - { - bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_BANK_SIDE, gBankAttacker, ability, 0, 0); - if (bank) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = jump_loc; - RecordAbilityBattle(bank -1, gLastUsedAbility); - unk_2000000[0x160f8] = bank - 1; - } - else - gBattlescriptCurrInstr += 7; - } - else if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 9) - { - bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBankAttacker, ability, 0, 0); - if (bank) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = jump_loc; - RecordAbilityBattle(bank - 1, gLastUsedAbility); - unk_2000000[0x160f8] = bank - 1; - } - else - gBattlescriptCurrInstr += 7; - } - else - { - bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - if (gBattleMons[bank].ability == ability) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = jump_loc; - RecordAbilityBattle(bank, gLastUsedAbility); - unk_2000000[0x160f8] = bank; - } - else - gBattlescriptCurrInstr += 7; - } -} - -static void atk1F_jumpifsideaffecting(void) -{ - u8 side; - u16 flags; - void* jump_loc; - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 1) - side = GetBankIdentity(gBankAttacker) & 1; - else - side = GetBankIdentity(gBankTarget) & 1; - - flags = BS2ScriptRead16(gBattlescriptCurrInstr + 2); - jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 4); - - if (gSideAffecting[side] & flags) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 8; -} - -static void atk20_jumpifstat(void) -{ - u8 ret = 0; - u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - u8 value = gBattleMons[bank].statStages[BSScriptRead8(gBattlescriptCurrInstr + 3)]; - switch (BSScriptRead8(gBattlescriptCurrInstr + 2)) - { - case CMP_EQUAL: - if (value == BSScriptRead8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_NOT_EQUAL: - if (value != BSScriptRead8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_GREATER_THAN: - if (value > BSScriptRead8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_LESS_THAN: - if (value < BSScriptRead8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_COMMON_BITS: - if (value & BSScriptRead8(gBattlescriptCurrInstr + 4)) - ret++; - break; - case CMP_NO_COMMON_BITS: - if (!(value & BSScriptRead8(gBattlescriptCurrInstr + 4))) - ret++; - break; - } - if (ret) - gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); - else - gBattlescriptCurrInstr += 9; -} - -static void atk21_jumpifstatus3(void) -{ - u32 flags; - void* jump_loc; - - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2); - jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 7); - if (BSScriptRead8(gBattlescriptCurrInstr + 6)) - { - if ((gStatuses3[gActiveBank] & flags) != 0) - gBattlescriptCurrInstr += 11; - else - gBattlescriptCurrInstr = jump_loc; - } - else - { - if ((gStatuses3[gActiveBank] & flags) != 0) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 11; - } -} - -static void atk22_jumpiftype(void) //u8 bank, u8 type, *ptr -{ - u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - u8 type = BSScriptRead8(gBattlescriptCurrInstr + 2); - void* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3); - - if (gBattleMons[bank].type1 == type || gBattleMons[bank].type2 == type) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 7; -} - -//here we go again... -#ifdef NONMATCHING -static void atk23_getexp(void) -{ - u8 hold_effect; - int via_expshare = 0, sent_in; - u16* exp = &BATTLE_STRUCT->exp; - gBank1 = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - sent_in = gSentPokesToOpponent[(gBank1 & 2) >> 1]; - switch (BATTLE_STRUCT->atk23StateTracker) - { - case 0: //check if should receive exp at all - if (GetBankSide(gBank1) != 1 || (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) - BATTLE_STRUCT->atk23StateTracker = 6; //goto last case - else - { - BATTLE_STRUCT->atk23StateTracker++; - unk_2000000[0x16113] |= gBitTable[gBattlePartyID[gBank1]]; - } - break; - case 1: //calculate experience points to redistribute - { - int via_sent_in = 0, i; - u16 calculatedExp; - for (i = 0; i < 6; i++) - { - u16 item; - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == 0 || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) - continue; - if (gBitTable[i] & sent_in) - via_sent_in++; - - item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - if (item == ITEM_ENIGMA_BERRY) - hold_effect = gSaveBlock1.enigmaBerry.holdEffect; - else - hold_effect = ItemId_GetHoldEffect(item); - - if (hold_effect == HOLD_EFFECT_EXP_SHARE) - via_expshare++; - } - calculatedExp = gBaseStats[gBattleMons[gBank1].species].expYield * gBattleMons[gBank1].level / 7; - if (via_expshare) //at least one poke is getting exp via exp share - { - calculatedExp /= 2; - *exp = calculatedExp / via_sent_in; - if (*exp == 0) - *exp = 1; - - gExpShareExp = calculatedExp / via_expshare; - if (gExpShareExp == 0) - gExpShareExp = 1; - } - else - { - *exp = calculatedExp / via_sent_in; - if (*exp == 0) - *exp = 1; - gExpShareExp = 0; - } - BATTLE_STRUCT->atk23StateTracker++; - BATTLE_STRUCT->expGetterID = 0; - BATTLE_STRUCT->sentInPokes = sent_in; - } //no break statement - case 2: //loop; set exp value to the poke in expgetter_id and print message - if (gBattleExecBuffer == 0) - { - u16 item = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HELD_ITEM); - u8* tracker; u32 zero; - if (item == ITEM_ENIGMA_BERRY) - hold_effect = gSaveBlock1.enigmaBerry.holdEffect; - else - hold_effect = ItemId_GetHoldEffect(item); - - if ((hold_effect != HOLD_EFFECT_EXP_SHARE && !(BATTLE_STRUCT->sentInPokes & 1))) - { - BATTLE_STRUCT->sentInPokes >>= 1; - tracker = &BATTLE_STRUCT->atk23StateTracker; - zero = 0; - goto LABEL; - } - else if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) == 100) - { - - BATTLE_STRUCT->sentInPokes >>= 1; - tracker = &BATTLE_STRUCT->atk23StateTracker; - zero = 0; - LABEL: - *tracker = 5; //increment looper - gBattleMoveDamage = zero; //used for exp - } - else - { - //music change in wild battle after fainting a poke - if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !BATTLE_STRUCT->wildVictorySong) - { - BattleMusicStop(); - PlayBGM(0x161); - BATTLE_STRUCT->wildVictorySong++; - } - - if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP)) - { - s16 stringID; - if (BATTLE_STRUCT->sentInPokes & 1) - gBattleMoveDamage = *exp; - else - gBattleMoveDamage = 0; - - if (hold_effect == HOLD_EFFECT_EXP_SHARE) - gBattleMoveDamage += gExpShareExp; - if (hold_effect == HOLD_EFFECT_LUCKY_EGG) - gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - - if (IsTradedMon(&gPlayerParty[BATTLE_STRUCT->expGetterID])) - { - gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - stringID = 0x14A; - } - else - stringID = 0x149; - - //get exp getter bank - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - if (!(gBattlePartyID[2] != BATTLE_STRUCT->expGetterID) && !(gAbsentBankFlags & gBitTable[2])) - BATTLE_STRUCT->expGetterBank = 2; - else - { - if (!(gAbsentBankFlags & gBitTable[0])) - BATTLE_STRUCT->expGetterBank = 0; - else - BATTLE_STRUCT->expGetterBank = 2; - } - } - else - BATTLE_STRUCT->expGetterBank = 0; - - //buffer poke name - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = BATTLE_STRUCT->expGetterBank; - gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID; - gBattleTextBuff1[4] = 0xFF; - - //buffer 'gained' or 'gained a boosted' - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = sBYTE0_32(stringID); - gBattleTextBuff2[3] = sBYTE1_32(stringID); - gBattleTextBuff2[4] = 0xFF; - - //buffer exp number - gBattleTextBuff3[0] = 0xFD; - gBattleTextBuff3[1] = 1; - gBattleTextBuff3[2] = 4; //word - gBattleTextBuff3[3] = 5; //max digits - gBattleTextBuff3[4] = gBattleMoveDamage; - gBattleTextBuff3[5] = sBYTE1_32(gBattleMoveDamage); - gBattleTextBuff3[6] = sBYTE2_32(gBattleMoveDamage); - gBattleTextBuff3[7] = sBYTE3_32(gBattleMoveDamage); - gBattleTextBuff3[8] = 0xFF; - - PrepareStringBattle(0xD, BATTLE_STRUCT->expGetterBank); - MonGainEVs(&gPlayerParty[BATTLE_STRUCT->expGetterID], gBattleMons[gBank1].species); - } - BATTLE_STRUCT->sentInPokes >>= 1; - BATTLE_STRUCT->atk23StateTracker++; - } - } - break; - case 3: //Set Stats and give exp - if (gBattleExecBuffer == 0) - { - gBattleBufferB[BATTLE_STRUCT->expGetterBank][0] = 0; - if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) != 100) - { - BATTLE_STRUCT->beforeLvlUp[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); //doesnt match - BATTLE_STRUCT->beforeLvlUp[1] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); - BATTLE_STRUCT->beforeLvlUp[2] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); - BATTLE_STRUCT->beforeLvlUp[3] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); - BATTLE_STRUCT->beforeLvlUp[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); - BATTLE_STRUCT->beforeLvlUp[5] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF); - - gActiveBank = BATTLE_STRUCT->expGetterBank; - EmitExpBarUpdate(0, BATTLE_STRUCT->expGetterID, gBattleMoveDamage); - MarkBufferBankForExecution(gActiveBank); - } - BATTLE_STRUCT->atk23StateTracker++; - } - break; - case 4: //lvl up if necessary - if (gBattleExecBuffer == 0) - { - gActiveBank = BATTLE_STRUCT->expGetterBank; - if (gBattleBufferB[gActiveBank][0] == 0x21 && gBattleBufferB[gActiveBank][1] == 0xB) - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID) - sub_80324F8(&gPlayerParty[gActiveBank], gActiveBank); - - //buff poke name - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = gActiveBank; - gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID; - gBattleTextBuff1[4] = 0xFF; - - //buff level - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 1; - gBattleTextBuff2[2] = 1; - gBattleTextBuff2[3] = 3; - gBattleTextBuff2[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL); - gBattleTextBuff2[5] = 0xFF; - - b_movescr_stack_push_cursor(); - gLeveledUpInBattle |= gBitTable[BATTLE_STRUCT->expGetterID]; - gBattlescriptCurrInstr = BattleScript_LevelUp; - gBattleMoveDamage = (gBattleBufferB[gActiveBank][2] | (gBattleBufferB[gActiveBank][3] << 8)); - AdjustFriendship(&gPlayerParty[BATTLE_STRUCT->expGetterID], 0); - - //update battle mon structure after level up - if (gBattlePartyID[0] == BATTLE_STRUCT->expGetterID && gBattleMons[0].hp) - { - gBattleMons[0].level = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL); - gBattleMons[0].hp = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP); - gBattleMons[0].maxHP = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); - gBattleMons[0].attack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); - gBattleMons[0].defense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); - gBattleMons[0].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); - gBattleMons[0].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); - gBattleMons[0].spDefense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF); - } - //What is else if? Guess it's too advanced for GameFreak - if (gBattlePartyID[2] == BATTLE_STRUCT->expGetterID && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gBattleMons[2].level = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL); - gBattleMons[2].hp = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP); - gBattleMons[2].maxHP = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); - gBattleMons[2].attack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); - gBattleMons[2].defense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); - //There are no words...GF can't even copy&paste code properly - gBattleMons[2].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); - gBattleMons[2].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD /*RIP*/); - gBattleMons[2].spDefense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); - } - BATTLE_STRUCT->atk23StateTracker = 5; - } - else - { - gBattleMoveDamage = 0; - BATTLE_STRUCT->atk23StateTracker = 5; - } - } - break; - case 5: //looper increment - if (gBattleMoveDamage) //there is exp to give, goto case 3 that gives exp - BATTLE_STRUCT->atk23StateTracker = 3; - else - { - if (++BATTLE_STRUCT->expGetterID <= 5) - BATTLE_STRUCT->atk23StateTracker = 2; //loop again - else - BATTLE_STRUCT->atk23StateTracker = 6; //we're done - } - break; - case 6: //increment instruction - if (gBattleExecBuffer == 0) - { - //not even sure why gamefreak clears that data in this place - gBattleMons[gBank1].item = 0; - gBattleMons[gBank1].ability = 0; - gBattlescriptCurrInstr += 2; - } - break; - } -} -#else -__attribute__((naked)) -static void atk23_getexp(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - movs r6, 0\n\ - ldr r0, _0802004C @ =0x0201605c\n\ - mov r10, r0\n\ - ldr r0, _08020050 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x1]\n\ - bl GetBattleBank\n\ - ldr r1, _08020054 @ =gBank1\n\ - strb r0, [r1]\n\ - ldr r2, _08020058 @ =gSentPokesToOpponent\n\ - movs r1, 0x2\n\ - ands r1, r0\n\ - lsls r1, 24\n\ - lsrs r1, 25\n\ - adds r1, r2\n\ - ldrb r1, [r1]\n\ - mov r8, r1\n\ - mov r0, r10\n\ - subs r0, 0x4D\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x6\n\ - bls _08020040\n\ - bl _08020996\n\ -_08020040:\n\ - lsls r0, 2\n\ - ldr r1, _0802005C @ =_08020060\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0802004C: .4byte 0x0201605c\n\ -_08020050: .4byte gBattlescriptCurrInstr\n\ -_08020054: .4byte gBank1\n\ -_08020058: .4byte gSentPokesToOpponent\n\ -_0802005C: .4byte _08020060\n\ - .align 2, 0\n\ -_08020060:\n\ - .4byte _0802007C\n\ - .4byte _080200FC\n\ - .4byte _08020216\n\ - .4byte _0802055C\n\ - .4byte _08020648\n\ - .4byte _08020910\n\ - .4byte _0802096C\n\ -_0802007C:\n\ - ldr r4, _080200A8 @ =gBank1\n\ - ldrb r0, [r4]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _08020098\n\ - ldr r0, _080200AC @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _080200B0 @ =0x00000982\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080200BC\n\ -_08020098:\n\ - ldr r0, _080200B4 @ =0x02000000\n\ - ldr r1, _080200B8 @ =0x0001600f\n\ - adds r0, r1\n\ - movs r1, 0x6\n\ - strb r1, [r0]\n\ - bl _08020996\n\ - .align 2, 0\n\ -_080200A8: .4byte gBank1\n\ -_080200AC: .4byte gBattleTypeFlags\n\ -_080200B0: .4byte 0x00000982\n\ -_080200B4: .4byte 0x02000000\n\ -_080200B8: .4byte 0x0001600f\n\ -_080200BC:\n\ - ldr r2, _080200E8 @ =0x02000000\n\ - ldr r3, _080200EC @ =0x0001600f\n\ - adds r1, r2, r3\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - ldr r0, _080200F0 @ =0x00016113\n\ - adds r2, r0\n\ - ldr r3, _080200F4 @ =gBitTable\n\ - ldr r1, _080200F8 @ =gBattlePartyID\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - bl _08020996\n\ - .align 2, 0\n\ -_080200E8: .4byte 0x02000000\n\ -_080200EC: .4byte 0x0001600f\n\ -_080200F0: .4byte 0x00016113\n\ -_080200F4: .4byte gBitTable\n\ -_080200F8: .4byte gBattlePartyID\n\ -_080200FC:\n\ - movs r5, 0\n\ - movs r7, 0\n\ - ldr r1, _08020150 @ =gSaveBlock1 + 0x3688\n\ - mov r9, r1\n\ -_08020104:\n\ - movs r0, 0x64\n\ - adds r1, r7, 0\n\ - muls r1, r0\n\ - ldr r0, _08020154 @ =gPlayerParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0802016A\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0802016A\n\ - ldr r0, _08020158 @ =gBitTable\n\ - lsls r1, r7, 2\n\ - adds r1, r0\n\ - ldr r0, [r1]\n\ - mov r2, r8\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08020138\n\ - adds r5, 0x1\n\ -_08020138:\n\ - adds r0, r4, 0\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xAF\n\ - bne _0802015C\n\ - mov r3, r9\n\ - ldrb r4, [r3]\n\ - b _08020164\n\ - .align 2, 0\n\ -_08020150: .4byte gSaveBlock1 + 0x3688\n\ -_08020154: .4byte gPlayerParty\n\ -_08020158: .4byte gBitTable\n\ -_0802015C:\n\ - bl ItemId_GetHoldEffect\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ -_08020164:\n\ - cmp r4, 0x19\n\ - bne _0802016A\n\ - adds r6, 0x1\n\ -_0802016A:\n\ - adds r7, 0x1\n\ - cmp r7, 0x5\n\ - ble _08020104\n\ - ldr r3, _080201D0 @ =gBaseStats\n\ - ldr r2, _080201D4 @ =gBattleMons\n\ - ldr r0, _080201D8 @ =gBank1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r1, r0\n\ - adds r1, r2\n\ - ldrh r2, [r1]\n\ - lsls r0, r2, 3\n\ - subs r0, r2\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldrb r2, [r0, 0x9]\n\ - adds r1, 0x2A\n\ - ldrb r0, [r1]\n\ - muls r0, r2\n\ - movs r1, 0x7\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - cmp r6, 0\n\ - beq _080201E0\n\ - lsrs r4, r0, 17\n\ - adds r0, r4, 0\n\ - adds r1, r5, 0\n\ - bl __divsi3\n\ - mov r1, r10\n\ - strh r0, [r1]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bne _080201B6\n\ - movs r0, 0x1\n\ - strh r0, [r1]\n\ -_080201B6:\n\ - ldr r5, _080201DC @ =gExpShareExp\n\ - adds r0, r4, 0\n\ - adds r1, r6, 0\n\ - bl __divsi3\n\ - strh r0, [r5]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bne _080201FA\n\ - movs r0, 0x1\n\ - strh r0, [r5]\n\ - b _080201FA\n\ - .align 2, 0\n\ -_080201D0: .4byte gBaseStats\n\ -_080201D4: .4byte gBattleMons\n\ -_080201D8: .4byte gBank1\n\ -_080201DC: .4byte gExpShareExp\n\ -_080201E0:\n\ - adds r0, r1, 0\n\ - adds r1, r5, 0\n\ - bl __divsi3\n\ - mov r2, r10\n\ - strh r0, [r2]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bne _080201F6\n\ - movs r0, 0x1\n\ - strh r0, [r2]\n\ -_080201F6:\n\ - ldr r0, _08020248 @ =gExpShareExp\n\ - strh r6, [r0]\n\ -_080201FA:\n\ - ldr r1, _0802024C @ =0x02000000\n\ - ldr r3, _08020250 @ =0x0001600f\n\ - adds r2, r1, r3\n\ - ldrb r0, [r2]\n\ - adds r0, 0x1\n\ - movs r3, 0\n\ - strb r0, [r2]\n\ - ldr r2, _08020254 @ =0x00016018\n\ - adds r0, r1, r2\n\ - strb r3, [r0]\n\ - ldr r3, _08020258 @ =0x0001605f\n\ - adds r1, r3\n\ - mov r0, r8\n\ - strb r0, [r1]\n\ -_08020216:\n\ - ldr r0, _0802025C @ =gBattleExecBuffer\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _08020220\n\ - b _08020996\n\ -_08020220:\n\ - ldr r0, _0802024C @ =0x02000000\n\ - ldr r1, _08020254 @ =0x00016018\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _08020260 @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xAF\n\ - bne _0802026C\n\ - ldr r0, _08020264 @ =gSaveBlock1\n\ - ldr r2, _08020268 @ =0x00003688\n\ - adds r0, r2\n\ - ldrb r4, [r0]\n\ - b _08020274\n\ - .align 2, 0\n\ -_08020248: .4byte gExpShareExp\n\ -_0802024C: .4byte 0x02000000\n\ -_08020250: .4byte 0x0001600f\n\ -_08020254: .4byte 0x00016018\n\ -_08020258: .4byte 0x0001605f\n\ -_0802025C: .4byte gBattleExecBuffer\n\ -_08020260: .4byte gPlayerParty\n\ -_08020264: .4byte gSaveBlock1\n\ -_08020268: .4byte 0x00003688\n\ -_0802026C:\n\ - bl ItemId_GetHoldEffect\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ -_08020274:\n\ - ldr r5, _08020294 @ =0x02000000\n\ - cmp r4, 0x19\n\ - beq _080202A0\n\ - ldr r3, _08020298 @ =0x0001605f\n\ - adds r1, r5, r3\n\ - ldrb r0, [r1]\n\ - movs r2, 0x1\n\ - ands r2, r0\n\ - cmp r2, 0\n\ - bne _080202A0\n\ - lsrs r0, 1\n\ - strb r0, [r1]\n\ - ldr r0, _0802029C @ =0x0001600f\n\ - adds r1, r5, r0\n\ - b _080202C8\n\ - .align 2, 0\n\ -_08020294: .4byte 0x02000000\n\ -_08020298: .4byte 0x0001605f\n\ -_0802029C: .4byte 0x0001600f\n\ -_080202A0:\n\ - ldr r1, _080202D4 @ =0x00016018\n\ - adds r0, r5, r1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _080202D8 @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - cmp r0, 0x64\n\ - bne _080202E8\n\ - ldr r2, _080202DC @ =0x0001605f\n\ - adds r1, r5, r2\n\ - ldrb r0, [r1]\n\ - lsrs r0, 1\n\ - movs r2, 0\n\ - strb r0, [r1]\n\ - ldr r3, _080202E0 @ =0x0001600f\n\ - adds r1, r5, r3\n\ -_080202C8:\n\ - movs r0, 0x5\n\ - strb r0, [r1]\n\ - ldr r0, _080202E4 @ =gBattleMoveDamage\n\ - str r2, [r0]\n\ - b _08020996\n\ - .align 2, 0\n\ -_080202D4: .4byte 0x00016018\n\ -_080202D8: .4byte gPlayerParty\n\ -_080202DC: .4byte 0x0001605f\n\ -_080202E0: .4byte 0x0001600f\n\ -_080202E4: .4byte gBattleMoveDamage\n\ -_080202E8:\n\ - ldr r0, _0802034C @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08020316\n\ - ldr r0, _08020350 @ =gBattleMons\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _08020316\n\ - ldr r0, _08020354 @ =0x0001601b\n\ - adds r5, r0\n\ - ldrb r0, [r5]\n\ - cmp r0, 0\n\ - bne _08020316\n\ - bl BattleMusicStop\n\ - ldr r0, _08020358 @ =0x00000161\n\ - bl PlayBGM\n\ - ldrb r0, [r5]\n\ - adds r0, 0x1\n\ - strb r0, [r5]\n\ -_08020316:\n\ - ldr r5, _0802035C @ =0x02000000\n\ - ldr r1, _08020360 @ =0x00016018\n\ - adds r0, r5, r1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _08020364 @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _08020332\n\ - b _0802051E\n\ -_08020332:\n\ - ldr r2, _08020368 @ =0x0001605f\n\ - adds r0, r5, r2\n\ - ldrb r0, [r0]\n\ - movs r3, 0x1\n\ - ands r3, r0\n\ - cmp r3, 0\n\ - beq _08020370\n\ - ldr r1, _0802036C @ =gBattleMoveDamage\n\ - mov r3, r10\n\ - ldrh r0, [r3]\n\ - str r0, [r1]\n\ - mov r8, r1\n\ - b _08020376\n\ - .align 2, 0\n\ -_0802034C: .4byte gBattleTypeFlags\n\ -_08020350: .4byte gBattleMons\n\ -_08020354: .4byte 0x0001601b\n\ -_08020358: .4byte 0x00000161\n\ -_0802035C: .4byte 0x02000000\n\ -_08020360: .4byte 0x00016018\n\ -_08020364: .4byte gPlayerParty\n\ -_08020368: .4byte 0x0001605f\n\ -_0802036C: .4byte gBattleMoveDamage\n\ -_08020370:\n\ - ldr r0, _080203EC @ =gBattleMoveDamage\n\ - str r3, [r0]\n\ - mov r8, r0\n\ -_08020376:\n\ - cmp r4, 0x19\n\ - bne _08020386\n\ - ldr r0, _080203F0 @ =gExpShareExp\n\ - ldrh r1, [r0]\n\ - mov r2, r8\n\ - ldr r0, [r2]\n\ - adds r0, r1\n\ - str r0, [r2]\n\ -_08020386:\n\ - cmp r4, 0x28\n\ - bne _0802039C\n\ - mov r3, r8\n\ - ldr r1, [r3]\n\ - movs r0, 0x96\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ -_0802039C:\n\ - ldr r0, _080203F4 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080203B8\n\ - ldr r4, _080203EC @ =gBattleMoveDamage\n\ - ldr r1, [r4]\n\ - movs r0, 0x96\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - str r0, [r4]\n\ -_080203B8:\n\ - ldr r0, _080203F8 @ =0x02000000\n\ - ldr r2, _080203FC @ =0x00016018\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _08020400 @ =gPlayerParty\n\ - adds r0, r1\n\ - bl IsTradedMon\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08020404\n\ - ldr r4, _080203EC @ =gBattleMoveDamage\n\ - ldr r1, [r4]\n\ - movs r0, 0x96\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - movs r7, 0xA5\n\ - lsls r7, 1\n\ - mov r8, r4\n\ - b _0802040A\n\ - .align 2, 0\n\ -_080203EC: .4byte gBattleMoveDamage\n\ -_080203F0: .4byte gExpShareExp\n\ -_080203F4: .4byte gBattleTypeFlags\n\ -_080203F8: .4byte 0x02000000\n\ -_080203FC: .4byte 0x00016018\n\ -_08020400: .4byte gPlayerParty\n\ -_08020404:\n\ - ldr r7, _0802043C @ =0x00000149\n\ - ldr r3, _08020440 @ =gBattleMoveDamage\n\ - mov r8, r3\n\ -_0802040A:\n\ - ldr r0, _08020444 @ =gBattleTypeFlags\n\ - ldrh r0, [r0]\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _08020488\n\ - ldr r1, _08020448 @ =gBattlePartyID\n\ - ldr r0, _0802044C @ =0x02000000\n\ - ldr r3, _08020450 @ =0x00016018\n\ - adds r2, r0, r3\n\ - ldrh r1, [r1, 0x4]\n\ - adds r5, r0, 0\n\ - ldr r4, _08020454 @ =gBitTable\n\ - ldr r3, _08020458 @ =gAbsentBankFlags\n\ - ldrb r2, [r2]\n\ - cmp r1, r2\n\ - bne _08020460\n\ - ldrb r1, [r3]\n\ - ldr r0, [r4, 0x8]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _08020460\n\ - ldr r0, _0802045C @ =0x000160a2\n\ - adds r1, r5, r0\n\ - b _0802047C\n\ - .align 2, 0\n\ -_0802043C: .4byte 0x00000149\n\ -_08020440: .4byte gBattleMoveDamage\n\ -_08020444: .4byte gBattleTypeFlags\n\ -_08020448: .4byte gBattlePartyID\n\ -_0802044C: .4byte 0x02000000\n\ -_08020450: .4byte 0x00016018\n\ -_08020454: .4byte gBitTable\n\ -_08020458: .4byte gAbsentBankFlags\n\ -_0802045C: .4byte 0x000160a2\n\ -_08020460:\n\ - ldrb r2, [r3]\n\ - ldr r0, [r4]\n\ - ands r2, r0\n\ - cmp r2, 0\n\ - bne _08020478\n\ - ldr r1, _08020474 @ =0x000160a2\n\ - adds r0, r5, r1\n\ - strb r2, [r0]\n\ - b _08020490\n\ - .align 2, 0\n\ -_08020474: .4byte 0x000160a2\n\ -_08020478:\n\ - ldr r2, _08020484 @ =0x000160a2\n\ - adds r1, r5, r2\n\ -_0802047C:\n\ - movs r0, 0x2\n\ - strb r0, [r1]\n\ - b _08020490\n\ - .align 2, 0\n\ -_08020484: .4byte 0x000160a2\n\ -_08020488:\n\ - ldr r0, _08020530 @ =0x02000000\n\ - ldr r3, _08020534 @ =0x000160a2\n\ - adds r0, r3\n\ - strb r1, [r0]\n\ -_08020490:\n\ - ldr r1, _08020538 @ =gBattleTextBuff1\n\ - movs r3, 0\n\ - movs r2, 0xFD\n\ - strb r2, [r1]\n\ - movs r5, 0x4\n\ - strb r5, [r1, 0x1]\n\ - ldr r4, _08020530 @ =0x02000000\n\ - ldr r0, _08020534 @ =0x000160a2\n\ - adds r6, r4, r0\n\ - ldrb r0, [r6]\n\ - strb r0, [r1, 0x2]\n\ - ldr r0, _0802053C @ =0x00016018\n\ - adds r4, r0\n\ - ldrb r0, [r4]\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _08020540 @ =gBattleTextBuff2\n\ - strb r2, [r1]\n\ - strb r3, [r1, 0x1]\n\ - strb r7, [r1, 0x2]\n\ - movs r3, 0xFF\n\ - lsls r3, 8\n\ - ands r7, r3\n\ - asrs r0, r7, 8\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _08020544 @ =gBattleTextBuff3\n\ - strb r2, [r1]\n\ - movs r0, 0x1\n\ - strb r0, [r1, 0x1]\n\ - strb r5, [r1, 0x2]\n\ - movs r0, 0x5\n\ - strb r0, [r1, 0x3]\n\ - mov r0, r8\n\ - ldr r2, [r0]\n\ - strb r2, [r1, 0x4]\n\ - adds r0, r2, 0\n\ - ands r0, r3\n\ - asrs r0, 8\n\ - strb r0, [r1, 0x5]\n\ - movs r0, 0xFF\n\ - lsls r0, 16\n\ - ands r0, r2\n\ - asrs r0, 16\n\ - strb r0, [r1, 0x6]\n\ - lsrs r2, 24\n\ - strb r2, [r1, 0x7]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - strb r0, [r1, 0x8]\n\ - ldrb r1, [r6]\n\ - movs r0, 0xD\n\ - bl PrepareStringBattle\n\ - ldrb r1, [r4]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _08020548 @ =gPlayerParty\n\ - adds r0, r1\n\ - ldr r3, _0802054C @ =gBattleMons\n\ - ldr r1, _08020550 @ =gBank1\n\ - ldrb r2, [r1]\n\ - movs r1, 0x58\n\ - muls r1, r2\n\ - adds r1, r3\n\ - ldrh r1, [r1]\n\ - bl MonGainEVs\n\ -_0802051E:\n\ - ldr r1, _08020530 @ =0x02000000\n\ - ldr r3, _08020554 @ =0x0001605f\n\ - adds r2, r1, r3\n\ - ldrb r0, [r2]\n\ - lsrs r0, 1\n\ - strb r0, [r2]\n\ - ldr r0, _08020558 @ =0x0001600f\n\ - adds r1, r0\n\ - b _08020618\n\ - .align 2, 0\n\ -_08020530: .4byte 0x02000000\n\ -_08020534: .4byte 0x000160a2\n\ -_08020538: .4byte gBattleTextBuff1\n\ -_0802053C: .4byte 0x00016018\n\ -_08020540: .4byte gBattleTextBuff2\n\ -_08020544: .4byte gBattleTextBuff3\n\ -_08020548: .4byte gPlayerParty\n\ -_0802054C: .4byte gBattleMons\n\ -_08020550: .4byte gBank1\n\ -_08020554: .4byte 0x0001605f\n\ -_08020558: .4byte 0x0001600f\n\ -_0802055C:\n\ - ldr r0, _08020620 @ =gBattleExecBuffer\n\ - ldr r2, [r0]\n\ - cmp r2, 0\n\ - beq _08020566\n\ - b _08020996\n\ -_08020566:\n\ - ldr r1, _08020624 @ =gBattleBufferB\n\ - ldr r4, _08020628 @ =0x02000000\n\ - ldr r3, _0802062C @ =0x000160a2\n\ - adds r3, r4\n\ - mov r8, r3\n\ - ldrb r0, [r3]\n\ - lsls r0, 9\n\ - adds r0, r1\n\ - strb r2, [r0]\n\ - ldr r0, _08020630 @ =0x00016018\n\ - adds r7, r4, r0\n\ - ldrb r0, [r7]\n\ - movs r6, 0x64\n\ - muls r0, r6\n\ - ldr r5, _08020634 @ =gPlayerParty\n\ - adds r0, r5\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08020612\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - cmp r0, 0x64\n\ - beq _08020612\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x3A\n\ - bl GetMonData\n\ - ldr r1, _08020638 @ =0x00017180\n\ - adds r4, r1\n\ - strh r0, [r4]\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x3B\n\ - bl GetMonData\n\ - strh r0, [r4, 0x2]\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x3C\n\ - bl GetMonData\n\ - strh r0, [r4, 0x4]\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x3D\n\ - bl GetMonData\n\ - strh r0, [r4, 0x6]\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x3E\n\ - bl GetMonData\n\ - strh r0, [r4, 0x8]\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - movs r1, 0x3F\n\ - bl GetMonData\n\ - strh r0, [r4, 0xA]\n\ - ldr r4, _0802063C @ =gActiveBank\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - strb r0, [r4]\n\ - ldrb r1, [r7]\n\ - ldr r0, _08020640 @ =gBattleMoveDamage\n\ - ldrh r2, [r0]\n\ - movs r0, 0\n\ - bl EmitExpBarUpdate\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08020612:\n\ - ldr r1, _08020628 @ =0x02000000\n\ - ldr r3, _08020644 @ =0x0001600f\n\ - adds r1, r3\n\ -_08020618:\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - b _08020996\n\ - .align 2, 0\n\ -_08020620: .4byte gBattleExecBuffer\n\ -_08020624: .4byte gBattleBufferB\n\ -_08020628: .4byte 0x02000000\n\ -_0802062C: .4byte 0x000160a2\n\ -_08020630: .4byte 0x00016018\n\ -_08020634: .4byte gPlayerParty\n\ -_08020638: .4byte 0x00017180\n\ -_0802063C: .4byte gActiveBank\n\ -_08020640: .4byte gBattleMoveDamage\n\ -_08020644: .4byte 0x0001600f\n\ -_08020648:\n\ - ldr r0, _080208AC @ =gBattleExecBuffer\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _08020652\n\ - b _08020996\n\ -_08020652:\n\ - ldr r1, _080208B0 @ =gActiveBank\n\ - ldr r4, _080208B4 @ =0x02000000\n\ - ldr r2, _080208B8 @ =0x000160a2\n\ - adds r0, r4, r2\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldr r2, _080208BC @ =gBattleBufferB\n\ - ldrb r3, [r1]\n\ - lsls r1, r3, 9\n\ - adds r0, r1, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x21\n\ - beq _0802066E\n\ - b _080208F0\n\ -_0802066E:\n\ - adds r0, r2, 0x1\n\ - adds r0, r1, r0\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xB\n\ - beq _0802067A\n\ - b _080208F0\n\ -_0802067A:\n\ - ldr r0, _080208C0 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080206A8\n\ - ldr r1, _080208C4 @ =gBattlePartyID\n\ - lsls r0, r3, 1\n\ - adds r2, r0, r1\n\ - ldr r0, _080208C8 @ =0x00016018\n\ - adds r1, r4, r0\n\ - ldrh r0, [r2]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bne _080206A8\n\ - adds r1, r0, 0\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _080208CC @ =gPlayerParty\n\ - adds r0, r1\n\ - adds r1, r3, 0\n\ - bl sub_80324F8\n\ -_080206A8:\n\ - ldr r1, _080208D0 @ =gBattleTextBuff1\n\ - movs r2, 0xFD\n\ - strb r2, [r1]\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x1]\n\ - ldr r5, _080208B0 @ =gActiveBank\n\ - ldrb r0, [r5]\n\ - strb r0, [r1, 0x2]\n\ - ldr r0, _080208B4 @ =0x02000000\n\ - ldr r3, _080208C8 @ =0x00016018\n\ - adds r6, r0, r3\n\ - ldrb r0, [r6]\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r4, _080208D4 @ =gBattleTextBuff2\n\ - strb r2, [r4]\n\ - movs r0, 0x1\n\ - strb r0, [r4, 0x1]\n\ - strb r0, [r4, 0x2]\n\ - movs r0, 0x3\n\ - strb r0, [r4, 0x3]\n\ - ldrb r0, [r6]\n\ - movs r1, 0x64\n\ - mov r8, r1\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - ldr r7, _080208CC @ =gPlayerParty\n\ - adds r0, r7\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - strb r0, [r4, 0x4]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - strb r0, [r4, 0x5]\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r2, _080208D8 @ =gLeveledUpInBattle\n\ - ldr r1, _080208DC @ =gBitTable\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r1, _080208E0 @ =gBattlescriptCurrInstr\n\ - ldr r0, _080208E4 @ =BattleScript_LevelUp\n\ - str r0, [r1]\n\ - ldr r4, _080208E8 @ =gBattleMoveDamage\n\ - ldr r2, _080208BC @ =gBattleBufferB\n\ - ldrb r1, [r5]\n\ - lsls r1, 9\n\ - adds r0, r2, 0x2\n\ - adds r0, r1, r0\n\ - ldrb r3, [r0]\n\ - adds r2, 0x3\n\ - adds r1, r2\n\ - ldrb r0, [r1]\n\ - lsls r0, 8\n\ - orrs r3, r0\n\ - str r3, [r4]\n\ - ldrb r0, [r6]\n\ - mov r3, r8\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - adds r0, r7\n\ - movs r1, 0\n\ - bl AdjustFriendship\n\ - ldr r0, _080208C4 @ =gBattlePartyID\n\ - ldrb r1, [r6]\n\ - ldrh r0, [r0]\n\ - cmp r0, r1\n\ - bne _080207EC\n\ - ldr r4, _080208EC @ =gBattleMons\n\ - ldrh r0, [r4, 0x28]\n\ - cmp r0, 0\n\ - beq _080207EC\n\ - mov r0, r8\n\ - muls r0, r1\n\ - adds r0, r7\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - adds r1, r4, 0\n\ - adds r1, 0x2A\n\ - strb r0, [r1]\n\ - ldrb r0, [r6]\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, r7\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - strh r0, [r4, 0x28]\n\ - ldrb r0, [r6]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - adds r0, r7\n\ - movs r1, 0x3A\n\ - bl GetMonData\n\ - strh r0, [r4, 0x2C]\n\ - ldrb r0, [r6]\n\ - mov r3, r8\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - adds r0, r7\n\ - movs r1, 0x3B\n\ - bl GetMonData\n\ - strh r0, [r4, 0x2]\n\ - ldrb r0, [r6]\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, r7\n\ - movs r1, 0x3C\n\ - bl GetMonData\n\ - strh r0, [r4, 0x4]\n\ - ldrb r0, [r6]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - adds r0, r7\n\ - movs r1, 0x3D\n\ - bl GetMonData\n\ - strh r0, [r4, 0x6]\n\ - ldrb r0, [r6]\n\ - mov r3, r8\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - adds r0, r7\n\ - movs r1, 0x3D\n\ - bl GetMonData\n\ - strh r0, [r4, 0x6]\n\ - ldrb r0, [r6]\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, r7\n\ - movs r1, 0x3E\n\ - bl GetMonData\n\ - strh r0, [r4, 0x8]\n\ - ldrb r0, [r6]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - adds r0, r7\n\ - movs r1, 0x3F\n\ - bl GetMonData\n\ - strh r0, [r4, 0xA]\n\ -_080207EC:\n\ - ldr r0, _080208C4 @ =gBattlePartyID\n\ - ldr r1, _080208B4 @ =0x02000000\n\ - ldr r3, _080208C8 @ =0x00016018\n\ - adds r7, r1, r3\n\ - ldrb r2, [r7]\n\ - ldrh r0, [r0, 0x4]\n\ - cmp r0, r2\n\ - bne _080208F6\n\ - ldr r6, _080208EC @ =gBattleMons\n\ - movs r0, 0xD8\n\ - adds r0, r6\n\ - mov r8, r0\n\ - ldrh r0, [r0]\n\ - cmp r0, 0\n\ - beq _080208F6\n\ - ldr r0, _080208C0 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080208F6\n\ - movs r5, 0x64\n\ - adds r0, r2, 0\n\ - muls r0, r5\n\ - ldr r4, _080208CC @ =gPlayerParty\n\ - adds r0, r4\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - adds r1, r6, 0\n\ - adds r1, 0xDA\n\ - strb r0, [r1]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - mov r1, r8\n\ - strh r0, [r1]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x3A\n\ - bl GetMonData\n\ - adds r1, r6, 0\n\ - adds r1, 0xDC\n\ - strh r0, [r1]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x3B\n\ - bl GetMonData\n\ - adds r1, r6, 0\n\ - adds r1, 0xB2\n\ - strh r0, [r1]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x3C\n\ - bl GetMonData\n\ - adds r1, r6, 0\n\ - adds r1, 0xB4\n\ - strh r0, [r1]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x3D\n\ - bl GetMonData\n\ - movs r2, 0xB6\n\ - adds r2, r6\n\ - mov r8, r2\n\ - strh r0, [r2]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x3D\n\ - bl GetMonData\n\ - mov r3, r8\n\ - strh r0, [r3]\n\ - ldrb r0, [r7]\n\ - muls r0, r5\n\ - adds r0, r4\n\ - movs r1, 0x3E\n\ - bl GetMonData\n\ - adds r1, r6, 0\n\ - adds r1, 0xB8\n\ - strh r0, [r1]\n\ - b _080208F6\n\ - .align 2, 0\n\ -_080208AC: .4byte gBattleExecBuffer\n\ -_080208B0: .4byte gActiveBank\n\ -_080208B4: .4byte 0x02000000\n\ -_080208B8: .4byte 0x000160a2\n\ -_080208BC: .4byte gBattleBufferB\n\ -_080208C0: .4byte gBattleTypeFlags\n\ -_080208C4: .4byte gBattlePartyID\n\ -_080208C8: .4byte 0x00016018\n\ -_080208CC: .4byte gPlayerParty\n\ -_080208D0: .4byte gBattleTextBuff1\n\ -_080208D4: .4byte gBattleTextBuff2\n\ -_080208D8: .4byte gLeveledUpInBattle\n\ -_080208DC: .4byte gBitTable\n\ -_080208E0: .4byte gBattlescriptCurrInstr\n\ -_080208E4: .4byte BattleScript_LevelUp\n\ -_080208E8: .4byte gBattleMoveDamage\n\ -_080208EC: .4byte gBattleMons\n\ -_080208F0:\n\ - ldr r1, _08020904 @ =gBattleMoveDamage\n\ - movs r0, 0\n\ - str r0, [r1]\n\ -_080208F6:\n\ - ldr r0, _08020908 @ =0x02000000\n\ - ldr r1, _0802090C @ =0x0001600f\n\ - adds r0, r1\n\ - movs r1, 0x5\n\ - strb r1, [r0]\n\ - b _08020996\n\ - .align 2, 0\n\ -_08020904: .4byte gBattleMoveDamage\n\ -_08020908: .4byte 0x02000000\n\ -_0802090C: .4byte 0x0001600f\n\ -_08020910:\n\ - ldr r0, _08020924 @ =gBattleMoveDamage\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _08020930\n\ - ldr r0, _08020928 @ =0x02000000\n\ - ldr r2, _0802092C @ =0x0001600f\n\ - adds r0, r2\n\ - movs r1, 0x3\n\ - strb r1, [r0]\n\ - b _08020996\n\ - .align 2, 0\n\ -_08020924: .4byte gBattleMoveDamage\n\ -_08020928: .4byte 0x02000000\n\ -_0802092C: .4byte 0x0001600f\n\ -_08020930:\n\ - ldr r2, _08020950 @ =0x02000000\n\ - ldr r3, _08020954 @ =0x00016018\n\ - adds r1, r2, r3\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x5\n\ - bhi _0802095C\n\ - ldr r0, _08020958 @ =0x0001600f\n\ - adds r1, r2, r0\n\ - movs r0, 0x2\n\ - strb r0, [r1]\n\ - b _08020996\n\ - .align 2, 0\n\ -_08020950: .4byte 0x02000000\n\ -_08020954: .4byte 0x00016018\n\ -_08020958: .4byte 0x0001600f\n\ -_0802095C:\n\ - ldr r3, _08020968 @ =0x0001600f\n\ - adds r1, r2, r3\n\ - movs r0, 0x6\n\ - strb r0, [r1]\n\ - b _08020996\n\ - .align 2, 0\n\ -_08020968: .4byte 0x0001600f\n\ -_0802096C:\n\ - ldr r0, _080209A4 @ =gBattleExecBuffer\n\ - ldr r5, [r0]\n\ - cmp r5, 0\n\ - bne _08020996\n\ - ldr r4, _080209A8 @ =gBattleMons\n\ - ldr r2, _080209AC @ =gBank1\n\ - ldrb r0, [r2]\n\ - movs r1, 0x58\n\ - muls r0, r1\n\ - adds r0, r4\n\ - movs r3, 0\n\ - strh r5, [r0, 0x2E]\n\ - ldrb r0, [r2]\n\ - muls r0, r1\n\ - adds r0, r4\n\ - adds r0, 0x20\n\ - strb r3, [r0]\n\ - ldr r1, _080209B0 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x2\n\ - str r0, [r1]\n\ -_08020996:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080209A4: .4byte gBattleExecBuffer\n\ -_080209A8: .4byte gBattleMons\n\ -_080209AC: .4byte gBank1\n\ -_080209B0: .4byte gBattlescriptCurrInstr\n\ - .syntax divided\n"); -} - -#endif // NONMATCHING - -#ifdef NONMATCHING -static void atk24(void) -{ - u16 HP_count = 0; - int i; - if (gBattleExecBuffer) {return;} - - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) - HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); - } - - if (HP_count == 0) - gBattleOutcome |= BATTLE_LOST; - - for (HP_count = 0, i = 0; i < 6; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)) - HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP); - } - - if (!HP_count) - gBattleOutcome |= BATTLE_WON; - - if (!gBattleOutcome && (gBattleTypeFlags & BATTLE_TYPE_LINK)) - { - register int found1 asm("r2"); - register int found2 asm("r4"); - - //I can't for the love of god decompile that part - - for (found1 = 0, i = 0; i < gNoOfAllBanks; i += 2) - { - if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40) - found1++; - } - - for (found2 = 0, i = 1; i < gNoOfAllBanks; i += 2) - { - if ((gHitMarker & HITMARKER_UNK(i)) && !gSpecialStatuses[i].flag40) - found2++; - } - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (found2 + found1 > 1) - gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; - } - else - { - if (found2 != 0 && found1 != 0) - gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; - } - } - else - gBattlescriptCurrInstr += 5; - -} -#else -__attribute__((naked)) -static void atk24(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - movs r6, 0\n\ - ldr r0, _08020AF0 @ =gBattleExecBuffer\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _080209C6\n\ - b _08020B46\n\ -_080209C6:\n\ - movs r5, 0\n\ -_080209C8:\n\ - movs r0, 0x64\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, _08020AF4 @ =gPlayerParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _080209F8\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _080209F8\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - adds r0, r6, r0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ -_080209F8:\n\ - adds r5, 0x1\n\ - cmp r5, 0x5\n\ - ble _080209C8\n\ - cmp r6, 0\n\ - bne _08020A0C\n\ - ldr r0, _08020AF8 @ =gBattleOutcome\n\ - ldrb r1, [r0]\n\ - movs r2, 0x2\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_08020A0C:\n\ - movs r6, 0\n\ - movs r5, 0\n\ -_08020A10:\n\ - movs r0, 0x64\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, _08020AFC @ =gEnemyParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08020A40\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _08020A40\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - adds r0, r6, r0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ -_08020A40:\n\ - adds r5, 0x1\n\ - cmp r5, 0x5\n\ - ble _08020A10\n\ - ldr r2, _08020AF8 @ =gBattleOutcome\n\ - cmp r6, 0\n\ - bne _08020A54\n\ - ldrb r0, [r2]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ -_08020A54:\n\ - ldrb r0, [r2]\n\ - cmp r0, 0\n\ - bne _08020B3E\n\ - ldr r2, _08020B00 @ =gBattleTypeFlags\n\ - ldrh r1, [r2]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - mov r8, r2\n\ - cmp r0, 0\n\ - beq _08020B3E\n\ - movs r2, 0\n\ - movs r5, 0\n\ - ldr r0, _08020B04 @ =gNoOfAllBanks\n\ - ldrb r3, [r0]\n\ - mov r12, r0\n\ - ldr r7, _08020B08 @ =gBattlescriptCurrInstr\n\ - cmp r2, r3\n\ - bge _08020AA0\n\ - ldr r0, _08020B0C @ =gHitMarker\n\ - movs r1, 0x80\n\ - lsls r1, 21\n\ - ldr r6, [r0]\n\ - adds r4, r3, 0\n\ - ldr r3, _08020B10 @ =gSpecialStatuses\n\ -_08020A84:\n\ - adds r0, r1, 0\n\ - lsls r0, r5\n\ - ands r0, r6\n\ - cmp r0, 0\n\ - beq _08020A98\n\ - ldrb r0, [r3]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08020A98\n\ - adds r2, 0x1\n\ -_08020A98:\n\ - adds r3, 0x28\n\ - adds r5, 0x2\n\ - cmp r5, r4\n\ - blt _08020A84\n\ -_08020AA0:\n\ - movs r4, 0\n\ - movs r5, 0x1\n\ - mov r0, r12\n\ - ldrb r3, [r0]\n\ - cmp r5, r3\n\ - bge _08020ADA\n\ - ldr r0, _08020B0C @ =gHitMarker\n\ - movs r1, 0x80\n\ - lsls r1, 21\n\ - mov r12, r1\n\ - ldr r1, [r0]\n\ - ldr r0, _08020B10 @ =gSpecialStatuses\n\ - adds r6, r3, 0\n\ - adds r3, r0, 0\n\ - adds r3, 0x14\n\ -_08020ABE:\n\ - mov r0, r12\n\ - lsls r0, r5\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08020AD2\n\ - ldrb r0, [r3]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08020AD2\n\ - adds r4, 0x1\n\ -_08020AD2:\n\ - adds r3, 0x28\n\ - adds r5, 0x2\n\ - cmp r5, r6\n\ - blt _08020ABE\n\ -_08020ADA:\n\ - mov r0, r8\n\ - ldrh r1, [r0]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08020B14\n\ - adds r0, r4, r2\n\ - cmp r0, 0x1\n\ - bgt _08020B1C\n\ - b _08020B36\n\ - .align 2, 0\n\ -_08020AF0: .4byte gBattleExecBuffer\n\ -_08020AF4: .4byte gPlayerParty\n\ -_08020AF8: .4byte gBattleOutcome\n\ -_08020AFC: .4byte gEnemyParty\n\ -_08020B00: .4byte gBattleTypeFlags\n\ -_08020B04: .4byte gNoOfAllBanks\n\ -_08020B08: .4byte gBattlescriptCurrInstr\n\ -_08020B0C: .4byte gHitMarker\n\ -_08020B10: .4byte gSpecialStatuses\n\ -_08020B14:\n\ - cmp r4, 0\n\ - beq _08020B36\n\ - cmp r2, 0\n\ - beq _08020B36\n\ -_08020B1C:\n\ - ldr r2, [r7]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - adds r1, r0\n\ - str r1, [r7]\n\ - b _08020B46\n\ -_08020B36:\n\ - ldr r0, [r7]\n\ - adds r0, 0x5\n\ - str r0, [r7]\n\ - b _08020B46\n\ -_08020B3E:\n\ - ldr r1, _08020B50 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ -_08020B46:\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08020B50: .4byte gBattlescriptCurrInstr\n\ - .syntax divided\n"); -} -#endif - -static void MoveValuesCleanUp(void) -{ - gBattleMoveFlags = 0; - BATTLE_STRUCT->dmgMultiplier = 1; - gCritMultiplier = 1; - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - gBattleCommunication[6] = 0; - gHitMarker &= ~(HITMARKER_DESTINYBOND); - gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); -} - -static void atk25_move_values_cleanup(void) -{ - MoveValuesCleanUp(); - gBattlescriptCurrInstr += 1; -} - -static void atk26_set_multihit(void) -{ - gMultiHitCounter = BSScriptRead8(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr += 2; -} - -static void atk27_decrement_multihit(void) -{ - if (--gMultiHitCounter == 0) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atk28_goto(void) -{ - gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atk29_jumpifbyte(void) -{ - u8 caseID = BSScriptRead8(gBattlescriptCurrInstr + 1); - u8* ptr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); - u8 value = BSScriptRead8(gBattlescriptCurrInstr + 6); - u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 7); - gBattlescriptCurrInstr += 11; - switch (caseID) - { - case CMP_EQUAL: - if (*ptr == value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NOT_EQUAL: - if (*ptr != value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_GREATER_THAN: - if (*ptr > value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_LESS_THAN: - if (*ptr < value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_COMMON_BITS: - if (*ptr & value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NO_COMMON_BITS: - if (!(*ptr & value)) - gBattlescriptCurrInstr = jump_loc; - break; - } -} - -static void atk2A_jumpifhalfword(void) -{ - u8 caseID = BSScriptRead8(gBattlescriptCurrInstr + 1); - u16* ptr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); - u16 value = BS2ScriptRead16(gBattlescriptCurrInstr + 6); - u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 8); - gBattlescriptCurrInstr += 12; - switch (caseID) - { - case CMP_EQUAL: - if (*ptr == value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NOT_EQUAL: - if (*ptr != value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_GREATER_THAN: - if (*ptr > value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_LESS_THAN: - if (*ptr < value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_COMMON_BITS: - if (*ptr & value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NO_COMMON_BITS: - if (!(*ptr & value)) - gBattlescriptCurrInstr = jump_loc; - break; - } -} - -static void atk2B_jumpifword(void) -{ - u8 caseID = BSScriptRead8(gBattlescriptCurrInstr + 1); - u32* ptr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); - u32 value = BSScriptRead32(gBattlescriptCurrInstr + 6); - u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 10); - gBattlescriptCurrInstr += 14; - switch (caseID) - { - case CMP_EQUAL: - if (*ptr == value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NOT_EQUAL: - if (*ptr != value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_GREATER_THAN: - if (*ptr > value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_LESS_THAN: - if (*ptr < value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_COMMON_BITS: - if (*ptr & value) - gBattlescriptCurrInstr = jump_loc; - break; - case CMP_NO_COMMON_BITS: - if (!(*ptr & value)) - gBattlescriptCurrInstr = jump_loc; - break; - } -} - -static void atk2C_jumpifarrayequal(void) -{ - //Mem1, Mem2, Size, Jump Loc - u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); - u32 size = BSScriptRead8(gBattlescriptCurrInstr + 9); - u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 10); - - u8 i; - for (i = 0; i < size; i++) - { - if (*mem1 != *mem2) - { - gBattlescriptCurrInstr += 14; - break; - } - mem1++, mem2++; - } - - if (i == size) - gBattlescriptCurrInstr = jump_loc; -} - -static void atk2D_jumpifarraynotequal(void) -{ - //Mem1, Mem2, Size, Jump Loc - u8 equal_bytes = 0; - u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); - u32 size = BSScriptRead8(gBattlescriptCurrInstr + 9); - u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 10); - - u8 i; - for (i = 0; i < size; i++) - { - if (*mem1 == *mem2) - { - equal_bytes++; - } - mem1++, mem2++; - } - - if (equal_bytes != size) - gBattlescriptCurrInstr = jump_loc; - else - gBattlescriptCurrInstr += 14; -} - -static void atk2E_setbyte(void) -{ - u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - *mem = BSScriptRead8(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr += 6; -} - -static void atk2F_addbyte(void) -{ - u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - *mem += BSScriptRead8(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr += 6; -} - -static void atk30_subbyte(void) -{ - u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - *mem -= BSScriptRead8(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr += 6; -} - -static void atk31_copyarray(void) -{ - u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); - s32 size = BSScriptRead8(gBattlescriptCurrInstr + 9); - - s32 i; - for (i = 0; i < size; i++) - { - mem1[i] = mem2[i]; - } - - gBattlescriptCurrInstr += 10; -} - -static void atk32_copyarray_withindex(void) -{ - u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); - u8* index = BS2ScriptReadPtr(gBattlescriptCurrInstr + 9); - s32 size = BSScriptRead8(gBattlescriptCurrInstr + 13); - - s32 i; - for (i = 0; i < size; i++) - { - mem1[i] = mem2[i + *index]; - } - - gBattlescriptCurrInstr += 14; -} - -static void atk33_orbyte(void) -{ - u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - *mem |= BSScriptRead8(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr += 6; -} - -static void atk34_orhalfword(void) -{ - u16* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u16 val = BS2ScriptRead16(gBattlescriptCurrInstr + 5); - - *mem |= val; - gBattlescriptCurrInstr += 7; -} - -static void atk35_orword(void) -{ - u32* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u32 val = BS2ScriptRead32(gBattlescriptCurrInstr + 5); - - *mem |= val; - gBattlescriptCurrInstr += 9; -} - -static void atk36_bicbyte(void) -{ - u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - *mem &= ~(BSScriptRead8(gBattlescriptCurrInstr + 5)); - gBattlescriptCurrInstr += 6; -} - -static void atk37_bichalfword(void) -{ - u16* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u16 val = BS2ScriptRead16(gBattlescriptCurrInstr + 5); - - *mem &= ~val; - gBattlescriptCurrInstr += 7; -} - -static void atk38_bicword(void) -{ - u32* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u32 val = BS2ScriptRead32(gBattlescriptCurrInstr + 5); - - *mem &= ~val; - gBattlescriptCurrInstr += 9; -} - -static void atk39_pause(void) -{ - if (gBattleExecBuffer == 0) - { - u16 value = BS2ScriptRead16(gBattlescriptCurrInstr + 1); - if (++gPauseCounterBattle >= value) - { - gPauseCounterBattle = 0; - gBattlescriptCurrInstr += 3; - } - } -} - -static void atk3A_waitstate(void) -{ - if (gBattleExecBuffer == 0) - gBattlescriptCurrInstr++; -} - -static void atk3B_healthbar_update(void) -{ - if (!BSScriptRead8(gBattlescriptCurrInstr + 1)) - gActiveBank = gBankTarget; - else - gActiveBank = gBankAttacker; - - EmitHealthBarUpdate(0, gBattleMoveDamage); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 2; -} - -static void atk3C_return(void) -{ - b_movescr_stack_pop_cursor(); -} - -static void atk3D_end(void) -{ - gBattleMoveFlags = 0; - gActiveBank = 0; - gFightStateTracker = 0xB; -} - -static void atk3E_end2(void) -{ - //not much difference between this and 3D. It's more apparent in Emerald - gActiveBank = 0; - gFightStateTracker = 0xB; -} - -static void atk3F_end3(void) //pops the main function stack -{ - b_movescr_stack_pop_cursor(); - if (B_FUNCTION_STACK->size) - B_FUNCTION_STACK->size--; - gBattleMainFunc = B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size]; -} - -static void atk41_call(void) -{ - b_movescr_stack_push(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atk42_jumpiftype2(void) //u8 bank, u8 type, *ptr -{ - u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - - if (BSScriptRead8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type1 || BSScriptRead8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type2) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 3); - else - gBattlescriptCurrInstr += 7; -} - -static void atk43_jumpifabilitypresent(void) -{ - if (AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, BSScriptRead8(gBattlescriptCurrInstr + 1), 0, 0)) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; -} - -static void atk44(void) -{ - unk_2000000[gBankAttacker + 0x16060] = 1; -} - -#ifdef NONMATCHING - -static void atk45_playanimation(void) -{ - #define ANIMATION_ID BSScriptRead8(gBattlescriptCurrInstr + 2) - #define ARGUMENT (u16*) BS2ScriptReadPtr(gBattlescriptCurrInstr + 3) - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - - if ( ANIMATION_ID == 1 || ANIMATION_ID == 0x11 || ANIMATION_ID == 2) { - EmitBattleAnimation(0, ANIMATION_ID, *argument); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 7; - } else if (gHitMarker & HITMARKER_NO_ANIMATIONS) { - b_movescr_stack_push(gBattlescriptCurrInstr + 7); - gBattlescriptCurrInstr = BattleScript_Pausex20; - } else { - if (((ANIMATION_ID - 10) > 3 && gStatuses3[gActiveBank] & (STATUS3_SEMI_INVULNERABLE))) { - gBattlescriptCurrInstr += 7; - } else { - EmitBattleAnimation(0, ANIMATION_ID, *argument); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 7; - } - } -} - -#else -__attribute__((naked)) -static void atk45_playanimation(void) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - ldr r5, _08021444 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r5]\n\ - ldrb r0, [r0, 0x1]\n\ - bl GetBattleBank\n\ - ldr r6, _08021448 @ =gActiveBank\n\ - strb r0, [r6]\n\ - ldr r2, [r5]\n\ - ldrb r1, [r2, 0x3]\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 8\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x5]\n\ - lsls r0, 16\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x6]\n\ - lsls r0, 24\n\ - adds r3, r1, r0\n\ - ldrb r4, [r2, 0x2]\n\ - adds r0, r4, 0\n\ - cmp r0, 0x1\n\ - beq _08021426\n\ - cmp r0, 0x11\n\ - beq _08021426\n\ - cmp r0, 0x2\n\ - bne _0802144C\n\ -_08021426:\n\ - ldr r4, _08021444 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - ldrb r1, [r0, 0x2]\n\ - ldrh r2, [r3]\n\ - movs r0, 0\n\ - bl EmitBattleAnimation\n\ - ldr r0, _08021448 @ =gActiveBank\n\ - ldrb r0, [r0]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, [r4]\n\ - adds r0, 0x7\n\ - str r0, [r4]\n\ - b _080214AE\n\ - .align 2, 0\n\ -_08021444: .4byte gBattlescriptCurrInstr\n\ -_08021448: .4byte gActiveBank\n\ -_0802144C:\n\ - ldr r0, _08021464 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802146C\n\ - adds r0, r2, 0x7\n\ - bl b_movescr_stack_push\n\ - ldr r0, _08021468 @ =BattleScript_Pausex20\n\ - b _080214AC\n\ - .align 2, 0\n\ -_08021464: .4byte gHitMarker\n\ -_08021468: .4byte BattleScript_Pausex20\n\ -_0802146C:\n\ - adds r0, r4, 0\n\ - subs r0, 0xA\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x3\n\ - bls _08021498\n\ - ldr r1, _08021490 @ =gStatuses3\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - ldr r1, _08021494 @ =0x000400c0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021498\n\ - adds r0, r2, 0x7\n\ - b _080214AC\n\ - .align 2, 0\n\ -_08021490: .4byte gStatuses3\n\ -_08021494: .4byte 0x000400c0\n\ -_08021498:\n\ - ldrb r1, [r2, 0x2]\n\ - ldrh r2, [r3]\n\ - movs r0, 0\n\ - bl EmitBattleAnimation\n\ - ldrb r0, [r6]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, [r5]\n\ - adds r0, 0x7\n\ -_080214AC:\n\ - str r0, [r5]\n\ -_080214AE:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided"); -} -#endif // NONMATCHING - -#ifdef NONMATCHING -static void atk46_playanimation2(void) -{ - -} - -#else -__attribute__((naked)) -static void atk46_playanimation2(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - ldr r6, _0802151C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r6]\n\ - ldrb r0, [r0, 0x1]\n\ - bl GetBattleBank\n\ - ldr r7, _08021520 @ =gActiveBank\n\ - strb r0, [r7]\n\ - ldr r2, [r6]\n\ - ldrb r1, [r2, 0x2]\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 8\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 16\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x5]\n\ - lsls r0, 24\n\ - adds r3, r1, r0\n\ - ldrb r1, [r2, 0x6]\n\ - ldrb r0, [r2, 0x7]\n\ - lsls r0, 8\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x8]\n\ - lsls r0, 16\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x9]\n\ - lsls r0, 24\n\ - adds r4, r1, r0\n\ - ldrb r5, [r3]\n\ - adds r0, r5, 0\n\ - cmp r0, 0x1\n\ - beq _080214FE\n\ - cmp r0, 0x11\n\ - beq _080214FE\n\ - cmp r0, 0x2\n\ - bne _08021524\n\ -_080214FE:\n\ - ldrb r1, [r3]\n\ - ldrh r2, [r4]\n\ - movs r0, 0\n\ - bl EmitBattleAnimation\n\ - ldr r0, _08021520 @ =gActiveBank\n\ - ldrb r0, [r0]\n\ - bl MarkBufferBankForExecution\n\ - ldr r1, _0802151C @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0xA\n\ - str r0, [r1]\n\ - b _0802157A\n\ - .align 2, 0\n\ -_0802151C: .4byte gBattlescriptCurrInstr\n\ -_08021520: .4byte gActiveBank\n\ -_08021524:\n\ - ldr r0, _08021534 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021538\n\ - adds r0, r2, 0\n\ - b _08021576\n\ - .align 2, 0\n\ -_08021534: .4byte gHitMarker\n\ -_08021538:\n\ - adds r0, r5, 0\n\ - subs r0, 0xA\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x3\n\ - bls _08021564\n\ - ldr r1, _0802155C @ =gStatuses3\n\ - ldrb r0, [r7]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - ldr r1, _08021560 @ =0x000400c0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021564\n\ - adds r0, r2, 0\n\ - b _08021576\n\ - .align 2, 0\n\ -_0802155C: .4byte gStatuses3\n\ -_08021560: .4byte 0x000400c0\n\ -_08021564:\n\ - ldrb r1, [r3]\n\ - ldrh r2, [r4]\n\ - movs r0, 0\n\ - bl EmitBattleAnimation\n\ - ldrb r0, [r7]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, [r6]\n\ -_08021576:\n\ - adds r0, 0xA\n\ - str r0, [r6]\n\ -_0802157A:\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided "); -} -#endif // NONMATCHING - -static void atk47_setgraphicalstatchangevalues(void) -{ - u8 to_add = 0; - switch (BATTLE_STRUCT->statChanger & 0xF0) - { - case 0x10: //+1 - to_add = 0xF; - break; - case 0x20: //+2 - to_add = 0x27; - break; - case 0x90: //-1 - to_add = 0x16; - break; - case 0xA0: //-2 - to_add = 0x2E; - break; - } - BATTLE_STRUCT->animArg1 = (BATTLE_STRUCT->statChanger & 0xF) + to_add - 1; - BATTLE_STRUCT->animArg2 = 0; - gBattlescriptCurrInstr++; -} - -#ifdef NONMATCHING -static void atk48_playstatchangeanimation(void) -{ - int curr_stat = 0; - u16 stat_animID = 0; - int changeable_stats = 0; - u32 stats_to_check; - u8 arg3; - - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - stats_to_check = BSScriptRead8(gBattlescriptCurrInstr + 2); - arg3 = BSScriptRead8(gBattlescriptCurrInstr + 3); - if (arg3 & 1) - { - u16 r1 = 0x15; - if (arg3 & 0x2) - r1 = 0x2D; - while (stats_to_check != 0) - { - if (!(stats_to_check & 1)) - continue; - if (!(BSScriptRead8(gBattlescriptCurrInstr + 3))) - { - u8 ability; - if (gSideTimer[GetBankIdentity(gActiveBank) & 1].mistTimer) - continue; - ability = gBattleMons[gActiveBank].ability; - if (ability == ABILITY_CLEAR_BODY || ability == ABILITY_WHITE_SMOKE || (ability == ABILITY_KEEN_EYE && curr_stat == 6) || (ability == ABILITY_HYPER_CUTTER && curr_stat == 1)) - continue; - } - if (gBattleMons[gActiveBank].statStages[curr_stat] > 0) - { - stat_animID = r1; - changeable_stats++; - } - - stats_to_check >>= 1; - r1 += 1; - curr_stat++; - } - if (changeable_stats > 1 && BSScriptRead8(gBattlescriptCurrInstr + 3) & 2) - stat_animID = 0x39; - else - stat_animID = 0x3A; - } - else - { - u16 r1 = 0x15; - if (arg3 & 0x2) - r1 = 0x2D; - while (stats_to_check != 0) - { - if (!(stats_to_check & 1)) - continue; - if (gBattleMons[gActiveBank].statStages[curr_stat] < 0xB) - { - stat_animID = r1; - changeable_stats++; - } - - stats_to_check >>= 1; - r1 += 1; - curr_stat++; - } - if (changeable_stats > 1 && BSScriptRead8(gBattlescriptCurrInstr + 3) & 2) - stat_animID = 0x37; - else - stat_animID = 0x38; - } - if ((BSScriptRead8(gBattlescriptCurrInstr + 3) & 2 && changeable_stats <= 1) - || changeable_stats == 0 || BATTLE_STRUCT->filler2[0] != 0) - gBattlescriptCurrInstr += 4; - else - { - EmitBattleAnimation(0, 1, stat_animID); - MarkBufferBankForExecution(gActiveBank); - if ((BSScriptRead8(gBattlescriptCurrInstr + 3) & 4) && changeable_stats > 1) - BATTLE_STRUCT->filler2[0] = 1; - gBattlescriptCurrInstr += 4; - } -} - -#else -__attribute__((naked)) -static void atk48_playstatchangeanimation(void) -{ - asm(".syntax unified\n\ -push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - movs r7, 0\n\ - movs r0, 0\n\ - mov r8, r0\n\ - movs r3, 0\n\ - ldr r5, _08021670 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r5]\n\ - ldrb r0, [r0, 0x1]\n\ - str r3, [sp]\n\ - bl GetBattleBank\n\ - ldr r2, _08021674 @ =gActiveBank\n\ - strb r0, [r2]\n\ - ldr r0, [r5]\n\ - ldrb r4, [r0, 0x2]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - ldr r3, [sp]\n\ - cmp r0, 0\n\ - beq _08021710\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - movs r1, 0x15\n\ - cmp r0, 0\n\ - beq _0802163C\n\ - movs r1, 0x2D\n\ -_0802163C:\n\ - cmp r4, 0\n\ - beq _080216E4\n\ - movs r0, 0x1\n\ - mov r10, r0\n\ - ldr r0, _08021678 @ =gUnknown_02024A98\n\ - mov r9, r0\n\ - lsls r5, r1, 16\n\ -_0802164A:\n\ - adds r0, r4, 0\n\ - mov r1, r10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080216D6\n\ - ldr r0, _08021670 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802167C\n\ - ldr r0, _08021674 @ =gActiveBank\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r7, r0\n\ - b _080216C4\n\ - .align 2, 0\n\ -_08021670: .4byte gBattlescriptCurrInstr\n\ -_08021674: .4byte gActiveBank\n\ -_08021678: .4byte gUnknown_02024A98\n\ -_0802167C:\n\ - ldr r6, _08021700 @ =gActiveBank\n\ - ldrb r0, [r6]\n\ - str r3, [sp]\n\ - bl GetBankIdentity\n\ - mov r1, r10\n\ - ands r1, r0\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _08021704 @ =gSideTimer\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - ldr r3, [sp]\n\ - cmp r0, 0\n\ - bne _080216D6\n\ - ldr r0, _08021708 @ =gBattleMons\n\ - ldrb r2, [r6]\n\ - movs r1, 0x58\n\ - muls r2, r1\n\ - adds r0, r2, r0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1D\n\ - beq _080216D6\n\ - cmp r0, 0x49\n\ - beq _080216D6\n\ - cmp r0, 0x33\n\ - bne _080216BA\n\ - cmp r7, 0x6\n\ - beq _080216D6\n\ -_080216BA:\n\ - cmp r0, 0x34\n\ - bne _080216C2\n\ - cmp r7, 0x1\n\ - beq _080216D6\n\ -_080216C2:\n\ - adds r0, r7, r2\n\ -_080216C4:\n\ - add r0, r9\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0\n\ - ble _080216D6\n\ - lsrs r0, r5, 16\n\ - mov r8, r0\n\ - adds r3, 0x1\n\ -_080216D6:\n\ - lsrs r4, 1\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - adds r5, r1\n\ - adds r7, 0x1\n\ - cmp r4, 0\n\ - bne _0802164A\n\ -_080216E4:\n\ - ldr r0, _0802170C @ =gBattlescriptCurrInstr\n\ - mov r9, r0\n\ - cmp r3, 0x1\n\ - ble _08021772\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - movs r1, 0x39\n\ - mov r8, r1\n\ - cmp r0, 0\n\ - beq _08021772\n\ - movs r0, 0x3A\n\ - b _08021770\n\ - .align 2, 0\n\ -_08021700: .4byte gActiveBank\n\ -_08021704: .4byte gSideTimer\n\ -_08021708: .4byte gBattleMons\n\ -_0802170C: .4byte gBattlescriptCurrInstr\n\ -_08021710:\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - movs r1, 0xE\n\ - cmp r0, 0\n\ - beq _0802171C\n\ - movs r1, 0x26\n\ -_0802171C:\n\ - mov r9, r5\n\ - cmp r4, 0\n\ - beq _08021758\n\ - ldr r6, _0802178C @ =gUnknown_02024A98\n\ - adds r5, r2, 0\n\ - lsls r2, r1, 16\n\ -_08021728:\n\ - movs r0, 0x1\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - beq _0802174A\n\ - ldrb r1, [r5]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r7, r0\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0xB\n\ - bgt _0802174A\n\ - lsrs r1, r2, 16\n\ - mov r8, r1\n\ - adds r3, 0x1\n\ -_0802174A:\n\ - lsrs r4, 1\n\ - movs r0, 0x80\n\ - lsls r0, 9\n\ - adds r2, r0\n\ - adds r7, 0x1\n\ - cmp r4, 0\n\ - bne _08021728\n\ -_08021758:\n\ - cmp r3, 0x1\n\ - ble _08021772\n\ - mov r1, r9\n\ - ldr r0, [r1]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - movs r1, 0x37\n\ - mov r8, r1\n\ - cmp r0, 0\n\ - beq _08021772\n\ - movs r0, 0x38\n\ -_08021770:\n\ - mov r8, r0\n\ -_08021772:\n\ - mov r1, r9\n\ - ldr r2, [r1]\n\ - ldrb r1, [r2, 0x3]\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021790\n\ - cmp r3, 0x1\n\ - bgt _08021790\n\ - adds r0, r2, 0x4\n\ - mov r1, r9\n\ - b _080217E6\n\ - .align 2, 0\n\ -_0802178C: .4byte gUnknown_02024A98\n\ -_08021790:\n\ - cmp r3, 0\n\ - beq _080217E0\n\ - ldr r0, _080217D0 @ =0x02000000\n\ - ldr r1, _080217D4 @ =0x000160dc\n\ - adds r4, r0, r1\n\ - ldrb r0, [r4]\n\ - cmp r0, 0\n\ - bne _080217E0\n\ - movs r0, 0\n\ - movs r1, 0x1\n\ - mov r2, r8\n\ - str r3, [sp]\n\ - bl EmitBattleAnimation\n\ - ldr r0, _080217D8 @ =gActiveBank\n\ - ldrb r0, [r0]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, _080217DC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x3]\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - ldr r3, [sp]\n\ - cmp r0, 0\n\ - beq _080217CC\n\ - cmp r3, 0x1\n\ - ble _080217CC\n\ - movs r0, 0x1\n\ - strb r0, [r4]\n\ -_080217CC:\n\ - ldr r1, _080217DC @ =gBattlescriptCurrInstr\n\ - b _080217E2\n\ - .align 2, 0\n\ -_080217D0: .4byte 0x02000000\n\ -_080217D4: .4byte 0x000160dc\n\ -_080217D8: .4byte gActiveBank\n\ -_080217DC: .4byte gBattlescriptCurrInstr\n\ -_080217E0:\n\ - mov r1, r9\n\ -_080217E2:\n\ - ldr r0, [r1]\n\ - adds r0, 0x4\n\ -_080217E6:\n\ - str r0, [r1]\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided"); -} - -#endif // NONMATCHING - -#ifdef NONMATCHING -static void atk49_moveendturn(void) -{ - int i; - int effect = 0; - u16 last_move = 0, *choiced_move_atk; - int arg1, arg2, hold_effect_atk, move_type; - if (gLastUsedMove != 0xFFFF) - last_move = gLastUsedMove; - - arg1 = BSScriptRead8(gBattlescriptCurrInstr + 1); - arg2 = BSScriptRead8(gBattlescriptCurrInstr + 2); - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - hold_effect_atk = gEnigmaBerries[gBankAttacker].holdEffect; - else - hold_effect_atk = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - - choiced_move_atk = (u16*)(gBankAttacker * 0x020160e8); - if (BATTLE_STRUCT->dynamicMoveType) - move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; - else - move_type = gBattleMoves[gCurrentMove].type; - - do - { - switch (BATTLE_STRUCT->cmd49StateTracker) - { - case 0: //rage check - if (gBattleMons[gBankTarget].status2 & STATUS2_RAGE - && gBattleMons[gBankTarget].hp && gBankAttacker != gBankTarget - && GetBankSide(gBankAttacker) != GetBankSide(gBankTarget) - && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT) && TARGET_TURN_DAMAGED - && gBattleMoves[gCurrentMove].power && gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] <= 0xB) - { - gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK]++; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = gUnknown_081D9132; - effect = 1; - } - BATTLE_STRUCT->cmd49StateTracker++; - break; - case 1: //defrosting check - if (gBattleMons[gBankTarget].status1 & STATUS_FREEZE - && gBattleMons[gBankTarget].hp && gBankAttacker != gBankTarget - && gSpecialStatuses[gBankTarget].moveturnLostHP - && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT) && move_type == TYPE_FIRE) - { - gBattleMons[gBankTarget].status1 &= ~(STATUS_FREEZE); - gActiveBank = gBankTarget; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); - MarkBufferBankForExecution(gActiveBank); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = gUnknown_081D955D; - effect = 1; - } - BATTLE_STRUCT->cmd49StateTracker++; - break; - case 2: //target synchronize - if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBankTarget, 0, 0, 0)) - effect = 1; - BATTLE_STRUCT->cmd49StateTracker++; - break; - case 3: //contact abilities - if (AbilityBattleEffects(ABILITYEFFECT_CONTACT, gBankTarget, 0, 0, 0)) - effect = 1; - BATTLE_STRUCT->cmd49StateTracker++; - break; - case 4: //status immunities - if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0)) - effect = 1; //it loops through 4 banks, so we increment after its done with all banks - else - BATTLE_STRUCT->cmd49StateTracker++; - break; - case 5: //attacker synchronize - if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBankAttacker, 0, 0, 0)) - effect = 1; - BATTLE_STRUCT->cmd49StateTracker++; - break; - case 6: //update choice band move - if (gHitMarker & HITMARKER_OBEYS && hold_effect_atk == HOLD_EFFECT_CHOICE_BAND - && gLastUsedMove != MOVE_STRUGGLE && (*choiced_move_atk == 0 || *choiced_move_atk == 0xFFF) - && gLastUsedMove != MOVE_BATON_PASS && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) - { - *choiced_move_atk = gLastUsedMove; - for (i = 0; i < 4 && gBattleMons[gBankAttacker].moves[i] != *choiced_move_atk; i++){} - if (i == 4) - *choiced_move_atk = 0; - } - BATTLE_STRUCT->cmd49StateTracker++; - break; - case 7: //changed held items - for (i = 0; i < gNoOfAllBanks; i++) - { - #define CHANGED_ITEM (((*u16)(0x020160f0))) - if (CHANGED_ITEM(i)) - gBattleMons[i].item = CHANGED_ITEM(i); - } - BATTLE_STRUCT->cmd49StateTracker++; - break; - case 8: //make sprite invisible - if (gStatuses3[gBankAttacker] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER) - && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - gActiveBank = gBankAttacker; - EmitSpriteInvisibility(0, 1); - MarkBufferBankForExecution(gActiveBank); - } - BATTLE_STRUCT->cmd49StateTracker++; - break; - //sub_8015660 CheckIfMoveFailed - case 9: //semi-invlurneable attacker make visible - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) || !(gStatuses3[gBankAttacker] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - || sub_8015660(gBankAttacker)) - { - gActiveBank = gBankAttacker; - EmitSpriteInvisibility(0, 0); - MarkBufferBankForExecution(gActiveBank); - gStatuses3 &= ~(STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER); - gSpecialStatuses[gBankAttacker].restored_bank_sprite = 1; - } - BATTLE_STRUCT->cmd49StateTracker++; - break; - case 10: //semi-invlurneable target make visible - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) || !(gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - || sub_8015660(gBankTarget)) - { - gActiveBank = gBankTarget; - EmitSpriteInvisibility(0, 0); - MarkBufferBankForExecution(gActiveBank); - gStatuses3 &= ~(STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER); - gSpecialStatuses[gBankTarget].restored_bank_sprite = 1; - } - BATTLE_STRUCT->cmd49StateTracker++; - break; - case 11: // - } - - } while (effect == 0) -} -#else -__attribute__((naked)) -static void atk49_moveendturn(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x18\n\ - movs r0, 0\n\ - mov r10, r0\n\ - ldr r0, _08021834 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x1]\n\ - str r1, [sp, 0x10]\n\ - ldrb r0, [r0, 0x2]\n\ - str r0, [sp, 0x14]\n\ - ldr r1, _08021838 @ =gBattleMons\n\ - ldr r0, _0802183C @ =gBankAttacker\n\ - ldrb r2, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r1, r0, r1\n\ - ldrh r0, [r1, 0x2E]\n\ - cmp r0, 0xAF\n\ - bne _08021844\n\ - ldr r1, _08021840 @ =gEnigmaBerries\n\ - lsls r0, r2, 3\n\ - subs r0, r2\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x7]\n\ - b _0802184E\n\ - .align 2, 0\n\ -_08021834: .4byte gBattlescriptCurrInstr\n\ -_08021838: .4byte gBattleMons\n\ -_0802183C: .4byte gBankAttacker\n\ -_08021840: .4byte gEnigmaBerries\n\ -_08021844:\n\ - ldrh r0, [r1, 0x2E]\n\ - bl ItemId_GetHoldEffect\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ -_0802184E:\n\ - str r0, [sp, 0x8]\n\ - ldr r0, _0802186C @ =gBankAttacker\n\ - ldrb r1, [r0]\n\ - lsls r1, 1\n\ - ldr r0, _08021870 @ =0x020160e8\n\ - adds r1, r0\n\ - str r1, [sp, 0xC]\n\ - subs r0, 0xCC\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _080218C0\n\ - movs r2, 0x3F\n\ - ands r2, r0\n\ - str r2, [sp, 0x4]\n\ - b _080218D2\n\ - .align 2, 0\n\ -_0802186C: .4byte gBankAttacker\n\ -_08021870: .4byte 0x020160e8\n\ -_08021874:\n\ - strb r2, [r7]\n\ - ldr r0, [r5]\n\ - orrs r0, r6\n\ - str r0, [r5]\n\ - ldr r0, _080218AC @ =0x02000000\n\ - ldr r3, _080218B0 @ =0x0001600c\n\ - adds r0, r3\n\ - strb r4, [r0]\n\ - bl MoveValuesCleanUp\n\ - ldr r2, _080218B4 @ =gBattleScriptsEffectsTable\n\ - mov r4, r8\n\ - ldrh r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - add r0, r9\n\ - ldrb r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldr r0, [r0]\n\ - bl b_movescr_stack_push\n\ - ldr r1, _080218B8 @ =gBattlescriptCurrInstr\n\ - ldr r0, _080218BC @ =gUnknown_081D9B2D\n\ - bl _0802229C\n\ - .align 2, 0\n\ -_080218AC: .4byte 0x02000000\n\ -_080218B0: .4byte 0x0001600c\n\ -_080218B4: .4byte gBattleScriptsEffectsTable\n\ -_080218B8: .4byte gBattlescriptCurrInstr\n\ -_080218BC: .4byte gUnknown_081D9B2D\n\ -_080218C0:\n\ - ldr r2, _080218D8 @ =gBattleMoves\n\ - ldr r0, _080218DC @ =gCurrentMove\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0, 0x2]\n\ - str r0, [sp, 0x4]\n\ -_080218D2:\n\ - ldr r5, _080218E0 @ =0x02000000\n\ - mov r12, r5\n\ - b _080218EE\n\ - .align 2, 0\n\ -_080218D8: .4byte gBattleMoves\n\ -_080218DC: .4byte gCurrentMove\n\ -_080218E0: .4byte 0x02000000\n\ -_080218E4:\n\ - mov r0, r10\n\ - cmp r0, 0\n\ - beq _080218EE\n\ - bl _08022286\n\ -_080218EE:\n\ - ldr r0, _08021908 @ =0x0001600c\n\ - add r0, r12\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x11\n\ - bls _080218FC\n\ - bl _0802224E\n\ -_080218FC:\n\ - lsls r0, 2\n\ - ldr r1, _0802190C @ =_08021910\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_08021908: .4byte 0x0001600c\n\ -_0802190C: .4byte _08021910\n\ - .align 2, 0\n\ -_08021910:\n\ - .4byte _08021958\n\ - .4byte _08021A34\n\ - .4byte _08021AF0\n\ - .4byte _08021B20\n\ - .4byte _08021B44\n\ - .4byte _08021B78\n\ - .4byte _08021B9C\n\ - .4byte _08021C40\n\ - .4byte _08021C78\n\ - .4byte _08021CA8\n\ - .4byte _08021CCC\n\ - .4byte _08021D18\n\ - .4byte _08021DAC\n\ - .4byte _08021E30\n\ - .4byte _08021E70\n\ - .4byte _08022068\n\ - .4byte _080221C0\n\ - .4byte _0802224E\n\ -_08021958:\n\ - ldr r5, _08021A08 @ =gBattleMons\n\ - ldr r2, _08021A0C @ =gBankTarget\n\ - ldrb r4, [r2]\n\ - movs r6, 0x58\n\ - adds r3, r4, 0\n\ - muls r3, r6\n\ - adds r0, r5, 0\n\ - adds r0, 0x50\n\ - adds r0, r3, r0\n\ - ldr r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 16\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _080219FE\n\ - adds r0, r3, r5\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _080219FE\n\ - ldr r0, _08021A10 @ =gBankAttacker\n\ - ldrb r1, [r0]\n\ - cmp r1, r4\n\ - beq _080219FE\n\ - adds r0, r1, 0\n\ - bl GetBankSide\n\ - adds r4, r0, 0\n\ - ldr r1, _08021A0C @ =gBankTarget\n\ - ldrb r0, [r1]\n\ - bl GetBankSide\n\ - lsls r4, 24\n\ - lsls r0, 24\n\ - cmp r4, r0\n\ - beq _080219FE\n\ - ldr r0, _08021A14 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080219FE\n\ - ldr r2, _08021A18 @ =gProtectStructs\n\ - ldr r4, _08021A0C @ =gBankTarget\n\ - ldrb r3, [r4]\n\ - lsls r1, r3, 4\n\ - adds r0, r2, 0x4\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _080219C8\n\ - adds r0, r2, 0\n\ - adds r0, 0x8\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _080219FE\n\ -_080219C8:\n\ - ldr r2, _08021A1C @ =gBattleMoves\n\ - ldr r0, _08021A20 @ =gCurrentMove\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0, 0x1]\n\ - cmp r0, 0\n\ - beq _080219FE\n\ - adds r0, r3, 0\n\ - muls r0, r6\n\ - adds r1, r0, r5\n\ - ldrb r2, [r1, 0x19]\n\ - movs r0, 0x19\n\ - ldrsb r0, [r1, r0]\n\ - cmp r0, 0xB\n\ - bgt _080219FE\n\ - adds r0, r2, 0x1\n\ - strb r0, [r1, 0x19]\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _08021A24 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08021A28 @ =gUnknown_081D9132\n\ - str r0, [r1]\n\ - movs r5, 0x1\n\ - mov r10, r5\n\ -_080219FE:\n\ - ldr r2, _08021A2C @ =0x02000000\n\ - ldr r0, _08021A30 @ =0x0001600c\n\ - adds r1, r2, r0\n\ - b _08021E00\n\ - .align 2, 0\n\ -_08021A08: .4byte gBattleMons\n\ -_08021A0C: .4byte gBankTarget\n\ -_08021A10: .4byte gBankAttacker\n\ -_08021A14: .4byte gBattleMoveFlags\n\ -_08021A18: .4byte gProtectStructs\n\ -_08021A1C: .4byte gBattleMoves\n\ -_08021A20: .4byte gCurrentMove\n\ -_08021A24: .4byte gBattlescriptCurrInstr\n\ -_08021A28: .4byte gUnknown_081D9132\n\ -_08021A2C: .4byte 0x02000000\n\ -_08021A30: .4byte 0x0001600c\n\ -_08021A34:\n\ - ldr r2, _08021AD0 @ =gBattleMons\n\ - ldr r1, _08021AD4 @ =gBankTarget\n\ - ldrb r4, [r1]\n\ - movs r3, 0x58\n\ - mov r12, r3\n\ - mov r3, r12\n\ - muls r3, r4\n\ - adds r7, r2, 0\n\ - adds r7, 0x4C\n\ - adds r6, r3, r7\n\ - ldr r5, [r6]\n\ - movs r0, 0x20\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - bne _08021A54\n\ - b _08021DFA\n\ -_08021A54:\n\ - adds r0, r3, r2\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _08021A5E\n\ - b _08021DFA\n\ -_08021A5E:\n\ - ldr r0, _08021AD8 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - cmp r0, r4\n\ - bne _08021A68\n\ - b _08021DFA\n\ -_08021A68:\n\ - ldr r0, _08021ADC @ =gSpecialStatuses\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 2\n\ - adds r0, 0xC\n\ - adds r1, r0\n\ - ldr r0, [r1]\n\ - cmp r0, 0\n\ - bne _08021A7C\n\ - b _08021DFA\n\ -_08021A7C:\n\ - ldr r0, _08021AE0 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021A8A\n\ - b _08021DFA\n\ -_08021A8A:\n\ - ldr r4, [sp, 0x4]\n\ - cmp r4, 0xA\n\ - beq _08021A92\n\ - b _08021DFA\n\ -_08021A92:\n\ - movs r0, 0x21\n\ - negs r0, r0\n\ - ands r5, r0\n\ - str r5, [r6]\n\ - ldr r4, _08021AE4 @ =gActiveBank\n\ - ldr r5, _08021AD4 @ =gBankTarget\n\ - ldrb r0, [r5]\n\ - strb r0, [r4]\n\ - ldrb r0, [r5]\n\ - mov r1, r12\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, r7\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x28\n\ - movs r2, 0\n\ - movs r3, 0x4\n\ - bl EmitSetAttributes\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _08021AE8 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08021AEC @ =gUnknown_081D955D\n\ - str r0, [r1]\n\ - movs r2, 0x1\n\ - mov r10, r2\n\ - b _08021DFA\n\ - .align 2, 0\n\ -_08021AD0: .4byte gBattleMons\n\ -_08021AD4: .4byte gBankTarget\n\ -_08021AD8: .4byte gBankAttacker\n\ -_08021ADC: .4byte gSpecialStatuses\n\ -_08021AE0: .4byte gBattleMoveFlags\n\ -_08021AE4: .4byte gActiveBank\n\ -_08021AE8: .4byte gBattlescriptCurrInstr\n\ -_08021AEC: .4byte gUnknown_081D955D\n\ -_08021AF0:\n\ - ldr r0, _08021B14 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0x7\n\ - movs r2, 0\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08021B0C\n\ - movs r4, 0x1\n\ - mov r10, r4\n\ -_08021B0C:\n\ - ldr r2, _08021B18 @ =0x02000000\n\ - ldr r5, _08021B1C @ =0x0001600c\n\ - adds r1, r2, r5\n\ - b _08021E00\n\ - .align 2, 0\n\ -_08021B14: .4byte gBankTarget\n\ -_08021B18: .4byte 0x02000000\n\ -_08021B1C: .4byte 0x0001600c\n\ -_08021B20:\n\ - ldr r0, _08021B40 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0x4\n\ - movs r2, 0\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08021B3A\n\ - b _08021DFA\n\ -_08021B3A:\n\ - movs r0, 0x1\n\ - mov r10, r0\n\ - b _08021DFA\n\ - .align 2, 0\n\ -_08021B40: .4byte gBankTarget\n\ -_08021B44:\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0x5\n\ - movs r1, 0\n\ - movs r2, 0\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08021B68\n\ - movs r4, 0x1\n\ - mov r10, r4\n\ - ldr r5, _08021B64 @ =0x02000000\n\ - mov r12, r5\n\ - b _0802224E\n\ - .align 2, 0\n\ -_08021B64: .4byte 0x02000000\n\ -_08021B68:\n\ - ldr r2, _08021B70 @ =0x02000000\n\ - ldr r0, _08021B74 @ =0x0001600c\n\ - adds r1, r2, r0\n\ - b _08021E00\n\ - .align 2, 0\n\ -_08021B70: .4byte 0x02000000\n\ -_08021B74: .4byte 0x0001600c\n\ -_08021B78:\n\ - ldr r0, _08021B98 @ =gBankAttacker\n\ - ldrb r1, [r0]\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0x8\n\ - movs r2, 0\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08021B92\n\ - b _08021DFA\n\ -_08021B92:\n\ - movs r1, 0x1\n\ - mov r10, r1\n\ - b _08021DFA\n\ - .align 2, 0\n\ -_08021B98: .4byte gBankAttacker\n\ -_08021B9C:\n\ - ldr r0, _08021C28 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 18\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021BE0\n\ - ldr r4, [sp, 0x8]\n\ - cmp r4, 0x1D\n\ - bne _08021BE0\n\ - ldr r0, _08021C2C @ =gUnknown_02024BE8\n\ - ldrh r2, [r0]\n\ - adds r7, r0, 0\n\ - cmp r2, 0xA5\n\ - beq _08021BE0\n\ - ldr r5, [sp, 0xC]\n\ - ldrh r1, [r5]\n\ - cmp r1, 0\n\ - beq _08021BC8\n\ - ldr r0, _08021C30 @ =0x0000ffff\n\ - cmp r1, r0\n\ - bne _08021BE0\n\ -_08021BC8:\n\ - cmp r2, 0xE2\n\ - bne _08021BDA\n\ - ldr r0, _08021C34 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x20\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08021BDA\n\ - b _08022244\n\ -_08021BDA:\n\ - ldrh r0, [r7]\n\ - ldr r1, [sp, 0xC]\n\ - strh r0, [r1]\n\ -_08021BE0:\n\ - movs r4, 0\n\ - ldr r2, _08021C38 @ =gBattleMons\n\ - ldr r3, _08021C3C @ =gBankAttacker\n\ - ldrb r1, [r3]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r2, 0xC\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - ldr r5, [sp, 0xC]\n\ - ldrh r1, [r5]\n\ - mov r9, r3\n\ - cmp r0, r1\n\ - beq _08021C18\n\ - mov r6, r9\n\ - movs r3, 0x58\n\ - adds r5, r1, 0\n\ -_08021C02:\n\ - adds r4, 0x1\n\ - cmp r4, 0x3\n\ - bgt _08021C18\n\ - lsls r0, r4, 1\n\ - ldrb r1, [r6]\n\ - muls r1, r3\n\ - adds r0, r1\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - cmp r0, r5\n\ - bne _08021C02\n\ -_08021C18:\n\ - cmp r4, 0x4\n\ - beq _08021C1E\n\ - b _08022244\n\ -_08021C1E:\n\ - movs r0, 0\n\ - ldr r1, [sp, 0xC]\n\ -_08021C22:\n\ - strh r0, [r1]\n\ - b _08022244\n\ - .align 2, 0\n\ -_08021C28: .4byte gHitMarker\n\ -_08021C2C: .4byte gUnknown_02024BE8\n\ -_08021C30: .4byte 0x0000ffff\n\ -_08021C34: .4byte gBattleMoveFlags\n\ -_08021C38: .4byte gBattleMons\n\ -_08021C3C: .4byte gBankAttacker\n\ -_08021C40:\n\ - movs r4, 0\n\ - ldr r0, _08021C6C @ =gNoOfAllBanks\n\ - ldrb r2, [r0]\n\ - cmp r4, r2\n\ - blt _08021C4C\n\ - b _08022244\n\ -_08021C4C:\n\ - movs r5, 0\n\ - ldr r2, _08021C70 @ =0x020160f0\n\ - ldr r3, _08021C74 @ =gBattleMons\n\ -_08021C52:\n\ - ldrh r1, [r2]\n\ - cmp r1, 0\n\ - beq _08021C5C\n\ - strh r1, [r3, 0x2E]\n\ - strh r5, [r2]\n\ -_08021C5C:\n\ - adds r2, 0x2\n\ - adds r3, 0x58\n\ - adds r4, 0x1\n\ - ldrb r1, [r0]\n\ - cmp r4, r1\n\ - blt _08021C52\n\ - b _08022244\n\ - .align 2, 0\n\ -_08021C6C: .4byte gNoOfAllBanks\n\ -_08021C70: .4byte 0x020160f0\n\ -_08021C74: .4byte gBattleMons\n\ -_08021C78:\n\ - movs r0, 0x3\n\ - movs r1, 0\n\ - movs r2, 0\n\ - bl ItemBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08021C98\n\ - movs r2, 0x1\n\ - mov r10, r2\n\ - ldr r3, _08021C94 @ =0x02000000\n\ - mov r12, r3\n\ - b _0802224E\n\ - .align 2, 0\n\ -_08021C94: .4byte 0x02000000\n\ -_08021C98:\n\ - ldr r2, _08021CA0 @ =0x02000000\n\ - ldr r4, _08021CA4 @ =0x0001600c\n\ - adds r1, r2, r4\n\ - b _08021E00\n\ - .align 2, 0\n\ -_08021CA0: .4byte 0x02000000\n\ -_08021CA4: .4byte 0x0001600c\n\ -_08021CA8:\n\ - movs r0, 0x4\n\ - movs r1, 0\n\ - movs r2, 0\n\ - bl ItemBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08021CBC\n\ - movs r5, 0x1\n\ - mov r10, r5\n\ -_08021CBC:\n\ - ldr r2, _08021CC4 @ =0x02000000\n\ - ldr r0, _08021CC8 @ =0x0001600c\n\ - adds r1, r2, r0\n\ - b _08021E00\n\ - .align 2, 0\n\ -_08021CC4: .4byte 0x02000000\n\ -_08021CC8: .4byte 0x0001600c\n\ -_08021CCC:\n\ - ldr r1, _08021D04 @ =gStatuses3\n\ - ldr r0, _08021D08 @ =gBankAttacker\n\ - ldrb r2, [r0]\n\ - lsls r0, r2, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - ldr r1, _08021D0C @ =0x000400c0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08021CE2\n\ - b _08021DFA\n\ -_08021CE2:\n\ - ldr r0, _08021D10 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08021CF0\n\ - b _08021DFA\n\ -_08021CF0:\n\ - ldr r4, _08021D14 @ =gActiveBank\n\ - strb r2, [r4]\n\ - movs r0, 0\n\ - movs r1, 0x1\n\ - bl EmitSpriteInvisibility\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08021DFA\n\ - .align 2, 0\n\ -_08021D04: .4byte gStatuses3\n\ -_08021D08: .4byte gBankAttacker\n\ -_08021D0C: .4byte 0x000400c0\n\ -_08021D10: .4byte gHitMarker\n\ -_08021D14: .4byte gActiveBank\n\ -_08021D18:\n\ - ldr r0, _08021D88 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08021D44\n\ - ldr r1, _08021D8C @ =gStatuses3\n\ - ldr r0, _08021D90 @ =gBankAttacker\n\ - ldrb r2, [r0]\n\ - lsls r0, r2, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - ldr r1, _08021D94 @ =0x000400c0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021D44\n\ - adds r0, r2, 0\n\ - bl sub_8015660\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08021D7E\n\ -_08021D44:\n\ - ldr r4, _08021D98 @ =gActiveBank\n\ - ldr r5, _08021D90 @ =gBankAttacker\n\ - ldrb r0, [r5]\n\ - strb r0, [r4]\n\ - movs r0, 0\n\ - movs r1, 0\n\ - bl EmitSpriteInvisibility\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, _08021D8C @ =gStatuses3\n\ - ldrb r2, [r5]\n\ - lsls r2, 2\n\ - adds r2, r0\n\ - ldr r0, [r2]\n\ - ldr r1, _08021D9C @ =0xfffbff3f\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r2, _08021DA0 @ =gSpecialStatuses\n\ - ldrb r1, [r5]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r2, 0x4\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_08021D7E:\n\ - ldr r2, _08021DA4 @ =0x02000000\n\ - ldr r4, _08021DA8 @ =0x0001600c\n\ - adds r1, r2, r4\n\ - b _08021E00\n\ - .align 2, 0\n\ -_08021D88: .4byte gBattleMoveFlags\n\ -_08021D8C: .4byte gStatuses3\n\ -_08021D90: .4byte gBankAttacker\n\ -_08021D94: .4byte 0x000400c0\n\ -_08021D98: .4byte gActiveBank\n\ -_08021D9C: .4byte 0xfffbff3f\n\ -_08021DA0: .4byte gSpecialStatuses\n\ -_08021DA4: .4byte 0x02000000\n\ -_08021DA8: .4byte 0x0001600c\n\ -_08021DAC:\n\ - ldr r2, _08021E0C @ =gSpecialStatuses\n\ - ldr r1, _08021E10 @ =gBankTarget\n\ - ldrb r3, [r1]\n\ - lsls r4, r3, 2\n\ - adds r0, r4, r3\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 29\n\ - cmp r0, 0\n\ - blt _08021DFA\n\ - ldr r0, _08021E14 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r3, r0\n\ - bcs _08021DFA\n\ - ldr r5, _08021E18 @ =gStatuses3\n\ - adds r0, r4, r5\n\ - ldr r0, [r0]\n\ - ldr r1, _08021E1C @ =0x000400c0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08021DFA\n\ - ldr r4, _08021E20 @ =gActiveBank\n\ - strb r3, [r4]\n\ - movs r0, 0\n\ - movs r1, 0\n\ - bl EmitSpriteInvisibility\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, _08021E10 @ =gBankTarget\n\ - ldrb r2, [r0]\n\ - lsls r2, 2\n\ - adds r2, r5\n\ - ldr r0, [r2]\n\ - ldr r1, _08021E24 @ =0xfffbff3f\n\ - ands r0, r1\n\ - str r0, [r2]\n\ -_08021DFA:\n\ - ldr r2, _08021E28 @ =0x02000000\n\ - ldr r3, _08021E2C @ =0x0001600c\n\ - adds r1, r2, r3\n\ -_08021E00:\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - mov r12, r2\n\ - b _0802224E\n\ - .align 2, 0\n\ -_08021E0C: .4byte gSpecialStatuses\n\ -_08021E10: .4byte gBankTarget\n\ -_08021E14: .4byte gNoOfAllBanks\n\ -_08021E18: .4byte gStatuses3\n\ -_08021E1C: .4byte 0x000400c0\n\ -_08021E20: .4byte gActiveBank\n\ -_08021E24: .4byte 0xfffbff3f\n\ -_08021E28: .4byte 0x02000000\n\ -_08021E2C: .4byte 0x0001600c\n\ -_08021E30:\n\ - movs r4, 0\n\ - ldr r0, _08021E60 @ =gNoOfAllBanks\n\ - ldrb r5, [r0]\n\ - cmp r4, r5\n\ - blt _08021E3C\n\ - b _08022244\n\ -_08021E3C:\n\ - ldr r2, _08021E64 @ =gDisableStructs\n\ - ldr r5, _08021E68 @ =0xfeffffff\n\ - adds r3, r0, 0\n\ - ldr r1, _08021E6C @ =gUnknown_02024AD0\n\ -_08021E44:\n\ - ldrb r0, [r2, 0xA]\n\ - cmp r0, 0\n\ - bne _08021E50\n\ - ldr r0, [r1]\n\ - ands r0, r5\n\ - str r0, [r1]\n\ -_08021E50:\n\ - adds r2, 0x1C\n\ - adds r1, 0x58\n\ - adds r4, 0x1\n\ - ldrb r0, [r3]\n\ - cmp r4, r0\n\ - blt _08021E44\n\ - b _08022244\n\ - .align 2, 0\n\ -_08021E60: .4byte gNoOfAllBanks\n\ -_08021E64: .4byte gDisableStructs\n\ -_08021E68: .4byte 0xfeffffff\n\ -_08021E6C: .4byte gUnknown_02024AD0\n\ -_08021E70:\n\ - ldr r1, _08021F2C @ =gHitMarker\n\ - ldr r3, [r1]\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - ands r0, r3\n\ - ldr r2, _08021F30 @ =gBankAttacker\n\ - mov r9, r2\n\ - adds r5, r1, 0\n\ - cmp r0, 0\n\ - beq _08021E9A\n\ - ldr r0, _08021F34 @ =gActiveBank\n\ - ldrb r2, [r2]\n\ - strb r2, [r0]\n\ - ldr r1, _08021F38 @ =gBankTarget\n\ - ldrb r0, [r1]\n\ - mov r4, r9\n\ - strb r0, [r4]\n\ - strb r2, [r1]\n\ - ldr r0, _08021F3C @ =0xffffefff\n\ - ands r3, r0\n\ - str r3, [r5]\n\ -_08021E9A:\n\ - ldr r1, _08021F40 @ =gBattleMoves\n\ - ldr r2, _08021F44 @ =gUnknown_02024BE8\n\ - ldrh r3, [r2]\n\ - lsls r0, r3, 1\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - mov r8, r1\n\ - adds r7, r2, 0\n\ - cmp r0, 0x7F\n\ - bne _08021EBE\n\ - ldr r0, _08021F48 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021ECA\n\ -_08021EBE:\n\ - ldr r1, _08021F4C @ =gUnknown_02024C2C\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - strh r3, [r0]\n\ -_08021ECA:\n\ - ldr r0, _08021F50 @ =gAbsentBankFlags\n\ - ldrb r1, [r0]\n\ - ldr r2, _08021F54 @ =gBitTable\n\ - mov r3, r9\n\ - ldrb r4, [r3]\n\ - lsls r0, r4, 2\n\ - adds r0, r2\n\ - ldr r3, [r0]\n\ - ands r1, r3\n\ - adds r6, r2, 0\n\ - cmp r1, 0\n\ - beq _08021EE4\n\ - b _08022244\n\ -_08021EE4:\n\ - ldr r0, _08021F58 @ =0x000160a6\n\ - add r0, r12\n\ - ldrb r0, [r0]\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08021EF2\n\ - b _08022244\n\ -_08021EF2:\n\ - ldrh r2, [r7]\n\ - lsls r0, r2, 1\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - add r0, r8\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x7F\n\ - bne _08021F04\n\ - b _08022244\n\ -_08021F04:\n\ - ldr r0, [r5]\n\ - movs r1, 0x80\n\ - lsls r1, 18\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08021F68\n\ - ldr r1, _08021F5C @ =gLastUsedMove\n\ - lsls r0, r4, 1\n\ - adds r0, r1\n\ - strh r2, [r0]\n\ - ldr r0, _08021F60 @ =gUnknown_02024C4C\n\ - mov r4, r9\n\ - ldrb r1, [r4]\n\ - lsls r1, 1\n\ - adds r1, r0\n\ - ldr r0, _08021F64 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - strh r0, [r1]\n\ - b _08021F82\n\ - .align 2, 0\n\ -_08021F2C: .4byte gHitMarker\n\ -_08021F30: .4byte gBankAttacker\n\ -_08021F34: .4byte gActiveBank\n\ -_08021F38: .4byte gBankTarget\n\ -_08021F3C: .4byte 0xffffefff\n\ -_08021F40: .4byte gBattleMoves\n\ -_08021F44: .4byte gUnknown_02024BE8\n\ -_08021F48: .4byte gBattleMoveFlags\n\ -_08021F4C: .4byte gUnknown_02024C2C\n\ -_08021F50: .4byte gAbsentBankFlags\n\ -_08021F54: .4byte gBitTable\n\ -_08021F58: .4byte 0x000160a6\n\ -_08021F5C: .4byte gLastUsedMove\n\ -_08021F60: .4byte gUnknown_02024C4C\n\ -_08021F64: .4byte gCurrentMove\n\ -_08021F68:\n\ - ldr r1, _08021FD0 @ =gLastUsedMove\n\ - lsls r0, r4, 1\n\ - adds r0, r1\n\ - ldr r1, _08021FD4 @ =0x0000ffff\n\ - strh r1, [r0]\n\ - ldr r1, _08021FD8 @ =gUnknown_02024C4C\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - movs r1, 0x1\n\ - negs r1, r1\n\ - strh r1, [r0]\n\ -_08021F82:\n\ - ldr r2, _08021FDC @ =gBankTarget\n\ - ldrb r3, [r2]\n\ - lsls r0, r3, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - lsls r0, 28\n\ - ldr r1, [r5]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _08021FA0\n\ - ldr r0, _08021FE0 @ =gUnknown_02024C5C\n\ - adds r0, r3, r0\n\ - mov r3, r9\n\ - ldrb r1, [r3]\n\ - strb r1, [r0]\n\ -_08021FA0:\n\ - ldr r0, [r5]\n\ - movs r1, 0x80\n\ - lsls r1, 18\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802204C\n\ - ldr r0, _08021FE4 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0802204C\n\ - ldrh r2, [r7]\n\ - ldr r0, _08021FD4 @ =0x0000ffff\n\ - cmp r2, r0\n\ - bne _08021FEC\n\ - ldr r1, _08021FE8 @ =gMoveHitWith\n\ - ldr r4, _08021FDC @ =gBankTarget\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - strh r2, [r0]\n\ - b _08022244\n\ - .align 2, 0\n\ -_08021FD0: .4byte gLastUsedMove\n\ -_08021FD4: .4byte 0x0000ffff\n\ -_08021FD8: .4byte gUnknown_02024C4C\n\ -_08021FDC: .4byte gBankTarget\n\ -_08021FE0: .4byte gUnknown_02024C5C\n\ -_08021FE4: .4byte gBattleMoveFlags\n\ -_08021FE8: .4byte gMoveHitWith\n\ -_08021FEC:\n\ - ldr r0, _08022014 @ =gMoveHitWith\n\ - ldr r5, _08022018 @ =gBankTarget\n\ - ldrb r1, [r5]\n\ - lsls r1, 1\n\ - adds r1, r0\n\ - ldr r4, _0802201C @ =gCurrentMove\n\ - ldrh r0, [r4]\n\ - strh r0, [r1]\n\ - ldr r0, _08022020 @ =0x0001601c\n\ - add r0, r12\n\ - ldrb r3, [r0]\n\ - cmp r3, 0\n\ - beq _08022028\n\ - ldr r0, _08022024 @ =gUnknown_02024C44\n\ - ldrb r1, [r5]\n\ - lsls r1, 1\n\ - adds r1, r0\n\ - movs r0, 0x3F\n\ - ands r0, r3\n\ - b _08021C22\n\ - .align 2, 0\n\ -_08022014: .4byte gMoveHitWith\n\ -_08022018: .4byte gBankTarget\n\ -_0802201C: .4byte gCurrentMove\n\ -_08022020: .4byte 0x0001601c\n\ -_08022024: .4byte gUnknown_02024C44\n\ -_08022028:\n\ - ldr r0, _08022044 @ =gUnknown_02024C44\n\ - ldr r1, _08022048 @ =gBankTarget\n\ - ldrb r2, [r1]\n\ - lsls r2, 1\n\ - adds r2, r0\n\ - ldrh r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - add r0, r8\n\ - ldrb r0, [r0, 0x2]\n\ - strh r0, [r2]\n\ - b _08022244\n\ - .align 2, 0\n\ -_08022044: .4byte gUnknown_02024C44\n\ -_08022048: .4byte gBankTarget\n\ -_0802204C:\n\ - ldr r0, _0802205C @ =gMoveHitWith\n\ - ldr r2, _08022060 @ =gBankTarget\n\ - ldrb r1, [r2]\n\ - lsls r1, 1\n\ - adds r1, r0\n\ - ldr r0, _08022064 @ =0x0000ffff\n\ - b _08021C22\n\ - .align 2, 0\n\ -_0802205C: .4byte gMoveHitWith\n\ -_08022060: .4byte gBankTarget\n\ -_08022064: .4byte 0x0000ffff\n\ -_08022068:\n\ - ldr r0, _0802212C @ =gAbsentBankFlags\n\ - ldrb r1, [r0]\n\ - ldr r6, _08022130 @ =gBitTable\n\ - ldr r2, _08022134 @ =gBankAttacker\n\ - ldrb r5, [r2]\n\ - lsls r0, r5, 2\n\ - adds r0, r6\n\ - ldr r4, [r0]\n\ - ands r1, r4\n\ - mov r9, r2\n\ - cmp r1, 0\n\ - beq _08022082\n\ - b _08022244\n\ -_08022082:\n\ - ldr r0, _08022138 @ =0x000160a6\n\ - add r0, r12\n\ - ldrb r0, [r0]\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - beq _08022090\n\ - b _08022244\n\ -_08022090:\n\ - ldr r1, _0802213C @ =gBattleMoves\n\ - ldr r4, _08022140 @ =gUnknown_02024BE8\n\ - ldrh r3, [r4]\n\ - lsls r0, r3, 1\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r1, [r0, 0x8]\n\ - movs r0, 0x10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802215C\n\ - ldr r0, _08022144 @ =gHitMarker\n\ - ldr r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 18\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802215C\n\ - ldr r2, _08022148 @ =gBankTarget\n\ - ldrb r0, [r2]\n\ - cmp r5, r0\n\ - bne _080220C0\n\ - b _08022244\n\ -_080220C0:\n\ - adds r2, r0, 0\n\ - lsls r0, r2, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - lsls r0, 28\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _0802215C\n\ - ldr r0, _0802214C @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0802215C\n\ - lsls r0, r2, 1\n\ - ldr r5, _08022150 @ =0x000160ac\n\ - adds r0, r5\n\ - add r0, r12\n\ - strb r3, [r0]\n\ - ldr r0, _08022148 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - lsls r1, 1\n\ - ldr r2, _08022154 @ =0x000160ad\n\ - adds r1, r2\n\ - add r1, r12\n\ - ldrh r0, [r4]\n\ - lsrs r0, 8\n\ - strb r0, [r1]\n\ - ldr r3, _08022148 @ =gBankTarget\n\ - ldrb r2, [r3]\n\ - lsls r2, 2\n\ - mov r5, r9\n\ - ldrb r0, [r5]\n\ - lsrs r0, 1\n\ - lsls r0, 1\n\ - ldr r1, _08022158 @ =0x00016100\n\ - adds r0, r1\n\ - adds r2, r0\n\ - add r2, r12\n\ - ldrh r0, [r4]\n\ - strb r0, [r2]\n\ - ldrb r2, [r3]\n\ - lsls r2, 2\n\ - ldrb r0, [r5]\n\ - lsrs r0, 1\n\ - lsls r0, 1\n\ - adds r1, 0x1\n\ - adds r0, r1\n\ - adds r2, r0\n\ - add r2, r12\n\ - ldrh r0, [r4]\n\ - lsrs r0, 8\n\ - strb r0, [r2]\n\ - b _08022244\n\ - .align 2, 0\n\ -_0802212C: .4byte gAbsentBankFlags\n\ -_08022130: .4byte gBitTable\n\ -_08022134: .4byte gBankAttacker\n\ -_08022138: .4byte 0x000160a6\n\ -_0802213C: .4byte gBattleMoves\n\ -_08022140: .4byte gUnknown_02024BE8\n\ -_08022144: .4byte gHitMarker\n\ -_08022148: .4byte gBankTarget\n\ -_0802214C: .4byte gBattleMoveFlags\n\ -_08022150: .4byte 0x000160ac\n\ -_08022154: .4byte 0x000160ad\n\ -_08022158: .4byte 0x00016100\n\ -_0802215C:\n\ - mov r1, r9\n\ - ldrb r0, [r1]\n\ - ldr r2, _080221B4 @ =gBankTarget\n\ - ldrb r2, [r2]\n\ - cmp r0, r2\n\ - beq _08022244\n\ - ldr r3, _080221B4 @ =gBankTarget\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - ldr r4, _080221B8 @ =0x000160ac\n\ - adds r0, r4\n\ - add r0, r12\n\ - movs r3, 0\n\ - strb r3, [r0]\n\ - ldr r5, _080221B4 @ =gBankTarget\n\ - ldrb r0, [r5]\n\ - lsls r0, 1\n\ - ldr r1, _080221BC @ =0x000160ad\n\ - adds r0, r1\n\ - add r0, r12\n\ - strb r3, [r0]\n\ - ldrb r2, [r5]\n\ - lsls r2, 2\n\ - mov r4, r9\n\ - ldrb r0, [r4]\n\ - lsrs r0, 1\n\ - lsls r0, 1\n\ - adds r1, 0x53\n\ - adds r0, r1\n\ - adds r2, r0\n\ - add r2, r12\n\ - strb r3, [r2]\n\ - ldrb r2, [r5]\n\ - lsls r2, 2\n\ - ldrb r0, [r4]\n\ - lsrs r0, 1\n\ - lsls r0, 1\n\ - adds r1, 0x1\n\ - adds r0, r1\n\ - adds r2, r0\n\ - add r2, r12\n\ - strb r3, [r2]\n\ - b _08022244\n\ - .align 2, 0\n\ -_080221B4: .4byte gBankTarget\n\ -_080221B8: .4byte 0x000160ac\n\ -_080221BC: .4byte 0x000160ad\n\ -_080221C0:\n\ - ldr r5, _080222B0 @ =gHitMarker\n\ - ldr r2, [r5]\n\ - movs r0, 0x80\n\ - lsls r0, 12\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _08022244\n\ - ldr r0, _080222B4 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08022244\n\ - ldr r1, _080222B8 @ =gProtectStructs\n\ - ldr r0, _080222BC @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x1]\n\ - lsls r0, 29\n\ - cmp r0, 0\n\ - blt _08022244\n\ - ldr r0, _080222C0 @ =gBattleMoves\n\ - mov r9, r0\n\ - ldr r1, _080222C4 @ =gCurrentMove\n\ - mov r8, r1\n\ - ldrh r0, [r1]\n\ - lsls r1, r0, 1\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - add r1, r9\n\ - ldrb r0, [r1, 0x6]\n\ - cmp r0, 0x8\n\ - bne _08022244\n\ - movs r6, 0x80\n\ - lsls r6, 2\n\ - adds r4, r6, 0\n\ - ands r4, r2\n\ - cmp r4, 0\n\ - bne _08022244\n\ - ldr r7, _080222C8 @ =gBankTarget\n\ - ldrb r0, [r7]\n\ - bl GetBankIdentity\n\ - movs r1, 0x2\n\ - eors r0, r1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetBankByPlayerAI\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - ldr r1, _080222CC @ =gBattleMons\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _0802223A\n\ - bl _08021874\n\ -_0802223A:\n\ - ldr r0, [r5]\n\ - orrs r0, r6\n\ - str r0, [r5]\n\ - ldr r2, _080222D0 @ =0x02000000\n\ - mov r12, r2\n\ -_08022244:\n\ - ldr r1, _080222D4 @ =0x0001600c\n\ - add r1, r12\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ -_0802224E:\n\ - ldr r3, [sp, 0x10]\n\ - cmp r3, 0x1\n\ - bne _08022262\n\ - mov r4, r10\n\ - cmp r4, 0\n\ - bne _08022262\n\ - ldr r1, _080222D4 @ =0x0001600c\n\ - add r1, r12\n\ - movs r0, 0x11\n\ - strb r0, [r1]\n\ -_08022262:\n\ - ldr r5, [sp, 0x10]\n\ - cmp r5, 0x2\n\ - bne _08022278\n\ - ldr r1, _080222D4 @ =0x0001600c\n\ - add r1, r12\n\ - ldr r0, [sp, 0x14]\n\ - ldrb r2, [r1]\n\ - cmp r0, r2\n\ - bne _08022278\n\ - movs r0, 0x11\n\ - strb r0, [r1]\n\ -_08022278:\n\ - ldr r0, _080222D4 @ =0x0001600c\n\ - add r0, r12\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x11\n\ - beq _08022286\n\ - bl _080218E4\n\ -_08022286:\n\ - ldr r0, _080222D4 @ =0x0001600c\n\ - add r0, r12\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x11\n\ - bne _0802229E\n\ - mov r3, r10\n\ - cmp r3, 0\n\ - bne _0802229E\n\ - ldr r1, _080222D8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x3\n\ -_0802229C:\n\ - str r0, [r1]\n\ -_0802229E:\n\ - add sp, 0x18\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080222B0: .4byte gHitMarker\n\ -_080222B4: .4byte gBattleTypeFlags\n\ -_080222B8: .4byte gProtectStructs\n\ -_080222BC: .4byte gBankAttacker\n\ -_080222C0: .4byte gBattleMoves\n\ -_080222C4: .4byte gCurrentMove\n\ -_080222C8: .4byte gBankTarget\n\ -_080222CC: .4byte gBattleMons\n\ -_080222D0: .4byte 0x02000000\n\ -_080222D4: .4byte 0x0001600c\n\ -_080222D8: .4byte gBattlescriptCurrInstr\n\ - .syntax divided" - ); -} -#endif // NONMATCHING - -static void atk4A_typecalc2(void) -{ - u8 flags = 0; - int i = 0; - u8 move_type = gBattleMoves[gCurrentMove].type; - - if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); - gMoveHitWith[gBankTarget] = 0; - gBattleCommunication[6] = move_type; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) {break;} - else {i += 3; continue;} - } - - if (gTypeEffectiveness[i] == move_type) - { - //check type1 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) - { - if (gTypeEffectiveness[i + 2] == 0) - { - gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED; - break; - } - if (gTypeEffectiveness[i + 2] == 5) - flags |= MOVESTATUS_NOTVERYEFFECTIVE; - if (gTypeEffectiveness[i + 2] == 20) - flags |= MOVESTATUS_SUPEREFFECTIVE; - } - //check type2 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2) - { - if (gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 - && gTypeEffectiveness[i + 2] == 0) - { - gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED; - break; - } - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && gTypeEffectiveness[i + 2] == 5) - flags |= MOVESTATUS_NOTVERYEFFECTIVE; - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 - && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 && gTypeEffectiveness[i + 2] == 20) - flags |= MOVESTATUS_SUPEREFFECTIVE; - } - } - i += 3; - } - } - - if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && !(flags & MOVESTATUS_NOEFFECT) && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 && - (!(flags & MOVESTATUS_SUPEREFFECTIVE) || ((flags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) && - gBattleMoves[gCurrentMove].power) - { - gLastUsedAbility = ABILITY_WONDER_GUARD; - gBattleMoveFlags |= MOVESTATUS_MISSED; - gMoveHitWith[gBankTarget] = 0; - gBattleCommunication[6] = 3; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) - gProtectStructs[gBankAttacker].notEffective = 1; - - gBattlescriptCurrInstr++; -} - -static void atk4B_return_atk_to_ball(void) -{ - gActiveBank = gBankAttacker; - if (!(gHitMarker & HITMARKER_FAINTED(gActiveBank))) - { - EmitReturnPokeToBall(0, 0); - MarkBufferBankForExecution(gActiveBank); - } - gBattlescriptCurrInstr++; -} - -static void atk4C_copy_poke_data(void) -{ - if (gBattleExecBuffer) - return; - - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - - gBattlePartyID[gActiveBank] = unk_2000000[0x16068 + gActiveBank]; - - EmitGetAttributes(0, 0, gBitTable[gBattlePartyID[gActiveBank]]); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 2; -} - -static inline u8 get_knocked_off_byte(u8 bank) -{ - register u32 side asm("r2") = GetBankSide(bank); - register struct WishFutureKnock* dummy = &gWishFutureKnock; - register u8* aa = ((u8*)((u8*)(dummy))); - register u8* bb = aa + 0x29; - register u8* cc asm("r0") = side + bb; - return *cc; -} - -static void atk4D_switch_data_update(void) -{ - struct BattlePokemon OldData; - int i; - u8 *monData; - if (gBattleExecBuffer) - return; - - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - OldData = gBattleMons[gActiveBank]; - monData = (u8*)(&gBattleMons[gActiveBank]); - for (i = 0; i < sizeof(struct BattlePokemon); i++) - { - monData[i] = gBattleBufferB[gActiveBank][4 + i]; - } - - gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1; - gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2; - gBattleMons[gActiveBank].ability = GetAbilityBySpecies(gBattleMons[gActiveBank].species, gBattleMons[gActiveBank].altAbility); - //check knocked off item - if (get_knocked_off_byte(gActiveBank) & gBitTable[gBattlePartyID[gActiveBank]]) - { - gBattleMons[gActiveBank].item = 0; - } - - if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) - { - for (i = 0; i < 8; i++) - { - gBattleMons[gActiveBank].statStages[i] = OldData.statStages[i]; - } - gBattleMons[gActiveBank].status2 = OldData.status2; - } - SwitchInClearStructs(); - BATTLE_STRUCT->scriptingActive = gActiveBank; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 7; - gBattleTextBuff1[2] = gActiveBank; - gBattleTextBuff1[3] = gBattlePartyID[gActiveBank]; - gBattleTextBuff1[4] = 0xFF; - - gBattlescriptCurrInstr += 2; -} - -static void atk4E_switchin_anim(void) -{ - if (gBattleExecBuffer) - return; - - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - if (GetBankSide(gActiveBank) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER))) - { - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); - } - gAbsentBankFlags &= ~(gBitTable[gActiveBank]); - EmitSwitchInAnim(0, gBattlePartyID[gActiveBank], BSScriptRead8(gBattlescriptCurrInstr + 2)); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 3; -} - -static void atk4F_jump_if_cannot_switch(void) -{ - int val, to_cmp; - register struct Pokemon *party; - u8 r7; - //0x80 byte is used as a way of telling the function whether to not check status2/status3 - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1) & 0x7F); - if (!(BSScriptRead8(gBattlescriptCurrInstr + 1) & 0x80) - && ((gBattleMons[gActiveBank].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) - || (gStatuses3[gActiveBank] & STATUS3_ROOTED))) - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); - return; - } - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (GetBankSide(gActiveBank) == 1) - party = gEnemyParty; - else - party = gPlayerParty; - val = 0; - if (sub_803FBFC(sub_803FC34(gActiveBank)) == 1) - val = 3; - for (to_cmp = val + 3; val < to_cmp; val++) - { - if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[val], MON_DATA_IS_EGG) - && GetMonData(&party[val], MON_DATA_HP) != 0 - && gBattlePartyID[gActiveBank] != val) - break; - } - if (val == to_cmp) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; - } - else - { - if (GetBankSide(gActiveBank) == 1) - { - r7 = GetBankByPlayerAI(1); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - to_cmp = GetBankByPlayerAI(3); - else - to_cmp = r7; - party = gEnemyParty; - } - else - { - r7 = GetBankByPlayerAI(0); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - to_cmp = GetBankByPlayerAI(2); - else - to_cmp = r7; - party = gPlayerParty; - } - for (val = 0; val < 6; val++) - { - if (GetMonData(&party[val], MON_DATA_HP) != 0 - && GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[val], MON_DATA_IS_EGG) - && val != gBattlePartyID[r7] && val != gBattlePartyID[to_cmp]) - break; - } - if (val == 6) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; - } -} - -void sub_8022A3C(u8 unkown) -{ - //BATTLE_STRUCT->unk16064[gActiveBank] = gBattlePartyID[gActiveBank]; - ewram[gActiveBank + 0x16064] = gBattlePartyID[gActiveBank]; - EmitChoosePokemon(0, 1, unkown, 0, BATTLE_STRUCT->unk1606C[gActiveBank]); - MarkBufferBankForExecution(gActiveBank); -} - -/* -static void atk50_openpartyscreen(void) -{ - int i = 0; - int r9 = 0; - u8* fail_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 2); - - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 5) - { - if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) - { - for (gActiveBank = i; gActiveBank < gNoOfAllBanks; gActiveBank++) - { - if (!(gHitMarker & HITMARKER_FAINTED(gActiveBank))) - { - EmitLinkStandbyMsg(0, 2); - MarkBufferBankForExecution(gActiveBank); - } - else if (sub_8018018(gActiveBank, 6, 6) == 0 - && !gSpecialStatuses[gActiveBank].flag40) - { - sub_8022A3C(6); - gSpecialStatuses[gActiveBank].flag40 = 1; - } - else - { - gAbsentBankFlags |= gBitTable[gActiveBank]; - gHitMarker &= (~HITMARKER_FAINTED(gActiveBank)); - EmitLinkStandbyMsg(0, 2); - MarkBufferBankForExecution(gActiveBank); - } - } - } - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - if (!(gHitMarker >> 0x1C & gBitTable[0])) - { - - } - else if (sub_8018018(gActiveBank, 6, 6) == 0 - && !gSpecialStatuses[gActiveBank].flag40) - { - - } - else - { - - } - } - } -} -*/ - -__attribute__((naked)) -static void atk50_openpartyscreen(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x4\n\ - movs r7, 0\n\ - movs r0, 0\n\ - mov r9, r0\n\ - ldr r6, _08022B44 @ =gBattlescriptCurrInstr\n\ - ldr r1, [r6]\n\ - ldrb r2, [r1, 0x2]\n\ - ldrb r0, [r1, 0x3]\n\ - lsls r0, 8\n\ - orrs r2, r0\n\ - ldrb r0, [r1, 0x4]\n\ - lsls r0, 16\n\ - orrs r2, r0\n\ - ldrb r0, [r1, 0x5]\n\ - lsls r0, 24\n\ - orrs r2, r0\n\ - mov r8, r2\n\ - ldrb r2, [r1, 0x1]\n\ - adds r0, r2, 0\n\ - mov r12, r6\n\ - cmp r0, 0x5\n\ - beq _08022ACE\n\ - b _08022F74\n\ -_08022ACE:\n\ - ldr r0, _08022B48 @ =gBattleTypeFlags\n\ - ldrh r0, [r0]\n\ - movs r1, 0x41\n\ - ands r1, r0\n\ - cmp r1, 0x1\n\ - beq _08022BBC\n\ - ldr r1, _08022B4C @ =gActiveBank\n\ - strb r7, [r1]\n\ - ldr r0, _08022B50 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r7, r0\n\ - bcc _08022AE8\n\ - b _08022F62\n\ -_08022AE8:\n\ - ldr r7, _08022B54 @ =gHitMarker\n\ - ldr r6, _08022B58 @ =gBitTable\n\ - adds r4, r1, 0\n\ - ldr r0, _08022B5C @ =gAbsentBankFlags\n\ - mov r8, r0\n\ -_08022AF2:\n\ - ldrb r2, [r4]\n\ - lsls r0, r2, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r7]\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08022B94\n\ - adds r0, r2, 0\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022B60\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r7]\n\ - bics r0, r1\n\ - str r0, [r7]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022BA2\n\ - .align 2, 0\n\ -_08022B44: .4byte gBattlescriptCurrInstr\n\ -_08022B48: .4byte gBattleTypeFlags\n\ -_08022B4C: .4byte gActiveBank\n\ -_08022B50: .4byte gNoOfAllBanks\n\ -_08022B54: .4byte gHitMarker\n\ -_08022B58: .4byte gBitTable\n\ -_08022B5C: .4byte gAbsentBankFlags\n\ -_08022B60:\n\ - ldr r5, _08022B90 @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022BA2\n\ - movs r0, 0x6\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022BA2\n\ - .align 2, 0\n\ -_08022B90: .4byte gSpecialStatuses\n\ -_08022B94:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08022BA2:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - ldr r1, _08022BB8 @ =gNoOfAllBanks\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _08022AF2\n\ - b _08022F62\n\ - .align 2, 0\n\ -_08022BB8: .4byte gNoOfAllBanks\n\ -_08022BBC:\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _08022BC4\n\ - b _08022F62\n\ -_08022BC4:\n\ - ldr r0, _08022C1C @ =gHitMarker\n\ - mov r8, r0\n\ - ldr r0, [r0]\n\ - lsrs r5, r0, 28\n\ - ldr r6, _08022C20 @ =gBitTable\n\ - ldr r0, [r6]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08022C7E\n\ - ldr r4, _08022C24 @ =gActiveBank\n\ - strb r7, [r4]\n\ - movs r0, 0\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022C2C\n\ - ldr r2, _08022C28 @ =gAbsentBankFlags\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - mov r2, r8\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl dp01_build_cmdbuf_x2A_2A_2A_2A\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022C7E\n\ - .align 2, 0\n\ -_08022C1C: .4byte gHitMarker\n\ -_08022C20: .4byte gBitTable\n\ -_08022C24: .4byte gActiveBank\n\ -_08022C28: .4byte gAbsentBankFlags\n\ -_08022C2C:\n\ - ldr r6, _08022C60 @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022C6C\n\ - ldr r0, _08022C64 @ =0x02000000\n\ - ldr r1, _08022C68 @ =0x0001606a\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022C7E\n\ - .align 2, 0\n\ -_08022C60: .4byte gSpecialStatuses\n\ -_08022C64: .4byte 0x02000000\n\ -_08022C68: .4byte 0x0001606a\n\ -_08022C6C:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - movs r2, 0x1\n\ - mov r9, r2\n\ -_08022C7E:\n\ - ldr r6, _08022CD8 @ =gBitTable\n\ - ldr r0, [r6, 0x8]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08022D40\n\ - ldr r0, [r6]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - bne _08022D40\n\ - ldr r4, _08022CDC @ =gActiveBank\n\ - movs r0, 0x2\n\ - strb r0, [r4]\n\ - movs r0, 0x2\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022CE8\n\ - ldr r2, _08022CE0 @ =gAbsentBankFlags\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _08022CE4 @ =gHitMarker\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl dp01_build_cmdbuf_x2A_2A_2A_2A\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022D40\n\ - .align 2, 0\n\ -_08022CD8: .4byte gBitTable\n\ -_08022CDC: .4byte gActiveBank\n\ -_08022CE0: .4byte gAbsentBankFlags\n\ -_08022CE4: .4byte gHitMarker\n\ -_08022CE8:\n\ - ldr r6, _08022D1C @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022D28\n\ - ldr r0, _08022D20 @ =0x02000000\n\ - ldr r1, _08022D24 @ =0x00016068\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022D40\n\ - .align 2, 0\n\ -_08022D1C: .4byte gSpecialStatuses\n\ -_08022D20: .4byte 0x02000000\n\ -_08022D24: .4byte 0x00016068\n\ -_08022D28:\n\ - movs r0, 0x1\n\ - mov r2, r9\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _08022D40\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08022D40:\n\ - ldr r6, _08022D90 @ =gBitTable\n\ - ldr r0, [r6, 0x4]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08022DF6\n\ - ldr r4, _08022D94 @ =gActiveBank\n\ - movs r0, 0x1\n\ - strb r0, [r4]\n\ - movs r0, 0x1\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022DA0\n\ - ldr r2, _08022D98 @ =gAbsentBankFlags\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _08022D9C @ =gHitMarker\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl dp01_build_cmdbuf_x2A_2A_2A_2A\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022DF6\n\ - .align 2, 0\n\ -_08022D90: .4byte gBitTable\n\ -_08022D94: .4byte gActiveBank\n\ -_08022D98: .4byte gAbsentBankFlags\n\ -_08022D9C: .4byte gHitMarker\n\ -_08022DA0:\n\ - ldr r6, _08022DD4 @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022DE0\n\ - ldr r0, _08022DD8 @ =0x02000000\n\ - ldr r1, _08022DDC @ =0x0001606b\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022DF6\n\ - .align 2, 0\n\ -_08022DD4: .4byte gSpecialStatuses\n\ -_08022DD8: .4byte 0x02000000\n\ -_08022DDC: .4byte 0x0001606b\n\ -_08022DE0:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - movs r0, 0x2\n\ - mov r2, r9\n\ - orrs r2, r0\n\ - mov r9, r2\n\ -_08022DF6:\n\ - ldr r6, _08022E50 @ =gBitTable\n\ - ldr r0, [r6, 0xC]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08022EB8\n\ - ldr r0, [r6, 0x4]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - bne _08022EB8\n\ - ldr r4, _08022E54 @ =gActiveBank\n\ - movs r0, 0x3\n\ - strb r0, [r4]\n\ - movs r0, 0x3\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08022E60\n\ - ldr r2, _08022E58 @ =gAbsentBankFlags\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _08022E5C @ =gHitMarker\n\ - ldrb r0, [r4]\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl dp01_build_cmdbuf_x2A_2A_2A_2A\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - b _08022EB8\n\ - .align 2, 0\n\ -_08022E50: .4byte gBitTable\n\ -_08022E54: .4byte gActiveBank\n\ -_08022E58: .4byte gAbsentBankFlags\n\ -_08022E5C: .4byte gHitMarker\n\ -_08022E60:\n\ - ldr r6, _08022E94 @ =gSpecialStatuses\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022EA0\n\ - ldr r0, _08022E98 @ =0x02000000\n\ - ldr r1, _08022E9C @ =0x00016069\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08022EB8\n\ - .align 2, 0\n\ -_08022E94: .4byte gSpecialStatuses\n\ -_08022E98: .4byte 0x02000000\n\ -_08022E9C: .4byte 0x00016069\n\ -_08022EA0:\n\ - movs r0, 0x2\n\ - mov r2, r9\n\ - ands r2, r0\n\ - cmp r2, 0\n\ - bne _08022EB8\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08022EB8:\n\ - ldr r1, _08022EE8 @ =gSpecialStatuses\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022F0C\n\ - adds r0, r1, 0\n\ - adds r0, 0x28\n\ - ldrb r0, [r0]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022F0C\n\ - cmp r5, 0\n\ - beq _08022F0C\n\ - ldr r0, _08022EEC @ =gAbsentBankFlags\n\ - ldrb r1, [r0]\n\ - ldr r0, _08022EF0 @ =gBitTable\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _08022EF8\n\ - ldr r1, _08022EF4 @ =gActiveBank\n\ - movs r0, 0x2\n\ - strb r0, [r1]\n\ - b _08022EFC\n\ - .align 2, 0\n\ -_08022EE8: .4byte gSpecialStatuses\n\ -_08022EEC: .4byte gAbsentBankFlags\n\ -_08022EF0: .4byte gBitTable\n\ -_08022EF4: .4byte gActiveBank\n\ -_08022EF8:\n\ - ldr r0, _08022F3C @ =gActiveBank\n\ - strb r1, [r0]\n\ -_08022EFC:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldr r0, _08022F3C @ =gActiveBank\n\ - ldrb r0, [r0]\n\ - bl MarkBufferBankForExecution\n\ -_08022F0C:\n\ - ldr r1, _08022F40 @ =gSpecialStatuses\n\ - ldrb r0, [r1, 0x14]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022F62\n\ - adds r0, r1, 0\n\ - adds r0, 0x3C\n\ - ldrb r0, [r0]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _08022F62\n\ - cmp r5, 0\n\ - beq _08022F62\n\ - ldr r0, _08022F44 @ =gAbsentBankFlags\n\ - ldrb r0, [r0]\n\ - ldr r1, _08022F48 @ =gBitTable\n\ - ldr r1, [r1, 0x4]\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08022F4C\n\ - ldr r1, _08022F3C @ =gActiveBank\n\ - movs r0, 0x3\n\ - b _08022F50\n\ - .align 2, 0\n\ -_08022F3C: .4byte gActiveBank\n\ -_08022F40: .4byte gSpecialStatuses\n\ -_08022F44: .4byte gAbsentBankFlags\n\ -_08022F48: .4byte gBitTable\n\ -_08022F4C:\n\ - ldr r1, _08022F6C @ =gActiveBank\n\ - movs r0, 0x1\n\ -_08022F50:\n\ - strb r0, [r1]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldr r0, _08022F6C @ =gActiveBank\n\ - ldrb r0, [r0]\n\ - bl MarkBufferBankForExecution\n\ -_08022F62:\n\ - ldr r1, _08022F70 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x6\n\ - str r0, [r1]\n\ - b _08023302\n\ - .align 2, 0\n\ -_08022F6C: .4byte gActiveBank\n\ -_08022F70: .4byte gBattlescriptCurrInstr\n\ -_08022F74:\n\ - cmp r0, 0x6\n\ - beq _08022F7A\n\ - b _08023170\n\ -_08022F7A:\n\ - ldr r0, _08022FF0 @ =gBattleTypeFlags\n\ - ldrh r2, [r0]\n\ - movs r0, 0x40\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08022F88\n\ - b _0802310C\n\ -_08022F88:\n\ - movs r0, 0x1\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _08022F92\n\ - b _0802310C\n\ -_08022F92:\n\ - ldr r7, _08022FF4 @ =gHitMarker\n\ - ldr r0, [r7]\n\ - lsrs r5, r0, 28\n\ - ldr r4, _08022FF8 @ =gBitTable\n\ - ldr r0, [r4, 0x8]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _0802303A\n\ - ldr r0, [r4]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _0802303A\n\ - ldr r6, _08022FFC @ =gActiveBank\n\ - movs r0, 0x2\n\ - strb r0, [r6]\n\ - ldr r0, _08023000 @ =gBattleBufferB\n\ - ldrb r1, [r0, 0x1]\n\ - movs r0, 0x2\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08023008\n\ - ldr r2, _08023004 @ =gAbsentBankFlags\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r7]\n\ - bics r0, r1\n\ - str r0, [r7]\n\ - movs r0, 0\n\ - bl dp01_build_cmdbuf_x2A_2A_2A_2A\n\ - ldrb r0, [r6]\n\ - bl MarkBufferBankForExecution\n\ - b _0802303A\n\ - .align 2, 0\n\ -_08022FF0: .4byte gBattleTypeFlags\n\ -_08022FF4: .4byte gHitMarker\n\ -_08022FF8: .4byte gBitTable\n\ -_08022FFC: .4byte gActiveBank\n\ -_08023000: .4byte gBattleBufferB\n\ -_08023004: .4byte gAbsentBankFlags\n\ -_08023008:\n\ - ldr r4, _08023098 @ =gSpecialStatuses\n\ - ldrb r0, [r6]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _0802303A\n\ - ldr r0, _0802309C @ =0x02000000\n\ - ldr r1, _080230A0 @ =0x00016068\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r6]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_0802303A:\n\ - ldr r4, _080230A4 @ =gBitTable\n\ - ldr r0, [r4, 0xC]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _080230EE\n\ - ldr r0, [r4, 0x4]\n\ - ands r5, r0\n\ - cmp r5, 0\n\ - beq _080230EE\n\ - ldr r5, _080230A8 @ =gActiveBank\n\ - movs r0, 0x3\n\ - strb r0, [r5]\n\ - ldr r0, _080230AC @ =gBattleBufferB\n\ - ldr r2, _080230B0 @ =0x00000201\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r0, 0x3\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080230BC\n\ - ldr r2, _080230B4 @ =gAbsentBankFlags\n\ - ldrb r0, [r5]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - ldrb r1, [r2]\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _080230B8 @ =gHitMarker\n\ - ldrb r0, [r5]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - bics r0, r1\n\ - str r0, [r2]\n\ - movs r0, 0\n\ - bl dp01_build_cmdbuf_x2A_2A_2A_2A\n\ - ldrb r0, [r5]\n\ - bl MarkBufferBankForExecution\n\ - b _080230EE\n\ - .align 2, 0\n\ -_08023098: .4byte gSpecialStatuses\n\ -_0802309C: .4byte 0x02000000\n\ -_080230A0: .4byte 0x00016068\n\ -_080230A4: .4byte gBitTable\n\ -_080230A8: .4byte gActiveBank\n\ -_080230AC: .4byte gBattleBufferB\n\ -_080230B0: .4byte 0x00000201\n\ -_080230B4: .4byte gAbsentBankFlags\n\ -_080230B8: .4byte gHitMarker\n\ -_080230BC:\n\ - ldr r4, _080230FC @ =gSpecialStatuses\n\ - ldrb r0, [r5]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _080230EE\n\ - ldr r0, _08023100 @ =0x02000000\n\ - ldr r1, _08023104 @ =0x00016069\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_8022A3C\n\ - ldrb r1, [r5]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r1, [r0]\n\ - movs r2, 0x40\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_080230EE:\n\ - ldr r1, _08023108 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x6\n\ - str r0, [r1]\n\ - mov r12, r1\n\ - b _08023110\n\ - .align 2, 0\n\ -_080230FC: .4byte gSpecialStatuses\n\ -_08023100: .4byte 0x02000000\n\ -_08023104: .4byte 0x00016069\n\ -_08023108: .4byte gBattlescriptCurrInstr\n\ -_0802310C:\n\ - adds r0, r1, 0x6\n\ - str r0, [r6]\n\ -_08023110:\n\ - ldr r0, _08023160 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - lsrs r5, r0, 28\n\ - ldr r1, _08023164 @ =gBank1\n\ - movs r0, 0\n\ - strb r0, [r1]\n\ - ldr r4, _08023168 @ =gBitTable\n\ - ldr r2, [r4]\n\ - ands r2, r5\n\ - ldr r6, _0802316C @ =gNoOfAllBanks\n\ - cmp r2, 0\n\ - bne _0802314C\n\ - adds r7, r6, 0\n\ - ldrb r0, [r6]\n\ - cmp r2, r0\n\ - bcs _0802314C\n\ - adds r3, r1, 0\n\ -_08023132:\n\ - ldrb r0, [r3]\n\ - adds r0, 0x1\n\ - strb r0, [r3]\n\ - ldrb r2, [r3]\n\ - lsls r0, r2, 2\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - bne _0802314C\n\ - ldrb r0, [r7]\n\ - cmp r2, r0\n\ - bcc _08023132\n\ -_0802314C:\n\ - ldrb r0, [r1]\n\ - ldrb r6, [r6]\n\ - cmp r0, r6\n\ - beq _08023156\n\ - b _08023302\n\ -_08023156:\n\ - mov r1, r8\n\ - mov r2, r12\n\ - str r1, [r2]\n\ - b _08023302\n\ - .align 2, 0\n\ -_08023160: .4byte gHitMarker\n\ -_08023164: .4byte gBank1\n\ -_08023168: .4byte gBitTable\n\ -_0802316C: .4byte gNoOfAllBanks\n\ -_08023170:\n\ - movs r0, 0x80\n\ - ands r0, r2\n\ - movs r5, 0x1\n\ - cmp r0, 0\n\ - beq _0802317C\n\ - movs r5, 0\n\ -_0802317C:\n\ - movs r0, 0x7F\n\ - ands r0, r2\n\ - bl GetBattleBank\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r1, _080231A4 @ =gSpecialStatuses\n\ - lsls r0, r7, 2\n\ - adds r0, r7\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - bge _080231A8\n\ - ldr r0, [r6]\n\ - adds r0, 0x6\n\ - str r0, [r6]\n\ - b _08023302\n\ - .align 2, 0\n\ -_080231A4: .4byte gSpecialStatuses\n\ -_080231A8:\n\ - adds r0, r7, 0\n\ - movs r1, 0x6\n\ - movs r2, 0x6\n\ - bl sub_8018018\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080231F8\n\ - ldr r2, _080231E8 @ =gActiveBank\n\ - strb r7, [r2]\n\ - ldr r3, _080231EC @ =gAbsentBankFlags\n\ - ldr r4, _080231F0 @ =gBitTable\n\ - ldrb r0, [r2]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - ldrb r1, [r3]\n\ - orrs r0, r1\n\ - strb r0, [r3]\n\ - ldr r3, _080231F4 @ =gHitMarker\n\ - ldrb r0, [r2]\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r3]\n\ - bics r0, r1\n\ - str r0, [r3]\n\ - mov r0, r8\n\ - str r0, [r6]\n\ - b _08023302\n\ - .align 2, 0\n\ -_080231E8: .4byte gActiveBank\n\ -_080231EC: .4byte gAbsentBankFlags\n\ -_080231F0: .4byte gBitTable\n\ -_080231F4: .4byte gHitMarker\n\ -_080231F8:\n\ - ldr r4, _080232A0 @ =gActiveBank\n\ - strb r7, [r4]\n\ - ldr r3, _080232A4 @ =0x02000000\n\ - ldrb r0, [r4]\n\ - ldr r2, _080232A8 @ =0x00016064\n\ - adds r1, r0, r2\n\ - adds r1, r3\n\ - ldr r2, _080232AC @ =gBattlePartyID\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r1, [r4]\n\ - movs r0, 0x2\n\ - eors r0, r1\n\ - ldr r1, _080232B0 @ =0x00016068\n\ - adds r0, r1\n\ - adds r0, r3\n\ - ldrb r2, [r0]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - ldr r1, _080232B4 @ =0x0001606c\n\ - adds r3, r1\n\ - adds r0, r3\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - adds r1, r5, 0\n\ - movs r3, 0\n\ - bl EmitChoosePokemon\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, [r6]\n\ - adds r0, 0x6\n\ - str r0, [r6]\n\ - ldrb r0, [r4]\n\ - bl GetBankIdentity\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0802325A\n\ - ldr r1, _080232B8 @ =gBattleResults\n\ - ldrb r0, [r1, 0x2]\n\ - cmp r0, 0xFE\n\ - bhi _0802325A\n\ - adds r0, 0x1\n\ - strb r0, [r1, 0x2]\n\ -_0802325A:\n\ - ldr r0, _080232BC @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080232C4\n\ - ldr r1, _080232A0 @ =gActiveBank\n\ - movs r0, 0\n\ - strb r0, [r1]\n\ - ldr r0, _080232C0 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _08023302\n\ - adds r4, r1, 0\n\ -_08023276:\n\ - ldrb r0, [r4]\n\ - cmp r0, r7\n\ - beq _0802328A\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_0802328A:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - ldr r1, _080232C0 @ =gNoOfAllBanks\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _08023276\n\ - b _08023302\n\ - .align 2, 0\n\ -_080232A0: .4byte gActiveBank\n\ -_080232A4: .4byte 0x02000000\n\ -_080232A8: .4byte 0x00016064\n\ -_080232AC: .4byte gBattlePartyID\n\ -_080232B0: .4byte 0x00016068\n\ -_080232B4: .4byte 0x0001606c\n\ -_080232B8: .4byte gBattleResults\n\ -_080232BC: .4byte gBattleTypeFlags\n\ -_080232C0: .4byte gNoOfAllBanks\n\ -_080232C4:\n\ - adds r0, r7, 0\n\ - bl GetBankIdentity\n\ - movs r1, 0x1\n\ - eors r0, r1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetBankByPlayerAI\n\ - ldr r4, _08023310 @ =gActiveBank\n\ - strb r0, [r4]\n\ - ldr r0, _08023314 @ =gAbsentBankFlags\n\ - ldrb r1, [r0]\n\ - ldr r2, _08023318 @ =gBitTable\n\ - ldrb r3, [r4]\n\ - lsls r0, r3, 2\n\ - adds r0, r2\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _080232F4\n\ - movs r0, 0x2\n\ - eors r3, r0\n\ - strb r3, [r4]\n\ -_080232F4:\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl EmitLinkStandbyMsg\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ -_08023302:\n\ - add sp, 0x4\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08023310: .4byte gActiveBank\n\ -_08023314: .4byte gAbsentBankFlags\n\ -_08023318: .4byte gBitTable\n\ - .syntax divided"); -} - -static void atk51_switch_handle_order(void) -{ - int i; - if (gBattleExecBuffer) - return; - - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - switch (BSScriptRead8(gBattlescriptCurrInstr + 2)) - { - case 0: - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gBattleBufferB[i][0] == 0x22) - ewram[i + 0x16068] = gBattleBufferB[i][1]; - } - break; - case 1: - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - sub_8012258(gActiveBank); - break; - case 2: - gBattleCommunication[0] = gBattleBufferB[gActiveBank][1]; - ewram[gActiveBank + 0x16068] = gBattleBufferB[gActiveBank][1]; - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - - ewram[(gActiveBank) * 3 + (0x1606C + 0)] &= 0xF; - ewram[(gActiveBank) * 3 + (0x1606C + 0)] |= (gBattleBufferB[gActiveBank][2] & 0xF0); - ewram[(gActiveBank) * 3 + (0x1606C + 1)] = gBattleBufferB[gActiveBank][3]; - - ewram[(gActiveBank ^ 2) * 3 + (0x1606C + 0)] &= (0xF0); - ewram[(gActiveBank ^ 2) * 3 + (0x1606C + 0)] |= (gBattleBufferB[gActiveBank][2] & 0xF0) >> 4; - ewram[(gActiveBank ^ 2) * 3 + (0x1606C + 2)] = gBattleBufferB[gActiveBank][3]; - } - else - sub_8012258(gActiveBank); - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 6; - gBattleTextBuff1[2] = gBattleMons[gBankAttacker].species; - gBattleTextBuff1[3] = gBattleMons[gBankAttacker].species >> 8; - gBattleTextBuff1[4] = 0xFF; - - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 7; - gBattleTextBuff2[2] = gActiveBank; - gBattleTextBuff2[3] = gBattleBufferB[gActiveBank][1]; - gBattleTextBuff2[4] = 0xFF; - break; - } - gBattlescriptCurrInstr += 3; -} - -static void atk52_switch_in_effects(void) -{ - int i; - - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - sub_80157C4(gActiveBank); - gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank)); - gSpecialStatuses[gActiveBank].flag40 = 0; - - if (!(gSideAffecting[GetBankSide(gActiveBank)] & SIDE_STATUS_SPIKES_DAMAGED) && (gSideAffecting[GetBankSide(gActiveBank)] & SIDE_STATUS_SPIKES) - && gBattleMons[gActiveBank].type1 != TYPE_FLYING && gBattleMons[gActiveBank].type2 != TYPE_FLYING && gBattleMons[gActiveBank].ability != ABILITY_LEVITATE) - { - u8 spikesDmg; - - gSideAffecting[GetBankSide(gActiveBank)] |= SIDE_STATUS_SPIKES_DAMAGED; - - spikesDmg = (5 - gSideTimer[GetBankSide(gActiveBank)].spikesAmount) * 2; - gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / (spikesDmg); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - - BATTLE_STRUCT->scriptingActive = gActiveBank; - b_movescr_stack_push_cursor(); - - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0) - gBattlescriptCurrInstr = gUnknown_081D919F; - else if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 1) - gBattlescriptCurrInstr = gUnknown_081D9171; - else - gBattlescriptCurrInstr = gUnknown_081D91CD; - } - else - { - if (gBattleMons[gActiveBank].ability == ABILITY_TRUANT) - { - gDisableStructs[gActiveBank].truantCounter = 1; - } - - if (AbilityBattleEffects(0, gActiveBank, 0, 0, 0) == 0 && ItemBattleEffects(0, gActiveBank, 0) == 0) - { - gSideAffecting[GetBankSide(gActiveBank)] &= ~(SIDE_STATUS_SPIKES_DAMAGED); - - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gTurnOrder[i] == gActiveBank) - gUnknown_02024A76[i] = 0xC; - } - - for (i = 0; i < gNoOfAllBanks; i++) - { - *(HP_ON_SWITCHOUT + GetBankSide(i)) = gBattleMons[i].hp; - } - - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 5) - { - u32 hitmark = gHitMarker >> 0x1C; - gBank1++; - while (1) - { - if (hitmark & gBitTable[gBank1] && !(gAbsentBankFlags & gBitTable[gBank1])) - break; - if (gBank1 >= gNoOfAllBanks) - break; - gBank1++; - } - } - gBattlescriptCurrInstr += 2; - } - } -} - -static void atk53_trainer_slide(void) -{ - if (!BSScriptRead8(gBattlescriptCurrInstr + 1)) - gActiveBank = GetBankByPlayerAI(0); - else - gActiveBank = GetBankByPlayerAI(1); - - EmitTrainerSlide(0); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 2; -} - -static void atk54_effectiveness_sound(void) -{ - gActiveBank = gBankAttacker; - EmitEffectivenessSound(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 3; -} - -static void atk55_play_sound(void) -{ - gActiveBank = gBankAttacker; - EmitPlaySound(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 3; -} - -static void atk56_fainting_cry(void) -{ - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - EmitFaintingCry(0); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 2; -} - -static void atk57(void) -{ - gActiveBank = GetBankByPlayerAI(0); - dp01_build_cmdbuf_x37_a(0, gBattleOutcome); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 1; -} - -static void atk58_return_to_ball(void) -{ - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - EmitReturnPokeToBall(0, 1); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 2; -} - -void atk59_learnmove_inbattle(void) -{ - u8* loc1 = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - u8* loc2 = BSScriptReadPtr(gBattlescriptCurrInstr + 5); - - u16 ret = sub_803B7C8(&gPlayerParty[BATTLE_STRUCT->expGetterID], BSScriptRead8(gBattlescriptCurrInstr + 9)); - while (ret == 0xFFFE) - ret = sub_803B7C8(&gPlayerParty[BATTLE_STRUCT->expGetterID], 0); - - if (ret == 0) - { - gBattlescriptCurrInstr = loc2; - } - else if (ret == 0xFFFF) - { - gBattlescriptCurrInstr += 10; - } - else - { - gActiveBank = GetBankByPlayerAI(0); - if (gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) - GiveMoveToBattleMon(&gBattleMons[gActiveBank], ret); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) //what is else if - { - gActiveBank = GetBankByPlayerAI(2); - if (gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) - GiveMoveToBattleMon(&gBattleMons[gActiveBank], ret); - } - gBattlescriptCurrInstr = loc1; - } -} - -void sub_8023A80(void) -{ - sub_802BBD4(0x18, 8, 0x1D, 0xD, 0); - InitWindow(&gUnknown_03004210, gUnknown_08400D7A, 0x100, 0x19, 0x9); - sub_8002F44(&gUnknown_03004210); - sub_814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20); -} - -void sub_8023AD8(void) -{ - sub_802BBD4(0x18, 8, 0x1D, 0xD, 1); - DestroyMenuCursor(); -} - -static void atk5A(void) -{ - gActiveBank = 0; - switch (BATTLE_STRUCT->atk5A_StateTracker) - { - case 0: - sub_8023A80(); - BATTLE_STRUCT->atk5A_StateTracker++; - gBattleCommunication[1] = 0; - sub_802BC6C(); - break; - case 1: - if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 1; - sub_802BC6C(); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gBattleCommunication[1] == 0) - { - sub_8023AD8(); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - BATTLE_STRUCT->atk5A_StateTracker++; - return; - } - goto state_tracker_4; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - state_tracker_4: - BATTLE_STRUCT->atk5A_StateTracker = 4; - } - break; - case 2: - if (!gPaletteFade.active) - { - sub_809D9F0(gPlayerParty, BATTLE_STRUCT->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, word_2024E82); - BATTLE_STRUCT->atk5A_StateTracker++; - } - break; - case 3: - if (!gPaletteFade.active && gMain.callback2 == sub_800F808) - { - u8 move_pos = sub_809FA30(); - if (move_pos == 4) - { - BATTLE_STRUCT->atk5A_StateTracker = 4; - } - else - { - u16 move = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MOVE1 + move_pos); - if (IsHMMove2(move)) - { - PrepareStringBattle(0x13F, gActiveBank); - BATTLE_STRUCT->atk5A_StateTracker = 5; - } - else - { - u8 *ptr; - - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - ptr = gBattleTextBuff2; - { - ptr[0] = 0xFD; - ptr[1] = 2; - ptr[2] = move; - ptr[3] = ((move & 0xFF00) >> 8); - ptr += 4; - } - ptr[0] = 0xFF; - RemoveMonPPBonus(&gPlayerParty[BATTLE_STRUCT->expGetterID], move_pos); - SetMonMoveSlot(&gPlayerParty[BATTLE_STRUCT->expGetterID], word_2024E82, move_pos); - if (gBattlePartyID[0] == BATTLE_STRUCT->expGetterID && !(gBattleMons[0].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[0].unk18_b & gBitTable[move_pos])) - { - RemoveBattleMonPPBonus(&gBattleMons[0], move_pos); - SetBattleMonMoveSlot(&gBattleMons[0], word_2024E82, move_pos); - } - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlePartyID[2] == BATTLE_STRUCT->expGetterID && !(gBattleMons[2].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[2].unk18_b & gBitTable[move_pos])) - { - RemoveBattleMonPPBonus(&gBattleMons[2], move_pos); - SetBattleMonMoveSlot(&gBattleMons[2], word_2024E82, move_pos); - } - } - } - } - break; - case 4: - sub_8023AD8(); - gBattlescriptCurrInstr += 5; - break; - case 5: - if (gBattleExecBuffer == 0) - { - BATTLE_STRUCT->atk5A_StateTracker = 2; - } - break; - } -} - -static void atk5B_80256E0(void) -{ - switch (BATTLE_STRUCT->atk5A_StateTracker) - { - case 0: - sub_8023A80(); - BATTLE_STRUCT->atk5A_StateTracker++; - gBattleCommunication[1] = 0; - sub_802BC6C(); - break; - case 1: - if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 1; - sub_802BC6C(); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gBattleCommunication[1] != 0) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; - sub_8023AD8(); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - sub_8023AD8(); - } - } -} - -static void atk5C_hitanimation(void) -{ - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) - gBattlescriptCurrInstr += 2; - else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBank].substituteHP == 0) - { - EmitHitAnimation(0); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 2; - } - else - gBattlescriptCurrInstr += 2; -} - -#define MONEY_UNKNOWN ((*(u8*)(0x02017000 + 0x94))) - -#ifdef NONMATCHING -static void atk5D_getmoneyreward(void) -{ - int i = 0; - u8 r5 = 0; - u32 money_to_give; - if (gTrainerBattleOpponent == 0x400) - { - money_to_give = 2 * BATTLE_STRUCT->moneyMultiplier * MONEY_UNKNOWN; - } - else - { - switch(gTrainers[gTrainerBattleOpponent].partyFlags) - { - case 0: - { - const struct PokeTrainerData1 *data = &gTrainers[gTrainerBattleOpponent].party->noItemNoMoves; - r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl; - } - break; - case 2: - { - const struct PokeTrainerData2 *data = &gTrainers[gTrainerBattleOpponent].party->itemNoMoves; - r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl; - } - break; - case 1: - case 3: - { - const struct PokeTrainerData3 *data = &gTrainers[gTrainerBattleOpponent].party->itemMoves; - r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl; - } - break; - } - for (; gTrainerMoney[i * 4] != 0xFF && gTrainerMoney[i * 4 + 1] != gTrainers[gTrainerBattleOpponent].trainerClass ; i++) {} - - money_to_give = (r5 << 2) * BATTLE_STRUCT->moneyMultiplier; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - money_to_give = 2 * gTrainerMoney[i * 4 + 1] * money_to_give; - else - money_to_give = 1 * gTrainerMoney[i * 4 + 1] * money_to_give; - } - - sub_80B79B8(&gSaveBlock1.money, money_to_give); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 4; - gBattleTextBuff1[3] = 5; - gBattleTextBuff1[4] = BYTE0(money_to_give); - gBattleTextBuff1[5] = BYTE1(money_to_give); - gBattleTextBuff1[6] = BYTE2(money_to_give); - gBattleTextBuff1[7] = BYTE3(money_to_give); - gBattleTextBuff1[8] = 0xFF; - - gBattlescriptCurrInstr += 1; -} -#else -__attribute__((naked)) -static void atk5D_getmoneyreward(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - movs r6, 0\n\ - movs r5, 0\n\ - ldr r0, _08024048 @ =gTrainerBattleOpponent\n\ - ldrh r2, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 3\n\ - cmp r2, r1\n\ - bne _08024058\n\ - ldr r0, _0802404C @ =0x02017000\n\ - adds r1, r0, 0\n\ - adds r1, 0x94\n\ - ldrb r2, [r1]\n\ - ldr r1, _08024050 @ =0xfffff056\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r4, r2, 0\n\ - muls r4, r0\n\ - ldr r0, _08024054 @ =gSaveBlock1 + 0x490\n\ - mov r8, r0\n\ - b _08024140\n\ - .align 2, 0\n\ -_08024048: .4byte gTrainerBattleOpponent\n\ -_0802404C: .4byte 0x02017000\n\ -_08024050: .4byte 0xfffff056\n\ -_08024054: .4byte gSaveBlock1 + 0x490\n\ -_08024058:\n\ - ldr r2, _08024074 @ =gTrainers\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r3, r0, 3\n\ - adds r4, r3, r2\n\ - ldrb r1, [r4]\n\ - cmp r1, 0x1\n\ - beq _080240AE\n\ - cmp r1, 0x1\n\ - bgt _08024078\n\ - cmp r1, 0\n\ - beq _08024082\n\ - b _080240C4\n\ - .align 2, 0\n\ -_08024074: .4byte gTrainers\n\ -_08024078:\n\ - cmp r1, 0x2\n\ - beq _08024098\n\ - cmp r1, 0x3\n\ - beq _080240AE\n\ - b _080240C4\n\ -_08024082:\n\ - adds r0, r2, 0\n\ - adds r0, 0x24\n\ - adds r0, r3, r0\n\ - ldr r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - subs r0, 0x8\n\ - b _080240C2\n\ -_08024098:\n\ - adds r0, r2, 0\n\ - adds r0, 0x24\n\ - adds r0, r3, r0\n\ - ldr r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - subs r0, 0x8\n\ - b _080240C2\n\ -_080240AE:\n\ - adds r0, r2, 0\n\ - adds r0, 0x24\n\ - adds r0, r3, r0\n\ - ldr r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - subs r0, 0x10\n\ -_080240C2:\n\ - ldrb r5, [r0, 0x2]\n\ -_080240C4:\n\ - ldr r0, _08024120 @ =gTrainerMoney\n\ - lsls r1, r6, 2\n\ - adds r3, r1, r0\n\ - ldrb r1, [r3]\n\ - mov r12, r0\n\ - lsls r4, r5, 2\n\ - ldr r5, _08024124 @ =0x02000000\n\ - ldr r7, _08024128 @ =gBattleTypeFlags\n\ - ldr r0, _0802412C @ =gSaveBlock1 + 0x490\n\ - mov r8, r0\n\ - cmp r1, 0xFF\n\ - beq _080240FE\n\ - ldr r2, _08024130 @ =gTrainers\n\ - ldr r0, _08024134 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - ldrb r2, [r0, 0x1]\n\ - adds r1, r3, 0\n\ -_080240EE:\n\ - ldrb r0, [r1]\n\ - cmp r0, r2\n\ - beq _080240FE\n\ - adds r1, 0x4\n\ - adds r6, 0x1\n\ - ldrb r0, [r1]\n\ - cmp r0, 0xFF\n\ - bne _080240EE\n\ -_080240FE:\n\ - ldr r1, _08024138 @ =0x00016056\n\ - adds r0, r5, r1\n\ - ldrb r0, [r0]\n\ - adds r3, r4, 0\n\ - muls r3, r0\n\ - lsls r0, r6, 2\n\ - add r0, r12\n\ - ldrb r2, [r0, 0x1]\n\ - ldrh r1, [r7]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0802413C\n\ - lsls r0, r2, 1\n\ - adds r4, r3, 0\n\ - muls r4, r0\n\ - b _08024140\n\ - .align 2, 0\n\ -_08024120: .4byte gTrainerMoney\n\ -_08024124: .4byte 0x02000000\n\ -_08024128: .4byte gBattleTypeFlags\n\ -_0802412C: .4byte gSaveBlock1 + 0x490\n\ -_08024130: .4byte gTrainers\n\ -_08024134: .4byte gTrainerBattleOpponent\n\ -_08024138: .4byte 0x00016056\n\ -_0802413C:\n\ - adds r4, r3, 0\n\ - muls r4, r2\n\ -_08024140:\n\ - mov r0, r8\n\ - adds r1, r4, 0\n\ - bl sub_80B79B8\n\ - ldr r1, _0802418C @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x1\n\ - strb r0, [r1, 0x1]\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x2]\n\ - movs r0, 0x5\n\ - strb r0, [r1, 0x3]\n\ - strb r4, [r1, 0x4]\n\ - movs r0, 0xFF\n\ - lsls r0, 8\n\ - ands r0, r4\n\ - lsrs r0, 8\n\ - strb r0, [r1, 0x5]\n\ - movs r0, 0xFF\n\ - lsls r0, 16\n\ - ands r0, r4\n\ - lsrs r0, 16\n\ - strb r0, [r1, 0x6]\n\ - lsrs r0, r4, 24\n\ - strb r0, [r1, 0x7]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x8]\n\ - ldr r1, _08024190 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x1\n\ - str r0, [r1]\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0802418C: .4byte gBattleTextBuff1\n\ -_08024190: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} -#endif //NONMATCHING - -static void atk5E_8025A70(void) -{ - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - switch (gBattleCommunication[0]) - { - case 0: - EmitGetAttributes(0, REQUEST_ALL_BATTLE, 0); - MarkBufferBankForExecution(gActiveBank); - gBattleCommunication[0]++; - break; - case 1: - if (gBattleExecBuffer == 0) - { - int i; - struct BattlePokemon* bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBank][4]; - for (i = 0; i < 4; i++) - { - gBattleMons[gActiveBank].moves[i] = bufferPoke->moves[i]; - gBattleMons[gActiveBank].pp[i] = bufferPoke->pp[i]; - } - gBattlescriptCurrInstr += 2; - } - break; - } -} - -static void atk5F_8025B24(void) -{ - gActiveBank = gBankAttacker; - gBankAttacker = gBankTarget; - gBankTarget = gActiveBank; - //what is xor... - if (gHitMarker & HITMARKER_PURSUIT_TRAP) - gHitMarker &= ~(HITMARKER_PURSUIT_TRAP); - else - gHitMarker |= HITMARKER_PURSUIT_TRAP; - gBattlescriptCurrInstr++; -} - -static void atk60_increment_gamestat(void) -{ - if (GetBankSide(gBankAttacker) == 0) - { - IncrementGameStat(BSScriptRead8(gBattlescriptCurrInstr + 1)); - } - gBattlescriptCurrInstr += 2; -} - -struct hp_status -{ - u16 hp; - u32 status; -}; - -static void atk61_8025BA4(void) -{ - int i; - struct Pokemon* party; - struct hp_status hpStatus[6]; - if (gBattleExecBuffer) - return; - - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - if (GetBankSide(gActiveBank) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - - for (i = 0; i < 6; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES2) == 0 || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatus[i].hp = 0xFFFF; - hpStatus[i].status = 0; - } - else - { - hpStatus[i].hp = GetMonData(&party[i], MON_DATA_HP); - hpStatus[i].status = GetMonData(&party[i], MON_DATA_STATUS); - } - } - dp01_build_cmdbuf_x30_TODO(0, (u8*)(hpStatus), 1); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 2; -} - -static void atk62_08025C6C(void) -{ - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - dp01_build_cmdbuf_x31_31_31_31(0); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 2; -} - -static void atk63_jumptorandomattack(void) -{ - if (BSScriptRead8(gBattlescriptCurrInstr + 1)) - gCurrentMove = gRandomMove; - else - gUnknown_02024BE8 = gCurrentMove = gRandomMove; - gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]; -} - -static void atk64_statusanimation(void) -{ - if (gBattleExecBuffer == 0) - { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - if (!(gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBank].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - EmitStatusAnimation(0, 0, gBattleMons[gActiveBank].status1); - MarkBufferBankForExecution(gActiveBank); - } - gBattlescriptCurrInstr += 2; - } -} - -static void atk65_status2animation(void) -{ - if (gBattleExecBuffer == 0) - { - u32 possible_to_anim; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - possible_to_anim = BSScriptRead32(gBattlescriptCurrInstr + 2); - if (!(gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBank].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - EmitStatusAnimation(0, 1, gBattleMons[gActiveBank].status2 & possible_to_anim); - MarkBufferBankForExecution(gActiveBank); - } - gBattlescriptCurrInstr += 6; - } -} - -static void atk66_chosenstatusanimation(void) -{ - if (gBattleExecBuffer == 0) - { - u32 status; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - status = BSScriptRead32(gBattlescriptCurrInstr + 3); - if (!(gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBank].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) - { - EmitStatusAnimation(0, BSScriptRead8(gBattlescriptCurrInstr + 2), status); - MarkBufferBankForExecution(gActiveBank); - } - gBattlescriptCurrInstr += 7; - } -} - -static void atk67_8025ECC(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - sub_8023A80(); - gBattleCommunication[0]++; - gBattleCommunication[1] = 0; - sub_802BC6C(); - break; - case 1: - if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 1; - sub_802BC6C(); - } - if (gMain.newKeys & B_BUTTON) - { - gBattleCommunication[1] = 1; - PlaySE(SE_SELECT); - sub_8023AD8(); - gBattlescriptCurrInstr++; - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_8023AD8(); - gBattlescriptCurrInstr++; - } - break; - } -} - -static void atk68_80246A0(void) -{ - int i; - for (i = 0; i < gNoOfAllBanks; i++) - { - gUnknown_02024A76[i] = 0xC; - } - gBattlescriptCurrInstr++; -} - -static void atk69_dmg_adjustment2(void) //literally a copy of atk07 except theres no rand dmg modifier... -{ - u8 hold_effect, quality; - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) - { - RecordItemBattle(gBankTarget, hold_effect); - gSpecialStatuses[gBankTarget].focusBanded = 1; - } - if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE) - goto END; - if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBankTarget].endured - && !gSpecialStatuses[gBankTarget].focusBanded) - goto END; - if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) - goto END; - - gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1; - - if (gProtectStructs[gBankTarget].endured) - { - gBattleMoveFlags |= MOVESTATUS_ENDURED; - goto END; - } - if (gSpecialStatuses[gBankTarget].focusBanded) - { - gBattleMoveFlags |= MOVESTATUS_HUNGON; - gLastUsedItem = gBattleMons[gBankTarget].item; - } - - END: - gBattlescriptCurrInstr++; -} - -void atk6A_removeitem(void) -{ - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - #define USED_HELD_ITEMS(bank) (*(u16 *)&ewram[0x160CC + 2 * (bank)]) - USED_HELD_ITEMS(gActiveBank) = gBattleMons[gActiveBank].item; - - gBattleMons[gActiveBank].item = 0; - EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 2; -} - -static void atk6B_atknameinbuff1(void) -{ - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 7; - gBattleTextBuff1[2] = gBankAttacker; - gBattleTextBuff1[3] = gBattlePartyID[gBankAttacker]; - gBattleTextBuff1[4] = 0xFF; - gBattlescriptCurrInstr++; -} - -#ifdef NONMATCHING -static void atk6C_lvlbox_display(void) -{ - u8 r1 = 0; - u8 r7 = 0; - switch (BATTLE_STRUCT->atk6C_statetracker) - { - case 0: - sub_802BBD4(0xB, 0, 0x1D, 0x7, r1); - StringCopy(gStringVar4, gUnknown_08400D9F); - - } -} - -#else -__attribute__((naked)) -static void atk6C_lvlbox_display(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - movs r1, 0\n\ - movs r7, 0\n\ - ldr r0, _08024928 @ =0x02000000\n\ - mov r10, r0\n\ - ldr r4, _0802492C @ =0x0001609c\n\ - add r4, r10\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x1\n\ - bne _0802491C\n\ - b _08024AF4\n\ -_0802491C:\n\ - cmp r0, 0x1\n\ - bgt _08024930\n\ - cmp r0, 0\n\ - beq _0802493E\n\ - b _08024C38\n\ - .align 2, 0\n\ -_08024928: .4byte 0x02000000\n\ -_0802492C: .4byte 0x0001609c\n\ -_08024930:\n\ - cmp r0, 0x2\n\ - bne _08024936\n\ - b _08024C04\n\ -_08024936:\n\ - cmp r0, 0x3\n\ - bne _0802493C\n\ - b _08024C30\n\ -_0802493C:\n\ - b _08024C38\n\ -_0802493E:\n\ - str r1, [sp]\n\ - movs r0, 0xB\n\ - movs r1, 0\n\ - movs r2, 0x1D\n\ - movs r3, 0x7\n\ - bl sub_802BBD4\n\ - ldr r0, _0802499C @ =gStringVar4\n\ - ldr r1, _080249A0 @ =gUnknown_08400D9F\n\ - bl StringCopy\n\ - adds r5, r0, 0\n\ - movs r1, 0\n\ - mov r8, r1\n\ -_0802495A:\n\ - movs r2, 0\n\ - mov r9, r2\n\ - ldr r0, _080249A4 @ =gUnknown_0840165C\n\ - mov r1, r8\n\ - lsls r4, r1, 2\n\ - adds r0, r4, r0\n\ - ldr r1, [r0]\n\ - adds r0, r5, 0\n\ - bl StringAppend\n\ - adds r5, r0, 0\n\ - ldr r0, _080249A8 @ =0x02000000\n\ - ldr r2, _080249AC @ =0x00016018\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _080249B0 @ =gPlayerParty\n\ - adds r0, r1\n\ - ldr r1, _080249B4 @ =gLevelUpStatBoxStats\n\ - add r1, r8\n\ - ldrb r1, [r1]\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - mov r0, r8\n\ - cmp r0, 0x5\n\ - bhi _08024A1A\n\ - ldr r0, _080249B8 @ =_080249BC\n\ - adds r0, r4, r0\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0802499C: .4byte gStringVar4\n\ -_080249A0: .4byte gUnknown_08400D9F\n\ -_080249A4: .4byte gUnknown_0840165C\n\ -_080249A8: .4byte 0x02000000\n\ -_080249AC: .4byte 0x00016018\n\ -_080249B0: .4byte gPlayerParty\n\ -_080249B4: .4byte gLevelUpStatBoxStats\n\ -_080249B8: .4byte _080249BC\n\ - .align 2, 0\n\ -_080249BC:\n\ - .4byte _080249D4\n\ - .4byte _080249E0\n\ - .4byte _080249EC\n\ - .4byte _080249F8\n\ - .4byte _08024A04\n\ - .4byte _08024A10\n\ -_080249D4:\n\ - ldr r0, _080249DC @ =0x02017180\n\ - ldrh r0, [r0]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_080249DC: .4byte 0x02017180\n\ -_080249E0:\n\ - ldr r0, _080249E8 @ =0x02017180\n\ - ldrh r0, [r0, 0x8]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_080249E8: .4byte 0x02017180\n\ -_080249EC:\n\ - ldr r0, _080249F4 @ =0x02017180\n\ - ldrh r0, [r0, 0x2]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_080249F4: .4byte 0x02017180\n\ -_080249F8:\n\ - ldr r0, _08024A00 @ =0x02017180\n\ - ldrh r0, [r0, 0xA]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_08024A00: .4byte 0x02017180\n\ -_08024A04:\n\ - ldr r0, _08024A0C @ =0x02017180\n\ - ldrh r0, [r0, 0x4]\n\ - b _08024A14\n\ - .align 2, 0\n\ -_08024A0C: .4byte 0x02017180\n\ -_08024A10:\n\ - ldr r0, _08024A54 @ =0x02017180\n\ - ldrh r0, [r0, 0x6]\n\ -_08024A14:\n\ - subs r0, r1, r0\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ -_08024A1A:\n\ - lsls r0, r7, 16\n\ - asrs r0, 16\n\ - cmp r0, 0\n\ - bge _08024A2C\n\ - negs r0, r0\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ - movs r1, 0x1\n\ - add r9, r1\n\ -_08024A2C:\n\ - movs r0, 0xFC\n\ - strb r0, [r5]\n\ - movs r0, 0x13\n\ - strb r0, [r5, 0x1]\n\ - movs r1, 0x1\n\ - mov r2, r8\n\ - ands r1, r2\n\ - lsls r0, r1, 3\n\ - adds r0, r1\n\ - adds r0, 0x5\n\ - lsls r0, 3\n\ - adds r0, 0x6\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - mov r0, r9\n\ - cmp r0, 0\n\ - beq _08024A5C\n\ - ldr r1, _08024A58 @ =gUnknown_08400DAC\n\ - b _08024A5E\n\ - .align 2, 0\n\ -_08024A54: .4byte 0x02017180\n\ -_08024A58: .4byte gUnknown_08400DAC\n\ -_08024A5C:\n\ - ldr r1, _08024AA4 @ =gUnknown_08400DAA\n\ -_08024A5E:\n\ - adds r0, r5, 0\n\ - bl StringCopy\n\ - adds r5, r0, 0\n\ - movs r6, 0xFC\n\ - strb r6, [r5]\n\ - movs r4, 0x14\n\ - strb r4, [r5, 0x1]\n\ - movs r0, 0x6\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - lsls r1, r7, 16\n\ - asrs r1, 16\n\ - adds r0, r5, 0\n\ - movs r2, 0x1\n\ - movs r3, 0x2\n\ - bl ConvertIntToDecimalStringN\n\ - adds r5, r0, 0\n\ - strb r6, [r5]\n\ - strb r4, [r5, 0x1]\n\ - movs r0, 0\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - movs r0, 0x1\n\ - mov r1, r8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08024AA8\n\ - movs r0, 0xFE\n\ - strb r0, [r5]\n\ - movs r0, 0xFF\n\ - strb r0, [r5, 0x1]\n\ - adds r5, 0x1\n\ - b _08024AB8\n\ - .align 2, 0\n\ -_08024AA4: .4byte gUnknown_08400DAA\n\ -_08024AA8:\n\ - strb r6, [r5]\n\ - movs r0, 0x11\n\ - strb r0, [r5, 0x1]\n\ - movs r0, 0x8\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - movs r0, 0xFF\n\ - strb r0, [r5]\n\ -_08024AB8:\n\ - movs r2, 0x1\n\ - add r8, r2\n\ - mov r0, r8\n\ - cmp r0, 0x5\n\ - bgt _08024AC4\n\ - b _0802495A\n\ -_08024AC4:\n\ - ldr r4, _08024AE4 @ =gUnknown_03004210\n\ - ldr r1, _08024AE8 @ =gStringVar4\n\ - adds r2, 0xFF\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - adds r0, r4, 0\n\ - movs r3, 0xC\n\ - bl InitWindow\n\ - adds r0, r4, 0\n\ - bl sub_8002F44\n\ - ldr r1, _08024AEC @ =0x02000000\n\ - ldr r2, _08024AF0 @ =0x0001609c\n\ - adds r1, r2\n\ - b _08024BEA\n\ - .align 2, 0\n\ -_08024AE4: .4byte gUnknown_03004210\n\ -_08024AE8: .4byte gStringVar4\n\ -_08024AEC: .4byte 0x02000000\n\ -_08024AF0: .4byte 0x0001609c\n\ -_08024AF4:\n\ - ldr r0, _08024B94 @ =gMain\n\ - ldrh r0, [r0, 0x2E]\n\ - cmp r0, 0\n\ - bne _08024AFE\n\ - b _08024C38\n\ -_08024AFE:\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - ldr r0, _08024B98 @ =gStringVar4\n\ - ldr r1, _08024B9C @ =gUnknown_08400D9F\n\ - bl StringCopy\n\ - adds r5, r0, 0\n\ - movs r0, 0\n\ - mov r8, r0\n\ - mov r9, r0\n\ - movs r6, 0xFC\n\ - movs r7, 0x14\n\ - ldr r1, _08024BA0 @ =0x00016018\n\ - add r10, r1\n\ -_08024B1C:\n\ - ldr r1, _08024BA4 @ =gUnknown_0840165C\n\ - mov r2, r8\n\ - lsls r0, r2, 2\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - adds r0, r5, 0\n\ - bl StringAppend\n\ - adds r5, r0, 0\n\ - mov r0, r10\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _08024BA8 @ =gPlayerParty\n\ - adds r0, r1\n\ - ldr r1, _08024BAC @ =gLevelUpStatBoxStats\n\ - add r1, r8\n\ - ldrb r1, [r1]\n\ - bl GetMonData\n\ - adds r1, r0, 0\n\ - strb r6, [r5]\n\ - movs r0, 0x13\n\ - strb r0, [r5, 0x1]\n\ - movs r4, 0x1\n\ - mov r2, r8\n\ - ands r4, r2\n\ - lsls r0, r4, 3\n\ - adds r0, r4\n\ - adds r0, 0x5\n\ - lsls r0, 3\n\ - adds r0, 0x6\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - strb r6, [r5]\n\ - strb r7, [r5, 0x1]\n\ - movs r0, 0x6\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - lsls r1, 16\n\ - asrs r1, 16\n\ - adds r0, r5, 0\n\ - movs r2, 0x1\n\ - movs r3, 0x3\n\ - bl ConvertIntToDecimalStringN\n\ - adds r5, r0, 0\n\ - strb r6, [r5]\n\ - strb r7, [r5, 0x1]\n\ - mov r0, r9\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - cmp r4, 0\n\ - beq _08024BB0\n\ - movs r0, 0xFE\n\ - strb r0, [r5]\n\ - movs r0, 0xFF\n\ - strb r0, [r5, 0x1]\n\ - adds r5, 0x1\n\ - b _08024BC0\n\ - .align 2, 0\n\ -_08024B94: .4byte gMain\n\ -_08024B98: .4byte gStringVar4\n\ -_08024B9C: .4byte gUnknown_08400D9F\n\ -_08024BA0: .4byte 0x00016018\n\ -_08024BA4: .4byte gUnknown_0840165C\n\ -_08024BA8: .4byte gPlayerParty\n\ -_08024BAC: .4byte gLevelUpStatBoxStats\n\ -_08024BB0:\n\ - strb r6, [r5]\n\ - movs r0, 0x11\n\ - strb r0, [r5, 0x1]\n\ - movs r0, 0x8\n\ - strb r0, [r5, 0x2]\n\ - adds r5, 0x3\n\ - movs r0, 0xFF\n\ - strb r0, [r5]\n\ -_08024BC0:\n\ - movs r1, 0x1\n\ - add r8, r1\n\ - mov r2, r8\n\ - cmp r2, 0x5\n\ - ble _08024B1C\n\ - ldr r4, _08024BF4 @ =gUnknown_03004210\n\ - ldr r1, _08024BF8 @ =gStringVar4\n\ - movs r2, 0x80\n\ - lsls r2, 1\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - adds r0, r4, 0\n\ - movs r3, 0xC\n\ - bl InitWindow\n\ - adds r0, r4, 0\n\ - bl sub_8002F44\n\ - ldr r1, _08024BFC @ =0x02000000\n\ - ldr r0, _08024C00 @ =0x0001609c\n\ - adds r1, r0\n\ -_08024BEA:\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - b _08024C38\n\ - .align 2, 0\n\ -_08024BF4: .4byte gUnknown_03004210\n\ -_08024BF8: .4byte gStringVar4\n\ -_08024BFC: .4byte 0x02000000\n\ -_08024C00: .4byte 0x0001609c\n\ -_08024C04:\n\ - ldr r0, _08024C2C @ =gMain\n\ - ldrh r0, [r0, 0x2E]\n\ - cmp r0, 0\n\ - beq _08024C38\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - movs r0, 0xB\n\ - movs r1, 0\n\ - movs r2, 0x1D\n\ - movs r3, 0x7\n\ - bl sub_802BBD4\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - b _08024C38\n\ - .align 2, 0\n\ -_08024C2C: .4byte gMain\n\ -_08024C30:\n\ - ldr r1, _08024C48 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x1\n\ - str r0, [r1]\n\ -_08024C38:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08024C48: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} - -#endif - -static void atk6D_set_sentpokes_values(void) -{ - sub_80156DC(); - gBattlescriptCurrInstr++; -} - -static void atk6E_set_atk_to_player0(void) -{ - gBankAttacker = GetBankByPlayerAI(0); - gBattlescriptCurrInstr++; -} - -static void atk6F_set_visible(void) -{ - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - EmitSpriteInvisibility(0, 0); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 2; -} - -static void atk70_record_ability(void) -{ - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - RecordAbilityBattle(gActiveBank, gLastUsedAbility); - gBattlescriptCurrInstr += 1; //buggy, should be += 2, one byte for command, one byte for argument... -} - -void sub_8024CEC(void) -{ - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 2; - gBattleTextBuff2[2] = (word_2024E82); - gBattleTextBuff2[3] = uBYTE1_16(word_2024E82); - gBattleTextBuff2[4] = 0xFF; -} - -static void atk71_buffer_move_to_learn(void) -{ - sub_8024CEC(); - gBattlescriptCurrInstr++; -} - -static void atk72_jump_if_can_run_frombattle(void) -{ - if (sub_8014AB8(gBank1)) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; -} - -static void atk73_hp_thresholds(void) -{ - u8 opposing_bank; - s32 result; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - opposing_bank = gActiveBank ^ 1; - - result = gBattleMons[opposing_bank].hp * 100 / gBattleMons[opposing_bank].maxHP; - if (result == 0) - result = 1; - - if (result > 69 || !gBattleMons[opposing_bank].hp) - BATTLE_STRUCT->hpScale = 0; - else if (result > 39) - BATTLE_STRUCT->hpScale = 1; - else if (result > 9) - BATTLE_STRUCT->hpScale = 2; - else - BATTLE_STRUCT->hpScale = 3; - } - - gBattlescriptCurrInstr += 2; -} - -static void atk74_hp_thresholds2(void) -{ - u8 opposing_bank; - u8 hp_switchout; - s32 result; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - opposing_bank = gActiveBank ^ 1; - hp_switchout = ewram[2 * GetBankSide(opposing_bank) + 0x160bc]; //BATTLE_STRUCT->HP_OnSwitchout[GetBankSide(opposing_bank)]; - result = (hp_switchout - gBattleMons[opposing_bank].hp) * 100 / hp_switchout; - - if (gBattleMons[opposing_bank].hp >= hp_switchout) - BATTLE_STRUCT->hpScale = 0; - else if (result <= 29) - BATTLE_STRUCT->hpScale = 1; - else if (result <= 69) - BATTLE_STRUCT->hpScale = 2; - else - BATTLE_STRUCT->hpScale = 3; - } - - gBattlescriptCurrInstr += 2; -} - -static void atk75_8026A58(void) -{ - gBankInMenu = gBankAttacker; - sub_803E1B0(&gEnemyParty[gBattlePartyID[gBankAttacker]], gLastUsedItem, gBattlePartyID[gBankAttacker], 0, 1); - gBattlescriptCurrInstr += 1; -} - -static void atk76_various(void) -{ - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - switch (BSScriptRead8(gBattlescriptCurrInstr + 2)) - { - case 0: - CancelMultiTurnMoves(gActiveBank); - break; - case 1: - { - u8 side; - gBankAttacker = gBankTarget; - side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].followmeTimer && gBattleMons[gSideTimer[side].followmeTarget].hp) - gBankTarget = gSideTimer[side].followmeTarget; - else - gBankTarget = gActiveBank; - } - break; - case 2: - gBattleCommunication[0] = CanRunFromBattle(); - break; - case 3: - gBankTarget = sub_801B5C0(gCurrentMove, 0); - break; - case 4: - if (gHitMarker & HITMARKER_FAINTED(gActiveBank)) - gBattleCommunication[0] = 1; - else - gBattleCommunication[0] = 0; - break; - case 5: - gSpecialStatuses[gActiveBank].intimidatedPoke = 0; - gSpecialStatuses[gActiveBank].traced = 0; - break; - case 6: - { - int i; - u16* choiced_move; - if (gBattlePartyID[0] == BATTLE_STRUCT->expGetterID) - goto ACTIVE_0; - if (gBattlePartyID[2] != BATTLE_STRUCT->expGetterID) - break; - if (gBattlePartyID[0] == gBattlePartyID[2]) - { - ACTIVE_0: - gActiveBank = 0; - } - else - gActiveBank = 2; - - choiced_move = (u16*)(&ewram[gActiveBank * 2 + 0x160e8]); - for (i = 0; i < 4; i++) - { - if (gBattleMons[gActiveBank].moves[i] == *choiced_move) - break; - } - if (i == 4) - *choiced_move = 0; - } - break; - } - - gBattlescriptCurrInstr += 3; -} - -static void atk77_setprotect(void) //protect and endure -{ - bool8 not_last_turn = 1; - u16 last_move = gUnknown_02024C4C[gBankAttacker]; - - if (last_move != MOVE_PROTECT && last_move != MOVE_DETECT && last_move != MOVE_ENDURE) - gDisableStructs[gBankAttacker].protectUses = 0; - if (gCurrentMoveTurn == (gNoOfAllBanks - 1)) - not_last_turn = 0; - - if (sProtectSuccessRates[gDisableStructs[gBankAttacker].protectUses] > Random() && not_last_turn) - { - if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT) - { - gProtectStructs[gBankAttacker].protected = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) //what is else if - { - gProtectStructs[gBankAttacker].endured = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - gDisableStructs[gBankAttacker].protectUses++; - } - else - { - gDisableStructs[gBankAttacker].protectUses = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - gBattleMoveFlags |= MOVESTATUS_MISSED; - } - - gBattlescriptCurrInstr++; -} - -static void atk78_faintifabilitynotdamp(void) -{ - if (gBattleExecBuffer) - return; - - for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++) - { - if (gBattleMons[gBankTarget].ability == ABILITY_DAMP) - break; - } - - if (gBankTarget == gNoOfAllBanks) - { - gActiveBank = gBankAttacker; - gBattleMoveDamage = gBattleMons[gActiveBank].hp; - EmitHealthBarUpdate(0, 0x7FFF); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr++; - - for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++) - { - if (gBankTarget == gBankAttacker) - continue; - if (!(gAbsentBankFlags & gBitTable[gBankTarget])) - break; - } - } - else - { - gLastUsedAbility = ABILITY_DAMP; - RecordAbilityBattle(gBankTarget, gBattleMons[gBankTarget].ability); - gBattlescriptCurrInstr = gUnknown_081D9834; - } -} - -static void atk79_setatkhptozero(void) -{ - if (gBattleExecBuffer) - return; - - gActiveBank = gBankAttacker; - gBattleMons[gActiveBank].hp = 0; - EmitSetAttributes(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp); - MarkBufferBankForExecution(gActiveBank); - - gBattlescriptCurrInstr++; -} - -static void atk7A_jumpwhiletargetvalid(void) //used by intimidate to loop through all targets -{ - u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - for (gBankTarget++; ; gBankTarget++) - { - if (gBankTarget == gBankAttacker) - continue; - if (!(gAbsentBankFlags & gBitTable[gBankTarget])) - break; - } - - if (gBankTarget >= gNoOfAllBanks) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = jump_loc; - } - else - gBattlescriptCurrInstr += 5; -} - -static void atk7B_healhalfHP_if_possible(void) -{ - u8* fail_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - - if (BSScriptRead8(gBattlescriptCurrInstr + 5) == 1) - gBankTarget = gBankAttacker; - - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - - if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) - gBattlescriptCurrInstr = fail_loc; - else - gBattlescriptCurrInstr += 6; -} - -static void atk7C_8025508(void) -{ - u16 r7 = ewram[gBankAttacker * 2 + 0x160ac] | (ewram[gBankAttacker * 2 + 0x160ad] << 8); - u16 r6 = ewram[gBankAttacker * 4 + 0x16100] | (ewram[gBankAttacker * 4 + 0x16101] << 8); - u16 r5 = ewram[gBankAttacker * 4 + 0x16102] | (ewram[gBankAttacker * 4 + 0x16103] << 8); - - if (r7 !=0 && r7 != 0xFFFF) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCurrentMove = r7; - gBankTarget = sub_801B5C0(gCurrentMove, 0); - gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]; - } - else if (r6 != 0 && r5 != 0 && r6 != 0xFFFF && r5 != 0xFFFF) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - if (Random() & 1) - gCurrentMove = r6; - else - gCurrentMove = r5; - gBankTarget = sub_801B5C0(gCurrentMove, 0); - gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]; - } - else if (r6 != 0 && r6 != 0xFFFF) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCurrentMove = r6; - gBankTarget = sub_801B5C0(gCurrentMove, 0); - gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]; - } - else if (r5 != 0 && r5 != 0xFFFF) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCurrentMove = r5; - gBankTarget = sub_801B5C0(gCurrentMove, 0); - gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]; - } - else - { - gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr++; - } -} - -static void atk7D_set_rain(void) -{ - if (gBattleWeather & WEATHER_RAIN_ANY) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gBattleWeather = WEATHER_RAIN_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gWishFutureKnock.weatherDuration = 5; - } - gBattlescriptCurrInstr++; -} - -static void atk7E_setreflect(void) -{ - if (gSideAffecting[GetBankIdentity(gBankAttacker) & 1] & SIDE_STATUS_REFLECT) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else - { - gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_REFLECT; - gSideTimer[GetBankIdentity(gBankAttacker) & 1].reflectTimer = 5; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - gBattlescriptCurrInstr++; -} - -static void atk7F_setseeded(void) -{ - if (gBattleMoveFlags & MOVESTATUS_NOEFFECT || gStatuses3[gBankTarget] & STATUS3_LEECHSEED) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else if (gBattleMons[gBankTarget].type1 == TYPE_GRASS || gBattleMons[gBankTarget].type2 == TYPE_GRASS) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gStatuses3[gBankTarget] |= gBankAttacker; - gStatuses3[gBankTarget] |= STATUS3_LEECHSEED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - - gBattlescriptCurrInstr++; -} - -static void atk80_manipulatedamage(void) -{ - switch (BSScriptRead8(gBattlescriptCurrInstr + 1)) - { - case 0: - gBattleMoveDamage *= -1; - break; - case 1: - gBattleMoveDamage /= 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if ((gBattleMons[gBankTarget].maxHP / 2) < gBattleMoveDamage) - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; - break; - case 2: - gBattleMoveDamage *= 2; - break; - } - - gBattlescriptCurrInstr += 2; -} - -static void atk81_setrest(void) -{ - u8* fail_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - gActiveBank = gBankTarget = gBankAttacker; - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP * (-1); - if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) - gBattlescriptCurrInstr = fail_loc; - else - { - if (gBattleMons[gBankTarget].status1 & ((u8)(~STATUS_SLEEP))) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - - gBattleMons[gBankTarget].status1 = 3; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 5; - } -} - -static void atk82_jumpifnotfirstturn(void) -{ - u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - - if (gDisableStructs[gBankAttacker].isFirstTurn) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = jump_loc; -} - -static void atk83_nop(void) -{ - gBattlescriptCurrInstr++; -} - -bool8 sub_8025A44(u8 bank) //uproar wakeup check -{ - int i; - for (i = 0; i < gNoOfAllBanks; i++) - { - if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || gBattleMons[bank].ability == ABILITY_SOUNDPROOF) //wtf gamefreak, you should check this only once, not every time in a loop... - continue; - BATTLE_STRUCT->scriptingActive = i; - if (gBankTarget == 0xFF) - gBankTarget = i; - else if (gBankTarget == i) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - break; - } - if (i == gNoOfAllBanks) - return 0; - else - return 1; -} - -static void atk84_jump_if_cant_sleep(void) -{ - u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - if (sub_8025A44(gBankTarget)) - gBattlescriptCurrInstr = jump_loc; - else if (gBattleMons[gBankTarget].ability == ABILITY_INSOMNIA || gBattleMons[gBankTarget].ability == ABILITY_VITAL_SPIRIT) - { - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - gBattlescriptCurrInstr = jump_loc; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else - { - gBattlescriptCurrInstr += 5; - } -} - -static void atk85_stockpile(void) -{ - if (gDisableStructs[gBankAttacker].stockpileCounter == 3) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gDisableStructs[gBankAttacker].stockpileCounter++; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 1; - gBattleTextBuff1[3] = 1; - gBattleTextBuff1[4] = gDisableStructs[gBankAttacker].stockpileCounter; - gBattleTextBuff1[5] = 0xFF; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - gBattlescriptCurrInstr++; -} - -static void atk86_stockpiletobasedamage(void) -{ - u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - if (gDisableStructs[gBankAttacker].stockpileCounter == 0) - { - gBattlescriptCurrInstr = jump_loc; - } - else - { - if (gBattleCommunication[6] != 1) - { - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, - gSideAffecting[GetBankIdentity(gBankTarget) & 1], 0, - 0, gBankAttacker, gBankTarget) - * gDisableStructs[gBankAttacker].stockpileCounter; - BATTLE_STRUCT->animTurn = gDisableStructs[gBankAttacker].stockpileCounter; - - if (gProtectStructs[gBankAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - } - gDisableStructs[gBankAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr += 5; - } -} - -static void atk87_stockpiletohpheal(void) -{ - u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - if (gDisableStructs[gBankAttacker].stockpileCounter == 0) - { - gBattlescriptCurrInstr = jump_loc; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else if (gBattleMons[gBankAttacker].maxHP == gBattleMons[gBankAttacker].hp) - { - gDisableStructs[gBankAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr = jump_loc; - gBankTarget = gBankAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / (1 << (3 - gDisableStructs[gBankAttacker].stockpileCounter)); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - BATTLE_STRUCT->animTurn = gDisableStructs[gBankAttacker].stockpileCounter; - gDisableStructs[gBankAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr += 5; - gBankTarget = gBankAttacker; - } -} - -static void atk88_negativedamage(void) -{ - gBattleMoveDamage = -(gHP_dealt / 2); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = -1; - gBattlescriptCurrInstr++; -} - -#ifdef NONMATCHING -u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr) -{ - u8 r9 = 0; - u8 r10 = 0; - u8 index; - if (flags & 0x40) - gActiveBank = gBankAttacker; - else - gActiveBank = gBankTarget; - flags &= ~(0x40); - if (flags & 0x80) - r9++; - flags &= ~(0x80); - if (flags & 0x20) - r10++; - flags &= ~(0x20); - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 5; - gBattleTextBuff1[2] = stat; - gBattleTextBuff1[3] = 0xFF; - - if ((statchanger << 0x18) < 0) //stat decrease - { - if (gSideTimer[GetBankIdentity(gActiveBank) & 1].mistTimer && !r9 && gCurrentMove != MOVE_CURSE) - { - if (flags == 1) - { - if (gSpecialStatuses[gActiveBank].statloweringflag) - gBattlescriptCurrInstr = bs_ptr; - else - { - b_movescr_stack_push(bs_ptr); - BATTLE_STRUCT->scriptingActive = gActiveBank; - gBattlescriptCurrInstr = BattleScript_MistProtected; - gSpecialStatuses[gActiveBank].statloweringflag = 1; - } - } - return 1; - } - else if (gCurrentMove != MOVE_CURSE && r10 != 1 && JumpIfMoveAffectedByProtect(0)) - { - gBattlescriptCurrInstr = BattleScript_ButItFailed; - return 1; - } - else if ((gBattleMons[gActiveBank].ability == ABILITY_CLEAR_BODY || gBattleMons[gActiveBank].ability == ABILITY_WHITE_SMOKE) && !r9 && gCurrentMove != MOVE_CURSE) - { - if (flags == 1) - { - if (gSpecialStatuses[gActiveBank].statloweringflag) - gBattlescriptCurrInstr = bs_ptr; - else - { - b_movescr_stack_push(bs_ptr); - BATTLE_STRUCT->scriptingActive = gActiveBank; - gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; - gLastUsedAbility = gBattleMons[gActiveBank].ability; - RecordAbilityBattle(gActiveBank, gLastUsedAbility); - gSpecialStatuses[gActiveBank].statloweringflag = 1; - } - } - return 1; - } - else if (gBattleMons[gActiveBank].ability == ABILITY_KEEN_EYE && !r9 && stat == STAT_STAGE_ACC) - { - if (flags == 1) - { - b_movescr_stack_push(bs_ptr); - BATTLE_STRUCT->scriptingActive = gActiveBank; - gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = gBattleMons[gActiveBank].ability; - RecordAbilityBattle(gActiveBank, gLastUsedAbility); - } - return 1; - } - else if (gBattleMons[gActiveBank].ability == ABILITY_HYPER_CUTTER && !r9 && stat == STAT_STAGE_ATK) - { - if (flags == 1) - { - b_movescr_stack_push(bs_ptr); - BATTLE_STRUCT->scriptingActive = gActiveBank; - gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = gBattleMons[gActiveBank].ability; - RecordAbilityBattle(gActiveBank, gLastUsedAbility); - } - return 1; - } - else if (gBattleMons[gActiveBank].ability == ABILITY_SHIELD_DUST && flags == 0) - return 1; - else //decrease - { - statchanger = -((statchanger >> 4) & (7)); - gBattleTextBuff2[0] = 0xFD; - index = 1; - if (statchanger == -2) - { - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = 0xD3; //harshly - gBattleTextBuff2[3] = 0x0; - index = 4; - } - gBattleTextBuff2[index] = 0; - index++; - gBattleTextBuff2[index] = 0xD4; //fell - index++; - gBattleTextBuff2[index] = 0; - index++; - gBattleTextBuff2[index] = 0xFF; - - if (gBattleMons[gActiveBank].statStages[stat] == 0) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - u8 stringID = 0; - if (gBankTarget == gActiveBank) - stringID = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = stringID; - } - } - } - else //stat increase - { - statchanger = (statchanger >> 4) & (7); - gBattleTextBuff2[0] = 0xFD; - index = 1; - if (statchanger == 2) - { - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = 0xD1; //sharply - gBattleTextBuff2[3] = 0x0; - index = 4; - } - gBattleTextBuff2[index] = 0; - index++; - gBattleTextBuff2[index] = 0xD2; //rose - index++; - gBattleTextBuff2[index] = 0; - index++; - gBattleTextBuff2[index] = 0xFF; - - if (gBattleMons[gActiveBank].statStages[stat] == 0xC) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - u8 stringID = 0; - if (gBankTarget == gActiveBank) - stringID = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = stringID; - } - } - - gBattleMons[gActiveBank].statStages[stat] += statchanger; - if (gBattleMons[gActiveBank].statStages[stat] < 0) - gBattleMons[gActiveBank].statStages[stat] = 0; - if (gBattleMons[gActiveBank].statStages[stat] > 0xC) - gBattleMons[gActiveBank].statStages[stat] = 0xC; - - if (gBattleCommunication[MULTISTRING_CHOOSER] == 2) - { - if (flags & 1) - gBattleMoveFlags |= MOVESTATUS_MISSED; - if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && !(flags & 1)) //what the actual fuck gamefreak... - return 1; - } - return 0; -} - -#else -__attribute__((naked)) -u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - mov r8, r3\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - lsls r1, 24\n\ - lsrs r7, r1, 24\n\ - lsls r2, 24\n\ - lsrs r5, r2, 24\n\ - movs r0, 0\n\ - mov r9, r0\n\ - mov r10, r0\n\ - movs r0, 0x40\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08025E54\n\ - ldr r0, _08025E4C @ =gActiveBank\n\ - ldr r1, _08025E50 @ =gBankAttacker\n\ - b _08025E58\n\ - .align 2, 0\n\ -_08025E4C: .4byte gActiveBank\n\ -_08025E50: .4byte gBankAttacker\n\ -_08025E54:\n\ - ldr r0, _08025EF8 @ =gActiveBank\n\ - ldr r1, _08025EFC @ =gBankTarget\n\ -_08025E58:\n\ - ldrb r1, [r1]\n\ - strb r1, [r0]\n\ - movs r0, 0xBF\n\ - ands r5, r0\n\ - movs r0, 0x80\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08025E72\n\ - mov r0, r9\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08025E72:\n\ - movs r0, 0x7F\n\ - ands r5, r0\n\ - movs r0, 0x20\n\ - ands r0, r5\n\ - cmp r0, 0\n\ - beq _08025E88\n\ - mov r0, r10\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ -_08025E88:\n\ - movs r0, 0xDF\n\ - ands r5, r0\n\ - ldr r1, _08025F00 @ =gBattleTextBuff1\n\ - movs r4, 0\n\ - movs r2, 0xFD\n\ - strb r2, [r1]\n\ - movs r0, 0x5\n\ - strb r0, [r1, 0x1]\n\ - strb r7, [r1, 0x2]\n\ - movs r3, 0x1\n\ - negs r3, r3\n\ - mov r12, r3\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x3]\n\ - lsls r0, r6, 24\n\ - cmp r0, 0\n\ - blt _08025EAC\n\ - b _080261B0\n\ -_08025EAC:\n\ - ldr r4, _08025F04 @ =gSideTimer\n\ - ldr r1, _08025EF8 @ =gActiveBank\n\ - ldrb r0, [r1]\n\ - bl GetBankIdentity\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r0, [r0, 0x2]\n\ - cmp r0, 0\n\ - beq _08025F54\n\ - mov r2, r9\n\ - cmp r2, 0\n\ - bne _08025F54\n\ - ldr r0, _08025F08 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - cmp r0, 0xAE\n\ - beq _08025F84\n\ - cmp r5, 0x1\n\ - bne _08025F74\n\ - ldr r4, _08025F0C @ =gSpecialStatuses\n\ - ldr r3, _08025EF8 @ =gActiveBank\n\ - ldrb r0, [r3]\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4\n\ - ldrb r0, [r1]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _08025F14\n\ - ldr r0, _08025F10 @ =gBattlescriptCurrInstr\n\ - mov r4, r8\n\ - str r4, [r0]\n\ - b _08025F74\n\ - .align 2, 0\n\ -_08025EF8: .4byte gActiveBank\n\ -_08025EFC: .4byte gBankTarget\n\ -_08025F00: .4byte gBattleTextBuff1\n\ -_08025F04: .4byte gSideTimer\n\ -_08025F08: .4byte gCurrentMove\n\ -_08025F0C: .4byte gSpecialStatuses\n\ -_08025F10: .4byte gBattlescriptCurrInstr\n\ -_08025F14:\n\ - mov r0, r8\n\ - bl b_movescr_stack_push\n\ - ldr r0, _08025F40 @ =0x02000000\n\ - ldr r6, _08025F44 @ =gActiveBank\n\ - ldrb r1, [r6]\n\ - ldr r2, _08025F48 @ =0x00016003\n\ - adds r0, r2\n\ - strb r1, [r0]\n\ - ldr r1, _08025F4C @ =gBattlescriptCurrInstr\n\ - ldr r0, _08025F50 @ =BattleScript_MistProtected\n\ - str r0, [r1]\n\ - ldrb r1, [r6]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r1, [r0]\n\ - movs r2, 0x1\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08025F74\n\ - .align 2, 0\n\ -_08025F40: .4byte 0x02000000\n\ -_08025F44: .4byte gActiveBank\n\ -_08025F48: .4byte 0x00016003\n\ -_08025F4C: .4byte gBattlescriptCurrInstr\n\ -_08025F50: .4byte BattleScript_MistProtected\n\ -_08025F54:\n\ - ldr r0, _08025F78 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - cmp r0, 0xAE\n\ - beq _08025F84\n\ - mov r3, r10\n\ - cmp r3, 0x1\n\ - beq _08025F84\n\ - movs r0, 0\n\ - bl JumpIfMoveAffectedByProtect\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08025F84\n\ - ldr r1, _08025F7C @ =gBattlescriptCurrInstr\n\ - ldr r0, _08025F80 @ =BattleScript_ButItFailed\n\ - str r0, [r1]\n\ -_08025F74:\n\ - movs r0, 0x1\n\ - b _080262A4\n\ - .align 2, 0\n\ -_08025F78: .4byte gCurrentMove\n\ -_08025F7C: .4byte gBattlescriptCurrInstr\n\ -_08025F80: .4byte BattleScript_ButItFailed\n\ -_08025F84:\n\ - ldr r2, _08025FCC @ =gBattleMons\n\ - ldr r1, _08025FD0 @ =gActiveBank\n\ - ldrb r3, [r1]\n\ - movs r4, 0x58\n\ - adds r0, r3, 0\n\ - muls r0, r4\n\ - adds r0, r2\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - mov r10, r2\n\ - cmp r0, 0x1D\n\ - beq _08025FA0\n\ - cmp r0, 0x49\n\ - bne _08026040\n\ -_08025FA0:\n\ - mov r0, r9\n\ - cmp r0, 0\n\ - bne _08026040\n\ - ldr r0, _08025FD4 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - cmp r0, 0xAE\n\ - beq _08026040\n\ - cmp r5, 0x1\n\ - bne _08025F74\n\ - ldr r4, _08025FD8 @ =gSpecialStatuses\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r0, [r0]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _08025FE0\n\ - ldr r0, _08025FDC @ =gBattlescriptCurrInstr\n\ - mov r1, r8\n\ - str r1, [r0]\n\ - b _08025F74\n\ - .align 2, 0\n\ -_08025FCC: .4byte gBattleMons\n\ -_08025FD0: .4byte gActiveBank\n\ -_08025FD4: .4byte gCurrentMove\n\ -_08025FD8: .4byte gSpecialStatuses\n\ -_08025FDC: .4byte gBattlescriptCurrInstr\n\ -_08025FE0:\n\ - mov r0, r8\n\ - bl b_movescr_stack_push\n\ - ldr r0, _08026028 @ =0x02000000\n\ - ldr r2, _0802602C @ =gActiveBank\n\ - ldrb r1, [r2]\n\ - ldr r3, _08026030 @ =0x00016003\n\ - adds r0, r3\n\ - strb r1, [r0]\n\ - ldr r1, _08026034 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08026038 @ =BattleScript_AbilityNoStatLoss\n\ - str r0, [r1]\n\ - ldr r1, _0802603C @ =gLastUsedAbility\n\ - ldrb r0, [r2]\n\ - movs r6, 0x58\n\ - muls r0, r6\n\ - add r0, r10\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r0, [r2]\n\ - ldrb r1, [r1]\n\ - bl RecordAbilityBattle\n\ - ldr r0, _0802602C @ =gActiveBank\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r4\n\ - ldrb r1, [r0]\n\ - movs r2, 0x1\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _08025F74\n\ - .align 2, 0\n\ -_08026028: .4byte 0x02000000\n\ -_0802602C: .4byte gActiveBank\n\ -_08026030: .4byte 0x00016003\n\ -_08026034: .4byte gBattlescriptCurrInstr\n\ -_08026038: .4byte BattleScript_AbilityNoStatLoss\n\ -_0802603C: .4byte gLastUsedAbility\n\ -_08026040:\n\ - ldr r1, _08026090 @ =gActiveBank\n\ - ldrb r0, [r1]\n\ - movs r4, 0x58\n\ - muls r0, r4\n\ - add r0, r10\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x33\n\ - bne _080260A8\n\ - mov r2, r9\n\ - cmp r2, 0\n\ - bne _080260A8\n\ - cmp r7, 0x6\n\ - bne _080260A8\n\ - cmp r5, 0x1\n\ - bne _08025F74\n\ - mov r0, r8\n\ - bl b_movescr_stack_push\n\ - ldr r0, _08026094 @ =0x02000000\n\ - ldr r3, _08026090 @ =gActiveBank\n\ - ldrb r1, [r3]\n\ - ldr r6, _08026098 @ =0x00016003\n\ - adds r0, r6\n\ - strb r1, [r0]\n\ - ldr r1, _0802609C @ =gBattlescriptCurrInstr\n\ - ldr r0, _080260A0 @ =BattleScript_AbilityNoSpecificStatLoss\n\ - str r0, [r1]\n\ - ldr r1, _080260A4 @ =gLastUsedAbility\n\ - ldrb r0, [r3]\n\ - muls r0, r4\n\ - add r0, r10\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r0, [r3]\n\ - ldrb r1, [r1]\n\ - bl RecordAbilityBattle\n\ - b _08025F74\n\ - .align 2, 0\n\ -_08026090: .4byte gActiveBank\n\ -_08026094: .4byte 0x02000000\n\ -_08026098: .4byte 0x00016003\n\ -_0802609C: .4byte gBattlescriptCurrInstr\n\ -_080260A0: .4byte BattleScript_AbilityNoSpecificStatLoss\n\ -_080260A4: .4byte gLastUsedAbility\n\ -_080260A8:\n\ - ldr r1, _080260FC @ =gActiveBank\n\ - ldrb r0, [r1]\n\ - movs r4, 0x58\n\ - muls r0, r4\n\ - add r0, r10\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x34\n\ - bne _08026114\n\ - mov r2, r9\n\ - cmp r2, 0\n\ - bne _08026114\n\ - cmp r7, 0x1\n\ - bne _08026114\n\ - cmp r5, 0x1\n\ - beq _080260CA\n\ - b _08025F74\n\ -_080260CA:\n\ - mov r0, r8\n\ - bl b_movescr_stack_push\n\ - ldr r0, _08026100 @ =0x02000000\n\ - ldr r3, _080260FC @ =gActiveBank\n\ - ldrb r1, [r3]\n\ - ldr r6, _08026104 @ =0x00016003\n\ - adds r0, r6\n\ - strb r1, [r0]\n\ - ldr r1, _08026108 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0802610C @ =BattleScript_AbilityNoSpecificStatLoss\n\ - str r0, [r1]\n\ - ldr r1, _08026110 @ =gLastUsedAbility\n\ - ldrb r0, [r3]\n\ - muls r0, r4\n\ - add r0, r10\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r0, [r3]\n\ - ldrb r1, [r1]\n\ - bl RecordAbilityBattle\n\ - b _08025F74\n\ - .align 2, 0\n\ -_080260FC: .4byte gActiveBank\n\ -_08026100: .4byte 0x02000000\n\ -_08026104: .4byte 0x00016003\n\ -_08026108: .4byte gBattlescriptCurrInstr\n\ -_0802610C: .4byte BattleScript_AbilityNoSpecificStatLoss\n\ -_08026110: .4byte gLastUsedAbility\n\ -_08026114:\n\ - ldr r0, _080261A0 @ =gActiveBank\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - add r0, r10\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x13\n\ - bne _0802612C\n\ - cmp r5, 0\n\ - bne _0802612C\n\ - b _08025F74\n\ -_0802612C:\n\ - lsls r0, r6, 24\n\ - asrs r0, 28\n\ - movs r1, 0x7\n\ - ands r0, r1\n\ - negs r0, r0\n\ - lsls r0, 24\n\ - ldr r3, _080261A4 @ =gBattleTextBuff2\n\ - movs r4, 0\n\ - movs r1, 0xFD\n\ - strb r1, [r3]\n\ - movs r2, 0x1\n\ - lsrs r6, r0, 24\n\ - asrs r0, 24\n\ - subs r1, 0xFF\n\ - cmp r0, r1\n\ - bne _08026156\n\ - strb r4, [r3, 0x1]\n\ - movs r0, 0xD3\n\ - strb r0, [r3, 0x2]\n\ - strb r4, [r3, 0x3]\n\ - movs r2, 0x4\n\ -_08026156:\n\ - adds r0, r2, r3\n\ - strb r4, [r0]\n\ - adds r2, 0x1\n\ - adds r1, r2, r3\n\ - movs r0, 0xD4\n\ - strb r0, [r1]\n\ - adds r2, 0x1\n\ - adds r0, r2, r3\n\ - strb r4, [r0]\n\ - adds r2, 0x1\n\ - adds r1, r2, r3\n\ - movs r0, 0xFF\n\ - strb r0, [r1]\n\ - ldr r1, _080261A0 @ =gActiveBank\n\ - ldrb r2, [r1]\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r0, r7, r0\n\ - mov r1, r10\n\ - adds r1, 0x18\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0\n\ - beq _08026206\n\ - movs r1, 0\n\ - ldr r0, _080261A8 @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - ldr r3, _080261AC @ =gBattleCommunication\n\ - mov r8, r3\n\ - cmp r0, r2\n\ - bne _0802619A\n\ - movs r1, 0x1\n\ -_0802619A:\n\ - mov r4, r8\n\ - strb r1, [r4, 0x5]\n\ - b _08026234\n\ - .align 2, 0\n\ -_080261A0: .4byte gActiveBank\n\ -_080261A4: .4byte gBattleTextBuff2\n\ -_080261A8: .4byte gBankTarget\n\ -_080261AC: .4byte gBattleCommunication\n\ -_080261B0:\n\ - asrs r6, r0, 28\n\ - movs r0, 0x7\n\ - ands r6, r0\n\ - ldr r3, _08026210 @ =gBattleTextBuff2\n\ - strb r2, [r3]\n\ - movs r2, 0x1\n\ - cmp r6, 0x2\n\ - bne _080261CA\n\ - strb r4, [r3, 0x1]\n\ - movs r0, 0xD1\n\ - strb r0, [r3, 0x2]\n\ - strb r4, [r3, 0x3]\n\ - movs r2, 0x4\n\ -_080261CA:\n\ - adds r0, r2, r3\n\ - strb r4, [r0]\n\ - adds r2, 0x1\n\ - adds r1, r2, r3\n\ - movs r0, 0xD2\n\ - strb r0, [r1]\n\ - adds r2, 0x1\n\ - adds r0, r2, r3\n\ - strb r4, [r0]\n\ - adds r2, 0x1\n\ - adds r1, r2, r3\n\ - ldrb r0, [r1]\n\ - mov r2, r12\n\ - orrs r0, r2\n\ - strb r0, [r1]\n\ - ldr r2, _08026214 @ =gBattleMons\n\ - ldr r4, _08026218 @ =gActiveBank\n\ - ldrb r3, [r4]\n\ - movs r0, 0x58\n\ - muls r0, r3\n\ - adds r0, r7, r0\n\ - adds r1, r2, 0\n\ - adds r1, 0x18\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - mov r10, r2\n\ - cmp r0, 0xC\n\ - bne _08026220\n\ -_08026206:\n\ - ldr r1, _0802621C @ =gBattleCommunication\n\ - movs r0, 0x2\n\ - strb r0, [r1, 0x5]\n\ - mov r8, r1\n\ - b _08026234\n\ - .align 2, 0\n\ -_08026210: .4byte gBattleTextBuff2\n\ -_08026214: .4byte gBattleMons\n\ -_08026218: .4byte gActiveBank\n\ -_0802621C: .4byte gBattleCommunication\n\ -_08026220:\n\ - movs r1, 0\n\ - ldr r0, _080262B4 @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - ldr r2, _080262B8 @ =gBattleCommunication\n\ - mov r8, r2\n\ - cmp r0, r3\n\ - bne _08026230\n\ - movs r1, 0x1\n\ -_08026230:\n\ - mov r3, r8\n\ - strb r1, [r3, 0x5]\n\ -_08026234:\n\ - ldr r2, _080262BC @ =gActiveBank\n\ - ldrb r0, [r2]\n\ - movs r4, 0x58\n\ - adds r1, r0, 0\n\ - muls r1, r4\n\ - adds r1, r7, r1\n\ - mov r3, r10\n\ - adds r3, 0x18\n\ - adds r1, r3\n\ - lsls r0, r6, 24\n\ - asrs r0, 24\n\ - ldrb r6, [r1]\n\ - adds r0, r6\n\ - strb r0, [r1]\n\ - ldrb r0, [r2]\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - adds r1, r0, r3\n\ - movs r0, 0\n\ - ldrsb r0, [r1, r0]\n\ - cmp r0, 0\n\ - bge _08026264\n\ - movs r0, 0\n\ - strb r0, [r1]\n\ -_08026264:\n\ - ldr r1, _080262BC @ =gActiveBank\n\ - ldrb r0, [r1]\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - adds r1, r0, r3\n\ - movs r0, 0\n\ - ldrsb r0, [r1, r0]\n\ - cmp r0, 0xC\n\ - ble _0802627A\n\ - movs r0, 0xC\n\ - strb r0, [r1]\n\ -_0802627A:\n\ - mov r2, r8\n\ - ldrb r0, [r2, 0x5]\n\ - cmp r0, 0x2\n\ - bne _080262A2\n\ - movs r3, 0x1\n\ - ands r3, r5\n\ - cmp r3, 0\n\ - beq _08026294\n\ - ldr r0, _080262C0 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r2, 0x1\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_08026294:\n\ - mov r4, r8\n\ - ldrb r0, [r4, 0x5]\n\ - cmp r0, 0x2\n\ - bne _080262A2\n\ - cmp r3, 0\n\ - bne _080262A2\n\ - b _08025F74\n\ -_080262A2:\n\ - movs r0, 0\n\ -_080262A4:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080262B4: .4byte gBankTarget\n\ -_080262B8: .4byte gBattleCommunication\n\ -_080262BC: .4byte gActiveBank\n\ -_080262C0: .4byte gBattleMoveFlags\n\ - .syntax divided"); -} -#endif // NONMATCHING - -static void atk89_statbuffchange(void) -{ - u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 2); - if (ChangeStatBuffs(BATTLE_STRUCT->statChanger & 0xF0, BATTLE_STRUCT->statChanger & 0xF, BSScriptRead8(gBattlescriptCurrInstr + 1), jump_loc) == 0) - gBattlescriptCurrInstr += 6; -} - -static void atk8A_normalisebuffs(void) //haze -{ - int i, j; - for (i = 0; i < gNoOfAllBanks; i++) - { - for (j = 0; j < 8; j++) - { - gBattleMons[i].statStages[j] = 6; - } - } - gBattlescriptCurrInstr++; -} - -static void atk8B_setbide(void) -{ - gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gBankAttacker] = gCurrentMove; - gTakenDmg[gBankAttacker] = 0; - gBattleMons[gBankAttacker].status2 |= (STATUS2_BIDE - 0x100); //2 turns - gBattlescriptCurrInstr++; -} - -static void atk8C_confuseifrepeatingattackends(void) -{ - if (!(gBattleMons[gBankAttacker].status2 & STATUS2_LOCK_CONFUSE)) - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x75; - gBattlescriptCurrInstr++; -} - -static void atk8D_setmultihit_counter(void) -{ - if (BSScriptRead8(gBattlescriptCurrInstr + 1)) - gMultiHitCounter = BSScriptRead8(gBattlescriptCurrInstr + 1); - else - { - gMultiHitCounter = Random() & 3; - if (gMultiHitCounter > 1) - gMultiHitCounter = (Random() & 3) + 2; - else - gMultiHitCounter += 2; - } - gBattlescriptCurrInstr += 2; -} - -static void atk8E_prepare_multihit(void) -{ - ewram[0x160e0] = 0xFD; - ewram[0x160e1] = 1; - ewram[0x160e2] = 1; - ewram[0x160e3] = 1; - ewram[0x160e4] = 0; - ewram[0x160e5] = 0xFF; - gBattlescriptCurrInstr++; -} - -static bool8 sub_80264C0(void) -{ - if (gBattleMons[gBankAttacker].level >= gBattleMons[gBankTarget].level) - { - ewram[gBankTarget + 0x16064] = gBattlePartyID[gBankTarget]; - } - else - { - u16 random = Random() & 0xFF; - if ((u32)((random * (gBattleMons[gBankAttacker].level + gBattleMons[gBankTarget].level) >> 8) + 1) <= (gBattleMons[gBankTarget].level / 4)) - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - return 0; - } - ewram[gBankTarget + 0x16064] = gBattlePartyID[gBankTarget]; - } - gBattlescriptCurrInstr = gUnknown_081D90FC; - return 1; -} - -static void atk8F_forcerandomswitch(void) -{ - if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)) - { - u8 i; - struct Pokemon* party; - u8 valid; - u8 val; - if (!GetBankSide(gBankTarget)) - party = gPlayerParty; - else - party = gEnemyParty; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - valid = 0; - val = 0; - if (sub_803FBFC(sub_803FC34(gBankTarget)) == 1) - val = 3; - for (i = val; i < val + 3; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[i], MON_DATA_IS_EGG) - && GetMonData(&party[i], MON_DATA_HP) != 0) - valid++; - } - } - else - { - valid = 0; - for (i = 0; i < 6; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[i], MON_DATA_IS_EGG) - && GetMonData(&party[i], MON_DATA_HP) != 0) - valid++; - } - } - - if ((valid < 2 && (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) - || (valid < 3 && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))) - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } - else if (sub_80264C0()) - { -#define MON_CAN_BATTLE(mon) (((GetMonData(mon, MON_DATA_SPECIES) && GetMonData(mon, MON_DATA_IS_EGG) != 1 && GetMonData(mon, MON_DATA_HP)))) - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - do - { - val = Random() % 3; - if (sub_803FBFC(sub_803FC34(gBankTarget)) == 1) - i = val + 3; - else - i = val; - } while (i == gBattlePartyID[gBankTarget] || i == gBattlePartyID[gBankTarget ^ 2] || !MON_CAN_BATTLE(&party[i])); - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - do - { - i = Random() % 6; - } while (i == gBattlePartyID[gBankTarget] || i == gBattlePartyID[gBankTarget ^ 2] || !MON_CAN_BATTLE(&party[i])); - } - else - { - do - { - i = Random() % 6; - } while (i == gBattlePartyID[gBankTarget] || !MON_CAN_BATTLE(&party[i])); - } - } - ewram[gBankTarget + 0x16068] = i; - if (!IsLinkDoubleBattle()) - sub_8012258(gBankTarget); - sub_8094B6C(gBankTarget, i, 0); - sub_8094B6C(gBankTarget ^ 2, i, 1); -#undef MON_CAN_BATTLE - } - } - else - { - sub_80264C0(); - } -} - -static void atk90_conversion_type_change(void) -{ - //randomly changes user's type to one of its moves' type - u8 valid_moves = 0; - u8 checked_move; - u8 move_type; - while (valid_moves < 4) - { - if (gBattleMons[gBankAttacker].moves[valid_moves] == 0) - break; - valid_moves++; - } - - for (checked_move = 0; checked_move < valid_moves; checked_move++) - { - move_type = gBattleMoves[gBattleMons[gBankAttacker].moves[checked_move]].type; - if (move_type == TYPE_MYSTERY) - { - if (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST) - move_type = TYPE_GHOST; - else - move_type = TYPE_NORMAL; - } - if (move_type != gBattleMons[gBankAttacker].type1 && move_type != gBattleMons[gBankAttacker].type2) - break; - } - - if (checked_move == valid_moves) - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } - else - { - do - { - - while ((checked_move = Random() & 3) >= valid_moves); - - move_type = gBattleMoves[gBattleMons[gBankAttacker].moves[checked_move]].type; - if (move_type == TYPE_MYSTERY) - { - if (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST) - move_type = TYPE_GHOST; - else - move_type = TYPE_NORMAL; - } - } while (move_type == gBattleMons[gBankAttacker].type1 || move_type == gBattleMons[gBankAttacker].type2); - - gBattleMons[gBankAttacker].type1 = move_type; - gBattleMons[gBankAttacker].type2 = move_type; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = move_type; - gBattleTextBuff1[3] = 0xFF; - - gBattlescriptCurrInstr += 5; - } -} - -static void atk91_givepaydaymoney(void) -{ - if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gPaydayMoney) - { - sub_80B79B8(&gSaveBlock1.money, gPaydayMoney * BATTLE_STRUCT->moneyMultiplier); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 2; - gBattleTextBuff1[3] = 5; - gBattleTextBuff1[4] = gPaydayMoney; - gBattleTextBuff1[5] = uBYTE1_16(gPaydayMoney); - gBattleTextBuff1[6] = 0xFF; - b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D95DB; - } - else - gBattlescriptCurrInstr++; -} - -static void atk92_setlightscreen(void) -{ - if (gSideAffecting[GetBankIdentity(gBankAttacker) & 1] & SIDE_STATUS_LIGHTSCREEN) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else - { - gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_LIGHTSCREEN; - gSideTimer[GetBankIdentity(gBankAttacker) & 1].lightscreenTimer = 5; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - } - gBattlescriptCurrInstr++; -} - -#ifdef NOTMATCHING -static void atk93_ko_move(void) -{ - if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) - hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam; - else - { - hold_effect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item); - quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item); - } - - gStringBank = gBankTarget; - - if (hold_effect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality) - { - RecordItemBattle(gBankTarget, hold_effect); - gSpecialStatuses[gBankTarget].focusBanded = 1; - } - - if (gBattleMons[gBankTarget].ability == ABILITY_STURDY) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - gLastUsedAbility = ABILITY_STURDY; - gBattlescriptCurrInstr = x; - RecordAbilityBattle(gBankTarget, ABILITY_STURDY); - return; - } - - if (!(gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS)) - { - u16 to_cmp = gBattleMons[gBankAttacker].level - gBattleMons[gBankTarget].level + gBattleMoves[gCurrentMove].accuracy; - if (Random() % 0x64 + 1 < to_cmp || gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) - { - goto MOVESTATUS_MISSED_LABEL; - } - } - else - { - if (gDisableStructs[gBankTarget].bankWithSureHit != gBankAttacker || gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) - { - - } - } - -MOVESTATUS_MISSED_LABEL: - gBattleTypeFlags |= MOVESTATUS_MISSED; - if (gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -#else -__attribute((naked)) -static void atk93_ko_move(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - ldr r7, _08026BA8 @ =gBattleMons\n\ - ldr r6, _08026BAC @ =gBankTarget\n\ - ldrb r2, [r6]\n\ - movs r5, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r5\n\ - adds r1, r0, r7\n\ - ldrh r0, [r1, 0x2E]\n\ - cmp r0, 0xAF\n\ - bne _08026BB4\n\ - ldr r1, _08026BB0 @ =gEnigmaBerries\n\ - lsls r0, r2, 3\n\ - subs r0, r2\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r4, [r0, 0x7]\n\ - ldrb r6, [r0, 0x1A]\n\ - b _08026BCE\n\ - .align 2, 0\n\ -_08026BA8: .4byte gBattleMons\n\ -_08026BAC: .4byte gBankTarget\n\ -_08026BB0: .4byte gEnigmaBerries\n\ -_08026BB4:\n\ - ldrh r0, [r1, 0x2E]\n\ - bl ItemId_GetHoldEffect\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldrb r0, [r6]\n\ - muls r0, r5\n\ - adds r0, r7\n\ - ldrh r0, [r0, 0x2E]\n\ - bl ItemId_GetHoldEffectParam\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ -_08026BCE:\n\ - ldr r1, _08026C4C @ =gStringBank\n\ - ldr r5, _08026C50 @ =gBankTarget\n\ - ldrb r0, [r5]\n\ - strb r0, [r1]\n\ - cmp r4, 0x27\n\ - bne _08026C0C\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x64\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, r6\n\ - bcs _08026C0C\n\ - ldrb r0, [r5]\n\ - movs r1, 0x27\n\ - bl RecordItemBattle\n\ - ldr r2, _08026C54 @ =gSpecialStatuses\n\ - ldrb r1, [r5]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - movs r2, 0x80\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_08026C0C:\n\ - ldr r0, _08026C58 @ =gBattleMons\n\ - mov r8, r0\n\ - ldr r1, _08026C50 @ =gBankTarget\n\ - ldrb r2, [r1]\n\ - movs r6, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r6\n\ - mov r3, r8\n\ - adds r5, r0, r3\n\ - adds r0, r5, 0\n\ - adds r0, 0x20\n\ - ldrb r3, [r0]\n\ - mov r10, r8\n\ - cmp r3, 0x5\n\ - bne _08026C6C\n\ - ldr r2, _08026C5C @ =gBattleMoveFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r0, _08026C60 @ =gLastUsedAbility\n\ - strb r3, [r0]\n\ - ldr r1, _08026C64 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08026C68 @ =gUnknown_081D9826\n\ - str r0, [r1]\n\ - ldr r1, _08026C50 @ =gBankTarget\n\ - ldrb r0, [r1]\n\ - movs r1, 0x5\n\ - bl RecordAbilityBattle\n\ - b _08026E40\n\ - .align 2, 0\n\ -_08026C4C: .4byte gStringBank\n\ -_08026C50: .4byte gBankTarget\n\ -_08026C54: .4byte gSpecialStatuses\n\ -_08026C58: .4byte gBattleMons\n\ -_08026C5C: .4byte gBattleMoveFlags\n\ -_08026C60: .4byte gLastUsedAbility\n\ -_08026C64: .4byte gBattlescriptCurrInstr\n\ -_08026C68: .4byte gUnknown_081D9826\n\ -_08026C6C:\n\ - ldr r1, _08026CE0 @ =gStatuses3\n\ - lsls r0, r2, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x18\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08026CF4\n\ - ldr r1, _08026CE4 @ =gBattleMoves\n\ - ldr r0, _08026CE8 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - lsls r2, r0, 1\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r1\n\ - ldr r7, _08026CEC @ =gBankAttacker\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - add r0, r10\n\ - adds r0, 0x2A\n\ - ldrb r0, [r0]\n\ - adds r1, r5, 0\n\ - adds r1, 0x2A\n\ - ldrb r1, [r1]\n\ - subs r0, r1\n\ - ldrb r2, [r2, 0x3]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x64\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - adds r0, 0x1\n\ - cmp r0, r4\n\ - bge _08026CDC\n\ - ldrb r0, [r7]\n\ - adds r1, r0, 0\n\ - muls r1, r6\n\ - add r1, r10\n\ - adds r1, 0x2A\n\ - ldr r2, _08026CF0 @ =gBankTarget\n\ - ldrb r0, [r2]\n\ - muls r0, r6\n\ - add r0, r10\n\ - adds r0, 0x2A\n\ - ldrb r1, [r1]\n\ - movs r4, 0x1\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - bcs _08026D20\n\ -_08026CDC:\n\ - mov r10, r8\n\ - b _08026DE0\n\ - .align 2, 0\n\ -_08026CE0: .4byte gStatuses3\n\ -_08026CE4: .4byte gBattleMoves\n\ -_08026CE8: .4byte gCurrentMove\n\ -_08026CEC: .4byte gBankAttacker\n\ -_08026CF0: .4byte gBankTarget\n\ -_08026CF4:\n\ - ldr r0, _08026D4C @ =gDisableStructs\n\ - lsls r1, r2, 3\n\ - subs r1, r2\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldr r2, _08026D50 @ =gBankAttacker\n\ - ldrb r0, [r1, 0x15]\n\ - movs r4, 0\n\ - ldrb r3, [r2]\n\ - cmp r0, r3\n\ - bne _08026D20\n\ - ldrb r0, [r2]\n\ - muls r0, r6\n\ - add r0, r10\n\ - adds r0, 0x2A\n\ - adds r1, r5, 0\n\ - adds r1, 0x2A\n\ - ldrb r0, [r0]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _08026D20\n\ - movs r4, 0x1\n\ -_08026D20:\n\ - cmp r4, 0\n\ - beq _08026DE0\n\ - ldr r0, _08026D54 @ =gProtectStructs\n\ - ldr r1, _08026D58 @ =gBankTarget\n\ - ldrb r2, [r1]\n\ - lsls r1, r2, 4\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - lsls r0, 30\n\ - cmp r0, 0\n\ - bge _08026D64\n\ - ldr r1, _08026D5C @ =gBattleMoveDamage\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - add r0, r10\n\ - ldrh r0, [r0, 0x28]\n\ - subs r0, 0x1\n\ - str r0, [r1]\n\ - ldr r2, _08026D60 @ =gBattleMoveFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x40\n\ - b _08026DC6\n\ - .align 2, 0\n\ -_08026D4C: .4byte gDisableStructs\n\ -_08026D50: .4byte gBankAttacker\n\ -_08026D54: .4byte gProtectStructs\n\ -_08026D58: .4byte gBankTarget\n\ -_08026D5C: .4byte gBattleMoveDamage\n\ -_08026D60: .4byte gBattleMoveFlags\n\ -_08026D64:\n\ - ldr r0, _08026DA0 @ =gSpecialStatuses\n\ - lsls r1, r2, 2\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - lsrs r0, 7\n\ - cmp r0, 0\n\ - beq _08026DB4\n\ - ldr r1, _08026DA4 @ =gBattleMoveDamage\n\ - movs r3, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r3\n\ - add r0, r10\n\ - ldrh r0, [r0, 0x28]\n\ - subs r0, 0x1\n\ - str r0, [r1]\n\ - ldr r2, _08026DA8 @ =gBattleMoveFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x80\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r1, _08026DAC @ =gLastUsedItem\n\ - ldr r2, _08026DB0 @ =gBankTarget\n\ - ldrb r0, [r2]\n\ - muls r0, r3\n\ - add r0, r10\n\ - ldrh r0, [r0, 0x2E]\n\ - strh r0, [r1]\n\ - b _08026DCA\n\ - .align 2, 0\n\ -_08026DA0: .4byte gSpecialStatuses\n\ -_08026DA4: .4byte gBattleMoveDamage\n\ -_08026DA8: .4byte gBattleMoveFlags\n\ -_08026DAC: .4byte gLastUsedItem\n\ -_08026DB0: .4byte gBankTarget\n\ -_08026DB4:\n\ - ldr r1, _08026DD4 @ =gBattleMoveDamage\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - add r0, r10\n\ - ldrh r0, [r0, 0x28]\n\ - str r0, [r1]\n\ - ldr r2, _08026DD8 @ =gBattleMoveFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x10\n\ -_08026DC6:\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ -_08026DCA:\n\ - ldr r1, _08026DDC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - b _08026E40\n\ - .align 2, 0\n\ -_08026DD4: .4byte gBattleMoveDamage\n\ -_08026DD8: .4byte gBattleMoveFlags\n\ -_08026DDC: .4byte gBattlescriptCurrInstr\n\ -_08026DE0:\n\ - ldr r2, _08026E10 @ =gBattleMoveFlags\n\ - ldrb r0, [r2]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r0, _08026E14 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - movs r2, 0x58\n\ - adds r1, r0, 0\n\ - muls r1, r2\n\ - add r1, r10\n\ - adds r1, 0x2A\n\ - ldr r3, _08026E18 @ =gBankTarget\n\ - ldrb r0, [r3]\n\ - muls r0, r2\n\ - add r0, r10\n\ - adds r0, 0x2A\n\ - ldrb r1, [r1]\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - bcc _08026E20\n\ - ldr r1, _08026E1C @ =gBattleCommunication\n\ - movs r0, 0\n\ - b _08026E24\n\ - .align 2, 0\n\ -_08026E10: .4byte gBattleMoveFlags\n\ -_08026E14: .4byte gBankAttacker\n\ -_08026E18: .4byte gBankTarget\n\ -_08026E1C: .4byte gBattleCommunication\n\ -_08026E20:\n\ - ldr r1, _08026E50 @ =gBattleCommunication\n\ - movs r0, 0x1\n\ -_08026E24:\n\ - strb r0, [r1, 0x5]\n\ - ldr r3, _08026E54 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_08026E40:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08026E50: .4byte gBattleCommunication\n\ -_08026E54: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} -#endif // NOTMATCHING - -static void atk94_gethalfcurrentenemyhp(void) //super fang -{ - gBattleMoveDamage = gBattleMons[gBankTarget].hp / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattlescriptCurrInstr++; -} - -static void atk95_setsandstorm(void) -{ - if (gBattleWeather & WEATHER_SANDSTORM_ANY) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gBattleWeather = WEATHER_SANDSTORM_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - gWishFutureKnock.weatherDuration = 5; - } - gBattlescriptCurrInstr++; -} - -static void atk96_weatherdamage(void) -{ - if (WEATHER_HAS_EFFECT) - { - if (gBattleWeather & WEATHER_SANDSTORM_ANY) - { - if (gBattleMons[gBankAttacker].type1 != TYPE_ROCK && gBattleMons[gBankAttacker].type1 != TYPE_STEEL && gBattleMons[gBankAttacker].type1 != TYPE_GROUND - && gBattleMons[gBankAttacker].type2 != TYPE_ROCK && gBattleMons[gBankAttacker].type2 != TYPE_STEEL && gBattleMons[gBankAttacker].type2 != TYPE_GROUND - && gBattleMons[gBankAttacker].ability != ABILITY_SAND_VEIL && !(gStatuses3[gBankAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBankAttacker] & STATUS3_UNDERWATER)) - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } - else - { - gBattleMoveDamage = 0; - } - } - if (gBattleWeather & WEATHER_HAIL) - { - if (gBattleMons[gBankAttacker].type1 != TYPE_ICE && gBattleMons[gBankAttacker].type2 != TYPE_ICE && !(gStatuses3[gBankAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBankAttacker] & STATUS3_UNDERWATER)) - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } - else - { - gBattleMoveDamage = 0; - } - } - } - else - gBattleMoveDamage = 0; - - if (gAbsentBankFlags & gBitTable[gBankAttacker]) - gBattleMoveDamage = 0; - - gBattlescriptCurrInstr++; -} - -static void atk97_try_infatuation(void) -{ - struct Pokemon *attacker, *target; - u16 atk_species, def_species; - u32 atk_pid, def_pid; - if (!GetBankSide(gBankAttacker)) - attacker = &gPlayerParty[gBattlePartyID[gBankAttacker]]; - else - attacker = &gEnemyParty[gBattlePartyID[gBankAttacker]]; - - if (!GetBankSide(gBankTarget)) - target = &gPlayerParty[gBattlePartyID[gBankTarget]]; - else - target = &gEnemyParty[gBattlePartyID[gBankTarget]]; - - atk_species = GetMonData(attacker, MON_DATA_SPECIES); - atk_pid = GetMonData(attacker, MON_DATA_PERSONALITY); - - def_species = GetMonData(target, MON_DATA_SPECIES); - def_pid = GetMonData(target, MON_DATA_PERSONALITY); - - if (gBattleMons[gBankTarget].ability == ABILITY_OBLIVIOUS) - { - gBattlescriptCurrInstr = BattleScript_ObliviousPreventsAttraction; - gLastUsedAbility = ABILITY_OBLIVIOUS; - RecordAbilityBattle(gBankTarget, ABILITY_OBLIVIOUS); - } - else - { - if (GetGenderFromSpeciesAndPersonality(atk_species, atk_pid) == GetGenderFromSpeciesAndPersonality(def_species, def_pid) - || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE || gBattleMons[gBankTarget].status2 & STATUS2_INFATUATION || GetGenderFromSpeciesAndPersonality(atk_species, atk_pid) == 0xFF - || GetGenderFromSpeciesAndPersonality(def_species, def_pid) == 0xFF) - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } - else - { - gBattleMons[gBankTarget].status2 |= (gBitTable[gBankAttacker] << 16); - gBattlescriptCurrInstr += 5; - } - } -} - -static void atk98_status_icon_update(void) -{ - if (gBattleExecBuffer) - return; - - if (BSScriptRead8(gBattlescriptCurrInstr + 1) != 4) - { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 2; - } - else - { - gActiveBank = gBankAttacker; - if (!(gAbsentBankFlags & gBitTable[gActiveBank])) - { - EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2); - MarkBufferBankForExecution(gActiveBank); - } - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); - if (!(gAbsentBankFlags & gBitTable[gActiveBank])) - { - EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2); - MarkBufferBankForExecution(gActiveBank); - } - } - gBattlescriptCurrInstr += 2; - } -} - -static void atk99_setmist(void) -{ - if (gSideTimer[GetBankIdentity(gBankAttacker) & 1].mistTimer) - { - gBattleMoveFlags |= MOVESTATUS_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gSideTimer[GetBankIdentity(gBankAttacker) & 1].mistTimer = 5; - gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_MIST; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - gBattlescriptCurrInstr++; -} - -static void atk9A_set_focusenergy(void) -{ - if (gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) - { - gBattleMoveFlags |= MOVESTATUS_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gBattleMons[gBankAttacker].status2 |= STATUS2_FOCUS_ENERGY; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - gBattlescriptCurrInstr++; -} - -static void atk9B_transformdataexecution(void) -{ - gUnknown_02024BE8 = 0xFFFF; - gBattlescriptCurrInstr++; - if (gBattleMons[gBankTarget].status2 & STATUS2_TRANSFORMED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE) - { - gBattleMoveFlags |= MOVESTATUS_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - u32 i; s32 j; - u8 *atk_data, *def_data; - gBattleMons[gBankAttacker].status2 |= STATUS2_TRANSFORMED; - gDisableStructs[gBankAttacker].disabledMove = 0; - gDisableStructs[gBankAttacker].disableTimer1 = 0; - gDisableStructs[gBankAttacker].unk0 = gBattleMons[gBankTarget].personality; - gDisableStructs[gBankAttacker].unk18_b = 0; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 6; - gBattleTextBuff1[2] = (gBattleMons[gBankTarget].species); - gBattleTextBuff1[3] = uBYTE1_16(gBattleMons[gBankTarget].species); - gBattleTextBuff1[4] = 0xFF; - - atk_data = (u8*)(&gBattleMons[gBankAttacker]); - def_data = (u8*)(&gBattleMons[gBankTarget]); - - for (i = 0; i < 0x24; i++) - atk_data[i] = def_data[i]; - - for (j = 0; j < 4; j++) - { - if (gBattleMoves[gBattleMons[gBankAttacker].moves[j]].pp < 5) - gBattleMons[gBankAttacker].pp[j] = gBattleMoves[gBattleMons[gBankAttacker].moves[j]].pp; - else - gBattleMons[gBankAttacker].pp[j] = 5; - } - - gActiveBank = gBankAttacker; - EmitResetActionMoveSelection(0, 2); - MarkBufferBankForExecution(gActiveBank); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } -} - -static void atk9C_set_substitute(void) -{ - u32 hp = gBattleMons[gBankAttacker].maxHP / 4; - if (gBattleMons[gBankAttacker].maxHP / 4 == 0) - hp = 1; - if (gBattleMons[gBankAttacker].hp <= hp) - { - gBattleMoveDamage = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else - { - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMons[gBankAttacker].status2 |= STATUS2_SUBSTITUTE; - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED); - gDisableStructs[gBankAttacker].substituteHP = gBattleMoveDamage; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE; - } - gBattlescriptCurrInstr++; -} - -static bool8 IsMoveUncopyable(u16 move) -{ - int i; - for (i = 0; sUnknown_081FACFE[i] != 0xFFFE && sUnknown_081FACFE[i] != move; i++) {} - return (sUnknown_081FACFE[i] != 0xFFFE); -} - -static void atk9D_copyattack(void) -{ - gUnknown_02024BE8 = 0xFFFF; - if (IsMoveUncopyable(gLastUsedMove[gBankTarget]) || gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED - || gLastUsedMove[gBankTarget] == 0 || gLastUsedMove[gBankTarget] == 0xFFFF) - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } - else - { - int i; - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankAttacker].moves[i] == gLastUsedMove[gBankTarget]) - break; - } - if (i == 4) - { - gBattleMons[gBankAttacker].moves[gCurrMovePos] = gLastUsedMove[gBankTarget]; - if (gBattleMoves[gLastUsedMove[gBankTarget]].pp < 5) - gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gLastUsedMove[gBankTarget]].pp; - else - gBattleMons[gBankAttacker].pp[gCurrMovePos] = 5; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gLastUsedMove[gBankTarget]; - gBattleTextBuff1[3] = uBYTE1_16(gLastUsedMove[gBankTarget]); - gBattleTextBuff1[4] = 0xFF; - - gDisableStructs[gBankAttacker].unk18_b |= gBitTable[gCurrMovePos]; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } -} - -#ifdef NONMATCHING -static void atk9E_metronome(void) -{ - // sUnknown_081FACFE - int i; - do - { - while ((gCurrentMove = (Random() & 0x1FF) + 1) > 0x162); - for (i = 0; sUnknown_081FACFE[i] != gCurrentMove && sUnknown_081FACFE[i] != 0xFFFF; i++); - } while (sUnknown_081FACFE[i] != 0xFFFF); - - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]; - gBankTarget = sub_801B5C0(gCurrentMove, 0); -} - -#else -__attribute__((naked)) -static void atk9E_metronome(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - ldr r7, _08027938 @ =gCurrentMove\n\ - movs r6, 0xB1\n\ - lsls r6, 1\n\ - ldr r5, _0802793C @ =sUnknown_081FACFE\n\ - ldr r0, _08027940 @ =gBattlescriptCurrInstr\n\ - mov r8, r0\n\ -_080278CA:\n\ - bl Random\n\ - ldr r2, _08027944 @ =0x000001ff\n\ - adds r1, r2, 0\n\ - ands r0, r1\n\ - adds r0, 0x1\n\ - strh r0, [r7]\n\ - cmp r0, r6\n\ - bhi _080278CA\n\ - movs r0, 0x3\n\ -_080278DE:\n\ - subs r0, 0x1\n\ - cmp r0, 0\n\ - bge _080278DE\n\ - ldr r4, _08027938 @ =gCurrentMove\n\ - ldrh r2, [r4]\n\ - ldr r3, _08027948 @ =0x0000ffff\n\ - subs r0, r5, 0x2\n\ -_080278EC:\n\ - adds r0, 0x2\n\ - ldrh r1, [r0]\n\ - cmp r1, r2\n\ - beq _080278F8\n\ - cmp r1, r3\n\ - bne _080278EC\n\ -_080278F8:\n\ - ldr r0, _08027948 @ =0x0000ffff\n\ - cmp r1, r0\n\ - bne _080278CA\n\ - ldr r2, _0802794C @ =gHitMarker\n\ - ldr r0, [r2]\n\ - ldr r1, _08027950 @ =0xfffffbff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r3, _08027954 @ =gBattleScriptsEffectsTable\n\ - ldr r2, _08027958 @ =gBattleMoves\n\ - ldrh r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - ldrh r0, [r4]\n\ - movs r1, 0\n\ - bl sub_801B5C0\n\ - ldr r1, _0802795C @ =gBankTarget\n\ - strb r0, [r1]\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08027938: .4byte gCurrentMove\n\ -_0802793C: .4byte sUnknown_081FACFE\n\ -_08027940: .4byte gBattlescriptCurrInstr\n\ -_08027944: .4byte 0x000001ff\n\ -_08027948: .4byte 0x0000ffff\n\ -_0802794C: .4byte gHitMarker\n\ -_08027950: .4byte 0xfffffbff\n\ -_08027954: .4byte gBattleScriptsEffectsTable\n\ -_08027958: .4byte gBattleMoves\n\ -_0802795C: .4byte gBankTarget\n\ - .syntax divided"); -} -#endif // NONMATCHING - -static void atk9F_dmgtolevel(void) -{ - gBattleMoveDamage = gBattleMons[gBankAttacker].level; - gBattlescriptCurrInstr++; -} - -static void atkA0_psywavedamageeffect(void) -{ - s32 rand_dmg; - while ((rand_dmg = (Random() & 0xF)) > 0xA); - rand_dmg *= 10; - gBattleMoveDamage = gBattleMons[gBankAttacker].level * (rand_dmg + 50) / 100; - gBattlescriptCurrInstr++; -} - -static void atkA1_counterdamagecalculator(void) -{ - u8 atk_side = GetBankSide(gBankAttacker); - u8 def_side = GetBankSide(gProtectStructs[gBankAttacker].physicalBank); - if (gProtectStructs[gBankAttacker].physicalDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].physicalBank].hp) - { - gBattleMoveDamage = gProtectStructs[gBankAttacker].physicalDmg * 2; - if (gSideTimer[def_side].followmeTimer && gBattleMons[gSideTimer[def_side].followmeTarget].hp) - gBankTarget = gSideTimer[def_side].followmeTarget; - else - gBankTarget = gProtectStructs[gBankAttacker].physicalBank; - gBattlescriptCurrInstr += 5; - } - else - { - gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } -} - -static void atkA2_mirrorcoatdamagecalculator(void) //a copy of atkA1 with the physical -> special field changes -{ - u8 atk_side = GetBankSide(gBankAttacker); - u8 def_side = GetBankSide(gProtectStructs[gBankAttacker].specialBank); - if (gProtectStructs[gBankAttacker].specialDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].specialBank].hp) - { - gBattleMoveDamage = gProtectStructs[gBankAttacker].specialDmg * 2; - if (gSideTimer[def_side].followmeTimer && gBattleMons[gSideTimer[def_side].followmeTarget].hp) - gBankTarget = gSideTimer[def_side].followmeTarget; - else - gBankTarget = gProtectStructs[gBankAttacker].specialBank; - gBattlescriptCurrInstr += 5; - } - else - { - gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } -} - -static void atkA3_disablelastusedattack(void) -{ - int i; - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankTarget].moves[i] == gLastUsedMove[gBankTarget]) - break; - } - if (gDisableStructs[gBankTarget].disabledMove == 0 && i != 4 && gBattleMons[gBankTarget].pp[i] != 0) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gBattleMons[gBankTarget].moves[i]; - gBattleTextBuff1[3] = uBYTE1_16(gBattleMons[gBankTarget].moves[i]); - gBattleTextBuff1[4] = 0xFF; - - gDisableStructs[gBankTarget].disabledMove = gBattleMons[gBankTarget].moves[i]; - gDisableStructs[gBankTarget].disableTimer1 = (Random() & 3) + 2; - gDisableStructs[gBankTarget].disableTimer2 = gDisableStructs[gBankTarget].disableTimer1; //that's interesting - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } -} - -static void atkA4_setencore(void) -{ - int i; - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankTarget].moves[i] == gLastUsedMove[gBankTarget]) - break; - } - if (gLastUsedMove[gBankTarget] == MOVE_STRUGGLE || gLastUsedMove[gBankTarget] == MOVE_ENCORE || gLastUsedMove[gBankTarget] == MOVE_MIRROR_MOVE) - i = 4; - if (gDisableStructs[gBankTarget].encoredMove == 0 && i != 4 && gBattleMons[gBankTarget].pp[i] != 0) - { - gDisableStructs[gBankTarget].encoredMove = gBattleMons[gBankTarget].moves[i]; - gDisableStructs[gBankTarget].encoredMovePos = i; - gDisableStructs[gBankTarget].encoreTimer1 = (Random() & 3) + 3; - gDisableStructs[gBankTarget].encoreTimer2 = gDisableStructs[gBankTarget].encoreTimer1; - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } -} - -static void atkA5_painsplitdmgcalc(void) -{ - if (!(gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE)) - { - s32 hp_diff = (gBattleMons[gBankAttacker].hp + gBattleMons[gBankTarget].hp) / 2; - s32 to_store = gBattleMoveDamage = gBattleMons[gBankTarget].hp - hp_diff; - BATTLE_STRUCT->unk16014 = sBYTE0_32(to_store); - BATTLE_STRUCT->unk16015 = sBYTE1_32(to_store); - BATTLE_STRUCT->unk16016 = sBYTE2_32(to_store); - BATTLE_STRUCT->unk16017 = sBYTE3_32(to_store); - - gBattleMoveDamage = gBattleMons[gBankAttacker].hp - hp_diff; - gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF; - - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -#ifdef NONMATCHING -static void atkA6_settypetorandomresistance(void) -{ - if (gMoveHitWith[gBankAttacker] == 0 || gMoveHitWith[gBankAttacker] == 0xFFFF || (IsTwoTurnsMove(gMoveHitWith[gBankAttacker]) && !gProtectStructs[gBankAttacker].physicalDmg && !gProtectStructs[gBankAttacker].specialDmg)) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - { - int type = 0, rands = 0; - do - { - while (((type = (Random() & 0x7F)) > 0x70)); - type *= 3; - if (gTypeEffectiveness[type] == gUnknown_02024C44[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1]) - { - gBattleMons[gBankAttacker].type1 = type; - gBattleMons[gBankAttacker].type2 = type; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = type; - gBattleTextBuff1[3] = 0xFF; - gBattlescriptCurrInstr += 5; - return; - } - rands++; - } while (rands <= 999); - - type = 0, rands = 0; - do - { - if (gTypeEffectiveness[type] == 0xFE || gTypeEffectiveness[type] != 0xFF) - { - if (gTypeEffectiveness[type] == gUnknown_02024C44[gBankAttacker] && gTypeEffectiveness[type + 2] <= 5 && gBattleMons[gBankAttacker].type1 != gTypeEffectiveness[type + 1] && gBattleMons[gBankAttacker].type2 != gTypeEffectiveness[type + 1]) - { - gBattleMons[gBankAttacker].type1 = gTypeEffectiveness[rands + 1]; - gBattleMons[gBankAttacker].type2 = gTypeEffectiveness[rands + 1]; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = gTypeEffectiveness[rands + 1]; - gBattleTextBuff1[3] = 0xFF; - gBattlescriptCurrInstr += 5; - return; - } - } - type += 3, rands += 3; - } while (rands < 336); - - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } -} - -#else -__attribute__((naked)) -static void atkA6_settypetorandomresistance(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - ldr r1, _08027FA8 @ =gMoveHitWith\n\ - ldr r4, _08027FAC @ =gBankAttacker\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r2, r0, r1\n\ - ldrh r1, [r2]\n\ - cmp r1, 0\n\ - beq _08027F8C\n\ - ldr r0, _08027FB0 @ =0x0000ffff\n\ - cmp r1, r0\n\ - beq _08027F8C\n\ - ldrh r0, [r2]\n\ - bl IsTwoTurnsMove\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08028024\n\ - ldr r2, _08027FB4 @ =gProtectStructs\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 4\n\ - adds r0, r2, 0x4\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08028024\n\ - adds r0, r2, 0\n\ - adds r0, 0x8\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08028024\n\ -_08027F8C:\n\ - ldr r3, _08027FB8 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ - b _08028110\n\ - .align 2, 0\n\ -_08027FA8: .4byte gMoveHitWith\n\ -_08027FAC: .4byte gBankAttacker\n\ -_08027FB0: .4byte 0x0000ffff\n\ -_08027FB4: .4byte gProtectStructs\n\ -_08027FB8: .4byte gBattlescriptCurrInstr\n\ -_08027FBC:\n\ - mov r0, r12\n\ - strb r5, [r0]\n\ - mov r1, r10\n\ - ldrb r0, [r1]\n\ - muls r0, r2\n\ - adds r0, r7\n\ - adds r0, 0x22\n\ - strb r5, [r0]\n\ - ldr r1, _08027FE0 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x3\n\ - strb r0, [r1, 0x1]\n\ - strb r5, [r1, 0x2]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x3]\n\ - ldr r1, _08027FE4 @ =gBattlescriptCurrInstr\n\ - b _08028012\n\ - .align 2, 0\n\ -_08027FE0: .4byte gBattleTextBuff1\n\ -_08027FE4: .4byte gBattlescriptCurrInstr\n\ -_08027FE8:\n\ - mov r0, r8\n\ - adds r0, 0x1\n\ - adds r0, r3\n\ - ldrb r2, [r0]\n\ - strb r2, [r4]\n\ - mov r4, r10\n\ - ldrb r0, [r4]\n\ - muls r0, r6\n\ - ldr r7, _0802801C @ =gBattleMons\n\ - adds r0, r7\n\ - adds r0, 0x22\n\ - strb r2, [r0]\n\ - ldr r1, _08028020 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x3\n\ - strb r0, [r1, 0x1]\n\ - strb r2, [r1, 0x2]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x3]\n\ - mov r1, r12\n\ -_08028012:\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - b _08028110\n\ - .align 2, 0\n\ -_0802801C: .4byte gBattleMons\n\ -_08028020: .4byte gBattleTextBuff1\n\ -_08028024:\n\ - movs r4, 0\n\ - mov r8, r4\n\ - movs r7, 0x7F\n\ - mov r9, r7\n\ -_0802802C:\n\ - bl Random\n\ - mov r4, r9\n\ - ands r4, r0\n\ - cmp r4, 0x70\n\ - bhi _0802802C\n\ - lsls r0, r4, 1\n\ - adds r4, r0, r4\n\ - ldr r6, _08028120 @ =gTypeEffectiveness\n\ - adds r3, r4, r6\n\ - ldr r1, _08028124 @ =gUnknown_02024C44\n\ - ldr r2, _08028128 @ =gBankAttacker\n\ - ldrb r5, [r2]\n\ - lsls r0, r5, 1\n\ - adds r0, r1\n\ - ldrb r1, [r3]\n\ - mov r10, r2\n\ - ldrh r0, [r0]\n\ - cmp r1, r0\n\ - bne _08028088\n\ - adds r0, r4, 0x2\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x5\n\ - bhi _08028088\n\ - ldr r7, _0802812C @ =gBattleMons\n\ - movs r2, 0x58\n\ - adds r0, r5, 0\n\ - muls r0, r2\n\ - adds r3, r0, r7\n\ - movs r0, 0x21\n\ - adds r0, r3\n\ - mov r12, r0\n\ - adds r0, r4, 0x1\n\ - adds r0, r6\n\ - ldrb r5, [r0]\n\ - mov r1, r12\n\ - ldrb r0, [r1]\n\ - adds r1, r5, 0\n\ - cmp r0, r1\n\ - beq _08028088\n\ - adds r0, r3, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, r1\n\ - bne _08027FBC\n\ -_08028088:\n\ - movs r7, 0x1\n\ - add r8, r7\n\ - ldr r0, _08028130 @ =0x000003e7\n\ - cmp r8, r0\n\ - ble _0802802C\n\ - movs r0, 0\n\ - mov r8, r0\n\ - ldr r1, _08028134 @ =gBattlescriptCurrInstr\n\ - mov r12, r1\n\ - ldr r3, _08028120 @ =gTypeEffectiveness\n\ - adds r0, r4, 0x1\n\ - adds r0, r3\n\ - mov r9, r0\n\ - adds r5, r3, 0\n\ -_080280A4:\n\ - ldrb r1, [r5]\n\ - cmp r1, 0xFF\n\ - bgt _080280AE\n\ - cmp r1, 0xFE\n\ - bge _080280E8\n\ -_080280AE:\n\ - mov r4, r10\n\ - ldrb r2, [r4]\n\ - lsls r0, r2, 1\n\ - ldr r7, _08028124 @ =gUnknown_02024C44\n\ - adds r0, r7\n\ - ldrh r0, [r0]\n\ - cmp r1, r0\n\ - bne _080280E8\n\ - ldrb r0, [r5, 0x2]\n\ - cmp r0, 0x5\n\ - bhi _080280E8\n\ - movs r6, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r6\n\ - ldr r1, _0802812C @ =gBattleMons\n\ - adds r2, r0, r1\n\ - adds r4, r2, 0\n\ - adds r4, 0x21\n\ - ldrb r0, [r4]\n\ - mov r7, r9\n\ - ldrb r1, [r7]\n\ - cmp r0, r1\n\ - beq _080280E8\n\ - adds r0, r2, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, r1\n\ - beq _080280E8\n\ - b _08027FE8\n\ -_080280E8:\n\ - adds r5, 0x3\n\ - movs r0, 0x3\n\ - add r8, r0\n\ - ldr r0, _08028138 @ =0x0000014f\n\ - cmp r8, r0\n\ - bls _080280A4\n\ - mov r1, r12\n\ - ldr r2, [r1]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - mov r4, r12\n\ - str r1, [r4]\n\ -_08028110:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08028120: .4byte gTypeEffectiveness\n\ -_08028124: .4byte gUnknown_02024C44\n\ -_08028128: .4byte gBankAttacker\n\ -_0802812C: .4byte gBattleMons\n\ -_08028130: .4byte 0x000003e7\n\ -_08028134: .4byte gBattlescriptCurrInstr\n\ -_08028138: .4byte 0x0000014f\n\ - .syntax divided"); -} -#endif // NONMATCHING - -static void atkA7_setalwayshitflag(void) -{ - gStatuses3[gBankTarget] &= ~(STATUS3_ALWAYS_HITS); - gStatuses3[gBankTarget] |= 0x10; - gDisableStructs[gBankTarget].bankWithSureHit = gBankAttacker; - gBattlescriptCurrInstr++; -} - -struct move_pp -{ - u16 move[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -static void atkA8_copymovepermanently(void) -{ - gUnknown_02024BE8 = 0xFFFF; - if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED) && gUnknown_02024C2C[gBankTarget] != MOVE_STRUGGLE && gUnknown_02024C2C[gBankTarget] != 0 && gUnknown_02024C2C[gBankTarget] != 0xFFFF && gUnknown_02024C2C[gBankTarget] != MOVE_SKETCH) - { - int i; - for (i = 0; i < 4; i++) - { - if (gBattleMons[gBankAttacker].moves[i] == MOVE_SKETCH) - continue; - if (gBattleMons[gBankAttacker].moves[i] == gUnknown_02024C2C[gBankTarget]) - break; - } - if (i != 4) //sketch fail - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else //sketch worked - { - struct move_pp moves_data; - gBattleMons[gBankAttacker].moves[gCurrMovePos] = gUnknown_02024C2C[gBankTarget]; - gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gUnknown_02024C2C[gBankTarget]].pp; - gActiveBank = gBankAttacker; - for (i = 0; i < 4; i++) - { - moves_data.move[i] = gBattleMons[gBankAttacker].moves[i]; - moves_data.pp[i] = gBattleMons[gBankAttacker].pp[i]; - } - moves_data.ppBonuses = gBattleMons[gBankAttacker].ppBonuses; - EmitSetAttributes(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct move_pp), &moves_data); - MarkBufferBankForExecution(gActiveBank); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gUnknown_02024C2C[gBankTarget]; - gBattleTextBuff1[3] = gUnknown_02024C2C[gBankTarget] >> 8; - gBattleTextBuff1[4] = 0xFF; - gBattlescriptCurrInstr += 5; - } - } - else //sketch fail - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static bool8 IsTwoTurnsMove(u16 move) -{ - u8 effect = gBattleMoves[move].effect; - if (effect == EFFECT_SKULL_BASH || effect == EFFECT_RAZOR_WIND || effect == EFFECT_SKY_ATTACK || effect == EFFECT_SOLARBEAM || effect == EFFECT_FLY || effect == EFFECT_BIDE) - return 1; - else - return 0; -} - -static bool8 IsMoveUnchoosable(u16 move) -{ - if (move == 0 || move == MOVE_SLEEP_TALK || move == MOVE_ASSIST || move == MOVE_MIRROR_MOVE || move == MOVE_METRONOME) - return 1; - else - return 0; -} - -static u8 AttacksThisTurn(u8 bank, u16 move) //Note: returns 1 if it's a charging turn, otherwise 2 -{ - //first argument is unused - u8 effect; - if (gBattleMoves[move].effect == EFFECT_SOLARBEAM && (gBattleWeather & WEATHER_SUN_ANY)) - return 2; - effect = gBattleMoves[move].effect; - if (effect == EFFECT_SKULL_BASH || effect == EFFECT_RAZOR_WIND || effect == EFFECT_SKY_ATTACK || effect == EFFECT_SOLARBEAM || effect == EFFECT_FLY || effect == EFFECT_BIDE) - { - if ((gHitMarker & HITMARKER_x8000000)) - return 1; - } - return 2; -} - -static void atkA9_sleeptalk_choose_move(void) -{ - u8 unusable_moves = 0; - int i; - - for (i = 0; i < 4; i++) - { - if (IsMoveUnchoosable(gBattleMons[gBankAttacker].moves[i]) || gBattleMons[gBankAttacker].moves[i] == MOVE_FOCUS_PUNCH - || gBattleMons[gBankAttacker].moves[i] == MOVE_UPROAR || IsTwoTurnsMove(gBattleMons[gBankAttacker].moves[i])) - unusable_moves |= gBitTable[i]; - } - unusable_moves = sub_8015A98(gBankAttacker, unusable_moves, 0xFD); - if (unusable_moves == 0xF) //all 4 moves cannot be chosen - gBattlescriptCurrInstr += 5; - else //at least one move can be chosen - { - u32 random_pos; - do - { - random_pos = Random() & 3; - } while ((gBitTable[random_pos] & unusable_moves)); - - gRandomMove = gBattleMons[gBankAttacker].moves[random_pos]; - gCurrMovePos = random_pos; - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gBankTarget = sub_801B5C0(gRandomMove, 0); - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } -} - -static void atkAA_set_destinybond(void) -{ - gBattleMons[gBankAttacker].status2 |= STATUS2_DESTINY_BOND; - gBattlescriptCurrInstr++; -} - -static void DestinyBondFlagUpdate(void) -{ - u8 atk_side = GetBankSide(gBankAttacker); - u8 def_side = GetBankSide(gBankTarget); - if (gBattleMons[gBankTarget].status2 & STATUS2_DESTINY_BOND && atk_side != def_side && !(gHitMarker & HITMARKER_GRUDGE)) - gHitMarker |= HITMARKER_DESTINYBOND; -} - -static void atkAB_DestinyBondFlagUpdate(void) -{ - DestinyBondFlagUpdate(); - gBattlescriptCurrInstr++; -} - -static void atkAC_remaininghptopower(void) -{ - s32 hp_fraction = GetScaledHPFraction(gBattleMons[gBankAttacker].hp, gBattleMons[gBankAttacker].maxHP, 48); - int i; - for (i = 0; i < 12; i += 2) - { - if (hp_fraction <= sUnknown_081FAD26[i]) - break; - } - gDynamicBasePower = sUnknown_081FAD26[i + 1]; - gBattlescriptCurrInstr++; -} - -static void atkAD_spite_ppreduce(void) -{ - if (gLastUsedMove[gBankTarget] != 0 && gLastUsedMove[gBankTarget] != 0xFFFF && !(gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE)) - { - int i; - for (i = 0; i < 4; i++) - { - if (gLastUsedMove[gBankTarget] == gBattleMons[gBankTarget].moves[i]) - break; - } - if (i != 4 && gBattleMons[gBankTarget].pp[i] > 1) - { - s32 lost_pp = (Random() & 3) + 2; - if (gBattleMons[gBankTarget].pp[i] < lost_pp) - lost_pp = gBattleMons[gBankTarget].pp[i]; - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = gLastUsedMove[gBankTarget]; - gBattleTextBuff1[3] = gLastUsedMove[gBankTarget] >> 8; - gBattleTextBuff1[4] = 0xFF; - ConvertIntToDecimalStringN(gBattleTextBuff2, lost_pp, 0, 1); - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 1; - gBattleTextBuff2[2] = 1; - gBattleTextBuff2[3] = 1; - gBattleTextBuff2[4] = lost_pp; - gBattleTextBuff2[5] = 0xFF; - - gBattleMons[gBankTarget].pp[i] -= lost_pp; - gActiveBank = gBankTarget; - if (!(gDisableStructs[gActiveBank].unk18_b & gBitTable[i]) - && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED)) - { - EmitSetAttributes(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]); - MarkBufferBankForExecution(gActiveBank); - } - gBattlescriptCurrInstr += 5; - if (gBattleMons[gBankTarget].pp[i] == 0) - CancelMultiTurnMoves(gBankTarget); - return; - } - } - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atkAE_heal_party_status(void) -{ - register u32 zero2 asm("r4") = 0; - u32 zero = zero2; - u8 to_heal = 0; - if (gCurrentMove == MOVE_HEAL_BELL) - { - struct Pokemon* party; - int i; - - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (GetBankSide(gBankAttacker) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - - if (gBattleMons[gBankAttacker].ability != ABILITY_SOUNDPROOF) - { - gBattleMons[gBankAttacker].status1 = 0; - } - else - { - RecordAbilityBattle(gBankAttacker, gBattleMons[gBankAttacker].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= 1; - } - - gActiveBank = BATTLE_STRUCT->scriptingActive = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank])) - { - if (gBattleMons[gActiveBank].ability != ABILITY_SOUNDPROOF) - { - gBattleMons[gActiveBank].status1 = 0; - } - else - { - RecordAbilityBattle(gActiveBank, gBattleMons[gActiveBank].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= 2; - } - } - - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES2); - u8 abilityBit = GetMonData(&party[i], MON_DATA_ALT_ABILITY); - if (species != 0 && species != SPECIES_EGG) - { - u8 ability; - if (gBattlePartyID[gBankAttacker] == i) - ability = gBattleMons[gBankAttacker].ability; - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlePartyID[gActiveBank] == i && !(gAbsentBankFlags & gBitTable[gActiveBank])) - ability = gBattleMons[gActiveBank].ability; - else - ability = GetAbilityBySpecies(species, abilityBit); - if (ability != ABILITY_SOUNDPROOF) - to_heal |= (1 << i); - } - } - } - else //Aromatherapy - { - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - to_heal = 0x3F; - gBattleMons[gBankAttacker].status1 = zero2; - - gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank])) - gBattleMons[gActiveBank].status1 = 0; - - } - //missing check? - gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, to_heal, 4, &zero); - MarkBufferBankForExecution(gActiveBank); - - gBattlescriptCurrInstr++; -} - -static void atkAF_cursetarget(void) -{ - if (gBattleMons[gBankTarget].status2 & STATUS2_CURSED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE) - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } - else - { - gBattleMons[gBankTarget].status2 |= STATUS2_CURSED; - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattlescriptCurrInstr += 5; - } -} - -static void atkB0_set_spikes(void) -{ - u8 side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].spikesAmount == 3) - { - gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } - else - { - gSideAffecting[side] |= SIDE_STATUS_SPIKES; - gSideTimer[side].spikesAmount++; - gBattlescriptCurrInstr += 5; - } -} - -static void atkB1_set_foresight(void) -{ - gBattleMons[gBankTarget].status2 |= STATUS2_FORESIGHT; - gBattlescriptCurrInstr++; -} - -static void atkB2_setperishsong(void) -{ - int not_affected_pokes = 0, i; - - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gStatuses3[i] & STATUS3_PERISH_SONG || gBattleMons[i].ability == ABILITY_SOUNDPROOF) - not_affected_pokes++; - else - { - gStatuses3[i] |= STATUS3_PERISH_SONG; - gDisableStructs[i].perishSong1 = 3; - gDisableStructs[i].perishSong2 = 3; - } - } - - sub_80153D0(gBankAttacker); - if (not_affected_pokes == gNoOfAllBanks) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; -} - -static void atkB3_rolloutdamagecalculation(void) -{ - if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) - { - CancelMultiTurnMoves(gBankAttacker); - gBattlescriptCurrInstr = BattleScript_1D6F74; - } - else - { - int i; - if (!(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) //first hit - { - gDisableStructs[gBankAttacker].rolloutTimer1 = 5; - gDisableStructs[gBankAttacker].rolloutTimer2 = 5; - gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS; - gLockedMove[gBankAttacker] = gCurrentMove; - } - if (--gDisableStructs[gBankAttacker].rolloutTimer1 == 0) - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS); - - gDynamicBasePower = gBattleMoves[gCurrentMove].power; - for (i = 1; i < (5 - gDisableStructs[gBankAttacker].rolloutTimer1); i++) - gDynamicBasePower *= 2; - - if (gBattleMons[gBankAttacker].status2 & STATUS2_DEFENSE_CURL) - gDynamicBasePower *= 2; - - gBattlescriptCurrInstr++; - } -} - -static void atkB4_jumpifconfusedandstatmaxed(void) -{ - if (gBattleMons[gBankTarget].status2 & STATUS2_CONFUSION && gBattleMons[gBankTarget].statStages[BSScriptRead8(gBattlescriptCurrInstr + 1)] == 0xC) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; -} - -static void atkB5_furycuttercalc(void) -{ - if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) - { - gDisableStructs[gBankAttacker].furyCutterCounter = 0; - gBattlescriptCurrInstr = BattleScript_1D6F74; - } - else - { - int i; - - if (gDisableStructs[gBankAttacker].furyCutterCounter != 5) - gDisableStructs[gBankAttacker].furyCutterCounter++; - - gDynamicBasePower = gBattleMoves[gCurrentMove].power; - for (i = 1; i < gDisableStructs[gBankAttacker].furyCutterCounter; i++) - gDynamicBasePower *= 2; - - gBattlescriptCurrInstr++; - } -} - -static void atkB6_happinesstodamagecalculation(void) -{ - if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN) - gDynamicBasePower = 10 * (gBattleMons[gBankAttacker].friendship) / 25; - else //EFFECT_FRUSTRATION - gDynamicBasePower = 10 * (255 - gBattleMons[gBankAttacker].friendship) / 25; - gBattlescriptCurrInstr++; -} - -static void atkB7_presentdamagecalculation(void) -{ - s32 rand = Random() & 0xFF; - if (rand < 102) - gDynamicBasePower = 40; - else if (rand < 178) - gDynamicBasePower = 80; - else if (rand < 204) - gDynamicBasePower = 120; - else - { - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - } - if (rand < 204) - gBattlescriptCurrInstr = BattleScript_1D6F44; - else if (gBattleMons[gBankTarget].maxHP == gBattleMons[gBankTarget].hp) - gBattlescriptCurrInstr = BattleScript_1D83B5; - else - { - //gBattleMoveFlags &= ~(MOVESTATUS_NOTAFFECTED); only in Emerald - gBattlescriptCurrInstr = BattleScript_1D839B; - } -} - -static void atkB8_set_safeguard(void) -{ - if (gSideAffecting[GetBankIdentity(gBankAttacker) & 1] & SIDE_STATUS_SAFEGUARD) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else - { - gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_SAFEGUARD; - gSideTimer[GetBankIdentity(gBankAttacker) & 1].safeguardTimer = 5; - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - } - gBattlescriptCurrInstr++; -} - -static void atkB9_magnitudedamagecalculation(void) -{ - s32 magnitude = Random() % 100; - if (magnitude < 5) - { - gDynamicBasePower = 10; - magnitude = 4; - } - else if (magnitude < 15) - { - gDynamicBasePower = 30; - magnitude = 5; - } - else if (magnitude < 35) - { - gDynamicBasePower = 50; - magnitude = 6; - } - else if (magnitude < 65) - { - gDynamicBasePower = 70; - magnitude = 7; - } - else if (magnitude < 85) - { - gDynamicBasePower = 90; - magnitude = 8; - } - else if (magnitude < 95) - { - gDynamicBasePower = 110; - magnitude = 9; - } - else - { - gDynamicBasePower = 150; - magnitude = 10; - } - - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 1; - gBattleTextBuff1[2] = 1; - gBattleTextBuff1[3] = 2; - gBattleTextBuff1[4] = magnitude; - gBattleTextBuff1[5] = 0xFF; - - for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++) - { - if (gBankTarget == gBankAttacker) - continue; - if (!(gAbsentBankFlags & gBitTable[gBankTarget])) //a valid target was found - break; - } - gBattlescriptCurrInstr++; -} - -static void atkBA_jumpifnopursuitswitchdmg(void) -{ - if (gMultiHitCounter == 1) - { - if (GetBankSide(gBankAttacker) == 0) - gBankTarget = GetBankByPlayerAI(1); - else - gBankTarget = GetBankByPlayerAI(0); - } - else - { - if (GetBankSide(gBankAttacker) == 0) - gBankTarget = GetBankByPlayerAI(3); - else - gBankTarget = GetBankByPlayerAI(2); - } - - if (gActionForBanks[gBankTarget] == 0 && gBankAttacker == ewram[gBankTarget + 0x16010] && !(gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE)) - && gBattleMons[gBankAttacker].hp && !gDisableStructs[gBankTarget].truantCounter && gChosenMovesByBanks[gBankTarget] == MOVE_PURSUIT) - { - int i; - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gTurnOrder[i] == gBankTarget) - gUnknown_02024A76[i] = 11; - } - gCurrentMove = MOVE_PURSUIT; - gBattlescriptCurrInstr += 5; - BATTLE_STRUCT->animTurn = 1; - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - } - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atkBB_setsunny(void) -{ - if (gBattleWeather & WEATHER_SUN_ANY) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gBattleWeather = WEATHER_SUN_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - gWishFutureKnock.weatherDuration = 5; - } - gBattlescriptCurrInstr++; -} - -static void atkBC_maxattackhalvehp(void) //belly drum -{ - u32 half_hp = gBattleMons[gBankAttacker].maxHP / 2; - if (!(gBattleMons[gBankAttacker].maxHP / 2)) - half_hp = 1; - - if (gBattleMons[gBankAttacker].statStages[STAT_STAGE_ATK] < 12 && gBattleMons[gBankAttacker].hp > half_hp) - { - gBattleMons[gBankAttacker].statStages[STAT_STAGE_ATK] = 12; - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } -} - -static void atkBD_copyfoestats(void) //psych up -{ - int i; - for (i = 0; i < 8; i++) - { - gBattleMons[gBankAttacker].statStages[i] = gBattleMons[gBankTarget].statStages[i]; - } - gBattlescriptCurrInstr += 5; //why not 1? possible unused fail possibility? -} - -static void atkBE_breakfree(void) //rapid spin -{ - if (gBattleMons[gBankAttacker].status2 & STATUS2_WRAPPED) - { - gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED); - gBankTarget = ewram[gBankAttacker + 0x16020]; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 2; - gBattleTextBuff1[2] = ewram[gBankAttacker * 2 + 0x16004]; - gBattleTextBuff1[3] = ewram[gBankAttacker * 2 + 0x16005]; - gBattleTextBuff1[4] = 0xFF; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_WrapFree; - } - else if (gStatuses3[gBankAttacker] & STATUS3_LEECHSEED) - { - gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED); - gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED_BANK); - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_LeechSeedFree; - } - else if (gSideAffecting[GetBankSide(gBankAttacker)] & SIDE_STATUS_SPIKES) - { - gSideAffecting[GetBankSide(gBankAttacker)] &= ~(SIDE_STATUS_SPIKES); - gSideTimer[GetBankSide(gBankAttacker)].spikesAmount = 0; - b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BattleScript_SpikesFree; - } - else - gBattlescriptCurrInstr++; -} - -static void atkBF_set_defense_curl(void) -{ - gBattleMons[gBankAttacker].status2 |= STATUS2_DEFENSE_CURL; - gBattlescriptCurrInstr++; -} - -static void atkC0_recoverbasedonsunlight(void) -{ - gBankTarget = gBankAttacker; - if (gBattleMons[gBankAttacker].hp != gBattleMons[gBankAttacker].maxHP) - { - if (!gBattleWeather || !WEATHER_HAS_EFFECT) - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2; - else if (gBattleWeather & WEATHER_SUN_ANY) - gBattleMoveDamage = 20 * gBattleMons[gBankAttacker].maxHP / 30; - else //not sunny weather - gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } -} - -__attribute__((naked)) -static void atkC1_hidden_power(void) -{ - asm(".syntax unified\n\ -push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - ldr r2, _08029894 @ =gBattleMons\n\ - ldr r0, _08029898 @ =gBankAttacker\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - adds r4, r1, 0\n\ - muls r4, r0\n\ - adds r4, r2\n\ - ldrb r0, [r4, 0x14]\n\ - mov r10, r0\n\ - mov r7, r10\n\ - lsls r7, 27\n\ - adds r0, r7, 0\n\ - lsrs r0, 27\n\ - mov r10, r0\n\ - movs r1, 0x2\n\ - mov r2, r10\n\ - ands r2, r1\n\ - asrs r2, 1\n\ - ldrh r7, [r4, 0x14]\n\ - mov r9, r7\n\ - mov r0, r9\n\ - lsls r0, 22\n\ - mov r9, r0\n\ - lsrs r3, r0, 27\n\ - adds r0, r1, 0\n\ - ands r0, r3\n\ - orrs r2, r0\n\ - ldrb r7, [r4, 0x15]\n\ - mov r8, r7\n\ - mov r0, r8\n\ - lsls r0, 25\n\ - mov r8, r0\n\ - lsrs r3, r0, 27\n\ - adds r0, r1, 0\n\ - ands r0, r3\n\ - lsls r0, 1\n\ - orrs r2, r0\n\ - ldr r6, [r4, 0x14]\n\ - lsls r6, 12\n\ - lsrs r3, r6, 27\n\ - adds r0, r1, 0\n\ - ands r0, r3\n\ - lsls r0, 2\n\ - orrs r2, r0\n\ - ldrh r5, [r4, 0x16]\n\ - lsls r5, 23\n\ - lsrs r3, r5, 27\n\ - adds r0, r1, 0\n\ - ands r0, r3\n\ - lsls r0, 3\n\ - orrs r2, r0\n\ - ldrb r3, [r4, 0x17]\n\ - lsls r3, 26\n\ - lsrs r0, r3, 27\n\ - ands r1, r0\n\ - lsls r1, 4\n\ - orrs r2, r1\n\ - movs r1, 0x1\n\ - adds r4, r1, 0\n\ - mov r7, r10\n\ - ands r4, r7\n\ - mov r0, r9\n\ - lsrs r0, 27\n\ - mov r9, r0\n\ - adds r0, r1, 0\n\ - mov r7, r9\n\ - ands r0, r7\n\ - lsls r0, 1\n\ - orrs r4, r0\n\ - mov r0, r8\n\ - lsrs r0, 27\n\ - mov r8, r0\n\ - adds r0, r1, 0\n\ - mov r7, r8\n\ - ands r0, r7\n\ - lsls r0, 2\n\ - orrs r4, r0\n\ - lsrs r6, 27\n\ - adds r0, r1, 0\n\ - ands r0, r6\n\ - lsls r0, 3\n\ - orrs r4, r0\n\ - lsrs r5, 27\n\ - adds r0, r1, 0\n\ - ands r0, r5\n\ - lsls r0, 4\n\ - orrs r4, r0\n\ - lsrs r3, 27\n\ - ands r1, r3\n\ - lsls r1, 5\n\ - orrs r4, r1\n\ - ldr r5, _0802989C @ =gDynamicBasePower\n\ - lsls r0, r2, 2\n\ - adds r0, r2\n\ - lsls r0, 3\n\ - movs r1, 0x3F\n\ - bl __divsi3\n\ - adds r0, 0x1E\n\ - strh r0, [r5]\n\ - ldr r5, _080298A0 @ =0x02000000\n\ - lsls r0, r4, 4\n\ - subs r0, r4\n\ - movs r1, 0x3F\n\ - bl __divsi3\n\ - adds r1, r0, 0x1\n\ - ldr r0, _080298A4 @ =0x0001601c\n\ - adds r5, r0\n\ - strb r1, [r5]\n\ - lsls r0, r1, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x8\n\ - bls _08029876\n\ - adds r0, r1, 0x1\n\ - strb r0, [r5]\n\ -_08029876:\n\ - ldrb r0, [r5]\n\ - movs r1, 0xC0\n\ - orrs r0, r1\n\ - strb r0, [r5]\n\ - ldr r1, _080298A8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x1\n\ - str r0, [r1]\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08029894: .4byte gBattleMons\n\ -_08029898: .4byte gBankAttacker\n\ -_0802989C: .4byte gDynamicBasePower\n\ -_080298A0: .4byte 0x02000000\n\ -_080298A4: .4byte 0x0001601c\n\ -_080298A8: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} - -static void atkC2_selectnexttarget(void) -{ - for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++) - { - if (gBankTarget == gBankAttacker) - continue; - if (!(gAbsentBankFlags & gBitTable[gBankTarget])) - break; - } - gBattlescriptCurrInstr++; -} - -static void atkC3_setfutureattack(void) -{ - if (gWishFutureKnock.futureSightCounter[gBankTarget] != 0) - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } - else - { - gWishFutureKnock.futureSightMove[gBankTarget] = gCurrentMove; - gWishFutureKnock.futureSightAttacker[gBankTarget] = gBankAttacker; - gWishFutureKnock.futureSightCounter[gBankTarget] = 3; - gWishFutureKnock.futureSightDmg[gBankTarget] = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove, - gSideAffecting[GetBankIdentity(gBankTarget) & 1], 0, - 0, gBankAttacker, gBankTarget); - - if (gProtectStructs[gBankAttacker].helpingHand) - gWishFutureKnock.futureSightDmg[gBankTarget] = gWishFutureKnock.futureSightDmg[gBankTarget] * 15 / 10; - - if (gCurrentMove == MOVE_DOOM_DESIRE) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - - gBattlescriptCurrInstr += 5; - } -} - -#ifdef NONMATCHING -static void atkC4_beat_up(void) -{ - register struct Pokemon* party asm("r7"); - if (GetBankSide(gBankAttacker) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - - if (gBattleMons[gBankTarget].hp == 0) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - { - while (gBattleCommunication[0] < 6) - { - if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) - && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) != SPECIES_EGG && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) - break; - gBattleCommunication[0]++; - } - if (gBattleCommunication[0] < 6) - { - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = gBankAttacker; - gBattleTextBuff1[3] = gBattleCommunication[0]; - gBattleTextBuff1[4] = 0xFF; - gBattlescriptCurrInstr += 9; - - gBattleMoveDamage = gBaseStats[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack; - gBattleMoveDamage *= gBattleMoves[gCurrentMove].power; - gBattleMoveDamage *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2); - gBattleMoveDamage /= gBaseStats[gBattleMons[gBankTarget].species].baseDefense; - gBattleMoveDamage = (gBattleMoveDamage / 50) + 2; - if (gProtectStructs[gBankAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - - gBattleCommunication[0]++; - } - else if (gBattleCommunication[0] != 0) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 5); - } -} -#else -__attribute__((naked)) -static void atkC4_beat_up(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - ldr r0, _08029A8C @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - ldr r7, _08029A90 @ =gEnemyParty\n\ - cmp r0, 0\n\ - bne _08029A62\n\ - ldr r7, _08029A94 @ =gPlayerParty\n\ -_08029A62:\n\ - ldr r2, _08029A98 @ =gBattleMons\n\ - ldr r0, _08029A9C @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r2\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _08029AA4\n\ - ldr r3, _08029AA0 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - b _08029C40\n\ - .align 2, 0\n\ -_08029A8C: .4byte gBankAttacker\n\ -_08029A90: .4byte gEnemyParty\n\ -_08029A94: .4byte gPlayerParty\n\ -_08029A98: .4byte gBattleMons\n\ -_08029A9C: .4byte gBankTarget\n\ -_08029AA0: .4byte gBattlescriptCurrInstr\n\ -_08029AA4:\n\ - ldr r6, _08029BE0 @ =gBattleCommunication\n\ - ldrb r0, [r6]\n\ - mov r8, r0\n\ - cmp r0, 0x5\n\ - bls _08029AB0\n\ - b _08029C0C\n\ -_08029AB0:\n\ - adds r4, r6, 0\n\ - movs r5, 0x64\n\ -_08029AB4:\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029AF8\n\ - ldrb r0, [r6]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029AF8\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _08029AF8\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x37\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029B08\n\ -_08029AF8:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - adds r6, r4, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x5\n\ - bls _08029AB4\n\ -_08029B08:\n\ - ldr r1, _08029BE0 @ =gBattleCommunication\n\ - mov r9, r1\n\ - ldrb r2, [r1]\n\ - cmp r2, 0x5\n\ - bhi _08029C0C\n\ - ldr r1, _08029BE4 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x1]\n\ - ldr r6, _08029BE8 @ =gBankAttacker\n\ - ldrb r0, [r6]\n\ - strb r0, [r1, 0x2]\n\ - strb r2, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _08029BEC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x9\n\ - str r0, [r1]\n\ - ldr r2, _08029BF0 @ =gBattleMoveDamage\n\ - mov r8, r2\n\ - ldr r5, _08029BF4 @ =gBaseStats\n\ - mov r1, r9\n\ - ldrb r0, [r1]\n\ - movs r4, 0x64\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r1, r0, 3\n\ - subs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r3, [r1, 0x1]\n\ - mov r2, r8\n\ - str r3, [r2]\n\ - ldr r2, _08029BF8 @ =gBattleMoves\n\ - ldr r0, _08029BFC @ =gCurrentMove\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0, 0x1]\n\ - muls r0, r3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - lsls r0, 1\n\ - movs r1, 0x5\n\ - bl __udivsi3\n\ - adds r0, 0x2\n\ - mov r2, r8\n\ - ldr r1, [r2]\n\ - muls r0, r1\n\ - str r0, [r2]\n\ - ldr r3, _08029C00 @ =gBattleMons\n\ - ldr r1, _08029C04 @ =gBankTarget\n\ - ldrb r2, [r1]\n\ - movs r1, 0x58\n\ - muls r1, r2\n\ - adds r1, r3\n\ - ldrh r2, [r1]\n\ - lsls r1, r2, 3\n\ - subs r1, r2\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r1, [r1, 0x2]\n\ - bl __divsi3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - movs r1, 0x32\n\ - bl __divsi3\n\ - adds r2, r0, 0x2\n\ - mov r0, r8\n\ - str r2, [r0]\n\ - ldr r1, _08029C08 @ =gProtectStructs\n\ - ldrb r0, [r6]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 28\n\ - cmp r0, 0\n\ - bge _08029BD4\n\ - lsls r0, r2, 4\n\ - subs r0, r2\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ -_08029BD4:\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - adds r0, 0x1\n\ - strb r0, [r2]\n\ - b _08029C46\n\ - .align 2, 0\n\ -_08029BE0: .4byte gBattleCommunication\n\ -_08029BE4: .4byte gBattleTextBuff1\n\ -_08029BE8: .4byte gBankAttacker\n\ -_08029BEC: .4byte gBattlescriptCurrInstr\n\ -_08029BF0: .4byte gBattleMoveDamage\n\ -_08029BF4: .4byte gBaseStats\n\ -_08029BF8: .4byte gBattleMoves\n\ -_08029BFC: .4byte gCurrentMove\n\ -_08029C00: .4byte gBattleMons\n\ -_08029C04: .4byte gBankTarget\n\ -_08029C08: .4byte gProtectStructs\n\ -_08029C0C:\n\ - mov r0, r8\n\ - cmp r0, 0\n\ - beq _08029C2C\n\ - ldr r3, _08029C28 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - b _08029C40\n\ - .align 2, 0\n\ -_08029C28: .4byte gBattlescriptCurrInstr\n\ -_08029C2C:\n\ - ldr r3, _08029C54 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x5]\n\ - ldrb r0, [r2, 0x6]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x7]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x8]\n\ -_08029C40:\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_08029C46:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08029C54: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} -#endif // NONMATCHING - -static void atkC5_hidepreattack(void) -{ - switch (gCurrentMove) - { - case MOVE_FLY: - case MOVE_BOUNCE: - gStatuses3[gBankAttacker] |= STATUS3_ON_AIR; - break; - case MOVE_DIG: - gStatuses3[gBankAttacker] |= STATUS3_UNDERGROUND; - break; - case MOVE_DIVE: - gStatuses3[gBankAttacker] |= STATUS3_UNDERWATER; - break; - } - gBattlescriptCurrInstr++; -} - -static void atkC6_unhidepostattack(void) -{ - switch (gCurrentMove) - { - case MOVE_FLY: - case MOVE_BOUNCE: - gStatuses3[gBankAttacker] &= ~STATUS3_ON_AIR; - break; - case MOVE_DIG: - gStatuses3[gBankAttacker] &= ~STATUS3_UNDERGROUND; - break; - case MOVE_DIVE: - gStatuses3[gBankAttacker] &= ~STATUS3_UNDERWATER; - break; - } - gBattlescriptCurrInstr++; -} - -static void atkC7_setminimize(void) -{ - if (gHitMarker & HITMARKER_OBEYS) - gStatuses3[gBankAttacker] |= STATUS3_MINIMIZED; - gBattlescriptCurrInstr++; -} - -static void atkC8_sethail(void) -{ - if (gBattleWeather & WEATHER_HAIL) - { - gBattleMoveFlags |= MOVESTATUS_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - } - else - { - gBattleWeather = WEATHER_HAIL; - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - gWishFutureKnock.weatherDuration = 5; - } - gBattlescriptCurrInstr++; -} - -static void atkC9_jumpifattackandspecialattackcannotfall(void) //memento -{ - if (gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] == 0 - && gBattleMons[gBankTarget].statStages[STAT_STAGE_SPATK] == 0 - && gBattleCommunication[6] != 1) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - { - gActiveBank = gBankAttacker; - gBattleMoveDamage = gBattleMons[gActiveBank].hp; - EmitHealthBarUpdate(0, 0x7FFF); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 5; - } -} - -static void atkCA_setforcedtarget(void) //follow me -{ - gSideTimer[GetBankSide(gBankAttacker)].followmeTimer = 1; - gSideTimer[GetBankSide(gBankAttacker)].followmeTarget = gBankAttacker; - gBattlescriptCurrInstr++; -} - -static void atkCB_setcharge(void) -{ - gStatuses3[gBankAttacker] |= STATUS3_CHARGED_UP; - gDisableStructs[gBankAttacker].chargeTimer1 = 2; - gDisableStructs[gBankAttacker].chargeTimer2 = 2; - gBattlescriptCurrInstr++; -} - -static void atkCC_callterrainattack(void) //nature power -{ - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gCurrentMove = sNaturePowerMoves[gBattleTerrain]; - gBankTarget = sub_801B5C0(gCurrentMove, 0); - b_movescr_stack_push(gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]); - gBattlescriptCurrInstr++; -} - -static void atkCD_cureifburnedparalysedorpoisoned(void) //refresh -{ - if (gBattleMons[gBankAttacker].status1 & (STATUS_POISON | STATUS_BURN | STATUS_PARALYSIS | STATUS_TOXIC_POISON)) - { - gBattleMons[gBankAttacker].status1 = 0; - gBattlescriptCurrInstr += 5; - gActiveBank = gBankAttacker; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); - MarkBufferBankForExecution(gActiveBank); - } - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atkCE_settorment(void) -{ - if (gBattleMons[gBankTarget].status2 & STATUS2_TORMENT) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - { - gBattleMons[gBankTarget].status2 |= STATUS2_TORMENT; - gBattlescriptCurrInstr += 5; - } -} - -static void atkCF_jumpifnodamage(void) -{ - if (gProtectStructs[gBankAttacker].physicalDmg || gProtectStructs[gBankAttacker].specialDmg) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atkD0_settaunt(void) -{ - if (gDisableStructs[gBankTarget].tauntTimer1 == 0) - { - gDisableStructs[gBankTarget].tauntTimer1 = 2; - gDisableStructs[gBankTarget].tauntTimer2 = 2; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atkD1_set_helpinghand(void) -{ - gBankTarget = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gBankTarget]) - && !gProtectStructs[gBankAttacker].helpingHand && !gProtectStructs[gBankTarget].helpingHand) - { - gProtectStructs[gBankTarget].helpingHand = 1; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -#ifdef NONMATCHING -static void atkD2_swap_items(void) -{ - if ((GetBankSide(gBankAttacker) != 1 || gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER) || gTrainerBattleOpponent == 0x400)) - { - u8 side = GetBankSide(gBankAttacker); - if (gBattleTypeFlags) - } - - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -#else -__attribute__((naked)) -static void atkD2_swap_items(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - ldr r0, _0802A30C @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _0802A24C\n\ - ldr r0, _0802A310 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0802A314 @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0802A24C\n\ - ldr r0, _0802A318 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - bne _0802A2EE\n\ -_0802A24C:\n\ - ldr r4, _0802A30C @ =gBankAttacker\n\ - ldrb r0, [r4]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - ldr r0, _0802A310 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0802A314 @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0802A290\n\ - ldr r0, _0802A318 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0802A290\n\ - ldr r0, _0802A31C @ =gWishFutureKnock\n\ - adds r0, 0x29\n\ - adds r0, r2, r0\n\ - ldrb r1, [r0]\n\ - ldr r3, _0802A320 @ =gBitTable\n\ - ldr r2, _0802A324 @ =gBattlePartyID\n\ - ldrb r0, [r4]\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _0802A2EE\n\ -_0802A290:\n\ - ldr r0, _0802A328 @ =gBattleMons\n\ - mov r9, r0\n\ - ldr r1, _0802A30C @ =gBankAttacker\n\ - ldrb r4, [r1]\n\ - movs r2, 0x58\n\ - mov r8, r2\n\ - mov r0, r8\n\ - muls r0, r4\n\ - mov r3, r9\n\ - adds r5, r0, r3\n\ - ldrh r3, [r5, 0x2E]\n\ - adds r1, r3, 0\n\ - cmp r1, 0\n\ - bne _0802A2BE\n\ - ldr r0, _0802A32C @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - add r0, r9\n\ - ldrh r0, [r0, 0x2E]\n\ - cmp r0, 0\n\ - beq _0802A2EE\n\ -_0802A2BE:\n\ - cmp r1, 0xAF\n\ - beq _0802A2EE\n\ - ldr r7, _0802A32C @ =gBankTarget\n\ - ldrb r0, [r7]\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - mov r1, r9\n\ - adds r2, r0, r1\n\ - ldrh r1, [r2, 0x2E]\n\ - cmp r1, 0xAF\n\ - beq _0802A2EE\n\ - adds r0, r3, 0\n\ - subs r0, 0x79\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xB\n\ - bls _0802A2EE\n\ - adds r0, r1, 0\n\ - subs r0, 0x79\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xB\n\ - bhi _0802A334\n\ -_0802A2EE:\n\ - ldr r3, _0802A330 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ - b _0802A49A\n\ - .align 2, 0\n\ -_0802A30C: .4byte gBankAttacker\n\ -_0802A310: .4byte gBattleTypeFlags\n\ -_0802A314: .4byte 0x00000902\n\ -_0802A318: .4byte gTrainerBattleOpponent\n\ -_0802A31C: .4byte gWishFutureKnock\n\ -_0802A320: .4byte gBitTable\n\ -_0802A324: .4byte gBattlePartyID\n\ -_0802A328: .4byte gBattleMons\n\ -_0802A32C: .4byte gBankTarget\n\ -_0802A330: .4byte gBattlescriptCurrInstr\n\ -_0802A334:\n\ - adds r0, r2, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3C\n\ - bne _0802A36C\n\ - ldr r1, _0802A360 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0802A364 @ =BattleScript_NoItemSteal\n\ - str r0, [r1]\n\ - ldr r1, _0802A368 @ =gLastUsedAbility\n\ - ldrb r0, [r7]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - add r0, r9\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldrb r0, [r7]\n\ - ldrb r1, [r1]\n\ - bl RecordAbilityBattle\n\ - b _0802A49A\n\ - .align 2, 0\n\ -_0802A360: .4byte gBattlescriptCurrInstr\n\ -_0802A364: .4byte BattleScript_NoItemSteal\n\ -_0802A368: .4byte gLastUsedAbility\n\ -_0802A36C:\n\ - lsls r0, r4, 1\n\ - ldr r4, _0802A458 @ =0x020160f0\n\ - adds r6, r0, r4\n\ - ldrh r5, [r5, 0x2E]\n\ - mov r10, r5\n\ - strh r1, [r6]\n\ - ldr r3, _0802A45C @ =gBankAttacker\n\ - ldrb r0, [r3]\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - add r0, r9\n\ - movs r1, 0\n\ - strh r1, [r0, 0x2E]\n\ - ldrb r0, [r7]\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - add r0, r9\n\ - mov r3, r10\n\ - strh r3, [r0, 0x2E]\n\ - ldr r5, _0802A460 @ =gActiveBank\n\ - ldr r1, _0802A45C @ =gBankAttacker\n\ - ldrb r0, [r1]\n\ - strb r0, [r5]\n\ - str r6, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - movs r3, 0x2\n\ - bl EmitSetAttributes\n\ - ldr r2, _0802A45C @ =gBankAttacker\n\ - ldrb r0, [r2]\n\ - bl MarkBufferBankForExecution\n\ - ldrb r0, [r7]\n\ - strb r0, [r5]\n\ - ldrb r0, [r7]\n\ - mov r3, r8\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - adds r1, 0x2E\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - movs r3, 0x2\n\ - bl EmitSetAttributes\n\ - ldrb r0, [r7]\n\ - bl MarkBufferBankForExecution\n\ - ldr r0, _0802A464 @ =0xfffe9f10\n\ - adds r4, r0\n\ - ldrb r0, [r7]\n\ - lsls r0, 1\n\ - ldr r2, _0802A468 @ =0x000160e8\n\ - adds r0, r2\n\ - adds r0, r4\n\ - movs r1, 0\n\ - strb r1, [r0]\n\ - ldrb r0, [r7]\n\ - lsls r0, 1\n\ - ldr r1, _0802A46C @ =0x000160e9\n\ - adds r0, r1\n\ - adds r0, r4\n\ - movs r3, 0\n\ - strb r3, [r0]\n\ - ldr r3, _0802A45C @ =gBankAttacker\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - adds r0, r4\n\ - movs r2, 0\n\ - strb r2, [r0]\n\ - ldrb r0, [r3]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - adds r0, r4\n\ - strb r2, [r0]\n\ - ldr r1, _0802A470 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - ldr r1, _0802A474 @ =gBattleTextBuff1\n\ - movs r3, 0xFD\n\ - strb r3, [r1]\n\ - movs r2, 0xA\n\ - strb r2, [r1, 0x1]\n\ - ldrh r0, [r6]\n\ - strb r0, [r1, 0x2]\n\ - ldrh r0, [r6]\n\ - lsrs r0, 8\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _0802A478 @ =gBattleTextBuff2\n\ - strb r3, [r1]\n\ - strb r2, [r1, 0x1]\n\ - mov r3, r10\n\ - strb r3, [r1, 0x2]\n\ - mov r2, r10\n\ - lsrs r0, r2, 8\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - strb r0, [r1, 0x4]\n\ - cmp r2, 0\n\ - beq _0802A480\n\ - ldrh r0, [r6]\n\ - cmp r0, 0\n\ - beq _0802A494\n\ - ldr r1, _0802A47C @ =gBattleCommunication\n\ - movs r0, 0x2\n\ - b _0802A498\n\ - .align 2, 0\n\ -_0802A458: .4byte 0x020160f0\n\ -_0802A45C: .4byte gBankAttacker\n\ -_0802A460: .4byte gActiveBank\n\ -_0802A464: .4byte 0xfffe9f10\n\ -_0802A468: .4byte 0x000160e8\n\ -_0802A46C: .4byte 0x000160e9\n\ -_0802A470: .4byte gBattlescriptCurrInstr\n\ -_0802A474: .4byte gBattleTextBuff1\n\ -_0802A478: .4byte gBattleTextBuff2\n\ -_0802A47C: .4byte gBattleCommunication\n\ -_0802A480:\n\ - ldrh r0, [r6]\n\ - cmp r0, 0\n\ - beq _0802A494\n\ - ldr r0, _0802A490 @ =gBattleCommunication\n\ - movs r3, 0\n\ - strb r3, [r0, 0x5]\n\ - b _0802A49A\n\ - .align 2, 0\n\ -_0802A490: .4byte gBattleCommunication\n\ -_0802A494:\n\ - ldr r1, _0802A4AC @ =gBattleCommunication\n\ - movs r0, 0x1\n\ -_0802A498:\n\ - strb r0, [r1, 0x5]\n\ -_0802A49A:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0802A4AC: .4byte gBattleCommunication\n\ - .syntax divided"); -} -#endif // NONMATCHING - -static void atkD3_copy_ability(void) //role play -{ - if (gBattleMons[gBankTarget].ability != 0 && gBattleMons[gBankTarget].ability != ABILITY_WONDER_GUARD) - { - gBattleMons[gBankAttacker].ability = gBattleMons[gBankTarget].ability; - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atkD4_wish_effect(void) -{ - switch (BSScriptRead8(gBattlescriptCurrInstr + 1)) - { - case 0: //use wish - if (gWishFutureKnock.wishCounter[gBankAttacker] == 0) - { - gWishFutureKnock.wishCounter[gBankAttacker] = 2; - gWishFutureKnock.wishUserID[gBankAttacker] = gBattlePartyID[gBankAttacker]; - gBattlescriptCurrInstr += 6; - } - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); - break; - case 1: //heal effect - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = gBankTarget; - gBattleTextBuff1[3] = gWishFutureKnock.wishUserID[gBankTarget]; - gBattleTextBuff1[4] = 0xFF; - gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; - break; - } -} - -static void atkD5_setroots(void) //ingrain -{ - if (gStatuses3[gBankAttacker] & STATUS3_ROOTED) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - { - gStatuses3[gBankAttacker] |= STATUS3_ROOTED; - gBattlescriptCurrInstr += 5; - } -} - -static void atkD6_doubledamagedealtifdamaged(void) -{ - if ((gProtectStructs[gBankAttacker].physicalDmg && gProtectStructs[gBankAttacker].physicalBank == gBankTarget) - || (gProtectStructs[gBankAttacker].specialDmg && gProtectStructs[gBankAttacker].specialBank == gBankTarget)) - BATTLE_STRUCT->dmgMultiplier = 2; - gBattlescriptCurrInstr++; -} - -static void atkD7_setyawn(void) -{ - if (gStatuses3[gBankTarget] & STATUS3_YAWN || (u8) gBattleMons[gBankTarget].status1) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - { - gStatuses3[gBankTarget] |= 0x1000; - gBattlescriptCurrInstr += 5; - } -} - -static void atkD8_setdamagetohealthdifference(void) -{ - if (gBattleMons[gBankTarget].hp <= gBattleMons[gBankAttacker].hp) - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } - else - { - gBattleMoveDamage = gBattleMons[gBankTarget].hp - gBattleMons[gBankAttacker].hp; - gBattlescriptCurrInstr += 5; - } -} - -static void atkD9_scaledamagebyhealthratio(void) -{ - if (gDynamicBasePower == 0) - { - u8 power = gBattleMoves[gCurrentMove].power; - gDynamicBasePower = gBattleMons[gBankAttacker].hp * power / gBattleMons[gBankAttacker].maxHP; - if (gDynamicBasePower == 0) - gDynamicBasePower = 1; - } - gBattlescriptCurrInstr++; -} - -static void atkDA_abilityswap(void) -{ - if ((gBattleMons[gBankAttacker].ability == 0 && gBattleMons[gBankTarget].ability == 0) - || gBattleMons[gBankAttacker].ability == ABILITY_WONDER_GUARD || gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD - || gBattleMoveFlags & MOVESTATUS_NOEFFECT) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - { - u8 atk_ability = gBattleMons[gBankAttacker].ability; - gBattleMons[gBankAttacker].ability = gBattleMons[gBankTarget].ability; - gBattleMons[gBankTarget].ability = atk_ability; - gBattlescriptCurrInstr += 5; - } -} - -static void atkDB_imprisoneffect(void) -{ - u8 r8 = 0; - if ((gStatuses3[gBankAttacker] & STATUS3_IMPRISIONED)) - { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } - else - { - u8 bank; - sub_801529C(gBankAttacker); - for (bank = 0; bank < gNoOfAllBanks; bank++) - { - if (r8 != GetBankSide(bank)) - { - int j; - for (j = 0; j < 4; j++) - { - int k; - for (k = 0; k < 4; k++) - { - if (gBattleMons[gBankAttacker].moves[j] == gBattleMons[bank].moves[k] && gBattleMons[gBankAttacker].moves[j]) - break; - } - if (k != 4) - break; - } - if (j != 4) - { - gStatuses3[gBankAttacker] |= STATUS3_IMPRISIONED; - gBattlescriptCurrInstr += 5; - break; - } - } - } - if (bank == gNoOfAllBanks) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } -} - -static void atkDC_setgrudge(void) -{ - if (gStatuses3[gBankAttacker] & STATUS3_GRUDGE) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - { - gStatuses3[gBankAttacker] |= STATUS3_GRUDGE; - gBattlescriptCurrInstr += 5; - } -} - -static void atkDD_weightdamagecalculation(void) -{ - int i; - for (i = 0; sWeightDamage[i] != 0xFFFF; i += 2) - { - if (sWeightDamage[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) - break; - } - if (sWeightDamage[i] != 0xFFFF) - gDynamicBasePower = sWeightDamage[i + 1]; - else - gDynamicBasePower = 120; - gBattlescriptCurrInstr++; -} - -#ifdef NONMATCHING -static void atkDE_asistattackselect(void) -{ - u32 chooseable_moves_no = 0; - struct Pokemon* party; - int i, j; - u16* chooseable_moves; - if (GetBankIdentity(gBankAttacker) & 1) - party = gEnemyParty; - else - party = gPlayerParty; - - for (i = 0; i < 6; i++) - { - if (i == gBattlePartyID[gBankAttacker]) - break; - if (!GetMonData(&party[i], MON_DATA_SPECIES2) || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) - break; - chooseable_moves = &BATTLE_STRUCT->assistMove[chooseable_moves_no]; - for (j = 0; j < 4; j++) - { - int k; - u16 move = GetMonData(&party[i], MON_DATA_MOVE1 + i); - if (IsMoveUnchoosable(move)) - break; - //sUnknown_081FACFE[k] - for (k = 0; ;k++) - { - if (sUnknown_081FACFE[k] == 0xFFFF) - { - if (move) - { - *chooseable_moves = move; - chooseable_moves++; - chooseable_moves_no++; - } - break; - } - if (sUnknown_081FACFE[k] == move) - break; - } - } - } - if (chooseable_moves_no) - { - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gRandomMove = BATTLE_STRUCT->assistMove[Random() % chooseable_moves_no]; - gBankTarget = sub_801B5C0(gRandomMove, 0); - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -#else -__attribute__((naked)) -static void atkDE_asistattackselect(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - movs r0, 0\n\ - mov r10, r0\n\ - ldr r0, _0802AB9C @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBankIdentity\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - ldr r0, _0802ABA0 @ =gPlayerParty\n\ - str r0, [sp]\n\ - cmp r1, 0\n\ - beq _0802AAAC\n\ - ldr r1, _0802ABA4 @ =gEnemyParty\n\ - str r1, [sp]\n\ -_0802AAAC:\n\ - movs r2, 0\n\ -_0802AAAE:\n\ - ldr r1, _0802ABA8 @ =gBattlePartyID\n\ - ldr r0, _0802AB9C @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - adds r1, r2, 0x1\n\ - str r1, [sp, 0x4]\n\ - ldrh r0, [r0]\n\ - cmp r2, r0\n\ - beq _0802AB54\n\ - movs r0, 0x64\n\ - adds r6, r2, 0\n\ - muls r6, r0\n\ - ldr r0, [sp]\n\ - adds r4, r0, r6\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0802AB54\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _0802AB54\n\ - movs r5, 0\n\ - ldr r1, _0802ABAC @ =0x0000ffff\n\ - mov r8, r1\n\ - mov r9, r6\n\ - mov r1, r10\n\ - lsls r0, r1, 1\n\ - ldr r1, _0802ABB0 @ =0x02016024\n\ - adds r6, r0, r1\n\ -_0802AAF8:\n\ - movs r7, 0\n\ - adds r1, r5, 0\n\ - adds r1, 0xD\n\ - ldr r0, [sp]\n\ - add r0, r9\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - adds r0, r4, 0\n\ - bl IsMoveUnchoosable\n\ - lsls r0, 24\n\ - adds r1, r5, 0x1\n\ - cmp r0, 0\n\ - bne _0802AB4E\n\ - ldr r0, _0802ABB4 @ =sUnknown_081FACFE\n\ - ldrh r2, [r0]\n\ - adds r3, r0, 0\n\ - cmp r2, r8\n\ - beq _0802AB42\n\ - cmp r4, r2\n\ - beq _0802AB38\n\ - ldr r5, _0802ABAC @ =0x0000ffff\n\ - adds r2, r3, 0\n\ -_0802AB2A:\n\ - adds r2, 0x2\n\ - adds r7, 0x1\n\ - ldrh r0, [r2]\n\ - cmp r0, r5\n\ - beq _0802AB42\n\ - cmp r4, r0\n\ - bne _0802AB2A\n\ -_0802AB38:\n\ - lsls r0, r7, 1\n\ - adds r0, r3\n\ - ldrh r0, [r0]\n\ - cmp r0, r8\n\ - bne _0802AB4E\n\ -_0802AB42:\n\ - cmp r4, 0\n\ - beq _0802AB4E\n\ - strh r4, [r6]\n\ - adds r6, 0x2\n\ - movs r0, 0x1\n\ - add r10, r0\n\ -_0802AB4E:\n\ - adds r5, r1, 0\n\ - cmp r5, 0x3\n\ - ble _0802AAF8\n\ -_0802AB54:\n\ - ldr r2, [sp, 0x4]\n\ - cmp r2, 0x5\n\ - ble _0802AAAE\n\ - mov r1, r10\n\ - cmp r1, 0\n\ - beq _0802ABCC\n\ - ldr r2, _0802ABB8 @ =gHitMarker\n\ - ldr r0, [r2]\n\ - ldr r1, _0802ABBC @ =0xfffffbff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r4, _0802ABC0 @ =gRandomMove\n\ - bl Random\n\ - movs r1, 0xFF\n\ - ands r1, r0\n\ - mov r0, r10\n\ - muls r0, r1\n\ - asrs r0, 8\n\ - lsls r0, 1\n\ - ldr r1, _0802ABB0 @ =0x02016024\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - strh r0, [r4]\n\ - ldrh r0, [r4]\n\ - movs r1, 0\n\ - bl sub_801B5C0\n\ - ldr r1, _0802ABC4 @ =gBankTarget\n\ - strb r0, [r1]\n\ - ldr r1, _0802ABC8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - b _0802ABE6\n\ - .align 2, 0\n\ -_0802AB9C: .4byte gBankAttacker\n\ -_0802ABA0: .4byte gPlayerParty\n\ -_0802ABA4: .4byte gEnemyParty\n\ -_0802ABA8: .4byte gBattlePartyID\n\ -_0802ABAC: .4byte 0x0000ffff\n\ -_0802ABB0: .4byte 0x02016024\n\ -_0802ABB4: .4byte sUnknown_081FACFE\n\ -_0802ABB8: .4byte gHitMarker\n\ -_0802ABBC: .4byte 0xfffffbff\n\ -_0802ABC0: .4byte gRandomMove\n\ -_0802ABC4: .4byte gBankTarget\n\ -_0802ABC8: .4byte gBattlescriptCurrInstr\n\ -_0802ABCC:\n\ - ldr r3, _0802ABF8 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_0802ABE6:\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0802ABF8: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} - -#endif // NONMATCHING - -static void atkDF_setmagiccoat(void) -{ - gBankTarget = gBankAttacker; - gSpecialStatuses[gBankAttacker].flag20 = 1; - if (gCurrentMoveTurn == gNoOfAllBanks - 1) //last turn - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - { - gProtectStructs[gBankAttacker].bounceMove = 1; - gBattlescriptCurrInstr += 5; - } -} - -static void atkE0_setstealstatchange(void) -{ - gSpecialStatuses[gBankAttacker].flag20 = 1; - if (gCurrentMoveTurn == gNoOfAllBanks - 1) //last turn - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - { - gProtectStructs[gBankAttacker].stealMove = 1; - gBattlescriptCurrInstr += 5; - } -} - -static void atkE1_intimidate_string_loader(void) -{ - u8 side; - - BATTLE_STRUCT->scriptingActive = ewram[0x160dd]; - side = GetBankSide(BATTLE_STRUCT->scriptingActive); - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 9; - gBattleTextBuff1[2] = gBattleMons[BATTLE_STRUCT->scriptingActive].ability; - gBattleTextBuff1[3] = 0xFF; - - for (;gBankTarget < gNoOfAllBanks; gBankTarget++) - { - if (GetBankSide(gBankTarget) == side) - continue; - if (!(gAbsentBankFlags & gBitTable[gBankTarget])) - break; - } - - if (gBankTarget >= gNoOfAllBanks) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - gBattlescriptCurrInstr += 5; -} - -static void atkE2_switchout_abilities(void) -{ - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - switch (gBattleMons[gActiveBank].ability) - { - case ABILITY_NATURAL_CURE: - gBattleMons[gActiveBank].status1 = 0; - EmitSetAttributes(0, REQUEST_STATUS_BATTLE, gBitTable[ewram[gActiveBank + 0x16064]], 4, &gBattleMons[gActiveBank].status1); - MarkBufferBankForExecution(gActiveBank); - break; - } - gBattlescriptCurrInstr += 2; -} - -static void atkE3_jumpiffainted(void) -{ - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - if (gBattleMons[gActiveBank].hp == 0) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; -} - -static void atkE4_getsecretpowereffect(void) -{ - switch (gBattleTerrain) - { - case 0: - gBattleCommunication[MOVE_EFFECT_BYTE] = 2; - break; - case 1: - gBattleCommunication[MOVE_EFFECT_BYTE] = 1; - break; - case 2: - gBattleCommunication[MOVE_EFFECT_BYTE] = 27; - break; - case 3: - gBattleCommunication[MOVE_EFFECT_BYTE] = 23; - break; - case 4: - gBattleCommunication[MOVE_EFFECT_BYTE] = 22; - break; - case 5: - gBattleCommunication[MOVE_EFFECT_BYTE] = 24; - break; - case 6: - gBattleCommunication[MOVE_EFFECT_BYTE] = 7; - break; - case 7: - gBattleCommunication[MOVE_EFFECT_BYTE] = 8; - break; - default: - gBattleCommunication[MOVE_EFFECT_BYTE] = 5; - break; - } - gBattlescriptCurrInstr++; -} - -static void atkE5_pickup(void) -{ - int i; - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - u16 held_item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - u8 ability; - if (GetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY)) - ability = gBaseStats[species].ability2; - else - ability = gBaseStats[species].ability1; - - if (ability == ABILITY_PICKUP && species != 0 && species != SPECIES_EGG && held_item == 0 && (Random() % 10) == 0) - { - s32 chance = Random() % 100; - s32 j; - for (j = 0; j < 18; j += 2) - { - if (sPickupItems[j + 1] > chance) - break; - } - SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, (const void*) &sPickupItems[j]); - } - } - gBattlescriptCurrInstr++; -} - -static void atkE6_castform_change_animation(void) -{ - gActiveBank = BATTLE_STRUCT->scriptingActive; - if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE) - BATTLE_STRUCT->castformToChangeInto |= 0x80; - EmitBattleAnimation(0, 0, BATTLE_STRUCT->castformToChangeInto); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr++; -} - -static void atkE7_castform_data_change(void) -{ - u8 form; - gBattlescriptCurrInstr++; - form = castform_switch(BATTLE_STRUCT->scriptingActive); - if (form) - { - b_push_move_exec(gUnknown_081D977D); - BATTLE_STRUCT->castformToChangeInto = form - 1; - } -} - -static void atkE8_settypebasedhalvers(void) //water/mud sport -{ - bool8 worked = FALSE; - if (gBattleMoves[gCurrentMove].effect == EFFECT_MUD_SPORT) - { - if (!(gStatuses3[gBankAttacker] & STATUS3_MUDSPORT)) - { - gStatuses3[gBankAttacker] |= STATUS3_MUDSPORT; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - worked = TRUE; - } - } - else //water sport - { - if (!(gStatuses3[gBankAttacker] & STATUS3_WATERSPORT)) - { - gStatuses3[gBankAttacker] |= STATUS3_WATERSPORT; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - worked = TRUE; - } - } - if (worked) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atkE9_setweatherballtype(void) -{ - if (WEATHER_HAS_EFFECT) - { - if ((u8)(gBattleWeather)) - BATTLE_STRUCT->dmgMultiplier = 2; - if (gBattleWeather & WEATHER_RAIN_ANY) - BATTLE_STRUCT->dynamicMoveType = TYPE_WATER | 0x80; - else if (gBattleWeather & WEATHER_SANDSTORM_ANY) - BATTLE_STRUCT->dynamicMoveType = TYPE_ROCK | 0x80; - else if (gBattleWeather & WEATHER_SUN_ANY) - BATTLE_STRUCT->dynamicMoveType = TYPE_FIRE | 0x80; - else if (gBattleWeather & WEATHER_HAIL) - BATTLE_STRUCT->dynamicMoveType = TYPE_ICE | 0x80; - else - BATTLE_STRUCT->dynamicMoveType = TYPE_NORMAL | 0x80; - } - gBattlescriptCurrInstr++; -} - -static void atkEA_recycleitem(void) -{ - u16* used_item; - gActiveBank = gBankAttacker; - used_item = USED_HELD_ITEM(gActiveBank); - if (*used_item && gBattleMons[gActiveBank].item == 0) - { - gLastUsedItem = *used_item; - *used_item = 0; - gBattleMons[gActiveBank].item = gLastUsedItem; - EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atkEB_settypetoterrain(void) -{ - if (gBattleMons[gBankAttacker].type1 != sTerrainToType[gBattleTerrain] && gBattleMons[gBankAttacker].type2 != sTerrainToType[gBattleTerrain]) - { - gBattleMons[gBankAttacker].type1 = sTerrainToType[gBattleTerrain]; - gBattleMons[gBankAttacker].type2 = sTerrainToType[gBattleTerrain]; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 3; - gBattleTextBuff1[2] = sTerrainToType[gBattleTerrain]; - gBattleTextBuff1[3] = 0xFF; - gBattlescriptCurrInstr += 5; - } - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atkEC_pursuit_sth(void) -{ - gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank]) && gActionForBanks[gActiveBank] == 0 && gChosenMovesByBanks[gActiveBank] == MOVE_PURSUIT) - { - gUnknown_02024A76[gActiveBank] = 11; - gCurrentMove = MOVE_PURSUIT; - gBattlescriptCurrInstr += 5; - BATTLE_STRUCT->animTurn = 1; - BATTLE_STRUCT->unk160A7 = gBankAttacker; - gBankAttacker = gActiveBank; - } - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); -} - -static void atkED_802B4B4(void) -{ - gEffectBank = gBankAttacker; - if (gBankAttacker == gBankTarget) - gBankAttacker = gBankTarget = BATTLE_STRUCT->scriptingActive; - else - gBankTarget = BATTLE_STRUCT->scriptingActive; - BATTLE_STRUCT->scriptingActive = gEffectBank; - gBattlescriptCurrInstr++; -} - -static void atkEE_removelightscreenreflect(void) //brick break -{ - u8 side = GetBankSide(gBankAttacker) ^ 1; - if (gSideTimer[side].reflectTimer || gSideTimer[side].lightscreenTimer) - { - gSideAffecting[side] &= ~(SIDE_STATUS_REFLECT); - gSideAffecting[side] &= ~(SIDE_STATUS_LIGHTSCREEN); - gSideTimer[side].reflectTimer = 0; - gSideTimer[side].lightscreenTimer = 0; - BATTLE_STRUCT->animTurn = 1; - BATTLE_STRUCT->animTargetsHit = 1; - } - else - { - BATTLE_STRUCT->animTurn = 0; - BATTLE_STRUCT->animTargetsHit = 0; - } - gBattlescriptCurrInstr++; -} - -void atkEF_pokeball_catch_calculation(void) -{ - u8 ball_multiplier = 0; - if (gBattleExecBuffer) - return; - - gActiveBank = gBankAttacker; - gBankTarget = gBankAttacker ^ 1; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - EmitBallThrowAnim(0, 5); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; - } - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) - { - EmitBallThrowAnim(0, 4); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr = BattleScript_WallyBallThrow; - } - else - { - u32 odds; - u8 catch_rate; - if (gLastUsedItem == ITEM_SAFARI_BALL) - catch_rate = BATTLE_STRUCT->unk16089 * 1275 / 100; //correct the name to safariFleeRate - else - catch_rate = gBaseStats[gBattleMons[gBankTarget].species].catchRate; - if (gLastUsedItem > 5) - { - switch (gLastUsedItem) - { - case ITEM_NET_BALL: - if (gBattleMons[gBankTarget].type1 == TYPE_WATER || gBattleMons[gBankTarget].type2 == TYPE_WATER || gBattleMons[gBankTarget].type1 == TYPE_BUG || gBattleMons[gBankTarget].type2 == TYPE_BUG) - ball_multiplier = 30; - else - ball_multiplier = 10; - break; - case ITEM_DIVE_BALL: - if (sav1_map_get_light_level() == 5) - ball_multiplier = 35; - else - ball_multiplier = 10; - break; - case ITEM_NEST_BALL: - if (gBattleMons[gBankTarget].level <= 39) - { - ball_multiplier = 40 - gBattleMons[gBankTarget].level; - if (ball_multiplier <= 9) - ball_multiplier = 10; - } - else - ball_multiplier = 10; - break; - case ITEM_REPEAT_BALL: - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) - ball_multiplier = 30; - else - ball_multiplier = 10; - break; - case ITEM_TIMER_BALL: - ball_multiplier = gBattleResults.battleTurnCounter + 10; - if (ball_multiplier > 40) - ball_multiplier = 40; - break; - case ITEM_LUXURY_BALL: - case ITEM_PREMIER_BALL: - ball_multiplier = 10; - break; - } - } - else - ball_multiplier = sBallCatchBonuses[gLastUsedItem - 2]; - - odds = (catch_rate * ball_multiplier / 10) * (gBattleMons[gBankTarget].maxHP * 3 - gBattleMons[gBankTarget].hp * 2) / (3 * gBattleMons[gBankTarget].maxHP); - if (gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE)) - odds *= 2; - if (gBattleMons[gBankTarget].status1 & (STATUS_POISON | STATUS_BURN | STATUS_PARALYSIS /*| STATUS_TOXIC_POISON */)) //nice one gf - odds = (odds * 15) / 10; - - if (gLastUsedItem != ITEM_SAFARI_BALL) - { - if (gLastUsedItem == ITEM_MASTER_BALL) - { - gBattleResults.unk5_1 = 1; - } - else - { - if (gBattleResults.unk36[gLastUsedItem - ITEM_ULTRA_BALL] < 0xFF) - gBattleResults.unk36[gLastUsedItem - ITEM_ULTRA_BALL]++; - } - } - if (odds > 254) //poke caught - { - EmitBallThrowAnim(0, 4); - MarkBufferBankForExecution(gActiveBank); - gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - SetMonData(&gEnemyParty[gBattlePartyID[gBankTarget]], MON_DATA_POKEBALL, (const void*) &gLastUsedItem); - if (CalculatePlayerPartyCount() == 6) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else //poke may be caught, calculate shakes - { - u8 shakes; - odds = Sqrt(Sqrt(16711680 / odds)); - odds = 1048560 / odds; - for (shakes = 0; shakes < 4 && Random() < odds; shakes++) {} - if (gLastUsedItem == ITEM_MASTER_BALL) - shakes = 4; //why calculate the shakes before that check? - EmitBallThrowAnim(0, shakes); - MarkBufferBankForExecution(gActiveBank); - if (shakes == 4) //poke caught, copy of the code above - { - gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - SetMonData(&gEnemyParty[gBattlePartyID[gBankTarget]], MON_DATA_POKEBALL, (const void*) &gLastUsedItem); - if (CalculatePlayerPartyCount() == 6) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else //rip - { - gBattleCommunication[MULTISTRING_CHOOSER] = shakes; - gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; - } - } - } -} - -static void atkF0_copy_caught_poke(void) -{ - GiveMonToPlayer(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]]); - gBattleResults.caughtPoke = gBattleMons[gBankAttacker ^ 1].species; - GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, gBattleResults.caughtNick); - gBattlescriptCurrInstr++; -} - -static void atkF1_setpoke_as_caught(void) -{ - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - else - { - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 3); - if (gBattleMons[gBankTarget].species == SPECIES_UNOWN) - gSaveBlock2.pokedex.unownPersonality = gBattleMons[gBankTarget].personality; - if (gBattleMons[gBankTarget].species == SPECIES_SPINDA) //else if - gSaveBlock2.pokedex.spindaPersonality = gBattleMons[gBankTarget].personality; - gBattlescriptCurrInstr += 5; - } -} - -extern const u32 gBattleTerrainTiles_Building[]; -extern const u32 gBattleTerrainTilemap_Building[]; -extern const u32 gBattleTerrainPalette_BattleTower[]; - -static void atkF2_display_dex_info(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gBattleCommunication[0]++; - break; - case 1: - if (!gPaletteFade.active) - { - gBattleCommunication[1] = sub_809070C(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), gBattleMons[gBankTarget].otId, gBattleMons[gBankTarget].personality); - gBattleCommunication[0]++; - } - break; - case 2: - if (!gPaletteFade.active && gMain.callback2 == sub_800F808 && !gTasks[gBattleCommunication[1]].isActive) - { - LZDecompressVram(gBattleTerrainTiles_Building, (void*)(0x06008000)); - LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(0x0600d000)); - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - REG_BG3CNT = 0x5a0b; - gUnknown_030041B0 = 0x100; - BeginNormalPaletteFade(0xfffc, 0, 0x10, 0, 0); - gBattleCommunication[0]++; - } - break; - case 3: - if (!gPaletteFade.active) - gBattlescriptCurrInstr++; - break; - } -} - -__attribute__((naked)) -void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - ldr r4, [sp, 0x20]\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r12, r1\n\ - lsls r2, 24\n\ - lsrs r5, r2, 24\n\ - lsls r3, 24\n\ - lsrs r7, r3, 24\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - mov r8, r4\n\ - mov r2, r12\n\ - cmp r2, r7\n\ - bgt _0802BC5A\n\ - lsls r1, r6, 1\n\ - ldr r0, _0802BC20 @ =0x0600c000\n\ - adds r1, r0\n\ - mov r9, r1\n\ -_0802BC06:\n\ - adds r1, r6, 0\n\ - adds r0, r2, 0x1\n\ - mov r10, r0\n\ - cmp r1, r5\n\ - bgt _0802BC54\n\ - lsls r0, r2, 6\n\ - mov r4, r9\n\ - adds r3, r4, r0\n\ -_0802BC16:\n\ - cmp r2, r12\n\ - bne _0802BC28\n\ - ldr r0, _0802BC24 @ =0x00001022\n\ - b _0802BC36\n\ - .align 2, 0\n\ -_0802BC20: .4byte 0x0600c000\n\ -_0802BC24: .4byte 0x00001022\n\ -_0802BC28:\n\ - cmp r2, r7\n\ - bne _0802BC34\n\ - ldr r0, _0802BC30 @ =0x00001028\n\ - b _0802BC36\n\ - .align 2, 0\n\ -_0802BC30: .4byte 0x00001028\n\ -_0802BC34:\n\ - ldr r0, _0802BC68 @ =0x00001025\n\ -_0802BC36:\n\ - cmp r1, r6\n\ - beq _0802BC42\n\ - adds r0, 0x1\n\ - cmp r1, r5\n\ - bne _0802BC42\n\ - adds r0, 0x1\n\ -_0802BC42:\n\ - mov r4, r8\n\ - cmp r4, 0\n\ - beq _0802BC4A\n\ - movs r0, 0\n\ -_0802BC4A:\n\ - strh r0, [r3]\n\ - adds r3, 0x2\n\ - adds r1, 0x1\n\ - cmp r1, r5\n\ - ble _0802BC16\n\ -_0802BC54:\n\ - mov r2, r10\n\ - cmp r2, r7\n\ - ble _0802BC06\n\ -_0802BC5A:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0802BC68: .4byte 0x00001025\n\ - .syntax divided"); -} - -void sub_802BC6C(void) -{ - sub_814A880(0xC8, ((gBattleCommunication[1] << 28) + 1207959552) >> 24); //what could that be? -} - -void nullsub_6(void) -{ - return; -} - -static void atkF3_nickname_caught_poke(void) -{ - switch (gBattleCommunication[0]) - { - case 0: - sub_8023A80(); - gBattleCommunication[0]++; - gBattleCommunication[1] = 0; - sub_802BC6C(); - break; - case 1: - if (gMain.newKeys & DPAD_UP && gBattleCommunication[1] != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && gBattleCommunication[1] == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - gBattleCommunication[1] = 1; - sub_802BC6C(); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gBattleCommunication[1] == 0) - { - gBattleCommunication[0]++; - BeginFastPaletteFade(3); - } - else - gBattleCommunication[0] = 4; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gBattleCommunication[0] = 4; - } - break; - case 2: - if (!gPaletteFade.active) - { - GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, BATTLE_STRUCT->caughtNick); - DoNamingScreen(2, BATTLE_STRUCT->caughtNick, GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]]), GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_PERSONALITY, 0), sub_800F808); - gBattleCommunication[0]++; - } - break; - case 3: - if (gMain.callback2 == sub_800F808 && !gPaletteFade.active ) - { - SetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, BATTLE_STRUCT->caughtNick); - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - } - break; - case 4: - if (CalculatePlayerPartyCount() == 6) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - break; - } -} - -static void atkF4_802BEF0(void) -{ - gBattleMons[gBankAttacker].hp -= gBattleMoveDamage; - gBattlescriptCurrInstr++; -} - -static void atkF5_removeattackerstatus1(void) -{ - gBattleMons[gBankAttacker].status1 = 0; - gBattlescriptCurrInstr++; -} - -static void atkF6_802BF48(void) -{ - gFightStateTracker = 0xC; -} - -static void atkF7_802BF54(void) -{ - gFightStateTracker = 0xC; - gCurrentMoveTurn = gNoOfAllBanks; -} diff --git a/src/battle_6.c b/src/battle_6.c deleted file mode 100644 index c833aef5e..000000000 --- a/src/battle_6.c +++ /dev/null @@ -1,1507 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_interface.h" -#include "battle_message.h" -#include "data2.h" -#include "menu_cursor.h" -#include "palette.h" -#include "pokemon.h" -#include "rom3.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "util.h" - -//Possibly PokemonSubstruct1 -struct UnknownStruct3 -{ - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -extern u16 gUnknown_030042A4; -extern u16 gUnknown_030042A0; - -extern struct Window gUnknown_03004210; - -extern void (*gBattleBankFunc[])(void); - -extern u8 gActiveBank; -extern u8 gActionSelectionCursor[]; -extern u8 gDisplayedStringBattle[]; -extern u8 gMoveSelectionCursor[]; -extern u8 gBattleBufferA[][0x200]; -extern u8 gBankInMenu; -extern u16 gBattlePartyID[]; -extern u8 gHealthboxIDs[]; -extern u8 gDoingBattleAnim; -extern u8 gObjectBankIDs[]; -extern u16 gBattleTypeFlags; -extern u8 gBattleOutcome; -extern void (*gAnimScriptCallback)(void); -extern bool8 gAnimScriptActive; -extern u16 gMovePowerMoveAnim; -extern u32 gMoveDmgMoveAnim; -extern u8 gHappinessMoveAnim; -extern u16 gWeatherMoveAnim; -extern u32 *gDisableStructMoveAnim; -extern u32 gPID_perBank[]; -extern u8 gBattleMonForms[]; -extern u16 gUnknown_02024DE8; -extern u8 gUnknown_02024E68[]; -extern struct SpriteTemplate gUnknown_02024E8C; -extern u8 gUnknown_0202F7C4; -extern u8 gUnknown_02038470[]; -extern u16 gUnknown_030041B0; -extern u16 gUnknown_030041B4; -extern u16 gUnknown_030041B8; -extern u16 gUnknown_03004280; -extern u16 gUnknown_03004288; -extern u16 gUnknown_030042A4; -extern u16 gUnknown_030042C0; -extern u8 gUnknown_03004344; -extern u8 gUnknown_0300434C[]; - -extern const u8 gUnknown_08400CA8[]; -extern const u8 gUnknown_08400CF3[]; -extern const u8 gUnknown_08400D38[]; - -#if ENGLISH -#define SUB_803037C_TILE_DATA_OFFSET 440 -#elif GERMAN -#define SUB_803037C_TILE_DATA_OFFSET 444 -#endif - -extern void sub_802C68C(void); -extern void sub_802E1B0(void); -extern void sub_802E3B4(); -extern void sub_802E220(); -extern void sub_802E2D4(); -extern void sub_802E004(void); -extern void sub_802DF30(void); -extern void BattleMusicStop(void); -extern void PlayerBufferExecCompleted(void); -extern void bx_t1_healthbar_update(void); -extern void nullsub_91(void); -extern void sub_802D924(u8); -extern void sub_802E434(void); -extern bool8 mplay_80342A4(u8); -extern void move_anim_start_t2_for_situation(); -extern void bx_blink_t1(void); -extern void sub_8047858(); -extern u8 GetBankSide(u8); -extern void sub_80E43C0(); -extern void oamt_add_pos2_onto_pos1(); -extern void sub_8078B34(struct Sprite *); -extern void oamt_set_x3A_32(); -extern void sub_80318FC(); -extern bool8 IsDoubleBattle(void); -extern void sub_802D500(void); -extern void dp11b_obj_free(); -extern bool8 sub_8078874(u8); -extern bool8 move_anim_start_t3(); -extern void sub_802E460(void); -extern void b_link_standby_message(void); -extern void sub_802D18C(void); -extern void sub_802DF18(void); -extern void BufferStringBattle(); -extern void sub_80326EC(); -extern void ExecuteMoveAnim(); -extern void sub_8031F24(void); -extern void sub_80324BC(); -extern u8 sub_8031720(); -extern void bx_wait_t1(void); -extern u8 GetBankByPlayerAI(u8); -extern void sub_802DE10(void); -extern void sub_80105EC(struct Sprite *); -extern void sub_802D274(void); -extern void sub_802D23C(void); -extern u8 GetBankIdentity(u8); -extern void sub_8031AF4(); -extern void sub_80313A0(struct Sprite *); -extern void sub_802D204(void); -extern u8 sub_8079E90(); -extern void sub_802DEAC(void); -extern void sub_80312F0(struct Sprite *); -extern u8 sub_8077ABC(); -extern u8 sub_8077F68(); -extern u8 sub_8046400(); -extern void sub_802D798(void); -extern void bx_0802E404(void); - -u32 dp01_getattr_by_ch1_for_player_pokemon_(u8, u8 *); -void dp01_setattr_by_ch1_for_player_pokemon(u8); -void sub_802F934(u8, u8); -void sub_802FB2C(void); -void sub_8030190(void); -void sub_80304A8(void); -void sub_8030E38(struct Sprite *); -void task05_08033660(u8); -void sub_8031064(void); - -void PlayerHandleGetAttributes(void) -{ - u8 unkData[0x100]; - u32 offset = 0; - u8 r4; - s32 i; - - if (gBattleBufferA[gActiveBank][2] == 0) - { - offset += dp01_getattr_by_ch1_for_player_pokemon_(gBattlePartyID[gActiveBank], unkData); - } - else - { - r4 = gBattleBufferA[gActiveBank][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - offset += dp01_getattr_by_ch1_for_player_pokemon_(i, unkData + offset); - r4 >>= 1; - } - } - dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, offset, unkData); - PlayerBufferExecCompleted(); -} - -// Duplicate of dp01_getattr_by_ch1_for_player_pokemon -u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) -{ - struct BattlePokemon battlePokemon; - struct UnknownStruct3 moveData; - u8 nickname[20]; - u8 *src; - s16 data16; - u32 data32; - s32 size = 0; - - switch (gBattleBufferA[gActiveBank][1]) - { - case 0: - battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); - battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) - { - battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); - battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - } - battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); - battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP); - battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); - battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); - battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); - battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); - battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP); - battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); - battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); - battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD); - battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); - battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); - battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); - battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY); - battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); - GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); - StringCopy10(battlePokemon.nickname, nickname); - GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - src = (u8 *)&battlePokemon; - for (size = 0; size < sizeof(battlePokemon); size++) - buffer[size] = src[size]; - break; - case 1: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 2: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 3: - for (size = 0; size < 4; size++) - { - moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); - moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - } - moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - src = (u8 *)&moveData; - for (size = 0; size < sizeof(moveData); size++) - buffer[size] = src[size]; - break; - case 4: - case 5: - case 6: - case 7: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 8: - for (size = 0; size < 4; size++) - buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - size++; - break; - case 9: - case 10: - case 11: - case 12: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); - size = 1; - break; - case 17: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 18: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 19: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV); - size = 1; - break; - case 20: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV); - size = 1; - break; - case 21: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV); - size = 1; - break; - case 22: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV); - size = 1; - break; - case 23: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV); - size = 1; - break; - case 24: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV); - size = 1; - break; - case 25: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); - size = 1; - break; - case 26: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS); - size = 1; - break; - case 27: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION); - size = 1; - break; - case 28: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL); - size = 1; - break; - case 29: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME); - size = 1; - break; - case 30: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL); - size = 1; - break; - case 31: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); - buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - size = 6; - break; - case 32: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - size = 1; - break; - case 33: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - size = 1; - break; - case 34: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - size = 1; - break; - case 35: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); - size = 1; - break; - case 36: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - size = 1; - break; - case 37: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - size = 1; - break; - case 38: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 39: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 40: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 41: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); - size = 1; - break; - case 42: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 43: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 44: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 45: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 46: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 47: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 48: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 49: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL); - size = 1; - break; - case 50: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY); - size = 1; - break; - case 51: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE); - size = 1; - break; - case 52: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART); - size = 1; - break; - case 53: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH); - size = 1; - break; - case 54: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN); - size = 1; - break; - case 55: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON); - size = 1; - break; - case 56: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON); - size = 1; - break; - case 57: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON); - size = 1; - break; - case 58: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON); - size = 1; - break; - case 59: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON); - size = 1; - break; - } - return size; -} - -void sub_802ECF0(void) -{ - struct BattlePokemon battleMon; // I think this is a BattlePokemon - u8 *src = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; - u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBank][1]; - u8 i; - - for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) - dst[i] = src[i]; - dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, gBattleBufferA[gActiveBank][2], dst); - PlayerBufferExecCompleted(); -} - -void PlayerHandleSetAttributes(void) -{ - u8 r4; - u8 i; - - if (gBattleBufferA[gActiveBank][2] == 0) - { - dp01_setattr_by_ch1_for_player_pokemon(gBattlePartyID[gActiveBank]); - } - else - { - r4 = gBattleBufferA[gActiveBank][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - dp01_setattr_by_ch1_for_player_pokemon(i); - r4 >>= 1; - } - } - PlayerBufferExecCompleted(); -} - -// Duplicate of sub_811EC68 -void dp01_setattr_by_ch1_for_player_pokemon(u8 a) -{ - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; - struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; - s32 i; - - switch (gBattleBufferA[gActiveBank][1]) - { - case 0: - { - u8 iv; - - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); - } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); - SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); - iv = battlePokemon->hpIV; - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); - iv = battlePokemon->attackIV; - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); - iv = battlePokemon->defenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); - iv = battlePokemon->speedIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); - iv = battlePokemon->spAttackIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); - iv = battlePokemon->spDefenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); - SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); - SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); - SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); - SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); - } - break; - case 1: - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); - break; - case 2: - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); - break; - case 3: - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); - } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); - break; - case 4: - case 5: - case 6: - case 7: - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); - break; - case 8: - SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); - SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); - SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); - break; - case 9: - case 10: - case 11: - case 12: - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); - break; - case 17: - SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); - break; - case 18: - SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); - break; - case 19: - SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 20: - SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 21: - SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 22: - SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 23: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 24: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 25: - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); - break; - case 26: - SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); - break; - case 27: - SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); - break; - case 28: - SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); - break; - case 29: - SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); - break; - case 30: - SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); - break; - case 31: - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); - break; - case 32: - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 33: - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 34: - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 35: - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 36: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 37: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 38: - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); - break; - case 39: - SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); - break; - case 40: - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); - break; - case 41: - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); - break; - case 42: - SetMonData(&gPlayerParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); - break; - case 43: - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); - break; - case 44: - SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); - break; - case 45: - SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); - break; - case 46: - SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); - break; - case 47: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); - break; - case 48: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); - break; - case 49: - SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); - break; - case 50: - SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); - break; - case 51: - SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); - break; - case 52: - SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); - break; - case 53: - SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); - break; - case 54: - SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); - break; - case 55: - SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 56: - SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 57: - SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 58: - SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 59: - SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - } - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); -} - -void sub_802F7CC(void) -{ - u8 *dst = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; - u8 i; - - for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) - dst[i] = gBattleBufferA[gActiveBank][3 + i]; - PlayerBufferExecCompleted(); -} - -void PlayerHandleLoadPokeSprite(void) -{ - sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - gBattleBankFunc[gActiveBank] = bx_0802E404; -} - -void PlayerHandleSendOutPoke(void) -{ - sub_8032AA8(gActiveBank, gBattleBufferA[gActiveBank][2]); - gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1]; - sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - gActionSelectionCursor[gActiveBank] = 0; - gMoveSelectionCursor[gActiveBank] = 0; - sub_802F934(gActiveBank, gBattleBufferA[gActiveBank][2]); - gBattleBankFunc[gActiveBank] = sub_802D798; -} - -void sub_802F934(u8 bank, u8 b) -{ - u16 species; - - sub_8032AA8(bank, b); - gBattlePartyID[bank] = gBattleBufferA[bank][1]; - species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); - gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0); - GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank)); - gObjectBankIDs[bank] = CreateSprite( - &gUnknown_02024E8C, - sub_8077ABC(bank, 2), - sub_8077F68(bank), - sub_8079E90(bank)); - gSprites[gUnknown_0300434C[bank]].data1 = gObjectBankIDs[bank]; - gSprites[gObjectBankIDs[bank]].data0 = bank; - gSprites[gObjectBankIDs[bank]].data2 = species; - gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; - StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); - gSprites[gObjectBankIDs[bank]].invisible = TRUE; - gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; - gSprites[gUnknown_0300434C[bank]].data0 = sub_8046400(0, 0xFF); -} - -void PlayerHandleReturnPokeToBall(void) -{ - if (gBattleBufferA[gActiveBank][1] == 0) - { - ewram17810[gActiveBank].unk4 = 0; - gBattleBankFunc[gActiveBank] = sub_802FB2C; - } - else - { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); - sub_8043DB0(gHealthboxIDs[gActiveBank]); - PlayerBufferExecCompleted(); - } -} - -void sub_802FB2C(void) -{ - switch (ewram17810[gActiveBank].unk4) - { - case 0: - if (ewram17800[gActiveBank].unk0_2) - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - ewram17810[gActiveBank].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBank].unk0_6) - { - ewram17810[gActiveBank].unk4 = 0; - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 1); - gBattleBankFunc[gActiveBank] = sub_802DEAC; - } - } -} - -void PlayerHandleTrainerThrow(void) -{ - s16 r7; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (GetBankIdentity(gActiveBank) & 2) - r7 = 16; - else - r7 = -16; - } - else - { - r7 = 0; - } - sub_8031AF4(gSaveBlock2.playerGender, gActiveBank); - GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( - &gUnknown_02024E8C, - r7 + 80, - (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, - sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; - gSprites[gObjectBankIDs[gActiveBank]].data0 = -2; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; - gBattleBankFunc[gActiveBank] = sub_802D204; -} - -void PlayerHandleTrainerSlide(void) -{ - sub_8031AF4(gSaveBlock2.playerGender, gActiveBank); - GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( - &gUnknown_02024E8C, - 80, - (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, - 30); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96; - gSprites[gObjectBankIDs[gActiveBank]].data0 = 2; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; - gBattleBankFunc[gActiveBank] = sub_802D23C; -} - -void PlayerHandleTrainerSlideBack(void) -{ - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; - gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; - gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); - gBattleBankFunc[gActiveBank] = sub_802D274; -} - -void sub_802FE7C(void) -{ - if (ewram17810[gActiveBank].unk4 == 0) - { - if (ewram17800[gActiveBank].unk0_2) - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - ewram17810[gActiveBank].unk4++; - } - else - { - if (ewram17810[gActiveBank].unk0_6 == 0) - { - ewram17810[gActiveBank].unk4 = 0; - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - PlaySE12WithPanning(SE_POKE_DEAD, -64); - gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; - gSprites[gObjectBankIDs[gActiveBank]].data2 = 5; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80105EC; - gBattleBankFunc[gActiveBank] = sub_802DE10; - } - } -} - -void sub_802FF60(void) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0); - PlayerBufferExecCompleted(); -} - -void sub_802FF80(void) -{ - ewram17840.unk8 = 4; - gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3); - gBattleBankFunc[gActiveBank] = bx_wait_t1; -} - -void PlayerHandleBallThrow(void) -{ - u8 var = gBattleBufferA[gActiveBank][1]; - - ewram17840.unk8 = var; - gDoingBattleAnim = 1; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3); - gBattleBankFunc[gActiveBank] = bx_wait_t1; -} - -void PlayerHandlePuase(void) -{ - u8 var = gBattleBufferA[gActiveBank][1]; - - // WTF is this?? - while (var != 0) - var--; - - PlayerBufferExecCompleted(); -} - -void PlayerHandleMoveAnimation(void) -{ - if (!mplay_80342A4(gActiveBank)) - { - u16 r0 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); - - gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; - gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8); - gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24); - gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8); - gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; - gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; - if (sub_8031720(r0, gUnknown_0202F7C4) != 0) - { - // Dead code. sub_8031720 always returns 0. - PlayerBufferExecCompleted(); - } - else - { - ewram17810[gActiveBank].unk4 = 0; - gBattleBankFunc[gActiveBank] = sub_8030190; - } - } -} - -void sub_8030190(void) -{ - u16 r4 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); - u8 r7 = gBattleBufferA[gActiveBank][11]; - - switch (ewram17810[gActiveBank].unk4) - { - case 0: - if (ewram17800[gActiveBank].unk0_2 == 1 && ewram17800[gActiveBank].unk0_3 == 0) - { - ewram17800[gActiveBank].unk0_3 = 1; - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - } - ewram17810[gActiveBank].unk4 = 1; - break; - case 1: - if (ewram17810[gActiveBank].unk0_6 == 0) - { - sub_80326EC(0); - ExecuteMoveAnim(r4); - ewram17810[gActiveBank].unk4 = 2; - } - break; - case 2: - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - sub_80326EC(1); - if (ewram17800[gActiveBank].unk0_2 == 1 && r7 < 2) - { - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); - ewram17800[gActiveBank].unk0_3 = 0; - } - ewram17810[gActiveBank].unk4 = 3; - } - break; - case 3: - if (ewram17810[gActiveBank].unk0_6 == 0) - { - sub_8031F24(); - sub_80324BC(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); - ewram17810[gActiveBank].unk4 = 0; - PlayerBufferExecCompleted(); - } - break; - } -} - -void PlayerHandlePrintString(void) -{ - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; - BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); - gBattleBankFunc[gActiveBank] = sub_802DF18; -} - -void PlayerHandlePrintStringPlayerOnly(void) -{ - if (GetBankSide(gActiveBank) == 0) - PlayerHandlePrintString(); - else - PlayerBufferExecCompleted(); -} - -void sub_803037C(void) -{ - int r4; - - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 160; - FillWindowRect(&gUnknown_03004210, 10, 2, 15, 27, 18); - FillWindowRect(&gUnknown_03004210, 10, 2, 35, 16, 38); - - gBattleBankFunc[gActiveBank] = sub_802C098; - - InitWindow(&gUnknown_03004210, gUnknown_08400CF3, 400, 18, 35); - sub_8002F44(&gUnknown_03004210); - sub_814A5C0(0, 0xFFFF, 12, 11679, 0); - - for (r4 = 0; r4 < 4; r4++) - nullsub_8(r4); - - sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); - - StrCpyDecodeToDisplayedStringBattle((u8 *) gUnknown_08400CA8); - InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_803037C_TILE_DATA_OFFSET, 2, 35); - sub_8002F44(&gUnknown_03004210); -} - -void nullsub_42() -{ -} - -void sub_8030468(void) -{ - sub_814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); - sub_80304A8(); - gBattleBankFunc[gActiveBank] = sub_802C68C; -} - -void sub_80304A8(void) -{ - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 320; - sub_802E1B0(); - gUnknown_03004344 = 0xFF; - sub_802E3B4(gMoveSelectionCursor[gActiveBank], 0); - if (gBattleBufferA[gActiveBank][2] != 1) - { - InitWindow(&gUnknown_03004210, gUnknown_08400D38, 656, 23, 55); - sub_8002F44(&gUnknown_03004210); - } - sub_802E220(); - sub_802E2D4(); -} - -void PlayerHandleOpenBag(void) -{ - s32 i; - - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gBattleBankFunc[gActiveBank] = sub_802E004; - gBankInMenu = gActiveBank; - for (i = 0; i < 3; i++) - gUnknown_02038470[i] = gBattleBufferA[gActiveBank][1 + i]; -} - -void sub_8030594(void) -{ - s32 i; - - gUnknown_0300434C[gActiveBank] = CreateTask(TaskDummy, 0xFF); - gTasks[gUnknown_0300434C[gActiveBank]].data[0] = gBattleBufferA[gActiveBank][1] & 0xF; - ewram[0x16054] = gBattleBufferA[gActiveBank][1] >> 4; - ewram[0x1609D] = gBattleBufferA[gActiveBank][2]; - ewram[0x160C0] = gBattleBufferA[gActiveBank][3]; - for (i = 0; i < 3; i++) - gUnknown_02038470[i] = gBattleBufferA[gActiveBank][4 + i]; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gBattleBankFunc[gActiveBank] = sub_802DF30; - gBankInMenu = gActiveBank; -} - -void sub_8030674(void) -{ - BattleMusicStop(); - BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0); - PlayerBufferExecCompleted(); -} - -void PlayerHandleHealthBarUpdate(void) -{ - s16 r7; - - load_gfxc_health_bar(0); - r7 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (r7 != 0x7FFF) - { - u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); - u32 curHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); - - sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, curHP, r7); - } - else - { - u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); - - sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); - sub_80440EC(gHealthboxIDs[gActiveBank], 0, 0); - } - gBattleBankFunc[gActiveBank] = bx_t1_healthbar_update; -} - -void PlayerHandleExpBarUpdate(void) -{ - u8 r7 = gBattleBufferA[gActiveBank][1]; - - if (GetMonData(&gPlayerParty[r7], MON_DATA_LEVEL) >= 100) - { - PlayerBufferExecCompleted(); - } - else - { - u16 r4; - u8 taskId; - - load_gfxc_health_bar(1); - GetMonData(&gPlayerParty[r7], MON_DATA_SPECIES); // unused return value - r4 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - taskId = CreateTask(sub_802D924, 10); - gTasks[taskId].data[0] = r7; - gTasks[taskId].data[1] = r4; - gTasks[taskId].data[2] = gActiveBank; - gBattleBankFunc[gActiveBank] = nullsub_91; - } -} - -void PlayerHandleStatusIconUpdate(void) -{ - if (!mplay_80342A4(gActiveBank)) - { - sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 9); - ewram17810[gActiveBank].unk0_4 = 0; - gBattleBankFunc[gActiveBank] = sub_802E434; - } -} - -void PlayerHandleStatusAnimation(void) -{ - if (!mplay_80342A4(gActiveBank)) - { - move_anim_start_t2_for_situation( - gBattleBufferA[gActiveBank][1], - gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24)); - gBattleBankFunc[gActiveBank] = sub_802E434; - } -} - -void PlayerHandleStatusXor(void) -{ - u8 val = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_STATUS) ^ gBattleBufferA[gActiveBank][1]; - - SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_STATUS, &val); - PlayerBufferExecCompleted(); -} - -void sub_803097C(void) -{ - PlayerBufferExecCompleted(); -} - -void PlayerHandleDMATransfer(void) -{ - u32 val1 = gBattleBufferA[gActiveBank][1] - | (gBattleBufferA[gActiveBank][2] << 8) - | (gBattleBufferA[gActiveBank][3] << 16) - | (gBattleBufferA[gActiveBank][4] << 24); - u16 val2 = gBattleBufferA[gActiveBank][5] | (gBattleBufferA[gActiveBank][6] << 8); - - const u8 *src = &gBattleBufferA[gActiveBank][7]; - u8 *dst = (u8 *)val1; - u32 size = val2; - - while (1) - { - if (size <= 0x1000) - { - DmaCopy16(3, src, dst, size); - break; - } - DmaCopy16(3, src, dst, 0x1000); - src += 0x1000; - dst += 0x1000; - size -= 0x1000; - } - PlayerBufferExecCompleted(); -} - -void sub_8030A3C(void) -{ - PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); - PlayerBufferExecCompleted(); -} - -void sub_8030A6C(void) -{ - PlayerBufferExecCompleted(); -} - -void sub_8030A78(void) -{ - dp01_build_cmdbuf_x21_a_bb(1, 0, 0); - PlayerBufferExecCompleted(); -} - -void sub_8030A8C(void) -{ - dp01_build_cmdbuf_x22_a_three_bytes(1, 0, 0); - PlayerBufferExecCompleted(); -} - -void sub_8030AA0(void) -{ - dp01_build_cmdbuf_x23_aa_0(1, 0); - PlayerBufferExecCompleted(); -} - -void sub_8030AB4(void) -{ - dp01_build_cmdbuf_x24_aa_0(1, 0); - PlayerBufferExecCompleted(); -} - -void sub_8030AC8(void) -{ - gUnknown_020238C8.unk0_0 = 0; - PlayerBufferExecCompleted(); -} - -void sub_8030AE4(void) -{ - gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBank][1]; - PlayerBufferExecCompleted(); -} - -void sub_8030B1C(void) -{ - gUnknown_020238C8.unk0_7 = 0; - PlayerBufferExecCompleted(); -} - -void sub_8030B34(void) -{ - gUnknown_020238C8.unk0_7 ^= 1; - PlayerBufferExecCompleted(); -} - -void PlayerHandleHitAnimation(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) - { - PlayerBufferExecCompleted(); - } - else - { - gDoingBattleAnim = 1; - gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; - sub_8047858(gActiveBank); - gBattleBankFunc[gActiveBank] = bx_blink_t1; - } -} - -void sub_8030BCC(void) -{ - PlayerBufferExecCompleted(); -} - -void PlayerHandleEffectivenessSound(void) -{ - s8 pan; - - if (GetBankSide(gActiveBank) == 0) - pan = -64; - else - pan = 63; - PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan); - PlayerBufferExecCompleted(); -} - -void sub_8030C1C(void) -{ - PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); - PlayerBufferExecCompleted(); -} - -void PlayerHandleFaintingCry(void) -{ - u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES); - - PlayCry3(species, -25, 5); - PlayerBufferExecCompleted(); -} - -void PlayerHandleIntroSlide(void) -{ - sub_80E43C0(gBattleBufferA[gActiveBank][1]); - gUnknown_02024DE8 |= 1; - PlayerBufferExecCompleted(); -} - -void PlayerHandleTrainerBallThrow(void) -{ - u8 paletteNum; - u8 taskId; - - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; - gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; - gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); - paletteNum = AllocSpritePalette(0xD6F8); - LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2.playerGender].data, 0x100 + paletteNum * 16, 32); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = paletteNum; - taskId = CreateTask(task05_08033660, 5); - gTasks[taskId].data[0] = gActiveBank; - if (ewram17810[gActiveBank].unk0_0) - gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; - ewram17810[4].unk9 |= 1; - gBattleBankFunc[gActiveBank] = nullsub_91; -} - -void sub_8030E38(struct Sprite *sprite) -{ - u8 r4 = sprite->data5; - - FreeSpriteOamMatrix(sprite); - FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); - DestroySprite(sprite); - sub_80318FC(&gPlayerParty[gBattlePartyID[r4]], r4); - StartSpriteAnim(&gSprites[gObjectBankIDs[r4]], 0); -} - -void task05_08033660(u8 taskId) -{ - if (gTasks[taskId].data[1] < 31) - { - gTasks[taskId].data[1]++; - } - else - { - u8 savedActiveBank = gActiveBank; - - gActiveBank = gTasks[taskId].data[0]; - if (!IsDoubleBattle() || (gBattleTypeFlags & 0x40)) - { - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_802F934(gActiveBank, 0); - } - else - { - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_802F934(gActiveBank, 0); - gActiveBank ^= 2; - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - sub_802F934(gActiveBank, 0); - gActiveBank ^= 2; - } - gBattleBankFunc[gActiveBank] = sub_802D500; - gActiveBank = savedActiveBank; - DestroyTask(taskId); - } -} - -void sub_8030FAC(void) -{ - if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) - { - PlayerBufferExecCompleted(); - } - else - { - ewram17810[gActiveBank].unk0_0 = 1; - gUnknown_02024E68[gActiveBank] = sub_8044804(gActiveBank, (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]); - ewram17810[gActiveBank].unk5 = 0; - if (gBattleBufferA[gActiveBank][2] != 0) - ewram17810[gActiveBank].unk5 = 0x5D; - gBattleBankFunc[gActiveBank] = sub_8031064; - } -} - -void sub_8031064(void) -{ - if (ewram17810[gActiveBank].unk5++ > 0x5C) - { - ewram17810[gActiveBank].unk5 = 0; - PlayerBufferExecCompleted(); - } -} - -void sub_80310A4(void) -{ - if (ewram17810[gActiveBank].unk0_0) - gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; - PlayerBufferExecCompleted(); -} - -void sub_80310F0(void) -{ - dp11b_obj_free(gActiveBank, 1); - dp11b_obj_free(gActiveBank, 0); - PlayerBufferExecCompleted(); -} - -void PlayerHandleSpriteInvisibility(void) -{ - if (sub_8078874(gActiveBank)) - { - gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; - sub_8031F88(gActiveBank); - } - PlayerBufferExecCompleted(); -} - -void PlayerHandleBattleAnimation(void) -{ - if (!mplay_80342A4(gActiveBank)) - { - u8 val2 = gBattleBufferA[gActiveBank][1]; - u16 val = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - - if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, val2, val)) - PlayerBufferExecCompleted(); - else - gBattleBankFunc[gActiveBank] = sub_802E460; - } -} - -void PlayerHandleLinkStandbyMsg(void) -{ - switch (gBattleBufferA[gActiveBank][1]) - { - case 0: - b_link_standby_message(); - // fall through - case 1: - dp11b_obj_free(gActiveBank, 1); - dp11b_obj_free(gActiveBank, 0); - break; - case 2: - b_link_standby_message(); - break; - } - PlayerBufferExecCompleted(); -} - -void PlayerHandleResetActionMoveSelection(void) -{ - switch (gBattleBufferA[gActiveBank][1]) - { - case 0: - gActionSelectionCursor[gActiveBank] = 0; - gMoveSelectionCursor[gActiveBank] = 0; - break; - case 1: - gActionSelectionCursor[gActiveBank] = 0; - break; - case 2: - gMoveSelectionCursor[gActiveBank] = 0; - break; - } - PlayerBufferExecCompleted(); -} - -void sub_80312A0(void) -{ - gBattleOutcome = gBattleBufferA[gActiveBank][1]; - FadeOutMapMusic(5); - BeginFastPaletteFade(3); - PlayerBufferExecCompleted(); - gBattleBankFunc[gActiveBank] = sub_802D18C; -} - -void nullsub_43(void) -{ -} diff --git a/src/battle_7.c b/src/battle_7.c deleted file mode 100644 index f2838467e..000000000 --- a/src/battle_7.c +++ /dev/null @@ -1,1235 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_anim.h" -#include "battle_interface.h" -#include "blend_palette.h" -#include "data2.h" -#include "decompress.h" -#include "main.h" -#include "m4a.h" -#include "palette.h" -#include "pokemon.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "songs.h" -#include "sound.h" -#include "species.h" -#include "sprite.h" -#include "task.h" -#include "text.h" -#include "gba/m4a_internal.h" - -struct Struct2019348 -{ - u8 filler0[2]; - u16 unk2; - u8 filler4[4]; - u32 unk8; - u32 unkC; - u32 unk10; -}; - -extern u8 gBattleBufferA[][0x200]; -extern u8 gActiveBank; -extern u32 gBattleExecBuffer; -extern u8 gNoOfAllBanks; -extern u16 gBattlePartyID[]; -extern u8 gBanksBySide[]; -extern u8 gObjectBankIDs[]; -extern u16 gUnknown_02024DE8; -extern u8 gDoingBattleAnim; -extern u32 gPID_perBank[]; -extern struct Window gUnknown_03004210; -extern void (*gBattleBankFunc[])(void); -extern u8 gHealthboxIDs[]; -extern u8 gUnknown_0300434C[]; -extern struct MusicPlayerInfo gMPlay_SE1; -extern struct MusicPlayerInfo gMPlay_SE2; -extern struct MusicPlayerInfo gMPlay_BGM; -extern u32 gBitTable[]; -extern u16 gBattleTypeFlags; -extern u8 gBattleMonForms[]; -extern u8 gBattleAnimPlayerMonIndex; -extern u8 gBattleAnimEnemyMonIndex; -extern void (*gAnimScriptCallback)(void); -extern u8 gAnimScriptActive; -extern const u8 *const gBattleAnims_Unknown1[]; -extern const u8 *const gBattleAnims_Unknown2[]; -extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; -extern const struct MonCoords gTrainerFrontPicCoords[]; -extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; -extern const u8 gSubstituteDollTilemap[]; -extern const u8 gSubstituteDollGfx[]; -extern const u8 gSubstituteDollPal[]; -extern const struct CompressedSpriteSheet gUnknown_081FAF24; -extern const struct SpriteTemplate gSpriteTemplate_81FAF34; -extern void (*const gOpponentBufferCommands[])(void); -extern const struct CompressedSpriteSheet gUnknown_0820A47C; -extern const struct CompressedSpriteSheet gUnknown_0820A484; -extern const struct CompressedSpriteSheet gUnknown_0820A48C[]; -extern const struct CompressedSpriteSheet gUnknown_0820A49C[]; -extern const struct CompressedSpriteSheet gUnknown_0820A4AC; -extern const struct CompressedSpriteSheet gUnknown_0820A4B4[]; -extern const struct SpritePalette gUnknown_0820A4D4[]; -extern const u8 gUnknown_08D09C48[]; - -#define ewram19348 (*(struct Struct2019348 *)(ewram + 0x19348)) - -extern void c3_0802FDF4(u8); -extern void sub_80440EC(); -extern void sub_804777C(); -extern void sub_8141828(); -extern u8 sub_8077ABC(); -extern u8 sub_8078874(u8); -extern u8 sub_8077F68(u8); -extern u8 sub_8077F7C(u8); -extern void sub_8094958(void); -extern void sub_80105DC(struct Sprite *); -extern void move_anim_start_t2(); - -void sub_80315E8(u8); -u8 sub_803163C(u8); -void sub_80316CC(u8); -void sub_8031F0C(void); -void refresh_graphics_maybe(u8, u8, u8); -void sub_80324E0(u8 a); -void sub_80327CC(void); -void sub_8032978(struct Sprite *); -void sub_80328A4(struct Sprite *); -void OpponentBufferRunCommand(void); -void sub_80332D0(void); -void OpponentBufferExecCompleted(void); - -void sub_80312F0(struct Sprite *sprite) -{ - u8 spriteId = sprite->data1; - - if (gSprites[spriteId].affineAnimEnded && !gSprites[spriteId].invisible) - { - if (gSprites[spriteId].animPaused) - gSprites[spriteId].animPaused = FALSE; - else if (gSprites[spriteId].animEnded) - { - gSprites[spriteId].callback = sub_80105DC; - StartSpriteAffineAnim(&gSprites[spriteId], 0); - sprite->callback = SpriteCallbackDummy; - } - } -} - -void unref_sub_8031364(struct Sprite *sprite, bool8 stupid) -{ - sprite->animPaused = TRUE; - sprite->callback = SpriteCallbackDummy; - if (!stupid) - StartSpriteAffineAnim(sprite, 1); - else - StartSpriteAffineAnim(sprite, 1); - AnimateSprite(sprite); -} - -void sub_80313A0(struct Sprite *sprite) -{ - if (!(gUnknown_02024DE8 & 1)) - { - sprite->pos2.x += sprite->data0; - if (sprite->pos2.x == 0) - sprite->callback = SpriteCallbackDummy; - } -} - -void move_anim_start_t2_for_situation(u8 a, u32 b) -{ - ewram17810[gActiveBank].unk0_4 = 1; - if (a == 0) - { - if (b == 0x20) - move_anim_start_t2(gActiveBank, 6); - else if (b == 8 || (b & 0x80)) - move_anim_start_t2(gActiveBank, 0); - else if (b == 0x10) - move_anim_start_t2(gActiveBank, 2); - else if (b & 7) - move_anim_start_t2(gActiveBank, 4); - else if (b == 0x40) - move_anim_start_t2(gActiveBank, 5); - else - ewram17810[gActiveBank].unk0_4 = 0; - } - else - { - if (b & 0x000F0000) - move_anim_start_t2(gActiveBank, 3); - else if (b & 7) - move_anim_start_t2(gActiveBank, 1); - else if (b & 0x10000000) - move_anim_start_t2(gActiveBank, 7); - else if (b & 0x08000000) - move_anim_start_t2(gActiveBank, 8); - else if (b & 0x0000E000) - move_anim_start_t2(gActiveBank, 9); - else - ewram17810[gActiveBank].unk0_4 = 0; - } -} - -bool8 move_anim_start_t3(u8 a, u8 b, u8 c, u8 d, u16 e) -{ - u8 taskId; - - if (d == 0 && (e & 0x80)) - { - gBattleMonForms[a] = e & 0x7F; - return TRUE; - } - if (ewram17800[a].unk0_2 && sub_803163C(d) == 0) - return TRUE; - if (ewram17800[a].unk0_2 && d == 2 && gSprites[gObjectBankIDs[a]].invisible) - { - refresh_graphics_maybe(a, 1, gObjectBankIDs[a]); - sub_80324E0(a); - return TRUE; - } - gBattleAnimPlayerMonIndex = b; - gBattleAnimEnemyMonIndex = c; - ewram17840.unk0 = e; - DoMoveAnim(gBattleAnims_Unknown1, d, 0); - taskId = CreateTask(sub_80315E8, 10); - gTasks[taskId].data[0] = a; - ewram17810[gTasks[taskId].data[0]].unk0_5 = 1; - return FALSE; -} - -void sub_80315E8(u8 taskId) -{ - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - ewram17810[gTasks[taskId].data[0]].unk0_5 = 0; - DestroyTask(taskId); - } -} - -u8 sub_803163C(u8 a) -{ - switch (a) - { - case 2: - case 10: - case 11: - case 12: - case 13: - case 17: - return 1; - default: - return 0; - } -} - -void move_anim_start_t4(u8 a, u8 b, u8 c, u8 d) -{ - u8 taskId; - - gBattleAnimPlayerMonIndex = b; - gBattleAnimEnemyMonIndex = c; - DoMoveAnim(gBattleAnims_Unknown2, d, 0); - taskId = CreateTask(sub_80316CC, 10); - gTasks[taskId].data[0] = a; - ewram17810[gTasks[taskId].data[0]].unk0_6 = 1; -} - -void sub_80316CC(u8 taskId) -{ - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - ewram17810[gTasks[taskId].data[0]].unk0_6 = 0; - DestroyTask(taskId); - } -} - -u8 sub_8031720(int unused1, int unused2) -{ - return 0; -} - -bool8 mplay_80342A4(u8 a) -{ - u8 zero = 0; - - if (IsSEPlaying()) - { - ewram17810[a].unk8++; - if (ewram17810[gActiveBank].unk8 < 30) - return TRUE; - m4aMPlayStop(&gMPlay_SE1); - m4aMPlayStop(&gMPlay_SE2); - } - if (zero == 0) - { - ewram17810[a].unk8 = 0; - return FALSE; - } - return TRUE; -} - -void sub_8031794(struct Pokemon *pkmn, u8 b) -{ - u32 personalityValue; - u16 species; - u32 r7; - u32 otId; - u8 var; - u16 paletteOffset; - const u8 *lzPaletteData; - - personalityValue = GetMonData(pkmn, MON_DATA_PERSONALITY); - if (ewram17800[b].unk2 == 0) - { - species = GetMonData(pkmn, MON_DATA_SPECIES); - r7 = personalityValue; - } - else - { - species = ewram17800[b].unk2; - r7 = gPID_perBank[b]; - } - otId = GetMonData(pkmn, MON_DATA_OT_ID); - var = GetBankIdentity(b); - HandleLoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, - gMonFrontPicCoords[species].y_offset, - 0x02000000, - gUnknown_081FAF4C[var], - species, - r7); - paletteOffset = 0x100 + b * 16; - if (ewram17800[b].unk2 == 0) - lzPaletteData = pokemon_get_pal(pkmn); - else - lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue); - sub_800D238(lzPaletteData, ewram); - LoadPalette(ewram, paletteOffset, 0x20); - LoadPalette(ewram, 0x80 + b * 16, 0x20); - if (species == SPECIES_CASTFORM) - { - paletteOffset = 0x100 + b * 16; - sub_800D238(lzPaletteData, ewram + 0x16400); - LoadPalette(ewram + 0x16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20); - } - if (ewram17800[b].unk2 != 0) - { - BlendPalette(paletteOffset, 16, 6, 0x7FFF); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); - } -} - -void sub_80318FC(struct Pokemon *pkmn, u8 b) -{ - u32 personalityValue; - u16 species; - u32 r7; - u32 otId; - u8 var; - u16 paletteOffset; - const u8 *lzPaletteData; - - personalityValue = GetMonData(pkmn, MON_DATA_PERSONALITY); - if (ewram17800[b].unk2 == 0) - { - species = GetMonData(pkmn, MON_DATA_SPECIES); - r7 = personalityValue; - } - else - { - species = ewram17800[b].unk2; - r7 = gPID_perBank[b]; - } - otId = GetMonData(pkmn, MON_DATA_OT_ID); - var = GetBankIdentity(b); - HandleLoadSpecialPokePic( - &gMonBackPicTable[species], - gMonBackPicCoords[species].coords, - gMonBackPicCoords[species].y_offset, - 0x02000000, - gUnknown_081FAF4C[var], - species, - r7); - paletteOffset = 0x100 + b * 16; - if (ewram17800[b].unk2 == 0) - lzPaletteData = pokemon_get_pal(pkmn); - else - lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue); - sub_800D238(lzPaletteData, ewram); - LoadPalette(ewram, paletteOffset, 0x20); - LoadPalette(ewram, 0x80 + b * 16, 0x20); - if (species == SPECIES_CASTFORM) - { - paletteOffset = 0x100 + b * 16; - sub_800D238(lzPaletteData, ewram + 0x16400); - LoadPalette(ewram + 0x16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20); - } - if (ewram17800[b].unk2 != 0) - { - BlendPalette(paletteOffset, 16, 6, 0x7FFF); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); - } -} - -void unref_sub_8031A64(void) -{ -} - -void nullsub_9(u16 unused) -{ -} - -void sub_8031A6C(u16 a, u8 b) -{ - u8 status; - struct CompressedSpriteSheet spriteSheet; - - status = GetBankIdentity(b); - DecompressPicFromTable_2( - &gTrainerFrontPicTable[a], - gTrainerFrontPicCoords[a].coords, - gTrainerFrontPicCoords[a].y_offset, - (void *)0x02000000, - gUnknown_081FAF4C[status], - 0); - spriteSheet.data = gUnknown_081FAF4C[status]; - spriteSheet.size = gTrainerFrontPicTable[a].size; - spriteSheet.tag = gTrainerFrontPicTable[a].tag; - LoadCompressedObjectPic(&spriteSheet); - LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[a]); -} - -void sub_8031AF4(u16 a, u8 b) -{ - u8 status; - - status = GetBankIdentity(b); - DecompressPicFromTable_2( - &gTrainerBackPicTable[a], - gTrainerBackPicCoords[a].coords, - gTrainerBackPicCoords[a].y_offset, - (void *)0x02000000, - gUnknown_081FAF4C[status], - 0); - LoadCompressedPalette(gTrainerBackPicPaletteTable[a].data, 0x100 + b * 16, 32); -} - -void nullsub_10(int unused) -{ -} - -void sub_8031B74(u16 a) -{ - FreeSpritePaletteByTag(gTrainerFrontPicPaletteTable[a].tag); - FreeSpriteTilesByTag(gTrainerFrontPicTable[a].tag); -} - -void unref_sub_8031BA0(void) -{ - u8 count; - u8 i; - - LoadSpritePalette(&gUnknown_0820A4D4[0]); - LoadSpritePalette(&gUnknown_0820A4D4[1]); - if (!IsDoubleBattle()) - { - LoadCompressedObjectPic(&gUnknown_0820A47C); - LoadCompressedObjectPic(&gUnknown_0820A484); - count = 2; - } - else - { - LoadCompressedObjectPic(&gUnknown_0820A48C[0]); - LoadCompressedObjectPic(&gUnknown_0820A48C[1]); - LoadCompressedObjectPic(&gUnknown_0820A49C[0]); - LoadCompressedObjectPic(&gUnknown_0820A49C[1]); - count = 4; - } - for (i = 0; i < count; i++) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[i]]); -} - -bool8 sub_8031C30(u8 a) -{ - bool8 retVal = FALSE; - - if (a != 0) - { - if (a == 1) - { - LoadSpritePalette(&gUnknown_0820A4D4[0]); - LoadSpritePalette(&gUnknown_0820A4D4[1]); - } - else if (!IsDoubleBattle()) - { - if (a == 2) - { - if (gBattleTypeFlags & 0x80) - LoadCompressedObjectPic(&gUnknown_0820A4AC); - else - LoadCompressedObjectPic(&gUnknown_0820A47C); - } - else if (a == 3) - LoadCompressedObjectPic(&gUnknown_0820A484); - else if (a == 4) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[0]]); - else if (a == 5) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[1]]); - else - retVal = TRUE; - } - else - { - if (a == 2) - LoadCompressedObjectPic(&gUnknown_0820A48C[0]); - else if (a == 3) - LoadCompressedObjectPic(&gUnknown_0820A48C[1]); - else if (a == 4) - LoadCompressedObjectPic(&gUnknown_0820A49C[0]); - else if (a == 5) - LoadCompressedObjectPic(&gUnknown_0820A49C[1]); - else if (a == 6) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[0]]); - else if (a == 7) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[1]]); - else if (a == 8) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[2]]); - else if (a == 9) - LoadCompressedObjectPic(&gUnknown_0820A4B4[gBanksBySide[3]]); - else - retVal = TRUE; - } - } - return retVal; -} - -void load_gfxc_health_bar(void) -{ - sub_800D238(gUnknown_08D09C48, (void *)0x02000000); -} - -u8 battle_load_something(u8 *pState, u8 *b) -{ - bool8 retVal = FALSE; - - switch (*pState) - { - case 0: - sub_8031F0C(); - (*pState)++; - break; - case 1: - if (sub_8031C30(*b) == 0) - { - (*b)++; - } - else - { - *b = 0; - (*pState)++; - } - break; - case 2: - (*pState)++; - break; - case 3: - if ((gBattleTypeFlags & 0x80) && *b == 0) - gHealthboxIDs[*b] = battle_make_oam_safari_battle(); - else - gHealthboxIDs[*b] = battle_make_oam_normal_battle(*b); - (*b)++; - if (*b == gNoOfAllBanks) - { - *b = 0; - (*pState)++; - } - break; - case 4: - sub_8043F44(*b); - if (gBanksBySide[*b] <= 1) - nullsub_11(gHealthboxIDs[*b], 0); - else - nullsub_11(gHealthboxIDs[*b], 1); - (*b)++; - if (*b == gNoOfAllBanks) - { - *b = 0; - (*pState)++; - } - break; - case 5: - if (GetBankSide(*b) == 0) - { - if (!(gBattleTypeFlags & 0x80)) - sub_8045A5C(gHealthboxIDs[*b], &gPlayerParty[gBattlePartyID[*b]], 0); - } - else - { - sub_8045A5C(gHealthboxIDs[*b], &gEnemyParty[gBattlePartyID[*b]], 0); - } - sub_8043DB0(gHealthboxIDs[*b]); - (*b)++; - if (*b == gNoOfAllBanks) - { - *b = 0; - (*pState)++; - } - break; - case 6: - sub_80327CC(); - sub_8094958(); - retVal = TRUE; - break; - } - return retVal; -} - -void sub_8031EE8(void) -{ - memset(ewram17810, 0, 0x30); - memset(&ewram17840, 0, 0x10); -} - -void sub_8031F0C(void) -{ - sub_8031EE8(); - memset(ewram17800, 0, 0x10); -} - -void sub_8031F24(void) -{ - s32 i; - - for (i = 0; i < gNoOfAllBanks; i++) - ewram17800[i].unk0_0 = gSprites[gObjectBankIDs[i]].invisible; -} - -void sub_8031F88(u8 a) -{ - ewram17800[a].unk0_0 = gSprites[gObjectBankIDs[a]].invisible; -} - -void sub_8031FC4(u8 a, u8 b, bool8 c) -{ - u16 paletteOffset; - u16 species; - u32 personalityValue; - u32 otId; - u8 r10; - const u8 *lzPaletteData; - - if (c) - { - StartSpriteAnim(&gSprites[gObjectBankIDs[a]], ewram17840.unk0); - paletteOffset = 0x100 + a * 16; - LoadPalette(ewram + 0x16400 + ewram17840.unk0 * 32, paletteOffset, 32); - gBattleMonForms[a] = ewram17840.unk0; - if (ewram17800[a].unk2 != 0) - { - BlendPalette(paletteOffset, 16, 6, 0x7FFF); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); - } - gSprites[gObjectBankIDs[a]].pos1.y = sub_8077F68(a); - } - else - { - const void *src; - void *dst; - - if (IsContest()) - { - r10 = 0; - species = ewram19348.unk2; - personalityValue = ewram19348.unk8; - otId = ewram19348.unkC; - HandleLoadSpecialPokePic( - &gMonBackPicTable[species], - gMonBackPicCoords[species].coords, - gMonBackPicCoords[species].y_offset, - 0x02000000, - gUnknown_081FAF4C[0], - species, - ewram19348.unk10); - } - else - { - r10 = GetBankIdentity(a); - if (GetBankSide(b) == 1) - species = GetMonData(&gEnemyParty[gBattlePartyID[b]], MON_DATA_SPECIES); - else - species = GetMonData(&gPlayerParty[gBattlePartyID[b]], MON_DATA_SPECIES); - if (GetBankSide(a) == 0) - { - personalityValue = GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_PERSONALITY); - otId = GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_OT_ID); - HandleLoadSpecialPokePic( - &gMonBackPicTable[species], - gMonBackPicCoords[species].coords, - gMonBackPicCoords[species].y_offset, - 0x02000000, - gUnknown_081FAF4C[r10], - species, - gPID_perBank[a]); - } - else - { - personalityValue = GetMonData(&gEnemyParty[gBattlePartyID[a]], MON_DATA_PERSONALITY); - otId = GetMonData(&gEnemyParty[gBattlePartyID[a]], MON_DATA_OT_ID); - HandleLoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, - gMonFrontPicCoords[species].y_offset, - 0x02000000, - gUnknown_081FAF4C[r10], - species, - gPID_perBank[a]); - } - } - src = gUnknown_081FAF4C[r10]; - dst = (void *)(VRAM + 0x10000 + gSprites[gObjectBankIDs[a]].oam.tileNum * 32); - DmaCopy32(3, src, dst, 0x800); - paletteOffset = 0x100 + a * 16; - lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue); - sub_800D238(lzPaletteData, ewram); - LoadPalette(ewram, paletteOffset, 32); - if (species == SPECIES_CASTFORM) - { - u16 *paletteSrc = (u16 *)(ewram + 0x16400); - - sub_800D238(lzPaletteData, paletteSrc); - LoadPalette(paletteSrc + gBattleMonForms[b] * 16, paletteOffset, 32); - } - BlendPalette(paletteOffset, 16, 6, 0x7FFF); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); - if (!IsContest()) - { - ewram17800[a].unk2 = species; - gBattleMonForms[a] = gBattleMonForms[b]; - } - gSprites[gObjectBankIDs[a]].pos1.y = sub_8077F68(a); - StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]); - } -} - -void sub_8032350(u8 a, u8 b) -{ - u8 r4; - u16 foo; - const u8 *gSubstituteDollPal_; - void *src; - s32 i; - - if (b == 0) - { - if (IsContest()) - r4 = 0; - else - r4 = GetBankIdentity(a); - if (IsContest()) - LZDecompressVram(gSubstituteDollTilemap, gUnknown_081FAF4C[r4]); - else if (GetBankSide(a) != 0) - LZDecompressVram(gSubstituteDollGfx, gUnknown_081FAF4C[r4]); - else - LZDecompressVram(gSubstituteDollTilemap, gUnknown_081FAF4C[r4]); - // There is probably a way to do this without all the temp variables, but I couldn't figure it out. - foo = a * 16; - gSubstituteDollPal_ = gSubstituteDollPal; - src = gUnknown_081FAF4C[r4]; - for (i = 0; i < 3; i++) - DmaCopy32(3, src, src + i * 0x800 + 0x800, 0x800); - LoadCompressedPalette(gSubstituteDollPal_, 0x100 + foo, 32); - } - else - { - if (!IsContest()) - { - if (GetBankSide(a) != 0) - sub_8031794(&gEnemyParty[gBattlePartyID[a]], a); - else - sub_80318FC(&gPlayerParty[gBattlePartyID[a]], a); - } - } -} - -void refresh_graphics_maybe(u8 a, u8 b, u8 spriteId) -{ - sub_8032350(a, b); - StartSpriteAnim(&gSprites[spriteId], gBattleMonForms[a]); - if (b == 0) - gSprites[spriteId].pos1.y = sub_8077F7C(a); - else - gSprites[spriteId].pos1.y = sub_8077F68(a); -} - -void sub_80324BC(u8 a, u16 b) -{ - if (b == 0xA4) - ewram17800[a].unk0_2 = 1; -} - -void sub_80324E0(u8 a) -{ - ewram17800[a].unk0_2 = 0; -} - -void sub_80324F8(struct Pokemon *pkmn, u8 b) -{ - u16 hp = GetMonData(pkmn, MON_DATA_HP); - u16 maxHP = GetMonData(pkmn, MON_DATA_MAX_HP); - - if (GetHPBarLevel(hp, maxHP) == 1) - { - if (!ewram17800[b].unk0_1) - { - if (!ewram17800[b ^ 2].unk0_1) - PlaySE(SE_HINSI); - ewram17800[b].unk0_1 = 1; - } - } - else - { - ewram17800[b].unk0_1 = 0; - if (!IsDoubleBattle()) - { - m4aSongNumStop(SE_HINSI); - return; - } - if (IsDoubleBattle() && !ewram17800[b ^ 2].unk0_1) - { - m4aSongNumStop(SE_HINSI); - return; - } - } -} - -void BattleMusicStop(void) -{ - u8 r4 = GetBankByPlayerAI(0); - - ewram17800[r4].unk0_1 = 0; - if (IsDoubleBattle()) - ewram17800[r4 ^ 2].unk0_1 = 0; - m4aSongNumStop(SE_HINSI); -} - -u8 unref_sub_8032604(struct Pokemon *pkmn) -{ - u16 hp = GetMonData(pkmn, MON_DATA_HP); - u16 maxHP = GetMonData(pkmn, MON_DATA_MAX_HP); - - return GetHPBarLevel(hp, maxHP); -} - -void sub_8032638(void) -{ - if (gMain.inBattle) - { - u8 r8 = GetBankByPlayerAI(0); - u8 r9 = GetBankByPlayerAI(2); - u8 r4 = pokemon_order_func(gBattlePartyID[r8]); - u8 r5 = pokemon_order_func(gBattlePartyID[r9]); - - if (GetMonData(&gPlayerParty[r4], MON_DATA_HP) != 0) - sub_80324F8(&gPlayerParty[r4], r8); - if (IsDoubleBattle()) - { - if (GetMonData(&gPlayerParty[r5], MON_DATA_HP) != 0) - sub_80324F8(&gPlayerParty[r5], r9); - } - } -} - -void sub_80326EC(u8 a) -{ - s32 i; - - for (i = 0; i < gNoOfAllBanks; i++) - { - if (sub_8078874(i) != 0) - { - gSprites[gObjectBankIDs[i]].oam.affineMode = a; - if (a == 0) - { - ewram17810[i].unk6 = gSprites[gObjectBankIDs[i]].oam.matrixNum; - gSprites[gObjectBankIDs[i]].oam.matrixNum = 0; - } - else - { - gSprites[gObjectBankIDs[i]].oam.matrixNum = ewram17810[i].unk6; - } - } - } -} - -void sub_80327CC(void) -{ - u8 r5; - - LoadCompressedObjectPic(&gUnknown_081FAF24); - r5 = GetBankByPlayerAI(1); - ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, sub_8077ABC(r5, 0), sub_8077ABC(r5, 1) + 32, 0xC8); - gSprites[ewram17810[r5].unk7].data0 = r5; - if (IsDoubleBattle()) - { - r5 = GetBankByPlayerAI(3); - ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, sub_8077ABC(r5, 0), sub_8077ABC(r5, 1) + 32, 0xC8); - gSprites[ewram17810[r5].unk7].data0 = r5; - } -} - -void sub_80328A4(struct Sprite *sprite) -{ - bool8 invisible = FALSE; - u8 r4 = sprite->data0; - struct Sprite *r7 = &gSprites[gObjectBankIDs[r4]]; - - if (!r7->inUse || sub_8078874(r4) == 0) - { - sprite->callback = sub_8032978; - return; - } - if (gAnimScriptActive || r7->invisible) - invisible = TRUE; - else if (ewram17800[r4].unk2 != 0 && gEnemyMonElevation[ewram17800[r4].unk2] == 0) - invisible = TRUE; - if (ewram17800[r4].unk0_2) - invisible = TRUE; - sprite->pos1.x = r7->pos1.x; - sprite->pos2.x = r7->pos2.x; - sprite->invisible = invisible; -} - -void sub_8032978(struct Sprite *sprite) -{ - sprite->invisible = TRUE; -} - -void sub_8032984(u8 a, u16 b) -{ - if (GetBankSide(a) != 0) - { - if (ewram17800[a].unk2 != 0) - b = ewram17800[a].unk2; - if (gEnemyMonElevation[b] != 0) - gSprites[ewram17810[a].unk7].callback = sub_80328A4; - else - gSprites[ewram17810[a].unk7].callback = sub_8032978; - } -} - -void sub_8032A08(u8 a) -{ - gSprites[ewram17810[a].unk7].callback = sub_8032978; -} - -void sub_8032A38(void) -{ - u16 *ptr = (u16 *)(VRAM + 0x240); - s32 i; - s32 j; - - for (i = 0; i < 9; i++) - { - for (j = 0; j < 16; j++) - { - if (!(*ptr & 0xF000)) - *ptr |= 0xF000; - if (!(*ptr & 0x0F00)) - *ptr |= 0x0F00; - if (!(*ptr & 0x00F0)) - *ptr |= 0x00F0; - if (!(*ptr & 0x000F)) - *ptr |= 0x000F; - ptr++; - } - } -} - -void sub_8032AA8(u8 a, u8 b) -{ - ewram17800[a].unk2 = 0; - gBattleMonForms[a] = 0; - if (b == 0) - sub_80324E0(a); -} - -void nullsub_45(void) -{ -} - -void SetBankFuncToOpponentBufferRunCommand(void) -{ - gBattleBankFunc[gActiveBank] = OpponentBufferRunCommand; -} - -void OpponentBufferRunCommand(void) -{ - if (gBattleExecBuffer & gBitTable[gActiveBank]) - { - if (gBattleBufferA[gActiveBank][0] <= 0x38) - gOpponentBufferCommands[gBattleBufferA[gActiveBank][0]](); - else - OpponentBufferExecCompleted(); - } -} - -void sub_8032B4C(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) - OpponentBufferExecCompleted(); -} - -// Duplicate of sub_8032B4C -void sub_8032B84(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) - OpponentBufferExecCompleted(); -} - -void sub_8032BBC(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) - { - sub_8031B74(gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam); - gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = gSprites[gObjectBankIDs[gActiveBank]].data5; - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); - OpponentBufferExecCompleted(); - } -} - -void sub_8032C4C(void) -{ - if ((--ewram17810[gActiveBank].unk9) == 0xFF) - { - ewram17810[gActiveBank].unk9 = 0; - OpponentBufferExecCompleted(); - } -} - -void sub_8032C88(void) -{ - bool8 r6 = FALSE; - - if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) - { - if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy) - r6 = TRUE; - } - else - { - if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy - && gSprites[gHealthboxIDs[gActiveBank ^ 2]].callback == SpriteCallbackDummy) - r6 = TRUE; - } - if (IsCryPlayingOrClearCrySongs()) - r6 = FALSE; - - if (r6 && ewram17810[gActiveBank].unk1_0 && ewram17810[gActiveBank ^ 2].unk1_0) - { - ewram17810[gActiveBank].unk0_7 = 0; - ewram17810[gActiveBank].unk1_0 = 0; - ewram17810[gActiveBank ^ 2].unk0_7 = 0; - ewram17810[gActiveBank ^ 2].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - m4aMPlayContinue(&gMPlay_BGM); - else - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); - ewram17810[gActiveBank].unk9 = 3; - gBattleBankFunc[gActiveBank] = sub_8032C4C; - } -} - -void sub_8032E2C(void) -{ - if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank].unk0_7) - sub_8141828(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]); - if (!ewram17810[gActiveBank ^ 2].unk0_3 && !ewram17810[gActiveBank ^ 2].unk0_7) - sub_8141828(gActiveBank ^ 2, &gEnemyParty[gBattlePartyID[gActiveBank ^ 2]]); - if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank ^ 2].unk0_3) - { - if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank ^ 2]]); - sub_8045A5C( - gHealthboxIDs[gActiveBank ^ 2], - &gEnemyParty[gBattlePartyID[gActiveBank ^ 2]], - 0); - sub_804777C(gActiveBank ^ 2); - sub_8043DFC(gHealthboxIDs[gActiveBank ^ 2]); - sub_8032984( - gActiveBank ^ 2, - GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank ^ 2]], MON_DATA_SPECIES)); - } - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]); - sub_8045A5C( - gHealthboxIDs[gActiveBank], - &gEnemyParty[gBattlePartyID[gActiveBank]], - 0); - sub_804777C(gActiveBank); - sub_8043DFC(gHealthboxIDs[gActiveBank]); - sub_8032984( - gActiveBank, - GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); - - ewram17840.unk9_0 = 0; - gBattleBankFunc[gActiveBank] = sub_8032C88; - } -} - -void sub_8033018(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].animEnded == TRUE - && gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0) - { - if (!ewram17810[gActiveBank].unk0_7) - { - sub_8141828(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]); - return; - } - if (ewram17810[gActiveBank].unk1_0) - { - ewram17810[gActiveBank].unk0_7 = 0; - ewram17810[gActiveBank].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - OpponentBufferExecCompleted(); - return; - } - } -} - -void sub_80330C8(void) -{ - s16 r4 = sub_8045C78(gActiveBank, gHealthboxIDs[gActiveBank], 0, 0); - - sub_8043DFC(gHealthboxIDs[gActiveBank]); - if (r4 != -1) - sub_80440EC(gHealthboxIDs[gActiveBank], r4, 0); - else - OpponentBufferExecCompleted(); -} - -void sub_803311C(void) -{ - if (!gSprites[gObjectBankIDs[gActiveBank]].inUse) - { - sub_8043DB0(gHealthboxIDs[gActiveBank]); - OpponentBufferExecCompleted(); - } -} - -void sub_8033160(void) -{ - if (!ewram17810[gActiveBank].unk0_6) - { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); - sub_8032A08(gActiveBank); - sub_8043DB0(gHealthboxIDs[gActiveBank]); - OpponentBufferExecCompleted(); - } -} - -void sub_80331D0(void) -{ - if (gUnknown_03004210.state == 0) - OpponentBufferExecCompleted(); -} - -void bx_blink_t7(void) -{ - u8 spriteId = gObjectBankIDs[gActiveBank]; - - if (gSprites[spriteId].data1 == 32) - { - gSprites[spriteId].data1 = 0; - gSprites[spriteId].invisible = FALSE; - gDoingBattleAnim = 0; - OpponentBufferExecCompleted(); - } - else - { - if (((u16)gSprites[spriteId].data1 % 4) == 0) - gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data1++; - } -} - -void sub_8033264(void) -{ - if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy) - { - if (ewram17800[gActiveBank].unk0_2) - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); - gBattleBankFunc[gActiveBank] = sub_80332D0; - } -} - -void sub_80332D0(void) -{ - if (!ewram17810[gActiveBank].unk0_6) - { - CreateTask(c3_0802FDF4, 10); - OpponentBufferExecCompleted(); - } -} - -void sub_8033308(void) -{ - if (ewram17810[gActiveBank].unk1_0) - { - ewram17810[gActiveBank].unk0_7 = 0; - ewram17810[gActiveBank].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 0); - sub_8045A5C( - gHealthboxIDs[gActiveBank], - &gEnemyParty[gBattlePartyID[gActiveBank]], - 0); - sub_804777C(gActiveBank); - sub_8043DFC(gHealthboxIDs[gActiveBank]); - sub_8031F88(gActiveBank); - gBattleBankFunc[gActiveBank] = sub_8033264; - } -} - -void sub_80333D4(void) -{ - if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank].unk0_7) - sub_8141828(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]); - if (gSprites[gUnknown_0300434C[gActiveBank]].callback == SpriteCallbackDummy - && !ewram17810[gActiveBank].unk0_3) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]); - sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); - gBattleBankFunc[gActiveBank] = sub_8033308; - } -} - -void sub_8033494(void) -{ - if (!ewram17810[gActiveBank].unk0_4) - OpponentBufferExecCompleted(); -} - -void sub_80334C0(void) -{ - if (!ewram17810[gActiveBank].unk0_5) - OpponentBufferExecCompleted(); -} - -void OpponentBufferExecCompleted(void) -{ - gBattleBankFunc[gActiveBank] = OpponentBufferRunCommand; - gBattleExecBuffer &= ~gBitTable[gActiveBank]; -} diff --git a/src/battle_8.c b/src/battle_8.c deleted file mode 100644 index 75f10c4b1..000000000 --- a/src/battle_8.c +++ /dev/null @@ -1,1642 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_ai.h" -#include "battle_interface.h" -#include "data2.h" -#include "graphics.h" -#include "main.h" -#include "pokemon.h" -#include "rng.h" -#include "rom3.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "util.h" - -struct UnknownStruct3 -{ - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -extern u8 gActiveBank; -extern u8 gBattleBufferA[][0x200]; -extern u16 gBattlePartyID[]; -extern u8 gObjectBankIDs[]; -extern u8 gBattleMonForms[]; -extern struct SpriteTemplate gUnknown_02024E8C; -extern void (*gBattleBankFunc[])(void); -extern u8 gUnknown_0300434C[]; -extern u8 gHealthboxIDs[]; -extern u16 gBattleTypeFlags; -extern u16 gTrainerBattleOpponent; -extern u32 *gDisableStructMoveAnim; -extern u32 gMoveDmgMoveAnim; -extern u16 gMovePowerMoveAnim; -extern u8 gHappinessMoveAnim; -extern u16 gWeatherMoveAnim; -extern u32 gPID_perBank[]; -extern u8 gUnknown_0202F7C4; -extern u8 gAnimScriptActive; -extern void (*gAnimScriptCallback)(void); -extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; -extern u8 gDisplayedStringBattle[]; -extern u8 gBankTarget; -extern u8 gAbsentBankFlags; -extern bool8 gDoingBattleAnim; -extern u16 gUnknown_02024DE8; -extern u8 gUnknown_02024E68[]; -extern MainCallback gPreBattleCallback1; - -extern u8 sub_8077ABC(); -extern u8 sub_8077F68(); -extern u8 sub_8079E90(); -extern void sub_8033018(void); -extern void sub_8031794(); -extern u8 GetBankIdentity(u8); -extern void sub_8032984(u8, u16); -extern void sub_80333D4(void); -extern void sub_80312F0(struct Sprite *); -extern u8 sub_8046400(); -extern void sub_8032A08(); -extern void sub_8043DB0(); -extern void sub_8033160(void); -extern u8 sub_8135FBC(void); -extern u8 get_trainer_class_pic_index(void); -extern void sub_80313A0(struct Sprite *); -extern void sub_8032B4C(void); -extern void sub_8031A6C(u16, u8); -extern void sub_8032B84(void); -extern void sub_8078B34(struct Sprite *); -extern void sub_8032BBC(void); -extern void oamt_add_pos2_onto_pos1(); -extern void oamt_set_x3A_32(); -extern void sub_803311C(void); -extern void sub_8010384(struct Sprite *); -extern bool8 mplay_80342A4(u8); -extern u8 sub_8031720(); -extern void ExecuteMoveAnim(); -extern void sub_80326EC(); -extern void sub_8031F24(void); -extern void sub_80324BC(); -extern void BufferStringBattle(); -extern void sub_80331D0(void); -extern void sub_8036B0C(void); -extern u8 GetBankByPlayerAI(u8); -extern u8 sub_8036CD4(void); -extern void sub_80330C8(void); -extern void sub_8043D84(); -extern void sub_8045A5C(); -void sub_8033494(void); -extern void move_anim_start_t2_for_situation(); -extern void bx_blink_t7(void); -extern void sub_8047858(); -extern u8 GetBankSide(u8); -extern void sub_80E43C0(); -extern void sub_8044CA0(u8); -extern void nullsub_45(void); -extern void sub_8031B74(); -extern bool8 IsDoubleBattle(void); -extern void sub_8032E2C(void); -extern u8 sub_8078874(); -extern u8 move_anim_start_t3(); -extern void sub_80334C0(void); -extern void OpponentBufferExecCompleted(void); - -u32 sub_8033598(u8, u8 *); -void sub_8033E24(u8); -void sub_803495C(u8, u8); -void sub_8034B74(void); -void sub_8035238(void); -void sub_8035C10(struct Sprite *); -void sub_8035C44(u8); -void sub_8035E2C(void); - -void OpponentHandleGetAttributes(void) -{ - u8 buffer[256]; - int r6 = 0; - s32 i; - - if (gBattleBufferA[gActiveBank][2] == 0) - { - r6 = sub_8033598(gBattlePartyID[gActiveBank], buffer); - } - else - { - u8 r4 = gBattleBufferA[gActiveBank][2]; - - for (i = 0; i < 6; i++) - { - if (r4 & 1) - r6 += sub_8033598(i, buffer + r6); - r4 >>= 1; - } - } - dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, r6, buffer); - OpponentBufferExecCompleted(); -} - -u32 sub_8033598(u8 a, u8 *buffer) -{ - struct BattlePokemon battlePokemon; - struct UnknownStruct3 moveData; - u8 nickname[20]; - u8 *src; - s16 data16; - u32 data32; - s32 size = 0; - - switch (gBattleBufferA[gActiveBank][1]) - { - case 0: - battlePokemon.species = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); - battlePokemon.item = GetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) - { - battlePokemon.moves[size] = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + size); - battlePokemon.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); - } - battlePokemon.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - battlePokemon.friendship = GetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP); - battlePokemon.experience = GetMonData(&gEnemyParty[a], MON_DATA_EXP); - battlePokemon.hpIV = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); - battlePokemon.attackIV = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); - battlePokemon.defenseIV = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); - battlePokemon.spAttackIV = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); - battlePokemon.spDefenseIV = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); - battlePokemon.personality = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); - battlePokemon.status1 = GetMonData(&gEnemyParty[a], MON_DATA_STATUS); - battlePokemon.level = GetMonData(&gEnemyParty[a], MON_DATA_LEVEL); - battlePokemon.hp = GetMonData(&gEnemyParty[a], MON_DATA_HP); - battlePokemon.maxHP = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); - battlePokemon.attack = GetMonData(&gEnemyParty[a], MON_DATA_ATK); - battlePokemon.defense = GetMonData(&gEnemyParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gEnemyParty[a], MON_DATA_SPD); - battlePokemon.spAttack = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); - battlePokemon.spDefense = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); - battlePokemon.isEgg = GetMonData(&gEnemyParty[a], MON_DATA_IS_EGG); - battlePokemon.altAbility = GetMonData(&gEnemyParty[a], MON_DATA_ALT_ABILITY); - battlePokemon.otId = GetMonData(&gEnemyParty[a], MON_DATA_OT_ID); - GetMonData(&gEnemyParty[a], MON_DATA_NICKNAME, nickname); - StringCopy10(battlePokemon.nickname, nickname); - GetMonData(&gEnemyParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - src = (u8 *)&battlePokemon; - for (size = 0; size < sizeof(battlePokemon); size++) - buffer[size] = src[size]; - break; - case 1: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 2: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 3: - for (size = 0; size < 4; size++) - { - moveData.moves[size] = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + size); - moveData.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); - } - moveData.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - src = (u8 *)&moveData; - for (size = 0; size < sizeof(moveData); size++) - buffer[size] = src[size]; - break; - case 4: - case 5: - case 6: - case 7: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 8: - for (size = 0; size < 4; size++) - buffer[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); - buffer[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - size++; - break; - case 9: - case 10: - case 11: - case 12: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); - size = 1; - break; - case 17: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_OT_ID); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 18: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_EXP); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 19: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_EV); - size = 1; - break; - case 20: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_EV); - size = 1; - break; - case 21: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_EV); - size = 1; - break; - case 22: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_EV); - size = 1; - break; - case 23: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV); - size = 1; - break; - case 24: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_EV); - size = 1; - break; - case 25: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP); - size = 1; - break; - case 26: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_POKERUS); - size = 1; - break; - case 27: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_LOCATION); - size = 1; - break; - case 28: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_LEVEL); - size = 1; - break; - case 29: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_MET_GAME); - size = 1; - break; - case 30: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_POKEBALL); - size = 1; - break; - case 31: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); - buffer[1] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); - buffer[2] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); - buffer[4] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); - buffer[5] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); - size = 6; - break; - case 32: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); - size = 1; - break; - case 33: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); - size = 1; - break; - case 34: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - size = 1; - break; - case 35: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); - size = 1; - break; - case 36: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); - size = 1; - break; - case 37: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); - size = 1; - break; - case 38: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 39: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_CHECKSUM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 40: - data32 = GetMonData(&gEnemyParty[a], MON_DATA_STATUS); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 41: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_LEVEL); - size = 1; - break; - case 42: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 43: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 44: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_ATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 45: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_DEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 46: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPD); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 47: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 48: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 49: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_COOL); - size = 1; - break; - case 50: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_BEAUTY); - size = 1; - break; - case 51: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_CUTE); - size = 1; - break; - case 52: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SMART); - size = 1; - break; - case 53: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_TOUGH); - size = 1; - break; - case 54: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SHEEN); - size = 1; - break; - case 55: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_COOL_RIBBON); - size = 1; - break; - case 56: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_BEAUTY_RIBBON); - size = 1; - break; - case 57: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_CUTE_RIBBON); - size = 1; - break; - case 58: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SMART_RIBBON); - size = 1; - break; - case 59: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_TOUGH_RIBBON); - size = 1; - break; - } - return size; -} - -void dp01t_01_2_read_pokmon_data_slice(void) -{ - struct BattlePokemon buffer; - u8 *src = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; - u8 *dst = (u8 *)&buffer + gBattleBufferA[gActiveBank][1]; - u8 i; - - for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) - dst[i] = src[i]; - dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, gBattleBufferA[gActiveBank][2], dst); - OpponentBufferExecCompleted(); -} - -void OpponentHandleSetAttributes(void) -{ - u8 i; - u8 r4; - - if (gBattleBufferA[gActiveBank][2] == 0) - { - sub_8033E24(gBattlePartyID[gActiveBank]); - } - else - { - r4 = gBattleBufferA[gActiveBank][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - sub_8033E24(i); - r4 >>= 1; - } - } - OpponentBufferExecCompleted(); -} - -void sub_8033E24(u8 a) -{ - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; - struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; - s32 i; - - switch (gBattleBufferA[gActiveBank][1]) - { - case 0: - { - u8 iv; - - SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); - SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); - for (i = 0; i < 4; i++) - { - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); - } - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); - SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); - SetMonData(&gEnemyParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); - iv = battlePokemon->hpIV; - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, (u8 *)&iv); - iv = battlePokemon->attackIV; - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, (u8 *)&iv); - iv = battlePokemon->defenseIV; - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, (u8 *)&iv); - iv = battlePokemon->speedIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, (u8 *)&iv); - iv = battlePokemon->spAttackIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); - iv = battlePokemon->spDefenseIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); - SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); - SetMonData(&gEnemyParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); - SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); - SetMonData(&gEnemyParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); - SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); - SetMonData(&gEnemyParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); - SetMonData(&gEnemyParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); - SetMonData(&gEnemyParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); - SetMonData(&gEnemyParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); - } - break; - case 1: - SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); - break; - case 2: - SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); - break; - case 3: - for (i = 0; i < 4; i++) - { - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); - } - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); - break; - case 4: - case 5: - case 6: - case 7: - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); - break; - case 8: - SetMonData(&gEnemyParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); - SetMonData(&gEnemyParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); - SetMonData(&gEnemyParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gEnemyParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); - break; - case 9: - case 10: - case 11: - case 12: - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); - break; - case 17: - SetMonData(&gEnemyParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); - break; - case 18: - SetMonData(&gEnemyParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); - break; - case 19: - SetMonData(&gEnemyParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 20: - SetMonData(&gEnemyParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 21: - SetMonData(&gEnemyParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 22: - SetMonData(&gEnemyParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 23: - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 24: - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 25: - SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); - break; - case 26: - SetMonData(&gEnemyParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); - break; - case 27: - SetMonData(&gEnemyParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); - break; - case 28: - SetMonData(&gEnemyParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); - break; - case 29: - SetMonData(&gEnemyParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); - break; - case 30: - SetMonData(&gEnemyParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); - break; - case 31: - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); - break; - case 32: - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 33: - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 34: - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 35: - SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 36: - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 37: - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 38: - SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); - break; - case 39: - SetMonData(&gEnemyParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); - break; - case 40: - SetMonData(&gEnemyParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); - break; - case 41: - SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); - break; - case 42: - SetMonData(&gEnemyParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); - break; - case 43: - SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); - break; - case 44: - SetMonData(&gEnemyParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); - break; - case 45: - SetMonData(&gEnemyParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); - break; - case 46: - SetMonData(&gEnemyParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); - break; - case 47: - SetMonData(&gEnemyParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); - break; - case 48: - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); - break; - case 49: - SetMonData(&gEnemyParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); - break; - case 50: - SetMonData(&gEnemyParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); - break; - case 51: - SetMonData(&gEnemyParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); - break; - case 52: - SetMonData(&gEnemyParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); - break; - case 53: - SetMonData(&gEnemyParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); - break; - case 54: - SetMonData(&gEnemyParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); - break; - case 55: - SetMonData(&gEnemyParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 56: - SetMonData(&gEnemyParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 57: - SetMonData(&gEnemyParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 58: - SetMonData(&gEnemyParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 59: - SetMonData(&gEnemyParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - } -} - -void sub_8034744(void) -{ - u8 *dst; - u8 i; - - dst = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; - for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) - dst[i] = gBattleBufferA[gActiveBank][3 + i]; - OpponentBufferExecCompleted(); -} - -void OpponentHandleLoadPokeSprite(void) -{ - u16 species = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES); - - sub_8031794(&gEnemyParty[gBattlePartyID[gActiveBank]], gActiveBank); - GetMonSpriteTemplate_803C56C(species, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( - &gUnknown_02024E8C, - sub_8077ABC(gActiveBank, 2), - sub_8077F68(gActiveBank), - sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; - gSprites[gObjectBankIDs[gActiveBank]].data0 = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].data2 = species; - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]); - sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); - gBattleBankFunc[gActiveBank] = sub_8033018; -} - -void OpponentHandleSendOutPoke(void) -{ - gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1]; - - sub_803495C(gActiveBank, gBattleBufferA[gActiveBank][2]); - gBattleBankFunc[gActiveBank] = sub_80333D4; -} - -void sub_803495C(u8 a, u8 b) -{ - u16 species; - - sub_8032AA8(a, b); - gBattlePartyID[a] = gBattleBufferA[a][1]; - species = GetMonData(&gEnemyParty[gBattlePartyID[a]], MON_DATA_SPECIES); - gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); - sub_8031794(&gEnemyParty[gBattlePartyID[a]], a); - GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a)); - gObjectBankIDs[a] = CreateSprite( - &gUnknown_02024E8C, - sub_8077ABC(a, 2), - sub_8077F68(a), - sub_8079E90(a)); - gSprites[gObjectBankIDs[a]].data0 = a; - gSprites[gObjectBankIDs[a]].data2 = species; - gSprites[gUnknown_0300434C[a]].data1 = gObjectBankIDs[a]; - gSprites[gObjectBankIDs[a]].oam.paletteNum = a; - StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]); - gSprites[gObjectBankIDs[a]].invisible = TRUE; - gSprites[gObjectBankIDs[a]].callback = SpriteCallbackDummy; - gSprites[gUnknown_0300434C[a]].data0 = sub_8046400(0, 0xFE); -} - -void OpponentHandleReturnPokeToBall(void) -{ - if (gBattleBufferA[gActiveBank][1] == 0) - { - ewram17810[gActiveBank].unk4 = 0; - gBattleBankFunc[gActiveBank] = sub_8034B74; - } - else - { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); - sub_8032A08(gActiveBank); - sub_8043DB0(gHealthboxIDs[gActiveBank]); - OpponentBufferExecCompleted(); - } -} - -void sub_8034B74(void) -{ - switch (ewram17810[gActiveBank].unk4) - { - case 0: - if (ewram17800[gActiveBank].unk0_2) - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - ewram17810[gActiveBank].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBank].unk0_6) - { - ewram17810[gActiveBank].unk4 = 0; - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 2); - gBattleBankFunc[gActiveBank] = sub_8033160; - } - break; - } -} - -void OpponentHandleTrainerThrow(void) -{ - u32 trainerPicIndex; - - if (gTrainerBattleOpponent == 0x400) - trainerPicIndex = GetSecretBaseTrainerPicIndex(); - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - trainerPicIndex = get_trainer_class_pic_index(); - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - trainerPicIndex = sub_8135FBC(); - else - trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; - - sub_8031A6C(trainerPicIndex, gActiveBank); - GetMonSpriteTemplate_803C5A0(trainerPicIndex, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( - &gUnknown_02024E8C, - 0xB0, - 40 + 4 * (8 - gTrainerFrontPicCoords[trainerPicIndex].coords), - sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; - gSprites[gObjectBankIDs[gActiveBank]].data0 = 2; - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag); - gSprites[gObjectBankIDs[gActiveBank]].data5 = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum; - gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag); - gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam = trainerPicIndex; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; - gBattleBankFunc[gActiveBank] = sub_8032B4C; -} - -void OpponentHandleTrainerSlide(void) -{ - u32 trainerPicIndex; - - if (gTrainerBattleOpponent == 0x400) - trainerPicIndex = GetSecretBaseTrainerPicIndex(); - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - trainerPicIndex = get_trainer_class_pic_index(); - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - trainerPicIndex = sub_8135FBC(); - else - trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; - - sub_8031A6C(trainerPicIndex, gActiveBank); - GetMonSpriteTemplate_803C5A0(trainerPicIndex, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( - &gUnknown_02024E8C, - 0xB0, - 40 + 4 * (8 - gTrainerFrontPicCoords[trainerPicIndex].coords), - 0x1E); - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 96; - gSprites[gObjectBankIDs[gActiveBank]].pos1.x += 32; - gSprites[gObjectBankIDs[gActiveBank]].data0 = -2; - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag); - gSprites[gObjectBankIDs[gActiveBank]].data5 = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum; - gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag); - gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam = trainerPicIndex; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; - gBattleBankFunc[gActiveBank] = sub_8032B84; -} - -void OpponentHandleTrainerSlideBack(void) -{ - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data0 = 35; - gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; - gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); - gBattleBankFunc[gActiveBank] = sub_8032BBC; -} - -void sub_8035030(void) -{ - if (ewram17810[gActiveBank].unk4 == 0) - { - if (ewram17800[gActiveBank].unk0_2) - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - ewram17810[gActiveBank].unk4++; - } - else if (!ewram17810[gActiveBank].unk0_6) - { - ewram17810[gActiveBank].unk4 = 0; - PlaySE12WithPanning(SE_POKE_DEAD, 63); - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8010384; - gBattleBankFunc[gActiveBank] = sub_803311C; - } -} - -void sub_80350D4(void) -{ - OpponentBufferExecCompleted(); -} - -void sub_80350E0(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleBallThrow(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandlePause(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleMoveAnimation(void) -{ - if (!mplay_80342A4(gActiveBank)) - { - u32 r0 = gBattleBufferA[gActiveBank][1] - | (gBattleBufferA[gActiveBank][2] << 8); - - gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; - gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] - | (gBattleBufferA[gActiveBank][5] << 8); - gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] - | (gBattleBufferA[gActiveBank][7] << 8) - | (gBattleBufferA[gActiveBank][8] << 16) - | (gBattleBufferA[gActiveBank][9] << 24); - gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] - | (gBattleBufferA[gActiveBank][13] << 8); - gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; - gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; - - // Dead code. sub_8031720 always returns 0. - if (sub_8031720(r0, gUnknown_0202F7C4) != 0) - { - OpponentBufferExecCompleted(); - } - else - { - ewram17810[gActiveBank].unk4 = 0; - gBattleBankFunc[gActiveBank] = sub_8035238; - } - } -} - -void sub_8035238(void) -{ - u16 r4 = gBattleBufferA[gActiveBank][1] - | (gBattleBufferA[gActiveBank][2] << 8); - u8 r7 = gBattleBufferA[gActiveBank][11]; - - switch (ewram17810[gActiveBank].unk4) - { - case 0: - if (ewram17800[gActiveBank].unk0_2 && !ewram17800[gActiveBank].unk0_3) - { - ewram17800[gActiveBank].unk0_3 = 1; - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - } - ewram17810[gActiveBank].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBank].unk0_6) - { - sub_80326EC(0); - ExecuteMoveAnim(r4); - ewram17810[gActiveBank].unk4 = 2; - } - break; - case 2: - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - sub_80326EC(1); - if ((ewram17800[gActiveBank].unk0_2) && r7 <= 1) - { - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); - ewram17800[gActiveBank].unk0_3 = 0; - } - ewram17810[gActiveBank].unk4 = 3; - } - break; - case 3: - if (!ewram17810[gActiveBank].unk0_6) - { - sub_8031F24(); - sub_80324BC( - gActiveBank, - gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); - ewram17810[gActiveBank].unk4 = 0; - OpponentBufferExecCompleted(); - } - break; - } -} - -void OpponentHandlePrintString(void) -{ - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; - BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gBattleBankFunc[gActiveBank] = sub_80331D0; -} - -void OpponentHandlePrintStringPlayerOnly(void) -{ - OpponentBufferExecCompleted(); -} - -void sub_803540C(void) -{ - sub_8036B0C(); - OpponentBufferExecCompleted(); -} - -void sub_803541C(void) -{ - OpponentBufferExecCompleted(); -} - -#ifdef NONMATCHING -void sub_8035428(void) -{ - u16 r4; - // Needed to match closer - struct {u16 moves[4];} *r5 = (void *)&gBattleBufferA[gActiveBank][4]; - - if (gBattleTypeFlags & 0x498) - { - BattleAI_SetupAIData(); - r4 = BattleAI_GetAIActionToUse(); - switch (r4) - { - case 5: - dp01_build_cmdbuf_x21_a_bb(1, 4, 0); - break; - case 4: - dp01_build_cmdbuf_x21_a_bb(1, 3, 0); - break; - default: - if (gBattleMoves[r5->moves[r4]].target & 0x12) - gBankTarget = gActiveBank; - if (gBattleMoves[r5->moves[r4]].target & 8) - { - gBankTarget = GetBankByPlayerAI(0); - if (gAbsentBankFlags & gBitTable[gBankTarget]) - gBankTarget = GetBankByPlayerAI(2); - } - r4 |= gBankTarget << 8; - dp01_build_cmdbuf_x21_a_bb(1, 10, r4); - break; - } - OpponentBufferExecCompleted(); - } - else - { - u16 r2; - - do - { - // Can't for the life of me get this to match. - r4 = Random() % 4; - r2 = r5->moves[r4]; - } while (r2 == 0); - - if (gBattleMoves[r2].target & 0x12) - { - r4 |= gActiveBank << 8; - dp01_build_cmdbuf_x21_a_bb(1, 10, r4); - } - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - u16 r2 = GetBankByPlayerAI(Random() & 2) << 8; - - dp01_build_cmdbuf_x21_a_bb(1, 10, r4 | r2); - } - else - { - u16 r2 = GetBankByPlayerAI(0) << 8; - - dp01_build_cmdbuf_x21_a_bb(1, 10, r4 | r2); - } - OpponentBufferExecCompleted(); - } -} -#else -__attribute__((naked)) -void sub_8035428(void) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - ldr r6, _0803545C @ =gActiveBank\n\ - ldrb r0, [r6]\n\ - lsls r0, 9\n\ - ldr r1, _08035460 @ =gUnknown_02023A64\n\ - adds r5, r0, r1\n\ - ldr r0, _08035464 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x93\n\ - lsls r0, 3\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080354F8\n\ - bl BattleAI_SetupAIData\n\ - bl BattleAI_GetAIActionToUse\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0x4\n\ - beq _08035468\n\ - cmp r4, 0x5\n\ - bne _08035474\n\ - movs r0, 0x1\n\ - movs r1, 0x4\n\ - b _0803546C\n\ - .align 2, 0\n\ -_0803545C: .4byte gActiveBank\n\ -_08035460: .4byte gUnknown_02023A64\n\ -_08035464: .4byte gBattleTypeFlags\n\ -_08035468:\n\ - movs r0, 0x1\n\ - movs r1, 0x3\n\ -_0803546C:\n\ - movs r2, 0\n\ - bl dp01_build_cmdbuf_x21_a_bb\n\ - b _080354E0\n\ -_08035474:\n\ - ldr r3, _080354E8 @ =gBattleMoves\n\ - lsls r0, r4, 1\n\ - adds r2, r5, r0\n\ - ldrh r1, [r2]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldrb r1, [r0, 0x6]\n\ - movs r0, 0x12\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08035494\n\ - ldr r1, _080354EC @ =gBankTarget\n\ - ldrb r0, [r6]\n\ - strb r0, [r1]\n\ -_08035494:\n\ - ldrh r1, [r2]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldrb r1, [r0, 0x6]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080354CE\n\ - movs r0, 0\n\ - bl GetBankByPlayerAI\n\ - ldr r5, _080354EC @ =gBankTarget\n\ - strb r0, [r5]\n\ - ldr r0, _080354F0 @ =gAbsentBankFlags\n\ - ldrb r1, [r0]\n\ - ldr r2, _080354F4 @ =gBitTable\n\ - ldrb r0, [r5]\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _080354CE\n\ - movs r0, 0x2\n\ - bl GetBankByPlayerAI\n\ - strb r0, [r5]\n\ -_080354CE:\n\ - ldr r0, _080354EC @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - lsls r0, 8\n\ - orrs r4, r0\n\ - movs r0, 0x1\n\ - movs r1, 0xA\n\ - adds r2, r4, 0\n\ - bl dp01_build_cmdbuf_x21_a_bb\n\ -_080354E0:\n\ - bl OpponentBufferExecCompleted\n\ - b _0803558A\n\ - .align 2, 0\n\ -_080354E8: .4byte gBattleMoves\n\ -_080354EC: .4byte gBankTarget\n\ -_080354F0: .4byte gAbsentBankFlags\n\ -_080354F4: .4byte gBitTable\n\ -_080354F8:\n\ - movs r6, 0x3\n\ -_080354FA:\n\ - bl Random\n\ - adds r4, r0, 0\n\ - ands r4, r6\n\ - lsls r0, r4, 1\n\ - adds r0, r5, r0\n\ - ldrh r2, [r0]\n\ - cmp r2, 0\n\ - beq _080354FA\n\ - ldr r1, _08035534 @ =gBattleMoves\n\ - lsls r0, r2, 1\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r1, [r0, 0x6]\n\ - movs r0, 0x12\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803553C\n\ - ldr r0, _08035538 @ =gActiveBank\n\ - ldrb r0, [r0]\n\ - lsls r0, 8\n\ - orrs r4, r0\n\ - movs r0, 0x1\n\ - movs r1, 0xA\n\ - adds r2, r4, 0\n\ - bl dp01_build_cmdbuf_x21_a_bb\n\ - b _08035586\n\ - .align 2, 0\n\ -_08035534: .4byte gBattleMoves\n\ -_08035538: .4byte gActiveBank\n\ -_0803553C:\n\ - ldr r0, _0803556C @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08035570\n\ - bl Random\n\ - movs r1, 0x2\n\ - ands r1, r0\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r0, r1, 0\n\ - bl GetBankByPlayerAI\n\ - adds r2, r0, 0\n\ - lsls r2, 24\n\ - lsrs r2, 16\n\ - orrs r2, r4\n\ - movs r0, 0x1\n\ - movs r1, 0xA\n\ - bl dp01_build_cmdbuf_x21_a_bb\n\ - b _08035586\n\ - .align 2, 0\n\ -_0803556C: .4byte gBattleTypeFlags\n\ -_08035570:\n\ - movs r0, 0\n\ - bl GetBankByPlayerAI\n\ - adds r2, r0, 0\n\ - lsls r2, 24\n\ - lsrs r2, 16\n\ - orrs r2, r4\n\ - movs r0, 0x1\n\ - movs r1, 0xA\n\ - bl dp01_build_cmdbuf_x21_a_bb\n\ -_08035586:\n\ - bl OpponentBufferExecCompleted\n\ -_0803558A:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif - -void sub_8035590(void) -{ - // What is this? - dp01_build_cmdbuf_x23_aa_0(1, ewram[0x160D4 + gActiveBank / 2 * 2]); - OpponentBufferExecCompleted(); -} - -void sub_80355C0(void) -{ - s32 r4; - - if (ewram[0x160C8 + GetBankIdentity(gActiveBank) / 2] == 6) - { - u8 r6; - u8 r5; - - r4 = sub_8036CD4(); - if (r4 == 6) - { - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - r5 = GetBankByPlayerAI(1); - r6 = r5; - } - else - { - r6 = GetBankByPlayerAI(1); - r5 = GetBankByPlayerAI(3); - } - for (r4 = 0; r4 < 6; r4++) - { - if (GetMonData(&gEnemyParty[r4], MON_DATA_HP) != 0 - && r4 != gBattlePartyID[r6] - && r4 != gBattlePartyID[r5]) - break; - } - } - } - else - { - r4 = ewram[0x160C8 + GetBankIdentity(gActiveBank) / 2]; - ewram[0x160C8 + GetBankIdentity(gActiveBank) / 2] = 6; - } - ewram[0x16068 + gActiveBank] = r4; - dp01_build_cmdbuf_x22_a_three_bytes(1, r4, 0); - OpponentBufferExecCompleted(); -} - -void sub_80356C0(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleHealthBarUpdate(void) -{ - s16 r7; - - load_gfxc_health_bar(0); - r7 = (gBattleBufferA[gActiveBank][3] << 8) | gBattleBufferA[gActiveBank][2]; - if (r7 != 0x7FFF) - { - u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); - u32 hp = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); - - sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, hp, r7); - } - else - { - u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); - - sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); - } - gBattleBankFunc[gActiveBank] = sub_80330C8; -} - -void OpponentHandleExpBarUpdate(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleStatusIconUpdate(void) -{ - if (mplay_80342A4(gActiveBank) == 0) - { - sub_8045A5C(gHealthboxIDs[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], 9); - ewram17810[gActiveBank].unk0_4 = 0; - gBattleBankFunc[gActiveBank] = sub_8033494; - } -} - -void OpponentHandleStatusAnimation(void) -{ - if (mplay_80342A4(gActiveBank) == 0) - { - move_anim_start_t2_for_situation( - gBattleBufferA[gActiveBank][1], - gBattleBufferA[gActiveBank][2] - | (gBattleBufferA[gActiveBank][3] << 8) - | (gBattleBufferA[gActiveBank][4] << 16) - | (gBattleBufferA[gActiveBank][5] << 24)); - gBattleBankFunc[gActiveBank] = sub_8033494; - } -} - -void OpponentHandleStatusXor(void) -{ - OpponentBufferExecCompleted(); -} - -void sub_80358B0(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleDMATransfer(void) -{ - OpponentBufferExecCompleted(); -} - -void sub_80358C8(void) -{ - OpponentBufferExecCompleted(); -} - -void sub_80358D4(void) -{ - OpponentBufferExecCompleted(); -} - -void sub_80358E0(void) -{ - OpponentBufferExecCompleted(); -} - -void sub_80358EC(void) -{ - OpponentBufferExecCompleted(); -} - -void sub_80358F8(void) -{ - OpponentBufferExecCompleted(); -} - -void sub_8035904(void) -{ - OpponentBufferExecCompleted(); -} - -void sub_8035910(void) -{ - gUnknown_020238C8.unk0_0 = 0; - OpponentBufferExecCompleted(); -} - -void sub_803592C(void) -{ - gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBank][1]; - OpponentBufferExecCompleted(); -} - -void sub_8035964(void) -{ - gUnknown_020238C8.unk0_7 = 0; - OpponentBufferExecCompleted(); -} - -void sub_803597C(void) -{ - gUnknown_020238C8.unk0_7 ^= 1; - OpponentBufferExecCompleted(); -} - -void OpponentHandleHitAnimation(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) - { - OpponentBufferExecCompleted(); - } - else - { - gDoingBattleAnim = TRUE; - gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; - sub_8047858(gActiveBank); - gBattleBankFunc[gActiveBank] = bx_blink_t7; - } -} - -void sub_8035A14(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleEffectivenessSound(void) -{ - s8 pan; - - if (GetBankSide(gActiveBank) == 0) - pan = -64; - else - pan = 63; - PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan); - OpponentBufferExecCompleted(); -} - -void sub_8035A64(void) -{ - PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); - OpponentBufferExecCompleted(); -} - -void OpponentHandleFaintingCry(void) -{ - PlayCry3( - GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES), - 25, 5); - OpponentBufferExecCompleted(); -} - -void dp01t_2E_7_battle_intro(void) -{ - sub_80E43C0(gBattleBufferA[gActiveBank][1]); - gUnknown_02024DE8 |= 1; - OpponentBufferExecCompleted(); -} - -void sub_8035B04(void) -{ - u8 taskId; - - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data0 = 35; - gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; - gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8035C10); - taskId = CreateTask(sub_8035C44, 5); - gTasks[taskId].data[0] = gActiveBank; - if (ewram17810[gActiveBank].unk0_0) - gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; - ewram17840.unk9_0 = 1; - gBattleBankFunc[gActiveBank] = nullsub_45; -} - -void sub_8035C10(struct Sprite *sprite) -{ - sub_8031B74(sprite->oam.affineParam); - sprite->oam.tileNum = sprite->data5; - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); -} - -void sub_8035C44(u8 taskId) -{ - u8 r9; - - r9 = gActiveBank; - gActiveBank = gTasks[taskId].data[0]; - if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_803495C(gActiveBank, 0); - } - else - { - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_803495C(gActiveBank, 0); - gActiveBank ^= 2; - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_803495C(gActiveBank, 0); - gActiveBank ^= 2; - } - gBattleBankFunc[gActiveBank] = sub_8032E2C; - gActiveBank = r9; - DestroyTask(taskId); -} - -void dp01t_30_7_0803D67C(void) -{ - if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) - { - OpponentBufferExecCompleted(); - return; - } - - ewram17810[gActiveBank].unk0_0 = 1; - if (gBattleBufferA[gActiveBank][2] != 0) - { - if (ewram17810[gActiveBank].unk1_1 < 2) - { - ewram17810[gActiveBank].unk1_1++; - return; - } - else - { - ewram17810[gActiveBank].unk1_1 = 0; - } - } - gUnknown_02024E68[gActiveBank] = sub_8044804( - gActiveBank, - (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], - gBattleBufferA[gActiveBank][1], - gBattleBufferA[gActiveBank][2]); - ewram17810[gActiveBank].unk5 = 0; - if (gBattleBufferA[gActiveBank][2] != 0) - ewram17810[gActiveBank].unk5 = 0x5D; - gBattleBankFunc[gActiveBank] = sub_8035E2C; -} - -void sub_8035E2C(void) -{ - if (ewram17810[gActiveBank].unk5++ >= 93) - { - ewram17810[gActiveBank].unk5 = 0; - OpponentBufferExecCompleted(); - } -} - -void sub_8035E6C(void) -{ - if (ewram17810[gActiveBank].unk0_0) - gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; - OpponentBufferExecCompleted(); -} - -void sub_8035EB8(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleSpriteInvisibility(void) -{ - if (sub_8078874(gActiveBank) != 0) - { - gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; - sub_8031F88(gActiveBank); - } - OpponentBufferExecCompleted(); -} - -void OpponentHandleBattleAnimation(void) -{ - if (mplay_80342A4(gActiveBank) == 0) - { - u8 r3 = gBattleBufferA[gActiveBank][1]; - u16 r4 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - - if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, r3, r4) != 0) - OpponentBufferExecCompleted(); - else - gBattleBankFunc[gActiveBank] = sub_80334C0; - } -} - -void OpponentHandleLinkStandbyMsg(void) -{ - OpponentBufferExecCompleted(); -} - -void OpponentHandleResetActionMoveSelection(void) -{ - OpponentBufferExecCompleted(); -} - -void sub_8035FA4(void) -{ - if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_WILD)) - { - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(gMain.savedCallback); - } - OpponentBufferExecCompleted(); -} - -void nullsub_46(void) -{ -} diff --git a/src/battle_811DA74.c b/src/battle_811DA74.c deleted file mode 100644 index 36a287efc..000000000 --- a/src/battle_811DA74.c +++ /dev/null @@ -1,1606 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_interface.h" -#include "data2.h" -#include "battle_811DA74.h" -#include "battle_anim_813F0F4.h" -#include "link.h" -#include "m4a.h" -#include "main.h" -#include "palette.h" -#include "pokeball.h" -#include "pokemon.h" -#include "rom3.h" -#include "rom_8077ABC.h" -#include "sound.h" -#include "songs.h" -#include "sprite.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "util.h" - -struct UnknownStruct1 -{ - u8 unk0; - u8 unk1; - u8 unk2[0x1FE]; -}; - -//Possibly PokemonSubstruct1 -struct UnknownStruct3 -{ - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -extern u16 gBattleTypeFlags; -extern u8 gDisplayedStringBattle[]; -extern u8 gBattleBufferA[][0x200]; -extern u8 gActiveBank; -extern u32 gBattleExecBuffer; -extern u16 gBattlePartyID[]; -extern u8 gObjectBankIDs[]; -extern u8 gBattleOutcome; -extern u16 gUnknown_02024DE8; -extern u8 gUnknown_02024E68[]; -extern u8 gDoingBattleAnim; -extern u32 gPID_perBank[]; -extern struct SpriteTemplate gUnknown_02024E8C; -extern u32 *gDisableStructMoveAnim; -extern u32 gMoveDmgMoveAnim; -extern u16 gMovePowerMoveAnim; -extern u8 gHappinessMoveAnim; -extern u16 gWeatherMoveAnim; -extern u8 gUnknown_0202F7C4; -extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; -extern MainCallback gPreBattleCallback1; -extern void (*gBattleBankFunc[])(void); -extern u8 gHealthboxIDs[]; -extern u8 gUnknown_0300434C[]; -extern u8 gBattleMonForms[]; -extern u8 gAnimScriptActive; -extern void (*gAnimScriptCallback)(void); -extern void (*const gLinkPartnerBufferCommands[])(void); - -extern u8 move_anim_start_t3(); -extern u8 sub_8078874(); -extern void sub_8044CA0(u8); -extern void sub_8030E38(struct Sprite *); -extern void sub_80E43C0(); -extern void sub_8047858(); -extern void move_anim_start_t2_for_situation(); -extern void load_gfxc_health_bar(); -extern void sub_8043D84(); -extern void BufferStringBattle(); -extern void sub_8031F24(void); -extern void sub_80326EC(); -extern void ExecuteMoveAnim(); -extern void sub_80324BC(); -extern u8 sub_8031720(); -extern u8 mplay_80342A4(); -extern void oamt_add_pos2_onto_pos1(); -extern void oamt_set_x3A_32(); -extern void sub_8078B34(struct Sprite *); -extern void sub_80105EC(struct Sprite *); -extern s32 sub_803FC34(u16); -extern void sub_8031AF4(); -extern void sub_80313A0(struct Sprite *); -extern u8 sub_8046400(); -extern void sub_80312F0(struct Sprite *); -extern u8 CreateInvisibleSpriteWithCallback(); -extern void sub_80318FC(); -extern u8 sub_8077ABC(); -extern u8 sub_8077F68(); -extern u8 sub_8079E90(); -extern void nullsub_10(); -extern void sub_8045A5C(); -extern void sub_804777C(); -extern void sub_8043DFC(); -//extern s16 sub_8045C78(); -extern void sub_80440EC(); -extern void sub_80324F8(); -extern void nullsub_9(u16); -extern void sub_8043DB0(); -extern void move_anim_start_t4(); -extern void c3_0802FDF4(u8); -extern void sub_8031F88(); -extern void sub_8141828(); -extern void c2_8011A1C(void); - -void LinkPartnerBufferRunCommand(void); -void sub_811E0A0(void); -void LinkPartnerBufferExecCompleted(void); -u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *b); -void sub_811EC68(u8); -void sub_811F864(u8, u8); -void sub_811FA5C(void); -void sub_811FF30(void); -void sub_812071C(u8); -void sub_81208E0(void); - - -void nullsub_74(void) -{ -} - -void SetBankFuncToLinkPartnerBufferRunCommand(void) -{ - gBattleBankFunc[gActiveBank] = LinkPartnerBufferRunCommand; -} - -void LinkPartnerBufferRunCommand(void) -{ - if (gBattleExecBuffer & gBitTable[gActiveBank]) - { - if (gBattleBufferA[gActiveBank][0] <= 0x38) - gLinkPartnerBufferCommands[gBattleBufferA[gActiveBank][0]](); - else - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811DAE4(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) - LinkPartnerBufferExecCompleted(); -} - -void sub_811DB1C(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) - { - nullsub_10(0); - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811DB84(void) -{ - if ((--ewram17810[gActiveBank].unk9) == 0xFF) - { - ewram17810[gActiveBank].unk9 = 0; - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811DBC0(void) -{ - bool8 r6 = FALSE; - - if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & 0x40))) - { - if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy) - r6 = TRUE; - } - else - { - if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy - && gSprites[gHealthboxIDs[gActiveBank ^ 2]].callback == SpriteCallbackDummy) - r6 = TRUE; - } - if (IsCryPlayingOrClearCrySongs()) - r6 = FALSE; - if (r6) - { - ewram17810[gActiveBank].unk9 = 3; - gBattleBankFunc[gActiveBank] = sub_811DB84; - } -} - -void sub_811DCA0(void) -{ - u8 r2; - - if (!ewram17810[gActiveBank].unk0_3) - { - // I couldn't get it to work as a bitfield here - r2 = *((u8 *)&ewram17810[gActiveBank ^ 2]) & 8; - if (!r2 && (++ewram17810[gActiveBank].unk9) != 1) - { - ewram17810[gActiveBank].unk9 = r2; - if (IsDoubleBattle() && !(gBattleTypeFlags & 0x40)) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank ^ 2]]); - sub_8045A5C(gHealthboxIDs[gActiveBank ^ 2], &gPlayerParty[gBattlePartyID[gActiveBank ^ 2]], 0); - sub_804777C(gActiveBank ^ 2); - sub_8043DFC(gHealthboxIDs[gActiveBank ^ 2]); - } - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]); - sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 0); - sub_804777C(gActiveBank); - sub_8043DFC(gHealthboxIDs[gActiveBank]); - (s8)ewram17810[4].unk9 &= ~1; - gBattleBankFunc[gActiveBank] = sub_811DBC0; - } - } -} - -void sub_811DDE8(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].animEnded - && gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0) - LinkPartnerBufferExecCompleted(); -} - -void bx_t3_healthbar_update(void) -{ - s16 r4; - - r4 = sub_8045C78(gActiveBank, gHealthboxIDs[gActiveBank], 0, 0); - sub_8043DFC(gHealthboxIDs[gActiveBank]); - if (r4 != -1) - { - sub_80440EC(gHealthboxIDs[gActiveBank], r4, 0); - } - else - { - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811DE98(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].pos1.y + gSprites[gObjectBankIDs[gActiveBank]].pos2.y > 160) - { - nullsub_9(GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); - FreeOamMatrix(gSprites[gObjectBankIDs[gActiveBank]].oam.matrixNum); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); - sub_8043DB0(gHealthboxIDs[gActiveBank]); - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811DF34(void) -{ - if (!ewram17810[gActiveBank].unk0_6) - { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); - sub_8043DB0(gHealthboxIDs[gActiveBank]); - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811DFA0(void) -{ - if (gUnknown_03004210.state == 0) - LinkPartnerBufferExecCompleted(); -} - -void bx_blink_t3(void) -{ - u8 spriteId = gObjectBankIDs[gActiveBank]; - if (gSprites[spriteId].data1 == 32) - { - gSprites[spriteId].data1 = 0; - gSprites[spriteId].invisible = FALSE; - gDoingBattleAnim = 0; - LinkPartnerBufferExecCompleted(); - } - else - { - if ((gSprites[spriteId].data1 % 4) == 0) - { - gSprites[spriteId].invisible ^= 1; - } - gSprites[spriteId].data1++; - } -} - -void sub_811E034(void) -{ - if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy) - { - if (ewram17800[gActiveBank].unk0_2) - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); - gBattleBankFunc[gActiveBank] = sub_811E0A0; - } -} - -void sub_811E0A0(void) -{ - if (!ewram17810[gActiveBank].unk0_6) - LinkPartnerBufferExecCompleted(); -} - -void sub_811E0CC(void) -{ - if (ewram17810[gActiveBank].unk1_0) - { - ewram17810[gActiveBank].unk0_7 = 0; - ewram17810[gActiveBank].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - CreateTask(c3_0802FDF4, 10); - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 0); - sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 0); - sub_804777C(gActiveBank); - sub_8043DFC(gHealthboxIDs[gActiveBank]); - sub_8031F88(gActiveBank); - gBattleBankFunc[gActiveBank] = sub_811E034; - } -} - -void sub_811E1BC(void) -{ - if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank].unk0_7) - sub_8141828(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]); - if (gSprites[gUnknown_0300434C[gActiveBank]].callback == SpriteCallbackDummy - && !ewram17810[gActiveBank].unk0_3) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]); - gBattleBankFunc[gActiveBank] = sub_811E0CC; - } -} - -void sub_811E258(void) -{ - if (gReceivedRemoteLinkPlayers == 0) - { - m4aSongNumStop(0x5A); - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(c2_8011A1C); - } -} - -void sub_811E29C(void) -{ - if (!gPaletteFade.active) - { - if (gBattleTypeFlags & 2) - { - sub_800832C(); - gBattleBankFunc[gActiveBank] = sub_811E258; - } - else - { - m4aSongNumStop(0x5A); - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(gMain.savedCallback); - } - } -} - -void LinkPartnerBufferExecCompleted(void) -{ - u8 multiplayerId; - - gBattleBankFunc[gActiveBank] = LinkPartnerBufferRunCommand; - if (gBattleTypeFlags & 2) - { - multiplayerId = GetMultiplayerId(); - dp01_prepare_buffer_wireless_probably(2, 4, &multiplayerId); - gBattleBufferA[gActiveBank][0] = 0x38; - } - else - { - gBattleExecBuffer &= ~gBitTable[gActiveBank]; - } -} - -void sub_811E38C(void) -{ - if (!ewram17810[gActiveBank].unk0_4) - LinkPartnerBufferExecCompleted(); -} - -void sub_811E3B8(void) -{ - if (!ewram17810[gActiveBank].unk0_5) - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleGetAttributes(void) -{ - u8 unk[256]; - int r6 = 0; - s32 i; - - if (gBattleBufferA[gActiveBank][2] == 0) - { - r6 = dp01_getattr_by_ch1_for_player_pokemon(gBattlePartyID[gActiveBank], unk); - } - else - { - u8 r4 = gBattleBufferA[gActiveBank][2]; - - for (i = 0; i < 6; i++) - { - if (r4 & 1) - r6 += dp01_getattr_by_ch1_for_player_pokemon(i, unk + r6); - r4 >>= 1; - } - } - dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, r6, unk); - LinkPartnerBufferExecCompleted(); -} - -// Duplicate of dp01_getattr_by_ch1_for_player_pokemon_ -u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) -{ - struct BattlePokemon battlePokemon; - struct UnknownStruct3 moveData; - u8 nickname[20]; - u8 *src; - s16 data16; - u32 data32; - s32 size = 0; - - switch (gBattleBufferA[gActiveBank][1]) - { - case 0: - battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); - battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) - { - battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); - battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - } - battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); - battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP); - battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); - battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); - battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); - battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); - battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP); - battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); - battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); - battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD); - battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); - battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); - battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); - battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY); - battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); - GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); - StringCopy10(battlePokemon.nickname, nickname); - GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - src = (u8 *)&battlePokemon; - for (size = 0; size < sizeof(battlePokemon); size++) - buffer[size] = src[size]; - break; - case 1: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 2: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 3: - for (size = 0; size < 4; size++) - { - moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); - moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - } - moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - src = (u8 *)&moveData; - for (size = 0; size < sizeof(moveData); size++) - buffer[size] = src[size]; - break; - case 4: - case 5: - case 6: - case 7: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 8: - for (size = 0; size < 4; size++) - buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - size++; - break; - case 9: - case 10: - case 11: - case 12: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); - size = 1; - break; - case 17: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 18: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 19: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV); - size = 1; - break; - case 20: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV); - size = 1; - break; - case 21: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV); - size = 1; - break; - case 22: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV); - size = 1; - break; - case 23: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV); - size = 1; - break; - case 24: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV); - size = 1; - break; - case 25: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); - size = 1; - break; - case 26: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS); - size = 1; - break; - case 27: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION); - size = 1; - break; - case 28: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL); - size = 1; - break; - case 29: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME); - size = 1; - break; - case 30: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL); - size = 1; - break; - case 31: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); - buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - size = 6; - break; - case 32: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - size = 1; - break; - case 33: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - size = 1; - break; - case 34: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - size = 1; - break; - case 35: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); - size = 1; - break; - case 36: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - size = 1; - break; - case 37: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - size = 1; - break; - case 38: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 39: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 40: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 41: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); - size = 1; - break; - case 42: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 43: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 44: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 45: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 46: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 47: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 48: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 49: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL); - size = 1; - break; - case 50: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY); - size = 1; - break; - case 51: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE); - size = 1; - break; - case 52: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART); - size = 1; - break; - case 53: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH); - size = 1; - break; - case 54: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN); - size = 1; - break; - case 55: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON); - size = 1; - break; - case 56: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON); - size = 1; - break; - case 57: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON); - size = 1; - break; - case 58: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON); - size = 1; - break; - case 59: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON); - size = 1; - break; - } - return size; -} - -void sub_811EC04(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleSetAttributes(void) -{ - u8 i; - u8 r4; - - if (gBattleBufferA[gActiveBank][2] == 0) - { - sub_811EC68(gBattlePartyID[gActiveBank]); - } - else - { - r4 = gBattleBufferA[gActiveBank][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - sub_811EC68(i); - r4 >>= 1; - } - } - LinkPartnerBufferExecCompleted(); -} - -// Duplicate of dp01_setattr_by_ch1_for_player_pokemon -void sub_811EC68(u8 a) -{ - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; - struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; - s32 i; - - switch (gBattleBufferA[gActiveBank][1]) - { - case 0: - { - u8 iv; - - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); - } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); - SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); - iv = battlePokemon->hpIV; - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); - iv = battlePokemon->attackIV; - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); - iv = battlePokemon->defenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); - iv = battlePokemon->speedIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); - iv = battlePokemon->spAttackIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); - iv = battlePokemon->spDefenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); - SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); - SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); - SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); - SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); - } - break; - case 1: - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); - break; - case 2: - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); - break; - case 3: - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); - } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); - break; - case 4: - case 5: - case 6: - case 7: - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); - break; - case 8: - SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); - SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); - SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); - break; - case 9: - case 10: - case 11: - case 12: - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); - break; - case 17: - SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); - break; - case 18: - SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); - break; - case 19: - SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 20: - SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 21: - SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 22: - SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 23: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 24: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 25: - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); - break; - case 26: - SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); - break; - case 27: - SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); - break; - case 28: - SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); - break; - case 29: - SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); - break; - case 30: - SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); - break; - case 31: - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); - break; - case 32: - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 33: - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 34: - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 35: - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 36: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 37: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 38: - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); - break; - case 39: - SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); - break; - case 40: - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); - break; - case 41: - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); - break; - case 42: - SetMonData(&gPlayerParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); - break; - case 43: - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); - break; - case 44: - SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); - break; - case 45: - SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); - break; - case 46: - SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); - break; - case 47: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); - break; - case 48: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); - break; - case 49: - SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); - break; - case 50: - SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); - break; - case 51: - SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); - break; - case 52: - SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); - break; - case 53: - SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); - break; - case 54: - SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); - break; - case 55: - SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 56: - SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 57: - SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 58: - SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 59: - SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - } - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); -} - -void sub_811F664(void) -{ - u8 *dst; - u8 i; - - dst = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; - for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) - dst[i] = gBattleBufferA[gActiveBank][3 + i]; - LinkPartnerBufferExecCompleted(); -} - -void sub_811F6D8(void) -{ - sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - GetMonSpriteTemplate_803C56C( - GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES), - GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( - &gUnknown_02024E8C, - sub_8077ABC(gActiveBank, 2), - sub_8077F68(gActiveBank), - sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; - gSprites[gObjectBankIDs[gActiveBank]].data0 = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]); - gBattleBankFunc[gActiveBank] = sub_811DDE8; -} - -void sub_811F7F4(void) -{ - sub_8032AA8(gActiveBank, gBattleBufferA[gActiveBank][2]); - gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1]; - sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - sub_811F864(gActiveBank, gBattleBufferA[gActiveBank][2]); - gBattleBankFunc[gActiveBank] = sub_811E1BC; -} - -void sub_811F864(u8 a, u8 b) -{ - u16 species; - - sub_8032AA8(a, b); - gBattlePartyID[a] = gBattleBufferA[a][1]; - species = GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_SPECIES); - gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); - GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a)); - gObjectBankIDs[a] = CreateSprite( - &gUnknown_02024E8C, - sub_8077ABC(a, 2), - sub_8077F68(a), - sub_8079E90(a)); - gSprites[gUnknown_0300434C[a]].data1 = gObjectBankIDs[a]; - gSprites[gObjectBankIDs[a]].data0 = a; - gSprites[gObjectBankIDs[a]].data2 = species; - gSprites[gObjectBankIDs[a]].oam.paletteNum = a; - StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]); - gSprites[gObjectBankIDs[a]].invisible = TRUE; - gSprites[gObjectBankIDs[a]].callback = SpriteCallbackDummy; - gSprites[gUnknown_0300434C[a]].data0 = sub_8046400(0, 0xFF); -} - -void sub_811F9D0(void) -{ - if (gBattleBufferA[gActiveBank][1] == 0) - { - ewram17810[gActiveBank].unk4 = 0; - gBattleBankFunc[gActiveBank] = sub_811FA5C; - } - else - { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); - sub_8043DB0(gHealthboxIDs[gActiveBank]); - LinkPartnerBufferExecCompleted(); - } -} - -void sub_811FA5C(void) -{ - switch (ewram17810[gActiveBank].unk4) - { - case 0: - if (ewram17800[gActiveBank].unk0_2) - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - ewram17810[gActiveBank].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBank].unk0_6) - { - ewram17810[gActiveBank].unk4 = 0; - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 1); - gBattleBankFunc[gActiveBank] = sub_811DF34; - } - break; - } -} - -void sub_811FAE4(void) -{ - s16 xOffset; - u32 gender; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (GetBankIdentity(gActiveBank) & 2) - xOffset = 16; - else - xOffset = -16; - gender = gLinkPlayers[sub_803FC34(gActiveBank)].gender; - } - else - { - xOffset = 0; - gender = gLinkPlayers[GetMultiplayerId() ^ 1].gender; - } - sub_8031AF4(gender, gActiveBank); - GetMonSpriteTemplate_803C5A0(gender, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( - &gUnknown_02024E8C, - 80 + xOffset, 80 + 4 * (8 - gTrainerBackPicCoords[gender].coords), - sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; - gSprites[gObjectBankIDs[gActiveBank]].data0 = -2; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; - gBattleBankFunc[gActiveBank] = sub_811DAE4; -} - -void sub_811FC30(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_811FC3C(void) -{ - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data0 = 35; - gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; - gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); - gBattleBankFunc[gActiveBank] = sub_811DB1C; -} - -void sub_811FCE8(void) -{ - if (ewram17810[gActiveBank].unk4 == 0) - { - if (ewram17800[gActiveBank].unk0_2) - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - ewram17810[gActiveBank].unk4++; - } - else if (!ewram17810[gActiveBank].unk0_6) - { - ewram17810[gActiveBank].unk4 = 0; - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - PlaySE12WithPanning(SE_POKE_DEAD, -64); - gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; - gSprites[gObjectBankIDs[gActiveBank]].data2 = 5; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80105EC; - gBattleBankFunc[gActiveBank] = sub_811DE98; - } -} - -void sub_811FDCC(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_811FDD8(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_811FDE4(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_811FDF0(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_811FDFC(void) -{ - if (!mplay_80342A4(gActiveBank)) - { - u32 r0 = gBattleBufferA[gActiveBank][1] - | (gBattleBufferA[gActiveBank][2] << 8); - - gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; - gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] - | (gBattleBufferA[gActiveBank][5] << 8); - gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] - | (gBattleBufferA[gActiveBank][7] << 8) - | (gBattleBufferA[gActiveBank][8] << 16) - | (gBattleBufferA[gActiveBank][9] << 24); - gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] - | (gBattleBufferA[gActiveBank][13] << 8); - gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; - gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; - - if (sub_8031720(r0, gUnknown_0202F7C4) != 0) - LinkPartnerBufferExecCompleted(); - else - { - ewram17810[gActiveBank].unk4 = 0; - gBattleBankFunc[gActiveBank] = sub_811FF30; - } - } -} - -void sub_811FF30(void) -{ - u16 r4 = gBattleBufferA[gActiveBank][1] - | (gBattleBufferA[gActiveBank][2] << 8); - u8 r7 = gBattleBufferA[gActiveBank][11]; - - switch (ewram17810[gActiveBank].unk4) - { - case 0: - if (ewram17800[gActiveBank].unk0_2 && !ewram17800[gActiveBank].unk0_3) - { - ewram17800[gActiveBank].unk0_3 = 1; - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - } - ewram17810[gActiveBank].unk4 = 1; - break; - case 1: - if (!ewram17810[gActiveBank].unk0_6) - { - sub_80326EC(0); - ExecuteMoveAnim(r4); - ewram17810[gActiveBank].unk4 = 2; - } - break; - case 2: - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - sub_80326EC(1); - if ((ewram17800[gActiveBank].unk0_2) && r7 <= 1) - { - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); - ewram17800[gActiveBank].unk0_3 = 0; - } - ewram17810[gActiveBank].unk4 = 3; - } - break; - case 3: - if (!ewram17810[gActiveBank].unk0_6) - { - sub_8031F24(); - sub_80324BC( - gActiveBank, - gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); - ewram17810[gActiveBank].unk4 = 0; - LinkPartnerBufferExecCompleted(); - } - break; - } -} - -void sub_8120094(void) -{ - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; - BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gBattleBankFunc[gActiveBank] = sub_811DFA0; -} - -void sub_81200F8(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120104(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120110(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_812011C(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120128(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120134(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120140(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleHealthBarUpdate(void) -{ - s16 r7; - - load_gfxc_health_bar(0); - r7 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (r7 != 0x7FFF) - { - u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); - u32 hp = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); - - sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, hp, r7); - } - else - { - u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); - - sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); - } - gBattleBankFunc[gActiveBank] = bx_t3_healthbar_update; -} - -void LinkPartnerHandleExpBarUpdate(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleStatusIconUpdate(void) -{ - if (mplay_80342A4(gActiveBank) == 0) - { - sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 9); - ewram17810[gActiveBank].unk0_4 = 0; - gBattleBankFunc[gActiveBank] = sub_811E38C; - } -} - -void LinkPartnerHandleStatusAnimation(void) -{ - if (mplay_80342A4(gActiveBank) == 0) - { - move_anim_start_t2_for_situation( - gBattleBufferA[gActiveBank][1], - gBattleBufferA[gActiveBank][2] - | (gBattleBufferA[gActiveBank][3] << 8) - | (gBattleBufferA[gActiveBank][4] << 16) - | (gBattleBufferA[gActiveBank][5] << 24)); - gBattleBankFunc[gActiveBank] = sub_811E38C; - } -} - -void sub_8120324(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120330(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_812033C(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120348(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120354(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120360(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_812036C(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120378(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120384(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120390(void) -{ - gUnknown_020238C8.unk0_0 = 0; - LinkPartnerBufferExecCompleted(); -} - -void sub_81203AC(void) -{ - gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBank][1]; - LinkPartnerBufferExecCompleted(); -} - -void sub_81203E4(void) -{ - gUnknown_020238C8.unk0_7 = 0; - LinkPartnerBufferExecCompleted(); -} - -void sub_81203FC(void) -{ - gUnknown_020238C8.unk0_7 ^= 1; - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleHitAnimation(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) - { - LinkPartnerBufferExecCompleted(); - } - else - { - gDoingBattleAnim = TRUE; - gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; - sub_8047858(gActiveBank); - gBattleBankFunc[gActiveBank] = bx_blink_t3; - } -} - -void sub_8120494(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleEffectivenessSound(void) -{ - s8 pan; - - if (GetBankSide(gActiveBank) == 0) - pan = -64; - else - pan = 63; - PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan); - LinkPartnerBufferExecCompleted(); -} - -void sub_81204E4(void) -{ - PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); - LinkPartnerBufferExecCompleted(); -} - -void LinkPartnerHandleFaintingCry(void) -{ - PlayCry3( - GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES), - -25, 5); - LinkPartnerBufferExecCompleted(); -} - -void dp01t_2E_3_battle_intro(void) -{ - sub_80E43C0(gBattleBufferA[gActiveBank][1]); - gUnknown_02024DE8 |= 1; - LinkPartnerBufferExecCompleted(); -} - -void sub_8120588(void) -{ - u8 r4; - u8 taskId; - - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; - gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; - gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); - r4 = AllocSpritePalette(0xD6F9); - LoadCompressedPalette( - gTrainerBackPicPaletteTable[gLinkPlayers[sub_803FC34(gActiveBank)].gender].data, - 0x100 + r4 * 16, 0x20); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = r4; - taskId = CreateTask(sub_812071C, 5); - gTasks[taskId].data[0] = gActiveBank; - if (ewram17810[gActiveBank].unk0_0) - gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; - ewram17840.unk9_0 = 1; - gBattleBankFunc[gActiveBank] = nullsub_74; -} - -void sub_812071C(u8 taskId) -{ - u8 r9; - - if (gTasks[taskId].data[1] < 24) - { - gTasks[taskId].data[1]++; - return; - } - - r9 = gActiveBank; - gActiveBank = gTasks[taskId].data[0]; - if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_811F864(gActiveBank, 0); - } - else - { - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_811F864(gActiveBank, 0); - gActiveBank ^= 2; - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - sub_811F864(gActiveBank, 0); - gActiveBank ^= 2; - } - gBattleBankFunc[gActiveBank] = sub_811DCA0; - gActiveBank = r9; - DestroyTask(taskId); -} - -void dp01t_30_3_80EB11C(void) -{ - if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) - { - LinkPartnerBufferExecCompleted(); - return; - } - - ewram17810[gActiveBank].unk0_0 = 1; - gUnknown_02024E68[gActiveBank] = sub_8044804( - gActiveBank, - (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], - gBattleBufferA[gActiveBank][1], - gBattleBufferA[gActiveBank][2]); - ewram17810[gActiveBank].unk5 = 0; - if (gBattleBufferA[gActiveBank][2] != 0) - ewram17810[gActiveBank].unk5 = 0x5D; - gBattleBankFunc[gActiveBank] = sub_81208E0; -} - -void sub_81208E0(void) -{ - if (ewram17810[gActiveBank].unk5++ >= 93) - { - ewram17810[gActiveBank].unk5 = 0; - LinkPartnerBufferExecCompleted(); - } -} - -void sub_8120920(void) -{ - if (ewram17810[gActiveBank].unk0_0) - gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; - LinkPartnerBufferExecCompleted(); -} - -void sub_812096C(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120978(void) -{ - if (sub_8078874(gActiveBank) != 0) - { - gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; - sub_8031F88(gActiveBank); - } - LinkPartnerBufferExecCompleted(); -} - -void sub_81209D8(void) -{ - if (mplay_80342A4(gActiveBank) == 0) - { - u8 r3 = gBattleBufferA[gActiveBank][1]; - u16 r4 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - - if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, r3, r4) != 0) - LinkPartnerBufferExecCompleted(); - else - gBattleBankFunc[gActiveBank] = sub_811E3B8; - } -} - -void sub_8120A40(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120A4C(void) -{ - LinkPartnerBufferExecCompleted(); -} - -void sub_8120A58(void) -{ - gBattleOutcome = gBattleBufferA[gActiveBank][1]; - FadeOutMapMusic(5); - BeginFastPaletteFade(3); - LinkPartnerBufferExecCompleted(); - gBattleBankFunc[gActiveBank] = sub_811E29C; -} - -void nullsub_75(void) -{ -} diff --git a/src/battle_ai.c b/src/battle_ai.c deleted file mode 100644 index a1cb805d9..000000000 --- a/src/battle_ai.c +++ /dev/null @@ -1,2150 +0,0 @@ -#include "global.h" -#include "battle_ai.h" -#include "abilities.h" -#include "battle.h" -#include "battle_move_effects.h" -#include "data2.h" -#include "item.h" -#include "moves.h" -#include "pokemon.h" -#include "rng.h" -#include "rom_8077ABC.h" -#include "species.h" -#include "util.h" - -extern u16 gBattleTypeFlags; -extern u16 gBattleWeather; -extern u8 gActiveBank; -extern u16 gBattlePartyID[MAX_BANKS_BATTLE]; -extern u16 gCurrentMove; -extern int gBattleMoveDamage; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u8 gAbsentBankFlags; -extern u8 gBattleMoveFlags; -extern u16 gDynamicBasePower; -extern u16 gLastUsedMove[MAX_BANKS_BATTLE]; -extern u32 gStatuses3[MAX_BANKS_BATTLE]; -extern u16 gSideAffecting[2]; -extern struct BattlePokemon gBattleMons[MAX_BANKS_BATTLE]; -extern u8 gCritMultiplier; -extern u16 gTrainerBattleOpponent; -extern u8 *BattleAIs[]; - -enum -{ - WEATHER_TYPE_SUN, - WEATHER_TYPE_RAIN, - WEATHER_TYPE_SANDSTORM, - WEATHER_TYPE_HAIL, -}; - -/* -gAIScriptPtr is a pointer to the next battle AI cmd command to read. -when a command finishes processing, gAIScriptPtr is incremented by -the number of bytes that the current command had reserved for arguments -in order to read the next command correctly. refer to battle_ai_scripts.s for the -AI scripts. -*/ -EWRAM_DATA u8 *gAIScriptPtr = NULL; - -static void BattleAICmd_if_random_less_than(void); -static void BattleAICmd_if_random_greater_than(void); -static void BattleAICmd_if_random_equal(void); -static void BattleAICmd_if_random_not_equal(void); -static void BattleAICmd_score(void); -static void BattleAICmd_if_hp_less_than(void); -static void BattleAICmd_if_hp_more_than(void); -static void BattleAICmd_if_hp_equal(void); -static void BattleAICmd_if_hp_not_equal(void); -static void BattleAICmd_if_status(void); -static void BattleAICmd_if_not_status(void); -static void BattleAICmd_if_status2(void); -static void BattleAICmd_if_not_status2(void); -static void BattleAICmd_if_status3(void); -static void BattleAICmd_if_not_status3(void); -static void BattleAICmd_if_status4(void); -static void BattleAICmd_if_not_status4(void); -static void BattleAICmd_if_less_than(void); -static void BattleAICmd_if_more_than(void); -static void BattleAICmd_if_equal(void); -static void BattleAICmd_if_not_equal(void); -static void BattleAICmd_if_less_than_32(void); -static void BattleAICmd_if_more_than_32(void); -static void BattleAICmd_if_equal_32(void); -static void BattleAICmd_if_not_equal_32(void); -static void BattleAICmd_if_move(void); -static void BattleAICmd_if_not_move(void); -static void BattleAICmd_if_in_bytes(void); -static void BattleAICmd_if_not_in_bytes(void); -static void BattleAICmd_if_in_words(void); -static void BattleAICmd_if_not_in_words(void); -static void BattleAICmd_if_user_can_damage(void); -static void BattleAICmd_if_user_cant_damage(void); -static void BattleAICmd_get_turn_count(void); -static void BattleAICmd_get_type(void); -static void BattleAICmd_get_move_power(void); -static void BattleAICmd_is_most_powerful_move(void); -static void BattleAICmd_get_move(void); -static void BattleAICmd_if_arg_equal(void); -static void BattleAICmd_if_arg_not_equal(void); -static void BattleAICmd_if_would_go_first(void); -static void BattleAICmd_if_would_not_go_first(void); -static void BattleAICmd_nullsub_2A(void); -static void BattleAICmd_nullsub_2B(void); -static void BattleAICmd_count_alive_pokemon(void); -static void BattleAICmd_get_considered_move(void); -static void BattleAICmd_get_considered_move_effect(void); -static void BattleAICmd_get_ability(void); -static void BattleAICmd_get_highest_possible_damage(void); -static void BattleAICmd_if_damage_bonus(void); -static void BattleAICmd_nullsub_32(void); -static void BattleAICmd_nullsub_33(void); -static void BattleAICmd_if_status_in_party(void); -static void BattleAICmd_if_status_not_in_party(void); -static void BattleAICmd_get_weather(void); -static void BattleAICmd_if_effect(void); -static void BattleAICmd_if_not_effect(void); -static void BattleAICmd_if_stat_level_less_than(void); -static void BattleAICmd_if_stat_level_more_than(void); -static void BattleAICmd_if_stat_level_equal(void); -static void BattleAICmd_if_stat_level_not_equal(void); -static void BattleAICmd_if_can_faint(void); -static void BattleAICmd_if_cant_faint(void); -static void BattleAICmd_if_has_move(void); -static void BattleAICmd_if_dont_have_move(void); -static void BattleAICmd_if_move_effect(void); -static void BattleAICmd_if_not_move_effect(void); -static void BattleAICmd_if_last_move_did_damage(void); -static void BattleAICmd_if_encored(void); -static void BattleAICmd_flee(void); -static void BattleAICmd_if_random_100(void); -static void BattleAICmd_watch(void); -static void BattleAICmd_get_hold_effect(void); -static void BattleAICmd_get_gender(void); -static void BattleAICmd_is_first_turn(void); -static void BattleAICmd_get_stockpile_count(void); -static void BattleAICmd_is_double_battle(void); -static void BattleAICmd_get_used_item(void); -static void BattleAICmd_get_move_type_from_result(void); -static void BattleAICmd_get_move_power_from_result(void); -static void BattleAICmd_get_move_effect_from_result(void); -static void BattleAICmd_get_protect_count(void); -static void BattleAICmd_nullsub_52(void); -static void BattleAICmd_nullsub_53(void); -static void BattleAICmd_nullsub_54(void); -static void BattleAICmd_nullsub_55(void); -static void BattleAICmd_nullsub_56(void); -static void BattleAICmd_nullsub_57(void); -static void BattleAICmd_call(void); -static void BattleAICmd_jump(void); -static void BattleAICmd_end(void); -static void BattleAICmd_if_level_compare(void); -static void BattleAICmd_if_taunted(void); -static void BattleAICmd_if_not_taunted(void); - -typedef void (*BattleAICmdFunc)(void); - -static const BattleAICmdFunc sBattleAICmdTable[] = -{ - BattleAICmd_if_random_less_than, // 0x0 - BattleAICmd_if_random_greater_than, // 0x1 - BattleAICmd_if_random_equal, // 0x2 - BattleAICmd_if_random_not_equal, // 0x3 - BattleAICmd_score, // 0x4 - BattleAICmd_if_hp_less_than, // 0x5 - BattleAICmd_if_hp_more_than, // 0x6 - BattleAICmd_if_hp_equal, // 0x7 - BattleAICmd_if_hp_not_equal, // 0x8 - BattleAICmd_if_status, // 0x9 - BattleAICmd_if_not_status, // 0xA - BattleAICmd_if_status2, // 0xB - BattleAICmd_if_not_status2, // 0xC - BattleAICmd_if_status3, // 0xD - BattleAICmd_if_not_status3, // 0xE - BattleAICmd_if_status4, // 0xF - BattleAICmd_if_not_status4, // 0x10 - BattleAICmd_if_less_than, // 0x11 - BattleAICmd_if_more_than, // 0x12 - BattleAICmd_if_equal, // 0x13 - BattleAICmd_if_not_equal, // 0x14 - BattleAICmd_if_less_than_32, // 0x15 - BattleAICmd_if_more_than_32, // 0x16 - BattleAICmd_if_equal_32, // 0x17 - BattleAICmd_if_not_equal_32, // 0x18 - BattleAICmd_if_move, // 0x19 - BattleAICmd_if_not_move, // 0x1A - BattleAICmd_if_in_bytes, // 0x1B - BattleAICmd_if_not_in_bytes, // 0x1C - BattleAICmd_if_in_words, // 0x1D - BattleAICmd_if_not_in_words, // 0x1E - BattleAICmd_if_user_can_damage, // 0x1F - BattleAICmd_if_user_cant_damage, // 0x20 - BattleAICmd_get_turn_count, // 0x21 - BattleAICmd_get_type, // 0x22 - BattleAICmd_get_move_power, // 0x23 - BattleAICmd_is_most_powerful_move, // 0x24 - BattleAICmd_get_move, // 0x25 - BattleAICmd_if_arg_equal, // 0x26 - BattleAICmd_if_arg_not_equal, // 0x27 - BattleAICmd_if_would_go_first, // 0x28 - BattleAICmd_if_would_not_go_first, // 0x29 - BattleAICmd_nullsub_2A, // 0x2A - BattleAICmd_nullsub_2B, // 0x2B - BattleAICmd_count_alive_pokemon, // 0x2C - BattleAICmd_get_considered_move, // 0x2D - BattleAICmd_get_considered_move_effect, // 0x2E - BattleAICmd_get_ability, // 0x2F - BattleAICmd_get_highest_possible_damage, // 0x30 - BattleAICmd_if_damage_bonus, // 0x31 - BattleAICmd_nullsub_32, // 0x32 - BattleAICmd_nullsub_33, // 0x33 - BattleAICmd_if_status_in_party, // 0x34 - BattleAICmd_if_status_not_in_party, // 0x35 - BattleAICmd_get_weather, // 0x36 - BattleAICmd_if_effect, // 0x37 - BattleAICmd_if_not_effect, // 0x38 - BattleAICmd_if_stat_level_less_than, // 0x39 - BattleAICmd_if_stat_level_more_than, // 0x3A - BattleAICmd_if_stat_level_equal, // 0x3B - BattleAICmd_if_stat_level_not_equal, // 0x3C - BattleAICmd_if_can_faint, // 0x3D - BattleAICmd_if_cant_faint, // 0x3E - BattleAICmd_if_has_move, // 0x3F - BattleAICmd_if_dont_have_move, // 0x40 - BattleAICmd_if_move_effect, // 0x41 - BattleAICmd_if_not_move_effect, // 0x42 - BattleAICmd_if_last_move_did_damage, // 0x43 - BattleAICmd_if_encored, // 0x44 - BattleAICmd_flee, // 0x45 - BattleAICmd_if_random_100, // 0x46 - BattleAICmd_watch, // 0x47 - BattleAICmd_get_hold_effect, // 0x48 - BattleAICmd_get_gender, // 0x49 - BattleAICmd_is_first_turn, // 0x4A - BattleAICmd_get_stockpile_count, // 0x4B - BattleAICmd_is_double_battle, // 0x4C - BattleAICmd_get_used_item, // 0x4D - BattleAICmd_get_move_type_from_result, // 0x4E - BattleAICmd_get_move_power_from_result, // 0x4F - BattleAICmd_get_move_effect_from_result, // 0x50 - BattleAICmd_get_protect_count, // 0x51 - BattleAICmd_nullsub_52, // 0x52 - BattleAICmd_nullsub_53, // 0x53 - BattleAICmd_nullsub_54, // 0x54 - BattleAICmd_nullsub_55, // 0x55 - BattleAICmd_nullsub_56, // 0x56 - BattleAICmd_nullsub_57, // 0x57 - BattleAICmd_call, // 0x58 - BattleAICmd_jump, // 0x59 - BattleAICmd_end, // 0x5A - BattleAICmd_if_level_compare, // 0x5B - BattleAICmd_if_taunted, // 0x5C - BattleAICmd_if_not_taunted, // 0x5D -}; - -#ifdef NONMATCHING -static -#endif -const u16 sDiscouragedPowerfulMoveEffects[] = -{ - EFFECT_EXPLOSION, - EFFECT_DREAM_EATER, - EFFECT_RAZOR_WIND, - EFFECT_SKY_ATTACK, - EFFECT_RECHARGE, - EFFECT_SKULL_BASH, - EFFECT_SOLARBEAM, - EFFECT_SPIT_UP, - EFFECT_FOCUS_PUNCH, - EFFECT_SUPERPOWER, - EFFECT_ERUPTION, - EFFECT_OVERHEAT, - 0xFFFF -}; - -// if the AI is a Link battle, safari, battle tower, or ereader, it will ignore considering item uses. -void BattleAI_HandleItemUseBeforeAISetup(void) -{ - s32 i; - u8 *data = (u8 *)UNK_2016A00_STRUCT; - - for (i = 0; (u32)i < sizeof(struct UnkBattleStruct1); i++) - data[i] = 0; - - if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && gTrainerBattleOpponent != 0x400 - && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) - { - for (i = 0; i < MAX_TRAINER_ITEMS; i++) - { - if (gTrainers[gTrainerBattleOpponent].items[i] != 0) - { - UNK_2016A00_STRUCT->items[UNK_2016A00_STRUCT->numOfItems] = gTrainers[gTrainerBattleOpponent].items[i]; - UNK_2016A00_STRUCT->numOfItems++; - } - } - } - - BattleAI_SetupAIData(); -} - -void BattleAI_SetupAIData(void) -{ - s32 i; - u8 *data = (u8 *)AI_THINKING_STRUCT; - u8 r7; - - // clear AI data and set default move score to 100. strange that they didn't use memset here. - for (i = 0; (u32)i < sizeof(struct AI_ThinkingStruct); i++) - data[i] = 0; - for (i = 0; i < MAX_MON_MOVES; i++) - AI_THINKING_STRUCT->score[i] = 100; - - r7 = sub_8015A98(gActiveBank, 0, 0xFF); - - // probably sets up the moves to consider and ignores non-valid moves such as NO_MOVE or glitch moves. - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBitTable[i] & r7) - AI_THINKING_STRUCT->score[i] = 0; - - AI_THINKING_STRUCT->simulatedRNG[i] = 100 - (Random() % 16); - } - - // clear AI stack. - AI_STACK->size = 0; - gBankAttacker = gActiveBank; - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - gBankTarget = Random() & 2; // just pick somebody to target. - - if (gAbsentBankFlags & gBitTable[gBankTarget]) - gBankTarget ^= 2; - } - else - gBankTarget = gActiveBank ^ 1; - - // special AI flag cases. - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - AI_THINKING_STRUCT->aiFlags = 0x40000000; - else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) - AI_THINKING_STRUCT->aiFlags = 0x20000000; - else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) - AI_THINKING_STRUCT->aiFlags = 0x80000000; -#ifdef GERMAN - else if (gBattleTypeFlags & 0x900 || gTrainerBattleOpponent == 0x400) - AI_THINKING_STRUCT->aiFlags = 7; -#endif - else // otherwise, just set aiFlags to whatever flags the trainer has set in their data. - AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent].aiFlags; -} - -u8 BattleAI_GetAIActionToUse(void) -{ - u8 currentMoveArray[MAX_MON_MOVES]; - u8 consideredMoveArray[MAX_MON_MOVES]; - u8 numOfBestMoves; - s32 i; - - sub_810745C(); - while (AI_THINKING_STRUCT->aiFlags != 0) - { - if (AI_THINKING_STRUCT->aiFlags & 1) - { - AI_THINKING_STRUCT->aiState = AIState_SettingUp; - BattleAI_DoAIProcessing(); - } - AI_THINKING_STRUCT->aiFlags >>= 1; - AI_THINKING_STRUCT->aiLogicId++; - AI_THINKING_STRUCT->movesetIndex = 0; - } - - // special flee or watch cases for safari. - if (AI_THINKING_STRUCT->aiAction & (AI_ACTION_FLEE)) // flee - return 4; - if (AI_THINKING_STRUCT->aiAction & (AI_ACTION_WATCH)) // watch - return 5; - - numOfBestMoves = 1; - currentMoveArray[0] = AI_THINKING_STRUCT->score[0]; - consideredMoveArray[0] = 0; - - for (i = 1; i < MAX_MON_MOVES; i++) - { - if (currentMoveArray[0] < AI_THINKING_STRUCT->score[i]) - { - numOfBestMoves = 1; - currentMoveArray[0] = AI_THINKING_STRUCT->score[i]; - consideredMoveArray[0] = i; - } - if (currentMoveArray[0] == AI_THINKING_STRUCT->score[i]) - { - currentMoveArray[numOfBestMoves] = AI_THINKING_STRUCT->score[i]; - consideredMoveArray[numOfBestMoves++] = i; - } - } - - return consideredMoveArray[Random() % numOfBestMoves]; // break any ties that exist. -} - -void BattleAI_DoAIProcessing(void) -{ - while (AI_THINKING_STRUCT->aiState != AIState_FinishedProcessing) - { - switch (AI_THINKING_STRUCT->aiState) - { - case AIState_DoNotProcess: //Needed to match. - break; - case AIState_SettingUp: - gAIScriptPtr = BattleAIs[AI_THINKING_STRUCT->aiLogicId]; // set the AI ptr. - if (gBattleMons[gBankAttacker].pp[AI_THINKING_STRUCT->movesetIndex] == 0) - { - AI_THINKING_STRUCT->moveConsidered = MOVE_NONE; // don't consider a move you have 0 PP for, idiot. - } - else - { - AI_THINKING_STRUCT->moveConsidered = gBattleMons[gBankAttacker].moves[AI_THINKING_STRUCT->movesetIndex]; - } - AI_THINKING_STRUCT->aiState++; - break; - case AIState_Processing: - if (AI_THINKING_STRUCT->moveConsidered != MOVE_NONE) - sBattleAICmdTable[*(u8 *)gAIScriptPtr](); // run AI command. - else - { - AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; // definitely do not consider any move that has 0 PP. - AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE; - } - if (AI_THINKING_STRUCT->aiAction & AI_ACTION_DONE) - { - AI_THINKING_STRUCT->movesetIndex++; - if (AI_THINKING_STRUCT->movesetIndex < MAX_MON_MOVES && (AI_THINKING_STRUCT->aiAction & AI_ACTION_DO_NOT_ATTACK) == 0) - AI_THINKING_STRUCT->aiState = AIState_SettingUp; // as long as their are more moves to process, keep setting this to setup state. - else - AI_THINKING_STRUCT->aiState++; // done processing. - AI_THINKING_STRUCT->aiAction &= (AI_ACTION_FLEE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK | - AI_ACTION_UNK5 | AI_ACTION_UNK6 | AI_ACTION_UNK7 | AI_ACTION_UNK8); // disable AI_ACTION_DONE. - } - break; - } - } -} - -void sub_810745C(void) -{ - s32 i; - - for (i = 0; i < 8; i++) - { - if (UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i] == 0) - { - UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i] = gLastUsedMove[gBankTarget]; - return; - } - } -} - -void unref_sub_81074A0(u8 a) -{ - s32 i; - - for (i = 0; i < 8; i++) - UNK_2016A00_STRUCT->movesUsed[a / 2][i] = 0; -} - -void RecordAbilityBattle(u8 a, u8 b) -{ - if (GetBankSide(a) == 0) - UNK_2016A00_STRUCT->unk20[GetBankIdentity(a) & 1] = b; -} - -void RecordItemBattle(u8 a, u8 b) -{ - if (GetBankSide(a) == 0) - UNK_2016A00_STRUCT->unk22[GetBankIdentity(a) & 1] = b; -} - -static void BattleAICmd_if_random_less_than(void) -{ - if (Random() % 256 < gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_random_greater_than(void) -{ - if (Random() % 256 > gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_random_equal(void) -{ - if (Random() % 256 == gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_random_not_equal(void) -{ - if (Random() % 256 != gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_score(void) -{ - AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] += gAIScriptPtr[1]; // add the result to the array of the move consider's score. - - if (AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] < 0) // if the score is negative, flatten it to 0. - AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; - - gAIScriptPtr += 2; // AI return. -} - -static void BattleAICmd_if_hp_less_than(void) -{ - u16 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) < gAIScriptPtr[2]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_hp_more_than(void) -{ - u16 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) > gAIScriptPtr[2]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_hp_equal(void) -{ - u16 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) == gAIScriptPtr[2]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_hp_not_equal(void) -{ - u16 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) != gAIScriptPtr[2]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_status(void) -{ - u16 index; - u32 arg; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg = AIScriptRead32(gAIScriptPtr + 2); - - if ((gBattleMons[index].status1 & arg) != 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_not_status(void) -{ - u16 index; - u32 arg; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg = AIScriptRead32(gAIScriptPtr + 2); - - if ((gBattleMons[index].status1 & arg) == 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_status2(void) -{ - u16 index; - u32 arg; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg = AIScriptRead32(gAIScriptPtr + 2); - - if ((gBattleMons[index].status2 & arg) != 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_not_status2(void) -{ - u16 index; - u32 arg; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg = AIScriptRead32(gAIScriptPtr + 2); - - if ((gBattleMons[index].status2 & arg) == 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_status3(void) -{ - u16 index; - u32 arg; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg = AIScriptRead32(gAIScriptPtr + 2); - - if ((gStatuses3[index] & arg) != 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_not_status3(void) -{ - u16 index; - u32 arg; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg = AIScriptRead32(gAIScriptPtr + 2); - - if ((gStatuses3[index] & arg) == 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_status4(void) -{ - u16 index; - u32 arg1, arg2; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg1 = GetBankIdentity(index) & 1; - arg2 = AIScriptRead32(gAIScriptPtr + 2); - - if ((gSideAffecting[arg1] & arg2) != 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_not_status4(void) -{ - u16 index; - u32 arg1, arg2; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - arg1 = GetBankIdentity(index) & 1; - arg2 = AIScriptRead32(gAIScriptPtr + 2); - - if ((gSideAffecting[arg1] & arg2) == 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); - else - gAIScriptPtr += 10; -} - -static void BattleAICmd_if_less_than(void) -{ - if (AI_THINKING_STRUCT->funcResult < gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_more_than(void) -{ - if (AI_THINKING_STRUCT->funcResult > gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_equal(void) -{ - if (AI_THINKING_STRUCT->funcResult == gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_not_equal(void) -{ - if (AI_THINKING_STRUCT->funcResult != gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_less_than_32(void) -{ - u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); - - if (AI_THINKING_STRUCT->funcResult < *temp) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); - else - gAIScriptPtr += 9; -} - -static void BattleAICmd_if_more_than_32(void) -{ - u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); - - if (AI_THINKING_STRUCT->funcResult > *temp) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); - else - gAIScriptPtr += 9; -} - -static void BattleAICmd_if_equal_32(void) -{ - u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); - - if (AI_THINKING_STRUCT->funcResult == *temp) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); - else - gAIScriptPtr += 9; -} - -static void BattleAICmd_if_not_equal_32(void) -{ - u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); - - if (AI_THINKING_STRUCT->funcResult != *temp) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); - else - gAIScriptPtr += 9; -} - -static void BattleAICmd_if_move(void) -{ - u16 move = AIScriptRead16(gAIScriptPtr + 1); - - if (AI_THINKING_STRUCT->moveConsidered == move) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_not_move(void) -{ - u16 move = AIScriptRead16(gAIScriptPtr + 1); - - if (AI_THINKING_STRUCT->moveConsidered != move) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_in_bytes(void) -{ - u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1); - - while (*ptr != 0xFF) - { - if (AI_THINKING_STRUCT->funcResult == *ptr) - { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); - return; - } - ptr++; - } - gAIScriptPtr += 9; -} - -static void BattleAICmd_if_not_in_bytes(void) -{ - u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1); - - while (*ptr != 0xFF) - { - if (AI_THINKING_STRUCT->funcResult == *ptr) - { - gAIScriptPtr += 9; - return; - } - ptr++; - } - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); -} - -static void BattleAICmd_if_in_words(void) -{ - u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1); - - while (*ptr != 0xFFFF) - { - if (AI_THINKING_STRUCT->funcResult == *ptr) - { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); - return; - } - ptr++; - } - gAIScriptPtr += 9; -} - -static void BattleAICmd_if_not_in_words(void) -{ - u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1); - - while (*ptr != 0xFFFF) - { - if (AI_THINKING_STRUCT->funcResult == *ptr) - { - gAIScriptPtr += 9; - return; - } - ptr++; - } - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); -} - -static void BattleAICmd_if_user_can_damage(void) -{ - s32 i; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBankAttacker].moves[i] != 0 - && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power != 0) - break; - } - if (i == MAX_MON_MOVES) - gAIScriptPtr += 5; - else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); -} - -static void BattleAICmd_if_user_cant_damage(void) -{ - s32 i; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBankAttacker].moves[i] != 0 - && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power != 0) - break; - } - if (i != MAX_MON_MOVES) - gAIScriptPtr += 5; - else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); -} - -static void BattleAICmd_get_turn_count(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleResults.battleTurnCounter; - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_type(void) -{ - switch (gAIScriptPtr[1]) - { - case 1: // player primary type - AI_THINKING_STRUCT->funcResult = gBattleMons[gBankAttacker].type1; - break; - case 0: // enemy primary type - AI_THINKING_STRUCT->funcResult = gBattleMons[gBankTarget].type1; - break; - case 3: // player secondary type - AI_THINKING_STRUCT->funcResult = gBattleMons[gBankAttacker].type2; - break; - case 2: // enemy secondary type - AI_THINKING_STRUCT->funcResult = gBattleMons[gBankTarget].type2; - break; - case 4: // type of move being pointed to - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].type; - break; - } - gAIScriptPtr += 2; -} - -static void BattleAICmd_get_move_power(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power; - gAIScriptPtr += 1; -} - -#ifdef NONMATCHING -static void BattleAICmd_is_most_powerful_move(void) -{ - int i, j; - s32 damages[MAX_MON_MOVES]; - - for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i]) - break; - - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1 - && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) - { - gDynamicBasePower = 0; - ewram[0x1601C] = 0; // why is this a manual array? - ewram[0x1601F] = 1; - gBattleMoveFlags = 0; - gCritMultiplier = 1; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - for (j = 0; sDiscouragedPowerfulMoveEffects[j] != 0xFFFF; j++) - { // _08108276 - if (gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j]) - break; - } - - // _081082BA - if (gBattleMons[gBankAttacker].moves[i] - && sDiscouragedPowerfulMoveEffects[j] == 0xFFFF - && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power > 1) - { - gCurrentMove = gBattleMons[gBankAttacker].moves[i]; - AI_CalcDmg(gBankAttacker, gBankTarget); - TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); - damages[i] = (gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[i]) / 100; - - if (damages[i] == 0) // moves always do at least 1 damage. - damages[i] = 1; - } - else - { - damages[i] = 0; - } - } - - for (i = 0; i < MAX_MON_MOVES; i++) - if (damages[i] > damages[AI_THINKING_STRUCT->movesetIndex]) - break; - - if (i == MAX_MON_MOVES) - AI_THINKING_STRUCT->funcResult = 2; - else - AI_THINKING_STRUCT->funcResult = 1; - } - else - { - AI_THINKING_STRUCT->funcResult = 0; - } - - gAIScriptPtr += 1; -} -#else -__attribute__((naked)) -static void BattleAICmd_is_most_powerful_move(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - movs r3, 0\n\ - ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - ldrh r1, [r0]\n\ - ldr r4, _0810832C @ =0x0000ffff\n\ - ldr r6, _08108330 @ =gBattleMoves\n\ - ldr r5, _08108334 @ =0x02016800\n\ - cmp r1, r4\n\ - beq _0810822E\n\ - ldrh r1, [r5, 0x2]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r2, [r0]\n\ - ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ -_0810821E:\n\ - ldrh r0, [r1]\n\ - cmp r2, r0\n\ - beq _0810822E\n\ - adds r1, 0x2\n\ - adds r3, 0x1\n\ - ldrh r0, [r1]\n\ - cmp r0, r4\n\ - bne _0810821E\n\ -_0810822E:\n\ - ldrh r0, [r5, 0x2]\n\ - lsls r1, r0, 1\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0x1\n\ - bhi _08108240\n\ - b _081083B2\n\ -_08108240:\n\ - lsls r0, r3, 1\n\ - ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - adds r0, r1\n\ - ldrh r3, [r0]\n\ - ldr r0, _0810832C @ =0x0000ffff\n\ - cmp r3, r0\n\ - beq _08108250\n\ - b _081083B2\n\ -_08108250:\n\ - ldr r0, _08108338 @ =gDynamicBasePower\n\ - movs r1, 0\n\ - strh r1, [r0]\n\ - ldr r2, _0810833C @ =0xfffff81c\n\ - adds r0, r5, r2\n\ - strb r1, [r0]\n\ - adds r2, 0x3\n\ - adds r0, r5, r2\n\ - movs r2, 0x1\n\ - strb r2, [r0]\n\ - ldr r0, _08108340 @ =gBattleMoveFlags\n\ - strb r1, [r0]\n\ - ldr r0, _08108344 @ =gCritMultiplier\n\ - strb r2, [r0]\n\ - movs r6, 0\n\ - mov r9, r3\n\ - ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - ldrh r0, [r0]\n\ - str r0, [sp, 0x10]\n\ -_08108276:\n\ - movs r3, 0\n\ - ldr r5, _08108348 @ =gBattleMons\n\ - lsls r4, r6, 1\n\ - ldr r7, _0810834C @ =gBankAttacker\n\ - lsls r1, r6, 2\n\ - mov r8, r1\n\ - adds r2, r6, 0x1\n\ - mov r10, r2\n\ - ldr r0, [sp, 0x10]\n\ - cmp r0, r9\n\ - beq _081082BA\n\ - ldr r2, _08108330 @ =gBattleMoves\n\ - ldrb r1, [r7]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r4, r0\n\ - adds r1, r5, 0\n\ - adds r1, 0xC\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r2, [r0]\n\ - ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ -_081082AA:\n\ - ldrh r0, [r1]\n\ - cmp r2, r0\n\ - beq _081082BA\n\ - adds r1, 0x2\n\ - adds r3, 0x1\n\ - ldrh r0, [r1]\n\ - cmp r0, r9\n\ - bne _081082AA\n\ -_081082BA:\n\ - ldrb r1, [r7]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r4, r0\n\ - adds r1, r5, 0\n\ - adds r1, 0xC\n\ - adds r1, r0, r1\n\ - ldrh r0, [r1]\n\ - cmp r0, 0\n\ - beq _0810835C\n\ - lsls r0, r3, 1\n\ - ldr r2, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - cmp r0, r9\n\ - bne _0810835C\n\ - ldr r0, _08108330 @ =gBattleMoves\n\ - ldrh r2, [r1]\n\ - lsls r1, r2, 1\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0x1\n\ - bls _0810835C\n\ - ldr r5, _08108350 @ =gCurrentMove\n\ - strh r2, [r5]\n\ - ldrb r0, [r7]\n\ - ldr r4, _08108354 @ =gBankTarget\n\ - ldrb r1, [r4]\n\ - bl AI_CalcDmg\n\ - ldrh r0, [r5]\n\ - ldrb r1, [r7]\n\ - ldrb r2, [r4]\n\ - bl TypeCalc\n\ - mov r4, sp\n\ - add r4, r8\n\ - ldr r2, _08108358 @ =gBattleMoveDamage\n\ - ldr r0, _08108334 @ =0x02016800\n\ - adds r0, 0x18\n\ - adds r0, r6, r0\n\ - ldrb r1, [r0]\n\ - ldr r0, [r2]\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - cmp r0, 0\n\ - bne _08108364\n\ - movs r0, 0x1\n\ - str r0, [r4]\n\ - b _08108364\n\ - .align 2, 0\n\ -_08108328: .4byte sDiscouragedPowerfulMoveEffects\n\ -_0810832C: .4byte 0x0000ffff\n\ -_08108330: .4byte gBattleMoves\n\ -_08108334: .4byte 0x02016800\n\ -_08108338: .4byte gDynamicBasePower\n\ -_0810833C: .4byte 0xfffff81c\n\ -_08108340: .4byte gBattleMoveFlags\n\ -_08108344: .4byte gCritMultiplier\n\ -_08108348: .4byte gBattleMons\n\ -_0810834C: .4byte gBankAttacker\n\ -_08108350: .4byte gCurrentMove\n\ -_08108354: .4byte gBankTarget\n\ -_08108358: .4byte gBattleMoveDamage\n\ -_0810835C:\n\ - mov r1, sp\n\ - add r1, r8\n\ - movs r0, 0\n\ - str r0, [r1]\n\ -_08108364:\n\ - mov r6, r10\n\ - cmp r6, 0x3\n\ - ble _08108276\n\ - movs r6, 0\n\ - ldr r1, _081083A4 @ =0x02016800\n\ - ldrb r0, [r1, 0x1]\n\ - lsls r0, 2\n\ - add r0, sp\n\ - ldr r2, [sp]\n\ - ldr r0, [r0]\n\ - adds r5, r1, 0\n\ - ldr r4, _081083A8 @ =gAIScriptPtr\n\ - cmp r2, r0\n\ - bgt _0810839A\n\ - adds r3, r5, 0\n\ - mov r2, sp\n\ -_08108384:\n\ - adds r2, 0x4\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - bgt _0810839A\n\ - ldrb r0, [r3, 0x1]\n\ - lsls r0, 2\n\ - add r0, sp\n\ - ldr r1, [r2]\n\ - ldr r0, [r0]\n\ - cmp r1, r0\n\ - ble _08108384\n\ -_0810839A:\n\ - cmp r6, 0x4\n\ - bne _081083AC\n\ - movs r0, 0x2\n\ - str r0, [r5, 0x8]\n\ - b _081083B8\n\ - .align 2, 0\n\ -_081083A4: .4byte 0x02016800\n\ -_081083A8: .4byte gAIScriptPtr\n\ -_081083AC:\n\ - movs r0, 0x1\n\ - str r0, [r5, 0x8]\n\ - b _081083B8\n\ -_081083B2:\n\ - movs r0, 0\n\ - str r0, [r5, 0x8]\n\ - ldr r4, _081083D0 @ =gAIScriptPtr\n\ -_081083B8:\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - str r0, [r4]\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_081083D0: .4byte gAIScriptPtr\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -static void BattleAICmd_get_move(void) -{ - if (gAIScriptPtr[1] == USER) - AI_THINKING_STRUCT->funcResult = gLastUsedMove[gBankAttacker]; - else - AI_THINKING_STRUCT->funcResult = gLastUsedMove[gBankTarget]; - - gAIScriptPtr += 2; -} - -static void BattleAICmd_if_arg_equal(void) -{ - if (gAIScriptPtr[1] == AI_THINKING_STRUCT->funcResult) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_arg_not_equal(void) -{ - if (gAIScriptPtr[1] != AI_THINKING_STRUCT->funcResult) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_would_go_first(void) -{ - if (b_first_side(gBankAttacker, gBankTarget, 1) == gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_would_not_go_first(void) -{ - if (b_first_side(gBankAttacker, gBankTarget, 1) != gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_nullsub_2A(void) -{ -} - -static void BattleAICmd_nullsub_2B(void) -{ -} - -static void BattleAICmd_count_alive_pokemon(void) -{ - struct Pokemon *party; - int i; - u8 index; - u8 var, var2; - - AI_THINKING_STRUCT->funcResult = 0; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if (GetBankSide(index) == 0) - party = gPlayerParty; - else - party = gEnemyParty; - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - u32 status; - var = gBattlePartyID[index]; - status = GetBankIdentity(index) ^ 2; - var2 = gBattlePartyID[GetBankByPlayerAI(status)]; - } - else - { - var = gBattlePartyID[index]; - var2 = gBattlePartyID[index]; - } - - for (i = 0; i < 6; i++) - { - if (i != var && i != var2 - && GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE - && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) - { - AI_THINKING_STRUCT->funcResult++; - } - } - - gAIScriptPtr += 2; -} - -static void BattleAICmd_get_considered_move(void) -{ - AI_THINKING_STRUCT->funcResult = AI_THINKING_STRUCT->moveConsidered; - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_considered_move_effect(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect; - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_ability(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if (GetBankSide(index) == TARGET) - { - u16 unk = GetBankIdentity(index) & 1; - - if (UNK_2016A00_STRUCT->unk20[unk] != 0) - { - AI_THINKING_STRUCT->funcResult = UNK_2016A00_STRUCT->unk20[unk]; - gAIScriptPtr += 2; - return; - } - - // abilities that prevent fleeing. - if (gBattleMons[index].ability == ABILITY_SHADOW_TAG - || gBattleMons[index].ability == ABILITY_MAGNET_PULL - || gBattleMons[index].ability == ABILITY_ARENA_TRAP) - { - AI_THINKING_STRUCT->funcResult = gBattleMons[index].ability; - gAIScriptPtr += 2; - return; - } - - if (gBaseStats[gBattleMons[index].species].ability1 != ABILITY_NONE) - { - if (gBaseStats[gBattleMons[index].species].ability2 != ABILITY_NONE) - { - // AI has no knowledge of opponent, so it guesses which ability. - if (Random() % 2) - { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1; - } - else - { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2; - } - } - else - { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1; // it's definitely ability 1. - } - } - else - { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability. - } - } - else - { - // The AI knows its own ability. - AI_THINKING_STRUCT->funcResult = gBattleMons[index].ability; - } - gAIScriptPtr += 2; -} - -static void BattleAICmd_get_highest_possible_damage(void) -{ - s32 i; - - gDynamicBasePower = 0; - BATTLE_STRUCT->dynamicMoveType = 0; - BATTLE_STRUCT->dmgMultiplier = 1; - gBattleMoveFlags = 0; - gCritMultiplier = 1; - AI_THINKING_STRUCT->funcResult = 0; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - gBattleMoveDamage = 40; - gCurrentMove = gBattleMons[gBankAttacker].moves[i]; - - if (gCurrentMove) - { - TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); - - // reduce by 1/3. - if (gBattleMoveDamage == 120) - gBattleMoveDamage = 80; - if (gBattleMoveDamage == 240) - gBattleMoveDamage = 160; - if (gBattleMoveDamage == 30) - gBattleMoveDamage = 20; - if (gBattleMoveDamage == 15) - gBattleMoveDamage = 10; - - if (gBattleMoveFlags & 8) // if it's a status move, it wont do anything. - gBattleMoveDamage = 0; - - if (AI_THINKING_STRUCT->funcResult < gBattleMoveDamage) - AI_THINKING_STRUCT->funcResult = gBattleMoveDamage; - } - } - gAIScriptPtr += 1; -} - -static void BattleAICmd_if_damage_bonus(void) -{ - u8 damageVar; - - gDynamicBasePower = 0; - BATTLE_STRUCT->dynamicMoveType = 0; - BATTLE_STRUCT->dmgMultiplier = 1; - gBattleMoveFlags = 0; - gCritMultiplier = 1; - - gBattleMoveDamage = 40; - gCurrentMove = AI_THINKING_STRUCT->moveConsidered; - - TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); - - if (gBattleMoveDamage == 120) - gBattleMoveDamage = 80; - if (gBattleMoveDamage == 240) - gBattleMoveDamage = 160; - if (gBattleMoveDamage == 30) - gBattleMoveDamage = 20; - if (gBattleMoveDamage == 15) - gBattleMoveDamage = 10; - - if (gBattleMoveFlags & 8) - gBattleMoveDamage = 0; - - // store gBattleMoveDamage in a u8 variable because gAIScriptPtr[1] is a u8. - damageVar = gBattleMoveDamage; - - if (damageVar == gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_nullsub_32(void) -{ -} - -static void BattleAICmd_nullsub_33(void) -{ -} - -static void BattleAICmd_if_status_in_party(void) -{ - struct Pokemon *party; - struct Pokemon *partyPtr; - int i; - u32 statusToCompareTo; - - // for whatever reason, game freak put the party pointer into 2 variables instead of 1. it's possible at some point the switch encompassed the whole function and used each respective variable creating largely duplicate code. - switch (gAIScriptPtr[1]) - { - case 1: - party = partyPtr = gEnemyParty; - break; - default: - party = partyPtr = gPlayerParty; - break; - } - - statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2); - - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES); - u16 hp = GetMonData(&party[i], MON_DATA_HP); - u32 status = GetMonData(&party[i], MON_DATA_STATUS); - - if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) - { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); // WHAT. why is this being merged into the above switch - return; - } - } - - gAIScriptPtr += 10; -} - -// bugged, doesnt return properly. also unused -static void BattleAICmd_if_status_not_in_party(void) -{ - struct Pokemon *party; - struct Pokemon *partyPtr; - int i; - u32 statusToCompareTo; - - switch (gAIScriptPtr[1]) - { - case 1: - party = partyPtr = gEnemyParty; - break; - default: - party = partyPtr = gPlayerParty; - break; - } - - statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2); - - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES); - u16 hp = GetMonData(&party[i], MON_DATA_HP); - u32 status = GetMonData(&party[i], MON_DATA_STATUS); - - // everytime the status is found, the AI's logic jumps further and further past its intended destination. this results in a broken AI macro and is probably why it is unused. - if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) - gAIScriptPtr += 10; // doesnt return? - } - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); -} - -static void BattleAICmd_get_weather(void) -{ - if (gBattleWeather & WEATHER_RAIN_ANY) - AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_RAIN; - if (gBattleWeather & WEATHER_SANDSTORM_ANY) - AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_SANDSTORM; - if (gBattleWeather & WEATHER_SUN_ANY) - AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_SUN; - if (gBattleWeather & WEATHER_HAIL) - AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_HAIL; - - gAIScriptPtr += 1; -} - -static void BattleAICmd_if_effect(void) -{ - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_not_effect(void) -{ - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect != gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} - -static void BattleAICmd_if_stat_level_less_than(void) -{ - u32 party; - - if (gAIScriptPtr[1] == USER) - party = gBankAttacker; - else - party = gBankTarget; - - if (gBattleMons[party].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); - else - gAIScriptPtr += 8; -} - -static void BattleAICmd_if_stat_level_more_than(void) -{ - u32 party; - - if (gAIScriptPtr[1] == USER) - party = gBankAttacker; - else - party = gBankTarget; - - if (gBattleMons[party].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); - else - gAIScriptPtr += 8; -} - -static void BattleAICmd_if_stat_level_equal(void) -{ - u32 party; - - if (gAIScriptPtr[1] == USER) - party = gBankAttacker; - else - party = gBankTarget; - - if (gBattleMons[party].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); - else - gAIScriptPtr += 8; -} - -static void BattleAICmd_if_stat_level_not_equal(void) -{ - u32 party; - - if (gAIScriptPtr[1] == USER) - party = gBankAttacker; - else - party = gBankTarget; - - if (gBattleMons[party].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); - else - gAIScriptPtr += 8; -} - -static void BattleAICmd_if_can_faint(void) -{ - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) - { - gAIScriptPtr += 5; - return; - } - - gDynamicBasePower = 0; - BATTLE_STRUCT->dynamicMoveType = 0; - BATTLE_STRUCT->dmgMultiplier = 1; - gBattleMoveFlags = 0; - gCritMultiplier = 1; - gCurrentMove = AI_THINKING_STRUCT->moveConsidered; - AI_CalcDmg(gBankAttacker, gBankTarget); - TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); - - gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; - - // moves always do at least 1 damage. - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - - if (gBattleMons[gBankTarget].hp <= gBattleMoveDamage) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); - else - gAIScriptPtr += 5; -} - -static void BattleAICmd_if_cant_faint(void) -{ - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) - { - gAIScriptPtr += 5; - return; - } - - gDynamicBasePower = 0; - BATTLE_STRUCT->dynamicMoveType = 0; - BATTLE_STRUCT->dmgMultiplier = 1; - gBattleMoveFlags = 0; - gCritMultiplier = 1; - gCurrentMove = AI_THINKING_STRUCT->moveConsidered; - AI_CalcDmg(gBankAttacker, gBankTarget); - TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); - - gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; - - // this macro is missing the damage 0 = 1 assumption. - - if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); - else - gAIScriptPtr += 5; -} - -static void BattleAICmd_if_has_move(void) -{ - int i; - u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2); - - switch (gAIScriptPtr[1]) - { - case 1: - case 3: - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBankAttacker].moves[i] == *temp_ptr) - break; - } - if (i == MAX_MON_MOVES) - gAIScriptPtr += 8; - else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); - break; - case 0: - case 2: - for (i = 0; i < 8; i++) - { - if (UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i] == *temp_ptr) - break; - } - if (i == 8) - gAIScriptPtr += 8; - else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); - break; - } -} - -static void BattleAICmd_if_dont_have_move(void) -{ - int i; - u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2); - - switch (gAIScriptPtr[1]) - { - case 1: - case 3: - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBankAttacker].moves[i] == *temp_ptr) - break; - } - if (i != MAX_MON_MOVES) - gAIScriptPtr += 8; - else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); - break; - case 0: - case 2: - for (i = 0; i < 8; i++) - { - if (UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i] == *temp_ptr) - break; - } - if (i != 8) - gAIScriptPtr += 8; - else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); - break; - } -} - -static void BattleAICmd_if_move_effect(void) -{ - int i; - - switch (gAIScriptPtr[1]) - { - case 1: - case 3: - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBankAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == gAIScriptPtr[2]) - break; - } - if (i != MAX_MON_MOVES) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); - else - gAIScriptPtr += 7; - break; - case 0: - case 2: - for (i = 0; i < 8; i++) - { - if (gBattleMons[gBankAttacker].moves[i] != 0 && gBattleMoves[UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i]].effect == gAIScriptPtr[2]) - break; - } - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); - } -} - -static void BattleAICmd_if_not_move_effect(void) -{ - int i; - - switch (gAIScriptPtr[1]) - { - case 1: - case 3: - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBankAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == gAIScriptPtr[2]) - break; - } - if (i != MAX_MON_MOVES) - gAIScriptPtr += 7; - else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); - break; - case 0: - case 2: - for (i = 0; i < 8; i++) - { - if (UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i] != 0 && gBattleMoves[UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i]].effect == gAIScriptPtr[2]) - break; - } - gAIScriptPtr += 7; - } -} - -static void BattleAICmd_if_last_move_did_damage(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if (gAIScriptPtr[2] == 0) - { - if (gDisableStructs[index].disabledMove == 0) - { - gAIScriptPtr += 7; - return; - } - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); - return; - } - else if (gAIScriptPtr[2] != 1) // ignore the macro if its not 0 or 1. - { - gAIScriptPtr += 7; - return; - } - else if (gDisableStructs[index].encoredMove != 0) - { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); - return; - } - gAIScriptPtr += 7; -} - -static void BattleAICmd_if_encored(void) -{ - switch (gAIScriptPtr[1]) - { - case 0: // _08109348 - if (gDisableStructs[gActiveBank].disabledMove == AI_THINKING_STRUCT->moveConsidered) - { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; - case 1: // _08109370 - if (gDisableStructs[gActiveBank].encoredMove == AI_THINKING_STRUCT->moveConsidered) - { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; - default: - gAIScriptPtr += 6; - return; - } -} - -static void BattleAICmd_flee(void) -{ - AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_FLEE being enabled. -} - -static void BattleAICmd_if_random_100(void) -{ - u8 safariFleeRate = BATTLE_STRUCT->safariFleeRate * 5; // safari flee rate, from 0-20 - - if ((u8)(Random() % 100) < safariFleeRate) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); - else - gAIScriptPtr += 5; -} - -static void BattleAICmd_watch(void) -{ - AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_WATCH being enabled. -} - -static void BattleAICmd_get_hold_effect(void) -{ - u8 index; - u16 status; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - if (GetBankSide(index) == 0) - { - status = (GetBankIdentity(index) & 1); - AI_THINKING_STRUCT->funcResult = UNK_2016A00_STRUCT->unk22[status]; - } - else - AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[index].item); - - gAIScriptPtr += 2; -} - -static void BattleAICmd_get_gender(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[index].species, gBattleMons[index].personality); - - gAIScriptPtr += 2; -} - -static void BattleAICmd_is_first_turn(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - AI_THINKING_STRUCT->funcResult = gDisableStructs[index].isFirstTurn; - - gAIScriptPtr += 2; -} - -static void BattleAICmd_get_stockpile_count(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - AI_THINKING_STRUCT->funcResult = gDisableStructs[index].stockpileCounter; - - gAIScriptPtr += 2; -} - -static void BattleAICmd_is_double_battle(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleTypeFlags & BATTLE_TYPE_DOUBLE; - - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_used_item(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - // this hack and a half matches. whatever. i dont care. someone else fix this mess later. PS: still cant fix this. - AI_THINKING_STRUCT->funcResult = ewram[MULTI_DIM_ARR(index, B_16, 0x160CC)]; - - gAIScriptPtr += 2; -} - -static void BattleAICmd_get_move_type_from_result(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].type; - - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_move_power_from_result(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].power; - - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_move_effect_from_result(void) -{ - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].effect; - - gAIScriptPtr += 1; -} - -static void BattleAICmd_get_protect_count(void) -{ - u8 index; - - if (gAIScriptPtr[1] == USER) - index = gBankAttacker; - else - index = gBankTarget; - - AI_THINKING_STRUCT->funcResult = gDisableStructs[index].protectUses; - - gAIScriptPtr += 2; -} - -static void BattleAICmd_nullsub_52(void) -{ -} - -static void BattleAICmd_nullsub_53(void) -{ -} - -static void BattleAICmd_nullsub_54(void) -{ -} - -static void BattleAICmd_nullsub_55(void) -{ -} - -static void BattleAICmd_nullsub_56(void) -{ -} - -static void BattleAICmd_nullsub_57(void) -{ -} - -static void BattleAICmd_call(void) -{ - AIStackPushVar(gAIScriptPtr + 5); - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); -} - -static void BattleAICmd_jump(void) -{ - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); -} - -static void BattleAICmd_end(void) -{ - if (AIStackPop() == FALSE) - AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE; -} - -static void BattleAICmd_if_level_compare(void) -{ - switch (gAIScriptPtr[1]) - { - case 0: // greater than - if (gBattleMons[gBankAttacker].level > gBattleMons[gBankTarget].level) - { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; - case 1: // less than - if (gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) - { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; - case 2: // equal - if (gBattleMons[gBankAttacker].level == gBattleMons[gBankTarget].level) - { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; - } -} - -static void BattleAICmd_if_taunted(void) -{ - if (gDisableStructs[gBankTarget].tauntTimer1 != 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); - else - gAIScriptPtr += 5; -} - -static void BattleAICmd_if_not_taunted(void) -{ - if (gDisableStructs[gBankTarget].tauntTimer1 == 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); - else - gAIScriptPtr += 5; -} - -void AIStackPushVar(u8 *var) -{ - AI_STACK->ptr[AI_STACK->size++] = var; -} - -// unused -void AIStackPushAIPtr(void) -{ - AI_STACK->ptr[AI_STACK->size++] = gAIScriptPtr; -} - -bool8 AIStackPop(void) -{ - if (AI_STACK->size != 0) - { - --AI_STACK->size; - gAIScriptPtr = AI_STACK->ptr[AI_STACK->size]; - return TRUE; - } - else - return FALSE; -} diff --git a/src/battle_anim.c b/src/battle_anim.c deleted file mode 100644 index 6bd98099a..000000000 --- a/src/battle_anim.c +++ /dev/null @@ -1,2270 +0,0 @@ -#include "global.h" -#include "battle_anim.h" -#include "battle.h" -#include "battle_anim_80CA710.h" -#include "battle_interface.h" -#include "contest.h" -#include "decompress.h" -#include "m4a.h" -#include "main.h" -#include "palette.h" -#include "rom_8077ABC.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" - -// sprites start at 10000 and thus must be subtracted of 10000 to account for the true index. -#define GET_TRUE_SPRITE_INDEX(i) (i - 10000) - -extern u8 unk_2000000[]; -extern u16 gBattlePartyID[4]; -extern u8 gObjectBankIDs[]; -extern u8 gBankAttacker; -extern u8 gBankTarget; -EWRAM_DATA const u8 *gBattleAnimScriptPtr = NULL; -EWRAM_DATA const u8 *gBattleAnimScriptRetAddr = NULL; -EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL; -EWRAM_DATA s8 gAnimFramesToWait = 0; -EWRAM_DATA u8 gAnimScriptActive = FALSE; -EWRAM_DATA u8 gAnimVisualTaskCount = 0; -EWRAM_DATA u8 gAnimSoundTaskCount = 0; -EWRAM_DATA u32 gDisableStructMoveAnim = 0; -EWRAM_DATA u32 gMoveDmgMoveAnim = 0; -EWRAM_DATA u16 gMovePowerMoveAnim = 0; -EWRAM_DATA u8 gHappinessMoveAnim = 0; -EWRAM_DATA u16 gWeatherMoveAnim = 0; -EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0}; -EWRAM_DATA u8 gUnknown_0202F7C4 = 0; -EWRAM_DATA u8 gUnknown_0202F7C5 = 0; -EWRAM_DATA u16 gAnimMoveIndex = 0; // set but unused. -EWRAM_DATA u8 gBattleAnimPlayerMonIndex = 0; -EWRAM_DATA u8 gBattleAnimEnemyMonIndex = 0; -EWRAM_DATA u16 gUnknown_0202F7CA[4] = {0}; -EWRAM_DATA u8 gUnknown_0202F7D2 = 0; -extern u16 gUnknown_030041B4; -extern u16 gUnknown_03004200; -extern u16 gUnknown_03004240; -extern u16 gUnknown_03004244; -extern u16 gUnknown_03004280; -extern u16 gUnknown_03004288; -extern u16 gUnknown_030042C0; -extern u16 gUnknown_030042C4; - -u16 gSoundAnimFramesToWait; -s16 gBattleAnimArgs[8]; -u16 gAnimSpriteIndexArray[8]; - -extern struct MusicPlayerInfo gMPlay_BGM; -extern struct MusicPlayerInfo gMPlay_SE1; -extern struct MusicPlayerInfo gMPlay_SE2; - -extern const u16 gUnknown_081C7160[]; -extern const u8 *const gBattleAnims_Moves[]; -extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; -extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; -extern const struct BattleAnimBackground gBattleAnimBackgroundTable[]; - -static void RunAnimScriptCommand(void); -static void ScriptCmd_loadsprite(void); -static void ScriptCmd_unloadsprite(void); -static void ScriptCmd_sprite(void); -static void ScriptCmd_createtask(void); -static void ScriptCmd_delay(void); -static void ScriptCmd_waitforvisualfinish(void); -static void ScriptCmd_hang1(void); -static void ScriptCmd_hang2(void); -static void ScriptCmd_end(void); -static void ScriptCmd_playse(void); -static void ScriptCmd_monbg(void); -static void sub_8076380(void); -static void task_pA_ma0A_obj_to_bg_pal(u8); -static void ScriptCmd_clearmonbg(void); -static void sub_807672C(u8); -static void ScriptCmd_monbg_22(void); -static void ScriptCmd_clearmonbg_23(void); -static void sub_80769A4(u8); -static void ScriptCmd_setalpha(void); -static void ScriptCmd_setbldcnt(void); -static void ScriptCmd_blendoff(void); -static void ScriptCmd_call(void); -static void ScriptCmd_return(void); -static void ScriptCmd_setvar(void); -static void ScriptCmd_ifelse(void); -static void ScriptCmd_jumpif(void); -static void ScriptCmd_jump(void); -static void ScriptCmd_fadetobg(void); -static void ScriptCmd_fadetobg_25(void); -static void task_p5_load_battle_screen_elements(u8); -static void sub_8076DB8(u16); -static void dp01t_11_3_message_for_player_only(void); -static void ScriptCmd_restorebg(void); -static void ScriptCmd_waitbgfadeout(void); -static void ScriptCmd_waitbgfadein(void); -static void ScriptCmd_changebg(void); -static void ScriptCmd_panse_19(void); -static void ScriptCmd_setpan(void); -static void ScriptCmd_panse_1B(void); -static void c3_08073CEC(u8); -static void ScriptCmd_panse_26(void); -static void ScriptCmd_panse_27(void); -static void ScriptCmd_panse_1C(void); -static void sub_80774FC(u8); -static void ScriptCmd_panse_1D(void); -static void sub_80775CC(u8); -static void ScriptCmd_createtask_1F(void); -static void ScriptCmd_waitsound(void); -static void ScriptCmd_jumpvareq(void); -static void ScriptCmd_jumpunkcond(void); -static void ScriptCmd_monbgprio_28(void); -static void ScriptCmd_monbgprio_29(void); -static void ScriptCmd_monbgprio_2A(void); -static void ScriptCmd_invisible(void); -static void ScriptCmd_visible(void); -static void ScriptCmd_doublebattle_2D(void); -static void ScriptCmd_doublebattle_2E(void); -static void ScriptCmd_stopsound(void); - -static void (*const sScriptCmdTable[])(void) = { - ScriptCmd_loadsprite, - ScriptCmd_unloadsprite, - ScriptCmd_sprite, - ScriptCmd_createtask, - ScriptCmd_delay, - ScriptCmd_waitforvisualfinish, - ScriptCmd_hang1, - ScriptCmd_hang2, - ScriptCmd_end, - ScriptCmd_playse, - ScriptCmd_monbg, - ScriptCmd_clearmonbg, - ScriptCmd_setalpha, - ScriptCmd_blendoff, - ScriptCmd_call, - ScriptCmd_return, - ScriptCmd_setvar, - ScriptCmd_ifelse, - ScriptCmd_jumpif, - ScriptCmd_jump, - ScriptCmd_fadetobg, - ScriptCmd_restorebg, - ScriptCmd_waitbgfadeout, - ScriptCmd_waitbgfadein, - ScriptCmd_changebg, - ScriptCmd_panse_19, - ScriptCmd_setpan, - ScriptCmd_panse_1B, - ScriptCmd_panse_1C, - ScriptCmd_panse_1D, - ScriptCmd_setbldcnt, - ScriptCmd_createtask_1F, - ScriptCmd_waitsound, - ScriptCmd_jumpvareq, - ScriptCmd_monbg_22, - ScriptCmd_clearmonbg_23, - ScriptCmd_jumpunkcond, - ScriptCmd_fadetobg_25, - ScriptCmd_panse_26, - ScriptCmd_panse_27, - ScriptCmd_monbgprio_28, - ScriptCmd_monbgprio_29, - ScriptCmd_monbgprio_2A, - ScriptCmd_invisible, - ScriptCmd_visible, - ScriptCmd_doublebattle_2D, - ScriptCmd_doublebattle_2E, - ScriptCmd_stopsound, -}; - -void battle_anim_clear_some_data(void) -{ - s32 i; - - gAnimFramesToWait = 0; - gAnimScriptActive = FALSE; - gAnimVisualTaskCount = 0; - gAnimSoundTaskCount = 0; - gDisableStructMoveAnim = 0; - gMoveDmgMoveAnim = 0; - gMovePowerMoveAnim = 0; - gHappinessMoveAnim = 0; - - // clear index array. - for (i = 0; i < 8; i++) - gAnimSpriteIndexArray[i] |= 0xFFFF; - - // clear anim args. - for (i = 0; i < 8; i++) - gBattleAnimArgs[i] = 0; - - gMonAnimTaskIdArray[0] = 0xFF; - gMonAnimTaskIdArray[1] = 0xFF; - gUnknown_0202F7C4 = 0; - gUnknown_0202F7C5 = 0; - gAnimMoveIndex = 0; - gBattleAnimPlayerMonIndex = 0; - gBattleAnimEnemyMonIndex = 0; - gUnknown_0202F7D2 = 0; -} - -void ExecuteMoveAnim(u16 move) -{ - gBattleAnimPlayerMonIndex = gBankAttacker; - gBattleAnimEnemyMonIndex = gBankTarget; - DoMoveAnim(gBattleAnims_Moves, move, 1); -} - -void DoMoveAnim(const u8 *const moveAnims[], u16 move, u8 c) -{ - s32 i; - - if (IsContest() == 0) - { - sub_8079E24(); - sub_8043EB4(0); - for (i = 0; i < 4; i++) - { - if (GetBankSide(i) != 0) - gUnknown_0202F7CA[i] = GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_SPECIES); - else - gUnknown_0202F7CA[i] = GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_SPECIES); - } - } - else - { - for (i = 0; i < 4; i++) - gUnknown_0202F7CA[i] = EWRAM_19348; - } - - if (c == 0) - gAnimMoveIndex = 0; - else - gAnimMoveIndex = move; - - for (i = 0; i < 8; i++) - gBattleAnimArgs[i] = 0; - - gMonAnimTaskIdArray[0] = 0xFF; - gMonAnimTaskIdArray[1] = 0xFF; - gBattleAnimScriptPtr = moveAnims[move]; - gAnimScriptActive = TRUE; - gAnimFramesToWait = 0; - gAnimScriptCallback = RunAnimScriptCommand; - - for (i = 0; i < 8; i++) - gAnimSpriteIndexArray[i] |= 0xFFFF; - - if (c != 0) - { - for (i = 0; gUnknown_081C7160[i] != 0xFFFF; i++) - { - if (move == gUnknown_081C7160[i]) - { - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128); - break; - } - } - } - - gUnknown_030042C4 = 0; - gUnknown_03004240 = 0; - gUnknown_03004200 = 0; - gUnknown_03004244 = 0; -} - -void move_anim_8072740(struct Sprite *sprite) -{ - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - gAnimVisualTaskCount--; -} - -void DestroyAnimVisualTask(u8 taskId) -{ - DestroyTask(taskId); - gAnimVisualTaskCount--; -} - -void DestroyAnimSoundTask(u8 taskId) -{ - DestroyTask(taskId); - gAnimSoundTaskCount--; -} - -static void AddSpriteIndex(u16 index) -{ - s32 i; - - for (i = 0; i < 8; i++) - { - if (gAnimSpriteIndexArray[i] == 0xFFFF) - { - gAnimSpriteIndexArray[i] = index; - return; - } - } -} - -static void ClearSpriteIndex(u16 index) -{ - s32 i; - - for (i = 0; i < 8; i++) - { - if (gAnimSpriteIndexArray[i] == index) - { - gAnimSpriteIndexArray[i] |= 0xFFFF; - return; - } - } -} - -static void WaitAnimFrameCount(void) -{ - if (gAnimFramesToWait <= 0) - { - gAnimScriptCallback = RunAnimScriptCommand; - gAnimFramesToWait = 0; - } - else - { - gAnimFramesToWait--; - } -} - -static void RunAnimScriptCommand(void) -{ - do - { - sScriptCmdTable[SCRIPT_READ_8(gBattleAnimScriptPtr)](); - } while (gAnimFramesToWait == 0 && gAnimScriptActive != FALSE); -} - -static void ScriptCmd_loadsprite(void) -{ - u16 index; - - gBattleAnimScriptPtr++; - index = SCRIPT_READ_16(gBattleAnimScriptPtr); - LoadCompressedObjectPic(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]); - LoadCompressedObjectPalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]); - gBattleAnimScriptPtr += 2; - AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); - gAnimFramesToWait = 1; - gAnimScriptCallback = WaitAnimFrameCount; -} - -static void ScriptCmd_unloadsprite(void) -{ - u16 index; - - gBattleAnimScriptPtr++; - index = SCRIPT_READ_16(gBattleAnimScriptPtr); - FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); - FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); - gBattleAnimScriptPtr += 2; - ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); -} - -#ifdef NONMATCHING -static void ScriptCmd_sprite(void) -{ - s32 i; - struct SpriteTemplate *r7; - u8 r4; - u8 r0; - u8 _r0; - u16 r6; - u8 r2; - s8 r1; - - gBattleAnimScriptPtr++; - r7 = (struct SpriteTemplate *)(SCRIPT_READ_32(gBattleAnimScriptPtr)); - gBattleAnimScriptPtr += 4; - r4 = SCRIPT_READ_8(gBattleAnimScriptPtr); - gBattleAnimScriptPtr++; - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr); - gBattleAnimScriptPtr++; - for (i = 0; i < r0; i++) - { - gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); - gBattleAnimScriptPtr += 2; - } - if (r4 & 0x80) - { - r4 ^= 0x80; - if (r4 > 0x3F) - r4 -= 0x40; - else - r4 = -r4; - _r0 = sub_8079E90(gBattleAnimEnemyMonIndex); - r1 = r4; - - } - else - { - //_08075B44 - if (r4 > 0x3F) - r4 -= 0x40; - else - r4 = -r4; - _r0 = sub_8079E90(gBattleAnimPlayerMonIndex); - r1 = r4; - } - r6 = _r0 + r1; - if ((s16)r6 < 3) - r6 = 3; - - r4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2); - r2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3); - CreateSpriteAndAnimate(r7, r4, r2, r6); - gAnimVisualTaskCount++; -} -#else -__attribute__((naked)) -static void ScriptCmd_sprite(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - ldr r5, _08075B2C @ =gBattleAnimScriptPtr\n\ - ldr r1, [r5]\n\ - adds r3, r1, 0x1\n\ - str r3, [r5]\n\ - ldrb r2, [r1, 0x1]\n\ - ldrb r0, [r3, 0x1]\n\ - lsls r0, 8\n\ - adds r2, r0\n\ - ldrb r0, [r3, 0x2]\n\ - lsls r0, 16\n\ - adds r2, r0\n\ - ldrb r0, [r3, 0x3]\n\ - lsls r0, 24\n\ - adds r7, r2, r0\n\ - adds r0, r1, 0x5\n\ - str r0, [r5]\n\ - ldrb r4, [r1, 0x5]\n\ - adds r0, r1, 0x6\n\ - str r0, [r5]\n\ - ldrb r0, [r1, 0x6]\n\ - adds r1, 0x7\n\ - str r1, [r5]\n\ - cmp r0, 0\n\ - beq _08075B14\n\ - adds r6, r5, 0\n\ - ldr r5, _08075B30 @ =gBattleAnimArgs\n\ - adds r3, r0, 0\n\ -_08075AFC:\n\ - ldr r2, [r6]\n\ - ldrb r1, [r2]\n\ - ldrb r0, [r2, 0x1]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - strh r1, [r5]\n\ - adds r2, 0x2\n\ - str r2, [r6]\n\ - adds r5, 0x2\n\ - subs r3, 0x1\n\ - cmp r3, 0\n\ - bne _08075AFC\n\ -_08075B14:\n\ - movs r0, 0x80\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - beq _08075B44\n\ - movs r0, 0x80\n\ - eors r4, r0\n\ - cmp r4, 0x3F\n\ - bls _08075B34\n\ - adds r0, r4, 0\n\ - subs r0, 0x40\n\ - b _08075B36\n\ - .align 2, 0\n\ -_08075B2C: .4byte gBattleAnimScriptPtr\n\ -_08075B30: .4byte gBattleAnimArgs\n\ -_08075B34:\n\ - negs r0, r4\n\ -_08075B36:\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldr r0, _08075B40 @ =gBattleAnimEnemyMonIndex\n\ - b _08075B56\n\ - .align 2, 0\n\ -_08075B40: .4byte gBattleAnimEnemyMonIndex\n\ -_08075B44:\n\ - cmp r4, 0x3F\n\ - bls _08075B4E\n\ - adds r0, r4, 0\n\ - subs r0, 0x40\n\ - b _08075B50\n\ -_08075B4E:\n\ - negs r0, r4\n\ -_08075B50:\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldr r0, _08075BAC @ =gBattleAnimPlayerMonIndex\n\ -_08075B56:\n\ - ldrb r0, [r0]\n\ - bl sub_8079E90\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, r4, 24\n\ - asrs r1, 24\n\ - adds r0, r1\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - lsls r0, r6, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x2\n\ - bgt _08075B74\n\ - movs r6, 0x3\n\ -_08075B74:\n\ - ldr r5, _08075BB0 @ =gBattleAnimEnemyMonIndex\n\ - ldrb r0, [r5]\n\ - movs r1, 0x2\n\ - bl sub_8077ABC\n\ - adds r4, r0, 0\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - ldrb r0, [r5]\n\ - movs r1, 0x3\n\ - bl sub_8077ABC\n\ - adds r2, r0, 0\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - lsls r3, r6, 24\n\ - lsrs r3, 24\n\ - adds r0, r7, 0\n\ - adds r1, r4, 0\n\ - bl CreateSpriteAndAnimate\n\ - ldr r1, _08075BB4 @ =gAnimVisualTaskCount\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08075BAC: .4byte gBattleAnimPlayerMonIndex\n\ -_08075BB0: .4byte gBattleAnimEnemyMonIndex\n\ -_08075BB4: .4byte gAnimVisualTaskCount\n\ - .syntax divided\n"); -} -#endif - -static void ScriptCmd_createtask(void) -{ - TaskFunc taskFunc; - u8 taskPriority; - u8 taskId; - u8 numArgs; - s32 i; - - gBattleAnimScriptPtr++; - taskFunc = (TaskFunc)SCRIPT_READ_32(gBattleAnimScriptPtr); - gBattleAnimScriptPtr += 4; - taskPriority = SCRIPT_READ_8(gBattleAnimScriptPtr); - gBattleAnimScriptPtr++; - numArgs = SCRIPT_READ_8(gBattleAnimScriptPtr); - gBattleAnimScriptPtr++; - - for (i = 0; i < numArgs; i++) - { - gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); - gBattleAnimScriptPtr += 2; - } - - taskId = CreateTask(taskFunc, taskPriority); - taskFunc(taskId); - gAnimVisualTaskCount++; -} - -static void ScriptCmd_delay(void) -{ - gBattleAnimScriptPtr++; - gAnimFramesToWait = SCRIPT_READ_8(gBattleAnimScriptPtr); - if (gAnimFramesToWait == 0) - gAnimFramesToWait = -1; - gBattleAnimScriptPtr++; - gAnimScriptCallback = WaitAnimFrameCount; -} - -// wait for visual tasks to finish. -static void ScriptCmd_waitforvisualfinish(void) -{ - if (gAnimVisualTaskCount == 0) - { - gBattleAnimScriptPtr++; - gAnimFramesToWait = 0; - } - else - { - gAnimFramesToWait = 1; - } -} - -static void ScriptCmd_hang1(void) -{ -} - -static void ScriptCmd_hang2(void) -{ -} - -static void ScriptCmd_end(void) -{ - s32 i; - bool32 continuousAnim = FALSE; - - // keep waiting as long as there is animations to be done. - if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0 - || gMonAnimTaskIdArray[0] != 0xFF || gMonAnimTaskIdArray[1] != 0xFF) - { - gSoundAnimFramesToWait = 0; - gAnimFramesToWait = 1; - return; - } - - // finish the sound effects. - if (IsSEPlaying()) - { - if (++gSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect. - { - gAnimFramesToWait = 1; - return; - } - else - { - m4aMPlayStop(&gMPlay_SE1); - m4aMPlayStop(&gMPlay_SE2); - } - } - - // the SE has halted, so set the SE Frame Counter to 0 and continue. - gSoundAnimFramesToWait = 0; - - for (i = 0; i < 8; i++) - { - if (gAnimSpriteIndexArray[i] != 0xFFFF) - { - FreeSpriteTilesByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); - FreeSpritePaletteByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); - gAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator. - } - } - - if (continuousAnim == FALSE) // may have been used for debug? - { - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); - if (IsContest() == 0) - { - sub_8079E24(); - sub_8043EB4(1); - } - gAnimScriptActive = FALSE; - } -} - -static void ScriptCmd_playse(void) -{ - gBattleAnimScriptPtr++; - PlaySE(SCRIPT_READ_16(gBattleAnimScriptPtr)); - gBattleAnimScriptPtr += 2; -} - -static void ScriptCmd_monbg(void) -{ - u8 r6; - u8 r5; - u8 r0; - u8 r7; - u16 r4; - u8 taskId; - - gBattleAnimScriptPtr++; - r6 = SCRIPT_READ_8(gBattleAnimScriptPtr); - if (r6 == 0) - r6 = 2; - else if (r6 == 1) - r6 = 3; - if (r6 == 0 || r6 == 2) - r5 = gBattleAnimPlayerMonIndex; - else - r5 = gBattleAnimEnemyMonIndex; - if (b_side_obj__get_some_boolean(r5)) - { - r0 = GetBankIdentity(r5); - r0 += 0xFF; - if (r0 <= 1 || IsContest() != 0) - r7 = 0; - else - r7 = 1; - sub_8076034(r5, r7); - r4 = gObjectBankIDs[r5]; - taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10); - gTasks[taskId].data[0] = r4; - gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x; - gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y; - if (r7 == 0) - { - gTasks[taskId].data[3] = gUnknown_030042C0; - gTasks[taskId].data[4] = gUnknown_030041B4; - } - else - { - gTasks[taskId].data[3] = gUnknown_03004288; - gTasks[taskId].data[4] = gUnknown_03004280; - } - gTasks[taskId].data[5] = r7; - gTasks[taskId].data[6] = r5; - gMonAnimTaskIdArray[0] = taskId; - - } - r5 ^= 2; - if (r6 > 1 && b_side_obj__get_some_boolean(r5)) - { - r0 = GetBankIdentity(r5); - r0 += 0xFF; - if (r0 <= 1 || IsContest() != 0) - r7 = 0; - else - r7 = 1; - sub_8076034(r5, r7); - r4 = gObjectBankIDs[r5]; - taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10); - gTasks[taskId].data[0] = r4; - gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x; - gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y; - if (r7 == 0) - { - gTasks[taskId].data[3] = gUnknown_030042C0; - gTasks[taskId].data[4] = gUnknown_030041B4; - } - else - { - gTasks[taskId].data[3] = gUnknown_03004288; - gTasks[taskId].data[4] = gUnknown_03004280; - } - gTasks[taskId].data[5] = r7; - gTasks[taskId].data[6] = r5; - gMonAnimTaskIdArray[1] = taskId; - } - gBattleAnimScriptPtr++; -} - -#ifdef NONMATCHING -bool8 b_side_obj__get_some_boolean(u8 a) -{ - if (IsContest() != 0) - { - if (a == gBattleAnimPlayerMonIndex) - return TRUE; - else - return FALSE; - } - if (sub_8078874(a) == 0) - return FALSE; - if (IsContest() != 0) - return TRUE; // this line wont ever be reached. - if ((EWRAM_17800[a].unk0 & 1) == 0) - return TRUE; - if (gSprites[gObjectBankIDs[a]].invisible) - return FALSE; - return TRUE; -} -#else -__attribute__((naked)) -bool8 b_side_obj__get_some_boolean(u8 a) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - adds r5, r4, 0\n\ - bl IsContest\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08075FDC\n\ - ldr r0, _08075FD8 @ =gBattleAnimPlayerMonIndex\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - beq _0807601C\n\ - b _0807602C\n\ - .align 2, 0\n\ -_08075FD8: .4byte gBattleAnimPlayerMonIndex\n\ -_08075FDC:\n\ - adds r0, r4, 0\n\ - bl sub_8078874\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0807602C\n\ - bl IsContest\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0807601C\n\ - lsls r0, r5, 2\n\ - ldr r1, _08076020 @ =0x02017800\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0807601C\n\ - ldr r2, _08076024 @ =gSprites\n\ - ldr r0, _08076028 @ =gObjectBankIDs\n\ - adds r0, r5, r0\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - adds r0, 0x3E\n\ - ldrb r0, [r0]\n\ - lsls r0, 29\n\ - cmp r0, 0\n\ - blt _0807602C\n\ -_0807601C:\n\ - movs r0, 0x1\n\ - b _0807602E\n\ - .align 2, 0\n\ -_08076020: .4byte 0x02017800\n\ -_08076024: .4byte gSprites\n\ -_08076028: .4byte gObjectBankIDs\n\ -_0807602C:\n\ - movs r0, 0\n\ -_0807602E:\n\ - pop {r4,r5}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} -#endif - -void sub_8076034(u8 a, u8 b) -{ - volatile u8 pointlessZero; - u16 *addr2; - u8 spriteId; - - if (b == 0) - { - struct UnknownStruct2 s; - u8 *addr; - u32 size; - u8 r2; - u16 *addr3; - - sub_8078914(&s); - addr = s.unk0; - size = 0x2000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - pointlessZero = 0; - pointlessZero = 0; - addr2 = (void *)s.unk4; - DmaFill16(3, 0xFF, addr2, 0x1000); - - REG_BG1CNT_BITFIELD.priority = 2; - REG_BG1CNT_BITFIELD.screenSize = 1; - REG_BG1CNT_BITFIELD.areaOverflowMode = 0; - - spriteId = gObjectBankIDs[a]; - gUnknown_030042C0 = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32; - if (IsContest() != 0 && sub_80AEB1C(EWRAM_19348) != 0) - gUnknown_030042C0--; - gUnknown_030041B4 = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32; - gSprites[gObjectBankIDs[a]].invisible = TRUE; - - REG_BG1HOFS = gUnknown_030042C0; - REG_BG1VOFS = gUnknown_030041B4; - - LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, s.unk8 * 16, 32); - addr3 = (u16 *)PLTT + s.unk8 * 16; - DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32); - - if (IsContest() != 0) - r2 = 0; - else - r2 = GetBankIdentity(a); - sub_80E4EF8(0, 0, r2, s.unk8, (u32)s.unk0, (((s32)s.unk4 - VRAM) / 2048), REG_BG1CNT_BITFIELD.charBaseBlock); - if (IsContest() != 0) - sub_8076380(); - } - else - { - u8 *addr; - u32 size; - u16 *addr3; - - addr = (void *)(VRAM + 0x6000); - size = 0x2000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - pointlessZero = 0; - pointlessZero = 0; - addr2 = (void *)(VRAM + 0xF000); - DmaFill32(3, 0, addr2, 0x800); - - REG_BG2CNT_BITFIELD.priority = 2; - REG_BG2CNT_BITFIELD.screenSize = 1; - REG_BG2CNT_BITFIELD.areaOverflowMode = 0; - - spriteId = gObjectBankIDs[a]; - gUnknown_03004288 = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32; - gUnknown_03004280 = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32; - gSprites[gObjectBankIDs[a]].invisible = TRUE; - - REG_BG2HOFS = gUnknown_03004288; - REG_BG2VOFS = gUnknown_03004280; - - LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, 0x90, 32); - addr3 = (void *)(PLTT + 0x120); - DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32); - - sub_80E4EF8(0, 0, GetBankIdentity(a), 9, 0x6000, 0x1E, REG_BG2CNT_BITFIELD.charBaseBlock); - } -} - -static void sub_8076380(void) -{ - int i; - int j; - struct UnknownStruct2 s; - u16 *ptr; - - if (sub_80AEB1C(EWRAM_19348) != 0) - { - sub_8078914(&s); - ptr = s.unk4; - for (i = 0; i < 8; i++) - { - for (j = 0; j < 4; j++) - { - u16 temp = ptr[j + i * 32]; - - ptr[j + i * 32] = ptr[7 - j + i * 32]; - ptr[7 - j + i * 32] = temp; - } - } - for (i = 0; i < 8; i++) - { - for (j = 0; j < 8; j++) - ptr[j + i * 32] ^= 0x400; - } - } -} - -void sub_80763FC(u16 a, u16 *b, u32 c, u8 d) -{ - u8 i; - u8 j; - u32 r9; - - if (d == 0) - r9 = 32; - else - r9 = 64; - a <<= 12; - for (i = 0; i < r9; i++) - { - for (j = 0; j < 32; j++) - b[j + i * 32] = ((b[j + i * 32] & 0xFFF) | a) + c; - } -} - -void sub_8076464(u8 a) -{ - u8 *addr; - u32 size; - volatile u8 pointlessZero; - struct UnknownStruct2 s; - - sub_8078914(&s); - if (a == 0 || IsContest() != 0) - { - u16 *addr2; - - addr = s.unk0; - size = 0x2000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - pointlessZero = 0; - pointlessZero = 0; - addr2 = s.unk4; - DmaFill32(3, 0, addr2, 0x800); - gUnknown_030042C0 = 0; - gUnknown_030041B4 = 0; - } - else - { - u16 *addr2; - - addr = (void *)(VRAM + 0x6000); - size = 0x2000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - pointlessZero = 0; - pointlessZero = 0; - addr2 = (void *)(VRAM + 0xF000); - DmaFill32(3, 0, addr2, 0x800); - gUnknown_03004288 = 0; - gUnknown_03004280 = 0; - } -} - -static void task_pA_ma0A_obj_to_bg_pal(u8 taskId) -{ - u8 r4; - u8 r6; - s16 r3; - s16 r2; - struct UnknownStruct2 s; - - r4 = gTasks[taskId].data[0]; - r6 = gTasks[taskId].data[6]; - sub_8078914(&s); - r3 = gTasks[taskId].data[1] - (gSprites[r4].pos1.x + gSprites[r4].pos2.x); - r2 = gTasks[taskId].data[2] - (gSprites[r4].pos1.y + gSprites[r4].pos2.y); - if (gTasks[taskId].data[5] == 0) - { - u16 *src; - u16 *dst; - - gUnknown_030042C0 = r3 + gTasks[taskId].data[3]; - gUnknown_030041B4 = r2 + gTasks[taskId].data[4]; - src = gPlttBufferFaded + 0x100 + r6 * 16; - dst = gPlttBufferFaded + 0x100 + s.unk8 * 16 - 256; - DmaCopy32(3, src, dst, 32); - } - else - { - u16 *src; - u16 *dst; - - gUnknown_03004288 = r3 + gTasks[taskId].data[3]; - gUnknown_03004280 = r2 + gTasks[taskId].data[4]; - src = gPlttBufferFaded + 0x100 + r6 * 16; - dst = gPlttBufferFaded + 0x100 - 112; - DmaCopy32(3, src, dst, 32); - } -} - -static void ScriptCmd_clearmonbg(void) -{ - u8 r4; - u8 r5; - u8 taskId; - - gBattleAnimScriptPtr++; - r4 = SCRIPT_READ_8(gBattleAnimScriptPtr); - if (r4 == 0) - r4 = 2; - else if (r4 == 1) - r4 = 3; - if (r4 == 0 || r4 == 2) - r5 = gBattleAnimPlayerMonIndex; - else - r5 = gBattleAnimEnemyMonIndex; - if (gMonAnimTaskIdArray[0] != 0xFF) - gSprites[gObjectBankIDs[r5]].invisible = FALSE; - if (r4 > 1 && gMonAnimTaskIdArray[1] != 0xFF) - gSprites[gObjectBankIDs[r5 ^ 2]].invisible = FALSE; - else - r4 = 0; - taskId = CreateTask(sub_807672C, 5); - gTasks[taskId].data[0] = r4; - gTasks[taskId].data[2] = r5; - gBattleAnimScriptPtr++; -} - -static void sub_807672C(u8 taskId) -{ - u8 var; - u8 r4; - - gTasks[taskId].data[1]++; - if (gTasks[taskId].data[1] != 1) - { - var = GetBankIdentity(gTasks[taskId].data[2]); - var += 0xFF; - if (var <= 1 || IsContest() != 0) - r4 = 0; - else - r4 = 1; - if (gMonAnimTaskIdArray[0] != 0xFF) - { - sub_8076464(r4); - DestroyTask(gMonAnimTaskIdArray[0]); - gMonAnimTaskIdArray[0] = 0xFF; - } - if (gTasks[taskId].data[0] > 1) - { - sub_8076464(r4 ^ 1); - DestroyTask(gMonAnimTaskIdArray[1]); - gMonAnimTaskIdArray[1] = 0xFF; - } - DestroyTask(taskId); - } -} - -static void ScriptCmd_monbg_22(void) -{ - u8 r5; - u8 r4; - u8 r0; - u8 r1; - - gBattleAnimScriptPtr++; - r5 = SCRIPT_READ_8(gBattleAnimScriptPtr); - if (r5 == 0) - r5 = 2; - else if (r5 == 1) - r5 = 3; - if (r5 == 0 || r5 == 2) - r4 = gBattleAnimPlayerMonIndex; - else - r4 = gBattleAnimEnemyMonIndex; - if (b_side_obj__get_some_boolean(r4)) - { - r0 = GetBankIdentity(r4); - r0 += 0xFF; - if (r0 <= 1 || IsContest() != 0) - r1 = 0; - else - r1 = 1; - sub_8076034(r4, r1); - gSprites[gObjectBankIDs[r4]].invisible = FALSE; - } - r4 ^= 2; - if (r5 > 1 && b_side_obj__get_some_boolean(r4)) - { - r0 = GetBankIdentity(r4); - r0 += 0xFF; - if (r0 <= 1 || IsContest() != 0) - r1 = 0; - else - r1 = 1; - sub_8076034(r4, r1); - gSprites[gObjectBankIDs[r4]].invisible = FALSE; - } - gBattleAnimScriptPtr++; -} - -static void ScriptCmd_clearmonbg_23(void) -{ - u8 r5; - u8 r6; - u8 taskId; - - gBattleAnimScriptPtr++; - r5 = SCRIPT_READ_8(gBattleAnimScriptPtr); - if (r5 == 0) - r5 = 2; - else if (r5 == 1) - r5 = 3; - if (r5 == 0 || r5 == 2) - r6 = gBattleAnimPlayerMonIndex; - else - r6 = gBattleAnimEnemyMonIndex; - if (b_side_obj__get_some_boolean(r6)) - gSprites[gObjectBankIDs[r6]].invisible = FALSE; - if (r5 > 1 && b_side_obj__get_some_boolean(r6 ^ 2)) - gSprites[gObjectBankIDs[r6 ^ 2]].invisible = FALSE; - else - r5 = 0; - taskId = CreateTask(sub_80769A4, 5); - gTasks[taskId].data[0] = r5; - gTasks[taskId].data[2] = r6; - gBattleAnimScriptPtr++; -} - -static void sub_80769A4(u8 taskId) -{ - u8 r0; - u8 r4; - u8 r5; - - gTasks[taskId].data[1]++; - if (gTasks[taskId].data[1] != 1) - { - r4 = gTasks[taskId].data[2]; - r0 = GetBankIdentity(r4); - r0 += 0xFF; - if (r0 <= 1 || IsContest() != 0) - r5 = 0; - else - r5 = 1; - if (b_side_obj__get_some_boolean(r4)) - sub_8076464(r5); - if (gTasks[taskId].data[0] > 1 && b_side_obj__get_some_boolean(r4 ^ 2)) - sub_8076464(r5 ^ 1); - DestroyTask(taskId); - } -} - -static void ScriptCmd_setalpha(void) -{ - u16 r3; - u16 r1; - - gBattleAnimScriptPtr++; - r3 = *(gBattleAnimScriptPtr++); - r1 = *(gBattleAnimScriptPtr++) << 8; - REG_BLDCNT = 0x3F40; - REG_BLDALPHA = r3 | r1; -} - -static void ScriptCmd_setbldcnt(void) -{ - u16 r3; - u16 r1; - - gBattleAnimScriptPtr++; - r3 = *(gBattleAnimScriptPtr++); - r1 = *(gBattleAnimScriptPtr++) << 8; - REG_BLDCNT = r3 | r1; -} - -static void ScriptCmd_blendoff(void) -{ - gBattleAnimScriptPtr++; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; -} - -static void ScriptCmd_call(void) -{ - u32 addr; - - gBattleAnimScriptPtr++; - gBattleAnimScriptRetAddr = gBattleAnimScriptPtr + 4; - addr = SCRIPT_READ_32(gBattleAnimScriptPtr); - gBattleAnimScriptPtr = (u8 *)addr; -} - -static void ScriptCmd_return(void) -{ - gBattleAnimScriptPtr = gBattleAnimScriptRetAddr; -} - -static void ScriptCmd_setvar(void) -{ - const u8 *addr = gBattleAnimScriptPtr; - u16 r4; - u8 r2; - - gBattleAnimScriptPtr++; - r2 = SCRIPT_READ_8(gBattleAnimScriptPtr); - gBattleAnimScriptPtr++; - r4 = SCRIPT_READ_16(gBattleAnimScriptPtr); - gBattleAnimScriptPtr = addr + 4; - gBattleAnimArgs[r2] = r4; -} - -static void ScriptCmd_ifelse(void) -{ - u32 addr; - - gBattleAnimScriptPtr++; - if (gUnknown_0202F7C4 & 1) - gBattleAnimScriptPtr += 4; - addr = SCRIPT_READ_32(gBattleAnimScriptPtr); - gBattleAnimScriptPtr = (u8 *)addr; -} - -static void ScriptCmd_jumpif(void) -{ - u8 r1; - u32 addr; - - gBattleAnimScriptPtr++; - r1 = SCRIPT_READ_8(gBattleAnimScriptPtr); - gBattleAnimScriptPtr++; - if (r1 == gUnknown_0202F7C4) - { - addr = SCRIPT_READ_32(gBattleAnimScriptPtr); - gBattleAnimScriptPtr = (u8 *)addr; - } - else - { - gBattleAnimScriptPtr += 4; - } -} - -static void ScriptCmd_jump(void) -{ - u32 addr; - - gBattleAnimScriptPtr++; - addr = SCRIPT_READ_32(gBattleAnimScriptPtr); - gBattleAnimScriptPtr = (u8 *)addr; -} - -// Uses of this function that rely on a TRUE return are expecting inBattle to not be ticked as defined in contest behavior. As a result, if misused, this function cannot reliably discern between field and contest status and could result in undefined behavior. -bool8 IsContest(void) -{ - if (!gMain.inBattle) - return TRUE; - else - return FALSE; -} - -static void ScriptCmd_fadetobg(void) -{ - u8 r4; - u8 taskId; - - gBattleAnimScriptPtr++; - r4 = SCRIPT_READ_8(gBattleAnimScriptPtr); - gBattleAnimScriptPtr++; - taskId = CreateTask(task_p5_load_battle_screen_elements, 5); - gTasks[taskId].data[0] = r4; - gUnknown_0202F7C5 = 1; -} - -static void ScriptCmd_fadetobg_25(void) -{ - u8 r8; - u8 r7; - u8 r6; - u8 taskId; - - gBattleAnimScriptPtr++; - r8 = gBattleAnimScriptPtr[0]; - r7 = gBattleAnimScriptPtr[1]; - r6 = gBattleAnimScriptPtr[2]; - gBattleAnimScriptPtr += 3; - taskId = CreateTask(task_p5_load_battle_screen_elements, 5); - if (IsContest() != 0) - gTasks[taskId].data[0] = r6; - else if (GetBankSide(gBattleAnimEnemyMonIndex) == 0) - gTasks[taskId].data[0] = r7; - else - gTasks[taskId].data[0] = r8; - gUnknown_0202F7C5 = 1; -} - -static void task_p5_load_battle_screen_elements(u8 taskId) -{ - if (gTasks[taskId].data[10] == 0) - { - BeginHardwarePaletteFade(0xE8, 0, 0, 16, 0); - gTasks[taskId].data[10]++; - return; - } - if (gPaletteFade.active) - return; - if (gTasks[taskId].data[10] == 1) - { - gTasks[taskId].data[10]++; - gUnknown_0202F7C5 = 2; - } - else if (gTasks[taskId].data[10] == 2) - { - s16 data0 = (u16)gTasks[taskId].data[0]; - - if (data0 == -1) - dp01t_11_3_message_for_player_only(); - else - sub_8076DB8(data0); - BeginHardwarePaletteFade(0xE8, 0, 16, 0, 1); - gTasks[taskId].data[10]++; - return; - } - if (gPaletteFade.active) - return; - if (gTasks[taskId].data[10] == 3) - { - DestroyTask(taskId); - gUnknown_0202F7C5 = 0; - } -} - -static void sub_8076DB8(u16 a) -{ - if (IsContest()) - { - void *tilemap = gBattleAnimBackgroundTable[a].tilemap; - void *dmaSrc; - void *dmaDest; - - sub_800D238(tilemap, IsContest() ? EWRAM_14800 : EWRAM_18000); - sub_80763FC(sub_80789BC(), IsContest() ? EWRAM_14800 : EWRAM_18000, 0x100, 0); - dmaSrc = IsContest() ? EWRAM_14800 : EWRAM_18000; - dmaDest = (void *)(VRAM + 0xD000); - DmaCopy32(3, dmaSrc, dmaDest, 0x800); - LZDecompressVram(gBattleAnimBackgroundTable[a].image, (void *)(VRAM + 0x2000)); - LoadCompressedPalette(gBattleAnimBackgroundTable[a].palette, sub_80789BC() * 16, 32); - } - else - { - LZDecompressVram(gBattleAnimBackgroundTable[a].tilemap, (void *)(VRAM + 0xD000)); - LZDecompressVram(gBattleAnimBackgroundTable[a].image, (void *)(VRAM + 0x8000)); - LoadCompressedPalette(gBattleAnimBackgroundTable[a].palette, 32, 32); - } -} - -static void dp01t_11_3_message_for_player_only(void) -{ - if (IsContest()) - sub_80AB2AC(); - else - sub_800D7B8(); -} - -static void ScriptCmd_restorebg(void) -{ - u8 taskId; - - gBattleAnimScriptPtr++; - taskId = CreateTask(task_p5_load_battle_screen_elements, 5); - gTasks[taskId].data[0] = 0xFFFF; - gUnknown_0202F7C5 = 1; -} - -static void ScriptCmd_waitbgfadeout(void) -{ - if (gUnknown_0202F7C5 == 2) - { - gBattleAnimScriptPtr++; - gAnimFramesToWait = 0; - } - else - { - gAnimFramesToWait = 1; - } -} - -static void ScriptCmd_waitbgfadein(void) -{ - if (gUnknown_0202F7C5 == 0) - { - gBattleAnimScriptPtr++; - gAnimFramesToWait = 0; - } - else - { - gAnimFramesToWait = 1; - } -} - -static void ScriptCmd_changebg(void) -{ - gBattleAnimScriptPtr++; - sub_8076DB8(SCRIPT_READ_8(gBattleAnimScriptPtr)); - gBattleAnimScriptPtr++; -} - -//Weird control flow -/* -s8 sub_8076F98(s8 a) -{ - if (!IsContest() && (EWRAM_17810[gBattleAnimPlayerMonIndex].unk0 & 0x10)) - { - a = GetBankSide(gBattleAnimPlayerMonIndex) ? 0xC0 : 0x3F; - } - //_08076FDC - else - { - if (IsContest()) - { - if (gBattleAnimPlayerMonIndex == gBattleAnimEnemyMonIndex && gBattleAnimPlayerMonIndex == 2 - && a == 0x3F) - { - //jump to _0807707A - if (a < -0x40) - a = 0xC0; - return a; - } - } - //_08077004 - else - { - if (GetBankSide(gBattleAnimPlayerMonIndex) == 0) - { - if (GetBankSide(gBattleAnimEnemyMonIndex) == 0) - } - //_08077042 - else - { - - } - //_0807706C - } - } - //_0807706E -} -*/ -__attribute__((naked)) -s8 sub_8076F98(s8 a) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - bl IsContest\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08076FDC\n\ - ldr r0, _08076FD4 @ =gBattleAnimPlayerMonIndex\n\ - ldrb r2, [r0]\n\ - lsls r0, r2, 1\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - ldr r1, _08076FD8 @ =0x02017810\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08076FDC\n\ - adds r0, r2, 0\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - movs r4, 0xC0\n\ - cmp r0, 0\n\ - beq _0807706E\n\ - movs r4, 0x3F\n\ - b _0807706E\n\ - .align 2, 0\n\ -_08076FD4: .4byte gBattleAnimPlayerMonIndex\n\ -_08076FD8: .4byte 0x02017810\n\ -_08076FDC:\n\ - bl IsContest\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08077004\n\ - ldr r0, _08076FFC @ =gBattleAnimPlayerMonIndex\n\ - ldr r1, _08077000 @ =gBattleAnimEnemyMonIndex\n\ - ldrb r0, [r0]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bne _08077068\n\ - cmp r0, 0x2\n\ - bne _08077068\n\ - cmp r4, 0x3F\n\ - beq _0807707A\n\ - b _08077068\n\ - .align 2, 0\n\ -_08076FFC: .4byte gBattleAnimPlayerMonIndex\n\ -_08077000: .4byte gBattleAnimEnemyMonIndex\n\ -_08077004:\n\ - ldr r0, _0807702C @ =gBattleAnimPlayerMonIndex\n\ - ldrb r0, [r0]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08077042\n\ - ldr r0, _08077030 @ =gBattleAnimEnemyMonIndex\n\ - ldrb r0, [r0]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0807706E\n\ - lsls r0, r4, 24\n\ - asrs r1, r0, 24\n\ - cmp r1, 0x3F\n\ - bne _08077034\n\ - movs r4, 0xC0\n\ - b _0807706E\n\ - .align 2, 0\n\ -_0807702C: .4byte gBattleAnimPlayerMonIndex\n\ -_08077030: .4byte gBattleAnimEnemyMonIndex\n\ -_08077034:\n\ - movs r0, 0x40\n\ - negs r0, r0\n\ - cmp r1, r0\n\ - beq _0807706E\n\ - negs r0, r1\n\ - lsls r0, 24\n\ - b _0807706C\n\ -_08077042:\n\ - ldr r0, _08077064 @ =gBattleAnimEnemyMonIndex\n\ - ldrb r0, [r0]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _08077068\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - movs r1, 0x40\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bne _0807706E\n\ - movs r4, 0x3F\n\ - b _0807706E\n\ - .align 2, 0\n\ -_08077064: .4byte gBattleAnimEnemyMonIndex\n\ -_08077068:\n\ - lsls r0, r4, 24\n\ - negs r0, r0\n\ -_0807706C:\n\ - lsrs r4, r0, 24\n\ -_0807706E:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3F\n\ - ble _0807707A\n\ - movs r4, 0x3F\n\ - b _08077088\n\ -_0807707A:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - movs r1, 0x40\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _08077088\n\ - movs r4, 0xC0\n\ -_08077088:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} - -s8 sub_8077094(s8 a) -{ - if (!IsContest() && (EWRAM_17810[gBattleAnimPlayerMonIndex].unk0 & 0x10)) - { - if (GetBankSide(gBattleAnimPlayerMonIndex) != 0) - a = 0x3F; - else - a = 0xC0; - } - else - { - if (GetBankSide(gBattleAnimPlayerMonIndex) != 0 || IsContest() != 0) - a = -a; - } - return a; -} - -s16 sub_8077104(s16 a) -{ - s16 var = a; - - if (var > 63) - var = 63; - else if (var < -64) - var = -64; - return var; -} - -s16 sub_807712C(s16 a, s16 b, s16 c) -{ - u16 var; - - if (a < b) - var = ((c < 0) ? -c : c); - else if (a > b) - var = -((c < 0) ? -c : c); - else - var = 0; - return var; -} - -static void ScriptCmd_panse_19(void) -{ - u16 r4; - s8 r0; - - gBattleAnimScriptPtr++; - r4 = SCRIPT_READ_16(gBattleAnimScriptPtr); - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); - PlaySE12WithPanning(r4, sub_8076F98(r0)); - gBattleAnimScriptPtr += 3; -} - -static void ScriptCmd_setpan(void) -{ - s8 r0; - - gBattleAnimScriptPtr++; - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr); - SE12PanpotControl(sub_8076F98(r0)); - gBattleAnimScriptPtr++; -} - -static void ScriptCmd_panse_1B(void) -{ - u16 songNum; - s8 r0; - s8 r4; - s8 r6; - u8 r7; - s8 panning; - s8 r8; - u8 taskId; - - gBattleAnimScriptPtr++; - songNum = SCRIPT_READ_16(gBattleAnimScriptPtr); - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); - r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); - r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4); - r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5); - panning = sub_8076F98(r0); - r8 = sub_8076F98(r4); - r4 = sub_807712C(panning, r8, r6); - taskId = CreateTask(c3_08073CEC, 1); - gTasks[taskId].data[0] = panning; - gTasks[taskId].data[1] = r8; - gTasks[taskId].data[2] = r4; - gTasks[taskId].data[3] = r7; - gTasks[taskId].data[4] = panning; - PlaySE12WithPanning(songNum, panning); - gAnimSoundTaskCount++; - gBattleAnimScriptPtr += 6; -} - -#ifdef NONMATCHING -static void c3_08073CEC(u8 taskId) -{ - u16 r7 = 0; - s16 r0; - s16 r6; - s16 r3; - s16 r4; - int foo; - - r0 = gTasks[taskId].data[8]; - gTasks[taskId].data[8]++; - if (r0 >= gTasks[taskId].data[3]) - { - gTasks[taskId].data[8] = r7; - r6 = gTasks[taskId].data[0]; - r3 = gTasks[taskId].data[1]; - foo = gTasks[taskId].data[4] + gTasks[taskId].data[2]; - r4 = foo; - gTasks[taskId].data[4] = r4; - if (gTasks[taskId].data[2] == 0) - { - r4 = r3; - DestroyTask(taskId); - gAnimSoundTaskCount--; - } - //_080772D8 - else - { - if (r6 < r3) - { - if (r4 < r3) - goto check; - DestroyTask(taskId); - gAnimSoundTaskCount--; - } - else - { - if (r4 <= r3) - r7 = 1; - check: - if (r7 != 0) - { - DestroyTask(taskId); - gAnimSoundTaskCount--; - } - } - } - //_080772F8 - SE12PanpotControl(r4); - } - //_08077314 -} -#else -__attribute__((naked)) -static void c3_08073CEC(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - movs r7, 0\n\ - ldr r1, _080772D4 @ =gTasks\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r2, r0, r1\n\ - ldrh r0, [r2, 0x18]\n\ - adds r1, r0, 0x1\n\ - strh r1, [r2, 0x18]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - movs r3, 0xE\n\ - ldrsh r1, [r2, r3]\n\ - cmp r0, r1\n\ - blt _08077314\n\ - strh r7, [r2, 0x18]\n\ - ldrh r6, [r2, 0x8]\n\ - ldrh r3, [r2, 0xA]\n\ - movs r4, 0x10\n\ - ldrsh r0, [r2, r4]\n\ - movs r4, 0xC\n\ - ldrsh r1, [r2, r4]\n\ - adds r0, r1\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - strh r4, [r2, 0x10]\n\ - cmp r1, 0\n\ - bne _080772D8\n\ - lsls r2, r3, 16\n\ - b _080772FC\n\ - .align 2, 0\n\ -_080772D4: .4byte gTasks\n\ -_080772D8:\n\ - lsls r1, r6, 16\n\ - lsls r0, r3, 16\n\ - asrs r3, r0, 16\n\ - adds r2, r0, 0\n\ - cmp r1, r2\n\ - bge _080772EE\n\ - lsls r0, r4, 16\n\ - asrs r0, 16\n\ - cmp r0, r3\n\ - blt _080772F8\n\ - b _080772FC\n\ -_080772EE:\n\ - lsls r0, r4, 16\n\ - asrs r0, 16\n\ - cmp r0, r3\n\ - bgt _080772F8\n\ - movs r7, 0x1\n\ -_080772F8:\n\ - cmp r7, 0\n\ - beq _0807730C\n\ -_080772FC:\n\ - lsrs r4, r2, 16\n\ - adds r0, r5, 0\n\ - bl DestroyTask\n\ - ldr r1, _0807731C @ =gAnimSoundTaskCount\n\ - ldrb r0, [r1]\n\ - subs r0, 0x1\n\ - strb r0, [r1]\n\ -_0807730C:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - bl SE12PanpotControl\n\ -_08077314:\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0807731C: .4byte gAnimSoundTaskCount\n\ - .syntax divided\n"); -} -#endif - -static void ScriptCmd_panse_26(void) -{ - u16 r8; - s8 r4; - s8 r5; - s8 r6; - u8 r10; - u8 taskId; - - gBattleAnimScriptPtr++; - r8 = SCRIPT_READ_16(gBattleAnimScriptPtr); - r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); - r5 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); - r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4); - r10 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5); - taskId = CreateTask(c3_08073CEC, 1); - gTasks[taskId].data[0] = r4; - gTasks[taskId].data[1] = r5; - gTasks[taskId].data[2] = r6; - gTasks[taskId].data[3] = r10; - gTasks[taskId].data[4] = r4; - PlaySE12WithPanning(r8, r4); - gAnimSoundTaskCount++; - gBattleAnimScriptPtr += 6; -} - -static void ScriptCmd_panse_27(void) -{ - u16 r9; - u8 r4; - u8 r8; - u8 r7; - u8 r0; - s8 r6; - s8 r5; - s8 r4_2; - u8 taskId; - - gBattleAnimScriptPtr++; - r9 = SCRIPT_READ_16(gBattleAnimScriptPtr); - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); - r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); - r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4); - r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5); - r6 = sub_8077094(r0); - r5 = sub_8077094(r4); - r4_2 = sub_8077094(r8); - taskId = CreateTask(c3_08073CEC, 1); - gTasks[taskId].data[0] = r6; - gTasks[taskId].data[1] = r5; - gTasks[taskId].data[2] = r4_2; - gTasks[taskId].data[3] = r7; - gTasks[taskId].data[4] = r6; - PlaySE12WithPanning(r9, r6); - gAnimSoundTaskCount++; - gBattleAnimScriptPtr += 6; -} - -static void ScriptCmd_panse_1C(void) -{ - u16 r5; - u8 r0; - u8 r8; - u8 r9; - s8 r4; - u8 taskId; - - gBattleAnimScriptPtr++; - r5 = SCRIPT_READ_16(gBattleAnimScriptPtr); - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); - r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); - r9 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4); - r4 = sub_8076F98(r0); - taskId = CreateTask(sub_80774FC, 1); - gTasks[taskId].data[0] = r5; - gTasks[taskId].data[1] = r4; - gTasks[taskId].data[2] = r8; - gTasks[taskId].data[3] = r9; - gTasks[taskId].data[8] = r8; - gTasks[taskId].func(taskId); - gAnimSoundTaskCount++; - gBattleAnimScriptPtr += 5; -} - -static void sub_80774FC(u8 taskId) -{ - s16 data8; - u16 r0; - s8 r1; - u8 r4; - - data8 = gTasks[taskId].data[8]; - gTasks[taskId].data[8]++; - if (data8 >= gTasks[taskId].data[2]) - { - gTasks[taskId].data[8] = 0; - r0 = gTasks[taskId].data[0]; - r1 = gTasks[taskId].data[1]; - gTasks[taskId].data[3]--; - r4 = gTasks[taskId].data[3]; - PlaySE12WithPanning(r0, r1); - if (r4 == 0) - { - DestroyTask(taskId); - gAnimSoundTaskCount--; - } - } -} - -static void ScriptCmd_panse_1D(void) -{ - u16 r5; - u8 r0; - u8 r8; - s8 r4; - u8 taskId; - - gBattleAnimScriptPtr++; - r5 = SCRIPT_READ_16(gBattleAnimScriptPtr); - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); - r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); - r4 = sub_8076F98(r0); - taskId = CreateTask(sub_80775CC, 1); - gTasks[taskId].data[0] = r5; - gTasks[taskId].data[1] = r4; - gTasks[taskId].data[2] = r8; - gAnimSoundTaskCount++; - gBattleAnimScriptPtr += 4; -} - -static void sub_80775CC(u8 taskId) -{ - s16 r0; - - r0 = gTasks[taskId].data[2]; - gTasks[taskId].data[2]--; - if (r0 <= 0) - { - PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[1]); - DestroyTask(taskId); - gAnimSoundTaskCount--; - } -} - -static void ScriptCmd_createtask_1F(void) -{ - TaskFunc func; - u8 numArgs; - int i; - u8 taskId; - - gBattleAnimScriptPtr++; - func = (TaskFunc)SCRIPT_READ_32(gBattleAnimScriptPtr); - gBattleAnimScriptPtr += 4; - numArgs = SCRIPT_READ_8(gBattleAnimScriptPtr); - gBattleAnimScriptPtr++; - for (i = 0; i < numArgs; i++) - { - gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); - gBattleAnimScriptPtr += 2; - } - taskId = CreateTask(func, 1); - func(taskId); - gAnimSoundTaskCount++; -} - -static void ScriptCmd_waitsound(void) -{ - if (gAnimSoundTaskCount != 0) - { - gSoundAnimFramesToWait = 0; - gAnimFramesToWait = 1; - } - else if (IsSEPlaying()) - { - if (++gSoundAnimFramesToWait > 90) - { - m4aMPlayStop(&gMPlay_SE1); - m4aMPlayStop(&gMPlay_SE2); - gSoundAnimFramesToWait = 0; - } - else - { - gAnimFramesToWait = 1; - } - } - else - { - gSoundAnimFramesToWait = 0; - gBattleAnimScriptPtr++; - gAnimFramesToWait = 0; - } -} - -static void ScriptCmd_jumpvareq(void) -{ - u8 r2; - s16 r1; - u8 *addr; - - gBattleAnimScriptPtr++; - r2 = SCRIPT_READ_8(gBattleAnimScriptPtr); - r1 = SCRIPT_READ_16(gBattleAnimScriptPtr + 1); - if (r1 == gBattleAnimArgs[r2]) - { - addr = (u8 *)SCRIPT_READ_32(gBattleAnimScriptPtr + 3); - gBattleAnimScriptPtr = addr; - } - else - { - gBattleAnimScriptPtr += 7; - } -} - -static void ScriptCmd_jumpunkcond(void) -{ - u8 *addr; - - gBattleAnimScriptPtr++; - if (IsContest()) - { - addr = (u8 *)SCRIPT_READ_32(gBattleAnimScriptPtr); - gBattleAnimScriptPtr = addr; - } - else - { - gBattleAnimScriptPtr += 4; - } -} - -static void ScriptCmd_monbgprio_28(void) -{ - u8 r2; - u8 r0; - u8 r4; - - r2 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); - gBattleAnimScriptPtr += 2; - if (r2 != 0) - r0 = gBattleAnimEnemyMonIndex; - else - r0 = gBattleAnimPlayerMonIndex; - r4 = GetBankIdentity(r0); - if (!IsContest() && (r4 == 0 || r4 == 3)) - { - REG_BG1CNT_BITFIELD.priority = 1; - REG_BG2CNT_BITFIELD.priority = 2; - } -} - -static void ScriptCmd_monbgprio_29(void) -{ - gBattleAnimScriptPtr++; - if (!IsContest()) - { - REG_BG1CNT_BITFIELD.priority = 1; - REG_BG2CNT_BITFIELD.priority = 2; - } -} - -static void ScriptCmd_monbgprio_2A(void) -{ - u8 r6; - u8 r4; - u8 r0; - - r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); - gBattleAnimScriptPtr += 2; - if (GetBankSide(gBattleAnimPlayerMonIndex) != GetBankSide(gBattleAnimEnemyMonIndex)) - { - if (r6 != 0) - r0 = gBattleAnimEnemyMonIndex; - else - r0 = gBattleAnimPlayerMonIndex; - r4 = GetBankIdentity(r0); - if (!IsContest() && (r4 == 0 || r4 == 3)) - { - REG_BG1CNT_BITFIELD.priority = 1; - REG_BG2CNT_BITFIELD.priority = 2; - } - } -} - -static void ScriptCmd_invisible(void) -{ - u8 r0; - u8 spriteId; - - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); - spriteId = obj_id_for_side_relative_to_move(r0); - if (spriteId != 0xFF) - { - gSprites[spriteId].invisible = TRUE; - } - gBattleAnimScriptPtr += 2; -} - -static void ScriptCmd_visible(void) -{ - u8 r0; - u8 spriteId; - - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); - spriteId = obj_id_for_side_relative_to_move(r0); - if (spriteId != 0xFF) - { - gSprites[spriteId].invisible = FALSE; - } - gBattleAnimScriptPtr += 2; -} - -static void ScriptCmd_doublebattle_2D(void) -{ - u8 r7; - u8 r4; - u8 spriteId; - - r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); - gBattleAnimScriptPtr += 2; - if (!IsContest() && IsDoubleBattle() - && GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex)) - { - if (r7 == 0) - { - r4 = GetBankIdentity_permutated(gBattleAnimPlayerMonIndex); - spriteId = obj_id_for_side_relative_to_move(0); - } - else - { - r4 = GetBankIdentity_permutated(gBattleAnimEnemyMonIndex); - spriteId = obj_id_for_side_relative_to_move(1); - } - if (spriteId != 0xFF) - { - gSprites[spriteId].invisible = FALSE; - if (r4 == 2) - gSprites[spriteId].oam.priority = 3; - if (r4 == 1) - sub_8076464(0); - else - sub_8076464(1); - } - } -} - -static void ScriptCmd_doublebattle_2E(void) -{ - u8 r7; - u8 r4; - u8 spriteId; - - r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); - gBattleAnimScriptPtr += 2; - if (!IsContest() && IsDoubleBattle() - && GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex)) - { - if (r7 == 0) - { - r4 = GetBankIdentity_permutated(gBattleAnimPlayerMonIndex); - spriteId = obj_id_for_side_relative_to_move(0); - } - else - { - r4 = GetBankIdentity_permutated(gBattleAnimEnemyMonIndex); - spriteId = obj_id_for_side_relative_to_move(1); - } - if (spriteId != 0xFF && r4 == 2) - { - gSprites[spriteId].oam.priority = 2; - } - } -} - -static void ScriptCmd_stopsound(void) -{ - m4aMPlayStop(&gMPlay_SE1); - m4aMPlayStop(&gMPlay_SE2); - gBattleAnimScriptPtr++; -} diff --git a/src/battle_anim_80A7E7C.c b/src/battle_anim_80A7E7C.c deleted file mode 100644 index 31984977f..000000000 --- a/src/battle_anim_80A7E7C.c +++ /dev/null @@ -1,940 +0,0 @@ -#include "global.h" -#include "battle_anim.h" -#include "rom_8077ABC.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" - -#define SPRITE gSprites[TASK.data[0]] - -extern s16 gBattleAnimArgs[8]; - -extern u8 gObjectBankIDs[]; -extern s32 gMoveDmgMoveAnim; -extern u16 gMovePowerMoveAnim; -extern u8 gBattleAnimPlayerMonIndex; -extern u8 gBattleAnimEnemyMonIndex; - -static void sub_80A7EF0(u8 taskId); -static void sub_80A808C(u8 taskId); -static void sub_80A81D8(u8 taskId); -static void sub_80A8374(u8 taskId); -static void sub_80A8488(u8 taskId); -static void sub_80A85A4(struct Sprite *sprite); -void sub_80A8614(struct Sprite* sprite); -static void sub_80A86F4(struct Sprite *sprite); -static void sub_80A88F0(struct Sprite *sprite); -static void sub_80A89B4(u8 taskId); -static void sub_80A8A18(u8 taskId); -static void sub_80A8C0C(u8 taskId); -static void sub_80A8D8C(u8 taskId); -void sub_80A8FD8(u8 taskId); -static void sub_80A913C(u8 taskId); - -void sub_80A7E7C(u8 taskId) -{ - u8 sprite; - sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); - if (sprite == 0xff) - { - DestroyAnimVisualTask(taskId); - return; - } - gSprites[sprite].pos2.x = gBattleAnimArgs[1]; - gSprites[sprite].pos2.y = gBattleAnimArgs[2]; - TASK.data[0] = sprite; - TASK.data[1] = gBattleAnimArgs[3]; - TASK.data[2] = gBattleAnimArgs[4]; - TASK.data[3] = gBattleAnimArgs[4]; - TASK.data[4] = gBattleAnimArgs[1]; - TASK.data[5] = gBattleAnimArgs[2]; - TASK.func = sub_80A7EF0; - sub_80A7EF0(taskId); -} - -static void sub_80A7EF0(u8 taskId) -{ - if (TASK.data[3] == 0) - { - if (SPRITE.pos2.x == 0) - { - SPRITE.pos2.x = TASK.data[4]; - } - else - { - SPRITE.pos2.x = 0; - } - if (SPRITE.pos2.y == 0) - { - SPRITE.pos2.y = TASK.data[5]; - } - else - { - SPRITE.pos2.y = 0; - } - TASK.data[3] = TASK.data[2]; - if (--TASK.data[1] == 0) - { - SPRITE.pos2.x = 0; - SPRITE.pos2.y = 0; - DestroyAnimVisualTask(taskId); - return; - } - } - else - { - TASK.data[3]--; - } -} - - -void sub_80A7FA0(u8 taskId) -{ - u8 sprite; - bool8 r6; - u8 side; - r6 = 0; - if (gBattleAnimArgs[0] < 4) - { - sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); - if (sprite == 0xff) - { - DestroyAnimVisualTask(taskId); - return; - } - } - else if (gBattleAnimArgs[0] != 8) - { - switch (gBattleAnimArgs[0]) - { - case 4: - side = GetBankByPlayerAI(0); - break; - case 5: - side = GetBankByPlayerAI(2); - break; - case 6: - side = GetBankByPlayerAI(1); - break; - case 7: - default: - side = GetBankByPlayerAI(3); - break; - } - if (b_side_obj__get_some_boolean(side) == FALSE) - { - r6 = 1; - } - sprite = gObjectBankIDs[side]; - } - else - { - sprite = gObjectBankIDs[gBattleAnimPlayerMonIndex]; - } - if (r6) - { - DestroyAnimVisualTask(taskId); - return; - } - gSprites[sprite].pos2.x = gBattleAnimArgs[1]; - gSprites[sprite].pos2.y = gBattleAnimArgs[2]; - TASK.data[0] = sprite; - TASK.data[1] = gBattleAnimArgs[3]; - TASK.data[2] = gBattleAnimArgs[4]; - TASK.data[3] = gBattleAnimArgs[4]; - TASK.data[4] = gBattleAnimArgs[1]; - TASK.data[5] = gBattleAnimArgs[2]; - TASK.func = sub_80A808C; - sub_80A808C(taskId); -} - -static void sub_80A808C(u8 taskId) -{ - if (TASK.data[3] == 0) - { - if (SPRITE.pos2.x == TASK.data[4]) - { - SPRITE.pos2.x = -TASK.data[4]; - } - else - { - SPRITE.pos2.x = TASK.data[4]; - } - if (SPRITE.pos2.y == TASK.data[5]) - { - SPRITE.pos2.y = -TASK.data[5]; - } - else - { - SPRITE.pos2.y = TASK.data[5]; - } - TASK.data[3] = TASK.data[2]; - if (--TASK.data[1] == 0) - { - SPRITE.pos2.x = 0; - SPRITE.pos2.y = 0; - DestroyAnimVisualTask(taskId); - return; - } - } - else - { - TASK.data[3]--; - } -} - -void sub_80A8154(u8 taskId) -{ - u8 sprite; - sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); - if (sprite == 0xff) - { - DestroyAnimVisualTask(taskId); - return; - } - gSprites[sprite].pos2.x += gBattleAnimArgs[1]; - gSprites[sprite].pos2.y += gBattleAnimArgs[2]; - TASK.data[0] = sprite; - TASK.data[1] = 0; - TASK.data[2] = gBattleAnimArgs[3]; - TASK.data[3] = 0; - TASK.data[4] = gBattleAnimArgs[4]; - TASK.data[5] = gBattleAnimArgs[1] * 2; - TASK.data[6] = gBattleAnimArgs[2] * 2; - TASK.func = sub_80A81D8; - sub_80A81D8(taskId); -} - -static void sub_80A81D8(u8 taskId) -{ - if (TASK.data[3] == 0) - { - if (TASK.data[1] & 1) - { - SPRITE.pos2.x += TASK.data[5]; - SPRITE.pos2.y += TASK.data[6]; - } - else - { - SPRITE.pos2.x -= TASK.data[5]; - SPRITE.pos2.y -= TASK.data[6]; - } - TASK.data[3] = TASK.data[4]; - if (++TASK.data[1] >= TASK.data[2]) - { - if (TASK.data[1] & 1) - { - SPRITE.pos2.x += TASK.data[5] / 2; - SPRITE.pos2.y += TASK.data[6] / 2; - } - else - { - SPRITE.pos2.x -= TASK.data[5] / 2; - SPRITE.pos2.y -= TASK.data[6] / 2; - } - DestroyAnimVisualTask(taskId); - return; - } - } - else - { - TASK.data[3]--; - } -} - -void sub_80A8314(u8 taskId) -{ - u8 sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); - gSprites[sprite].pos2.x = gBattleAnimArgs[1]; - TASK.data[0] = sprite; - TASK.data[1] = gBattleAnimArgs[1]; - TASK.data[2] = gBattleAnimArgs[2]; - TASK.data[3] = gBattleAnimArgs[3]; - TASK.data[4] = gBattleAnimArgs[4]; - TASK.func = sub_80A8374; - sub_80A8374(taskId); -} - -static void sub_80A8374(u8 taskId) -{ - s16 x; - u8 sprite; - sprite = TASK.data[0]; - x = TASK.data[1]; - if (TASK.data[2] == TASK.data[8]++) - { - TASK.data[8] = 0; - if (gSprites[sprite].pos2.x == x) - { - x = -x; - } - gSprites[sprite].pos2.x += x; - } - TASK.data[1] = x; - TASK.data[9] += TASK.data[3]; - gSprites[sprite].pos2.y = TASK.data[9] >> 8; - if (--TASK.data[4] == 0) - { - DestroyAnimVisualTask(taskId); - return; - } -} - -void sub_80A8408(u8 taskId) -{ - u8 i; - u8 sprite; - u8 v1; - v1 = 1; - sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); - if (gBattleAnimArgs[4] > 5) - { - gBattleAnimArgs[4] = 5; - } - for (i = 0; i < gBattleAnimArgs[4]; i++) - { - v1 <<= 1; - } - TASK.data[0] = sprite; - TASK.data[1] = gBattleAnimArgs[1]; - TASK.data[2] = gBattleAnimArgs[2]; - TASK.data[3] = gBattleAnimArgs[3]; - TASK.data[4] = v1; - TASK.func = sub_80A8488; - sub_80A8488(taskId); -} - -static void sub_80A8488(u8 taskId) -{ - u8 sprite; - sprite = TASK.data[0]; - gSprites[sprite].pos2.x = Sin(TASK.data[5], TASK.data[1]); - gSprites[sprite].pos2.y = -Cos(TASK.data[5], TASK.data[2]); - gSprites[sprite].pos2.y += TASK.data[2]; - TASK.data[5] += TASK.data[4]; - TASK.data[5] &= 0xff; - if (TASK.data[5] == 0) - { - TASK.data[3]--; - } - if (TASK.data[3] == 0) - { - gSprites[sprite].pos2.x = 0; - gSprites[sprite].pos2.y = 0; - DestroyAnimVisualTask(taskId); - return; - } -} - -void sub_80A8500(u8 taskId) -{ - if (GetBankSide(gBattleAnimPlayerMonIndex)) - { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - } - sub_80A8408(taskId); -} - -void sub_80A8530(struct Sprite *sprite) -{ - sprite->invisible = TRUE; - if (GetBankSide(gBattleAnimPlayerMonIndex)) - { - sprite->data1 = -gBattleAnimArgs[1]; - } - else - { - sprite->data1 = gBattleAnimArgs[1]; - } - sprite->data0 = gBattleAnimArgs[0]; - sprite->data2 = 0; - sprite->data3 = gObjectBankIDs[gBattleAnimPlayerMonIndex]; - sprite->data4 = gBattleAnimArgs[0]; - oamt_set_x3A_32(sprite, sub_80A85A4); - sprite->callback = sub_8078458; -} - -static void sub_80A85A4(struct Sprite *sprite) -{ - sprite->data0 = sprite->data4; - sprite->data1 = -sprite->data1; - sprite->callback = sub_8078458; - oamt_set_x3A_32(sprite, move_anim_8072740); -} - -void sub_80A85C8(struct Sprite *sprite) -{ - u8 spriteId; - sprite->invisible = TRUE; - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]); - sprite->data0 = gBattleAnimArgs[0]; - sprite->data1 = 0; - sprite->data2 = gBattleAnimArgs[1]; - sprite->data3 = spriteId; - sprite->data4 = gBattleAnimArgs[0]; - oamt_set_x3A_32(sprite, sub_80A8614); - sprite->callback = sub_8078458; -} - -void sub_80A8614(struct Sprite *sprite) -{ - sprite->data0 = sprite->data4; - sprite->data2 = -sprite->data2; - sprite->callback = sub_8078458; - oamt_set_x3A_32(sprite, move_anim_8072740); -} - -void sub_80A8638(struct Sprite *sprite) -{ - int something; - int spriteId; - if (!gBattleAnimArgs[0]) - { - spriteId = gObjectBankIDs[gBattleAnimPlayerMonIndex]; - } - else - { - spriteId = gObjectBankIDs[gBattleAnimEnemyMonIndex]; - } - sprite->data0 = gBattleAnimArgs[2]; - sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; - sprite->data2 = gSprites[spriteId].pos1.x; - sprite->data3 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; - sprite->data4 = gSprites[spriteId].pos1.y; - something = 0; - sub_8078A5C(sprite); - sprite->data3 = something; - sprite->data4 = something; - sprite->data5 = gSprites[spriteId].pos2.x; - sprite->data6 = gSprites[spriteId].pos2.y; - sprite->invisible = TRUE; - if (gBattleAnimArgs[1] == 1) - { - sprite->data2 = something; - } - else if (gBattleAnimArgs[1] == 2) - { - sprite->data1 = something; - } - sprite->data7 = gBattleAnimArgs[1]; - sprite->data7 |= spriteId << 8; - sprite->callback = sub_80A86F4; -} - -static void sub_80A86F4(struct Sprite *sprite) -{ - s8 spriteId; - u8 lo; - struct Sprite *sprite2; - lo = sprite->data7 & 0xff; - spriteId = sprite->data7 >> 8; - sprite2 = &gSprites[spriteId]; - if (sprite->data0 == 0) - { - if (lo < 2) - { - sprite2->pos2.x = 0; - } - if (lo == 2 || lo == 0) - { - sprite2->pos2.y = 0; - } - move_anim_8072740(sprite); - } - else - { - sprite->data0--; - sprite->data3 += sprite->data1; - sprite->data4 += sprite->data2; - sprite2->pos2.x = (s8)(sprite->data3 >> 8) + sprite->data5; - sprite2->pos2.y = (s8)(sprite->data4 >> 8) + sprite->data6; - } -} - -void sub_80A8764(struct Sprite *sprite) -{ - u8 v1; - u8 spriteId; - if (!gBattleAnimArgs[0]) - { - v1 = gBattleAnimPlayerMonIndex; - } - else - { - v1 = gBattleAnimEnemyMonIndex; - } - spriteId = gObjectBankIDs[v1]; - if (GetBankSide(v1)) - { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - if (gBattleAnimArgs[3] == 1) - { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } - } - sprite->data0 = gBattleAnimArgs[4]; - sprite->data1 = gSprites[spriteId].pos1.x; - sprite->data2 = gSprites[spriteId].pos1.x + gBattleAnimArgs[1]; - sprite->data3 = gSprites[spriteId].pos1.y; - sprite->data4 = gSprites[spriteId].pos1.y + gBattleAnimArgs[2]; - sub_8078A5C(sprite); - sprite->data3 = 0; - sprite->data4 = 0; - sprite->data5 = spriteId; - sprite->invisible = TRUE; - oamt_set_x3A_32(sprite, move_anim_8072740); - sprite->callback = sub_80784A8; -} - -void sub_80A8818(struct Sprite *sprite) -{ - u8 spriteId; - u8 v1; - sprite->invisible = TRUE; - if (!gBattleAnimArgs[0]) - { - v1 = gBattleAnimPlayerMonIndex; - } - else - { - v1 = gBattleAnimEnemyMonIndex; - } - spriteId = gObjectBankIDs[v1]; - if (GetBankSide(v1)) - { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - if (gBattleAnimArgs[3] == 1) - { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } - } - sprite->data0 = gBattleAnimArgs[4]; - sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; - sprite->data2 = sprite->data1 + gBattleAnimArgs[1]; - sprite->data3 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; - sprite->data4 = sprite->data3 + gBattleAnimArgs[2]; - sub_8078A5C(sprite); - sprite->data3 = gSprites[spriteId].pos2.x << 8; - sprite->data4 = gSprites[spriteId].pos2.y << 8; - sprite->data5 = spriteId; - sprite->data6 = gBattleAnimArgs[5]; - if (!gBattleAnimArgs[5]) - { - oamt_set_x3A_32(sprite, move_anim_8072740); - } - else - { - oamt_set_x3A_32(sprite, sub_80A88F0); - } - sprite->callback = sub_80784A8; -} - - -static void sub_80A88F0(struct Sprite *sprite) -{ - gSprites[sprite->data5].pos2.x = 0; - gSprites[sprite->data5].pos2.y = 0; - move_anim_8072740(sprite); -} - -void sub_80A8920(u8 taskId) -{ - s16 r7; - r7 = 0x8000 / gBattleAnimArgs[3]; - if (GetBankSide(gBattleAnimPlayerMonIndex)) - { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - gBattleAnimArgs[5] = -gBattleAnimArgs[5]; - } - TASK.data[0] = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); - TASK.data[1] = (gBattleAnimArgs[1] << 8) / gBattleAnimArgs[3]; - TASK.data[2] = gBattleAnimArgs[2]; - TASK.data[3] = gBattleAnimArgs[3]; - TASK.data[4] = gBattleAnimArgs[4]; - TASK.data[5] = (gBattleAnimArgs[5] << 8) / gBattleAnimArgs[6]; - TASK.data[6] = gBattleAnimArgs[6]; - TASK.data[7] = r7; - TASK.func = sub_80A89B4; -} - -static void sub_80A89B4(u8 taskId) -{ - u8 spriteId; - spriteId = TASK.data[0]; - TASK.data[11] += TASK.data[1]; - gSprites[spriteId].pos2.x = TASK.data[11] >> 8; - gSprites[spriteId].pos2.y = Sin((u8)(TASK.data[10] >> 8), TASK.data[2]); - TASK.data[10] += TASK.data[7]; - if (--TASK.data[3] == 0) - { - TASK.func = sub_80A8A18; - } -} - -static void sub_80A8A18(u8 taskId) -{ - u8 spriteId; - if (TASK.data[4] > 0) - { - TASK.data[4]--; - } - else - { - spriteId = TASK.data[0]; - TASK.data[12] += TASK.data[5]; - gSprites[spriteId].pos2.x = (TASK.data[12] >> 8) + (TASK.data[11] >> 8); - if (--TASK.data[6] == 0) - { - DestroyAnimVisualTask(taskId); - return; - } - } -} - -static void sub_80A8B3C(u8 taskId); - -void sub_80A8A80(u8 taskId) -{ - u8 spriteId; - switch (gBattleAnimArgs[0]) - { - case 0: - case 1: - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); - break; - case 2: - if (!b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) - { - DestroyAnimVisualTask(taskId); - return; - } - spriteId = gObjectBankIDs[gBattleAnimPlayerMonIndex ^ 2]; - break; - case 3: - if (!b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) - { - DestroyAnimVisualTask(taskId); - return; - } - spriteId = gObjectBankIDs[gBattleAnimEnemyMonIndex ^ 2]; - break; - default: - DestroyAnimVisualTask(taskId); - return; - } - TASK.data[0] = spriteId; - if (GetBankSide(gBattleAnimEnemyMonIndex)) - { - TASK.data[1] = gBattleAnimArgs[1]; - } - else - { - TASK.data[1] = -gBattleAnimArgs[1]; - } - TASK.func = sub_80A8B3C; -} - -static void sub_80A8B3C(u8 taskId) -{ - u8 spriteId = TASK.data[0]; - gSprites[spriteId].pos2.x += TASK.data[1]; - if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x + 0x20 > 0x130u) - { - DestroyAnimVisualTask(taskId); - return; - } -} - -void sub_80A8B88(u8 taskId) -{ - u8 spriteId; - if (GetBankSide(gBattleAnimPlayerMonIndex)) - { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - } - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[4]); - TASK.data[0] = gBattleAnimArgs[0]; - TASK.data[1] = gBattleAnimArgs[1]; - TASK.data[2] = gBattleAnimArgs[2]; - TASK.data[3] = gBattleAnimArgs[3]; - TASK.data[4] = spriteId; - if (gBattleAnimArgs[4] == 0) - { - TASK.data[5] = gBattleAnimPlayerMonIndex; - } - else - { - TASK.data[5] = gBattleAnimEnemyMonIndex; - } - TASK.data[12] = 1; - TASK.func = sub_80A8C0C; -} - -static void sub_80A8C0C(u8 taskId) -{ - s16 y; - u8 spriteId; - int index; - u16 val; - spriteId = TASK.data[4]; - val = TASK.data[10] + TASK.data[2]; - TASK.data[10] = val; - index = val >> 8; - y = Sin(index, TASK.data[1]); - if (TASK.data[0] == 0) - { - gSprites[spriteId].pos2.x = y; - } - else - { - if (GetBankSide(TASK.data[5]) == 0) - { - gSprites[spriteId].pos2.y = (y >= 0) ? y : -y; - } - else - { - gSprites[spriteId].pos2.y = (y >= 0) ? -y : y; - } - } - if (((index >= 0x80u) && (TASK.data[11] == 0) && (TASK.data[12] == 1)) - || ((index < 0x7fu) && (TASK.data[11] == 1) && (TASK.data[12] == 0))) - { - TASK.data[11] ^= 1; - TASK.data[12] ^= 1; - if (--TASK.data[3] == 0) - { - gSprites[spriteId].pos2.x = 0; - gSprites[spriteId].pos2.y = 0; - DestroyAnimVisualTask(taskId); - return; - } - } -} - -void sub_80A8D34(u8 taskId) -{ - u8 spriteId; - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[3]); - sub_8078E70(spriteId, gBattleAnimArgs[4]); - TASK.data[0] = gBattleAnimArgs[0]; - TASK.data[1] = gBattleAnimArgs[1]; - TASK.data[2] = gBattleAnimArgs[2]; - TASK.data[3] = gBattleAnimArgs[2]; - TASK.data[4] = spriteId; - TASK.data[10] = 0x100; - TASK.data[11] = 0x100; - TASK.func = sub_80A8D8C; -} - -static void sub_80A8D8C(u8 taskId) -{ - u8 spriteId; - TASK.data[10] += TASK.data[0]; - TASK.data[11] += TASK.data[1]; - spriteId = TASK.data[4]; - obj_id_set_rotscale(spriteId, TASK.data[10], TASK.data[11], 0); - if (--TASK.data[2] == 0) - { - if (TASK.data[3] > 0) - { - TASK.data[0] = -TASK.data[0]; - TASK.data[1] = -TASK.data[1]; - TASK.data[2] = TASK.data[3]; - TASK.data[3] = 0; - } - else - { - sub_8078F40(spriteId); - DestroyAnimVisualTask(taskId); - return; - } - } -} - -void sub_80A8E04(u8 taskId) -{ - u8 spriteId; - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]); - sub_8078E70(spriteId, 0); - TASK.data[1] = 0; - TASK.data[2] = gBattleAnimArgs[0]; - if (gBattleAnimArgs[3] != 1) - { - TASK.data[3] = 0; - } - else - { - TASK.data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1]; - } - TASK.data[4] = gBattleAnimArgs[1]; - TASK.data[5] = spriteId; - TASK.data[6] = gBattleAnimArgs[3]; - if (IsContest()) - { - TASK.data[7] = 1; - } - else - { - if (gBattleAnimArgs[2] == 0) - { - TASK.data[7] = !GetBankSide(gBattleAnimPlayerMonIndex); - } - else - { - TASK.data[7] = !GetBankSide(gBattleAnimEnemyMonIndex); - } - } - if (TASK.data[7]) - { - if (!IsContest()) - { - TASK.data[3] *= -1; - TASK.data[4] *= -1; - } - } - TASK.func = sub_80A8FD8; -} - -void sub_80A8EFC(u8 taskId) -{ - u8 spriteId; - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]); - sub_8078E70(spriteId, 0); - TASK.data[1] = 0; - TASK.data[2] = gBattleAnimArgs[0]; - if (gBattleAnimArgs[2] == 0) - { - if (GetBankSide(gBattleAnimPlayerMonIndex)) - { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - } - } - else - { - if (GetBankSide(gBattleAnimEnemyMonIndex)) - { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - } - } - if (gBattleAnimArgs[3] != 1) - { - TASK.data[3] = 0; - } - else - { - TASK.data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1]; - } - TASK.data[4] = gBattleAnimArgs[1]; - TASK.data[5] = spriteId; - TASK.data[6] = gBattleAnimArgs[3]; - TASK.data[7] = 1; - TASK.data[3] *= -1; - TASK.data[4] *= -1; - TASK.func = sub_80A8FD8; -} - -void sub_80A8FD8(u8 taskId) -{ - TASK.data[3] += TASK.data[4]; - obj_id_set_rotscale(TASK.data[5], 0x100, 0x100, TASK.data[3]); - if (TASK.data[7]) - { - sub_8078F9C(TASK.data[5]); - } - if (++TASK.data[1] >= TASK.data[2]) - { - switch (TASK.data[6]) - { - case 1: - sub_8078F40(TASK.data[5]); - case 0: - default: - DestroyAnimVisualTask(taskId); - return; - case 2: - TASK.data[1] = 0; - TASK.data[4] *= -1; - TASK.data[6] = 1; - break; - } - } -} - -void sub_80A9058(u8 taskId) -{ - if (!gBattleAnimArgs[0]) - { - TASK.data[15] = gMovePowerMoveAnim / 12; - if (TASK.data[15] < 1) - { - TASK.data[15] = 1; - } - if (TASK.data[15] > 16) - { - TASK.data[15] = 16; - } - } - else - { - TASK.data[15] = gMoveDmgMoveAnim / 12; - if (TASK.data[15] < 1) - { - TASK.data[15] = 1; - } - if (TASK.data[15] > 16) - { - TASK.data[15] = 16; - } - } - TASK.data[14] = TASK.data[15] / 2; - TASK.data[13] = TASK.data[14] + (TASK.data[15] & 1); - TASK.data[12] = 0; - TASK.data[10] = gBattleAnimArgs[3]; - TASK.data[11] = gBattleAnimArgs[4]; - TASK.data[7] = obj_id_for_side_relative_to_move(1); - TASK.data[8] = gSprites[TASK.data[7]].pos2.x; - TASK.data[9] = gSprites[TASK.data[7]].pos2.y; - TASK.data[0] = 0; - TASK.data[1] = gBattleAnimArgs[1]; - TASK.data[2] = gBattleAnimArgs[2]; - TASK.func = sub_80A913C; -} - -static void sub_80A913C(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - if (++task->data[0] > task->data[1]) - { - task->data[0] = 0; - task->data[12] = (task->data[12] + 1) & 1; - if (task->data[10]) - { - if (task->data[12]) - { - gSprites[task->data[7]].pos2.x = task->data[8] + task->data[13]; - } - else - { - gSprites[task->data[7]].pos2.x = task->data[8] - task->data[14]; - } - } - if (task->data[11]) - { - if (task->data[12]) - { - gSprites[task->data[7]].pos2.y = task->data[15]; - } - else - { - gSprites[task->data[7]].pos2.y = 0; - } - } - if (!--task->data[2]) - { - gSprites[task->data[7]].pos2.x = 0; - gSprites[task->data[7]].pos2.y = 0; - DestroyAnimVisualTask(taskId); - return; - } - } -} diff --git a/src/battle_anim_81258BC.c b/src/battle_anim_81258BC.c deleted file mode 100644 index 5bdbb4946..000000000 --- a/src/battle_anim_81258BC.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "global.h" -#include "battle_anim_81258BC.h" -#include "battle.h" -#include "battle_message.h" -#include "menu_cursor.h" -#include "text.h" - -extern struct Window gUnknown_03004210; -extern u8 gDisplayedStringBattle[]; -extern u8 gActionSelectionCursor[]; - -extern const u8 gUnknown_08400CBB[]; -extern u8 gActiveBank; -extern const u8 gUnknown_08400D15[]; - -extern void *gBattleBankFunc[]; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; - -#if ENGLISH -#define SUB_812BB10_TILE_DATA_OFFSET 440 -#elif GERMAN -#define SUB_812BB10_TILE_DATA_OFFSET 444 -#endif - -void sub_812BB10(void) { - int i; - - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 160; - gUnknown_03004210.paletteNum = 0; - FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); - FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); - gBattleBankFunc[gActiveBank] = bx_battle_menu_t6_2; - - InitWindow(&gUnknown_03004210, gUnknown_08400D15, 400, 18, 35); - sub_8002F44(&gUnknown_03004210); - sub_814A5C0(0, 0xFFFF, 12, 11679, 0); - - for (i = 0; i < 4; i++) - { - nullsub_8(i); - } - - sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); - StrCpyDecodeToDisplayedStringBattle((u8 *) gUnknown_08400CBB); - - InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_812BB10_TILE_DATA_OFFSET, 2, 35); - sub_8002F44(&gUnknown_03004210); -} \ No newline at end of file diff --git a/src/battle_anim_8137220.c b/src/battle_anim_8137220.c deleted file mode 100644 index bb181d5fb..000000000 --- a/src/battle_anim_8137220.c +++ /dev/null @@ -1,1486 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_interface.h" -#include "battle_message.h" -#include "data2.h" -#include "link.h" -#include "main.h" -#include "menu_cursor.h" -#include "palette.h" -#include "pokemon.h" -#include "rom3.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "item_use.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "util.h" - -//Possibly PokemonSubstruct1 -struct UnknownStruct3 -{ - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; -}; - -extern u8 gActiveBank; -extern void (*gBattleBankFunc[])(void); -extern u32 gBattleExecBuffer; -extern void (*gWallyBufferCommands[])(void); -extern u8 gBattleBufferA[][0x200]; -extern u8 gObjectBankIDs[]; -extern MainCallback gPreBattleCallback1; -extern bool8 gDoingBattleAnim; -extern u16 gBattlePartyID[]; -extern u8 gHealthboxIDs[]; -extern u16 gBattleTypeFlags; -extern u16 gMovePowerMoveAnim; -extern u32 gMoveDmgMoveAnim; -extern u8 gHappinessMoveAnim; -extern u16 gWeatherMoveAnim; -extern u32 *gDisableStructMoveAnim; -extern u32 gPID_perBank[]; -extern void (*gAnimScriptCallback)(void); -extern bool8 gAnimScriptActive; -extern u8 gDisplayedStringBattle[]; -extern u8 gBankInMenu; -extern u8 gBattleMonForms[]; -extern u8 gBattleOutcome; -extern u16 gUnknown_02024DE8; -extern u8 gUnknown_02024E68[]; -extern struct SpriteTemplate gUnknown_02024E8C; -extern u8 gUnknown_0202F7C4; -extern struct Window gUnknown_03004210; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; -extern u8 gUnknown_0300434C[]; -extern const u8 gUnknown_08400CCC[]; -extern const u8 gUnknown_08400CF3[]; - -// TODO: include rom3.h when my other PR gets merged -extern void dp01_build_cmdbuf_x21_a_bb(u8, u8, u16); -extern void dp01_build_cmdbuf_x23_aa_0(u8, u16); - -extern void nullsub_14(void); -extern void PrepareBagForWallyTutorial(void); -extern void sub_8141828(); -extern void sub_8045A5C(); -extern void sub_804777C(); -extern void sub_8043DFC(); -extern bool8 IsDoubleBattle(void); -extern void c3_0802FDF4(u8); -extern void sub_802ECF0(void); -extern void sub_8031AF4(); -extern u8 GetBankIdentity(u8); -extern void sub_80313A0(struct Sprite *); -extern u8 GetBankByPlayerAI(u8); -extern u8 sub_8031720(); -extern void ExecuteMoveAnim(); -extern void sub_80326EC(); -extern void sub_8031F24(void); -extern void sub_80324BC(); -extern void BufferStringBattle(); -extern u8 GetBankSide(u8); -extern void sub_80304A8(void); -extern void sub_8047858(); -extern void sub_80E43C0(); -extern void oamt_add_pos2_onto_pos1(); -extern void sub_8078B34(struct Sprite *); -extern void sub_8030E38(struct Sprite *); -extern void oamt_set_x3A_32(); -extern u8 sub_8046400(); -extern u8 sub_8077ABC(); -extern u8 sub_8077F68(); -extern u8 sub_8079E90(); -extern void sub_80312F0(struct Sprite *); -extern bool8 move_anim_start_t3(); - -void WallyBufferRunCommand(void); -void sub_81374FC(void); -void sub_81376B8(void); -void WallyBufferExecCompleted(void); -u32 sub_8137A84(u8, u8 *); -void sub_8138294(u8); -void sub_81390D0(void); -void sub_8139A2C(u8); - -void unref_sub_8137220(void) -{ -} - -void SetBankFuncToWallyBufferRunCommand(void) -{ - gBattleBankFunc[gActiveBank] = WallyBufferRunCommand; - ewram[0x160A8] = 0; - ewram[0x160A9] = 0; - ewram[0x160AA] = 0; - ewram[0x160AB] = 0; -} - -void WallyBufferRunCommand(void) -{ - if (gBattleExecBuffer & gBitTable[gActiveBank]) - { - if (gBattleBufferA[gActiveBank][0] < 0x39) - gWallyBufferCommands[gBattleBufferA[gActiveBank][0]](); - else - WallyBufferExecCompleted(); - } -} - -void sub_81372BC(void) -{ - u8 r4; - - switch (ewram[0x160A8]) - { - case 0: - ewram[0x160AA] = 64; - ewram[0x160A8]++; - // fall through - case 1: - r4 = --ewram[0x160AA]; - if (r4 == 0) - { - PlaySE(SE_SELECT); - dp01_build_cmdbuf_x21_a_bb(1, 0, 0); - WallyBufferExecCompleted(); - ewram[0x160A8]++; - ewram[0x160A9] = r4; - ewram[0x160AA] = 64; - } - break; - case 2: - r4 = --ewram[0x160AA]; - if (r4 == 0) - { - PlaySE(SE_SELECT); - dp01_build_cmdbuf_x21_a_bb(1, 0, 0); - WallyBufferExecCompleted(); - ewram[0x160A8]++; - ewram[0x160A9] = r4; - ewram[0x160AA] = 64; - } - break; - case 3: - r4 = --ewram[0x160AA]; - if (r4 == 0) - { - dp01_build_cmdbuf_x21_a_bb(1, 9, 0); - WallyBufferExecCompleted(); - ewram[0x160A8]++; - ewram[0x160A9] = r4; - ewram[0x160AA] = 64; - } - break; - case 4: - if (--ewram[0x160AA] == 0) - { - PlaySE(SE_SELECT); - nullsub_8(0); - sub_802E3E4(1, 0); - ewram[0x160AA] = 64; - ewram[0x160A8]++; - } - break; - case 5: - if (--ewram[0x160AA] == 0) - { - PlaySE(SE_SELECT); - DestroyMenuCursor(); - dp01_build_cmdbuf_x21_a_bb(1, 1, 0); - WallyBufferExecCompleted(); - } - break; - } -} - -void sub_813741C(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) - WallyBufferExecCompleted(); -} - -void sub_8137454(void) -{ - if (gUnknown_03004210.state == 0) - WallyBufferExecCompleted(); -} - -void sub_813746C(void) -{ - if (!gPaletteFade.active) - { - gMain.inBattle = FALSE; - gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(gMain.savedCallback); - } -} - -void bx_wait_t5(void) -{ - if (!gDoingBattleAnim) - WallyBufferExecCompleted(); -} - -void sub_81374C4(void) -{ - if (!gPaletteFade.active) - { - gBattleBankFunc[gActiveBank] = sub_81374FC; - nullsub_14(); - PrepareBagForWallyTutorial(); - } -} - -void sub_81374FC(void) -{ - if (gMain.callback2 == sub_800F808 - && !gPaletteFade.active) - { - dp01_build_cmdbuf_x23_aa_0(1, gScriptItemId); - WallyBufferExecCompleted(); - } -} - -void sub_8137538(void) -{ - if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank].unk0_7) - sub_8141828(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]); - - if (!ewram17810[gActiveBank ^ 2].unk0_3 && !ewram17810[gActiveBank ^ 2].unk0_7) - sub_8141828(gActiveBank ^ 2, &gPlayerParty[gBattlePartyID[gActiveBank ^ 2]]); - - if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank ^ 2].unk0_3) - { - if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank ^ 2]]); - sub_8045A5C(gHealthboxIDs[gActiveBank ^ 2], &gPlayerParty[gBattlePartyID[gActiveBank ^ 2]], 0); - sub_804777C(gActiveBank ^ 2); - sub_8043DFC(gHealthboxIDs[gActiveBank ^ 2]); - } - DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]); - sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 0); - sub_804777C(gActiveBank); - sub_8043DFC(gHealthboxIDs[gActiveBank]); - ewram17840.unk9_0 = 0; - gBattleBankFunc[gActiveBank] = sub_81376B8; - } -} - -void sub_81376B8(void) -{ - bool8 r4 = FALSE; - - if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy) - r4 = TRUE; - if (r4 && ewram17810[gActiveBank].unk1_0 && ewram17810[gActiveBank ^ 2].unk1_0) - { - ewram17810[gActiveBank].unk0_7 = 0; - ewram17810[gActiveBank].unk1_0 = 0; - ewram17810[gActiveBank ^ 2].unk0_7 = 0; - ewram17810[gActiveBank ^ 2].unk1_0 = 0; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); - CreateTask(c3_0802FDF4, 10); - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - WallyBufferExecCompleted(); - } -} - -void sub_81377B0(void) -{ - s16 r4; - - r4 = sub_8045C78(gActiveBank, gHealthboxIDs[gActiveBank], 0, 0); - sub_8043DFC(gHealthboxIDs[gActiveBank]); - if (r4 != -1) - { - sub_80440EC(gHealthboxIDs[gActiveBank], r4, 0); - } - else - { - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - WallyBufferExecCompleted(); - } -} - -void bx_blink_t5(void) -{ - u8 spriteId = gObjectBankIDs[gActiveBank]; - - if (gSprites[spriteId].data1 == 32) - { - gSprites[spriteId].data1 = 0; - gSprites[spriteId].invisible = FALSE; - gDoingBattleAnim = FALSE; - WallyBufferExecCompleted(); - } - else - { - if (((u16)gSprites[spriteId].data1 % 4) == 0) - gSprites[spriteId].invisible ^= 1; - gSprites[spriteId].data1++; - } -} - -void sub_813789C(void) -{ - if (!ewram17810[gActiveBank].unk0_6) - { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); - sub_8043DB0(gHealthboxIDs[gActiveBank]); - WallyBufferExecCompleted(); - } -} - -// Duplicate of sub_813741C -void sub_8137908(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) - WallyBufferExecCompleted(); -} - -void sub_8137940(void) -{ - if (!ewram17810[gActiveBank].unk0_5) - WallyBufferExecCompleted(); -} - -void WallyBufferExecCompleted(void) -{ - gBattleBankFunc[gActiveBank] = WallyBufferRunCommand; - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - u8 multiplayerId = GetMultiplayerId(); - - dp01_prepare_buffer_wireless_probably(2, 4, &multiplayerId); - gBattleBufferA[gActiveBank][0] = 0x38; - } - else - { - gBattleExecBuffer &= ~gBitTable[gActiveBank]; - } -} - -void unref_sub_81379E4(void) -{ - if (!ewram17810[gActiveBank].unk0_4) - WallyBufferExecCompleted(); -} - -void dp01t_00_5_getattr(void) -{ - u8 arr[0x100]; - u32 r6 = 0; - u8 r4; - s32 i; - - if (gBattleBufferA[gActiveBank][2] == 0) - { - r6 = sub_8137A84(gBattlePartyID[gActiveBank], arr); - } - else - { - r4 = gBattleBufferA[gActiveBank][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - r6 += sub_8137A84(i, arr + r6); - r4 >>= 1; - } - } - dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, r6, arr); - WallyBufferExecCompleted(); -} - -u32 sub_8137A84(u8 a, u8 *buffer) -{ - struct BattlePokemon battlePokemon; - struct UnknownStruct3 moveData; - u8 nickname[20]; - u8 *src; - s16 data16; - u32 data32; - s32 size = 0; - - switch (gBattleBufferA[gActiveBank][1]) - { - case 0: - battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); - battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) - { - battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); - battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - } - battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); - battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP); - battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); - battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); - battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); - battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); - battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP); - battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); - battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); - battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD); - battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); - battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); - battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); - battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY); - battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); - GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); - StringCopy10(battlePokemon.nickname, nickname); - GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - src = (u8 *)&battlePokemon; - for (size = 0; size < sizeof(battlePokemon); size++) - buffer[size] = src[size]; - break; - case 1: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 2: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 3: - for (size = 0; size < 4; size++) - { - moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); - moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - } - moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - src = (u8 *)&moveData; - for (size = 0; size < sizeof(moveData); size++) - buffer[size] = src[size]; - break; - case 4: - case 5: - case 6: - case 7: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 8: - for (size = 0; size < 4; size++) - buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); - buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - size++; - break; - case 9: - case 10: - case 11: - case 12: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); - size = 1; - break; - case 17: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 18: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - size = 3; - break; - case 19: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV); - size = 1; - break; - case 20: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV); - size = 1; - break; - case 21: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV); - size = 1; - break; - case 22: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV); - size = 1; - break; - case 23: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV); - size = 1; - break; - case 24: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV); - size = 1; - break; - case 25: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); - size = 1; - break; - case 26: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS); - size = 1; - break; - case 27: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION); - size = 1; - break; - case 28: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL); - size = 1; - break; - case 29: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME); - size = 1; - break; - case 30: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL); - size = 1; - break; - case 31: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); - buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - size = 6; - break; - case 32: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); - size = 1; - break; - case 33: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); - size = 1; - break; - case 34: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - size = 1; - break; - case 35: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); - size = 1; - break; - case 36: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); - size = 1; - break; - case 37: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); - size = 1; - break; - case 38: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 39: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 40: - data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); - buffer[0] = (data32 & 0x000000FF); - buffer[1] = (data32 & 0x0000FF00) >> 8; - buffer[2] = (data32 & 0x00FF0000) >> 16; - buffer[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case 41: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); - size = 1; - break; - case 42: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 43: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 44: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 45: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 46: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 47: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 48: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); - buffer[0] = data16; - buffer[1] = data16 >> 8; - size = 2; - break; - case 49: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL); - size = 1; - break; - case 50: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY); - size = 1; - break; - case 51: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE); - size = 1; - break; - case 52: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART); - size = 1; - break; - case 53: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH); - size = 1; - break; - case 54: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN); - size = 1; - break; - case 55: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON); - size = 1; - break; - case 56: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON); - size = 1; - break; - case 57: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON); - size = 1; - break; - case 58: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON); - size = 1; - break; - case 59: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON); - size = 1; - break; - } - return size; -} - -void sub_8138230(void) -{ - sub_802ECF0(); -} - -void sub_813823C(void) -{ - u8 r4; - u8 i; - - if (gBattleBufferA[gActiveBank][2] == 0) - { - sub_8138294(gBattlePartyID[gActiveBank]); - } - else - { - r4 = gBattleBufferA[gActiveBank][2]; - for (i = 0; i < 6; i++) - { - if (r4 & 1) - sub_8138294(i); - r4 >>= 1; - } - } - WallyBufferExecCompleted(); -} - -void sub_8138294(u8 a) -{ - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; - struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; - s32 i; - - switch (gBattleBufferA[gActiveBank][1]) - { - case 0: - { - u8 iv; - - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); - } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); - SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); - iv = battlePokemon->hpIV; - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); - iv = battlePokemon->attackIV; - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); - iv = battlePokemon->defenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); - iv = battlePokemon->speedIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); - iv = battlePokemon->spAttackIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); - iv = battlePokemon->spDefenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); - SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); - SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); - SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); - SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); - } - break; - case 1: - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); - break; - case 2: - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); - break; - case 3: - for (i = 0; i < 4; i++) - { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); - } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); - break; - case 4: - case 5: - case 6: - case 7: - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); - break; - case 8: - SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); - SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); - SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); - break; - case 9: - case 10: - case 11: - case 12: - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); - break; - case 17: - SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); - break; - case 18: - SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); - break; - case 19: - SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 20: - SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 21: - SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 22: - SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 23: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 24: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); - break; - case 25: - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); - break; - case 26: - SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); - break; - case 27: - SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); - break; - case 28: - SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); - break; - case 29: - SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); - break; - case 30: - SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); - break; - case 31: - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); - break; - case 32: - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 33: - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 34: - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 35: - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 36: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 37: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); - break; - case 38: - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); - break; - case 39: - SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); - break; - case 40: - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); - break; - case 41: - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); - break; - case 42: - SetMonData(&gPlayerParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); - break; - case 43: - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); - break; - case 44: - SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); - break; - case 45: - SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); - break; - case 46: - SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); - break; - case 47: - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); - break; - case 48: - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); - break; - case 49: - SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); - break; - case 50: - SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); - break; - case 51: - SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); - break; - case 52: - SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); - break; - case 53: - SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); - break; - case 54: - SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); - break; - case 55: - SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 56: - SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 57: - SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 58: - SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - case 59: - SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); - break; - } - sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); -} - -void sub_8138C90(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8138C9C(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8138CA8(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8138CB4(void) -{ - if (gBattleBufferA[gActiveBank][1] == 0) - { - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 1); - gBattleBankFunc[gActiveBank] = sub_813789C; - } - else - { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); - sub_8043DB0(gHealthboxIDs[gActiveBank]); - WallyBufferExecCompleted(); - } -} - -void sub_8138D38(void) -{ - sub_8031AF4(2, gActiveBank); - GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( - &gUnknown_02024E8C, - 80, 80 + 4 * (8 - gTrainerBackPicCoords[2].coords), - 30); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; - gSprites[gObjectBankIDs[gActiveBank]].data0 = -2; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; - gBattleBankFunc[gActiveBank] = sub_813741C; -} - -void sub_8138E04(void) -{ - sub_8031AF4(2, gActiveBank); - GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( - &gUnknown_02024E8C, - 80, 80 + 4 * (8 - gTrainerBackPicCoords[2].coords), - 30); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96; - gSprites[gObjectBankIDs[gActiveBank]].data0 = 2; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; - gBattleBankFunc[gActiveBank] = sub_8137908; -} - -void sub_8138ED0(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8138EDC(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8138EE8(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8138EF4(void) -{ - ewram17840.unk8 = 4; - gDoingBattleAnim = TRUE; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); - gBattleBankFunc[gActiveBank] = bx_wait_t5; -} - -void sub_8138F44(void) -{ - u8 val = gBattleBufferA[gActiveBank][1]; - - ewram17840.unk8 = val; - gDoingBattleAnim = TRUE; - move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); - gBattleBankFunc[gActiveBank] = bx_wait_t5; -} - -void sub_8138FA0(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8138FAC(void) -{ - u16 r0 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); - - gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; - gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8); - gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24); - gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8); - gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; - gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; - if (sub_8031720(r0, gUnknown_0202F7C4) != 0) - { - // Dead code. sub_8031720 always returns 0. - WallyBufferExecCompleted(); - } - else - { - ewram17810[gActiveBank].unk4 = 0; - gBattleBankFunc[gActiveBank] = sub_81390D0; - } -} - -void sub_81390D0(void) -{ - u16 r4 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); - -#ifndef NONMATCHING - asm("":::"r6"); -#endif - - switch (ewram17810[gActiveBank].unk4) - { - case 0: - if (ewram17800[gActiveBank].unk0_2 == 1) - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); - ewram17810[gActiveBank].unk4 = 1; - break; - case 1: - if (ewram17810[gActiveBank].unk0_6 == 0) - { - sub_80326EC(0); - ExecuteMoveAnim(r4); - ewram17810[gActiveBank].unk4 = 2; - } - break; - case 2: - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - sub_80326EC(1); - if (ewram17800[gActiveBank].unk0_2 == 1) - move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); - ewram17810[gActiveBank].unk4 = 3; - } - break; - case 3: - if (ewram17810[gActiveBank].unk0_6 == 0) - { - sub_8031F24(); - sub_80324BC(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); - ewram17810[gActiveBank].unk4 = 0; - WallyBufferExecCompleted(); - } - break; - } -} - -void sub_8139208(void) -{ - u16 *ptr; - - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; - ptr = (u16 *)&gBattleBufferA[gActiveBank][2]; - if (*ptr == 2) - DestroyMenuCursor(); - BufferStringBattle(*ptr); - sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); - gBattleBankFunc[gActiveBank] = sub_8137454; -} - -void dp01t_11_5_message_for_player_only(void) -{ - if (GetBankSide(gActiveBank) == 0) - sub_8139208(); - else - WallyBufferExecCompleted(); -} - -void sub_8139298(void) -{ - s32 i; - - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 160; - gUnknown_03004210.paletteNum = 0; - FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); - FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); - gBattleBankFunc[gActiveBank] = sub_81372BC; - InitWindow(&gUnknown_03004210, gUnknown_08400CF3, 400, 18, 35); - sub_8002F44(&gUnknown_03004210); - sub_814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); - for (i = 0; i < 4; i++) - nullsub_8(i); - sub_802E3E4(0, 0); - StrCpyDecodeToDisplayedStringBattle(gUnknown_08400CCC); -#ifdef ENGLISH - InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 440, 2, 35); -#else - InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 444, 2, 35); -#endif - sub_8002F44(&gUnknown_03004210); -} - -void sub_8139378(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139384(void) -{ - switch (ewram[0x160A9]) - { - case 0: - sub_80304A8(); - ewram[0x160A9]++; - ewram[0x160AB] = 80; - // fall through - case 1: - ewram[0x160AB]--; - if (ewram[0x160AB] == 0) - { - DestroyMenuCursor(); - PlaySE(SE_SELECT); - dp01_build_cmdbuf_x21_a_bb(1, 10, 256); - WallyBufferExecCompleted(); - } - break; - } -} - -void sub_81393EC(void) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gBattleBankFunc[gActiveBank] = sub_81374C4; - gBankInMenu = gActiveBank; -} - -void sub_813942C(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139438(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139444(void) -{ - s16 r7; - - load_gfxc_health_bar(0); - r7 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (r7 != 0x7FFF) - { - u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); - u32 curHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); - - sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, curHP, r7); - } - else - { - u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); - - sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); - sub_80440EC(gHealthboxIDs[gActiveBank], 0, 0); - } - gBattleBankFunc[gActiveBank] = sub_81377B0; -} - -void sub_8139544(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139550(void) -{ - WallyBufferExecCompleted(); -} - -void sub_813955C(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139568(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139574(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139580(void) -{ - WallyBufferExecCompleted(); -} - -void sub_813958C(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139598(void) -{ - WallyBufferExecCompleted(); -} - -void sub_81395A4(void) -{ - WallyBufferExecCompleted(); -} - -void sub_81395B0(void) -{ - WallyBufferExecCompleted(); -} - -void sub_81395BC(void) -{ - WallyBufferExecCompleted(); -} - -void sub_81395C8(void) -{ - WallyBufferExecCompleted(); -} - -void sub_81395D4(void) -{ - WallyBufferExecCompleted(); -} - -void sub_81395E0(void) -{ - WallyBufferExecCompleted(); -} - -void sub_81395EC(void) -{ - WallyBufferExecCompleted(); -} - -void sub_81395F8(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139604(void) -{ - if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) - { - WallyBufferExecCompleted(); - } - else - { - gDoingBattleAnim = 1; - gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; - sub_8047858(gActiveBank); - gBattleBankFunc[gActiveBank] = bx_blink_t5; - } -} - -void sub_8139674(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139680(void) -{ - PlaySE(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); - WallyBufferExecCompleted(); -} - -void sub_81396B0(void) -{ - PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); - WallyBufferExecCompleted(); -} - -void sub_81396E0(void) -{ - PlayCry1(GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES), 25); - WallyBufferExecCompleted(); -} - -void dp01t_2E_5_battle_intro(void) -{ - sub_80E43C0(gBattleBufferA[gActiveBank][1]); - gUnknown_02024DE8 |= 1; - WallyBufferExecCompleted(); -} - -void sub_8139750(void) -{ - u8 paletteNum; - u8 taskId; - - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; - gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; - gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); - paletteNum = AllocSpritePalette(0xD6F8); - LoadCompressedPalette(gTrainerBackPicPaletteTable[2].data, 0x100 + paletteNum * 16, 32); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = paletteNum; - taskId = CreateTask(sub_8139A2C, 5); - gTasks[taskId].data[0] = gActiveBank; - if (ewram17810[gActiveBank].unk0_0) - gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; - ewram17810[4].unk9 |= 1; - gBattleBankFunc[gActiveBank] = nullsub_91; -} - -void sub_81398BC(u8 bank) -{ - u16 species; - - ewram17800[bank].unk2 = 0; - gBattlePartyID[bank] = gBattleBufferA[bank][1]; - species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); - gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0); - GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank)); - gObjectBankIDs[bank] = CreateSprite( - &gUnknown_02024E8C, - sub_8077ABC(bank, 2), - sub_8077F68(bank), - sub_8079E90(bank)); - gSprites[gUnknown_0300434C[bank]].data1 = gObjectBankIDs[bank]; - gSprites[gObjectBankIDs[bank]].data0 = bank; - gSprites[gObjectBankIDs[bank]].data2 = species; - gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; - StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); - gSprites[gObjectBankIDs[bank]].invisible = TRUE; - gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; - gSprites[gUnknown_0300434C[bank]].data0 = sub_8046400(0, 0xFF); -} - -void sub_8139A2C(u8 taskId) -{ - if (gTasks[taskId].data[1] < 31) - { - gTasks[taskId].data[1]++; - } - else - { - u8 savedActiveBank = gActiveBank; - - gActiveBank = gTasks[taskId].data[0]; - gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; - sub_81398BC(gActiveBank); - gBattleBankFunc[gActiveBank] = sub_8137538; - gActiveBank = savedActiveBank; - DestroyTask(taskId); - } -} - -void sub_8139AA0(void) -{ - if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) - { - WallyBufferExecCompleted(); - } - else - { - ewram17810[gActiveBank].unk0_0 = 1; - gUnknown_02024E68[gActiveBank] = sub_8044804(gActiveBank, (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]); - WallyBufferExecCompleted(); - } -} - -void sub_8139B20(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139B2C(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139B38(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139B44(void) -{ - u8 val2 = gBattleBufferA[gActiveBank][1]; - u16 val = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - - if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, val2, val)) - WallyBufferExecCompleted(); - else - gBattleBankFunc[gActiveBank] = sub_8137940; -} - -void sub_8139BA0(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139BAC(void) -{ - WallyBufferExecCompleted(); -} - -void sub_8139BB8(void) -{ - gBattleOutcome = gBattleBufferA[gActiveBank][1]; - FadeOutMapMusic(5); - BeginFastPaletteFade(3); - WallyBufferExecCompleted(); - if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_WILD)) - gBattleBankFunc[gActiveBank] = sub_813746C; -} - -void nullsub_80(void) -{ -} diff --git a/src/battle_interface.c b/src/battle_interface.c deleted file mode 100644 index 246bda62b..000000000 --- a/src/battle_interface.c +++ /dev/null @@ -1,3049 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_interface.h" -#include "decompress.h" -#include "palette.h" -#include "pokedex.h" -#include "pokemon.h" -#include "rom_8077ABC.h" -#include "safari_zone.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "task.h" -#include "text.h" - -struct UnknownStruct5 -{ - u8 unk0; - u32 unk4; - u32 unk8; - u32 unkC; - u32 unk10; -}; - -struct UnknownStruct7 -{ - u8 filler0[0x180]; -}; - -extern u8 ewram[]; -#define ewram520 ((struct UnknownStruct7 *)(ewram + 0x00520)) -#define ewram16088 (*(u8 *) (ewram + 0x16088)) -#define ewram16089 (*(u8 *) (ewram + 0x16089)) -#define ewram17850 ((struct UnknownStruct5 *)(ewram + 0x17850)) - -extern u8 gDisplayedStringBattle[]; -extern u8 gNoOfAllBanks; -extern u16 gBattlePartyID[]; -extern u8 gBanksBySide[]; -extern u8 gHealthboxIDs[]; - -extern u16 gBattleTypeFlags; - -extern const struct SpriteTemplate gSpriteTemplate_820A4EC[]; -extern const struct SpriteTemplate gSpriteTemplate_820A51C[]; -extern const struct SpriteTemplate gSpriteTemplate_820A54C; -extern const struct SpriteTemplate gSpriteTemplate_820A56C[]; -extern const struct SubspriteTable gSubspriteTables_820A684[]; -extern const struct SubspriteTable gSubspriteTables_820A6E4[]; -extern const struct SubspriteTable gSubspriteTables_820A6EC[]; -extern const struct SpriteSheet gUnknown_0820A754[]; -extern const struct SpritePalette gUnknown_0820A764[]; -extern const struct SpritePalette gUnknown_0820A774[]; -extern const struct SpriteSheet gUnknown_0820A784[]; -extern const struct SpriteTemplate gSpriteTemplate_820A7A4[]; -extern const struct SpriteTemplate gSpriteTemplate_820A7D4[]; -extern void *const gUnknown_0820A804[]; -extern void *const gUnknown_0820A80C[]; -extern void *const gUnknown_0820A814[]; -extern void *const gUnknown_0820A83C[]; -extern void *const gUnknown_0820A848[]; -extern void *const gUnknown_0820A854[]; -extern void *const gUnknown_0820A85C[]; -extern void *const gUnknown_0820A87C[]; -extern void *const gUnknown_0820A894[]; -extern void *const gUnknown_0820A8B4[]; -extern void *const gUnknown_0820A8DC[]; -extern void *const gUnknown_0820A904[]; -extern const u8 gUnknown_0820A81C[]; -extern const u8 gUnknown_0820A864[]; -extern const u8 gUnknown_0820A89C[]; -extern const u8 gUnknown_0820A8B0[]; -extern const u8 BattleText_SafariBalls[]; -extern const u8 BattleText_SafariBallsLeft[]; -extern const u8 BattleText_HighlightRed[]; -extern const u8 gUnknown_08D1216C[][32]; - -extern const u16 gBattleInterfaceStatusIcons_DynPal[]; - -#define ABS(n) ((n) >= 0 ? (n) : -(n)) -// Used for computing copy destination addresses -#define MACRO1(n) ((n) - (n) / 8 * 8) + 64 * ((n) / 8) - -static void sub_8043D5C(struct Sprite *); -static const void *sub_8043CDC(u8); -static void sub_8044210(u8, s16, u8); -static void draw_status_ailment_maybe(u8); -extern void sub_8045180(struct Sprite *); -static void sub_8045110(struct Sprite *); -static void sub_8045048(struct Sprite *); -static void sub_8044F70(u8 taskId); -static void sub_8044E74(u8 taskId); -static void sub_8044ECC(u8 taskId); -static u8 sub_80457E8(u8, u8); -static int sub_8045F58(s32, s32, int, int *, u8, u16); -static u8 GetScaledExpFraction(int, int, int, u8); -static void sub_8045D58(u8, u8); -static u8 sub_804602C(int, int, int, int *, u8 *, u8); -static void sub_8046128(struct BattleInterfaceStruct1 *a, int *b, void *c); - -static int do_nothing(s16 unused1, s16 unused2, int unused3) -{ - return 9; -} - -#ifdef NONMATCHING -void sub_8043740(s16 a, u16 *b, u8 c) -{ - u8 sp0[4]; - s8 i; - s8 j; - s32 r9; - - for (i = 0; i < 4; i++) - sp0[i] = 0; - - //_0804377C - //i = 3; - //r9 = -1; - for (i = 3, r9 = -1;;) - { - if (a > 0) - { - sp0[i] = a % 10; - a /= 10; - i--; - } - else - break; - asm(""::"r"(r9)); - } - - //_080437AA - for (; i > r9; i--) - { - //asm("":"=r"(r9)); - sp0[i] = -1; - } - //_080437CE - if (sp0[3] == 0xFF) - sp0[3] = 0; - - //_080437DA - if (c == 0) - { - for (i = 0, j = 0; i < 4; i++) - { - if (sp0[j] == 0xFF) - { - b[j] = (b[j] & 0xFC00) | 0x1E; - b[i + 0x20] = (b[i + 0x20] & 0xFC00) | 0x1E; - } - else - { - b[j] = (b[j] & 0xFC00) | (sp0[j] + 0x14); - b[i + 0x20] = (b[i + 0x20] & 0xFC00) | (sp0[i] + 0x34); - } - j++; - } - - } - //_0804386A - else - { - for (i = 0; i < 4; i++) - { - if (sp0[i] == 0xFF) - { - b[i] = (b[i] & 0xFC00) | 0x1E; - b[i + 0x20] = (b[i + 0x20] & 0xFC00) | 0x1E; - } - else - { - b[i] = (b[i] & 0xFC00) | (sp0[i] + 0x14); - b[i + 0x20] = (b[i + 0x20] & 0xFC00) | (sp0[i] + 0x34); - } - } - } - asm(""::"r"(r9)); -} -#else -__attribute__((naked)) -void sub_8043740(s16 a, u16 *b, u8 c) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - adds r7, r1, 0\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - mov r10, r2\n\ - movs r3, 0\n\ - movs r2, 0\n\ -_0804375C:\n\ - lsls r0, r3, 24\n\ - asrs r0, 24\n\ - mov r3, sp\n\ - adds r1, r3, r0\n\ - strb r2, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3\n\ - ble _0804375C\n\ - movs r3, 0x3\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - mov r9, r0\n\ - mov r8, sp\n\ -_0804377C:\n\ - lsls r0, r5, 16\n\ - asrs r6, r0, 16\n\ - cmp r6, 0\n\ - ble _080437AA\n\ - lsls r4, r3, 24\n\ - asrs r4, 24\n\ - mov r1, sp\n\ - adds r5, r1, r4\n\ - adds r0, r6, 0\n\ - movs r1, 0xA\n\ - bl __modsi3\n\ - strb r0, [r5]\n\ - adds r0, r6, 0\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - subs r4, 0x1\n\ - lsls r4, 24\n\ - lsrs r3, r4, 24\n\ - b _0804377C\n\ -_080437AA:\n\ - lsls r1, r3, 24\n\ - asrs r0, r1, 24\n\ - cmp r0, r9\n\ - ble _080437CE\n\ - movs r4, 0xFF\n\ - movs r3, 0x1\n\ - negs r3, r3\n\ -_080437B8:\n\ - asrs r2, r1, 24\n\ - mov r5, sp\n\ - adds r1, r5, r2\n\ - ldrb r0, [r1]\n\ - orrs r0, r4\n\ - strb r0, [r1]\n\ - subs r2, 0x1\n\ - lsls r1, r2, 24\n\ - asrs r0, r1, 24\n\ - cmp r0, r3\n\ - bgt _080437B8\n\ -_080437CE:\n\ - mov r1, r8\n\ - ldrb r0, [r1, 0x3]\n\ - cmp r0, 0xFF\n\ - bne _080437DA\n\ - movs r0, 0\n\ - strb r0, [r1, 0x3]\n\ -_080437DA:\n\ - mov r2, r10\n\ - cmp r2, 0\n\ - bne _0804386A\n\ - movs r3, 0\n\ - movs r1, 0\n\ - movs r6, 0xFC\n\ - lsls r6, 8\n\ - movs r5, 0x1E\n\ - mov r12, r5\n\ -_080437EC:\n\ - lsls r1, 24\n\ - asrs r2, r1, 24\n\ - mov r0, sp\n\ - adds r5, r0, r2\n\ - ldrb r0, [r5]\n\ - mov r8, r1\n\ - cmp r0, 0xFF\n\ - bne _08043822\n\ - lsls r1, r2, 1\n\ - adds r1, r7\n\ - ldrh r2, [r1]\n\ - adds r0, r6, 0\n\ - ands r0, r2\n\ - mov r2, r12\n\ - orrs r0, r2\n\ - strh r0, [r1]\n\ - lsls r3, 24\n\ - asrs r1, r3, 23\n\ - adds r1, r7\n\ - adds r1, 0x40\n\ - ldrh r2, [r1]\n\ - adds r0, r6, 0\n\ - ands r0, r2\n\ - mov r5, r12\n\ - orrs r0, r5\n\ - strh r0, [r1]\n\ - b _08043852\n\ -_08043822:\n\ - lsls r2, 1\n\ - adds r2, r7\n\ - ldrh r0, [r2]\n\ - adds r1, r6, 0\n\ - ands r1, r0\n\ - ldrb r0, [r5]\n\ - adds r0, 0x14\n\ - orrs r1, r0\n\ - strh r1, [r2]\n\ - lsls r4, r3, 24\n\ - asrs r3, r4, 24\n\ - lsls r2, r3, 1\n\ - adds r2, r7\n\ - adds r2, 0x40\n\ - ldrh r0, [r2]\n\ - adds r1, r6, 0\n\ - ands r1, r0\n\ - mov r5, sp\n\ - adds r0, r5, r3\n\ - ldrb r0, [r0]\n\ - adds r0, 0x34\n\ - orrs r1, r0\n\ - strh r1, [r2]\n\ - adds r3, r4, 0\n\ -_08043852:\n\ - movs r0, 0x80\n\ - lsls r0, 17\n\ - add r0, r8\n\ - lsrs r1, r0, 24\n\ - movs r2, 0x80\n\ - lsls r2, 17\n\ - adds r0, r3, r2\n\ - lsrs r3, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3\n\ - ble _080437EC\n\ - b _080438CE\n\ -_0804386A:\n\ - movs r3, 0\n\ - movs r4, 0xFC\n\ - lsls r4, 8\n\ - movs r6, 0x1E\n\ -_08043872:\n\ - lsls r1, r3, 24\n\ - asrs r2, r1, 24\n\ - mov r3, sp\n\ - adds r5, r3, r2\n\ - ldrb r0, [r5]\n\ - adds r3, r1, 0\n\ - cmp r0, 0xFF\n\ - bne _0804389E\n\ - lsls r1, r2, 1\n\ - adds r1, r7\n\ - ldrh r2, [r1]\n\ - adds r0, r4, 0\n\ - ands r0, r2\n\ - orrs r0, r6\n\ - strh r0, [r1]\n\ - adds r1, 0x40\n\ - ldrh r2, [r1]\n\ - adds r0, r4, 0\n\ - ands r0, r2\n\ - orrs r0, r6\n\ - strh r0, [r1]\n\ - b _080438C0\n\ -_0804389E:\n\ - lsls r2, 1\n\ - adds r2, r7\n\ - ldrh r0, [r2]\n\ - adds r1, r4, 0\n\ - ands r1, r0\n\ - ldrb r0, [r5]\n\ - adds r0, 0x14\n\ - orrs r1, r0\n\ - strh r1, [r2]\n\ - adds r2, 0x40\n\ - ldrh r0, [r2]\n\ - adds r1, r4, 0\n\ - ands r1, r0\n\ - ldrb r0, [r5]\n\ - adds r0, 0x34\n\ - orrs r1, r0\n\ - strh r1, [r2]\n\ -_080438C0:\n\ - movs r5, 0x80\n\ - lsls r5, 17\n\ - adds r0, r3, r5\n\ - lsrs r3, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3\n\ - ble _08043872\n\ -_080438CE:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif - -void unref_sub_80438E0(s16 a, s16 b, u16 *c) -{ - c[4] = 0x1E; - sub_8043740(b, c, 0); - sub_8043740(a, c + 5, 1); -} - -u8 battle_make_oam_normal_battle(u8 a) -{ - int sp0 = 0; - u8 spriteId1; - u8 spriteId2; - u8 spriteId3; - struct Sprite *sprite; - - if (!IsDoubleBattle()) - { - if (GetBankSide(a) == 0) - { - spriteId1 = CreateSprite(&gSpriteTemplate_820A4EC[0], 240, 160, 1); - spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A4EC[0], 240, 160, 1); - - gSprites[spriteId1].oam.shape = 0; - gSprites[spriteId2].oam.shape = 0; - gSprites[spriteId2].oam.tileNum += 64; - } - else - { - spriteId1 = CreateSprite(&gSpriteTemplate_820A51C[0], 240, 160, 1); - spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A51C[0], 240, 160, 1); - - gSprites[spriteId2].oam.tileNum += 32; - sp0 = 2; - } - //_080439F2 - - gSprites[spriteId1].oam.affineParam = spriteId2; - gSprites[spriteId2].data5 = spriteId1; - gSprites[spriteId2].callback = sub_8043D5C; - } - //_08043A28 - else - { - if (GetBankSide(a) == 0) - { - spriteId1 = CreateSprite(&gSpriteTemplate_820A4EC[GetBankIdentity(a) / 2], 240, 160, 1); - spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A4EC[GetBankIdentity(a) / 2], 240, 160, 1); - - gSprites[spriteId1].oam.affineParam = spriteId2; - gSprites[spriteId2].data5 = spriteId1; - gSprites[spriteId2].oam.tileNum += 32; - gSprites[spriteId2].callback = sub_8043D5C; - sp0 = 1; - } - //_08043ACC - else - { - spriteId1 = CreateSprite(&gSpriteTemplate_820A51C[GetBankIdentity(a) / 2], 240, 160, 1); - spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A51C[GetBankIdentity(a) / 2], 240, 160, 1); - - gSprites[spriteId1].oam.affineParam = spriteId2; - gSprites[spriteId2].data5 = spriteId1; - gSprites[spriteId2].oam.tileNum += 32; - gSprites[spriteId2].callback = sub_8043D5C; - sp0 = 2; - } - //_08043B4E - } - //_08043B50 - - spriteId3 = CreateSpriteAtEnd(&gSpriteTemplate_820A56C[gBanksBySide[a]], 140, 60, 0); - sprite = &gSprites[spriteId3]; - SetSubspriteTables(sprite, &gSubspriteTables_820A684[GetBankSide(a)]); - sprite->subspriteMode = 2; - sprite->oam.priority = 1; - CpuCopy32(sub_8043CDC(1), (void *)(OBJ_VRAM0 + sprite->oam.tileNum * 32), 64); - - gSprites[spriteId1].data5 = spriteId3; - gSprites[spriteId1].data6 = a; - gSprites[spriteId1].invisible = TRUE; - gSprites[spriteId2].invisible = TRUE; - sprite->data5 = spriteId1; - sprite->data6 = sp0; - sprite->invisible = TRUE; - - return spriteId1; -} - -u8 battle_make_oam_safari_battle(void) -{ - u8 spriteId1 = CreateSprite(&gSpriteTemplate_820A54C, 240, 160, 1); - u8 spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A54C, 240, 160, 1); - - gSprites[spriteId1].oam.shape = 0; - gSprites[spriteId2].oam.shape = 0; - gSprites[spriteId2].oam.tileNum += 0x40; - gSprites[spriteId1].oam.affineParam = spriteId2; - gSprites[spriteId2].data5 = spriteId1; - gSprites[spriteId2].callback = sub_8043D5C; - return spriteId1; -} - -static const void *sub_8043CDC(u8 a) -{ - return gUnknown_08D1216C[a]; -} - -void sub_8043CEC(struct Sprite *sprite) -{ - u8 r5 = sprite->data5; - - switch (sprite->data6) - { - case 0: - sprite->pos1.x = gSprites[r5].pos1.x + 16; - sprite->pos1.y = gSprites[r5].pos1.y; - break; - case 1: - sprite->pos1.x = gSprites[r5].pos1.x + 16; - sprite->pos1.y = gSprites[r5].pos1.y; - break; - default: - case 2: - sprite->pos1.x = gSprites[r5].pos1.x + 8; - sprite->pos1.y = gSprites[r5].pos1.y; - break; - } - sprite->pos2.x = gSprites[r5].pos2.x; - sprite->pos2.y = gSprites[r5].pos2.y; -} - -static void sub_8043D5C(struct Sprite *sprite) -{ - u8 data5 = sprite->data5; - - sprite->pos1.x = gSprites[data5].pos1.x + 64; - sprite->pos1.y = gSprites[data5].pos1.y; - sprite->pos2.x = gSprites[data5].pos2.x; - sprite->pos2.y = gSprites[data5].pos2.y; -} - -void sub_8043D84(u8 a, u8 b, u32 c, u32 d, u32 e) -{ - ewram17850[a].unk0 = b; - ewram17850[a].unk4 = c; - ewram17850[a].unk8 = d; - ewram17850[a].unkC = e; - ewram17850[a].unk10 = 0xFFFF8000; -} - -void sub_8043DB0(u8 a) -{ - gSprites[a].invisible = TRUE; - gSprites[gSprites[a].data5].invisible = TRUE; - gSprites[gSprites[a].oam.affineParam].invisible = TRUE; -} - -void sub_8043DFC(u8 a) -{ - gSprites[a].invisible = FALSE; - gSprites[gSprites[a].data5].invisible = FALSE; - gSprites[gSprites[a].oam.affineParam].invisible = FALSE; -} - -static void sub_8043E50(u8 spriteId, s16 x, s16 y) -{ - gSprites[spriteId].pos1.x = x; - gSprites[spriteId].pos1.y = y; -} - -void unref_sub_8043E70(u8 a) -{ - DestroySprite(&gSprites[gSprites[a].oam.affineParam]); - DestroySprite(&gSprites[gSprites[a].data5]); - DestroySprite(&gSprites[a]); -} - -void nullsub_11() -{ -} - -void sub_8043EB4(u8 priority) -{ - s32 i; - - for (i = 0; i < gNoOfAllBanks; i++) - { - u8 spriteId1; - u8 spriteId2; - u8 spriteId3; - - spriteId1 = gHealthboxIDs[i]; - spriteId2 = gSprites[spriteId1].oam.affineParam; - spriteId3 = gSprites[spriteId1].data5; - gSprites[spriteId1].oam.priority = priority; - gSprites[spriteId2].oam.priority = priority; - gSprites[spriteId3].oam.priority = priority; - } -} - -void sub_8043F44(u8 a) -{ - s16 x = 0; - s16 y = 0; - - if (!IsDoubleBattle()) - { - if (GetBankSide(a) != 0) - { - x = 44; - y = 30; - } - else - { - x = 158; - y = 88; - } - } - else - { - switch (GetBankIdentity(a)) - { - case 0: - x = 159; - y = 77; - break; - case 2: - x = 171; - y = 102; - break; - case 1: - x = 44; - y = 19; - break; - case 3: - x = 32; - y = 44; - break; - } - } - sub_8043E50(gHealthboxIDs[a], x, y); -} - -#if ENGLISH -#define CHAR_LV_SEPARATOR CHAR_COLON -#elif GERMAN -#define CHAR_LV_SEPARATOR CHAR_PERIOD -#endif - -static void sub_8043FC0(u8 a, u8 b) -{ - u8 str[30]; - void *const *r7; - u8 *ptr; - s32 i; - s32 two; - - // TODO: Make this a local variable - memcpy(str, gUnknown_0820A81C, sizeof(str)); - if (!IsDoubleBattle()) - { - if (GetBankSide(gSprites[a].data6) == 0) - r7 = gUnknown_0820A804; - else - r7 = gUnknown_0820A80C; - } - else - { - if (GetBankSide(gSprites[a].data6) == 0) - r7 = gUnknown_0820A814; - else - r7 = gUnknown_0820A80C; - } - - ptr = str + 6; - if (b == 100) - { - ptr = ConvertIntToDecimalStringN(ptr, 100, 0, 3); - } - else - { - *(ptr++) = EXT_CTRL_CODE_BEGIN; - *(ptr++) = 0x11; - *(ptr++) = 1; - *(ptr++) = EXT_CTRL_CODE_BEGIN; - *(ptr++) = 0x14; - *(ptr++) = 4; - *(ptr++) = CHAR_LV_SEPARATOR; - *(ptr++) = EXT_CTRL_CODE_BEGIN; - *(ptr++) = 0x14; - *(ptr++) = 0; - ptr = ConvertIntToDecimalStringN(ptr, b, 0, 2); - } - - *(ptr++) = EXT_CTRL_CODE_BEGIN; - *(ptr++) = 0x13; - *(ptr++) = 0xF; - *(ptr++) = EOS; - sub_80034D4((u8 *)0x02000000, str); - - two = 2; - for (i = 0; i < two; i++) - CpuCopy32((void *)(0x02000020 + i * 64), r7[i] + gSprites[a].oam.tileNum * 32, 32); -} - -#ifdef NONMATCHING -void sub_80440EC(u8 a, s16 b, u8 c) -{ - u8 str[0x14]; - u8 *ptr; - s32 foo; - void *const *r4; - s32 i; - - // TODO: make this a local variable - memcpy(str, gUnknown_0820A864, sizeof(str)); - foo = gSprites[a].data6; - - if (IsDoubleBattle() == TRUE || GetBankSide(foo) == 1) - { - //_08044136 - sub_8044210(a, b, c); - return; - } - // - ptr = str + 6; - if (c == 0) - { - if (GetBankSide(gSprites[a].data6) == 0) - r4 = gUnknown_0820A83C; - else - r4 = gUnknown_0820A848; - c = 3; - ptr = sub_8003504(ptr, b, 0x13, 1); - *(ptr++) = 0xBA; - *(ptr++) = 0xFF; - sub_80034D4((u8 *)0x02000000, str); - } - else - { - if (GetBankSide(gSprites[a].data6) == 0) - r4 = gUnknown_0820A854; - else - r4 = gUnknown_0820A85C; - c = 2; - sub_8003504(ptr, b, 0xF, 1); - sub_80034D4((u8 *)0x02000000, str); - } - //asm(""::"r"(a)); - //_080441B6 - for (i = 0; i < c; i++) // _080440BC - { - void *temp = r4[i] + gSprites[a].oam.tileNum * 32; - CpuCopy32((void *)(0x02000020 + i * 0x40), temp, 0x20); - } -} -#else -__attribute__((naked)) -void sub_80440EC(u8 a, s16 b, u8 c) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - sub sp, 0x14\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - lsls r1, 16\n\ - lsrs r6, r1, 16\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - mov r8, r2\n\ - ldr r1, _08044144 @ =gUnknown_0820A864\n\ - mov r0, sp\n\ - movs r2, 0x14\n\ - bl memcpy\n\ - ldr r1, _08044148 @ =gSprites\n\ - lsls r0, r7, 4\n\ - adds r0, r7\n\ - lsls r0, 2\n\ - adds r4, r0, r1\n\ - movs r0, 0x3A\n\ - ldrsh r5, [r4, r0]\n\ - bl IsDoubleBattle\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - beq _08044136\n\ - lsls r0, r5, 24\n\ - lsrs r0, 24\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _0804414C\n\ -_08044136:\n\ - lsls r1, r6, 16\n\ - asrs r1, 16\n\ - adds r0, r7, 0\n\ - mov r2, r8\n\ - bl sub_8044210\n\ - b _080441F0\n\ - .align 2, 0\n\ -_08044144: .4byte gUnknown_0820A864\n\ -_08044148: .4byte gSprites\n\ -_0804414C:\n\ - mov r5, sp\n\ - adds r5, 0x6\n\ - mov r0, r8\n\ - cmp r0, 0\n\ - bne _08044190\n\ - ldrh r0, [r4, 0x3A]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - ldr r4, _08044188 @ =gUnknown_0820A848\n\ - cmp r0, 0\n\ - bne _0804416A\n\ - ldr r4, _0804418C @ =gUnknown_0820A83C\n\ -_0804416A:\n\ - movs r0, 0x3\n\ - mov r8, r0\n\ - lsls r1, r6, 16\n\ - asrs r1, 16\n\ - adds r0, r5, 0\n\ - movs r2, 0x13\n\ - movs r3, 0x1\n\ - bl sub_8003504\n\ - adds r5, r0, 0\n\ - movs r0, 0xBA\n\ - strb r0, [r5]\n\ - movs r0, 0xFF\n\ - strb r0, [r5, 0x1]\n\ - b _080441B6\n\ - .align 2, 0\n\ -_08044188: .4byte gUnknown_0820A848\n\ -_0804418C: .4byte gUnknown_0820A83C\n\ -_08044190:\n\ - ldrh r0, [r4, 0x3A]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - ldr r4, _080441FC @ =gUnknown_0820A85C\n\ - cmp r0, 0\n\ - bne _080441A4\n\ - ldr r4, _08044200 @ =gUnknown_0820A854\n\ -_080441A4:\n\ - movs r0, 0x2\n\ - mov r8, r0\n\ - lsls r1, r6, 16\n\ - asrs r1, 16\n\ - adds r0, r5, 0\n\ - movs r2, 0xF\n\ - movs r3, 0x1\n\ - bl sub_8003504\n\ -_080441B6:\n\ - movs r0, 0x80\n\ - lsls r0, 18\n\ - mov r1, sp\n\ - bl sub_80034D4\n\ - mov r0, r8\n\ - cmp r0, 0\n\ - beq _080441F0\n\ - ldr r1, _08044204 @ =gSprites\n\ - lsls r0, r7, 4\n\ - adds r0, r7\n\ - lsls r0, 2\n\ - adds r6, r0, r1\n\ - adds r7, r4, 0\n\ - ldr r5, _08044208 @ =0x02000020\n\ - mov r4, r8\n\ -_080441D6:\n\ - ldrh r0, [r6, 0x4]\n\ - lsls r0, 22\n\ - lsrs r0, 17\n\ - ldm r7!, {r1}\n\ - adds r1, r0\n\ - adds r0, r5, 0\n\ - ldr r2, _0804420C @ =REG_BG0CNT\n\ - bl CpuSet\n\ - adds r5, 0x40\n\ - subs r4, 0x1\n\ - cmp r4, 0\n\ - bne _080441D6\n\ -_080441F0:\n\ - add sp, 0x14\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080441FC: .4byte gUnknown_0820A85C\n\ -_08044200: .4byte gUnknown_0820A854\n\ -_08044204: .4byte gSprites\n\ -_08044208: .4byte 0x02000020\n\ -_0804420C: .4byte 0x04000008\n\ - .syntax divided\n"); -} -#endif - -static void sub_8044210(u8 a, s16 b, u8 c) -{ - u8 str[0x14]; - u8 *ptr; - void *const *r7; - int r10; - int r4; - int i; - - // TODO: make this a local variable - memcpy(str, gUnknown_0820A89C, sizeof(str)); - r4 = gSprites[a].data6; - if ((ewram17800[r4].unk0_4) == 0) - return; - ptr = str + 6; - if (c == 0) - { - r7 = gUnknown_0820A87C; - r10 = 6; - ptr = sub_8003504(ptr, b, 0x2B, 1); - *(ptr++) = CHAR_SLASH; - *(ptr++) = EOS; - } - else - { - r7 = gUnknown_0820A894; - r10 = 2; - sub_8003504(ptr, b, 0xF, 1); - if (GetBankSide(r4) == 0) - { - CpuCopy32(sub_8043CDC(0x74), (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + 0x34) * 32), 32); - } - } - r4 = gSprites[a].data5; - sub_80034D4((u8 *)0x02000000, str); - for (i = 0; i < r10; i++) - { - CpuCopy32((void *)(0x02000020 + i * 0x40), r7[i] + gSprites[r4].oam.tileNum * 32, 0x20); - } -} - -#ifdef NONMATCHING -void sub_8044338(u8 a, struct Pokemon *pkmn) -{ - u8 str[0x14]; - u8 *r6; - s32 r8; - u8 nature; // = GetNature(pkmn); - s32 r7; - u8 i; - u8 r5; - - // TODO: make this a local variable - memcpy(str, gUnknown_0820A864, sizeof(str)); - r6 = ewram520[GetBankIdentity(gSprites[a].data6)].filler0; - r8 = 5; - nature = GetNature(pkmn); - StringCopy(str + 6, gNatureNames[nature]); - sub_80034D4(r6, str); - r7 = 6; - for (i = 0; i < (u32)r8; i++, r7++) //_080443AA - { - u8 val; - - if ((u8)(str[r7] - 0x37) <= 0x13 || (u8)(str[r7] + 0x79) <= 0x13) - val = 0x2C; - //_080443DC - else if ((u8)(str[r7] - 0x4B) <= 4 || (u8)(str[r7] + 0x65) <= 4) - val = 0x2D; - else - val = 0x2B; - - CpuCopy32(sub_8043CDC(val), r6 + i * 64, 32); - } - //r7 = 1; - //sp18 = a * 16; - for (r7 = 1; r7 < r8 + 1; r7++) - { - int foo; - - foo = gSprites[a].oam.tileNum + MACRO1(r7); - CpuCopy32(r6, (u8 *)0x06010000 + foo * 32, 32); - r6 += 32; - - foo = gSprites[a].oam.tileNum + 8 + MACRO1(r7); - CpuCopy32(r6, (u8 *)0x06010000 + foo * 32, 32); - r6 += 32; - } - //_08044486 - r5 = gSprites[a].data5; - ConvertIntToDecimalStringN(str + 6, ewram[0x16089], 1, 2); - ConvertIntToDecimalStringN(str + 9, ewram[0x16088], 1, 2); - str[5] = 0; - str[8] = 0xBA; - sub_80034D4((u8 *)0x02000000, str); - - for (r7 = 0; r7 < 5; r7++) - { - if (r7 <= 1) - { - int foo = (gSprites[r5].oam.tileNum + 2 + r7); - CpuCopy32((u8 *)0x02000020 + r7 * 0x40, (u8 *)0x06010000 + foo * 32, 32); - } - else - { - int foo = (r7 + gSprites[r5].oam.tileNum); - CpuCopy32((u8 *)0x02000020 + r7 * 0x40, (u8 *)0x060100C0 + foo * 32, 32); - } - } -} -#else -__attribute__((naked)) -void sub_8044338(u8 a, struct Pokemon *pkmn) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x20\n\ - adds r4, r1, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x14]\n\ - ldr r1, _080443CC @ =gUnknown_0820A864\n\ - mov r0, sp\n\ - movs r2, 0x14\n\ - bl memcpy\n\ - ldr r1, _080443D0 @ =gSprites\n\ - ldr r2, [sp, 0x14]\n\ - lsls r0, r2, 4\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x3A]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetBankIdentity\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, r0, 1\n\ - adds r1, r0\n\ - lsls r1, 7\n\ - ldr r3, _080443D4 @ =0x02000520\n\ - adds r6, r1, r3\n\ - movs r0, 0x5\n\ - mov r8, r0\n\ - adds r0, r4, 0\n\ - bl GetNature\n\ - lsls r0, 24\n\ - mov r4, sp\n\ - adds r4, 0x6\n\ - ldr r1, _080443D8 @ =gNatureNames\n\ - lsrs r0, 22\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - adds r0, r4, 0\n\ - bl StringCopy\n\ - adds r0, r6, 0\n\ - mov r1, sp\n\ - bl sub_80034D4\n\ - movs r7, 0x6\n\ - movs r5, 0\n\ - mov r1, sp\n\ - adds r1, 0x9\n\ - str r1, [sp, 0x1C]\n\ -_080443AA:\n\ - mov r2, sp\n\ - adds r0, r2, r7\n\ - ldrb r1, [r0]\n\ - adds r0, r1, 0\n\ - subs r0, 0x37\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x13\n\ - bls _080443C8\n\ - adds r0, r1, 0\n\ - adds r0, 0x79\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x13\n\ - bhi _080443DC\n\ -_080443C8:\n\ - movs r0, 0x2C\n\ - b _080443FA\n\ - .align 2, 0\n\ -_080443CC: .4byte gUnknown_0820A864\n\ -_080443D0: .4byte gSprites\n\ -_080443D4: .4byte 0x02000520\n\ -_080443D8: .4byte gNatureNames\n\ -_080443DC:\n\ - adds r0, r1, 0\n\ - subs r0, 0x4B\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x4\n\ - bls _080443F4\n\ - adds r0, r1, 0\n\ - adds r0, 0x65\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x4\n\ - bhi _080443F8\n\ -_080443F4:\n\ - movs r0, 0x2D\n\ - b _080443FA\n\ -_080443F8:\n\ - movs r0, 0x2B\n\ -_080443FA:\n\ - bl sub_8043CDC\n\ - lsls r1, r5, 6\n\ - adds r1, r6, r1\n\ - ldr r2, _080444F8 @ =REG_BG0CNT\n\ - bl CpuSet\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - adds r7, 0x1\n\ - cmp r5, r8\n\ - bcc _080443AA\n\ - movs r7, 0x1\n\ - ldr r3, [sp, 0x14]\n\ - lsls r3, 4\n\ - str r3, [sp, 0x18]\n\ - movs r0, 0x1\n\ - add r0, r8\n\ - mov r9, r0\n\ - cmp r7, r9\n\ - bge _08044486\n\ - ldr r1, _080444FC @ =gSprites\n\ - ldr r2, _080444F8 @ =REG_BG0CNT\n\ - mov r10, r2\n\ - ldr r2, [sp, 0x14]\n\ - adds r0, r3, r2\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - mov r8, r0\n\ -_08044436:\n\ - mov r3, r8\n\ - ldrh r0, [r3, 0x4]\n\ - lsls r0, 22\n\ - lsrs r0, 22\n\ - adds r5, r7, 0\n\ - cmp r7, 0\n\ - bge _08044446\n\ - adds r5, r7, 0x7\n\ -_08044446:\n\ - asrs r5, 3\n\ - lsls r4, r5, 3\n\ - subs r4, r7, r4\n\ - adds r0, r4\n\ - lsls r5, 6\n\ - adds r0, r5\n\ - lsls r0, 5\n\ - ldr r2, _08044500 @ =0x06010000\n\ - adds r1, r0, r2\n\ - adds r0, r6, 0\n\ - mov r2, r10\n\ - bl CpuSet\n\ - adds r6, 0x20\n\ - mov r3, r8\n\ - ldrh r0, [r3, 0x4]\n\ - lsls r0, 22\n\ - lsrs r0, 22\n\ - adds r4, 0x8\n\ - adds r0, r4\n\ - adds r0, r5\n\ - lsls r0, 5\n\ - ldr r2, _08044500 @ =0x06010000\n\ - adds r1, r0, r2\n\ - adds r0, r6, 0\n\ - mov r2, r10\n\ - bl CpuSet\n\ - adds r6, 0x20\n\ - adds r7, 0x1\n\ - cmp r7, r9\n\ - blt _08044436\n\ -_08044486:\n\ - ldr r6, _080444FC @ =gSprites\n\ - ldr r3, [sp, 0x18]\n\ - ldr r1, [sp, 0x14]\n\ - adds r0, r3, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrh r5, [r0, 0x38]\n\ - lsls r5, 24\n\ - lsrs r5, 24\n\ - ldr r4, _08044504 @ =0x02000000\n\ - ldr r2, _08044508 @ =0x00016089\n\ - adds r0, r4, r2\n\ - ldrb r1, [r0]\n\ - mov r0, sp\n\ - adds r0, 0x6\n\ - movs r2, 0x1\n\ - movs r3, 0x2\n\ - bl ConvertIntToDecimalStringN\n\ - ldr r3, _0804450C @ =0x00016088\n\ - adds r4, r3\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp, 0x1C]\n\ - movs r2, 0x1\n\ - movs r3, 0x2\n\ - bl ConvertIntToDecimalStringN\n\ - mov r1, sp\n\ - movs r0, 0\n\ - strb r0, [r1, 0x5]\n\ - movs r0, 0xBA\n\ - strb r0, [r1, 0x8]\n\ - movs r0, 0x80\n\ - lsls r0, 18\n\ - bl sub_80034D4\n\ - movs r7, 0\n\ - lsls r0, r5, 4\n\ - adds r0, r5\n\ - lsls r0, 2\n\ - adds r5, r0, r6\n\ - ldr r4, _08044510 @ =0x02000020\n\ -_080444DA:\n\ - cmp r7, 0x1\n\ - bgt _08044514\n\ - ldrh r1, [r5, 0x4]\n\ - lsls r1, 22\n\ - lsrs r1, 22\n\ - adds r0, r7, 0x2\n\ - adds r1, r0\n\ - lsls r1, 5\n\ - ldr r0, _08044500 @ =0x06010000\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - ldr r2, _080444F8 @ =REG_BG0CNT\n\ - bl CpuSet\n\ - b _0804452A\n\ - .align 2, 0\n\ -_080444F8: .4byte 0x04000008\n\ -_080444FC: .4byte gSprites\n\ -_08044500: .4byte 0x06010000\n\ -_08044504: .4byte 0x02000000\n\ -_08044508: .4byte 0x00016089\n\ -_0804450C: .4byte 0x00016088\n\ -_08044510: .4byte 0x02000020\n\ -_08044514:\n\ - ldrh r1, [r5, 0x4]\n\ - lsls r1, 22\n\ - lsrs r1, 22\n\ - adds r1, r7, r1\n\ - lsls r1, 5\n\ - ldr r2, _08044544 @ =0x060100c0\n\ - adds r1, r2\n\ - adds r0, r4, 0\n\ - ldr r2, _08044548 @ =REG_BG0CNT\n\ - bl CpuSet\n\ -_0804452A:\n\ - adds r4, 0x40\n\ - adds r7, 0x1\n\ - cmp r7, 0x4\n\ - ble _080444DA\n\ - add sp, 0x20\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08044544: .4byte 0x060100c0\n\ -_08044548: .4byte 0x04000008\n\ - .syntax divided\n"); -} -#endif - -void sub_804454C(void) -{ - s32 i; - u8 spriteId; - - for (i = 0; i < gNoOfAllBanks; i++) - { - if (gSprites[gHealthboxIDs[i]].callback == SpriteCallbackDummy - && GetBankSide(i) != 1 - && (IsDoubleBattle() || GetBankSide(i) != 0)) - { - u8 r6; - - ewram17800[i].unk0_4 ^= 1; - r6 = ewram17800[i].unk0_4; - if (GetBankSide(i) == 0) - { - - if (!IsDoubleBattle()) - continue; - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - continue; - - if (r6 == 1) - { - spriteId = gSprites[gHealthboxIDs[i]].data5; - - CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); - sub_8044210(gHealthboxIDs[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_HP), 0); - sub_8044210(gHealthboxIDs[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_MAX_HP), 1); - } - else - { - draw_status_ailment_maybe(gHealthboxIDs[i]); - sub_8045A5C(gHealthboxIDs[i], &gPlayerParty[gBattlePartyID[i]], 5); - CpuCopy32(sub_8043CDC(0x75), (void *)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxIDs[i]].oam.tileNum * 32), 32); - } - } - else - { - if (r6 == 1) - { - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - { - sub_8044338(gHealthboxIDs[i], &gEnemyParty[gBattlePartyID[i]]); - } - else - { - spriteId = gSprites[gHealthboxIDs[i]].data5; - - CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); - sub_8044210(gHealthboxIDs[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_HP), 0); - sub_8044210(gHealthboxIDs[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_MAX_HP), 1); - } - } - else - { - draw_status_ailment_maybe(gHealthboxIDs[i]); - sub_8045A5C(gHealthboxIDs[i], &gEnemyParty[gBattlePartyID[i]], 5); - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - sub_8045A5C(gHealthboxIDs[i], &gEnemyParty[gBattlePartyID[i]], 4); - } - } - gSprites[gHealthboxIDs[i]].data7 ^= 1; - } - } -} - -// This function almost matches except for just two instructions around 0x08044B52 that are swapped. -#ifdef NONMATCHING -u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d) -{ - u8 r7; - s16 x; - s16 y; - s16 r8; - s16 r5; - - int i; - u8 sp[6]; - s8 sp14; - u8 sp18; - u8 taskId; - - if (c == 0 || GetBankIdentity(a) != 3) - { - if (GetBankSide(a) == 0) - { - r7 = 0; - x = 136; - y = 96; - r8 = 100; - r5 = -5; - } - else - { - r7 = 1; - if (c == 0 || !IsDoubleBattle()) - { - x = 104; - y = 40; - } - else - { - x = 104; - y = 16; - } - r8 = -100; - r5 = 5; - } - } - else - { - r7 = 1; - x = 104; - y = 40; - r8 = -100; - r5 = 5; - } - //_08044884 - - sp14 = 0; - for (i = 0; i < 6; i++) //_080448A0 - { - if (b[i].unk0 != 0xFFFF) - sp14++; - } - - LoadCompressedObjectPic(&gUnknown_0820A754[r7]); - LoadSpriteSheet(&gUnknown_0820A784[r7]); - LoadSpritePalette(&gUnknown_0820A764[r7]); - LoadSpritePalette(&gUnknown_0820A774[r7]); - - sp18 = CreateSprite(&gSpriteTemplate_820A7A4[r7], x, y, 10); - SetSubspriteTables(&gSprites[sp18], gSubspriteTables_820A6E4); - gSprites[sp18].pos2.x = r8; - gSprites[sp18].data0 = r5; - if (r7 != 0) - { - gSprites[sp18].pos1.x -= 96; - gSprites[sp18].oam.matrixNum = 8; - } - else - { - gSprites[sp18].pos1.x += 0x60; - } - //_0804495A - for (i = 0; i < 6; i++) //_08044970 - { - sp[i] = CreateSpriteAtEnd(&gSpriteTemplate_820A7D4[r7], x, y - 4, 9); - if (d == 0) - { - gSprites[sp[i]].callback = sub_8045180; - } - //_080449A0 - if (r7 == 0) - { - gSprites[sp[i]].pos2.x = 0; - gSprites[sp[i]].pos2.y = 0; - } - //_080449BE - gSprites[sp[i]].data0 = sp18; - if (r7 == 0) - { - gSprites[sp[i]].pos1.x += 10 * i + 24; - gSprites[sp[i]].data1 = i * 7 + 10; - gSprites[sp[i]].pos2.x = 120; - } - //_08044A18 - else - { - gSprites[sp[i]].pos1.x -= 10 * (5 - i) + 24; - gSprites[sp[i]].data1 = (6 - i) * 7 + 10; - gSprites[sp[i]].pos2.x = -120; - } - //_08044A56 - gSprites[sp[i]].data2 = r7; - } - //_08044A76 - if (GetBankSide(a) == 0) - { - for (i = 0; i < 6; i++) //_08044A9A - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) // && b[i] != 0xFFFF && b[i] - { - if (b[i].unk0 == 0xFFFF) - { - //_08044AE6 - gSprites[sp[i]].oam.tileNum += 1; - gSprites[sp[i]].data7 = 1; - // to _08044B52 - } - else if (b[i].unk0 == 0) - { - gSprites[sp[i]].oam.tileNum += 3; - // to _08044B46 - } - else if (b[i].unk4 != 0) - { - gSprites[sp[i]].oam.tileNum += 2; - } - } - //_08044ADC - else - { - if (i >= sp14) - { - //_08044AE6 - gSprites[sp[i]].oam.tileNum += 1; - gSprites[sp[i]].data7 = 1; - // to _08044B52 - } - else if (b[i].unk0 == 0) - { - //_08044B14 - gSprites[sp[i]].oam.tileNum += 3; - // to _08044B46 - } - else if (b[i].unk4 != 0) - { - gSprites[sp[i]].oam.tileNum += 2; - } - } - } - } - //_08044B5E - else - { - // Mismatch occurrs in this loop initialization - for (i = 0; i < 6; i++) - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (b[i].unk0 == 0xFFFF) - { - gSprites[sp[5 - i]].oam.tileNum += 1; - gSprites[sp[5 - i]].data7 = 1; - } - else if (b[i].unk0 == 0) - { - gSprites[sp[5 - i]].oam.tileNum += 3; - } - else if (b[i].unk4 != 0) - { - gSprites[sp[5 - i]].oam.tileNum += 2; - } - } - else - { - if (i >= sp14) - { - gSprites[sp[5 - i]].oam.tileNum += 1; - gSprites[sp[5 - i]].data7 = 1; - } - else if (b[i].unk0 == 0) - { - gSprites[sp[5 - i]].oam.tileNum += 3; - } - else if (b[i].unk4 != 0) - { - gSprites[sp[5 - i]].oam.tileNum += 2; - } - } - // This corrects the initialization order, but messes up the counter update order - asm(""::"r"(&b[i])); - } - } - //_08044C38 - taskId = CreateTask(TaskDummy, 5); - gTasks[taskId].data[0] = a; - gTasks[taskId].data[1] = sp18; - for (i = 0; i < 6; i++) - gTasks[taskId].data[3 + i] = sp[i]; - gTasks[taskId].data[10] = d; - PlaySE12WithPanning(SE_TB_START, 0); - return taskId; -} -#else -__attribute__((naked)) -u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x28\n\ - str r1, [sp, 0xC]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x8]\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - adds r4, r2, 0\n\ - lsls r3, 24\n\ - lsrs r3, 24\n\ - str r3, [sp, 0x10]\n\ - cmp r4, 0\n\ - beq _08044834\n\ - bl GetBankIdentity\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x3\n\ - beq _08044878\n\ -_08044834:\n\ - ldr r0, [sp, 0x8]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08044854\n\ - movs r7, 0\n\ - movs r1, 0x88\n\ - movs r2, 0x60\n\ - movs r0, 0x64\n\ - mov r8, r0\n\ - ldr r5, _08044850 @ =0x0000fffb\n\ - b _08044884\n\ - .align 2, 0\n\ -_08044850: .4byte 0x0000fffb\n\ -_08044854:\n\ - movs r7, 0x1\n\ - cmp r4, 0\n\ - beq _08044864\n\ - bl IsDoubleBattle\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0804486A\n\ -_08044864:\n\ - movs r1, 0x68\n\ - movs r2, 0x28\n\ - b _0804486E\n\ -_0804486A:\n\ - movs r1, 0x68\n\ - movs r2, 0x10\n\ -_0804486E:\n\ - ldr r3, _08044874 @ =0x0000ff9c\n\ - mov r8, r3\n\ - b _08044882\n\ - .align 2, 0\n\ -_08044874: .4byte 0x0000ff9c\n\ -_08044878:\n\ - movs r7, 0x1\n\ - movs r1, 0x68\n\ - movs r2, 0x28\n\ - ldr r5, _08044930 @ =0x0000ff9c\n\ - mov r8, r5\n\ -_08044882:\n\ - movs r5, 0x5\n\ -_08044884:\n\ - movs r6, 0\n\ - str r6, [sp, 0x14]\n\ - lsls r4, r7, 3\n\ - ldr r0, _08044934 @ =gUnknown_0820A754\n\ - mov r10, r0\n\ - lsls r3, r7, 1\n\ - mov r9, r3\n\ - lsls r1, 16\n\ - str r1, [sp, 0x20]\n\ - lsls r2, 16\n\ - str r2, [sp, 0x24]\n\ - ldr r2, _08044938 @ =0x0000ffff\n\ - ldr r1, [sp, 0xC]\n\ - movs r6, 0x5\n\ -_080448A0:\n\ - ldrh r0, [r1]\n\ - cmp r0, r2\n\ - beq _080448B4\n\ - ldr r3, [sp, 0x14]\n\ - lsls r0, r3, 24\n\ - movs r3, 0x80\n\ - lsls r3, 17\n\ - adds r0, r3\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x14]\n\ -_080448B4:\n\ - adds r1, 0x8\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _080448A0\n\ - mov r6, r10\n\ - adds r0, r4, r6\n\ - bl LoadCompressedObjectPic\n\ - ldr r0, _0804493C @ =gUnknown_0820A784\n\ - adds r0, r4, r0\n\ - bl LoadSpriteSheet\n\ - ldr r0, _08044940 @ =gUnknown_0820A764\n\ - adds r0, r4, r0\n\ - bl LoadSpritePalette\n\ - ldr r0, _08044944 @ =gUnknown_0820A774\n\ - adds r0, r4, r0\n\ - bl LoadSpritePalette\n\ - mov r1, r9\n\ - adds r0, r1, r7\n\ - lsls r0, 3\n\ - ldr r1, _08044948 @ =gSpriteTemplate_820A7A4\n\ - adds r0, r1\n\ - ldr r2, [sp, 0x20]\n\ - asrs r1, r2, 16\n\ - ldr r3, [sp, 0x24]\n\ - asrs r2, r3, 16\n\ - movs r3, 0xA\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x18]\n\ - lsls r0, 4\n\ - ldr r6, [sp, 0x18]\n\ - adds r0, r6\n\ - lsls r0, 2\n\ - ldr r1, _0804494C @ =gSprites\n\ - adds r4, r0, r1\n\ - ldr r1, _08044950 @ =gSubspriteTables_820A6E4\n\ - adds r0, r4, 0\n\ - bl SetSubspriteTables\n\ - mov r0, r8\n\ - strh r0, [r4, 0x24]\n\ - strh r5, [r4, 0x2E]\n\ - cmp r7, 0\n\ - beq _08044954\n\ - ldrh r0, [r4, 0x20]\n\ - subs r0, 0x60\n\ - strh r0, [r4, 0x20]\n\ - ldrb r1, [r4, 0x3]\n\ - movs r0, 0x3F\n\ - negs r0, r0\n\ - ands r0, r1\n\ - movs r1, 0x10\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x3]\n\ - b _0804495A\n\ - .align 2, 0\n\ -_08044930: .4byte 0x0000ff9c\n\ -_08044934: .4byte gUnknown_0820A754\n\ -_08044938: .4byte 0x0000ffff\n\ -_0804493C: .4byte gUnknown_0820A784\n\ -_08044940: .4byte gUnknown_0820A764\n\ -_08044944: .4byte gUnknown_0820A774\n\ -_08044948: .4byte gSpriteTemplate_820A7A4\n\ -_0804494C: .4byte gSprites\n\ -_08044950: .4byte gSubspriteTables_820A6E4\n\ -_08044954:\n\ - ldrh r0, [r4, 0x20]\n\ - adds r0, 0x60\n\ - strh r0, [r4, 0x20]\n\ -_0804495A:\n\ - movs r6, 0\n\ - ldr r1, _08044A04 @ =gSprites\n\ - mov r10, r1\n\ - mov r4, sp\n\ - mov r2, r9\n\ - adds r0, r2, r7\n\ - lsls r0, 3\n\ - str r0, [sp, 0x1C]\n\ - movs r3, 0xA\n\ - mov r9, r3\n\ - mov r8, r6\n\ -_08044970:\n\ - ldr r0, _08044A08 @ =gSpriteTemplate_820A7D4\n\ - ldr r5, [sp, 0x24]\n\ - ldr r1, _08044A0C @ =0xfffc0000\n\ - adds r2, r5, r1\n\ - ldr r3, [sp, 0x1C]\n\ - adds r0, r3, r0\n\ - ldr r5, [sp, 0x20]\n\ - asrs r1, r5, 16\n\ - asrs r2, 16\n\ - movs r3, 0x9\n\ - bl CreateSpriteAtEnd\n\ - strb r0, [r4]\n\ - ldr r0, [sp, 0x10]\n\ - cmp r0, 0\n\ - bne _080449A0\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 4\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - ldr r2, _08044A10 @ =gSprites + 0x1C\n\ - adds r1, r2\n\ - ldr r0, _08044A14 @ =sub_8045180\n\ - str r0, [r1]\n\ -_080449A0:\n\ - ldr r5, _08044A04 @ =gSprites\n\ - cmp r7, 0\n\ - bne _080449BE\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - add r0, r10\n\ - strh r7, [r0, 0x24]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - add r0, r10\n\ - strh r7, [r0, 0x26]\n\ -_080449BE:\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - movs r1, 0\n\ - mov r3, sp\n\ - ldrh r3, [r3, 0x18]\n\ - strh r3, [r0, 0x2E]\n\ - cmp r7, 0\n\ - bne _08044A18\n\ - ldrb r0, [r4]\n\ - lsls r1, r0, 4\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrh r0, [r1, 0x20]\n\ - adds r0, 0x18\n\ - add r0, r8\n\ - strh r0, [r1, 0x20]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - mov r1, r9\n\ - strh r1, [r0, 0x30]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - movs r1, 0x78\n\ - b _08044A56\n\ - .align 2, 0\n\ -_08044A04: .4byte gSprites\n\ -_08044A08: .4byte gSpriteTemplate_820A7D4\n\ -_08044A0C: .4byte 0xfffc0000\n\ -_08044A10: .4byte gSprites + 0x1C\n\ -_08044A14: .4byte sub_8045180\n\ -_08044A18:\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r5\n\ - ldrh r3, [r2, 0x20]\n\ - subs r3, 0x18\n\ - movs r1, 0x5\n\ - subs r1, r6\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 1\n\ - subs r3, r0\n\ - strh r3, [r2, 0x20]\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r5\n\ - movs r1, 0x6\n\ - subs r1, r6\n\ - lsls r0, r1, 3\n\ - subs r0, r1\n\ - adds r0, 0xA\n\ - strh r0, [r2, 0x30]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - ldr r1, _08044AC4 @ =0x0000ff88\n\ -_08044A56:\n\ - strh r1, [r0, 0x24]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - strh r7, [r0, 0x32]\n\ - adds r4, 0x1\n\ - movs r2, 0x7\n\ - add r9, r2\n\ - movs r3, 0xA\n\ - add r8, r3\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - bgt _08044A76\n\ - b _08044970\n\ -_08044A76:\n\ - ldr r0, [sp, 0x8]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08044B5E\n\ - movs r6, 0\n\ - ldr r5, _08044AC8 @ =gBattleTypeFlags\n\ - mov r10, r5\n\ - ldr r0, _08044ACC @ =0x0000ffff\n\ - mov r9, r0\n\ - ldr r7, _08044AD0 @ =gSprites\n\ - ldr r1, _08044AD4 @ =0x000003ff\n\ - mov r12, r1\n\ - ldr r2, _08044AD8 @ =0xfffffc00\n\ - mov r8, r2\n\ - mov r4, sp\n\ - ldr r5, [sp, 0xC]\n\ -_08044A9A:\n\ - mov r3, r10\n\ - ldrh r1, [r3]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08044ADC\n\ - ldrh r0, [r5]\n\ - cmp r0, r9\n\ - beq _08044AE6\n\ - cmp r0, 0\n\ - bne _08044B2E\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x3\n\ - b _08044B46\n\ - .align 2, 0\n\ -_08044AC4: .4byte 0x0000ff88\n\ -_08044AC8: .4byte gBattleTypeFlags\n\ -_08044ACC: .4byte 0x0000ffff\n\ -_08044AD0: .4byte gSprites\n\ -_08044AD4: .4byte 0x000003ff\n\ -_08044AD8: .4byte 0xfffffc00\n\ -_08044ADC:\n\ - ldr r1, [sp, 0x14]\n\ - lsls r0, r1, 24\n\ - asrs r0, 24\n\ - cmp r6, r0\n\ - blt _08044B14\n\ -_08044AE6:\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x1\n\ - mov r0, r12\n\ - ands r1, r0\n\ - mov r0, r8\n\ - ands r0, r3\n\ - orrs r0, r1\n\ - strh r0, [r2, 0x4]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r7\n\ - movs r1, 0x1\n\ - strh r1, [r0, 0x3C]\n\ - b _08044B52\n\ -_08044B14:\n\ - ldrh r0, [r5]\n\ - cmp r0, 0\n\ - bne _08044B2E\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x3\n\ - b _08044B46\n\ -_08044B2E:\n\ - ldr r0, [r5, 0x4]\n\ - cmp r0, 0\n\ - beq _08044B52\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x2\n\ -_08044B46:\n\ - mov r0, r12\n\ - ands r1, r0\n\ - mov r0, r8\n\ - ands r0, r3\n\ - orrs r0, r1\n\ - strh r0, [r2, 0x4]\n\ -_08044B52:\n\ - adds r4, 0x1\n\ - adds r5, 0x8\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08044A9A\n\ - b _08044C38\n\ -_08044B5E:\n\ - movs r6, 0\n\ - ldr r1, _08044BA4 @ =gBattleTypeFlags\n\ - mov r10, r1\n\ - ldr r2, _08044BA8 @ =0x0000ffff\n\ - mov r9, r2\n\ - ldr r7, _08044BAC @ =gSprites\n\ - ldr r3, _08044BB0 @ =0x000003ff\n\ - mov r12, r3\n\ - ldr r5, _08044BB4 @ =0xfffffc00\n\ - mov r8, r5\n\ - ldr r5, [sp, 0xC]\n\ - mov r4, sp\n\ - adds r4, 0x5\n\ -_08044B78:\n\ - mov r0, r10\n\ - ldrh r1, [r0]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08044BB8\n\ - ldrh r0, [r5]\n\ - cmp r0, r9\n\ - beq _08044BC2\n\ - cmp r0, 0\n\ - bne _08044C0A\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x3\n\ - b _08044C22\n\ - .align 2, 0\n\ -_08044BA4: .4byte gBattleTypeFlags\n\ -_08044BA8: .4byte 0x0000ffff\n\ -_08044BAC: .4byte gSprites\n\ -_08044BB0: .4byte 0x000003ff\n\ -_08044BB4: .4byte 0xfffffc00\n\ -_08044BB8:\n\ - ldr r1, [sp, 0x14]\n\ - lsls r0, r1, 24\n\ - asrs r0, 24\n\ - cmp r6, r0\n\ - blt _08044BF0\n\ -_08044BC2:\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x1\n\ - mov r0, r12\n\ - ands r1, r0\n\ - mov r0, r8\n\ - ands r0, r3\n\ - orrs r0, r1\n\ - strh r0, [r2, 0x4]\n\ - ldrb r1, [r4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r7\n\ - movs r1, 0x1\n\ - strh r1, [r0, 0x3C]\n\ - b _08044C2E\n\ -_08044BF0:\n\ - ldrh r0, [r5]\n\ - cmp r0, 0\n\ - bne _08044C0A\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x3\n\ - b _08044C22\n\ -_08044C0A:\n\ - ldr r0, [r5, 0x4]\n\ - cmp r0, 0\n\ - beq _08044C2E\n\ - ldrb r0, [r4]\n\ - lsls r2, r0, 4\n\ - adds r2, r0\n\ - lsls r2, 2\n\ - adds r2, r7\n\ - ldrh r3, [r2, 0x4]\n\ - lsls r1, r3, 22\n\ - lsrs r1, 22\n\ - adds r1, 0x2\n\ -_08044C22:\n\ - mov r0, r12\n\ - ands r1, r0\n\ - mov r0, r8\n\ - ands r0, r3\n\ - orrs r0, r1\n\ - strh r0, [r2, 0x4]\n\ -_08044C2E:\n\ - subs r4, 0x1\n\ - adds r5, 0x8\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08044B78\n\ -_08044C38:\n\ - ldr r0, _08044C98 @ =TaskDummy\n\ - movs r1, 0x5\n\ - bl CreateTask\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldr r2, _08044C9C @ =gTasks\n\ - lsls r3, r4, 2\n\ - adds r1, r3, r4\n\ - lsls r1, 3\n\ - adds r0, r1, r2\n\ - mov r5, sp\n\ - ldrh r5, [r5, 0x8]\n\ - strh r5, [r0, 0x8]\n\ - mov r6, sp\n\ - ldrh r6, [r6, 0x18]\n\ - strh r6, [r0, 0xA]\n\ - movs r6, 0\n\ - adds r0, r2, 0\n\ - adds r0, 0xE\n\ - adds r1, r0\n\ -_08044C62:\n\ - mov r5, sp\n\ - adds r0, r5, r6\n\ - ldrb r0, [r0]\n\ - strh r0, [r1]\n\ - adds r1, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08044C62\n\ - adds r0, r3, r4\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - ldrh r6, [r5, 0x10]\n\ - strh r6, [r0, 0x1C]\n\ - movs r0, 0x72\n\ - movs r1, 0\n\ - bl PlaySE12WithPanning\n\ - adds r0, r4, 0\n\ - add sp, 0x28\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08044C98: .4byte TaskDummy\n\ -_08044C9C: .4byte gTasks\n\ - .syntax divided\n"); -} -#endif - -void sub_8044CA0(u8 taskId) -{ - u8 sp[6]; - u8 r9; - u8 r10; - u8 sp8; - s32 i; - - r9 = gTasks[taskId].data[10]; - r10 = gTasks[taskId].data[1]; - sp8 = gTasks[taskId].data[0]; - for (i = 0; i < 6; i++) - sp[i] = gTasks[taskId].data[3 + i]; - - REG_BLDCNT = 0x3F40; - REG_BLDALPHA = 0x10; - gTasks[taskId].data[15] = 16; - for (i = 0; i < 6; i++) - gSprites[sp[i]].oam.objMode = 1; - gSprites[r10].oam.objMode = 1; - if (r9 != 0) - { - for (i = 0; i < 6; i++) - { - if (GetBankSide(sp8) != 0) - { - gSprites[sp[5 - i]].data1 = 7 * i; - gSprites[sp[5 - i]].data3 = 0; - gSprites[sp[5 - i]].data4 = 0; - gSprites[sp[5 - i]].callback = sub_8045110; - } - else - { - gSprites[sp[i]].data1 = 7 * i; - gSprites[sp[i]].data3 = 0; - gSprites[sp[i]].data4 = 0; - gSprites[sp[i]].callback = sub_8045110; - } - } - gSprites[r10].data0 /= 2; - gSprites[r10].data1 = 0; - gSprites[r10].callback = sub_8045048; - SetSubspriteTables(&gSprites[r10], gSubspriteTables_820A6EC); - gTasks[taskId].func = sub_8044E74; - } - else - { - gTasks[taskId].func = sub_8044F70; - } -} - -static void sub_8044E74(u8 taskId) -{ - u16 temp = gTasks[taskId].data[11]++; - - if ((temp & 1) == 0) - { - gTasks[taskId].data[15]--; - if (gTasks[taskId].data[15] < 0) - return; - REG_BLDALPHA = (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8); - } - if (gTasks[taskId].data[15] == 0) - gTasks[taskId].func = sub_8044ECC; -} - -static void sub_8044ECC(u8 taskId) -{ - u8 sp[6]; - s32 i; - - gTasks[taskId].data[15]--; - if (gTasks[taskId].data[15] == -1) - { - u8 var = gTasks[taskId].data[1]; - - for (i = 0; i < 6; i++) - sp[i] = gTasks[taskId].data[3 + i]; - DestroySpriteAndFreeResources(&gSprites[var]); - DestroySpriteAndFreeResources(&gSprites[sp[0]]); - for (i = 1; i < 6; i++) - DestroySprite(&gSprites[sp[i]]); - } - else if (gTasks[taskId].data[15] == -3) - { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroyTask(taskId); - } -} - -static void sub_8044F70(u8 taskId) -{ - u8 sp[6]; - s32 i; - - gTasks[taskId].data[15]--; - // Same as above function except with this check. - if (gTasks[taskId].data[15] >= 0) - { - REG_BLDALPHA = (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8); - } - else if (gTasks[taskId].data[15] == -1) - { - u8 var = gTasks[taskId].data[1]; - - for (i = 0; i < 6; i++) - sp[i] = gTasks[taskId].data[3 + i]; - DestroySpriteAndFreeResources(&gSprites[var]); - DestroySpriteAndFreeResources(&gSprites[sp[0]]); - for (i = 1; i < 6; i++) - DestroySprite(&gSprites[sp[i]]); - } - else if (gTasks[taskId].data[15] == -3) - { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroyTask(taskId); - } -} - -void sub_8045030(struct Sprite *sprite) -{ - if (sprite->pos2.x != 0) - sprite->pos2.x += sprite->data0; -} - -static void sub_8045048(struct Sprite *sprite) -{ - sprite->data1 += 32; - if (sprite->data0 > 0) - sprite->pos2.x += sprite->data1 >> 4; - else - sprite->pos2.x -= sprite->data1 >> 4; - sprite->data1 &= 0xF; -} - -void sub_804507C(struct Sprite *sprite) -{ - u8 r3; - u16 r2; - s8 pan; - - if (sprite->data1 > 0) - { - sprite->data1--; - return; - } - r3 = sprite->data2; - r2 = sprite->data3; - r2 += 56; - sprite->data3 = r2 & 0xFFF0; - if (r3 != 0) - { - sprite->pos2.x += r2 >> 4; - if (sprite->pos2.x > 0) - sprite->pos2.x = 0; - } - else - { - sprite->pos2.x -= r2 >> 4; - if (sprite->pos2.x < 0) - sprite->pos2.x = 0; - } - if (sprite->pos2.x == 0) - { - pan = 63; - if (r3 != 0) - pan = -64; - if (sprite->data7 != 0) - PlaySE2WithPanning(SE_TB_KARA, pan); - else - PlaySE1WithPanning(SE_TB_KON, pan); - sprite->callback = SpriteCallbackDummy; - } -} - -static void sub_8045110(struct Sprite *sprite) -{ - u8 r0; - u16 r2; - - if (sprite->data1 > 0) - { - sprite->data1--; - return; - } - r0 = sprite->data2; - r2 = sprite->data3; - r2 += 56; - sprite->data3 = r2 & 0xFFF0; - if (r0 != 0) - sprite->pos2.x += r2 >> 4; - else - sprite->pos2.x -= r2 >> 4; - if (sprite->pos2.x + sprite->pos1.x > 248 - || sprite->pos2.x + sprite->pos1.x < -8) - { - sprite->invisible = TRUE; - sprite->callback = SpriteCallbackDummy; - } -} - -void sub_8045180(struct Sprite *sprite) -{ - u8 spriteId = sprite->data0; - - sprite->pos2.x = gSprites[spriteId].pos2.x; - sprite->pos2.y = gSprites[spriteId].pos2.y; -} - -static void sub_80451A0(u8 a, struct Pokemon *pkmn) -{ - u8 nickname[POKEMON_NAME_LENGTH]; - u8 gender; - u16 species; - u8 language; - u8 *ptr; - s32 i; - s32 _7; - u8 *const *r1; - - StringCopy(gDisplayedStringBattle, gUnknown_0820A8B0); - GetMonData(pkmn, MON_DATA_NICKNAME, nickname); - StringGetEnd10(nickname); - ptr = StringCopy(gDisplayedStringBattle + 3, nickname); - ptr[0] = EXT_CTRL_CODE_BEGIN; - ptr[1] = 3; - ptr[2] = 2; - ptr[3] = EXT_CTRL_CODE_BEGIN; - ptr[4] = 1; - ptr += 5; - gender = GetMonGender(pkmn); - species = GetMonData(pkmn, MON_DATA_SPECIES); - language = GetMonData(pkmn, MON_DATA_LANGUAGE); - if (sub_8040D3C(species, nickname, language)) - gender = 100; - switch (gender) - { - default: - ptr[0] = 0xB; - ptr[1] = EOS; - ptr += 1; - break; - case MON_MALE: - ptr[0] = 0xB; - ptr[1] = CHAR_MALE; - ptr[2] = EOS; - ptr += 2; - break; - case MON_FEMALE: - ptr[0] = 0xA; - ptr[1] = CHAR_FEMALE; - ptr[2] = EOS; - ptr += 2; - break; - } - ptr[0] = EXT_CTRL_CODE_BEGIN; - ptr[1] = 0x13; - ptr[2] = 0x37; - ptr[3] = EOS; - ptr = (u8 *)0x02000520 + GetBankIdentity(gSprites[a].data6) * 0x180; - sub_80034D4(ptr, gDisplayedStringBattle); - - i = 0; - _7 = 7; - if (GetMonData(pkmn, MON_DATA_LANGUAGE) == 1 - && GetMonData(pkmn, MON_DATA_IS_EGG) == 0) - { - u8 *p = gDisplayedStringBattle; - - while (*p != EOS) - { - if (*p == EXT_CTRL_CODE_BEGIN) - { - p += GetExtCtrlCodeLength(p[1]) + 1; - } - else - { - u8 r0; - - if ((*p >= 0x37 && *p <= 0x4A) || (*p >= 0x87 && *p <= 0x9A)) - r0 = 0x2C; - else if ((*p >= 0x4B && *p <= 0x4F) || (*p >= 0x9B && *p <= 0x9F)) - r0 = 0x2D; - else - r0 = 0x2B; - - CpuCopy32(sub_8043CDC(r0), ptr + 0x40 * i, 32); - i++; - p++; - } - } - } - - for (; i < _7; i++) - CpuCopy32(sub_8043CDC(0x2B), ptr + 64 * i, 32); - - if (GetBankSide(gSprites[a].data6) == 0 && !IsDoubleBattle()) - { - r1 = (u8 *const *)gUnknown_0820A8B4; - for (i = 0; i < _7; i++) - { - u8 *r4 = r1[i]; - - r4 += gSprites[a].oam.tileNum * 32; - CpuCopy32(ptr, r4, 32); - ptr += 32; - - r4 += 0x100; - CpuCopy32(ptr, r4, 32); - ptr += 32; - } - } - else - { - if (GetBankSide(gSprites[a].data6) == 0) - r1 = (u8 *const *)gUnknown_0820A904; - else - r1 = (u8 *const *)gUnknown_0820A8DC; - for (i = 0; i < _7; i++) - { - u8 *r4 = r1[i]; - - r4 += gSprites[a].oam.tileNum * 32; - CpuCopy32(ptr, r4, 32); - ptr += 32; - - r4 += 0x100; - CpuCopy32(ptr, r4, 32); - ptr += 32; - } - } -} - -static void sub_8045458(u8 a, u8 b) -{ - u8 r4; - - if (gBattleTypeFlags & 0x200) - return; - if (gBattleTypeFlags & 8) - return; - - r4 = gSprites[a].data6; - if (GetBankSide(r4) != 0) - { - u16 species = GetMonData(&gEnemyParty[gBattlePartyID[r4]], MON_DATA_SPECIES); - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(species), 1) != 0) - { - r4 = gSprites[a].data5; - if (b != 0) - CpuCopy32(sub_8043CDC(0x46), (void *)(OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 8) * 32), 32); - else - CpuFill32(0, (void *)(OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 8) * 32), 32); - } - } -} - -static void draw_status_ailment_maybe(u8 a) -{ - s32 r4; - s32 r4_2; - u8 r7; - u8 r10; - s16 r8; - const u8 *r6; - u8 r0; - s32 i; - - r7 = gSprites[a].data6; - r10 = gSprites[a].data5; - if (GetBankSide(r7) == 0) - { - r4 = GetMonData(&gPlayerParty[gBattlePartyID[r7]], MON_DATA_STATUS); - if (!IsDoubleBattle()) - r8 = 0x1A; - else - r8 = 0x12; - } - else - { - r4 = GetMonData(&gEnemyParty[gBattlePartyID[r7]], MON_DATA_STATUS); - r8 = 0x11; - } - if (r4 & 7) - { - r6 = sub_8043CDC(sub_80457E8(0x1B, r7)); - r0 = 2; - } - else if (r4 & 0x88) - { - r6 = sub_8043CDC(sub_80457E8(0x15, r7)); - r0 = 0; - } - else if (r4 & 0x10) - { - r6 = sub_8043CDC(sub_80457E8(0x21, r7)); - r0 = 4; - } - else if (r4 & 0x20) - { - r6 = sub_8043CDC(sub_80457E8(0x1E, r7)); - r0 = 3; - } - else if (r4 & 0x40) - { - r6 = sub_8043CDC(sub_80457E8(0x18, r7)); - r0 = 1; - } - else - { - r6 = sub_8043CDC(0x27); - - for (i = 0; i < 3; i++) - CpuCopy32(r6, (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + r8 + i) * 32), 32); - - if (!ewram17800[r7].unk0_4) - CpuCopy32(sub_8043CDC(1), (void *)(OBJ_VRAM0 + gSprites[r10].oam.tileNum * 32), 64); - - sub_8045458(a, 1); - return; - } - - r4_2 = gSprites[a].oam.paletteNum * 16; - r4_2 += r7 + 12; - // I don't like writing the array index like this, but I can't get it to match otherwise. - FillPalette(r0[gBattleInterfaceStatusIcons_DynPal], r4_2 + 0x100, 2); - CpuCopy16(gPlttBufferUnfaded + 0x100 + r4_2, (void *)(OBJ_PLTT + r4_2 * 2), 2); - CpuCopy32(r6, (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + r8) * 32), 96); - if (IsDoubleBattle() == TRUE || GetBankSide(r7) == TRUE) - { - if (!ewram17800[r7].unk0_4) - { - CpuCopy32(sub_8043CDC(0), (void *)(OBJ_VRAM0 + gSprites[r10].oam.tileNum * 32), 32); - CpuCopy32(sub_8043CDC(0x41), (void *)(OBJ_VRAM0 + (gSprites[r10].oam.tileNum + 1) * 32), 32); - } - } - sub_8045458(a, 0); -} - -static u8 sub_80457E8(u8 a, u8 b) -{ - u8 ret = a; - - switch (a) - { - case 21: - if (b == 0) - ret = 21; - else if (b == 1) - ret = 71; - else if (b == 2) - ret = 86; - else - ret = 101; - break; - case 24: - if (b == 0) - ret = 24; - else if (b == 1) - ret = 74; - else if (b == 2) - ret = 89; - else - ret = 104; - break; - case 27: - if (b == 0) - ret = 27; - else if (b == 1) - ret = 77; - else if (b == 2) - ret = 92; - else - ret = 107; - break; - case 30: - if (b == 0) - ret = 30; - else if (b == 1) - ret = 80; - else if (b == 2) - ret = 95; - else - ret = 110; - break; - case 33: - if (b == 0) - ret = 33; - else if (b == 1) - ret = 83; - else if (b == 2) - ret = 98; - else - ret = 113; - break; - } - return ret; -} - -static void sub_80458B0(u8 a) -{ - u8 *r6; - u8 r8; - u8 i; - s32 r7; - u8 *addr; - - r6 = (u8 *)0x02000520 + GetBankIdentity(gSprites[a].data6) * 0x180; - r8 = 7; - sub_80034D4(r6, BattleText_SafariBalls); - for (i = 0; i < r8; i++) - CpuCopy32(sub_8043CDC(0x2B), r6 + i * 64, 32); - for (r7 = 3; r7 < 3 + r8; r7++) - { - addr = (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + MACRO1(r7)) * 32); - CpuCopy32(r6, addr, 32); - r6 += 32; - - addr = (void *)(OBJ_VRAM0 + (8 + gSprites[a].oam.tileNum + MACRO1(r7)) * 32); - CpuCopy32(r6, addr, 32); - r6 += 32; - } - -} - -static void sub_8045998(u8 a) -{ - u8 *r7; - u8 status; - s32 r6; - s32 i; - - r7 = StringCopy(gDisplayedStringBattle, BattleText_SafariBallsLeft); - r7 = sub_8003504(r7, gNumSafariBalls, 10, 1); - StringAppend(r7, BattleText_HighlightRed); - status = GetBankIdentity(gSprites[a].data6); - r7 = (u8 *)0x02000520 + status * 0x180; - r6 = 5; - sub_80034D4(r7, gDisplayedStringBattle); - r7 = (u8 *)0x02000520 + status * 0x180 + 32; - for (i = 6; i < 6 + r6; i++) - { - CpuCopy32(r7, (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + 0x18 + MACRO1(i)) * 32), 32); - r7 += 64; - } -} - -void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) -{ - u8 r10; - u32 maxhp; - u32 currhp; - - r10 = gSprites[a].data6; - if (GetBankSide(r10) == 0) - { - if (c == 3 || c == 0) - sub_8043FC0(a, GetMonData(pkmn, MON_DATA_LEVEL)); - if (c == 1 || c == 0) - sub_80440EC(a, GetMonData(pkmn, MON_DATA_HP), 0); - if (c == 2 || c == 0) - sub_80440EC(a, GetMonData(pkmn, MON_DATA_MAX_HP), 1); - if (c == 5 || c == 0) - { - load_gfxc_health_bar(0); - maxhp = GetMonData(pkmn, MON_DATA_MAX_HP); - currhp = GetMonData(pkmn, MON_DATA_HP); - sub_8043D84(r10, a, maxhp, currhp, 0); - sub_8045C78(r10, a, 0, 0); - } - if (!IsDoubleBattle() && (c == 6 || c == 0)) - { - u16 species; - u8 level; - u32 exp; - u32 var1; - u32 var2; - u32 currLevelExp; - - load_gfxc_health_bar(3); - species = GetMonData(pkmn, MON_DATA_SPECIES); - level = GetMonData(pkmn, MON_DATA_LEVEL); - exp = GetMonData(pkmn, MON_DATA_EXP); - currLevelExp = gExperienceTables[gBaseStats[species].growthRate][level]; - var1 = exp - currLevelExp; - var2 = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLevelExp; - sub_8043D84(r10, a, var2, var1, 0); - sub_8045C78(r10, a, 1, 0); - } - if (c == 4 || c == 0) - sub_80451A0(a, pkmn); - if (c == 9 || c == 0) - draw_status_ailment_maybe(a); - if (c == 10) - sub_80458B0(a); - if (c == 10 || c == 11) - sub_8045998(a); - } - else - { - if (c == 3 || c == 0) - sub_8043FC0(a, GetMonData(pkmn, MON_DATA_LEVEL)); - if (c == 5 || c == 0) - { - load_gfxc_health_bar(0); - maxhp = GetMonData(pkmn, MON_DATA_MAX_HP); - currhp = GetMonData(pkmn, MON_DATA_HP); - sub_8043D84(r10, a, maxhp, currhp, 0); - sub_8045C78(r10, a, 0, 0); - } - if (c == 4 || c == 0) - sub_80451A0(a, pkmn); - if (c == 9 || c == 0) - draw_status_ailment_maybe(a); - } -} - -s32 sub_8045C78(u8 a, u8 unused1, u8 c, u8 unused2) -{ - s32 r6; - - if (c == 0) - { - r6 = sub_8045F58(ewram17850[a].unk4, ewram17850[a].unk8, ewram17850[a].unkC, &ewram17850[a].unk10, 6, 1); - } - else - { - u16 r5; - s32 r8; - - r5 = GetScaledExpFraction(ewram17850[a].unk8, ewram17850[a].unkC, ewram17850[a].unk4, 8); - if (r5 == 0) - r5 = 1; - r8 = ewram17850[a].unkC; - r5 = ABS(r8 / r5); - r6 = sub_8045F58(ewram17850[a].unk4, ewram17850[a].unk8, r8, &ewram17850[a].unk10, 8, r5); - } - if (c == 1 || (c == 0 && (!ewram17800[a].unk0_4))) - sub_8045D58(a, c); - if (r6 == -1) - ewram17850[a].unk10 = 0; - return r6; -} - -static void sub_8045D58(u8 a, u8 b) -{ - u8 sp8[7]; - u8 r0; - u8 r8; - u8 i; - - switch (b) - { - case 0: - r0 = sub_804602C(ewram17850[a].unk4, ewram17850[a].unk8, ewram17850[a].unkC, &ewram17850[a].unk10, sp8, 6); - r8 = 3; - if (r0 <= 0x18) - { - r8 = 0x38; - if (r0 > 9) - r8 = 0x2F; - } - for (i = 0; i < 6; i++) - { - u8 r4 = gSprites[ewram17850[a].unk0].data5; - if (i < 2) - CpuCopy32(sub_8043CDC(r8) + sp8[i] * 32, (void *)(OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 2 + i) * 32), 32); - else - CpuCopy32(sub_8043CDC(r8) + sp8[i] * 32, (void *)(OBJ_VRAM0 + 64 + (i + gSprites[r4].oam.tileNum) * 32), 32); - } - break; - case 1: - sub_804602C(ewram17850[a].unk4, ewram17850[a].unk8, ewram17850[a].unkC, &ewram17850[a].unk10, sp8, 8); - r0 = GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_LEVEL); - if (r0 == 100) - { - for (i = 0; i < 8; i++) - sp8[i] = 0; - } - for (i = 0; i < 8; i++) - { - if (i < 4) - CpuCopy32(sub_8043CDC(0xC) + sp8[i] * 32, (void *)(OBJ_VRAM0 + (gSprites[ewram17850[a].unk0].oam.tileNum + 0x24 + i) * 32), 32); - else - CpuCopy32(sub_8043CDC(0xC) + sp8[i] * 32, (void *)(OBJ_VRAM0 + 0xB80 + (i + gSprites[ewram17850[a].unk0].oam.tileNum) * 32), 32); - } - break; - } -} - -static int sub_8045F58(s32 a, s32 b, int c, int *d, u8 e, u16 f) -{ - u8 r2 = e << 3; - int r6; - int ret; - - if (*d == -32768) - { - if (a < r2) - *d = b << 8; - else - *d = b; - } - //_08045F8A - b -= c; - if (b < 0) - b = 0; - else if (b > a) - b = a; - if (a < r2) - { - int var = *d >> 8; - - r6 = *d; - if (b == var && (r6 & 0xFF) == 0) - return -1; - } - else - { - r6 = *d; - if (b == r6) - return -1; - } - //_08045FC4 - if (a < r2) - { - int r0 = (a << 8) / r2; - - if (c < 0) - { - *d = r6 + r0; - ret = *d >> 8; - if (ret >= b) - { - *d = b << 8; - ret = b; - } - } - //_08045FE2 - else - { - *d = r6 - r0; - ret = *d >> 8; - if ((*d & 0xFF) > 0) - ret++; - if (ret <= b) - { - *d = b << 8; - ret = b; - } - } - } - else - { - //_08045FFE - if (c < 0) - { - *d += f; - if (*d > b) - *d = b; - ret = *d; - } - //_08046010 - else - { - *d -= f; - if (*d < b) - *d = b; - ret = *d; - } - } - return ret; -} - -static u8 sub_804602C(int a, int b, int c, int *d, u8 *e, u8 f) -{ - s32 r5 = b - c; - u8 r3; - u8 i; - u8 r2; - - if (r5 < 0) - r5 = 0; - else if (r5 > a) - r5 = a; - r3 = f << 3; - for (i = 0; i < f; i++) - e[i] = 0; - if (a < r3) - r2 = *d * r3 / a >> 8; - else - r2 = *d * r3 / a; - r3 = r2; - if (r3 == 0 && r5 > 0) - { - e[0] = 1; - r3 = 1; - } - else - { - for (i = 0; i < f; i++) - { - if (r2 >= 8) - { - e[i] = 8; - } - else - { - e[i] = r2; - break; - } - r2 -= 8; - } - } - return r3; -} - -s16 sub_80460C8(struct BattleInterfaceStruct1 *a, int *b, void *c, int d) -{ - u16 r7; - s16 r1; - - r7 = sub_8045F58(a->unk0, a->unk4, a->unk8, b, 6, 1); - sub_8046128(a, b, c); - if (a->unk0 < 0x30) - r1 = *b >> 8; - else - r1 = *b; - do_nothing(a->unk0, r1, d); - return r7; -} - -static void sub_8046128(struct BattleInterfaceStruct1 *a, int *b, void *c) -{ - u8 sp8[6]; - u16 sp10[6]; - u8 i; - - sub_804602C(a->unk0, a->unk4, a->unk8, b, (u8 *)sp8, 6); - for (i = 0; i < 6; i++) - sp10[i] = (a->unkC_0 << 12) | (a->unk10 + sp8[i]); - CpuCopy16(sp10, c, sizeof(sp10)); -} - -static u8 GetScaledExpFraction(int a, int b, int c, u8 d) -{ - u8 r7 = d * 8; - int r5 = a - b; - s8 r4; - s8 r0; - s32 result; - - if (r5 < 0) - r5 = 0; - else if (r5 > c) - r5 = c; - - r4 = a * r7 / c; - r0 = r5 * r7 / c; - result = r4 - r0; - return ABS(result); -} - -u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale) -{ - u8 result = hp * scale / maxhp; - - if (result == 0 && hp > 0) - return 1; - return result; -} - -u8 GetHPBarLevel(s16 hp, s16 maxhp) -{ - int result; - - if (hp == maxhp) - result = 4; - else - { - u8 fraction = GetScaledHPFraction(hp, maxhp, 48); - if (fraction > 24) - result = 3; - else if (fraction > 9) - result = 2; - else if (fraction > 0) - result = 1; - else - result = 0; - } - return result; -} diff --git a/src/battle_party_menu.c b/src/battle_party_menu.c deleted file mode 100644 index 73b847713..000000000 --- a/src/battle_party_menu.c +++ /dev/null @@ -1,756 +0,0 @@ -#include "global.h" -#include "battle_party_menu.h" -#include "battle.h" -#include "item_menu.h" -#include "item_use.h" -#include "main.h" -#include "menu.h" -#include "menu_helpers.h" -#include "palette.h" -#include "party_menu.h" -#include "pokemon.h" -#include "pokemon_summary_screen.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" - -extern u8 ewram[]; -#define UNK_201606C_ARRAY (ewram + 0x1606C) // lazy define but whatever. - -extern u8 IsLinkDoubleBattle(void); -extern void TryCreatePartyMenuMonIcon(u8, u8, struct Pokemon *); -extern void LoadHeldItemIconGraphics(void); -extern void CreateHeldItemIcons_806DC34(); -extern u8 sub_806BD58(u8, u8); -extern void PartyMenuPrintMonsLevelOrStatus(void); -extern void PrintPartyMenuMonNicknames(void); -extern void PartyMenuTryPrintMonsHP(void); -extern void nullsub_13(void); -extern void PartyMenuDrawHPBars(void); -extern u8 sub_806B58C(u8); -extern u8 GetItemEffectType(); -extern void sub_806E750(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, int); -extern u16 sub_806BD80(); -extern u8 sub_806CA38(); -extern void sub_806D5A4(void); -extern void sub_802E414(void); -extern void sub_80A6DCC(void); -extern void sub_806AF4C(); -extern u8 sub_80F9344(void); -extern u8 sub_806B124(void); -extern void sub_806C994(); -extern void sub_806BF74(); -extern void sub_806AEDC(void); -extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, u8); -extern void sub_806E7D0(u8, const struct PartyPopupMenu *); -extern u8 *sub_8040D08(); -extern void sub_8040B8C(void); -extern void sub_806E6F0(); -extern void sub_806D538(); -extern void nullsub_14(); -extern void OpenPartyMenu(); -extern u8 sub_803FBBC(void); - -extern u8 gPlayerPartyCount; -extern u8 gNoOfAllBanks; -extern u16 gBattlePartyID[]; -extern u8 gBankInMenu; -extern u8 gUnknown_0202E8F4; -extern u8 gUnknown_0202E8F5; -extern u8 gUnknown_0202E8F6; -extern u8 gUnknown_02038470[3]; -extern u8 gUnknown_02038473; -extern u8 gUnknown_020384F0; -extern void (*gUnknown_03004AE4)(); //don't know types yet -extern struct PokemonStorage gPokemonStorage; -extern void nullsub_14(); - -void sub_8094C98(u8, u8); -u8 pokemon_order_func(u8); - -static void sub_8094998(u8[3], u8); -static void sub_8094A74(u8[3], u8, u32); -static void sub_8094D60(void); -static void Task_809527C(u8); -static void Task_80952B4(u8); -static void Task_80952E4(u8); -static void Task_8095330(u8); -static void Task_809538C(void); -static void Task_HandlePopupMenuInput(u8); -static void Task_BattlePartyMenuSummary(u8 taskId); -static void Task_BattlePartyMenuShift(u8 taskId); -static void Task_BattlePartyMenuCancel(u8 taskId); - -static const struct PartyMenuItem sBattlePartyMenuActions[] = -{ - {OtherText_Summary, Task_BattlePartyMenuSummary}, - {gOtherText_CancelNoTerminator, Task_BattlePartyMenuCancel}, - {OtherText_Shift, Task_BattlePartyMenuShift}, - {OtherText_SendOut, Task_BattlePartyMenuShift}, -}; -static const u8 Unknown_83B5FEC[] = {2, 0, 1}; //SHIFT, SUMMARY, CANCEL -static const u8 Unknown_83B5FEF[] = {3, 0, 1}; //SEND OUT, SUMMARY, CANCEL -static const u8 Unknown_83B5FF2[] = {0, 1}; //SUMMARY, CANCEL -static const struct PartyPopupMenu sBattlePartyPopupMenus[] = -{ - {ARRAY_COUNT(Unknown_83B5FEC), 9, Unknown_83B5FEC}, - {ARRAY_COUNT(Unknown_83B5FEF), 9, Unknown_83B5FEF}, - {ARRAY_COUNT(Unknown_83B5FF2), 9, Unknown_83B5FF2}, -}; - -void unref_sub_8094928(struct PokemonStorage *ptr) -{ - *ptr = gPokemonStorage; -} - -void unref_sub_8094940(struct PokemonStorage *ptr) -{ - gPokemonStorage = *ptr; -} - -void sub_8094958(void) -{ - sub_8094998(gUnknown_02038470, sub_803FBBC()); -} - -void sub_8094978(u8 arg1, u8 arg2) -{ - sub_8094A74((UNK_201606C_ARRAY) + arg1 * 3, arg2, arg1); -} - -static void sub_8094998(u8 arg[3], u8 player_number) -{ - int i; - u32 pos; - u8 temp[6]; - if (IsLinkDoubleBattle() == TRUE) - { - if (player_number) - { - *arg = 0x30; - arg[1] = 0x45; - arg[2] = 0x12; - } - else - { - *arg = 0x03; - arg[1] = 0x12; - arg[2] = 0x45; - } - } - else - { - if (!IsDoubleBattle()) - { - pos = 1; - *temp = gBattlePartyID[GetBankByPlayerAI(0)]; - for (i = 0; i <= 5; i++) - if (i != *temp) - temp[pos++] = i; - } - else - { - pos = 2; - *temp = gBattlePartyID[GetBankByPlayerAI(0)]; - temp[1] = gBattlePartyID[GetBankByPlayerAI(2)]; - for (i = 0; i <= 5; i++) - if ((i != *temp) && (i != temp[1])) - temp[pos++] = i; - } - for (i = 0; i <= 2; i++) - arg[i] = (temp[i << 1] << 4) | temp[(i << 1) + 1]; - } -} - -static void sub_8094A74(u8 arg[3], u8 player_number, u32 arg3) -{ - int i, j; - u8 temp[6]; - if (!GetBankSide(arg3)) - { - i = GetBankByPlayerAI(0); - j = GetBankByPlayerAI(2); - } - else - { - i = GetBankByPlayerAI(1); - j = GetBankByPlayerAI(3); - } - if (IsLinkDoubleBattle() == TRUE) - { - if (player_number) - { - *arg = 0x30; - arg[1] = 0x45; - arg[2] = 0x12; - } - else - { - *arg = 0x03; - arg[1] = 0x12; - arg[2] = 0x45; - } - } - else - { - if (!IsDoubleBattle()) - { - int pos = 1; - *temp = gBattlePartyID[i]; - for (i = 0; i <= 5; i++) - if (i != *temp) - temp[pos++] = i; - } - else - { - int pos = 2; - *temp = gBattlePartyID[i]; - temp[1] = gBattlePartyID[j]; - for (i = 0; i <= 5; i++) - if ((i != *temp) && (i != temp[1])) - temp[pos++] = i; - } - for (i = 0; i <= 2; i++) - arg[i] = (temp[i << 1] << 4) | temp[(i << 1) + 1]; - } -} - -void sub_8094B6C(u8 a, u8 b, u8 c) -{ - s32 i; - s32 j; - u8 temp[6]; - u8 r3; - u8 r7 = 0; - - if (IsLinkDoubleBattle()) - { - u8 *arr = ewram + 0x1606C + a * 3; - - for (i = 0, j = 0; i < 3; i++) - { - temp[j++] = arr[i] >> 4; - temp[j++] = arr[i] & 0xF; - } - r3 = temp[c]; - for (i = 0; i < 6; i++) - { - if (temp[i] == b) - { - r7 = temp[i]; - temp[i] = r3; - break; - } - } - if (i != 6) - { - temp[c] = r7; - - arr[0] = (temp[0] << 4) | temp[1]; - arr[1] = (temp[2] << 4) | temp[3]; - arr[2] = (temp[4] << 4) | temp[5]; - } - } -} - -u8 sub_8094C20(u8 a) -{ - u8 retVal; - u8 val = a & 1; - - a /= 2; - if (val) - retVal = gUnknown_02038470[a] & 0xF; - else - retVal = gUnknown_02038470[a] >> 4; - return retVal; -} - -void sub_8094C54(u8 a, u8 b) -{ - u8 val = a & 1; - - a /= 2; - if (val) - gUnknown_02038470[a] = (gUnknown_02038470[a] & 0xF0) | b; - else - gUnknown_02038470[a] = (gUnknown_02038470[a] & 0xF) | (b << 4); -} - -void sub_8094C98(u8 a, u8 b) -{ - u8 r4 = sub_8094C20(a); - u8 r1 = sub_8094C20(b); - - sub_8094C54(a, r1); - sub_8094C54(b, r4); -} - -u8 pokemon_order_func(u8 a) -{ - u8 i; - u8 r2; - - for (i = 0, r2 = 0; i < 3; i++) - { - if ((gUnknown_02038470[i] >> 4) == a) - return r2; - r2++; - if ((gUnknown_02038470[i] & 0xF) == a) - return r2; - r2++; - } - return 0; -} - -void pokemon_change_order(void) -{ - u8 i; - - memcpy(ewram1B000.unk0, gPlayerParty, sizeof(gPlayerParty)); - for (i = 0; i < 6; i++) - { - u8 n = pokemon_order_func(i); - - memcpy(&gPlayerParty[n], &ewram1B000.unk0[i], sizeof(struct Pokemon)); - } -} - -static void sub_8094D60(void) -{ - struct Pokemon temp[6]; - u8 i; - - memcpy(temp, gPlayerParty, sizeof(gPlayerParty)); - for (i = 0; i < 6; i++) - { - u8 n = sub_8094C20(i); - - memcpy(&gPlayerParty[n], &temp[i], sizeof(struct Pokemon)); - } -} - -void unref_sub_8094DB0(void) -{ - u8 i; - u8 r4; - - for (i = 1; i < 6; i++) - { - u8 n = sub_8094C20(i); - - if (GetMonData(&gPlayerParty[n], MON_DATA_SPECIES) != 0 - && GetMonData(&gPlayerParty[n], MON_DATA_HP) != 0) - { - r4 = sub_8094C20(0); - sub_8094C98(0, i); - sub_806E6F0(&gPlayerParty[r4], &gPlayerParty[n]); - break; - } - } -} - -void sub_8094E20(u8 a) -{ - gPaletteFade.bufferTransferDisabled = TRUE; - gUnknown_02038473 = a; - nullsub_14(); - pokemon_change_order(); - OpenPartyMenu(1, 0xFF); -} - -void sub_8094E4C(void) -{ - sub_8094E20(3); -} - -int SetUpBattlePartyMenu(void) -{ - switch (EWRAM_1B000.unk264) - //switch (ewram1B000.unk264[0]) - { - case 0: - //TODO: try to get rid of this duplicate code - if (IsLinkDoubleBattle() == TRUE) - { - if (EWRAM_1B000.unk266 != 6) - { - TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); - EWRAM_1B000.unk266++; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - } - } - else - { - if (EWRAM_1B000.unk266 < 6) - { - TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); - EWRAM_1B000.unk266++; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - } - } - break; - case 1: - LoadHeldItemIconGraphics(); - EWRAM_1B000.unk264++; - break; - case 2: - CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); - EWRAM_1B000.unk264++; - break; - case 3: - if (sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) == 1) - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - } - else - EWRAM_1B000.unk266++; - break; - case 4: - PartyMenuPrintMonsLevelOrStatus(); - EWRAM_1B000.unk264++; - break; - case 5: - PrintPartyMenuMonNicknames(); - EWRAM_1B000.unk264++; - break; - case 6: - PartyMenuTryPrintMonsHP(); - EWRAM_1B000.unk264++; - break; - case 7: - nullsub_13(); - EWRAM_1B000.unk264++; - break; - case 8: - PartyMenuDrawHPBars(); - EWRAM_1B000.unk264++; - break; - case 9: - if (sub_806B58C(EWRAM_1B000.unk266) == 1) - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - } - else - EWRAM_1B000.unk266++; - break; - case 10: - if (gUnknown_02038473 == 3) - { - if (GetItemEffectType(gScriptItemId) == 10) - ewram1B000.unk259 = 0xFF; - else - ewram1B000.unk259 = 3; - } - return TRUE; - } - return FALSE; -} - -static void sub_8095050(u8 a, u8 b) -{ - if (!GetMonData(&gPlayerParty[b], MON_DATA_IS_EGG)) - { - if (gUnknown_02038473 == 1) - { - gTasks[EWRAM_1B000.unk260].data[4] = 1; - gTasks[EWRAM_1B000.unk260].data[5] = 1; - } - else - { - gTasks[EWRAM_1B000.unk260].data[4] = 0; - gTasks[EWRAM_1B000.unk260].data[5] = 0; - } - } - else - { - gTasks[EWRAM_1B000.unk260].data[4] = 2; - gTasks[EWRAM_1B000.unk260].data[5] = 2; - } - sub_806E750(gTasks[a].data[4], sBattlePartyPopupMenus, sBattlePartyMenuActions, 0); -} - -void SetUpBattlePokemonMenu(u8 a) -{ - if (!gPaletteFade.active) - { - if (gUnknown_02038473 == 3 && GetItemEffectType(gScriptItemId) == 10) - { - gUnknown_03004AE4(a, gScriptItemId, Task_80952E4); - return; - } - - switch (sub_806BD80(a)) - { - case 1: - if (gUnknown_02038473 == 3) - { - if (GetMonData(&gPlayerParty[sub_806CA38(a)], MON_DATA_IS_EGG)) - PlaySE(SE_HAZURE); - else - { - sub_806D5A4(); - gUnknown_03004AE4(a, gScriptItemId, Task_80952E4); - } - } - else - { - PlaySE(SE_SELECT); - GetMonNickname(&gPlayerParty[sub_806CA38(a)], gStringVar1); - sub_8095050(a, sub_806CA38(a)); - SetTaskFuncWithFollowupFunc(a, Task_HandlePopupMenuInput, SetUpBattlePokemonMenu); - } - break; - case 2: - if (gUnknown_02038473 == 1) - PlaySE(SE_HAZURE); - else - { - PlaySE(SE_SELECT); - if (gUnknown_02038473 == 3) - { - gUnknown_0202E8F4 = 0; - gTasks[a].func = Task_80952E4; - } - else - { - gUnknown_0202E8F4 = 0; - gTasks[a].func = Task_809527C; - } - } - break; - } - } -} - -static void Task_809527C(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = Task_80952B4; -} - -static void Task_80952B4(u8 taskId) -{ - if (!gPaletteFade.active) - { - sub_8094D60(); - DestroyTask(taskId); - SetMainCallback2(sub_802E414); - } -} - -static void Task_80952E4(u8 taskId) -{ - if (gUnknown_0202E8F4 != 0) - Task_809527C(taskId); - else - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = Task_8095330; - } -} - -static void Task_8095330(u8 taskId) -{ - if (!gPaletteFade.active) - { - sub_8094D60(); - DestroyTask(taskId); - sub_80A6DCC(); - } -} - -static void Task_809535C(void) -{ - gPaletteFade.bufferTransferDisabled = TRUE; - sub_806AF4C(1, 0xFF, SetUpBattlePokemonMenu, 5); - SetMainCallback2(Task_809538C); -} - -static void Task_809538C(void) -{ - do - { - if (sub_806B124() == 1) - { - sub_806C994(EWRAM_1B000.unk260, gUnknown_020384F0); - sub_806BF74(EWRAM_1B000.unk260, 0); - GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); - sub_8095050(EWRAM_1B000.unk260, gUnknown_020384F0); - SetTaskFuncWithFollowupFunc(EWRAM_1B000.unk260, Task_HandlePopupMenuInput, SetUpBattlePokemonMenu); - SetMainCallback2(sub_806AEDC); - return; - } - } while (sub_80F9344() != 1); -} - -static void Task_HandlePopupMenuInput(u8 taskId) -{ - TaskFunc func; - - if (!gPaletteFade.active) - { - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - MoveMenuCursor(-1); - return; - } - if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - MoveMenuCursor(1); - return; - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - func = PartyMenuGetPopupMenuFunc(gTasks[taskId].data[4], - sBattlePartyPopupMenus, - sBattlePartyMenuActions, - GetMenuCursorPos()); - func(taskId); - return; - } - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - Task_BattlePartyMenuCancel(taskId); - return; - } - } -} - -static void Task_80954C0(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - Task_BattlePartyMenuCancel(taskId); -} - -static void Task_ShowSummaryScreen(u8 taskId) -{ - u8 partySelection = sub_806CA38(taskId); - - if (!gPaletteFade.active) - { - DestroyTask(taskId); - EWRAM_1B000.unk262 = 1; - ShowPokemonSummaryScreen(gPlayerParty, partySelection, gPlayerPartyCount - 1, Task_809535C, 4); - } -} - -static void Task_BattlePartyMenuSummary(u8 taskId) -{ - sub_806CA38(taskId); //an unused variable was probably set with this. - gTasks[taskId].func = Task_ShowSummaryScreen; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -static void Task_BattlePartyMenuShift(u8 taskId) -{ - u8 partySelection; - u8 i; - u8 r4; - - sub_806E7D0(gTasks[taskId].data[4], sBattlePartyPopupMenus); - partySelection = sub_806CA38(taskId); - if (IsLinkDoubleBattle() == TRUE && (partySelection == 1 || partySelection == 4 || partySelection == 5)) - { - sub_806D5A4(); - StringCopy(gStringVar1, sub_8040D08()); - StringExpandPlaceholders(gStringVar4, gOtherText_CantSwitchPokeWithYours); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - if (GetMonData(&gPlayerParty[partySelection], MON_DATA_HP) == 0) - { - sub_806D5A4(); - GetMonNickname(&gPlayerParty[partySelection], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_NoEnergyLeft); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - for (i = 0; i < gNoOfAllBanks; i++) - { - if (GetBankSide(i) == 0 - && sub_8094C20(partySelection) == gBattlePartyID[i]) - { - sub_806D5A4(); - GetMonNickname(&gPlayerParty[partySelection], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyBattle); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - } - if (GetMonData(&gPlayerParty[partySelection], MON_DATA_IS_EGG)) - { - sub_806D5A4(); - StringExpandPlaceholders(gStringVar4, gOtherText_EGGCantBattle); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - if (sub_8094C20(partySelection) == EWRAM_1609D) - { - sub_806D5A4(); - GetMonNickname(&gPlayerParty[partySelection], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_AlreadySelected); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - if (gUnknown_02038473 == 4) - { - sub_806D5A4(); - sub_8040B8C(); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - if (gUnknown_02038473 == 2) - { - u8 r0; - u8 r4 = gBankInMenu; - - sub_806D5A4(); - r0 = pokemon_order_func(gBattlePartyID[r4]); - GetMonNickname(&gPlayerParty[r0], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_CantBeSwitched); - sub_806E834(gStringVar4, 0); - gTasks[taskId].func = Task_80954C0; - return; - } - gUnknown_0202E8F5 = sub_8094C20(partySelection); - gUnknown_0202E8F4 = 1; - r4 = pokemon_order_func(gBattlePartyID[gBankInMenu]); - sub_8094C98(r4, partySelection); - sub_806E6F0(&gPlayerParty[r4], &gPlayerParty[partySelection]); - gTasks[taskId].func = Task_809527C; -} - -static void Task_BattlePartyMenuCancel(u8 taskId) -{ - HandleDestroyMenuCursors(); - sub_806E7D0(gTasks[taskId].data[4], sBattlePartyPopupMenus); - gTasks[taskId].data[4] = gTasks[taskId].data[5]; - sub_806D538(0, 0); - SwitchTaskToFollowupFunc(taskId); -} diff --git a/src/battle_records.c b/src/battle_records.c deleted file mode 100644 index 61dc09792..000000000 --- a/src/battle_records.c +++ /dev/null @@ -1,334 +0,0 @@ -#include "global.h" -#include "battle_records.h" -#include "game_stat.h" -#include "link.h" -#include "menu.h" -#include "rom4.h" -#include "string_util.h" -#include "strings2.h" -#include "trainer_card.h" - -extern struct LinkPlayerMapObject gLinkPlayerMapObjects[4]; -extern u8 gBattleOutcome; - -static void InitLinkBattleRecord(struct LinkBattleRecord *record) -{ - CpuFill16(0, record, sizeof(struct LinkBattleRecord)); - record->name[0] = 0xFF; - record->trainerId = 0; - record->wins = 0; - record->losses = 0; - record->draws = 0; -} - -static void InitLinkBattleRecords_(struct LinkBattleRecord *records) -{ - int i; - for (i = 0; i < 5; i++) - { - InitLinkBattleRecord(records + i); - } - SetGameStat(GAME_STAT_LINK_BATTLE_WINS, 0); - SetGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 0); - SetGameStat(GAME_STAT_LINK_BATTLE_DRAWS, 0); -} - -static int GetLinkBattleRecordTotalBattles(struct LinkBattleRecord *record) -{ - return record->wins + record->losses + record->draws; -} - -static int FindLinkBattleRecord(struct LinkBattleRecord *records, u8 *name, u16 trainerId) -{ - int i; - - for (i = 0; i < 5; i++) - { - memcpy(gStringVar1, records[i].name, 7); - gStringVar1[7] = EOS; - if (!StringCompareWithoutExtCtrlCodes(gStringVar1, name) && records[i].trainerId == trainerId) - return i; - } - - return 5; -} - -static void SortLinkBattleRecords(struct LinkBattleRecord *records) -{ - int i, j; - - for (i = 4; i > 0; i--) - { - for (j = i - 1; j >= 0; j--) - { - int totalBattlesI = GetLinkBattleRecordTotalBattles(records + i); - int totalBattlesJ = GetLinkBattleRecordTotalBattles(records + j); - - if (totalBattlesI > totalBattlesJ) - { - struct LinkBattleRecord temp = *(records + i); - *(records + i) = *(records + j); - *(records + j) = temp; - } - } - } -} - -static void UpdateLinkBattleRecord(struct LinkBattleRecord *record, int battleOutcome) -{ - switch (battleOutcome) - { - case 1: - record->wins++; - if (record->wins > 9999) - record->wins = 9999; - break; - case 2: - record->losses++; - if (record->losses > 9999) - record->losses = 9999; - break; - case 3: - record->draws++; - if (record->draws > 9999) - record->draws = 9999; - break; - } -} - -static void UpdateLinkBattleGameStats(int battleOutcome) -{ - u8 stat; - - switch (battleOutcome) - { - case 1: - stat = GAME_STAT_LINK_BATTLE_WINS; - break; - case 2: - stat = GAME_STAT_LINK_BATTLE_LOSSES; - break; - case 3: - stat = GAME_STAT_LINK_BATTLE_DRAWS; - break; - default: - return; - } - - if (GetGameStat(stat) < 9999) - IncrementGameStat(stat); -} - -static void UpdateLinkBattleRecords_(struct LinkBattleRecord *records, u8 *name, u16 trainerId, int battleOutcome, u8 language) -{ - int index; - UpdateLinkBattleGameStats(battleOutcome); - SortLinkBattleRecords(records); - index = FindLinkBattleRecord(records, name, trainerId); - if (index == 5) - { - index = 4; - InitLinkBattleRecord(records + index); - if (language == LANGUAGE_JAPANESE) - { - records[index].name[0] = EXT_CTRL_CODE_BEGIN; - records[index].name[1] = 0x15; - StringCopyN(records[index].name + 2, name, 5); - } - else - { - StringCopyN(records[index].name, name, 7); - } - - // needed block to match - { - struct LinkBattleRecord *record = records + index; - record->trainerId = trainerId; - } - } - UpdateLinkBattleRecord(records + index, battleOutcome); - SortLinkBattleRecords(records); -} - -void InitLinkBattleRecords(void) -{ - InitLinkBattleRecords_(gSaveBlock1.linkBattleRecords); -} - -static void IncTrainerCardWins(int id) -{ - u16 *wins = &gTrainerCards[id].linkBattleWins; - (*wins)++; - if (*wins > 9999) - *wins = 9999; -} - -static void IncTrainerCardLosses(int id) -{ - u16 *losses = &gTrainerCards[id].linkBattleLosses; - (*losses)++; - if (*losses > 9999) - *losses = 9999; -} - -static void UpdateTrainerCardWinsLosses(int id) -{ - switch (gBattleOutcome) - { - case 1: - IncTrainerCardWins(id ^ 1); - IncTrainerCardLosses(id); - break; - case 2: - IncTrainerCardLosses(id ^ 1); - IncTrainerCardWins(id); - break; - } -} - -void UpdateLinkBattleRecords(int id) -{ - UpdateTrainerCardWinsLosses(id); - UpdateLinkBattleRecords_( - gSaveBlock1.linkBattleRecords, - gTrainerCards[id].playerName, - gTrainerCards[id].trainerId, - gBattleOutcome, - gLinkPlayers[gLinkPlayerMapObjects[id].linkPlayerId].language); -} - -static void PrintLinkBattleWinsLossesDraws(struct LinkBattleRecord *records) -{ - ConvertIntToDecimalStringN_DigitWidth6(gStringVar1, GetGameStat(GAME_STAT_LINK_BATTLE_WINS), STR_CONV_MODE_RIGHT_ALIGN, 4); - ConvertIntToDecimalStringN_DigitWidth6(gStringVar2, GetGameStat(GAME_STAT_LINK_BATTLE_LOSSES), STR_CONV_MODE_RIGHT_ALIGN, 4); - ConvertIntToDecimalStringN_DigitWidth6(gStringVar3, GetGameStat(GAME_STAT_LINK_BATTLE_DRAWS), STR_CONV_MODE_RIGHT_ALIGN, 4); - MenuPrint(gOtherText_WinRecord, 3, 3); -} - -static void PrintLinkBattleRecord(struct LinkBattleRecord *record, u8 y) -{ - if (!record->wins && !record->losses && !record->draws) - { - u8 buffer[16]; - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x14; - buffer[2] = 6; - buffer[3] = EXT_CTRL_CODE_BEGIN; - buffer[4] = 0x11; - buffer[5] = 1; - StringCopy(buffer + 6, gOtherText_SevenDashes); - MenuPrint(buffer, 3, y); - StringCopy(buffer + 6, gOtherText_FourDashes); - MenuPrint(buffer, 11, y); - MenuPrint(buffer, 17, y); - MenuPrint(buffer, 23, y); - } - else - { - StringFillWithTerminator(gStringVar1, 8); - StringCopyN(gStringVar1, record->name, 7); - MenuPrint(gStringVar1, 3, y); - gStringVar1[0] = EXT_CTRL_CODE_BEGIN; - gStringVar1[1] = 0x14; - gStringVar1[2] = 6; - ConvertIntToDecimalStringN(gStringVar1 + 3, record->wins, STR_CONV_MODE_RIGHT_ALIGN, 4); - MenuPrint(gStringVar1, 11, y); - ConvertIntToDecimalStringN(gStringVar1 + 3, record->losses, STR_CONV_MODE_RIGHT_ALIGN, 4); - MenuPrint(gStringVar1, 17, y); - ConvertIntToDecimalStringN(gStringVar1 + 3, record->draws, STR_CONV_MODE_RIGHT_ALIGN, 4); - MenuPrint(gStringVar1, 23, y); - } -} - -void ShowLinkBattleRecords(void) { - s32 i; - MenuDrawTextWindow(1, 0, 28, 18); - sub_8072BD8((u8 *) gOtherText_BattleResults, 0, 1, 240); - - PrintLinkBattleWinsLossesDraws(gSaveBlock1.linkBattleRecords); -#if ENGLISH - MenuPrint(gOtherText_WinLoseDraw, 12, 6); -#elif GERMAN - MenuPrint_PixelCoords(gOtherText_WinLoseDraw, 88, 48, 1); -#endif - - for (i = 0; i < 5; i++) - { - PrintLinkBattleRecord(&gSaveBlock1.linkBattleRecords[i], 6 + (i + 1) * 2); - } -} - -static bool32 sub_8110494(u8 level) -{ - struct SaveBlock2_Sub *sb2sub = &gSaveBlock2.filler_A8; - - switch (sb2sub->var_4AE[level]) - { - case 0: - return FALSE; - case 1: - return FALSE; - case 2: - return TRUE; - case 4: - return FALSE; - case 3: - return TRUE; - case 5: - return FALSE; - case 6: - return TRUE; - default: - return FALSE; - } -} - -static void PrintWinStreak(const u8 *str, u16 streak, u8 left, u8 top) -{ - MenuPrint(str, left, top); - if (streak > 9999) - streak = 9999; - sub_8072C14(gStringVar1, streak, 24, 1); - MenuPrint(gOtherText_WinStreak, left + 7, top); -} - -static void PrintRecordWinStreak(u8 level, u8 left, u8 top) -{ - struct SaveBlock2_Sub *sb2sub = &gSaveBlock2.filler_A8; - u16 winStreak = sb2sub->recordWinStreak[level]; - PrintWinStreak(gOtherText_Record, winStreak, left, top); -} - -static u16 GetLastWinStreak(u8 level) -{ - u16 result = gSaveBlock2.filler_A8.winStreak[level]; - if (result > 9999) - result = 9999; - return result; -} - -static void PrintLastWinStreak(u8 level, u8 left, u8 top) -{ - u16 winStreak = GetLastWinStreak(level); - if (sub_8110494(level) == TRUE) - PrintWinStreak(gOtherText_Current, winStreak, left, top); - else - PrintWinStreak(gOtherText_Prev, winStreak, left, top); -} - -void ShowBattleTowerRecords(void) -{ - u16 i; - MenuDrawTextWindow(3, 1, 27, 17); - sub_8072BD8(gOtherText_BattleTowerResults, 3, 2, 0xC8); - MenuPrint(gOtherText_Lv50, 5, 6); - MenuPrint(gOtherText_Lv100, 5, 12); - for (i = 5; i < 26; i++) - { - sub_8071F60(CHAR_HYPHEN, i, 10); - } - PrintLastWinStreak(0, 10, 6); - PrintRecordWinStreak(0, 10, 8); - PrintLastWinStreak(1, 10, 12); - PrintRecordWinStreak(1, 10, 14); -} diff --git a/src/battle_setup.c b/src/battle_setup.c deleted file mode 100644 index 04674e739..000000000 --- a/src/battle_setup.c +++ /dev/null @@ -1,1416 +0,0 @@ -#include "global.h" -#include "battle_setup.h" -#include "battle.h" -#include "battle_transition.h" -#include "data2.h" -#include "event_data.h" -#include "field_control_avatar.h" -#include "field_fadetransition.h" -#include "field_map_obj_helpers.h" -#include "field_message_box.h" -#include "field_player_avatar.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "fldeff_80C5CD4.h" -#include "main.h" -#include "map_constants.h" -#include "metatile_behavior.h" -#include "opponent_constants.h" -#include "palette.h" -#include "rng.h" -#include "rom4.h" -#include "safari_zone.h" -#include "script.h" -#include "script_pokemon_80C4.h" -#include "secret_base.h" -#include "songs.h" -#include "sound.h" -#include "species.h" -#include "starter_choose.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" -#include "trainer.h" - -extern u16 gScriptResult; - -extern void (*gFieldCallback)(void); - -EWRAM_DATA u16 gTrainerBattleMode = 0; -EWRAM_DATA u16 gTrainerBattleOpponent = 0; -EWRAM_DATA u16 gTrainerMapObjectLocalId = 0; -EWRAM_DATA u8 *gTrainerIntroSpeech = NULL; -EWRAM_DATA u8 *gTrainerDefeatSpeech = NULL; -EWRAM_DATA u8 *gTrainerVictorySpeech = NULL; -EWRAM_DATA u8 *gTrainerCannotBattleSpeech = NULL; -EWRAM_DATA u8 *gTrainerBattleScriptReturnAddress = NULL; -EWRAM_DATA u8 *gTrainerBattleEndScript = NULL; - -extern u16 gBattleTypeFlags; -extern u16 gScriptLastTalked; -extern u8 gBattleOutcome; - -extern struct MapObject gMapObjects[]; - -extern u8 gUnknown_0819F818[]; -extern u8 gUnknown_0819F840[]; -extern u8 gUnknown_0819F878[]; -extern u8 gUnknown_0819F887[]; -extern u8 gUnknown_0819F8AE[]; - -extern u8 gUnknown_0819F80B[]; -extern u8 gUnknown_081C6C02[]; - - -static const u8 gBattleTransitionTable_Wild[][2] = -{ - {8, 9}, - {5, 10}, - {0, 10}, - {7, 6}, -}; -static const u8 gBattleTransitionTable_Trainer[][2] = -{ - {4, 11}, - {2, 3}, - {0, 10}, - {1, 6}, -}; -static const struct TrainerBattleSpec gTrainerBattleSpecs_0[] = -{ - {&gTrainerBattleMode, 0}, - {&gTrainerBattleOpponent, 1}, - {&gTrainerMapObjectLocalId, 1}, - {&gTrainerIntroSpeech, 2}, - {&gTrainerDefeatSpeech, 2}, - {&gTrainerVictorySpeech, 5}, - {&gTrainerCannotBattleSpeech, 5}, - {&gTrainerBattleEndScript, 5}, - {&gTrainerBattleScriptReturnAddress, 6}, -}; -static const struct TrainerBattleSpec gTrainerBattleSpecs_1[] = -{ - {&gTrainerBattleMode, 0}, - {&gTrainerBattleOpponent, 1}, - {&gTrainerMapObjectLocalId, 1}, - {&gTrainerIntroSpeech, 2}, - {&gTrainerDefeatSpeech, 2}, - {&gTrainerVictorySpeech, 5}, - {&gTrainerCannotBattleSpeech, 5}, - {&gTrainerBattleEndScript, 2}, - {&gTrainerBattleScriptReturnAddress, 6}, -}; -static const struct TrainerBattleSpec gTrainerBattleSpecs_2[] = -{ - {&gTrainerBattleMode, 0}, - {&gTrainerBattleOpponent, 1}, - {&gTrainerMapObjectLocalId, 1}, - {&gTrainerIntroSpeech, 2}, - {&gTrainerDefeatSpeech, 2}, - {&gTrainerVictorySpeech, 5}, - {&gTrainerCannotBattleSpeech, 2}, - {&gTrainerBattleEndScript, 5}, - {&gTrainerBattleScriptReturnAddress, 6}, -}; -static const struct TrainerBattleSpec gTrainerBattleSpecs_3[] = -{ - {&gTrainerBattleMode, 0}, - {&gTrainerBattleOpponent, 1}, - {&gTrainerMapObjectLocalId, 1}, - {&gTrainerIntroSpeech, 5}, - {&gTrainerDefeatSpeech, 2}, - {&gTrainerVictorySpeech, 5}, - {&gTrainerCannotBattleSpeech, 5}, - {&gTrainerBattleEndScript, 5}, - {&gTrainerBattleScriptReturnAddress, 6}, -}; -static const struct TrainerBattleSpec gTrainerBattleSpecs_4[] = -{ - {&gTrainerBattleMode, 0}, - {&gTrainerBattleOpponent, 1}, - {&gTrainerMapObjectLocalId, 1}, - {&gTrainerIntroSpeech, 2}, - {&gTrainerDefeatSpeech, 2}, - {&gTrainerVictorySpeech, 5}, - {&gTrainerCannotBattleSpeech, 2}, - {&gTrainerBattleEndScript, 2}, - {&gTrainerBattleScriptReturnAddress, 6}, -}; - -const struct TrainerEyeTrainer gTrainerEyeTrainers[] = -{ - { - {OPPONENT_ROSE_1, OPPONENT_ROSE_2, OPPONENT_ROSE_3, OPPONENT_ROSE_4, OPPONENT_ROSE_5}, - MAP_GROUP_ROUTE118, - MAP_ID_ROUTE118, - }, - { - {OPPONENT_DUSTY_1, OPPONENT_DUSTY_2, OPPONENT_DUSTY_3, OPPONENT_DUSTY_4, OPPONENT_DUSTY_5}, - MAP_GROUP_ROUTE111, - MAP_ID_ROUTE111, - }, - { - {OPPONENT_LOLA_1, OPPONENT_LOLA_2, OPPONENT_LOLA_3, OPPONENT_LOLA_4, OPPONENT_LOLA_5}, - MAP_GROUP_ROUTE109, - MAP_ID_ROUTE109, - }, - { - {OPPONENT_RICKY_1, OPPONENT_RICKY_2, OPPONENT_RICKY_3, OPPONENT_RICKY_4, OPPONENT_RICKY_5}, - MAP_GROUP_ROUTE109, - MAP_ID_ROUTE109, - }, - { - {OPPONENT_RITA_AND_SAM_1, OPPONENT_RITA_AND_SAM_2, OPPONENT_RITA_AND_SAM_3, OPPONENT_RITA_AND_SAM_4, OPPONENT_RITA_AND_SAM_5}, - MAP_GROUP_ROUTE124, - MAP_ID_ROUTE124, - }, - { - {OPPONENT_BROOKE_1, OPPONENT_BROOKE_2, OPPONENT_BROOKE_3, OPPONENT_BROOKE_4, OPPONENT_BROOKE_5}, - MAP_GROUP_ROUTE111, - MAP_ID_ROUTE111, - }, - { - {OPPONENT_WILTON_1, OPPONENT_WILTON_2, OPPONENT_WILTON_3, OPPONENT_WILTON_4, OPPONENT_WILTON_5}, - MAP_GROUP_ROUTE111, - MAP_ID_ROUTE111, - }, - { - {OPPONENT_VALERIE_1, OPPONENT_VALERIE_2, OPPONENT_VALERIE_3, OPPONENT_VALERIE_4, OPPONENT_VALERIE_5}, - MAP_GROUP_MT_PYRE_6F, - MAP_ID_MT_PYRE_6F, - }, - { - {OPPONENT_CINDY_1, OPPONENT_CINDY_3, OPPONENT_CINDY_4, OPPONENT_CINDY_5, OPPONENT_CINDY_6}, - MAP_GROUP_ROUTE104, - MAP_ID_ROUTE104, - }, - { - {OPPONENT_JESSICA_1, OPPONENT_JESSICA_2, OPPONENT_JESSICA_3, OPPONENT_JESSICA_4, OPPONENT_JESSICA_5}, - MAP_GROUP_ROUTE121, - MAP_ID_ROUTE121, - }, - { - {OPPONENT_WINSTON_1, OPPONENT_WINSTON_2, OPPONENT_WINSTON_3, OPPONENT_WINSTON_4, OPPONENT_WINSTON_5}, - MAP_GROUP_ROUTE104, - MAP_ID_ROUTE104, - }, - { - {OPPONENT_STEVE_1, OPPONENT_STEVE_2, OPPONENT_STEVE_3, OPPONENT_STEVE_4, OPPONENT_STEVE_5}, - MAP_GROUP_ROUTE114, - MAP_ID_ROUTE114, - }, - { - {OPPONENT_TONY_1, OPPONENT_TONY_2, OPPONENT_TONY_3, OPPONENT_TONY_4, OPPONENT_TONY_5}, - MAP_GROUP_ROUTE107, - MAP_ID_ROUTE107, - }, - { - {OPPONENT_NOB_1, OPPONENT_NOB_2, OPPONENT_NOB_3, OPPONENT_NOB_4, OPPONENT_NOB_5}, - MAP_GROUP_ROUTE115, - MAP_ID_ROUTE115, - }, - { - {OPPONENT_DALTON_1, OPPONENT_DALTON_2, OPPONENT_DALTON_3, OPPONENT_DALTON_4, OPPONENT_DALTON_5}, - MAP_GROUP_ROUTE118, - MAP_ID_ROUTE118, - }, - { - {OPPONENT_BERNIE_1, OPPONENT_BERNIE_2, OPPONENT_BERNIE_3, OPPONENT_BERNIE_4, OPPONENT_BERNIE_5}, - MAP_GROUP_ROUTE114, - MAP_ID_ROUTE114, - }, - { - {OPPONENT_ETHAN_1, OPPONENT_ETHAN_2, OPPONENT_ETHAN_3, OPPONENT_ETHAN_4, OPPONENT_ETHAN_5}, - MAP_GROUP_JAGGED_PASS, - MAP_ID_JAGGED_PASS, - }, - { - {OPPONENT_JOHN_AND_JAY_1, OPPONENT_JOHN_AND_JAY_2, OPPONENT_JOHN_AND_JAY_3, OPPONENT_JOHN_AND_JAY_4, OPPONENT_JOHN_AND_JAY_5}, - MAP_GROUP_METEOR_FALLS_1F_2R, - MAP_ID_METEOR_FALLS_1F_2R, - }, - { - {OPPONENT_BRANDON_1, OPPONENT_BRANDON_2, OPPONENT_BRANDON_3, OPPONENT_BRANDON_4, OPPONENT_BRANDON_5}, - MAP_GROUP_ROUTE120, - MAP_ID_ROUTE120, - }, - { - {OPPONENT_CAMERON_1, OPPONENT_CAMERON_2, OPPONENT_CAMERON_3, OPPONENT_CAMERON_4, OPPONENT_CAMERON_5}, - MAP_GROUP_ROUTE123, - MAP_ID_ROUTE123, - }, - { - {OPPONENT_JACKI_1, OPPONENT_JACKI_2, OPPONENT_JACKI_3, OPPONENT_JACKI_4, OPPONENT_JACKI_5}, - MAP_GROUP_ROUTE123, - MAP_ID_ROUTE123, - }, - { - {OPPONENT_WALTER_1, OPPONENT_WALTER_2, OPPONENT_WALTER_3, OPPONENT_WALTER_4, OPPONENT_WALTER_5}, - MAP_GROUP_ROUTE121, - MAP_ID_ROUTE121, - }, - { - {OPPONENT_KAREN_1, OPPONENT_KAREN_2, OPPONENT_KAREN_3, OPPONENT_KAREN_4, OPPONENT_KAREN_5}, - MAP_GROUP_ROUTE116, - MAP_ID_ROUTE116, - }, - { - {OPPONENT_JERRY_1, OPPONENT_JERRY_2, OPPONENT_JERRY_3, OPPONENT_JERRY_4, OPPONENT_JERRY_5}, - MAP_GROUP_ROUTE116, - MAP_ID_ROUTE116, - }, - { - {OPPONENT_ANNA_AND_MEG_1, OPPONENT_ANNA_AND_MEG_2, OPPONENT_ANNA_AND_MEG_3, OPPONENT_ANNA_AND_MEG_4, OPPONENT_ANNA_AND_MEG_5}, - MAP_GROUP_ROUTE117, - MAP_ID_ROUTE117, - }, - { - {OPPONENT_ISABEL_1, OPPONENT_ISABEL_2, OPPONENT_ISABEL_3, OPPONENT_ISABEL_4, OPPONENT_ISABEL_5}, - MAP_GROUP_ROUTE110, - MAP_ID_ROUTE110, - }, - { - {OPPONENT_MIGUEL_1, OPPONENT_MIGUEL_2, OPPONENT_MIGUEL_3, OPPONENT_MIGUEL_4, OPPONENT_MIGUEL_5}, - MAP_GROUP_ROUTE103, - MAP_ID_ROUTE103, - }, - { - {OPPONENT_TIMOTHY_1, OPPONENT_TIMOTHY_2, OPPONENT_TIMOTHY_3, OPPONENT_TIMOTHY_4, OPPONENT_TIMOTHY_5}, - MAP_GROUP_ROUTE115, - MAP_ID_ROUTE115, - }, - { - {OPPONENT_SHELBY_1, OPPONENT_SHELBY_2, OPPONENT_SHELBY_3, OPPONENT_SHELBY_4, OPPONENT_SHELBY_5}, - MAP_GROUP_MT_CHIMNEY, - MAP_ID_MT_CHIMNEY, - }, - { - {OPPONENT_CALVIN_1, OPPONENT_CALVIN_2, OPPONENT_CALVIN_3, OPPONENT_CALVIN_4, OPPONENT_CALVIN_5}, - MAP_GROUP_ROUTE102, - MAP_ID_ROUTE102, - }, - { - {OPPONENT_ELLIOT_1, OPPONENT_ELLIOT_2, OPPONENT_ELLIOT_3, OPPONENT_ELLIOT_4, OPPONENT_ELLIOT_5}, - MAP_GROUP_ROUTE106, - MAP_ID_ROUTE106, - }, - { - {OPPONENT_ABIGAIL_1, OPPONENT_ABIGAIL_2, OPPONENT_ABIGAIL_3, OPPONENT_ABIGAIL_4, OPPONENT_ABIGAIL_5}, - MAP_GROUP_ROUTE110, - MAP_ID_ROUTE110, - }, - { - {OPPONENT_BENJAMIN_1, OPPONENT_BENJAMIN_2, OPPONENT_BENJAMIN_3, OPPONENT_BENJAMIN_4, OPPONENT_BENJAMIN_5}, - MAP_GROUP_ROUTE110, - MAP_ID_ROUTE110, - }, - { - {OPPONENT_ISAIAH_1, OPPONENT_ISAIAH_2, OPPONENT_ISAIAH_3, OPPONENT_ISAIAH_4, OPPONENT_ISAIAH_5}, - MAP_GROUP_ROUTE128, - MAP_ID_ROUTE128, - }, - { - {OPPONENT_KATELYN_1, OPPONENT_KATELYN_2, OPPONENT_KATELYN_3, OPPONENT_KATELYN_4, OPPONENT_KATELYN_5}, - MAP_GROUP_ROUTE128, - MAP_ID_ROUTE128, - }, - { - {OPPONENT_MARIA_1, OPPONENT_MARIA_2, OPPONENT_MARIA_3, OPPONENT_MARIA_4, OPPONENT_MARIA_5}, - MAP_GROUP_ROUTE117, - MAP_ID_ROUTE117, - }, - { - {OPPONENT_DYLAN_1, OPPONENT_DYLAN_2, OPPONENT_DYLAN_3, OPPONENT_DYLAN_4, OPPONENT_DYLAN_5}, - MAP_GROUP_ROUTE117, - MAP_ID_ROUTE117, - }, - { - {OPPONENT_NICOLAS_1, OPPONENT_NICOLAS_2, OPPONENT_NICOLAS_3, OPPONENT_NICOLAS_4, OPPONENT_NICOLAS_5}, - MAP_GROUP_METEOR_FALLS_1F_2R, - MAP_ID_METEOR_FALLS_1F_2R, - }, - { - {OPPONENT_ROBERT_1, OPPONENT_ROBERT_2, OPPONENT_ROBERT_3, OPPONENT_ROBERT_4, OPPONENT_ROBERT_5}, - MAP_GROUP_ROUTE120, - MAP_ID_ROUTE120, - }, - { - {OPPONENT_LAO_1, OPPONENT_LAO_2, OPPONENT_LAO_3, OPPONENT_LAO_4, OPPONENT_LAO_5}, - MAP_GROUP_ROUTE113, - MAP_ID_ROUTE113, - }, - { - {OPPONENT_CYNDY_1, OPPONENT_CYNDY_2, OPPONENT_CYNDY_3, OPPONENT_CYNDY_4, OPPONENT_CYNDY_5}, - MAP_GROUP_ROUTE115, - MAP_ID_ROUTE115, - }, - { - {OPPONENT_MADELINE_1, OPPONENT_MADELINE_2, OPPONENT_MADELINE_3, OPPONENT_MADELINE_4, OPPONENT_MADELINE_5}, - MAP_GROUP_ROUTE113, - MAP_ID_ROUTE113, - }, - { - {OPPONENT_JENNY_1, OPPONENT_JENNY_2, OPPONENT_JENNY_3, OPPONENT_JENNY_4, OPPONENT_JENNY_5}, - MAP_GROUP_ROUTE124, - MAP_ID_ROUTE124, - }, - { - {OPPONENT_DIANA_1, OPPONENT_DIANA_2, OPPONENT_DIANA_3, OPPONENT_DIANA_4, OPPONENT_DIANA_5}, - MAP_GROUP_JAGGED_PASS, - MAP_ID_JAGGED_PASS, - }, - { - {OPPONENT_AMY_AND_LIV_1, OPPONENT_AMY_AND_LIV_2, OPPONENT_AMY_AND_LIV_4, OPPONENT_AMY_AND_LIV_5, OPPONENT_AMY_AND_LIV_6}, - MAP_GROUP_ROUTE103, - MAP_ID_ROUTE103, - }, - { - {OPPONENT_ERNEST_1, OPPONENT_ERNEST_2, OPPONENT_ERNEST_3, OPPONENT_ERNEST_4, OPPONENT_ERNEST_5}, - MAP_GROUP_ROUTE125, - MAP_ID_ROUTE125, - }, - { - {OPPONENT_EDWIN_1, OPPONENT_EDWIN_2, OPPONENT_EDWIN_3, OPPONENT_EDWIN_4, OPPONENT_EDWIN_5}, - MAP_GROUP_ROUTE110, - MAP_ID_ROUTE110, - }, - { - {OPPONENT_LYDIA_1, OPPONENT_LYDIA_2, OPPONENT_LYDIA_3, OPPONENT_LYDIA_4, OPPONENT_LYDIA_5}, - MAP_GROUP_ROUTE117, - MAP_ID_ROUTE117, - }, - { - {OPPONENT_ISAAC_1, OPPONENT_ISAAC_2, OPPONENT_ISAAC_3, OPPONENT_ISAAC_4, OPPONENT_ISAAC_5}, - MAP_GROUP_ROUTE117, - MAP_ID_ROUTE117, - }, - { - {OPPONENT_CATHERINE_1, OPPONENT_CATHERINE_2, OPPONENT_CATHERINE_3, OPPONENT_CATHERINE_4, OPPONENT_CATHERINE_5}, - MAP_GROUP_ROUTE119, - MAP_ID_ROUTE119, - }, - { - {OPPONENT_JACKSON_1, OPPONENT_JACKSON_2, OPPONENT_JACKSON_3, OPPONENT_JACKSON_4, OPPONENT_JACKSON_5}, - MAP_GROUP_ROUTE119, - MAP_ID_ROUTE119, - }, - { - {OPPONENT_HALEY_1, OPPONENT_HALEY_2, OPPONENT_HALEY_3, OPPONENT_HALEY_4, OPPONENT_HALEY_5}, - MAP_GROUP_ROUTE104, - MAP_ID_ROUTE104, - }, - { - {OPPONENT_JAMES_1, OPPONENT_JAMES_2, OPPONENT_JAMES_3, OPPONENT_JAMES_4, OPPONENT_JAMES_5}, - MAP_GROUP_PETALBURG_WOODS, - MAP_ID_PETALBURG_WOODS, - }, - { - {OPPONENT_TRENT_1, OPPONENT_TRENT_2, OPPONENT_TRENT_3, OPPONENT_TRENT_4, OPPONENT_TRENT_5}, - MAP_GROUP_ROUTE112, - MAP_ID_ROUTE112, - }, - { - {OPPONENT_LOIS_AND_HAL_1, OPPONENT_LOIS_AND_HAL_2, OPPONENT_LOIS_AND_HAL_3, OPPONENT_LOIS_AND_HAL_4, OPPONENT_LOIS_AND_HAL_5}, - MAP_GROUP_ABANDONED_SHIP_ROOMS2_1F, - MAP_ID_ABANDONED_SHIP_ROOMS2_1F, - }, - { - {OPPONENT_WALLY_3, OPPONENT_WALLY_4, OPPONENT_WALLY_5, OPPONENT_WALLY_6, OPPONENT_NONE}, - MAP_GROUP_VICTORY_ROAD_1F, - MAP_ID_VICTORY_ROAD_1F, - }, -}; - -static const u16 sBadgeFlags[] = {BADGE01_GET, BADGE02_GET, BADGE03_GET, BADGE04_GET, BADGE05_GET, BADGE06_GET, BADGE07_GET, BADGE08_GET}; - -void task01_battle_start(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - if (!FieldPoisonEffectIsRunning()) // is poison not active? - { - sub_811AABC(data[1]); - data[0]++; // go to case 1. - } - break; - case 1: - if (sub_811AAE8() == TRUE) - { - SetMainCallback2(sub_800E7C4); - prev_quest_postbuffer_cursor_backup_reset(); - overworld_poison_timer_set(); - DestroyTask(taskId); - } - break; - } -} - -void task_add_01_battle_start(u8 transition, u16 song) -{ - u8 taskId = CreateTask(task01_battle_start, 1); - - gTasks[taskId].data[1] = transition; - current_map_music_set__default_for_battle(song); -} - -void CheckForSafariZoneAndProceed(void) -{ - if (GetSafariZoneFlag()) - StartBattle_Safari(); - else - StartBattle_StandardWild(); -} - -void StartBattle_StandardWild(void) -{ - ScriptContext2_Enable(); - FreezeMapObjects(); - sub_80597F4(); - gMain.savedCallback = HandleWildBattleEnd; - gBattleTypeFlags = 0; - task_add_01_battle_start(GetWildBattleTransition(), 0); - IncrementGameStat(7); - IncrementGameStat(8); -} - -void StartBattle_Roamer(void) -{ - ScriptContext2_Enable(); - FreezeMapObjects(); - sub_80597F4(); - gMain.savedCallback = HandleWildBattleEnd; - gBattleTypeFlags = BATTLE_TYPE_ROAMER; - task_add_01_battle_start(GetWildBattleTransition(), 0); - IncrementGameStat(7); - IncrementGameStat(8); -} - -void StartBattle_Safari(void) -{ - ScriptContext2_Enable(); - FreezeMapObjects(); - sub_80597F4(); - gMain.savedCallback = sub_80C824C; - gBattleTypeFlags = BATTLE_TYPE_SAFARI; - task_add_01_battle_start(GetWildBattleTransition(), 0); -} - -void task_add_01_battle_start_with_music_and_stats(void) -{ - task_add_01_battle_start(GetTrainerBattleTransition(), 0); - IncrementGameStat(7); - IncrementGameStat(9); -} - -//Initiates battle where Wally catches Ralts -void StartBattle_WallyTutorial(void) -{ - CreateMaleMon(&gEnemyParty[0], SPECIES_RALTS, 5); - ScriptContext2_Enable(); - gMain.savedCallback = c2_exit_to_overworld_1_continue_scripts_restart_music; - gBattleTypeFlags = BATTLE_TYPE_WALLY_TUTORIAL; - task_add_01_battle_start(8, 0); -} - -void StartBattle_ScriptedWild(void) -{ - ScriptContext2_Enable(); - gMain.savedCallback = HandleScriptedWildBattleEnd; - gBattleTypeFlags = 0; - task_add_01_battle_start(GetWildBattleTransition(), 0); - IncrementGameStat(7); - IncrementGameStat(8); -} - -void StartBattle_SouthernIsland(void) -{ - ScriptContext2_Enable(); - gMain.savedCallback = HandleScriptedWildBattleEnd; - gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; - task_add_01_battle_start(GetWildBattleTransition(), 0); - IncrementGameStat(7); - IncrementGameStat(8); -} - -void StartBattle_Rayquaza(void) -{ - ScriptContext2_Enable(); - gMain.savedCallback = HandleScriptedWildBattleEnd; - gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; - task_add_01_battle_start(0, BGM_BATTLE34); - IncrementGameStat(7); - IncrementGameStat(8); -} - -void StartBattle_GroudonKyogre(void) -{ - ScriptContext2_Enable(); - gMain.savedCallback = HandleScriptedWildBattleEnd; - gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON; - if (gGameVersion == 2) - task_add_01_battle_start(0xB, BGM_BATTLE34); // KYOGRE - else - task_add_01_battle_start(0x6, BGM_BATTLE34); // GROUDON - IncrementGameStat(7); - IncrementGameStat(8); -} - -void StartBattle_Regi(void) -{ - ScriptContext2_Enable(); - gMain.savedCallback = HandleScriptedWildBattleEnd; - gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI; - task_add_01_battle_start(0xA, BGM_BATTLE36); - IncrementGameStat(7); - IncrementGameStat(8); -} - -void HandleWildBattleEnd(void) -{ - CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE); - ResetOamRange(0, 128); - - if (battle_exit_is_player_defeat(gBattleOutcome) == TRUE) - { - SetMainCallback2(CB2_WhiteOut); - } - else - { - SetMainCallback2(c2_exit_to_overworld_2_switch); - gFieldCallback = sub_8080E44; - } -} - -void HandleScriptedWildBattleEnd(void) -{ - CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE); - ResetOamRange(0, 128); - - if (battle_exit_is_player_defeat(gBattleOutcome) == TRUE) - SetMainCallback2(CB2_WhiteOut); - else - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -s8 GetBattleTerrain(void) -{ - u16 tileBehavior; - s16 x, y; - - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - - if (MetatileBehavior_IsTallGrass(tileBehavior)) - return 0; - if (MetatileBehavior_IsLongGrass(tileBehavior)) - return 1; - if (MetatileBehavior_IsSandOrDeepSand(tileBehavior)) - return 2; - switch (gMapHeader.mapType) - { - case MAP_TYPE_TOWN: - case MAP_TYPE_CITY: - case MAP_TYPE_ROUTE: - break; - case MAP_TYPE_UNDERGROUND: - if (sub_80574C4(tileBehavior)) - return 8; - if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) - return 5; - return 7; - case MAP_TYPE_INDOOR: - case MAP_TYPE_SECRET_BASE: - return 8; - case MAP_TYPE_UNDERWATER: - return 3; - case MAP_TYPE_6: - if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) - return 4; - return 9; - } - if (sub_8057568(tileBehavior)) - return 4; - if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) - return 5; - if (sub_80574D8(tileBehavior)) - return 6; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - { - if (sub_8057450(tileBehavior)) - return 5; - if (MetatileBehavior_IsBridge(tileBehavior) == TRUE) - return 4; - } - if (gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 28) - return 2; - if (GetSav1Weather() == 8) - return 2; - return 9; -} - -s8 GetBattleTransitionTypeByMap(void) -{ - u8 flashUsed; - u16 tileBehavior; - s16 x, y; - - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - - flashUsed = sav1_get_flash_used_on_map(); - - if (flashUsed) - return 2; - - if (!MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) - { - switch (gMapHeader.mapType) - { - case MAP_TYPE_UNDERGROUND: - return 1; - case MAP_TYPE_UNDERWATER: - return 3; - default: - return 0; - } - } - return 3; -} - -u16 GetSumOfPartyMonLevel(u8 numMons) -{ - u8 sum = 0; - int i; - - for (i = 0; i < 6; i++) - { - u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - - if (species != SPECIES_EGG && species != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0) - { - sum += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); - numMons--; - if (numMons == 0) - break; - } - } - return sum; -} - -u8 GetSumOfEnemyPartyLevel(u16 trainerNum, u8 numMons) -{ - u8 i; - u8 sum; - u32 count = numMons; - void *party; - - if (gTrainers[trainerNum].partySize < count) - count = gTrainers[trainerNum].partySize; - - sum = 0; - - switch (gTrainers[trainerNum].partyFlags) - { - case 0: - party = gTrainers[trainerNum].party; - for (i = 0; i < count; i++) - sum += ((struct TrainerPartyMember0 *)party)[i].level; - break; - case 1: - party = gTrainers[trainerNum].party; - for (i = 0; i < count; i++) - sum += ((struct TrainerPartyMember1 *)party)[i].level; - break; - case 2: - party = gTrainers[trainerNum].party; - for (i = 0; i < count; i++) - sum += ((struct TrainerPartyMember2 *)party)[i].level; - break; - case 3: - party = gTrainers[trainerNum].party; - for (i = 0; i < count; i++) - sum += ((struct TrainerPartyMember3 *)party)[i].level; - break; - } - - return sum; -} - -u8 GetWildBattleTransition(void) -{ - u8 flashVar = GetBattleTransitionTypeByMap(); - u8 level = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); - - if (level < (u8)GetSumOfPartyMonLevel(1)) // is wild mon level than the player's mon level? - return gBattleTransitionTable_Wild[flashVar][0]; - else - return gBattleTransitionTable_Wild[flashVar][1]; // use a white fade in instead of normal transition. -} - -u8 GetTrainerBattleTransition(void) -{ - const struct Trainer *trainer; - u8 minPartyCount; - u8 flashVar; - u8 level; - - if (gTrainerBattleOpponent == 1024) // link battle? - return 16; - - trainer = gTrainers; - - if (trainer[gTrainerBattleOpponent].trainerClass == 24) // league? - { - if (gTrainerBattleOpponent == 261) - return 12; - if (gTrainerBattleOpponent == 262) - return 13; - if (gTrainerBattleOpponent == 263) - return 14; - if (gTrainerBattleOpponent == 264) - return 15; - return 16; - } - - if (trainer[gTrainerBattleOpponent].trainerClass == 32) // team leader? - return 16; - - if (trainer[gTrainerBattleOpponent].doubleBattle == TRUE) - minPartyCount = 2; // double battles always at least have 2 pokemon. - else - minPartyCount = 1; - - flashVar = GetBattleTransitionTypeByMap(); - level = GetSumOfEnemyPartyLevel(gTrainerBattleOpponent, minPartyCount); - - if (level < (u8)GetSumOfPartyMonLevel(minPartyCount)) // is wild mon level than the player's mon level? - return gBattleTransitionTable_Trainer[flashVar][0]; - else - return gBattleTransitionTable_Trainer[flashVar][1]; -} - -u8 GetBattleTowerBattleTransition(void) -{ - u8 monData = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); - - if (monData < (u8)GetSumOfPartyMonLevel(1)) - return 4; - else - return 3; -} - -void ChooseStarter(void) -{ - SetMainCallback2(CB2_ChooseStarter); - gMain.savedCallback = CB2_GiveStarter; -} - -void CB2_GiveStarter(void) -{ - u16 starterPoke; - - *GetVarPointer(0x4023) = gScriptResult; - starterPoke = GetStarterPokemon(gScriptResult); - ScriptGiveMon(starterPoke, 5, 0, 0, 0, 0); - ResetTasks(); - sub_80408BC(); - SetMainCallback2(CB2_StartFirstBattle); - sub_811AAD8(0); -} - -void CB2_StartFirstBattle(void) -{ - UpdatePaletteFade(); - RunTasks(); - - if (sub_811AAE8() == TRUE) - { - gBattleTypeFlags = BATTLE_TYPE_FIRST_BATTLE; - gMain.savedCallback = HandleFirstBattleEnd; - SetMainCallback2(sub_800E7C4); - prev_quest_postbuffer_cursor_backup_reset(); - overworld_poison_timer_set(); - IncrementGameStat(7); - IncrementGameStat(8); - } -} - -void HandleFirstBattleEnd(void) -{ - sav1_reset_battle_music_maybe(); - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -u32 TrainerBattleLoadArg32(const u8 *ptr) -{ - return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); -} - -u16 TrainerBattleLoadArg16(const u8 *ptr) -{ - return ptr[0] | (ptr[1] << 8); -} - -u8 TrainerBattleLoadArg8(const u8 *ptr) -{ - return ptr[0]; -} - -u16 trainerflag_opponent(void) -{ - return TRAINER_FLAG_START + gTrainerBattleOpponent; -} - -bool32 battle_exit_is_player_defeat(u32 a1) -{ - switch (a1) - { - case 2: - case 3: - return TRUE; - case 1: - case 4: - case 5: - case 6: - case 7: - return FALSE; - } - return FALSE; -} - -void sub_80822BC(void) -{ - gTrainerBattleMode = 0; - gTrainerBattleOpponent = 0; - gTrainerMapObjectLocalId = 0; - gTrainerIntroSpeech = 0; - gTrainerDefeatSpeech = 0; - gTrainerVictorySpeech = 0; - gTrainerCannotBattleSpeech = 0; - gTrainerBattleScriptReturnAddress = 0; - gTrainerBattleEndScript = 0; -} - -void TrainerBattleLoadArgs(const struct TrainerBattleSpec *specs, const u8 *data) -{ - while (1) - { - switch (specs->ptrType) - { - case 0: - *(u8 *)specs->ptr = TrainerBattleLoadArg8(data); - data++; - break; - case 1: - *(u16 *)specs->ptr = TrainerBattleLoadArg16(data); - data += 2; - break; - case 2: - *(u32 *)specs->ptr = TrainerBattleLoadArg32(data); - data += 4; - break; - case 3: - *(u8 *)specs->ptr = 0; - break; - case 4: - *(u16 *)specs->ptr = 0; - break; - case 5: - *(u32 *)specs->ptr = 0; - break; - case 6: - *(const u8 **)specs->ptr = data; - return; - } - specs++; - } -} - -void battle_80801F0(void) -{ - if (gTrainerMapObjectLocalId) - { - gScriptLastTalked = gTrainerMapObjectLocalId; - gSelectedMapObject = GetFieldObjectIdByLocalIdAndMap(gTrainerMapObjectLocalId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - } -} - -u8 *TrainerBattleConfigure(const u8 *data) -{ - sub_80822BC(); - gTrainerBattleMode = TrainerBattleLoadArg8(data); - - switch (gTrainerBattleMode) - { - case 3: - TrainerBattleLoadArgs(gTrainerBattleSpecs_3, data); - return gUnknown_0819F878; - case 4: - TrainerBattleLoadArgs(gTrainerBattleSpecs_2, data); - battle_80801F0(); - return gUnknown_0819F840; - case 1: - case 2: - TrainerBattleLoadArgs(gTrainerBattleSpecs_1, data); - battle_80801F0(); - return gUnknown_0819F818; - case 6: - case 8: - TrainerBattleLoadArgs(gTrainerBattleSpecs_4, data); - battle_80801F0(); - return gUnknown_0819F840; - case 7: - TrainerBattleLoadArgs(gTrainerBattleSpecs_2, data); - battle_80801F0(); - gTrainerBattleOpponent = sub_8082C4C(gTrainerBattleOpponent); - return gUnknown_0819F8AE; - case 5: - TrainerBattleLoadArgs(gTrainerBattleSpecs_0, data); - battle_80801F0(); - gTrainerBattleOpponent = sub_8082C4C(gTrainerBattleOpponent); - return gUnknown_0819F887; - default: - TrainerBattleLoadArgs(gTrainerBattleSpecs_0, data); - battle_80801F0(); - return gUnknown_0819F818; - } -} - -void TrainerWantsBattle(u8 trainerMapObjId, u8 *trainerScript) -{ - gSelectedMapObject = trainerMapObjId; - gScriptLastTalked = gMapObjects[trainerMapObjId].localId; - TrainerBattleConfigure(trainerScript + 1); - ScriptContext1_SetupScript(gUnknown_0819F80B); - ScriptContext2_Enable(); -} - -bool32 GetTrainerFlagFromScriptPointer(u8 *data) -{ - u32 flag = TrainerBattleLoadArg16(data + 2); - return FlagGet(TRAINER_FLAG_START + flag); -} - -void sub_8082524(void) -{ - struct MapObject *mapObject = &gMapObjects[gSelectedMapObject]; - - npc_set_running_behaviour_etc(mapObject, npc_running_behaviour_by_direction(mapObject->mapobj_unk_18)); -} - -u8 sub_8082558(void) -{ - return gTrainerBattleMode; -} - -u8 sub_8082564(void) -{ - return FlagGet(trainerflag_opponent()); -} - -void sub_808257C(void) -{ - FlagSet(trainerflag_opponent()); -} - -void unref_sub_8082590(void) -{ - FlagSet(trainerflag_opponent()); // duplicate function -} - -u8 trainer_flag_check(u16 flag) -{ - return FlagGet(TRAINER_FLAG_START + flag); -} - -void trainer_flag_set(u16 flag) -{ - FlagSet(TRAINER_FLAG_START + flag); -} - -void trainer_flag_clear(u16 flag) -{ - FlagReset(TRAINER_FLAG_START + flag); -} - -void sub_80825E4(void) -{ - gBattleTypeFlags = BATTLE_TYPE_TRAINER; - gMain.savedCallback = sub_808260C; - task_add_01_battle_start_with_music_and_stats(); - ScriptContext1_Stop(); -} - -void sub_808260C(void) -{ - if (gTrainerBattleOpponent == 1024) - { - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); // link battle? - } - else if (battle_exit_is_player_defeat(gBattleOutcome) == TRUE) - { - SetMainCallback2(CB2_WhiteOut); - } - else - { - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); - sub_808257C(); - } -} - -void do_choose_name_or_words_screen(void) -{ - if (gTrainerBattleOpponent == 1024) - { - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); // link battle? - } - else if (battle_exit_is_player_defeat(gBattleOutcome) == TRUE) - { - SetMainCallback2(CB2_WhiteOut); - } - else - { - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); - sub_808257C(); - sub_8082CB8(); - } -} - -void sub_80826B0(void) -{ - gBattleTypeFlags = BATTLE_TYPE_TRAINER; - gMain.savedCallback = do_choose_name_or_words_screen; - task_add_01_battle_start_with_music_and_stats(); - ScriptContext1_Stop(); -} - -void sub_80826D8(void) -{ - ShowFieldMessage(sub_808281C()); -} - -u8 *sub_80826E8(void) -{ - if (gTrainerBattleScriptReturnAddress) - return gTrainerBattleScriptReturnAddress; - else - return gUnknown_081C6C02; -} - -u8 *sub_8082700(void) -{ - if (gTrainerBattleEndScript) - return gTrainerBattleEndScript; - else - return gUnknown_081C6C02; -} - -void sub_8082718(void) -{ - ShowFieldMessage(sub_8082880()); -} - -void PlayTrainerEncounterMusic(void) -{ - u16 music; - - if (gTrainerBattleMode != 1 && gTrainerBattleMode != 8) - { - switch (sub_803FC58(gTrainerBattleOpponent)) - { - case TRAINER_ENCOUNTER_MUSIC_MALE: - music = BGM_BOYEYE; - break; - case TRAINER_ENCOUNTER_MUSIC_FEMALE: - music = BGM_GIRLEYE; - break; - case TRAINER_ENCOUNTER_MUSIC_GIRL: - music = BGM_SYOUJOEYE; - break; - case TRAINER_ENCOUNTER_MUSIC_INTENSE: - music = BGM_HAGESHII; - break; - case TRAINER_ENCOUNTER_MUSIC_COOL: - music = BGM_KAKKOII; - break; - case TRAINER_ENCOUNTER_MUSIC_AQUA: - music = BGM_AQA_0; - break; - case TRAINER_ENCOUNTER_MUSIC_MAGMA: - music = BGM_MGM0; - break; - case TRAINER_ENCOUNTER_MUSIC_SWIMMER: - music = BGM_SWIMEYE; - break; - case TRAINER_ENCOUNTER_MUSIC_TWINS: - music = BGM_HUTAGO; - break; - case TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR: - music = BGM_SITENNOU; - break; - case TRAINER_ENCOUNTER_MUSIC_HIKER: - music = BGM_YAMA_EYE; - break; - case TRAINER_ENCOUNTER_MUSIC_INTERVIEWER: - music = BGM_INTER_V; - break; - case TRAINER_ENCOUNTER_MUSIC_RICH: - music = BGM_TEST; - break; - default: - music = BGM_AYASII; - } - PlayNewMapMusic(music); - } -} - -//Returns an empty string if a null pointer was passed, otherwise returns str -u8 *SanitizeString(const u8 *str) -{ - if (str) - return (u8 *) str; - else - return (u8 *) gOtherText_CancelWithTerminator; -} - -u8 *sub_808281C(void) -{ - return SanitizeString(gTrainerIntroSpeech); -} - -u8 *sub_8082830(void) -{ - u8 *str; - - if (gTrainerBattleOpponent == 1024) - str = sub_80BCCE8(); - else - str = gTrainerDefeatSpeech; - - StringExpandPlaceholders(gStringVar4, SanitizeString(str)); - return gStringVar4; -} - -u8 *unref_sub_808286C(void) -{ - return SanitizeString(gTrainerVictorySpeech); -} - -u8 *sub_8082880(void) -{ - return SanitizeString(gTrainerCannotBattleSpeech); -} - -s32 sub_8082894(const struct TrainerEyeTrainer *trainers, u16 trainerNum) -{ - s32 i; - - for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) - { - if (trainers[i].trainerNums[0] == trainerNum) - return i; - } - return -1; -} - -s32 sub_80828B8(const struct TrainerEyeTrainer *trainers, u16 trainerNum) -{ - s32 i; - s32 j; - - for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) - { - for (j = 0; j < 5 && trainers[i].trainerNums[j] != 0; j++) - { - if (trainers[i].trainerNums[j] == trainerNum) - return i; - } - } - return -1; -} - -bool32 sub_80828FC(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum) -{ - int i; - bool32 ret = FALSE; - - for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) - { - if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum) - { - if (gSaveBlock1.trainerRematches[i] != 0) - ret = TRUE; - else if (trainer_flag_check(trainers[i].trainerNums[0]) == TRUE && (Random() % 100) <= 30) - { - int j = 1; - - while (j < 5 && trainers[i].trainerNums[j] != 0 && trainer_flag_check(trainers[i].trainerNums[j])) - j++; - gSaveBlock1.trainerRematches[i] = j; - ret = TRUE; - } - } - } - return ret; -} - -s32 sub_80829A8(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum) -{ - s32 i; - - for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) - { - if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum && gSaveBlock1.trainerRematches[i]) - return 1; - } - return 0; -} - -s32 sub_80829E8(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum) -{ - s32 i; - - for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++) - { - if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum) - return 1; - } - return 0; -} - -bool8 sub_8082A18(const struct TrainerEyeTrainer *trainers, u16 trainerNum) -{ - s32 trainerEyeIndex = sub_8082894(trainers, trainerNum); - - if (trainerEyeIndex != -1 && trainerEyeIndex < 100 && gSaveBlock1.trainerRematches[trainerEyeIndex]) - return TRUE; - else - return FALSE; -} - -bool8 sub_8082A54(const struct TrainerEyeTrainer *trainers, u16 trainerNum) -{ - s32 trainerEyeIndex = sub_80828B8(trainers, trainerNum); - - if (trainerEyeIndex != -1 && trainerEyeIndex < 100 && gSaveBlock1.trainerRematches[trainerEyeIndex]) - return TRUE; - else - return FALSE; -} - -u16 sub_8082A90(const struct TrainerEyeTrainer *trainers, u16 trainerNum) -{ - int i; - const struct TrainerEyeTrainer *trainer; - s32 trainerEyeIndex = sub_8082894(trainers, trainerNum); - - if (trainerEyeIndex == -1) - return 0; - trainer = &trainers[trainerEyeIndex]; - for (i = 1; i < 5; i++) - { - if (!trainer->trainerNums[i]) - return trainer->trainerNums[i - 1]; - if (!trainer_flag_check(trainer->trainerNums[i])) - return trainer->trainerNums[i]; - } - return trainer->trainerNums[4]; -} - -void sub_8082AE4(const struct TrainerEyeTrainer *trainers, u16 trainerNum) -{ - s32 trainerEyeIndex = sub_80828B8(trainers, trainerNum); - - if (trainerEyeIndex != -1) - gSaveBlock1.trainerRematches[trainerEyeIndex] = 0; -} - -bool8 sub_8082B10(const struct TrainerEyeTrainer *trainers, u16 trainerNum) -{ - s32 trainerEyeIndex = sub_8082894(trainers, trainerNum); - - if (trainerEyeIndex != -1 && trainer_flag_check(trainers[trainerEyeIndex].trainerNums[1])) - return TRUE; - else - return FALSE; -} - -bool32 sub_8082B44(void) -{ - int badgeCount = 0; - u32 i; - - for (i = 0; i < 8; i++) - { - if (FlagGet(sBadgeFlags[i]) == TRUE) - { - badgeCount++; - if (badgeCount >= 5) - return TRUE; - } - } - return FALSE; -} - -void sub_8082B78(void) -{ - if (sub_8082B44()) - { - if (gSaveBlock1.trainerRematchStepCounter >= TRAINER_REMATCH_STEPS) - gSaveBlock1.trainerRematchStepCounter = TRAINER_REMATCH_STEPS; - else - gSaveBlock1.trainerRematchStepCounter++; - } -} - -bool32 sub_8082BA4(void) -{ - if (sub_8082B44() && gSaveBlock1.trainerRematchStepCounter >= TRAINER_REMATCH_STEPS) - return TRUE; - else - return FALSE; -} - -void sub_8082BD0(u16 mapGroup, u16 mapNum) -{ - if (sub_8082BA4() && sub_80828FC(gTrainerEyeTrainers, mapGroup, mapNum) == TRUE) - gSaveBlock1.trainerRematchStepCounter = 0; -} - -s32 sub_8082C0C(u16 mapGroup, u16 mapNum) -{ - return sub_80829A8(gTrainerEyeTrainers, mapGroup, mapNum); -} - -s32 unref_sub_8082C2C(u16 mapGroup, u16 mapNum) -{ - return sub_80829E8(gTrainerEyeTrainers, mapGroup, mapNum); -} - -u16 sub_8082C4C(u16 trainerNum) -{ - return sub_8082A90(gTrainerEyeTrainers, trainerNum); -} - -s32 sub_8082C68(void) -{ - if (sub_8082A18(gTrainerEyeTrainers, gTrainerBattleOpponent)) - return 1; - else - return sub_8082B10(gTrainerEyeTrainers, gTrainerBattleOpponent); -} - -u8 sub_8082C9C(void) -{ - return sub_8082A54(gTrainerEyeTrainers, gTrainerBattleOpponent); -} - -void sub_8082CB8(void) -{ - sub_8082AE4(gTrainerEyeTrainers, gTrainerBattleOpponent); - sub_808257C(); -} diff --git a/src/berry.c b/src/berry.c deleted file mode 100644 index fa15672e7..000000000 --- a/src/berry.c +++ /dev/null @@ -1,1380 +0,0 @@ -#include "global.h" -#include "berry.h" -#include "field_control_avatar.h" -#include "field_map_obj.h" -#include "fieldmap.h" -#include "item.h" -#include "item_menu.h" -#include "item_use.h" -#include "items.h" -#include "main.h" -#include "rng.h" -#include "text.h" - -#define BERRY_NAME_LENGTH 6 - -#define FIRST_BERRY ITEM_CHERI_BERRY -#define LAST_BERRY ITEM_ENIGMA_BERRY - -#ifdef ENGLISH -#define NAME_CHERI_BERRY _("CHERI") -#define NAME_CHESTO_BERRY _("CHESTO") -#define NAME_PECHA_BERRY _("PECHA") -#define NAME_RAWST_BERRY _("RAWST") -#define NAME_ASPEAR_BERRY _("ASPEAR") -#define NAME_LEPPA_BERRY _("LEPPA") -#define NAME_ORAN_BERRY _("ORAN") -#define NAME_PERSIM_BERRY _("PERSIM") -#define NAME_LUM_BERRY _("LUM") -#define NAME_SITRUS_BERRY _("SITRUS") -#define NAME_FIGY_BERRY _("FIGY") -#define NAME_WIKI_BERRY _("WIKI") -#define NAME_MAGO_BERRY _("MAGO") -#define NAME_AGUAV_BERRY _("AGUAV") -#define NAME_IAPAPA_BERRY _("IAPAPA") -#define NAME_RAZZ_BERRY _("RAZZ") -#define NAME_BLUK_BERRY _("BLUK") -#define NAME_NANAB_BERRY _("NANAB") -#define NAME_WEPEAR_BERRY _("WEPEAR") -#define NAME_PINAP_BERRY _("PINAP") -#define NAME_POMEG_BERRY _("POMEG") -#define NAME_KELPSY_BERRY _("KELPSY") -#define NAME_QUALOT_BERRY _("QUALOT") -#define NAME_HONDEW_BERRY _("HONDEW") -#define NAME_GREPA_BERRY _("GREPA") -#define NAME_TAMATO_BERRY _("TAMATO") -#define NAME_CORNN_BERRY _("CORNN") -#define NAME_MAGOST_BERRY _("MAGOST") -#define NAME_RABUTA_BERRY _("RABUTA") -#define NAME_NOMEL_BERRY _("NOMEL") -#define NAME_SPELON_BERRY _("SPELON") -#define NAME_PAMTRE_BERRY _("PAMTRE") -#define NAME_WATMEL_BERRY _("WATMEL") -#define NAME_DURIN_BERRY _("DURIN") -#define NAME_BELUE_BERRY _("BELUE") -#define NAME_LIECHI_BERRY _("LIECHI") -#define NAME_GANLON_BERRY _("GANLON") -#define NAME_SALAC_BERRY _("SALAC") -#define NAME_PETAYA_BERRY _("PETAYA") -#define NAME_APICOT_BERRY _("APICOT") -#define NAME_LANSAT_BERRY _("LANSAT") -#define NAME_STARF_BERRY _("STARF") -#define NAME_ENIGMA_BERRY _("ENIGMA") - -const u8 gBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers."); -const u8 gBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy."); -const u8 gBerryDescriptionPart1_Chesto[] = _("The BERRY’s thick skin and fruit are"); -const u8 gBerryDescriptionPart2_Chesto[] = _("very tough. It is dry-tasting all over."); -const u8 gBerryDescriptionPart1_Pecha[] = _("Very sweet and delicious."); -const u8 gBerryDescriptionPart2_Pecha[] = _("Also very tender - handle with care."); -const u8 gBerryDescriptionPart1_Rawst[] = _("If the leaves grow long and curly,"); -const u8 gBerryDescriptionPart2_Rawst[] = _("the BERRY seems to grow very bitter."); -const u8 gBerryDescriptionPart1_Aspear[] = _("The hard BERRY is dense with a rich"); -const u8 gBerryDescriptionPart2_Aspear[] = _("juice. It is quite sour."); -const u8 gBerryDescriptionPart1_Leppa[] = _("Grows slower than CHERI and others."); -const u8 gBerryDescriptionPart2_Leppa[] = _("The smaller the BERRY, the tastier."); -const u8 gBerryDescriptionPart1_Oran[] = _("A peculiar BERRY with a mix of flavors."); -const u8 gBerryDescriptionPart2_Oran[] = _("BERRIES grow in half a day."); -const u8 gBerryDescriptionPart1_Persim[] = _("Loves sunlight. The BERRY’s color"); -const u8 gBerryDescriptionPart2_Persim[] = _("grows vivid when exposed to the sun."); -const u8 gBerryDescriptionPart1_Lum[] = _("Slow to grow. If raised with loving"); -const u8 gBerryDescriptionPart2_Lum[] = _("care, it may grow two BERRIES."); -const u8 gBerryDescriptionPart1_Sitrus[] = _("Closely related to ORAN. The large"); -const u8 gBerryDescriptionPart2_Sitrus[] = _("BERRY has a well-rounded flavor."); -const u8 gBerryDescriptionPart1_Figy[] = _("The BERRY, which looks chewed up,"); -const u8 gBerryDescriptionPart2_Figy[] = _("brims with spicy substances."); -const u8 gBerryDescriptionPart1_Wiki[] = _("The BERRY is said to have grown lumpy"); -const u8 gBerryDescriptionPart2_Wiki[] = _("to help POKéMON grip it."); -const u8 gBerryDescriptionPart1_Mago[] = _("The BERRY turns curvy as it grows."); -const u8 gBerryDescriptionPart2_Mago[] = _("The curvier, the sweeter and tastier."); -const u8 gBerryDescriptionPart1_Aguav[] = _("The flower is dainty. It is rare in its"); -const u8 gBerryDescriptionPart2_Aguav[] = _("ability to grow without light."); -const u8 gBerryDescriptionPart1_Iapapa[] = _("The BERRY is very big and sour."); -const u8 gBerryDescriptionPart2_Iapapa[] = _("It takes at least a day to grow."); -const u8 gBerryDescriptionPart1_Razz[] = _("The red BERRY tastes slightly spicy."); -const u8 gBerryDescriptionPart2_Razz[] = _("It grows quickly in just four hours."); -const u8 gBerryDescriptionPart1_Bluk[] = _("The BERRY is blue on the outside, but"); -const u8 gBerryDescriptionPart2_Bluk[] = _("it blackens the mouth when eaten."); -const u8 gBerryDescriptionPart1_Nanab[] = _("This BERRY was the seventh"); -const u8 gBerryDescriptionPart2_Nanab[] = _("discovered in the world. It is sweet."); -const u8 gBerryDescriptionPart1_Wepear[] = _("The flower is small and white. It has a"); -const u8 gBerryDescriptionPart2_Wepear[] = _("delicate balance of bitter and sour."); -const u8 gBerryDescriptionPart1_Pinap[] = _("Weak against wind and cold."); -const u8 gBerryDescriptionPart2_Pinap[] = _("The fruit is spicy and the skin, sour."); -const u8 gBerryDescriptionPart1_Pomeg[] = _("However much it is watered,"); -const u8 gBerryDescriptionPart2_Pomeg[] = _("it only grows up to six BERRIES."); -const u8 gBerryDescriptionPart1_Kelpsy[] = _("A rare variety shaped like a root."); -const u8 gBerryDescriptionPart2_Kelpsy[] = _("Grows a very large flower."); -const u8 gBerryDescriptionPart1_Qualot[] = _("Loves water. Grows strong even in"); -const u8 gBerryDescriptionPart2_Qualot[] = _("locations with constant rainfall."); -const u8 gBerryDescriptionPart1_Hondew[] = _("A BERRY that is very valuable and"); -const u8 gBerryDescriptionPart2_Hondew[] = _("rarely seen. It is very delicious."); -const u8 gBerryDescriptionPart1_Grepa[] = _("Despite its tenderness and round"); -const u8 gBerryDescriptionPart2_Grepa[] = _("shape, the BERRY is unimaginably sour."); -const u8 gBerryDescriptionPart1_Tamato[] = _("The BERRY is lip-bendingly spicy."); -const u8 gBerryDescriptionPart2_Tamato[] = _("It takes time to grow."); -const u8 gBerryDescriptionPart1_Cornn[] = _("A BERRY from an ancient era. May not"); -const u8 gBerryDescriptionPart2_Cornn[] = _("grow unless planted in quantity."); -const u8 gBerryDescriptionPart1_Magost[] = _("A BERRY that is widely said to have"); -const u8 gBerryDescriptionPart2_Magost[] = _("a finely balanced flavor."); -const u8 gBerryDescriptionPart1_Rabuta[] = _("A rare variety that is overgrown with"); -const u8 gBerryDescriptionPart2_Rabuta[] = _("hair. It is quite bitter."); -const u8 gBerryDescriptionPart1_Nomel[] = _("Quite sour. Just one bite makes it"); -const u8 gBerryDescriptionPart2_Nomel[] = _("impossible to taste for three days."); -const u8 gBerryDescriptionPart1_Spelon[] = _("The vividly red BERRY is very spicy."); -const u8 gBerryDescriptionPart2_Spelon[] = _("Its warts secrete a spicy substance."); -const u8 gBerryDescriptionPart1_Pamtre[] = _("Drifts on the sea from somewhere."); -const u8 gBerryDescriptionPart2_Pamtre[] = _("It is thought to grow elsewhere."); -const u8 gBerryDescriptionPart1_Watmel[] = _("A huge BERRY, with some over 20"); -const u8 gBerryDescriptionPart2_Watmel[] = _("inches discovered. Exceedingly sweet."); -const u8 gBerryDescriptionPart1_Durin[] = _("Bitter to even look at. It is so"); -const u8 gBerryDescriptionPart2_Durin[] = _("bitter, no one has ever eaten it as is."); -const u8 gBerryDescriptionPart1_Belue[] = _("It is glossy and looks delicious, but"); -const u8 gBerryDescriptionPart2_Belue[] = _("it is awfully sour. Takes time to grow."); -const u8 gBerryDescriptionPart1_Liechi[] = _("A mysterious BERRY. It is rumored to"); -const u8 gBerryDescriptionPart2_Liechi[] = _("contain the power of the sea."); -const u8 gBerryDescriptionPart1_Ganlon[] = _("A mysterious BERRY. It is rumored to"); -const u8 gBerryDescriptionPart2_Ganlon[] = _("contain the power of the land."); -const u8 gBerryDescriptionPart1_Salac[] = _("A mysterious BERRY. It is rumored to"); -const u8 gBerryDescriptionPart2_Salac[] = _("contain the power of the sky."); -const u8 gBerryDescriptionPart1_Petaya[] = _("A mysterious BERRY. It is rumored to"); -const u8 gBerryDescriptionPart2_Petaya[] = _("contain the power of all living things."); -const u8 gBerryDescriptionPart1_Apicot[] = _("A very mystifying BERRY. No telling"); -const u8 gBerryDescriptionPart2_Apicot[] = _("what may happen or how it can be used."); -const u8 gBerryDescriptionPart1_Lansat[] = _("Said to be a legendary BERRY."); -const u8 gBerryDescriptionPart2_Lansat[] = _("Holding it supposedly brings joy."); -const u8 gBerryDescriptionPart1_Starf[] = _("So strong, it was abandoned at the"); -const u8 gBerryDescriptionPart2_Starf[] = _("world’s edge. Considered a mirage."); -const u8 gBerryDescriptionPart1_Enigma[] = _("A completely enigmatic BERRY."); -const u8 gBerryDescriptionPart2_Enigma[] = _("Appears to have the power of stars."); -#elif defined(GERMAN) -#define NAME_CHERI_BERRY _("AMRENA") -#define NAME_CHESTO_BERRY _("MARON") -#define NAME_PECHA_BERRY _("PIRSIF") -#define NAME_RAWST_BERRY _("FRAGIA") -#define NAME_ASPEAR_BERRY _("WILBIR") -#define NAME_LEPPA_BERRY _("JONAGO") -#define NAME_ORAN_BERRY _("SINEL") -#define NAME_PERSIM_BERRY _("PERSIM") -#define NAME_LUM_BERRY _("PRUNUS") -#define NAME_SITRUS_BERRY _("TSITRU") -#define NAME_FIGY_BERRY _("GIEFE") -#define NAME_WIKI_BERRY _("WIKI") -#define NAME_MAGO_BERRY _("MAGO") -#define NAME_AGUAV_BERRY _("GAUVE") -#define NAME_IAPAPA_BERRY _("YAPA") -#define NAME_RAZZ_BERRY _("HIMMIH") -#define NAME_BLUK_BERRY _("MORB") -#define NAME_NANAB_BERRY _("NANAB") -#define NAME_WEPEAR_BERRY _("NIRBE") -#define NAME_PINAP_BERRY _("SANANA") -#define NAME_POMEG_BERRY _("GRANA") -#define NAME_KELPSY_BERRY _("SETANG") -#define NAME_QUALOT_BERRY _("QUALOT") -#define NAME_HONDEW_BERRY _("HONMEL") -#define NAME_GREPA_BERRY _("LABRUS") -#define NAME_TAMATO_BERRY _("TAMOT") -#define NAME_CORNN_BERRY _("SAIM") -#define NAME_MAGOST_BERRY _("MAGOST") -#define NAME_RABUTA_BERRY _("RABUTA") -#define NAME_NOMEL_BERRY _("TRONZI") -#define NAME_SPELON_BERRY _("KIWAN") -#define NAME_PAMTRE_BERRY _("PALLM") -#define NAME_WATMEL_BERRY _("WASMEL") -#define NAME_DURIN_BERRY _("DURIN") -#define NAME_BELUE_BERRY _("MYRTIL") -#define NAME_LIECHI_BERRY _("LYDZI") -#define NAME_GANLON_BERRY _("LINGAN") -#define NAME_SALAC_BERRY _("SALKA") -#define NAME_PETAYA_BERRY _("TAHAY") -#define NAME_APICOT_BERRY _("APIKO") -#define NAME_LANSAT_BERRY _("LANSAT") -#define NAME_STARF_BERRY _("KRAMBO") -#define NAME_ENIGMA_BERRY _("ENIGMA") - -const u8 gBerryDescriptionPart1_Cheri[] = _("Erblüht mit hübschen, zarten Blumen."); -const u8 gBerryDescriptionPart2_Cheri[] = _("Diese knallrote BEERE ist sehr scharf."); -const u8 gBerryDescriptionPart1_Chesto[] = _("Diese BEERE hat eine dicke Haut und"); -const u8 gBerryDescriptionPart2_Chesto[] = _("hartes Fruchtfleisch. Trocken!"); -const u8 gBerryDescriptionPart1_Pecha[] = _("Sehr süß und delikat."); -const u8 gBerryDescriptionPart2_Pecha[] = _("Sehr zart. Vorsichtig anfassen!"); -const u8 gBerryDescriptionPart1_Rawst[] = _("Wenn die Blätter lang und wellig sind,"); -const u8 gBerryDescriptionPart2_Rawst[] = _("wird die BEERE sehr bitter."); -const u8 gBerryDescriptionPart1_Aspear[] = _("Diese harte BEERE ist sehr"); -const u8 gBerryDescriptionPart2_Aspear[] = _("saftig und sauer im Geschmack!"); -const u8 gBerryDescriptionPart1_Leppa[] = _("Wächst langsamer als AMRENA und"); -const u8 gBerryDescriptionPart2_Leppa[] = _("andere. Je kleiner, desto delikater."); -const u8 gBerryDescriptionPart1_Oran[] = _("Eine BEERE unterschiedlichsten Ge-"); -const u8 gBerryDescriptionPart2_Oran[] = _("schmacks. Wächst an einem halben Tag."); -const u8 gBerryDescriptionPart1_Persim[] = _("Liebt Sonnenlicht. Die BEERE"); -const u8 gBerryDescriptionPart2_Persim[] = _("wächst im Sonnenlicht sehr schnell."); -const u8 gBerryDescriptionPart1_Lum[] = _("Langsamer Wuchs. Wird sie liebevoll ge-"); -const u8 gBerryDescriptionPart2_Lum[] = _("pflegt, kann sie 2 BEEREN tragen."); -const u8 gBerryDescriptionPart1_Sitrus[] = _("Eng verwandt mit SINEL. Diese große"); -const u8 gBerryDescriptionPart2_Sitrus[] = _("BEERE ist von rundem Geschmack."); -const u8 gBerryDescriptionPart1_Figy[] = _("Die BEERE sieht angekaut aus. Sie ist"); -const u8 gBerryDescriptionPart2_Figy[] = _("voller scharfer Substanzen."); -const u8 gBerryDescriptionPart1_Wiki[] = _("Die BEERE wächst unförmig,"); -const u8 gBerryDescriptionPart2_Wiki[] = _("damit PKMN sie besser greifen können."); -const u8 gBerryDescriptionPart1_Mago[] = _("Die BEERE hat Ausbeulungen. Je mehr"); -const u8 gBerryDescriptionPart2_Mago[] = _("Beulen, desto schmackhafter ist sie."); -const u8 gBerryDescriptionPart1_Aguav[] = _("Die Blume ist zart. Sie ist fähig,"); -const u8 gBerryDescriptionPart2_Aguav[] = _("ohne Licht wachsen zu können."); -const u8 gBerryDescriptionPart1_Iapapa[] = _("Die BEERE ist groß und sauer."); -const u8 gBerryDescriptionPart2_Iapapa[] = _("Sie braucht einen Tag zum Wachsen."); -const u8 gBerryDescriptionPart1_Razz[] = _("Diese rote BEERE schmeckt etwas"); -const u8 gBerryDescriptionPart2_Razz[] = _("scharf. Sie wächst in nur 4 Stunden."); -const u8 gBerryDescriptionPart1_Bluk[] = _("Die BEERE ist außen blau, verfärbt"); -const u8 gBerryDescriptionPart2_Bluk[] = _("sich im Mund aber schwarz."); -const u8 gBerryDescriptionPart1_Nanab[] = _("Diese BEERE war die 7., die auf der"); -const u8 gBerryDescriptionPart2_Nanab[] = _("Welt entdeckt wurde. Sie ist süß."); -const u8 gBerryDescriptionPart1_Wepear[] = _("Die Blume ist klein und weiß. Angenehm"); -const u8 gBerryDescriptionPart2_Wepear[] = _("bitter und sauer zugleich."); -const u8 gBerryDescriptionPart1_Pinap[] = _("Wind und Kälte verträgt sie nicht."); -const u8 gBerryDescriptionPart2_Pinap[] = _("Fruchtfleisch: Scharf. Haut: Sauer."); -const u8 gBerryDescriptionPart1_Pomeg[] = _("Egal wie viel Wasser sie bekommt, sie"); -const u8 gBerryDescriptionPart2_Pomeg[] = _("trägt immer bis zu 6 BEEREN."); -const u8 gBerryDescriptionPart1_Kelpsy[] = _("Eine Seltenheit. Geformt wie eine"); -const u8 gBerryDescriptionPart2_Kelpsy[] = _("Wurzel. Hat eine große Blume."); -const u8 gBerryDescriptionPart1_Qualot[] = _("Liebt das Wasser. Wächst besonders"); -const u8 gBerryDescriptionPart2_Qualot[] = _("gut in regenreichen Gegenden."); -const u8 gBerryDescriptionPart1_Hondew[] = _("Eine wertvolle und seltene BEERE."); -const u8 gBerryDescriptionPart2_Hondew[] = _("Sie ist sehr schmackhaft."); -const u8 gBerryDescriptionPart1_Grepa[] = _("Die BEERE ist zart und von runder"); -const u8 gBerryDescriptionPart2_Grepa[] = _("Form. Aber sie ist unglaublich sauer!"); -const u8 gBerryDescriptionPart1_Tamato[] = _("Die Schärfe der BEERE verbrennt die"); -const u8 gBerryDescriptionPart2_Tamato[] = _("Lippen. Sie braucht Zeit zum Wachsen."); -const u8 gBerryDescriptionPart1_Cornn[] = _("Eine BEERE aus alten Zeiten. Wächst"); -const u8 gBerryDescriptionPart2_Cornn[] = _("nur, wenn in großen Mengen gepflanzt."); -const u8 gBerryDescriptionPart1_Magost[] = _("Eine BEERE, die für ihren feinen, aus-"); -const u8 gBerryDescriptionPart2_Magost[] = _("gewogenen Geschmack bekannt ist."); -const u8 gBerryDescriptionPart1_Rabuta[] = _("Eine Seltenheit, die über und über mit"); -const u8 gBerryDescriptionPart2_Rabuta[] = _("Haaren bewachsen ist. Sehr bitter!"); -const u8 gBerryDescriptionPart1_Nomel[] = _("Sehr sauer. Ein Biss betäubt die"); -const u8 gBerryDescriptionPart2_Nomel[] = _("Geschmacksnerven für 3 Tage!"); -const u8 gBerryDescriptionPart1_Spelon[] = _("Die leuchtend rote BEERE ist sehr"); -const u8 gBerryDescriptionPart2_Spelon[] = _("scharf. Gibt scharfe Substanzen ab!"); -const u8 gBerryDescriptionPart1_Pamtre[] = _("Wird vom Meer angespült. Sie wächst"); -const u8 gBerryDescriptionPart2_Pamtre[] = _("an einem anderen Ort."); -const u8 gBerryDescriptionPart1_Watmel[] = _("Eine große BEERE, 25 cm groß."); -const u8 gBerryDescriptionPart2_Watmel[] = _("Außergewöhnlich süß."); -const u8 gBerryDescriptionPart1_Durin[] = _("Bitter schon ihr Anblick! Sie ist so"); -const u8 gBerryDescriptionPart2_Durin[] = _("bitter, dass niemand sie pur isst."); -const u8 gBerryDescriptionPart1_Belue[] = _("Sie glänzt, sieht zart aus, ist extrem"); -const u8 gBerryDescriptionPart2_Belue[] = _("sauer und braucht Zeit zum Wachsen."); -const u8 gBerryDescriptionPart1_Liechi[] = _("Eine geheimnisvolle BEERE. Man sagt,"); -const u8 gBerryDescriptionPart2_Liechi[] = _("sie enthalte die Kraft des Meeres."); -const u8 gBerryDescriptionPart1_Ganlon[] = _("Eine geheimnisvolle BEERE. Man sagt,"); -const u8 gBerryDescriptionPart2_Ganlon[] = _("sie enthalte die Kraft des Landes."); -const u8 gBerryDescriptionPart1_Salac[] = _("Eine geheimnisvolle BEERE. Man sagt,"); -const u8 gBerryDescriptionPart2_Salac[] = _("sie enthalte die Kraft des Himmels."); -const u8 gBerryDescriptionPart1_Petaya[] = _("Eine geheimnisvolle BEERE. Man sagt,"); -const u8 gBerryDescriptionPart2_Petaya[] = _("sie enthalte die Kraft allen Lebens."); -const u8 gBerryDescriptionPart1_Apicot[] = _("Eine rätselhafte BEERE. Man kann"); -const u8 gBerryDescriptionPart2_Apicot[] = _("nicht sagen, wie und was sie ist."); -const u8 gBerryDescriptionPart1_Lansat[] = _("Eine legendäre BEERE. Sie zu"); -const u8 gBerryDescriptionPart2_Lansat[] = _("tragen bringt Freude."); -const u8 gBerryDescriptionPart1_Starf[] = _("So stark, dass sie an den Rand der"); -const u8 gBerryDescriptionPart2_Starf[] = _("Welt verbannt wurde. Ein Märchen?"); -const u8 gBerryDescriptionPart1_Enigma[] = _("Eine enigmatische BEERE. Sie scheint"); -const u8 gBerryDescriptionPart2_Enigma[] = _("die Macht der Sterne zu besitzen."); -#endif - -const struct Berry gBerries[] = -{ - { - .name = NAME_CHERI_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 20, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Cheri, - .description2 = gBerryDescriptionPart2_Cheri, - .stageDuration = 3, - .spicy = 10, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_CHESTO_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 80, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Chesto, - .description2 = gBerryDescriptionPart2_Chesto, - .stageDuration = 3, - .spicy = 0, - .dry = 10, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_PECHA_BERRY, - .firmness = BERRY_FIRMNESS_VERY_SOFT, - .size = 40, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Pecha, - .description2 = gBerryDescriptionPart2_Pecha, - .stageDuration = 3, - .spicy = 0, - .dry = 0, - .sweet = 10, - .bitter = 0, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_RAWST_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 32, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Rawst, - .description2 = gBerryDescriptionPart2_Rawst, - .stageDuration = 3, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 10, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_ASPEAR_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 50, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Aspear, - .description2 = gBerryDescriptionPart2_Aspear, - .stageDuration = 3, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 10, - .smoothness = 25, - }, - { - .name = NAME_LEPPA_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 28, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Leppa, - .description2 = gBerryDescriptionPart2_Leppa, - .stageDuration = 4, - .spicy = 10, - .dry = 0, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_ORAN_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 35, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Oran, - .description2 = gBerryDescriptionPart2_Oran, - .stageDuration = 3, - .spicy = 10, - .dry = 10, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_PERSIM_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 47, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Persim, - .description2 = gBerryDescriptionPart2_Persim, - .stageDuration = 3, - .spicy = 10, - .dry = 10, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_LUM_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 34, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Lum, - .description2 = gBerryDescriptionPart2_Lum, - .stageDuration = 12, - .spicy = 10, - .dry = 10, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_SITRUS_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 95, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Sitrus, - .description2 = gBerryDescriptionPart2_Sitrus, - .stageDuration = 6, - .spicy = 10, - .dry = 10, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_FIGY_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 100, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Figy, - .description2 = gBerryDescriptionPart2_Figy, - .stageDuration = 6, - .spicy = 10, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_WIKI_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 115, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Wiki, - .description2 = gBerryDescriptionPart2_Wiki, - .stageDuration = 6, - .spicy = 0, - .dry = 10, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_MAGO_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 126, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Mago, - .description2 = gBerryDescriptionPart2_Mago, - .stageDuration = 6, - .spicy = 0, - .dry = 0, - .sweet = 10, - .bitter = 0, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_AGUAV_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 64, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Aguav, - .description2 = gBerryDescriptionPart2_Aguav, - .stageDuration = 6, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 10, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_IAPAPA_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 223, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Iapapa, - .description2 = gBerryDescriptionPart2_Iapapa, - .stageDuration = 6, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 10, - .smoothness = 25, - }, - { - .name = NAME_RAZZ_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 120, - .maxYield = 6, - .minYield = 3, - .description1 = gBerryDescriptionPart1_Razz, - .description2 = gBerryDescriptionPart2_Razz, - .stageDuration = 1, - .spicy = 10, - .dry = 10, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 20, - }, - { - .name = NAME_BLUK_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 108, - .maxYield = 6, - .minYield = 3, - .description1 = gBerryDescriptionPart1_Bluk, - .description2 = gBerryDescriptionPart2_Bluk, - .stageDuration = 1, - .spicy = 0, - .dry = 10, - .sweet = 10, - .bitter = 0, - .sour = 0, - .smoothness = 20, - }, - { - .name = NAME_NANAB_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 77, - .maxYield = 6, - .minYield = 3, - .description1 = gBerryDescriptionPart1_Nanab, - .description2 = gBerryDescriptionPart2_Nanab, - .stageDuration = 1, - .spicy = 0, - .dry = 0, - .sweet = 10, - .bitter = 10, - .sour = 0, - .smoothness = 20, - }, - { - .name = NAME_WEPEAR_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 74, - .maxYield = 6, - .minYield = 3, - .description1 = gBerryDescriptionPart1_Wepear, - .description2 = gBerryDescriptionPart2_Wepear, - .stageDuration = 1, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_PINAP_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 80, - .maxYield = 6, - .minYield = 3, - .description1 = gBerryDescriptionPart1_Pinap, - .description2 = gBerryDescriptionPart2_Pinap, - .stageDuration = 1, - .spicy = 10, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_POMEG_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 135, - .maxYield = 6, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Pomeg, - .description2 = gBerryDescriptionPart2_Pomeg, - .stageDuration = 3, - .spicy = 10, - .dry = 0, - .sweet = 10, - .bitter = 10, - .sour = 0, - .smoothness = 20, - }, - { - .name = NAME_KELPSY_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 150, - .maxYield = 6, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Kelpsy, - .description2 = gBerryDescriptionPart2_Kelpsy, - .stageDuration = 3, - .spicy = 0, - .dry = 10, - .sweet = 0, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_QUALOT_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 110, - .maxYield = 6, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Qualot, - .description2 = gBerryDescriptionPart2_Qualot, - .stageDuration = 3, - .spicy = 10, - .dry = 0, - .sweet = 10, - .bitter = 0, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_HONDEW_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 162, - .maxYield = 6, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Hondew, - .description2 = gBerryDescriptionPart2_Hondew, - .stageDuration = 3, - .spicy = 10, - .dry = 10, - .sweet = 0, - .bitter = 10, - .sour = 0, - .smoothness = 20, - }, - { - .name = NAME_GREPA_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 149, - .maxYield = 6, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Grepa, - .description2 = gBerryDescriptionPart2_Grepa, - .stageDuration = 3, - .spicy = 0, - .dry = 10, - .sweet = 10, - .bitter = 0, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_TAMATO_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 200, - .maxYield = 4, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Tamato, - .description2 = gBerryDescriptionPart2_Tamato, - .stageDuration = 6, - .spicy = 20, - .dry = 10, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 30, - }, - { - .name = NAME_CORNN_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 75, - .maxYield = 4, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Cornn, - .description2 = gBerryDescriptionPart2_Cornn, - .stageDuration = 6, - .spicy = 0, - .dry = 20, - .sweet = 10, - .bitter = 0, - .sour = 0, - .smoothness = 30, - }, - { - .name = NAME_MAGOST_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 140, - .maxYield = 4, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Magost, - .description2 = gBerryDescriptionPart2_Magost, - .stageDuration = 6, - .spicy = 0, - .dry = 0, - .sweet = 20, - .bitter = 10, - .sour = 0, - .smoothness = 30, - }, - { - .name = NAME_RABUTA_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 226, - .maxYield = 4, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Rabuta, - .description2 = gBerryDescriptionPart2_Rabuta, - .stageDuration = 6, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 20, - .sour = 10, - .smoothness = 30, - }, - { - .name = NAME_NOMEL_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 285, - .maxYield = 4, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Nomel, - .description2 = gBerryDescriptionPart2_Nomel, - .stageDuration = 6, - .spicy = 10, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 20, - .smoothness = 30, - }, - { - .name = NAME_SPELON_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 133, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Spelon, - .description2 = gBerryDescriptionPart2_Spelon, - .stageDuration = 18, - .spicy = 40, - .dry = 10, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 70, - }, - { - .name = NAME_PAMTRE_BERRY, - .firmness = BERRY_FIRMNESS_VERY_SOFT, - .size = 244, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Pamtre, - .description2 = gBerryDescriptionPart2_Pamtre, - .stageDuration = 18, - .spicy = 0, - .dry = 40, - .sweet = 10, - .bitter = 0, - .sour = 0, - .smoothness = 70, - }, - { - .name = NAME_WATMEL_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 250, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Watmel, - .description2 = gBerryDescriptionPart2_Watmel, - .stageDuration = 18, - .spicy = 0, - .dry = 0, - .sweet = 40, - .bitter = 10, - .sour = 0, - .smoothness = 70, - }, - { - .name = NAME_DURIN_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 280, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Durin, - .description2 = gBerryDescriptionPart2_Durin, - .stageDuration = 18, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 40, - .sour = 10, - .smoothness = 70, - }, - { - .name = NAME_BELUE_BERRY, - .firmness = BERRY_FIRMNESS_VERY_SOFT, - .size = 300, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Belue, - .description2 = gBerryDescriptionPart2_Belue, - .stageDuration = 18, - .spicy = 10, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 40, - .smoothness = 70, - }, - { - .name = NAME_LIECHI_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 111, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Liechi, - .description2 = gBerryDescriptionPart2_Liechi, - .stageDuration = 24, - .spicy = 40, - .dry = 0, - .sweet = 40, - .bitter = 0, - .sour = 10, - .smoothness = 80, - }, - { - .name = NAME_GANLON_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 33, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Ganlon, - .description2 = gBerryDescriptionPart2_Ganlon, - .stageDuration = 24, - .spicy = 0, - .dry = 40, - .sweet = 0, - .bitter = 40, - .sour = 0, - .smoothness = 80, - }, - { - .name = NAME_SALAC_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 95, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Salac, - .description2 = gBerryDescriptionPart2_Salac, - .stageDuration = 24, - .spicy = 0, - .dry = 0, - .sweet = 40, - .bitter = 0, - .sour = 40, - .smoothness = 80, - }, - { - .name = NAME_PETAYA_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 237, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Petaya, - .description2 = gBerryDescriptionPart2_Petaya, - .stageDuration = 24, - .spicy = 40, - .dry = 0, - .sweet = 0, - .bitter = 40, - .sour = 0, - .smoothness = 80, - }, - { - .name = NAME_APICOT_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 75, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Apicot, - .description2 = gBerryDescriptionPart2_Apicot, - .stageDuration = 24, - .spicy = 0, - .dry = 40, - .sweet = 0, - .bitter = 0, - .sour = 40, - .smoothness = 80, - }, - { - .name = NAME_LANSAT_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 97, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Lansat, - .description2 = gBerryDescriptionPart2_Lansat, - .stageDuration = 24, - .spicy = 10, - .dry = 10, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 30, - }, - { - .name = NAME_STARF_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 153, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Starf, - .description2 = gBerryDescriptionPart2_Starf, - .stageDuration = 24, - .spicy = 10, - .dry = 10, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 30, - }, - { - .name = NAME_ENIGMA_BERRY, - .firmness = BERRY_FIRMNESS_UNKNOWN, - .size = 0, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Enigma, - .description2 = gBerryDescriptionPart2_Enigma, - .stageDuration = 24, - .spicy = 40, - .dry = 40, - .sweet = 40, - .bitter = 40, - .sour = 40, - .smoothness = 40, - }, -}; - -const struct BerryTree gBlankBerryTree = {0}; - -extern u8 BerryTreeScript; -extern u16 gScriptLastTalked; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; - -// unused -void ClearEnigmaBerries(void) -{ - CpuFill16(0, &gSaveBlock1.enigmaBerry, sizeof(gSaveBlock1.enigmaBerry)); -} - -void SetEnigmaBerry(u8 *src) -{ - u32 i; - u8 *dest = (u8*)&gSaveBlock1.enigmaBerry; - - for (i = 0; i < sizeof(gSaveBlock1.enigmaBerry); i++) - dest[i] = src[i]; - - gSaveBlock1.enigmaBerry.berry.description1 = gSaveBlock1.enigmaBerry.description1; - gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2; -} - -u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) -{ - const u8 *description1; - const u8 *description2; - u32 i; - u32 checksum; - u8 *dest; - - description1 = gSaveBlock1.enigmaBerry.berry.description1; - description2 = gSaveBlock1.enigmaBerry.berry.description2; - gSaveBlock1.enigmaBerry.berry.description1 = 0; - gSaveBlock1.enigmaBerry.berry.description2 = 0; - - dest = (u8*)enigmaBerry; - checksum = 0; - for (i = 0; i < ((u32)&gSaveBlock1.enigmaBerry.checksum - (u32)&gSaveBlock1.enigmaBerry); i++) - { - checksum += dest[i]; - } - - gSaveBlock1.enigmaBerry.berry.description1 = description1; - gSaveBlock1.enigmaBerry.berry.description2 = description2; - - return checksum; -} - -bool32 IsEnigmaBerryValid(void) -{ - if (!gSaveBlock1.enigmaBerry.berry.stageDuration) - return FALSE; - if (!gSaveBlock1.enigmaBerry.berry.maxYield) - return FALSE; - if (GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry) != gSaveBlock1.enigmaBerry.checksum) - return FALSE; - return TRUE; -} - -const struct Berry *GetBerryInfo(u8 berry) -{ - if (berry == 0x2B && IsEnigmaBerryValid()) - return &gSaveBlock1.enigmaBerry.berry; - else - { - if (berry == 0 || berry > 0x2B) - berry = 1; - return &gBerries[berry - 1]; - } -} - -struct BerryTree *GetBerryTreeInfo(u8 id) -{ - return &gSaveBlock1.berryTrees[id]; -} - -bool32 FieldObjectInteractionWaterBerryTree(void) -{ - struct BerryTree *tree = GetBerryTreeInfo(FieldObjectGetBerryTreeId(gSelectedMapObject)); - - switch (tree->stage) - { - case 1: - tree->watered1 = TRUE; - break; - case 2: - tree->watered2 = TRUE; - break; - case 3: - tree->watered3 = TRUE; - break; - case 4: - tree->watered4 = TRUE; - break; - default: - return FALSE; - } - return TRUE; -} - -bool8 IsPlayerFacingPlantedBerryTree(void) -{ - if (GetFieldObjectScriptPointerForComparison() == &BerryTreeScript - && GetStageByBerryTreeId(FieldObjectGetBerryTreeId(gSelectedMapObject)) == 0) - return TRUE; - else - return FALSE; -} - -bool8 TryToWaterBerryTree(void) -{ - if (GetFieldObjectScriptPointerForComparison() != &BerryTreeScript) - return FALSE; - else - return FieldObjectInteractionWaterBerryTree(); -} - -void ClearBerryTrees(void) -{ - int i; - struct SaveBlock1 *saveBlock1 = &gSaveBlock1; - struct BerryTree berryTree = gBlankBerryTree; - - for (i = 0; i < (u8)ARRAY_COUNT(saveBlock1->berryTrees); i++) // casting to u8 fixes a mismatched signed compare. what - saveBlock1->berryTrees[i] = berryTree; -} - -bool32 BerryTreeGrow(struct BerryTree *tree) -{ - if (tree->growthSparkle) - return FALSE; - switch (tree->stage) - { - case 0: - return FALSE; - case 4: - tree->berryYield = CalcBerryYield(tree); - case 1: - case 2: - case 3: - tree->stage++; - break; - case 5: - tree->watered1 = 0; - tree->watered2 = 0; - tree->watered3 = 0; - tree->watered4 = 0; - tree->berryYield = 0; - tree->stage = 2; - if (++tree->regrowthCount == 10) - *tree = gBlankBerryTree; - break; - } - return TRUE; -} - -void BerryTreeTimeUpdate(s32 minutes) -{ - int i; - struct BerryTree *tree; - - for (i = 0; i < (u8)ARRAY_COUNT(gSaveBlock1.berryTrees); i++) - { - tree = &gSaveBlock1.berryTrees[i]; - - if (tree->berry && tree->stage && !tree->growthSparkle) - { - if (minutes >= GetStageDurationByBerryType(tree->berry) * 71) - { - *tree = gBlankBerryTree; - } - else - { - s32 time = minutes; - - while (time != 0) - { - if (tree->minutesUntilNextStage > time) - { - tree->minutesUntilNextStage -= time; - break; - } - time -= tree->minutesUntilNextStage; - tree->minutesUntilNextStage = GetStageDurationByBerryType(tree->berry); - if (!BerryTreeGrow(tree)) - break; - if (tree->stage == 5) - tree->minutesUntilNextStage *= 4; - } - } - } - } -} - -void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle) -{ - struct BerryTree *tree = GetBerryTreeInfo(id); - - *tree = gBlankBerryTree; - tree->berry = berry; - tree->minutesUntilNextStage = GetStageDurationByBerryType(berry); - tree->stage = stage; - if (stage == 5) - { - tree->berryYield = CalcBerryYield(tree); - tree->minutesUntilNextStage *= 4; - } - if (!sparkle) - { - tree->growthSparkle = TRUE; - } -} - -void RemoveBerryTree(u8 id) -{ - gSaveBlock1.berryTrees[id] = gBlankBerryTree; -} - -u8 GetBerryTypeByBerryTreeId(u8 id) -{ - return gSaveBlock1.berryTrees[id].berry; -} - -u8 GetStageByBerryTreeId(u8 id) -{ - return gSaveBlock1.berryTrees[id].stage; -} - -u8 ItemIdToBerryType(u16 item) -{ - u16 berry = item - FIRST_BERRY; - - if (berry > LAST_BERRY - FIRST_BERRY) - return 1; - else - return item - FIRST_BERRY + 1; -} - -u16 BerryTypeToItemId(u16 berry) -{ - u16 item = berry - 1; - - if (item > LAST_BERRY - FIRST_BERRY) - return FIRST_BERRY; - else - return berry + FIRST_BERRY - 1; -} - -void GetBerryNameByBerryType(u8 berry, u8 *string) -{ - memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_LENGTH); - string[BERRY_NAME_LENGTH] = EOS; -} - -void ResetBerryTreeSparkleFlag(u8 id) -{ - GetBerryTreeInfo(id)->growthSparkle = 0; -} - -u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree) -{ - u8 count = 0; - - if (tree->watered1) - count++; - if (tree->watered2) - count++; - if (tree->watered3) - count++; - if (tree->watered4) - count++; - return count; -} - -u8 GetNumStagesWateredByBerryTreeId(u8 id) -{ - return BerryTreeGetNumStagesWatered(GetBerryTreeInfo(id)); -} - -u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water) -{ - u32 randMin; - u32 randMax; - u32 rand; - u32 extraYield; - - if (water == 0) - return min; - else - { - randMin = (max - min) * (water - 1); - randMax = (max - min) * (water); - rand = randMin + Random() % (randMax - randMin + 1); - - if ((rand & 3) > 1) - extraYield = rand / 4 + 1; - else - extraYield = rand / 4; - return extraYield + min; - } -} - -u8 CalcBerryYield(struct BerryTree *tree) -{ - const struct Berry *berry = GetBerryInfo(tree->berry); - u8 min = berry->minYield; - u8 max = berry->maxYield; - - return CalcBerryYieldInternal(max, min, BerryTreeGetNumStagesWatered(tree)); -} - -u8 GetBerryCountByBerryTreeId(u8 id) -{ - return gSaveBlock1.berryTrees[id].berryYield; -} - -u16 GetStageDurationByBerryType(u8 berry) -{ - return GetBerryInfo(berry)->stageDuration * 60; -} - -void FieldObjectInteractionGetBerryTreeData(void) -{ - u8 id; - u8 berry; - u8 unk; - u8 group; - u8 num; - - id = FieldObjectGetBerryTreeId(gSelectedMapObject); - berry = GetBerryTypeByBerryTreeId(id); - ResetBerryTreeSparkleFlag(id); - unk = gScriptLastTalked; - num = gSaveBlock1.location.mapNum; - group = gSaveBlock1.location.mapGroup; - if (sub_8060234(unk, num, group)) - gSpecialVar_0x8004 = 0xFF; - else - gSpecialVar_0x8004 = GetStageByBerryTreeId(id); - gSpecialVar_0x8005 = GetNumStagesWateredByBerryTreeId(id); - gSpecialVar_0x8006 = GetBerryCountByBerryTreeId(id); - GetBerryNameByBerryType(berry, gStringVar1); -} - -void sub_80B4EE4(void) -{ - SetMainCallback2(sub_80A68CC); -} - -void FieldObjectInteractionPlantBerryTree(void) -{ - u8 berry = ItemIdToBerryType(gScriptItemId); - - PlantBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject), berry, 1, TRUE); - FieldObjectInteractionGetBerryTreeData(); -} - -void FieldObjectInteractionPickBerryTree(void) -{ - u8 id = FieldObjectGetBerryTreeId(gSelectedMapObject); - u8 berry = GetBerryTypeByBerryTreeId(id); - - gSpecialVar_0x8004 = AddBagItem(BerryTypeToItemId(berry), GetBerryCountByBerryTreeId(id)); -} - -void FieldObjectInteractionRemoveBerryTree(void) -{ - RemoveBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject)); - sub_8060288(gScriptLastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); -} - -u8 PlayerHasBerries(void) -{ - return IsBagPocketNonEmpty(BAG_BERRIES); -} - -void ResetBerryTreeSparkleFlags(void) -{ - s16 cam_left; - s16 cam_top; - s16 left; - s16 top; - s16 right; - s16 bottom; - int i; - - GetCameraCoords(&cam_left, &cam_top); - left = cam_left; - top = cam_top + 3; - right = cam_left + 14; - bottom = top + 8; - for (i = 0; i < (u8)ARRAY_COUNT(gSaveBlock1.mapObjects); i++) - { - if (gMapObjects[i].active && gMapObjects[i].animPattern == 12) - { - cam_left = gMapObjects[i].coords2.x; - cam_top = gMapObjects[i].coords2.y; - if (left <= cam_left && cam_left <= right && top <= cam_top && cam_top <= bottom) - ResetBerryTreeSparkleFlag(gMapObjects[i].trainerRange_berryTreeId); - } - } -} diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c deleted file mode 100644 index ff430e7b2..000000000 --- a/src/berry_tag_screen.c +++ /dev/null @@ -1,580 +0,0 @@ -#include "global.h" -#include "berry_tag_screen.h" -#include "berry.h" -#include "decompress.h" -#include "field_map_obj.h" -#include "item_menu.h" -#include "items.h" -#include "item_use.h" -#include "main.h" -#include "menu.h" -#include "menu_helpers.h" -#include "palette.h" -#include "rom4.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" - -#define OFFSET_7B (123) -#define FIRST_BERRY ITEM_CHERI_BERRY - -struct Struct2000000 -{ - /*0x00*/ u8 filler_0[0x1FFFF]; - /*0x1FFFF*/ u8 var_1FFFF; -}; - -extern struct Struct2000000 unk_2000000; -extern u16 gUnknown_030041B4; - -static EWRAM_DATA u8 gUnknown_0203932C = 0; -static EWRAM_DATA s16 gUnknown_0203932E[5] = {0}; - -extern const struct CompressedSpriteSheet gUnknown_083C1F74; -extern const struct CompressedSpritePalette gUnknown_083C1F7C; - -extern u8 gBerryCheck_Gfx[]; -extern u8 gBerryCheck_Pal[]; -extern u8 gUnknown_08E788E4[]; -extern u8 gUnknown_08E78A84[]; - -static const u8 *const gUnknown_0841192C[] = -{ - ContestStatsText_VerySoft, - ContestStatsText_Soft, - ContestStatsText_Hard, - ContestStatsText_VeryHard, - ContestStatsText_SuperHard, -}; - -static void sub_8146014(void); -static void sub_814602C(void); -static bool8 sub_8146058(void); -static void sub_8146288(void); -static bool8 sub_81462B8(void); -static void sub_814640C(u8 taskId); -static void sub_8146440(u8 taskId); -static void sub_8146480(u8 taskid); -static void sub_81464E4(void); -static void sub_8146600(u8 berry); -// static void sub_81466A0(void); -static void sub_81466E8(u8 taskId, s8 direction); -// static void sub_8146798(u8 berry); -static void sub_8146810(s8 berry); -static void sub_81468BC(void); - -static void sub_8146014(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - UpdatePaletteFade(); -} - -static void sub_814602C(void) -{ - REG_BG0VOFS = gUnknown_030041B4; - REG_BG1VOFS = gUnknown_030041B4; - - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static bool8 sub_8146058(void) -{ - u8 berry; - u16 backup; - - switch (gMain.state) - { - case 0: - sub_80F9438(); - sub_80F9368(); - sub_8146288(); - REG_BLDCNT = 0; - gMain.state += 1; - break; - case 1: - ResetPaletteFade(); - gPaletteFade.bufferTransferDisabled = 1; - gMain.state += 1; - break; - case 2: - ResetSpriteData(); - gMain.state += 1; - break; - case 3: - SetUpWindowConfig(&gWindowConfig_81E6E18); - gMain.state += 1; - break; - case 4: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6E18); - gMain.state += 1; - break; - case 5: - if (!MultistepInitMenuWindowContinue()) - break; - unk_2000000.var_1FFFF = 0; - gMain.state += 1; - break; - case 6: - if (!sub_81462B8()) - break; - unk_2000000.var_1FFFF = 0; - gMain.state += 1; - break; - case 7: - sub_81464E4(); - gMain.state += 1; - break; - case 8: - berry = gScriptItemId + OFFSET_7B; - gUnknown_0203932C = CreateBerrySprite(berry, 56, 64); - gMain.state += 1; - break; - case 9: - sub_8146600(gScriptItemId + OFFSET_7B); - gMain.state += 1; - break; - case 10: - backup = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = backup; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - SetVBlankCallback(sub_814602C); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP; - gMain.state += 1; - break; - case 11: - if (sub_8055870() == TRUE) - break; - gMain.state += 1; - break; - case 12: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - gPaletteFade.bufferTransferDisabled = 0; - SetMainCallback2(sub_8146014); - return TRUE; - } - - return FALSE; -} - -void BerryTagScreen_814625C(u8 taskId) -{ - do - { - if (sub_8146058() == TRUE) - { - CreateTask(sub_8146480, 0); - return; - } - } while (sub_80F9344() != TRUE); -} - -static void sub_8146288(void) -{ - REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - gUnknown_030041B4 = 0; -} - -bool8 sub_81462B8(void) -{ - u16 i; - void *addr; - - switch (unk_2000000.var_1FFFF) - { - case 0: - LZDecompressVram(gBerryCheck_Gfx, (void *)VRAM); - unk_2000000.var_1FFFF += 1; - break; - case 1: - LZDecompressVram(gUnknown_08E788E4, (void *)VRAM + 0x2800); - unk_2000000.var_1FFFF += 1; - break; - case 2: - LZDecompressVram(gUnknown_08E78A84, (void *)VRAM + 0x3000); - unk_2000000.var_1FFFF += 1; - break; - case 3: - for (i = 0; i < 0x400; i++) - { - if (gSaveBlock2.playerGender == MALE) - gBGTilemapBuffers[2][i] = 0x4042; - else - gBGTilemapBuffers[2][i] = 0x5042; - } - addr = (void *)(VRAM + 0x3800); - DmaCopy16(3, gBGTilemapBuffers[2], addr, 0x800); - unk_2000000.var_1FFFF += 1; - break; - case 4: - LoadCompressedPalette(gBerryCheck_Pal, 0, 96 * 2); - unk_2000000.var_1FFFF += 1; - break; - case 5: - LoadCompressedObjectPic(&gUnknown_083C1F74); - unk_2000000.var_1FFFF += 1; - break; - case 6: - LoadCompressedObjectPalette(&gUnknown_083C1F7C); - unk_2000000.var_1FFFF = 0; - return TRUE; - } - - return FALSE; -} - -static void sub_814640C(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(sub_80A5B40); - sub_80A7DD4(); - gpu_pal_allocator_reset__manage_upper_four(); - DestroyTask(taskId); - } -} - -static void sub_8146440(u8 taskId) -{ - PlaySE(SE_SELECT); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = sub_814640C; -} - -static void sub_8146480(u8 taskid) -{ - if (!gPaletteFade.active) - { - if ((gMain.newAndRepeatedKeys & (DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) == DPAD_UP) - sub_81466E8(taskid, -1); - if ((gMain.newAndRepeatedKeys & (DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) == DPAD_DOWN) - sub_81466E8(taskid, 1); - if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - sub_8146440(taskid); - } -} - -static void sub_81464E4(void) -{ - const struct Berry *berryInfo; -#ifdef UNITS_IMPERIAL - u32 size; - s32 sizeMajor; - s32 sizeMinor; -#endif -#if GERMAN - u8 buffer[16]; -#endif - - berryInfo = GetBerryInfo(gScriptItemId + OFFSET_7B + 1); - - ConvertIntToDecimalStringN(gStringVar1, gScriptItemId - FIRST_BERRY + 1, STR_CONV_MODE_LEADING_ZEROS, 2); - MenuPrint(gStringVar1, 12, 4); - -#if ENGLISH - MenuPrint(berryInfo->name, 14, 4); -#elif GERMAN - StringCopy(buffer, berryInfo->name); - StringAppend(buffer, gOtherText_Berry2); - MenuPrint(buffer, 14, 4); -#endif - - MenuPrint(berryInfo->description1, 4, 14); - MenuPrint(berryInfo->description2, 4, 16); - -#ifdef UNITS_IMPERIAL - size = (berryInfo->size * 1000) / 254; - if (size % 10 >= 5) - size += 10; - sizeMinor = (size % 100) / 10; - sizeMajor = size / 100; -#endif - - MenuPrint(gOtherText_Size, 11, 7); - if (berryInfo->size != 0) - { -#ifdef UNITS_IMPERIAL - ConvertIntToDecimalStringN(gStringVar1, sizeMajor, STR_CONV_MODE_LEFT_ALIGN, 2); - ConvertIntToDecimalStringN(gStringVar2, sizeMinor, STR_CONV_MODE_LEFT_ALIGN, 2); -#else - 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); - } - else - { - MenuPrint(gOtherText_ThreeQuestions2, 16, 7); - } - - MenuPrint(gOtherText_Firm, 11, 9); - if (berryInfo->firmness != 0) - MenuPrint(gUnknown_0841192C[berryInfo->firmness - 1], 16, 9); - else - MenuPrint(gOtherText_ThreeQuestions2, 16, 9); -} - -static void sub_8146600(u8 berry) -{ - const struct Berry *berryInfo; - u16 i; - - berryInfo = GetBerryInfo(berry + 1); - for (i = 0; i < 5; i++) - gUnknown_0203932E[i] = (u16)gUnknown_0203932E[i] | 0xFFFF; - - // argument is the center of the circle - if (berryInfo->spicy) - gUnknown_0203932E[0] = sub_80A7E5C(48); - if (berryInfo->dry) - gUnknown_0203932E[1] = sub_80A7E5C(88); - if (berryInfo->sweet) - gUnknown_0203932E[2] = sub_80A7E5C(128); - if (berryInfo->bitter) - gUnknown_0203932E[3] = sub_80A7E5C(168); - if (berryInfo->sour) - gUnknown_0203932E[4] = sub_80A7E5C(208); -} - -void sub_81466A0(void) -{ - u16 i; - - for (i = 0; i < 5; i++) - { - if (gUnknown_0203932E[i] != -1) - { - DestroySprite(&gSprites[gUnknown_0203932E[i]]); - gUnknown_0203932E[i] = -1; - } - } -} - -__attribute__((naked)) -static void sub_81466E8(u8 taskId, s8 direction) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - lsls r1, 24\n\ - lsrs r2, r1, 24\n\ - lsls r0, r7, 2\n\ - adds r0, r7\n\ - lsls r0, 3\n\ - ldr r1, _08146748 @ =gTasks + 0x8\n\ - adds r6, r0, r1\n\ - ldr r4, _0814674C @ =gBagPocketScrollStates\n\ - movs r0, 0xC\n\ - adds r0, r4\n\ - mov r8, r0\n\ - ldrb r1, [r0, 0x1]\n\ - ldrb r0, [r4, 0xC]\n\ - adds r1, r0\n\ - cmp r1, 0\n\ - bne _08146718\n\ - lsls r0, r2, 24\n\ - cmp r0, 0\n\ - blt _0814678C\n\ -_08146718:\n\ - adds r0, r1, 0x1\n\ - lsls r5, r2, 24\n\ - mov r1, r8\n\ - ldrb r1, [r1, 0x2]\n\ - cmp r0, r1\n\ - bne _08146728\n\ - cmp r5, 0\n\ - bgt _0814678C\n\ -_08146728:\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - mov r2, r8\n\ - ldrb r3, [r2, 0x1]\n\ - ldrb r4, [r4, 0xC]\n\ - mov r12, r4\n\ - adds r0, r3, r4\n\ - asrs r2, r5, 24\n\ - adds r1, r0, r2\n\ - cmp r1, 0\n\ - bge _08146750\n\ - negs r0, r0\n\ - strh r0, [r6, 0x2]\n\ - b _08146766\n\ - .align 2, 0\n\ -_08146748: .4byte gTasks + 0x8\n\ -_0814674C: .4byte gBagPocketScrollStates\n\ -_08146750:\n\ - mov r4, r8\n\ - ldrb r0, [r4, 0x2]\n\ - cmp r1, r0\n\ - blt _08146764\n\ - subs r0, r3\n\ - mov r1, r12\n\ - subs r0, r1\n\ - subs r0, 0x1\n\ - strh r0, [r6, 0x2]\n\ - b _08146766\n\ -_08146764:\n\ - strh r2, [r6, 0x2]\n\ -_08146766:\n\ - ldr r0, _08146780 @ =gTasks\n\ - lsls r1, r7, 2\n\ - adds r1, r7\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldr r0, _08146784 @ =sub_8146798\n\ - str r0, [r1]\n\ - cmp r5, 0\n\ - bge _08146788\n\ - movs r2, 0x10\n\ - negs r2, r2\n\ - adds r0, r2, 0\n\ - b _0814678A\n\ - .align 2, 0\n\ -_08146780: .4byte gTasks\n\ -_08146784: .4byte sub_8146798\n\ -_08146788:\n\ - movs r0, 0x10\n\ -_0814678A:\n\ - strh r0, [r6]\n\ -_0814678C:\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} - -void sub_8146798(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - gUnknown_030041B4 = (gUnknown_030041B4 + taskData[0]) & 0xFF; - if ((taskData[0] > 0 && gUnknown_030041B4 == 144) - || (taskData[0] < 0 && gUnknown_030041B4 == 112)) - { - sub_8146810(gTasks[taskId].data[1]); - sub_81468BC(); - } - if (gUnknown_030041B4 == 0) - { - gTasks[taskId].data[0] = gUnknown_030041B4; - gTasks[taskId].data[1] = gUnknown_030041B4; - gTasks[taskId].func = sub_8146480; - } -} - -__attribute__((naked)) -static void sub_8146810(s8 berry) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - adds r4, r3, 0\n\ - lsls r0, r3, 24\n\ - asrs r1, r0, 24\n\ - cmp r1, 0\n\ - ble _08146848\n\ - ldr r0, _08146840 @ =gBagPocketScrollStates\n\ - adds r4, r0, 0\n\ - adds r4, 0xC\n\ - ldrb r2, [r0, 0xC]\n\ - adds r1, r2, r1\n\ - adds r6, r0, 0\n\ - cmp r1, 0x7\n\ - ble _08146844\n\ - adds r0, r3, 0\n\ - adds r0, 0xF9\n\ - adds r0, r2, r0\n\ - ldrb r1, [r4, 0x1]\n\ - adds r0, r1\n\ - strb r0, [r4, 0x1]\n\ - movs r0, 0x7\n\ - b _0814686E\n\ - .align 2, 0\n\ -_08146840: .4byte gBagPocketScrollStates\n\ -_08146844:\n\ - adds r0, r2, r3\n\ - b _0814686E\n\ -_08146848:\n\ - ldr r0, _08146868 @ =gBagPocketScrollStates\n\ - adds r5, r0, 0\n\ - adds r5, 0xC\n\ - ldrb r2, [r0, 0xC]\n\ - adds r1, r2, r1\n\ - adds r6, r0, 0\n\ - cmp r1, 0\n\ - bge _0814686C\n\ - adds r0, r2, r3\n\ - ldrb r1, [r5, 0x1]\n\ - adds r0, r1\n\ - movs r1, 0\n\ - strb r0, [r5, 0x1]\n\ - strb r1, [r6, 0xC]\n\ - b _08146870\n\ - .align 2, 0\n\ -_08146868: .4byte gBagPocketScrollStates\n\ -_0814686C:\n\ - adds r0, r2, r4\n\ -_0814686E:\n\ - strb r0, [r6, 0xC]\n\ -_08146870:\n\ - ldr r2, _081468AC @ =gScriptItemId\n\ - movs r0, 0x3\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r1, [r0, 0x1]\n\ - ldrb r0, [r0]\n\ - adds r1, r0\n\ - ldr r0, _081468B0 @ =gCurrentBagPocketItemSlots\n\ - ldr r0, [r0]\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrh r0, [r1]\n\ - strh r0, [r2]\n\ - ldr r0, _081468B4 @ =gUnknown_0203932C\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _081468B8 @ =gSprites\n\ - adds r0, r1\n\ - bl DestroySprite\n\ - bl sub_81466A0\n\ - bl sub_80A7DD4\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_081468AC: .4byte gScriptItemId\n\ -_081468B0: .4byte gCurrentBagPocketItemSlots\n\ -_081468B4: .4byte gUnknown_0203932C\n\ -_081468B8: .4byte gSprites\n\ - .syntax divided\n"); -} - -static void sub_81468BC(void) -{ - MenuZeroFillWindowRect(0, 4, 29, 19); - sub_81464E4(); - - // center of berry sprite - gUnknown_0203932C = CreateBerrySprite(gScriptItemId + OFFSET_7B, 56, 64); - - sub_8146600(gScriptItemId + OFFSET_7B); -} diff --git a/src/bike.c b/src/bike.c deleted file mode 100644 index 58a4f38f4..000000000 --- a/src/bike.c +++ /dev/null @@ -1,1013 +0,0 @@ -#include "global.h" -#include "bike.h" -#include "field_map_obj.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "flags.h" -#include "global.fieldmap.h" -#include "metatile_behavior.h" -#include "rom4.h" -#include "songs.h" -#include "sound.h" - -extern u8 sub_80608A4(u8); - -extern u8 gUnknown_02039250; -extern u8 gUnknown_02039251; -extern u8 gUnknown_0202E854; - -static void MovePlayerOnMachBike(u8, u16, u16); -static u8 GetMachBikeTransition(u8 *); -static void MachBikeTransition_FaceDirection(u8); -static void MachBikeTransition_80E517C(u8); -static void MachBikeTransition_80E51C4(u8); -static void MachBikeTransition_80E5270(u8); -static void MovePlayerOnAcroBike(u8, u16, u16); -static u8 CheckMovementInputAcroBike(u8 *, u16, u16); -static u8 AcroBikeHandleInputNormal(u8 *, u16, u16); -static u8 AcroBikeHandleInputTurning(u8 *, u16, u16); -static u8 AcroBikeHandleInputWheelieStanding(u8 *, u16, u16); -static u8 AcroBikeHandleInputBunnyHop(u8 *, u16, u16); -static u8 AcroBikeHandleInputWheelieMoving(u8 *, u16, u16); -static u8 AcroBikeHandleInputState5(u8 *, u16, u16); -static u8 AcroBikeHandleInputState6(u8 *, u16, u16); -static void AcroBikeTransition_FaceDirection(u8); -static void AcroBikeTransition_80E5708(u8); -static void AcroBikeTransition_80E5744(u8); -static void AcroBikeTransition_NormalToWheelie(u8); -static void AcroBikeTransition_80E57F8(u8); -static void AcroBikeTransition_80E5834(u8); -static void AcroBikeTransition_80E5870(u8); -static void AcroBikeTransition_80E58AC(u8); -static void AcroBikeTransition_80E5920(u8); -static void AcroBikeTransition_80E5990(u8); -static void AcroBikeTransition_80E59A0(u8); -static void AcroBikeTransition_80E5A30(u8); -static void AcroBikeTransition_80E5AC0(u8); -static void sub_80E5B60(u16, u16); -static u8 sub_80E5C2C(void); -static void sub_80E5C7C(u8); -static void sub_80E5CB8(u8); -static u8 sub_80E5CF4(u16); -static u8 get_some_collision(u8); -static u8 sub_80E5DA0(struct MapObject *, s16, s16, u8, u8); -static bool8 IsRunningDisallowedByMetatile(u8); -static void sub_80E5E4C(); -static u8 CanBikeFaceDirOnMetatile(u8, u8); -static bool8 sub_80E5EC0(u8, u8); -static void sub_80E6024(void); - -static void (*const sMachBikeTransitions[])(u8) = -{ - MachBikeTransition_FaceDirection, - MachBikeTransition_80E517C, - MachBikeTransition_80E51C4, - MachBikeTransition_80E5270, -}; - -static void (*const gUnknown_083DB5A4[])(u8) = -{ - PlayerGoSpeed0, - sub_80593C4, - sub_80593F4, -}; - -static void (*const sAcroBikeTransitions[])(u8) = -{ - AcroBikeTransition_FaceDirection, - AcroBikeTransition_80E5708, - AcroBikeTransition_80E5744, - AcroBikeTransition_NormalToWheelie, - AcroBikeTransition_80E57F8, - AcroBikeTransition_80E5834, - AcroBikeTransition_80E5870, - AcroBikeTransition_80E58AC, - AcroBikeTransition_80E5920, - AcroBikeTransition_80E5990, - AcroBikeTransition_80E59A0, - AcroBikeTransition_80E5A30, - AcroBikeTransition_80E5AC0, -}; - -static u8 (*const sAcroBikeInputHandlers[])(u8 *, u16, u16) = -{ - AcroBikeHandleInputNormal, - AcroBikeHandleInputTurning, - AcroBikeHandleInputWheelieStanding, - AcroBikeHandleInputBunnyHop, - AcroBikeHandleInputWheelieMoving, - AcroBikeHandleInputState5, - AcroBikeHandleInputState6, -}; - -const u16 gMachBikeSpeeds[] = {SPEED_NORMAL, SPEED_FAST, SPEED_FASTEST}; -static const u8 Unknown_3DB606[] = {4, 0}; - -static const struct UnknownStruct1 gUnknown_083DB608[] = -{ - {1, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 1}, - {2, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 2}, - {3, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 3}, - {4, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 4}, -}; - -void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) -{ - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) - MovePlayerOnMachBike(direction, newKeys, heldKeys); - else - MovePlayerOnAcroBike(direction, newKeys, heldKeys); -} - -static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys) -{ - sMachBikeTransitions[GetMachBikeTransition(&direction)](direction); -} - -static u8 GetMachBikeTransition(u8 *ptr) -{ - u8 direction = player_get_direction_upper_nybble(); - - if (*ptr == 0) - { - *ptr = direction; - if (gPlayerAvatar.unkB == 0) - { - gPlayerAvatar.running2 = 0; - return 0; - } - gPlayerAvatar.running2 = 2; - return 3; - } - - if (*ptr != direction && gPlayerAvatar.running2 != 2) - { - if (gPlayerAvatar.unkB != 0) - { - *ptr = direction; - gPlayerAvatar.running2 = 2; - return 3; - } - gPlayerAvatar.running2 = 1; - return 1; - } - else - { - gPlayerAvatar.running2 = 2; - return 2; - } -} - -static void MachBikeTransition_FaceDirection(u8 direction) -{ - PlayerFaceDirection(direction); - sub_80E6024(); -} - -static void MachBikeTransition_80E517C(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E)) - { - PlayerTurnInPlace(direction); - sub_80E6024(); - } - else - { - MachBikeTransition_FaceDirection(playerMapObj->mapobj_unk_18); - } -} - -static void MachBikeTransition_80E51C4(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - u8 collision; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - if (gPlayerAvatar.unkB) - MachBikeTransition_80E5270(playerMapObj->placeholder18); - else - MachBikeTransition_FaceDirection(playerMapObj->placeholder18); - } - else - { - collision = get_some_collision(direction); - if (collision > 0 && collision < 12) - { - if (collision == COLLISION_LEDGE_JUMP) - { - PlayerJumpLedge(direction); - } - else - { - sub_80E6024(); - if (collision < 5 || collision > 8) - PlayerOnBikeCollide(direction); - } - } - else - { - gUnknown_083DB5A4[gPlayerAvatar.bikeFrameCounter](direction); - gPlayerAvatar.unkB = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // same as dividing by 2, but compiler is insistent on >> 1 - if (gPlayerAvatar.bikeFrameCounter < 2) // do not go faster than the last element in the mach bike array - gPlayerAvatar.bikeFrameCounter++; - } - } -} - -static void MachBikeTransition_80E5270(u8 var) -{ - u8 collision; - - if (gPlayerAvatar.unkB != 0) - gPlayerAvatar.bikeFrameCounter = --gPlayerAvatar.unkB; - - collision = get_some_collision(var); - - if (collision > 0 && collision < 12) - { - if (collision == COLLISION_LEDGE_JUMP) - { - PlayerJumpLedge(var); - } - else - { - sub_80E6024(); - if (collision < 5 || collision > 8) - PlayerOnBikeCollide(var); - } - } - else - { - gUnknown_083DB5A4[gPlayerAvatar.bikeFrameCounter](var); - } -} - -static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys) -{ - sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection); -} - -static u8 CheckMovementInputAcroBike(u8 *newDirection, u16 newKeys, u16 heldKeys) -{ - return sAcroBikeInputHandlers[gPlayerAvatar.acroBikeState](newDirection, newKeys, heldKeys); -} - -static u8 AcroBikeHandleInputNormal(u8 *newDirection, u16 newKeys, u16 heldKeys) -{ - u8 direction = player_get_direction_upper_nybble(); - - gPlayerAvatar.bikeFrameCounter = 0; - if (*newDirection == DIR_NONE) - { - if (newKeys & B_BUTTON) - { - //We're standing still with the B button held. - //Do a wheelie. - *newDirection = direction; - gPlayerAvatar.running2 = 0; - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - return ACRO_TRANS_NORMAL_TO_WHEELIE; - } - else - { - *newDirection = direction; - gPlayerAvatar.running2 = 0; - return ACRO_TRANS_FACE_DIRECTION; - } - } - if (*newDirection == direction && (heldKeys & B_BUTTON) && gPlayerAvatar.unkB == 0) - { - gPlayerAvatar.unkB++; - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING; - return 11; - } - if (*newDirection != direction && gPlayerAvatar.running2 != 2) - { - gPlayerAvatar.acroBikeState = ACRO_STATE_TURNING; - gPlayerAvatar.unk9 = *newDirection; - gPlayerAvatar.running2 = 0; - return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys); - } - gPlayerAvatar.running2 = 2; - return 2; -} - -static u8 AcroBikeHandleInputTurning(u8 *newDirection, u16 newKeys, u16 heldKeys) -{ - u8 direction; - - *newDirection = gPlayerAvatar.unk9; - gPlayerAvatar.bikeFrameCounter++; - - //Wait 6 frames before actually changing direction - if (gPlayerAvatar.bikeFrameCounter > 6) - { - gPlayerAvatar.running2 = 1; - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - sub_80E6024(); - return 1; - } - direction = player_get_direction_upper_nybble(); - if (*newDirection == sub_80E5C2C()) - { - sub_80E6024(); - gPlayerAvatar.unkB = 1; - if (*newDirection == GetOppositeDirection(direction)) - { - gPlayerAvatar.acroBikeState = ACRO_STATE_6; - return 9; - } - else - { - gPlayerAvatar.running2 = 2; - gPlayerAvatar.acroBikeState = ACRO_STATE_5; - return 8; - } - } - *newDirection = direction; - return 0; -} - -static u8 AcroBikeHandleInputWheelieStanding(u8 *ptr, u16 newKeys, u16 heldKeys) -{ - u8 direction; - struct MapObject *playerMapObj; - - direction = player_get_direction_upper_nybble(); - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - gPlayerAvatar.running2 = 0; - - if (heldKeys & B_BUTTON) - gPlayerAvatar.bikeFrameCounter++; - else - { - //B button was released. - gPlayerAvatar.bikeFrameCounter = 0; - if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - { - //Go back to normal on flat ground - *ptr = direction; - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - sub_80E6024(); - return 4; - } - } - if (gPlayerAvatar.bikeFrameCounter >= 40) - { - *ptr = direction; - gPlayerAvatar.acroBikeState = ACRO_STATE_BUNNY_HOP; - sub_80E6024(); - return 6; - } - if (*ptr == direction) - { - gPlayerAvatar.running2 = 2; - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING; - sub_80E6024(); - return 10; - } - if (*ptr == 0) - { - *ptr = direction; - return 5; - } - gPlayerAvatar.running2 = 1; - return 5; -} - -static u8 AcroBikeHandleInputBunnyHop(u8 *ptr, u16 newKeys, u16 heldKeys) -{ - u8 direction; - struct MapObject *playerMapObj; - - direction = player_get_direction_upper_nybble(); - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!(heldKeys & B_BUTTON)) - { - //B button was released - sub_80E6024(); - if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - { - //Do a standing wheelie on a bumpy slope - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); - } - else - { - //Go back to normal on flat ground - *ptr = direction; - gPlayerAvatar.running2 = 0; - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - return 4; - } - } - - //B Button is still held - - if (*ptr == DIR_NONE) - { - *ptr = direction; - gPlayerAvatar.running2 = 0; - return 6; - } - if (*ptr != direction && gPlayerAvatar.running2 != 2) - { - gPlayerAvatar.running2 = 1; - return 6; - } - gPlayerAvatar.running2 = 2; - return 7; -} - -static u8 AcroBikeHandleInputWheelieMoving(u8 *ptr, u16 newKeys, u16 heldKeys) -{ - u8 direction; - struct MapObject *playerMapObj; - - direction = player_get_direction_lower_nybble(); - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!(heldKeys & B_BUTTON)) - { - sub_80E6024(); - if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - { - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - if (*ptr == 0) - { - *ptr = direction; - gPlayerAvatar.running2 = 0; - return 4; - } - if (*ptr != direction && gPlayerAvatar.running2 != 2) - { - gPlayerAvatar.running2 = 0; - return 4; - } - gPlayerAvatar.running2 = 2; - return 12; - } - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); - } - if (*ptr == 0) - { - *ptr = direction; - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - gPlayerAvatar.running2 = 0; - sub_80E6024(); - return 5; - } - if (direction != *ptr && gPlayerAvatar.running2 != 2) - { - gPlayerAvatar.running2 = 0; - return 5; - } - gPlayerAvatar.running2 = 2; - return 10; -} - -static u8 AcroBikeHandleInputState5(u8 *ptr, u16 newKeys, u16 heldKeys) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - playerMapObj->mapobj_bit_9 = 0; - FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); -} - -static u8 AcroBikeHandleInputState6(u8 *ptr, u16 newKeys, u16 heldKeys) -{ - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); -} - -static void AcroBikeTransition_FaceDirection(u8 direction) -{ - PlayerFaceDirection(direction); -} - -static void AcroBikeTransition_80E5708(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - PlayerFaceDirection(direction); -} - -static void AcroBikeTransition_80E5744(u8 direction) -{ - u8 collision; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - AcroBikeTransition_FaceDirection(playerMapObj->placeholder18); - return; - } - collision = get_some_collision(direction); - if (collision > 0 && collision < 12) - { - if (collision == COLLISION_LEDGE_JUMP) - PlayerJumpLedge(direction); - else if (collision < 5 || collision > 8) - PlayerOnBikeCollide(direction); - } - else - { - npc_use_some_d2s(direction); - } -} - -static void AcroBikeTransition_NormalToWheelie(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - PlayerStartWheelie(direction); -} - -static void AcroBikeTransition_80E57F8(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - sub_8059534(direction); -} - -static void AcroBikeTransition_80E5834(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - sub_8059504(direction); -} - -static void AcroBikeTransition_80E5870(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - sub_805954C(direction); -} - -static void AcroBikeTransition_80E58AC(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - AcroBikeTransition_80E5870(playerMapObj->placeholder18); - return; - } - var = get_some_collision(direction); - //TODO: Try to get rid of this goto - if (var == 0 || var == 9) - { - goto derp; - } - else if (var == 6) - { - sub_8059594(direction); - } - else if (var < 5 || var > 8) - { - if (var <= 11) - { - AcroBikeTransition_80E5870(direction); - } - else - { - derp: - sub_8059570(direction); - } - } -} - -static void AcroBikeTransition_80E5920(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj; - - var = get_some_collision(direction); - if (var != 0) - { - if (var == 7) - return; - if (var < 10) - { - AcroBikeTransition_80E5708(direction); - return; - } - if (sub_80E5EC0(var, direction) == 0) - { - AcroBikeTransition_80E5708(direction); - return; - } - } - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - PlaySE(SE_JITE_PYOKO); - playerMapObj->mapobj_bit_9 = 1; - PlayerSetAnimId(sub_80608A4(direction), 2); -} - -static void AcroBikeTransition_80E5990(u8 direction) -{ - sub_80595B8(direction); -} - -static void AcroBikeTransition_80E59A0(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - sub_8059504(playerMapObj->placeholder18); - return; - } - var = get_some_collision(direction); - if (var > 0 && var < 12) - { - if (var == 6) - { - sub_8059594(direction); - } - else if (var == 9) - { - sub_8059504(direction); - } - else if (var <= 4) - { - if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - sub_8059504(direction); - else - sub_80595DC(direction); //hit wall? - } - return; - } - sub_8059618(direction); - gPlayerAvatar.running2 = 2; -} - -static void AcroBikeTransition_80E5A30(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - PlayerStartWheelie(playerMapObj->placeholder18); - return; - } - var = get_some_collision(direction); - if (var > 0 && var < 12) - { - if (var == 6) - { - sub_8059594(direction); - } - else if (var == 9) - { - sub_8059504(direction); - } - else if (var <= 4) - { - if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - sub_8059504(direction); - else - sub_80595DC(direction); //hit wall? - } - return; - } - sub_8059600(direction); - gPlayerAvatar.running2 = 2; -} - -static void AcroBikeTransition_80E5AC0(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - sub_8059534(playerMapObj->placeholder18); - return; - } - var = get_some_collision(direction); - if (var > 0 && var < 12) - { - if (var == 6) - PlayerJumpLedge(direction); - else if (var < 5 || var > 8) - sub_8059534(direction); - return; - } - sub_8059630(direction); -} - -void sub_80E5B38(u16 a, u16 b) -{ - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) - sub_80E5B60(a, b); -} - -static void sub_80E5B60(u16 unused, u16 b) -{ - u8 var; - - var = sub_80E5CF4(b); - if (var == (gPlayerAvatar.unkC & 0xF)) - { - if (gPlayerAvatar.unk14[0] < 0xFF) - gPlayerAvatar.unk14[0]++; - } - else - { - sub_80E5C7C(var); - gPlayerAvatar.unkB = 0; - } - - var = b & 0xF; - if (var == (gPlayerAvatar.unk10 & 0xF)) - { - if (gPlayerAvatar.unk1C[0] < 0xFF) - gPlayerAvatar.unk1C[0]++; - } - else - { - sub_80E5CB8(var); - gPlayerAvatar.unkB = 0; - } -} - -static bool8 sub_80E5BC8(const u8 *a, const u8 *b) -{ - u8 i; - - for (i = 0; a[i] != 0; i++) - { - if (gPlayerAvatar.unk14[i] > a[i]) - return FALSE; - } - for (i = 0; b[i] != 0; i++) - { - if (gPlayerAvatar.unk1C[i] > b[i]) - return FALSE; - } - return TRUE; -} - -static u8 sub_80E5C2C(void) -{ - u32 i; - - for (i = 0; i < 4; i++) - { - const struct UnknownStruct1 *s = &gUnknown_083DB608[i]; - u32 r1 = gPlayerAvatar.unkC; - u32 r2 = gPlayerAvatar.unk10; - - r1 &= s->unk8; - r2 &= s->unkC; - if (r1 == s->unk0 && r2 == s->unk4 && sub_80E5BC8(s->unk10, s->unk14)) - return s->unk18; - } - return 0; -} - -static void sub_80E5C7C(u8 a) -{ - u8 i; - - gPlayerAvatar.unkC = (gPlayerAvatar.unkC << 4) | (a & 0xF); - - for (i = 7; i != 0; i--) - gPlayerAvatar.unk14[i] = gPlayerAvatar.unk14[i - 1]; - gPlayerAvatar.unk14[0] = 1; -} - -static void sub_80E5CB8(u8 a) -{ - u8 i; - - gPlayerAvatar.unk10 = (gPlayerAvatar.unk10 << 4) | (a & 0xF); - - for (i = 7; i != 0; i--) - gPlayerAvatar.unk1C[i] = gPlayerAvatar.unk1C[i - 1]; - gPlayerAvatar.unk1C[0] = 1; -} - -static u8 sub_80E5CF4(u16 a) -{ - if (a & 0x40) - return 2; - if (a & 0x80) - return 1; - if (a & 0x20) - return 3; - if (a & 0x10) - return 4; - return 0; -} - -static u8 get_some_collision(u8 direction) -{ - s16 x; - s16 y; - u8 metatitleBehavior; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - x = playerMapObj->coords2.x; - y = playerMapObj->coords2.y; - MoveCoords(direction, &x, &y); - metatitleBehavior = MapGridGetMetatileBehaviorAt(x, y); - return sub_80E5DA0(playerMapObj, x, y, direction, metatitleBehavior); -} - -static u8 sub_80E5DA0(struct MapObject *mapObject, s16 x, s16 y, u8 direction, u8 metatitleBehavior) -{ - u8 collision = CheckForFieldObjectCollision(mapObject, x, y, direction, metatitleBehavior); - - if (collision > 4) - return collision; - - if (collision == 0 && IsRunningDisallowedByMetatile(metatitleBehavior)) - collision = 2; - - if (collision) - sub_80E5E4C(); - - return collision; -} - -bool8 IsRunningDisallowed(u8 tile) -{ - if (IsRunningDisallowedByMetatile(tile) != FALSE || gMapHeader.mapType == MAP_TYPE_INDOOR) - return TRUE; - else - return FALSE; -} - -static bool8 IsRunningDisallowedByMetatile(u8 tile) -{ - if (MetatileBehavior_IsRunningDisallowed(tile)) - return TRUE; - if (MetatileBehavior_IsFortreeBridge(tile) && (PlayerGetZCoord() & 1) == 0) - return TRUE; - return FALSE; -} - -static void sub_80E5E4C(void) -{ - if (gUnknown_02039250 != 0 && gUnknown_02039251 < 100) - gUnknown_02039251++; -} - -static bool8 CanBikeFaceDirOnMetatile(u8 direction, u8 tile) -{ - if (direction == DIR_EAST || direction == DIR_WEST) - { - //Bike cannot face east or west on a vertical rail - if (MetatileBehavior_IsIsolatedVerticalRail(tile) - || MetatileBehavior_IsVerticalRail(tile)) - return FALSE; - } - else - { - //Bike cannot face north or south on a horizontal rail - if (MetatileBehavior_IsIsolatedHorizontalRail(tile) - || MetatileBehavior_IsHorizontalRail(tile)) - return FALSE; - } - return TRUE; -} - -static bool8 sub_80E5EC0(u8 var1, u8 direction) -{ - if (direction == DIR_NORTH || direction == DIR_SOUTH) - { - if (var1 == 10 || var1 == 12) - return FALSE; - } - else if (var1 == 11 || var1 == 13) - { - return FALSE; - } - - return TRUE; -} - -bool8 IsBikingDisallowedByPlayer(void) -{ - s16 x, y; - u8 tileBehavior; - - if (!(gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_4))) - { - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - if (!IsRunningDisallowedByMetatile(tileBehavior)) - return FALSE; - } - return TRUE; -} - -bool8 player_should_look_direction_be_enforced_upon_movement(void) -{ - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE) != FALSE && MetatileBehavior_IsBumpySlope(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) != FALSE) - return FALSE; - else - return TRUE; -} - -void GetOnOffBike(u8 var) -{ - gUnknown_0202E854 = 0; - - if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) - { - SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); - sav1_reset_battle_music_maybe(); - sub_8053E90(); - } - else - { - SetPlayerAvatarTransitionFlags(var); - sav1_set_battle_music_maybe(BGM_CYCLING); - sub_8053FB0(BGM_CYCLING); - } -} - -void BikeClearState(int var1, int var2) -{ - u8 i; - - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - gPlayerAvatar.unk9 = 0; - gPlayerAvatar.bikeFrameCounter = 0; - gPlayerAvatar.unkB = 0; - gPlayerAvatar.unkC = var1; - gPlayerAvatar.unk10 = var2; - - for (i = 0; i < 8; i++) - gPlayerAvatar.unk14[i] = 0; - - for (i = 0; i < 8; i++) - gPlayerAvatar.unk1C[i] = 0; -} - -void sub_80E6010(u8 var) -{ - gPlayerAvatar.bikeFrameCounter = var; - gPlayerAvatar.unkB = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // lazy way of multiplying by 1.5. -} - -static void sub_80E6024(void) -{ - gPlayerAvatar.bikeFrameCounter = 0; - gPlayerAvatar.unkB = 0; -} - -s16 GetPlayerSpeed(void) -{ - // because the player pressed a direction, it won't ever return a speed of 0 since this function returns the player's current speed. - s16 machSpeeds[3]; - - memcpy(machSpeeds, gMachBikeSpeeds, sizeof(machSpeeds)); - - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) - return machSpeeds[gPlayerAvatar.bikeFrameCounter]; - else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) - return SPEED_FASTER; - else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_DASH)) - return SPEED_FAST; - else - return SPEED_NORMAL; -} - -void sub_80E6084(void) -{ - s16 x, y; - u8 tileBehavior; - - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) - { - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - if (MetatileBehavior_IsBumpySlope(tileBehavior)) - { - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - sub_8059C94(player_get_direction_upper_nybble()); - } - } -} diff --git a/src/birch_pc.c b/src/birch_pc.c deleted file mode 100644 index 5fb6427c3..000000000 --- a/src/birch_pc.c +++ /dev/null @@ -1,114 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "field_message_box.h" -#include "pokedex.h" -#include "species.h" - -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; - -extern const u8 gBirchDexRatingText_LessThan10[]; -extern const u8 gBirchDexRatingText_LessThan20[]; -extern const u8 gBirchDexRatingText_LessThan30[]; -extern const u8 gBirchDexRatingText_LessThan40[]; -extern const u8 gBirchDexRatingText_LessThan50[]; -extern const u8 gBirchDexRatingText_LessThan60[]; -extern const u8 gBirchDexRatingText_LessThan70[]; -extern const u8 gBirchDexRatingText_LessThan80[]; -extern const u8 gBirchDexRatingText_LessThan90[]; -extern const u8 gBirchDexRatingText_LessThan100[]; -extern const u8 gBirchDexRatingText_LessThan110[]; -extern const u8 gBirchDexRatingText_LessThan120[]; -extern const u8 gBirchDexRatingText_LessThan130[]; -extern const u8 gBirchDexRatingText_LessThan140[]; -extern const u8 gBirchDexRatingText_LessThan150[]; -extern const u8 gBirchDexRatingText_LessThan160[]; -extern const u8 gBirchDexRatingText_LessThan170[]; -extern const u8 gBirchDexRatingText_LessThan180[]; -extern const u8 gBirchDexRatingText_LessThan190[]; -extern const u8 gBirchDexRatingText_LessThan200[]; -extern const u8 gBirchDexRatingText_DexCompleted[]; - -bool16 ScriptGetPokedexInfo(void) -{ - if (gSpecialVar_0x8004 == 0) // is national dex not present? - { - gSpecialVar_0x8005 = GetHoennPokedexCount(0); - gSpecialVar_0x8006 = GetHoennPokedexCount(1); - } - else - { - gSpecialVar_0x8005 = GetNationalPokedexCount(0); - gSpecialVar_0x8006 = GetNationalPokedexCount(1); - } - - return IsNationalPokedexEnabled(); -} - -// This shows your Hoenn Pokedex rating and not your National Dex. -const u8 *GetPokedexRatingText(u16 count) -{ - if (count < 10) - return gBirchDexRatingText_LessThan10; - if (count < 20) - return gBirchDexRatingText_LessThan20; - if (count < 30) - return gBirchDexRatingText_LessThan30; - if (count < 40) - return gBirchDexRatingText_LessThan40; - if (count < 50) - return gBirchDexRatingText_LessThan50; - if (count < 60) - return gBirchDexRatingText_LessThan60; - if (count < 70) - return gBirchDexRatingText_LessThan70; - if (count < 80) - return gBirchDexRatingText_LessThan80; - if (count < 90) - return gBirchDexRatingText_LessThan90; - if (count < 100) - return gBirchDexRatingText_LessThan100; - if (count < 110) - return gBirchDexRatingText_LessThan110; - if (count < 120) - return gBirchDexRatingText_LessThan120; - if (count < 130) - return gBirchDexRatingText_LessThan130; - if (count < 140) - return gBirchDexRatingText_LessThan140; - if (count < 150) - return gBirchDexRatingText_LessThan150; - if (count < 160) - return gBirchDexRatingText_LessThan160; - if (count < 170) - return gBirchDexRatingText_LessThan170; - if (count < 180) - return gBirchDexRatingText_LessThan180; - if (count < 190) - return gBirchDexRatingText_LessThan190; - if (count < 200) - return gBirchDexRatingText_LessThan200; - if (count == 200) - { - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) - || GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // Jirachi or Deoxys is not counted towards the dex completion. If either of these flags are enabled, it means the actual count is less than 200. - return gBirchDexRatingText_LessThan200; - return gBirchDexRatingText_DexCompleted; - } - if (count == 201) - { - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) - && GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // If both of these flags are enabled, it means the actual count is less than 200. - return gBirchDexRatingText_LessThan200; - return gBirchDexRatingText_DexCompleted; - } - if (count == 202) - return gBirchDexRatingText_DexCompleted; // Hoenn dex is considered complete, even though the hoenn dex count is 210. - return gBirchDexRatingText_LessThan10; -} - -void ShowPokedexRatingMessage(void) -{ - ShowFieldMessage(GetPokedexRatingText(gSpecialVar_0x8004)); -} diff --git a/src/blend_palette.c b/src/blend_palette.c deleted file mode 100644 index 843c50ac1..000000000 --- a/src/blend_palette.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "global.h" -#include "blend_palette.h" -#include "palette.h" - -void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) -{ - u16 i; - for (i = 0; i < numEntries; i++) - { - u16 index = i + palOffset; - struct PlttData *data1 = (struct PlttData *)&gPlttBufferUnfaded[index]; - s8 r = data1->r; - s8 g = data1->g; - s8 b = data1->b; - struct PlttData *data2 = (struct PlttData *)&blendColor; - gPlttBufferFaded[index] = ((r + (((data2->r - r) * coeff) >> 4)) << 0) - | ((g + (((data2->g - g) * coeff) >> 4)) << 5) - | ((b + (((data2->b - b) * coeff) >> 4)) << 10); - } -} diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c deleted file mode 100644 index b8d7cd386..000000000 --- a/src/braille_puzzles.c +++ /dev/null @@ -1,258 +0,0 @@ -#include "global.h" -#include "braille_puzzles.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_effect.h" -#include "fieldmap.h" -#include "flags.h" -#include "main.h" -#include "map_obj_lock.h" -#include "menu.h" -#include "rom6.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "species.h" -#include "task.h" -#include "text.h" - -extern u8 gPlayerPartyCount; -extern u8 gLastFieldPokeMenuOpened; - -extern u8 gIslandCave_EventScript_OpenRegiiceChamber[]; // regiice event script - -bool8 ShouldDoBrailleDigEffect(void) -{ - if (!FlagGet(SYS_BRAILLE_DIG) && (gSaveBlock1.location.mapGroup == 0x18 && gSaveBlock1.location.mapNum == 0x47)) - { - if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 3) - return TRUE; - else if (gSaveBlock1.pos.x == 9 && gSaveBlock1.pos.y == 3) - return TRUE; - else if (gSaveBlock1.pos.x == 11 && gSaveBlock1.pos.y == 3) - return TRUE; - } - - return FALSE; -} - -void DoBrailleDigEffect(void) -{ - MapGridSetMetatileIdAt(16, 8, 554); - MapGridSetMetatileIdAt(17, 8, 555); - MapGridSetMetatileIdAt(18, 8, 556); - MapGridSetMetatileIdAt(16, 9, 3634); - MapGridSetMetatileIdAt(17, 9, 563); - MapGridSetMetatileIdAt(18, 9, 3636); - DrawWholeMapView(); - PlaySE(SE_BAN); - FlagSet(SYS_BRAILLE_DIG); - ScriptContext2_Disable(); -} - -bool8 CheckRelicanthWailord(void) -{ - if (GetMonData(&gPlayerParty, MON_DATA_SPECIES2, 0) == SPECIES_RELICANTH) - { - CalculatePlayerPartyCount(); - - if (GetMonData(&gPlayerParty[gPlayerPartyCount - 1], MON_DATA_SPECIES2, 0) == SPECIES_WAILORD) - return TRUE; - } - return FALSE; -} - -bool8 ShouldDoBrailleStrengthEffect(void) -{ - if (!FlagGet(SYS_BRAILLE_STRENGTH) && (gSaveBlock1.location.mapGroup == 0x18 && gSaveBlock1.location.mapNum == 0x6)) - { - if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 23) - return TRUE; - else if (gSaveBlock1.pos.x == 9 && gSaveBlock1.pos.y == 23) - return TRUE; - else if (gSaveBlock1.pos.x == 11 && gSaveBlock1.pos.y == 23) - return TRUE; - } - - return FALSE; -} - -void DoBrailleStrengthEffect(void) -{ - FieldEffectActiveListRemove(0x28); - MapGridSetMetatileIdAt(14, 26, 554); - MapGridSetMetatileIdAt(15, 26, 555); - MapGridSetMetatileIdAt(16, 26, 556); - MapGridSetMetatileIdAt(14, 27, 3634); - MapGridSetMetatileIdAt(15, 27, 563); - MapGridSetMetatileIdAt(16, 27, 3636); - DrawWholeMapView(); - PlaySE(SE_BAN); - FlagSet(SYS_BRAILLE_STRENGTH); - ScriptContext2_Disable(); -} - -bool8 ShouldDoBrailleFlyEffect(void) -{ - if (!FlagGet(SYS_BRAILLE_FLY) && (gSaveBlock1.location.mapGroup == 0x18 && gSaveBlock1.location.mapNum == 0x44)) - { - if (gSaveBlock1.pos.x == 8 && gSaveBlock1.pos.y == 25) - return TRUE; - } - - return FALSE; -} - -void DoBrailleFlyEffect(void) -{ - gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; - FieldEffectStart(0x3C); -} - -bool8 FldEff_UseFlyAncientTomb(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)UseFlyAncientTomb_Callback >> 16; - gTasks[taskId].data[9] = (u32)UseFlyAncientTomb_Callback; - return FALSE; -} - -void UseFlyAncientTomb_Callback(void) -{ - FieldEffectActiveListRemove(0x3C); - UseFlyAncientTomb_Finish(); -} - -void UseFlyAncientTomb_Finish(void) -{ - MapGridSetMetatileIdAt(14, 26, 554); - MapGridSetMetatileIdAt(15, 26, 555); - MapGridSetMetatileIdAt(16, 26, 556); - MapGridSetMetatileIdAt(14, 27, 3634); - MapGridSetMetatileIdAt(15, 27, 563); - MapGridSetMetatileIdAt(16, 27, 3636); - DrawWholeMapView(); - PlaySE(SE_BAN); - FlagSet(SYS_BRAILLE_FLY); - ScriptContext2_Disable(); -} - -void DoBrailleWait(void) -{ - if (!FlagGet(SYS_BRAILLE_WAIT)) - CreateTask(Task_BrailleWait, 0x50); -} - -void Task_BrailleWait(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - data[1] = 7200; - data[0] = 1; - break; - case 1: - if (BrailleWait_CheckButtonPress() != FALSE) - { - MenuZeroFillScreen(); - PlaySE(5); - data[0] = 2; - } - else - { - data[1] = data[1] - 1; - if (data[1] == 0) - { - MenuZeroFillScreen(); - data[0] = 3; - data[1] = 30; - } - } - break; - case 2: - if (BrailleWait_CheckButtonPress() == FALSE) - { - data[1] = data[1] - 1; - if (data[1] == 0) - data[0] = 4; - break; - } - sub_8064E2C(); - DestroyTask(taskId); - ScriptContext2_Disable(); - break; - case 3: - data[1] = data[1] - 1; - if (data[1] == 0) - data[0] = 4; - break; - case 4: - sub_8064E2C(); - ScriptContext1_SetupScript(gIslandCave_EventScript_OpenRegiiceChamber); - DestroyTask(taskId); - break; - } -} - -bool32 BrailleWait_CheckButtonPress(void) -{ - u16 var = 0xFF; - - if (gSaveBlock2.optionsButtonMode == 1) - var |= 0x300; - if (gSaveBlock2.optionsButtonMode == 2) - var |= 0x200; - - if ((var & gMain.newKeys) != FALSE) - return TRUE; - else - return FALSE; -} - -void DoSealedChamberShakingEffect1(void) -{ - u8 taskId = CreateTask(SealedChamberShakingEffect, 0x9); - - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[4] = 2; - gTasks[taskId].data[5] = 5; - gTasks[taskId].data[6] = 50; - SetCameraPanningCallback(0); -} - -void DoSealedChamberShakingEffect2(void) -{ - u8 taskId = CreateTask(SealedChamberShakingEffect, 0x9); - - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[4] = 3; - gTasks[taskId].data[5] = 5; - gTasks[taskId].data[6] = 2; - SetCameraPanningCallback(0); -} - -void SealedChamberShakingEffect(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - task->data[1]++; - - if (!(task->data[1] % task->data[5])) - { - task->data[1] = 0; - task->data[2]++; - task->data[4] = -task->data[4]; - SetCameraPanning(0, task->data[4]); - if (task->data[2] == task->data[6]) - { - DestroyTask(taskId); - EnableBothScriptContexts(); - InstallCameraPanAheadCallback(); - } - } -} diff --git a/src/cable_club.c b/src/cable_club.c deleted file mode 100644 index 20b087f4e..000000000 --- a/src/cable_club.c +++ /dev/null @@ -1,317 +0,0 @@ -#include "global.h" -#include "cable_club.h" -#include "field_message_box.h" -#include "link.h" -#include "main.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "trainer_card.h" - -extern u16 gScriptResult; -extern struct TrainerCard gTrainerCards[4]; - -extern u8 gUnknown_03004860; -extern u8 gFieldLinkPlayerCount; - -extern u8 gUnknown_081A4932[]; -extern const u8 gUnknown_081A4975[]; - -static void sub_80830E4(u8 taskId); -static void sub_8083288(u8 taskId); -static void sub_8083314(u8 taskId); - -void sub_808303C(u8 taskId) { - s32 linkPlayerCount; - s16 *taskData; - - taskData = gTasks[taskId].data; - - linkPlayerCount = GetLinkPlayerCount_2(); - - if (sub_8082E28(taskId) == 1 || - sub_8082EB8(taskId) == 1 || - sub_8082DF4(taskId) == 1) - { - return; - } - - sub_8082D60(taskId, linkPlayerCount); - - if (!(gMain.newKeys & A_BUTTON)) - { - return; - } - -#if ENGLISH - if (linkPlayerCount < taskData[1]) - { - return; - } - - sub_80081C8(linkPlayerCount); - sub_8082D4C(); - ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); // r5 - ShowFieldAutoScrollMessage((u8 *) gUnknown_081A4975); - gTasks[taskId].func = sub_80830E4; -#elif GERMAN - if ((gLinkType == 0x2255 && (u32) linkPlayerCount > 1) || - (gLinkType != 0x2255 && taskData[1] <= linkPlayerCount)) - { - sub_80081C8(linkPlayerCount); - sub_8082D4C(); - ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); // r5 - ShowFieldAutoScrollMessage((u8 *) gUnknown_081A4975); - gTasks[taskId].func = sub_80830E4; - } -#endif -} - -#ifdef NONMATCHING -static void sub_80830E4(u8 taskId) { - if (sub_8082E28(taskId) == 1 || - sub_8082EB8(taskId) == 1 || - sub_8082DF4(taskId) == 1 || - GetFieldMessageBoxMode()) - { - return; - } - - if (sub_800820C() == GetLinkPlayerCount_2() && - !(gMain.heldKeys & B_BUTTON)) - { - ShowFieldAutoScrollMessage(gUnknown_081A4932); - gTasks[taskId].func = sub_8082FEC; - return; - } - - if (gMain.heldKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_8007F4C(); - gTasks[(u32) taskId].func = sub_8083188; - } -} -#else -__attribute__((naked)) -static void sub_80830E4(u8 taskId) { - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - adds r6, r5, 0\n\ - adds r0, r5, 0\n\ - bl sub_8082E28\n\ - cmp r0, 0x1\n\ - beq _08083178\n\ - adds r0, r5, 0\n\ - bl sub_8082EB8\n\ - cmp r0, 0x1\n\ - beq _08083178\n\ - adds r0, r5, 0\n\ - bl sub_8082DF4\n\ - cmp r0, 0x1\n\ - beq _08083178\n\ - bl GetFieldMessageBoxMode\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08083178\n\ - bl sub_800820C\n\ - adds r4, r0, 0\n\ - bl GetLinkPlayerCount_2\n\ - lsls r4, 24\n\ - lsls r0, 24\n\ - cmp r4, r0\n\ - bne _08083132\n\ - ldr r0, _08083148 @ =gMain\n\ - ldrh r1, [r0, 0x2C]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08083158\n\ -_08083132:\n\ - ldr r0, _0808314C @ =gUnknown_081A4932\n\ - bl ShowFieldAutoScrollMessage\n\ - ldr r1, _08083150 @ =gTasks\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldr r1, _08083154 @ =sub_8082FEC\n\ - str r1, [r0]\n\ - b _08083178\n\ - .align 2, 0\n\ -_08083148: .4byte gMain\n\ -_0808314C: .4byte gUnknown_081A4932\n\ -_08083150: .4byte gTasks\n\ -_08083154: .4byte sub_8082FEC\n\ -_08083158:\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08083178\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - bl sub_8007F4C\n\ - ldr r0, _08083180 @ =gTasks\n\ - lsls r1, r6, 2\n\ - adds r1, r6\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldr r0, _08083184 @ =sub_8083188\n\ - str r0, [r1]\n\ -_08083178:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08083180: .4byte gTasks\n\ -_08083184: .4byte sub_8083188\n\ - .syntax divided\n"); -} -#endif - -void sub_8083188(u8 taskId) { - u8 local1, local2; - u16 *result; - - local1 = gTasks[taskId].data[1]; - local2 = gTasks[taskId].data[2]; - - - if (sub_8082DF4(taskId) == 1 || - sub_8083444(taskId) == 1) - { - return; - } - - if (GetLinkPlayerCount_2() != sub_800820C()) - { - gTasks[taskId].func = sub_8083418; - return; - } - - result = &gScriptResult; - *result = sub_8082D9C(local1, local2); - if (*result) - { - gTasks[taskId].func = sub_8083288; - } -} - -void sub_80831F8(u8 taskId) { - u8 local1, local2; - u16 *result; - - local1 = gTasks[taskId].data[1]; - local2 = gTasks[taskId].data[2]; - - if (sub_8082E28(taskId) == 1 || - sub_8082DF4(taskId) == 1) - { - return; - } - - result = &gScriptResult; - *result = sub_8082D9C(local1, local2); - if (*result == 0) - { - return; - } - - - if (*result == 3) - { - sub_800832C(); - HideFieldMessageBox(); - gTasks[taskId].func = sub_80833C4; - } - else - { - gFieldLinkPlayerCount = GetLinkPlayerCount_2(); - gUnknown_03004860 = GetMultiplayerId(); - sub_80081C8(gFieldLinkPlayerCount); - sub_8093390((struct TrainerCard *) gBlockSendBuffer); - gTasks[taskId].func = sub_8083314; - } -} - -static void sub_8083288(u8 taskId) { - if (sub_8082DF4(taskId) == 1) - { - return; - } - - if (gScriptResult == 3) - { - sub_800832C(); - HideFieldMessageBox(); - gTasks[taskId].func = sub_80833C4; - } - else - { - gFieldLinkPlayerCount = GetLinkPlayerCount_2(); - gUnknown_03004860 = GetMultiplayerId(); - sub_80081C8(gFieldLinkPlayerCount); - sub_8093390((struct TrainerCard *) gBlockSendBuffer); - gTasks[taskId].func = sub_8083314; - sub_8007E9C(2); - } -} - -static void sub_8083314(u8 taskId) { - u8 index; - - struct TrainerCard *trainerCards; - - if (sub_8082DF4(taskId) == 1) - { - return; - } - - if (GetBlockReceivedStatus() != sub_8008198()) - { - return; - } - - index = 0; - trainerCards = gTrainerCards; - for (index = 0; index < GetLinkPlayerCount(); index++) - { - void *src; - src = gBlockRecvBuffer[index]; - memcpy(&trainerCards[index], src, sizeof(struct TrainerCard)); - } - - SetSuppressLinkErrorMessage(FALSE); - ResetBlockReceivedFlags(); - HideFieldMessageBox(); - - if (gScriptResult == 1) - { -#if ENGLISH - u16 linkType; - linkType = gLinkType; - // FIXME: sub_8082D4C doesn't take any arguments - sub_8082D4C(0x00004411, linkType); -#elif GERMAN - if (gLinkType != 0x4411) - { - if (gLinkType == 0x6601) - { - deUnkValue2 = 1; - } - } - sub_8082D4C(); -#endif - EnableBothScriptContexts(); - DestroyTask(taskId); - return; - } - - sub_800832C(); - gTasks[taskId].func = sub_80833C4; -} diff --git a/src/calculate_base_damage.c b/src/calculate_base_damage.c deleted file mode 100644 index 0f2605e5b..000000000 --- a/src/calculate_base_damage.c +++ /dev/null @@ -1,1474 +0,0 @@ -#include "global.h" -#include "abilities.h" -#include "battle.h" -#include "berry.h" -#include "data2.h" -#include "event_data.h" -#include "hold_effects.h" -#include "item.h" -#include "items.h" -#include "main.h" -#include "pokemon.h" -#include "species.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "text.h" - -extern u8 gPlayerPartyCount; -extern u8 gEnemyPartyCount; - -extern u16 unk_20160BC[]; -extern struct SecretBaseRecord gSecretBaseRecord; -extern u32 dword_2017100[]; -extern u16 gBattleTypeFlags; -extern struct BattlePokemon gBattleMons[4]; -extern u16 gCurrentMove; -extern u8 gLastUsedAbility; -extern u8 gCritMultiplier; -extern u16 gBattleWeather; -extern struct BattleEnigmaBerry gEnigmaBerries[]; -extern u16 gBattleMovePower; -extern struct SpriteTemplate gUnknown_02024E8C; -extern u16 gTrainerBattleOpponent; -extern struct PokemonStorage gPokemonStorage; - -extern u8 gBadEggNickname[]; -extern struct SpriteTemplate gSpriteTemplate_8208288[]; -extern u8 gTrainerClassToPicIndex[]; -extern u8 gTrainerClassToNameIndex[]; -extern u8 gUnknown_08208238[]; -extern u8 gUnknown_0820823C[]; -extern u8 gStatStageRatios[]; -extern u8 gHoldEffectToType[][2]; - -#define APPLY_STAT_MOD(var, mon, stat, statIndex) \ -{ \ - (var) = (stat) * (gStatStageRatios)[(mon)->statStages[(statIndex)] * 2]; \ - (var) /= (gStatStageRatios + 1)[(mon)->statStages[(statIndex)] * 2]; \ -} - -#ifdef NONMATCHING -s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 a7, u8 a8) -{ - s32 i; - s32 damage = 0; - u8 type; - u16 attack, defense; - u16 spAttack, spDefense; - u8 defenderHoldEffect; - u8 defenderHoldEffectParam; - u8 attackerHoldEffect; - u8 attackerHoldEffectParam; - s32 a, b; - - if (!powerOverride) - gBattleMovePower = gBattleMoves[move].power; - else - gBattleMovePower = powerOverride; - - if (!typeOverride) - type = gBattleMoves[move].type; - else - type = typeOverride & 0x3F; - - attack = attacker->attack; - defense = defender->defense; - spAttack = attacker->spAttack; - spDefense = defender->spDefense; - - if (attacker->item == ITEM_ENIGMA_BERRY) - { - attackerHoldEffect = gEnigmaBerries[a7].holdEffect; - attackerHoldEffectParam = gEnigmaBerries[a7].holdEffectParam; - } - else - { - attackerHoldEffect = ItemId_GetHoldEffect(attacker->item); - attackerHoldEffectParam = ItemId_GetHoldEffectParam(attacker->item); - } - - if (defender->item == ITEM_ENIGMA_BERRY) - { - defenderHoldEffect = gEnigmaBerries[a8].holdEffect; - defenderHoldEffectParam = gEnigmaBerries[a8].holdEffectParam; - } - else - { - defenderHoldEffect = ItemId_GetHoldEffect(defender->item); - defenderHoldEffectParam = ItemId_GetHoldEffectParam(defender->item); - } - - if (attacker->ability == ABILITY_HUGE_POWER || attacker->ability == ABILITY_PURE_POWER) - attack *= 2; - - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) - { - if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && gTrainerBattleOpponent != 1024 - && FlagGet(BADGE01_GET) - && !GetBankSide(a7)) - attack = (110 * attack) / 100; - - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) - { - if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && gTrainerBattleOpponent != 1024 - && FlagGet(BADGE05_GET) - && !GetBankSide(a8)) - defense = (110 * defense) / 100; - - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) - { - if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && gTrainerBattleOpponent != 1024 - && FlagGet(BADGE07_GET) - && !GetBankSide(a7)) - spAttack = (110 * spAttack) / 100; - - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))) - { - if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && gTrainerBattleOpponent != 1024 - && FlagGet(BADGE07_GET) - && !GetBankSide(a8)) - spDefense = (110 * spDefense) / 100; - } - } - } - } - - for (i = 0; i < 17; i++) - { - if (attackerHoldEffect == gHoldEffectToType[i][0] - && type == gHoldEffectToType[i][1]) - { - if (type <= 8) - attack = (attack * (attackerHoldEffectParam + 100)) / 100; - else - spAttack = (spAttack * (attackerHoldEffectParam + 100)) / 100; - break; - } - } - - if (attackerHoldEffect == HOLD_EFFECT_CHOICE_BAND) - attack = (150 * attack) / 100; - if (attackerHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) && (attacker->species == SPECIES_LATIAS || attacker->species == SPECIES_LATIOS)) - spAttack = (150 * spAttack) / 100; - if (defenderHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) && (defender->species == SPECIES_LATIAS || defender->species == SPECIES_LATIOS)) - spDefense = (150 * spDefense) / 100; - if (attackerHoldEffect == HOLD_EFFECT_DEEP_SEA_TOOTH && attacker->species == SPECIES_CLAMPERL) - spAttack *= 2; - if (defenderHoldEffect == HOLD_EFFECT_DEEP_SEA_SCALE && defender->species == SPECIES_CLAMPERL) - spDefense *= 2; - if (attackerHoldEffect == HOLD_EFFECT_LIGHT_BALL && attacker->species == SPECIES_PIKACHU) - spAttack *= 2; - if (defenderHoldEffect == HOLD_EFFECT_METAL_POWDER && defender->species == SPECIES_DITTO) - defense *= 2; - if (attackerHoldEffect == HOLD_EFFECT_THICK_CLUB && (attacker->species == SPECIES_CUBONE || attacker->species == SPECIES_MAROWAK)) - attack *= 2; - if (defender->ability == ABILITY_THICK_FAT && (type == TYPE_FIRE || type == TYPE_ICE)) - spAttack /= 2; - if (attacker->ability == ABILITY_HUSTLE) - attack = (150 * attack) / 100; - if (attacker->ability == ABILITY_PLUS && AbilityBattleEffects(0xE, 0, ABILITY_MINUS, 0, 0)) - spAttack = (150 * spAttack) / 100; - if (attacker->ability == ABILITY_MINUS && AbilityBattleEffects(0xE, 0, ABILITY_PLUS, 0, 0)) - spAttack = (150 * spAttack) / 100; - if (attacker->ability == ABILITY_GUTS && attacker->status1) - attack = (150 * attack) / 100; - if (defender->ability == ABILITY_MARVEL_SCALE && defender->status1) - defense = (150 * defense) / 100; - if (type == TYPE_ELECTRIC && AbilityBattleEffects(0xE, 0, 0, 0xFD, 0)) - gBattleMovePower /= 2; - if (type == TYPE_FIRE && AbilityBattleEffects(0xE, 0, 0, 0xFE, 0)) - gBattleMovePower /= 2; - if (type == TYPE_GRASS && attacker->ability == ABILITY_OVERGROW && attacker->hp <= (attacker->maxHP / 3)) - gBattleMovePower = (150 * gBattleMovePower) / 100; - if (type == TYPE_FIRE && attacker->ability == ABILITY_BLAZE && attacker->hp <= (attacker->maxHP / 3)) - gBattleMovePower = (150 * gBattleMovePower) / 100; - if (type == TYPE_WATER && attacker->ability == ABILITY_TORRENT && attacker->hp <= (attacker->maxHP / 3)) - gBattleMovePower = (150 * gBattleMovePower) / 100; - if (type == TYPE_BUG && attacker->ability == ABILITY_SWARM && attacker->hp <= (attacker->maxHP / 3)) - gBattleMovePower = (150 * gBattleMovePower) / 100; - if (gBattleMoves[gCurrentMove].effect == 7) - defense /= 2; - - if (type < TYPE_MYSTERY) // is physical? - { - if (gCritMultiplier == 2) - { - if (attacker->statStages[1] > 6) - APPLY_STAT_MOD(a, attacker, attack, 1) - else - a = attack; - } - else - APPLY_STAT_MOD(a, attacker, attack, 1) - - a = a * gBattleMovePower * (2 * attacker->level / 5 + 2); - - if (gCritMultiplier == 2) - { - if (defender->statStages[2] < 6) - APPLY_STAT_MOD(b, defender, defense, 2) - else - b = defense; - } - else - APPLY_STAT_MOD(b, defender, defense, 2) - - damage = (a / b) / 50; - - if ((attacker->status1 & 0x10) && attacker->ability != ABILITY_GUTS) - damage /= 2; - - if ((a4 & 1) && gCritMultiplier == 1) - { - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMons(2) == 2) - damage = 2 * (damage / 3); - else - damage /= 2; - } - - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMons(2) == 2) - damage /= 2; - - // moves always do at least 1 damage. - if (damage == 0) - damage = 1; - } - - if (type == TYPE_MYSTERY) - damage = 0; // is ??? type. does 0 damage. - - if (type > TYPE_MYSTERY) // is special? - { - if (gCritMultiplier == 2) - { - if (attacker->statStages[4] > 6) - APPLY_STAT_MOD(a, attacker, spAttack, 4) - else - a = spAttack; - } - else - APPLY_STAT_MOD(a, attacker, spAttack, 4) - - a = a * gBattleMovePower * (2 * attacker->level / 5 + 2); - - if (gCritMultiplier == 2) - { - if (defender->statStages[5] < 6) - APPLY_STAT_MOD(b, defender, spDefense, 5) - else - b = spDefense; - } - else - APPLY_STAT_MOD(b, defender, spDefense, 5) - - damage = (a / b) / 50; - - if ((a4 & 2) && gCritMultiplier == 1) - { - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMons(2) == 2) - damage = 2 * (damage / 3); - else - damage /= 2; - } - - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMons(2) == 2) - damage /= 2; - - // are effects of weather negated with cloud nine or air lock? - if (!AbilityBattleEffects(0xE, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(0xE, 0, ABILITY_AIR_LOCK, 0, 0)) - { - // rain? - if (gBattleWeather & 1) - { - if (type == TYPE_FIRE) - damage /= 2; - else if (type == TYPE_WATER) - damage = (15 * damage) / 10; - } - - // does lack of sun half solar beam damage? - if ((gBattleWeather & 0x9F) && gCurrentMove == 76) - damage /= 2; - - // sunny? - if (gBattleWeather & 0x60) - { - if (type == TYPE_FIRE) - damage = (15 * damage) / 10; - else if (type == TYPE_WATER) - damage /= 2; - } - } - - // flash fire triggered? - if ((dword_2017100[a7] & 1) && type == TYPE_FIRE) - damage = (15 * damage) / 10; - } - - return damage + 2; -} -#else -__attribute__((naked)) -s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 a7, u8 a8) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x2C\n\ - adds r7, r0, 0\n\ - str r1, [sp, 0x4]\n\ - str r2, [sp, 0x8]\n\ - ldr r0, [sp, 0x4C]\n\ - ldr r1, [sp, 0x50]\n\ - ldr r2, [sp, 0x54]\n\ - ldr r4, [sp, 0x58]\n\ - lsls r3, 16\n\ - lsrs r3, 16\n\ - str r3, [sp, 0xC]\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - lsls r1, 24\n\ - lsrs r6, r1, 24\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - str r2, [sp, 0x10]\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - movs r5, 0\n\ - cmp r3, 0\n\ - bne _0803BA80\n\ - ldr r2, _0803BA78 @ =gBattleMovePower\n\ - ldr r1, _0803BA7C @ =gBattleMoves\n\ - ldr r3, [sp, 0x8]\n\ - lsls r0, r3, 1\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x1]\n\ - strh r0, [r2]\n\ - b _0803BA84\n\ - .align 2, 0\n\ -_0803BA78: .4byte gBattleMovePower\n\ -_0803BA7C: .4byte gBattleMoves\n\ -_0803BA80:\n\ - ldr r0, _0803BA9C @ =gBattleMovePower\n\ - strh r3, [r0]\n\ -_0803BA84:\n\ - cmp r6, 0\n\ - bne _0803BAA4\n\ - ldr r1, _0803BAA0 @ =gBattleMoves\n\ - ldr r6, [sp, 0x8]\n\ - lsls r0, r6, 1\n\ - adds r0, r6\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - mov r9, r0\n\ - b _0803BAAE\n\ - .align 2, 0\n\ -_0803BA9C: .4byte gBattleMovePower\n\ -_0803BAA0: .4byte gBattleMoves\n\ -_0803BAA4:\n\ - movs r0, 0x3F\n\ - mov r9, r0\n\ - mov r1, r9\n\ - ands r1, r6\n\ - mov r9, r1\n\ -_0803BAAE:\n\ - ldrh r6, [r7, 0x2]\n\ - ldr r2, [sp, 0x4]\n\ - ldrh r2, [r2, 0x4]\n\ - str r2, [sp, 0x14]\n\ - ldrh r3, [r7, 0x8]\n\ - mov r8, r3\n\ - ldr r0, [sp, 0x4]\n\ - ldrh r0, [r0, 0xA]\n\ - str r0, [sp, 0x18]\n\ - ldrh r0, [r7, 0x2E]\n\ - cmp r0, 0xAF\n\ - bne _0803BAE0\n\ - ldr r1, _0803BADC @ =gEnigmaBerries\n\ - ldr r2, [sp, 0x10]\n\ - lsls r0, r2, 3\n\ - subs r0, r2\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r3, [r0, 0x7]\n\ - mov r10, r3\n\ - ldrb r0, [r0, 0x1A]\n\ - b _0803BAF6\n\ - .align 2, 0\n\ -_0803BADC: .4byte gEnigmaBerries\n\ -_0803BAE0:\n\ - ldrh r0, [r7, 0x2E]\n\ - bl ItemId_GetHoldEffect\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - ldrh r0, [r7, 0x2E]\n\ - bl ItemId_GetHoldEffectParam\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ -_0803BAF6:\n\ - str r0, [sp, 0x20]\n\ - ldr r1, [sp, 0x4]\n\ - ldrh r0, [r1, 0x2E]\n\ - cmp r0, 0xAF\n\ - bne _0803BB26\n\ - ldr r1, _0803BB10 @ =gEnigmaBerries\n\ - lsls r0, r4, 3\n\ - subs r0, r4\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x7]\n\ - str r0, [sp, 0x1C]\n\ - b _0803BB3C\n\ - .align 2, 0\n\ -_0803BB10: .4byte gEnigmaBerries\n\ -_0803BB14:\n\ - ldr r0, [sp, 0x20]\n\ - adds r0, 0x64\n\ - muls r0, r6\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - b _0803BCDC\n\ -_0803BB26:\n\ - ldr r2, [sp, 0x4]\n\ - ldrh r0, [r2, 0x2E]\n\ - bl ItemId_GetHoldEffect\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x1C]\n\ - ldr r3, [sp, 0x4]\n\ - ldrh r0, [r3, 0x2E]\n\ - bl ItemId_GetHoldEffectParam\n\ -_0803BB3C:\n\ - adds r0, r7, 0\n\ - adds r0, 0x20\n\ - ldrb r1, [r0]\n\ - str r0, [sp, 0x24]\n\ - cmp r1, 0x25\n\ - beq _0803BB4C\n\ - cmp r1, 0x4A\n\ - bne _0803BB50\n\ -_0803BB4C:\n\ - lsls r0, r6, 17\n\ - lsrs r6, r0, 16\n\ -_0803BB50:\n\ - ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0803BCBC @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803BB5E\n\ - b _0803BC78\n\ -_0803BB5E:\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803BB98\n\ - ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0803BB98\n\ - ldr r0, _0803BCC4 @ =0x00000807\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0803BB98\n\ - ldr r0, [sp, 0x10]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0803BB98\n\ - movs r0, 0x6E\n\ - muls r0, r6\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ -_0803BB98:\n\ - ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0803BCBC @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0803BC78\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803BBE2\n\ - ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0803BBE2\n\ - ldr r0, _0803BCC8 @ =0x0000080b\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0803BBE2\n\ - adds r0, r4, 0\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0803BBE2\n\ - movs r0, 0x6E\n\ - ldr r1, [sp, 0x14]\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x14]\n\ -_0803BBE2:\n\ - ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0803BCBC @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0803BC78\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803BC2E\n\ - ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0803BC2E\n\ - ldr r0, _0803BCCC @ =0x0000080d\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0803BC2E\n\ - ldr r0, [sp, 0x10]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0803BC2E\n\ - movs r0, 0x6E\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ -_0803BC2E:\n\ - ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - ldr r0, _0803BCBC @ =0x00000902\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0803BC78\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803BC78\n\ - ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r1, r0\n\ - beq _0803BC78\n\ - ldr r0, _0803BCCC @ =0x0000080d\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0803BC78\n\ - adds r0, r4, 0\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0803BC78\n\ - movs r0, 0x6E\n\ - ldr r3, [sp, 0x18]\n\ - muls r0, r3\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x18]\n\ -_0803BC78:\n\ - movs r2, 0\n\ - ldr r4, _0803BCD0 @ =gHoldEffectToType\n\ - ldr r0, [sp, 0x4]\n\ - adds r0, 0x20\n\ - str r0, [sp, 0x28]\n\ - adds r3, r4, 0\n\ -_0803BC84:\n\ - lsls r1, r2, 1\n\ - ldrb r0, [r3]\n\ - cmp r10, r0\n\ - bne _0803BCD4\n\ - adds r0, r4, 0x1\n\ - adds r0, r1, r0\n\ - ldrb r0, [r0]\n\ - cmp r9, r0\n\ - bne _0803BCD4\n\ - mov r1, r9\n\ - cmp r1, 0x8\n\ - bhi _0803BC9E\n\ - b _0803BB14\n\ -_0803BC9E:\n\ - ldr r0, [sp, 0x20]\n\ - adds r0, 0x64\n\ - mov r2, r8\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ - b _0803BCDC\n\ - .align 2, 0\n\ -_0803BCB8: .4byte gBattleTypeFlags\n\ -_0803BCBC: .4byte 0x00000902\n\ -_0803BCC0: .4byte gTrainerBattleOpponent\n\ -_0803BCC4: .4byte 0x00000807\n\ -_0803BCC8: .4byte 0x0000080b\n\ -_0803BCCC: .4byte 0x0000080d\n\ -_0803BCD0: .4byte gHoldEffectToType\n\ -_0803BCD4:\n\ - adds r3, 0x2\n\ - adds r2, 0x1\n\ - cmp r2, 0x10\n\ - bls _0803BC84\n\ -_0803BCDC:\n\ - mov r3, r10\n\ - cmp r3, 0x1D\n\ - bne _0803BCF0\n\ - movs r0, 0x96\n\ - muls r0, r6\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ -_0803BCF0:\n\ - mov r0, r10\n\ - cmp r0, 0x22\n\ - bne _0803BD28\n\ - ldr r0, _0803BFDC @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0803BD28\n\ - ldr r1, _0803BFE0 @ =0xfffffe69\n\ - adds r0, r1, 0\n\ - ldrh r2, [r7]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x1\n\ - bhi _0803BD28\n\ - movs r0, 0x96\n\ - mov r3, r8\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ -_0803BD28:\n\ - ldr r0, [sp, 0x1C]\n\ - cmp r0, 0x22\n\ - bne _0803BD60\n\ - ldr r0, _0803BFDC @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0803BD60\n\ - ldr r1, _0803BFE0 @ =0xfffffe69\n\ - adds r0, r1, 0\n\ - ldr r2, [sp, 0x4]\n\ - ldrh r2, [r2]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x1\n\ - bhi _0803BD60\n\ - movs r0, 0x96\n\ - ldr r3, [sp, 0x18]\n\ - muls r0, r3\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x18]\n\ -_0803BD60:\n\ - mov r0, r10\n\ - cmp r0, 0x23\n\ - bne _0803BD76\n\ - ldrh r1, [r7]\n\ - ldr r0, _0803BFE4 @ =0x00000175\n\ - cmp r1, r0\n\ - bne _0803BD76\n\ - mov r1, r8\n\ - lsls r0, r1, 17\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ -_0803BD76:\n\ - ldr r2, [sp, 0x1C]\n\ - cmp r2, 0x24\n\ - bne _0803BD8E\n\ - ldr r3, [sp, 0x4]\n\ - ldrh r1, [r3]\n\ - ldr r0, _0803BFE4 @ =0x00000175\n\ - cmp r1, r0\n\ - bne _0803BD8E\n\ - ldr r1, [sp, 0x18]\n\ - lsls r0, r1, 17\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x18]\n\ -_0803BD8E:\n\ - mov r2, r10\n\ - cmp r2, 0x2D\n\ - bne _0803BDA2\n\ - ldrh r0, [r7]\n\ - cmp r0, 0x19\n\ - bne _0803BDA2\n\ - mov r3, r8\n\ - lsls r0, r3, 17\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ -_0803BDA2:\n\ - ldr r0, [sp, 0x1C]\n\ - cmp r0, 0x40\n\ - bne _0803BDB8\n\ - ldr r1, [sp, 0x4]\n\ - ldrh r0, [r1]\n\ - cmp r0, 0x84\n\ - bne _0803BDB8\n\ - ldr r2, [sp, 0x14]\n\ - lsls r0, r2, 17\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x14]\n\ -_0803BDB8:\n\ - mov r3, r10\n\ - cmp r3, 0x41\n\ - bne _0803BDCE\n\ - ldrh r0, [r7]\n\ - subs r0, 0x68\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x1\n\ - bhi _0803BDCE\n\ - lsls r0, r6, 17\n\ - lsrs r6, r0, 16\n\ -_0803BDCE:\n\ - ldr r1, [sp, 0x28]\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x2F\n\ - bne _0803BDE6\n\ - mov r2, r9\n\ - cmp r2, 0xA\n\ - beq _0803BDE0\n\ - cmp r2, 0xF\n\ - bne _0803BDE6\n\ -_0803BDE0:\n\ - mov r3, r8\n\ - lsrs r3, 1\n\ - mov r8, r3\n\ -_0803BDE6:\n\ - ldr r0, [sp, 0x24]\n\ - ldrb r4, [r0]\n\ - cmp r4, 0x37\n\ - bne _0803BDFC\n\ - movs r0, 0x96\n\ - muls r0, r6\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ -_0803BDFC:\n\ - cmp r4, 0x39\n\ - bne _0803BE2A\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0xE\n\ - movs r1, 0\n\ - movs r2, 0x3A\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0803BE2A\n\ - movs r0, 0x96\n\ - mov r1, r8\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ -_0803BE2A:\n\ - ldr r2, [sp, 0x24]\n\ - ldrb r0, [r2]\n\ - cmp r0, 0x3A\n\ - bne _0803BE5C\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0xE\n\ - movs r1, 0\n\ - movs r2, 0x39\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0803BE5C\n\ - movs r0, 0x96\n\ - mov r3, r8\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ -_0803BE5C:\n\ - ldr r1, [sp, 0x24]\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x3E\n\ - bne _0803BE78\n\ - ldr r0, [r7, 0x4C]\n\ - cmp r0, 0\n\ - beq _0803BE78\n\ - movs r0, 0x96\n\ - muls r0, r6\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ -_0803BE78:\n\ - ldr r2, [sp, 0x28]\n\ - ldrb r0, [r2]\n\ - cmp r0, 0x3F\n\ - bne _0803BE9A\n\ - ldr r3, [sp, 0x4]\n\ - ldr r0, [r3, 0x4C]\n\ - cmp r0, 0\n\ - beq _0803BE9A\n\ - movs r0, 0x96\n\ - ldr r1, [sp, 0x14]\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x14]\n\ -_0803BE9A:\n\ - mov r2, r9\n\ - cmp r2, 0xD\n\ - bne _0803BEBE\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0xE\n\ - movs r1, 0\n\ - movs r2, 0\n\ - movs r3, 0xFD\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0803BEBE\n\ - ldr r1, _0803BFE8 @ =gBattleMovePower\n\ - ldrh r0, [r1]\n\ - lsrs r0, 1\n\ - strh r0, [r1]\n\ -_0803BEBE:\n\ - mov r3, r9\n\ - cmp r3, 0xA\n\ - bne _0803BEE2\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0xE\n\ - movs r1, 0\n\ - movs r2, 0\n\ - movs r3, 0xFE\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0803BEE2\n\ - ldr r1, _0803BFE8 @ =gBattleMovePower\n\ - ldrh r0, [r1]\n\ - lsrs r0, 1\n\ - strh r0, [r1]\n\ -_0803BEE2:\n\ - mov r0, r9\n\ - cmp r0, 0xC\n\ - bne _0803BF12\n\ - ldr r1, [sp, 0x24]\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x41\n\ - bne _0803BF12\n\ - ldrh r0, [r7, 0x2C]\n\ - movs r1, 0x3\n\ - bl __udivsi3\n\ - ldrh r1, [r7, 0x28]\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r1, r0\n\ - bhi _0803BF12\n\ - ldr r4, _0803BFE8 @ =gBattleMovePower\n\ - ldrh r1, [r4]\n\ - movs r0, 0x96\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - strh r0, [r4]\n\ -_0803BF12:\n\ - mov r2, r9\n\ - cmp r2, 0xA\n\ - bne _0803BF42\n\ - ldr r3, [sp, 0x24]\n\ - ldrb r0, [r3]\n\ - cmp r0, 0x42\n\ - bne _0803BF42\n\ - ldrh r0, [r7, 0x2C]\n\ - movs r1, 0x3\n\ - bl __udivsi3\n\ - ldrh r1, [r7, 0x28]\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r1, r0\n\ - bhi _0803BF42\n\ - ldr r4, _0803BFE8 @ =gBattleMovePower\n\ - ldrh r1, [r4]\n\ - movs r0, 0x96\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - strh r0, [r4]\n\ -_0803BF42:\n\ - mov r0, r9\n\ - cmp r0, 0xB\n\ - bne _0803BF72\n\ - ldr r1, [sp, 0x24]\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x43\n\ - bne _0803BF72\n\ - ldrh r0, [r7, 0x2C]\n\ - movs r1, 0x3\n\ - bl __udivsi3\n\ - ldrh r1, [r7, 0x28]\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r1, r0\n\ - bhi _0803BF72\n\ - ldr r4, _0803BFE8 @ =gBattleMovePower\n\ - ldrh r1, [r4]\n\ - movs r0, 0x96\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - strh r0, [r4]\n\ -_0803BF72:\n\ - mov r2, r9\n\ - cmp r2, 0x6\n\ - bne _0803BFA2\n\ - ldr r3, [sp, 0x24]\n\ - ldrb r0, [r3]\n\ - cmp r0, 0x44\n\ - bne _0803BFA2\n\ - ldrh r0, [r7, 0x2C]\n\ - movs r1, 0x3\n\ - bl __udivsi3\n\ - ldrh r1, [r7, 0x28]\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r1, r0\n\ - bhi _0803BFA2\n\ - ldr r4, _0803BFE8 @ =gBattleMovePower\n\ - ldrh r1, [r4]\n\ - movs r0, 0x96\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - strh r0, [r4]\n\ -_0803BFA2:\n\ - ldr r2, _0803BFEC @ =gBattleMoves\n\ - ldr r0, _0803BFF0 @ =gCurrentMove\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x7\n\ - bne _0803BFBC\n\ - ldr r0, [sp, 0x14]\n\ - lsrs r0, 1\n\ - str r0, [sp, 0x14]\n\ -_0803BFBC:\n\ - mov r1, r9\n\ - cmp r1, 0x8\n\ - bls _0803BFC4\n\ - b _0803C122\n\ -_0803BFC4:\n\ - ldr r0, _0803BFF4 @ =gCritMultiplier\n\ - ldrb r1, [r0]\n\ - adds r4, r0, 0\n\ - cmp r1, 0x2\n\ - bne _0803C000\n\ - movs r0, 0x19\n\ - ldrsb r0, [r7, r0]\n\ - cmp r0, 0x6\n\ - ble _0803BFFC\n\ - ldr r2, _0803BFF8 @ =gStatStageRatios\n\ - b _0803C006\n\ - .align 2, 0\n\ -_0803BFDC: .4byte gBattleTypeFlags\n\ -_0803BFE0: .4byte 0xfffffe69\n\ -_0803BFE4: .4byte 0x00000175\n\ -_0803BFE8: .4byte gBattleMovePower\n\ -_0803BFEC: .4byte gBattleMoves\n\ -_0803BFF0: .4byte gCurrentMove\n\ -_0803BFF4: .4byte gCritMultiplier\n\ -_0803BFF8: .4byte gStatStageRatios\n\ -_0803BFFC:\n\ - adds r5, r6, 0\n\ - b _0803C01E\n\ -_0803C000:\n\ - ldr r2, _0803C050 @ =gStatStageRatios\n\ - movs r0, 0x19\n\ - ldrsb r0, [r7, r0]\n\ -_0803C006:\n\ - lsls r0, 1\n\ - adds r1, r0, r2\n\ - ldrb r1, [r1]\n\ - adds r5, r6, 0\n\ - muls r5, r1\n\ - adds r2, 0x1\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - adds r0, r5, 0\n\ - bl __divsi3\n\ - adds r5, r0, 0\n\ -_0803C01E:\n\ - ldr r0, _0803C054 @ =gBattleMovePower\n\ - ldrh r0, [r0]\n\ - muls r5, r0\n\ - adds r0, r7, 0\n\ - adds r0, 0x2A\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - movs r1, 0x5\n\ - bl __divsi3\n\ - adds r0, 0x2\n\ - muls r5, r0\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x2\n\ - bne _0803C05C\n\ - ldr r2, [sp, 0x4]\n\ - movs r0, 0x1A\n\ - ldrsb r0, [r2, r0]\n\ - cmp r0, 0x5\n\ - bgt _0803C058\n\ - ldr r2, _0803C050 @ =gStatStageRatios\n\ - ldr r3, [sp, 0x4]\n\ - movs r0, 0x1A\n\ - ldrsb r0, [r3, r0]\n\ - b _0803C064\n\ - .align 2, 0\n\ -_0803C050: .4byte gStatStageRatios\n\ -_0803C054: .4byte gBattleMovePower\n\ -_0803C058:\n\ - ldr r3, [sp, 0x14]\n\ - b _0803C07E\n\ -_0803C05C:\n\ - ldr r2, _0803C0DC @ =gStatStageRatios\n\ - ldr r1, [sp, 0x4]\n\ - movs r0, 0x1A\n\ - ldrsb r0, [r1, r0]\n\ -_0803C064:\n\ - lsls r0, 1\n\ - adds r1, r0, r2\n\ - ldrb r1, [r1]\n\ - ldr r6, [sp, 0x14]\n\ - adds r3, r6, 0\n\ - muls r3, r1\n\ - adds r2, 0x1\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - adds r0, r3, 0\n\ - bl __divsi3\n\ - adds r3, r0, 0\n\ -_0803C07E:\n\ - adds r0, r5, 0\n\ - adds r1, r3, 0\n\ - bl __divsi3\n\ - adds r5, r0, 0\n\ - movs r1, 0x32\n\ - bl __divsi3\n\ - adds r5, r0, 0\n\ - ldr r0, [r7, 0x4C]\n\ - movs r1, 0x10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803C0A8\n\ - ldr r1, [sp, 0x24]\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x3E\n\ - beq _0803C0A8\n\ - lsrs r0, r5, 31\n\ - adds r0, r5, r0\n\ - asrs r5, r0, 1\n\ -_0803C0A8:\n\ - movs r0, 0x1\n\ - ldr r2, [sp, 0xC]\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _0803C0EA\n\ - ldrb r1, [r4]\n\ - cmp r1, 0x1\n\ - bne _0803C0EA\n\ - ldr r0, _0803C0E0 @ =gBattleTypeFlags\n\ - ldrh r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _0803C0E4\n\ - movs r0, 0x2\n\ - bl CountAliveMons\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x2\n\ - bne _0803C0E4\n\ - adds r0, r5, 0\n\ - movs r1, 0x3\n\ - bl __divsi3\n\ - lsls r5, r0, 1\n\ - b _0803C0EA\n\ - .align 2, 0\n\ -_0803C0DC: .4byte gStatStageRatios\n\ -_0803C0E0: .4byte gBattleTypeFlags\n\ -_0803C0E4:\n\ - lsrs r0, r5, 31\n\ - adds r0, r5, r0\n\ - asrs r5, r0, 1\n\ -_0803C0EA:\n\ - ldr r0, _0803C148 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803C11C\n\ - ldr r0, _0803C14C @ =gBattleMoves\n\ - ldr r3, [sp, 0x8]\n\ - lsls r1, r3, 1\n\ - adds r1, r3\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x6]\n\ - cmp r0, 0x8\n\ - bne _0803C11C\n\ - movs r0, 0x2\n\ - bl CountAliveMons\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x2\n\ - bne _0803C11C\n\ - lsrs r0, r5, 31\n\ - adds r0, r5, r0\n\ - asrs r5, r0, 1\n\ -_0803C11C:\n\ - cmp r5, 0\n\ - bne _0803C122\n\ - movs r5, 0x1\n\ -_0803C122:\n\ - mov r6, r9\n\ - cmp r6, 0x9\n\ - bne _0803C12A\n\ - movs r5, 0\n\ -_0803C12A:\n\ - mov r0, r9\n\ - cmp r0, 0x9\n\ - bhi _0803C132\n\ - b _0803C330\n\ -_0803C132:\n\ - ldr r0, _0803C150 @ =gCritMultiplier\n\ - ldrb r1, [r0]\n\ - adds r4, r0, 0\n\ - cmp r1, 0x2\n\ - bne _0803C15C\n\ - movs r0, 0x1C\n\ - ldrsb r0, [r7, r0]\n\ - cmp r0, 0x6\n\ - ble _0803C158\n\ - ldr r2, _0803C154 @ =gStatStageRatios\n\ - b _0803C162\n\ - .align 2, 0\n\ -_0803C148: .4byte gBattleTypeFlags\n\ -_0803C14C: .4byte gBattleMoves\n\ -_0803C150: .4byte gCritMultiplier\n\ -_0803C154: .4byte gStatStageRatios\n\ -_0803C158:\n\ - mov r5, r8\n\ - b _0803C17A\n\ -_0803C15C:\n\ - ldr r2, _0803C1A8 @ =gStatStageRatios\n\ - movs r0, 0x1C\n\ - ldrsb r0, [r7, r0]\n\ -_0803C162:\n\ - lsls r0, 1\n\ - adds r1, r0, r2\n\ - ldrb r1, [r1]\n\ - mov r5, r8\n\ - muls r5, r1\n\ - adds r2, 0x1\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - adds r0, r5, 0\n\ - bl __divsi3\n\ - adds r5, r0, 0\n\ -_0803C17A:\n\ - ldr r0, _0803C1AC @ =gBattleMovePower\n\ - ldrh r0, [r0]\n\ - muls r5, r0\n\ - adds r0, r7, 0\n\ - adds r0, 0x2A\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - movs r1, 0x5\n\ - bl __divsi3\n\ - adds r0, 0x2\n\ - muls r5, r0\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x2\n\ - bne _0803C1B4\n\ - ldr r1, [sp, 0x4]\n\ - movs r0, 0x1D\n\ - ldrsb r0, [r1, r0]\n\ - cmp r0, 0x5\n\ - bgt _0803C1B0\n\ - ldr r2, _0803C1A8 @ =gStatStageRatios\n\ - b _0803C1BC\n\ - .align 2, 0\n\ -_0803C1A8: .4byte gStatStageRatios\n\ -_0803C1AC: .4byte gBattleMovePower\n\ -_0803C1B0:\n\ - ldr r3, [sp, 0x18]\n\ - b _0803C1D6\n\ -_0803C1B4:\n\ - ldr r2, _0803C21C @ =gStatStageRatios\n\ - ldr r1, [sp, 0x4]\n\ - movs r0, 0x1D\n\ - ldrsb r0, [r1, r0]\n\ -_0803C1BC:\n\ - lsls r0, 1\n\ - adds r1, r0, r2\n\ - ldrb r1, [r1]\n\ - ldr r6, [sp, 0x18]\n\ - adds r3, r6, 0\n\ - muls r3, r1\n\ - adds r2, 0x1\n\ - adds r0, r2\n\ - ldrb r1, [r0]\n\ - adds r0, r3, 0\n\ - bl __divsi3\n\ - adds r3, r0, 0\n\ -_0803C1D6:\n\ - adds r0, r5, 0\n\ - adds r1, r3, 0\n\ - bl __divsi3\n\ - adds r5, r0, 0\n\ - movs r1, 0x32\n\ - bl __divsi3\n\ - adds r5, r0, 0\n\ - movs r0, 0x2\n\ - ldr r1, [sp, 0xC]\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803C22A\n\ - ldrb r1, [r4]\n\ - cmp r1, 0x1\n\ - bne _0803C22A\n\ - ldr r0, _0803C220 @ =gBattleTypeFlags\n\ - ldrh r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _0803C224\n\ - movs r0, 0x2\n\ - bl CountAliveMons\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x2\n\ - bne _0803C224\n\ - adds r0, r5, 0\n\ - movs r1, 0x3\n\ - bl __divsi3\n\ - lsls r5, r0, 1\n\ - b _0803C22A\n\ - .align 2, 0\n\ -_0803C21C: .4byte gStatStageRatios\n\ -_0803C220: .4byte gBattleTypeFlags\n\ -_0803C224:\n\ - lsrs r0, r5, 31\n\ - adds r0, r5, r0\n\ - asrs r5, r0, 1\n\ -_0803C22A:\n\ - ldr r0, _0803C2A4 @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803C25C\n\ - ldr r0, _0803C2A8 @ =gBattleMoves\n\ - ldr r2, [sp, 0x8]\n\ - lsls r1, r2, 1\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x6]\n\ - cmp r0, 0x8\n\ - bne _0803C25C\n\ - movs r0, 0x2\n\ - bl CountAliveMons\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x2\n\ - bne _0803C25C\n\ - lsrs r0, r5, 31\n\ - adds r0, r5, r0\n\ - asrs r5, r0, 1\n\ -_0803C25C:\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0xE\n\ - movs r1, 0\n\ - movs r2, 0xD\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - bne _0803C30C\n\ - str r0, [sp]\n\ - movs r0, 0xE\n\ - movs r1, 0\n\ - movs r2, 0x4D\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0803C30C\n\ - ldr r2, _0803C2AC @ =gBattleWeather\n\ - ldrh r1, [r2]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - adds r4, r2, 0\n\ - cmp r0, 0\n\ - beq _0803C2C4\n\ - mov r3, r9\n\ - cmp r3, 0xA\n\ - beq _0803C2B0\n\ - cmp r3, 0xB\n\ - beq _0803C2B8\n\ - b _0803C2C4\n\ - .align 2, 0\n\ -_0803C2A4: .4byte gBattleTypeFlags\n\ -_0803C2A8: .4byte gBattleMoves\n\ -_0803C2AC: .4byte gBattleWeather\n\ -_0803C2B0:\n\ - lsrs r0, r5, 31\n\ - adds r0, r5, r0\n\ - asrs r5, r0, 1\n\ - b _0803C2C4\n\ -_0803C2B8:\n\ - lsls r0, r5, 4\n\ - subs r0, r5\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - adds r5, r0, 0\n\ -_0803C2C4:\n\ - ldrh r1, [r4]\n\ - movs r0, 0x9F\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803C2DC\n\ - ldr r0, _0803C2F4 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - cmp r0, 0x4C\n\ - bne _0803C2DC\n\ - lsrs r0, r5, 31\n\ - adds r0, r5, r0\n\ - asrs r5, r0, 1\n\ -_0803C2DC:\n\ - ldrh r1, [r4]\n\ - movs r0, 0x60\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803C30C\n\ - mov r6, r9\n\ - cmp r6, 0xA\n\ - beq _0803C2F8\n\ - cmp r6, 0xB\n\ - beq _0803C306\n\ - b _0803C30C\n\ - .align 2, 0\n\ -_0803C2F4: .4byte gCurrentMove\n\ -_0803C2F8:\n\ - lsls r0, r5, 4\n\ - subs r0, r5\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - adds r5, r0, 0\n\ - b _0803C30C\n\ -_0803C306:\n\ - lsrs r0, r5, 31\n\ - adds r0, r5, r0\n\ - asrs r5, r0, 1\n\ -_0803C30C:\n\ - ldr r1, _0803C344 @ =0x02017100\n\ - ldr r2, [sp, 0x10]\n\ - lsls r0, r2, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0803C330\n\ - mov r3, r9\n\ - cmp r3, 0xA\n\ - bne _0803C330\n\ - lsls r0, r5, 4\n\ - subs r0, r5\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - adds r5, r0, 0\n\ -_0803C330:\n\ - adds r0, r5, 0x2\n\ - add sp, 0x2C\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_0803C344: .4byte 0x02017100\n\ - .syntax divided"); -} -#endif diff --git a/src/choose_party.c b/src/choose_party.c deleted file mode 100644 index d8df44028..000000000 --- a/src/choose_party.c +++ /dev/null @@ -1,1072 +0,0 @@ -#include "global.h" -#include "decoration.h" -#include "field_fadetransition.h" -#include "main.h" -#include "menu.h" -#include "name_string_util.h" -#include "palette.h" -#include "party_menu.h" -#include "pokemon.h" -#include "pokemon_summary_screen.h" -#include "rom4.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "strings.h" -#include "string_util.h" -#include "task.h" -#include "text.h" - -struct UnknownPokemonStruct2 -{ - /*0x00*/ u16 species; - /*0x02*/ u16 heldItem; - /*0x04*/ u8 nickname[11]; - /*0x0F*/ u8 level; - /*0x10*/ u16 hp; - /*0x12*/ u16 maxhp; - /*0x14*/ u32 status; - /*0x18*/ u32 personality; - /*0x1C*/ u8 gender; - /*0x1D*/ u8 language; -}; - -extern u8 gPlayerPartyCount; -extern u8 gLastFieldPokeMenuOpened; -extern u8 gUnknown_020384F0; -extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; -extern u8 gUnknown_0202E8F6; -extern struct Pokemon gUnknown_030042FC[]; -extern const u16 gBattleTowerBanlist[]; - -EWRAM_DATA u8 gSelectedOrderFromParty[3] = {0}; - -extern void OpenPartyMenu(); -extern void TryCreatePartyMenuMonIcon(u8, u8, struct Pokemon *); -extern void LoadHeldItemIconGraphics(void); -extern void CreateHeldItemIcons_806DC34(); -extern u8 sub_806BD58(u8, u8); -extern void PartyMenuPrintMonsLevelOrStatus(void); -extern void PrintPartyMenuMonNicknames(void); -extern void sub_806BC3C(u8, u8); -extern u8 sub_806B58C(u8); -extern void sub_806D538(); -extern u16 sub_806BE38(); -extern u8 sub_806CA38(); -extern void sub_808B5B4(); -extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, u8); -extern u8 sub_806B124(); -extern void sub_806C994(); -extern void sub_806C658(); -extern void sub_806AEDC(void); -extern void sub_806AF4C(); -extern void ShowPokemonSummaryScreen(struct Pokemon *, u8, u8, void (*)(void), int); -extern void sub_806C890(); -extern void sub_806D5A4(); -extern void sub_806B908(void); -extern void CreateMonIcon_806D99C(int, u8, int, struct UnknownPokemonStruct2 *); -extern void sub_806D50C(int, u8); -extern void CreatePartyMenuMonIcon(); -extern void CreateHeldItemIcon_806DCD4(int, u8, int); -extern u8 GetMonStatusAndPokerus(); -extern void PartyMenuPrintHP(); -extern void PartyMenuPutStatusTilemap(u8, int, u8); -extern void PartyMenuPrintLevel(); -extern void PartyMenuPutNicknameTilemap(); -extern void PrintPartyMenuMonNickname(); -extern void PartyMenuDrawHPBar(); -extern bool8 sub_80F9344(void); -extern void sub_806D4AC(); -extern void sub_806D3B4(); -extern void PartyMenuDoPrintLevel(u8, u8, u8); -extern void PartyMenuDoDrawHPBar(u8, u8, u16, u16); -extern void PartyMenuDoPutNicknameTilemap(u16, u8, u8, u8, const u8 *); -extern void box_print(u8, int, const u8 *); -extern void sub_806BCE8(void); -extern void sub_806E750(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, int); -extern u16 sub_806BD80(); -extern void sub_806BF74(); - -static void ClearPartySelection(void); -static bool8 IsMonAllowedInBattleTower(struct Pokemon *); -static void sub_812238C(u8); -static void sub_8122450(u8); -static void sub_81224A8(u8); -static void sub_8122728(u8); -static void BattleTowerEntryMenuCallback_Exit(u8); -static void sub_81228E8(u8); -static void sub_8122950(u8); -static void sub_81229B8(void); -static void sub_8122AB8(u8); -static void sub_8122B10(u8); -static void sub_8122C18(u8); -static void Task_DaycareStorageMenu8122EAC(u8); -void sub_8123138(u8); -static void sub_8123170(u8); -static void sub_81231AC(void); - -void sub_8121E10(void) -{ - ClearPartySelection(); - ewram1B000.unk263 = 0; - OpenPartyMenu(4, 0); -} - -void sub_8121E34(void) -{ - ClearPartySelection(); - ewram1B000.unk263 = 1; - OpenPartyMenu(4, 0); -} - -static void ClearPartySelection(void) -{ - u8 i; - - for (i = 0; i < 3; i++) - gSelectedOrderFromParty[i] = 0; -} - -bool8 sub_8121E78(void) -{ - u8 i; - - switch (ewram1B000_alt.unk264) - { - case 0: - if (ewram1B000_alt.unk266 < gPlayerPartyCount) - { - TryCreatePartyMenuMonIcon(ewram1B000_alt.unk260, ewram1B000_alt.unk266, &gPlayerParty[ewram1B000_alt.unk266]); - ewram1B000_alt.unk266++; - } - else - { - ewram1B000_alt.unk266 = 0; - ewram1B000_alt.unk264++; - } - break; - case 1: - LoadHeldItemIconGraphics(); - ewram1B000_alt.unk264++; - break; - case 2: - CreateHeldItemIcons_806DC34(ewram1B000_alt.unk260); - ewram1B000_alt.unk264++; - break; - case 3: - if (sub_806BD58(ewram1B000_alt.unk260, ewram1B000_alt.unk266) == 1) - { - ewram1B000_alt.unk266 = 0; - ewram1B000_alt.unk264++; - } - else - { - ewram1B000_alt.unk266++; - } - break; - case 4: - PartyMenuPrintMonsLevelOrStatus(); - ewram1B000_alt.unk264++; - break; - case 5: - PrintPartyMenuMonNicknames(); - ewram1B000_alt.unk264++; - break; - case 6: - for (i = 0; i < gPlayerPartyCount; i++) - { - u8 j; - - for (j = 0; j < 3; j++) - { - if (gSelectedOrderFromParty[j] == i + 1) - { - sub_806BC3C(i, j * 14 + 0x1C); - break; - } - } - if (j == 3) - { - if (IsMonAllowedInBattleTower(&gPlayerParty[i]) == TRUE) - sub_806BC3C(i, 0x70); - else - sub_806BC3C(i, 0x7E); - } - } - ewram1B000_alt.unk264++; - break; - case 7: - if (sub_806B58C(ewram1B000_alt.unk266) == 1) - { - ewram1B000_alt.unk266 = 0; - ewram1B000_alt.unk264 = 0; - return TRUE; - } - else - { - ewram1B000_alt.unk266++; - } - break; - } - return FALSE; -} - -#ifdef NONMATCHING -static bool8 IsMonAllowedInBattleTower(struct Pokemon *pkmn) -{ - u16 r3; - s32 i; - - if (GetMonData(pkmn, MON_DATA_IS_EGG)) - return FALSE; - - if (ewram1B000.unk263 == 0) - { - if (GetMonData(pkmn, MON_DATA_HP) == 0) - return FALSE; - else - return TRUE; - } - - if ((gSaveBlock2.filler_A8.var_4AC & 1) == 0 - && GetMonData(pkmn, MON_DATA_LEVEL) > 50) - return FALSE; - - r3 = GetMonData(pkmn, MON_DATA_SPECIES); - // Can't stop the compiler from optimizing out the first index - for (i = 0; gBattleTowerBanlist[i] != 0xFFFF; i++) - { - if (gBattleTowerBanlist[i] == r3) - return FALSE; - } - return TRUE; -} -#else -__attribute__((naked)) -static bool8 IsMonAllowedInBattleTower(struct Pokemon *pkmn) -{ - asm_unified( - "push {r4,lr}\n\ - adds r4, r0, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _0812207C\n\ - ldr r0, _08122058 @ =0x0201b000\n\ - ldr r1, _0812205C @ =0x00000263\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _08122060\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0812207C\n\ - b _081220B6\n\ - .align 2, 0\n\ -_08122058: .4byte 0x0201b000\n\ -_0812205C: .4byte 0x00000263\n\ -_08122060:\n\ - ldr r0, _08122080 @ =gSaveBlock2\n\ - ldr r1, _08122084 @ =0x00000554\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08122088\n\ - adds r0, r4, 0\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - cmp r0, 0x32\n\ - bls _08122088\n\ -_0812207C:\n\ - movs r0, 0\n\ - b _081220B8\n\ - .align 2, 0\n\ -_08122080: .4byte gSaveBlock2\n\ -_08122084: .4byte 0x00000554\n\ -_08122088:\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - ldr r1, _081220C0 @ =gBattleTowerBanlist\n\ - movs r0, 0\n\ - lsls r0, 1\n\ - adds r2, r0, r1\n\ - ldrh r0, [r2]\n\ - ldr r1, _081220C4 @ =0x0000ffff\n\ - cmp r0, r1\n\ - beq _081220B6\n\ - adds r4, r1, 0\n\ - adds r1, r2, 0\n\ -_081220A8:\n\ - ldrh r0, [r1]\n\ - cmp r0, r3\n\ - beq _0812207C\n\ - adds r1, 0x2\n\ - ldrh r0, [r1]\n\ - cmp r0, r4\n\ - bne _081220A8\n\ -_081220B6:\n\ - movs r0, 0x1\n\ -_081220B8:\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_081220C0: .4byte gBattleTowerBanlist\n\ -_081220C4: .4byte 0x0000ffff\n" - ); -} -#endif - -static u8 sub_81220C8(void) -{ - u8 i; - - if (ewram1B000.unk263 == 0) - return 0xFF; - if (gSelectedOrderFromParty[2] == 0) - return 0x11; - for (i = 0; i < 2; i++) - { - u8 j; - - ewram1B000.unk282 = GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[i]], MON_DATA_SPECIES); - ewram1B000.unk280 = GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[i]], MON_DATA_HELD_ITEM); - for (j = i + 1; j < 3; j++) - { - if (ewram1B000.unk282 == GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[j]], MON_DATA_SPECIES)) - return 0x12; - if (ewram1B000.unk280 != 0 && ewram1B000.unk280 == GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[j]], MON_DATA_HELD_ITEM)) - return 0x13; - } - } - return 0xFF; -} - -//------------------------------------------------------------------------------ -// Battle Tower Entry Menu -//------------------------------------------------------------------------------ - -static void BattleTowerEntryMenuCallback_Summary(u8); -static void BattleTowerEntryMenuCallback_Enter(u8); -static void BattleTowerEntryMenuCallback_NoEntry(u8); -static void BattleTowerEntryMenuCallback_Exit(u8); - -static const struct PartyMenuItem sBattleTowerEntryMenuItems[] = -{ - {OtherText_Summary, BattleTowerEntryMenuCallback_Summary}, - {OtherText_Enter2, BattleTowerEntryMenuCallback_Enter}, - {OtherText_NoEntry, BattleTowerEntryMenuCallback_NoEntry}, - {gUnknownText_Exit, BattleTowerEntryMenuCallback_Exit}, -}; - -static const u8 gUnknown_084017D0[] = {1, 0, 3}; -static const u8 gUnknown_084017D3[] = {2, 0, 3}; -static const u8 gUnknown_084017D6[] = {0, 3}; - -static const struct PartyPopupMenu sBattleTowerEntryMenu[] = -{ - {ARRAY_COUNT(gUnknown_084017D0), 9, gUnknown_084017D0}, - {ARRAY_COUNT(gUnknown_084017D3), 9, gUnknown_084017D3}, - {ARRAY_COUNT(gUnknown_084017D6), 9, gUnknown_084017D6}, -}; - - -static bool8 IsPartyMemberAlreadySelected(u8 partyMember) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (gSelectedOrderFromParty[i] == partyMember) - return TRUE; - } - return FALSE; -} - -static void sub_81221F8(u8 taskId) -{ - sub_806D538(5, 1); - if (IsMonAllowedInBattleTower(&gPlayerParty[gLastFieldPokeMenuOpened]) == TRUE) - { - if (IsPartyMemberAlreadySelected(gLastFieldPokeMenuOpened + 1) == TRUE) - { - gTasks[taskId].data[4] = 1; - sub_806E750(1, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); - } - else - { - gTasks[taskId].data[4] = 0; - sub_806E750(0, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); - } - } - else - { - gTasks[taskId].data[4] = 2; - sub_806E750(2, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); - } -} - -void sub_81222B0(u8 taskId) -{ - if (!gPaletteFade.active) - { - switch (sub_806BE38(taskId)) - { - case 1: - PlaySE(SE_SELECT); - gLastFieldPokeMenuOpened = sub_806CA38(taskId); - if (gLastFieldPokeMenuOpened != 6) - { - GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); - sub_81221F8(taskId); - gTasks[taskId].func = sub_812238C; - } - else - { - gTasks[taskId].func = sub_81224A8; - } - sub_808B5B4(taskId); - break; - case 2: - PlaySE(SE_SELECT); - ClearPartySelection(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_8122450; - break; - } - } -} - -// Handle input -static void sub_812238C(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gMain.newAndRepeatedKeys & 0x40) - { - if (GetMenuCursorPos() != 0) - { - PlaySE(SE_SELECT); - MoveMenuCursor(-1); - } - return; - } - if (gMain.newAndRepeatedKeys & 0x80) - { - if (GetMenuCursorPos() != 3) - { - PlaySE(SE_SELECT); - MoveMenuCursor(1); - } - return; - } - if (gMain.newKeys & A_BUTTON) - { - TaskFunc popupMenuFunc; - - PlaySE(SE_SELECT); - popupMenuFunc = PartyMenuGetPopupMenuFunc( - gTasks[taskId].data[4], - sBattleTowerEntryMenu, - sBattleTowerEntryMenuItems, - GetMenuCursorPos()); - popupMenuFunc(taskId); - return; - } - if (gMain.newKeys & B_BUTTON) - { - BattleTowerEntryMenuCallback_Exit(taskId); - return; - } - } -} - -// Return from menu? -static void sub_8122450(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(gMain.savedCallback); - DestroyTask(taskId); - } -} - -// Wait for A or B press -static void sub_8122480(u8 taskId) -{ - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - BattleTowerEntryMenuCallback_Exit(taskId); -} - -static void sub_81224A8(u8 taskId) -{ - u8 val = sub_81220C8(); - - if (val != 0xFF) - { - sub_806D538(val, 0); - gTasks[taskId].func = sub_8122480; - } - else - { - if (gSelectedOrderFromParty[0] != 0) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_8122450; - } - else - { - PlaySE(SE_HAZURE); - sub_806D538(14, 0); - gTasks[taskId].func = sub_8122480; - } - } -} - -// CB2 for menu? -static void sub_8122530(void) -{ - while (1) - { - if (sub_806B124() == 1) - { - sub_806C994(ewram1B000.unk260, gUnknown_020384F0); - sub_806C658(ewram1B000.unk260, 0); - GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); - gLastFieldPokeMenuOpened = gUnknown_020384F0; - sub_81221F8(ewram1B000.unk260); - SetMainCallback2(sub_806AEDC); - break; - } - if (sub_80F9344() == 1) - break; - } -} - -static void sub_81225A4(void) -{ - gPaletteFade.bufferTransferDisabled = TRUE; - sub_806AF4C(4, 0xFF, sub_812238C, 5); - SetMainCallback2(sub_8122530); -} - -// Wait for fade, then show summary screen -static void sub_81225D4(u8 taskId) -{ - if (!gPaletteFade.active) - { - u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data0; - - DestroyTask(taskId); - ewram1B000.unk262 = 1; - ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_81225A4, 0); - } -} - -// Summary callback? -static void BattleTowerEntryMenuCallback_Summary(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_81225D4; -} - -static void BattleTowerEntryMenuCallback_Enter(u8 taskId) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (gSelectedOrderFromParty[i] == 0) - { - gSelectedOrderFromParty[i] = gLastFieldPokeMenuOpened + 1; - sub_806BC3C(gLastFieldPokeMenuOpened, i * 14 + 0x1C); - if (i == 2) - sub_806C890(taskId); - BattleTowerEntryMenuCallback_Exit(taskId); - return; - } - } - PlaySE(SE_HAZURE); - MenuZeroFillWindowRect(20, 10, 29, 19); - HandleDestroyMenuCursors(); - sub_806D5A4(); - sub_806E834(gOtherText_NoMoreThreePoke, 1); - gTasks[taskId].func = sub_8122728; -} - -static void sub_8122728(u8 taskId) -{ - if (gUnknown_0202E8F6 == 1) - return; - - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - MenuZeroFillWindowRect(0, 14, 29, 19); - HandleDestroyMenuCursors(); - BattleTowerEntryMenuCallback_Exit(taskId); - } -} - -static void BattleTowerEntryMenuCallback_NoEntry(u8 taskId) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (gSelectedOrderFromParty[i] == gLastFieldPokeMenuOpened + 1) - { - gSelectedOrderFromParty[i] = 0; - switch (i) - { - case 0: - gSelectedOrderFromParty[0] = gSelectedOrderFromParty[1]; - gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2]; - gSelectedOrderFromParty[2] = 0; - break; - case 1: - gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2]; - gSelectedOrderFromParty[2] = 0; - break; - } - break; // exit loop - } - } - sub_806BC3C(gLastFieldPokeMenuOpened, 0x70); - if (gSelectedOrderFromParty[0] != 0) - sub_806BC3C(gSelectedOrderFromParty[0] - 1, 0x1C); - if (gSelectedOrderFromParty[1] != 0) - sub_806BC3C(gSelectedOrderFromParty[1] - 1, 0x2A); - BattleTowerEntryMenuCallback_Exit(taskId); -} - -static void sub_81227FC(u8 taskId) -{ - MenuZeroFillWindowRect(20, 10, 29, 19); - HandleDestroyMenuCursors(); - sub_806D538(0, 0); - gTasks[taskId].func = sub_81222B0; -} - -static void BattleTowerEntryMenuCallback_Exit(u8 taskId) -{ - PlaySE(SE_SELECT); - sub_81227FC(taskId); -} - -bool8 sub_8122854(void) -{ - switch (ewram1B000_alt.unk264) - { - case 0: - sub_81228E8(ewram1B000_alt.unk260); - ewram1B000_alt.unk264++; - break; - case 1: - LoadHeldItemIconGraphics(); - ewram1B000_alt.unk264++; - break; - case 2: - sub_8122950(ewram1B000_alt.unk260); - ewram1B000_alt.unk264++; - break; - case 3: - sub_81229B8(); - ewram1B000_alt.unk264++; - break; - case 4: - sub_806B908(); - return TRUE; - } - return FALSE; -} - -static void sub_81228E8(u8 a) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) - CreatePartyMenuMonIcon(a, i, 3, &gPlayerParty[i]); - if (gUnknown_02023A00[i].species != 0) - { - CreateMonIcon_806D99C(a, i + 3, 3, &gUnknown_02023A00[i]); - sub_806D50C(a, i + 3); - } - } -} - -static void sub_8122950(u8 a) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) - { - u16 item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - - CreateHeldItemIcon_806DCD4(a, i, item); - } - if (gUnknown_02023A00[i].species != 0) - CreateHeldItemIcon_806DCD4(a, i + 3, gUnknown_02023A00[i].heldItem); - } -} - -static void sub_81229B8(void) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) - { - u8 status; - - PartyMenuPrintHP(i, 3, &gPlayerParty[i]); - status = GetMonStatusAndPokerus(&gPlayerParty[i]); - if (status != 0 && status != 6) - PartyMenuPutStatusTilemap(i, 3, status - 1); - else - PartyMenuPrintLevel(i, 3, &gPlayerParty[i]); - PartyMenuPutNicknameTilemap(i, 3, &gPlayerParty[i]); - PrintPartyMenuMonNickname(i, 3, &gPlayerParty[i]); - PartyMenuDrawHPBar(i, 3, &gPlayerParty[i]); - } - } -} - -void sub_8122A48(u8 taskId) -{ - if (!gPaletteFade.active) - { - gTasks[taskId].data[0] = 30; - sub_806D4AC(taskId, gUnknown_02023A00[0].species, 0); - sub_806D4AC(taskId, gUnknown_02023A00[1].species, 1); - sub_806D4AC(taskId, gUnknown_02023A00[2].species, 2); - gTasks[taskId].func = sub_8122AB8; - ewram1B000.unk261 = 1; - } -} - -static void sub_8122AB8(u8 taskId) -{ - sub_806D3B4(taskId, gUnknown_02023A00[1].species, gUnknown_02023A00[2].species); - if (gTasks[taskId].data[0] == 0) - { - gTasks[taskId].func = sub_8122B10; - ewram1B000.unk261 = 2; - PlaySE(SE_W231); - } -} - -static void sub_8122B10(u8 taskId) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (gUnknown_02023A00[i].species != 0) - { - u8 r2; - - PartyMenuDoPrintHP(i + 3, 3, gUnknown_02023A00[i].hp, gUnknown_02023A00[i].maxhp); - if (gUnknown_02023A00[i].hp == 0) - r2 = 7; - else - r2 = pokemon_ailments_get_primary(gUnknown_02023A00[i].status); - if (r2 != 0) - PartyMenuPutStatusTilemap(i + 3, 3, r2 - 1); - else - PartyMenuDoPrintLevel(i + 3, 3, gUnknown_02023A00[i].level); - PartyMenuDoPutNicknameTilemap(gUnknown_02023A00[i].species, gUnknown_02023A00[i].gender, 3, i + 3, gUnknown_02023A00[i].nickname); - StringCopy(gStringVar1, gUnknown_02023A00[i].nickname); - StringGetEnd10(gStringVar1); - SanitizeNameString(gStringVar1); - box_print(i + 3, 3, gStringVar1); - PartyMenuDoDrawHPBar(i + 3, 3, gUnknown_02023A00[i].hp, gUnknown_02023A00[i].maxhp); - } - } - gTasks[taskId].func = sub_8122C18; - gTasks[taskId].data[0] = 0; -} - -static void sub_8122C18(u8 taskId) -{ - gTasks[taskId].data[0]++; - if (gTasks[taskId].data[0] == 256) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_8122450; - } -} - -// Exactly the same as sub_8121E78 except for case 6 -bool8 unref_sub_8122C60(void) -{ - switch (ewram1B000_alt.unk264) - { - case 0: - if (ewram1B000_alt.unk266 < gPlayerPartyCount) - { - TryCreatePartyMenuMonIcon(ewram1B000_alt.unk260, ewram1B000_alt.unk266, &gPlayerParty[ewram1B000_alt.unk266]); - ewram1B000_alt.unk266++; - } - else - { - ewram1B000_alt.unk266 = 0; - ewram1B000_alt.unk264++; - } - break; - case 1: - LoadHeldItemIconGraphics(); - ewram1B000_alt.unk264++; - break; - case 2: - CreateHeldItemIcons_806DC34(ewram1B000_alt.unk260); - ewram1B000_alt.unk264++; - break; - case 3: - if (sub_806BD58(ewram1B000_alt.unk260, ewram1B000_alt.unk266) == 1) - { - ewram1B000_alt.unk266 = 0; - ewram1B000_alt.unk264++; - } - else - { - ewram1B000_alt.unk266++; - } - break; - case 4: - PartyMenuPrintMonsLevelOrStatus(); - ewram1B000_alt.unk264++; - break; - case 5: - PrintPartyMenuMonNicknames(); - ewram1B000_alt.unk264++; - break; - case 6: - sub_806BCE8(); - ewram1B000_alt.unk264++; - break; - case 7: - if (sub_806B58C(ewram1B000_alt.unk266) == 1) - { - ewram1B000_alt.unk266 = 0; - ewram1B000_alt.unk264 = 0; - return TRUE; - } - else - { - ewram1B000_alt.unk266++; - } - break; - } - return FALSE; -} - -//------------------------------------------------------------------------------ -// Daycare Pokemon Storage Menu -//------------------------------------------------------------------------------ - -static void DaycareStorageMenuCallback_Store(u8); -static void DaycareStorageMenuCallback_Summary(u8); -static void DaycareStorageMenuCallback_Exit(u8); - -static const struct PartyMenuItem sDaycareStorageMenuItems[] = -{ - {OtherText_Store, DaycareStorageMenuCallback_Store}, - {OtherText_Summary, DaycareStorageMenuCallback_Summary}, - {gUnknownText_Exit, DaycareStorageMenuCallback_Exit}, -}; - -static const u8 gUnknown_08401808[] = {0, 1, 2}; -static const u8 gUnknown_0840180B[] = {1, 2}; - -static const struct PartyPopupMenu sDaycareStorageMenus[] = -{ - {ARRAY_COUNT(gUnknown_08401808), 9, gUnknown_08401808}, - {ARRAY_COUNT(gUnknown_0840180B), 9, gUnknown_0840180B}, -}; - -static void sub_8122D94(u8 taskId) -{ - if (!GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG)) - { - gTasks[taskId].data[4] = 0; - sub_806E750(0, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); - } - else - { - gTasks[taskId].data[4] = 1; - sub_806E750(1, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); - } -} - -void sub_8122E0C(u8 taskId) -{ - if (!gPaletteFade.active) - { - switch (sub_806BD80(taskId)) - { - case 1: - PlaySE(SE_SELECT); - gLastFieldPokeMenuOpened = sub_806CA38(taskId); - GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); - sub_8122D94(taskId); - gTasks[taskId].func = Task_DaycareStorageMenu8122EAC; - break; - case 2: - PlaySE(SE_SELECT); - gLastFieldPokeMenuOpened = 0xFF; - gSpecialVar_0x8004 = 0xFF; - sub_8123138(taskId); - break; - } - } -} - -static void Task_DaycareStorageMenu8122EAC(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gMain.newAndRepeatedKeys & 0x40) - { - if (GetMenuCursorPos() != 0) - { - PlaySE(SE_SELECT); - MoveMenuCursor(-1); - } - return; - } - if (gMain.newAndRepeatedKeys & 0x80) - { - if (GetMenuCursorPos() != 3) - { - PlaySE(SE_SELECT); - MoveMenuCursor(1); - } - return; - } - if (gMain.newKeys & A_BUTTON) - { - TaskFunc popupMenuFunc; - - PlaySE(SE_SELECT); - popupMenuFunc = PartyMenuGetPopupMenuFunc( - gTasks[taskId].data[4], - sDaycareStorageMenus, - sDaycareStorageMenuItems, - GetMenuCursorPos()); - popupMenuFunc(taskId); - return; - } - if (gMain.newKeys & B_BUTTON) - { - DaycareStorageMenuCallback_Exit(taskId); - return; - } - } -} - -static void DaycareStorageMenuCallback_Store(u8 taskId) -{ - gSpecialVar_0x8004 = gLastFieldPokeMenuOpened; - sub_8123138(taskId); -} - -static void sub_8122F90(void) -{ - while (1) - { - if (sub_806B124() == 1) - { - sub_806C994(ewram1B000.unk260, gUnknown_020384F0); - sub_806BF74(ewram1B000.unk260, 0); - GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); - gLastFieldPokeMenuOpened = gUnknown_020384F0; - sub_8122D94(ewram1B000.unk260); - SetMainCallback2(sub_806AEDC); - break; - } - if (sub_80F9344() == 1) - break; - } -} - -static void sub_8123004(void) -{ - gPaletteFade.bufferTransferDisabled = TRUE; - sub_806AF4C(6, 0xFF, Task_DaycareStorageMenu8122EAC, 5); - SetMainCallback2(sub_8122F90); -} - -static void sub_8123034(u8 taskId) -{ - if (!gPaletteFade.active) - { - u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data0; - - DestroyTask(taskId); - ewram1B000.unk262 = 1; - ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_8123004, 0); - } -} - -static void DaycareStorageMenuCallback_Summary(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_8123034; -} - -static void DaycareStorageMenuCallback_Exit(u8 taskId) -{ - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(20, 10, 29, 19); - HandleDestroyMenuCursors(); - sub_806D538(15, 0); - gTasks[taskId].func = sub_8122E0C; -} - -void sub_8123138(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_8123170; -} - -static void sub_8123170(u8 taskId) -{ - if (!gPaletteFade.active) - { - gFieldCallback = sub_81231AC; - SetMainCallback2(c2_exit_to_overworld_2_switch); - DestroyTask(taskId); - } -} - -// Do these last two functions really belong in here? - -static void sub_81231C4(u8); - -void sub_81231AC(void) -{ - pal_fill_black(); - CreateTask(sub_81231C4, 10); -} - -static void sub_81231C4(u8 taskId) -{ - if (sub_807D770() == TRUE) - { - DestroyTask(taskId); - ScriptContext2_Disable(); - EnableBothScriptContexts(); - } -} diff --git a/src/clear_save_data_menu.c b/src/clear_save_data_menu.c deleted file mode 100644 index 498562fe0..000000000 --- a/src/clear_save_data_menu.c +++ /dev/null @@ -1,177 +0,0 @@ -#include "global.h" -#include "clear_save_data_menu.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "save.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "strings2.h" -#include "task.h" - -static void VBlankCB_ClearSaveDataScreen(void); -static void Task_InitMenu(u8); -static void Task_ProcessMenuInput(u8); -static void Task_ClearSaveData(u8); -static void CB2_ClearSaveDataScreen(void); -static void VBlankCB_InitClearSaveDataScreen(void); -static u8 InitClearSaveDataScreen(void); -static void CB2_SoftReset(void); - -void CB2_InitClearSaveDataScreen(void) -{ - if (InitClearSaveDataScreen()) - { - CreateTask(Task_InitMenu, 0); - } -} - -static void VBlankCB_ClearSaveDataScreen(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void Task_InitMenu(u8 taskId) -{ - ResetSpriteData(); - - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - - SetVBlankCallback(VBlankCB_ClearSaveDataScreen); - MenuDrawTextWindow(2, 14, 27, 19); - MenuPrint(gSystemText_ClearAllSaveDataPrompt, 3, 15); - - MenuDrawTextWindow(2, 1, 8, 6); - PrintMenuItems(3, 2, 2, gMenuYesNoItems); - InitMenu(0, 3, 2, 2, 1, 5); - - gTasks[taskId].func = Task_ProcessMenuInput; -} - -static void Task_ProcessMenuInput(u8 taskId) -{ - switch (ProcessMenuInputNoWrap_()) - { - case 0: - PlaySE(SE_SELECT); - sub_8071F40(gSystemText_ClearingData); - gTasks[taskId].func = Task_ClearSaveData; - break; - case -1: - case 1: - PlaySE(SE_SELECT); - DestroyTask(taskId); - SetMainCallback2(CB2_SoftReset); - break; - } - AnimateSprites(); - BuildOamBuffer(); -} - -static void Task_ClearSaveData(u8 taskId) -{ - ClearSaveData(); - DestroyTask(taskId); - SetMainCallback2(CB2_SoftReset); -} - -static void CB2_ClearSaveDataScreen(void) -{ - RunTasks(); - UpdatePaletteFade(); -} - -static void VBlankCB_InitClearSaveDataScreen(void) -{ - TransferPlttBuffer(); -} - -static u8 InitClearSaveDataScreen(void) -{ - u16 i; - u16 ime; - - switch (gMain.state) - { - case 0: - default: - SetVBlankCallback(NULL); - - REG_DISPCNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0; - REG_WINOUT = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - - DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *)OAM, OAM_SIZE); - DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); - - ResetPaletteFade(); - - gPlttBufferUnfaded[0] = 0x7fff; - gPlttBufferFaded[0] = 0x7fff; - gPlttBufferUnfaded[1] = 0x3945; - gPlttBufferFaded[1] = 0x3945; - - for (i = 0; i < 0x10; i++) - ((u16 *)(VRAM + 0x20))[i] = 0x1111; - - for (i = 0; i < 0x500; i++) - ((u16 *)(VRAM + 0x3800))[i] = 0x0001; - - ResetTasks(); - ResetSpriteData(); - - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xffff); - - ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - - SetVBlankCallback(VBlankCB_InitClearSaveDataScreen); - - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON | DISPCNT_BG3_ON; - gMain.state = 1; - return 0; - case 1: - UpdatePaletteFade(); - if (gPaletteFade.active) - return 0; - SetMainCallback2(CB2_ClearSaveDataScreen); - return 1; - } -} - -static void CB2_SoftReset(void) -{ - switch (gMain.state) - { - case 0: - default: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xffff); - gMain.state = 1; - break; - case 1: - UpdatePaletteFade(); - if (gPaletteFade.active) - return; - DoSoftReset(); - break; - } -} diff --git a/src/clock.c b/src/clock.c deleted file mode 100644 index 1f2aac9fd..000000000 --- a/src/clock.c +++ /dev/null @@ -1,90 +0,0 @@ -#include "global.h" -#include "clock.h" -#include "berry.h" -#include "dewford_trend.h" -#include "event_data.h" -#include "field_specials.h" -#include "field_weather.h" -#include "lottery_corner.h" -#include "main.h" -#include "rom4.h" -#include "rtc.h" -#include "time_events.h" -#include "tv.h" -#include "wallclock.h" - -static void InitTimeBasedEvents(void); -static void UpdatePerDay(struct Time *time); -static void UpdatePerMinute(struct Time *time); -static void ReturnFromStartWallClock(void); - -static void InitTimeBasedEvents(void) -{ - FlagSet(SYS_CLOCK_SET); - RtcCalcLocalTime(); - gSaveBlock2.lastBerryTreeUpdate = gLocalTime; - VarSet(VAR_DAYS, gLocalTime.days); -} - -void DoTimeBasedEvents(void) -{ - if (FlagGet(SYS_CLOCK_SET)) - { - RtcCalcLocalTime(); - UpdatePerDay(&gLocalTime); - UpdatePerMinute(&gLocalTime); - } -} - -static void UpdatePerDay(struct Time *time) -{ - u16 *varPtr = GetVarPointer(VAR_DAYS); - int days = *varPtr; - u16 newDays; - - if (days != time->days && days <= time->days) - { - newDays = time->days - days; - ClearUpperFlags(); - UpdateDewfordTrendPerDay(newDays); - UpdateTVShowsPerDay(newDays); - UpdateWeatherPerDay(newDays); - UpdatePartyPokerusTime(newDays); - UpdateMirageRnd(newDays); - UpdateBirchState(newDays); - SetShoalItemFlag(newDays); - SetRandomLotteryNumber(newDays); - *varPtr = time->days; - } -} - -static void UpdatePerMinute(struct Time *time) -{ - struct Time newTime; - s32 minutes; - - CalcTimeDifference(&newTime, &gSaveBlock2.lastBerryTreeUpdate, time); - minutes = 1440 * newTime.days + 60 * newTime.hours + newTime.minutes; - - // there's no way to get the correct assembly other than with this nested if check. so dumb. - if (minutes != 0) - { - if (minutes >= 0) - { - BerryTreeTimeUpdate(minutes); - gSaveBlock2.lastBerryTreeUpdate = *time; - } - } -} - -static void ReturnFromStartWallClock(void) -{ - InitTimeBasedEvents(); - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -void StartWallClock(void) -{ - SetMainCallback2(CB2_StartWallClock); - gMain.savedCallback = ReturnFromStartWallClock; -} diff --git a/src/coins.c b/src/coins.c deleted file mode 100644 index 3c6356612..000000000 --- a/src/coins.c +++ /dev/null @@ -1,84 +0,0 @@ -#include "global.h" -#include "coins.h" -#include "menu.h" -#include "string_util.h" -#include "strings.h" - -#define MAX_COINS 9999 - -void UpdateCoinsWindow(s32 a, u8 b, u8 c) -{ - PrintCoins(a, 4, b + 2, c + 1); -} - -void ShowCoinsWindow(u32 a, u8 b, u8 c) -{ - MenuDrawTextWindow(b, c, b + 9, c + 3); - UpdateCoinsWindow(a, b, c); -} - -void HideCoinsWindow(u8 a, u8 b) -{ - MenuZeroFillWindowRect(a, b, a + 9, b + 3); -} - -void PrintCoins(s32 a, u8 b, u8 c, u8 d) -{ - u8 string[16]; - u8 *ptr; - u8 r1; - u8 foo; - - ConvertIntToDecimalString(string, a); - r1 = (b * 6 + 0x21 - 8 * (b + 2)); - c = c - r1 / 8; - foo = r1 % 8; - ptr = gStringVar1; - if (foo) - { - ptr[0] = 0xFC; - ptr[1] = 0x11; - ptr[2] = 8 - (foo); - ptr += 3; - } - ptr[0] = 0xFC; - ptr[1] = 0x11; - ptr[2] = (b - StringLength(string)) * 6; - ptr += 3; - StringCopy(ptr, string); - MenuPrint(gOtherText_Coins2, c, d); -} - -u16 GetCoins(void) -{ - return gSaveBlock1.coins; -} - -bool8 GiveCoins(u16 coins) -{ - u32 newCoins; - - if (GetCoins() >= MAX_COINS) - return FALSE; - newCoins = coins + gSaveBlock1.coins; - if (gSaveBlock1.coins > (u16)newCoins) - gSaveBlock1.coins = MAX_COINS; - else - { - gSaveBlock1.coins = newCoins; - if ((u16)newCoins > MAX_COINS) - gSaveBlock1.coins = MAX_COINS; - } - return TRUE; -} - -bool8 TakeCoins(u16 coins) -{ - if (GetCoins() >= coins) - { - gSaveBlock1.coins -= coins; - return TRUE; - } - else - return FALSE; -} diff --git a/src/contest_link_80C857C.c b/src/contest_link_80C857C.c deleted file mode 100644 index 0ae98af09..000000000 --- a/src/contest_link_80C857C.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "global.h" -#include "link.h" - -#if GERMAN - -void de_sub_80C9274(bool32 arg0) { - if (deUnkValue2 != 1) - { - return; - } - - if (arg0) - { - deUnkValue2 = 3; - } - else - { - deUnkValue2 = 2; - } -} - -void de_sub_80C9294(bool32 arg0) { - if (deUnkValue2 == 1) - { - if (arg0) - { - deUnkValue2 = 3; - } - else - { - deUnkValue2 = 2; - } - - return; - } - - - if (deUnkValue2 == 2) - { - SendBlock(0, sBlockRequestLookupTable[deUnkValue1].address, sBlockRequestLookupTable[deUnkValue1].size); - - if (arg0) - { - deUnkValue2 = 0; - } - else - { - deUnkValue2 = 1; - } - - return; - } -} - -#endif diff --git a/src/contest_painting.c b/src/contest_painting.c deleted file mode 100644 index 391cbdfaa..000000000 --- a/src/contest_painting.c +++ /dev/null @@ -1,805 +0,0 @@ -#include "global.h" -#include "contest_painting.h" -#include "cute_sketch.h" -#include "data2.h" -#include "decompress.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "rng.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "text.h" -#include "unknown_task.h" - -extern u8 unk_2000000[]; - -static u8 gUnknown_03000750; -static u16 gUnknown_03000752; -static u16 gUnknown_03000754; -static u8 gUnknown_03000756; - -u16 (*gUnknown_03005E10)[][32]; -struct Unk03005E20 gUnknown_03005E20; -u8 gUnknown_03005E40[0x4C]; -struct ContestEntry *gUnknown_03005E8C; -u16 (*gUnknown_03005E90)[]; - -extern struct ContestEntry unk_2015de0; -extern struct Unk2015E00 unk_2015e00; - -static const u16 gPictureFramePalettes[][16] = -{ - INCBIN_U16("graphics/picture_frame/bg0.gbapal"), - INCBIN_U16("graphics/picture_frame/bg1.gbapal"), - INCBIN_U16("graphics/picture_frame/bg2.gbapal"), - INCBIN_U16("graphics/picture_frame/bg3.gbapal"), - INCBIN_U16("graphics/picture_frame/bg4.gbapal"), - INCBIN_U16("graphics/picture_frame/bg5.gbapal"), - {0}, - {0}, -}; -const u8 emptySpace[8 * 32] = {0}; -const u8 gPictureFrameTiles_0[] = INCBIN_U8("graphics/picture_frame/frame0.4bpp.rl"); -const u8 gPictureFrameTiles_1[] = INCBIN_U8("graphics/picture_frame/frame1.4bpp.rl"); -const u8 gPictureFrameTiles_2[] = INCBIN_U8("graphics/picture_frame/frame2.4bpp.rl"); -const u8 gPictureFrameTiles_3[] = INCBIN_U8("graphics/picture_frame/frame3.4bpp.rl"); -const u8 gPictureFrameTiles_4[] = INCBIN_U8("graphics/picture_frame/frame4.4bpp.rl"); -const u8 gPictureFrameTiles_5[] = INCBIN_U8("graphics/picture_frame/frame5.4bpp.rl"); -const u8 gPictureFrameTilemap_0[] = INCBIN_U8("graphics/picture_frame/frame0_map.bin.rl"); -const u8 gPictureFrameTilemap_1[] = INCBIN_U8("graphics/picture_frame/frame1_map.bin.rl"); -const u8 gPictureFrameTilemap_2[] = INCBIN_U8("graphics/picture_frame/frame2_map.bin.rl"); -const u8 gPictureFrameTilemap_3[] = INCBIN_U8("graphics/picture_frame/frame3_map.bin.rl"); -const u8 gPictureFrameTilemap_4[] = INCBIN_U8("graphics/picture_frame/frame4_map.bin.rl"); -const u8 gPictureFrameTilemap_5[] = INCBIN_U8("graphics/picture_frame/frame5_map.bin.rl"); -const u8 *const gUnknown_083F60AC[] = -{ - OtherText_Cool, - OtherText_Beauty2, - OtherText_Cute, - OtherText_Smart, - OtherText_Tough, -}; -const struct LabelPair gUnknown_083F60C0[] = -{ - {OtherText_NonstopSuperCool, OtherText_Terminator6}, - {OtherText_GoodLookingPoke, OtherText_Terminator7}, - {OtherText_MarvelousGreat, OtherText_Terminator8}, - {OtherText_CenturyLastVenus, OtherText_Terminator9}, - {OtherText_Terminator10, OtherText_DazzlingSmile}, - {OtherText_PokeCenterIdol, OtherText_Terminator11}, - {OtherText_LovelyAndSweet, OtherText_Terminator12}, - {OtherText_ThePretty, OtherText_WinningPortrait}, - {OtherText_GiveUsWink, OtherText_Terminator13}, - {OtherText_SmartnessMaestro, OtherText_Terminator15}, - {OtherText_ChosenPokeAmong, OtherText_Terminator15}, - {OtherText_TheExcellent, OtherText_ItsMomentOfElegance}, - {OtherText_PowerfullyMuscular, OtherText_Terminator16}, - {OtherText_StrongErEst, OtherText_Terminator17}, - {OtherText_MightyTough, OtherText_Exclamation}, -}; -const struct OamData gOamData_83F6138 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 1, - .bpp = 1, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -const u16 gUnknown_083F6140[] = {0, 0}; - -static void ShowContestPainting(); -static void CB2_HoldContestPainting(void); -static void HoldContestPainting(void); -static void ContestPaintingInitWindow(u8 arg0); -static void ContestPaintingPrintCaption(u8 arg0, u8 arg1); -static void ContestPaintingInitBG(void); -static void ContestPaintingInitVars(u8 arg0); -static void VBlankCB_ContestPainting(void); -void sub_8106B90(); //should be static -static void sub_8107090(u8 arg0, u8 arg1); - -__attribute__((naked)) -void sub_8106630(u32 arg0) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - ldr r2, _0810665C @ =0x02015de0\n\ - subs r4, r2, 0x2\n\ - subs r5, r2, 0x1\n\ - ldr r3, _08106660 @ =gSaveBlock1\n\ - subs r0, 0x1\n\ - lsls r1, r0, 5\n\ - adds r1, r3\n\ - ldr r3, _08106664 @ =0x00002dfc\n\ - adds r1, r3\n\ - ldm r1!, {r3,r6,r7}\n\ - stm r2!, {r3,r6,r7}\n\ - ldm r1!, {r3,r6,r7}\n\ - stm r2!, {r3,r6,r7}\n\ - ldm r1!, {r6,r7}\n\ - stm r2!, {r6,r7}\n\ - strb r0, [r4]\n\ - movs r0, 0\n\ - strb r0, [r5]\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0810665C: .4byte 0x02015de0\n\ -_08106660: .4byte gSaveBlock1\n\ -_08106664: .4byte 0x00002dfc\n\ - .syntax divided\n"); -} - -void CB2_ContestPainting(void) -{ - ShowContestPainting(); -} - -static void ShowContestPainting(void) -{ - switch (gMain.state) - { - case 0: - remove_some_task(); - SetVBlankCallback(NULL); - gUnknown_03005E8C = &unk_2015de0; - ContestPaintingInitVars(TRUE); - ContestPaintingInitBG(); - gMain.state++; - break; - case 1: - { - u8 *addr; - size_t size; - - ResetPaletteFade(); - addr = (void *)VRAM; - size = 0x18000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - ResetSpriteData(); - gMain.state++; - break; - } - case 2: - SeedRng(gMain.vblankCounter1); - InitKeys(); - ContestPaintingInitWindow(unk_2000000[0x15DDF]); - gMain.state++; - break; - case 3: - sub_8107090(unk_2000000[0x15DDE], unk_2000000[0x15DDF]); - gMain.state++; - break; - case 4: - ContestPaintingPrintCaption(unk_2000000[0x15DDE], unk_2000000[0x15DDF]); - LoadPalette(gUnknown_083F6140, 0, 1 * 2); - DmaClear32(3, PLTT, 0x400); - BeginFastPaletteFade(2); - SetVBlankCallback(VBlankCB_ContestPainting); - gUnknown_03000750 = 0; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; - SetMainCallback2(CB2_HoldContestPainting); - break; - } -} - -static void CB2_HoldContestPainting(void) -{ - HoldContestPainting(); - UpdatePaletteFade(); -} - -static void CB2_QuitContestPainting(void) -{ - SetMainCallback2(gMain.savedCallback); -} - -static void HoldContestPainting(void) -{ - switch (gUnknown_03000750) - { - case 0: - if (!gPaletteFade.active) - gUnknown_03000750 = 1; - if (gUnknown_03000756 != 0 && gUnknown_03000754 != 0) - gUnknown_03000754--; - break; - case 1: - if ((gMain.newKeys & 1) || (gMain.newKeys & 2)) - { - u8 two = 2; //needed to make the asm match - - gUnknown_03000750 = two; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - } - if (gUnknown_03000756 != 0) - gUnknown_03000754 = 0; - break; - case 2: - if (!gPaletteFade.active) - SetMainCallback2(CB2_QuitContestPainting); - if (gUnknown_03000756 != 0 && gUnknown_03000754 <= 0x1D) - gUnknown_03000754++; - break; - } -} - -static void ContestPaintingInitWindow(u8 arg0) -{ - InitMenuWindow(&gWindowConfig_81E7160); - SetUpWindowConfig(&gWindowConfig_81E7160); -} - -static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) -{ - u8 xPos, yPos; - u8 *ptr; - u8 type; - - if (arg1 == TRUE) - return; - ptr = gUnknown_03005E40; - type = gUnknown_03005E8C->contestType; - if (contestType < 8) - { - ptr = StringCopy(ptr, gUnknown_083F60AC[type]); - ptr = StringCopy(ptr, gContestText_ContestWinner); -#if ENGLISH - ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name); -#elif GERMAN - ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); -#endif - - // {LATIN} - ptr[0] = 0xFC; - ptr[1] = 0x16; - ptr += 2; - - ptr = StringCopy(ptr, gOtherText_Unknown1); -#if ENGLISH - ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); -#elif GERMAN - ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name); -#endif - - xPos = 6; - yPos = 14; - } - else - { - ptr = StringCopy(ptr, gUnknown_083F60C0[type].prefix); - ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); - ptr = StringCopy(ptr, gUnknown_083F60C0[type].suffix); - - xPos = 3; - yPos = 14; - } - MenuPrint_PixelCoords(gUnknown_03005E40, xPos * 8 + 1, yPos * 8, 1); -} - -static void ContestPaintingInitBG(void) -{ - REG_DISPCNT = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_BG0CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(12) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; -} - -static void ContestPaintingInitVars(bool8 arg0) -{ - if (arg0 == FALSE) - { - gUnknown_03000756 = FALSE; - gUnknown_03000752 = 0; - gUnknown_03000754 = 0; - } - else - { - gUnknown_03000756 = TRUE; - gUnknown_03000752 = 15; - gUnknown_03000754 = 30; - } -} - -static void ContestPaintingMosaic(void) -{ - if (gUnknown_03000756 == FALSE) - { - REG_MOSAIC = 0; - return; - } - - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256; - gUnknown_03000752 = gUnknown_03000754 / 2; - - REG_MOSAIC = (gUnknown_03000752 << 12) | (gUnknown_03000752 << 8) | (gUnknown_03000752 << 4) | (gUnknown_03000752 << 0); -} - -static void VBlankCB_ContestPainting(void) -{ - ContestPaintingMosaic(); - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -#ifdef NONMATCHING -static void sub_8106AC4(u16 species, u8 arg1) -{ - void *pal; - - // Unsure what gUnknown_03005E8C->var0 is supposed to be. - pal = species_and_otid_get_pal(species, gUnknown_03005E8C->var4, gUnknown_03005E8C->var0); - LZDecompressVram(pal, gUnknown_03005E90); - - if (arg1 == 1) - { - HandleLoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].x, - gMonFrontPicCoords[species].y, - 0x2000000, - gUnknown_081FAF4C[1], - species, - (u32)gUnknown_03005E8C->var0 - ); - sub_8106B90(gUnknown_081FAF4C[1], gUnknown_03005E90, gUnknown_03005E10); - } - else - { - HandleLoadSpecialPokePic( - &gMonBackPicTable[species], - gMonBackPicCoords[species].x, - gMonBackPicCoords[species].y, - 0x2000000, - gUnknown_081FAF4C[0], - species, - (u32)gUnknown_03005E8C->var0 - ); - sub_8106B90(gUnknown_081FAF4C[0], gUnknown_03005E90, gUnknown_03005E10); - } -} -#else -__attribute__((naked)) -static void sub_8106AC4(u16 arg0, u8 arg2) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - sub sp, 0xC\n\ - adds r4, r1, 0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - ldr r7, _08106B28 @ =gUnknown_03005E8C\n\ - ldr r0, [r7]\n\ - ldr r1, [r0, 0x4]\n\ - ldr r2, [r0]\n\ - adds r0, r6, 0\n\ - bl species_and_otid_get_pal\n\ - ldr r1, _08106B2C @ =gUnknown_03005E90\n\ - mov r8, r1\n\ - ldr r1, [r1]\n\ - bl LZDecompressVram\n\ - cmp r4, 0\n\ - bne _08106B40\n\ - lsls r0, r6, 3\n\ - ldr r1, _08106B30 @ =gMonFrontPicTable\n\ - adds r0, r1\n\ - ldr r1, _08106B34 @ =gMonFrontPicCoords\n\ - lsls r2, r6, 2\n\ - adds r2, r1\n\ - ldrb r1, [r2]\n\ - ldrb r2, [r2, 0x1]\n\ - movs r3, 0x80\n\ - lsls r3, 18\n\ - ldr r4, _08106B38 @ =gUnknown_081FAF4C\n\ - ldr r5, [r4, 0x4]\n\ - str r5, [sp]\n\ - str r6, [sp, 0x4]\n\ - ldr r4, [r7]\n\ - ldr r4, [r4]\n\ - str r4, [sp, 0x8]\n\ - bl HandleLoadSpecialPokePic\n\ - mov r2, r8\n\ - ldr r1, [r2]\n\ - ldr r0, _08106B3C @ =gUnknown_03005E10\n\ - ldr r2, [r0]\n\ - adds r0, r5, 0\n\ - bl sub_8106B90\n\ - b _08106B74\n\ - .align 2, 0\n\ -_08106B28: .4byte gUnknown_03005E8C\n\ -_08106B2C: .4byte gUnknown_03005E90\n\ -_08106B30: .4byte gMonFrontPicTable\n\ -_08106B34: .4byte gMonFrontPicCoords\n\ -_08106B38: .4byte gUnknown_081FAF4C\n\ -_08106B3C: .4byte gUnknown_03005E10\n\ -_08106B40:\n\ - lsls r0, r6, 3\n\ - ldr r1, _08106B80 @ =gMonBackPicTable\n\ - adds r0, r1\n\ - ldr r1, _08106B84 @ =gMonBackPicCoords\n\ - lsls r2, r6, 2\n\ - adds r2, r1\n\ - ldrb r1, [r2]\n\ - ldrb r2, [r2, 0x1]\n\ - movs r3, 0x80\n\ - lsls r3, 18\n\ - ldr r4, _08106B88 @ =gUnknown_081FAF4C\n\ - ldr r5, [r4]\n\ - str r5, [sp]\n\ - str r6, [sp, 0x4]\n\ - ldr r4, [r7]\n\ - ldr r4, [r4]\n\ - str r4, [sp, 0x8]\n\ - bl HandleLoadSpecialPokePic\n\ - mov r0, r8\n\ - ldr r1, [r0]\n\ - ldr r0, _08106B8C @ =gUnknown_03005E10\n\ - ldr r2, [r0]\n\ - adds r0, r5, 0\n\ - bl sub_8106B90\n\ -_08106B74:\n\ - add sp, 0xC\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08106B80: .4byte gMonBackPicTable\n\ -_08106B84: .4byte gMonBackPicCoords\n\ -_08106B88: .4byte gUnknown_081FAF4C\n\ -_08106B8C: .4byte gUnknown_03005E10\n\ - .syntax divided\n"); -} -#endif - -#ifdef NONMATCHING -void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8]) -{ - u16 i; - u16 j; - u16 k; - u16 l; - - for (i = 0; i < 8; i++) - { - for (j = 0; j < 8; j++) - { - for (k = 0; k < 8; k++) - { - for (l = 0; l < 8; l++) - { - //u8 *arr = a[i][j][k]; - //u8 r1 = arr[l / 2]; - u8 r1 = a[i][j][k][l / 2]; - - if (l & 1) - r1 /= 16; - else - r1 %= 16; - //_08106BEA - if (r1 == 0) - c[i][k][j][l] = 0x8000; - else - c[i][k][j][l] = b[r1]; - } - } - } - } -} -#else -__attribute__((naked)) -void sub_8106B90() -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0xC\n\ - mov r10, r0\n\ - mov r9, r1\n\ - str r2, [sp]\n\ - movs r0, 0\n\ -_08106BA4:\n\ - movs r3, 0\n\ - adds r1, r0, 0x1\n\ - str r1, [sp, 0x4]\n\ - lsls r0, 3\n\ - str r0, [sp, 0x8]\n\ -_08106BAE:\n\ - movs r1, 0\n\ - adds r2, r3, 0x1\n\ - mov r8, r2\n\ - ldr r7, [sp, 0x8]\n\ - adds r0, r7, r3\n\ - lsls r0, 5\n\ - mov r12, r0\n\ - lsls r4, r3, 3\n\ -_08106BBE:\n\ - movs r3, 0\n\ - lsls r0, r1, 2\n\ - adds r6, r1, 0x1\n\ - mov r2, r12\n\ - adds r5, r2, r0\n\ - ldr r7, [sp, 0x8]\n\ - adds r0, r7, r1\n\ - lsls r0, 7\n\ - ldr r1, [sp]\n\ - adds r2, r0, r1\n\ -_08106BD2:\n\ - lsrs r0, r3, 1\n\ - adds r0, r5, r0\n\ - add r0, r10\n\ - ldrb r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08106BE6\n\ - lsrs r1, 4\n\ - b _08106BEA\n\ -_08106BE6:\n\ - movs r0, 0xF\n\ - ands r1, r0\n\ -_08106BEA:\n\ - cmp r1, 0\n\ - bne _08106BFC\n\ - adds r0, r4, r3\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - movs r7, 0x80\n\ - lsls r7, 8\n\ - adds r1, r7, 0\n\ - b _08106C08\n\ -_08106BFC:\n\ - adds r0, r4, r3\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - lsls r1, 1\n\ - add r1, r9\n\ - ldrh r1, [r1]\n\ -_08106C08:\n\ - strh r1, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x7\n\ - bls _08106BD2\n\ - lsls r0, r6, 16\n\ - lsrs r1, r0, 16\n\ - cmp r1, 0x7\n\ - bls _08106BBE\n\ - mov r1, r8\n\ - lsls r0, r1, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x7\n\ - bls _08106BAE\n\ - ldr r2, [sp, 0x4]\n\ - lsls r0, r2, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x7\n\ - bls _08106BA4\n\ - add sp, 0xC\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif - -static void sub_8106C40(u8 arg0, u8 arg1) -{ - u8 x, y; - - LoadPalette(gPictureFramePalettes, 0, sizeof(gPictureFramePalettes)); - if (arg1 == 1) - { - switch (gUnknown_03005E8C->contestType / 3) - { - case CONTEST_COOL: - RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_0, gUnknown_03005E10); - break; - case CONTEST_BEAUTY: - RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_1, gUnknown_03005E10); - break; - case CONTEST_CUTE: - RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_2, gUnknown_03005E10); - break; - case CONTEST_SMART: - RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_3, gUnknown_03005E10); - break; - case CONTEST_TOUGH: - RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_4, gUnknown_03005E10); - break; - } - -#define VRAM_PICTURE_DATA(x, y) (((u16 *)(VRAM + 0x6000))[(y) * 32 + (x)]) - - // Set the background - for (y = 0; y < 20; y++) - { - for (x = 0; x < 32; x++) - VRAM_PICTURE_DATA(x, y) = 0x1015; - } - - // Copy the image frame - for (y = 0; y < 10; y++) - { - for (x = 0; x < 18; x++) - VRAM_PICTURE_DATA(x + 6, y + 2) = (*gUnknown_03005E10)[y + 2][x + 6]; - } - - // Re-set the entire top row to the first top frame part - for (x = 0; x < 16; x++) - VRAM_PICTURE_DATA(x + 7, 2) = (*gUnknown_03005E10)[2][7]; - -#undef VRAM_PICTURE_DATA - } - else if (arg0 < 8) - { - RLUnCompVram(gPictureFrameTiles_5, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_5, (void *)(VRAM + 0x6000)); - } - else - { - switch (gUnknown_03005E8C->contestType / 3) - { - case CONTEST_COOL: - RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_0, (void *)(VRAM + 0x6000)); - break; - case CONTEST_BEAUTY: - RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_1, (void *)(VRAM + 0x6000)); - break; - case CONTEST_CUTE: - RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_2, (void *)(VRAM + 0x6000)); - break; - case CONTEST_SMART: - RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_3, (void *)(VRAM + 0x6000)); - break; - case CONTEST_TOUGH: - RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_4, (void *)(VRAM + 0x6000)); - break; - } - } -} - -static void sub_8106E98(u8 arg0) -{ - //Some hacks just to get the asm to match -#ifndef NONMATCHING - asm(""::"r"(arg0)); -#endif - - gMain.oamBuffer[0] = gOamData_83F6138; - gMain.oamBuffer[0].tileNum = 0; - -#ifndef NONMATCHING - if (arg0) arg0 = gMain.oamBuffer[0].tileNum; -#endif - - gMain.oamBuffer[0].x = 88; - gMain.oamBuffer[0].y = 24; -} - -static u8 sub_8106EE0(u8 arg0) -{ - u8 contestType; - - if (arg0 < 8) - contestType = gUnknown_03005E8C->contestType; - else - contestType = gUnknown_03005E8C->contestType / 3; - - switch (contestType) - { - case CONTEST_COOL: - return CONTESTRESULT_COOL; - case CONTEST_BEAUTY: - return CONTESTRESULT_BEAUTY; - case CONTEST_CUTE: - return CONTESTRESULT_CUTE; - case CONTEST_SMART: - return CONTESTRESULT_SMART; - case CONTEST_TOUGH: - return CONTESTRESULT_TOUGH; - } - - return contestType; -} - -static void sub_8106F4C(void) -{ - gUnknown_03005E90 = &unk_2015e00.unk2017e00; - gUnknown_03005E10 = &unk_2015e00.unk2015e00; -} - -static void sub_8106F6C(u8 arg0) -{ - gUnknown_03005E20.var_4 = gUnknown_03005E10; - gUnknown_03005E20.var_8 = gUnknown_03005E90; - gUnknown_03005E20.var_18 = 0; - gUnknown_03005E20.var_1F = gUnknown_03005E8C->var0; - gUnknown_03005E20.var_19 = 0; - gUnknown_03005E20.var_1A = 0; - gUnknown_03005E20.var_1B = 64; - gUnknown_03005E20.var_1C = 64; - gUnknown_03005E20.var_1D = 64; - gUnknown_03005E20.var_1E = 64; - - switch (arg0) - { - case CONTESTRESULT_SMART: - case CONTESTRESULT_TOUGH: - gUnknown_03005E20.var_14 = 3; - break; - case CONTESTRESULT_COOL: - case CONTESTRESULT_BEAUTY: - case CONTESTRESULT_CUTE: - default: - gUnknown_03005E20.var_14 = 1; - break; - } - - gUnknown_03005E20.var_16 = 2; - gUnknown_03005E20.var_0 = arg0; - gUnknown_03005E20.var_10 = 0x6010000; - - sub_80FC7A0(&gUnknown_03005E20); - sub_80FDA18(&gUnknown_03005E20); - sub_80FD8CC(&gUnknown_03005E20); - - LoadPalette(gUnknown_03005E90, 256, 256 * 2); -} - -static void sub_8107090(u8 arg0, u8 arg1) -{ - sub_8106F4C(); - sub_8106AC4(gUnknown_03005E8C->var8, 0); - sub_8106F6C(sub_8106EE0(arg0)); - sub_8106E98(arg0); - sub_8106C40(arg0, arg1); -} diff --git a/src/coord_event_weather.c b/src/coord_event_weather.c deleted file mode 100644 index 9c5a1ca4d..000000000 --- a/src/coord_event_weather.c +++ /dev/null @@ -1,118 +0,0 @@ -#include "global.h" -#include "coord_event_weather.h" -#include "field_weather.h" - -struct CoordEventWeather -{ - u8 weather; - void (*func)(void); -}; - -static void CoordEventWeather_Indoor(void); -static void CoordEventWeather_Sunny(void); -static void CoordEventWeather_Rain(void); -static void CoordEventWeather_Snowflakes(void); -static void CoordEventWeather_Thunderstorm(void); -static void CoordEventWeather_Fog(void); -static void CoordEventWeather_DiagonalFog(void); -static void CoordEventWeather_Snow(void); -static void CoordEventWeather_Sandstorm(void); -static void CoordEventWeather_Cloudy(void); -static void CoordEventWeather_Drought(void); -static void CoordEventWeather_UnderwaterFog(void); -static void CoordEventWeather_UnderwaterBubbles(void); - -static const struct CoordEventWeather sCoordEventWeatherFuncs[] = -{ - { 0x1, CoordEventWeather_Indoor }, - { 0x2, CoordEventWeather_Sunny }, - { 0x3, CoordEventWeather_Rain }, - { 0x4, CoordEventWeather_Snowflakes }, - { 0x5, CoordEventWeather_Thunderstorm }, - { 0x6, CoordEventWeather_Fog }, - { 0x7, CoordEventWeather_DiagonalFog }, - { 0x8, CoordEventWeather_Snow }, - { 0x9, CoordEventWeather_Sandstorm }, - { 0xa, CoordEventWeather_Cloudy }, - { 0xb, CoordEventWeather_Drought }, - { 0x14, CoordEventWeather_UnderwaterFog }, - { 0x15, CoordEventWeather_UnderwaterBubbles }, -}; - -static void CoordEventWeather_Indoor(void) -{ - SetWeather(1); -} - -static void CoordEventWeather_Sunny(void) -{ - SetWeather(2); -} - -static void CoordEventWeather_Rain(void) -{ - SetWeather(3); -} - -static void CoordEventWeather_Snowflakes(void) -{ - SetWeather(4); -} - -static void CoordEventWeather_Thunderstorm(void) -{ - SetWeather(5); -} - -static void CoordEventWeather_Fog(void) -{ - SetWeather(6); -} - -static void CoordEventWeather_DiagonalFog(void) -{ - SetWeather(9); -} - -static void CoordEventWeather_Snow(void) -{ - SetWeather(7); -} - -static void CoordEventWeather_Sandstorm(void) -{ - SetWeather(8); -} - -static void CoordEventWeather_Cloudy(void) -{ - SetWeather(11); -} - -static void CoordEventWeather_Drought(void) -{ - SetWeather(12); -} - -static void CoordEventWeather_UnderwaterFog(void) -{ - SetWeather(20); -} - -static void CoordEventWeather_UnderwaterBubbles(void) -{ - SetWeather(21); -} - -void DoCoordEventWeather(u8 n) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(sCoordEventWeatherFuncs); i++) - { - if (sCoordEventWeatherFuncs[i].weather == n) - { - sCoordEventWeatherFuncs[i].func(); - return; - } - } -} diff --git a/src/credits.c b/src/credits.c deleted file mode 100644 index df70674b6..000000000 --- a/src/credits.c +++ /dev/null @@ -1,1496 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "decompress.h" -#include "event_data.h" -#include "hall_of_fame.h" -#include "intro_credits_graphics.h" -#include "m4a.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "pokedex.h" -#include "rng.h" -#include "songs.h" -#include "sound.h" -#include "species.h" -#include "starter_choose.h" -#include "task.h" -#include "trig.h" - -asm(".set REG_BASE, 0x4000000"); -asm(".set OFFSET_REG_BLDCNT, 0x50"); -asm(".set OFFSET_REG_BLDALPHA, 0x52"); -asm(".set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT"); -asm(".set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA"); - -enum -{ - PAGE_TITLE, - PAGE_DIRECTOR, - PAGE_ART_DIRECTOR, - PAGE_BATTLE_DIRECTOR, - PAGE_MAIN_PROGRAMMER, - PAGE_BATTLE_SYSTEM_PROGRAMMER, - PAGE_PROGRAMMERS_1, - PAGE_PROGRAMMERS_2, - PAGE_PROGRAMMERS_3, - PAGE_MAIN_GRAHPICS_DESIGNER, - PAGE_POKEMON_GRAHPIC_DESIGNERS_1, - PAGE_POKEMON_GRAHPIC_DESIGNERS_2, - PAGE_POKEMON_GRAHPIC_DESIGNERS_3, - PAGE_POKEMON_DESIGNERS_1, - PAGE_POKEMON_DESIGNERS_2, - PAGE_MUSIC_COMPOSITION, - PAGE_SOUND_EFFECTS, - PAGE_GAME_DESIGNERS_1, - PAGE_GAME_DESIGNERS_2, - PAGE_GAME_DESIGNERS_3, - PAGE_PLOT_SCENARIO, - PAGE_GAME_SCENARIO, - PAGE_SCRIPT_DESIGNERS, - PAGE_MAP_DESIGNERS, - PAGE_MAP_DATA_DESIGNERS, - PAGE_PARAMETRIC_DESIGNERS, - PAGE_POKEDEX_TEXT, - PAGE_ENVIRONMENT_TOOLS, - PAGE_PRODUCT_TESTING, - PAGE_SPECIAL_THANKS, - PAGE_SPECIAL_THANKS_1, - PAGE_SPECIAL_THANKS_2, - PAGE_SPECIAL_THANKS_3, - PAGE_INFORMATION_SUPERVISORS, - PAGE_COORDINATORS, - PAGE_TASK_MANAGERS, - PAGE_PRODUCERS, - PAGE_EXECUTIVE_DIRECTOR, - PAGE_EXECUTIVE_PRODUCERS_1, - PAGE_EXECUTIVE_PRODUCERS_2, - PAGE_TRANSLATION_COORDINATOR, - PAGE_TRANSLATORS, - PAGE_PROGRAMMERS, - PAGE_GRAPHIC_DESIGNERS, - PAGE_PRODUCT_SUPPORT, - -#if ENGLISH - PAGE_ARTWORK, - PAGE_TEXT_EDITOR, - PAGE_NOA_TESTING, - PAGE_BRAILLE_CODE_CHECK_1, - PAGE_BRAILLE_CODE_CHECK_2, -#elif GERMAN - PAGE_NOE_TESTING, - PAGE_BRAILLE_CODE_CHECK_1, -#endif - - PAGE_SPECIAL_THANKS_4, - PAGE_SPECIAL_THANKS_5, - - PAGE_COUNT -}; - -#if ENGLISH -#define POKEMON_TILE_COUNT 68 -#define LAST_PAGE (PAGE_TEXT_EDITOR) -#define UNK_DEFINE_45 (0x45) -#define UNK_DEFINE_82 (0x82) -#define UNK_DEF_1F3 (499) -#elif GERMAN -#define POKEMON_TILE_COUNT 65 -#define LAST_PAGE (PAGE_NOE_TESTING) -#define UNK_DEFINE_45 (8) -#define UNK_DEFINE_82 (0x8D) -#define UNK_DEF_1F3 (554) -#endif - -#define COLOR_DARK_GREEN 0x1967 -#define COLOR_LIGHT_GREEN 0x328D - -enum -{ - TDA_0 = 0, - TDA_TASK_C_ID = 1, - TDA_TASK_E_ID = 2, - TDA_TASK_D_ID = 3, - TDA_4 = 4, - TDA_PLAYER_CYCLIST = 5, - TDA_RIVAL_CYCLIST = 6, - TDA_7 = 7, // Has something to do with the bike scene - TDA_11 = 11, // Gets set depending on whether the bike or the grass scene should be shown - TDA_12 = 12, - TDA_13 = 13, - TDA_14 = 14, - TDA_TASK_B_ID = 15, - - // Appears to be responsible for text - TDB_0 = 0, - TDB_TASK_A_ID = 1, - TDB_CURRENT_PAGE = 2, - TDB_3 = 3, - - TDC_0 = 0, - TDC_1 = 1, - TDC_2 = 2, - TDC_3 = 3, - TDC_4 = 4, - TDC_5 = 5, - - TDD_STATE = 0, - TDD_TASK_A_ID = 1, - TDD_2 = 2, - TDD_3 = 3, - - TDE_0 = 0, - TDE_1 = 1, - TDE_TASK_A_ID = 2, -}; - - -struct Unk201C000 -{ - u16 unk0[POKEMON_TILE_COUNT]; - u16 unk88; - u16 unk8A; - u16 unk8C; - u16 unk8E; - u16 unk90[386]; - u16 unk394; -}; - -struct CreditsEntry -{ - u8 var_0; - u8 *text; -}; - -extern u8 ewram[]; - -#define EWRAM_1F800 ((u16 *)(ewram + 0x1F800)) -#define HALL_OF_FAME_SHEET_0 ((u8 *)(ewram + 0x1E000)) -#define HALL_OF_FAME_SHEET_1 ((u8 *)(ewram + 0x1E800)) -#define HALL_OF_FAME_SHEET_2 ((u8 *)(ewram + 0x1F000)) -#define ewram1c000 (*(struct Unk201C000 *)(ewram + 0x1C000)) - -extern struct HallOfFame gHallOfFame; -extern u8 unk_201e800[0x800]; -extern u8 unk_201f000[0x800]; -extern u16 unk_201f800[]; - -extern struct SpriteTemplate gUnknown_02024E8C; - -extern u16 gUnknown_02039358; -extern s16 gUnknown_0203935A; -extern s16 gUnknown_0203935C; - -static EWRAM_DATA s16 gUnknown_02039320 = 0; -static EWRAM_DATA u16 gUnknown_02039322 = 0; // TASK A -EWRAM_DATA u8 gUnknown_02039324 = 0; -static EWRAM_DATA u8 gUnknown_02039325 = 0; - -extern u8 gReservedSpritePaletteCount; - -// data/hall_of_fame -extern void *gUnknown_0840B5A0[]; - -// data/credits -const u16 gUnknown_0840B7BC[] = INCBIN_U16("graphics/credits/palette_1.gbapal"); -const u8 gUnknown_0840B7FC[] = INCBIN_U8("graphics/credits/ampersand.4bpp"); -extern u8 gUnknown_0840B83C[]; -extern u8 gUnknown_0840B84B[]; -extern u8 gUnknown_0840B85A[]; -extern u8 gUnknown_0840B869[]; -extern u8 gUnknown_0840B878[]; -extern struct CreditsEntry *gCreditsEntryPointerTable[][5]; -extern u8 gUnknown_0840CA00[][2]; -extern struct SpriteSheet gUnknown_0840CAA0; -extern struct SpritePalette gUnknown_0840CAB0; -extern const union AnimCmd *const gSpriteAnimTable_0840CA54[]; -extern const union AnimCmd *const gSpriteAnimTable_0840CA94[]; -extern struct SpriteTemplate gSpriteTemplate_840CAEC; - -// graphics -extern u8 gCreditsCopyrightEnd_Gfx[]; -extern u16 gIntroCopyright_Pal[16]; - -static void task_a_8143B38(u8 taskIdA); -static void task_a_8143B68(u8 taskIdA); -static void task_a_8143BFC(u8 taskIdA); -static void task_a_80C9BFC(u8 taskIdA); -static void task_a_8143CC0(u8 taskIdA); -static void task_a_8143D04(u8 taskIdA); -static void task_a_8143EBC(u8 taskIdA); -static void task_a_8143F04(u8 taskIdA); -static void task_a_8143F3C(u8 taskIdA); -static void task_a_8143FDC(u8 taskIdA); -static void task_a_8144024(u8 taskIdA); -static void task_a_8144080(u8 taskIdA); -static void task_a_8144114(u8 taskIdA); -static void sub_8144130(void); -static void task_b_81441B8(u8 taskIdB); -static u8 sub_8144454(u8 page, u8 taskIdA); -static void task_d_8144514(u8 taskIdD); -static bool8 sub_8144ECC(u8 data, u8 taskIdA); -static void sub_81450AC(u8 taskIdA); -static void sub_8145128(u16, u16, u16); -static void sub_81452D0(u16 arg0, u16 palette); -static void spritecb_player_8145378(struct Sprite *sprite); -static void spritecb_rival_8145420(struct Sprite *sprite); -static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position); -static void sub_81458DC(void); - -static void vblank_8143948(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void sub_814395C(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - - if ((gMain.heldKeys & B_BUTTON) - && gUnknown_02039324 != 0 - && gTasks[gUnknown_02039322].func == task_a_8143B68) - { - vblank_8143948(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - gUnknown_02039325 = 1; - } -} - -void sub_81439D0(void) -{ - u8 taskIdA; - s16 taskIdC; - u8 taskIdB; - u16 savedIme; - struct Unk201C000 *c000; - - sub_8144130(); - SetVBlankCallback(NULL); - ResetPaletteFade(); - ResetTasks(); - - taskIdA = CreateTask(task_a_8143B38, 0); - - gTasks[taskIdA].data[TDA_4] = 0; - gTasks[taskIdA].data[TDA_7] = 0; - gTasks[taskIdA].data[TDA_11] = 0; - gTasks[taskIdA].data[TDA_13] = 1; - - while (TRUE) - { - if (sub_8144ECC(0, taskIdA)) - break; - } - - taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; - gTasks[taskIdC].data[TDC_0] = 40; - - SetUpWindowConfig(&gWindowConfig_81E7208); - InitMenuWindow(&gWindowConfig_81E7208); - LoadPalette(&gUnknown_0840B7BC, 0x80, sizeof(gUnknown_0840B7BC)); - - CpuCopy16(&gUnknown_0840B7FC, (void *)(VRAM + 0xBEE0), sizeof(gUnknown_0840B7FC)); - - REG_BG0VOFS = 0xFFFC; - - taskIdB = CreateTask(task_b_81441B8, 0); - - gTasks[taskIdB].data[TDB_TASK_A_ID] = taskIdA; - gTasks[taskIdA].data[TDA_TASK_B_ID] = taskIdB; - - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - - - SetVBlankCallback(vblank_8143948); - m4aSongNumStart(BGM_THANKFOR); - SetMainCallback2(sub_814395C); - gUnknown_02039325 = 0; - - c000 = &ewram1c000; - - sub_81458DC(); - - c000->unk88 = 0; - c000->unk8A = 0; - c000->unk8C = 0; - - gUnknown_02039322 = taskIdA; -} - -static void task_a_8143B38(u8 taskIdA) -{ - if (!gPaletteFade.active) - gTasks[taskIdA].func = task_a_8143B68; -} - -static void task_a_8143B68(u8 taskIdA) -{ - u16 data11; - - if (gTasks[taskIdA].data[TDA_4]) - { - s16 taskIdC; - - taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; - gTasks[taskIdC].data[TDC_0] = 30; - - gTasks[taskIdA].data[TDA_12] = 0x100; - gTasks[taskIdA].func = task_a_8143EBC; - return; - } - - gUnknown_02039320 = 0; - data11 = gTasks[taskIdA].data[TDA_11]; - - if (gTasks[taskIdA].data[TDA_11] == 1) - { - gTasks[taskIdA].data[TDA_13] = data11; - gTasks[taskIdA].data[TDA_11] = 0; - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskIdA].func = task_a_8143BFC; - } - else if (gTasks[taskIdA].data[TDA_11] == 2) - { - gTasks[taskIdA].data[TDA_13] = data11; - gTasks[taskIdA].data[TDA_11] = 0; - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskIdA].func = task_a_8143CC0; - } -} - -static void task_a_8143BFC(u8 taskIdA) -{ - if (!gPaletteFade.active) - { - REG_DISPCNT = 0; - sub_81450AC(taskIdA); - gTasks[taskIdA].func = task_a_80C9BFC; - } -} - -static void task_a_80C9BFC(u8 taskIdA) -{ - u16 backup; - - SetVBlankCallback(NULL); - - if (sub_8144ECC(gTasks[taskIdA].data[TDA_7], taskIdA)) - { - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - - backup = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = backup; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - - SetVBlankCallback(vblank_8143948); - gTasks[taskIdA].func = task_a_8143B38; - } -} - -static void task_a_8143CC0(u8 taskIdA) -{ - if (!gPaletteFade.active) - { - REG_DISPCNT = 0; - sub_81450AC(taskIdA); - gTasks[taskIdA].func = task_a_8143D04; - } -} - -void task_a_8143D04(u8 taskIdA) -{ - switch (gMain.state) - { - default: - case 0: - { - u16 i; - - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 8; - LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); - LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); - LoadPalette(gBirchBagGrassPal[0] + 1, 1, 31 * 2); - - for (i = 0; i < 0x800; i++) - HALL_OF_FAME_SHEET_0[i] = 0x11; - for (i = 0; i < 0x800; i++) - HALL_OF_FAME_SHEET_1[i] = 0x22; - for (i = 0; i < 0x800; i++) - HALL_OF_FAME_SHEET_2[i] = 0x33; - - EWRAM_1F800[0] = 0; - EWRAM_1F800[1] = 0x53FF; // light yellow - EWRAM_1F800[2] = 0x529F; // light red - EWRAM_1F800[3] = 0x7E94; // light blue - - LoadSpriteSheet(&gUnknown_0840CAA0); - LoadSpritePalette(&gUnknown_0840CAB0); - - gMain.state += 1; - break; - } - case 1: - gTasks[taskIdA].data[TDA_TASK_D_ID] = CreateTask(task_d_8144514, 0); - gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_STATE] = 1; - gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_TASK_A_ID] = taskIdA; - gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_2] = gTasks[taskIdA].data[TDA_7]; - - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - REG_BG3HOFS = 0; - REG_BG3VOFS = 32; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - - gMain.state = 0; - gUnknown_0203935C = 0; - gTasks[taskIdA].func = task_a_8143B38; - break; - } -} - -static void task_a_8143EBC(u8 taskIdA) -{ - if (gTasks[taskIdA].data[TDA_12]) - { - gTasks[taskIdA].data[TDA_12] -= 1; - return; - } - - BeginNormalPaletteFade(-1, 12, 0, 16, 0); - gTasks[taskIdA].func = task_a_8143F04; -} - -static void task_a_8143F04(u8 taskIdA) -{ - if (!gPaletteFade.active) - { - sub_81450AC(taskIdA); - gTasks[taskIdA].func = task_a_8143F3C; - } -} - -static void task_a_8143F3C(u8 taskIdA) -{ - u16 backup; - - sub_8144130(); - ResetPaletteFade(); - sub_8145128(0, 0x3800, 0); - ResetSpriteData(); - FreeAllSpritePalettes(); - BeginNormalPaletteFade(-1, 8, 16, 0, 0); - - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - backup = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = backup; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; - - gTasks[taskIdA].data[TDA_0] = 0x100; - gTasks[taskIdA].func = task_a_8143FDC; -} - -static void task_a_8143FDC(u8 taskIdA) -{ - if (gTasks[taskIdA].data[TDA_0]) - { - gTasks[taskIdA].data[TDA_0] -= 1; - return; - } - - BeginNormalPaletteFade(-1, 6, 0, 16, 0); - gTasks[taskIdA].func = task_a_8144024; -} - -static void task_a_8144024(u8 taskIdA) -{ - if (!gPaletteFade.active) - { - sub_81452D0(0x3800, 0); - - BeginNormalPaletteFade(-1, 0, 0, 0, 0); - gTasks[taskIdA].data[TDA_0] = 7200; - gTasks[taskIdA].func = task_a_8144080; - } -} - -static void task_a_8144080(u8 taskIdA) -{ - if (!gPaletteFade.active) - { - if (gTasks[taskIdA].data[TDA_0] == 0) - { - FadeOutBGM(4); - BeginNormalPaletteFade(-1, 8, 0, 16, 0xFFFF); - gTasks[taskIdA].func = task_a_8144114; - return; - } - - if (gMain.newKeys) - { - FadeOutBGM(4); - BeginNormalPaletteFade(-1, 8, 0, 16, 0xFFFF); - gTasks[taskIdA].func = task_a_8144114; - return; - } - - if (gTasks[taskIdA].data[TDA_0] == 7144) - { - FadeOutBGM(8); - } - - if (gTasks[taskIdA].data[TDA_0] == 6840) - m4aSongNumStart(BGM_END); - - gTasks[taskIdA].data[TDA_0] -= 1; - } -} - -static void task_a_8144114(u8 taskIdA) -{ - if (!gPaletteFade.active) - SoftReset(0xFF); -} - -static void sub_8144130(void) -{ - REG_DISPCNT = 0; - - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - - DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *)OAM, OAM_SIZE); - DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); -} - -static void task_b_81441B8(u8 taskIdB) -{ - u16 i; - - switch (gTasks[taskIdB].data[TDB_0]) - { - case 0: - case 6: - case 7: - case 8: - case 9: - default: - if (!gPaletteFade.active) - { - gTasks[taskIdB].data[TDB_0] = 1; - gTasks[taskIdB].data[TDB_3] = 0x58; - gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0; - gUnknown_02039320 = 0; - } - return; - case 1: - if (gTasks[taskIdB].data[TDB_3] != 0) - { - gTasks[taskIdB].data[TDB_3] -= 1; - return; - } - gTasks[taskIdB].data[TDB_0] += 1; - return; - case 2: - REG_DISPCNT &= ~DISPCNT_BG0_ON; - if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == task_a_8143B68) - { - if (gTasks[taskIdB].data[TDB_CURRENT_PAGE] < PAGE_COUNT) - { - for (i = 0; i < 5; i++) - sub_8072BD8(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 0, 9 + i * 2, 240); - - gTasks[taskIdB].data[TDB_CURRENT_PAGE] += 1; - gTasks[taskIdB].data[TDB_0] += 1; - - gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 1; - - if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1) - BeginNormalPaletteFade(0x300, 0, 16, 0, COLOR_LIGHT_GREEN); - else - BeginNormalPaletteFade(0x300, 0, 16, 0, COLOR_DARK_GREEN); - return; - } - gTasks[taskIdB].data[TDB_0] = 10; - return; - } - gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0; - return; - case 3: - REG_DISPCNT |= DISPCNT_BG0_ON; - if (!gPaletteFade.active) - { - gTasks[taskIdB].data[TDB_3] = UNK_DEFINE_82; - gTasks[taskIdB].data[TDB_0] += 1; - } - return; - case 4: - if (gTasks[taskIdB].data[TDB_3] != 0) - { - gTasks[taskIdB].data[TDB_3] -= 1; - return; - } - - if (sub_8144454((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID])) - { - gTasks[taskIdB].data[TDB_0] += 1; - return; - } - gTasks[taskIdB].data[TDB_0] += 1; - if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1) - BeginNormalPaletteFade(0x300, 0, 0, 16, COLOR_LIGHT_GREEN); - else - BeginNormalPaletteFade(0x300, 0, 0, 16, COLOR_DARK_GREEN); - return; - case 5: - if (!gPaletteFade.active) - { - MenuZeroFillWindowRect(0, 9, 29, 19); - gTasks[taskIdB].data[TDB_0] = 2; - } - return; - - case 10: - gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_4] = 1; - DestroyTask(taskIdB); - return; - } -} - -static u8 sub_8144454(u8 page, u8 taskIdA) -{ - // Starts with bike + ocean + morning - - if (page == PAGE_PROGRAMMERS_1) - { - // Grass patch - gTasks[taskIdA].data[TDA_11] = 2; - } - - if (page == PAGE_POKEMON_GRAHPIC_DESIGNERS_3) - { - // Bike + ocean + sunset - gTasks[taskIdA].data[TDA_7] = 1; - gTasks[taskIdA].data[TDA_11] = 1; - } - - if (page == PAGE_GAME_DESIGNERS_2) - { - // Grass patch - gTasks[taskIdA].data[TDA_11] = 2; - } - - if (page == PAGE_MAP_DATA_DESIGNERS) - { - // Bike + forest + sunset - gTasks[taskIdA].data[TDA_7] = 2; - gTasks[taskIdA].data[TDA_11] = 1; - } - - if (page == PAGE_SPECIAL_THANKS_1) - { - // Grass patch - gTasks[taskIdA].data[TDA_11] = 2; - } - - if (page == PAGE_TASK_MANAGERS) - { - // Bike + forest + sunset - gTasks[taskIdA].data[TDA_7] = 3; - gTasks[taskIdA].data[TDA_11] = 1; - } - - if (page == PAGE_TRANSLATION_COORDINATOR) - { - // Grass patch - gTasks[taskIdA].data[TDA_11] = 2; - } - - if (page == LAST_PAGE) - { - // Bike + town + night - gTasks[taskIdA].data[TDA_7] = 4; - gTasks[taskIdA].data[TDA_11] = 1; - } - - if (gTasks[taskIdA].data[TDA_11] != 0) - { - // Returns true if changed? - return TRUE; - } - - return FALSE; -} - -static void task_d_8144514(u8 taskIdD) -{ - struct Unk201C000 *r6 = &ewram1c000; - u8 r2; - - switch (gTasks[taskIdD].data[TDD_STATE]) - { - case 0: - break; - case 1: - if (r6->unk8A == 0 && gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] == 0) - break; - gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] = 0; - gTasks[taskIdD].data[TDD_STATE]++; - break; - case 2: - if (r6->unk88 == POKEMON_TILE_COUNT || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != task_a_8143B68) - break; - r2 = sub_81456B4(r6->unk0[r6->unk8C], gUnknown_0840CA00[r6->unk8A][0], gUnknown_0840CA00[r6->unk8A][1], r6->unk8A); - if (r6->unk8C < r6->unk8E - 1) - { - r6->unk8C++; - gSprites[r2].data3 = 50; - } - else - { - r6->unk8C = 0; - gSprites[r2].data3 = 512; - } - r6->unk88++; - if (r6->unk8A == 2) - r6->unk8A = 0; - else - r6->unk8A++; - gTasks[taskIdD].data[TDD_3] = 50; - gTasks[taskIdD].data[TDD_STATE]++; - break; - case 3: - if (gTasks[taskIdD].data[TDD_3] != 0) - gTasks[taskIdD].data[TDD_3]--; - else - gTasks[taskIdD].data[TDD_STATE] = 1; - break; - } -} - -void task_c_8144664(u8 taskIdC) -{ - switch (gTasks[taskIdC].data[TDC_0]) - { - case 0: - gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); - gTasks[taskIdC].data[TDC_5]++; - break; - case 1: - if (gUnknown_0203935A != 0) - { - gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); - gTasks[taskIdC].data[TDC_5]++; - } - else - { - gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 2; - gTasks[taskIdC].data[TDC_5] = 0; - gTasks[taskIdC].data[TDC_0]++; - } - break; - case 2: - if (gTasks[taskIdC].data[TDC_5] < 64) - { - gTasks[taskIdC].data[TDC_5]++; - gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); - } - else - { - gTasks[taskIdC].data[TDC_0]++; - } - break; - case 3: - gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 3; - gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 1; - gTasks[taskIdC].data[TDC_4] = 120; - gTasks[taskIdC].data[TDC_0]++; - break; - case 4: - if (gTasks[taskIdC].data[TDC_4] != 0) - { - gTasks[taskIdC].data[TDC_4]--; - } - else - { - gTasks[taskIdC].data[TDC_5] = 64; - gTasks[taskIdC].data[TDC_0]++; - } - break; - case 5: - if (gTasks[taskIdC].data[TDC_5] > 0) - { - gTasks[taskIdC].data[TDC_5]--; - gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); - } - else - { - gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 1; - gTasks[taskIdC].data[TDC_0]++; - } - break; - case 6: - gTasks[taskIdC].data[TDC_0] = 50; - break; - case 10: - gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 2; - gTasks[taskIdC].data[TDC_0] = 50; - break; - case 20: - gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 4; - gTasks[taskIdC].data[TDC_0] = 50; - break; - case 30: - gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 5; - gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 3; - gTasks[taskIdC].data[TDC_0] = 50; - break; - case 50: - gTasks[taskIdC].data[TDC_0] = 0; - break; - } -} - -void task_e_8144934(u8 taskIdE) -{ - s16 taskIdC; - - switch (gTasks[taskIdE].data[TDE_0]) - { - default: - case 0: - if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) - { - - if (gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_B_ID]].data[TDB_CURRENT_PAGE] == PAGE_ART_DIRECTOR) - { - gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 20; - gTasks[taskIdE].data[TDE_1] = 0x7FFF; - } - } - sub_8149020(0); - break; - case 1: - sub_8149020(0); - break; - case 2: - if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) - { - taskIdC = gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]; - - // Floor to multiple of 128 - if ((gTasks[taskIdC].data[TDC_5] & -128) == 640) - { - gTasks[taskIdC].data[TDC_0] = 1; - gTasks[taskIdE].data[TDE_1] = 0x7FFF; - } - } - sub_8149020(1); - break; - case 3: - if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) - { - - if (gTasks[taskIdE].data[TDE_1] == UNK_DEF_1F3) - { - gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 10; - gTasks[taskIdE].data[TDE_1] = 0x7FFF; - } - else - { - gTasks[taskIdE].data[TDE_1] += 1; - } - } - sub_8149020(1); - break; - case 4: - sub_8149020(2); - break; - } -} - -static void sub_8144A68(u8 data, u8 taskIdA) -{ - switch (data) - { - case 0: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 272; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0; - gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8); - break; - case 1: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0; - gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8); - break; - case 2: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0; - gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8); - break; - case 3: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = -32; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0; - gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8); - break; - case 4: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 88; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 152; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0; - gTasks[taskIdA].data[TDA_0] = sub_8148EC0(2, 0x2000, 0x200, 8); - break; - } - - gTasks[taskIdA].data[TDA_TASK_E_ID] = CreateTask(task_e_8144934, 0); - gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_0] = data; - gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_1] = 0; - gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_TASK_A_ID] = taskIdA; - - gTasks[taskIdA].data[TDA_TASK_C_ID] = CreateTask(task_c_8144664, 0); - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_0] = 0; - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_1] = taskIdA; - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_2] = gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]; - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_3] = gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]; - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_4] = 0; - - if (data == 2) - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_5] = UNK_DEFINE_45; -} - -static bool8 sub_8144ECC(u8 data, u8 taskIdA) -{ - u8 spriteId; - - switch (gMain.state) - { - default: - case 0: - REG_DISPCNT = 0; - REG_BG3HOFS = 8; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - ResetSpriteData(); - FreeAllSpritePalettes(); - gMain.state = 1; - break; - case 1: - gUnknown_02039358 = 34; - gUnknown_0203935A = 0; - sub_8148CB0(data); - gMain.state += 1; - break; - case 2: - if (gSaveBlock2.playerGender == MALE) - { - LoadCompressedObjectPic(&gIntro2BrendanSpriteSheet); - LoadCompressedObjectPic(&gUnknown_08416E34); - LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet); - LoadSpritePalettes(gIntro2SpritePalettes); - - spriteId = intro_create_brendan_sprite(120, 46); - gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId; - gSprites[spriteId].callback = spritecb_player_8145378; - gSprites[spriteId].anims = gSpriteAnimTable_0840CA54; - - spriteId = intro_create_may_sprite(272, 46); - gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId; - gSprites[spriteId].callback = spritecb_rival_8145420; - gSprites[spriteId].anims = gSpriteAnimTable_0840CA94; - } - else - { - LoadCompressedObjectPic(&gIntro2MaySpriteSheet); - LoadCompressedObjectPic(&gUnknown_08416E24); - LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet); - LoadSpritePalettes(gIntro2SpritePalettes); - - spriteId = intro_create_may_sprite(120, 46); - gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId; - gSprites[spriteId].callback = spritecb_player_8145378; - gSprites[spriteId].anims = gSpriteAnimTable_0840CA54; - - spriteId = intro_create_brendan_sprite(272, 46); - gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId; - gSprites[spriteId].callback = spritecb_rival_8145420; - gSprites[spriteId].anims = gSpriteAnimTable_0840CA94; - }; - gMain.state += 1; - break; - case 3: - sub_8144A68(data, taskIdA); - sub_8148E90(data); - gMain.state = 0; - return TRUE; - } - return FALSE; -} - -static void sub_81450AC(u8 taskIdA) -{ - if (gTasks[taskIdA].data[TDA_0] != 0) - { - DestroyTask(gTasks[taskIdA].data[TDA_0]); - gTasks[taskIdA].data[TDA_0] = 0; - } - - if (gTasks[taskIdA].data[TDA_TASK_C_ID] != 0) - { - DestroyTask(gTasks[taskIdA].data[TDA_TASK_C_ID]); - gTasks[taskIdA].data[TDA_TASK_C_ID] = 0; - } - - if (gTasks[taskIdA].data[TDA_TASK_E_ID] != 0) - { - DestroyTask(gTasks[taskIdA].data[TDA_TASK_E_ID]); - gTasks[taskIdA].data[TDA_TASK_E_ID] = 0; - } - - if (gTasks[taskIdA].data[TDA_TASK_D_ID] != 0) - { - DestroyTask(gTasks[taskIdA].data[TDA_TASK_D_ID]); - gTasks[taskIdA].data[TDA_TASK_D_ID] = 0; - } - - gUnknown_0203935C = 1; -} - -static void sub_8145128(u16 arg0, u16 arg1, u16 arg2) -{ - u16 baseTile; - u16 i; - - LZ77UnCompVram(gCreditsCopyrightEnd_Gfx, (void *) (VRAM + arg0)); - LoadPalette(gIntroCopyright_Pal, arg2, sizeof(gIntroCopyright_Pal)); - - baseTile = (arg2 / 16) << 12; - - for (i = 0; i < 32 * 32; i++) - ((u16 *) (VRAM + arg1))[i] = baseTile + 1; - - for (i = 0; i < 21; i++) - ((u16 *) (VRAM + arg1))[7 * 32 + 4 + i] = i + 2 + baseTile; - - for (i = 0; i < 20; i++) - ((u16 *) (VRAM + arg1))[9 * 32 + 4 + i] = i + 23 + baseTile; - - for (i = 0; i < 23; i++) - ((u16 *) (VRAM + arg1))[11 * 32 + 4 + i] = i + 43 + baseTile; - - for (i = 0; i < 12; i++) - ((u16 *) (VRAM + arg1))[13 * 32 + 4 + i] = i + 66 + baseTile; -} - -u16 sub_8145208(u8 arg0) -{ - u16 out = (arg0 & 0x3F) + 80; - - if (arg0 == 0xFF) - return 1; - - if (arg0 & (1 << 7)) - out |= 1 << 11; - if (arg0 & (1 << 6)) - out |= 1 << 10; - - return out; -} - -void sub_814524C(u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palette) -{ - u8 y, x; - const u16 tileOffset = (palette / 16) << 12; - - for (y = 0; y < 5; y++) - { - for (x = 0; x < 3; x++) - ((u16 *) (VRAM + arg3 + (baseY + y) * 64))[baseX + x] = tileOffset + sub_8145208(arg0[y * 3 + x]); - } -} - -static void sub_81452D0(u16 arg0, u16 palette) -{ - u16 pos; - u16 baseTile = (palette / 16) << 12; - - for (pos = 0; pos < 32 * 32; pos++) - ((u16 *) (VRAM + arg0))[pos] = baseTile + 1; - -#if ENGLISH - sub_814524C(gUnknown_0840B83C, 3, 7, arg0, palette); - sub_814524C(gUnknown_0840B84B, 7, 7, arg0, palette); - sub_814524C(gUnknown_0840B85A, 11, 7, arg0, palette); - sub_814524C(gUnknown_0840B85A, 16, 7, arg0, palette); - sub_814524C(gUnknown_0840B869, 20, 7, arg0, palette); - sub_814524C(gUnknown_0840B878, 24, 7, arg0, palette); -#elif GERMAN - sub_814524C(gUnknown_0840B85A, 7, 7, arg0, palette); - sub_814524C(gUnknown_0840B869, 11, 7, arg0, palette); - sub_814524C(gUnknown_0840B878, 15, 7, arg0, palette); - sub_814524C(gUnknown_0840B85A, 19, 7, arg0, palette); -#endif -} - -static void spritecb_player_8145378(struct Sprite *sprite) -{ - if (gUnknown_0203935C != 0) - { - DestroySprite(sprite); - return; - } - - switch (sprite->data0) - { - case 0: - StartSpriteAnimIfDifferent(sprite, 0); - break; - case 1: - StartSpriteAnimIfDifferent(sprite, 1); - if (sprite->pos1.x > -32) - sprite->pos1.x -= 1; - break; - case 2: - StartSpriteAnimIfDifferent(sprite, 2); - break; - case 3: - StartSpriteAnimIfDifferent(sprite, 3); - break; - case 4: - StartSpriteAnimIfDifferent(sprite, 0); - if (sprite->pos1.x > 120) - sprite->pos1.x -= 1; - break; - case 5: - StartSpriteAnimIfDifferent(sprite, 0); - if (sprite->pos1.x > -32) - sprite->pos1.x -= 1; - break; - } -} - -static void spritecb_rival_8145420(struct Sprite *sprite) -{ - if (gUnknown_0203935C != 0) - { - DestroySprite(sprite); - return; - } - - switch (sprite->data0) - { - case 0: - sprite->pos2.y = 0; - StartSpriteAnimIfDifferent(sprite, 0); - break; - case 1: - if (sprite->pos1.x > 200) - StartSpriteAnimIfDifferent(sprite, 1); - else - StartSpriteAnimIfDifferent(sprite, 2); - if (sprite->pos1.x > -32) - sprite->pos1.x -= 2; - sprite->pos2.y = -gUnknown_0203935A; - break; - case 2: - sprite->data7 += 1; - StartSpriteAnimIfDifferent(sprite, 0); - if ((sprite->data7 & 3) == 0) - sprite->pos1.x += 1; - break; - case 3: - StartSpriteAnimIfDifferent(sprite, 0); - if (sprite->pos1.x > -32) - sprite->pos1.x -= 1; - break; - } -} - -void spritecb_81454E0(struct Sprite *sprite) -{ - if (gUnknown_0203935C) - { - DestroySprite(sprite); - return; - } - - sprite->data7 += 1; - switch (sprite->data0) - { - case 0: - default: - sprite->oam.affineMode = 1; - sprite->oam.matrixNum = sprite->data1; - sprite->data2 = 16; - SetOamMatrix(sprite->data1, 0x10000 / sprite->data2, 0, 0, 0x10000 / sprite->data2); - sprite->invisible = FALSE; - sprite->data0 = 1; - break; - case 1: - if (sprite->data2 < 256) - { - sprite->data2 += 8; - SetOamMatrix(sprite->data1, 0x10000 / sprite->data2, 0, 0, 0x10000 / sprite->data2); - } - else - { - sprite->data0 += 1; - } - switch (sprite->data1) - { - case 1: - if ((sprite->data7 & 3) == 0) - sprite->pos1.y += 1; - sprite->pos1.x -= 2; - break; - case 2: - break; - case 3: - if ((sprite->data7 & 3) == 0) - sprite->pos1.y += 1; - sprite->pos1.x += 2; - break; - } - break; - case 2: - if (sprite->data3 != 0) - { - sprite->data3 -= 1; - } - else - { - REG_BLDCNT = 0xF40; - REG_BLDALPHA = 0x10; - sprite->oam.objMode = 1; - sprite->data3 = 16; - sprite->data0 += 1; - } - break; - case 3: - if (sprite->data3 != 0) - { - int data3; - vu16 *reg; - - sprite->data3 -= 1; - - reg = ®_BLDALPHA; - data3 = 16 - sprite->data3; - *reg = (data3 << 8) + sprite->data3; - } - else - { - sprite->invisible = TRUE; - sprite->data0 = 10; - } - break; - case 10: - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroySprite(sprite); - break; - } -} - -static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position) -{ - u32 personality; - const u8 *lzPaletteData; - u8 spriteId; - u8 spriteId2; - - species = NationalPokedexNumToSpecies(species); - switch (species) - { - default: - personality = 0; - break; - case SPECIES_SPINDA: - personality = gSaveBlock2.pokedex.spindaPersonality; - break; - case SPECIES_UNOWN: - personality = gSaveBlock2.pokedex.unownPersonality; - break; - } - - LoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, - gMonFrontPicCoords[species].y_offset, - 0x2000000, - gUnknown_0840B5A0[position], - species, - personality, - 1 - ); - - lzPaletteData = species_and_otid_get_pal(species, 0, 0xFFFF); - LoadCompressedPalette(lzPaletteData, 0x100 + (position * 16), 0x20); - sub_8143648(position, position); - - spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); - gSprites[spriteId].oam.paletteNum = position; - gSprites[spriteId].oam.priority = 1; - gSprites[spriteId].data1 = position + 1; - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].callback = spritecb_81454E0; - - spriteId2 = CreateSprite(&gSpriteTemplate_840CAEC, gSprites[spriteId].pos1.x, gSprites[spriteId].pos1.y, 1); - gSprites[spriteId2].data0 = spriteId; - - StartSpriteAnimIfDifferent(&gSprites[spriteId2], position); - - return spriteId; -} - -void spritecb_814580C(struct Sprite *sprite) -{ - if (gSprites[sprite->data0].data0 == 10 || gUnknown_0203935C) - { - DestroySprite(sprite); - return; - } - - sprite->invisible = gSprites[sprite->data0].invisible; - sprite->oam.objMode = gSprites[sprite->data0].oam.objMode; - sprite->oam.affineMode = gSprites[sprite->data0].oam.affineMode; - sprite->oam.matrixNum = gSprites[sprite->data0].oam.matrixNum; - sprite->pos1.x = gSprites[sprite->data0].pos1.x; - sprite->pos1.y = gSprites[sprite->data0].pos1.y; -} - -static void sub_81458DC(void) -{ - struct Unk201C000 *unk201C000 = &ewram1c000; - u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_FIRST_POKE))); - u16 seenTypesCount; - u16 page; - u16 dexNum; - u16 j; - - for (dexNum = 1, seenTypesCount = 0; dexNum < 386; dexNum++) - { - if (GetNationalPokedexFlag(dexNum, 1)) - { - unk201C000->unk90[seenTypesCount] = dexNum; - seenTypesCount++; - } - } - - for (dexNum = seenTypesCount; dexNum < 386; dexNum++) - unk201C000->unk90[dexNum] = 0; - - unk201C000->unk394 = seenTypesCount; - if (unk201C000->unk394 < POKEMON_TILE_COUNT) - unk201C000->unk8E = seenTypesCount; - else - unk201C000->unk8E = POKEMON_TILE_COUNT; - - j = 0; - do - { - page = Random() % unk201C000->unk394; - unk201C000->unk0[j] = unk201C000->unk90[page]; - - j++; - unk201C000->unk90[page] = 0; - unk201C000->unk394--; - if (page != unk201C000->unk394) - { - unk201C000->unk90[page] = unk201C000->unk90[unk201C000->unk394]; - unk201C000->unk90[unk201C000->unk394] = 0; - } - } - while (unk201C000->unk394 != 0 && j < POKEMON_TILE_COUNT); - - if (unk201C000->unk8E < POKEMON_TILE_COUNT) - { - for (j = unk201C000->unk8E, page = 0; j < POKEMON_TILE_COUNT; j++) - { - unk201C000->unk0[j] = unk201C000->unk0[page]; - - page++; - if (page == unk201C000->unk8E) - page = 0; - } - unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; - } - else - { - for (dexNum = 0; unk201C000->unk0[dexNum] != starter && dexNum < POKEMON_TILE_COUNT; dexNum++); - - if (dexNum < unk201C000->unk8E - 1) - { - unk201C000->unk0[dexNum] = unk201C000->unk0[POKEMON_TILE_COUNT - 1]; - unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; - } - else - { - unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; - } - } - unk201C000->unk8E = POKEMON_TILE_COUNT; -} diff --git a/src/daycare.c b/src/daycare.c deleted file mode 100644 index cded18207..000000000 --- a/src/daycare.c +++ /dev/null @@ -1,350 +0,0 @@ -#include "global.h" -#include "daycare.h" -#include "pokemon.h" -#include "species.h" -#include "items.h" -#include "string_util.h" - -extern u8 gLastFieldPokeMenuOpened; - -u8 *GetMonNick(struct Pokemon *mon, u8 *dest) -{ - s8 nickname[POKEMON_NAME_LENGTH * 2]; - - GetMonData(mon, MON_DATA_NICKNAME, nickname); - return StringCopy10(dest, nickname); -} - -u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest) -{ - s8 nickname[POKEMON_NAME_LENGTH * 2]; - - GetBoxMonData(mon, MON_DATA_NICKNAME, nickname); - return StringCopy10(dest, nickname); -} - -u8 Daycare_CountPokemon(struct BoxPokemon *daycare_data) -{ - u8 i, count; - count = 0; - - for(i = 0;i <= 1;i++) - if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) != 0) - count++; - - return count; -} - -void sub_8041324(struct BoxPokemon * box_pokemon, struct RecordMixing_UnknownStruct * void_pointer) -{ - u8 i; - u8 specCount; - specCount = 0; - for (i=0; i<2; i++) - { - if (GetBoxMonData(&box_pokemon[i], MON_DATA_SPECIES) != SPECIES_NONE) - { - specCount ++; - if (GetBoxMonData(&box_pokemon[i], MON_DATA_HELD_ITEM) == ITEM_NONE) - { - void_pointer->unk74[i] = 0; - } else - { - void_pointer->unk74[i] = 1; - } - } else - { - void_pointer->unk74[i] = 1; - } - } - void_pointer->unk70 = specCount; -} - -s8 Daycare_FindEmptySpot(struct BoxPokemon * daycare_data) -{ - u8 i; - - for(i = 0;i <= 1;i++) - if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) == 0) - return i; - - return -1; -} - -/*void Daycare_SendPokemon(struct Pokemon * mon, struct BoxPokemon * daycare_data){ // unfinished - s8 empty_slot; - - empty_slot = Daycare_FindEmptySpot(daycare_data); - if(MonHasMail(mon) != 0){ // if the mon holds a mail? - u8 empty_slot_times_56 = empty_slot * 56; - u8 * something2 = ((u8 *) (daycare_data + 2)) + empty_slot_times_56 + 36; - StringCopy(something2, gSaveBlock2.playerName); - PadNameString(something2, 0xFC); - something2 += 8; - GetMonNick(mon, something2); - u8 pokerus = GetMonData(mon, MON_DATA_64); - something1 += (u8 * daycare_data) -}*/ - -__attribute__((naked)) -void Daycare_SendPokemon() -{ - // strange stack usage - happens because THUMB ARM only allows R0-R7 to be pushed/popped: - // all registers in reglist must be Lo registers, except that PUSH can include the LR, and POP can include the PC - // the ldm/stm section probably copies some struct, but I'm not sure how the code would look - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - adds r7, r0, 0\n\ - mov r8, r1\n\ - mov r0, r8\n\ - bl Daycare_FindEmptySpot\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - mov r9, r4\n\ - adds r0, r7, 0\n\ - bl MonHasMail\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0804144A\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - lsls r4, r0, 3\n\ - subs r4, r0\n\ - lsls r4, 3\n\ - adds r5, r4, 0\n\ - adds r5, 0xA0\n\ - add r5, r8\n\ - adds r6, r5, 0\n\ - adds r6, 0x24\n\ - ldr r1, _08041490 @ =gSaveBlock2\n\ - adds r0, r6, 0\n\ - bl StringCopy\n\ - adds r0, r6, 0\n\ - movs r1, 0xFC\n\ - bl PadNameString\n\ - adds r6, 0x8\n\ - adds r0, r7, 0\n\ - adds r1, r6, 0\n\ - bl GetMonNick\n\ - adds r0, r7, 0\n\ - movs r1, 0x40\n\ - bl GetMonData\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - add r4, r8\n\ - ldr r2, _08041494 @ =gSaveBlock1\n\ - lsls r1, r0, 3\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r2\n\ - adds r4, 0xA0\n\ - ldr r0, _08041498 @ =0x00002b4c\n\ - adds r1, r0\n\ - ldm r1!, {r0,r2,r3}\n\ - stm r4!, {r0,r2,r3}\n\ - ldm r1!, {r0,r2,r3}\n\ - stm r4!, {r0,r2,r3}\n\ - ldm r1!, {r0,r2,r3}\n\ - stm r4!, {r0,r2,r3}\n\ - adds r0, r7, 0\n\ - bl TakeMailFromMon\n\ -_0804144A:\n\ - mov r2, r9\n\ - lsls r4, r2, 24\n\ - asrs r4, 24\n\ - lsls r5, r4, 2\n\ - adds r4, r5, r4\n\ - lsls r4, 4\n\ - add r4, r8\n\ - adds r0, r4, 0\n\ - adds r1, r7, 0\n\ - movs r2, 0x50\n\ - bl memcpy\n\ - adds r0, r4, 0\n\ - bl BoxMonRestorePP\n\ - movs r0, 0x88\n\ - lsls r0, 1\n\ - add r0, r8\n\ - adds r0, r5\n\ - movs r1, 0\n\ - str r1, [r0]\n\ - adds r0, r7, 0\n\ - bl ZeroMonData\n\ - bl party_compaction\n\ - bl CalculatePlayerPartyCount\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08041490: .4byte gSaveBlock2\n\ -_08041494: .4byte gSaveBlock1\n\ -_08041498: .4byte 0x00002b4c\n\ - .syntax divided\n"); -} - -void Daycare_SendPokemon_Special() -{ - Daycare_SendPokemon(gPlayerParty + gLastFieldPokeMenuOpened, gSaveBlock1.daycareData); -} - -void sub_80417F4(u8 *); - -void sub_80414C0(struct BoxPokemon * daycare_data) -{ - u32 second_species; - if((GetBoxMonData(&daycare_data[1], MON_DATA_SPECIES) != 0) && ((second_species = GetBoxMonData(&daycare_data[0], MON_DATA_SPECIES)) == 0)){ - daycare_data[0] = daycare_data[1]; - ZeroBoxMonData(&daycare_data[1]); - memcpy(daycare_data + 2, (u8 *) (daycare_data + 1) + 0x88, 0x38); - *((u32 *)(daycare_data) + 68) = *((u32 *)(daycare_data) + 69); - *((u32 *)(daycare_data) + 69) = second_species; - sub_80417F4((u8 *) (daycare_data + 1) + 0x88); - } -} - -u8 TryIncrementMonLevel(struct Pokemon *); -extern u16 word_2024E82; - -void sub_804151C(struct Pokemon * mon) -{ - s32 i; - u8 r6; - u16 temp; - - for(i = 0; i < 100; i++){ - if(TryIncrementMonLevel(mon) == FALSE) goto end; - - r6 = 1; - while((temp = sub_803B7C8(mon, r6)) != 0){ - r6 = 0; - if(temp == 0xffff){ - DeleteFirstMoveAndGiveMoveToMon(mon, word_2024E82); - } - } - } - - end: - - CalculateMonStats(mon); -} - -__attribute__((naked)) -u16 sub_8041570(struct BoxPokemon * daycare_data, u8 a2){ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x68\n\ - adds r5, r0, 0\n\ - lsls r1, 24\n\ - lsrs r4, r1, 24\n\ - lsls r7, r4, 2\n\ - adds r0, r7, r4\n\ - lsls r0, 4\n\ - adds r6, r5, r0\n\ - ldr r1, _08041640 @ =gStringVar1\n\ - adds r0, r6, 0\n\ - bl GetBoxMonNick\n\ - adds r0, r6, 0\n\ - movs r1, 0xB\n\ - bl GetBoxMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r9, r0\n\ - adds r0, r6, 0\n\ - mov r1, sp\n\ - bl sub_803B4B4\n\ - mov r0, sp\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - cmp r0, 0x64\n\ - beq _080415D8\n\ - mov r0, sp\n\ - movs r1, 0x19\n\ - bl GetMonData\n\ - movs r2, 0x88\n\ - lsls r2, 1\n\ - adds r1, r5, r2\n\ - adds r1, r7\n\ - ldr r1, [r1]\n\ - adds r0, r1\n\ - str r0, [sp, 0x64]\n\ - add r2, sp, 0x64\n\ - mov r0, sp\n\ - movs r1, 0x19\n\ - bl SetMonData\n\ - mov r0, sp\n\ - bl sub_804151C\n\ -_080415D8:\n\ - ldr r0, _08041644 @ =gPlayerParty\n\ - movs r1, 0xFA\n\ - lsls r1, 1\n\ - adds r1, r0\n\ - mov r8, r1\n\ - mov r0, r8\n\ - mov r1, sp\n\ - movs r2, 0x64\n\ - bl memcpy\n\ - lsls r0, r4, 3\n\ - subs r0, r4\n\ - lsls r1, r0, 3\n\ - adds r0, r5, r1\n\ - adds r0, 0xC0\n\ - ldrh r0, [r0]\n\ - cmp r0, 0\n\ - beq _08041610\n\ - adds r4, r1, 0\n\ - adds r4, 0xA0\n\ - adds r4, r5, r4\n\ - mov r0, r8\n\ - adds r1, r4, 0\n\ - bl GiveMailToMon2\n\ - adds r0, r4, 0\n\ - bl sub_80417F4\n\ -_08041610:\n\ - bl party_compaction\n\ - adds r0, r6, 0\n\ - bl ZeroBoxMonData\n\ - movs r2, 0x88\n\ - lsls r2, 1\n\ - adds r0, r5, r2\n\ - adds r0, r7\n\ - movs r1, 0\n\ - str r1, [r0]\n\ - adds r0, r5, 0\n\ - bl sub_80414C0\n\ - bl CalculatePlayerPartyCount\n\ - mov r0, r9\n\ - add sp, 0x68\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08041640: .4byte gStringVar1\n\ -_08041644: .4byte gPlayerParty\n\ - .syntax divided"); -} - -extern u8 gSpecialVar_0x8004; - -u16 sub_8041648() -{ - return sub_8041570(gSaveBlock1.daycareData, gSpecialVar_0x8004); -} - -u8 Daycare_GetLevelAfterSteps(struct BoxPokemon * mon, u32 steps){ - struct BoxPokemon temp = *mon; - u32 new_exp = GetBoxMonData(mon, MON_DATA_EXP) + steps; - SetBoxMonData(&temp, MON_DATA_EXP, (u8 *) &new_exp); - return GetLevelFromBoxMonExp(&temp); -} diff --git a/src/de_rom_8040FE0.c b/src/de_rom_8040FE0.c deleted file mode 100644 index c618ebdb2..000000000 --- a/src/de_rom_8040FE0.c +++ /dev/null @@ -1,272 +0,0 @@ -#include "global.h" -#include "battle.h" - -#if GERMAN - -enum { - TRAINER_CLASS_NAME_LEADER = 25, - TRAINER_CLASS_NAME_SCHOOL_KID = 26, - TRAINER_CLASS_NAME_EXPERT = 30, - TRAINER_CLASS_NAME_POKEMON_TRAINER_3 = 46, -}; - -enum { - TRAINER_CLASS_LEADER_F = 26, - TRAINER_CLASS_ELITE_FOUR_F = 25, - TRAINER_CLASS_SCHOOL_KID_F = 30, - TRAINER_CLASS_BIRD_KEEPER = 46, - TRAINER_CLASS_MAY_1 = 61, - TRAINER_CLASS_MAY_2 = 62, - TRAINER_CLASS_MAY_3 = 63, -}; - -extern struct SecretBaseRecord gSecretBaseRecord; - -extern u8 gTrainerClassNames[][13]; -extern struct Trainer gTrainers[]; - -u8 *de_sub_8040FE0(u8 gender) { - if (gender) - { - gender++; - - } - - gender = TRAINER_CLASS_NAME_SCHOOL_KID; - return gTrainerClassNames[gender]; -} - -u8 *de_sub_8040FF4(u8 gender) { - if (gender) { - gender++; - } - - gender = TRAINER_CLASS_NAME_POKEMON_TRAINER_3; - return gTrainerClassNames[gender]; -} - -u8 *de_sub_804100C(u8 gender) { - if (gender) { - gender++; - } - - gender = TRAINER_CLASS_NAME_LEADER; - return gTrainerClassNames[gender]; -} - -#ifdef NONMATCHING - -u8 de_sub_81364AC(void); -u8 get_trainer_class_name_index(void); -u8 de_sub_81364F8(void); -u8 sub_8135FD8(void); - -u8 *de_sub_8041024(s32 arg0, u32 arg1) { - u8 nameIndex, trainerClass, gender; - struct Trainer *trainer; - u8 local2; - - switch (arg0) - { - case 0x400: - nameIndex = GetSecretBaseTrainerNameIndex(); - gender = gSecretBaseRecord.gender; - if (nameIndex == TRAINER_CLASS_NAME_SCHOOL_KID) - { - return de_sub_8040FE0(gender); - } - - return gTrainerClassNames[nameIndex]; - - case 0x100: - trainerClass = de_sub_81364AC(); - nameIndex = get_trainer_class_name_index(); - if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) - { - return de_sub_8040FE0(FEMALE); - } - if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) - { - return de_sub_8040FF4(FEMALE); - } - - return gTrainerClassNames[nameIndex]; - - case 0x800: - trainerClass = de_sub_81364F8(); - nameIndex = sub_8135FD8(); - if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) - { - return de_sub_8040FE0(FEMALE); - } - if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) - { - return de_sub_8040FF4(FEMALE); - } - - return gTrainerClassNames[nameIndex]; - - default: - trainer = &gTrainers[arg1]; - trainerClass = trainer->trainerClass; - local2 = sub_803FC58(arg1); - - if (trainerClass == TRAINER_CLASS_LEADER_F) - { - return de_sub_8040FE0(local2); - } - - if (trainerClass == TRAINER_CLASS_BIRD_KEEPER && local2 == FEMALE) - { - return de_sub_8040FF4(FEMALE); - } - - if (trainerClass == TRAINER_CLASS_ELITE_FOUR_F) - { - if (gTrainers[arg1].doubleBattle == TRUE) - { - return de_sub_804100C(FEMALE); - } - else - { - return de_sub_804100C(MALE); - } - } - - - return gTrainerClassNames[trainerClass]; - } -} -#else - -__attribute__((naked)) -void de_sub_8041024(void) { - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - adds r2, r0, 0\n\ - adds r6, r1, 0\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r2, r0\n\ - beq _0804104A\n\ - cmp r2, r0\n\ - bgt _08041040\n\ - movs r0, 0x80\n\ - lsls r0, 1\n\ - cmp r2, r0\n\ - beq _08041064\n\ - b _0804109C\n\ -_08041040:\n\ - movs r0, 0x80\n\ - lsls r0, 4\n\ - cmp r2, r0\n\ - beq _08041086\n\ - b _0804109C\n\ -_0804104A:\n\ - bl GetSecretBaseTrainerNameIndex\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - ldr r0, _08041060 @ =0x02017000\n\ - ldrb r0, [r0, 0x1]\n\ - lsls r0, 27\n\ - lsrs r2, r0, 31\n\ - cmp r5, 0x1A\n\ - beq _080410B8\n\ - b _080410F8\n\ - .align 2, 0\n\ -_08041060: .4byte 0x02017000\n\ -_08041064:\n\ - bl de_sub_81364AC\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - bl get_trainer_class_name_index\n\ -_08041070:\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r4, 0x1E\n\ - beq _08041094\n\ - adds r0, r4, 0\n\ - subs r0, 0x3D\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x2\n\ - bls _080410CC\n\ - b _080410F8\n\ -_08041086:\n\ - bl de_sub_81364F8\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - bl sub_8135FD8\n\ - b _08041070\n\ -_08041094:\n\ - movs r0, 0x1\n\ - bl de_sub_8040FE0\n\ - b _08041102\n\ -_0804109C:\n\ - ldr r1, _080410C0 @ =gTrainers\n\ - lsls r4, r6, 2\n\ - adds r0, r4, r6\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldrb r5, [r0, 0x1]\n\ - lsls r0, r6, 16\n\ - lsrs r0, 16\n\ - bl sub_803FC58\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - cmp r5, 0x1A\n\ - bne _080410C4\n\ -_080410B8:\n\ - adds r0, r2, 0\n\ - bl de_sub_8040FE0\n\ - b _08041102\n\ - .align 2, 0\n\ -_080410C0: .4byte gTrainers\n\ -_080410C4:\n\ - cmp r5, 0x2E\n\ - bne _080410D4\n\ - cmp r2, 0x1\n\ - bne _080410D4\n\ -_080410CC:\n\ - movs r0, 0x1\n\ - bl de_sub_8040FF4\n\ - b _08041102\n\ -_080410D4:\n\ - cmp r5, 0x19\n\ - bne _080410F8\n\ - ldr r0, _080410F4 @ =gTrainers\n\ - adds r1, r4, r6\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x18]\n\ - movs r2, 0\n\ - cmp r0, 0x1\n\ - bne _080410EA\n\ - movs r2, 0x1\n\ -_080410EA:\n\ - adds r0, r2, 0\n\ - bl de_sub_804100C\n\ - b _08041102\n\ - .align 2, 0\n\ -_080410F4: .4byte gTrainers\n\ -_080410F8:\n\ - movs r0, 0xD\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, _08041108 @ =gTrainerClassNames\n\ - adds r0, r1, r0\n\ -_08041102:\n\ - pop {r4-r6}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08041108: .4byte gTrainerClassNames\n\ - .syntax divided\n"); -} -#endif - -u32 de_sub_804110C(u32 arg0, u32 arg1) { - return arg1; -} - -#endif diff --git a/src/debug/matsuda_debug_menu.c b/src/debug/matsuda_debug_menu.c new file mode 100644 index 000000000..3665cabd8 --- /dev/null +++ b/src/debug/matsuda_debug_menu.c @@ -0,0 +1,1113 @@ +#include "global.h" +#include "matsuda_debug_menu.h" +#include "contest.h" +#include "contest_link_80C2020.h" +#include "contest_link_80C857C.h" +#include "data2.h" +#include "link.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "rom4.h" +#include "sprite.h" +#include "start_menu.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "unknown_task.h" + +extern u8 gUnknown_0203856C; +extern u8 gUnknown_0203857D[][64]; +extern u16 gUnknown_02038670[]; +extern u16 gUnknown_02038678[]; +extern u16 gUnknown_02038680[]; +extern u8 gUnknown_02038690[]; +extern u8 gUnknown_02038694; +extern u8 gIsLinkContest; +extern u8 gUnknown_0203869B; +extern u8 gContestPlayerMonIndex; +extern u16 gScriptContestCategory; +extern u16 gScriptContestRank; + +extern u16 gUnknown_030042A4; +extern u16 gUnknown_030042A0; +extern u16 gUnknown_030042C0; +extern u16 gUnknown_030041B4; +extern u16 gUnknown_03004288; +extern u16 gUnknown_03004280; +extern u16 gUnknown_030041B0; +extern u16 gUnknown_030041B8; +extern struct Window gUnknown_03004210; +extern u8 (*gCallback_03004AE8)(void); + +extern u8 gUnknown_083C926E[][2]; +extern u8 gUnknown_083C9282[]; +extern const u8 gUnknown_083C928E[][2]; +extern u8 gUnknown_083C9296[]; +extern u8 gUnknown_083C92A8[]; +extern u8 unk_2000000[]; +extern u8 gMatsudaDebugMenu_GoBackText[]; +extern u8 gMatsudaDebugMenu_BattlePointsText[]; +extern u8 gMatsudaDebugMenu_StartText[]; + +extern struct SpritePalette gUnknown_083C92BC; +extern struct SpriteSheet gUnknown_083C92B4; +extern struct SpriteTemplate gSpriteTemplate_83C92CC; +extern void (*gUnknown_083C92E4[][2])(struct Sprite *, s8); +extern u32 gUnknown_083C9400[2]; + + +extern u8 gMatsudaDebugMenu_UnknownByteArray[]; +extern u8* gMatsudaDebugMenuTextList1[]; +extern u8* gMatsudaDebugMenuTextList2[]; +extern u8* gMatsudaDebugMenuTextList3[]; +extern u8 gMatsudaDebugMenuContestTopLeft[][2]; + +extern bool8 gReceivedRemoteLinkPlayers; + +extern struct MenuAction gMatsudaDebugMenuActions[]; + +static bool8 sub_80A9B78(void); +static void sub_80A9BE4(u8 taskId); +static void sub_80A9C98(u8); +static void sub_80A9CC0(u8); +static void sub_80A9CDC(u8); +static void sub_80A9D58(u8); +static void sub_80A9DBC(u8); +static void sub_80A9DD8(u8); +static void sub_80A9E04(u8 taskId); +static void sub_80A9E3C(u8 taskId); +static void sub_80A9E80(u8); +static void sub_80A9ED8(u8); +static void sub_80A9F10(u8); +static void sub_80AA10C(void); +static void sub_80AA5BC(u8); +static void sub_80AA614(u8, u8); +static void sub_80AAD08(struct Sprite *, s8); + +u8 unref_sub_80A9B28(void) +{ + MenuZeroFillScreen(); + MenuDrawTextWindow(0, 0, 17, 18); + PrintMenuItems(1, 1, 7, gMatsudaDebugMenuActions); + InitMenu(0, 1, 1, 7, 0, 16); + gCallback_03004AE8 = sub_80A9B78; + return 0; +} + +static bool8 sub_80A9B78(void) +{ + s8 choice = ProcessMenuInput(); + + switch (choice) + { + case -2: + return FALSE; + default: + gCallback_03004AE8 = gMatsudaDebugMenuActions[choice].func; + return FALSE; + case -1: + CloseMenu(); + return TRUE; + } +} + +s8 MatsudaDebugMenu_ContestResults(void) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + CreateTask(sub_80A9BE4, 0xFF); + return 1; +} + +static void sub_80A9BE4(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskId); + + if (!(gIsLinkContest & 1)) + sub_80AF668(); + + sub_80C2358(); + } +} + +s8 MatsudaDebugMenu_Contest(void) +{ + gIsLinkContest = 0; + sub_80AA10C(); + return 0; +} + +s8 MatsudaDebugMenu_ContestComm(void) +{ + sub_80AA10C(); + return 0; +} + +s8 MatsudaDebugMenu_CommTest(void) +{ + u8 newTaskId; + u8 newTaskId2; + + newTaskId = CreateTask(sub_80A9E3C, 0); + SetTaskFuncWithFollowupFunc(newTaskId, sub_80A9E3C, sub_80A9C98); + newTaskId2 = CreateTask(sub_80A9E04, 1); + gTasks[newTaskId2].data[10] = newTaskId; + gTasks[newTaskId].data[10] = newTaskId2; + return 1; +} + +static void sub_80A9C98(u8 taskId) +{ + sub_80AE098(0); + SetTaskFuncWithFollowupFunc(taskId, sub_80C8734, sub_80A9CC0); +} + +static void sub_80A9CC0(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_80C88AC, sub_80A9CDC); +} + +static void sub_80A9CDC(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_80C8E1C, sub_80A9D58); +} + +static void sub_80A9CF8(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers == FALSE) + { + DestroyTask(gTasks[taskId].data[10]); + DestroyTask(taskId); + CloseMenu(); + } +} + +static void sub_80A9D30(u8 taskId) +{ + sub_800832C(); + gTasks[taskId].func = sub_80A9CF8; +} + +static void sub_80A9D58(u8 taskId) +{ + int i; + u8 dest[4]; + + for (i = 0; i < 4; i++) + dest[i] = gTasks[taskId].data[5 + i]; + + gUnknown_0203869B = sub_80C4B34(dest); + sub_80AE82C((u8)gScriptContestCategory); + sub_80B0F28(0); + SetTaskFuncWithFollowupFunc(taskId, sub_80C8EBC, sub_80A9DBC); +} + +static void sub_80A9DBC(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_80C8F34, sub_80A9DD8); +} + +static void sub_80A9DD8(u8 taskId) +{ + DestroyTask(gTasks[taskId].data[10]); + DestroyTask(taskId); + CloseMenu(); +} + +static void sub_80A9E04(u8 taskId) +{ + if (gMain.newKeys == 2) + gTasks[(u8)gTasks[taskId].data[10]].func = sub_80A9D30; +} + +static void sub_80A9E3C(u8 taskId) +{ + u8 i; + + OpenLink(); + + for (i = 0; i < 4; i++) + gBlockRecvBuffer[i][0] = 255; + + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80A9E80; +} + +static void sub_80A9E80(u8 taskId) +{ + TaskFunc func; + + if (gTasks[taskId].data[0] < 10) + gTasks[taskId].data[0]++; + else + { + if (GetLinkPlayerCount_2() > 3) + { + gTasks[taskId].data[0] = 0; + + if (IsLinkMaster()) + { + func = sub_80A9ED8; + gTasks[taskId].func = (TaskFunc)func; + } + else + { + func = sub_80A9F10; + gTasks[taskId].func = (TaskFunc)func; + } + } + } +} + +static void sub_80A9ED8(u8 taskId) +{ + gTasks[taskId].data[0] = gTasks[taskId].data[0] + 1; + if ((gTasks[taskId].data[0]) == 101) + { + sub_8007F4C(); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80A9F10; + } +} + +static void sub_80A9F10(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers) + { + gContestPlayerMonIndex = GetMultiplayerId(); + if (GetLinkPlayerCount() == 4) + { + gIsLinkContest = 1; + SwitchTaskToFollowupFunc(taskId); + } + } +} + +static void sub_80A9F50(void) +{ + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP; + REG_DISPCNT |= DISPCNT_OBJ_ON | DISPCNT_BG0_ON; + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitWindowFromConfig(&gMenuWindow, &gWindowConfig_81E6C3C); + REG_MOSAIC = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + gUnknown_030042C0 = 0; + gUnknown_030041B4 = 0; + gUnknown_03004288 = 0; + gUnknown_03004280 = 0; + gUnknown_030041B0 = 0; + gUnknown_030041B8 = 0; +} + +static void sub_80A9FE4(void) +{ + u8 *addr; + u32 i; + u8 ptr[5]; + + memcpy(ptr, gMatsudaDebugMenu_UnknownByteArray, 5); + + addr = (void *)VRAM; + i = VRAM_SIZE; + + while (1) + { + DmaFill32(3, 0, addr, 0x1000); + addr += 0x1000; + i -= 0x1000; + if (i <= 0x1000) + { + DmaFill32(3, 0, addr, i); + break; + } + } + sub_80034D4((void *)VRAM, ptr); + LoadFontDefaultPalette(&gWindowConfig_81E6C3C); +} + +static void sub_80AA064(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); + if (gMain.newKeys == 4) + SetMainCallback2(sub_805469C); +} + +static void sub_80AA090(void) +{ + REG_BG0HOFS = gUnknown_030042A4; + REG_BG0VOFS = gUnknown_030042A0; + REG_BG1HOFS = gUnknown_030042C0; + REG_BG1VOFS = gUnknown_030041B4; + REG_BG2HOFS = gUnknown_03004288; + REG_BG2VOFS = gUnknown_03004280; + REG_BG3HOFS = gUnknown_030041B0; + REG_BG3VOFS = gUnknown_030041B8; + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_8089668(); +} + +static void sub_80AA10C(void) +{ + u8 i; + u8 zero; + u8 spriteId; + + gPaletteFade.bufferTransferDisabled = 1; + SetVBlankCallback(0); + sub_80A9F50(); + dp12_8087EA4(); + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + sub_80A9FE4(); + SetVBlankCallback(sub_80AA090); + SetMainCallback2(sub_80AA064); + gPaletteFade.bufferTransferDisabled = 0; + gUnknown_02038694 = 0; + + if (!(gContestMons[0].nickname[0])) + sub_80AE398(0, 0); + + sub_80AE098(gUnknown_02038694); + + for (i = 0; i < 6; i++) + { + sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList1[i], + (0xA * i + 0x2A), gMatsudaDebugMenuContestTopLeft[i][0], + gMatsudaDebugMenuContestTopLeft[i][1]); + } + + gScriptContestCategory = gScriptContestRank = 0; + zero = 0; // it's possible this was some assignment that matsuda used to quickly edit and test things without changing whats passed to the later functions. + sub_80AA5BC(zero); + sub_80AA5E8(gScriptContestRank); + sub_8003460(&gMenuWindow, gMatsudaDebugMenu_GoBackText, 0xD6, 0x12, 0x12); + sub_8003460(&gMenuWindow, gMatsudaDebugMenu_BattlePointsText, 0xDC, zero, 0xC); + LoadSpriteSheet(&gUnknown_083C92B4); + LoadSpritePalette(&gUnknown_083C92BC); + sub_80AA280(3); + sub_80AA658(3); + sub_80AA614(3, zero); + spriteId = CreateSprite(&gSpriteTemplate_83C92CC, gUnknown_083C9296[3], gUnknown_083C92A8[1], 5); + gSprites[spriteId].data0 = 1; + gSprites[spriteId].data1 = 1; + gSprites[spriteId].data2 = 3; + gSprites[spriteId].data3 = zero; // only this assignment of zero is necessary. other replacements of 0 with zero do not change the asm, compiler will treat it the same. +} + +void sub_80AA280(u8 var) // no? +{ + u8 i; + + FillWindowRect_DefaultPalette(&gMenuWindow, 0, 0, 0, 0x1E, 3); + StringCopy(unk_2000000, gMatsudaDebugMenu_StartText); + StringAppend(unk_2000000, &gUnknown_0203857D[var][0]); + + for (i = 0; i < 4; i++) + { + if (var == i) + { + sub_8003460(&gMenuWindow, unk_2000000, (10 * i + 2), gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]); + } + else + { + u8 *ptr = gUnknown_0203857D[i]; + sub_8003460(&gMenuWindow, ptr, (10 * i + 2), gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]); + } + } +} + +static void sub_80AA340(u8 var) +{ + ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].cool, STR_CONV_MODE_RIGHT_ALIGN, 3); + sub_8003460(&gMenuWindow, unk_2000000, 0x66, gUnknown_083C9282[0], gUnknown_083C9282[1]); +} + +static void sub_80AA388(u8 var) +{ + ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].cute, STR_CONV_MODE_RIGHT_ALIGN, 3); + sub_8003460(&gMenuWindow, unk_2000000, 0x6C, gUnknown_083C9282[2], gUnknown_083C9282[3]); +} + +static void sub_80AA3D0(u8 var) +{ + ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].beauty, STR_CONV_MODE_RIGHT_ALIGN, 3); + sub_8003460(&gMenuWindow, unk_2000000, 0x72, gUnknown_083C9282[4], gUnknown_083C9282[5]); +} + +static void sub_80AA418(u8 var) +{ + ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].smart, STR_CONV_MODE_RIGHT_ALIGN, 3); + sub_8003460(&gMenuWindow, unk_2000000, 0x78, gUnknown_083C9282[6], gUnknown_083C9282[7]); +} + +static void sub_80AA460(u8 var) +{ + ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].tough, STR_CONV_MODE_RIGHT_ALIGN, 3); + sub_8003460(&gMenuWindow, unk_2000000, 0x7E, gUnknown_083C9282[8], gUnknown_083C9282[9]); +} + +static void sub_80AA4A8(u8 var) +{ + ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].sheen, STR_CONV_MODE_RIGHT_ALIGN, 3); + sub_8003460(&gMenuWindow, unk_2000000, 0x84, gUnknown_083C9282[10], gUnknown_083C9282[11]); +} + +static void sub_80AA4F0(u8 var1, u8 var2) +{ + FillWindowRect_DefaultPalette(&gMenuWindow, 0, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1], gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1] + 1); + sub_8003460(&gMenuWindow, gMoveNames[gContestMons[var1].moves[var2]], 0x8A + var2 * 14, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1]); + ConvertIntToDecimalStringN(gStringVar1, gContestMons[var1].moves[var2], STR_CONV_MODE_LEADING_ZEROS, 3); + sub_8003460(&gMenuWindow, gStringVar1, 0xFA + var2 * 6, gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1]); +} + +static void sub_80AA5BC(u8 var) +{ + sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList2[var], 0xC2, 3, 0x12); +} + +void sub_80AA5E8(u8 var) +{ + sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList3[var], 0xE8, 3, 4); +} + +static void sub_80AA614(u8 var1, u8 var2) +{ + u16 var = sub_80AE770(var1, var2); + + ConvertIntToDecimalStringN(unk_2000000, var, STR_CONV_MODE_RIGHT_ALIGN, 3); + sub_8003460(&gMenuWindow, unk_2000000, 0xE2, 3, 0xC); +} + +void sub_80AA658(u8 var) +{ + u8 i; + + sub_80AA340(var); + sub_80AA388(var); + sub_80AA3D0(var); + sub_80AA418(var); + sub_80AA460(var); + sub_80AA4A8(var); + + for (i = 0; i < 4; i++) + sub_80AA4F0(var, i); +} + +void SetDebugMonForContest(void) +{ + SetMonData(&gPlayerParty[0], MON_DATA_COOL, &gContestMons[gContestPlayerMonIndex].cool); + SetMonData(&gPlayerParty[0], MON_DATA_CUTE, &gContestMons[gContestPlayerMonIndex].cute); + SetMonData(&gPlayerParty[0], MON_DATA_BEAUTY, &gContestMons[gContestPlayerMonIndex].beauty); + SetMonData(&gPlayerParty[0], MON_DATA_SMART, &gContestMons[gContestPlayerMonIndex].smart); + SetMonData(&gPlayerParty[0], MON_DATA_TOUGH, &gContestMons[gContestPlayerMonIndex].tough); + SetMonData(&gPlayerParty[0], MON_DATA_SHEEN, &gContestMons[gContestPlayerMonIndex].sheen); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[0]); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[1]); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[2]); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[3]); +} + +void sub_80AA754(struct Sprite *sprite) +{ + switch (gMain.newAndRepeatedKeys) + { + case DPAD_RIGHT: + case DPAD_LEFT: + sprite->data0 ^= 1; + break; + case DPAD_UP: + if (sprite->data1 == 0) + sprite->data1 = 8; + else + sprite->data1--; + break; + case DPAD_DOWN: + if (sprite->data1 == 8) + sprite->data1 = 0; + else + sprite->data1++; + break; + case A_BUTTON: + gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, 1); + sub_80AA614(sprite->data2, sprite->data3); + break; + case B_BUTTON: + gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, -1); + sub_80AA614(sprite->data2, sprite->data3); + break; + case R_BUTTON: + gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, 10); + sub_80AA614(sprite->data2, sprite->data3); + break; + case L_BUTTON: + gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, -10); + sub_80AA614(sprite->data2, sprite->data3); + break; + case START_BUTTON: + sub_80AAD08(sprite, 1); + break; + } + sprite->pos1.x = gUnknown_083C9296[sprite->data0 + sprite->data1 * 2]; + sprite->pos1.y = gUnknown_083C92A8[sprite->data1]; +} + +static void sub_80AA8A0(struct Sprite *sprite, s8 var1, u8 var2) +{ + if (var1 == 1) + { + sprite->data2 = var2; + sub_80AA280(var2); + sub_80AA658(sprite->data2); + } +} + +void sub_80AA8C8(struct Sprite *sprite, s8 var1) +{ + sub_80AA8A0(sprite, var1, 0); +} + +void sub_80AA8D8(struct Sprite *sprite, s8 var1) +{ + sub_80AA8A0(sprite, var1, 1); +} + +void sub_80AA8E8(struct Sprite *sprite, s8 var1) +{ + sub_80AA8A0(sprite, var1, 2); +} + +void sub_80AA8F8(struct Sprite *sprite, s8 var1) +{ + sub_80AA8A0(sprite, var1, 3); +} + +static u8 sub_80AA908(u32 a1, u8 a2, s8 a3) // first param is unused. +{ + s16 val = a2 + a3; + + if (val > 255) + val = 255; + else if (val < 0) + val = 0; + + return val; +} + +void sub_80AA930(struct Sprite *sprite, u8 var2) +{ + u8 val = sprite->data2; + + gContestMons[sprite->data2].cool = sub_80AA908(val, gContestMons[sprite->data2].cool, var2); + sub_80AA340(sprite->data2); +} + +void sub_80AA974(struct Sprite *sprite, u8 var2) +{ + u8 val = sprite->data2; + + gContestMons[sprite->data2].cute = sub_80AA908(val, gContestMons[sprite->data2].cute, var2); + sub_80AA388(sprite->data2); +} + +void sub_80AA9B8(struct Sprite *sprite, u8 var2) +{ + u8 val = sprite->data2; + + gContestMons[sprite->data2].beauty = sub_80AA908(val, gContestMons[sprite->data2].beauty, var2); + sub_80AA3D0(sprite->data2); +} + +void sub_80AA9FC(struct Sprite *sprite, u8 var2) +{ + u8 val = sprite->data2; + + gContestMons[sprite->data2].smart = sub_80AA908(val, gContestMons[sprite->data2].smart, var2); + sub_80AA418(sprite->data2); +} + +void sub_80AAA40(struct Sprite *sprite, u8 var2) +{ + u8 val = sprite->data2; + + gContestMons[sprite->data2].tough = sub_80AA908(val, gContestMons[sprite->data2].tough, var2); + sub_80AA460(sprite->data2); +} + +void sub_80AAA84(struct Sprite *sprite, u8 var2) +{ + u8 val = sprite->data2; + + gContestMons[sprite->data2].sheen = sub_80AA908(val, gContestMons[sprite->data2].sheen, var2); + sub_80AA4A8(sprite->data2); +} + +// a similar function is at 0x80AA908, however, it apparently returns the wrong type (u8 vs u16). +static u16 sub_80AAAC8(u32 a1, u16 a2, s8 a3) // first param is unused. +{ + s16 val = a2 + a3; + + if (val > 354) + val = 1; + else if (val < 0) + val = 354; + + return val; +} + +void sub_80AAAF0(struct Sprite *sprite, u8 var2) +{ + u8 val = sprite->data2; + + gContestMons[sprite->data2].moves[0] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[0], var2); + sub_80AA4F0(sprite->data2, 0); +} + +void sub_80AAB30(struct Sprite *sprite, u8 var2) +{ + u8 val = sprite->data2; + + gContestMons[sprite->data2].moves[1] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[1], var2); + sub_80AA4F0(sprite->data2, 1); +} + +void sub_80AAB70(struct Sprite *sprite, u8 var2) +{ + u8 val = sprite->data2; + + gContestMons[sprite->data2].moves[2] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[2], var2); + sub_80AA4F0(sprite->data2, 2); +} + +void sub_80AABB0(struct Sprite *sprite, u8 var2) +{ + u8 val = sprite->data2; + + gContestMons[sprite->data2].moves[3] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[3], var2); + sub_80AA4F0(sprite->data2, 3); +} + +void sub_80AABF0(struct Sprite *sprite, s8 var2) +{ + s8 a = (var2 > 0) ? 1 : -1; + s8 r4 = sprite->data3 + a; + + if (r4 < 0) + r4 = 0; + else if (r4 > 4) + r4 = 4; + sub_80AA5BC(r4); + sprite->data3 = r4; + gScriptContestCategory = sprite->data3; + sub_80AE398(sprite->data3, gScriptContestRank); + sub_80AA280(sprite->data2); + sub_80AA658(sprite->data2); +} + +void sub_80AAC5C(struct Sprite *sprite, s8 var2) +{ + if (var2 > 0) + gScriptContestRank++; + else if (gScriptContestRank != 0) + gScriptContestRank--; + if (gScriptContestRank > 3) + gScriptContestRank = 3; + sub_80AA5E8(gScriptContestRank); + sub_80AE398(gScriptContestCategory, gScriptContestRank); + sub_80AA280(sprite->data2); + sub_80AA658(sprite->data2); +} + +void sub_80AACC4(void) +{ + UpdatePaletteFade(); + if (!gPaletteFade.active) + { + SetDebugMonForContest(); + if (!(gIsLinkContest & 1)) + sub_80AE82C(unk_2000000[0]); + SetMainCallback2(sub_80AB47C); + } +} + +void sub_80AAD08(struct Sprite *sprite, s8 var2) +{ + if (var2 == 1) + { + unk_2000000[0] = sprite->data3; + SetMainCallback2(sub_80AACC4); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + } +} + +void sub_80AAD44(struct Sprite *sprite, s8 var2) +{ + if (var2 == 1) + { + int i; + + SetDebugMonForContest(); + for (i = 0; i < 4; i++) + gUnknown_02038670[i] = sub_80AE770(i, gScriptContestCategory); + SetMainCallback2(sub_805469C); + } +} + +//Do this later +/* +void sub_80AAD84(u8 *string, u8 b, u8 c, u8 d) +{ + u32 r5; + u16 r7; + u8 r7_2; + //u32 sp44; + //u32 sp48; + u32 sp58; + + gMain.state = 0; + + r5 = d + 1; + //Could also be DmaClear32 + DmaFill32(3, 0, (u8 *)VRAM + 0x18000 - r5 * 256, 0x100); + + r7 = StringLength(string); + if (r7 > 8) + r7 = 8; + sp58 = d * 2; + + //More stuff + + r7_2 = 0x7C - sp58; + +} +*/ + +__attribute__((naked)) +void sub_80AAD84(u8 *string, u8 b, u8 c, u8 d) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x64\n\ + mov r9, r0\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + str r1, [sp, 0x48]\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + str r2, [sp, 0x4C]\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + mov r10, r3\n\ + mov r5, r10\n\ + adds r5, 0x1\n\ + lsls r1, r5, 8\n\ + ldr r0, _080AAEC4 @ =0x06018000\n\ + subs r1, r0, r1\n\ + movs r0, 0\n\ + str r0, [sp, 0x44]\n\ + ldr r4, _080AAEC8 @ =0x040000d4\n\ + add r0, sp, 0x44\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + ldr r0, _080AAECC @ =0x85000040\n\ + str r0, [r4, 0x8]\n\ + ldr r0, [r4, 0x8]\n\ + mov r0, r9\n\ + bl StringLength\n\ + lsls r0, 16\n\ + lsrs r7, r0, 16\n\ + cmp r7, 0x8\n\ + bls _080AADD0\n\ + movs r7, 0x8\n\ +_080AADD0:\n\ + movs r6, 0\n\ + mov r8, r5\n\ + mov r1, r10\n\ + lsls r1, 1\n\ + str r1, [sp, 0x58]\n\ + ldr r2, [sp, 0x48]\n\ + adds r2, 0x20\n\ + str r2, [sp, 0x5C]\n\ + cmp r6, r7\n\ + bge _080AAE1E\n\ + add r5, sp, 0x40\n\ + add r0, sp, 0x20\n\ + mov r10, r0\n\ + ldr r2, _080AAEC4 @ =0x06018000\n\ +_080AADEC:\n\ + mov r1, r9\n\ + adds r0, r1, r6\n\ + ldrb r0, [r0]\n\ + strb r0, [r5]\n\ + movs r0, 0xFF\n\ + strb r0, [r5, 0x1]\n\ + mov r0, sp\n\ + adds r1, r5, 0\n\ + str r2, [sp, 0x60]\n\ + bl sub_80034D4\n\ + mov r1, r8\n\ + lsls r0, r1, 8\n\ + ldr r2, [sp, 0x60]\n\ + subs r0, r2, r0\n\ + mov r1, r10\n\ + str r1, [r4]\n\ + str r0, [r4, 0x4]\n\ + ldr r0, _080AAED0 @ =0x84000008\n\ + str r0, [r4, 0x8]\n\ + ldr r0, [r4, 0x8]\n\ + adds r2, 0x20\n\ + adds r6, 0x1\n\ + cmp r6, r7\n\ + blt _080AADEC\n\ +_080AAE1E:\n\ + movs r1, 0x7C\n\ + ldr r2, [sp, 0x58]\n\ + subs r1, r2\n\ + lsls r1, 24\n\ + lsrs r7, r1, 24\n\ + ldr r0, _080AAED4 @ =gMain\n\ + mov r9, r0\n\ + lsls r3, r7, 3\n\ + add r3, r9\n\ + ldr r0, _080AAED8 @ =gUnknown_083C9400\n\ + ldr r1, [r0]\n\ + ldr r2, [r0, 0x4]\n\ + str r1, [sp, 0x50]\n\ + str r2, [sp, 0x54]\n\ + str r1, [r3, 0x3C]\n\ + str r2, [r3, 0x40]\n\ + mov r2, r8\n\ + lsls r0, r2, 3\n\ + movs r1, 0x80\n\ + lsls r1, 3\n\ + adds r2, r1, 0\n\ + subs r2, r0\n\ + adds r6, r3, 0\n\ + adds r6, 0x40\n\ + ldr r0, _080AAEDC @ =0x000003ff\n\ + mov r8, r0\n\ + mov r1, r8\n\ + ands r2, r1\n\ + ldrh r5, [r6]\n\ + ldr r4, _080AAEE0 @ =0xfffffc00\n\ + adds r0, r4, 0\n\ + ands r0, r5\n\ + orrs r0, r2\n\ + strh r0, [r6]\n\ + ldrh r5, [r3, 0x3E]\n\ + ldr r2, _080AAEE4 @ =0xfffffe00\n\ + adds r0, r2, 0\n\ + ands r0, r5\n\ + ldr r1, [sp, 0x48]\n\ + orrs r0, r1\n\ + strh r0, [r3, 0x3E]\n\ + adds r3, 0x3C\n\ + add r0, sp, 0x4C\n\ + ldrb r0, [r0]\n\ + strb r0, [r3]\n\ + adds r1, r7, 0x1\n\ + lsls r1, 3\n\ + mov r0, r9\n\ + adds r7, r1, r0\n\ + ldr r0, [sp, 0x50]\n\ + ldr r1, [sp, 0x54]\n\ + str r0, [r7, 0x3C]\n\ + str r1, [r7, 0x40]\n\ + ldrh r0, [r6]\n\ + lsls r0, 22\n\ + lsrs r0, 22\n\ + adds r0, 0x4\n\ + adds r5, r7, 0\n\ + adds r5, 0x40\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldrh r3, [r5]\n\ + ands r4, r3\n\ + orrs r4, r0\n\ + strh r4, [r5]\n\ + ldrh r0, [r7, 0x3E]\n\ + ands r2, r0\n\ + ldr r0, [sp, 0x5C]\n\ + orrs r2, r0\n\ + strh r2, [r7, 0x3E]\n\ + adds r1, r7, 0\n\ + adds r1, 0x3C\n\ + add r2, sp, 0x4C\n\ + ldrb r2, [r2]\n\ + strb r2, [r1]\n\ + add sp, 0x64\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080AAEC4: .4byte 0x06018000\n\ +_080AAEC8: .4byte 0x040000d4\n\ +_080AAECC: .4byte 0x85000040\n\ +_080AAED0: .4byte 0x84000008\n\ +_080AAED4: .4byte gMain\n\ +_080AAED8: .4byte gUnknown_083C9400\n\ +_080AAEDC: .4byte 0x000003ff\n\ +_080AAEE0: .4byte 0xfffffc00\n\ +_080AAEE4: .4byte 0xfffffe00\n\ + .syntax divided\n"); +} + +void unref_sub_80AAEE8(s32 a, u8 b, u8 c, u8 d) +{ + u8 string[12]; + u8 offset = 0; + + if (a < 0) + { + string[0] = 0xAE; + offset = 1; + } + ConvertIntToDecimalStringN(string + offset, (a < 0) ? -a : a, 0, 8); + sub_80AAD84(string, b, c, d); +} + +void sub_80AAF30(void) +{ + s32 i; + + gUnknown_0203856C = 1; + gContestPlayerMonIndex = 3; + sub_80AE098(0); + + for (i = 3; i > -1; i--) + gUnknown_02038690[i] = 3 - i; + + for (i = 0; i < 3; i++) + { + gUnknown_02038670[i] = 0; + gUnknown_02038680[i] = 0; + gUnknown_02038678[i] = 0; + memcpy(&gContestMons[i], &gContestMons[3], sizeof(struct ContestPokemon)); + } + + gUnknown_02038670[3] = 0x12C; + gUnknown_02038680[3] = 0x190; + gUnknown_02038678[3] = 0x190; + sub_80B2A7C(0xFE); +} + +//Don't know size of return type +int MatsudaDebugMenu_SetHighScore(void) +{ + sub_80AAF30(); + CloseMenu(); + return 1; +} + +//Don't know size of return type +int MatsudaDebugMenu_ResetHighScore(void) +{ + s32 i; + + gUnknown_0203856C = 0; + for (i = 0; i < 4; i++) + { + gUnknown_02038670[i] = 0; + gUnknown_02038680[i] = 0; + gUnknown_02038678[i] = 0; + } + CloseMenu(); + return 1; +} + +//Don't know size of return type +int MatsudaDebugMenu_SetArtMuseumItems(void) +{ + s32 i; + + gContestPlayerMonIndex = 3; + sub_80AE098(0); + for (i = 3; i > -1; i--) + gUnknown_02038690[i] = 3 - i; + for (gScriptContestCategory = 0; gScriptContestCategory < 5; gScriptContestCategory++) + sub_80B2A7C(0xFF); + CloseMenu(); + return 1; +} + +void unref_sub_80AB084(u8 *text) +{ + u16 savedIme; + u8 *addr; + size_t size; + + 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_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT = 8; + ResetTasks(); + ResetSpriteData(); + SetMainCallback2(sub_80AB184); + + addr = (void *)VRAM; + size = 0x18000; + while (1) + { + DmaFill32(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaFill32(3, 0, addr, size); + break; + } + } + SetUpWindowConfig(&gWindowConfig_81E6FD8); + InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6FD8); + LoadFontDefaultPalette(&gWindowConfig_81E6FD8); + sub_8003460(&gUnknown_03004210, text, 1, 9, 7); +} + +void sub_80AB184(void) +{ + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; +} diff --git a/src/debug/mori_debug_menu.c b/src/debug/mori_debug_menu.c new file mode 100644 index 000000000..273191192 --- /dev/null +++ b/src/debug/mori_debug_menu.c @@ -0,0 +1,168 @@ +#include "global.h" +#include "mori_debug_menu.h" +#include "data2.h" +#include "daycare.h" +#include "learn_move.h" +#include "link.h" +#include "main.h" +#include "menu.h" +#include "pokeblock.h" +#include "start_menu.h" +#include "string_util.h" + +#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT) + +extern u8 (*gCallback_03004AE8)(void); + +u8 gUnknown_03004DA0[0x20]; + +extern u8 gUnknown_0839B22C[][3]; +extern u8 gUnknown_0839B24A[]; +extern u8 gUnknown_0839B24D[]; +extern u8 gUnknown_0839B255[]; +extern u8 gUnknown_0839B257[]; + +extern const struct MenuAction gMoriDebugMenuActions[]; + +void unref_sub_8083CF0(void) +{ + int i; + int id = SIO_MULTI_CNT->id; + gUnknown_03004DA0[0] = EOS; + StringAppend(gUnknown_03004DA0, gUnknown_0839B24A); + for (i = 0; i < 10; i++) + if ((word_3002910[id ^ 1] >> i) & 1) + StringAppend(gUnknown_03004DA0, gUnknown_0839B22C[i]); +} + +bool8 sub_8083D4C(void) +{ + if ( gMain.newKeys & A_BUTTON ) + { + CloseMenu(); + return TRUE; + } + else + return FALSE; +} + +u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr) +{ + u8 localPtr[52]; + u16 monData; + u16 var; + + monData = GetMonData(gPlayerParty, 11, ptr); + var = sub_8041870(monData); + StringCopy(localPtr, gSpeciesNames[monData]); + StringAppend(localPtr, gUnknown_0839B24D); + StringAppend(localPtr, gSpeciesNames[var]); + StringAppend(localPtr, gUnknown_0839B255); + MenuZeroFillScreen(); + MenuDrawTextWindow(0, 14, 30, 19); + MenuPrint(localPtr, 1, 15); + gCallback_03004AE8 = sub_8083D4C; + return 0; +} + +s8 MoriDebugMenu_Egg(void) +{ + if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) + sub_8041940(); + CloseMenu(); + + return 1; +} + +s8 MoriDebugMenu_MaleEgg(void) +{ + if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) + sub_8041950(); + CloseMenu(); + + return 1; +} + +s8 MoriDebugMenu_1000Steps(void) +{ + sub_8041790(1000); + CloseMenu(); + return 1; +} + +s8 MoriDebugMenu_10000Steps(void) +{ + sub_8041790(10000); + CloseMenu(); + return 1; +} + +s8 MoriDebugMenu_MoveTutor(void) +{ + sub_8132670(); + CloseMenu(); + return 1; +} + +s8 MoriDebugMenu_BreedEgg(void) +{ + u8 loopCounter; + + for (loopCounter = 0; loopCounter <= 5; loopCounter++) + { + //UB: Too few arguments for function 'GetMonData' + if ( GetMonData(&gPlayerParty[loopCounter], MON_DATA_IS_EGG) ) + { + u8 friendship = 0; + SetMonData(&gPlayerParty[loopCounter], MON_DATA_FRIENDSHIP, &friendship); + } + } + gSaveBlock1.filler_30B6 = -3; + CloseMenu(); + return 1; +} + +s8 MoriDebugMenu_LongName(void) +{ + SetMonData(gPlayerParty, MON_DATA_NICKNAME, gUnknown_0839B257); + CloseMenu(); + return 1; +} + +s8 MoriDebugMenu_PokeblockCase(void) +{ + s32 loopCounter; + + for (loopCounter = 0; loopCounter <= 39; loopCounter++) + sub_810CA6C(loopCounter); + + CloseMenu(); + return 1; +} + +bool8 MoriDebugMenuProcessInput(void) +{ + s8 choice = ProcessMenuInput(); + + switch (choice) + { + default: + gCallback_03004AE8 = gMoriDebugMenuActions[choice].func; + return FALSE; + case -2: + return FALSE; + case -1: + CloseMenu(); + return TRUE; + } +} + +s8 InitMoriDebugMenu(void) +{ + MenuZeroFillScreen(); + MenuDrawTextWindow(0, 0, 10, 19); + PrintMenuItems(1, 1, 9, gMoriDebugMenuActions); + InitMenu(0, 1, 1, 9, 0, 9); + gCallback_03004AE8 = MoriDebugMenuProcessInput; + return 0; +} diff --git a/src/debug/unknown_debug_menu.c b/src/debug/unknown_debug_menu.c new file mode 100644 index 000000000..a81625f2a --- /dev/null +++ b/src/debug/unknown_debug_menu.c @@ -0,0 +1,52 @@ +#include "global.h" +#include "menu.h" + +extern u8 gBattleCommunication[]; + +extern u8 (*gCallback_03004AE8)(void); + +extern const struct MenuAction gUnknown_0842C29C[]; + +static u8 sub_814A464(void); + +int unref_sub_814A414(void) +{ + MenuZeroFillScreen(); + MenuDrawTextWindow(0, 0, 16, 18); + PrintMenuItems(2, 1, 8, gUnknown_0842C29C); + InitMenu(0, 1, 1, 8, 0, 15); + gCallback_03004AE8 = sub_814A464; + return 0; +} + +static u8 sub_814A464(void) +{ + s8 result = ProcessMenuInput(); + if (result == -2) + { + return 0; + } + else if (result == -1) + { + CloseMenu(); + return 1; + } + else + { + gBattleCommunication[0] = result; + gCallback_03004AE8 = gUnknown_0842C29C[result].func; + return 0; + } +} + +u8 sub_814A4B8(void) +{ + gSaveBlock2.filler_A8.var_4AE[0] = 3; + gSaveBlock2.filler_A8.var_4AE[1] = 3; + gSaveBlock2.filler_A8.var_4B4 = gBattleCommunication[0] + 1; + gSaveBlock2.filler_A8.var_4B6 = gBattleCommunication[0] + 1; + gSaveBlock2.filler_A8.var_4B0 = 1; + gSaveBlock2.filler_A8.var_4B2 = 1; + CloseMenu(); + return 1; +} diff --git a/src/decompress.c b/src/decompress.c deleted file mode 100644 index d7f7087a7..000000000 --- a/src/decompress.c +++ /dev/null @@ -1,112 +0,0 @@ -#include "global.h" -#include "decompress.h" -#include "data2.h" -#include "species.h" -#include "text.h" - -#define WRAM 0x02000000 - -void sub_800D238(const void *src, void *dest) -{ - LZ77UnCompWram(src, dest); -} - -void LZDecompressVram(const void *src, void *dest) -{ - LZ77UnCompVram(src, dest); -} - -void LoadCompressedObjectPic(const struct CompressedSpriteSheet *src) -{ - struct SpriteSheet dest; - - LZ77UnCompWram(src->data, (void *)WRAM); - dest.data = (void *)WRAM; - dest.size = src->size; - dest.tag = src->tag; - LoadSpriteSheet(&dest); -} - -void LoadCompressedObjectPicOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) -{ - struct SpriteSheet dest; - - LZ77UnCompWram(src->data, buffer); - dest.data = buffer; - dest.size = src->size; - dest.tag = src->tag; - LoadSpriteSheet(&dest); -} - -void LoadCompressedObjectPalette(const struct CompressedSpritePalette *src) -{ - struct SpritePalette dest; - - LZ77UnCompWram(src->data, (void *)WRAM); - dest.data = (void *)WRAM; - dest.tag = src->tag; - LoadSpritePalette(&dest); -} - -void LoadCompressedObjectPaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer) -{ - struct SpritePalette dest; - - LZ77UnCompWram(a->data, buffer); - dest.data = buffer; - dest.tag = a->tag; - LoadSpritePalette(&dest); -} - -void DecompressPicFromTable_2(const struct CompressedSpriteSheet *src, u8 b, u8 c, void *d, void *buffer, s32 species) -{ - if (species > SPECIES_EGG) - LZ77UnCompWram(gMonFrontPicTable[0].data, buffer); - else - LZ77UnCompWram(src->data, buffer); -} - -void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g) -{ - u32 frontOrBack; - - // gUnknown_081FAF4C appears to be a list of pointers to locations to store poke pics for back and front pic here. the first and third pointers are used for back while the others are used for front. - if (dest == gUnknown_081FAF4C[0] || dest == gUnknown_081FAF4C[2]) - frontOrBack = 0; // backPic - else - frontOrBack = 1; // frontPic - - LoadSpecialPokePic(src, b, c, d, dest, species, g, frontOrBack); -} - -void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g, u32 frontOrBack) -{ - u8 frontOrBack8 = frontOrBack; - - if (species == SPECIES_UNOWN) - { - u16 i = (((g & 0x3000000) >> 18) | ((g & 0x30000) >> 12) | ((g & 0x300) >> 6) | (g & 3)) % 0x1C; - - // The other Unowns are separate from Unown A. - if (i == 0) - i = SPECIES_UNOWN; - else - i += SPECIES_UNOWN_B - 1; - - if (frontOrBack8 == 0) - LZ77UnCompWram(gMonBackPicTable[i].data, dest); - else - LZ77UnCompWram(gMonFrontPicTable[i].data, dest); - } - else if (species > SPECIES_EGG) // is species unknown? draw the ? icon - LZ77UnCompWram(gMonFrontPicTable[0].data, dest); - else - LZ77UnCompWram(src->data, dest); - - DrawSpindaSpots(species, g, dest, frontOrBack8); -} - -void Unused_LZDecompressWramIndirect(const void **src, void *dest) -{ - LZ77UnCompWram(*src, dest); -} diff --git a/src/decoration.c b/src/decoration.c deleted file mode 100644 index da33b3ab7..000000000 --- a/src/decoration.c +++ /dev/null @@ -1,4280 +0,0 @@ -#include "global.h" -#include "main.h" -#include "map_object_constants.h" -#include "rom4.h" -#include "sound.h" -#include "songs.h" -#include "string_util.h" -#include "menu.h" -#include "menu_helpers.h" -#include "strings.h" -#include "script.h" -#include "palette.h" -#include "field_player_avatar.h" -#include "field_camera.h" -#include "field_fadetransition.h" -#include "fieldmap.h" -#include "metatile_behavior.h" -#include "event_data.h" -#include "field_weather.h" -#include "decoration.h" - -EWRAM_DATA u8 *gUnknown_020388D0 = NULL; -EWRAM_DATA u8 gUnknown_020388D4 = 0; -EWRAM_DATA u8 gUnknown_020388D5 = 0; -EWRAM_DATA u8 gUnknown_020388D6[16] = {0}; -EWRAM_DATA u8 gUnknown_020388E6[12] = {0}; -EWRAM_DATA u8 gUnknown_020388F2 = 0; -EWRAM_DATA u8 gUnknown_020388F3 = 0; -EWRAM_DATA u8 gUnknown_020388F4 = 0; -EWRAM_DATA u8 gUnknown_020388F5 = 0; -EWRAM_DATA u8 gUnknown_020388F6 = 0; -EWRAM_DATA u8 gUnknown_020388F7[8] = {0}; -EWRAM_DATA struct UnkStruct_02038900 gUnknown_02038900 = {0}; -EWRAM_DATA u16 gUnknown_020391A4 = 0; -EWRAM_DATA u16 gUnknown_020391A6 = 0; -EWRAM_DATA u8 gUnknown_020391A8 = 0; -EWRAM_DATA u8 gUnknown_020391A9 = 0; -EWRAM_DATA u8 gUnknown_020391AA = 0; -EWRAM_DATA struct OamData gUnknown_020391AC = {0}; -EWRAM_DATA struct UnkStruct_020391B4 gUnknown_020391B4[16] = {0}; -EWRAM_DATA u8 gUnknown_02039234 = 0; - -#if ENGLISH -const u8 DecorDesc_SMALL_DESK[] = _( - "A small desk built\n" - "for one."); - -const u8 DecorDesc_POKEMON_DESK[] = _( - "A small desk built in\n" - "the shape of a POKé\n" - "BALL."); - -const u8 DecorDesc_HEAVY_DESK[] = _( - "A large desk made\n" - "of steel. Put some\n" - "decorations on it."); - -const u8 DecorDesc_RAGGED_DESK[] = _( - "A large desk made\n" - "of wood. Put some\n" - "decorations on it."); - -const u8 DecorDesc_COMFORT_DESK[] = _( - "A large desk made\n" - "of leaves. Put some\n" - "decorations on it."); - -const u8 DecorDesc_PRETTY_DESK[] = _( - "A huge desk made\n" - "of glass. Holds lots\n" - "of decorations."); - -const u8 DecorDesc_BRICK_DESK[] = _( - "A huge desk made\n" - "of brick. Holds lots\n" - "of decorations."); - -const u8 DecorDesc_CAMP_DESK[] = _( - "A huge desk made\n" - "of logs. Put lots of\n" - "decorations on it."); - -const u8 DecorDesc_HARD_DESK[] = _( - "A huge desk made\n" - "of rocks. Holds\n" - "many decorations."); - -const u8 DecorDesc_SMALL_CHAIR[] = _( - "A small chair made\n" - "for one."); - -const u8 DecorDesc_POKEMON_CHAIR[] = _( - "A small chair built\n" - "in the shape of a\n" - "POKé BALL."); - -const u8 DecorDesc_HEAVY_CHAIR[] = _( - "A small chair made\n" - "of steel."); - -const u8 DecorDesc_PRETTY_CHAIR[] = _( - "A small chair made\n" - "of glass."); - -const u8 DecorDesc_COMFORT_CHAIR[] = _( - "A small chair made\n" - "of leaves."); - -const u8 DecorDesc_RAGGED_CHAIR[] = _( - "A small chair made\n" - "of wood."); - -const u8 DecorDesc_BRICK_CHAIR[] = _( - "A small chair made\n" - "of brick."); - -const u8 DecorDesc_CAMP_CHAIR[] = _( - "A small chair made\n" - "of logs."); - -const u8 DecorDesc_HARD_CHAIR[] = _( - "A small chair made\n" - "of rock."); - -const u8 DecorDesc_RED_PLANT[] = _( - "A vivid red potted\n" - "plant."); - -const u8 DecorDesc_TROPICAL_PLANT[] = _( - "A flowering tropical\n" - "plant in a pot."); - -const u8 DecorDesc_PRETTY_FLOWERS[] = _( - "A pot of cute\n" - "flowers."); - -const u8 DecorDesc_COLORFUL_PLANT[] = _( - "A large pot with\n" - "many colorful\n" - "flowers."); - -const u8 DecorDesc_BIG_PLANT[] = _( - "A large, umbrella-\n" - "shaped plant in a\n" - "big pot."); - -const u8 DecorDesc_GORGEOUS_PLANT[] = _( - "A large, impressive\n" - "plant in a big pot."); - -const u8 DecorDesc_RED_BRICK[] = _( - "A red-colored brick.\n" - "Decorations can be\n" - "placed on top."); - -const u8 DecorDesc_YELLOW_BRICK[] = _( - "A yellow-colored\n" - "brick. Put some\n" - "decorations on top."); - -const u8 DecorDesc_BLUE_BRICK[] = _( - "A blue-colored\n" - "brick. Put some\n" - "decorations on top."); - -const u8 DecorDesc_RED_BALLOON[] = _( - "A red balloon filled\n" - "with water. Bursts\n" - "if stepped on."); - -const u8 DecorDesc_BLUE_BALLOON[] = _( - "A blue balloon filled\n" - "with water. Bursts\n" - "if stepped on."); - -const u8 DecorDesc_YELLOW_BALLOON[] = _( - "A yellow balloon\n" - "filled with water.\n" - "Pops if stepped on."); - -const u8 DecorDesc_RED_TENT[] = _( - "A large red tent.\n" - "You can hide inside\n" - "it."); - -const u8 DecorDesc_BLUE_TENT[] = _( - "A large blue tent.\n" - "You can hide inside\n" - "it."); - -const u8 DecorDesc_SOLID_BOARD[] = _( - "Place over a hole to\n" - "cross to the other\n" - "side."); - -const u8 DecorDesc_SLIDE[] = _( - "Use to slide down\n" - "from the platform."); - -const u8 DecorDesc_FENCE_LENGTH[] = _( - "A small fence that\n" - "blocks passage."); - -const u8 DecorDesc_FENCE_WIDTH[] = _( - "A small fence that\n" - "blocks passage."); - -const u8 DecorDesc_TIRE[] = _( - "An old large tire.\n" - "Decorations can be\n" - "placed on top."); - -const u8 DecorDesc_STAND[] = _( - "A large pedestal\n" - "with steps."); - -const u8 DecorDesc_MUD_BALL[] = _( - "A large ball of mud.\n" - "Crumbles if stepped\n" - "on."); - -const u8 DecorDesc_BREAKABLE_DOOR[] = _( - "A weird door that\n" - "people can walk\n" - "right through."); - -const u8 DecorDesc_SAND_ORNAMENT[] = _( - "An ornament made\n" - "of sand. Crumbles if\n" - "touched."); - -const u8 DecorDesc_SILVER_SHIELD[] = _( - "Awarded for 50\n" - "straight wins at\n" - "the BATTLE TOWER."); - -const u8 DecorDesc_GOLD_SHIELD[] = _( - "Awarded for 100\n" - "straight wins at\n" - "the BATTLE TOWER."); - -const u8 DecorDesc_GLASS_ORNAMENT[] = _( - "A glass replica of\n" - "a famous sculpture\n" - "at the ART MUSEUM."); - -const u8 DecorDesc_TV[] = _( - "A small, gray-\n" - "colored toy TV."); - -const u8 DecorDesc_ROUND_TV[] = _( - "A toy TV modeled\n" - "in the image of a\n" - "SEEDOT."); - -const u8 DecorDesc_CUTE_TV[] = _( - "A toy TV modeled\n" - "in the image of a\n" - "SKITTY."); - -const u8 DecorDesc_GLITTER_MAT[] = _( - "An odd mat that\n" - "glitters if stepped\n" - "on."); - -const u8 DecorDesc_JUMP_MAT[] = _( - "A trick mat that\n" - "jumps when it is\n" - "stepped on."); - -const u8 DecorDesc_SPIN_MAT[] = _( - "A trick mat that\n" - "spins around when\n" - "stepped on."); - -const u8 DecorDesc_C_LOW_NOTE_MAT[] = _( - "A mat that plays\n" - "a low C note when\n" - "stepped on."); - -const u8 DecorDesc_D_NOTE_MAT[] = _( - "A mat that plays\n" - "a D note when\n" - "stepped on."); - -const u8 DecorDesc_E_NOTE_MAT[] = _( - "A mat that plays\n" - "an E note when\n" - "stepped on."); - -const u8 DecorDesc_F_NOTE_MAT[] = _( - "A mat that plays\n" - "an F note when\n" - "stepped on."); - -const u8 DecorDesc_G_NOTE_MAT[] = _( - "A mat that plays\n" - "a G note when\n" - "stepped on."); - -const u8 DecorDesc_A_NOTE_MAT[] = _( - "A mat that plays\n" - "an A note when\n" - "stepped on."); - -const u8 DecorDesc_B_NOTE_MAT[] = _( - "A mat that plays\n" - "a B note when\n" - "stepped on."); - -const u8 DecorDesc_C_HIGH_NOTE_MAT[] = _( - "A mat that plays\n" - "a high C note when\n" - "stepped on."); - -const u8 DecorDesc_SURF_MAT[] = _( - "A mat designed with\n" - "a SURF image.\n" - "Put items on top."); - -const u8 DecorDesc_THUNDER_MAT[] = _( - "A mat designed with\n" - "a THUNDER image.\n" - "Put items on top."); - -const u8 DecorDesc_FIRE_BLAST_MAT[] = _( - "A mat designed with\n" - "a FIRE BLAST image.\n" - "Put items on top."); - -const u8 DecorDesc_POWDER_SNOW_MAT[] = _( - "A mat with a POWDER\n" - "SNOW image design.\n" - "Put items on top."); - -const u8 DecorDesc_ATTRACT_MAT[] = _( - "A mat designed with\n" - "an ATTRACT image.\n" - "Put items on top."); - -const u8 DecorDesc_FISSURE_MAT[] = _( - "A mat designed with\n" - "a FISSURE image.\n" - "Put items on top."); - -const u8 DecorDesc_SPIKES_MAT[] = _( - "A mat designed with\n" - "a SPIKES image.\n" - "Put items on top."); - -const u8 DecorDesc_BALL_POSTER[] = _( - "A small poster\n" - "printed with POKé\n" - "BALLS."); - -const u8 DecorDesc_GREEN_POSTER[] = _( - "A small poster with\n" - "a TREECKO print."); - -const u8 DecorDesc_RED_POSTER[] = _( - "A small poster with\n" - "a TORCHIC print."); - -const u8 DecorDesc_BLUE_POSTER[] = _( - "A small poster with\n" - "a MUDKIP print."); - -const u8 DecorDesc_CUTE_POSTER[] = _( - "A small poster with\n" - "an AZURILL print."); - -const u8 DecorDesc_PIKA_POSTER[] = _( - "A large poster with\n" - "a PIKACHU and\n" - "PICHU print."); - -const u8 DecorDesc_LONG_POSTER[] = _( - "A large poster with\n" - "a SEVIPER print."); - -const u8 DecorDesc_SEA_POSTER[] = _( - "A large poster with\n" - "a RELICANTH print."); - -const u8 DecorDesc_SKY_POSTER[] = _( - "A large poster with\n" - "a WINGULL print."); - -const u8 DecorDesc_KISS_POSTER[] = _( - "A large poster with\n" - "a SMOOCHUM print."); - -const u8 DecorDesc_PICHU_DOLL[] = _( - "A PICHU doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_PIKACHU_DOLL[] = _( - "A PIKACHU doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_MARILL_DOLL[] = _( - "A MARILL doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_TOGEPI_DOLL[] = _( -#if REVISION >= 1 - "A TOGEPI doll.\n" -#else - "A TOPGEPI doll.\n" -#endif - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_CYNDAQUIL_DOLL[] = _( - "A CYNDAQUIL doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_CHIKORITA_DOLL[] = _( - "A CHIKORITA doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_TOTODILE_DOLL[] = _( - "A TOTODILE doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_JIGGLYPUFF_DOLL[] = _( - "A JIGGLYPUFF doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_MEOWTH_DOLL[] = _( - "A MEOWTH doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_CLEFAIRY_DOLL[] = _( - "A CLEFAIRY doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_DITTO_DOLL[] = _( - "A DITTO doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_SMOOCHUM_DOLL[] = _( - "A SMOOCHUM doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_TREECKO_DOLL[] = _( - "A TREECKO doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_TORCHIC_DOLL[] = _( - "A TORCHIC doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_MUDKIP_DOLL[] = _( - "A MUDKIP doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_DUSKULL_DOLL[] = _( - "A DUSKULL doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_WYNAUT_DOLL[] = _( - "A WYNAUT doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_BALTOY_DOLL[] = _( - "A BALTOY doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_KECLEON_DOLL[] = _( - "A KECLEON doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_AZURILL_DOLL[] = _( - "An AZURILL doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_SKITTY_DOLL[] = _( - "A SKITTY doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_SWABLU_DOLL[] = _( - "A SWABLU doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_GULPIN_DOLL[] = _( - "A GULPIN doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_LOTAD_DOLL[] = _( - "A LOTAD doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_SEEDOT_DOLL[] = _( - "A SEEDOT doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_PIKA_CUSHION[] = _( - "A PIKACHU cushion.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_ROUND_CUSHION[] = _( - "A MARILL cushion.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_KISS_CUSHION[] = _( - "A SMOOCHUM\n" - "cushion. Place it on\n" - "a mat or a desk."); - -const u8 DecorDesc_ZIGZAG_CUSHION[] = _( - "A ZIGZAGOON\n" - "cushion. Place it on\n" - "a mat or a desk."); - -const u8 DecorDesc_SPIN_CUSHION[] = _( - "A SPINDA cushion.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_DIAMOND_CUSHION[] = _( - "A SABLEYE cushion.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_BALL_CUSHION[] = _( - "A BALL cushion.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_GRASS_CUSHION[] = _( - "A grass-mark\n" - "cushion. Place it on\n" - "a mat or a desk."); - -const u8 DecorDesc_FIRE_CUSHION[] = _( - "A fire-mark\n" - "cushion. Place it on\n" - "a mat or a desk."); - -const u8 DecorDesc_WATER_CUSHION[] = _( - "A water-mark\n" - "cushion. Place it on\n" - "a mat or a desk."); - -const u8 DecorDesc_SNORLAX_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_RHYDON_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_LAPRAS_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_VENUSAUR_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_CHARIZARD_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_BLASTOISE_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_WAILMER_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_REGIROCK_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_REGICE_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_REGISTEEL_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); -#elif GERMAN -#include "data/decoration/descriptions_de.h" -#endif - -const u16 DecorGfx_SMALL_DESK[] = { - 0x87 -}; - -const u16 DecorGfx_POKEMON_DESK[] = { - 0x8F -}; - -const u16 DecorGfx_HEAVY_DESK[] = { - 0x90, - 0x91, - 0x92, - 0x98, - 0x99, - 0x9A -}; - -const u16 DecorGfx_RAGGED_DESK[] = { - 0x93, - 0x94, - 0x95, - 0x9B, - 0x9C, - 0x9D -}; - -const u16 DecorGfx_COMFORT_DESK[] = { - 0x96, - 0x97, - 0xA3, - 0x9E, - 0x9F, - 0xAB -}; - -const u16 DecorGfx_PRETTY_DESK[] = { - 0xBD, - 0xBE, - 0xBF, - 0xC5, - 0xC6, - 0xC7, - 0xCD, - 0xCE, - 0xCF -}; - -const u16 DecorGfx_BRICK_DESK[] = { - 0xA0, - 0xA1, - 0xA2, - 0xA8, - 0xA9, - 0xAA, - 0xB0, - 0xB1, - 0xB2 -}; - -const u16 DecorGfx_CAMP_DESK[] = { - 0xA4, - 0xA5, - 0xA6, - 0xAC, - 0xAD, - 0xAE, - 0xB4, - 0xB5, - 0xB6 -}; - -const u16 DecorGfx_HARD_DESK[] = { - 0xA7, - 0xBB, - 0xBC, - 0xAF, - 0xC3, - 0xC4, - 0xB7, - 0xCB, - 0xCC -}; - -const u16 DecorGfx_SMALL_CHAIR[] = { - 0xB8 -}; - -const u16 DecorGfx_POKEMON_CHAIR[] = { - 0xB9 -}; - -const u16 DecorGfx_HEAVY_CHAIR[] = { - 0xBA -}; - -const u16 DecorGfx_PRETTY_CHAIR[] = { - 0xC0 -}; - -const u16 DecorGfx_COMFORT_CHAIR[] = { - 0xC1 -}; - -const u16 DecorGfx_RAGGED_CHAIR[] = { - 0xC2 -}; - -const u16 DecorGfx_BRICK_CHAIR[] = { - 0xC8 -}; - -const u16 DecorGfx_CAMP_CHAIR[] = { - 0xC9 -}; - -const u16 DecorGfx_HARD_CHAIR[] = { - 0xCA -}; - -const u16 DecorGfx_RED_PLANT[] = { - 0xD0, - 0xD8 -}; - -const u16 DecorGfx_TROPICAL_PLANT[] = { - 0xD2, - 0xDA -}; - -const u16 DecorGfx_PRETTY_FLOWERS[] = { - 0xD4, - 0xDC -}; - -const u16 DecorGfx_COLORFUL_PLANT[] = { - 0xE0, - 0xE2, - 0xE8, - 0xE9 -}; - -const u16 DecorGfx_BIG_PLANT[] = { - 0xE4, - 0xE6, - 0xEC, - 0xED -}; - -const u16 DecorGfx_GORGEOUS_PLANT[] = { - 0xF0, - 0xF2, - 0xF8, - 0xF9 -}; - -const u16 DecorGfx_RED_BRICK[] = { - 0x25, - 0x2D -}; - -const u16 DecorGfx_YELLOW_BRICK[] = { - 0x26, - 0x2E -}; - -const u16 DecorGfx_BLUE_BRICK[] = { - 0x27, - 0x2F -}; - -const u16 DecorGfx_RED_BALLOON[] = { - 0x138 -}; - -const u16 DecorGfx_BLUE_BALLOON[] = { - 0x13C -}; - -const u16 DecorGfx_YELLOW_BALLOON[] = { - 0x140 -}; - -const u16 DecorGfx_RED_TENT[] = { - 0x30, - 0x31, - 0x32, - 0x38, - 0x39, - 0x3A, - 0x40, - 0x41, - 0x3B -}; - -const u16 DecorGfx_BLUE_TENT[] = { - 0x48, - 0x49, - 0x68, - 0x50, - 0x51, - 0x70, - 0x58, - 0x59, - 0x69 -}; - -const u16 DecorGfx_SOLID_BOARD[] = { - 0x34, - 0x3C -}; - -const u16 DecorGfx_SLIDE[] = { - 0x35, - 0x36, - 0x3D, - 0x3E, - 0x63, - 0x64, - 0x6F, - 0x77 -}; - -const u16 DecorGfx_FENCE_LENGTH[] = { - 0x33 -}; - -const u16 DecorGfx_FENCE_WIDTH[] = { - 0x2C -}; - -const u16 DecorGfx_TIRE[] = { - 0x80, - 0x81, - 0x88, - 0x89 -}; - -const u16 DecorGfx_STAND[] = { - 0x6A, - 0x6B, - 0x6C, - 0x6D, - 0x72, - 0x73, - 0x74, - 0x75 -}; - -const u16 DecorGfx_MUD_BALL[] = { - 0x28 -}; - -const u16 DecorGfx_BREAKABLE_DOOR[] = { - 0x37, - 0x3F -}; - -const u16 DecorGfx_SAND_ORNAMENT[] = { - 0x85, - 0x8D -}; - -const u16 DecorGfx_SILVER_SHIELD[] = { - 0xD6, - 0xDE -}; - -const u16 DecorGfx_GOLD_SHIELD[] = { - 0x12E, - 0x136 -}; - -const u16 DecorGfx_GLASS_ORNAMENT[] = { - 0x82, - 0x8A -}; - -const u16 DecorGfx_TV[] = { - 0xF4 -}; - -const u16 DecorGfx_ROUND_TV[] = { - 0xF5 -}; - -const u16 DecorGfx_CUTE_TV[] = { - 0xF6 -}; - -const u16 DecorGfx_GLITTER_MAT[] = { - 0x60 -}; - -const u16 DecorGfx_JUMP_MAT[] = { - 0x61 -}; - -const u16 DecorGfx_SPIN_MAT[] = { - 0x62 -}; - -const u16 DecorGfx_C_LOW_NOTE_MAT[] = { - 0x78 -}; - -const u16 DecorGfx_D_NOTE_MAT[] = { - 0x79 -}; - -const u16 DecorGfx_E_NOTE_MAT[] = { - 0x7A -}; - -const u16 DecorGfx_F_NOTE_MAT[] = { - 0x7B -}; - -const u16 DecorGfx_G_NOTE_MAT[] = { - 0x7C -}; - -const u16 DecorGfx_A_NOTE_MAT[] = { - 0x7D -}; - -const u16 DecorGfx_B_NOTE_MAT[] = { - 0x7E -}; - -const u16 DecorGfx_C_HIGH_NOTE_MAT[] = { - 0xB3 -}; - -const u16 DecorGfx_SURF_MAT[] = { - 0x42, - 0x43, - 0x44, - 0x4A, - 0x4B, - 0x4C, - 0x52, - 0x53, - 0x54 -}; - -const u16 DecorGfx_THUNDER_MAT[] = { - 0x45, - 0x46, - 0x47, - 0x4D, - 0x4E, - 0x4F, - 0x55, - 0x56, - 0x57 -}; - -const u16 DecorGfx_FIRE_BLAST_MAT[] = { - 0x5A, - 0x5B, - 0x5C, - 0x5D, - 0x5E, - 0x5F, - 0x65, - 0x66, - 0x67 -}; - -const u16 DecorGfx_POWDER_SNOW_MAT[] = { - 0x100, - 0x101, - 0x102, - 0x108, - 0x109, - 0x10A, - 0x110, - 0x111, - 0x112 -}; - -const u16 DecorGfx_ATTRACT_MAT[] = { - 0x103, - 0x104, - 0x105, - 0x10B, - 0x10C, - 0x10D, - 0x113, - 0x114, - 0x115 -}; - -const u16 DecorGfx_FISSURE_MAT[] = { - 0x106, - 0x107, - 0x118, - 0x10E, - 0x10F, - 0x120, - 0x116, - 0x117, - 0x128 -}; - -const u16 DecorGfx_SPIKES_MAT[] = { - 0x119, - 0x11A, - 0x11B, - 0x121, - 0x122, - 0x123, - 0x129, - 0x12A, - 0x12B -}; - -const u16 DecorGfx_BALL_POSTER[] = { - 0x130 -}; - -const u16 DecorGfx_GREEN_POSTER[] = { - 0x131 -}; - -const u16 DecorGfx_RED_POSTER[] = { - 0x132 -}; - -const u16 DecorGfx_BLUE_POSTER[] = { - 0x133 -}; - -const u16 DecorGfx_CUTE_POSTER[] = { - 0x134 -}; - -const u16 DecorGfx_PIKA_POSTER[] = { - 0x11C, - 0x11D -}; - -const u16 DecorGfx_LONG_POSTER[] = { - 0x11E, - 0x11F -}; - -const u16 DecorGfx_SEA_POSTER[] = { - 0x124, - 0x125 -}; - -const u16 DecorGfx_SKY_POSTER[] = { - 0x126, - 0x127 -}; - -const u16 DecorGfx_KISS_POSTER[] = { - 0x12C, - 0x12D -}; - -const u16 DecorGfx_PICHU_DOLL[] = { - MAP_OBJ_GFX_PICHU_DOLL -}; - -const u16 DecorGfx_PIKACHU_DOLL[] = { - MAP_OBJ_GFX_PIKACHU_DOLL -}; - -const u16 DecorGfx_MARILL_DOLL[] = { - MAP_OBJ_GFX_MARILL_DOLL -}; - -const u16 DecorGfx_TOGEPI_DOLL[] = { - MAP_OBJ_GFX_TOGEPI_DOLL -}; - -const u16 DecorGfx_CYNDAQUIL_DOLL[] = { - MAP_OBJ_GFX_CYNDAQUIL_DOLL -}; - -const u16 DecorGfx_CHIKORITA_DOLL[] = { - MAP_OBJ_GFX_CHIKORITA_DOLL -}; - -const u16 DecorGfx_TOTODILE_DOLL[] = { - MAP_OBJ_GFX_TOTODILE_DOLL -}; - -const u16 DecorGfx_JIGGLYPUFF_DOLL[] = { - MAP_OBJ_GFX_JIGGLYPUFF_DOLL -}; - -const u16 DecorGfx_MEOWTH_DOLL[] = { - MAP_OBJ_GFX_MEOWTH_DOLL -}; - -const u16 DecorGfx_CLEFAIRY_DOLL[] = { - MAP_OBJ_GFX_CLEFAIRY_DOLL -}; - -const u16 DecorGfx_DITTO_DOLL[] = { - MAP_OBJ_GFX_DITTO_DOLL -}; - -const u16 DecorGfx_SMOOCHUM_DOLL[] = { - MAP_OBJ_GFX_SMOOCHUM_DOLL -}; - -const u16 DecorGfx_TREECKO_DOLL[] = { - MAP_OBJ_GFX_TREECKO_DOLL -}; - -const u16 DecorGfx_TORCHIC_DOLL[] = { - MAP_OBJ_GFX_TORCHIC_DOLL -}; - -const u16 DecorGfx_MUDKIP_DOLL[] = { - MAP_OBJ_GFX_MUDKIP_DOLL -}; - -const u16 DecorGfx_DUSKULL_DOLL[] = { - MAP_OBJ_GFX_DUSKULL_DOLL -}; - -const u16 DecorGfx_WYNAUT_DOLL[] = { - MAP_OBJ_GFX_WYNAUT_DOLL -}; - -const u16 DecorGfx_BALTOY_DOLL[] = { - MAP_OBJ_GFX_BALTOY_DOLL -}; - -const u16 DecorGfx_KECLEON_DOLL[] = { - MAP_OBJ_GFX_KECLEON_DOLL -}; - -const u16 DecorGfx_AZURILL_DOLL[] = { - MAP_OBJ_GFX_AZURILL_DOLL -}; - -const u16 DecorGfx_SKITTY_DOLL[] = { - MAP_OBJ_GFX_SKITTY_DOLL -}; - -const u16 DecorGfx_SWABLU_DOLL[] = { - MAP_OBJ_GFX_SWABLU_DOLL -}; - -const u16 DecorGfx_GULPIN_DOLL[] = { - MAP_OBJ_GFX_GULPIN_DOLL -}; - -const u16 DecorGfx_LOTAD_DOLL[] = { - MAP_OBJ_GFX_LOTAD_DOLL -}; - -const u16 DecorGfx_SEEDOT_DOLL[] = { - MAP_OBJ_GFX_SEEDOT_DOLL -}; - -const u16 DecorGfx_PIKA_CUSHION[] = { - MAP_OBJ_GFX_PIKA_CUSHION -}; - -const u16 DecorGfx_ROUND_CUSHION[] = { - MAP_OBJ_GFX_ROUND_CUSHION -}; - -const u16 DecorGfx_KISS_CUSHION[] = { - MAP_OBJ_GFX_KISS_CUSHION -}; - -const u16 DecorGfx_ZIGZAG_CUSHION[] = { - MAP_OBJ_GFX_ZIGZAG_CUSHION -}; - -const u16 DecorGfx_SPIN_CUSHION[] = { - MAP_OBJ_GFX_SPIN_CUSHION -}; - -const u16 DecorGfx_DIAMOND_CUSHION[] = { - MAP_OBJ_GFX_DIAMOND_CUSHION -}; - -const u16 DecorGfx_BALL_CUSHION[] = { - MAP_OBJ_GFX_BALL_CUSHION -}; - -const u16 DecorGfx_GRASS_CUSHION[] = { - MAP_OBJ_GFX_GRASS_CUSHION -}; - -const u16 DecorGfx_FIRE_CUSHION[] = { - MAP_OBJ_GFX_FIRE_CUSHION -}; - -const u16 DecorGfx_WATER_CUSHION[] = { - MAP_OBJ_GFX_WATER_CUSHION -}; - -const u16 DecorGfx_SNORLAX_DOLL[] = { - MAP_OBJ_GFX_BIG_SNORLAX_DOLL -}; - -const u16 DecorGfx_RHYDON_DOLL[] = { - MAP_OBJ_GFX_BIG_RHYDON_DOLL -}; - -const u16 DecorGfx_LAPRAS_DOLL[] = { - MAP_OBJ_GFX_BIG_LAPRAS_DOLL -}; - -const u16 DecorGfx_VENUSAUR_DOLL[] = { - MAP_OBJ_GFX_BIG_VENUSAUR_DOLL -}; - -const u16 DecorGfx_CHARIZARD_DOLL[] = { - MAP_OBJ_GFX_BIG_CHARIZARD_DOLL -}; - -const u16 DecorGfx_BLASTOISE_DOLL[] = { - MAP_OBJ_GFX_BIG_BLASTOISE_DOLL -}; - -const u16 DecorGfx_WAILMER_DOLL[] = { - MAP_OBJ_GFX_BIG_WAILMER_DOLL -}; - -const u16 DecorGfx_REGIROCK_DOLL[] = { - MAP_OBJ_GFX_BIG_REGIROCK_DOLL -}; - -const u16 DecorGfx_REGICE_DOLL[] = { - MAP_OBJ_GFX_BIG_REGICE_DOLL -}; - -const u16 DecorGfx_REGISTEEL_DOLL[] = { - MAP_OBJ_GFX_BIG_REGISTEEL_DOLL -}; - -#if ENGLISH -const struct Decoration gDecorations[] = { - {DECOR_NONE, _("SMALL DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 0, DecorDesc_SMALL_DESK, DecorGfx_SMALL_DESK}, - {DECOR_SMALL_DESK, _("SMALL DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 3000, DecorDesc_SMALL_DESK, DecorGfx_SMALL_DESK}, - {DECOR_POKEMON_DESK, _("POKéMON DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 3000, DecorDesc_POKEMON_DESK, DecorGfx_POKEMON_DESK}, - {DECOR_HEAVY_DESK, _("HEAVY DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_HEAVY_DESK, DecorGfx_HEAVY_DESK}, - {DECOR_RAGGED_DESK, _("RAGGED DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_RAGGED_DESK, DecorGfx_RAGGED_DESK}, - {DECOR_COMFORT_DESK, _("COMFORT DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_COMFORT_DESK, DecorGfx_COMFORT_DESK}, - {DECOR_PRETTY_DESK, _("PRETTY DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_PRETTY_DESK, DecorGfx_PRETTY_DESK}, - {DECOR_BRICK_DESK, _("BRICK DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_BRICK_DESK, DecorGfx_BRICK_DESK}, - {DECOR_CAMP_DESK, _("CAMP DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_CAMP_DESK, DecorGfx_CAMP_DESK}, - {DECOR_HARD_DESK, _("HARD DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_HARD_DESK, DecorGfx_HARD_DESK}, - {DECOR_SMALL_CHAIR, _("SMALL CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_SMALL_CHAIR, DecorGfx_SMALL_CHAIR}, - {DECOR_POKEMON_CHAIR, _("POKéMON CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_POKEMON_CHAIR, DecorGfx_POKEMON_CHAIR}, - {DECOR_HEAVY_CHAIR, _("HEAVY CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_HEAVY_CHAIR, DecorGfx_HEAVY_CHAIR}, - {DECOR_PRETTY_CHAIR, _("PRETTY CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_PRETTY_CHAIR, DecorGfx_PRETTY_CHAIR}, - {DECOR_COMFORT_CHAIR, _("COMFORT CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_COMFORT_CHAIR, DecorGfx_COMFORT_CHAIR}, - {DECOR_RAGGED_CHAIR, _("RAGGED CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_RAGGED_CHAIR, DecorGfx_RAGGED_CHAIR}, - {DECOR_BRICK_CHAIR, _("BRICK CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_BRICK_CHAIR, DecorGfx_BRICK_CHAIR}, - {DECOR_CAMP_CHAIR, _("CAMP CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_CAMP_CHAIR, DecorGfx_CAMP_CHAIR}, - {DECOR_HARD_CHAIR, _("HARD CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_HARD_CHAIR, DecorGfx_HARD_CHAIR}, - {DECOR_RED_PLANT, _("RED PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_RED_PLANT, DecorGfx_RED_PLANT}, - {DECOR_TROPICAL_PLANT, _("TROPICAL PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_TROPICAL_PLANT, DecorGfx_TROPICAL_PLANT}, - {DECOR_PRETTY_FLOWERS, _("PRETTY FLOWERS"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_PRETTY_FLOWERS, DecorGfx_PRETTY_FLOWERS}, - {DECOR_COLORFUL_PLANT, _("COLORFUL PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_COLORFUL_PLANT, DecorGfx_COLORFUL_PLANT}, - {DECOR_BIG_PLANT, _("BIG PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_BIG_PLANT, DecorGfx_BIG_PLANT}, - {DECOR_GORGEOUS_PLANT, _("GORGEOUS PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_GORGEOUS_PLANT, DecorGfx_GORGEOUS_PLANT}, - {DECOR_RED_BRICK, _("RED BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_RED_BRICK, DecorGfx_RED_BRICK}, - {DECOR_YELLOW_BRICK, _("YELLOW BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_YELLOW_BRICK, DecorGfx_YELLOW_BRICK}, - {DECOR_BLUE_BRICK, _("BLUE BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_BLUE_BRICK, DecorGfx_BLUE_BRICK}, - {DECOR_RED_BALLOON, _("RED BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_RED_BALLOON, DecorGfx_RED_BALLOON}, - {DECOR_BLUE_BALLOON, _("BLUE BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_BLUE_BALLOON, DecorGfx_BLUE_BALLOON}, - {DECOR_YELLOW_BALLOON, _("YELLOW BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_YELLOW_BALLOON, DecorGfx_YELLOW_BALLOON}, - {DECOR_RED_TENT, _("RED TENT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_ORNAMENT, 10000, DecorDesc_RED_TENT, DecorGfx_RED_TENT}, - {DECOR_BLUE_TENT, _("BLUE TENT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_ORNAMENT, 10000, DecorDesc_BLUE_TENT, DecorGfx_BLUE_TENT}, - {DECOR_SOLID_BOARD, _("SOLID BOARD"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_SOLID_BOARD, DecorGfx_SOLID_BOARD}, - {DECOR_SLIDE, _("SLIDE"), DECORPERM_PASS_FLOOR, DECORSHAPE_2x4, DECORCAT_ORNAMENT, 8000, DecorDesc_SLIDE, DecorGfx_SLIDE}, - {DECOR_FENCE_LENGTH, _("FENCE LENGTH"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_FENCE_LENGTH, DecorGfx_FENCE_LENGTH}, - {DECOR_FENCE_WIDTH, _("FENCE WIDTH"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_FENCE_WIDTH, DecorGfx_FENCE_WIDTH}, - {DECOR_TIRE, _("TIRE"), DECORPERM_SOLID_FLOOR, DECORSHAPE_2x2, DECORCAT_ORNAMENT, 800, DecorDesc_TIRE, DecorGfx_TIRE}, - {DECOR_STAND, _("STAND"), DECORPERM_PASS_FLOOR, DECORSHAPE_4x2, DECORCAT_ORNAMENT, 7000, DecorDesc_STAND, DecorGfx_STAND}, - {DECOR_MUD_BALL, _("MUD BALL"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 200, DecorDesc_MUD_BALL, DecorGfx_MUD_BALL}, - {DECOR_BREAKABLE_DOOR, _("BREAKABLE DOOR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_BREAKABLE_DOOR, DecorGfx_BREAKABLE_DOOR}, - {DECOR_SAND_ORNAMENT, _("SAND ORNAMENT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_SAND_ORNAMENT, DecorGfx_SAND_ORNAMENT}, - {DECOR_SILVER_SHIELD, _("SILVER SHIELD"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_SILVER_SHIELD, DecorGfx_SILVER_SHIELD}, - {DECOR_GOLD_SHIELD, _("GOLD SHIELD"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_GOLD_SHIELD, DecorGfx_GOLD_SHIELD}, - {DECOR_GLASS_ORNAMENT, _("GLASS ORNAMENT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_GLASS_ORNAMENT, DecorGfx_GLASS_ORNAMENT}, - {DECOR_TV, _("TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 3000, DecorDesc_TV, DecorGfx_TV}, - {DECOR_ROUND_TV, _("ROUND TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 4000, DecorDesc_ROUND_TV, DecorGfx_ROUND_TV}, - {DECOR_CUTE_TV, _("CUTE TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 4000, DecorDesc_CUTE_TV, DecorGfx_CUTE_TV}, - {DECOR_GLITTER_MAT, _("GLITTER MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_GLITTER_MAT, DecorGfx_GLITTER_MAT}, - {DECOR_JUMP_MAT, _("JUMP MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_JUMP_MAT, DecorGfx_JUMP_MAT}, - {DECOR_SPIN_MAT, _("SPIN MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_SPIN_MAT, DecorGfx_SPIN_MAT}, - {DECOR_C_LOW_NOTE_MAT, _("C Low NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_C_LOW_NOTE_MAT, DecorGfx_C_LOW_NOTE_MAT}, - {DECOR_D_NOTE_MAT, _("D NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_D_NOTE_MAT, DecorGfx_D_NOTE_MAT}, - {DECOR_E_NOTE_MAT, _("E NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_E_NOTE_MAT, DecorGfx_E_NOTE_MAT}, - {DECOR_F_NOTE_MAT, _("F NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_F_NOTE_MAT, DecorGfx_F_NOTE_MAT}, - {DECOR_G_NOTE_MAT, _("G NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_G_NOTE_MAT, DecorGfx_G_NOTE_MAT}, - {DECOR_A_NOTE_MAT, _("A NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_A_NOTE_MAT, DecorGfx_A_NOTE_MAT}, - {DECOR_B_NOTE_MAT, _("B NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_B_NOTE_MAT, DecorGfx_B_NOTE_MAT}, - {DECOR_C_HIGH_NOTE_MAT, _("C High NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_C_HIGH_NOTE_MAT, DecorGfx_C_HIGH_NOTE_MAT}, - {DECOR_SURF_MAT, _("SURF MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_SURF_MAT, DecorGfx_SURF_MAT}, - {DECOR_THUNDER_MAT, _("THUNDER MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_THUNDER_MAT, DecorGfx_THUNDER_MAT}, - {DECOR_FIRE_BLAST_MAT, _("FIRE BLAST MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_FIRE_BLAST_MAT, DecorGfx_FIRE_BLAST_MAT}, - {DECOR_POWDER_SNOW_MAT, _("POWDER SNOW MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_POWDER_SNOW_MAT, DecorGfx_POWDER_SNOW_MAT}, - {DECOR_ATTRACT_MAT, _("ATTRACT MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_ATTRACT_MAT, DecorGfx_ATTRACT_MAT}, - {DECOR_FISSURE_MAT, _("FISSURE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_FISSURE_MAT, DecorGfx_FISSURE_MAT}, - {DECOR_SPIKES_MAT, _("SPIKES MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_SPIKES_MAT, DecorGfx_SPIKES_MAT}, - {DECOR_BALL_POSTER, _("BALL POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_BALL_POSTER, DecorGfx_BALL_POSTER}, - {DECOR_GREEN_POSTER, _("GREEN POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_GREEN_POSTER, DecorGfx_GREEN_POSTER}, - {DECOR_RED_POSTER, _("RED POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_RED_POSTER, DecorGfx_RED_POSTER}, - {DECOR_BLUE_POSTER, _("BLUE POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_BLUE_POSTER, DecorGfx_BLUE_POSTER}, - {DECOR_CUTE_POSTER, _("CUTE POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_CUTE_POSTER, DecorGfx_CUTE_POSTER}, - {DECOR_PIKA_POSTER, _("PIKA POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_PIKA_POSTER, DecorGfx_PIKA_POSTER}, - {DECOR_LONG_POSTER, _("LONG POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_LONG_POSTER, DecorGfx_LONG_POSTER}, - {DECOR_SEA_POSTER, _("SEA POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_SEA_POSTER, DecorGfx_SEA_POSTER}, - {DECOR_SKY_POSTER, _("SKY POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_SKY_POSTER, DecorGfx_SKY_POSTER}, - {DECOR_KISS_POSTER, _("KISS POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_KISS_POSTER, DecorGfx_KISS_POSTER}, - {DECOR_PICHU_DOLL, _("PICHU DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_PICHU_DOLL, DecorGfx_PICHU_DOLL}, - {DECOR_PIKACHU_DOLL, _("PIKACHU DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_PIKACHU_DOLL, DecorGfx_PIKACHU_DOLL}, - {DECOR_MARILL_DOLL, _("MARILL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MARILL_DOLL, DecorGfx_MARILL_DOLL}, - {DECOR_TOGEPI_DOLL, _("TOGEPI DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TOGEPI_DOLL, DecorGfx_TOGEPI_DOLL}, - {DECOR_CYNDAQUIL_DOLL, _("CYNDAQUIL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CYNDAQUIL_DOLL, DecorGfx_CYNDAQUIL_DOLL}, - {DECOR_CHIKORITA_DOLL, _("CHIKORITA DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CHIKORITA_DOLL, DecorGfx_CHIKORITA_DOLL}, - {DECOR_TOTODILE_DOLL, _("TOTODILE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TOTODILE_DOLL, DecorGfx_TOTODILE_DOLL}, - {DECOR_JIGGLYPUFF_DOLL, _("JIGGLYPUFF DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_JIGGLYPUFF_DOLL, DecorGfx_JIGGLYPUFF_DOLL}, - {DECOR_MEOWTH_DOLL, _("MEOWTH DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MEOWTH_DOLL, DecorGfx_MEOWTH_DOLL}, - {DECOR_CLEFAIRY_DOLL, _("CLEFAIRY DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CLEFAIRY_DOLL, DecorGfx_CLEFAIRY_DOLL}, - {DECOR_DITTO_DOLL, _("DITTO DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_DITTO_DOLL, DecorGfx_DITTO_DOLL}, - {DECOR_SMOOCHUM_DOLL, _("SMOOCHUM DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SMOOCHUM_DOLL, DecorGfx_SMOOCHUM_DOLL}, - {DECOR_TREECKO_DOLL, _("TREECKO DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TREECKO_DOLL, DecorGfx_TREECKO_DOLL}, - {DECOR_TORCHIC_DOLL, _("TORCHIC DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TORCHIC_DOLL, DecorGfx_TORCHIC_DOLL}, - {DECOR_MUDKIP_DOLL, _("MUDKIP DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MUDKIP_DOLL, DecorGfx_MUDKIP_DOLL}, - {DECOR_DUSKULL_DOLL, _("DUSKULL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_DUSKULL_DOLL, DecorGfx_DUSKULL_DOLL}, - {DECOR_WYNAUT_DOLL, _("WYNAUT DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_WYNAUT_DOLL, DecorGfx_WYNAUT_DOLL}, - {DECOR_BALTOY_DOLL, _("BALTOY DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_BALTOY_DOLL, DecorGfx_BALTOY_DOLL}, - {DECOR_KECLEON_DOLL, _("KECLEON DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_KECLEON_DOLL, DecorGfx_KECLEON_DOLL}, - {DECOR_AZURILL_DOLL, _("AZURILL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_AZURILL_DOLL, DecorGfx_AZURILL_DOLL}, - {DECOR_SKITTY_DOLL, _("SKITTY DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SKITTY_DOLL, DecorGfx_SKITTY_DOLL}, - {DECOR_SWABLU_DOLL, _("SWABLU DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SWABLU_DOLL, DecorGfx_SWABLU_DOLL}, - {DECOR_GULPIN_DOLL, _("GULPIN DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_GULPIN_DOLL, DecorGfx_GULPIN_DOLL}, - {DECOR_LOTAD_DOLL, _("LOTAD DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_LOTAD_DOLL, DecorGfx_LOTAD_DOLL}, - {DECOR_SEEDOT_DOLL, _("SEEDOT DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SEEDOT_DOLL, DecorGfx_SEEDOT_DOLL}, - {DECOR_PIKA_CUSHION, _("PIKA CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_PIKA_CUSHION, DecorGfx_PIKA_CUSHION}, - {DECOR_ROUND_CUSHION, _("ROUND CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_ROUND_CUSHION, DecorGfx_ROUND_CUSHION}, - {DECOR_KISS_CUSHION, _("KISS CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_KISS_CUSHION, DecorGfx_KISS_CUSHION}, - {DECOR_ZIGZAG_CUSHION, _("ZIGZAG CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_ZIGZAG_CUSHION, DecorGfx_ZIGZAG_CUSHION}, - {DECOR_SPIN_CUSHION, _("SPIN CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_SPIN_CUSHION, DecorGfx_SPIN_CUSHION}, - {DECOR_DIAMOND_CUSHION, _("DIAMOND CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_DIAMOND_CUSHION, DecorGfx_DIAMOND_CUSHION}, - {DECOR_BALL_CUSHION, _("BALL CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_BALL_CUSHION, DecorGfx_BALL_CUSHION}, - {DECOR_GRASS_CUSHION, _("GRASS CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_GRASS_CUSHION, DecorGfx_GRASS_CUSHION}, - {DECOR_FIRE_CUSHION, _("FIRE CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_FIRE_CUSHION, DecorGfx_FIRE_CUSHION}, - {DECOR_WATER_CUSHION, _("WATER CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_WATER_CUSHION, DecorGfx_WATER_CUSHION}, - {DECOR_SNORLAX_DOLL, _("SNORLAX DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_SNORLAX_DOLL, DecorGfx_SNORLAX_DOLL}, - {DECOR_RHYDON_DOLL, _("RHYDON DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_RHYDON_DOLL, DecorGfx_RHYDON_DOLL}, - {DECOR_LAPRAS_DOLL, _("LAPRAS DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_LAPRAS_DOLL, DecorGfx_LAPRAS_DOLL}, - {DECOR_VENUSAUR_DOLL, _("VENUSAUR DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_VENUSAUR_DOLL, DecorGfx_VENUSAUR_DOLL}, - {DECOR_CHARIZARD_DOLL, _("CHARIZARD DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_CHARIZARD_DOLL, DecorGfx_CHARIZARD_DOLL}, - {DECOR_BLASTOISE_DOLL, _("BLASTOISE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_BLASTOISE_DOLL, DecorGfx_BLASTOISE_DOLL}, - {DECOR_WAILMER_DOLL, _("WAILMER DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_WAILMER_DOLL, DecorGfx_WAILMER_DOLL}, - {DECOR_REGIROCK_DOLL, _("REGIROCK DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGIROCK_DOLL, DecorGfx_REGIROCK_DOLL}, - {DECOR_REGICE_DOLL, _("REGICE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGICE_DOLL, DecorGfx_REGICE_DOLL}, - {DECOR_REGISTEEL_DOLL, _("REGISTEEL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGISTEEL_DOLL, DecorGfx_REGISTEEL_DOLL} -}; -#elif GERMAN -#include "data/decoration/decorations.h" -#endif - -const u8 *const gUnknown_083EC5E4[] = { - SecretBaseText_Desk, - SecretBaseText_Chair, - SecretBaseText_Plant, - SecretBaseText_Ornament, - SecretBaseText_Mat, - SecretBaseText_Poster, - SecretBaseText_Doll, - SecretBaseText_Cushion -}; - -const struct MenuAction2 gUnknown_083EC604[] = { - {SecretBaseText_Decorate, sub_80FF160}, - {SecretBaseText_PutAway, sub_8100A0C}, - {SecretBaseText_Toss, sub_8101700}, - {gUnknownText_Exit, gpu_pal_decompress_alloc_tag_and_upload} -}; - -const u8 *const gUnknown_083EC624[] = { - SecretBaseText_PutOutDecor, - SecretBaseText_StoreChosenDecor, - SecretBaseText_ThrowAwayDecor, - gMenuText_GoBackToPrev -}; - -const struct YesNoFuncTable gUnknown_083EC634[] = { - {sub_80FF5BC, sub_80FF058}, - {sub_81017A0, sub_80FF058}, - {sub_81017A0, sub_80FF058}, - {sub_8109D04, sub_80FF058} -}; - -const u16 gUnknown_083EC654[] = {0x6318, 0x739C, 0x7FFF}; -const u8 gUnknown_083EC65A[] = _("{PALETTE 13}{STR_VAR_1}"); - -const u8 Unknown_3EC660[] = {0, 1, 2, 3}; -const u8 Unknown_3EC664[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13}; -const u8 Unknown_3EC670[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; -const u8 Unknown_3EC680[] = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21}; -const u8 Unknown_3EC68C[] = {0, 1, 2, 3, 4, 5, 6, 7}; -const u8 Unknown_3EC694[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; -const u8 Unknown_3EC6B4[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45}; -const u8 Unknown_3EC6D8[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29}; - -const u8 Unknown_3EC6F0[] = {0, 0, 0, 0}; -const u8 Unknown_3EC6F4[] = {0, 0, 1, 1, 0, 0, 1, 1}; -const u8 Unknown_3EC6FC[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2}; -const u8 Unknown_3EC708[] = {0, 0, 1, 1, 2, 2, 3, 3, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 4, 4, 5, 5, 6, 6, 7, 7}; -const u8 Unknown_3EC728[] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3}; -const u8 Unknown_3EC738[] = {0, 0, 0, 0, 1, 1, 1, 1}; -const u8 Unknown_3EC740[] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2}; -const u8 Unknown_3EC74C[] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3, 4, 4, 5, 5, 4, 4, 5, 5, 6, 6, 7, 7, 6, 6, 7, 7}; -const u8 Unknown_3EC76C[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 6, 6, 7, 7, 8, 8}; -const u8 Unknown_3EC790[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 3, 3, 4, 4, 5, 5}; - -const u8 Unknown_3EC7A8[] = {4, 5, 6, 7}; -const u8 Unknown_3EC7AC[] = {4, 5, 4, 5, 6, 7, 6, 7}; -const u8 Unknown_3EC7B4[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7}; -const u8 Unknown_3EC7C0[] = {4, 5, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 6, 7}; -const u8 Unknown_3EC7E0[] = {4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7}; -const u8 Unknown_3EC7F0[] = {4, 5, 6, 7, 4, 5, 6, 7}; -const u8 Unknown_3EC7F8[] = {4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7}; -const u8 Unknown_3EC804[] = {4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7}; -const u8 Unknown_3EC824[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7}; -const u8 Unknown_3EC848[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7}; - -const struct UnkStruct_803EC860 gUnknown_083EC860[] = { - {Unknown_3EC660, Unknown_3EC6F0, Unknown_3EC7A8, 0x4}, - {Unknown_3EC68C, Unknown_3EC6F4, Unknown_3EC7AC, 0x8}, - {Unknown_3EC664, Unknown_3EC6FC, Unknown_3EC7B4, 0xc}, - {Unknown_3EC694, Unknown_3EC708, Unknown_3EC7C0, 0x20}, - {Unknown_3EC670, Unknown_3EC728, Unknown_3EC7E0, 0x10}, - {Unknown_3EC68C, Unknown_3EC738, Unknown_3EC7F0, 0x8}, - {Unknown_3EC680, Unknown_3EC740, Unknown_3EC7F8, 0xc}, - {Unknown_3EC694, Unknown_3EC74C, Unknown_3EC804, 0x20}, - {Unknown_3EC6B4, Unknown_3EC76C, Unknown_3EC824, 0x24}, - {Unknown_3EC6D8, Unknown_3EC790, Unknown_3EC848, 0x18} -}; - -const struct UnkStruct_083EC900 gUnknown_083EC900[] = { - {0, 1, 0x78, 0x4e}, - {1, 2, 0x80, 0x4e}, - {1, 3, 0x90, 0x56}, - {1, 3, 0x90, 0x46}, - {0, 2, 0x80, 0x46}, - {2, 2, 0x78, 0x46}, - {2, 3, 0x80, 0x56}, - {2, 3, 0x80, 0x36}, - {0, 3, 0x90, 0x46}, - {1, 3, 0x90, 0x46} -}; - -const union AnimCmd gSpriteAnim_83EC928[] = { - ANIMCMD_FRAME(.imageValue = 0, .duration = 0), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_83EC930[] = { - gSpriteAnim_83EC928 -}; - -const struct SpriteFrameImage gSpriteImageTable_83EC934[] = { - {.data = (u8 *)&gUnknown_02038900.image, .size = sizeof gUnknown_02038900.image} -}; - -const struct SpriteTemplate gSpriteTemplate_83EC93C = { - .tileTag = 0xffff, - .paletteTag = 3000, - .oam = &gUnknown_020391AC, - .anims = gSpriteAnimTable_83EC930, - .images = gSpriteImageTable_83EC934, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81009A8 -}; - -const struct SpritePalette gUnknown_083EC954 = {.data = (u16 *)&gUnknown_02038900.palette, .tag = 3000}; - -const struct YesNoFuncTable gUnknown_083EC95C = {.yesFunc = sub_81000C4, .noFunc = sub_810065C}; -const struct YesNoFuncTable gUnknown_083EC964 = {.yesFunc = sub_810026C, .noFunc = sub_810065C}; -const struct YesNoFuncTable gUnknown_083EC96C[] = { - {.yesFunc = sub_80FFAB0, .noFunc = sub_80FFB08}, - {.yesFunc = sub_8100F88, .noFunc = sub_8100FB4} -}; - -const u8 gUnknown_083EC97C[] = {4, 4, 4, 4, 0, 3, 3, 0}; -const u8 gUnknown_083EC984[] = {4, 4, 4, 4, 0, 4, 3, 0}; - -const u16 gUnknown_083EC98C[] = INCBIN_U16("graphics/unknown/83EC98C.gbapal"); -const u16 Unknown_3EC9AC[] = INCBIN_U16("graphics/unknown/83EC9AC.gbapal"); -const struct YesNoFuncTable gUnknown_083EC9CC = {.yesFunc = sub_810153C, .noFunc = sub_8100EEC}; -const struct YesNoFuncTable gUnknown_083EC9D4 = {.yesFunc = sub_8101590, .noFunc = sub_8100EEC}; -const u32 gSpriteImage_83EC9DC[] = INCBIN_U32("graphics/unknown_sprites/83EC9DC.4bpp"); -const struct SpritePalette gUnknown_083ECA5C = {.data = gUnknown_083EC98C, .tag = 8}; -const struct SpritePalette gUnknown_083ECA64 = {.data = Unknown_3EC9AC, .tag = 8}; -const struct OamData gOamData_83ECA6C = { - .size = 1, .priority = 1 -}; - -const union AnimCmd gSpriteAnim_83ECA74[] = { - ANIMCMD_FRAME(.imageValue = 0, .duration = 0), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_83ECA7C[] = { - gSpriteAnim_83ECA74 -}; - -const struct SpriteFrameImage gSpriteImageTable_83ECA80[] = { - obj_frame_tiles(gSpriteImage_83EC9DC) -}; - -const struct SpriteTemplate gSpriteTemplate_83ECA88 = { - .tileTag = 0xffff, - .paletteTag = 8, - .oam = &gOamData_83ECA6C, - .anims = gSpriteAnimTable_83ECA7C, - .images = gSpriteImageTable_83ECA80, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8101698 -}; - -const struct YesNoFuncTable gUnknown_083ECAA0 = {.yesFunc = sub_8101848, .noFunc = sub_80FED3C}; - -u8 *const unref_label_083ECAA8[] = {ewram}; - -// text - -extern u8 gUnknown_0815F399[]; - -void sub_80FE1DC(void) -{ - sub_80FE2B4(); - MenuDrawTextWindow(0, 0, 10, 9); - PrintMenuItems(1, 1, 4, (const struct MenuAction *)gUnknown_083EC604); - InitMenu(0, 1, 1, 4, gUnknown_020388D4, 9); -} - -void sub_80FE220(void) -{ - gUnknown_020388D4 = 0; - ScriptContext2_Enable(); - sub_80FE1DC(); - sub_80FE394(); -} - -void DecorationPC(u8 taskId) -{ - sub_80FE220(); - gTasks[taskId].func = Task_DecorationPCProcessMenuInput; -} - -void Task_SecretBasePC_Decoration(u8 taskId) -{ - DecorationPC(taskId); - ewram_1f000.items = gSaveBlock1.secretBases[0].decorations; - ewram_1f000.pos = gSaveBlock1.secretBases[0].decorationPos; - ewram_1f000.size = sizeof gSaveBlock1.secretBases[0].decorations; - ewram_1f000.isPlayerRoom = 0; -} - -void DoPlayerPCDecoration(u8 taskId) -{ - DecorationPC(taskId); - ewram_1f000.items = gSaveBlock1.playerRoomDecor; - ewram_1f000.pos = gSaveBlock1.playerRoomDecorPos; - ewram_1f000.size = sizeof gSaveBlock1.playerRoomDecor; - ewram_1f000.isPlayerRoom = 1; -} - -void sub_80FE2B4(void) -{ - u16 palettes[3]; - memcpy(palettes, gUnknown_083EC654, sizeof gUnknown_083EC654); - LoadPalette(&palettes[2], 0xdf, 2); - LoadPalette(&palettes[1], 0xd1, 2); - LoadPalette(&palettes[0], 0xd8, 2); -} - -void Task_DecorationPCProcessMenuInput(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - gUnknown_020388D4 = MoveMenuCursor(-1); - sub_80FE394(); - } - if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - gUnknown_020388D4 = MoveMenuCursor(1); - sub_80FE394(); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_083EC604[gUnknown_020388D4].func(taskId); - } else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gpu_pal_decompress_alloc_tag_and_upload(taskId); - } - } -} - -void sub_80FE394(void) -{ - MenuFillWindowRectWithBlankTile(2, 15, 27, 18); - MenuPrint(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); - FreeSpritePaletteByTag(6); - if (ewram_1f000.isPlayerRoom == 0) - { - ScriptContext1_SetupScript(gUnknown_0815F399); - DestroyTask(taskId); - } else - { - ReshowPlayerPC(taskId); - } -} - -void sub_80FE418(u8 taskId) -{ - sub_80FE5AC(taskId); -} - -void sub_80FE428(u8 taskId) -{ - InitMenu(0, 1, 1, 4, gUnknown_020388D4, 9); - sub_80FE394(); - gTasks[taskId].func = Task_DecorationPCProcessMenuInput; -} - -void sub_80FE470(u8 decoCat, u8 left, u8 top, u8 palIdx) // PrintDecorationCategorySelectionMenuString -{ - u8 *strptr; - u8 v0; - v0 = sub_8072CBC(); - // PALETTE {palIdx} - strptr = gStringVar4; - strptr[0] = EXT_CTRL_CODE_BEGIN; - strptr[1] = 5; - strptr[2] = palIdx; - strptr += 3; - strptr = StringCopy(strptr, gUnknown_083EC5E4[decoCat]); - strptr = sub_8072C14(strptr, sub_8134194(decoCat), 0x56, 1); - *strptr++ = 0xba; - strptr = sub_8072C14(strptr, gDecorationInventories[decoCat].size, 0x68, 1); - strptr[0] = EXT_CTRL_CODE_BEGIN; - strptr[1] = 5; - strptr[2] = v0; - strptr[3] = EOS; - MenuPrint(gStringVar4, left, top); -} - -void sub_80FE528(u8 taskId) // PrintDecorationCategorySelectionMenuStrings -{ - u8 decoCat; - MenuDrawTextWindow(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) - { - sub_80FE470(decoCat, 1, 2 * decoCat + 1, 13); // Selectable - } else - { - sub_80FE470(decoCat, 1, 2 * decoCat + 1, 255); // Unselectable - } - } - MenuPrint(gUnknownText_Exit, 1, 17); -} - -void sub_80FE5AC(u8 taskId) -{ - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); - sub_80FE528(taskId); - InitMenu(0, 1, 1, 9, gUnknown_020388F6, 13); - gTasks[taskId].func = sub_80FE604; -} - -void sub_80FE604(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - MoveMenuCursor(-1); - } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - MoveMenuCursor(1); - } else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_020388F6 = GetMenuCursorPos(); - if (gUnknown_020388F6 != 8) - { - gUnknown_020388D5 = sub_8134194(gUnknown_020388F6); - if (gUnknown_020388D5) - { - sub_8134104(gUnknown_020388F6); - gUnknown_020388D0 = gDecorationInventories[gUnknown_020388F6].items; - sub_80FEF50(taskId); - sub_80F944C(); - sub_80F9480(gUnknown_020388F7, 8); - LoadScrollIndicatorPalette(); - gTasks[taskId].func = sub_80FE868; - } else - { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 14, 19); - DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE418, 0); - } - } else - { - sub_80FE728(taskId); - } - } else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_80FE728(taskId); - } - } -} - -void sub_80FE728(u8 taskId) -{ - if (gTasks[taskId].data[11] != 3) - { - sub_80FE758(taskId); - } else - { - sub_8109DAC(taskId); - } -} - -void sub_80FE758(u8 taskId) -{ - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 14, 19); - if (gTasks[taskId].data[11] != 2) - { - sub_80FE1DC(); - MenuDisplayMessageBox(); - sub_80FE394(); - gTasks[taskId].func = Task_DecorationPCProcessMenuInput; - } else - { - sub_80B3068(taskId); - } -} - -void sub_80FE7A8(u8 taskId) -{ - gTasks[taskId].data[11] = 3; - gUnknown_020388F6 = 0; - sub_80FE5AC(taskId); -} - -void sub_80FE7D4(u8 *dest, u8 decClass) -{ - StringCopy(dest, gUnknown_083EC5E4[decClass]); -} - -void sub_80FE7EC(u8 taskId) -{ - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); - - sub_80FEC94(taskId); - sub_80FECB8(gUnknown_020388F6); - -#if ENGLISH - MenuDrawTextWindow(15, 12, 29, 19); -#elif GERMAN - if ((gUnknown_020388F2 + gUnknown_020388F4) != gUnknown_020388D5) - { - MenuDrawTextWindow(15, 12, 29, 19); - } -#endif - - sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4); - InitMenu(0, 1, 2, gUnknown_020388F3 + 1, gUnknown_020388F2, 13); -} - -void sub_80FE868(u8 taskId) -{ - sub_80FE7EC(taskId); - gTasks[taskId].func = sub_80FE948; -} - -void sub_80FE894(u8 taskId /*r8*/, s8 cursorVector /*r5*/, s8 bgVector /*r7*/) -{ - int v0 /*r10*/; - u8 v1; - v0 = gUnknown_020388F2 + gUnknown_020388F4 == gUnknown_020388D5; - PlaySE(SE_SELECT); - if (cursorVector != 0) - { - gUnknown_020388F2 = MoveMenuCursor(cursorVector); - } - if (bgVector != 0) - { - v1 = gUnknown_020388F4; - gUnknown_020388F4 = v1 + bgVector; - sub_80FEABC(taskId, 1); - } - if (gUnknown_020388F2 + gUnknown_020388F4 != gUnknown_020388D5) - { - if (v0) - { - MenuDrawTextWindow(15, 12, 29, 19); - } - sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4); - } else - { - MenuZeroFillWindowRect(15, 12, 29, 19); - } -} - -void sub_80FE948(u8 taskId) -{ - if (!gPaletteFade.active) - { - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) - { - if (gUnknown_020388F2 != 0) - { - sub_80FE894(taskId, -1, 0); - } else if (gUnknown_020388F4 != 0) - { - sub_80FE894(taskId, 0, -1); - } - } - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) - { - if (gUnknown_020388F2 != gUnknown_020388F3) - { - sub_80FE894(taskId, 1, 0); - } else if (gUnknown_020388F4 + gUnknown_020388F2 != gUnknown_020388D5) - { - sub_80FE894(taskId, 0, 1); - } - } - if (gMain.newKeys & A_BUTTON) - { - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - gUnknown_020388F5 = gUnknown_020388F2 + gUnknown_020388F4; - if (gUnknown_020388F5 == gUnknown_020388D5) - { - gUnknown_083EC634[gTasks[taskId].data[11]].noFunc(taskId); - } else - { - gUnknown_083EC634[gTasks[taskId].data[11]].yesFunc(taskId); - } - } else if (gMain.newKeys & B_BUTTON) - { - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - gUnknown_083EC634[gTasks[taskId].data[11]].noFunc(taskId); - } - } -} - -void sub_80FEABC(u8 taskId, u8 dummy1) -{ - u16 i; - u16 j; - u8 ni; - if (gUnknown_020388F4 != 0 || (DestroyVerticalScrollIndicator(0), gUnknown_020388F4 != 0)) - { - CreateVerticalScrollIndicators(0, 0x3c, 0x08); - } - if (gUnknown_020388F4 + 7 == gUnknown_020388D5) - { - DestroyVerticalScrollIndicator(1); - } - if (gUnknown_020388F4 + 7 < gUnknown_020388D5) - { - CreateVerticalScrollIndicators(1, 0x3c, 0x98); - } - for (i=gUnknown_020388F4; i gUnknown_020388D5 && gUnknown_020388F4 != 0) - { - gUnknown_020388F4--; - } - sub_8134104(gUnknown_020388F6); - sub_80FED90(taskId); - sub_80FEF28(); -} - -void sub_80FF0E0(u8 taskId) -{ - gTasks[taskId].data[3] = gSaveBlock1.pos.x; - gTasks[taskId].data[4] = gSaveBlock1.pos.y; - PlayerGetDestCoords(&gTasks[taskId].data[0], &gTasks[taskId].data[1]); -} - -void sub_80FF114(u8 taskId) -{ - DrawWholeMapView(); - warp1_set(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]); - warp_in(); -} -void sub_80FF160(u8 taskId) -{ - if (!sub_81341D4()) - { - DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE428, 0); - } else - { - gTasks[taskId].data[11] = 0; - gUnknown_020388F6 = 0; - sub_80FE5AC(taskId); - } -} - -u16 sub_80FF1B0(u8 decoId, u8 a1) -{ - u16 retval; - retval = 0xffff; - - switch (decoId) - { - case DECOR_STAND: - retval = gUnknown_083EC97C[a1] << 12; - return retval; - case DECOR_SLIDE: - retval = gUnknown_083EC984[a1] << 12; - return retval; - default: - return retval; - } -} - -void sub_80FF1EC(u16 mapX, u16 mapY, u8 decWidth, u8 decHeight, u16 decIdx) -{ - u16 i; - u16 j; // r10 - u16 behavior; - u16 flags; // r8 - u16 v0; - u16 v1; - s16 x; - s16 decBottom; - - for (i=0; i> 12))) - { - flags = 0xc00; - } else - { - flags = 0x000; - } - if (gDecorations[decIdx].permission != DECORPERM_NA_WALL && sub_80572B0(MapGridGetMetatileBehaviorAt(x, decBottom)) == 1) - { - v0 = 1; - } else - { - v0 = 0; - } - v1 = sub_80FF1B0(gDecorations[decIdx].id, i * decWidth + j); - if (v1 != 0xffff) - { - MapGridSetMetatileEntryAt(x, decBottom, (gDecorations[decIdx].tiles[i * decWidth + j] + (0x200 | v0)) | flags | v1); - } else - { - MapGridSetMetatileIdAt(x, decBottom, (gDecorations[decIdx].tiles[i * decWidth + j] + (0x200 | v0)) | flags); - } - } - } -} - -void sub_80FF394(u16 mapX, u16 mapY, u16 decIdx) -{ - switch (gDecorations[decIdx].shape) - { - case DECORSHAPE_1x1: - sub_80FF1EC(mapX, mapY, 1, 1, decIdx); - break; - case DECORSHAPE_2x1: - sub_80FF1EC(mapX, mapY, 2, 1, decIdx); - break; - case DECORSHAPE_3x1: // unused - sub_80FF1EC(mapX, mapY, 3, 1, decIdx); - break; - case DECORSHAPE_4x2: - sub_80FF1EC(mapX, mapY, 4, 2, decIdx); - break; - case DECORSHAPE_2x2: - sub_80FF1EC(mapX, mapY, 2, 2, decIdx); - break; - case DECORSHAPE_1x2: - sub_80FF1EC(mapX, mapY, 1, 2, decIdx); - break; - case DECORSHAPE_1x3: // unused - sub_80FF1EC(mapX, mapY, 1, 3, decIdx); - break; - case DECORSHAPE_2x4: - sub_80FF1EC(mapX, mapY, 2, 4, decIdx); - break; - case DECORSHAPE_3x3: - sub_80FF1EC(mapX, mapY, 3, 3, decIdx); - break; - case DECORSHAPE_3x2: - sub_80FF1EC(mapX, mapY, 3, 2, decIdx); - break; - } -} - -void sub_80FF474(void) -{ - u8 i; - u8 j; - for (i=0; i<14; i++) - { - if (FlagGet(i + 0xae) == 1) - { - FlagReset(i + 0xae); - for (j=0; jmapObjectCount; j++) - { - if (gMapHeader.events->mapObjects[j].flagId == i + 0xae) - { - break; - } - } - VarSet(0x3f20 + gMapHeader.events->mapObjects[j].graphicsId, gUnknown_02038900.decoration->tiles[0]); - gSpecialVar_0x8005 = gMapHeader.events->mapObjects[j].localId; - gSpecialVar_0x8006 = gUnknown_020391A4; - gSpecialVar_0x8007 = gUnknown_020391A6; - show_sprite(gSpecialVar_0x8005, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - sub_805C0F8(gSpecialVar_0x8005, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); - sub_805C78C(gSpecialVar_0x8005, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - break; - } - } -} - -bool8 sub_80FF58C/*IsThereRoomForMoreDecorations*/(void) -{ - u16 i; - for (i=0; idecoration = &gDecorations[decoIdx]; - if (gDecorations[decoIdx].permission != DECORPERM_SOLID_MAT) - { - sub_81008BC(unk_02038900); - sub_8100930(unk_02038900->decoration->shape); - sub_8100874(unk_02038900); - sub_810070C(unk_02038900->palette, ((u16 *)gMapHeader.mapData->secondaryTileset->metatiles + 8 * unk_02038900->decoration->tiles[0])[7] >> 12); - LoadSpritePalette(&gUnknown_083EC954); - gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data0; - gUnknown_03004880.unk4 = CreateSprite(&gSpriteTemplate_83EC93C, gUnknown_083EC900[unk_02038900->decoration->shape].x, gUnknown_083EC900[unk_02038900->decoration->shape].y, 0); - } else - { - gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data0; - gUnknown_03004880.unk4 = AddPseudoFieldObject(unk_02038900->decoration->tiles[0], sub_81009A8, gUnknown_083EC900[unk_02038900->decoration->shape].x, gUnknown_083EC900[unk_02038900->decoration->shape].y, 1); - gSprites[gUnknown_03004880.unk4].oam.priority = 1; - } -} - -void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct UnkStruct_02038900 *unk_02038900) -{ - u8 v0; - v0 = 16 * (u8)gTasks[taskId].data[5] + gUnknown_083EC900[unk_02038900->decoration->shape].x - 8 * ((u8)gTasks[taskId].data[5] - 1); - if (unk_02038900->decoration->shape == DECORSHAPE_3x1 || unk_02038900->decoration->shape == DECORSHAPE_3x3 || unk_02038900->decoration->shape == DECORSHAPE_3x2) - { - v0 -= 8; - } - if (gSaveBlock2.playerGender == MALE) - { - gUnknown_020391A9 = AddPseudoFieldObject(0xc1, SpriteCallbackDummy, v0, 0x48, 0); - } else - { - gUnknown_020391A9 = AddPseudoFieldObject(0xc2, SpriteCallbackDummy, v0, 0x48, 0); - } - gSprites[gUnknown_020391A9].oam.priority = 1; - DestroySprite(&gSprites[gUnknown_020391A8]); - gUnknown_020391A8 = gUnknown_03004880.unk4; -} - -void sub_80FF960(u8 taskId) -{ - switch (gDecorations[gUnknown_020388D0[gUnknown_020388F5]].shape) - { - case DECORSHAPE_1x1: - gTasks[taskId].data[5] = 1; - gTasks[taskId].data[6] = 1; - break; - case DECORSHAPE_2x1: - gTasks[taskId].data[5] = 2; - gTasks[taskId].data[6] = 1; - break; - case DECORSHAPE_3x1: - gTasks[taskId].data[5] = 3; - gTasks[taskId].data[6] = 1; - break; - case DECORSHAPE_4x2: - gTasks[taskId].data[5] = 4; - gTasks[taskId].data[6] = 2; - break; - case DECORSHAPE_2x2: - gTasks[taskId].data[5] = 2; - gTasks[taskId].data[6] = 2; - break; - case DECORSHAPE_1x2: - gTasks[taskId].data[5] = 1; - gTasks[taskId].data[6] = 2; - break; - case DECORSHAPE_1x3: - gTasks[taskId].data[5] = 1; - gTasks[taskId].data[6] = 3; - gTasks[taskId].data[1]++; - break; - case DECORSHAPE_2x4: - gTasks[taskId].data[5] = 2; - gTasks[taskId].data[6] = 4; - break; - case DECORSHAPE_3x3: - gTasks[taskId].data[5] = 3; - gTasks[taskId].data[6] = 3; - break; - case DECORSHAPE_3x2: - gTasks[taskId].data[5] = 3; - gTasks[taskId].data[6] = 2; - break; - } -} - -void sub_80FFAB0(u8 taskId) -{ - gTasks[taskId].data[10] = 0; - gSprites[gUnknown_020391A8].data7 = 1; - gSprites[gUnknown_020391A9].data7 = 1; - sub_810045C(); - sub_8100038(taskId); -} - -void sub_80FFB08(u8 taskId) -{ - gTasks[taskId].data[10] = 0; - gSprites[gUnknown_020391A8].data7 = 1; - gSprites[gUnknown_020391A9].data7 = 1; - sub_810045C(); - DisplayItemMessageOnField(taskId, gSecretBaseText_CancelDecorating, sub_8100248, 0); -} - -bool8 sub_80FFB6C(u8 a0, u16 a1) -{ - if (sub_8057274(a0) != 1 || a1 != 0) - { - return FALSE; - } - return TRUE; -} - -bool8 sub_80FFB94(u8 taskId, s16 x, s16 y, u16 decoId) -{ - if (x == gTasks[taskId].data[3] + 7 && y == gTasks[taskId].data[4] + 7 && decoId != 0) - { - return FALSE; - } - return TRUE; -} - -bool8 sub_80FFBDC(u16 a0, const struct Decoration *decoration) -{ - if (sub_8057274(a0) != 1) - { - if (decoration->id == DECOR_SOLID_BOARD && sub_8057300(a0) == 1) - { - return TRUE; - } - if (sub_805729C(a0)) - { - return TRUE; - } - } - return FALSE; -} - -// When behaviorBy is set, it is masked by 0xf000. This is the step that fails to match when built. -#ifdef NONMATCHING -bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration) -{ - u8 i; - u8 j; - u8 behaviorAt; - u16 behaviorBy; - u8 mapY; - u8 mapX; - s16 curY; - s16 curX; - mapY = gTasks[taskId].data[6]; - mapX = gTasks[taskId].data[5]; - switch (decoration->permission) - { - case DECORPERM_SOLID_FLOOR: - case DECORPERM_PASS_FLOOR: - for (i=0; itiles[(mapY - 1 - i) * mapX + j]) & 0xf000; - if (!sub_80FFBDC(behaviorAt, decoration)) - { - return FALSE; - } - if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) - { - return FALSE; - } - behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0); - if (behaviorAt != 0 && behaviorAt != 16) - { - return FALSE; - } - } - } - break; - case DECORPERM_BEHIND_FLOOR: - for (i=0; itiles[(mapY - 1 - i) * mapX + j]) & 0xf000; - if (!sub_805729C(behaviorAt) && !sub_80FFB6C(behaviorAt, behaviorBy)) - { - return FALSE; - } - if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) - { - return FALSE; - } - if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16) - { - return FALSE; - } - } - } - curY = gTasks[taskId].data[1] - mapY + 1; - for (j=0; jtiles[j]) & 0xf000; - if (!sub_805729C(behaviorAt) && !sub_80572B0(behaviorAt)) - { - return FALSE; - } - if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) - { - return FALSE; - } - behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0); - if (behaviorAt != 0 && behaviorAt != 16) - { - return FALSE; - } - } - break; - case DECORPERM_NA_WALL: - for (i=0; ishape == DECORSHAPE_1x2) - { - if (!sub_80572EC(behaviorAt)) - { - return FALSE; - } - } - else if (!sub_80572D8(behaviorAt)) - { - if (!sub_80572EC(behaviorAt)) - { - return FALSE; - } - } - if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16) - { - return FALSE; - } - } - break; - } - return TRUE; -} -#else -__attribute__((naked)) -bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration) -{ - asm(".syntax unified\n" - "\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x24\n" - "\tstr r1, [sp]\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r10, r0\n" - "\tldr r1, _080FFC60 @ =gTasks\n" - "\tlsls r0, 2\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tadds r0, r1\n" - "\tldrb r2, [r0, 0x14]\n" - "\tstr r2, [sp, 0x4]\n" - "\tldrb r0, [r0, 0x12]\n" - "\tstr r0, [sp, 0x8]\n" - "\tldr r3, [sp]\n" - "\tldrb r0, [r3, 0x11]\n" - "\tadds r2, r1, 0\n" - "\tcmp r0, 0x4\n" - "\tbls _080FFC56\n" - "\tb _08100024\n" - "_080FFC56:\n" - "\tlsls r0, 2\n" - "\tldr r1, _080FFC64 @ =_080FFC68\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_080FFC60: .4byte gTasks\n" - "_080FFC64: .4byte _080FFC68\n" - "\t.align 2, 0\n" - "_080FFC68:\n" - "\t.4byte _080FFC7C\n" - "\t.4byte _080FFC7C\n" - "\t.4byte _080FFD68\n" - "\t.4byte _080FFF1C\n" - "\t.4byte _080FFFA0\n" - "_080FFC7C:\n" - "\tmovs r6, 0\n" - "\tldr r0, [sp, 0x4]\n" - "\tcmp r6, r0\n" - "\tbcc _080FFC86\n" - "\tb _08100024\n" - "_080FFC86:\n" - "\tmov r1, r10\n" - "\tlsls r1, 2\n" - "\tstr r1, [sp, 0x1C]\n" - "_080FFC8C:\n" - "\tmov r2, r10\n" - "\tlsls r0, r2, 2\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tldr r3, _080FFD64 @ =gTasks\n" - "\tadds r0, r3\n" - "\tldrh r0, [r0, 0xA]\n" - "\tsubs r0, r6\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tadds r6, 0x1\n" - "\tstr r6, [sp, 0x14]\n" - "\tldr r0, [sp, 0x8]\n" - "\tcmp r7, r0\n" - "\tbcs _080FFD56\n" - "\tmov r1, r9\n" - "\tlsls r1, 16\n" - "\tstr r1, [sp, 0xC]\n" - "\tasrs r1, 16\n" - "\tmov r9, r1\n" - "_080FFCB8:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tldr r2, _080FFD64 @ =gTasks\n" - "\tadds r0, r2\n" - "\tldrh r0, [r0, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tmov r8, r0\n" - "\tasrs r6, r0, 16\n" - "\tadds r0, r6, 0\n" - "\tmov r1, r9\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp, 0x4]\n" - "\tldr r1, [sp, 0x14]\n" - "\tsubs r0, r3, r1\n" - "\tldr r2, [sp, 0x8]\n" - "\tadds r1, r0, 0\n" - "\tmuls r1, r2\n" - "\tadds r1, r7\n" - "\tldr r3, [sp]\n" - "\tldr r0, [r3, 0x1C]\n" - "\tlsls r1, 1\n" - "\tadds r1, r0\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 2\n" - "\tadds r0, r2, 0\n" - "\tldrh r1, [r1]\n" - "\tadds r0, r1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tbl GetBehaviorByMetatileId\n" - "\tmovs r3, 0xF0\n" - "\tlsls r3, 8\n" - "\tadds r1, r3, 0\n" - "\tadds r5, r1, 0\n" - "\tands r5, r0\n" - "\tadds r0, r4, 0\n" - "\tldr r1, [sp]\n" - "\tbl sub_80FFBDC\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFD1A\n" - "\tb _080FFFF4\n" - "_080FFD1A:\n" - "\tmov r0, r10\n" - "\tadds r1, r6, 0\n" - "\tmov r2, r9\n" - "\tadds r3, r5, 0\n" - "\tbl sub_80FFB94\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFD2E\n" - "\tb _080FFFF4\n" - "_080FFD2E:\n" - "\tmov r1, r8\n" - "\tlsrs r0, r1, 16\n" - "\tldr r2, [sp, 0xC]\n" - "\tlsrs r1, r2, 16\n" - "\tmovs r2, 0\n" - "\tbl GetFieldObjectIdByXYZ\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tcmp r4, 0\n" - "\tbeq _080FFD4A\n" - "\tcmp r4, 0x10\n" - "\tbeq _080FFD4A\n" - "\tb _080FFFF4\n" - "_080FFD4A:\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFCB8\n" - "_080FFD56:\n" - "\tldr r1, [sp, 0x14]\n" - "\tlsls r0, r1, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r2, [sp, 0x4]\n" - "\tcmp r6, r2\n" - "\tbcc _080FFC8C\n" - "\tb _08100024\n" - "\t.align 2, 0\n" - "_080FFD64: .4byte gTasks\n" - "_080FFD68:\n" - "\tmovs r6, 0\n" - "\tmov r3, r10\n" - "\tlsls r3, 2\n" - "\tstr r3, [sp, 0x1C]\n" - "\tldr r0, [sp, 0x4]\n" - "\tsubs r0, 0x1\n" - "\tstr r0, [sp, 0x18]\n" - "\tcmp r6, r0\n" - "\tbge _080FFE54\n" - "\tadds r0, r3, 0\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tstr r0, [sp, 0x10]\n" - "_080FFD82:\n" - "\tldr r1, [sp, 0x10]\n" - "\tadds r0, r1, r2\n" - "\tldrh r0, [r0, 0xA]\n" - "\tsubs r0, r6\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tadds r6, 0x1\n" - "\tstr r6, [sp, 0x14]\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcs _080FFE48\n" - "\tlsls r0, 16\n" - "\tstr r0, [sp, 0x20]\n" - "_080FFDA0:\n" - "\tldr r1, [sp, 0x10]\n" - "\tadds r0, r1, r2\n" - "\tldrh r0, [r0, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tmov r8, r0\n" - "\tasrs r6, r0, 16\n" - "\tmov r2, r9\n" - "\tlsls r1, r2, 16\n" - "\tadds r0, r6, 0\n" - "\tasrs r1, 16\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp, 0x4]\n" - "\tldr r1, [sp, 0x14]\n" - "\tsubs r0, r3, r1\n" - "\tldr r2, [sp, 0x8]\n" - "\tadds r1, r0, 0\n" - "\tmuls r1, r2\n" - "\tadds r1, r7\n" - "\tldr r3, [sp]\n" - "\tldr r0, [r3, 0x1C]\n" - "\tlsls r1, 1\n" - "\tadds r1, r0\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 2\n" - "\tadds r0, r2, 0\n" - "\tldrh r1, [r1]\n" - "\tadds r0, r1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tbl GetBehaviorByMetatileId\n" - "\tmovs r3, 0xF0\n" - "\tlsls r3, 8\n" - "\tadds r1, r3, 0\n" - "\tadds r5, r1, 0\n" - "\tands r5, r0\n" - "\tadds r0, r4, 0\n" - "\tbl sub_805729C\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFE0C\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r5, 0\n" - "\tbl sub_80FFB6C\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFE0C\n" - "\tb _080FFFF4\n" - "_080FFE0C:\n" - "\tmov r0, r10\n" - "\tadds r1, r6, 0\n" - "\tldr r3, [sp, 0x20]\n" - "\tasrs r2, r3, 16\n" - "\tadds r3, r5, 0\n" - "\tbl sub_80FFB94\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFE22\n" - "\tb _080FFFF4\n" - "_080FFE22:\n" - "\tmov r1, r8\n" - "\tlsrs r0, r1, 16\n" - "\tldr r2, [sp, 0x20]\n" - "\tlsrs r1, r2, 16\n" - "\tmovs r2, 0\n" - "\tbl GetFieldObjectIdByXYZ\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x10\n" - "\tbeq _080FFE3A\n" - "\tb _080FFFF4\n" - "_080FFE3A:\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r2, _080FFF18 @ =gTasks\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFDA0\n" - "_080FFE48:\n" - "\tldr r1, [sp, 0x14]\n" - "\tlsls r0, r1, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r3, [sp, 0x18]\n" - "\tcmp r6, r3\n" - "\tblt _080FFD82\n" - "_080FFE54:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tadds r0, r2\n" - "\tldrh r0, [r0, 0xA]\n" - "\tldr r1, [sp, 0x4]\n" - "\tsubs r0, r1\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFE74\n" - "\tb _08100024\n" - "_080FFE74:\n" - "\tlsls r0, 16\n" - "\tstr r0, [sp, 0x20]\n" - "_080FFE78:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tldr r1, _080FFF18 @ =gTasks\n" - "\tadds r0, r1\n" - "\tldrh r0, [r0, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tmov r8, r0\n" - "\tasrs r6, r0, 16\n" - "\tmov r2, r9\n" - "\tlsls r1, r2, 16\n" - "\tadds r0, r6, 0\n" - "\tasrs r1, 16\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp]\n" - "\tldr r0, [r3, 0x1C]\n" - "\tlsls r1, r7, 1\n" - "\tadds r1, r0\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 2\n" - "\tadds r0, r2, 0\n" - "\tldrh r1, [r1]\n" - "\tadds r0, r1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tbl GetBehaviorByMetatileId\n" - "\tmovs r3, 0xF0\n" - "\tlsls r3, 8\n" - "\tadds r1, r3, 0\n" - "\tadds r5, r1, 0\n" - "\tands r5, r0\n" - "\tadds r0, r4, 0\n" - "\tbl sub_805729C\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFEDA\n" - "\tadds r0, r4, 0\n" - "\tbl sub_80572B0\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFEDA\n" - "\tb _080FFFF4\n" - "_080FFEDA:\n" - "\tmov r0, r10\n" - "\tadds r1, r6, 0\n" - "\tldr r3, [sp, 0x20]\n" - "\tasrs r2, r3, 16\n" - "\tadds r3, r5, 0\n" - "\tbl sub_80FFB94\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFEF0\n" - "\tb _080FFFF4\n" - "_080FFEF0:\n" - "\tmov r1, r8\n" - "\tlsrs r0, r1, 16\n" - "\tldr r2, [sp, 0x20]\n" - "\tlsrs r1, r2, 16\n" - "\tmovs r2, 0\n" - "\tbl GetFieldObjectIdByXYZ\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tcmp r4, 0\n" - "\tbeq _080FFF0A\n" - "\tcmp r4, 0x10\n" - "\tbne _080FFFF4\n" - "_080FFF0A:\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFE78\n" - "\tb _08100024\n" - "\t.align 2, 0\n" - "_080FFF18: .4byte gTasks\n" - "_080FFF1C:\n" - "\tmovs r6, 0\n" - "\tldr r0, [sp, 0x4]\n" - "\tcmp r6, r0\n" - "\tbcc _080FFF26\n" - "\tb _08100024\n" - "_080FFF26:\n" - "\tmov r1, r10\n" - "\tlsls r0, r1, 2\n" - "\tadd r0, r10\n" - "\tlsls r1, r0, 3\n" - "\tldr r2, _080FFF9C @ =gTasks\n" - "\tadds r0, r1, r2\n" - "\tldrh r0, [r0, 0xA]\n" - "\tsubs r0, r6\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcs _080FFF8C\n" - "\tadds r0, r2, 0\n" - "\tadds r1, r0\n" - "\tmov r8, r1\n" - "\tmov r1, r9\n" - "\tlsls r0, r1, 16\n" - "\tasrs r5, r0, 16\n" - "_080FFF50:\n" - "\tmov r2, r8\n" - "\tldrh r0, [r2, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tasrs r4, r0, 16\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r5, 0\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tbl sub_80572B0\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _080FFFF4\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r5, 0x1\n" - "\tbl MapGridGetMetatileIdAt\n" - "\tmovs r1, 0xA3\n" - "\tlsls r1, 2\n" - "\tcmp r0, r1\n" - "\tbeq _080FFFF4\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFF50\n" - "_080FFF8C:\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r0, [sp, 0x4]\n" - "\tcmp r6, r0\n" - "\tbcc _080FFF26\n" - "\tb _08100024\n" - "\t.align 2, 0\n" - "_080FFF9C: .4byte gTasks\n" - "_080FFFA0:\n" - "\tmov r3, r10\n" - "\tlsls r1, r3, 2\n" - "\tadds r0, r1, r3\n" - "\tlsls r0, 3\n" - "\tadds r0, r2\n" - "\tldrh r0, [r0, 0xA]\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tstr r1, [sp, 0x1C]\n" - "\tldr r0, [sp, 0x8]\n" - "\tcmp r7, r0\n" - "\tbcs _08100024\n" - "\tadds r6, r2, 0\n" - "\tmov r1, r9\n" - "\tlsls r1, 16\n" - "\tstr r1, [sp, 0x20]\n" - "_080FFFC0:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tadds r0, r6\n" - "\tldrh r0, [r0, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tasrs r0, 16\n" - "\tmov r2, r9\n" - "\tlsls r1, r2, 16\n" - "\tasrs r1, 16\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp]\n" - "\tldrb r0, [r3, 0x12]\n" - "\tcmp r0, 0x5\n" - "\tbne _080FFFF8\n" - "_080FFFE8:\n" - "\tadds r0, r4, 0\n" - "\tbl sub_80572EC\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _08100004\n" - "_080FFFF4:\n" - "\tmovs r0, 0\n" - "\tb _08100026\n" - "_080FFFF8:\n" - "\tadds r0, r4, 0\n" - "\tbl sub_80572D8\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _080FFFE8\n" - "_08100004:\n" - "\tadds r0, r5, 0\n" - "\tldr r2, [sp, 0x20]\n" - "\tlsrs r1, r2, 16\n" - "\tmovs r2, 0\n" - "\tbl GetFieldObjectIdByXYZ\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x10\n" - "\tbne _080FFFF4\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFFC0\n" - "_08100024:\n" - "\tmovs r0, 0x1\n" - "_08100026:\n" - "\tadd sp, 0x24\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1\n" - ".syntax divided\n"); -} -#endif - -void sub_8100038(u8 taskId) -{ - if (sub_80FFC24(taskId, &gDecorations[gUnknown_020388D0[gUnknown_020388F5]]) == 1) - { - DisplayItemMessageOnField(taskId, gSecretBaseText_PlaceItHere, sub_81000A0, 0); - } else - { - PlaySE(SE_HAZURE); - DisplayItemMessageOnField(taskId, gSecretBaseText_CantBePlacedHere, sub_81006A8, 0); - } -} - -void sub_81000A0(u8 taskId) -{ - DisplayYesNoMenu(20, 8, 1); - DoYesNoFuncWithChoice(taskId, &gUnknown_083EC95C); -} - -void sub_81000C4(u8 taskId) -{ - MenuZeroFillWindowRect(0, 0, 29, 19); - sub_8100174(taskId); - if (gDecorations[gUnknown_020388D0[gUnknown_020388F5]].permission != DECORPERM_SOLID_MAT) - { - sub_80FF394(gTasks[taskId].data[0], gTasks[taskId].data[1], gUnknown_020388D0[gUnknown_020388F5]); - } else - { - gUnknown_020391A4 = gTasks[taskId].data[0] - 7; - gUnknown_020391A6 = gTasks[taskId].data[1] - 7; - ScriptContext1_SetupScript(gUnknown_081A2F7B); - } - gSprites[gUnknown_020391A8].pos1.y += 2; - sub_810028C(taskId); -} - -void sub_8100174(u8 taskId) -{ - u16 i; - for (i=0; i= gMapHeader.mapData->height) - { - data[1]--; - return FALSE; - } else if (gUnknown_020391AA == DIR_WEST && data[0] - 7 < 0) - { - data[0]++; - return FALSE; - } else if (gUnknown_020391AA == DIR_EAST && data[0] + data[5] - 8 >= gMapHeader.mapData->width) - { - data[0]--; - return FALSE; - } - return TRUE; -} - -bool8 sub_8100430(void) -{ - if ((gMain.heldKeys & DPAD_ANY) != DPAD_UP && (gMain.heldKeys & DPAD_ANY) != DPAD_DOWN && (gMain.heldKeys & DPAD_ANY) != DPAD_LEFT && (gMain.heldKeys & DPAD_ANY) != DPAD_RIGHT) - { - return FALSE; - } - return TRUE; -} - -void sub_810045C(void) -{ - gUnknown_020391AA = 0; - gSprites[gUnknown_020391A8].data2 = 0; - gSprites[gUnknown_020391A8].data3 = 0; -} - -void sub_8100494(u8 taskId) -{ - if (!gSprites[gUnknown_020391A8].data4) - { - if (gTasks[taskId].data[10] == 1) - { - gUnknown_083EC96C[gTasks[taskId].data[12]].yesFunc(taskId); - return; - } else if (gTasks[taskId].data[10] == 2) - { - gUnknown_083EC96C[gTasks[taskId].data[12]].noFunc(taskId); - return; - } - if ((gMain.heldKeys & DPAD_ANY) == DPAD_UP) - { - gUnknown_020391AA = DIR_SOUTH; - gSprites[gUnknown_020391A8].data2 = 0; - gSprites[gUnknown_020391A8].data3 = -2; - gTasks[taskId].data[1]--; - } - if ((gMain.heldKeys & DPAD_ANY) == DPAD_DOWN) - { - gUnknown_020391AA = DIR_NORTH; - gSprites[gUnknown_020391A8].data2 = 0; - gSprites[gUnknown_020391A8].data3 = 2; - gTasks[taskId].data[1]++; - } - if ((gMain.heldKeys & DPAD_ANY) == DPAD_LEFT) - { - gUnknown_020391AA = DIR_WEST; - gSprites[gUnknown_020391A8].data2 = -2; - gSprites[gUnknown_020391A8].data3 = 0; - gTasks[taskId].data[0]--; - } - if ((gMain.heldKeys & DPAD_ANY) == DPAD_RIGHT) - { - gUnknown_020391AA = DIR_EAST; - gSprites[gUnknown_020391A8].data2 = 2; - gSprites[gUnknown_020391A8].data3 = 0; - gTasks[taskId].data[0]++; - } - if (!sub_8100430() || !sub_810038C(taskId)) - { - sub_810045C(); - } - } - if (gUnknown_020391AA) - { - gSprites[gUnknown_020391A8].data4++; - gSprites[gUnknown_020391A8].data4 &= 7; - } - if (!gTasks[taskId].data[10]) - { - if (gMain.newKeys & A_BUTTON) - { - gTasks[taskId].data[10] = A_BUTTON; - } - if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].data[10] = B_BUTTON; - } - } -} - -void sub_810065C(u8 taskId) -{ - MenuZeroFillWindowRect(0, 0, 29, 19); - gSprites[gUnknown_020391A8].data7 = 0; - gTasks[taskId].data[10] = 0; - gTasks[taskId].func = sub_8100494; -} - -void sub_81006A8(u8 taskId) -{ - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - sub_810065C(taskId); - } -} - -void sub_81006D0(struct UnkStruct_02038900 *unk_02038900) -{ - u16 i; - for (i=0; i<0x800; i++) - { - unk_02038900->image[i] = 0; - } - for (i=0; i<0x40; i++) - { - unk_02038900->tiles[i] = 0; - } -} - -void sub_810070C(u16 *a0, u16 a1) -{ - u16 i; - for (i=0; i<16; i++) - { - a0[i] = ((u16 *)gMapHeader.mapData->primaryTileset->palettes)[16 * a1 + i]; - } -} - -void sub_8100740(u8 *dest, u16 flags) -{ - u8 buffer[32]; - u16 mode; - u16 i; - mode = flags >> 10; - if (flags != 0) - { - flags &= 0x3ff; - } - for (i=0; i<32; i++) - { - buffer[i] = ((u8 *)gMapHeader.mapData->primaryTileset->tiles)[flags * 32 + i]; - } - switch (mode) - { - case 0: - for (i=0; i<32; i++) - { - dest[i] = buffer[i]; - } - break; - case 1: - for (i=0; i<8; i++) - { - dest[4*i] = (buffer[4*(i+1) - 1] >> 4) + ((buffer[4*(i+1) - 1] & 0xf) << 4); - dest[4*i + 1] = (buffer[4*(i+1) - 2] >> 4) + ((buffer[4*(i+1) - 2] & 0xf) << 4); - dest[4*i + 2] = (buffer[4*(i+1) - 3] >> 4) + ((buffer[4*(i+1) - 3] & 0xf) << 4); - dest[4*i + 3] = (buffer[4*(i+1) - 4] >> 4) + ((buffer[4*(i+1) - 4] & 0xf) << 4); - } - break; - case 2: - for (i=0; i<8; i++) - { - dest[4*i] = buffer[4*(7-i)]; - dest[4*i + 1] = buffer[4*(7-i) + 1]; - dest[4*i + 2] = buffer[4*(7-i) + 2]; - dest[4*i + 3] = buffer[4*(7-i) + 3]; - } - break; - case 3: - for (i=0; i<32; i++) - { - dest[i] = (buffer[31-i] >> 4) + ((buffer[31-i] & 0xf) << 4); - } - break; - } -} - -void sub_8100874(struct UnkStruct_02038900 *unk_02038900) -{ - u16 i; - for (i=0; i<0x40; i++) - sub_8100740(&unk_02038900->image[i * 32], unk_02038900->tiles[i]); -} - -u16 sub_810089C(u16 a0) -{ - return ((u16 *)gMapHeader.mapData->secondaryTileset->metatiles)[a0] & 0xfff; -} - -void sub_81008BC(struct UnkStruct_02038900 *unk_02038900) -{ - u8 i; - u8 shape; - shape = unk_02038900->decoration->shape; - for (i=0; itiles[gUnknown_083EC860[shape].tiles[i]] = sub_810089C(unk_02038900->decoration->tiles[gUnknown_083EC860[shape].y[i]] * 8 + gUnknown_083EC860[shape].x[i]); - } -} - -void sub_8100930(u8 decoShape) -{ - gUnknown_020391AC.y = 0; - gUnknown_020391AC.affineMode = 0; - gUnknown_020391AC.objMode = 0; - gUnknown_020391AC.mosaic = 0; - gUnknown_020391AC.bpp = 0; - gUnknown_020391AC.shape = gUnknown_083EC900[decoShape].shape; - gUnknown_020391AC.x = 0; - gUnknown_020391AC.matrixNum = 0; - gUnknown_020391AC.size = gUnknown_083EC900[decoShape].size; - gUnknown_020391AC.tileNum = 0; - gUnknown_020391AC.priority = 1; - gUnknown_020391AC.paletteNum = 0; -} - -void sub_81009A8(struct Sprite *sprite) -{ - sprite->data2 = 0; - sprite->data3 = 0; - sprite->data4 = 0; - sprite->data5 = 0; - sprite->data6 = 0; - sprite->data7 = 0; - sprite->callback = sub_81009C0; -} - -void sub_81009C0(struct Sprite *sprite) -{ - if (sprite->data7 == 0) - { - if (sprite->data6 < 15) - { - sprite->invisible = 0; - } else - { - sprite->invisible = 1; - } - sprite->data6 = (sprite->data6 + 1) & 0x1f; - } else - { - sprite->invisible = 0; - } -} - -void sub_8100A0C(u8 taskId) -{ - if (sub_8100D38(taskId) == 1) - { - fade_screen(1, 0); - gTasks[taskId].data[2] = 0; - gTasks[taskId].func = sub_8100E70; - } else - { - DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecorInUse, sub_80FE428, 0); - } -} - -void sub_8100A60(u8 a0) -{ - ewram_1f000.items[a0] = 0; - ewram_1f000.pos[a0] = 0; -} - -void sub_8100A7C(void) -{ - u16 i; - gSpecialVar_0x8005 = 0; - gScriptResult = 0; - if (gSpecialVar_0x8004 == gUnknown_02039234) - { - gScriptResult = 1; - } else if (gDecorations[ewram_1f000.items[gUnknown_020391B4[gSpecialVar_0x8004].decorId]].permission == DECORPERM_SOLID_MAT) - { - gSpecialVar_0x8005 = gUnknown_020391B4[gSpecialVar_0x8004].flagId; - sub_8100A60(gUnknown_020391B4[gSpecialVar_0x8004].decorId); - for (i=0; imapObjectCount; i++) - { - if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8005) - { - gSpecialVar_0x8006 = gMapHeader.events->mapObjects[i].localId; - break; - } - } - } -} - -void sub_8100B20(void) -{ - u8 i; - for (i=0; imapObjectCount; i++) - { - if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8004) - { - gSpecialVar_0x8005 = gMapHeader.events->mapObjects[i].localId; - break; - } - } -} - -void sub_8100B6C(void) -{ - u8 i; - u8 j; - u8 k; - u8 x; - u8 y; - u8 permission; - for (i=0; i> 4; - y = ewram_1f000.pos[gUnknown_020391B4[i].decorId] & 0xf; - if (permission != DECORPERM_SOLID_MAT) - { - if (ewram_1f000.items[gUnknown_020391B4[i].decorId] == DECOR_SAND_ORNAMENT && MapGridGetMetatileIdAt(x + 7, y + 7) == 0x28c) - { - gUnknown_020391B4[i].height++; - } - for (j=0; jmap)[(x + k) + gMapHeader.mapData->width * (y - j)] | 0x3000); - } - } - sub_8100A60(gUnknown_020391B4[i].decorId); - } - } -} - -void sub_8100C88(u8 taskId) -{ - switch (gTasks[taskId].data[2]) - { - case 0: - sub_8100B6C(); - gTasks[taskId].data[2] = 1; - break; - case 1: - if (!gPaletteFade.active) - { - DrawWholeMapView(); - ScriptContext1_SetupScript(gUnknown_081A2F8A); - MenuZeroFillWindowRect(0, 0, 29, 19); - gTasks[taskId].data[2] = 2; - } - break; - case 2: - ScriptContext2_Enable(); - sub_80FED90(taskId); - pal_fill_black(); - gTasks[taskId].data[2] = 3; - break; - case 3: - if (sub_807D770() == 1) - { - gTasks[taskId].data[13] = -1; - DisplayItemMessageOnField(taskId, gSecretBaseText_DecorReturned, sub_81010F0, 0); - } - break; - } -} - -bool8 sub_8100D38(u8 taskId) -{ - u16 i; - for (i=0; iwidth = 1; - unk_020391B4->height = 1; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_2x1) - { - unk_020391B4->width = 2; - unk_020391B4->height = 1; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_3x1) - { - unk_020391B4->width = 3; - unk_020391B4->height = 1; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_4x2) - { - unk_020391B4->width = 4; - unk_020391B4->height = 2; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_2x2) - { - unk_020391B4->width = 2; - unk_020391B4->height = 2; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_1x2) - { - unk_020391B4->width = 1; - unk_020391B4->height = 2; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_1x3) - { - unk_020391B4->width = 1; - unk_020391B4->height = 3; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_2x4) - { - unk_020391B4->width = 2; - unk_020391B4->height = 4; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_3x3) - { - unk_020391B4->width = 3; - unk_020391B4->height = 3; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_3x2) - { - unk_020391B4->width = 3; - unk_020391B4->height = 2; - } -} - -void sub_8101198(u8 x, u8 y) -{ - gSprites[gUnknown_020391A8].invisible = 1; - gSprites[gUnknown_020391A8].callback = SpriteCallbackDummy; - gSprites[gUnknown_020391A9].pos1.x = 0x88 + x * 16; - gSprites[gUnknown_020391A9].pos1.y = 0x48 + y * 16; -} - -bool8 sub_8101200(u8 taskId, u8 decorIdx, struct UnkStruct_020391B4 *unk_020391B4) -{ - u8 x; - u8 y; - u8 xOff; - u8 yOff; - x = gTasks[taskId].data[0] - 7; - y = gTasks[taskId].data[1] - 7; - xOff = ewram_1f000.pos[decorIdx] >> 4; - yOff = ewram_1f000.pos[decorIdx] & 0xf; - if (ewram_1f000.items[decorIdx] == DECOR_SAND_ORNAMENT && MapGridGetMetatileIdAt(xOff + 7, yOff + 7) == 0x28c) - { - unk_020391B4->height--; - } - if (x >= xOff && x < xOff + unk_020391B4->width && y > yOff - unk_020391B4->height && y <= yOff) - { - sub_8101198(unk_020391B4->width - (x - xOff + 1), yOff - y); - return TRUE; - } - return FALSE; -} - -void sub_81012A0(void) -{ - u8 xOff; - u8 yOff; - u16 i; - xOff = ewram_1f000.pos[gUnknown_020391B4[gUnknown_02039234].decorId] >> 4; - yOff = ewram_1f000.pos[gUnknown_020391B4[gUnknown_02039234].decorId] & 0xf; - for (i=0; i<0x40; i++) - { - if (gSaveBlock1.mapObjectTemplates[i].x == xOff && gSaveBlock1.mapObjectTemplates[i].y == yOff && !FlagGet(gSaveBlock1.mapObjectTemplates[i].flagId)) - { - gUnknown_020391B4[gUnknown_02039234].flagId = gSaveBlock1.mapObjectTemplates[i].flagId; - break; - } - } -} - -bool8 sub_8101340(u8 taskId) -{ - u16 i; - for (i=0; idecorId = i; - sub_81012A0(); - gUnknown_02039234 = 1; - return TRUE; - } - } - } - } - return FALSE; -} - -void sub_81013B8(u8 a0, u8 a1, u8 a2, u8 a3) -{ - u8 i; - u8 xOff; - u8 yOff; - u8 decorIdx; - for (i=0; i> 4; - yOff = ewram_1f000.pos[i] & 0xf; - if (decorIdx != 0 && gDecorations[decorIdx].permission == DECORPERM_SOLID_MAT && a0 <= xOff && a1 <= yOff && a2 >= xOff && a3 >= yOff) - { - gUnknown_020391B4[gUnknown_02039234].decorId = i; - sub_81012A0(); - gUnknown_02039234++; - } - } -} - -#ifdef NONMATCHING -void sub_8101460(u8 taskId) -{ - u8 i; - u8 xOff; - u8 yOff; - gUnknown_02039234 = 0; - if (sub_8101340(taskId) != TRUE) - { - for (i=0; i> 4; - yOff = ewram_1f000.pos[gUnknown_020391B4[0].decorId] & 0xf; - sub_81013B8(xOff, yOff - gUnknown_020391B4[0].height + 1, xOff + gUnknown_020391B4[0].width - 1, yOff); - } - } -} -#else -__attribute__((naked)) -void sub_8101460(u8 taskId) -{ - asm(".syntax unified\n" - "\tpush {r4-r7,lr}\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r4, _081014B8 @ =gUnknown_02039234\n" - "\tmovs r0, 0\n" - "\tstrb r0, [r4]\n" - "\tadds r0, r6, 0\n" - "\tbl sub_8101340\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbeq _08101504\n" - "\tmovs r5, 0\n" - "\tldr r0, _081014BC @ =ewram_1f000\n" - "\tldrb r1, [r0, 0x8]\n" - "\tcmp r5, r1\n" - "\tbcs _081014D2\n" - "\tadds r7, r4, 0\n" - "_08101486:\n" - "\tldr r0, [r0]\n" - "\tadds r0, r5\n" - "\tldrb r1, [r0] @ compiler incorrectly uses r0 for this and the next instruction\n" - "\tcmp r1, 0\n" - "\tbeq _081014C4\n" - "\tldr r4, _081014C0 @ =gUnknown_020391B4\n" - "\tadds r0, r1, 0\n" - "\tadds r1, r4, 0\n" - "\tbl sub_8101118\n" - "\tadds r0, r6, 0\n" - "\tadds r1, r5, 0\n" - "\tadds r2, r4, 0\n" - "\tbl sub_8101200\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbne _081014C4\n" - "\tstrb r5, [r4]\n" - "\tldrb r0, [r7]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r7]\n" - "\tb _081014D2\n" - "\t.align 2, 0\n" - "_081014B8: .4byte gUnknown_02039234\n" - "_081014BC: .4byte 0x201f000\n" - "_081014C0: .4byte gUnknown_020391B4\n" - "_081014C4:\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tldr r0, _0810150C @ =ewram_1f000\n" - "\tldrb r1, [r0, 0x8]\n" - "\tcmp r5, r1\n" - "\tbcc _08101486\n" - "_081014D2:\n" - "\tldr r0, _08101510 @ =gUnknown_02039234\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbeq _08101504\n" - "\tldr r0, _0810150C @ =ewram_1f000\n" - "\tldr r2, _08101514 @ =gUnknown_020391B4\n" - "\tldrb r1, [r2]\n" - "\tldr r0, [r0, 0x4]\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tlsrs r0, r1, 4\n" - "\tmovs r3, 0xF\n" - "\tands r3, r1\n" - "\tldrb r1, [r2, 0x2]\n" - "\tsubs r1, r3, r1\n" - "\tadds r1, 0x1\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tldrb r2, [r2, 0x1]\n" - "\tadds r2, r0\n" - "\tsubs r2, 0x1\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tbl sub_81013B8\n" - "_08101504:\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0810150C: .4byte 0x201f000\n" - "_08101510: .4byte gUnknown_02039234\n" - "_08101514: .4byte gUnknown_020391B4\n" - ".syntax divided\n"); -} -#endif - -void sub_8101518(u8 taskId) -{ - DisplayYesNoMenu(20, 8, 1); - DoYesNoFuncWithChoice(taskId, &gUnknown_083EC9CC); -} - -void sub_810153C(u8 taskId) -{ - fade_screen(1, 0); - gTasks[taskId].data[2] = 0; - gTasks[taskId].func = sub_8100C88; -} - -void sub_810156C(u8 taskId) -{ - DisplayYesNoMenu(20, 8, 1); - DoYesNoFuncWithChoice(taskId, &gUnknown_083EC9D4); -} - -void sub_8101590(u8 taskId) -{ - MenuZeroFillWindowRect(0, 0, 29, 19); - sub_81015B0(taskId); -} - -void sub_81015B0(u8 taskId) -{ - fade_screen(1, 0); - gTasks[taskId].data[2] = 0; - gTasks[taskId].func = sub_81015E0; -} - -void sub_81015E0(u8 taskId) -{ - switch (gTasks[taskId].data[2]) - { - case 0: - if (!gPaletteFade.active) - { - sub_80FF114(taskId); - gTasks[taskId].data[2] = 1; - } - break; - case 1: - sub_81016F4(); - gFieldCallback = sub_8101678; - SetMainCallback2(c2_exit_to_overworld_2_switch); - DestroyTask(taskId); - break; - } -} - -void sub_8101648(u8 taskId) -{ - if (sub_807D770() == TRUE) - { - gTasks[taskId].func = Task_DecorationPCProcessMenuInput; - } -} - -void sub_8101678(void) -{ - pal_fill_black(); - MenuDisplayMessageBox(); - sub_80FE220(); - CreateTask(sub_8101648, 8); -} - -void sub_8101698(struct Sprite *sprite) -{ - sprite->data0 = (sprite->data0 + 1) & 0x1f; - if (sprite->data0 >= 16) - { - sprite->invisible = TRUE; - } else - { - sprite->invisible = FALSE; - } -} - -void sub_81016C8(void) -{ - if (gSaveBlock2.playerGender == MALE) - { - LoadSpritePalette(&gUnknown_083ECA5C); - } else - { - LoadSpritePalette(&gUnknown_083ECA64); - } -} - -void sub_81016F4(void) -{ - FreeSpritePaletteByTag(8); -} - -void sub_8101700(u8 taskId) -{ - if (!sub_81341D4()) - { - DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE428, 0); - } else - { - gTasks[taskId].data[11] = 1; - gUnknown_020388F6 = 0; - sub_80FE5AC(taskId); - } -} - -void sub_8101750(u8 taskId) -{ - if (!sub_81341D4()) - { - DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE428, 0); - } else - { - gTasks[taskId].data[11] = 2; - gUnknown_020388F6 = 0; - sub_80FE5AC(taskId); - } -} - -void sub_81017A0(u8 taskId) -{ - sub_80FEF74(); - sub_80FED1C(); - if (sub_80FEFA4() == TRUE) - { - StringCopy(gStringVar1, gDecorations[gUnknown_020388D0[gUnknown_020388F5]].name); - StringExpandPlaceholders(gStringVar4, gSecretBaseText_WillBeDiscarded); - DisplayItemMessageOnField(taskId, gStringVar4, sub_8101824, 0); - } else - { - DisplayItemMessageOnField(taskId, gSecretBaseText_DecorInUse, sub_80FEFF4, 0); - } -} - -void sub_8101824(u8 taskId) -{ - DisplayYesNoMenu(20, 8, 1); - DoYesNoFuncWithChoice(taskId, &gUnknown_083ECAA0); -} - -void sub_8101848(u8 taskId) -{ - MenuZeroFillWindowRect(20, 8, 26, 14); - sub_8109A30(gUnknown_020388D0[gUnknown_020388F5]); - gUnknown_020388D0[gUnknown_020388F5] = DECOR_NONE; - sub_80FF098(taskId); - DisplayItemMessageOnField(taskId, gSecretBaseText_DecorThrownAway, sub_80FEFF4, 0); -} diff --git a/src/decoration_inventory.c b/src/decoration_inventory.c deleted file mode 100644 index 35ba7e228..000000000 --- a/src/decoration_inventory.c +++ /dev/null @@ -1,169 +0,0 @@ -// -// Created by Scott Norton on 6/5/17. -// - -#include "global.h" -#include "sprite.h" -#include "task.h" -#include "decoration.h" -#include "decoration_inventory.h" - -#define DECOR_INV(ptr) {.items = (u8 *)&ptr, .size = sizeof ptr} - -struct DecorationInventory const gDecorationInventories[] = { - DECOR_INV(gSaveBlock1.decorDesk), - DECOR_INV(gSaveBlock1.decorChair), - DECOR_INV(gSaveBlock1.decorPlant), - DECOR_INV(gSaveBlock1.decorOrnament), - DECOR_INV(gSaveBlock1.decorMat), - DECOR_INV(gSaveBlock1.decorPoster), - DECOR_INV(gSaveBlock1.decorDoll), - DECOR_INV(gSaveBlock1.decorCushion) -}; - -void ClearDecorationInventory(u8 invIdx) -{ - u8 i; - for (i=0; i gDecorationInventories[invIdx].items[j])) - { - tmp = gDecorationInventories[invIdx].items[i]; - gDecorationInventories[invIdx].items[i] = gDecorationInventories[invIdx].items[j]; - gDecorationInventories[invIdx].items[j] = tmp; - } - } - } -} - -u8 sub_8134194(u8 invIdx) -{ - u8 i; - u8 count; - count = 0; - for (i=0; iunk1_6 == 0) - { - if (r5->unk0_0 >= (u16)r2) - { - r5->unk0_0 -= r2; - if (r5->unk0_0 == 0) - r5->unk1_6 = 1; - continue; - } - //_080FA290 - r2 -= r5->unk0_0; - r5->unk0_0 = 0; - r5->unk1_6 = 1; - } - //_080FA2A0 - r4 = r5->unk0_0 + r2; - if ((u16)r4 > r5->unk0_7) - { - u32 sp4 = r4 % r5->unk0_7; - r4 = r4 / r5->unk0_7; - - r5->unk1_6 = r4 ^ 1; - if (r5->unk1_6) - r5->unk0_0 = sp4; - else - //_080FA2FA - r5->unk0_0 = r5->unk0_7 - sp4; - } - else - { - //_080FA310 - r5->unk0_0 = r4; - - if (r5->unk0_0 == r5->unk0_7) - r5->unk1_6 = 0; - } - } - sub_80FA46C(gSaveBlock1.easyChatPairs, 5, 0); - } - //_080FA34E -} - -bool8 sub_80FA364(u16 *a) -{ - struct EasyChatPair s = {0}; - u16 i; - - if (!SB1ContainsWords(a)) - { - if (!FlagGet(SYS_POPWORD_INPUT)) - { - FlagSet(SYS_POPWORD_INPUT); - if (!FlagGet(SYS_MIX_RECORD)) - { - gSaveBlock1.easyChatPairs[0].words[0] = a[0]; - gSaveBlock1.easyChatPairs[0].words[1] = a[1]; - return 1; - } - } - - //_080FA3C8 - s.words[0] = a[0]; - s.words[1] = a[1]; - s.unk1_6 = 1; - sub_80FA740(&s); - - for (i = 0; i < 5; i++) - { - if (sub_80FA670(&s, &gSaveBlock1.easyChatPairs[i], 0)) - { - u16 r3 = 4; - - while (r3 > i) - { - gSaveBlock1.easyChatPairs[r3] = gSaveBlock1.easyChatPairs[r3 - 1]; - r3--; - } - gSaveBlock1.easyChatPairs[i] = s; - return (i == 0); - } - //_080FA450 - } - gSaveBlock1.easyChatPairs[4] = s; - } - return 0; -} - -static void sub_80FA46C(struct EasyChatPair *s, u16 b, u8 c) -{ - u16 h; - - for (h = 0; h < b; h++) - { - u16 i; - - for (i = h + 1; i < b; i++) - { - if (sub_80FA670(&s[i], &s[h], c)) - { - struct EasyChatPair temp; - - temp = s[i]; - s[i] = s[h]; - s[h] = temp; - } - } - } -} - -void sub_80FA4E4(void *a, u32 b, u8 unused) -{ - u16 i; - u16 j; - u16 r7; - struct EasyChatPair *src; - struct EasyChatPair *dst; - u16 players = GetLinkPlayerCount(); - - for (i = 0; i < players; i++) - memcpy(&ARRAY_2007800[i * 5], (u8 *)a + i * b, 40); - src = ARRAY_2007800; - dst = ARRAY_2007900; - r7 = 0; - for (i = 0; i < players; i++) - { - for (j = 0; j < 5; j++) - { - s16 foo = sub_80FA828(src, r7); - if (foo < 0) - { - *(dst++) = *src; - r7++; - } - else - { - if (ARRAY_2007900[foo].unk0_0 < src->unk0_0) - { - ARRAY_2007900[foo] = *src; - } - } - src++; - } - } - sub_80FA46C(ARRAY_2007900, r7, 2); - src = ARRAY_2007900; - dst = gSaveBlock1.easyChatPairs; - for (i = 0; i < 5; i++) - *(dst++) = *(src++); -} - -void sub_80FA5BC(void) -{ - struct EasyChatPair *s = &gSaveBlock1.easyChatPairs[gSpecialVar_0x8004]; - - ConvertEasyChatWordsToString(gStringVar1, s->words, 2, 1); -} - -void sub_80FA5E4(void) -{ - u16 result = 0; - - if (gSaveBlock1.easyChatPairs[0].unk0_0 - gSaveBlock1.easyChatPairs[1].unk0_0 < 2) - { - asm("":::"r2"); //Force the compiler to store address of gSaveBlock1 in r3 instead of r2 - if (!gSaveBlock1.easyChatPairs[0].unk1_6 && gSaveBlock1.easyChatPairs[1].unk1_6) - result = 1; - } - gScriptResult = result; -} - -void sub_80FA648(void) -{ - gScriptResult = (gSaveBlock1.easyChatPairs[0].words[0] + gSaveBlock1.easyChatPairs[0].words[1]) & 7; -} - -static bool8 sub_80FA670(struct EasyChatPair *a, struct EasyChatPair *b, u8 c) -{ - switch (c) - { - case 0: - if (a->unk0_0 > b->unk0_0) - return 1; - if (a->unk0_0 < b->unk0_0) - return 0; - if (a->unk0_7 > b->unk0_7) - return 1; - if (a->unk0_7 < b->unk0_7) - return 0; - break; - case 1: - if (a->unk0_7 > b->unk0_7) - return 1; - if (a->unk0_7 < b->unk0_7) - return 0; - if (a->unk0_0 > b->unk0_0) - return 1; - if (a->unk0_0 < b->unk0_0) - return 0; - break; - case 2: - if (a->unk0_0 > b->unk0_0) - return 1; - if (a->unk0_0 < b->unk0_0) - return 0; - if (a->unk0_7 > b->unk0_7) - return 1; - if (a->unk0_7 < b->unk0_7) - return 0; - if (a->unk2 > b->unk2) - return 1; - if (a->unk2 < b->unk2) - return 0; - if (a->words[0] > b->words[0]) - return 1; - if (a->words[0] < b->words[0]) - return 0; - if (a->words[1] > b->words[1]) - return 1; - if (a->words[1] < b->words[1]) - return 0; - return 1; - } - return Random() & 1; -} - -static void sub_80FA740(struct EasyChatPair *s) -{ - u16 r4; - - r4 = Random() % 98; - if (r4 > 50) - { - r4 = Random() % 98; - if (r4 > 80) - r4 = Random() % 98; - } - s->unk0_7 = r4 + 30; - s->unk0_0 = (Random() % (r4 + 1)) + 30; - s->unk2 = Random(); -} - -static bool8 SB1ContainsWords(u16 *a) -{ - u16 i; - - for (i = 0; i < 5; i++) - { - if (IsEasyChatPairEqual(a, gSaveBlock1.easyChatPairs[i].words) != 0) - return TRUE; - } - return FALSE; -} - -static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2) -{ - u16 i; - - for (i = 0; i < 2; i++) - { - if (*(words1++) != *(words2++)) - return FALSE; - } - return TRUE; -} - -static s16 sub_80FA828(struct EasyChatPair *a, u16 b) -{ - s16 i; - struct EasyChatPair *s = ARRAY_2007900; - - for (i = 0; i < b; i++) - { - if (IsEasyChatPairEqual(a->words, s->words)) - return i; - s++; - } - return -1; -} diff --git a/src/diploma.c b/src/diploma.c deleted file mode 100644 index ba7de58aa..000000000 --- a/src/diploma.c +++ /dev/null @@ -1,139 +0,0 @@ -#include "global.h" -#include "diploma.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "pokedex.h" -#include "rom4.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "text.h" -#include "unknown_task.h" - -static void VBlankCB(void); -static void MainCB2(void); -static void Task_DiplomaFadeIn(u8); -static void Task_DiplomaWaitForKeyPress(u8); -static void Task_DiplomaFadeOut(u8); -static void DisplayDiplomaText(void); - -static const u16 gDiplomaPalettes[][16] = -{ - INCBIN_U16("graphics/misc/diploma_national.gbapal"), - INCBIN_U16("graphics/misc/diploma_hoenn.gbapal"), -}; - -static const u8 gDiplomaTilemap[] = INCBIN_U8("graphics/misc/diploma_map.bin.lz"); -static const u8 gDiplomaTiles[] = INCBIN_U8("graphics/misc/diploma.4bpp.lz"); - -static void VBlankCB(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void sub_8145D88(void) -{ - u32 savedIme; - - SetVBlankCallback(NULL); - - REG_DISPCNT = 0; - REG_BG3CNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - DmaFill16(3, 0, VRAM, VRAM_SIZE); - DmaFill32(3, 0, OAM, OAM_SIZE); - DmaFill16(3, 0, PLTT, PLTT_SIZE); - - LZ77UnCompVram(gDiplomaTiles, (void *)VRAM); - LZ77UnCompVram(gDiplomaTilemap, (void *)(VRAM + 0x3000)); - - remove_some_task(); - ResetTasks(); - ResetSpriteData(); - ResetPaletteFade(); - FreeAllSpritePalettes(); - LoadPalette(gDiplomaPalettes, 0, 64); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - DisplayDiplomaText(); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - - SetVBlankCallback(VBlankCB); - SetMainCallback2(MainCB2); - - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT512x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - - CreateTask(Task_DiplomaFadeIn, 0); -} - -static void MainCB2(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void Task_DiplomaFadeIn(u8 taskId) -{ - if (!gPaletteFade.active) - gTasks[taskId].func = Task_DiplomaWaitForKeyPress; -} - -static void Task_DiplomaWaitForKeyPress(u8 taskId) -{ - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_DiplomaFadeOut; - } -} - -static void Task_DiplomaFadeOut(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyTask(taskId); - SetMainCallback2(sub_80546F0); - } -} - -static void DisplayDiplomaText(void) -{ - if (sub_8090FF4()) - { - REG_BG3HOFS = 256; - StringCopy(gStringVar1, gOtherText_NationalDex); - } - else - { - REG_BG3HOFS = 0; - StringCopy(gStringVar1, gOtherText_HoennDex); - } - MenuPrint(gOtherText_DiplomaCertificationGameFreak, 6, 2); -} \ No newline at end of file diff --git a/src/easy_chat.c b/src/easy_chat.c deleted file mode 100644 index cca8c1355..000000000 --- a/src/easy_chat.c +++ /dev/null @@ -1,442 +0,0 @@ -#include "global.h" -#include "easy_chat.h" -#include "data2.h" -#include "event_data.h" -#include "field_message_box.h" -#include "pokedex.h" -#include "rng.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; - - -u8 *sub_80EB3FC(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[0] = EOS; - return dst; - } - else - { - group = word >> 9; - wordIndex = word & 0x1FF; - 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[0] = 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 = sub_80EB3FC(dst, words[0]); - - if (words[0] != 0xFFFF) - { - dst[0] = CHAR_SPACE; - dst++; - } - - words++; - } - - word = words[0]; - words++; - dst = sub_80EB3FC(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 = sub_80EB3FC(dst, words[0]); - - if (words[0] != 0xFFFF) - { - dst[0] = CHAR_SPACE; - dst++; - } - - words++; - } - - word = words[0]; - words++; - dst = sub_80EB3FC(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) -{ - u8 *chars; - u16 i; - u16 length; - int group, word; - - - if (arg0 == 0xFFFF) - return 0; - - group = arg0 >> 9; - word = arg0 & 0x1FF; - switch (group) - { - case EC_GROUP_POKEMON: // 0 - case EC_GROUP_POKEMON_2: // 21 - chars = (u8 *) 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.unk2B1C; - arg1 = 2; - arg2 = 2; - break; - case 1: - words = gSaveBlock1.unk2B28; - if (sub_80EB680(gSaveBlock1.unk2B28, 3, 2, 20)) - { - arg1 = 2; - arg2 = 3; - } - else - { - arg1 = 3; - arg2 = 2; - } - break; - case 2: - words = gSaveBlock1.unk2B34; - arg1 = 3; - arg2 = 2; - break; - case 3: - words = gSaveBlock1.unk2B40; - arg1 = 3; - arg2 = 2; - break; - default: - return; - } - - ConvertEasyChatWordsToString(gStringVar4, words, arg1, arg2); - ShowFieldAutoScrollMessage(gStringVar4); -} - -void sub_80EB83C(void) -{ - u16 group, local2; - - if (Random() & 1) - group = EC_GROUP_HOBBIES; - else - group = EC_GROUP_LIFESTYLE; - - local2 = sub_80EB784(group); - sub_80EB3FC(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 = GetNationalPokedexFlag(dexNum, 0); - - if (local2) - { - if (local1 == 0) - return *speciesList & 0x1FF; - local1--; - } - speciesList++; - } - return -1; -} diff --git a/src/egg_hatch.c b/src/egg_hatch.c deleted file mode 100644 index 32fbe1547..000000000 --- a/src/egg_hatch.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "global.h" -#include "pokemon.h" - -void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp) { - u16 species; - u32 personality, pokerus; - u8 i, friendship, language, gameMet, markings; - u16 moves[4]; - u32 ivs[6]; - - - species = GetMonData(egg, MON_DATA_SPECIES); - - for (i = 0; i < 4; i++) - { - moves[i] = GetMonData(egg, MON_DATA_MOVE1 + i); - } - - personality = GetMonData(egg, MON_DATA_PERSONALITY); - - for (i = 0; i < 6; i++) - { - ivs[i] = GetMonData(egg, MON_DATA_HP_IV + i); - } - - gameMet = GetMonData(egg, MON_DATA_MET_GAME); - markings = GetMonData(egg, MON_DATA_MARKINGS); - pokerus = GetMonData(egg, MON_DATA_POKERUS); - - CreateMon(temp, species, 5, 32, TRUE, personality, 0, 0); - - for (i = 0; i < 4; i++) - { - SetMonData(temp, MON_DATA_MOVE1 + i, (const u8 *) &moves[i]); - } - - for (i = 0; i < 6; i++) - { - SetMonData(temp, MON_DATA_HP_IV + i, (const u8 *) &ivs[i]); - } - - language = GAME_LANGUAGE; - SetMonData(temp, MON_DATA_LANGUAGE, &language); - SetMonData(temp, MON_DATA_MET_GAME, &gameMet); - SetMonData(temp, MON_DATA_MARKINGS, &markings); - - friendship = 120; - SetMonData(temp, MON_DATA_FRIENDSHIP, &friendship); - SetMonData(temp, MON_DATA_POKERUS, (const u8 *) &pokerus); - - *egg = *temp; -} diff --git a/src/engine/agb_flash.c b/src/engine/agb_flash.c new file mode 100644 index 000000000..340d469a7 --- /dev/null +++ b/src/engine/agb_flash.c @@ -0,0 +1,295 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" + +static u8 sTimerNum; +static u16 sTimerCount; +static vu16 *sTimerReg; +static u16 sSavedIme; + +u8 gFlashTimeoutFlag; +u8 (*PollFlashStatus)(u8 *); +u16 (*WaitForFlashWrite)(u8 phase, u8 *addr, u8 lastData); +u16 (*ProgramFlashSector)(u16 sectorNum, u8 *src); +const struct FlashType *gFlash; +u16 (*ProgramFlashByte)(u16 sectorNum, u32 offset, u8 data); +u16 gFlashNumRemainingBytes; +u16 (*EraseFlashChip)(); +u16 (*EraseFlashSector)(u16 sectorNum); +const u16 *gFlashMaxTime; + +void SetReadFlash1(u16 *dest); + +void SwitchFlashBank(u8 bankNum) +{ + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0xB0); + FLASH_WRITE(0x0000, bankNum); +} + +#define DELAY() \ +do { \ + vu16 i; \ + for (i = 20000; i != 0; i--) \ + ; \ +} while (0) + +u16 ReadFlashId(void) +{ + u16 flashId; + u16 readFlash1Buffer[0x20]; + u8 (*readFlash1)(u8 *); + + SetReadFlash1(readFlash1Buffer); + readFlash1 = (u8 (*)(u8 *))((s32)readFlash1Buffer + 1); + + // Enter ID mode. + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0x90); + DELAY(); + + flashId = readFlash1(FLASH_BASE + 1) << 8; + flashId |= readFlash1(FLASH_BASE); + + // Leave ID mode. + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0xF0); + FLASH_WRITE(0x5555, 0xF0); + DELAY(); + + return flashId; +} + +void FlashTimerIntr(void) +{ + if (sTimerCount != 0 && --sTimerCount == 0) + gFlashTimeoutFlag = 1; +} + +u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)) +{ + if (timerNum >= 4) + return 1; + + sTimerNum = timerNum; + sTimerReg = ®_TMCNT(sTimerNum); + *intrFunc = FlashTimerIntr; + return 0; +} + +void StartFlashTimer(u8 phase) +{ + const u16 *maxTime = &gFlashMaxTime[phase * 3]; + sSavedIme = REG_IME; + REG_IME = 0; + sTimerReg[1] = 0; + REG_IE |= (INTR_FLAG_TIMER0 << sTimerNum); + gFlashTimeoutFlag = 0; + sTimerCount = *maxTime++; + *sTimerReg++ = *maxTime++; + *sTimerReg-- = *maxTime++; + REG_IF = (INTR_FLAG_TIMER0 << sTimerNum); + REG_IME = 1; +} + +void StopFlashTimer(void) +{ + REG_IME = 0; + *sTimerReg++ = 0; + *sTimerReg-- = 0; + REG_IE &= ~(INTR_FLAG_TIMER0 << sTimerNum); + REG_IME = sSavedIme; +} + +u8 ReadFlash1(u8 *addr) +{ + return *addr; +} + +void SetReadFlash1(u16 *dest) +{ + u16 *src; + u16 i; + + PollFlashStatus = (u8 (*)(u8 *))((s32)dest + 1); + + src = (u16 *)ReadFlash1; + src = (u16 *)((s32)src ^ 1); + + i = ((s32)SetReadFlash1 - (s32)ReadFlash1) >> 1; + + while (i != 0) + { + *dest++ = *src++; + i--; + } +} + +void ReadFlash_Core(u8 *src, u8 *dest, u32 size) +{ + while (size-- != 0) + { + *dest++ = *src++; + } +} + +void ReadFlash(u16 sectorNum, u32 offset, u8 *dest, u32 size) +{ + u8 *src; + u16 i; + u16 readFlash_Core_Buffer[0x40]; + u16 *funcSrc; + u16 *funcDest; + void (*readFlash_Core)(u8 *, u8 *, u32); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + if (gFlash->romSize == FLASH_ROM_SIZE_1M) + { + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + } + + funcSrc = (u16 *)ReadFlash_Core; + funcSrc = (u16 *)((s32)funcSrc ^ 1); + funcDest = readFlash_Core_Buffer; + + i = ((s32)ReadFlash - (s32)ReadFlash_Core) >> 1; + + while (i != 0) + { + *funcDest++ = *funcSrc++; + i--; + } + + readFlash_Core = (void (*)(u8 *, u8 *, u32))((s32)readFlash_Core_Buffer + 1); + + src = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset; + + readFlash_Core(src, dest, size); +} + +u32 VerifyFlashSector_Core(u8 *src, u8 *tgt, u32 size) +{ + while (size-- != 0) + { + if (*tgt++ != *src++) + return (u32)(tgt - 1); + } + + return 0; +} + +u32 VerifyFlashSector(u16 sectorNum, u8 *src) +{ + u16 i; + u16 verifyFlashSector_Core_Buffer[0x80]; + u16 *funcSrc; + u16 *funcDest; + u8 *tgt; + u16 size; + u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + if (gFlash->romSize == FLASH_ROM_SIZE_1M) + { + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + } + + funcSrc = (u16 *)VerifyFlashSector_Core; + funcSrc = (u16 *)((s32)funcSrc ^ 1); + funcDest = verifyFlashSector_Core_Buffer; + + i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1; + + while (i != 0) + { + *funcDest++ = *funcSrc++; + i--; + } + + verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1); + + tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift); + size = gFlash->sector.size; + + return verifyFlashSector_Core(src, tgt, size); // return 0 if verified. +} + +u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n) +{ + u16 i; + u16 verifyFlashSector_Core_Buffer[0x80]; + u16 *funcSrc; + u16 *funcDest; + u8 *tgt; + u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); + + if (gFlash->romSize == FLASH_ROM_SIZE_1M) + { + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + } + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + funcSrc = (u16 *)VerifyFlashSector_Core; + funcSrc = (u16 *)((s32)funcSrc ^ 1); + funcDest = verifyFlashSector_Core_Buffer; + + i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1; + + while (i != 0) + { + *funcDest++ = *funcSrc++; + i--; + } + + verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1); + + tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift); + + return verifyFlashSector_Core(src, tgt, n); +} + +u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src) // 3rd is unused +{ + u8 i; + u32 result; + + for (i = 0; i < 3; i++) // 3 attempts + { + result = ProgramFlashSector(sectorNum, src); + if (result != 0) + continue; + + result = VerifyFlashSector(sectorNum, src); + if (result == 0) + break; + } + + return result; // return 0 if verified and programmed. +} + +u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, u8 *src, u32 n) +{ + u8 i; + u32 result; + + for (i = 0; i < 3; i++) + { + result = ProgramFlashSector(sectorNum, src); + if (result != 0) + continue; + + result = VerifyFlashSectorNBytes(sectorNum, src, n); + if (result == 0) + break; + } + + return result; +} diff --git a/src/engine/agb_flash_1m.c b/src/engine/agb_flash_1m.c new file mode 100644 index 000000000..e249fab9a --- /dev/null +++ b/src/engine/agb_flash_1m.c @@ -0,0 +1,86 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" + +static const char AgbLibFlashVersion[] = "FLASH1M_V103"; + +const struct FlashSetupInfo * const sSetupInfos[] = +{ + &MX29L010, + &LE26FV10N1TS, + &DefaultFlash +}; + +u16 IdentifyFlash(void) +{ + u16 result; + u16 flashId; + const struct FlashSetupInfo * const *setupInfo; + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + flashId = ReadFlashId(); + + setupInfo = sSetupInfos; + result = 1; + + for (;;) + { + if ((*setupInfo)->type.ids.separate.makerId == 0) + break; + + if (flashId == (*setupInfo)->type.ids.joined) + { + result = 0; + break; + } + + setupInfo++; + } + + ProgramFlashByte = (*setupInfo)->programFlashByte; + ProgramFlashSector = (*setupInfo)->programFlashSector; + EraseFlashChip = (*setupInfo)->eraseFlashChip; + EraseFlashSector = (*setupInfo)->eraseFlashSector; + WaitForFlashWrite = (*setupInfo)->WaitForFlashWrite; + gFlashMaxTime = (*setupInfo)->maxTime; + gFlash = &(*setupInfo)->type; + + return result; +} + +u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData) +{ + u16 result = 0; + u8 status; + + StartFlashTimer(phase); + + while ((status = PollFlashStatus(addr)) != lastData) + { + if (status & 0x20) + { + // The write operation exceeded the flash chip's time limit. + + if (PollFlashStatus(addr) == lastData) + break; + + FLASH_WRITE(0x5555, 0xF0); + result = phase | 0xA000u; + break; + } + + if (gFlashTimeoutFlag) + { + if (PollFlashStatus(addr) == lastData) + break; + + FLASH_WRITE(0x5555, 0xF0); + result = phase | 0xC000u; + break; + } + } + + StopFlashTimer(); + + return result; +} diff --git a/src/engine/agb_flash_le.c b/src/engine/agb_flash_le.c new file mode 100644 index 000000000..39d956e27 --- /dev/null +++ b/src/engine/agb_flash_le.c @@ -0,0 +1,31 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" + +const u16 leMaxTime[] = +{ + 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, +}; + +const struct FlashSetupInfo LE26FV10N1TS = +{ + ProgramFlashByte_MX, + ProgramFlashSector_MX, + EraseFlashChip_MX, + EraseFlashSector_MX, + WaitForFlashWrite_Common, + leMaxTime, + { + 131072, // ROM size + { + 4096, // sector size + 12, // bit shift to multiply by sector size (4096 == 1 << 12) + 32, // number of sectors + 0 // appears to be unused + }, + { 3, 1 }, // wait state setup data + { { 0x62, 0x13 } } // ID + } +}; diff --git a/src/engine/agb_flash_mx.c b/src/engine/agb_flash_mx.c new file mode 100644 index 000000000..67348901f --- /dev/null +++ b/src/engine/agb_flash_mx.c @@ -0,0 +1,197 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" + +const u16 mxMaxTime[] = +{ + 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, +}; + +const struct FlashSetupInfo MX29L010 = +{ + ProgramFlashByte_MX, + ProgramFlashSector_MX, + EraseFlashChip_MX, + EraseFlashSector_MX, + WaitForFlashWrite_Common, + mxMaxTime, + { + 131072, // ROM size + { + 4096, // sector size + 12, // bit shift to multiply by sector size (4096 == 1 << 12) + 32, // number of sectors + 0 // appears to be unused + }, + { 3, 1 }, // wait state setup data +#if defined(GERMAN) && defined(SAPPHIRE) + { { 0xBF, 0xD4 } } // ID +#else + { { 0xC2, 0x09 } } // ID +#endif + } +}; + +const struct FlashSetupInfo DefaultFlash = +{ + ProgramFlashByte_MX, + ProgramFlashSector_MX, + EraseFlashChip_MX, + EraseFlashSector_MX, + WaitForFlashWrite_Common, + mxMaxTime, + { + 131072, // ROM size + { + 4096, // sector size + 12, // bit shift to multiply by sector size (4096 == 1 << 12) + 32, // number of sectors + 0 // appears to be unused + }, + { 3, 1 }, // wait state setup data + { { 0x00, 0x00 } } // ID of 0 + } +}; + +u16 EraseFlashChip_MX(void) +{ + u16 result; + u16 readFlash1Buffer[0x20]; + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; + + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0x80); + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0x10); + + SetReadFlash1(readFlash1Buffer); + + result = WaitForFlashWrite(3, FLASH_BASE, 0xFF); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + return result; +} + +u16 EraseFlashSector_MX(u16 sectorNum) +{ + u16 numTries; + u16 result; + u8 *addr; + u16 readFlash1Buffer[0x20]; + + if (sectorNum >= gFlash->sector.count) + return 0x80FF; + + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + + numTries = 0; + +try_erase: + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; + + addr = FLASH_BASE + (sectorNum << gFlash->sector.shift); + + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0x80); + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + *addr = 0x30; + + SetReadFlash1(readFlash1Buffer); + + result = WaitForFlashWrite(2, addr, 0xFF); + + if (!(result & 0xA000) || numTries > 3) + goto done; + + numTries++; + + goto try_erase; + +done: + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + return result; +} + +u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data) +{ + u8 *addr; + u16 readFlash1Buffer[0x20]; + + if (offset >= gFlash->sector.size) + return 0x8000; + + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + + addr = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset; + + SetReadFlash1(readFlash1Buffer); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; + + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0xA0); + *addr = data; + + return WaitForFlashWrite(1, addr, data); +} + +static u16 ProgramByte(u8 *src, u8 *dest) +{ + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0xA0); + *dest = *src; + + return WaitForFlashWrite(1, dest, *src); +} + +u16 ProgramFlashSector_MX(u16 sectorNum, u8 *src) +{ + u16 result; + u8 *dest; + u16 readFlash1Buffer[0x20]; + + if (sectorNum >= gFlash->sector.count) + return 0x80FF; + + result = EraseFlashSector_MX(sectorNum); + + if (result != 0) + return result; + + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + + SetReadFlash1(readFlash1Buffer); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; + + gFlashNumRemainingBytes = gFlash->sector.size; + dest = FLASH_BASE + (sectorNum << gFlash->sector.shift); + + while (gFlashNumRemainingBytes > 0) + { + result = ProgramByte(src, dest); + + if (result != 0) + break; + + gFlashNumRemainingBytes--; + src++; + dest++; + } + + return result; +} diff --git a/src/engine/blend_palette.c b/src/engine/blend_palette.c new file mode 100644 index 000000000..843c50ac1 --- /dev/null +++ b/src/engine/blend_palette.c @@ -0,0 +1,20 @@ +#include "global.h" +#include "blend_palette.h" +#include "palette.h" + +void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) +{ + u16 i; + for (i = 0; i < numEntries; i++) + { + u16 index = i + palOffset; + struct PlttData *data1 = (struct PlttData *)&gPlttBufferUnfaded[index]; + s8 r = data1->r; + s8 g = data1->g; + s8 b = data1->b; + struct PlttData *data2 = (struct PlttData *)&blendColor; + gPlttBufferFaded[index] = ((r + (((data2->r - r) * coeff) >> 4)) << 0) + | ((g + (((data2->g - g) * coeff) >> 4)) << 5) + | ((b + (((data2->b - b) * coeff) >> 4)) << 10); + } +} diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c new file mode 100644 index 000000000..20b087f4e --- /dev/null +++ b/src/engine/cable_club.c @@ -0,0 +1,317 @@ +#include "global.h" +#include "cable_club.h" +#include "field_message_box.h" +#include "link.h" +#include "main.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "trainer_card.h" + +extern u16 gScriptResult; +extern struct TrainerCard gTrainerCards[4]; + +extern u8 gUnknown_03004860; +extern u8 gFieldLinkPlayerCount; + +extern u8 gUnknown_081A4932[]; +extern const u8 gUnknown_081A4975[]; + +static void sub_80830E4(u8 taskId); +static void sub_8083288(u8 taskId); +static void sub_8083314(u8 taskId); + +void sub_808303C(u8 taskId) { + s32 linkPlayerCount; + s16 *taskData; + + taskData = gTasks[taskId].data; + + linkPlayerCount = GetLinkPlayerCount_2(); + + if (sub_8082E28(taskId) == 1 || + sub_8082EB8(taskId) == 1 || + sub_8082DF4(taskId) == 1) + { + return; + } + + sub_8082D60(taskId, linkPlayerCount); + + if (!(gMain.newKeys & A_BUTTON)) + { + return; + } + +#if ENGLISH + if (linkPlayerCount < taskData[1]) + { + return; + } + + sub_80081C8(linkPlayerCount); + sub_8082D4C(); + ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); // r5 + ShowFieldAutoScrollMessage((u8 *) gUnknown_081A4975); + gTasks[taskId].func = sub_80830E4; +#elif GERMAN + if ((gLinkType == 0x2255 && (u32) linkPlayerCount > 1) || + (gLinkType != 0x2255 && taskData[1] <= linkPlayerCount)) + { + sub_80081C8(linkPlayerCount); + sub_8082D4C(); + ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); // r5 + ShowFieldAutoScrollMessage((u8 *) gUnknown_081A4975); + gTasks[taskId].func = sub_80830E4; + } +#endif +} + +#ifdef NONMATCHING +static void sub_80830E4(u8 taskId) { + if (sub_8082E28(taskId) == 1 || + sub_8082EB8(taskId) == 1 || + sub_8082DF4(taskId) == 1 || + GetFieldMessageBoxMode()) + { + return; + } + + if (sub_800820C() == GetLinkPlayerCount_2() && + !(gMain.heldKeys & B_BUTTON)) + { + ShowFieldAutoScrollMessage(gUnknown_081A4932); + gTasks[taskId].func = sub_8082FEC; + return; + } + + if (gMain.heldKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_8007F4C(); + gTasks[(u32) taskId].func = sub_8083188; + } +} +#else +__attribute__((naked)) +static void sub_80830E4(u8 taskId) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + adds r6, r5, 0\n\ + adds r0, r5, 0\n\ + bl sub_8082E28\n\ + cmp r0, 0x1\n\ + beq _08083178\n\ + adds r0, r5, 0\n\ + bl sub_8082EB8\n\ + cmp r0, 0x1\n\ + beq _08083178\n\ + adds r0, r5, 0\n\ + bl sub_8082DF4\n\ + cmp r0, 0x1\n\ + beq _08083178\n\ + bl GetFieldMessageBoxMode\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08083178\n\ + bl sub_800820C\n\ + adds r4, r0, 0\n\ + bl GetLinkPlayerCount_2\n\ + lsls r4, 24\n\ + lsls r0, 24\n\ + cmp r4, r0\n\ + bne _08083132\n\ + ldr r0, _08083148 @ =gMain\n\ + ldrh r1, [r0, 0x2C]\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08083158\n\ +_08083132:\n\ + ldr r0, _0808314C @ =gUnknown_081A4932\n\ + bl ShowFieldAutoScrollMessage\n\ + ldr r1, _08083150 @ =gTasks\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldr r1, _08083154 @ =sub_8082FEC\n\ + str r1, [r0]\n\ + b _08083178\n\ + .align 2, 0\n\ +_08083148: .4byte gMain\n\ +_0808314C: .4byte gUnknown_081A4932\n\ +_08083150: .4byte gTasks\n\ +_08083154: .4byte sub_8082FEC\n\ +_08083158:\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08083178\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + bl sub_8007F4C\n\ + ldr r0, _08083180 @ =gTasks\n\ + lsls r1, r6, 2\n\ + adds r1, r6\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + ldr r0, _08083184 @ =sub_8083188\n\ + str r0, [r1]\n\ +_08083178:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08083180: .4byte gTasks\n\ +_08083184: .4byte sub_8083188\n\ + .syntax divided\n"); +} +#endif + +void sub_8083188(u8 taskId) { + u8 local1, local2; + u16 *result; + + local1 = gTasks[taskId].data[1]; + local2 = gTasks[taskId].data[2]; + + + if (sub_8082DF4(taskId) == 1 || + sub_8083444(taskId) == 1) + { + return; + } + + if (GetLinkPlayerCount_2() != sub_800820C()) + { + gTasks[taskId].func = sub_8083418; + return; + } + + result = &gScriptResult; + *result = sub_8082D9C(local1, local2); + if (*result) + { + gTasks[taskId].func = sub_8083288; + } +} + +void sub_80831F8(u8 taskId) { + u8 local1, local2; + u16 *result; + + local1 = gTasks[taskId].data[1]; + local2 = gTasks[taskId].data[2]; + + if (sub_8082E28(taskId) == 1 || + sub_8082DF4(taskId) == 1) + { + return; + } + + result = &gScriptResult; + *result = sub_8082D9C(local1, local2); + if (*result == 0) + { + return; + } + + + if (*result == 3) + { + sub_800832C(); + HideFieldMessageBox(); + gTasks[taskId].func = sub_80833C4; + } + else + { + gFieldLinkPlayerCount = GetLinkPlayerCount_2(); + gUnknown_03004860 = GetMultiplayerId(); + sub_80081C8(gFieldLinkPlayerCount); + sub_8093390((struct TrainerCard *) gBlockSendBuffer); + gTasks[taskId].func = sub_8083314; + } +} + +static void sub_8083288(u8 taskId) { + if (sub_8082DF4(taskId) == 1) + { + return; + } + + if (gScriptResult == 3) + { + sub_800832C(); + HideFieldMessageBox(); + gTasks[taskId].func = sub_80833C4; + } + else + { + gFieldLinkPlayerCount = GetLinkPlayerCount_2(); + gUnknown_03004860 = GetMultiplayerId(); + sub_80081C8(gFieldLinkPlayerCount); + sub_8093390((struct TrainerCard *) gBlockSendBuffer); + gTasks[taskId].func = sub_8083314; + sub_8007E9C(2); + } +} + +static void sub_8083314(u8 taskId) { + u8 index; + + struct TrainerCard *trainerCards; + + if (sub_8082DF4(taskId) == 1) + { + return; + } + + if (GetBlockReceivedStatus() != sub_8008198()) + { + return; + } + + index = 0; + trainerCards = gTrainerCards; + for (index = 0; index < GetLinkPlayerCount(); index++) + { + void *src; + src = gBlockRecvBuffer[index]; + memcpy(&trainerCards[index], src, sizeof(struct TrainerCard)); + } + + SetSuppressLinkErrorMessage(FALSE); + ResetBlockReceivedFlags(); + HideFieldMessageBox(); + + if (gScriptResult == 1) + { +#if ENGLISH + u16 linkType; + linkType = gLinkType; + // FIXME: sub_8082D4C doesn't take any arguments + sub_8082D4C(0x00004411, linkType); +#elif GERMAN + if (gLinkType != 0x4411) + { + if (gLinkType == 0x6601) + { + deUnkValue2 = 1; + } + } + sub_8082D4C(); +#endif + EnableBothScriptContexts(); + DestroyTask(taskId); + return; + } + + sub_800832C(); + gTasks[taskId].func = sub_80833C4; +} diff --git a/src/engine/clear_save_data_menu.c b/src/engine/clear_save_data_menu.c new file mode 100644 index 000000000..498562fe0 --- /dev/null +++ b/src/engine/clear_save_data_menu.c @@ -0,0 +1,177 @@ +#include "global.h" +#include "clear_save_data_menu.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "save.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "strings2.h" +#include "task.h" + +static void VBlankCB_ClearSaveDataScreen(void); +static void Task_InitMenu(u8); +static void Task_ProcessMenuInput(u8); +static void Task_ClearSaveData(u8); +static void CB2_ClearSaveDataScreen(void); +static void VBlankCB_InitClearSaveDataScreen(void); +static u8 InitClearSaveDataScreen(void); +static void CB2_SoftReset(void); + +void CB2_InitClearSaveDataScreen(void) +{ + if (InitClearSaveDataScreen()) + { + CreateTask(Task_InitMenu, 0); + } +} + +static void VBlankCB_ClearSaveDataScreen(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void Task_InitMenu(u8 taskId) +{ + ResetSpriteData(); + + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + + SetVBlankCallback(VBlankCB_ClearSaveDataScreen); + MenuDrawTextWindow(2, 14, 27, 19); + MenuPrint(gSystemText_ClearAllSaveDataPrompt, 3, 15); + + MenuDrawTextWindow(2, 1, 8, 6); + PrintMenuItems(3, 2, 2, gMenuYesNoItems); + InitMenu(0, 3, 2, 2, 1, 5); + + gTasks[taskId].func = Task_ProcessMenuInput; +} + +static void Task_ProcessMenuInput(u8 taskId) +{ + switch (ProcessMenuInputNoWrap_()) + { + case 0: + PlaySE(SE_SELECT); + sub_8071F40(gSystemText_ClearingData); + gTasks[taskId].func = Task_ClearSaveData; + break; + case -1: + case 1: + PlaySE(SE_SELECT); + DestroyTask(taskId); + SetMainCallback2(CB2_SoftReset); + break; + } + AnimateSprites(); + BuildOamBuffer(); +} + +static void Task_ClearSaveData(u8 taskId) +{ + ClearSaveData(); + DestroyTask(taskId); + SetMainCallback2(CB2_SoftReset); +} + +static void CB2_ClearSaveDataScreen(void) +{ + RunTasks(); + UpdatePaletteFade(); +} + +static void VBlankCB_InitClearSaveDataScreen(void) +{ + TransferPlttBuffer(); +} + +static u8 InitClearSaveDataScreen(void) +{ + u16 i; + u16 ime; + + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(NULL); + + REG_DISPCNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); + + ResetPaletteFade(); + + gPlttBufferUnfaded[0] = 0x7fff; + gPlttBufferFaded[0] = 0x7fff; + gPlttBufferUnfaded[1] = 0x3945; + gPlttBufferFaded[1] = 0x3945; + + for (i = 0; i < 0x10; i++) + ((u16 *)(VRAM + 0x20))[i] = 0x1111; + + for (i = 0; i < 0x500; i++) + ((u16 *)(VRAM + 0x3800))[i] = 0x0001; + + ResetTasks(); + ResetSpriteData(); + + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xffff); + + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + + SetVBlankCallback(VBlankCB_InitClearSaveDataScreen); + + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON | DISPCNT_BG3_ON; + gMain.state = 1; + return 0; + case 1: + UpdatePaletteFade(); + if (gPaletteFade.active) + return 0; + SetMainCallback2(CB2_ClearSaveDataScreen); + return 1; + } +} + +static void CB2_SoftReset(void) +{ + switch (gMain.state) + { + case 0: + default: + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xffff); + gMain.state = 1; + break; + case 1: + UpdatePaletteFade(); + if (gPaletteFade.active) + return; + DoSoftReset(); + break; + } +} diff --git a/src/engine/clock.c b/src/engine/clock.c new file mode 100644 index 000000000..1f2aac9fd --- /dev/null +++ b/src/engine/clock.c @@ -0,0 +1,90 @@ +#include "global.h" +#include "clock.h" +#include "berry.h" +#include "dewford_trend.h" +#include "event_data.h" +#include "field_specials.h" +#include "field_weather.h" +#include "lottery_corner.h" +#include "main.h" +#include "rom4.h" +#include "rtc.h" +#include "time_events.h" +#include "tv.h" +#include "wallclock.h" + +static void InitTimeBasedEvents(void); +static void UpdatePerDay(struct Time *time); +static void UpdatePerMinute(struct Time *time); +static void ReturnFromStartWallClock(void); + +static void InitTimeBasedEvents(void) +{ + FlagSet(SYS_CLOCK_SET); + RtcCalcLocalTime(); + gSaveBlock2.lastBerryTreeUpdate = gLocalTime; + VarSet(VAR_DAYS, gLocalTime.days); +} + +void DoTimeBasedEvents(void) +{ + if (FlagGet(SYS_CLOCK_SET)) + { + RtcCalcLocalTime(); + UpdatePerDay(&gLocalTime); + UpdatePerMinute(&gLocalTime); + } +} + +static void UpdatePerDay(struct Time *time) +{ + u16 *varPtr = GetVarPointer(VAR_DAYS); + int days = *varPtr; + u16 newDays; + + if (days != time->days && days <= time->days) + { + newDays = time->days - days; + ClearUpperFlags(); + UpdateDewfordTrendPerDay(newDays); + UpdateTVShowsPerDay(newDays); + UpdateWeatherPerDay(newDays); + UpdatePartyPokerusTime(newDays); + UpdateMirageRnd(newDays); + UpdateBirchState(newDays); + SetShoalItemFlag(newDays); + SetRandomLotteryNumber(newDays); + *varPtr = time->days; + } +} + +static void UpdatePerMinute(struct Time *time) +{ + struct Time newTime; + s32 minutes; + + CalcTimeDifference(&newTime, &gSaveBlock2.lastBerryTreeUpdate, time); + minutes = 1440 * newTime.days + 60 * newTime.hours + newTime.minutes; + + // there's no way to get the correct assembly other than with this nested if check. so dumb. + if (minutes != 0) + { + if (minutes >= 0) + { + BerryTreeTimeUpdate(minutes); + gSaveBlock2.lastBerryTreeUpdate = *time; + } + } +} + +static void ReturnFromStartWallClock(void) +{ + InitTimeBasedEvents(); + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void StartWallClock(void) +{ + SetMainCallback2(CB2_StartWallClock); + gMain.savedCallback = ReturnFromStartWallClock; +} diff --git a/src/engine/decompress.c b/src/engine/decompress.c new file mode 100644 index 000000000..d7f7087a7 --- /dev/null +++ b/src/engine/decompress.c @@ -0,0 +1,112 @@ +#include "global.h" +#include "decompress.h" +#include "data2.h" +#include "species.h" +#include "text.h" + +#define WRAM 0x02000000 + +void sub_800D238(const void *src, void *dest) +{ + LZ77UnCompWram(src, dest); +} + +void LZDecompressVram(const void *src, void *dest) +{ + LZ77UnCompVram(src, dest); +} + +void LoadCompressedObjectPic(const struct CompressedSpriteSheet *src) +{ + struct SpriteSheet dest; + + LZ77UnCompWram(src->data, (void *)WRAM); + dest.data = (void *)WRAM; + dest.size = src->size; + dest.tag = src->tag; + LoadSpriteSheet(&dest); +} + +void LoadCompressedObjectPicOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) +{ + struct SpriteSheet dest; + + LZ77UnCompWram(src->data, buffer); + dest.data = buffer; + dest.size = src->size; + dest.tag = src->tag; + LoadSpriteSheet(&dest); +} + +void LoadCompressedObjectPalette(const struct CompressedSpritePalette *src) +{ + struct SpritePalette dest; + + LZ77UnCompWram(src->data, (void *)WRAM); + dest.data = (void *)WRAM; + dest.tag = src->tag; + LoadSpritePalette(&dest); +} + +void LoadCompressedObjectPaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer) +{ + struct SpritePalette dest; + + LZ77UnCompWram(a->data, buffer); + dest.data = buffer; + dest.tag = a->tag; + LoadSpritePalette(&dest); +} + +void DecompressPicFromTable_2(const struct CompressedSpriteSheet *src, u8 b, u8 c, void *d, void *buffer, s32 species) +{ + if (species > SPECIES_EGG) + LZ77UnCompWram(gMonFrontPicTable[0].data, buffer); + else + LZ77UnCompWram(src->data, buffer); +} + +void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g) +{ + u32 frontOrBack; + + // gUnknown_081FAF4C appears to be a list of pointers to locations to store poke pics for back and front pic here. the first and third pointers are used for back while the others are used for front. + if (dest == gUnknown_081FAF4C[0] || dest == gUnknown_081FAF4C[2]) + frontOrBack = 0; // backPic + else + frontOrBack = 1; // frontPic + + LoadSpecialPokePic(src, b, c, d, dest, species, g, frontOrBack); +} + +void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g, u32 frontOrBack) +{ + u8 frontOrBack8 = frontOrBack; + + if (species == SPECIES_UNOWN) + { + u16 i = (((g & 0x3000000) >> 18) | ((g & 0x30000) >> 12) | ((g & 0x300) >> 6) | (g & 3)) % 0x1C; + + // The other Unowns are separate from Unown A. + if (i == 0) + i = SPECIES_UNOWN; + else + i += SPECIES_UNOWN_B - 1; + + if (frontOrBack8 == 0) + LZ77UnCompWram(gMonBackPicTable[i].data, dest); + else + LZ77UnCompWram(gMonFrontPicTable[i].data, dest); + } + else if (species > SPECIES_EGG) // is species unknown? draw the ? icon + LZ77UnCompWram(gMonFrontPicTable[0].data, dest); + else + LZ77UnCompWram(src->data, dest); + + DrawSpindaSpots(species, g, dest, frontOrBack8); +} + +void Unused_LZDecompressWramIndirect(const void **src, void *dest) +{ + LZ77UnCompWram(*src, dest); +} diff --git a/src/engine/libc.c b/src/engine/libc.c new file mode 100644 index 000000000..920673e3e --- /dev/null +++ b/src/engine/libc.c @@ -0,0 +1,143 @@ +#include "global.h" +#include + +#define LBLOCKSIZE (sizeof(long)) + +// Nonzero if (long)X contains a NULL byte. +#define CONTAINSNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) + +// Nonzero if X is not aligned on a "long" boundary. +#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1)) + +void *memcpy(void *dst0, const void *src0, size_t len0) +{ + char *dst = dst0; + const char *src = src0; + long *aligned_dst; + const long *aligned_src; + unsigned int len = len0; + + // If the size is small, or either src or dst is unaligned, + // then go to the byte copy loop. This should be rare. + if (len >= 16 && !(UNALIGNED(src) | UNALIGNED(dst))) + { + aligned_dst = (long *)dst; + aligned_src = (long *)src; + + // Copy 4X long words at a time if possible. + while (len >= 16) + { + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + len -= 16; + } + + // Copy one long word at a time if possible + while (len >= 4) + { + *aligned_dst++ = *aligned_src++; + len -= 4; + } + + dst = (char *)aligned_dst; + src = (char *)aligned_src; + } + + // Pick up any remaining bytes with a byte copier. + while (len--) + *dst++ = *src++; + + return dst0; +} + +void *memset(void *m, int c, size_t n) +{ + char *s = (char *)m; + int count, i; + unsigned long buffer; + unsigned long *aligned_addr; + unsigned char *unaligned_addr; + + // If the size is small or m is unaligned, + // then go to the byte copy loop. This should be rare. + if (n >= LBLOCKSIZE && !UNALIGNED(m)) + { + // We know that n is large and m is word-aligned. + aligned_addr = (unsigned long *)m; + + // Store C into each char sized location in buffer so that + // we can set large blocks quickly. + c &= 0xFF; + if (LBLOCKSIZE == 4) + { + buffer = (c << 8) | c; + buffer |= (buffer << 16); + } + else + { + buffer = 0; + for (i = 0; i < LBLOCKSIZE; i++) + buffer = (buffer << 8) | c; + } + + while (n >= LBLOCKSIZE * 4) + { + *aligned_addr++ = buffer; + *aligned_addr++ = buffer; + *aligned_addr++ = buffer; + *aligned_addr++ = buffer; + n -= LBLOCKSIZE * 4; + } + while (n >= LBLOCKSIZE) + { + *aligned_addr++ = buffer; + n -= LBLOCKSIZE; + } + + s = (char *)aligned_addr; + } + + // Pick up the remainder with a bytewise loop. + while (n--) + *s++ = (char)c; + + return m; +} + +int strcmp(const char *s1, const char *s2) +{ + unsigned long *a1; + unsigned long *a2; + + // If s1 or s2 are unaligned, then skip this and compare bytes. + if (!(UNALIGNED(s1) | UNALIGNED(s2))) + { + // Compare them a word at a time. + a1 = (unsigned long *)s1; + a2 = (unsigned long *)s2; + while (*a1 == *a2) + { + // If *a1 == *a2, and we find a null in *a1, + // then the strings must be equal, so return zero. + if (CONTAINSNULL(*a1)) + return 0; + + a1++; + a2++; + } + + s1 = (char *)a1; + s2 = (char *)a2; + } + + // Check the remaining few bytes. + while (*s1 != '\0' && *s1 == *s2) + { + s1++; + s2++; + } + + return (*(unsigned char *) s1) - (*(unsigned char *) s2); +} diff --git a/src/engine/link.c b/src/engine/link.c new file mode 100644 index 000000000..5858ad8bf --- /dev/null +++ b/src/engine/link.c @@ -0,0 +1,1820 @@ +#include "global.h" +#include "link.h" +#include "battle.h" +#include "berry.h" +#include "berry_blender.h" +#include "hall_of_fame.h" +#include "item_use.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "rng.h" +#include "save.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "strings2.h" +#include "task.h" +#include "text.h" + +#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT) + +struct BlockTransfer +{ + u16 pos; + u16 size; + void *src; + bool8 active; + u8 multiplayerId; +}; + +struct LinkTestBGInfo +{ + u32 screenBaseBlock; + u32 paletteNum; + u32 dummy_8; + u32 dummy_C; +}; + +extern u8 unk_2000000[]; +extern u8 unk_2004000[]; +extern u16 gBattleTypeFlags; + +extern u16 word_3004858; + +static void InitLinkTestBG(u8, u8, u8, u8); +void InitLinkTestBG_Unused(u8, u8, u8, u8); +void LinkTestScreen(); +static void InitLocalLinkPlayer(void); +static void VBlankCB_LinkTest(void); +static void InitLink(void); +static void Task_TriggerHandshake(u8); +static void TestBlockTransfer(u32, u32, u32); +static void LinkTestProcessKeyInput(void); +static void CB2_LinkTest(void); +static void HandleReceiveRemoteLinkPlayer(u8); +static void ProcessRecvCmds(u8); +static void BuildSendCmd(u16); +static void sub_8007B44(void); +static void ResetBlockSend(void); +static bool8 InitBlockSend(void *, u32); +static void LinkCB_BlockSendBegin(void); +static void LinkCB_BlockSend(void); +static void LinkCB_BlockSendEnd(void); +static void sub_8007E04(void); +u32 sub_8007E40(void); +static void SetBlockReceivedFlag(u8); +static u16 LinkTestCalcBlockChecksum(void *, u16); +static void PrintHexDigit(u8, u8, u8); +static void PrintHex(u32, u8, u8, u8); +static void LinkCB_RequestPlayerDataExchange(void); +static void Task_PrintTestData(u8); +bool8 sub_8008224(void); +u8 GetDummy2(void); +static void sub_8008350(void); +static void sub_800837C(void); +static void sub_80083E0(void); +static void sub_8008454(void); +static void sub_80084C8(void); +static void sub_80084F4(void); + +static void CheckErrorStatus(void); +static void CB2_PrintErrorMessage(void); +static u8 IsSioMultiMaster(void); +static void DisableSerial(void); +static void EnableSerial(void); +static void CheckMasterOrSlave(void); +static void InitTimer(void); +static void EnqueueSendCmd(u16 *); +static void DequeueRecvCmds(u16[CMD_LENGTH][MAX_LINK_PLAYERS]); +static void StartTransfer(void); +static bool8 DoHandshake(void); +static void DoRecv(void); +static void DoSend(void); +static void StopTimer(void); +static void SendRecvDone(void); +void ResetSendBuffer(void); +void ResetRecvBuffer(void); + +static struct BlockTransfer sBlockSend; +static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS]; +static u32 sBlockSendDelayCounter; +static u32 sDummy1; +static u8 sDummy2; +static u32 sPlayerDataExchangeStatus; +static u32 sErrorLinkStatus; +static u32 sErrorLastRecvQueueCount; +static u32 sErrorLastSendQueueCount; +static u32 sDummy3; +static u8 sLinkTestLastBlockSendPos; +static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS]; +static u8 sNumVBlanksWithoutSerialIntr; +static bool8 sSendBufferEmpty; +static u16 sSendNonzeroCheck; +static u16 sRecvNonzeroCheck; +static u8 sChecksumAvailable; +static u8 sHandshakePlayerCount; + +u16 word_3002910[MAX_LINK_PLAYERS]; +u32 gLinkDebugValue1; +struct LinkPlayerBlock localLinkPlayerBlock; +bool8 gLinkErrorOccurred; +u32 gLinkDebugValue2; +bool8 gLinkPlayerPending[MAX_LINK_PLAYERS]; +struct LinkPlayer gLinkPlayers[MAX_LINK_PLAYERS]; +bool8 gBlockReceived[MAX_LINK_PLAYERS]; +u16 gLinkHeldKeys; +u16 gLinkTimeOutCounter; +struct LinkPlayer localLinkPlayer; +u16 gRecvCmds[CMD_LENGTH][MAX_LINK_PLAYERS]; +u32 gLinkStatus; +bool8 gLinkDummyBool; +u8 byte_3002A68; +u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE]; +bool8 u8_array_3002B70[MAX_LINK_PLAYERS]; +u16 gLinkType; +bool8 u8_array_3002B78[MAX_LINK_PLAYERS]; +u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2]; +bool8 gSuppressLinkErrorMessage; +u8 gSavedLinkPlayerCount; +u16 gSendCmd[CMD_LENGTH]; +u8 gSavedMultiplayerId; +bool8 gReceivedRemoteLinkPlayers; +struct LinkTestBGInfo gLinkTestBGInfo; +void (*gLinkCallback)(void); +struct LinkPlayer gSavedLinkPlayers[MAX_LINK_PLAYERS]; +u8 gShouldAdvanceLinkState; +u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; +u8 gBlockRequestType; +u8 gLastSendQueueCount; +struct Link gLink; +u8 gLastRecvQueueCount; +u16 gLinkSavedIme; + +#ifdef GERMAN +u8 deUnkValue1; +u8 deUnkValue2; +#endif + +EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = {0}; +EWRAM_DATA bool8 gLinkTestDummyBool = {0}; +EWRAM_DATA u32 gFiller_20238B8 = {0}; +EWRAM_DATA u32 dword_20238BC = {0}; +EWRAM_DATA bool8 gLinkOpen = {0}; + +static const u16 sLinkTestDigitPalette[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal"); +static const u32 sLinkTestDigitTiles[] = INCBIN_U32("graphics/interface/link_test_digits.4bpp"); + +static const u8 sDebugMessages[7][12] = +{ + _("せつぞく ちゅうです"), + _("せつぞく できません"), + _("かくにん ちゅうです"), + _("かくにん できました"), + _("かくにん できません"), + _("かくにん を かくにん"), + _("かくにん は しっぱい"), +}; + +static const u8 sColorCodes[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE2}"); + +const struct BlockRequest sBlockRequestLookupTable[5] = +{ + {gBlockSendBuffer, 200}, + {gBlockSendBuffer, 200}, + {gBlockSendBuffer, 100}, + {gBlockSendBuffer, 220}, + {gBlockSendBuffer, 40}, +}; + +static const u8 sTestString[] = _("テストな"); + +ALIGNED(4) static const u8 sMagic[] = "GameFreak inc."; + +ALIGNED(4) static const u8 sEmptyString[] = _(""); + +void Task_DestroySelf(u8 taskId) +{ + DestroyTask(taskId); +} + +static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) +{ + LoadPalette(sLinkTestDigitPalette, 16 * paletteNum, 32); + DmaCopy16(3, sLinkTestDigitTiles, BG_CHAR_ADDR(charBaseBlock), 0x220); + + gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; + gLinkTestBGInfo.paletteNum = paletteNum; + + switch (bgNum) + { + case 1: + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock); + break; + case 2: + REG_BG2CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock); + break; + case 3: + REG_BG3CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock); + break; + } +} + +void InitLinkTestBG_Unused(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) +{ + LoadPalette(sLinkTestDigitPalette, 16 * paletteNum, 32); + DmaCopy16(3, sLinkTestDigitTiles, BG_CHAR_ADDR(charBaseBlock), 0x220); + + gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; + gLinkTestBGInfo.paletteNum = paletteNum; + + *gBGControlRegs[bgNum] = (screenBaseBlock << 8) | (charBaseBlock << 2); +} + +void LinkTestScreen(void) +{ + s32 i; + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + SetVBlankCallback(VBlankCB_LinkTest); + SetUpWindowConfig(&gWindowConfig_81E6CE4); + InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E6CE4); + ResetBlockSend(); + gLinkType = 0x1111; + OpenLink(); + SeedRng(gMain.vblankCounter1); + + for (i = 0; i < 4; i++) + { + // Very weird code, but nothing else seems to match. + // The following would have the same effect: + // gSaveBlock2.playerTrainerId[i] = Random(); + u8 *trainerId = gSaveBlock2.playerTrainerId; + s32 r; + s32 mask = 0xFF; + trainerId[i] = (r = Random()) & mask; + } + + InitLinkTestBG(0, 2, 4, 0); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_1D_MAP; + CreateTask(Task_DestroySelf, 0); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + sDummy3 = 0; + InitLocalLinkPlayer(); + CreateTask(Task_PrintTestData, 0); + SetMainCallback2(CB2_LinkTest); +} + +void sub_8007270(u8 a1) +{ + localLinkPlayer.lp_field_18 = a1; +} + +static void InitLocalLinkPlayer(void) +{ + s32 i; + + localLinkPlayer.trainerId = gSaveBlock2.playerTrainerId[0] + | (gSaveBlock2.playerTrainerId[1] << 8) + | (gSaveBlock2.playerTrainerId[2] << 16) + | (gSaveBlock2.playerTrainerId[3] << 24); + + for (i = 0; i < (s32)sizeof(localLinkPlayer.name); i++) + localLinkPlayer.name[i] = gSaveBlock2.playerName[i]; // UB: reads past the end of "playerName" array + + localLinkPlayer.gender = gSaveBlock2.playerGender; + localLinkPlayer.linkType = gLinkType; + localLinkPlayer.language = gGameLanguage; + localLinkPlayer.version = gGameVersion + 0x4000; + localLinkPlayer.lp_field_2 = 0; +} + +static void VBlankCB_LinkTest(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void InitLink(void) +{ + s32 i; + + for (i = 0; i < CMD_LENGTH; i++) + gSendCmd[i] = 0xEFFF; + + gLinkOpen = TRUE; + EnableSerial(); +} + +static void Task_TriggerHandshake(u8 taskId) +{ + gTasks[taskId].data[0]++; + + if (gTasks[taskId].data[0] == 5) + { + gShouldAdvanceLinkState = 1; + DestroyTask(taskId); + } +} + +void OpenLink(void) +{ + s32 i; + + ResetSerial(); + InitLink(); + + gLinkCallback = LinkCB_RequestPlayerDataExchange; + gLinkVSyncDisabled = FALSE; + gLinkErrorOccurred = FALSE; + gSuppressLinkErrorMessage = FALSE; + + ResetBlockReceivedFlags(); + + sDummy1 = 0; + byte_3002A68 = 0; + gLinkDummyBool = FALSE; + gReceivedRemoteLinkPlayers = FALSE; + + for (i = 0; i < 4; i++) + { + gLinkPlayerPending[i] = TRUE; + u8_array_3002B78[i] = 0; + u8_array_3002B70[i] = 0; + } + + CreateTask(Task_TriggerHandshake, 2); +} + +void CloseLink(void) +{ + gReceivedRemoteLinkPlayers = FALSE; + gLinkOpen = FALSE; + DisableSerial(); +} + +static void TestBlockTransfer(u32 a1, u32 a2, u32 a3) +{ + u8 i; + u8 val; + + if (sLinkTestLastBlockSendPos != sBlockSend.pos) + { + PrintHex(sBlockSend.pos, 2, 3, 2); + sLinkTestLastBlockSendPos = sBlockSend.pos; + } + + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos) + { + PrintHex(sBlockRecv[i].pos, 2, i + 4, 2); + sLinkTestLastBlockRecvPos[i] = sBlockRecv[i].pos; + } + } + + val = GetBlockReceivedStatus(); + + if (val == 0xF) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if ((val >> i) & 1) + { + gLinkTestBlockChecksums[i] = LinkTestCalcBlockChecksum(&gBlockRecvBuffer[i], sBlockRecv[i].size); + ResetBlockReceivedFlag(i); + if (gLinkTestBlockChecksums[i] != 834) + { + gLinkTestDebugValuesEnabled = FALSE; + gLinkTestDummyBool = FALSE; + } + } + } + } +} + +static void LinkTestProcessKeyInput(void) +{ + if (gMain.newKeys & A_BUTTON) + gShouldAdvanceLinkState = 1; + if (gMain.heldKeys & B_BUTTON) + InitBlockSend(unk_2004000, 0x2004); + if (gMain.newKeys & L_BUTTON) + BeginNormalPaletteFade(-1, 0, 0x10, 0, 2); + if (gMain.newKeys & START_BUTTON) + SetSuppressLinkErrorMessage(TRUE); + if (gMain.newKeys & R_BUTTON) + TrySavingData(LINK_SAVE); + if (gMain.newKeys & SELECT_BUTTON) + sub_800832C(); + if (gLinkTestDebugValuesEnabled) + { + u32 vblankCounter1 = gMain.vblankCounter1; + u8 val = gLinkVSyncDisabled; + if (!gLinkCallback) + val = gLinkVSyncDisabled | 0x10; + SetLinkDebugValues(vblankCounter1, val); + } +} + +static void CB2_LinkTest(void) +{ + LinkTestProcessKeyInput(); + TestBlockTransfer(1, 1, 0); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +u16 LinkMain2(u16 *heldKeys) +{ + u8 i; + + if (!gLinkOpen) + return 0; + + for (i = 0; i < CMD_LENGTH; i++) + gSendCmd[i] = 0; + + gLinkHeldKeys = *heldKeys; + + if (gLinkStatus & LINK_STAT_CONN_ESTABLISHED) + { + ProcessRecvCmds(SIO_MULTI_CNT->id); + if (gLinkCallback) + gLinkCallback(); + CheckErrorStatus(); + } + + return gLinkStatus; +} + +static void HandleReceiveRemoteLinkPlayer(u8 multiplayerId) +{ + u32 pendingLinkPlayerCount = 0; + s32 i; + + gLinkPlayerPending[multiplayerId] = FALSE; + + for (i = 0; i < GetLinkPlayerCount_2(); i++) + pendingLinkPlayerCount += gLinkPlayerPending[i]; + + if (pendingLinkPlayerCount == 0 && !gReceivedRemoteLinkPlayers) + gReceivedRemoteLinkPlayers = TRUE; +} + +static void ProcessRecvCmds(u8 unusedParam) +{ + u16 i; + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + word_3002910[i] = 0; + if (!gRecvCmds[0][i]) + continue; + switch (gRecvCmds[0][i]) + { + case 0x2222: + InitLocalLinkPlayer(); + localLinkPlayerBlock.linkPlayer = localLinkPlayer; + memcpy(localLinkPlayerBlock.magic1, sMagic, sizeof(localLinkPlayerBlock.magic1) - 1); + memcpy(localLinkPlayerBlock.magic2, sMagic, sizeof(localLinkPlayerBlock.magic2) - 1); + InitBlockSend(&localLinkPlayerBlock, sizeof(localLinkPlayerBlock)); + break; + case 0x4444: + word_3002910[i] = gRecvCmds[1][i]; + break; + case 0x5555: + byte_3002A68 = 1; + break; + case 0x5566: + byte_3002A68 = 1; + break; + case 0xBBBB: + { + struct BlockTransfer *blockRecv = &sBlockRecv[i]; + blockRecv->pos = 0; + blockRecv->size = gRecvCmds[1][i]; + blockRecv->multiplayerId = gRecvCmds[2][i]; + break; + } + case 0x8888: + if (sBlockRecv[i].size > BLOCK_BUFFER_SIZE) + { + u16 *buffer = (u16 *)unk_2000000; + u16 j; + for (j = 0; j < CMD_LENGTH - 1; j++) + buffer[(sBlockRecv[i].pos / 2) + j] = gRecvCmds[j + 1][i]; + } + else + { + u16 j; + for (j = 0; j < CMD_LENGTH - 1; j++) + gBlockRecvBuffer[i][(sBlockRecv[i].pos / 2) + j] = gRecvCmds[j + 1][i]; + } + + sBlockRecv[i].pos += (CMD_LENGTH - 1) * 2; + + if (sBlockRecv[i].pos >= sBlockRecv[i].size) + { + if (gLinkPlayerPending[i] == TRUE) + { + struct LinkPlayerBlock *block = (struct LinkPlayerBlock *)&gBlockRecvBuffer[i]; + struct LinkPlayer *linkPlayer = &gLinkPlayers[i]; + *linkPlayer = block->linkPlayer; + + if (strcmp(block->magic1, sMagic) + || strcmp(block->magic2, sMagic)) + { + SetMainCallback2(CB2_LinkError); + } + else + { + HandleReceiveRemoteLinkPlayer(i); + } + + ConvertInternationalString(gLinkPlayers[i].name, gLinkPlayers[i].language); + } + else + { + SetBlockReceivedFlag(i); + } + } + break; + case 0x5FFF: + u8_array_3002B78[i] = 1; + break; + case 0x2FFE: + u8_array_3002B70[i] = 1; + break; + case 0xAAAA: + sub_8007E24(); + break; + case 0xAAAB: + sub_80516C4(i, gRecvCmds[1][i]); + break; + case 0xCCCC: +#if defined(ENGLISH) + SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); +#elif defined(GERMAN) + if (deUnkValue2 == 1) + { + deUnkValue2 = 2; + deUnkValue1 = gRecvCmds[1][i]; + } + else if (deUnkValue2 == 2 || deUnkValue2 == 3) + { + SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); + + if (deUnkValue2 == 2) + deUnkValue2 = 1; + else + deUnkValue2 = 0; + } + else + { + SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); + } +#endif + break; + case 0xCAFE: + word_3002910[i] = gRecvCmds[1][i]; + break; + } + } +} + +static void BuildSendCmd(u16 code) +{ + switch (code) + { + case 0x2222: + gSendCmd[0] = 0x2222; + gSendCmd[1] = gLinkType; + break; + case 0x2FFE: + gSendCmd[0] = 0x2FFE; + break; + case 0x4444: + gSendCmd[0] = 0x4444; + gSendCmd[1] = gMain.heldKeys; + break; + case 0x5555: + gSendCmd[0] = 0x5555; + break; + case 0x5566: + gSendCmd[0] = 0x5566; + break; + case 0x6666: + gSendCmd[0] = 0x6666; + gSendCmd[1] = 0; + break; + case 0x7777: + { + u8 i; + + gSendCmd[0] = 0x7777; + + for (i = 0; i < 5; i++) + gSendCmd[i + 1] = 0xEE; + + break; + } + case 0xBBBB: + gSendCmd[0] = 0xBBBB; + gSendCmd[1] = sBlockSend.size; + gSendCmd[2] = sBlockSend.multiplayerId + 128; + break; + case 0xAAAA: + gSendCmd[0] = 0xAAAA; + break; + case 0xAAAB: + gSendCmd[0] = 0xAAAB; + gSendCmd[1] = gScriptItemId; + break; + case 0xCCCC: + gSendCmd[0] = 0xCCCC; + gSendCmd[1] = gBlockRequestType; + break; + case 0x5FFF: + gSendCmd[0] = 0x5FFF; + break; + case 0xCAFE: + if (!word_3004858 || gLinkTransferringData) + break; + gSendCmd[0] = 0xCAFE; + gSendCmd[1] = word_3004858; + break; + } +} + +void sub_8007B14(void) +{ + gLinkCallback = sub_8007B44; +} + +bool32 sub_8007B24(void) +{ + if (gLinkCallback == sub_8007B44) + return TRUE; + else + return FALSE; +} + +static void sub_8007B44(void) +{ + if (gReceivedRemoteLinkPlayers == TRUE) + BuildSendCmd(0xCAFE); +} + +void ClearLinkCallback(void) +{ + gLinkCallback = NULL; +} + +void ClearLinkCallback_2(void) +{ + gLinkCallback = NULL; +} + +u8 GetLinkPlayerCount(void) +{ + return EXTRACT_PLAYER_COUNT(gLinkStatus); +} + +void OpenLinkTimed(void) +{ + sPlayerDataExchangeStatus = EXCHANGE_NOT_STARTED; + gLinkTimeOutCounter = 0; +#if defined(GERMAN) + ResetBlockSend(); +#endif + OpenLink(); +} + +u8 GetLinkPlayerDataExchangeStatusTimed(void) +{ + s32 i; + s32 count = 0; + u32 index; + + if (gReceivedRemoteLinkPlayers == TRUE) + { + if (GetLinkPlayerCount() == 0) + { + gLinkErrorOccurred = TRUE; + CloseLink(); + } + + i = 0; + index = 0; + + while (i < GetLinkPlayerCount()) + { + if (gLinkPlayers[index].linkType == gLinkPlayers[0].linkType) + ++count; + ++index; + ++i; + } + + if (count == GetLinkPlayerCount()) + sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; + else + sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; + } + else + { + gLinkTimeOutCounter++; + if (gLinkTimeOutCounter > 600) + sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT; + } + + return sPlayerDataExchangeStatus; +} + +bool8 IsLinkPlayerDataExchangeComplete(void) +{ + u8 i; + u8 count = 0; + u8 isComplete; + + for (i = 0; i < GetLinkPlayerCount(); i++) + if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType) + count++; + + if (count == GetLinkPlayerCount()) + { + isComplete = TRUE; + sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; + } + else + { + isComplete = FALSE; + sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; + } + + return isComplete; +} + +u32 GetLinkPlayerTrainerId(u8 multiplayerId) +{ + return gLinkPlayers[multiplayerId].trainerId; +} + +void ResetLinkPlayers(void) +{ + s32 i; + for (i = 0; i < 4; i++) + memset(&gLinkPlayers[i], 0, sizeof(struct LinkPlayer)); +} + +static void ResetBlockSend(void) +{ + sBlockSend.active = FALSE; + sBlockSend.pos = 0; + sBlockSend.size = 0; + sBlockSend.src = NULL; +} + +static bool8 InitBlockSend(void *data, u32 size) +{ + if (sBlockSend.active) + { + return FALSE; + } + else + { + sBlockSend.multiplayerId = GetMultiplayerId(); + sBlockSend.active = TRUE; + sBlockSend.size = size; + sBlockSend.pos = 0; + + if (size > BLOCK_BUFFER_SIZE) + { + sBlockSend.src = data; + } + else + { + if (data != gBlockSendBuffer) + memcpy(gBlockSendBuffer, data, size); + sBlockSend.src = gBlockSendBuffer; + } + + BuildSendCmd(0xBBBB); + gLinkCallback = LinkCB_BlockSendBegin; + sBlockSendDelayCounter = 0; + return TRUE; + } +} + +static void LinkCB_BlockSendBegin(void) +{ + sBlockSendDelayCounter++; + if (sBlockSendDelayCounter > 2) + gLinkCallback = LinkCB_BlockSend; +} + +static void LinkCB_BlockSend(void) +{ + s32 i; + u8 *buffer = sBlockSend.src; + + gSendCmd[0] = 0x8888; + + for (i = 0; i < CMD_LENGTH - 1; i++) + { + s32 offset = sBlockSend.pos + 2 * i; + gSendCmd[i + 1] = (buffer[offset + 1] << 8) | buffer[offset]; + } + + sBlockSend.pos += (CMD_LENGTH - 1) * 2; + + if (sBlockSend.size <= sBlockSend.pos) + { + sBlockSend.active = FALSE; + gLinkCallback = LinkCB_BlockSendEnd; + } +} + +static void LinkCB_BlockSendEnd(void) +{ + gLinkCallback = NULL; +} + +static void sub_8007E04(void) +{ + GetMultiplayerId(); // whats the point of calling this if you dont use the multiplayer ID? + BuildSendCmd(0x4444); + dword_20238BC++; +} + +void sub_8007E24(void) +{ + dword_20238BC = 0; + gLinkCallback = sub_8007E04; +} + +u32 sub_8007E40(void) +{ + return dword_20238BC; +} + +void sub_8007E4C(void) +{ + BuildSendCmd(0xAAAA); +} + +u8 GetMultiplayerId(void) +{ + return SIO_MULTI_CNT->id; +} + +u8 bitmask_all_link_players_but_self(void) +{ + return ((1 << GetMultiplayerId()) ^ 0xF); +} + +bool8 SendBlock(u8 a1, void *a2, u16 a3) +{ + return InitBlockSend(a2, a3); +} + +bool8 sub_8007E9C(u8 a1) +{ + if (!gLinkCallback) + { + gBlockRequestType = a1; + BuildSendCmd(0xCCCC); + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 sub_8007ECC(void) +{ + u8 retVal = FALSE; + + if (!gLinkCallback) + retVal = TRUE; + + return retVal; +} + +u8 GetBlockReceivedStatus(void) +{ + return (gBlockReceived[3] << 3) + | (gBlockReceived[2] << 2) + | (gBlockReceived[1] << 1) + | gBlockReceived[0]; +} + +static void SetBlockReceivedFlag(u8 multiplayerId) +{ + gBlockReceived[multiplayerId] = TRUE; +} + +void ResetBlockReceivedFlags(void) +{ + s32 i; + for (i = 0; i < 4; i++) + gBlockReceived[i] = FALSE; +} + +void ResetBlockReceivedFlag(u8 multiplayerId) +{ + if (gBlockReceived[multiplayerId]) + gBlockReceived[multiplayerId] = FALSE; +} + +void sub_8007F4C(void) +{ + if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1) + gShouldAdvanceLinkState = 1; +} + +static u16 LinkTestCalcBlockChecksum(void *data, u16 size) +{ + u16 sum = 0; + u16 i; + + for (i = 0; i < size / 2; i++) + sum += ((u16 *)data)[i]; + + return sum; +} + +static void PrintHexDigit(u8 tileNum, u8 x, u8 y) +{ + u16 *tilemap = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock); + tilemap[(32 * y) + x] = (gLinkTestBGInfo.paletteNum << 12) | (tileNum + 1); +} + +static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) +{ + u8 buffer[16]; + s32 i; + + for (i = 0; i < maxDigits; i++) + { + buffer[i] = num & 0xF; + num >>= 4; + } + + for (i = maxDigits - 1; i >= 0; i--) + { + PrintHexDigit(buffer[i], x, y); + x++; + } +} + +static void LinkCB_RequestPlayerDataExchange(void) +{ + // Only one request needs to be sent, so only the master sends it. + if (gLinkStatus & LINK_STAT_MASTER) + BuildSendCmd(0x2222); + gLinkCallback = NULL; +} + +void Task_PrintTestData(u8 taskId) +{ + s32 i; + + PrintHex(gShouldAdvanceLinkState, 2, 1, 2); + PrintHex(gLinkStatus, 15, 1, 8); + PrintHex(gLink.state, 2, 10, 2); + PrintHex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2); + PrintHex(GetMultiplayerId(), 15, 12, 2); + PrintHex(gLastSendQueueCount, 25, 1, 2); + PrintHex(gLastRecvQueueCount, 25, 2, 2); + PrintHex(GetBlockReceivedStatus(), 15, 5, 2); + PrintHex(gLinkDebugValue1, 2, 12, 8); + PrintHex(gLinkDebugValue2, 2, 13, 8); + PrintHex(GetSioMultiSI(), 25, 5, 1); + PrintHex(IsSioMultiMaster(), 25, 6, 1); + PrintHex(IsLinkConnectionEstablished(), 25, 7, 1); + PrintHex(HasLinkErrorOccurred(), 25, 8, 1); + + for (i = 0; i < MAX_LINK_PLAYERS; i++) + PrintHex(gLinkTestBlockChecksums[i], 10, 4 + i, 4); +} + +void SetLinkDebugValues(u32 value1, u32 value2) +{ + gLinkDebugValue1 = value1; + gLinkDebugValue2 = value2; +} + +u8 sub_8008198(void) +{ + u8 result = 0; + s32 i; + + for (i = 0; i < gSavedLinkPlayerCount; i++) + result |= (1 << i); + + return result; +} + +void sub_80081C8(u8 playerCount) +{ + s32 i; + + gSavedLinkPlayerCount = playerCount; + gSavedMultiplayerId = GetMultiplayerId(); + + for (i = 0; i < 4; i++) + gSavedLinkPlayers[i] = gLinkPlayers[i]; +} + +u8 sub_800820C(void) +{ + return gSavedLinkPlayerCount; +} + +u8 sub_8008218(void) +{ + return gSavedMultiplayerId; +} + +bool8 sub_8008224(void) +{ + s32 count = 0; + s32 i; + + for (i = 0; i < gSavedLinkPlayerCount; i++) + if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId) + count++; + + if (count == gSavedLinkPlayerCount) + return TRUE; + else + return FALSE; +} + +void sub_800826C(void) +{ + u8 i; + + for (i = 0; i < gSavedLinkPlayerCount; i++) + { + if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId + || StringCompareWithoutExtCtrlCodes(gSavedLinkPlayers[i].name, gLinkPlayers[i].name)) + { + gLinkErrorOccurred = TRUE; + CloseLink(); + SetMainCallback2(CB2_LinkError); + } + } +} + +void sub_80082EC(void) +{ + gSavedLinkPlayerCount = 0; + gSavedMultiplayerId = 0; +} + +u8 GetLinkPlayerCount_2(void) +{ + return EXTRACT_PLAYER_COUNT(gLinkStatus); +} + +bool8 IsLinkMaster(void) +{ + return EXTRACT_MASTER(gLinkStatus); +} + +u8 GetDummy2(void) +{ + return sDummy2; +} + +void sub_800832C(void) +{ + if (!gLinkCallback) + { + gLinkCallback = sub_8008350; + gLinkDummyBool = FALSE; + } +} + +static void sub_8008350(void) +{ + if (gLastRecvQueueCount == 0) + { + BuildSendCmd(0x5FFF); + gLinkCallback = sub_800837C; + } +} + +static void sub_800837C(void) +{ + s32 i; + s32 totalCount = GetLinkPlayerCount(); + s32 count = 0; + + for (i = 0; i < totalCount; i++) + if (u8_array_3002B78[i]) + count++; + + if (count == totalCount) + { + gBattleTypeFlags &= ~BATTLE_TYPE_20; + gLinkVSyncDisabled = TRUE; + CloseLink(); + gLinkCallback = NULL; + gLinkDummyBool = TRUE; + } +} + +static void sub_80083E0(void) +{ + s32 i; + s32 totalCount = GetLinkPlayerCount(); + s32 count = 0; + + for (i = 0; i < totalCount; i++) + { + if (gLinkPlayers[i].language == 1) + count++; + else if (u8_array_3002B78[i]) + count++; + } + + if (count == totalCount) + { + gBattleTypeFlags &= ~BATTLE_TYPE_20; + gLinkVSyncDisabled = TRUE; + CloseLink(); + gLinkCallback = 0; + gLinkDummyBool = TRUE; + } +} + +static void sub_8008454(void) +{ + if (gLastRecvQueueCount == 0) + { + BuildSendCmd(0x5FFF); + gLinkCallback = sub_80083E0; + } +} + +void sub_8008480(void) +{ + if (!gLinkCallback) + { + gLinkCallback = sub_8008454; + gLinkDummyBool = FALSE; + } +} + +void sub_80084A4(void) +{ + if (!gLinkCallback) + gLinkCallback = sub_80084C8; + gLinkDummyBool = FALSE; +} + +static void sub_80084C8(void) +{ + if (gLastRecvQueueCount == 0) + { + BuildSendCmd(0x2FFE); + gLinkCallback = sub_80084F4; + } +} + +static void sub_80084F4(void) +{ + u8 totalCount = GetLinkPlayerCount(); + u8 count = 0; + + while (count < totalCount && u8_array_3002B70[count]) + count++; + + if (count == totalCount) + { + u8 i; + for (i = 0; i < 4; i++) + u8_array_3002B70[i] = 0; + gLinkCallback = NULL; + } +} + +static void CheckErrorStatus(void) +{ + if (gLinkOpen) + { + if (gLinkStatus & LINK_STAT_ERRORS) + { + if (!gSuppressLinkErrorMessage) + { + sErrorLinkStatus = gLinkStatus; + sErrorLastRecvQueueCount = gLastRecvQueueCount; + sErrorLastSendQueueCount = gLastSendQueueCount; + SetMainCallback2(CB2_LinkError); + } + gLinkErrorOccurred = TRUE; + CloseLink(); + } + } +} + +void CB2_LinkError(void) +{ + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetPaletteFadeControl(); + FillPalette(0, 0, 2); + ResetTasks(); + SetVBlankCallback(VBlankCB_LinkTest); + SetUpWindowConfig(&gWindowConfig_81E7198); + InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E7198); + MenuZeroFillScreen(); + REG_BLDALPHA = 0; + REG_BG0VOFS = 0; + REG_BG0HOFS = 0; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; + gSoftResetDisabled = FALSE; + CreateTask(Task_DestroySelf, 0); + StopMapMusic(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + SetMainCallback2(CB2_PrintErrorMessage); +} + +static void CB2_PrintErrorMessage(void) +{ + u8 array[64] __attribute__((unused)); // unused + + switch (gMain.state) + { + case 0: + MenuPrint_PixelCoords(gMultiText_LinkError, 20, 56, 1); + break; + case 30: + case 60: + PlaySE(SE_BOO); + break; + case 90: + PlaySE(SE_BOO); + break; + } + + if (gMain.state != 200) + gMain.state++; +} + +u8 GetSioMultiSI(void) +{ + return (REG_SIOCNT >> SIO_MULTI_SI_SHIFT) & SIO_MULTI_SI_MASK; +} + +static bool8 IsSioMultiMaster(void) +{ + bool8 isMaster = FALSE; + + if ((REG_SIOCNT & SIO_MULTI_SD) && !(REG_SIOCNT & SIO_MULTI_SI)) + isMaster = TRUE; + + return isMaster; +} + +bool8 IsLinkConnectionEstablished(void) +{ + return EXTRACT_CONN_ESTABLISHED(gLinkStatus); +} + +void SetSuppressLinkErrorMessage(bool8 value) +{ + gSuppressLinkErrorMessage = value; +} + +bool8 HasLinkErrorOccurred(void) +{ + return gLinkErrorOccurred; +} + +static void DisableSerial(void) +{ + gLinkSavedIme = REG_IME; + REG_IME = 0; + REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); + REG_IME = gLinkSavedIme; + + REG_SIOCNT = 0; + REG_TM3CNT_H = 0; + REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL; + + CpuFill32(0, &gLink, sizeof(gLink)); +} + +static void EnableSerial(void) +{ + gLinkSavedIme = REG_IME; + REG_IME = 0; + REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); + REG_IME = gLinkSavedIme; + + REG_RCNT = 0; + + REG_SIOCNT = SIO_MULTI_MODE; + REG_SIOCNT |= SIO_INTR_ENABLE | SIO_115200_BPS; + + gLinkSavedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = gLinkSavedIme; + + REG_SIOMLT_SEND = 0; + + CpuFill32(0, &gLink, sizeof(gLink)); + + sNumVBlanksWithoutSerialIntr = 0; + sSendNonzeroCheck = 0; + sRecvNonzeroCheck = 0; + sChecksumAvailable = FALSE; + sHandshakePlayerCount = 0; + gLastSendQueueCount = 0; + gLastRecvQueueCount = 0; +} + +void ResetSerial(void) +{ + EnableSerial(); + DisableSerial(); +} + +u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 recvCmds[CMD_LENGTH][MAX_LINK_PLAYERS]) +{ + u32 retVal; + u32 retVal2; + + switch (gLink.state) + { + case LINK_STATE_START0: + DisableSerial(); + gLink.state = LINK_STATE_START1; + break; + case LINK_STATE_START1: + if (*shouldAdvanceLinkState == 1) + { + EnableSerial(); + gLink.state = LINK_STATE_HANDSHAKE; + } + break; + case LINK_STATE_HANDSHAKE: + switch (*shouldAdvanceLinkState) + { + case 1: + if (gLink.isMaster == 8 && gLink.playerCount > 1) + gLink.handshakeAsMaster = TRUE; + break; + case 2: + gLink.state = LINK_STATE_START0; + REG_SIOMLT_SEND = 0; + break; + default: + CheckMasterOrSlave(); + break; + } + break; + case LINK_STATE_INIT_TIMER: + InitTimer(); + gLink.state = LINK_STATE_CONN_ESTABLISHED; + case LINK_STATE_CONN_ESTABLISHED: + EnqueueSendCmd(sendCmd); + DequeueRecvCmds(recvCmds); + break; + } + + *shouldAdvanceLinkState = 0; + + retVal = gLink.localId; + retVal |= (gLink.playerCount << 2); + + if (gLink.isMaster == 8) + retVal |= 0x20; + + { + u32 receivedNothing = gLink.receivedNothing << 8; + u32 link_field_F = gLink.link_field_F << 9; + u32 hardwareError = gLink.hardwareError << 12; + u32 badChecksum = gLink.badChecksum << 13; + u32 queueFull = gLink.queueFull << 14; + u32 val; + + if (gLink.state == LINK_STATE_CONN_ESTABLISHED) + { + val = 0x40; + val |= receivedNothing; + val |= retVal; + val |= link_field_F; + val |= hardwareError; + val |= badChecksum; + val |= queueFull; + } + else + { + val = retVal; + val |= receivedNothing; + val |= link_field_F; + val |= hardwareError; + val |= badChecksum; + val |= queueFull; + } + + retVal = val; + } + + if (gLink.lag == LAG_MASTER) + retVal |= 0x10000; + + if (gLink.localId > 3) + retVal |= 0x20000; + + retVal2 = retVal; + if (gLink.lag == LAG_SLAVE) + retVal2 |= 0x40000; + + return retVal2; +} + +static void CheckMasterOrSlave(void) +{ + u32 terminals = *(u32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SD | SIO_MULTI_SI); + + if (terminals == SIO_MULTI_SD && !gLink.localId) + gLink.isMaster = 8; + else + gLink.isMaster = 0; +} + +static void InitTimer(void) +{ + if (gLink.isMaster) + { + REG_TM3CNT_L = 65339; + REG_TM3CNT_H = TIMER_INTR_ENABLE | TIMER_64CLK; + + gLinkSavedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_TIMER3; + REG_IME = gLinkSavedIme; + } +} + +static void EnqueueSendCmd(u16 *sendCmd) +{ + gLinkSavedIme = REG_IME; + REG_IME = 0; + + if (gLink.sendQueue.count < QUEUE_CAPACITY) + { + u8 i; + u8 offset = gLink.sendQueue.pos + gLink.sendQueue.count; + + if (offset >= QUEUE_CAPACITY) + offset -= QUEUE_CAPACITY; + + for (i = 0; i < CMD_LENGTH; i++) + { + sSendNonzeroCheck |= *sendCmd; + gLink.sendQueue.data[i][offset] = *sendCmd; + *sendCmd = 0; + sendCmd++; + } + } + else + { + gLink.queueFull = QUEUE_FULL_SEND; + } + + if (sSendNonzeroCheck) + { + gLink.sendQueue.count++; + sSendNonzeroCheck = 0; + } + + REG_IME = gLinkSavedIme; + gLastSendQueueCount = gLink.sendQueue.count; +} + +void DequeueRecvCmds(u16 recvCmds[CMD_LENGTH][MAX_LINK_PLAYERS]) +{ + u8 i; + u8 j; + + gLinkSavedIme = REG_IME; + REG_IME = 0; + + if (gLink.recvQueue.count == 0) + { + for (i = 0; i < CMD_LENGTH; i++) + for (j = 0; j < gLink.playerCount; j++) + recvCmds[i][j] = 0; + + gLink.receivedNothing = TRUE; + } + else + { + for (i = 0; i < CMD_LENGTH; i++) + for (j = 0; j < gLink.playerCount; j++) + recvCmds[i][j] = gLink.recvQueue.data[j][i][gLink.recvQueue.pos]; + + gLink.recvQueue.count--; + gLink.recvQueue.pos++; + + if (gLink.recvQueue.pos >= QUEUE_CAPACITY) + gLink.recvQueue.pos = 0; + + gLink.receivedNothing = FALSE; + } + + REG_IME = gLinkSavedIme; +} + +void LinkVSync(void) +{ + if (gLink.isMaster) + { + switch (gLink.state) + { + case LINK_STATE_HANDSHAKE: + StartTransfer(); + break; + case LINK_STATE_CONN_ESTABLISHED: + if (gLink.serialIntrCounter > 8) + { + if (gLink.lag == LAG_MASTER) + return; + gLink.serialIntrCounter = 0; + } + else if (gLink.hardwareError != TRUE) + { + gLink.lag = LAG_MASTER; + return; + } + StartTransfer(); + break; + } + } + else if (gLink.state == LINK_STATE_CONN_ESTABLISHED + || gLink.state == LINK_STATE_HANDSHAKE) + { + sNumVBlanksWithoutSerialIntr++; + + if (sNumVBlanksWithoutSerialIntr > 10) + { + if (gLink.state == LINK_STATE_CONN_ESTABLISHED) + gLink.lag = LAG_SLAVE; + + if (gLink.state == LINK_STATE_HANDSHAKE) + { + gLink.playerCount = 0; + gLink.link_field_F = 0; + } + } + } +} + +void Timer3Intr(void) +{ + StopTimer(); + StartTransfer(); +} + +void SerialCB(void) +{ + gLink.localId = SIO_MULTI_CNT->id; + + switch (gLink.state) + { + case LINK_STATE_CONN_ESTABLISHED: + gLink.hardwareError = SIO_MULTI_CNT->error; + DoRecv(); + DoSend(); + SendRecvDone(); + break; + case LINK_STATE_HANDSHAKE: + if (DoHandshake()) + { + if (gLink.isMaster) + { + gLink.state = LINK_STATE_INIT_TIMER; + gLink.serialIntrCounter = 8; + } + else + { + gLink.state = LINK_STATE_CONN_ESTABLISHED; + } + } + break; + } + + gLink.serialIntrCounter++; + sNumVBlanksWithoutSerialIntr = 0; + + if (gLink.serialIntrCounter == 8) + gLastRecvQueueCount = gLink.recvQueue.count; +} + +static void StartTransfer(void) +{ + REG_SIOCNT |= SIO_START; +} + +static bool8 DoHandshake(void) +{ + u8 i; + u8 playerCount = 0; + u16 minRecv = 0xFFFF; + + if (gLink.handshakeAsMaster == TRUE) + REG_SIOMLT_SEND = MASTER_HANDSHAKE; + else + REG_SIOMLT_SEND = SLAVE_HANDSHAKE; + + *(u64 *)&gLink.tempRecvBuffer[0] = REG_SIOMLT_RECV; + REG_SIOMLT_RECV = 0; + + gLink.handshakeAsMaster = FALSE; + + for (i = 0; i < 4; i++) + { + if ((gLink.tempRecvBuffer[i] & ~0x3) == SLAVE_HANDSHAKE + || gLink.tempRecvBuffer[i] == MASTER_HANDSHAKE) + { + playerCount++; + + if (minRecv > gLink.tempRecvBuffer[i] && gLink.tempRecvBuffer[i] != 0) + minRecv = gLink.tempRecvBuffer[i]; + } + else + { + if (gLink.tempRecvBuffer[i] != 0xFFFF) + playerCount = 0; + break; + } + } + + gLink.playerCount = playerCount; + + // The handshake is successful when: + // 1. There are multiple players. + // 2. The number of players agrees with the last attempt. + // 3. Player no. 0 is identifying as the master. + if (gLink.playerCount > 1 + && gLink.playerCount == sHandshakePlayerCount + && gLink.tempRecvBuffer[0] == MASTER_HANDSHAKE) + return TRUE; + + if (gLink.playerCount > 1) + gLink.link_field_F = (minRecv & 3) + 1; + else + gLink.link_field_F = 0; + + sHandshakePlayerCount = gLink.playerCount; + + return FALSE; +} + +static void DoRecv(void) +{ + u16 recvBuffer[4]; + u8 i; + + *(u64 *)&recvBuffer[0] = REG_SIOMLT_RECV; + + if (gLink.sendCmdIndex == 0) + { + for (i = 0; i < gLink.playerCount; i++) + if (gLink.checksum != recvBuffer[i] && sChecksumAvailable) + gLink.badChecksum = TRUE; + + gLink.checksum = 0; + sChecksumAvailable = TRUE; + } + else + { + u8 index = gLink.recvQueue.pos + gLink.recvQueue.count; + + if (index >= QUEUE_CAPACITY) + index -= QUEUE_CAPACITY; + + if (gLink.recvQueue.count < QUEUE_CAPACITY) + { + for (i = 0; i < gLink.playerCount; i++) + { + gLink.checksum += recvBuffer[i]; + sRecvNonzeroCheck |= recvBuffer[i]; + gLink.recvQueue.data[i][gLink.recvCmdIndex][index] = recvBuffer[i]; + } + } + else + { + gLink.queueFull = QUEUE_FULL_RECV; + } + + gLink.recvCmdIndex++; + + if (gLink.recvCmdIndex == CMD_LENGTH && sRecvNonzeroCheck) + { + gLink.recvQueue.count++; + sRecvNonzeroCheck = 0; + } + } +} + +static void DoSend(void) +{ + if (gLink.sendCmdIndex == CMD_LENGTH) + { + REG_SIOMLT_SEND = gLink.checksum; + + if (!sSendBufferEmpty) + { + gLink.sendQueue.count--; + gLink.sendQueue.pos++; + + if (gLink.sendQueue.pos >= QUEUE_CAPACITY) + gLink.sendQueue.pos = 0; + } + else + { + sSendBufferEmpty = FALSE; + } + } + else + { + if (!sSendBufferEmpty && gLink.sendQueue.count == 0) + sSendBufferEmpty = TRUE; + + if (sSendBufferEmpty) + REG_SIOMLT_SEND = 0; + else + REG_SIOMLT_SEND = gLink.sendQueue.data[gLink.sendCmdIndex][gLink.sendQueue.pos]; + + gLink.sendCmdIndex++; + } +} + +static void StopTimer(void) +{ + if (gLink.isMaster) + { + REG_TM3CNT_H &= ~TIMER_ENABLE; + REG_TM3CNT_L = 65339; + } +} + +static void SendRecvDone(void) +{ + if (gLink.recvCmdIndex == CMD_LENGTH) + { + gLink.sendCmdIndex = 0; + gLink.recvCmdIndex = 0; + } + else if (gLink.isMaster) + { + REG_TM3CNT_H |= TIMER_ENABLE; + } +} + +void ResetSendBuffer(void) +{ + u8 i; + u8 j; + + gLink.sendQueue.count = 0; + gLink.sendQueue.pos = 0; + + for (i = 0; i < CMD_LENGTH; i++) + for (j = 0; j < QUEUE_CAPACITY; j++) + gLink.sendQueue.data[i][j] = 0xEFFF; +} + +void ResetRecvBuffer(void) +{ + u8 i; + u8 j; + u8 k; + + gLink.recvQueue.count = 0; + gLink.recvQueue.pos = 0; + + for (i = 0; i < 4; i++) + for (j = 0; j < CMD_LENGTH; j++) + for (k = 0; k < QUEUE_CAPACITY; k++) + gLink.recvQueue.data[i][j][k] = 0xEFFF; +} diff --git a/src/engine/load_save.c b/src/engine/load_save.c new file mode 100644 index 000000000..730aea2b8 --- /dev/null +++ b/src/engine/load_save.c @@ -0,0 +1,168 @@ +#include "global.h" +#include "gba/flash_internal.h" +#include "load_save.h" +#include "main.h" +#include "pokemon.h" +#include "rom4.h" + +extern u8 gPlayerPartyCount; + +bool32 gFlashMemoryPresent; + +struct LoadedSaveData +{ + struct ItemSlot items[20]; + struct ItemSlot keyItems[20]; + struct ItemSlot pokeBalls[16]; + struct ItemSlot TMsHMs[64]; + struct ItemSlot berries[46]; + struct MailStruct mail[16]; +}; + +EWRAM_DATA struct SaveBlock2 gSaveBlock2 = {0}; +EWRAM_DATA struct SaveBlock1 gSaveBlock1 = {0}; + +static EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0}; + +void CheckForFlashMemory(void) +{ + if (!IdentifyFlash()) + { + gFlashMemoryPresent = TRUE; + InitFlashTimer(); + } + else + gFlashMemoryPresent = FALSE; +} + +bool32 GetSecretBase2Field_9(void) +{ + return gSaveBlock2.specialSaveWarp; +} + +void ClearSecretBase2Field_9(void) +{ + gSaveBlock2.specialSaveWarp = 0; +} + +void SetSecretBase2Field_9(void) +{ + gSaveBlock2.specialSaveWarp = 1; +} + +void SetSecretBase2Field_9_AndHideBG(void) // note: no other function sets specialSaveWarp to values other than 0 or 1, hence clear and set distinctions. +{ + gpu_sync_bg_hide(0); // the function doesn't use the parameter passed to it, but this is necessary to match. + gSaveBlock2.specialSaveWarp = 1; +} + +void ClearSecretBase2Field_9_2(void) // duplicate function +{ + gSaveBlock2.specialSaveWarp = 0; +} + +void SavePlayerParty(void) +{ + int i; + + gSaveBlock1.playerPartyCount = gPlayerPartyCount; + + for (i = 0; i < 6; i++) + gSaveBlock1.playerParty[i] = gPlayerParty[i]; +} + +void LoadPlayerParty(void) +{ + int i; + + gPlayerPartyCount = gSaveBlock1.playerPartyCount; + + for (i = 0; i < 6; i++) + gPlayerParty[i] = gSaveBlock1.playerParty[i]; +} + +static void SaveMapObjects(void) +{ + int i; + + for (i = 0; i < 16; i++) + gSaveBlock1.mapObjects[i] = gMapObjects[i]; +} + +static void LoadMapObjects(void) +{ + int i; + + for (i = 0; i < 16; i++) + gMapObjects[i] = gSaveBlock1.mapObjects[i]; +} + +void SaveSerializedGame(void) +{ + SavePlayerParty(); + SaveMapObjects(); +} + +void LoadSerializedGame(void) +{ + LoadPlayerParty(); + LoadMapObjects(); +} + +void LoadPlayerBag(void) +{ + int i; + + // load player items. + for (i = 0; i < 20; i++) + gLoadedSaveData.items[i] = gSaveBlock1.bagPocket_Items[i]; + + // load player key items. + for (i = 0; i < 20; i++) + gLoadedSaveData.keyItems[i] = gSaveBlock1.bagPocket_KeyItems[i]; + + // load player pokeballs. + for (i = 0; i < 16; i++) + gLoadedSaveData.pokeBalls[i] = gSaveBlock1.bagPocket_PokeBalls[i]; + + // load player TMs and HMs. + for (i = 0; i < 64; i++) + gLoadedSaveData.TMsHMs[i] = gSaveBlock1.bagPocket_TMHM[i]; + + // load player berries. + for (i = 0; i < 46; i++) + gLoadedSaveData.berries[i] = gSaveBlock1.bagPocket_Berries[i]; + + // load mail. + for (i = 0; i < 16; i++) + gLoadedSaveData.mail[i] = gSaveBlock1.mail[i]; +} + +void SavePlayerBag(void) +{ + int i; + + // save player items. + for (i = 0; i < 20; i++) + gSaveBlock1.bagPocket_Items[i] = gLoadedSaveData.items[i]; + + // save player key items. + for (i = 0; i < 20; i++) + gSaveBlock1.bagPocket_KeyItems[i] = gLoadedSaveData.keyItems[i]; + + // save player pokeballs. + for (i = 0; i < 16; i++) + gSaveBlock1.bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i]; + + // save player TMs and HMs. + for (i = 0; i < 64; i++) + gSaveBlock1.bagPocket_TMHM[i] = gLoadedSaveData.TMsHMs[i]; + + // save player berries. + for (i = 0; i < 46; i++) + gSaveBlock1.bagPocket_Berries[i] = gLoadedSaveData.berries[i]; + + // save mail. + for (i = 0; i < 16; i++) + gSaveBlock1.mail[i] = gLoadedSaveData.mail[i]; +} diff --git a/src/engine/m4a_2.c b/src/engine/m4a_2.c new file mode 100644 index 000000000..2d3c65848 --- /dev/null +++ b/src/engine/m4a_2.c @@ -0,0 +1,912 @@ +#include "gba/m4a_internal.h" + +#define BSS_CODE __attribute__((section(".bss.code"))) + +BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0}; + +struct SoundInfo gSoundInfo; +struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES]; +struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES]; +void *gMPlayJumpTable[36]; +struct CgbChannel gCgbChans[4]; +struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2]; +struct PokemonCrySong gPokemonCrySong; +struct MusicPlayerInfo gMPlay_BGM; +struct MusicPlayerInfo gMPlay_SE1; +struct MusicPlayerInfo gMPlay_SE2; +struct MusicPlayerInfo gMPlay_SE3; +u8 gMPlayMemAccArea[0x10]; + +u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust) +{ + u32 val1; + u32 val2; + u32 fineAdjustShifted = fineAdjust << 24; + + if (key > 178) + { + key = 178; + fineAdjustShifted = 255 << 24; + } + + val1 = gScaleTable[key]; + val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4); + + val2 = gScaleTable[key + 1]; + val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4); + + return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted)); +} + +void UnusedDummyFunc() +{ +} + +void MPlayContinue(struct MusicPlayerInfo *mplayInfo) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; + mplayInfo->ident = ID_NUMBER; + } +} + +void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aSoundInit(void) +{ + s32 i; + + CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); + + SoundInit(&gSoundInfo); + MPlayExtender(gCgbChans); + m4aSoundMode(SOUND_MODE_DA_BIT_8 + | SOUND_MODE_FREQ_13379 + | (12 << SOUND_MODE_MASVOL_SHIFT) + | (5 << SOUND_MODE_MAXCHN_SHIFT)); + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + { + struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info; + MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8); + mplayInfo->unk_B = gMPlayTable[i].unk_A; + mplayInfo->memAccArea = gMPlayMemAccArea; + } + + memcpy(&gPokemonCrySong, &gPokemonCrySongTemplate, sizeof(struct PokemonCrySong)); + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + { + struct MusicPlayerInfo *mplayInfo = &gPokemonCryMusicPlayers[i]; + struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; + MPlayOpen(mplayInfo, track, 2); + track->chan = 0; + } +} + +void m4aSoundMain(void) +{ + SoundMain(); +} + +void m4aSongNumStart(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + MPlayStart(mplay->info, song->header); +} + +void m4aSongNumStartOrChange(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader != song->header) + { + MPlayStart(mplay->info, song->header); + } + else + { + if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0 + || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)) + { + MPlayStart(mplay->info, song->header); + } + } +} + +void m4aSongNumStartOrContinue(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader != song->header) + MPlayStart(mplay->info, song->header); + else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0) + MPlayStart(mplay->info, song->header); + else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE) + MPlayContinue(mplay->info); +} + +void m4aSongNumStop(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader == song->header) + m4aMPlayStop(mplay->info); +} + +void m4aSongNumContinue(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader == song->header) + MPlayContinue(mplay->info); +} + +void m4aMPlayAllStop(void) +{ + s32 i; + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + m4aMPlayStop(gMPlayTable[i].info); + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + m4aMPlayStop(&gPokemonCryMusicPlayers[i]); +} + +void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo) +{ + MPlayContinue(mplayInfo); +} + +void m4aMPlayAllContinue(void) +{ + s32 i; + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + MPlayContinue(gMPlayTable[i].info); + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + MPlayContinue(&gPokemonCryMusicPlayers[i]); +} + +void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + MPlayFadeOut(mplayInfo, speed); +} + +void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN; + mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo) +{ + s32 trackCount = mplayInfo->trackCount; + struct MusicPlayerTrack *track = mplayInfo->tracks; + + while (trackCount > 0) + { + if (track->flags & MPT_FLG_EXIST) + { + if (track->flags & MPT_FLG_START) + { + Clear64byte(track); + track->flags = MPT_FLG_EXIST; + track->bendRange = 2; + track->volX = 64; + track->lfoSpeed = 22; + track->tone.type = 1; + } + } + + trackCount--; + track++; + } +} + +void MPlayExtender(struct CgbChannel *cgbChans) +{ + struct SoundInfo *soundInfo; + u32 ident; + + REG_SOUNDCNT_X = SOUND_MASTER_ENABLE + | SOUND_4_ON + | SOUND_3_ON + | SOUND_2_ON + | SOUND_1_ON; + REG_SOUNDCNT_L = 0; // set master volume to zero + REG_NR12 = 0x8; + REG_NR22 = 0x8; + REG_NR42 = 0x8; + REG_NR14 = 0x80; + REG_NR24 = 0x80; + REG_NR44 = 0x80; + REG_NR30 = 0; + REG_NR50 = 0x77; + + soundInfo = SOUND_INFO_PTR; + + ident = soundInfo->ident; + + if (ident != ID_NUMBER) + return; + + soundInfo->ident++; + + gMPlayJumpTable[8] = ply_memacc; + gMPlayJumpTable[17] = ply_lfos; + gMPlayJumpTable[19] = ply_mod; + gMPlayJumpTable[28] = ply_xcmd; + gMPlayJumpTable[29] = ply_endtie; + gMPlayJumpTable[30] = SampleFreqSet; + gMPlayJumpTable[31] = TrackStop; + gMPlayJumpTable[32] = FadeOutBody; + gMPlayJumpTable[33] = TrkVolPitSet; + + soundInfo->cgbChans = (struct CgbChannel *)cgbChans; + soundInfo->CgbSound = CgbSound; + soundInfo->CgbOscOff = CgbOscOff; + soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq; + soundInfo->maxLines = MAX_LINES; + + CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4); + + cgbChans[0].ty = 1; + cgbChans[0].panMask = 0x11; + cgbChans[1].ty = 2; + cgbChans[1].panMask = 0x22; + cgbChans[2].ty = 3; + cgbChans[2].panMask = 0x44; + cgbChans[3].ty = 4; + cgbChans[3].panMask = 0x88; + + soundInfo->ident = ident; +} + +void MusicPlayerJumpTableCopy(void) +{ + asm("swi 0x2A"); +} + +void ClearChain(void *x) +{ + void (*func)(void *) = *(&gMPlayJumpTable[34]); + func(x); +} + +void Clear64byte(void *x) +{ + void (*func)(void *) = *(&gMPlayJumpTable[35]); + func(x); +} + +void SoundInit(struct SoundInfo *soundInfo) +{ + soundInfo->ident = 0; + + if (REG_DMA1CNT & (DMA_REPEAT << 16)) + REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + if (REG_DMA2CNT & (DMA_REPEAT << 16)) + REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + REG_DMA1CNT_H = DMA_32BIT; + REG_DMA2CNT_H = DMA_32BIT; + REG_SOUNDCNT_X = SOUND_MASTER_ENABLE + | SOUND_4_ON + | SOUND_3_ON + | SOUND_2_ON + | SOUND_1_ON; + REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT + | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT + | SOUND_ALL_MIX_FULL; + REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40; + + REG_DMA1SAD = (s32)soundInfo->pcmBuffer; + REG_DMA1DAD = (s32)®_FIFO_A; + REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE; + REG_DMA2DAD = (s32)®_FIFO_B; + + SOUND_INFO_PTR = soundInfo; + CpuFill32(0, soundInfo, sizeof(struct SoundInfo)); + + soundInfo->maxChans = 8; + soundInfo->masterVolume = 15; + soundInfo->plynote = (u32)ply_note; + soundInfo->CgbSound = DummyFunc; + soundInfo->CgbOscOff = (void (*)(u8))DummyFunc; + soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc; + soundInfo->ExtVolPit = (u32)DummyFunc; + + MPlayJumpTableCopy(gMPlayJumpTable); + + soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable; + + SampleFreqSet(SOUND_MODE_FREQ_13379); + + soundInfo->ident = ID_NUMBER; +} + +void SampleFreqSet(u32 freq) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + freq = (freq & 0xF0000) >> 16; + soundInfo->freq = freq; + soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; + soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; + + // LCD refresh rate 59.7275Hz + soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000; + + // CPU frequency 16.78Mhz + soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1; + + // Turn off timer 0. + REG_TM0CNT_H = 0; + + // cycles per LCD fresh 280896 + REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank); + + m4aSoundVSyncOn(); + + while (*(vu8 *)REG_ADDR_VCOUNT == 159) + ; + + while (*(vu8 *)REG_ADDR_VCOUNT != 159) + ; + + REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK; +} + +void m4aSoundMode(u32 mode) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + u32 temp; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL); + + if (temp) + soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL; + + temp = mode & SOUND_MODE_MAXCHN; + + if (temp) + { + struct SoundChannel *chan; + + soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; + + temp = MAX_DIRECTSOUND_CHANNELS; + chan = &soundInfo->chans[0]; + + while (temp != 0) + { + chan->status = 0; + temp--; + chan++; + } + } + + temp = mode & SOUND_MODE_MASVOL; + + if (temp) + soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT; + + temp = mode & SOUND_MODE_DA_BIT; + + if (temp) + { + temp = (temp & 0x300000) >> 14; + REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp; + } + + temp = mode & SOUND_MODE_FREQ; + + if (temp) + { + m4aSoundVSyncOff(); + SampleFreqSet(temp); + } + + soundInfo->ident = ID_NUMBER; +} + +void SoundClear(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + s32 i; + void *chan; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + i = MAX_DIRECTSOUND_CHANNELS; + chan = &soundInfo->chans[0]; + + while (i > 0) + { + ((struct SoundChannel *)chan)->status = 0; + i--; + chan = (void *)((s32)chan + sizeof(struct SoundChannel)); + } + + chan = soundInfo->cgbChans; + + if (chan) + { + i = 1; + + while (i <= 4) + { + soundInfo->CgbOscOff(i); + ((struct CgbChannel *)chan)->sf = 0; + i++; + chan = (void *)((s32)chan + sizeof(struct CgbChannel)); + } + } + + soundInfo->ident = ID_NUMBER; +} + +void m4aSoundVSyncOff(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) + { + soundInfo->ident += 10; + + if (REG_DMA1CNT & (DMA_REPEAT << 16)) + REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + if (REG_DMA2CNT & (DMA_REPEAT << 16)) + REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + REG_DMA1CNT_H = DMA_32BIT; + REG_DMA2CNT_H = DMA_32BIT; + + CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer)); + } +} + +void m4aSoundVSyncOn(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + u32 ident = soundInfo->ident; + + if (ident == ID_NUMBER) + return; + + REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; + REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; + + soundInfo->pcmDmaCounter = 0; + soundInfo->ident = ident - 10; +} + +void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount) +{ + struct SoundInfo *soundInfo; + + if (trackCount == 0) + return; + + if (trackCount > MAX_MUSICPLAYER_TRACKS) + trackCount = MAX_MUSICPLAYER_TRACKS; + + soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + Clear64byte(mplayInfo); + + mplayInfo->tracks = tracks; + mplayInfo->trackCount = trackCount; + mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; + + while (trackCount != 0) + { + tracks->flags = 0; + trackCount--; + tracks++; + } + + if (soundInfo->func != 0) + { + mplayInfo->func = soundInfo->func; + mplayInfo->intp = soundInfo->intp; + soundInfo->func = 0; + } + + soundInfo->intp = (u32)mplayInfo; + soundInfo->func = (u32)MPlayMain; + soundInfo->ident = ID_NUMBER; + mplayInfo->ident = ID_NUMBER; +} + +void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader) +{ + s32 i; + u8 unk_B; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + unk_B = mplayInfo->unk_B; + + if (!unk_B + || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START)) + && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0 + || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE))) + || (mplayInfo->priority <= songHeader->priority)) + { + mplayInfo->ident++; + mplayInfo->status = 0; + mplayInfo->songHeader = songHeader; + mplayInfo->tone = songHeader->tone; + mplayInfo->priority = songHeader->priority; + mplayInfo->clock = 0; + mplayInfo->tempoD = 150; + mplayInfo->tempoI = 150; + mplayInfo->tempoU = 0x100; + mplayInfo->tempoC = 0; + mplayInfo->fadeOI = 0; + + i = 0; + track = mplayInfo->tracks; + + while (i < songHeader->trackCount && i < mplayInfo->trackCount) + { + TrackStop(mplayInfo, track); + track->flags = MPT_FLG_EXIST | MPT_FLG_START; + track->chan = 0; + track->cmdPtr = songHeader->part[i]; + i++; + track++; + } + + while (i < mplayInfo->trackCount) + { + TrackStop(mplayInfo, track); + track->flags = 0; + i++; + track++; + } + + if (songHeader->reverb & 0x80) + m4aSoundMode(songHeader->reverb); + + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo) +{ + s32 i; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + TrackStop(mplayInfo, track); + i--; + track++; + } + + mplayInfo->ident = ID_NUMBER; +} + +void FadeOutBody(struct MusicPlayerInfo *mplayInfo) +{ + s32 i; + struct MusicPlayerTrack *track; + u16 fadeOI = mplayInfo->fadeOI; + register u32 temp asm("r3"); + register u16 mask asm("r2"); + + if (fadeOI == 0) + return; + + mplayInfo->fadeOC--; + + temp = 0xFFFF; + mask = temp; + + if (mplayInfo->fadeOC != 0) + return; + + mplayInfo->fadeOC = fadeOI; + + if (mplayInfo->fadeOV & FADE_IN) + { + mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT); + + if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT)) + { + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); + mplayInfo->fadeOI = 0; + } + } + else + { + mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT); + + if ((s16)(mplayInfo->fadeOV & mask) <= 0) + { + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + register u32 fadeOV asm("r7"); + u32 val; + + TrackStop(mplayInfo, track); + + val = TEMPORARY_FADE; + fadeOV = mplayInfo->fadeOV; + val &= fadeOV; + + if (!val) + track->flags = 0; + + i--; + track++; + } + + if (mplayInfo->fadeOV & TEMPORARY_FADE) + mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; + else + mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; + + mplayInfo->fadeOI = 0; + return; + } + } + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + if (track->flags & MPT_FLG_EXIST) + { + track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT); + track->flags |= MPT_FLG_VOLCHG; + } + + i--; + track++; + } +} + +void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + if (track->flags & MPT_FLG_VOLSET) + { + s32 x; + s32 y; + + x = (u32)(track->vol * track->volX) >> 5; + + if (track->modT == 1) + x = (u32)(x * (track->modM + 128)) >> 7; + + y = 2 * track->pan + track->panX; + + if (track->modT == 2) + y += track->modM; + + if (y < -128) + y = -128; + else if (y > 127) + y = 127; + + track->volMR = (u32)((y + 128) * x) >> 8; + track->volML = (u32)((127 - y) * x) >> 8; + } + + if (track->flags & MPT_FLG_PITSET) + { + s32 bend = track->bend * track->bendRange; + register s32 x asm("r1") = track->tune; + x += bend; + x *= 4; + x += (track->keyShift << 8); + x += (track->keyShiftX << 8); + x += track->pitX; + + if (track->modT == 0) + x += 16 * track->modM; + + track->keyM = x >> 8; + track->pitM = x; + } + + track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET); +} + +u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) +{ + if (chanNum == 4) + { + if (key <= 20) + { + key = 0; + } + else + { + key -= 21; + if (key > 59) + key = 59; + } + + return gNoiseTable[key]; + } + else + { + s32 val1; + s32 val2; + + if (key <= 35) + { + fineAdjust = 0; + key = 0; + } + else + { + key -= 36; + if (key > 130) + { + key = 130; + fineAdjust = 255; + } + } + + val1 = gCgbScaleTable[key]; + val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4); + + val2 = gCgbScaleTable[key + 1]; + val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4); + + return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048; + } +} + +void CgbOscOff(u8 chanNum) +{ + switch (chanNum) + { + case 1: + REG_NR12 = 8; + REG_NR14 = 0x80; + break; + case 2: + REG_NR22 = 8; + REG_NR24 = 0x80; + break; + case 3: + REG_NR30 = 0; + break; + default: + REG_NR42 = 8; + REG_NR44 = 0x80; + } +} + +static inline int CgbPan(struct CgbChannel *chan) +{ + u32 rightVolume = chan->rightVolume; + u32 leftVolume = chan->leftVolume; + + if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) + { + if (rightVolume / 2 >= leftVolume) + { + chan->pan = 0x0F; + return 1; + } + } + else + { + if (leftVolume / 2 >= rightVolume) + { + chan->pan = 0xF0; + return 1; + } + } + + return 0; +} + +void CgbModVol(struct CgbChannel *chan) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if ((soundInfo->mode & 1) || !CgbPan(chan)) + { + chan->pan = 0xFF; + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + } + else + { + // Force chan->rightVolume and chan->leftVolume to be read from memory again, + // even though there is no reason to do so. + // The command line option "-fno-gcse" achieves the same result as this. + asm("" : : : "memory"); + + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + if (chan->eg > 15) + chan->eg = 15; + } + + chan->sg = (chan->eg * chan->su + 15) >> 4; + chan->pan &= chan->panMask; +} diff --git a/src/engine/m4a_4.c b/src/engine/m4a_4.c new file mode 100644 index 000000000..99195ec00 --- /dev/null +++ b/src/engine/m4a_4.c @@ -0,0 +1,545 @@ +#include "gba/m4a_internal.h" + +void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->tempoU = tempo; + mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->volX = volume / 4; + track->flags |= MPT_FLG_VOLCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 pitch) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->keyShiftX = (s16)pitch >> 8; + track->pitX = pitch; + track->flags |= MPT_FLG_PITCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->panX = pan; + track->flags |= MPT_FLG_VOLCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void ClearModM(struct MusicPlayerTrack *track) +{ + track->lfoSpeedC = 0; + track->modM = 0; + + if (track->modT == 0) + track->flags |= MPT_FLG_PITCHG; + else + track->flags |= MPT_FLG_VOLCHG; +} + +void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->mod = modDepth; + + if (!track->mod) + ClearModM(track); + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->lfoSpeed = lfoSpeed; + + if (!track->lfoSpeed) + ClearModM(track); + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +#define MEMACC_COND_JUMP(cond) \ +if (cond) \ + goto cond_true; \ +else \ + goto cond_false; \ + +void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 op; + u8 *addr; + u8 data; + + op = *track->cmdPtr; + track->cmdPtr++; + + addr = mplayInfo->memAccArea + *track->cmdPtr; + track->cmdPtr++; + + data = *track->cmdPtr; + track->cmdPtr++; + + switch (op) + { + case 0: + *addr = data; + return; + case 1: + *addr += data; + return; + case 2: + *addr -= data; + return; + case 3: + *addr = mplayInfo->memAccArea[data]; + return; + case 4: + *addr += mplayInfo->memAccArea[data]; + return; + case 5: + *addr -= mplayInfo->memAccArea[data]; + return; + case 6: + MEMACC_COND_JUMP(*addr == data) + return; + case 7: + MEMACC_COND_JUMP(*addr != data) + return; + case 8: + MEMACC_COND_JUMP(*addr > data) + return; + case 9: + MEMACC_COND_JUMP(*addr >= data) + return; + case 10: + MEMACC_COND_JUMP(*addr <= data) + return; + case 11: + MEMACC_COND_JUMP(*addr < data) + return; + case 12: + MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data]) + return; + case 13: + MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data]) + return; + case 14: + MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data]) + return; + case 15: + MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data]) + return; + case 16: + MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data]) + return; + case 17: + MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data]) + return; + default: + return; + } + +cond_true: + { + void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]); + func(mplayInfo, track); + return; + } + +cond_false: + track->cmdPtr += 4; +} + +void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 n = *track->cmdPtr; + track->cmdPtr++; + + gXcmdTable[n](mplayInfo, track); +} + +void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]); + func(mplayInfo, track); +} + +#define READ_XCMD_BYTE(var, n) \ +{ \ + u32 byte = track->cmdPtr[(n)]; \ + byte <<= n * 8; \ + (var) &= ~(0xFF << (n * 8)); \ + (var) |= byte; \ +} + +void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 wav; + + READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable + READ_XCMD_BYTE(wav, 1) + READ_XCMD_BYTE(wav, 2) + READ_XCMD_BYTE(wav, 3) + + track->tone.wav = (struct WaveData *)wav; + track->cmdPtr += 4; +} + +void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.type = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.attack = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.decay = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.sustain = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.release = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->echoVolume = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->echoLength = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.length = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.pan_sweep = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 unk; + + READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable + READ_XCMD_BYTE(unk, 1) + + if (track->unk_3A < (u16)unk) + { + track->unk_3A++; + track->cmdPtr -= 2; + track->wait = 1; + } + else + { + track->unk_3A = 0; + track->cmdPtr += 2; + } +} + +void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 unk; + + READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable + READ_XCMD_BYTE(unk, 1) + READ_XCMD_BYTE(unk, 2) + READ_XCMD_BYTE(unk, 3) + + track->unk_3C = unk; + track->cmdPtr += 4; +} + +void DummyFunc(void) +{ +} + +struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone) +{ + u32 maxClock = 0; + s32 maxClockIndex = 0; + s32 i; + struct MusicPlayerInfo *mplayInfo; + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + { + struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; + + if (!track->flags && (!track->chan || track->chan->track != track)) + goto start_song; + + if (maxClock < gPokemonCryMusicPlayers[i].clock) + { + maxClock = gPokemonCryMusicPlayers[i].clock; + maxClockIndex = i; + } + } + + i = maxClockIndex; + +start_song: + mplayInfo = &gPokemonCryMusicPlayers[i]; + mplayInfo->ident++; + +#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong)) +#define CRY_OFS(field) offsetof(struct PokemonCrySong, field) + + memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong)); + + *(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone; + *(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0); + *(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1); + *(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont); + +#undef CRY_OFS +#undef CRY + + mplayInfo->ident = ID_NUMBER; + + MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i])); + + return mplayInfo; +} + +void SetPokemonCryVolume(u8 val) +{ + gPokemonCrySong.volumeValue = val & 0x7F; +} + +void SetPokemonCryPanpot(s8 val) +{ + gPokemonCrySong.panValue = (val + C_V) & 0x7F; +} + +void SetPokemonCryPitch(s16 val) +{ + s16 b = val + 0x80; + u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue; + gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F; + gPokemonCrySong.tuneValue = (b >> 1) & 0x7F; + gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F; +} + +void SetPokemonCryLength(u16 val) +{ + gPokemonCrySong.unkCmd0CParam = val; +} + +void SetPokemonCryRelease(u8 val) +{ + gPokemonCrySong.releaseValue = val; +} + +void SetPokemonCryProgress(u32 val) +{ + gPokemonCrySong.unkCmd0DParam = val; +} + +int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo) +{ + struct MusicPlayerTrack *track = mplayInfo->tracks; + + if (track->chan && track->chan->track == track) + return 1; + else + return 0; +} + +void SetPokemonCryChorus(s8 val) +{ + if (val) + { + gPokemonCrySong.trackCount = 2; + gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F; + } + else + { + gPokemonCrySong.trackCount = 1; + } +} + +void SetPokemonCryStereo(u32 val) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if (val) + { + REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT + | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT + | SOUND_ALL_MIX_FULL; + soundInfo->mode &= ~1; + } + else + { + REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT + | SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT + | SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL; + soundInfo->mode |= 1; + } +} + +void SetPokemonCryPriority(u8 val) +{ + gPokemonCrySong.priority = val; +} diff --git a/src/engine/m4a_tables.c b/src/engine/m4a_tables.c new file mode 100644 index 000000000..91f00a31d --- /dev/null +++ b/src/engine/m4a_tables.c @@ -0,0 +1,307 @@ +#include "gba/m4a_internal.h" + +// Some of these functions have different signatures, so we need to make this +// an array of void pointers or a struct. It's simpler to just make it an array +// for now. +void * const gMPlayJumpTableTemplate[] = +{ + ply_fine, + ply_goto, + ply_patt, + ply_pend, + ply_rept, + ply_fine, + ply_fine, + ply_fine, + ply_fine, + ply_prio, + ply_tempo, + ply_keysh, + ply_voice, + ply_vol, + ply_pan, + ply_bend, + ply_bendr, + ply_lfos, + ply_lfodl, + ply_mod, + ply_modt, + ply_fine, + ply_fine, + ply_tune, + ply_fine, + ply_fine, + ply_fine, + ply_port, + ply_fine, + ply_endtie, + SampleFreqSet, + TrackStop, + FadeOutBody, + TrkVolPitSet, + RealClearChain, + SoundMainBTM, +}; + +// This is a table of deltas between sample values in compressed PCM data. +const s8 gDeltaEncodingTable[] = +{ + 0, + 1, + 4, + 9, + 16, + 25, + 36, + 49, + -64, + -49, + -36, + -25, + -16, + -9, + -4, + -1, +}; + +const u8 gScaleTable[] = +{ + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, +}; + +const u32 gFreqTable[] = +{ + 2147483648u, + 2275179671u, + 2410468894u, + 2553802834u, + 2705659852u, + 2866546760u, + 3037000500u, + 3217589947u, + 3408917802u, + 3611622603u, + 3826380858u, + 4053909305u, +}; + +const u16 gPcmSamplesPerVBlankTable[] = +{ + 96, + 132, + 176, + 224, + 264, + 304, + 352, + 448, + 528, + 608, + 672, + 704, +}; + +const u8 gCgbScaleTable[] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, +}; + +const s16 gCgbFreqTable[] = +{ + -2004, + -1891, + -1785, + -1685, + -1591, + -1501, + -1417, + -1337, + -1262, + -1192, + -1125, + -1062, +}; + +const u8 gNoiseTable[] = +{ + 0xD7, 0xD6, 0xD5, 0xD4, + 0xC7, 0xC6, 0xC5, 0xC4, + 0xB7, 0xB6, 0xB5, 0xB4, + 0xA7, 0xA6, 0xA5, 0xA4, + 0x97, 0x96, 0x95, 0x94, + 0x87, 0x86, 0x85, 0x84, + 0x77, 0x76, 0x75, 0x74, + 0x67, 0x66, 0x65, 0x64, + 0x57, 0x56, 0x55, 0x54, + 0x47, 0x46, 0x45, 0x44, + 0x37, 0x36, 0x35, 0x34, + 0x27, 0x26, 0x25, 0x24, + 0x17, 0x16, 0x15, 0x14, + 0x07, 0x06, 0x05, 0x04, + 0x03, 0x02, 0x01, 0x00, +}; + +const u8 gCgb3Vol[] = +{ + 0x00, 0x00, + 0x60, 0x60, 0x60, 0x60, + 0x40, 0x40, 0x40, 0x40, + 0x80, 0x80, 0x80, 0x80, + 0x20, 0x20, +}; + +const u8 gClockTable[] = +{ + 0x00, + 0x01, + 0x02, + 0x03, + 0x04, + 0x05, + 0x06, + 0x07, + 0x08, + 0x09, + 0x0A, + 0x0B, + 0x0C, + 0x0D, + 0x0E, + 0x0F, + 0x10, + 0x11, + 0x12, + 0x13, + 0x14, + 0x15, + 0x16, + 0x17, + 0x18, + 0x1C, + 0x1E, + 0x20, + 0x24, + 0x28, + 0x2A, + 0x2C, + 0x30, + 0x34, + 0x36, + 0x38, + 0x3C, + 0x40, + 0x42, + 0x44, + 0x48, + 0x4C, + 0x4E, + 0x50, + 0x54, + 0x58, + 0x5A, + 0x5C, + 0x60, +}; + +#define FINE 0xb1 +#define GOTO 0xb2 +#define PATT 0xb3 +#define PEND 0xb4 +#define REPT 0xb5 +#define MEMACC 0xb9 +#define PRIO 0xba +#define TEMPO 0xbb +#define KEYSH 0xbc +#define VOICE 0xbd +#define VOL 0xbe +#define PAN 0xbf +#define BEND 0xc0 +#define BENDR 0xc1 +#define LFOS 0xc2 +#define LFODL 0xc3 +#define MOD 0xc4 +#define MODT 0xc5 +#define TUNE 0xc8 + +#define XCMD 0xcd +#define xRELE 0x07 +#define xIECV 0x08 +#define xIECL 0x09 + +#define EOT 0xce +#define TIE 0xcf + +const struct PokemonCrySong gPokemonCrySongTemplate = +{ + 1, // track count + 0, // block count + 255, // priority + 0, // reverb + (struct ToneData *)&voicegroup_pokemon_cry, + NULL, + NULL, + 0, + TUNE, // part 0 + C_V, // TUNE value + GOTO, + 0, // GOTO target address + TUNE, // part 1 + C_V + 16, // TUNE value + {VOICE, 0}, // part 0 jumps here with GOTO + VOL, + 127, // volume + {XCMD, 0x0D}, + 0, // unk value + {XCMD, xRELE}, + 0, // release + PAN, + C_V, // PAN value + TIE, + 60, // TIE key (default is Cn3) + 127, // TIE velocity + {XCMD, 0x0C}, + 60, // unk value + {EOT, FINE} // end +}; + +const XcmdFunc gXcmdTable[] = +{ + ply_xxx, + ply_xwave, + ply_xtype, + ply_xxx, + ply_xatta, + ply_xdeca, + ply_xsust, + ply_xrele, + ply_xiecv, + ply_xiecl, + ply_xleng, + ply_xswee, + ply_xcmd_0C, + ply_xcmd_0D, +}; diff --git a/src/engine/main.c b/src/engine/main.c new file mode 100644 index 000000000..afaa0e77a --- /dev/null +++ b/src/engine/main.c @@ -0,0 +1,363 @@ +#include "global.h" +#include "gba/flash_internal.h" +#include "gba/m4a_internal.h" +#include "main.h" +#include "intro.h" +#include "link.h" +#include "load_save.h" +#include "m4a.h" +#include "play_time.h" +#include "rng.h" +#include "rom3.h" +#include "rom4.h" +#include "rtc.h" +#include "siirtc.h" +#include "sound.h" +#include "unknown_task.h" + +extern struct SoundInfo gSoundInfo; +extern u32 IntrMain[]; + +static void VBlankIntr(void); +static void HBlankIntr(void); +static void VCountIntr(void); +static void SerialIntr(void); +static void IntrDummy(void); + +#ifdef SAPPHIRE +#define GAME_VERSION VERSION_SAPPHIRE +#else +#define GAME_VERSION VERSION_RUBY +#endif + +const u8 gGameVersion = GAME_VERSION; + +const u8 gGameLanguage = GAME_LANGUAGE; + +#if defined(ENGLISH) +const char BuildDateTime[] = "2002 10 15 20:34"; +#elif defined(GERMAN) +const char BuildDateTime[] = "$Name: debug-Euro-2003-05-09-A $"; +#endif + +const IntrFunc gIntrTableTemplate[] = +{ + SerialIntr, // Serial interrupt + Timer3Intr, // Timer 3 interrupt + HBlankIntr, // H-blank interrupt + VBlankIntr, // V-blank interrupt + VCountIntr, // V-count interrupt + IntrDummy, // Timer 0 interrupt + IntrDummy, // Timer 1 interrupt + IntrDummy, // Timer 2 interrupt + IntrDummy, // DMA 0 interrupt + IntrDummy, // DMA 1 interrupt + IntrDummy, // DMA 2 interrupt + IntrDummy, // DMA 3 interrupt + IntrDummy, // Key interrupt + IntrDummy, // Game Pak interrupt +}; + +#define INTR_COUNT ((int)(sizeof(gIntrTableTemplate)/sizeof(IntrFunc))) + +u16 gKeyRepeatStartDelay; +bool8 gLinkTransferringData; +struct Main gMain; +u16 gKeyRepeatContinueDelay; +u8 gSoftResetDisabled; +IntrFunc gIntrTable[INTR_COUNT]; +bool8 gLinkVSyncDisabled; +u32 IntrMain_Buffer[0x200]; +u8 gPcmDmaCounter; + +EWRAM_DATA void (**gFlashTimerIntrFunc)(void) = NULL; + +static void UpdateLinkAndCallCallbacks(void); +static void InitMainCallbacks(void); +static void CallCallbacks(void); +static void SeedRngWithRtc(void); +static void ReadKeys(void); +static void InitIntrHandlers(void); +static void WaitForVBlank(void); + +#define B_START_SELECT (B_BUTTON | START_BUTTON | SELECT_BUTTON) + +void AgbMain() +{ + RegisterRamReset(RESET_ALL); + REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3; + InitKeys(); + InitIntrHandlers(); + m4aSoundInit(); + RtcInit(); + CheckForFlashMemory(); + InitMainCallbacks(); + InitMapMusic(); + SeedRngWithRtc(); + + gSoftResetDisabled = FALSE; + + if (gFlashMemoryPresent != TRUE) + SetMainCallback2(NULL); + + gLinkTransferringData = FALSE; + + for (;;) + { + ReadKeys(); + + if (gSoftResetDisabled == FALSE + && (gMain.heldKeysRaw & A_BUTTON) + && (gMain.heldKeysRaw & B_START_SELECT) == B_START_SELECT) + DoSoftReset(); + + if (gLink.sendQueue.count > 1 && sub_8055910() == 1) + { + gLinkTransferringData = TRUE; + UpdateLinkAndCallCallbacks(); + gLinkTransferringData = FALSE; + } + else + { + gLinkTransferringData = FALSE; + UpdateLinkAndCallCallbacks(); + + if (gLink.recvQueue.count > 1) + { + if (sub_80558AC() == 1) + { + gMain.newKeys = 0; + gLinkTransferringData = TRUE; + UpdateLinkAndCallCallbacks(); + gLinkTransferringData = FALSE; + } + } + } + + PlayTimeCounter_Update(); + MapMusicMain(); + WaitForVBlank(); + } +} + +static void UpdateLinkAndCallCallbacks(void) +{ + gLinkStatus = LinkMain1(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds); + LinkMain2(&gMain.heldKeys); + if (!(gLinkStatus & LINK_STAT_RECEIVED_NOTHING) || sub_8055940() != 1) + CallCallbacks(); +} + +static void InitMainCallbacks(void) +{ + gMain.vblankCounter1 = 0; + gMain.vblankCounter2 = 0; + gMain.callback1 = NULL; + SetMainCallback2(CB2_InitCopyrightScreenAfterBootup); +} + +static void CallCallbacks(void) +{ + if (gMain.callback1) + gMain.callback1(); + + if (gMain.callback2) + gMain.callback2(); +} + +void SetMainCallback2(MainCallback callback) +{ + gMain.callback2 = callback; + gMain.state = 0; +} + +static void SeedRngWithRtc(void) +{ + u32 seed = RtcGetMinuteCount(); + seed = (seed >> 16) ^ (seed & 0xFFFF); + SeedRng(seed); +} + +void InitKeys(void) +{ + gKeyRepeatContinueDelay = 5; + gKeyRepeatStartDelay = 40; + + gMain.heldKeys = 0; + gMain.newKeys = 0; + gMain.newAndRepeatedKeys = 0; + gMain.heldKeysRaw = 0; + gMain.newKeysRaw = 0; +} + +static void ReadKeys(void) +{ + u16 keyInput = REG_KEYINPUT ^ KEYS_MASK; + gMain.newKeysRaw = keyInput & ~gMain.heldKeysRaw; + gMain.newKeys = gMain.newKeysRaw; + gMain.newAndRepeatedKeys = gMain.newKeysRaw; + + // BUG: Key repeat won't work when pressing L using L=A button mode + // because it compares the raw key input with the remapped held keys. + // Note that newAndRepeatedKeys is never remapped either. + + if (keyInput != 0 && gMain.heldKeys == keyInput) + { + gMain.keyRepeatCounter--; + + if (gMain.keyRepeatCounter == 0) + { + gMain.newAndRepeatedKeys = keyInput; + gMain.keyRepeatCounter = gKeyRepeatContinueDelay; + } + } + else + { + // If there is no input or the input has changed, reset the counter. + gMain.keyRepeatCounter = gKeyRepeatStartDelay; + } + + gMain.heldKeysRaw = keyInput; + gMain.heldKeys = gMain.heldKeysRaw; + + // Remap L to A if the L=A option is enabled. + if (gSaveBlock2.optionsButtonMode == 2) + { + if (gMain.newKeys & L_BUTTON) + gMain.newKeys |= A_BUTTON; + + if (gMain.heldKeys & L_BUTTON) + gMain.heldKeys |= A_BUTTON; + } + + if (gMain.newKeys & gMain.watchedKeysMask) + gMain.watchedKeysPressed = TRUE; +} + +static void InitIntrHandlers(void) +{ + int i; + + for (i = 0; i < INTR_COUNT; i++) + gIntrTable[i] = gIntrTableTemplate[i]; + + DmaCopy32(3, IntrMain, IntrMain_Buffer, sizeof(IntrMain_Buffer)); + + INTR_VECTOR = IntrMain_Buffer; + + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + SetSerialCallback(NULL); + + REG_IME = 1; + REG_IE = INTR_FLAG_VBLANK; + REG_DISPSTAT = DISPSTAT_VBLANK_INTR; + REG_IE |= INTR_FLAG_VBLANK; +} + +void SetVBlankCallback(IntrCallback callback) +{ + gMain.vblankCallback = callback; +} + +void SetHBlankCallback(IntrCallback callback) +{ + gMain.hblankCallback = callback; +} + +void SetVCountCallback(IntrCallback callback) +{ + gMain.vcountCallback = callback; +} + +void SetSerialCallback(IntrCallback callback) +{ + gMain.serialCallback = callback; +} + +static void VBlankIntr(void) +{ + u16 savedIme; + + if (!gLinkVSyncDisabled) + LinkVSync(); + + savedIme = REG_IME; + REG_IME = 0; + m4aSoundVSync(); + REG_IME = savedIme; + + gMain.vblankCounter1++; + + if (gMain.vblankCallback) + gMain.vblankCallback(); + + gMain.vblankCounter2++; + + gPcmDmaCounter = gSoundInfo.pcmDmaCounter; + + m4aSoundMain(); + sub_800C35C(); + Random(); + + INTR_CHECK |= INTR_FLAG_VBLANK; + gMain.intrCheck |= INTR_FLAG_VBLANK; +} + +void InitFlashTimer(void) +{ + SetFlashTimerIntr(2, gFlashTimerIntrFunc); +} + +static void HBlankIntr(void) +{ + if (gMain.hblankCallback) + gMain.hblankCallback(); + + INTR_CHECK |= INTR_FLAG_HBLANK; + gMain.intrCheck |= INTR_FLAG_HBLANK; +} + +static void VCountIntr(void) +{ + if (gMain.vcountCallback) + gMain.vcountCallback(); + + INTR_CHECK |= INTR_FLAG_VCOUNT; + gMain.intrCheck |= INTR_FLAG_VCOUNT; +} + +static void SerialIntr(void) +{ + if (gMain.serialCallback) + gMain.serialCallback(); + + INTR_CHECK |= INTR_FLAG_SERIAL; + gMain.intrCheck |= INTR_FLAG_SERIAL; +} + +static void IntrDummy(void) +{} + +static void WaitForVBlank(void) +{ + gMain.intrCheck &= ~INTR_FLAG_VBLANK; + VBlankIntrWait(); +} + +void DoSoftReset(void) +{ + REG_IME = 0; + m4aSoundVSyncOff(); + remove_some_task(); + DmaStop(1); + DmaStop(2); + DmaStop(3); + SiiRtcProtect(); + SoftReset(RESET_ALL); +} + +void ClearPokemonCrySongs(void) +{ + CpuFill16(0, gPokemonCrySongs, MAX_POKEMON_CRIES * sizeof(struct PokemonCrySong)); +} diff --git a/src/engine/main_menu.c b/src/engine/main_menu.c new file mode 100644 index 000000000..09fd06d9e --- /dev/null +++ b/src/engine/main_menu.c @@ -0,0 +1,1639 @@ +#include "global.h" +#include "main_menu.h" +#include "data2.h" +#include "decompress.h" +#include "event_data.h" +#include "field_effect.h" +#include "menu.h" +#include "mystery_event_menu.h" +#include "naming_screen.h" +#include "option_menu.h" +#include "palette.h" +#include "pokeball.h" +#include "rom4.h" +#include "rtc.h" +#include "save_menu_util.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "title_screen.h" +#include "unknown_task.h" + +#define BirchSpeechUpdateWindowText() ((u8)MenuUpdateWindowText_OverrideLineLength(24)) + +extern struct PaletteFadeControl gPaletteFade; + +extern u16 gSaveFileStatus; + +extern u16 gMainMenuPalette[]; + +extern const u8 gBirchSpeech_Welcome[]; +extern const u8 gBirchSpeech_ThisIsPokemon[]; +extern const u8 gBirchSpeech_WorldInhabitedByPokemon[]; +extern const u8 gBirchSpeech_AndYouAre[]; +extern const u8 gBirchSpeech_AreYouBoyOrGirl[]; +extern const u8 gBirchSpeech_WhatsYourName[]; +extern u8 gBirchSpeech_SoItsPlayer[]; +extern u8 gBirchSpeech_AhOkayYouArePlayer[]; +extern u8 gBirchSpeech_AreYouReady[]; + +extern struct SpriteTemplate gUnknown_02024E8C; +extern u16 gUnknown_081E795C[]; +extern const struct MenuAction gUnknown_081E79B0[]; +extern const struct MenuAction gMalePresetNames[]; +extern const struct MenuAction gFemalePresetNames[]; + +extern const u8 gUnknown_081E764C[]; +extern const u8 gBirchIntroShadowGfx[]; +extern const u8 gUnknown_081E7834[]; +extern const u8 gUnknown_081E796C[]; + +extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E79AC[]; + +extern u8 unk_2000000[]; + +//Task data +enum { + TD_MENULAYOUT, + TD_SELECTEDMENUITEM, +}; + +//Menu layouts +enum { + HAS_NO_SAVED_GAME, //NEW GAME, OPTION + HAS_SAVED_GAME, //CONTINUE, NEW GAME, OPTION + HAS_MYSTERY_GIFT, //CONTINUE, NEW GAME, MYSTERY EVENTS, OPTION +}; + +//Task data +enum { + TD_TRAINER_SPRITE_ID = 2, //Trainer sprite being displayed during gender menu + TD_BGHOFS = 4, //Used to set REG_BG1HOFS and slide the platform around + TD_SUBTASK_DONE, //Set to true if the spawned task has finished + TD_GENDER_SELECTION, + TD_COUNTER, + TD_BIRCH_SPRITE_ID, + TD_AZURILL_SPRITE_ID, + TD_BRENDAN_SPRITE_ID, + TD_MAY_SPRITE_ID +}; + +static void CB2_MainMenu(void); +static void VBlankCB_MainMenu(void); +static void CB2_InitMainMenuFromOptions(void); +static u32 InitMainMenu(bool8 a1); +static void Task_MainMenuCheckSave(u8 taskId); +static void Task_MainMenuWaitForSaveErrorAck(u8 taskId); +static void Task_MainMenuCheckRtc(u8 taskId); +static void Task_MainMenuWaitForRtcErrorAck(u8 taskId); +static void Task_MainMenuDraw(u8 taskId); +static void Task_MainMenuHighlight(u8 taskId); +static bool8 MainMenuProcessKeyInput(u8 taskId); +static void Task_MainMenuProcessKeyInput(u8 taskId); +static void Task_MainMenuPressedA(u8 taskId); +static void Task_MainMenuPressedB(u8 taskId); +static void HighlightCurrentMenuItem(u8 layout, u8 menuItem); +static void PrintMainMenuItem(const u8 *text, u8 left, u8 top); +static void PrintSaveFileInfo(void); +static void PrintPlayerName(void); +static void PrintPlayTime(void); +static void PrintPokedexCount(void); +static void PrintBadgeCount(void); +static void Task_NewGameSpeech1(u8 taskId); +static void Task_NewGameSpeech2(u8 taskId); +static void Task_NewGameSpeech3(u8 taskId); +static void Task_NewGameSpeech4(u8 taskId); +static void Task_NewGameSpeech5(u8 taskId); +static void Task_NewGameSpeech6(u8 taskId); +static void Task_NewGameSpeech7(u8 taskId); +static void Task_NewGameSpeech8(u8 taskId); +static void Task_NewGameSpeech9(u8 taskId); +static void Task_NewGameSpeech10(u8 taskId); +static void Task_NewGameSpeech11(u8 taskId); +static void Task_NewGameSpeech12(u8 taskId); +static void Task_NewGameSpeech13(u8 taskId); +static void Task_NewGameSpeech14(u8 taskId); +static void Task_NewGameSpeech15(u8 taskId); +static void Task_NewGameSpeech16(u8 taskId); +static void Task_NewGameSpeech17(u8 taskId); +static void Task_NewGameSpeech18(u8 taskId); +static void Task_NewGameSpeech19(u8 taskId); +static void Task_NewGameSpeech20(u8 taskId); +static void Task_NewGameSpeech21(u8 taskId); +static void Task_NewGameSpeech22(u8 taskId); +static void Task_NewGameSpeech23(u8 taskId); +static void Task_NewGameSpeech24(u8 taskId); +static void Task_NewGameSpeech25(u8 taskId); +static void Task_NewGameSpeech26(u8 taskId); +static void Task_NewGameSpeech27(u8 taskId); +static void Task_NewGameSpeech28(u8 taskId); +static void Task_NewGameSpeech29(u8 taskId); +static void Task_NewGameSpeech30(u8 taskId); +static void Task_NewGameSpeech31(u8 taskId); +static void Task_NewGameSpeech32(u8 taskId); +static void Task_NewGameSpeech33(u8 taskId); +static void CB_ContinueNewGameSpeechPart2(); +static void nullsub_34(struct Sprite *sprite); +static void ShrinkPlayerSprite(struct Sprite *sprite); +static u8 CreateAzurillSprite(u8 x, u8 y); +static void AddBirchSpeechObjects(u8 taskId); +static void Task_SpriteFadeOut(u8 taskId); +static void StartSpriteFadeOut(u8 taskId, u8 interval); +static void Task_SpriteFadeIn(u8 taskId); +static void StartSpriteFadeIn(u8 taskId, u8 interval); +static void HandleFloorShadowFadeOut(u8 taskId); +static void StartBackgroundFadeOut(u8 taskId, u8 interval); +static void HandleFloorShadowFadeIn(u8 taskId); +static void StartBackgroundFadeIn(u8 taskId, u8 interval); +static void CreateGenderMenu(u8 left, u8 top); +static s8 GenderMenuProcessInput(void); +static void CreateNameMenu(u8 left, u8 top); +static s8 NameMenuProcessInput(void); +static void SetPresetPlayerName(u8 index); + +static void CB2_MainMenu(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void VBlankCB_MainMenu(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_InitMainMenu(void) +{ + InitMainMenu(FALSE); +} + +static void CB2_InitMainMenuFromOptions(void) +{ + InitMainMenu(TRUE); +} + +u32 InitMainMenu(u8 a1) +{ + u16 savedIme; + u8 taskId; + + SetVBlankCallback(NULL); + + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); + + ResetPaletteFade(); + LoadPalette(gMainMenuPalette, 0, 32); + remove_some_task(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E6CE4); + + if (a1) + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0x0000); // fade to black + else + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xFFFF); // fade to white + + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + + SetVBlankCallback(VBlankCB_MainMenu); + SetMainCallback2(CB2_MainMenu); + + REG_DISPCNT = DISPCNT_MODE_0 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG0_ON + | DISPCNT_OBJ_ON + | DISPCNT_WIN0_ON; + + taskId = CreateTask(Task_MainMenuCheckSave, 0); + gTasks[taskId].data[TD_SELECTEDMENUITEM] = 0; + + return 0; +} + +void Task_MainMenuCheckSave(u8 taskId) +{ + if (gPaletteFade.active) + return; + + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0x1111; + REG_WINOUT = 49; + REG_BLDCNT = 241; + REG_BLDALPHA = 0; + REG_BLDY = 7; + + switch (gSaveFileStatus) + { + case 1: + if (IsMysteryGiftEnabled() == TRUE) + gTasks[taskId].data[TD_MENULAYOUT] = HAS_MYSTERY_GIFT; + else + gTasks[taskId].data[TD_MENULAYOUT] = HAS_SAVED_GAME; + + gTasks[taskId].func = Task_MainMenuCheckRtc; + break; + case 2: + MenuDrawTextWindow(2, 14, 27, 19); + MenuPrintMessage(gSaveFileDeletedMessage, 3, 15); + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(113, 159); + gTasks[taskId].data[TD_MENULAYOUT] = HAS_NO_SAVED_GAME; + gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; + break; + case 255: + MenuDrawTextWindow(2, 14, 27, 19); + MenuPrintMessage(gSaveFileCorruptMessage, 3, 15); + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(113, 159); + gTasks[taskId].data[TD_MENULAYOUT] = HAS_SAVED_GAME; + gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; + + if (IsMysteryGiftEnabled() == TRUE) + gTasks[taskId].data[TD_MENULAYOUT] = HAS_MYSTERY_GIFT; + else + gTasks[taskId].data[TD_MENULAYOUT] = HAS_SAVED_GAME; + break; + case 0: + default: + gTasks[taskId].data[TD_MENULAYOUT] = HAS_NO_SAVED_GAME; + gTasks[taskId].func = Task_MainMenuCheckRtc; + break; + case 4: + MenuDrawTextWindow(2, 14, 27, 19); + MenuPrintMessage(gBoardNotInstalledMessage, 3, 15); + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(113, 159); + gTasks[taskId].data[TD_MENULAYOUT] = HAS_NO_SAVED_GAME; + gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; + return; + } +} + +void Task_MainMenuWaitForSaveErrorAck(u8 taskId) +{ + if (MenuUpdateWindowText()) + { + if (gMain.newKeys & A_BUTTON) + { + MenuZeroFillWindowRect(2, 14, 27, 19); + gTasks[taskId].func = Task_MainMenuCheckRtc; + } + } +} + +void Task_MainMenuCheckRtc(u8 taskId) +{ + if (!gPaletteFade.active) + { + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0x1111; + REG_WINOUT = 49; + REG_BLDCNT = 241; + REG_BLDALPHA = 0; + REG_BLDY = 7; + + if (!(RtcGetErrorStatus() & RTC_ERR_FLAG_MASK)) + { + gTasks[taskId].func = Task_MainMenuDraw; + } + else + { + MenuDrawTextWindow(2, 14, 27, 19); + MenuPrintMessage(gBatteryDryMessage, 3, 15); + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(113, 159); + gTasks[taskId].func = Task_MainMenuWaitForRtcErrorAck; + } + } +} + +void Task_MainMenuWaitForRtcErrorAck(u8 taskId) +{ + if (MenuUpdateWindowText()) + { + if ( gMain.newKeys & 1 ) + { + MenuZeroFillWindowRect(2, 14, 27, 19); + gTasks[taskId].func = Task_MainMenuDraw; + } + } +} + +void Task_MainMenuDraw(u8 taskId) +{ + u16 palette; + + if (!gPaletteFade.active) + { + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0x1111; + REG_WINOUT = 49; + REG_BLDCNT = 241; + REG_BLDALPHA = 0; + REG_BLDY = 7; + + palette = RGB(0, 0, 0); + LoadPalette(&palette, 254, 2); + + if (gSaveBlock2.playerGender == MALE) + { + palette = RGB(4, 16, 31); + LoadPalette(&palette, 241, 2); + } + else + { + palette = RGB(31, 3, 21); + LoadPalette(&palette, 241, 2); + } + + switch (gTasks[taskId].data[TD_MENULAYOUT]) + { + case HAS_NO_SAVED_GAME: + default: + MenuDrawTextWindow(1, 0, 28, 3); + PrintMainMenuItem(gMainMenuString_NewGame, 2, 1); + MenuDrawTextWindow(1, 4, 28, 7); + PrintMainMenuItem(gMainMenuString_Option, 2, 5); + break; + case HAS_SAVED_GAME: + MenuDrawTextWindow(1, 0, 28, 7); + PrintMainMenuItem(gMainMenuString_Continue, 2, 1); + MenuDrawTextWindow(1, 8, 28, 11); + PrintMainMenuItem(gMainMenuString_NewGame, 2, 9); + MenuDrawTextWindow(1, 12, 28, 15); + PrintMainMenuItem(gMainMenuString_Option, 2, 13); + PrintSaveFileInfo(); + break; + case HAS_MYSTERY_GIFT: + MenuDrawTextWindow(1, 0, 28, 7); + PrintMainMenuItem(gMainMenuString_Continue, 2, 1); + MenuDrawTextWindow(1, 8, 28, 11); + PrintMainMenuItem(gMainMenuString_NewGame, 2, 9); + MenuDrawTextWindow(1, 12, 28, 15); + PrintMainMenuItem(gMainMenuString_MysteryEvents, 2, 13); + MenuDrawTextWindow(1, 16, 28, 19); + PrintMainMenuItem(gMainMenuString_Option, 2, 0x11); + PrintSaveFileInfo(); + break; + } + + gTasks[taskId].func = Task_MainMenuHighlight; + } +} + +void Task_MainMenuHighlight(u8 taskId) +{ + HighlightCurrentMenuItem(gTasks[taskId].data[TD_MENULAYOUT], gTasks[taskId].data[TD_SELECTEDMENUITEM]); + gTasks[taskId].func = Task_MainMenuProcessKeyInput; +} + +bool8 MainMenuProcessKeyInput(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0x0000); + gTasks[taskId].func = Task_MainMenuPressedA; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); + REG_WIN0H = WIN_RANGE(0, 240); + REG_WIN0V = WIN_RANGE(0, 160); + gTasks[taskId].func = Task_MainMenuPressedB; + } + else + { + s32 menuItemCount; + + switch (gTasks[taskId].data[TD_MENULAYOUT]) + { + case HAS_NO_SAVED_GAME: + default: + menuItemCount = 2; + break; + case HAS_SAVED_GAME: + menuItemCount = 3; + break; + case HAS_MYSTERY_GIFT: + menuItemCount = 4; + break; + } + + if (gMain.newKeys & DPAD_UP) + { + if (gTasks[taskId].data[TD_SELECTEDMENUITEM] > 0) + { + gTasks[taskId].data[TD_SELECTEDMENUITEM]--; + return TRUE; + } + } + if (gMain.newKeys & DPAD_DOWN) + { + if (gTasks[taskId].data[TD_SELECTEDMENUITEM] < menuItemCount - 1) + { + gTasks[taskId].data[TD_SELECTEDMENUITEM]++; + return TRUE; + } + } + } + + return FALSE; +} + +void Task_MainMenuProcessKeyInput(u8 taskId) +{ + bool8 currentMenuItemChanged = MainMenuProcessKeyInput(taskId); + if (currentMenuItemChanged) + gTasks[taskId].func = Task_MainMenuHighlight; +} + +void Task_MainMenuPressedA(u8 taskId) +{ + enum + { + NEW_GAME, + CONTINUE, + OPTION, + MYSTERY_EVENTS, + } action; + + if (gPaletteFade.active) + return; + + switch (gTasks[taskId].data[TD_MENULAYOUT]) + { + case HAS_NO_SAVED_GAME: + default: + switch (gTasks[taskId].data[TD_SELECTEDMENUITEM]) + { + case 0: + default: + action = NEW_GAME; + break; + case 1: + action = OPTION; + break; + } + break; + case HAS_SAVED_GAME: + switch (gTasks[taskId].data[TD_SELECTEDMENUITEM]) + { + case 0: + default: + action = CONTINUE; + break; + case 1: + action = NEW_GAME; + break; + case 2: + action = OPTION; + break; + } + break; + case HAS_MYSTERY_GIFT: + switch (gTasks[taskId].data[TD_SELECTEDMENUITEM]) + { + case 0: + default: + action = CONTINUE; + break; + case 1: + action = NEW_GAME; + break; + case 2: + action = MYSTERY_EVENTS; + break; + case 3: + action = OPTION; + break; + } + break; + } + + switch ((int)action) + { + case NEW_GAME: + default: + gPlttBufferUnfaded[0] = 0; + gPlttBufferFaded[0] = 0; + gTasks[taskId].func = Task_NewGameSpeech1; + break; + case CONTINUE: + gPlttBufferUnfaded[0] = 0; + gPlttBufferFaded[0] = 0; + SetMainCallback2(CB2_ContinueSavedGame); + DestroyTask(taskId); + break; + case OPTION: + gMain.savedCallback = CB2_InitMainMenuFromOptions; + SetMainCallback2(CB2_InitOptionMenu); + DestroyTask(taskId); + break; + case MYSTERY_EVENTS: + SetMainCallback2(CB2_InitMysteryEventMenu); + DestroyTask(taskId); + break; + } +} + +void Task_MainMenuPressedB(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(CB2_InitTitleScreen); + DestroyTask(taskId); + } +} + +void HighlightCurrentMenuItem(u8 layout, u8 menuItem) +{ + REG_WIN0H = WIN_RANGE(9, 231); + + switch (layout) + { + case HAS_NO_SAVED_GAME: + default: + switch (menuItem) + { + case 0: + default: + REG_WIN0V = WIN_RANGE(1, 31); + break; + case 1: + REG_WIN0V = WIN_RANGE(33, 63); + break; + } + break; + case HAS_SAVED_GAME: + switch (menuItem) + { + case 0: + default: + REG_WIN0V = WIN_RANGE(1, 63); + break; + case 1: + REG_WIN0V = WIN_RANGE(65, 95); + break; + case 2: + REG_WIN0V = WIN_RANGE(97, 127); + break; + } + break; + case HAS_MYSTERY_GIFT: + switch (menuItem) + { + case 0: + default: + REG_WIN0V = WIN_RANGE(1, 63); + break; + case 1: + REG_WIN0V = WIN_RANGE(65, 95); + break; + case 2: + REG_WIN0V = WIN_RANGE(97, 127); + break; + case 3: + REG_WIN0V = WIN_RANGE(129, 159); + break; + } + break; + } +} + +void PrintMainMenuItem(const u8 *text, u8 left, u8 top) +{ + u8 i; + u8 buffer[32]; + + buffer[0] = 0xFC; + buffer[1] = 1; + buffer[2] = 14; + + for (i = 0; i < 26; i++) + buffer[3 + i] = text[i]; + + buffer[29] = EOS; + + MenuPrint(buffer, left, top); +} + +void PrintSaveFileInfo(void) +{ + PrintPlayerName(); + PrintPokedexCount(); + PrintPlayTime(); + PrintBadgeCount(); +} + +void PrintPlayerName(void) +{ + MenuPrint(gMainMenuString_Player, 2, 3); + MenuPrint(gSaveBlock2.playerName, 9, 3); +} + +void PrintPlayTime(void) +{ + u8 playTime[16]; + u8 alignedPlayTime[32]; + +#if defined(ENGLISH) + MenuPrint(gMainMenuString_Time, 16, 3); + FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); + sub_8072C74(alignedPlayTime, playTime, 48, 1); + MenuPrint(alignedPlayTime, 22, 3); +#elif defined(GERMAN) + MenuPrint_PixelCoords(gMainMenuString_Time, 124, 24, TRUE); + FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); + sub_8072C74(alignedPlayTime, playTime, 40, 1); + MenuPrint(alignedPlayTime, 23, 3); +#endif +} + +void PrintPokedexCount(void) +{ + u8 buffer[16]; + + MenuPrint(gMainMenuString_Pokedex, 2, 5); + sub_8072C14(buffer, GetPokedexSeenCount(), 18, 0); + MenuPrint(buffer, 9, 5); +} + +void PrintBadgeCount(void) +{ + u8 buffer[16]; + +#if defined(ENGLISH) + MenuPrint(gMainMenuString_Badges, 16, 5); +#elif defined(GERMAN) + MenuPrint_PixelCoords(gMainMenuString_Badges, 124, 40, TRUE); +#endif + ConvertIntToDecimalString(buffer, GetBadgeCount()); + MenuPrint_PixelCoords(buffer, 205, 40, 1); +} + +static void Task_NewGameSpeech1(u8 taskId) +{ + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E6CE4); + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + LZ77UnCompVram(gBirchIntroShadowGfx, (void *)BG_VRAM); + LZ77UnCompVram(gUnknown_081E7834, (void *)(BG_VRAM + 0x3800)); + LoadPalette(gUnknown_081E764C, 0, 0x40); + LoadPalette(gUnknown_081E796C, 1, 0x10); + remove_some_task(); + ResetSpriteData(); + FreeAllSpritePalettes(); + AddBirchSpeechObjects(taskId); + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP; + gTasks[taskId].data[TD_BGHOFS] = 0; + gTasks[taskId].func = Task_NewGameSpeech2; + gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = 0xFF; + gTasks[taskId].data[3] = 0xFF; + gTasks[taskId].data[TD_COUNTER] = 216; //Wait 3.6 seconds (216 frames) before starting speech + + PlayBGM(BGM_DOORO_X4); +} + +static void Task_NewGameSpeech2(u8 taskId) +{ + if (gTasks[taskId].data[TD_COUNTER] != 0) + { + gTasks[taskId].data[TD_COUNTER]--; + } + else + { + //Initialize Birch sprite + u8 spriteId = gTasks[taskId].data[TD_BIRCH_SPRITE_ID]; + + gSprites[spriteId].pos1.x = 136; + gSprites[spriteId].pos1.y = 60; + gSprites[spriteId].invisible = 0; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + StartSpriteFadeIn(taskId, 10); + StartBackgroundFadeIn(taskId, 20); + gTasks[taskId].data[TD_COUNTER] = 80; + gTasks[taskId].func = Task_NewGameSpeech3; + } +} + +static void Task_NewGameSpeech3(u8 taskId) +{ + if (gTasks[taskId].data[TD_SUBTASK_DONE] != FALSE) + { + gSprites[gTasks[taskId].data[TD_BIRCH_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_NORMAL; + if (gTasks[taskId].data[TD_COUNTER]) + { + gTasks[taskId].data[TD_COUNTER]--; + } + else + { + MenuDrawTextWindow(2, 13, 27, 18); + //"Hi! Sorry to keep you waiting... + //...But everyone calls me the POKEMON PROFESSOR." + MenuPrintMessage(gBirchSpeech_Welcome, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech4; + } + } +} + +static void Task_NewGameSpeech4(u8 taskId) +{ + if (!gPaletteFade.active && BirchSpeechUpdateWindowText()) + { + gTasks[taskId].func = Task_NewGameSpeech5; + //"This is what we call a POKEMON." + MenuPrintMessage(gBirchSpeech_ThisIsPokemon, 3, 14); + } +} + +static void Task_NewGameSpeech5(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + gTasks[taskId].func = Task_NewGameSpeech6; +} + +static void Task_NewGameSpeech6(u8 taskId) +{ + u8 spriteId = gTasks[taskId].data[TD_AZURILL_SPRITE_ID]; + + gSprites[spriteId].pos1.x = 104; + gSprites[spriteId].pos1.y = 72; + gSprites[spriteId].invisible = 0; + gSprites[spriteId].data0 = 0; + CreatePokeballSprite(spriteId, gSprites[spriteId].oam.paletteNum, 0x70, 0x3A, 0, 0, 0x20, 0x0000FFFF); + gTasks[taskId].func = Task_NewGameSpeech7; + gTasks[taskId].data[TD_COUNTER] = 0; +} + +static void Task_NewGameSpeech7(u8 taskId) +{ + if (IsCryFinished()) + { + //Go on to next sentence after frame 95 + if (gTasks[taskId].data[TD_COUNTER] > 95) + { + MenuSetText(gSystemText_NewPara); + gTasks[taskId].func = Task_NewGameSpeech8; + } + } + + if (gTasks[taskId].data[TD_COUNTER] < 16384) + { + gTasks[taskId].data[TD_COUNTER]++; + //Play Azurill cry at frame 32 + if (gTasks[taskId].data[TD_COUNTER] == 32) + PlayCry1(SPECIES_AZURILL, 0); + } +} + +static void Task_NewGameSpeech8(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + { + //"This world is widely inhabited by POKEMON... + //...That's what I do." + MenuPrintMessage(gBirchSpeech_WorldInhabitedByPokemon, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech9; + } +} + +static void Task_NewGameSpeech9(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + { + MenuDrawTextWindow(2, 13, 27, 18); + //"And you are?" + MenuPrintMessage(gBirchSpeech_AndYouAre, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech10; + } +} + +static void Task_NewGameSpeech10(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + { + gSprites[gTasks[taskId].data[TD_BIRCH_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_BLEND; + gSprites[gTasks[taskId].data[TD_AZURILL_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_BLEND; + StartSpriteFadeOut(taskId, 2); + StartBackgroundFadeOut(taskId, 1); + gTasks[taskId].data[TD_COUNTER] = 64; + gTasks[taskId].func = Task_NewGameSpeech11; + } +} + +//Slide platform away to the right +static void Task_NewGameSpeech11(u8 taskId) +{ + if (gTasks[taskId].data[TD_BGHOFS] != -60) + { + gTasks[taskId].data[TD_BGHOFS] -= 2; + REG_BG1HOFS = gTasks[taskId].data[TD_BGHOFS]; + } + else + { + gTasks[taskId].data[TD_BGHOFS] = -60; + gTasks[taskId].func = Task_NewGameSpeech12; + } +} + +static void Task_NewGameSpeech12(u8 taskId) +{ + if (gTasks[taskId].data[TD_SUBTASK_DONE]) + { + //Hide Birch and Azurill + gSprites[gTasks[taskId].data[TD_BIRCH_SPRITE_ID]].invisible = TRUE; + gSprites[gTasks[taskId].data[TD_AZURILL_SPRITE_ID]].invisible = TRUE; + + if (gTasks[taskId].data[TD_COUNTER]) + { + gTasks[taskId].data[TD_COUNTER]--; + } + else + { + //Initialize Brendan sprite + u8 spriteId = gTasks[taskId].data[TD_BRENDAN_SPRITE_ID]; + + gSprites[spriteId].pos1.x = 180; + gSprites[spriteId].pos1.y = 60; + gSprites[spriteId].invisible = FALSE; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = spriteId; + gTasks[taskId].data[TD_GENDER_SELECTION] = 0; + StartSpriteFadeIn(taskId, 2); + StartBackgroundFadeIn(taskId, 1); + gTasks[taskId].func = Task_NewGameSpeech13; + } + } +} + +static void Task_NewGameSpeech13(u8 taskId) +{ + if (gTasks[taskId].data[TD_SUBTASK_DONE]) + { + gSprites[gTasks[taskId].data[TD_TRAINER_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_NORMAL; + gTasks[taskId].func = Task_NewGameSpeech14; + } +} + +static void Task_NewGameSpeech14(u8 taskId) +{ + MenuDrawTextWindow(2, 13, 27, 18); + //"Are you a boy? Or are you a girl?" + MenuPrintMessage(gBirchSpeech_AreYouBoyOrGirl, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech15; +} + +static void Task_NewGameSpeech15(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + { + CreateGenderMenu(2, 4); + gTasks[taskId].func = Task_NewGameSpeech16; + } +} + +//Process gender menu +static void Task_NewGameSpeech16(u8 taskId) +{ + u8 cursorPos; + + switch (GenderMenuProcessInput()) + { + case MALE: + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + gSaveBlock2.playerGender = MALE; + MenuZeroFillWindowRect(2, 4, 8, 9); + gTasks[taskId].func = Task_NewGameSpeech19; + break; + case FEMALE: + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + gSaveBlock2.playerGender = FEMALE; + MenuZeroFillWindowRect(2, 4, 8, 9); + gTasks[taskId].func = Task_NewGameSpeech19; + break; + } + + cursorPos = GetMenuCursorPos(); + + if (cursorPos != gTasks[taskId].data[TD_GENDER_SELECTION]) + { + //Menu selection changed. Slide Brendan or May out and slide the other in + gTasks[taskId].data[TD_GENDER_SELECTION] = cursorPos; + gSprites[gTasks[taskId].data[TD_TRAINER_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_BLEND; + StartSpriteFadeOut(taskId, 0); + gTasks[taskId].func = Task_NewGameSpeech17; + } +} + +//Slide old trainer sprite off right of screen +static void Task_NewGameSpeech17(u8 taskId) +{ + u8 spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID]; + + if (gTasks[taskId].data[TD_SUBTASK_DONE] == FALSE) + { + gSprites[spriteId].pos1.x += 4; //Move sprite right + } + else + { + gSprites[spriteId].invisible = TRUE; + + //Set up new trainer sprite + if (gTasks[taskId].data[TD_GENDER_SELECTION]) + spriteId = gTasks[taskId].data[TD_MAY_SPRITE_ID]; + else + spriteId = gTasks[taskId].data[TD_BRENDAN_SPRITE_ID]; + gSprites[spriteId].pos1.x = 240; + gSprites[spriteId].pos1.y = 60; + gSprites[spriteId].invisible = FALSE; + gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = spriteId; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + StartSpriteFadeIn(taskId, 0); + gTasks[taskId].func = Task_NewGameSpeech18; + } +} + +//Slide new trainer sprite from right of screen +static void Task_NewGameSpeech18(u8 taskId) +{ + u8 spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID]; + + if (gSprites[spriteId].pos1.x > 180) + { + gSprites[spriteId].pos1.x -= 4; //Move sprite left + } + else + { + gSprites[spriteId].pos1.x = 180; + if (gTasks[taskId].data[TD_SUBTASK_DONE]) + { + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; + gTasks[taskId].func = Task_NewGameSpeech16; //Go back to gender menu + } + } +} + +static void Task_NewGameSpeech19(u8 taskId) +{ + MenuDrawTextWindow(2, 13, 27, 18); + //"All right. What's your name?" + MenuPrintMessage(gBirchSpeech_WhatsYourName, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech20; +} + +static void Task_NewGameSpeech20(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + { + CreateNameMenu(2, 1); + gTasks[taskId].func = Task_NewGameSpeech21; + } +} + +//Handle name menu selection +static void Task_NewGameSpeech21(u8 taskId) +{ + s8 selection = NameMenuProcessInput(); + + switch (selection) + { + case 1: //preset names + case 2: + case 3: + case 4: + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(2, 1, 22, 12); + SetPresetPlayerName(selection); + gTasks[taskId].func = Task_NewGameSpeech23; + break; + case 0: //NEW NAME + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = Task_NewGameSpeech22; + break; + case -1: //B button + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(2, 1, 22, 12); + gTasks[taskId].func = Task_NewGameSpeech14; //Go back to gender menu + break; + } +} + +//Open naming screen +static void Task_NewGameSpeech22(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetPresetPlayerName(1); + DoNamingScreen(0, gSaveBlock2.playerName, gSaveBlock2.playerGender, 0, 0, CB_ContinueNewGameSpeechPart2); + } +} + +static void Task_NewGameSpeech23(u8 taskId) +{ + MenuDrawTextWindow(2, 13, 27, 18); + //"So it's (PLAYER)?" + StringExpandPlaceholders(gStringVar4, gBirchSpeech_SoItsPlayer); + MenuPrintMessage(gStringVar4, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech24; +} + +static void Task_NewGameSpeech24(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + { + DisplayYesNoMenu(2, 1, 1); + gTasks[taskId].func = Task_NewGameSpeech25; + } +} + +//Handle yes/no menu selection +static void Task_NewGameSpeech25(u8 taskId) +{ + switch (ProcessMenuInputNoWrap_()) + { + case 0: //YES + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(2, 1, 8, 7); + gSprites[gTasks[taskId].data[TD_TRAINER_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_BLEND; + StartSpriteFadeOut(taskId, 2); + StartBackgroundFadeOut(taskId, 1); + gTasks[taskId].func = Task_NewGameSpeech26; //Continue + break; + case -1: //B button + case 1: //NO + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(2, 1, 8, 7); + gTasks[taskId].func = Task_NewGameSpeech14; //Go back to gender menu + break; + } +} + +static void Task_NewGameSpeech26(u8 taskId) +{ + if (gTasks[taskId].data[TD_BGHOFS]) + { + gTasks[taskId].data[TD_BGHOFS] += 2; + REG_BG1HOFS = gTasks[taskId].data[TD_BGHOFS]; + } + else + { + gTasks[taskId].func = Task_NewGameSpeech27; + } +} + +static void Task_NewGameSpeech27(u8 taskId) +{ + if (gTasks[taskId].data[TD_SUBTASK_DONE]) + { + s16 spriteId; + + //Hide Brendan and May sprites + spriteId = gTasks[taskId].data[TD_BRENDAN_SPRITE_ID]; + gSprites[spriteId].invisible = TRUE; + spriteId = gTasks[taskId].data[TD_MAY_SPRITE_ID]; + gSprites[spriteId].invisible = TRUE; + + //Fade in Birch and Azurill + spriteId = (u8)gTasks[taskId].data[TD_BIRCH_SPRITE_ID]; + gSprites[spriteId].pos1.x = 136; + gSprites[spriteId].pos1.y = 64; + gSprites[spriteId].invisible = FALSE; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + spriteId = (u8)gTasks[taskId].data[TD_AZURILL_SPRITE_ID]; + gSprites[spriteId].pos1.x = 104; + gSprites[spriteId].pos1.y = 72; + gSprites[spriteId].invisible = FALSE; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + + StartSpriteFadeIn(taskId, 2); + StartBackgroundFadeIn(taskId, 1); + MenuDrawTextWindow(2, 13, 27, 18); + StringExpandPlaceholders(gStringVar4, gBirchSpeech_AhOkayYouArePlayer); + //"Ah, okay! You're (PLAYER) who's moving... + //...I get it now!" + MenuPrintMessage(gStringVar4, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech28; + } +} + +static void Task_NewGameSpeech28(u8 taskId) +{ + if (gTasks[taskId].data[TD_SUBTASK_DONE]) + { + s16 spriteId; + + spriteId = gTasks[taskId].data[TD_BIRCH_SPRITE_ID]; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; + + spriteId = gTasks[taskId].data[TD_AZURILL_SPRITE_ID]; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; + + if (BirchSpeechUpdateWindowText()) + { + //Fade out Birch and Azurill + spriteId = gTasks[taskId].data[TD_BIRCH_SPRITE_ID]; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + spriteId = gTasks[taskId].data[TD_AZURILL_SPRITE_ID]; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + + StartSpriteFadeOut(taskId, 2); + StartBackgroundFadeOut(taskId, 1); + gTasks[taskId].data[TD_COUNTER] = 64; + gTasks[taskId].func = Task_NewGameSpeech29; + } + } +} + +static void Task_NewGameSpeech29(u8 taskId) +{ + if (gTasks[taskId].data[TD_SUBTASK_DONE]) + { + s16 spriteId; + + //Hide Birch and Azurill + spriteId = gTasks[taskId].data[TD_BIRCH_SPRITE_ID]; + gSprites[spriteId].invisible = TRUE; + spriteId = gTasks[taskId].data[TD_AZURILL_SPRITE_ID]; + gSprites[spriteId].invisible = TRUE; + + if (gTasks[taskId].data[TD_COUNTER]) + { + gTasks[taskId].data[TD_COUNTER]--; + } + else + { + u8 spriteId; + + //Fade in trainer and background + if (gSaveBlock2.playerGender) + spriteId = (u8)gTasks[taskId].data[TD_MAY_SPRITE_ID]; + else + spriteId = (u8)gTasks[taskId].data[TD_BRENDAN_SPRITE_ID]; + gSprites[spriteId].pos1.x = 120; + gSprites[spriteId].pos1.y = 60; + gSprites[spriteId].invisible = FALSE; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = spriteId; + + StartSpriteFadeIn(taskId, 2); + StartBackgroundFadeIn(taskId, 1); + MenuDrawTextWindow(2, 13, 27, 18); + MenuPrintMessage(gBirchSpeech_AreYouReady, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech30; + } + } +} + +static void Task_NewGameSpeech30(u8 taskId) +{ + if (gTasks[taskId].data[TD_SUBTASK_DONE]) + { + s16 spriteId; + + spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID]; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; + + if (BirchSpeechUpdateWindowText()) + { + u8 spriteId; + + spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID]; + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_81E79AC; + InitSpriteAffineAnim(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], 0); + gSprites[spriteId].callback = ShrinkPlayerSprite; + BeginNormalPaletteFade(0x0000FFFF, 0, 0, 0x10, 0); + FadeOutBGM(4); + gTasks[taskId].func = Task_NewGameSpeech31; + } + } +} + +static void Task_NewGameSpeech31(u8 taskId) +{ + u8 spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID]; + + if (gSprites[spriteId].affineAnimEnded) + gTasks[taskId].func = Task_NewGameSpeech32; +} + +static void Task_NewGameSpeech32(u8 taskId) +{ + if (!gPaletteFade.active) + { + u8 spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID]; + gSprites[spriteId].callback = nullsub_34; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON; + BeginNormalPaletteFade(0xFFFF0000, 0, 0, 0x10, 0xFFFF); + gTasks[taskId].func = Task_NewGameSpeech33; + } +} + +static void Task_NewGameSpeech33(u8 taskId) +{ + if (!gPaletteFade.active) + { + //We're finished setting up. Start the new game! + SetMainCallback2(CB2_NewGame); + DestroyTask(taskId); + } +} + +// Re-initializes graphics state after running the naming screen +// and continues the new game speech +void CB_ContinueNewGameSpeechPart2() +{ + u8 taskId; + u8 spriteId; + u16 savedIme; + + SetVBlankCallback(NULL); + + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)PLTT, PLTT_SIZE); + + ResetPaletteFade(); + + LZ77UnCompVram(gBirchIntroShadowGfx, (void *)BG_VRAM); + LZ77UnCompVram(gUnknown_081E7834, (void *)(BG_VRAM + 0x3800)); + + LoadPalette(gUnknown_081E764C, 0, 0x40); + + ResetTasks(); + + taskId = CreateTask(Task_NewGameSpeech23, 0); + + gTasks[taskId].data[TD_BGHOFS] = -60; + + remove_some_task(); + ResetSpriteData(); + FreeAllSpritePalettes(); + AddBirchSpeechObjects(taskId); + + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E6CE4); + + if (gSaveBlock2.playerGender != MALE) + { + gTasks[taskId].data[TD_GENDER_SELECTION] = FEMALE; + spriteId = gTasks[taskId].data[TD_MAY_SPRITE_ID]; + } + else + { + gTasks[taskId].data[TD_GENDER_SELECTION] = MALE; + spriteId = gTasks[taskId].data[TD_BRENDAN_SPRITE_ID]; + } + + gSprites[spriteId].pos1.x = 180; + gSprites[spriteId].pos1.y = 60; + gSprites[spriteId].invisible = FALSE; + + gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = spriteId; + + REG_BG1HOFS = -60; + + BeginNormalPaletteFade(0xFFFFFFFFu, 0, 0x10, 0, 0); + + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + + SetVBlankCallback(VBlankCB_MainMenu); + SetMainCallback2(CB2_MainMenu); + REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | + DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; +} + +void nullsub_34(struct Sprite *sprite) +{ +} + +void ShrinkPlayerSprite(struct Sprite *sprite) +{ + u32 y = (sprite->pos1.y << 16) + sprite->data0 + 0xC000; + sprite->pos1.y = y >> 16; + sprite->data0 = y; +} + +u8 CreateAzurillSprite(u8 x, u8 y) +{ + DecompressPicFromTable_2( + &gMonFrontPicTable[SPECIES_AZURILL], + gMonFrontPicCoords[SPECIES_AZURILL].coords, + gMonFrontPicCoords[SPECIES_AZURILL].y_offset, + gUnknown_081FAF4C[0], + gUnknown_081FAF4C[1], + SPECIES_AZURILL); + LoadCompressedObjectPalette(&gMonPaletteTable[SPECIES_AZURILL]); + GetMonSpriteTemplate_803C56C(SPECIES_AZURILL, 1); + return CreateSprite(&gUnknown_02024E8C, x, y, 0); +} + +void AddBirchSpeechObjects(u8 taskId) +{ + u8 spriteId; + + spriteId = CreateBirchSprite(136, 60, 1); + gSprites[spriteId].callback = nullsub_34; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].invisible = 1; + gTasks[taskId].data[TD_BIRCH_SPRITE_ID] = spriteId; + + spriteId = CreateAzurillSprite(0x68, 0x48); + gSprites[spriteId].callback = nullsub_34; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].invisible = 1; + gTasks[taskId].data[TD_AZURILL_SPRITE_ID] = spriteId; + + //Create Brendan sprite + spriteId = CreateTrainerSprite_BirchSpeech(0, 120, 60, 0, unk_2000000); + gSprites[spriteId].callback = nullsub_34; + gSprites[spriteId].invisible = 1; + gSprites[spriteId].oam.priority = 0; + gTasks[taskId].data[TD_BRENDAN_SPRITE_ID] = spriteId; + + //Create May sprite + spriteId = CreateTrainerSprite_BirchSpeech(1, 120, 60, 0, unk_2000000 + 0x800); + gSprites[spriteId].callback = nullsub_34; + gSprites[spriteId].invisible = 1; + gSprites[spriteId].oam.priority = 0; + gTasks[taskId].data[TD_MAY_SPRITE_ID] = spriteId; +} + +enum { + TD_PARENT_TASK_ID, + TD_EVA, //EVA coefficient of REG_BLDALPHA + TD_EVB, //EVB coefficient of REG_BLDALPHA + TD_INTERVAL, + TD_FRAMECOUNTER +}; + +static void Task_SpriteFadeOut(u8 taskId) +{ + if (gTasks[taskId].data[TD_EVA] == 0) + { + gTasks[gTasks[taskId].data[TD_PARENT_TASK_ID]].data[TD_SUBTASK_DONE] = TRUE; + DestroyTask(taskId); + } + else + { + if (gTasks[taskId].data[TD_FRAMECOUNTER]) + { + gTasks[taskId].data[TD_FRAMECOUNTER]--; + } + else + { + gTasks[taskId].data[TD_FRAMECOUNTER] = gTasks[taskId].data[TD_INTERVAL]; + gTasks[taskId].data[TD_EVA]--; + gTasks[taskId].data[TD_EVB]++; + REG_BLDALPHA = gTasks[taskId].data[TD_EVA] + (gTasks[taskId].data[TD_EVB] * 256); + } + } +} + +//Launches a helper task to fade out sprites +static void StartSpriteFadeOut(u8 taskId, u8 interval) +{ + u8 newTaskId; + + REG_BLDCNT = 592; + REG_BLDALPHA = 16; + REG_BLDY = 0; + gTasks[taskId].data[TD_SUBTASK_DONE] = FALSE; + newTaskId = CreateTask(Task_SpriteFadeOut, 0); + + gTasks[newTaskId].data[TD_PARENT_TASK_ID] = taskId; + gTasks[newTaskId].data[TD_EVA] = 16; + gTasks[newTaskId].data[TD_EVB] = 0; + gTasks[newTaskId].data[TD_INTERVAL] = interval; + gTasks[newTaskId].data[TD_FRAMECOUNTER] = interval; +} + +static void Task_SpriteFadeIn(u8 taskId) +{ + if (gTasks[taskId].data[TD_EVA] == 16) + { + gTasks[gTasks[taskId].data[TD_PARENT_TASK_ID]].data[TD_SUBTASK_DONE] = TRUE; + DestroyTask(taskId); + } + else if (gTasks[taskId].data[TD_FRAMECOUNTER]) + { + gTasks[taskId].data[TD_FRAMECOUNTER]--; + } + else + { + gTasks[taskId].data[TD_FRAMECOUNTER] = gTasks[taskId].data[TD_INTERVAL]; + gTasks[taskId].data[TD_EVA]++; + gTasks[taskId].data[TD_EVB]--; + REG_BLDALPHA = gTasks[taskId].data[TD_EVA] + (gTasks[taskId].data[TD_EVB] * 256); + } +} + +//Launches a helper task to fade in sprites +static void StartSpriteFadeIn(u8 taskId, u8 interval) +{ + u8 newTaskId; + + REG_BLDCNT = 592; + REG_BLDALPHA = 4096; + REG_BLDY = 0; + gTasks[taskId].data[TD_SUBTASK_DONE] = FALSE; + newTaskId = CreateTask(Task_SpriteFadeIn, 0); + + gTasks[newTaskId].data[TD_PARENT_TASK_ID] = taskId; + gTasks[newTaskId].data[TD_EVA] = 0; + gTasks[newTaskId].data[TD_EVB] = 16; + gTasks[newTaskId].data[TD_INTERVAL] = interval; + gTasks[newTaskId].data[TD_FRAMECOUNTER] = interval; +} + +enum { + TD_FADELEVEL = 1, + TD_DELAY, +}; + +static void HandleFloorShadowFadeOut(u8 taskId) +{ + if (gTasks[taskId].data[TD_DELAY]) + gTasks[taskId].data[TD_DELAY]--; + else + { + if (gTasks[taskId].data[TD_FADELEVEL] == 8) + DestroyTask(taskId); + else if (gTasks[taskId].data[TD_FRAMECOUNTER]) + gTasks[taskId].data[TD_FRAMECOUNTER]--; + else + { + gTasks[taskId].data[TD_FRAMECOUNTER] = gTasks[taskId].data[TD_INTERVAL]; + gTasks[taskId].data[TD_FADELEVEL]++; + LoadPalette(&gUnknown_081E795C[gTasks[taskId].data[TD_FADELEVEL]], 1, 0x10); + } + } +} + +//Launches a helper task to fade out the background +static void StartBackgroundFadeOut(u8 taskId, u8 interval) +{ + u8 newTaskId = CreateTask(HandleFloorShadowFadeOut, 0); + gTasks[newTaskId].data[TD_PARENT_TASK_ID] = taskId; + gTasks[newTaskId].data[TD_FADELEVEL] = 0; + gTasks[newTaskId].data[TD_DELAY] = 8; + gTasks[newTaskId].data[TD_INTERVAL] = interval; + gTasks[newTaskId].data[TD_FRAMECOUNTER] = interval; +} + +static void HandleFloorShadowFadeIn(u8 taskId) +{ + if (gTasks[taskId].data[TD_DELAY]) + gTasks[taskId].data[TD_DELAY]--; + else + { + if (gTasks[taskId].data[TD_FADELEVEL] == 0) + DestroyTask(taskId); + else + { + if (gTasks[taskId].data[TD_FRAMECOUNTER]) + gTasks[taskId].data[TD_FRAMECOUNTER]--; + else + { + gTasks[taskId].data[TD_FRAMECOUNTER] = gTasks[taskId].data[TD_INTERVAL]; + gTasks[taskId].data[TD_FADELEVEL]--; + LoadPalette(&gUnknown_081E795C[gTasks[taskId].data[TD_FADELEVEL]], 1, 0x10); + } + } + } +} + +//Launches a helper task to fade in the background +static void StartBackgroundFadeIn(u8 taskId, u8 interval) +{ + u8 newTaskId = CreateTask(HandleFloorShadowFadeIn, 0); + gTasks[newTaskId].data[TD_PARENT_TASK_ID] = taskId; + gTasks[newTaskId].data[TD_FADELEVEL] = 8; + gTasks[newTaskId].data[TD_DELAY] = 8; + gTasks[newTaskId].data[TD_INTERVAL] = interval; + gTasks[newTaskId].data[TD_FRAMECOUNTER] = interval; +} + +static void CreateGenderMenu(u8 left, u8 top) +{ + u8 menuLeft, menuTop; + MenuDrawTextWindow(left, top, left + 6, top + 5); + menuLeft = left + 1; + menuTop = top + 1; + PrintMenuItems(menuLeft, menuTop, 2, gUnknown_081E79B0); + InitMenu(0, menuLeft, menuTop, 2, 0, 5); +} + +static s8 GenderMenuProcessInput(void) +{ + return ProcessMenuInputNoWrap(); +} + +static void CreateNameMenu(u8 left, u8 top) +{ + MenuDrawTextWindow(left, top, left + 10, top + 11); + + if (gSaveBlock2.playerGender == MALE) + PrintMenuItems(left + 1, top + 1, 5, gMalePresetNames); + else + PrintMenuItems(left + 1, top + 1, 5, gFemalePresetNames); + + InitMenu(0, left + 1, top + 1, 5, 0, 9); +} + +static s8 NameMenuProcessInput(void) +{ + return ProcessMenuInput(); +} + +static void SetPresetPlayerName(u8 index) +{ + u8 i; + u8 *name; + + if (gSaveBlock2.playerGender == MALE) + name = (u8 *) gMalePresetNames[index].text; + else + name = (u8 *) gFemalePresetNames[index].text; + + for (i = 0; i < 7; i++) + gSaveBlock2.playerName[i] = name[i]; + + gSaveBlock2.playerName[i] = EOS; +} diff --git a/src/engine/menu.c b/src/engine/menu.c new file mode 100644 index 000000000..ef458124b --- /dev/null +++ b/src/engine/menu.c @@ -0,0 +1,871 @@ +#include "global.h" +#include "menu.h" +#include "main.h" +#include "map_obj_lock.h" +#include "menu_cursor.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "strings.h" +#include "text.h" +#include "text_window.h" +#include "string_util.h" + +struct Menu +{ + u8 left; + u8 top; + s8 cursorPos; + s8 minCursorPos; + s8 maxCursorPos; + u8 width; + u8 height; + u8 menu_field_7; + u8 columnXCoords[8]; +}; + +static void MultistepInitMenuWindowInternal(const struct WindowConfig *, u16); +static void InitMenuWindowInternal(const struct WindowConfig *, u16); +static bool8 sub_80723D4(void); +static u8 sub_8072484(u8, u8, u8, u8, u8, u8, u32); +static u8 sub_80724F4(u8, u8, u8, const struct MenuAction[], u8); +static void sub_8072620(u8, u8, u8, const struct MenuAction[], u8); +static void sub_8072D18(u8, u8); + +static struct Menu gMenu; + +EWRAM_DATA struct Window gMenuWindow = {0}; +EWRAM_DATA u8 gFiller_202E908[0x90] = {0}; +EWRAM_DATA struct Window *gMenuWindowPtr = NULL; +EWRAM_DATA u8 gMenuMultistepInitState = 0; +EWRAM_DATA u16 gMenuTextTileOffset = 0; +EWRAM_DATA u16 gMenuTextWindowTileOffset = 0; +EWRAM_DATA u16 gMenuTextWindowContentTileOffset = 0; +EWRAM_DATA u16 gMenuMessageBoxContentTileOffset = 0; + +const struct MenuAction gMenuYesNoItems[] = +{ + { OtherText_Yes, NULL }, + { OtherText_No, NULL }, +}; + +void CloseMenu(void) +{ + PlaySE(SE_SELECT); + MenuZeroFillScreen(); + sub_8064E2C(); + ScriptContext2_Disable(); + HandleDestroyMenuCursors(); +} + +void AppendToList(u8 *list, u8 *pindex, u32 value) +{ + list[*pindex] = value; + (*pindex)++; +} + +void InitMenuWindow(const struct WindowConfig *winConfig) +{ + InitMenuWindowInternal(winConfig, 1); +} + +void MultistepInitMenuWindowBegin(const struct WindowConfig *winConfig) +{ + MultistepInitMenuWindowInternal(winConfig, 1); +} + +static void MultistepInitMenuWindowInternal(const struct WindowConfig *winConfig, u16 tileOffset) +{ + gMenuMultistepInitState = 0; + gMenuTextTileOffset = tileOffset; + gMenuWindowPtr = &gMenuWindow; + InitWindowFromConfig(&gMenuWindow, winConfig); +} + +bool32 MultistepInitMenuWindowContinue(void) +{ + switch (gMenuMultistepInitState) + { + case 0: + gMenuMultistepInitState++; + return 0; + case 1: + gMenuTextWindowTileOffset = MultistepInitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); + goto next; + case 2: + if (!MultistepLoadFont()) + goto fail; + goto next; + case 3: + gMenuTextWindowContentTileOffset = SetTextWindowBaseTileNum(gMenuTextWindowTileOffset); + next: + gMenuMultistepInitState++; + return 0; + case 4: + LoadTextWindowGraphics(gMenuWindowPtr); + gMenuMessageBoxContentTileOffset = SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); + return 1; + default: + fail: + return 0; + } +} + +static void InitMenuWindowInternal(const struct WindowConfig *winConfig, u16 tileOffset) +{ + gMenuWindowPtr = &gMenuWindow; + InitWindowFromConfig(&gMenuWindow, winConfig); + gMenuTextTileOffset = tileOffset; + gMenuTextWindowTileOffset = InitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); + gMenuTextWindowContentTileOffset = SetTextWindowBaseTileNum(gMenuTextWindowTileOffset); + LoadTextWindowGraphics(gMenuWindowPtr); + gMenuMessageBoxContentTileOffset = SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); +} + +void unref_sub_8071DA4(struct WindowConfig *winConfig, u16 tileOffset) +{ + gMenuWindowPtr = &gMenuWindow; + InitWindowFromConfig(&gMenuWindow, winConfig); + gMenuTextWindowTileOffset = tileOffset; + gMenuTextWindowContentTileOffset = SetTextWindowBaseTileNum(gMenuTextWindowTileOffset); + LoadTextWindowGraphics(gMenuWindowPtr); + gMenuTextTileOffset = SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); + gMenuMessageBoxContentTileOffset = InitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); +} + +void MenuLoadTextWindowGraphics_OverrideFrameType(u8 frameType) +{ + LoadTextWindowGraphics_OverrideFrameType(gMenuWindowPtr, frameType); +} + +void MenuLoadTextWindowGraphics(void) +{ + LoadTextWindowGraphics(gMenuWindowPtr); +} + +void BasicInitMenuWindow(const struct WindowConfig *winConfig) +{ + InitWindowFromConfig(gMenuWindowPtr, winConfig); + gMenuWindowPtr->tileDataStartOffset = gMenuTextTileOffset; +} + +void MenuPrint(const u8 *str, u8 left, u8 top) +{ + sub_8003460(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); +} + +void MenuZeroFillWindowRect(u8 a1, u8 a2, u8 a3, u8 a4) +{ + ZeroFillWindowRect(gMenuWindowPtr, a1, a2, a3, a4); +} + +void MenuFillWindowRectWithBlankTile(u8 left, u8 top, u8 right, u8 bottom) +{ + FillWindowRectWithBlankTile(gMenuWindowPtr, left, top, right, bottom); +} + +void MenuZeroFillScreen(void) +{ + MenuZeroFillWindowRect(0, 0, 29, 19); +} + +void MenuDrawTextWindow(u8 left, u8 top, u8 right, u8 bottom) +{ + DrawTextWindow(gMenuWindowPtr, left, top, right, bottom); +} + +void sub_8071F40(const u8 *str) +{ + MenuDrawTextWindow(2, 14, 28, 19); + MenuPrint(str, 3, 15); +} + +void sub_8071F60(u8 a1, u8 a2, u8 a3) +{ + sub_8003490(gMenuWindowPtr, a1, gMenuTextTileOffset, a2, a3); +} + +u16 unref_sub_8071F98(u8 x, u8 y) +{ + return GetWindowTilemapEntry(gMenuWindowPtr, x, y); +} + +void unref_sub_8071FBC(u16 a1, u8 a2, u8 a3, u8 a4, u8 a5) +{ + DrawWindowRect(gMenuWindowPtr, a1, a2, a3, a4, a5); +} + +void MenuDisplayMessageBox(void) +{ + DisplayMessageBox(gMenuWindowPtr); +} + +void MenuPrintMessage(const u8 *str, u8 left, u8 top) +{ + sub_8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); +} + +void sub_8072044(const u8 *str) +{ + sub_8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, 2, 15); +} + +void MenuSetText(const u8 *str) +{ + sub_8002E90(gMenuWindowPtr, str); +} + +u8 MenuUpdateWindowText(void) +{ + return sub_80035AC(gMenuWindowPtr); +} + +u8 unref_sub_8072098(void) +{ + return sub_8003418(gMenuWindowPtr); +} + +void sub_80720B0(void) +{ + ClearWindowTextLines(gMenuWindowPtr); +} + +u8 MoveMenuCursor(s8 delta) +{ + s32 newPos = gMenu.cursorPos + delta; + + if (newPos < gMenu.minCursorPos) + gMenu.cursorPos = gMenu.maxCursorPos; + else if (newPos > gMenu.maxCursorPos) + gMenu.cursorPos = gMenu.minCursorPos; + else + gMenu.cursorPos += delta; + + RedrawMenuCursor(gMenu.left, 2 * gMenu.cursorPos + gMenu.top); + return gMenu.cursorPos; +} + +u8 MoveMenuCursorNoWrap(s8 delta) +{ + s32 newPos = gMenu.cursorPos + delta; + + if (newPos < gMenu.minCursorPos) + gMenu.cursorPos = gMenu.minCursorPos; + else if (newPos > gMenu.maxCursorPos) + gMenu.cursorPos = gMenu.maxCursorPos; + else + gMenu.cursorPos += delta; + + RedrawMenuCursor(gMenu.left, 2 * gMenu.cursorPos + gMenu.top); + return gMenu.cursorPos; +} + +u8 GetMenuCursorPos(void) +{ + return gMenu.cursorPos; +} + +s8 ProcessMenuInput(void) +{ + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gMenu.menu_field_7) + HandleDestroyMenuCursors(); + return gMenu.cursorPos; + } + + if (gMain.newKeys & B_BUTTON) + { + if (gMenu.menu_field_7) + HandleDestroyMenuCursors(); + return -1; + } + + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + return -2; + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + return -2; + } + + return -2; +} + +s8 ProcessMenuInputNoWrap(void) +{ + u8 cursorPos = gMenu.cursorPos; + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gMenu.menu_field_7) + HandleDestroyMenuCursors(); + return gMenu.cursorPos; + } + + if (gMain.newKeys & B_BUTTON) + { + if (gMenu.menu_field_7) + HandleDestroyMenuCursors(); + return -1; + } + + if (gMain.newKeys & DPAD_UP) + { + if (cursorPos != MoveMenuCursorNoWrap(-1)) + PlaySE(SE_SELECT); + return -2; + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (cursorPos != MoveMenuCursorNoWrap(1)) + PlaySE(SE_SELECT); + return -2; + } + + MoveMenuCursorNoWrap(0); + return -2; +} + +u8 MoveMenuCursor3(s8 delta) +{ + u8 menuHeight = (gMenu.maxCursorPos + 1) >> 1; + s32 newPos = gMenu.cursorPos + delta; + + if (newPos < gMenu.minCursorPos) + gMenu.cursorPos = gMenu.maxCursorPos; + else if (newPos > gMenu.maxCursorPos) + gMenu.cursorPos = gMenu.minCursorPos; + else + gMenu.cursorPos += delta; + + RedrawMenuCursor( + 6 * (gMenu.cursorPos / menuHeight) + gMenu.left, + 2 * (gMenu.cursorPos % menuHeight) + gMenu.top); + + return gMenu.cursorPos; +} + +u8 MoveMenuCursor4(s8 delta) +{ + if (gMenu.cursorPos + delta <= gMenu.maxCursorPos) + { + if (sub_80723D4() == TRUE) + return gMenu.cursorPos; + } + else + { + return gMenu.cursorPos; + } + + gMenu.cursorPos += delta; + + if ((gMenu.maxCursorPos + 1) / gMenu.width == 0) + RedrawMenuCursor( + gMenu.left + gMenu.columnXCoords[gMenu.cursorPos % gMenu.width], + 2 * ((gMenu.cursorPos / gMenu.width) % gMenu.height) + gMenu.top); + else + RedrawMenuCursor( + gMenu.left + gMenu.columnXCoords[gMenu.cursorPos % gMenu.width], + 2 * (gMenu.cursorPos / gMenu.width) + gMenu.top); + + return gMenu.cursorPos; +} + +static bool8 sub_80723D4(void) +{ + if ((gMain.newKeys & DPAD_UP) && gMenu.cursorPos < gMenu.width) + return TRUE; + + if ((gMain.newKeys & DPAD_DOWN) && gMenu.cursorPos >= (gMenu.maxCursorPos + 1) - gMenu.width) + return TRUE; + + if ((gMain.newKeys & DPAD_LEFT) + && ((gMenu.cursorPos - (gMenu.cursorPos % gMenu.width)) % gMenu.width == 1 // always false + || gMenu.cursorPos == 0 + || gMenu.cursorPos % gMenu.width == 0)) + return TRUE; + + if ((gMain.newKeys & DPAD_RIGHT) && gMenu.cursorPos % gMenu.width == gMenu.width - 1) + return TRUE; + + return FALSE; +} + +static u8 sub_8072484(u8 a1, u8 a2, u8 menuItemCount, u8 a4, u8 width, u8 a6, u32 a7) +{ + u8 v7; + + gMenu.width = width; + gMenu.height = menuItemCount / width; + InitMenu(0, a1, a2, menuItemCount, a4, a6); + v7 = 0; + if (a7) + v7 = -1; + gMenu.menu_field_7 = v7; + return a4; +} + +static u8 sub_80724F4(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], u8 columnCount) +{ + u8 i; + u8 maxWidth; + s32 height; + + for (i = 0; i < 7; i++) + gMenu.columnXCoords[i] = 0; + + maxWidth = 0; + for (i = 0; i < menuItemCount; i++) + { + u8 width = (sub_8072CA4(menuItems[i].text) + 7) / 8; + + if (width > maxWidth) + maxWidth = width; + } + + for (i = 1; i <= columnCount; i++) + gMenu.columnXCoords[i] = maxWidth; + + for (i = 1; i <= columnCount; i++) + gMenu.columnXCoords[i] += 1 + gMenu.columnXCoords[i - 1]; + + gMenu.columnXCoords[columnCount]--; + + if (!((menuItemCount / 2) < columnCount || (menuItemCount % 2 != 0)) + || columnCount == 1 + || columnCount == menuItemCount) + { + height = 2 * (menuItemCount / columnCount) + 1; + } + else + { + height = 2 * ((menuItemCount / columnCount) + 1) + 1; + } + + { + // TODO: Make this code less hideous but still match the original asm. + u8 right; + u8 bottom; + u32 totalWidth; + register s32 val asm("r1"); + + val = (s8)top + height; + val = val << 24; + asm("" ::: "r3"); + bottom = val >> 24; + + totalWidth = (gMenu.columnXCoords[columnCount] + 1); + right = left + totalWidth; + + MenuDrawTextWindow(left, top, right, bottom); + } + + return maxWidth; +} + +static void sub_8072620(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], u8 columnCount) +{ + u8 i; + u8 maxWidth; + + for (i = 0; i < 7; i++) + gMenu.columnXCoords[i] = 0; + + maxWidth = 0; + for (i = 0; i < menuItemCount; i++) + { + u8 width = (sub_8072CA4(menuItems[i].text) + 7) / 8; + + if (width > maxWidth) + maxWidth = width; + } + + for (i = 1; i <= columnCount; i++) + gMenu.columnXCoords[i] = maxWidth; + + for (i = 1; i <= columnCount; i++) + gMenu.columnXCoords[i] += 1 + gMenu.columnXCoords[i - 1]; + + gMenu.columnXCoords[columnCount]--; + + for (i = 0; i < columnCount; i++) + { + u8 row = 0; + u8 j; + for (j = 0; i + j < menuItemCount; j += columnCount, row++) + MenuPrint(menuItems[i + j].text, left + gMenu.columnXCoords[i % columnCount], top + 2 * row); + } +} + +void sub_807274C(u8 left, u8 top, u8 menuItemCount, u8 a4, const struct MenuAction menuItems[], u8 columnCount, u32 a7) +{ + u8 maxWidth = sub_80724F4(left, top, menuItemCount, menuItems, columnCount); + + sub_8072484(left + 1, top + 1, menuItemCount, a4, columnCount, maxWidth, a7); + sub_8072620(left + 1, top + 1, menuItemCount, menuItems, columnCount); +} + +s8 sub_80727CC(void) +{ + if (gMain.newKeys & A_BUTTON) + { + if (gMenu.menu_field_7) + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + return GetMenuCursorPos(); + } + + if (gMain.newKeys & B_BUTTON) + { + if (gMenu.menu_field_7) + HandleDestroyMenuCursors(); + return -1; + } + + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + MoveMenuCursor4(-gMenu.width); + return -2; + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + MoveMenuCursor4(gMenu.width); + return -2; + } + else if (gMain.newKeys & DPAD_LEFT) + { + PlaySE(SE_SELECT); + MoveMenuCursor4(-1); + return -2; + } + else if (gMain.newKeys & DPAD_RIGHT) + { + PlaySE(SE_SELECT); + MoveMenuCursor4(1); + return -2; + } + + return -2; +} + +u8 sub_807288C(u8 column) +{ + return gMenu.columnXCoords[column]; +} + +void PrintMenuItems(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[]) +{ + u8 i; + + for (i = 0; i < menuItemCount; i++) + MenuPrint(menuItems[i].text, left, top + 2 * i); +} + +void PrintMenuItemsReordered(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], const u8 *order) +{ + u8 i; + + for (i = 0; i < menuItemCount; i++) + MenuPrint(menuItems[order[i]].text, left, top + 2 * i); +} + +void InitYesNoMenu(u8 left, u8 top, u8 a3) +{ + PrintMenuItems(left + 1, top + 1, 2, gMenuYesNoItems); + InitMenu(0, left + 1, top + 1, 2, 0, a3); +} + +void DisplayYesNoMenu(u8 left, u8 top, u32 a3) +{ + MenuDrawTextWindow(left, top, left + 6, top + 5); + InitYesNoMenu(left, top, 5); + gMenu.menu_field_7 = a3 ? -1 : 0; +} + +s8 ProcessMenuInputNoWrap_(void) +{ + return ProcessMenuInputNoWrap(); +} + +u8 MenuPrint_PixelCoords(const u8 *text, u8 left, u16 top, u8 a4) +{ + return sub_8004D04(gMenuWindowPtr, text, gMenuTextTileOffset, left, top, a4); +} + +u8 sub_8072A18(const u8 *text, u8 left, u16 top, u8 width, u32 a5) +{ + return sub_8004FD0(gMenuWindowPtr, 0, text, gMenuTextTileOffset, left, top, width, a5); +} + +u8 unref_sub_8072A5C(u8 *dest, u8 *src, u8 left, u16 top, u8 width, u32 a6) +{ + return sub_8004FD0(gMenuWindowPtr, dest, src, gMenuTextTileOffset, left, top, width, a6); +} + +#if ENGLISH +int sub_8072AB0(const u8 *str, u8 left, u16 top, u8 width, u8 height, u32 a6) +{ + u8 newlineCount = sub_8004FD0(gMenuWindowPtr, NULL, str, gMenuTextTileOffset, left, top, width, a6); + + left /= 8; + top /= 8; + width = (width + 7) / 8; + height = (height + 7) / 8; + + if (newlineCount < height) + MenuFillWindowRectWithBlankTile(left, top + 2 * newlineCount, left + width - 1, height + top - 1); +} +#elif GERMAN +__attribute__((naked)) +int sub_8072AB0(const u8 *str, u8 left, u16 top, u8 width, u8 height, u32 a6) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x10\n\ + mov r12, r0\n\ + ldr r0, [sp, 0x24]\n\ + ldr r4, [sp, 0x28]\n\ + str r4, [sp, 0xC]\n\ + lsls r1, 24\n\ + lsrs r5, r1, 24\n\ + lsls r2, 16\n\ + lsrs r4, r2, 16\n\ + lsls r3, 24\n\ + lsrs r6, r3, 24\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + ldr r0, _08072AF8 @ =gMenuWindowPtr\n\ + ldr r0, [r0]\n\ + ldr r1, _08072AFC @ =gMenuTextTileOffset\n\ + ldrh r3, [r1]\n\ + str r5, [sp]\n\ + str r4, [sp, 0x4]\n\ + str r6, [sp, 0x8]\n\ + movs r1, 0\n\ + mov r2, r12\n\ + bl sub_8004FD0\n\ + adds r1, r0, 0\n\ + lsls r1, 24\n\ + lsrs r2, r1, 24\n\ + movs r3, 0x7\n\ + ands r3, r5\n\ + cmp r3, 0\n\ + bne _08072B00\n\ + adds r1, r6, 0x7\n\ + asrs r1, 3\n\ + subs r1, 0x1\n\ + b _08072B0C\n\ + .align 2, 0\n\ +_08072AF8: .4byte gMenuWindowPtr\n\ +_08072AFC: .4byte gMenuTextTileOffset\n\ +_08072B00:\n\ + adds r3, r6, r3\n\ + subs r1, r3, 0x1\n\ + cmp r1, 0\n\ + bge _08072B0A\n\ + adds r1, r3, 0x6\n\ +_08072B0A:\n\ + asrs r1, 3\n\ +_08072B0C:\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + adds r6, r1, 0\n\ + lsrs r5, 3\n\ + adds r1, r7, 0x7\n\ + asrs r1, 3\n\ + lsls r1, 24\n\ + lsrs r7, r1, 24\n\ + lsrs r4, 3\n\ + cmp r2, r7\n\ + bcs _08072B3E\n\ + lsls r1, r2, 1\n\ + adds r1, r4, r1\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + adds r2, r5, r6\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r3, r7, r4\n\ + subs r3, 0x1\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + adds r0, r5, 0\n\ + bl MenuFillWindowRectWithBlankTile\n\ +_08072B3E:\n\ + add sp, 0x10\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif + +void MenuPrint_RightAligned(const u8 *str, u8 left, u8 top) +{ + sub_8004D38(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); +} + +void sub_8072B80(const u8 *a1, u8 a2, u8 a3, const u8 *a4) +{ + u8 buffer[64]; + u8 width = GetStringWidth(gMenuWindowPtr, a4); + AlignString(gMenuWindowPtr, buffer, a1, width, 1); + sub_8003460(gMenuWindowPtr, buffer, gMenuTextTileOffset, a2, a3); +} + +void sub_8072BD8(const u8 *a1, u8 a2, u8 a3, u16 a4) +{ + sub_8004DB0(gMenuWindowPtr, a1, gMenuTextTileOffset, a2, a3, a4); +} + +u8 *sub_8072C14(u8 *a1, s32 a2, u8 a3, u8 a4) +{ + return AlignInt1(gMenuWindowPtr, a1, a2, a3, a4); +} + +u8 *sub_8072C44(u8 *a1, s32 a2, u8 a3, u8 a4) +{ + return AlignInt2(gMenuWindowPtr, a1, a2, a3, a4); +} + +u8 *sub_8072C74(u8 *a1, const u8 *a2, u8 a3, u8 a4) +{ + return AlignString(gMenuWindowPtr, a1, a2, a3, a4); +} + +u8 sub_8072CA4(const u8 *str) +{ + return GetStringWidth(gMenuWindowPtr, str); +} + +u8 sub_8072CBC() +{ + return sub_8004E24(gMenuWindowPtr); +} + +void sub_8072CD4(u8 *a1, u8 *a2, u8 *a3) +{ + sub_8004E28(gMenuWindowPtr, a1, a2, a3); +} + +u32 MenuUpdateWindowText_OverrideLineLength(u8 lineLength) +{ + return sub_80037C8(gMenuWindowPtr, lineLength); +} + +struct Window *unref_sub_8072D0C(void) +{ + return gMenuWindowPtr; +} + +static void sub_8072D18(u8 a1, u8 a2) +{ + sub_814A5C0(a1, 0xFFFF, 12, 11679, 8 * a2); +} + +u8 InitMenu(u8 cursorSubpriority, u8 left, u8 top, u8 numChoices, u8 cursorPos, u8 cursorWidth) +{ + s32 pos; + + if (cursorWidth) + sub_8072D18(cursorSubpriority, cursorWidth); + + gMenu.left = left - 1; + gMenu.top = top; + gMenu.minCursorPos = 0; + gMenu.maxCursorPos = numChoices - 1; + gMenu.menu_field_7 = 0; + + pos = cursorPos; + + if (pos < 0 || pos > gMenu.maxCursorPos) + pos = 0; + + gMenu.cursorPos = pos; + MoveMenuCursor(0); + + return pos; +} + +void RedrawMenuCursor(u8 a1, u8 a2) +{ + sub_814A880((a1 + 1) * 8, 8 * a2); +} + +void unref_sub_8072DC0() +{ + sub_814A904(); +} + +void sub_8072DCC(u8 a1) +{ + sub_814A958(a1); +} + +void sub_8072DDC(u8 a1) +{ + sub_8072DCC(8 * a1); +} + +void HandleDestroyMenuCursors(void) +{ + DestroyMenuCursor(); +} + +#if GERMAN +void de_sub_8073110(u8 * buffer, u8 * name) { + u8 * ptr, *ptr2, *ptr3; + + ptr2 = buffer; + ptr = &gStringVar1[1 + StringLengthN(gStringVar1, 256)]; + ptr3 = ptr; + + for (;;) + { + if (*ptr2 == EOS) + break; + + if (*ptr2 == 0xFD) + { + + *ptr3 = EOS; + ptr2 += 2; + + StringAppend(ptr, name); + StringAppend(ptr, ptr2); + + buffer[0] = EOS; + StringAppend(buffer, ptr); + break; + } + + *ptr3 = *ptr2; + ptr2 += 1; + ptr3 += 1; + } +} + +u8 *de_sub_8073174(u8 *name, const u8 *format) { + u32 offset; + u8 *ptr; + + offset = StringLengthN(gStringVar2, 0x100); + ptr = &gStringVar2[1 + offset]; + + StringCopy(ptr, format); + + de_sub_8073110(ptr, name); + + return StringCopy(name, ptr); +} +#endif diff --git a/src/engine/menu_cursor.c b/src/engine/menu_cursor.c new file mode 100644 index 000000000..64ab36573 --- /dev/null +++ b/src/engine/menu_cursor.c @@ -0,0 +1,798 @@ +#include "global.h" +#include "menu_cursor.h" +#include "palette.h" +#include "sprite.h" + +extern const struct SpriteSheet gUnknown_0842F140[]; +extern const struct SpriteSheet gUnknown_0842F1C0[]; +extern const struct SpritePalette gUnknown_0842F240; +extern const struct SpritePalette gUnknown_0842F248; +extern const struct SpriteTemplate gSpriteTemplate_842F250[]; +extern const struct SpriteTemplate gSpriteTemplate_842F298[]; + +extern struct Subsprite *const gUnknown_0842F5BC[]; + +extern const struct SubspriteTable gSubspriteTables_842F5C0[]; +extern const struct SubspriteTable gSubspriteTables_842F6C0[]; +extern const struct SubspriteTable gUnknown_0842F758[]; + +extern const struct Subsprite gUnknown_0842F780; +extern const struct Subsprite gUnknown_0842F788; +extern const struct Subsprite gUnknown_0842F790; + +extern u16 gUnknown_0203A360[]; + +EWRAM_DATA struct Subsprite gMenuCursorSubsprites[10] = {0}; +EWRAM_DATA u8 gUnknown_0203A3D0 = 0; +EWRAM_DATA u8 gUnknown_0203A3D1 = 0; +EWRAM_DATA u8 gUnknown_0203A3D2 = 0; +EWRAM_DATA u8 gUnknown_0203A3D3 = 0; +EWRAM_DATA u8 gUnknown_0203A3D4 = 0; + +void sub_814A590(void) +{ + gUnknown_0203A3D0 = 0x40; + gUnknown_0203A3D1 = 0x40; + gUnknown_0203A3D2 = 0x40; + gUnknown_0203A3D3 = 0; + gUnknown_0203A3D4 = 0; +} + +u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5) +{ + int v9; + struct Sprite *v10; + + if (gUnknown_0203A3D0 != 0x40 || gUnknown_0203A3D1 != 0x40) + DestroyMenuCursor(); + + v9 = 1; + if (a2 == 0xFFFF) + { + gUnknown_0203A360[a3 & 0xF] = a4; + if (LoadSpritePalette(&gUnknown_0842F240) != 0xFF) + { + a2 = 0xFFF0; + v9 = 0; + } + } + + LoadSpriteSheetDeferred(&gUnknown_0842F140[a3 & 0xF]); + gUnknown_0203A3D0 = CreateSprite(&gSpriteTemplate_842F250[v9], 0, 0xA0, a1); + gUnknown_0203A3D1 = CreateSprite(&gSpriteTemplate_842F250[2], 0, 0xA0, a1); + if (gUnknown_0203A3D0 != 0x40) + { + v10 = &gSprites[gUnknown_0203A3D0]; + if (a2 == 0xFFFF) + v10->oam.paletteNum = 0; + else + v10->oam.paletteNum = IndexOfSpritePaletteTag(a2); + } + if (gUnknown_0203A3D1 != 0x40) + { + v10 = &gSprites[gUnknown_0203A3D1]; + if (a2 == 0xFFFF) + v10->oam.paletteNum = 0; + else + v10->oam.paletteNum = IndexOfSpritePaletteTag(a2); + + if (!(REG_DISPCNT & (DISPCNT_WIN0_ON | DISPCNT_WIN1_ON))) + *(u8 *)(REG_ADDR_WINOUT) |= 0x1F; + gUnknown_0203A3D3 = REG_DISPCNT >> 0xF; + gUnknown_0203A3D4 = *(u8 *)(REG_BASE + REG_OFFSET_WINOUT + 1); + REG_DISPCNT |= DISPCNT_OBJWIN_ON; + *(u8 *)(REG_ADDR_WINOUT + 1) = 0x10; + } + sub_814A958(a5); + return gUnknown_0203A3D0; +} + +u8 sub_814A758(u8 a1, u8 a2, u8 a3, u8 a4) +{ + u8 result; + struct Sprite *spr; + + result = sub_814A5C0(a1, 0, a3, 0, a4); + if (result != 0x40) + { + spr = &gSprites[gUnknown_0203A3D0]; + spr->oam.paletteNum = a2; + } + return result; +} + +u8 unref_sub_814A7AC(u8 a1, u16 a2, u8 a3) +{ + u16 i; + u8 val1 = 0; + u16 val2 = 0xF; + + for (i = 0; i <= 0xFF; i++) + { + if (gPlttBufferUnfaded[i] == a2) + { + val1 = (u8)(i >> 4); + val2 = i & 0xF; + } + } + + return sub_814A758(a1, val1, val2, a3); +} + +void DestroyMenuCursor(void) +{ + if (gUnknown_0203A3D0 != 0x40) + { + LoadTilesForSpriteSheet(&gUnknown_0842F140[0]); + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203A3D0]); + gUnknown_0203A3D0 = 0x40; + } + + if (gUnknown_0203A3D1 != 0x40) + { + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203A3D1]); + gUnknown_0203A3D1 = 0x40; + if (!gUnknown_0203A3D3) + REG_DISPCNT &= ~DISPCNT_OBJWIN_ON; + *(u8 *)(REG_BASE + REG_OFFSET_WINOUT + 1) = gUnknown_0203A3D4; + } + + return; +} + +void sub_814A880(u8 a1, u8 a2) +{ + struct Sprite *spr; + + if (gUnknown_0203A3D0 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D0]; + spr->invisible = 0; + spr->centerToCornerVecX = 0; + spr->centerToCornerVecY = 0; + spr->pos1.x = a1; + spr->pos1.y = a2; + } + + if (gUnknown_0203A3D1 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D1]; + spr->invisible = 0; + spr->centerToCornerVecX = 0; + spr->centerToCornerVecY = 0; + spr->pos1.x = a1; + spr->pos1.y = a2; + } + + return; +} + +void sub_814A904(void) +{ + struct Sprite *spr; + + if (gUnknown_0203A3D0 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D0]; + spr->invisible = 1; + } + + if (gUnknown_0203A3D1 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D1]; + spr->invisible = 1; + } + + return; +} + +#ifdef NONMATCHING +// Fix pls +void sub_814A958(u8 a1) +{ + struct Subsprite *cursub; + u8 v2; // r7@1 + s16 v3; // r2@1 + s32 v5; // r0@1 + s32 v6; // r3@1 + s32 v7; // r5@3 + int v8; // r7@9 + s16 negone; + + cursub = &gMenuCursorSubsprites[0]; + negone = -1; + cursub = (struct Subsprite){0,2}; + cursub->x = negone; + cursub++; + + v2 = 1; + v3 = 1; + v5 = (a1 - 1) << 0x10; + v6 = v5 >> 0x10; + if ((v5 >> 0x10) > 7) + { + do + { + if (v6 > 0x1F) + { + *cursub = gUnknown_0842F780; + cursub->x = v3; + v3 = ((v3 << 16) + 0x200000) >> 16; + v7 = a1 << 16; + } + else + { + v7 = a1 << 16; + if (a1 <= 0x27 || v6 <= 0x8) + { + *cursub = gUnknown_0842F788; + cursub->x = v3; + v3 = ((v3 << 16) + 0x80000) >> 16; + } + else + { + *cursub = gUnknown_0842F780; + cursub->x = v3 - 0x20 + (v6 & 0xFFF8); + v3 = (v3 + (v6 & 0x18)) & negone; + } + } + + cursub++; + v2 = v2 + 1; + v6 = ((v7 >> 16) - v3) & 0xFFFF; + } + while (v7 - v3 > 7); + } + *cursub = gUnknown_0842F790; + cursub->x = v6 + v3 - 7; + v8 = v2 + 1; + if (gUnknown_0203A3D0 != 0x40) + SetSubspriteTables(&gSprites[gUnknown_0203A3D0], &gSubspriteTables_842F5C0[v8]); + if (gUnknown_0203A3D1 != 0x40) + SetSubspriteTables(&gSprites[gUnknown_0203A3D1], &gSubspriteTables_842F5C0[v8]); + return; +} +#elif ENGLISH +__attribute__((naked)) +void sub_814A958(u8 a1) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + ldr r4, _0814A9C4\n\ + ldr r2, _0814A9C8\n\ + lsrs r0, 24\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0\n\ + movs r1, 0x2\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + adds r4, 0x8\n\ + movs r7, 0x1\n\ + movs r2, 0x1\n\ + ldr r1, [sp]\n\ + subs r0, r1, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x7\n\ + ble _0814AA3A\n\ + ldr r0, _0814A9CC\n\ + mov r12, r0\n\ + mov r8, r1\n\ + movs r1, 0x8\n\ + negs r1, r1\n\ + mov r10, r1\n\ + ldr r5, _0814A9D0\n\ + mov r9, r5\n\ +_0814A99E:\n\ + lsls r0, r3, 16\n\ + asrs r3, r0, 16\n\ + cmp r3, 0x1F\n\ + ble _0814A9D4\n\ + mov r6, r12\n\ + ldr r0, [r6]\n\ + ldr r1, [r6, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + lsls r0, r2, 16\n\ + movs r1, 0x80\n\ + lsls r1, 14\n\ + adds r0, r1\n\ + lsrs r2, r0, 16\n\ + ldr r3, [sp]\n\ + lsls r5, r3, 16\n\ + b _0814AA20\n\ + .align 2, 0\n\ +_0814A9C4: .4byte gMenuCursorSubsprites\n\ +_0814A9C8: .4byte 0x0000ffff\n\ +_0814A9CC: .4byte gUnknown_0842F780\n\ +_0814A9D0: .4byte gUnknown_0842F788\n\ +_0814A9D4:\n\ + ldr r6, [sp]\n\ + lsls r5, r6, 16\n\ + mov r0, r8\n\ + cmp r0, 0x27\n\ + ble _0814AA0A\n\ + cmp r3, 0x8\n\ + ble _0814AA0A\n\ + mov r6, r12\n\ + ldr r0, [r6]\n\ + ldr r1, [r6, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + adds r2, r1, 0\n\ + subs r2, 0x20\n\ + adds r0, r3, 0\n\ + mov r6, r10\n\ + ands r0, r6\n\ + adds r2, r0\n\ + strh r2, [r4]\n\ + movs r0, 0x18\n\ + ands r0, r3\n\ + adds r1, r0\n\ + lsls r1, 16\n\ + lsrs r2, r1, 16\n\ + b _0814AA20\n\ +_0814AA0A:\n\ + mov r3, r9\n\ + ldr r0, [r3]\n\ + ldr r1, [r3, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + lsls r0, r2, 16\n\ + movs r6, 0x80\n\ + lsls r6, 12\n\ + adds r0, r6\n\ + lsrs r2, r0, 16\n\ +_0814AA20:\n\ + adds r4, 0x8\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + asrs r1, r5, 16\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + subs r1, r0\n\ + lsls r1, 16\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + cmp r1, 0x7\n\ + bgt _0814A99E\n\ +_0814AA3A:\n\ + ldr r5, _0814AAA8\n\ + ldr r0, [r5]\n\ + ldr r1, [r5, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + subs r1, 0x7\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + adds r0, r1\n\ + strh r0, [r4]\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + ldr r6, _0814AAAC\n\ + ldrb r0, [r6]\n\ + cmp r0, 0x40\n\ + beq _0814AA78\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0814AAB0\n\ + adds r2, r0, r1\n\ + lsls r1, r7, 3\n\ + ldr r0, _0814AAB4\n\ + adds r1, r0\n\ + adds r0, r2, 0\n\ + bl SetSubspriteTables\n\ +_0814AA78:\n\ + ldr r1, _0814AAB8\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x40\n\ + beq _0814AA98\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0814AAB0\n\ + adds r2, r0, r1\n\ + lsls r1, r7, 3\n\ + ldr r0, _0814AAB4\n\ + adds r1, r0\n\ + adds r0, r2, 0\n\ + bl SetSubspriteTables\n\ +_0814AA98:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0814AAA8: .4byte gUnknown_0842F790\n\ +_0814AAAC: .4byte gUnknown_0203A3D0\n\ +_0814AAB0: .4byte gSprites\n\ +_0814AAB4: .4byte gSubspriteTables_842F5C0\n\ +_0814AAB8: .4byte gUnknown_0203A3D1\n\ + .syntax divided\n"); +} +#elif GERMAN +__attribute__((naked)) +void sub_814A958(u8 a1) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + ldr r4, _0814A9C4 @ =gMenuCursorSubsprites\n\ + ldr r2, _0814A9C8 @ =0x0000ffff\n\ + lsrs r0, 24\n\ + str r0, [sp]\n\ + ldr r0, _0814A9CC @ =gUnknown_0842F780\n\ + ldr r1, [r0, 0x4]\n\ + ldr r0, [r0]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + adds r4, 0x8\n\ + movs r7, 0x1\n\ + movs r2, 0x1\n\ + ldr r1, [sp]\n\ + subs r0, r1, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x7\n\ + ble _0814AA3E\n\ + ldr r0, _0814A9D0 @ =gUnknown_0842F788\n\ + mov r12, r0\n\ + mov r8, r1\n\ + movs r1, 0x8\n\ + negs r1, r1\n\ + mov r10, r1\n\ + ldr r5, _0814A9D4 @ =gUnknown_0842F790\n\ + mov r9, r5\n\ +_0814A99E:\n\ + lsls r0, r3, 16\n\ + asrs r3, r0, 16\n\ + cmp r3, 0x1F\n\ + ble _0814A9D8\n\ + mov r6, r12\n\ + ldr r0, [r6]\n\ + ldr r1, [r6, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + lsls r0, r2, 16\n\ + movs r1, 0x80\n\ + lsls r1, 14\n\ + adds r0, r1\n\ + lsrs r2, r0, 16\n\ + ldr r3, [sp]\n\ + lsls r5, r3, 16\n\ + b _0814AA24\n\ + .align 2, 0\n\ +_0814A9C4: .4byte gMenuCursorSubsprites\n\ +_0814A9C8: .4byte 0x0000ffff\n\ +_0814A9CC: .4byte gUnknown_0842F780\n\ +_0814A9D0: .4byte gUnknown_0842F788\n\ +_0814A9D4: .4byte gUnknown_0842F790\n\ +_0814A9D8:\n\ + ldr r6, [sp]\n\ + lsls r5, r6, 16\n\ + mov r0, r8\n\ + cmp r0, 0x27\n\ + ble _0814AA0E\n\ + cmp r3, 0x8\n\ + ble _0814AA0E\n\ + mov r6, r12\n\ + ldr r0, [r6]\n\ + ldr r1, [r6, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + adds r2, r1, 0\n\ + subs r2, 0x20\n\ + adds r0, r3, 0\n\ + mov r6, r10\n\ + ands r0, r6\n\ + adds r2, r0\n\ + strh r2, [r4]\n\ + movs r0, 0x18\n\ + ands r0, r3\n\ + adds r1, r0\n\ + lsls r1, 16\n\ + lsrs r2, r1, 16\n\ + b _0814AA24\n\ +_0814AA0E:\n\ + mov r3, r9\n\ + ldr r0, [r3]\n\ + ldr r1, [r3, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + lsls r0, r2, 16\n\ + movs r6, 0x80\n\ + lsls r6, 12\n\ + adds r0, r6\n\ + lsrs r2, r0, 16\n\ +_0814AA24:\n\ + adds r4, 0x8\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + asrs r1, r5, 16\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + subs r1, r0\n\ + lsls r1, 16\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + cmp r1, 0x7\n\ + bgt _0814A99E\n\ +_0814AA3E:\n\ + ldr r5, _0814AAAC @ =gUnknown_0842F798\n\ + ldr r0, [r5]\n\ + ldr r1, [r5, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + subs r1, 0x7\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + adds r0, r1\n\ + strh r0, [r4]\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + ldr r6, _0814AAB0 @ =gUnknown_0203A3D0\n\ + ldrb r0, [r6]\n\ + cmp r0, 0x40\n\ + beq _0814AA7C\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0814AAB4 @ =gSprites\n\ + adds r2, r0, r1\n\ + lsls r1, r7, 3\n\ + ldr r0, _0814AAB8 @ =gSubspriteTables_842F5C0\n\ + adds r1, r0\n\ + adds r0, r2, 0\n\ + bl SetSubspriteTables\n\ +_0814AA7C:\n\ + ldr r1, _0814AABC @ =gUnknown_0203A3D1\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x40\n\ + beq _0814AA9C\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0814AAB4 @ =gSprites\n\ + adds r2, r0, r1\n\ + lsls r1, r7, 3\n\ + ldr r0, _0814AAB8 @ =gSubspriteTables_842F5C0\n\ + adds r1, r0\n\ + adds r0, r2, 0\n\ + bl SetSubspriteTables\n\ +_0814AA9C:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0814AAAC: .4byte gUnknown_0842F798\n\ +_0814AAB0: .4byte gUnknown_0203A3D0\n\ +_0814AAB4: .4byte gSprites\n\ +_0814AAB8: .4byte gSubspriteTables_842F5C0\n\ +_0814AABC: .4byte gUnknown_0203A3D1\n\ + .syntax divided\n"); +} +#endif + +void sub_814AABC(void (*callback)(struct Sprite *)) +{ + struct Sprite *spr; + + if (gUnknown_0203A3D0 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D0]; + spr->callback = callback; + } + + if (gUnknown_0203A3D1 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D1]; + spr->callback = callback; + } + + return; +} + +void sub_814AAF8(u16 a1) +{ + struct Sprite *spr; + u8 v2; + u8 v3; + u16 v4; + + if (gUnknown_0203A3D0 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D0]; + if (spr->template->paletteTag == 0xFFFF) + { + for (v2 = 0, v3 = 0xF, v4 = 0; v4 <= 0xFF; v4++) + { + if (gPlttBufferUnfaded[v4] == a1) + { + v2 = v4 >> 4; + v3 = v4 & 0xF; + } + } + spr->oam.paletteNum = v2; + RequestSpriteSheetCopy(&gUnknown_0842F140[v3 & 0xF]); + } + } + return; +} + +void sub_814AB84(void) +{ + struct Sprite *spr; + + if (gUnknown_0203A3D1 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D1]; + FreeSpriteOamMatrix(spr); + DestroySprite(spr); + gUnknown_0203A3D1 = 0x40; + + if (!gUnknown_0203A3D3) + REG_DISPCNT &= ~DISPCNT_OBJWIN_ON; + *(u8 *)(REG_ADDR_WINOUT + 1) = gUnknown_0203A3D4; + } + return; +} + +void unref_sub_814ABE4(int a1) +{ + struct Sprite *spr; + + CpuCopy16(gUnknown_0842F5BC[a1], &gMenuCursorSubsprites, 80); + + if (gUnknown_0203A3D0 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D0]; + SetSubspriteTables(spr, &gUnknown_0842F758[a1]); + } + if (gUnknown_0203A3D1 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D1]; + SetSubspriteTables(spr, &gUnknown_0842F758[a1]); + } + return; +} + +u8 CreateBlendedOutlineCursor(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5) +{ + int v8; + struct Sprite *spr; + u8 var1 = gUnknown_0203A3D2; + + if (var1 != 0x40) + sub_814AD44(); + + v8 = 1; + + if (a2 == 0xFFFF) + { + gUnknown_0203A360[a3 & 0xF] = a4; + if (LoadSpritePalette(&gUnknown_0842F248) != 0xFF ) + { + a2 = 0xFFF1; + v8 = 0; + } + } + + LoadSpriteSheetDeferred(&gUnknown_0842F1C0[a3 & 0xF]); +#if ENGLISH + gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 160, a1); +#elif GERMAN + gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 161, a1); +#endif + + if (gUnknown_0203A3D2 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D2]; + + if (a2 == 0xFFFF) + spr->oam.paletteNum = 0; + else + spr->oam.paletteNum = IndexOfSpritePaletteTag(a2); + } + sub_814ADF4(a5); + + return gUnknown_0203A3D2; +} + +void sub_814AD44(void) +{ + if (gUnknown_0203A3D2 != 0x40) + { + LoadTilesForSpriteSheet(&gUnknown_0842F1C0[0]); + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203A3D2]); + gUnknown_0203A3D2 = 0x40; + } + return; +} + +void sub_814AD7C(u8 a1, u8 a2) +{ + struct Sprite *spr; + if (gUnknown_0203A3D2 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D2]; + spr->invisible = 0; + spr->centerToCornerVecX = 0; + spr->centerToCornerVecY = 0; + spr->pos1.x = a1; + spr->pos1.y = a2; + } + return; +} + +void sub_814ADC8() +{ + struct Sprite *spr; + if (gUnknown_0203A3D2 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D2]; + spr->invisible = 1; + } + return; +} + +void sub_814ADF4(u8 a1) +{ + if (a1 > 0x12) + a1 = 0; + + if (gUnknown_0203A3D2 != 0x40) + SetSubspriteTables(&gSprites[gUnknown_0203A3D2], &gSubspriteTables_842F6C0[a1]); + return; +} + +#if GERMAN +void nullsub_814B200(void) +{ +} +#endif diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c new file mode 100644 index 000000000..46b76fd88 --- /dev/null +++ b/src/engine/mystery_event_menu.c @@ -0,0 +1,341 @@ +#include "global.h" +#include "mystery_event_menu.h" +#include "link.h" +#include "main.h" +#include "menu.h" +#include "mystery_event_script.h" +#include "palette.h" +#include "save.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "text.h" + +extern u8 unk_2000000[]; + +static EWRAM_DATA u8 gUnknown_02039338 = 0; + +static void VBlankCB(void); +static bool8 CheckLanguageMatch(void); +static bool8 GetEventLoadMessage(u8 *dest, u32 status); +static void CB2_MysteryEventMenu(void); + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static bool8 CheckLanguageMatch(void) +{ + bool8 val = FALSE; + + if (gLinkPlayers[0].language == gLinkPlayers[1].language) + val = TRUE; + + return val; +} + +void CB2_InitMysteryEventMenu(void) +{ + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + SetVBlankCallback(VBlankCB); + SetUpWindowConfig(&gWindowConfig_81E6CE4); + InitMenuWindow(&gWindowConfig_81E6CE4); + MenuZeroFillScreen(); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; + REG_BLDCNT = 0; + CreateTask(Task_DestroySelf, 0); + StopMapMusic(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + FillPalette(0, 0, 2); + SetMainCallback2(CB2_MysteryEventMenu); +} + +static bool8 GetEventLoadMessage(u8 *dest, u32 status) +{ + bool8 retVal = 1; + + if (status == 0) + { + StringCopy(dest, gSystemText_EventLoadSuccess); + retVal = 0; + } + + if (status == 2) + retVal = 0; + + if (status == 1) + StringCopy(dest, gSystemText_LoadingError); + + return retVal; +} + +static void CB2_MysteryEventMenu(void) +{ + u16 unkVal; + + switch (gMain.state) + { + case 0: + MenuDrawTextWindow(0, 14, 29, 19); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); + gMain.state++; + break; + case 1: + if (gPaletteFade.active) + break; + sub_8072044(gSystemText_LinkStandby); + gMain.state++; + break; + case 2: + if (MenuUpdateWindowText()) + { + gMain.state++; + gLinkType = 21761; + OpenLink(); + } + break; + case 3: + if ((gLinkStatus & 0x20) && (gLinkStatus & 0x1C) > 4) + { + PlaySE(SE_PIN); + sub_8072044(gSystemText_LoadEventPressA); + gMain.state++; + } + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + CloseLink(); + gMain.state = 15; + } + break; + case 4: + if (MenuUpdateWindowText()) + gMain.state++; + break; +#ifdef NONMATCHING + case 5: + if (GetLinkPlayerCount_2() != 2) + { + GetEventLoadMessage(gStringVar4, 1); + sub_8072044(gStringVar4); + gMain.state = 13; + break; + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_8007F4C(); + MenuDrawTextWindow(6, 5, 23, 8); + MenuPrint(gSystemText_LoadingEvent, 7, 6); + gMain.state++; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + CloseLink(); + gMain.state = 15; + } + break; + case 6: + if (IsLinkConnectionEstablished()) + { + if (!gReceivedRemoteLinkPlayers) + break; + + if (GetLinkPlayerDataExchangeStatusTimed() == 3) + { + sub_800832C(); + MenuZeroFillWindowRect(6, 5, 23, 8); + GetEventLoadMessage(gStringVar4, 1); + sub_8072044(gStringVar4); + gMain.state = 13; + break; + } + else if (CheckLanguageMatch()) + { + sub_8072044(gSystemText_DontCutLink); + gMain.state++; + break; + } + else + { + CloseLink(); + MenuZeroFillWindowRect(6, 5, 23, 8); + GetEventLoadMessage(gStringVar4, 1); + sub_8072044(gStringVar4); + gMain.state = 13; + break; + } + } + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + CloseLink(); + gMain.state = 15; + break; + } + break; +#else + case 5: + if (GetLinkPlayerCount_2() != 2) + { + goto label; + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_8007F4C(); + MenuDrawTextWindow(6, 5, 23, 8); + MenuPrint(gSystemText_LoadingEvent, 7, 6); + gMain.state++; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + CloseLink(); + gMain.state = 15; + } + break; + case 6: + if (IsLinkConnectionEstablished()) + { + register u8 *ptr asm("r0"); + register u32 offset1 asm("r2"); + register u32 offset2 asm("r1"); + + if (!gReceivedRemoteLinkPlayers) + break; + + if (GetLinkPlayerDataExchangeStatusTimed() == 3) + { + sub_800832C(); + MenuZeroFillWindowRect(6, 5, 23, 8); + GetEventLoadMessage(gStringVar4, 1); + sub_8072044(gStringVar4); + ptr = (u8 *)&gMain; + offset1 = offsetof(struct Main, state); + asm("" ::: "r1"); + ptr += offset1; + *ptr = 13; + } + else if (CheckLanguageMatch()) + { + register u8 *ptr2 asm("r1"); + register int offset3 asm("r0"); + register int dummy asm("r2"); + sub_8072044(gSystemText_DontCutLink); + ptr2 = (u8 *)&gMain; + offset3 = offsetof(struct Main, state); + if (dummy) + dummy++; + ptr2 += offset3; + (*ptr2)++; + break; + } + else + { + CloseLink(); + MenuZeroFillWindowRect(6, 5, 23, 8); + label: + GetEventLoadMessage(gStringVar4, 1); + sub_8072044(gStringVar4); + ptr = (u8 *)&gMain; + offset2 = offsetof(struct Main, state); + ptr += offset2; + *ptr = 13; + } + break; + } + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + CloseLink(); + gMain.state = 15; + break; + } + break; +#endif + case 7: + if (MenuUpdateWindowText()) + gMain.state++; + break; + case 8: + if (GetBlockReceivedStatus()) + { + ResetBlockReceivedFlags(); + gMain.state++; + } + break; + case 9: + gMain.state++; + break; + case 10: + sub_800832C(); + gMain.state++; + break; + case 11: + if (gReceivedRemoteLinkPlayers) + break; + unkVal = RunMysteryEventScript(unk_2000000); + CpuFill32(0, unk_2000000, 0x7D4); + if (!GetEventLoadMessage(gStringVar4, unkVal)) + TrySavingData(NORMAL_SAVE); + gMain.state++; + break; + case 12: + sub_8072044(gStringVar4); + gMain.state++; + break; + case 13: + MenuZeroFillWindowRect(6, 5, 23, 8); + if (MenuUpdateWindowText()) + { + gMain.state++; + gUnknown_02039338 = 0; + } + break; + case 14: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gMain.state++; + } + break; + case 15: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + gMain.state++; + break; + case 16: + if (!gPaletteFade.active) + DoSoftReset(); + break; + } + + if (gLinkStatus & 0x40) + { + if (!IsLinkMaster()) + { + CloseLink(); + MenuZeroFillWindowRect(6, 5, 23, 8); + GetEventLoadMessage(gStringVar4, 1); + sub_8072044(gStringVar4); + gMain.state = 13; + } + } + + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} diff --git a/src/engine/mystery_event_script.c b/src/engine/mystery_event_script.c new file mode 100644 index 000000000..f507942a7 --- /dev/null +++ b/src/engine/mystery_event_script.c @@ -0,0 +1,462 @@ +#include "global.h" +#include "berry.h" +#include "easy_chat.h" +#include "event_data.h" +#include "mail_data.h" +#include "mystery_event_script.h" +#include "pokedex.h" +#include "pokemon.h" +#include "pokemon_size_record.h" +#include "script.h" +#include "species.h" +#include "strings.h" +#include "string_util.h" +#include "text.h" +#include "util.h" + +#if ENGLISH +#define LANGUAGE_MASK 0x2 +#elif GERMAN +#define LANGUAGE_MASK 0x4 +#endif + +#ifdef SAPPHIRE +#define VERSION_MASK 0x100 +#else +#define VERSION_MASK 0x80 +#endif + +extern void party_compaction(void); +extern void sub_813601C(void); + +extern ScrCmdFunc gMysteryEventScriptCmdTable[]; +extern ScrCmdFunc gMysteryEventScriptCmdTableEnd[]; + +extern const u8 gOtherText_BerryObtainedDadHasIt[]; +extern const u8 gOtherText_BerryTransformed[]; +extern const u8 gOtherText_BerryAlreadyObtained[]; +extern const u8 gOtherText_SpecialRibbonReceived[]; +extern const u8 gOtherText_DexUpgraded[]; +extern const u8 gOtherText_RareWordAdded[]; +extern const u8 gOtherText_PokeWasSentOver[]; +extern const u8 gOtherText_PartyIsFull[]; +extern const u8 gOtherText_NewTrainerInHoenn[]; +extern const u8 gOtherText_DataCannotUseVersion[]; + +static EWRAM_DATA struct ScriptContext sMysteryEventScriptContext = {0}; + +static bool32 CheckCompatibility(u16 a1, u32 a2, u16 a3, u32 a4) +{ + if (!(a1 & LANGUAGE_MASK)) + return FALSE; + + if (!(a2 & LANGUAGE_MASK)) + return FALSE; + + if (!(a3 & 0x4)) + return FALSE; + + if (!(a4 & VERSION_MASK)) + return FALSE; + + return TRUE; +} + +static void SetIncompatible(void) +{ + StringExpandPlaceholders(gStringVar4, gOtherText_DataCannotUseVersion); + SetMysteryEventScriptStatus(3); +} + +static void InitMysteryEventScript(struct ScriptContext *ctx, u8 *script) +{ + InitScriptContext(ctx, gMysteryEventScriptCmdTable, gMysteryEventScriptCmdTableEnd); + SetupBytecodeScript(ctx, script); + ctx->data[0] = (u32)script; + ctx->data[1] = 0; + ctx->data[2] = 0; + ctx->data[3] = 0; +} + +static bool32 RunMysteryEventScriptCommand(struct ScriptContext *ctx) +{ + if (RunScriptCommand(ctx) && ctx->data[3]) + return TRUE; + else + return FALSE; +} + +u32 RunMysteryEventScript(u8 *script) +{ + struct ScriptContext *ctx = &sMysteryEventScriptContext; + InitMysteryEventScript(ctx, script); + while (RunMysteryEventScriptCommand(ctx)) + ; + return ctx->data[2]; +} + +void SetMysteryEventScriptStatus(u32 val) +{ + sMysteryEventScriptContext.data[2] = val; +} + +static int CalcChecksum(u8 *data, int size) +{ + unsigned int i; + int sum = 0; + + for (i = 0; i < size; i++) + sum += data[i]; + + return sum; +} + +static u32 GetWord(u8 *ptr) +{ + return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); +} + +static void SetWord(u8 *ptr, u32 val) +{ + ptr[0] = val; + ptr[1] = val >> 8; + ptr[2] = val >> 16; + ptr[3] = val >> 24; +} + +bool8 unref_sub_81261B4(u8 *a1, int a2) +{ + if (a1[0x0] == 1 && a1[0x11] == 15 && !GetWord(a1 + 0x12)) + { + int v4 = GetWord(a1 + 0x16) - a2 + (int)a1; + int v5 = GetWord(a1 + 0x1A); + int v6 = CalcChecksum((u8*)v4, v5 - a2 + (int)a1 - v4); + SetWord(a1 + 0x12, v6); + return TRUE; + } + + return FALSE; +} + +bool8 unref_sub_812620C(u8 *a1, int a2) +{ + if (a1[0x0] == 1 && a1[0x11] == 16 && !GetWord(a1 + 0x12)) + { + int v4 = GetWord(a1 + 0x16) - a2 + (int)a1; + int v5 = GetWord(a1 + 0x1A); + int v6 = CalcCRC16((u8*)v4, v5 - a2 + (int)a1 - v4); + SetWord(a1 + 0x12, v6); + return TRUE; + } + + return FALSE; +} + +static u32 CalcRecordMixingGiftChecksum(void) +{ + u32 sum = 0; + int i; + char *data = (char *)&gSaveBlock1.recordMixingGift.data; + + for (i = 0; i < sizeof(gSaveBlock1.recordMixingGift.data); i++) + { + sum += data[i]; + } + + return sum; +} + +static bool32 IsRecordMixingGiftValid(void) +{ + struct RecordMixingGiftData *data = &gSaveBlock1.recordMixingGift.data; + + u32 checksum = CalcRecordMixingGiftChecksum(); + + if (!data->unk0) + return FALSE; + + if (!data->quantity) + return FALSE; + + if (!data->itemId) + return FALSE; + + if (checksum == 0) + return FALSE; + + if (checksum == gSaveBlock1.recordMixingGift.checksum) + return TRUE; + else + return FALSE; +} + +static void ClearRecordMixingGift(void) +{ + CpuFill16(0, &gSaveBlock1.recordMixingGift, sizeof(gSaveBlock1.recordMixingGift)); +} + +static void SetRecordMixingGift(u8 unk, u8 quantity, u16 itemId) +{ + if (!unk || !quantity || !itemId) + { + ClearRecordMixingGift(); + } + else + { + gSaveBlock1.recordMixingGift.data.unk0 = unk; + gSaveBlock1.recordMixingGift.data.quantity = quantity; + gSaveBlock1.recordMixingGift.data.itemId = itemId; + gSaveBlock1.recordMixingGift.checksum = CalcRecordMixingGiftChecksum(); + } +} + +u16 GetRecordMixingGift(void) +{ + struct RecordMixingGiftData *data = &gSaveBlock1.recordMixingGift.data; + + if (!IsRecordMixingGiftValid()) + { + ClearRecordMixingGift(); + return 0; + } + else + { + u16 itemId = data->itemId; + data->quantity--; + if (data->quantity == 0) + ClearRecordMixingGift(); + else + gSaveBlock1.recordMixingGift.checksum = CalcRecordMixingGiftChecksum(); + return itemId; + } +} + +bool8 MEScrCmd_end(struct ScriptContext *ctx) +{ + StopScript(ctx); + return TRUE; +} + +bool8 MEScrCmd_checkcompat(struct ScriptContext *ctx) +{ + u16 v1; + u32 v2; + u16 v3; + u32 v4; + + ctx->data[1] = ScriptReadWord(ctx); + v1 = ScriptReadHalfword(ctx); + v2 = ScriptReadWord(ctx); + v3 = ScriptReadHalfword(ctx); + v4 = ScriptReadWord(ctx); + + if (CheckCompatibility(v1, v2, v3, v4) == TRUE) + ctx->data[3] = 1; + else + SetIncompatible(); + + return TRUE; +} + +bool8 MEScrCmd_nop(struct ScriptContext *ctx) +{ + return FALSE; +} + +bool8 MEScrCmd_setstatus(struct ScriptContext *ctx) +{ + u8 value = ScriptReadByte(ctx); + ctx->data[2] = value; + return FALSE; +} + +bool8 MEScrCmd_setmsg(struct ScriptContext *ctx) +{ + u8 value = ScriptReadByte(ctx); + u8 *str = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + if (value == 255 || value == ctx->data[2]) + StringExpandPlaceholders(gStringVar4, str); + return FALSE; +} + +bool8 MEScrCmd_runscript(struct ScriptContext *ctx) +{ + u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + ScriptContext2_RunNewScript(script); + return FALSE; +} + +bool8 MEScrCmd_setenigmaberry(struct ScriptContext *ctx) +{ + u8 *str; + const u8 *message; + bool32 haveBerry = IsEnigmaBerryValid(); + u8 *berry = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + StringCopyN(gStringVar1, gSaveBlock1.enigmaBerry.berry.name, 7); + SetEnigmaBerry(berry); + StringCopyN(gStringVar2, gSaveBlock1.enigmaBerry.berry.name, 7); + + if (!haveBerry) + { + str = gStringVar4; + message = gOtherText_BerryObtainedDadHasIt; + } + else if (StringCompare(gStringVar1, gStringVar2)) + { + str = gStringVar4; + message = gOtherText_BerryTransformed; + } + else + { + str = gStringVar4; + message = gOtherText_BerryAlreadyObtained; + } + + StringExpandPlaceholders(str, message); + + ctx->data[2] = 2; + + if (IsEnigmaBerryValid() == TRUE) + VarSet(0x402D, 1); + else + ctx->data[2] = 1; + + return FALSE; +} + +bool8 MEScrCmd_giveribbon(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + u8 ribbonId = ScriptReadByte(ctx); + GiveGiftRibbonToParty(index, ribbonId); + StringExpandPlaceholders(gStringVar4, gOtherText_SpecialRibbonReceived); + ctx->data[2] = 2; + return FALSE; +} + +bool8 MEScrCmd_initramscript(struct ScriptContext *ctx) +{ + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 objectId = ScriptReadByte(ctx); + u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + u8 *scriptEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + InitRamScript(script, scriptEnd - script, mapGroup, mapNum, objectId); + return FALSE; +} + +bool8 MEScrCmd_givenationaldex(struct ScriptContext *ctx) +{ + EnableNationalPokedex(); + StringExpandPlaceholders(gStringVar4, gOtherText_DexUpgraded); + ctx->data[2] = 2; + return FALSE; +} + +bool8 MEScrCmd_addrareword(struct ScriptContext *ctx) +{ + sub_80EB890(ScriptReadByte(ctx)); + StringExpandPlaceholders(gStringVar4, gOtherText_RareWordAdded); + ctx->data[2] = 2; + return FALSE; +} + +bool8 MEScrCmd_setrecordmixinggift(struct ScriptContext *ctx) +{ + u8 unk = ScriptReadByte(ctx); + u8 quantity = ScriptReadByte(ctx); + u16 itemId = ScriptReadHalfword(ctx); + SetRecordMixingGift(unk, quantity, itemId); + return FALSE; +} + +bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) +{ + struct MailStruct mail; + struct Pokemon pokemon; + u16 species; + u16 heldItem; + u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; + void *pokemonPtr = (void *)data; + void *mailPtr = (void *)(data + sizeof(struct Pokemon)); + + pokemon = *(struct Pokemon *)pokemonPtr; + species = GetMonData(&pokemon, MON_DATA_SPECIES2); + + if (species == SPECIES_EGG) + StringCopyN(gStringVar1, gSystemText_Egg, 11); + else + StringCopyN(gStringVar1, gSystemText_Pokemon2, 11); + + if (gPlayerPartyCount == 6) + { + StringExpandPlaceholders(gStringVar4, gOtherText_PartyIsFull); + ctx->data[2] = 3; + } + else + { + memcpy(&gPlayerParty[5], pokemonPtr, sizeof(struct Pokemon)); + memcpy(&mail, mailPtr, sizeof(struct MailStruct)); + + if (species != SPECIES_EGG) + { + u16 pokedexNum = SpeciesToNationalPokedexNum(species); + GetNationalPokedexFlag(pokedexNum, 2); + GetNationalPokedexFlag(pokedexNum, 3); + } + + heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM); + if (ItemIsMail(heldItem)) + GiveMailToMon2(&gPlayerParty[5], &mail); + party_compaction(); + CalculatePlayerPartyCount(); + StringExpandPlaceholders(gStringVar4, gOtherText_PokeWasSentOver); + ctx->data[2] = 2; + } + + return FALSE; +} + +bool8 MEScrCmd_addtrainer(struct ScriptContext *ctx) +{ + u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; + memcpy(gSaveBlock2.filler_A8.ereaderTrainer, (void *)data, sizeof(gSaveBlock2.filler_A8.ereaderTrainer)); + sub_813601C(); + StringExpandPlaceholders(gStringVar4, gOtherText_NewTrainerInHoenn); + ctx->data[2] = 2; + return FALSE; +} + +bool8 MEScrCmd_enableresetrtc(struct ScriptContext *ctx) +{ + EnableResetRTC(); + StringExpandPlaceholders(gStringVar4, gSystemText_ClockAdjustmentUsable); + ctx->data[2] = 2; + return FALSE; +} + +bool8 MEScrCmd_checksum(struct ScriptContext *ctx) +{ + int checksum = ScriptReadWord(ctx); + u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + if (checksum != CalcChecksum(data, dataEnd - data)) + { + ctx->data[3] = 0; + ctx->data[2] = 1; + } + return TRUE; +} + +bool8 MEScrCmd_crc(struct ScriptContext *ctx) +{ + int crc = ScriptReadWord(ctx); + u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + if (crc != CalcCRC16(data, dataEnd - data)) + { + ctx->data[3] = 0; + ctx->data[2] = 1; + } + return TRUE; +} diff --git a/src/engine/name_string_util.c b/src/engine/name_string_util.c new file mode 100644 index 000000000..f1a935453 --- /dev/null +++ b/src/engine/name_string_util.c @@ -0,0 +1,40 @@ +#include "global.h" +#include "name_string_util.h" +#include "string_util.h" +#include "text.h" + +void PadNameString(u8 *a1, u8 a2) +{ + u8 i; + + StripExtCtrlCodes(a1); + i = StringLength(a1); + + if (a2 == 0xFC) + { + while (i < 6) + { + a1[i] = 0xFC; + a1[i + 1] = 7; + i += 2; + } + } + else + { + while (i < 6) + { + a1[i] = a2; + i++; + } + } + + a1[i] = EOS; +} + +void SanitizeNameString(u8 *a1) +{ + if (StringLength(a1) < 6) + ConvertInternationalString(a1, 1); + else + StripExtCtrlCodes(a1); +} diff --git a/src/engine/naming_screen.c b/src/engine/naming_screen.c new file mode 100644 index 000000000..6c107f022 --- /dev/null +++ b/src/engine/naming_screen.c @@ -0,0 +1,2038 @@ +#include "global.h" +#include "naming_screen.h" +#include "data2.h" +#include "field_effect.h" +#include "field_map_obj.h" +#include "field_player_avatar.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "pokemon_icon.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "text.h" +#include "trig.h" +#include "util.h" + +#ifdef ENGLISH +#define COLUMN_COUNT 9 +#elif GERMAN +#define COLUMN_COUNT 10 +#endif + +extern u16 gKeyRepeatStartDelay; + +extern u8 unk_2000000[]; + +#define namingScreenData (*(struct NamingScreenData *)(unk_2000000)) + +const u32 gSpriteImage_83CE094[] = INCBIN_U32("graphics/naming_screen/pc_icon/0.4bpp"); +const u32 gSpriteImage_83CE154[] = INCBIN_U32("graphics/naming_screen/pc_icon/1.4bpp"); + +//Some unused pointer, perhaps. +asm(".section .rodata\n\ +@ XXX: what is this?\n\ + .align 2\n\ + .4byte 0x2000000\n"); + +extern u16 *const gUnknown_083CE28C[]; +extern const struct SubspriteTable gSubspriteTables_83CE558[]; +extern const struct SubspriteTable gSubspriteTables_83CE560[]; +extern const struct SubspriteTable gSubspriteTables_83CE578[]; +extern const struct SubspriteTable gSubspriteTables_83CE580[]; +extern const struct SpriteTemplate gSpriteTemplate_83CE5C8; +extern const struct SpriteTemplate gSpriteTemplate_83CE5E0; +extern const struct SpriteTemplate gSpriteTemplate_83CE5F8; +extern const struct SpriteTemplate gSpriteTemplate_83CE610; +extern const struct SpriteTemplate gSpriteTemplate_83CE628; +extern const struct SpriteTemplate gSpriteTemplate_83CE640; +extern const struct SpriteTemplate gSpriteTemplate_83CE658; +extern const struct SpriteTemplate gSpriteTemplate_83CE670; +extern const struct SpriteTemplate gSpriteTemplate_83CE688; +extern const struct SpriteSheet gUnknown_083CE6A0[]; +extern const struct SpritePalette gUnknown_083CE708[]; +extern const u8 gNamingScreenMenu_Gfx[]; +extern const u16 gNamingScreenPalettes[]; +extern const u16 gUnknown_083CE748[]; +extern const u16 gUnknown_083CEBF8[]; +extern const u16 gUnknown_083CF0A8[]; +extern const u16 gUnknown_08E86258[]; + +static void C2_NamingScreen(void); +static void sub_80B5AA0(void); +static void StoreNamingScreenParameters(u8, u8 *, u16, u16, u32, MainCallback); +static void NamingScreen_TurnOffScreen(void); +static void NamingScreen_Init(void); +static void NamingScreen_ClearVram(void); +static void NamingScreen_ClearOam(void); +static void NamingScreen_SetUpVideoRegs(void); +static void NamingScreen_SetUpWindow(void); +static void NamingScreen_ResetObjects(void); +static void sub_80B5DFC(void); +static void sub_80B5E20(void); +static void sub_80B5E3C(void); +static void NamingScreen_InitDisplayMode(void); +static void Task_DoNothing(u8); +static void sub_80B7558(void); +static void sub_80B753C(void); +static void sub_80B7680(void); +static void sub_80B75C4(void); +static void sub_80B7794(void); +static void sub_80B78A8(void); +static void sub_80B7960(void); +static void CursorInit(void); +static void sub_80B6A80(void); +static void sub_80B6CA8(void); +static void sub_80B6D04(void); +static void sub_80B6E44(void); +static void InputInit(void); +static void sub_80B6438(void); +static void sub_80B5E50(void); +static void Task_NamingScreenMain(u8); +static void SetInputState(u8); +static void sub_80B68D8(u8); +static bool8 HandleKeyboardEvent(void); +static bool8 IsCursorAnimFinished(void); +static void MoveCursorToOKButton(void); +static void sub_80B6B14(void); +static void StartPageSwapAnim(void); +static void sub_80B6888(u8); +static void sub_80B6460(u8, u8, u8); +static bool8 IsPageSwapAnimNotInProgress(void); +static void sub_80B7614(void); +static void GetCursorPos(s16 *, s16 *); +static void SetCursorPos(s16, s16); +static void sub_80B77F8(void); +static void sub_80B74B0(void); +static void DisplaySentToPCMessage(void); +static u8 GetKeyRoleAtCursorPos(void); +static u8 sub_80B61C8(void); +static void DeleteTextCharacter(void); +static void sub_80B7090(void); +static u8 GetInputEvent(void); +static bool8 sub_80B7004(void); +static void sub_80B6914(void); +static void Task_HandlePageSwapAnim(u8); +static void sub_80B6C48(u8, struct Sprite *, struct Sprite *); +static u8 GetTextCaretPosition(void); +static u8 GetCharAtKeyboardPos(s16, s16); +static bool8 sub_80B7104(void); +static bool8 sub_80B713C(void); +static void AddTextCharacter(u8); +static bool8 sub_80B7198(u8); +static bool8 sub_80B7264(u8); +static void sub_80B7370(u8, u8); +static void sub_80B73CC(u8, u8); +static bool8 sub_80B71E4(u8); +static void sub_80B7474(u8, u8); +static void sub_80B72A4(u8, u8); +static bool8 sub_80B720C(u8); +static void sub_80B7568(void); +static void sub_80B75B0(void); +static void sub_80B7698(u16 *, const u16 *); +static void sub_80B76E0(); +static void nullsub_20(u8, u8); +static void PrintKeyboardCharacters(u8); + +void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +{ + StoreNamingScreenParameters(templateNum, destBuffer, c, d, e, returnCallback); + SetMainCallback2(C2_NamingScreen); +} + +static void C2_NamingScreen(void) +{ + switch (gMain.state) + { + case 0: + NamingScreen_TurnOffScreen(); + NamingScreen_Init(); + gMain.state++; + break; + case 1: + NamingScreen_ClearVram(); + gMain.state++; + break; + case 2: + NamingScreen_ClearOam(); + gMain.state++; + break; + case 3: + NamingScreen_SetUpVideoRegs(); + gMain.state++; + break; + case 4: + NamingScreen_SetUpWindow(); + gMain.state++; + break; + case 5: + NamingScreen_ResetObjects(); + gMain.state++; + break; + case 6: + sub_80B5DFC(); + gMain.state++; + break; + case 7: + sub_80B5E20(); + sub_80B5E3C(); + NamingScreen_InitDisplayMode(); + SetMainCallback2(sub_80B5AA0); + break; + } +} + +static void sub_80B5AA0(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void VBlankCB_NamingScreen(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + REG_BG1VOFS = namingScreenData.bg1vOffset; + REG_BG2VOFS = namingScreenData.bg2vOffset; + REG_BG1CNT &= 0xFFFC; + REG_BG1CNT |= namingScreenData.unk8; + REG_BG2CNT &= 0xFFFC; + REG_BG2CNT |= namingScreenData.unkA; +} + +static void StoreNamingScreenParameters(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +{ + struct Task *task; + + //Create a task that does nothing, and use it as a temporary space to store parameters + task = &gTasks[CreateTask(Task_DoNothing, 0xFF)]; + task->data[0] = templateNum; + task->data[1] = c; + task->data[2] = d; + task->data[3] = e >> 16; + task->data[4] = e; + StoreWordInTwoHalfwords(&task->data[5], (u32)destBuffer); + StoreWordInTwoHalfwords(&task->data[7], (u32)returnCallback); +} + +static void GetNamingScreenParameters(void) +{ + u8 taskId; + struct Task *task; + + taskId = FindTaskIdByFunc(Task_DoNothing); + task = &gTasks[taskId]; + namingScreenData.templateNum = task->data[0]; + namingScreenData.unk3E = task->data[1]; + namingScreenData.unk40 = task->data[2]; + namingScreenData.unk42 = (task->data[3] << 16) | (u16)task->data[4]; + LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&namingScreenData.destBuffer); + LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&namingScreenData.returnCallback); + DestroyTask(taskId); +} + +static void Task_DoNothing(u8 taskId) +{ +} + +static void NamingScreen_TurnOffScreen(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + REG_DISPCNT = 0; +} + +static void NamingScreen_InitDisplayMode(void) +{ + u16 savedIme; + + SetVBlankCallback(VBlankCB_NamingScreen); + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; +} + +static void NamingScreen_ClearVram(void) +{ + u8 *addr = (void *)VRAM; + u32 size = 0x10000; + + while (1) + { + DmaFill16(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaFill16(3, 0, addr, size); + break; + } + } +} + +static void NamingScreen_ClearOam(void) +{ + DmaClear16(3, (void *)OAM, 0x400); +} + +static void NamingScreen_SetUpVideoRegs(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_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(28) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(29) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(30) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BLDCNT = 0x640; + REG_BLDALPHA = 0x80C; +} + +static const struct NamingScreenTemplate *const sNamingScreenTemplates[]; //forward declaration + +static void NamingScreen_Init(void) +{ + GetNamingScreenParameters(); + namingScreenData.state = 0; + namingScreenData.bg1vOffset = 0; + namingScreenData.bg2vOffset = 0; + namingScreenData.unk8 = 1; + namingScreenData.unkA = 2; + namingScreenData.unkC = 0; + namingScreenData.unkD = 1; + namingScreenData.template = sNamingScreenTemplates[namingScreenData.templateNum]; + namingScreenData.currentPage = namingScreenData.template->unk4; + namingScreenData.unk2 = 14 - namingScreenData.template->maxChars / 2; + namingScreenData.unk3C = gKeyRepeatStartDelay; + memset(namingScreenData.textBuffer, 0xFF, sizeof(namingScreenData.textBuffer)); + if (namingScreenData.template->unk0 != 0) + StringCopy(namingScreenData.textBuffer, namingScreenData.destBuffer); + gKeyRepeatStartDelay = 16; +} + +static void NamingScreen_SetUpWindow(void) +{ + SetUpWindowConfig(&gWindowConfig_81E6E88); + InitMenuWindow(&gWindowConfig_81E6E88); +} + +static void NamingScreen_ResetObjects(void) +{ + ResetPaletteFade(); + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); +} + +static void sub_80B5DFC(void) +{ + sub_80B7558(); + sub_80B753C(); + sub_80B7680(); + sub_80B75C4(); + sub_80B7794(); + sub_80B78A8(); + sub_80B7960(); +} + +static void sub_80B5E20(void) +{ + CursorInit(); + sub_80B6A80(); + sub_80B6CA8(); + sub_80B6D04(); + sub_80B6E44(); +} + +static void sub_80B5E3C(void) +{ + InputInit(); + sub_80B6438(); + sub_80B5E50(); +} + +//-------------------------------------------------- +// Naming screen main +//-------------------------------------------------- + +static bool8 MainState_BeginFadeIn(struct Task *); +static bool8 MainState_WaitFadeIn(struct Task *); +static bool8 MainState_HandleInput(struct Task *); +static bool8 MainState_MoveToOKButton(struct Task *); +static bool8 MainState_StartPageSwap(struct Task *); +static bool8 MainState_WaitPageSwap(struct Task *); +static bool8 MainState_6(struct Task *); +static bool8 MainState_UpdateSentToPCMessage(struct Task *); +static bool8 MainState_BeginFadeInOut(struct Task *); +static bool8 MainState_WaitFadeOutAndExit(struct Task *); + +static bool8 (*const sMainStateFuncs[])(struct Task *) = +{ + MainState_BeginFadeIn, + MainState_WaitFadeIn, + MainState_HandleInput, + MainState_MoveToOKButton, + MainState_StartPageSwap, + MainState_WaitPageSwap, + MainState_6, + MainState_UpdateSentToPCMessage, + MainState_BeginFadeInOut, + MainState_WaitFadeOutAndExit, +}; + +static void sub_80B5E50(void) +{ + u8 taskId; + + taskId = CreateTask(Task_NamingScreenMain, 2); + Task_NamingScreenMain(taskId); +} + +static void Task_NamingScreenMain(u8 taskId) +{ + while (sMainStateFuncs[namingScreenData.state](&gTasks[taskId]) != 0) + ; +} + +static bool8 MainState_BeginFadeIn(struct Task *task) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + namingScreenData.state++; + return 0; +} + +static bool8 MainState_WaitFadeIn(struct Task *task) +{ + if (!gPaletteFade.active) + { + SetInputState(INPUT_STATE_ENABLED); + sub_80B68D8(1); + namingScreenData.state++; + } + return FALSE; +} + +static bool8 MainState_HandleInput(struct Task *task) +{ + return HandleKeyboardEvent(); +} + +static bool8 MainState_MoveToOKButton(struct Task *task) +{ + if (IsCursorAnimFinished()) + { + SetInputState(INPUT_STATE_ENABLED); + MoveCursorToOKButton(); + namingScreenData.state = MAIN_STATE_HANDLE_INPUT; + } + return FALSE; +} + +static bool8 MainState_StartPageSwap(struct Task *task) +{ + SetInputState(INPUT_STATE_DISABLED); + sub_80B6B14(); + StartPageSwapAnim(); + sub_80B6888(1); + sub_80B6460(0, 0, 1); + PlaySE(SE_WIN_OPEN); + namingScreenData.state = MAIN_STATE_WAIT_PAGE_SWAP; + return FALSE; +} + +static bool8 MainState_WaitPageSwap(struct Task *task) +{ + s16 cursorX; + s16 cursorY; + + if (IsPageSwapAnimNotInProgress()) + { + namingScreenData.state = MAIN_STATE_HANDLE_INPUT; + namingScreenData.currentPage++; + namingScreenData.currentPage %= 3; + sub_80B7614(); + sub_80B77F8(); + SetInputState(INPUT_STATE_ENABLED); + GetCursorPos(&cursorX, &cursorY); +#if ENGLISH + if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) + cursorX = 5; +#elif GERMAN + if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 7 || cursorX == 8)) + cursorX = 6; +#endif + SetCursorPos(cursorX, cursorY); + sub_80B6888(0); + } + return FALSE; +} + +static bool8 MainState_6(struct Task *task) +{ + sub_80B74B0(); + SetInputState(INPUT_STATE_DISABLED); + sub_80B68D8(0); + sub_80B6460(3, 0, 1); + gKeyRepeatStartDelay = namingScreenData.unk3C; + if (namingScreenData.templateNum == NAMING_SCREEN_TEMPLATE_MON_NAME + && CalculatePlayerPartyCount() >= 6) + { + DisplaySentToPCMessage(); + namingScreenData.state = MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE; + return FALSE; + } + else + { + namingScreenData.state = MAIN_STATE_BEGIN_FADE_OUT; + return TRUE; //Exit the naming screen + } +} + +static bool8 MainState_UpdateSentToPCMessage(struct Task *task) +{ + if (MenuUpdateWindowText()) + namingScreenData.state++; + return FALSE; +} + +static bool8 MainState_BeginFadeInOut(struct Task *task) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + namingScreenData.state++; + return FALSE; +} + +static bool8 MainState_WaitFadeOutAndExit(struct Task *task) +{ + if (!gPaletteFade.active) + SetMainCallback2(namingScreenData.returnCallback); + return FALSE; +} + +//-------------------------------------------------- +// Keyboard handling +//-------------------------------------------------- + +enum +{ + KEY_ROLE_CHAR, + KEY_ROLE_PAGE, + KEY_ROLE_BACKSPACE, + KEY_ROLE_OK, +}; + + +static bool8 KeyboardKeyHandler_Character(u8); +static bool8 KeyboardKeyHandler_Page(u8); +static bool8 KeyboardKeyHandler_Backspace(u8); +static bool8 KeyboardKeyHandler_OK(u8); + +static bool8 (*const sKeyboardKeyHandlers[])(u8) = +{ + KeyboardKeyHandler_Character, + KeyboardKeyHandler_Page, + KeyboardKeyHandler_Backspace, + KeyboardKeyHandler_OK, +}; + +static bool8 HandleKeyboardEvent(void) +{ + u8 event = GetInputEvent(); + u8 keyRole = GetKeyRoleAtCursorPos(); + + if (event == KBEVENT_PRESSED_SELECT) + return sub_80B61C8(); + else if (event == KBEVENT_PRESSED_B) + { + DeleteTextCharacter(); + return FALSE; + } + else if (event == 7) + { + sub_80B7090(); + return FALSE; + } + return sKeyboardKeyHandlers[keyRole](event); +} + +static bool8 KeyboardKeyHandler_Character(u8 event) +{ + sub_80B6460(3, 0, 0); + if (event == KBEVENT_PRESSED_A) + { + u8 var = sub_80B7004(); + + sub_80B6914(); + if (var) + { + SetInputState(INPUT_STATE_DISABLED); + namingScreenData.state = MAIN_STATE_MOVE_TO_OK_BUTTON; + } + } + return FALSE; +} + +static bool8 KeyboardKeyHandler_Page(u8 event) +{ + sub_80B6460(0, 1, 0); + if (event == KBEVENT_PRESSED_A) + return sub_80B61C8(); + else + return FALSE; +} + +static bool8 KeyboardKeyHandler_Backspace(u8 event) +{ + sub_80B6460(1, 1, 0); + if (event == KBEVENT_PRESSED_A) + DeleteTextCharacter(); + return FALSE; +} + +static bool8 KeyboardKeyHandler_OK(u8 event) +{ + sub_80B6460(2, 1, 0); + if (event == KBEVENT_PRESSED_A) + { + PlaySE(SE_SELECT); + namingScreenData.state = MAIN_STATE_6; + return TRUE; + } + else + return FALSE; +} + +static bool8 sub_80B61C8(void) +{ + namingScreenData.state = MAIN_STATE_START_PAGE_SWAP; + return TRUE; +} + +//-------------------------------------------------- +// Input handling +//-------------------------------------------------- + +enum +{ + FNKEY_CASE, + FNKEY_BACK, + FNKEY_OK, +}; + +#define tState data[0] +#define tKeyboardEvent data[1] +#define tKbFunctionKey data[2] + +static void InputState_Disabled(struct Task *); +static void InputState_Enabled(struct Task *); + +static void (*const sInputStateFuncs[])(struct Task *) = +{ + InputState_Disabled, + InputState_Enabled, +}; + +static void Task_HandleInput(u8); +static void HandleDpadMovement(struct Task *); + +static void InputInit(void) +{ + CreateTask(Task_HandleInput, 1); +} + +static u8 GetInputEvent(void) +{ + u8 taskId = FindTaskIdByFunc(Task_HandleInput); + + return gTasks[taskId].tKeyboardEvent; +} + +static void SetInputState(u8 state) +{ + u8 taskId = FindTaskIdByFunc(Task_HandleInput); + + gTasks[taskId].tState = state; +} + +static void Task_HandleInput(u8 taskId) +{ + sInputStateFuncs[gTasks[taskId].tState](&gTasks[taskId]); +} + +static void InputState_Disabled(struct Task *task) +{ + task->tKeyboardEvent = 0; +} + +static void InputState_Enabled(struct Task *task) +{ + task->tKeyboardEvent = 0; + if (gMain.newKeys & A_BUTTON) + { + task->tKeyboardEvent = KBEVENT_PRESSED_A; + return; + } + if (gMain.newKeys & B_BUTTON) + { + task->tKeyboardEvent = KBEVENT_PRESSED_B; + return; + } + if (gMain.newKeys & SELECT_BUTTON) + { + task->tKeyboardEvent = KBEVENT_PRESSED_SELECT; + return; + } + if (gMain.newKeys & START_BUTTON) + { + task->tKeyboardEvent = KBEVENT_PRESSED_START; + MoveCursorToOKButton(); + return; + } + HandleDpadMovement(task); +} + +static const s16 sDpadDeltaX[] = +{ + 0, //none + 0, //up + 0, //down + -1, //left + 1 //right +}; + +static const s16 sDpadDeltaY[] = +{ + 0, //none + -1, //up + 1, //down + 0, //left + 0 //right +}; + +static const s16 s4RowTo3RowTableY[] = {0, 1, 1, 2}; +static const s16 gUnknown_083CE274[] = {0, 0, 3, 0}; + +static void HandleDpadMovement(struct Task *task) +{ + s16 cursorX; + s16 cursorY; + u16 dpadDir; + s16 prevCursorX; + + GetCursorPos(&cursorX, &cursorY); + dpadDir = 0; + if (gMain.newAndRepeatedKeys & DPAD_UP) + dpadDir = 1; + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + dpadDir = 2; + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + dpadDir = 3; + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + dpadDir = 4; + + //Get new cursor position + prevCursorX = cursorX; + cursorX += sDpadDeltaX[dpadDir]; + cursorY += sDpadDeltaY[dpadDir]; + + //Wrap cursor position in the X direction + if (cursorX < 0) + cursorX = COLUMN_COUNT - 1; + if (cursorX > COLUMN_COUNT - 1) + cursorX = 0; + + //Handle cursor movement in X direction + if (sDpadDeltaX[dpadDir] != 0) + { + //The "others" page only has 5 columns +#if ENGLISH + if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) +#elif GERMAN + if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7 || cursorX == 8)) +#endif + { + if (sDpadDeltaX[dpadDir] > 0) + cursorX = COLUMN_COUNT - 1; + else + cursorX = 5; + } + + if (cursorX == COLUMN_COUNT - 1) + { + //We are now on the last column + task->tKbFunctionKey = cursorY; + cursorY = s4RowTo3RowTableY[cursorY]; + } + else if (prevCursorX == COLUMN_COUNT - 1) + { + if (cursorY == 1) + cursorY = task->tKbFunctionKey; + else + cursorY = gUnknown_083CE274[cursorY]; + } + } + + if (cursorX == COLUMN_COUNT - 1) + { + //There are only 3 keys on the last column, unlike the others, + //so wrap Y accordingly + if (cursorY < 0) + cursorY = 2; + if (cursorY > 2) + cursorY = 0; + if (cursorY == 0) + task->tKbFunctionKey = FNKEY_BACK; + else if (cursorY == 2) + task->tKbFunctionKey = FNKEY_OK; + } + else + { + if (cursorY < 0) + cursorY = 3; + if (cursorY > 3) + cursorY = 0; + } + SetCursorPos(cursorX, cursorY); +} + +#undef tState +#undef tKeyboardEvent +#undef tKbFunctionKey + +//-------------------------------------------------- +// +//-------------------------------------------------- + +static void Task_80B64D4(u8); +static u16 sub_80B654C(u8); +static void sub_80B65AC(u8); +static void sub_80B65D4(struct Task *, u8, u8); + +static void sub_80B6438(void) +{ + u8 taskId; + + taskId = CreateTask(Task_80B64D4, 3); + gTasks[taskId].data[0] = 3; +} + +static void sub_80B6460(u8 a, u8 b, u8 c) +{ + struct Task *task = &gTasks[FindTaskIdByFunc(Task_80B64D4)]; + + if (a == task->data[0] && c == 0) + { + task->data[1] = b; + task->data[2] = 1; + return; + } + if (a == 3 && task->data[1] == 0 && c == 0) + return; + if (task->data[0] != 3) + sub_80B65AC(task->data[0]); + sub_80B65D4(task, a, b); +} + +static void Task_80B64D4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (task->data[0] == 3 || task->data[2] == 0) + return; + MultiplyInvertedPaletteRGBComponents(sub_80B654C(task->data[0]), task->data[3], task->data[3], task->data[3]); + if (task->data[5] != 0) + { + task->data[5]--; + if (task->data[5] != 0) + return; + } + task->data[5] = 2; + task->data[3] += task->data[4]; + if (task->data[3] == 16) + task->data[4] = -task->data[4]; + else if (task->data[3] == 0) + { + task->data[2] = task->data[1]; + task->data[4] = -task->data[4]; + } +} + +static u16 sub_80B654C(u8 a) +{ + const u16 arr[] = + { + IndexOfSpritePaletteTag(4) * 16 + 0x10E, + IndexOfSpritePaletteTag(6) * 16 + 0x10C, + IndexOfSpritePaletteTag(6) * 16 + 0x10E, + }; + + return arr[a]; +} + +static void sub_80B65AC(u8 a) +{ + u16 index = sub_80B654C(a); + + gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; +} + +static void sub_80B65D4(struct Task *task, u8 b, u8 c) +{ + task->data[0] = b; + task->data[1] = c; + task->data[2] = 1; + task->data[3] = 15; + task->data[4] = 1; + task->data[5] = 0; +} + +//-------------------------------------------------- +// Page Swap +//-------------------------------------------------- + +#define tState data[0] +#define tFrameCount data[1] + +static bool8 PageSwapAnimState_Init(struct Task *); +static bool8 PageSwapAnimState_1(struct Task *); +static bool8 PageSwapAnimState_2(struct Task *); +static bool8 PageSwapAnimState_Done(struct Task *); + +static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) = +{ + PageSwapAnimState_Init, + PageSwapAnimState_1, + PageSwapAnimState_2, + PageSwapAnimState_Done, +}; + +static void StartPageSwapAnim(void) +{ + u8 taskId; + + taskId = CreateTask(Task_HandlePageSwapAnim, 0); + Task_HandlePageSwapAnim(taskId); +} + +static bool8 IsPageSwapAnimNotInProgress(void) +{ + if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == 0xFF) + return TRUE; + else + return FALSE; +} + +static void Task_HandlePageSwapAnim(u8 taskId) +{ + while (sPageSwapAnimStateFuncs[gTasks[taskId].tState](&gTasks[taskId]) != 0) + ; +} + +static bool8 PageSwapAnimState_Init(struct Task *task) +{ + namingScreenData.bg1vOffset = 0; + namingScreenData.bg2vOffset = 0; + task->tState++; + return 0; +} + +static bool8 PageSwapAnimState_1(struct Task *task) +{ + u16 *const arr[] = + { + &namingScreenData.bg2vOffset, + &namingScreenData.bg1vOffset + }; + + task->tFrameCount += 4; + *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40); + *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); + if (task->tFrameCount >= 64) + { + u8 temp = namingScreenData.unk8; //Why u8 and not u16? + + namingScreenData.unk8 = namingScreenData.unkA; + namingScreenData.unkA = temp; + task->tState++; + } + return 0; +} + +static bool8 PageSwapAnimState_2(struct Task *task) +{ + u16 *const arr[] = {&namingScreenData.bg2vOffset, &namingScreenData.bg1vOffset}; + + task->tFrameCount += 4; + *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40); + *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); + if (task->tFrameCount >= 128) + { + u8 temp = namingScreenData.unkC; + + namingScreenData.unkC = namingScreenData.unkD; + namingScreenData.unkD = temp; + task->tState++; + } + return 0; +} + +static bool8 PageSwapAnimState_Done(struct Task *task) +{ + DestroyTask(FindTaskIdByFunc(Task_HandlePageSwapAnim)); + return 0; +} + +#undef tState +#undef tFrameCount + +//-------------------------------------------------- +// Cursor +//-------------------------------------------------- + +static void CursorInit(void) +{ + namingScreenData.cursorSpriteId = CreateSprite(&gSpriteTemplate_83CE640, 0, 0, 0); + gSprites[namingScreenData.cursorSpriteId].oam.priority = 1; + gSprites[namingScreenData.cursorSpriteId].oam.objMode = 1; + gSprites[namingScreenData.cursorSpriteId].data6 = 1; + gSprites[namingScreenData.cursorSpriteId].data6 = 2; + SetCursorPos(0, 0); +} + +static const u8 sKeyboardSymbolPositions[][COLUMN_COUNT] = { +#if ENGLISH + {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Upper page + {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Lower page + {1, 4, 7, 10, 13, 16, 16, 16, 19}, //Others page +#elif GERMAN + {2, 3, 4, 5, 9, 10, 11, 12, 16, 19}, //Upper page + {2, 3, 4, 5, 9, 10, 11, 12, 16, 19}, //Lower page + {1, 4, 7, 10, 13, 16, 16, 16, 16, 19}, //Others page +#endif +}; + +static u8 CursorColToKeyboardCol(s16 x) +{ + return sKeyboardSymbolPositions[namingScreenData.currentPage][x]; +} + +static void SetCursorPos(s16 x, s16 y) +{ + struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId]; + + cursorSprite->pos1.x = CursorColToKeyboardCol(x) * 8 + 27; + cursorSprite->pos1.y = y * 16 + 80; + cursorSprite->data2 = cursorSprite->data0; + cursorSprite->data3 = cursorSprite->data1; + cursorSprite->data0 = x; + cursorSprite->data1 = y; +} + +static void GetCursorPos(s16 *x, s16 *y) +{ + struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId]; + + *x = cursorSprite->data0; + *y = cursorSprite->data1; +} + +static void MoveCursorToOKButton(void) +{ + SetCursorPos(COLUMN_COUNT - 1, 2); +} + +static void sub_80B6888(u8 a) +{ + gSprites[namingScreenData.cursorSpriteId].data4 &= -256; + gSprites[namingScreenData.cursorSpriteId].data4 |= a; + StartSpriteAnim(&gSprites[namingScreenData.cursorSpriteId], 0); +} + +static void sub_80B68D8(u8 a) +{ + gSprites[namingScreenData.cursorSpriteId].data4 &= 0xFF; + gSprites[namingScreenData.cursorSpriteId].data4 |= a << 8; +} + +static void sub_80B6914(void) +{ + StartSpriteAnim(&gSprites[namingScreenData.cursorSpriteId], 1); +} + +static bool8 IsCursorAnimFinished(void) +{ + return gSprites[namingScreenData.cursorSpriteId].animEnded; +} + +static u8 GetKeyRoleAtCursorPos(void) +{ + const u8 keyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK}; + s16 cursorX; + s16 cursorY; + + GetCursorPos(&cursorX, &cursorY); + if (cursorX < COLUMN_COUNT - 1) + return KEY_ROLE_CHAR; + else + return keyRoles[cursorY]; +} + +void sub_80B6998(struct Sprite *sprite) +{ + if (sprite->animEnded) + StartSpriteAnim(sprite, 0); + sprite->invisible = (sprite->data4 & 0xFF); + if (sprite->data0 == COLUMN_COUNT - 1) + sprite->invisible = TRUE; + if (sprite->invisible || (sprite->data4 & 0xFF00) == 0 + || sprite->data0 != sprite->data2 || sprite->data1 != sprite->data3) + { + sprite->data5 = 0; + sprite->data6 = 1; + sprite->data7 = 2; + } + sprite->data7--; + if (sprite->data7 == 0) + { + sprite->data5 += sprite->data6; + if (sprite->data5 == 16 || sprite->data5 == 0) + sprite->data6 = -sprite->data6; + sprite->data7 = 2; + } + if ((sprite->data4 & 0xFF00) != 0) + { + s8 gb = sprite->data5; + s8 r = sprite->data5 >> 1; + u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101; + + MultiplyInvertedPaletteRGBComponents(index, r, gb, gb); + } +} + +static void sub_80B6A80(void) +{ + u8 spriteId1; + u8 spriteId2; + u8 spriteId3; + + spriteId1 = CreateSprite(&gSpriteTemplate_83CE5C8, 0xCC, 0x50, 0); + namingScreenData.unk10 = spriteId1; + SetSubspriteTables(&gSprites[spriteId1], gSubspriteTables_83CE558); + + spriteId2 = CreateSprite(&gSpriteTemplate_83CE5F8, 0xCC, 0x4C, 1); + gSprites[spriteId1].data6 = spriteId2; + SetSubspriteTables(&gSprites[spriteId2], gSubspriteTables_83CE560); + + spriteId3 = CreateSprite(&gSpriteTemplate_83CE5E0, 0xCC, 0x4B, 2); + gSprites[spriteId3].oam.priority = 1; + gSprites[spriteId1].data7 = spriteId3; +} + +static void sub_80B6B14(void) +{ + struct Sprite *sprite = &gSprites[namingScreenData.unk10]; + + sprite->data0 = 2; + sprite->data1 = namingScreenData.currentPage; +} + +static u8 sub_80B6B5C(struct Sprite *); +static u8 sub_80B6B98(struct Sprite *); +static u8 sub_80B6B9C(struct Sprite *); +static u8 sub_80B6C08(struct Sprite *); + +static u8 (*const gUnknown_083CE2B4[])(struct Sprite *) = +{ + sub_80B6B5C, + sub_80B6B98, + sub_80B6B9C, + sub_80B6C08, +}; + +void sub_80B6B34(struct Sprite *sprite) +{ + while (gUnknown_083CE2B4[sprite->data0](sprite) != 0) + ; +} + +static u8 sub_80B6B5C(struct Sprite *sprite) +{ + struct Sprite *sprite1 = &gSprites[sprite->data6]; + struct Sprite *sprite2 = &gSprites[sprite->data7]; + + sub_80B6C48(namingScreenData.currentPage, sprite1, sprite2); + sprite->data0++; + return 0; +} + +static u8 sub_80B6B98(struct Sprite *sprite) +{ + return 0; +} + +static u8 sub_80B6B9C(struct Sprite *sprite) +{ + struct Sprite *r4 = &gSprites[sprite->data6]; + struct Sprite *r5 = &gSprites[sprite->data7]; + + r4->pos2.y++; + if (r4->pos2.y > 7) + { + sprite->data0++; + r4->pos2.y = -4; + r4->invisible = TRUE; + sub_80B6C48(((u8)sprite->data1 + 1) % 3, r4, r5); + } + return 0; +} + +static u8 sub_80B6C08(struct Sprite *sprite) +{ + struct Sprite *r2 = &gSprites[sprite->data6]; + + r2->invisible = FALSE; + r2->pos2.y++; + if (r2->pos2.y >= 0) + { + r2->pos2.y = 0; + sprite->data0 = 1; + } + return 0; +} + +static const u16 gUnknown_083CE2C4[] = {1, 3, 2}; +static const u16 gUnknown_083CE2CA[] = {4, 6, 5}; + +static void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c) +{ + c->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_083CE2C4[a]); + b->sheetTileStart = GetSpriteTileStartByTag(gUnknown_083CE2CA[a]); + b->subspriteTableNum = a; +} + +// + +static void sub_80B6CA8(void) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83CE610, 0xCC, 0x6C, 0); + SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); + + spriteId = CreateSprite(&gSpriteTemplate_83CE628, 0xCC, 0x84, 0); + SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); +} + +static void sub_80B6D04(void) +{ + u8 spriteId; + s16 r1; + u8 i; + + r1 = (namingScreenData.unk2 - 1) * 8 + 4; + spriteId = CreateSprite(&gSpriteTemplate_83CE658, r1, 0x28, 0); + gSprites[spriteId].oam.priority = 3; + r1 = namingScreenData.unk2 * 8 + 4; + for (i = 0; i < namingScreenData.template->maxChars; i++, r1 += 8) + { + spriteId = CreateSprite(&gSpriteTemplate_83CE670, r1, 0x2C, 0); + gSprites[spriteId].oam.priority = 3; + gSprites[spriteId].data0 = i; + } +} + +void sub_80B6D9C(struct Sprite *sprite) +{ + const s16 arr[] = {0, -4, -2, -1}; + + if (sprite->data0 == 0 || --sprite->data0 == 0) + { + sprite->data0 = 8; + sprite->data1 = (sprite->data1 + 1) & 3; + } + sprite->pos2.x = arr[sprite->data1]; +} + +void sub_80B6DE8(struct Sprite *sprite) +{ + const s16 arr[] = {2, 3, 2, 1}; + u8 var; + + var = GetTextCaretPosition(); + if (var != (u8)sprite->data0) + { + sprite->pos2.y = 0; + sprite->data1 = 0; + sprite->data2 = 0; + } + else + { + sprite->pos2.y = arr[sprite->data1]; + sprite->data2++; + if (sprite->data2 > 8) + { + sprite->data1 = (sprite->data1 + 1) & 3; + sprite->data2 = 0; + } + } +} + +// + +static void nullsub_40(void); +static void sub_80B6E68(void); +static void sub_80B6EBC(void); +static void sub_80B6EFC(void); + +static void (*const gUnknown_083CE2E0[])(void) = +{ + nullsub_40, + sub_80B6E68, + sub_80B6EBC, + sub_80B6EFC, +}; + +static void sub_80B6E44(void) +{ + gUnknown_083CE2E0[namingScreenData.template->unk2](); +} + +static void nullsub_40(void) +{ +} + +static void sub_80B6E68(void) +{ + u8 rivalGfxId; + u8 spriteId; + + rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, namingScreenData.unk3E); + spriteId = AddPseudoFieldObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x18, 0); + gSprites[spriteId].oam.priority = 3; + StartSpriteAnim(&gSprites[spriteId], 4); +} + +static void sub_80B6EBC(void) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83CE688, 0x34, 0x18, 0); + SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE580); + gSprites[spriteId].oam.priority = 3; +} + +static void sub_80B6EFC(void) +{ + u8 spriteId; + + sub_809D51C(); + spriteId = CreateMonIcon(namingScreenData.unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, namingScreenData.unk42); + gSprites[spriteId].oam.priority = 3; +} + +static u8 GetTextCaretPosition(void) +{ + u8 i; + + for (i = 0; i < namingScreenData.template->maxChars; i++) + { + if (namingScreenData.textBuffer[i] == EOS) + return i; + } + return namingScreenData.template->maxChars - 1; +} + +static u8 GetPreviousTextCaretPosition(void) +{ + s8 i; + + for (i = namingScreenData.template->maxChars - 1; i > 0; i--) + { + if (namingScreenData.textBuffer[i] != EOS) + return i; + } + return 0; +} + +static void DeleteTextCharacter(void) +{ + u8 index; + u8 var2; + + index = GetPreviousTextCaretPosition(); + namingScreenData.textBuffer[index] = 0; + sub_80B7960(); + namingScreenData.textBuffer[index] = EOS; + var2 = GetKeyRoleAtCursorPos(); + if (var2 == 0 || var2 == 2) + sub_80B6460(1, 0, 1); + PlaySE(SE_BOWA); +} + +static bool8 sub_80B7004(void) +{ + s16 x; + s16 y; + u8 ch; + bool8 r4; + + GetCursorPos(&x, &y); + x = CursorColToKeyboardCol(x); + ch = GetCharAtKeyboardPos(x, y); + r4 = 1; + if (ch == 0xFF) + r4 = sub_80B7104(); + else if (ch == 0xFE) + r4 = sub_80B713C(); + else + AddTextCharacter(ch); + sub_80B7960(); + PlaySE(SE_SELECT); + if (r4) + { + if (GetPreviousTextCaretPosition() == namingScreenData.template->maxChars - 1) + return TRUE; + } + return FALSE; +} + +static void sub_80B7090(void) // DoInput? +{ + u8 r5; + u8 r4; + + r5 = GetPreviousTextCaretPosition(); + r4 = namingScreenData.textBuffer[r5]; + if (sub_80B7198(r4)) + { + if (sub_80B7264(r4)) + sub_80B7370(r4, r5); + else + sub_80B73CC(r4, r5); + } + else + { + if (sub_80B71E4(r4)) + sub_80B7474(r4, r5); + else + sub_80B72A4(r4, r5); + } + sub_80B7960(); + PlaySE(SE_SELECT); +} + +static bool8 sub_80B7104(void) +{ + u8 r5; + u8 r4; + + r5 = GetPreviousTextCaretPosition(); + r4 = namingScreenData.textBuffer[r5]; + if (sub_80B720C(r4)) + { + sub_80B72A4(r4, r5); + return TRUE; + } + return FALSE; +} + +static bool8 sub_80B713C(void) +{ + u8 r5; + u8 r4; + + r5 = GetPreviousTextCaretPosition(); + r4 = namingScreenData.textBuffer[r5]; + if (sub_80B7264(r4)) + { + sub_80B7370(r4, r5); + return TRUE; + } + return FALSE; +} + +static void AddTextCharacter(u8 ch) +{ + u8 index = GetTextCaretPosition(); + + namingScreenData.textBuffer[index] = ch; +} + +static bool8 sub_80B7198(u8 a) +{ + if ((a >= 55 && a <= 74) + || (a >= 135 && a <= 139) + || (a >= 140 && a <= 144) + || (a >= 145 && a <= 149) + || (a >= 150 && a <= 154)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80B71E4(u8 a) +{ + if ((a >= 75 && a <= 79) + || (a >= 155 && a <= 159)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80B720C(u8 a) +{ + if ((a >= 6 && a <= 20) + || (a >= 26 && a <= 30) + || (a >= 75 && a <= 79) + || (a >= 86 && a <= 100) + || (a >= 106 && a <= 110) + || (a >= 155 && a <= 159)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80B7264(u8 a) +{ + if ((a >= 26 && a <= 30) + || (a >= 70 && a <= 74) + || (a >= 106 && a <= 110) + || (a >= 150 && a <= 154)) + return TRUE; + else + return FALSE; +} + +static void sub_80B72A4(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 6 && a <= 10) + chr = a + 0x31; + else if (a >= 11 && a <= 15) + chr = a + 0x31; + else if (a >= 16 && a <= 20) + chr = a + 0x31; + else if (a >= 26 && a <= 30) + chr = a + 0x2C; + else if (a >= 75 && a <= 79) + chr = a + 0xFB; + else if (a >= 86 && a <= 90) + chr = a + 0x31; + else if (a >= 91 && a <= 95) + chr = a + 0x31; + else if (a >= 96 && a <= 100) + chr = a + 0x31; + else if (a >= 106 && a <= 110) + chr = a + 0x2C; + else if (a >= 155 && a <= 159) + chr = a + 0xFB; + namingScreenData.textBuffer[b] = chr; +} + +static void sub_80B7370(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 26 && a <= 30) + chr = a + 0x31; + else if (a >= 70 && a <= 74) + chr = a + 5; + else if (a >= 106 && a <= 110) + chr = a + 0x31; + else if (a >= 150 && a <= 154) + chr = a + 5; + namingScreenData.textBuffer[b] = chr; +} + +static void sub_80B73CC(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 55 && a <= 59) + chr = a + 0xCF; + else if (a >= 60 && a <= 64) + chr = a + 0xCF; + else if (a >= 65 && a <= 69) + chr = a + 0xCF; + else if (a >= 70 && a <= 74) + chr = a + 0xD4; + else if (a >= 135 && a <= 139) + chr = a + 0xCF; + else if (a >= 140 && a <= 144) + chr = a + 0xCF; + else if (a >= 145 && a <= 149) + chr = a + 0xCF; + else if (a >= 150 && a <= 154) + chr = a + 0xD4; + namingScreenData.textBuffer[b] = chr; +} + +static void sub_80B7474(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 75 && a <= 79) + chr = a + 0xCF; + else if (a >= 155 && a <= 159) + chr = a + 0xCF; + namingScreenData.textBuffer[b] = chr; +} + +static void sub_80B74B0(void) +{ + u8 i; + + for (i = 0; i < namingScreenData.template->maxChars; i++) + { + if (namingScreenData.textBuffer[i] != 0 && namingScreenData.textBuffer[i] != 0xFF) + { + StringCopyN(namingScreenData.destBuffer, namingScreenData.textBuffer, namingScreenData.template->maxChars + 1); + break; + } + } +} + +static void DisplaySentToPCMessage(void) +{ + StringCopy(gStringVar1, namingScreenData.destBuffer); + StringExpandPlaceholders(gStringVar4, gOtherText_SentToPC); + BasicInitMenuWindow(&gWindowConfig_81E6E88); + MenuDisplayMessageBox(); + sub_8072044(gStringVar4); +} + +static void sub_80B753C(void) +{ + LoadSpriteSheets(gUnknown_083CE6A0); + LoadSpritePalettes(gUnknown_083CE708); +} + +static void sub_80B7558(void) +{ + sub_80B7568(); + sub_80B75B0(); +} + +static void sub_80B7568(void) +{ + const void *src; + void *dst; + + src = gNamingScreenMenu_Gfx; + dst = (void *)(VRAM + gMenuMessageBoxContentTileOffset * 32); + DmaCopy16(3, src, dst, 0x800); + + src = gNamingScreenMenu_Gfx; + dst = (void *)(VRAM + 0x8000 + gMenuMessageBoxContentTileOffset * 32); + DmaCopy16(3, src, dst, 0x800); +} + +static void sub_80B75B0(void) +{ + LoadPalette(gNamingScreenPalettes, 0, 0x80); +} + +static void sub_80B7650(u16 *); +static void sub_80B7660(u16 *); +static void sub_80B7670(u16 *); + +static void (*const gUnknown_083CE2F0[][2])(u16 *) = +{ + {sub_80B7660, sub_80B7650}, + {sub_80B7650, sub_80B7670}, + {sub_80B7670, sub_80B7660}, +}; + +static void sub_80B75C4(void) +{ + u16 *const arr[] = + { + (u16 *)(VRAM + 0xE000), + (u16 *)(VRAM + 0xE800), + }; + + gUnknown_083CE2F0[namingScreenData.currentPage][0](arr[namingScreenData.unkC]); + gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]); +} + +static void sub_80B7614(void) +{ + u16 *const arr[] = + { + (u16 *)(VRAM + 0xE000), + (u16 *)(VRAM + 0xE800), + }; + + gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]); +} + +static void sub_80B7650(u16 *vramBuffer) +{ + sub_80B7698(vramBuffer, gUnknown_083CE748); +} + +static void sub_80B7660(u16 *vramBuffer) +{ + sub_80B7698(vramBuffer, gUnknown_083CEBF8); +} + +static void sub_80B7670(u16 *vramBuffer) +{ + sub_80B7698(vramBuffer, gUnknown_083CF0A8); +} + +static void sub_80B7680(void) +{ + sub_80B76E0(VRAM + 0xF000, gUnknown_08E86258); +} + +static void sub_80B7698(u16 *vramBuffer, const u16 *src) +{ + s16 i; + s16 j; + + for (i = 0; i < 20; i++) + { + for (j = 0; j < 30; j++, src++) + { + vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset; + } + } +} + +static void sub_80B76E0(u16 *vramBuffer, const u16 *src) +{ + s16 i; + s16 j; + + for (i = 0; i < 20; i++) + { + for (j = 0; j < 30; j++, src++) + { + vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset; + } + src += 2; + } +} + +static void sub_80B772C(void) +{ + nullsub_20(namingScreenData.currentPage, namingScreenData.unkC); +} + +static void sub_80B7740(void) +{ + nullsub_20((namingScreenData.currentPage + 1) % 3, namingScreenData.unkD); +} + +static void nullsub_20(u8 a, u8 b) +{ +} + +static void sub_80B7838(void); +static void sub_80B7844(void); +static void sub_80B7850(void); + +static void (*const gUnknown_083CE310[][2])(void) = +{ + sub_80B7844, + sub_80B7838, + sub_80B7838, + sub_80B7850, + sub_80B7850, + sub_80B7844, +}; + +static const struct WindowConfig *const gUnknown_083CE328[][2][2] = +{ + { + {&gWindowConfig_81E6EDC, &gWindowConfig_81E6EF8}, + {&gWindowConfig_81E6EA4, &gWindowConfig_81E6EC0}, + }, + { + {&gWindowConfig_81E6EA4, &gWindowConfig_81E6EC0}, + {&gWindowConfig_81E6F14, &gWindowConfig_81E6F30}, + }, + { + {&gWindowConfig_81E6F14, &gWindowConfig_81E6F30}, + {&gWindowConfig_81E6EDC, &gWindowConfig_81E6EF8}, + }, +}; + +static void nullsub_61(void); +static void sub_80B78F8(void); + +static void (*const gUnknown_083CE358[])(void) = +{ + nullsub_61, + nullsub_61, + sub_80B78F8, + sub_80B78F8, +}; + +static void nullsub_62(void); +static void sub_80B7924(void); + +static void (*const gUnknown_083CE368[])(void) = +{ + nullsub_62, + sub_80B7924, +}; + +static const u8 sKeyboardCharacters[][4][20]; //forward declaration + +static u8 GetCharAtKeyboardPos(s16 a, s16 b) +{ + return sKeyboardCharacters[namingScreenData.currentPage][b][a]; +} + +static void sub_80B7794(void) +{ + BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][0][namingScreenData.unkC]); + gUnknown_083CE310[namingScreenData.currentPage][0](); + BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][1][namingScreenData.unkD]); + gUnknown_083CE310[namingScreenData.currentPage][1](); + sub_80B772C(); + sub_80B7740(); +} + +static void sub_80B77F8(void) +{ + BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][1][namingScreenData.unkD]); + gUnknown_083CE310[namingScreenData.currentPage][1](); + sub_80B7740(); +} + +static void sub_80B7838(void) +{ + PrintKeyboardCharacters(1); +} + +static void sub_80B7844(void) +{ + PrintKeyboardCharacters(0); +} + +static void sub_80B7850(void) +{ + PrintKeyboardCharacters(2); +} + +static void PrintKeyboardCharacters(u8 page) //print letters on page +{ + s16 i; + s16 r5; + + for (i = 0, r5 = 9; i < 4; i++, r5 += 2) + MenuPrint(sKeyboardCharacters[page][i], 3, r5); +} + +static void sub_80B78A8(void) +{ + BasicInitMenuWindow(&gWindowConfig_81E6F4C); + gUnknown_083CE358[namingScreenData.templateNum](); + gUnknown_083CE368[namingScreenData.template->unk3](); + MenuPrint(namingScreenData.template->title, 9, 2); +} + +static void nullsub_61(void) +{ +} + +static void sub_80B78F8(void) +{ + StringCopy(gStringVar1, gSpeciesNames[(s16)namingScreenData.unk3E]); +} + +static void nullsub_62(void) +{ +} + +static void sub_80B7924(void) +{ + u8 genderSymbol[2] = _("♂"); + + if ((s16)namingScreenData.unk40 != MON_GENDERLESS) + { + if ((s16)namingScreenData.unk40 == MON_FEMALE) + genderSymbol[0] = 0xB6; //female symbol + MenuPrint(genderSymbol, 0x14, 4); + } +} + +static void sub_80B7960(void) +{ + u8 *string = gStringVar1; + + string[0] = 0xFC; + string[1] = 0x14; + string[2] = 8; + string[3] = 0xFC; + string[4] = 0x11; + string[5] = 1; + string += 6; + StringCopy(string, namingScreenData.textBuffer); + BasicInitMenuWindow(&gWindowConfig_81E6F4C); + MenuPrint(gStringVar1, namingScreenData.unk2, 4); +} + +//-------------------------------------------------- +// Forward-declared variables +//-------------------------------------------------- + +static const struct NamingScreenTemplate playerNamingScreenTemplate = +{ + .unk0 = 0, + .maxChars = 7, + .unk2 = 1, + .unk3 = 0, + .unk4 = 0, + .unk5 = 0, + .unk6 = 0, + .unk7 = 0, + .title = OtherText_YourName, +}; + +static const struct NamingScreenTemplate pcBoxNamingTemplate = +{ + .unk0 = 0, + .maxChars = 8, + .unk2 = 2, + .unk3 = 0, + .unk4 = 0, + .unk5 = 0, + .unk6 = 0, + .unk7 = 0, + .title = OtherText_BoxName, +}; + +static const struct NamingScreenTemplate monNamingScreenTemplate = +{ + .unk0 = 0, + .maxChars = 10, + .unk2 = 3, + .unk3 = 1, + .unk4 = 0, + .unk5 = 0, + .unk6 = 0, + .unk7 = 0, + .title = OtherText_PokeName, +}; + +static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = +{ + &playerNamingScreenTemplate, + &pcBoxNamingTemplate, + &monNamingScreenTemplate, + &monNamingScreenTemplate, +}; + +static const u8 sKeyboardCharacters[][4][20] = +{ +#if ENGLISH + { + _(" A B C D E F . "), + _(" G H I J K L , "), + _(" M N O P Q R S "), + _(" T U V W X Y Z "), + }, + { + _(" a b c d e f . "), + _(" g h i j k l , "), + _(" m n o p q r s "), + _(" t u v w x y z "), + }, +#elif GERMAN + { + _(" ABCD EFGH . "), + _(" IJKL MNOP , "), + _(" QRST UVWX "), + _(" YZ ÄÖÜ "), + }, + { + _(" abcd efgh . "), + _(" ijkl mnop , "), + _(" qrst uvwx "), + _(" yz äöü "), + }, +#endif + { + _(" 0 1 2 3 4 "), + _(" 5 6 7 8 9 "), + _(" ! ? ♂ ♀ / - "), + _(" … “ ” ‘ ’ "), + }, +}; + +const struct OamData gOamData_83CE498 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const struct OamData gOamData_83CE4A0 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const struct OamData gOamData_83CE4A8 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +//TODO: dump sprite data diff --git a/src/engine/option_menu.c b/src/engine/option_menu.c new file mode 100644 index 000000000..7f8d76528 --- /dev/null +++ b/src/engine/option_menu.c @@ -0,0 +1,579 @@ +#include "global.h" +#include "option_menu.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "sprite.h" +#include "strings2.h" +#include "task.h" + +extern void SetPokemonCryStereo(u32 val); +extern void remove_some_task(void); + +//Task data +enum { + TD_MENUSELECTION, + TD_TEXTSPEED, + TD_BATTLESCENE, + TD_BATTLESTYLE, + TD_SOUND, + TD_BUTTONMODE, + TD_FRAMETYPE, +}; + +//Menu items +enum { + MENUITEM_TEXTSPEED, + MENUITEM_BATTLESCENE, + MENUITEM_BATTLESTYLE, + MENUITEM_SOUND, + MENUITEM_BUTTONMODE, + MENUITEM_FRAMETYPE, + MENUITEM_CANCEL, +}; + +const u16 gUnknown_0839F5FC[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal"); +// note: this is only used in the Japanese release +const u8 gUnknown_0839F63C[] = INCBIN_U8("graphics/misc/option_menu_equals_sign.4bpp"); + +static void Task_OptionMenuFadeIn(u8 taskId); +static void Task_OptionMenuProcessInput(u8 taskId); +static void Task_OptionMenuSave(u8 taskId); +static void Task_OptionMenuFadeOut(u8 taskId); +static void HighlightOptionMenuItem(u8 selection); +static u8 TextSpeed_ProcessInput(u8 selection); +static void TextSpeed_DrawChoices(u8 selection); +static u8 BattleScene_ProcessInput(u8 selection); +static void BattleScene_DrawChoices(u8 selection); +static u8 BattleStyle_ProcessInput(u8 selection); +static void BattleStyle_DrawChoices(u8 selection); +static u8 Sound_ProcessInput(u8 selection); +static void Sound_DrawChoices(u8 selection); +static u8 FrameType_ProcessInput(u8 selection); +static void FrameType_DrawChoices(u8 selection); +static u8 ButtonMode_ProcessInput(u8 selection); +static void ButtonMode_DrawChoices(u8 selection); + +static void MainCB(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_InitOptionMenu(void) +{ + switch (gMain.state) + { + default: + case 0: + { + u8 *addr; + u32 size; + + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + 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; + } + } + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + gMain.state++; + break; + } + case 1: + ResetPaletteFade(); + remove_some_task(); + ResetTasks(); + ResetSpriteData(); + gMain.state++; + break; + case 2: + SetUpWindowConfig(&gWindowConfig_81E71B4); + gMain.state++; + break; + case 3: + MultistepInitMenuWindowBegin(&gWindowConfig_81E71B4); + gMain.state++; + break; + case 4: + if (!MultistepInitMenuWindowContinue()) + return; + gMain.state++; + break; + case 5: + LoadPalette(gUnknown_0839F5FC, 0x80, 0x40); + CpuCopy16(gUnknown_0839F63C, (void *)0x0600BEE0, 0x40); + gMain.state++; + break; + case 6: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + gMain.state++; + break; + case 7: + { + u16 savedIme; + + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_WININ = 0x1111; + REG_WINOUT = 0x31; + REG_BLDCNT = 0xE1; + REG_BLDALPHA = 0; + REG_BLDY = 7; + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(VBlankCB); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON | + DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; + gMain.state++; + break; + } + case 8: + { + u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0); + + gTasks[taskId].data[TD_MENUSELECTION] = 0; + gTasks[taskId].data[TD_TEXTSPEED] = gSaveBlock2.optionsTextSpeed; + gTasks[taskId].data[TD_BATTLESCENE] = gSaveBlock2.optionsBattleSceneOff; + gTasks[taskId].data[TD_BATTLESTYLE] = gSaveBlock2.optionsBattleStyle; + gTasks[taskId].data[TD_SOUND] = gSaveBlock2.optionsSound; + gTasks[taskId].data[TD_BUTTONMODE] = gSaveBlock2.optionsButtonMode; + gTasks[taskId].data[TD_FRAMETYPE] = gSaveBlock2.optionsWindowFrameType; + + MenuDrawTextWindow(2, 0, 27, 3); + MenuDrawTextWindow(2, 4, 27, 19); + + MenuPrint(gSystemText_OptionMenu, 4, 1); + MenuPrint(gSystemText_TextSpeed, 4, 5); + MenuPrint(gSystemText_BattleScene, 4, 7); + MenuPrint(gSystemText_BattleStyle, 4, 9); + MenuPrint(gSystemText_Sound, 4, 11); + MenuPrint(gSystemText_ButtonMode, 4, 13); + MenuPrint(gSystemText_Frame, 4, 15); + MenuPrint(gSystemText_Cancel, 4, 17); + + TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]); + BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]); + BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]); + Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]); + ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]); + FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]); + + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(1, 31); + + HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); + gMain.state++; + break; + } + case 9: + SetMainCallback2(MainCB); + return; + } +} + +static void Task_OptionMenuFadeIn(u8 taskId) +{ + if (!gPaletteFade.active) + { + gTasks[taskId].func = Task_OptionMenuProcessInput; + } +} + +static void Task_OptionMenuProcessInput(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + if (gTasks[taskId].data[TD_MENUSELECTION] == MENUITEM_CANCEL) + gTasks[taskId].func = Task_OptionMenuSave; + } + else if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].func = Task_OptionMenuSave; + } + else if (gMain.newKeys & DPAD_UP) + { + if (gTasks[taskId].data[TD_MENUSELECTION] > 0) + gTasks[taskId].data[TD_MENUSELECTION]--; + else + gTasks[taskId].data[TD_MENUSELECTION] = 6; + HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (gTasks[taskId].data[TD_MENUSELECTION] <= 5) + gTasks[taskId].data[TD_MENUSELECTION]++; + else + gTasks[taskId].data[TD_MENUSELECTION] = 0; + HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); + } + else + { + switch (gTasks[taskId].data[TD_MENUSELECTION]) + { + case MENUITEM_TEXTSPEED: + gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]); + TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]); + break; + case MENUITEM_BATTLESCENE: + gTasks[taskId].data[TD_BATTLESCENE] = BattleScene_ProcessInput(gTasks[taskId].data[TD_BATTLESCENE]); + BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]); + break; + case MENUITEM_BATTLESTYLE: + gTasks[taskId].data[TD_BATTLESTYLE] = BattleStyle_ProcessInput(gTasks[taskId].data[TD_BATTLESTYLE]); + BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]); + break; + case MENUITEM_SOUND: + gTasks[taskId].data[TD_SOUND] = Sound_ProcessInput(gTasks[taskId].data[TD_SOUND]); + Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]); + break; + case MENUITEM_BUTTONMODE: + gTasks[taskId].data[TD_BUTTONMODE] = ButtonMode_ProcessInput(gTasks[taskId].data[TD_BUTTONMODE]); + ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]); + break; + case MENUITEM_FRAMETYPE: + gTasks[taskId].data[TD_FRAMETYPE] = FrameType_ProcessInput(gTasks[taskId].data[TD_FRAMETYPE]); + FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]); + break; + } + } +} + +static void Task_OptionMenuSave(u8 taskId) +{ + gSaveBlock2.optionsTextSpeed = gTasks[taskId].data[TD_TEXTSPEED]; + gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].data[TD_BATTLESCENE]; + gSaveBlock2.optionsBattleStyle = gTasks[taskId].data[TD_BATTLESTYLE]; + gSaveBlock2.optionsSound = gTasks[taskId].data[TD_SOUND]; + gSaveBlock2.optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE]; + gSaveBlock2.optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE]; + + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_OptionMenuFadeOut; +} + +static void Task_OptionMenuFadeOut(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(gMain.savedCallback); + } +} + +//This version uses addition '+' instead of OR '|'. +#define WIN_RANGE_(a, b) (((a) << 8) + (b)) + +static void HighlightOptionMenuItem(u8 index) +{ + REG_WIN1H = WIN_RANGE(24, 215); + REG_WIN1V = WIN_RANGE_(index * 16 + 40, index * 16 + 56); +} + +static void DrawOptionMenuChoice(const u8 *text, u8 x, u8 y, u8 style) +{ + u8 dst[16]; + u16 i; + + for (i = 0; *text != EOS && i <= 14; i++) + dst[i] = *(text++); + + dst[2] = style; + dst[i] = EOS; + MenuPrint_PixelCoords(dst, x, y, 1); +} + +static u8 TextSpeed_ProcessInput(u8 selection) +{ + if (gMain.newKeys & DPAD_RIGHT) + { + if (selection <= 1) + selection++; + else + selection = 0; + } + if (gMain.newKeys & DPAD_LEFT) + { + if (selection != 0) + selection--; + else + selection = 2; + } + return selection; +} + +#if ENGLISH +#define TEXTSPEED_SLOW_LEFT (120) +#define TEXTSPEED_MIX_LEFT (155) +#define TEXTSPEED_FAST_LEFT (184) +#endif +#if GERMAN +#define TEXTSPEED_SLOW_LEFT (120) +#define TEXTSPEED_MIX_LEFT (161) +#define TEXTSPEED_FAST_LEFT (202) +#endif + +static void TextSpeed_DrawChoices(u8 selection) +{ + u8 styles[3]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[2] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_Slow, TEXTSPEED_SLOW_LEFT, 40, styles[0]); + DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]); + DrawOptionMenuChoice(gSystemText_Fast, TEXTSPEED_FAST_LEFT, 40, styles[2]); +} + +static u8 BattleScene_ProcessInput(u8 selection) +{ + if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) + selection ^= 1; + return selection; +} + +static void BattleScene_DrawChoices(u8 selection) +{ + u8 styles[2]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]); + DrawOptionMenuChoice(gSystemText_Off, 190, 56, styles[1]); +} + +static u8 BattleStyle_ProcessInput(u8 selection) +{ + if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) + selection ^= 1; + return selection; +} + +#if ENGLISH +#define BATTLESTYLE_SHIFT (120) +#define BATTLESTYLE_SET (190) +#elif GERMAN +#define BATTLESTYLE_SHIFT (120) +#define BATTLESTYLE_SET (178) +#endif + +static void BattleStyle_DrawChoices(u8 selection) +{ + u8 styles[2]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_Shift, BATTLESTYLE_SHIFT, 72, styles[0]); + DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]); +} + +static u8 Sound_ProcessInput(u8 selection) +{ + if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) + { + selection ^= 1; + SetPokemonCryStereo(selection); + } + return selection; +} + +static void Sound_DrawChoices(u8 selection) +{ + u8 styles[3]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]); + DrawOptionMenuChoice(gSystemText_Stereo, 172, 88, styles[1]); +} + +static u8 FrameType_ProcessInput(u8 selection) +{ + if (gMain.newKeys & DPAD_RIGHT) + { + if (selection <= 18) + selection++; + else + selection = 0; + MenuLoadTextWindowGraphics_OverrideFrameType(selection); + } + if (gMain.newKeys & DPAD_LEFT) + { + if (selection != 0) + selection--; + else + selection = 19; + MenuLoadTextWindowGraphics_OverrideFrameType(selection); + } + return selection; +} + +#define CHAR_0 0xA1 //Character code of '0' character + +#if ENGLISH +static void FrameType_DrawChoices(u8 selection) +{ + u8 text[8]; + u8 n = selection + 1; + u16 i; + + for (i = 0; gSystemText_Terminator[i] != EOS && i <= 5; i++) + text[i] = gSystemText_Terminator[i]; + + //Convert number to decimal string + if (n / 10 != 0) + { + text[i] = n / 10 + CHAR_0; + i++; + text[i] = n % 10 + CHAR_0; + i++; + } + else + { + text[i] = n % 10 + CHAR_0; + i++; + text[i] = CHAR_SPACE; + i++; + } + + text[i] = EOS; + MenuPrint(gSystemText_Type, 15, 15); + MenuPrint(text, 18, 15); +} +#elif GERMAN +__attribute__((naked)) +static void FrameType_DrawChoices(u8 selection) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + sub sp, 0x10\n\ + lsls r0, 24\n\ + movs r1, 0x80\n\ + lsls r1, 17\n\ + adds r0, r1\n\ + lsrs r5, r0, 24\n\ + ldr r1, _0808C368 @ =gSystemText_Type\n\ + mov r0, sp\n\ + bl StringCopy\n\ + ldr r1, _0808C36C @ =gSystemText_Terminator\n\ + mov r0, sp\n\ + bl StringAppend\n\ + adds r4, r0, 0\n\ + adds r0, r5, 0\n\ + movs r1, 0xA\n\ + bl __udivsi3\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 24\n\ + lsrs r6, r0, 24\n\ + cmp r6, 0\n\ + beq _0808C370\n\ + adds r0, r1, 0\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + adds r4, 0x1\n\ + adds r0, r5, 0\n\ + movs r1, 0xA\n\ + bl __umodsi3\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + b _0808C380\n\ + .align 2, 0\n\ +_0808C368: .4byte gSystemText_Type\n\ +_0808C36C: .4byte gSystemText_Terminator\n\ +_0808C370:\n\ + adds r0, r5, 0\n\ + movs r1, 0xA\n\ + bl __umodsi3\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + adds r4, 0x1\n\ + strb r6, [r4]\n\ +_0808C380:\n\ + adds r4, 0x1\n\ + movs r0, 0xFF\n\ + strb r0, [r4]\n\ + mov r0, sp\n\ + movs r1, 0xF\n\ + movs r2, 0xF\n\ + bl MenuPrint\n\ + add sp, 0x10\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +static u8 ButtonMode_ProcessInput(u8 selection) +{ + if (gMain.newKeys & DPAD_RIGHT) + { + if (selection <= 1) + selection++; + else + selection = 0; + } + if (gMain.newKeys & DPAD_LEFT) + { + if (selection != 0) + selection--; + else + selection = 2; + } + return selection; +} + +static void ButtonMode_DrawChoices(u8 selection) +{ + u8 styles[3]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[2] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_Normal, 120, 104, styles[0]); + DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]); + DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]); +} diff --git a/src/engine/palette.c b/src/engine/palette.c new file mode 100644 index 000000000..94a4f8092 --- /dev/null +++ b/src/engine/palette.c @@ -0,0 +1,834 @@ +#include "global.h" +#include "palette.h" +#include "blend_palette.h" +#include "decompress.h" + +enum +{ + NORMAL_FADE, + FAST_FADE, + HARDWARE_FADE, +}; + +// These are structs for some unused palette system. +// The full functionality of this system is unknown. + +struct PaletteStructTemplate +{ + u16 uid; + u16 *src; + u16 pst_field_8_0:1; + u16 pst_field_8_1:9; + u16 size:5; + u16 pst_field_9_7:1; + u8 pst_field_A; + u8 srcCount:5; + u8 pst_field_B_5:3; + u8 pst_field_C; +}; + +struct PaletteStruct +{ + const struct PaletteStructTemplate *base; + u32 ps_field_4_0:1; + u16 ps_field_4_1:1; + u32 baseDestOffset:9; + u16 destOffset:10; + u16 srcIndex:7; + u8 ps_field_8; + u8 ps_field_9; +}; + +EWRAM_DATA u16 gPlttBufferUnfaded[0x200] = {0}; +EWRAM_DATA u16 gPlttBufferFaded[0x200] = {0}; +EWRAM_DATA static struct PaletteStruct sPaletteStructs[0x10] = {0}; +EWRAM_DATA struct PaletteFadeControl gPaletteFade = {0}; +EWRAM_DATA u32 gFiller_202F394 = 0; +EWRAM_DATA static u32 sPlttBufferTransferPending = 0; +EWRAM_DATA static u8 sPaletteDecompressionBuffer[0x400] = {0}; + +static const struct PaletteStructTemplate sDummyPaletteStructTemplate = +{ + 0xFFFF, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0 +}; + +static void unused_sub_8073DFC(struct PaletteStruct *, u32 *); +static void unused_sub_8073F60(struct PaletteStruct *, u32 *); +static void unused_sub_8074020(struct PaletteStruct *); +static u8 GetPaletteNumByUid(u16); +static u8 UpdateNormalPaletteFade(void); +static void BeginFastPaletteFadeInternal(u8); +static u8 UpdateFastPaletteFade(void); +static u8 UpdateHardwarePaletteFade(void); +static void UpdateBlendRegisters(void); +static bool8 IsSoftwarePaletteFadeFinishing(void); + +void LoadCompressedPalette(const void *src, u16 offset, u16 size) +{ + sub_800D238(src, sPaletteDecompressionBuffer); + CpuCopy16(sPaletteDecompressionBuffer, gPlttBufferUnfaded + offset, size); + CpuCopy16(sPaletteDecompressionBuffer, gPlttBufferFaded + offset, size); +} + +void LoadPalette(const void *src, u16 offset, u16 size) +{ + CpuCopy16(src, gPlttBufferUnfaded + offset, size); + CpuCopy16(src, gPlttBufferFaded + offset, size); +} + +void FillPalette(u16 value, u16 offset, u16 size) +{ + CpuFill16(value, gPlttBufferUnfaded + offset, size); + CpuFill16(value, gPlttBufferFaded + offset, size); +} + +void TransferPlttBuffer(void) +{ + if (!gPaletteFade.bufferTransferDisabled) + { + void *src = gPlttBufferFaded; + void *dest = (void *)PLTT; + DmaCopy16(3, src, dest, PLTT_SIZE); + sPlttBufferTransferPending = 0; + if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) + UpdateBlendRegisters(); + } +} + +u8 UpdatePaletteFade(void) +{ + u8 result; + u8 dummy = 0; + + if (sPlttBufferTransferPending) + return -1; + + if (gPaletteFade.mode == NORMAL_FADE) + result = UpdateNormalPaletteFade(); + else if (gPaletteFade.mode == FAST_FADE) + result = UpdateFastPaletteFade(); + else + result = UpdateHardwarePaletteFade(); + + sPlttBufferTransferPending = gPaletteFade.multipurpose1 | dummy; + + return result; +} + +void ResetPaletteFade(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + ResetPaletteStruct(i); + + ResetPaletteFadeControl(); +} + +void ReadPlttIntoBuffers(void) +{ + u16 i; + u16 *pltt = (u16 *)PLTT; + + for (i = 0; i < PLTT_SIZE / 2; i++) + { + gPlttBufferUnfaded[i] = pltt[i]; + gPlttBufferFaded[i] = pltt[i]; + } +} + +bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor) +{ + u8 temp; + register u32 _blendColor asm("r8") = blendColor; + + if (gPaletteFade.active) + { + return FALSE; + } + else + { + gPaletteFade.deltaY = 2; + + if (delay < 0) + { + gPaletteFade.deltaY += (delay * -1); + delay = 0; + } + + gPaletteFade_selectedPalettes = selectedPalettes; + gPaletteFade.delayCounter = delay; + gPaletteFade_delay = delay; + gPaletteFade.y = startY; + gPaletteFade.targetY = targetY; + gPaletteFade.blendColor = _blendColor; + gPaletteFade.active = 1; + gPaletteFade.mode = NORMAL_FADE; + + if (startY < targetY) + gPaletteFade.yDec = 0; + else + gPaletteFade.yDec = 1; + + UpdatePaletteFade(); + + temp = gPaletteFade.bufferTransferDisabled; + gPaletteFade.bufferTransferDisabled = 0; + CpuCopy32(gPlttBufferFaded, (void *)PLTT, PLTT_SIZE); + sPlttBufferTransferPending = 0; + if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) + UpdateBlendRegisters(); + gPaletteFade.bufferTransferDisabled = temp; + return TRUE; + } +} + +bool8 unref_sub_8073D3C(u32 a1, u8 a2, u8 a3, u8 a4, u16 a5) +{ + ReadPlttIntoBuffers(); + return BeginNormalPaletteFade(a1, a2, a3, a4, a5); +} + +void unref_sub_8073D84(u8 a1, u32 *a2) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + struct PaletteStruct *palstruct = &sPaletteStructs[i]; + if (palstruct->ps_field_4_0) + { + if (palstruct->base->pst_field_8_0 == a1) + { + u8 val1 = palstruct->srcIndex; + u8 val2 = palstruct->base->srcCount; + if (val1 == val2) + { + unused_sub_8074020(palstruct); + if (!palstruct->ps_field_4_0) + continue; + } + if (palstruct->ps_field_8 == 0) + unused_sub_8073DFC(palstruct, a2); + else + palstruct->ps_field_8--; + + unused_sub_8073F60(palstruct, a2); + } + } + } +} + +static void unused_sub_8073DFC(struct PaletteStruct *a1, u32 *a2) +{ + s32 srcIndex; + s32 srcCount; + u8 i = 0; + u16 srcOffset = a1->srcIndex * a1->base->size; + + if (!a1->base->pst_field_8_0) + { + while (i < a1->base->size) + { + gPlttBufferUnfaded[a1->destOffset] = a1->base->src[srcOffset]; + gPlttBufferFaded[a1->destOffset] = a1->base->src[srcOffset]; + i++; + a1->destOffset++; + srcOffset++; + } + } + else + { + while (i < a1->base->size) + { + gPlttBufferFaded[a1->destOffset] = a1->base->src[srcOffset]; + i++; + a1->destOffset++; + srcOffset++; + } + } + + a1->destOffset = a1->baseDestOffset; + a1->ps_field_8 = a1->base->pst_field_A; + a1->srcIndex++; + + srcIndex = a1->srcIndex; + srcCount = a1->base->srcCount; + + if (srcIndex >= srcCount) + { + if (a1->ps_field_9) + a1->ps_field_9--; + a1->srcIndex = 0; + } + + *a2 |= 1 << (a1->baseDestOffset >> 4); +} + +static void unused_sub_8073F60(struct PaletteStruct *a1, u32 *a2) +{ + if (gPaletteFade.active && ((1 << (a1->baseDestOffset >> 4)) & gPaletteFade_selectedPalettes)) + { + if (!a1->base->pst_field_8_0) + { + if (gPaletteFade.delayCounter != gPaletteFade_delay) + { + BlendPalette( + a1->baseDestOffset, + a1->base->size, + gPaletteFade.y, + gPaletteFade.blendColor); + } + } + else + { + if (!gPaletteFade.delayCounter) + { + if (a1->ps_field_8 != a1->base->pst_field_A) + { + u32 srcOffset = a1->srcIndex * a1->base->size; + u8 i; + + for (i = 0; i < a1->base->size; i++) + gPlttBufferFaded[a1->baseDestOffset + i] = a1->base->src[srcOffset + i]; + } + } + } + } +} + +static void unused_sub_8074020(struct PaletteStruct *a1) +{ + if (!a1->ps_field_9) + { + s32 val = a1->base->pst_field_B_5; + + if (!val) + { + a1->srcIndex = 0; + a1->ps_field_8 = a1->base->pst_field_A; + a1->ps_field_9 = a1->base->pst_field_C; + a1->destOffset = a1->baseDestOffset; + } + else + { + if (val < 0) + return; + if (val > 2) + return; + ResetPaletteStructByUid(a1->base->uid); + } + } + else + { + a1->ps_field_9--; + } +} + +void ResetPaletteStructByUid(u16 a1) +{ + u8 paletteNum = GetPaletteNumByUid(a1); + if (paletteNum != 16) + ResetPaletteStruct(paletteNum); +} + +void ResetPaletteStruct(u8 paletteNum) +{ + sPaletteStructs[paletteNum].base = &sDummyPaletteStructTemplate; + sPaletteStructs[paletteNum].ps_field_4_0 = 0; + sPaletteStructs[paletteNum].baseDestOffset = 0; + sPaletteStructs[paletteNum].destOffset = 0; + sPaletteStructs[paletteNum].srcIndex = 0; + sPaletteStructs[paletteNum].ps_field_4_1 = 0; + sPaletteStructs[paletteNum].ps_field_8 = 0; + sPaletteStructs[paletteNum].ps_field_9 = 0; +} + +void ResetPaletteFadeControl() +{ + gPaletteFade.multipurpose1 = 0; + gPaletteFade.multipurpose2 = 0; + gPaletteFade.delayCounter = 0; + gPaletteFade.y = 0; + gPaletteFade.targetY = 0; + gPaletteFade.blendColor = 0; + gPaletteFade.active = 0; + gPaletteFade.multipurpose2 = 0; // assign same value twice + gPaletteFade.yDec = 0; + gPaletteFade.bufferTransferDisabled = 0; + gPaletteFade.shouldResetBlendRegisters = 0; + gPaletteFade.hardwareFadeFinishing = 0; + gPaletteFade.softwareFadeFinishing = 0; + gPaletteFade.softwareFadeFinishingCounter = 0; + gPaletteFade.objPaletteToggle = 0; + gPaletteFade.deltaY = 2; +} + +void unref_sub_8074168(u16 uid) +{ + u8 paletteNum = GetPaletteNumByUid(uid); + if (paletteNum != 16) + sPaletteStructs[paletteNum].ps_field_4_1 = 1; +} + +void unref_sub_8074194(u16 uid) +{ + u8 paletteNum = GetPaletteNumByUid(uid); + if (paletteNum != 16) + sPaletteStructs[paletteNum].ps_field_4_1 = 0; +} + +static u8 GetPaletteNumByUid(u16 uid) +{ + u8 i; + + for (i = 0; i < 16; i++) + if (sPaletteStructs[i].base->uid == uid) + return i; + + return 16; +} + +static u8 UpdateNormalPaletteFade() +{ + u16 paletteOffset; + u16 selectedPalettes; + + if (!gPaletteFade.active) + return 0; + + if (IsSoftwarePaletteFadeFinishing()) + { + return gPaletteFade.active; + } + else + { + if (!gPaletteFade.objPaletteToggle) + { + if (gPaletteFade.delayCounter < gPaletteFade_delay) + { + gPaletteFade.delayCounter++; + return 2; + } + gPaletteFade.delayCounter = 0; + } + + paletteOffset = 0; + + if (!gPaletteFade.objPaletteToggle) + { + selectedPalettes = gPaletteFade_selectedPalettes; + } + else + { + selectedPalettes = gPaletteFade_selectedPalettes >> 16; + paletteOffset = 256; + } + + while (selectedPalettes) + { + if (selectedPalettes & 1) + BlendPalette( + paletteOffset, + 16, + gPaletteFade.y, + gPaletteFade.blendColor); + selectedPalettes >>= 1; + paletteOffset += 16; + } + + gPaletteFade.objPaletteToggle ^= 1; + + if (!gPaletteFade.objPaletteToggle) + { + if (gPaletteFade.y == gPaletteFade.targetY) + { + gPaletteFade_selectedPalettes = 0; + gPaletteFade.softwareFadeFinishing = 1; + } + else + { + s8 val; + + if (!gPaletteFade.yDec) + { + val = gPaletteFade.y; + val += gPaletteFade.deltaY; + if (val > gPaletteFade.targetY) + val = gPaletteFade.targetY; + gPaletteFade.y = val; + } + else + { + val = gPaletteFade.y; + val -= gPaletteFade.deltaY; + if (val < gPaletteFade.targetY) + val = gPaletteFade.targetY; + gPaletteFade.y = val; + } + } + } + + return gPaletteFade.active; + } +} + +void InvertPlttBuffer(u32 selectedPalettes) +{ + u16 paletteOffset = 0; + + while (selectedPalettes) + { + if (selectedPalettes & 1) + { + u8 i; + for (i = 0; i < 16; i++) + gPlttBufferFaded[paletteOffset + i] = ~gPlttBufferFaded[paletteOffset + i]; + } + selectedPalettes >>= 1; + paletteOffset += 16; + } +} + +void TintPlttBuffer(u32 selectedPalettes, s8 r, s8 g, s8 b) +{ + u16 paletteOffset = 0; + + while (selectedPalettes) + { + if (selectedPalettes & 1) + { + u8 i; + for (i = 0; i < 16; i++) + { + struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[paletteOffset + i]; + data->r += r; + data->g += g; + data->b += b; + } + } + selectedPalettes >>= 1; + paletteOffset += 16; + } +} + +void UnfadePlttBuffer(u32 selectedPalettes) +{ + u16 paletteOffset = 0; + + while (selectedPalettes) + { + if (selectedPalettes & 1) + { + u8 i; + for (i = 0; i < 16; i++) + gPlttBufferFaded[paletteOffset + i] = gPlttBufferUnfaded[paletteOffset + i]; + } + selectedPalettes >>= 1; + paletteOffset += 16; + } +} + +void BeginFastPaletteFade(u8 submode) +{ + gPaletteFade.deltaY = 2; + BeginFastPaletteFadeInternal(submode); +} + +static void BeginFastPaletteFadeInternal(u8 submode) +{ + gPaletteFade.y = 31; + gPaletteFade_submode = submode & 0x3F; + gPaletteFade.active = 1; + gPaletteFade.mode = FAST_FADE; + + if (submode == FAST_FADE_IN_FROM_BLACK) + CpuFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE); + + if (submode == FAST_FADE_IN_FROM_WHITE) + CpuFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE); + + UpdatePaletteFade(); +} + +static u8 UpdateFastPaletteFade(void) +{ + u16 i; + u16 paletteOffsetStart; + u16 paletteOffsetEnd; + s8 r0; + s8 g0; + s8 b0; + s8 r; + s8 g; + s8 b; + + if (!gPaletteFade.active) + return 0; + + if (IsSoftwarePaletteFadeFinishing()) + return gPaletteFade.active; + + if (gPaletteFade.objPaletteToggle) + { + paletteOffsetStart = 256; + paletteOffsetEnd = 512; + } + else + { + paletteOffsetStart = 0; + paletteOffsetEnd = 256; + } + + switch (gPaletteFade_submode) + { + case FAST_FADE_IN_FROM_WHITE: + for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) + { + struct PlttData *unfaded; + struct PlttData *faded; + + unfaded = (struct PlttData *)&gPlttBufferUnfaded[i]; + r0 = unfaded->r; + g0 = unfaded->g; + b0 = unfaded->b; + + faded = (struct PlttData *)&gPlttBufferFaded[i]; + r = faded->r - 2; + g = faded->g - 2; + b = faded->b - 2; + + if (r < r0) + r = r0; + if (g < g0) + g = g0; + if (b < b0) + b = b0; + + gPlttBufferFaded[i] = RGB(r, g, b); + } + break; + case FAST_FADE_OUT_TO_WHTIE: + for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) + { + struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i]; + r = data->r + 2; + g = data->g + 2; + b = data->b + 2; + + if (r > 31) + r = 31; + if (g > 31) + g = 31; + if (b > 31) + b = 31; + + gPlttBufferFaded[i] = RGB(r, g, b); + } + break; + case FAST_FADE_IN_FROM_BLACK: + for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) + { + struct PlttData *unfaded; + struct PlttData *faded; + + unfaded = (struct PlttData *)&gPlttBufferUnfaded[i]; + r0 = unfaded->r; + g0 = unfaded->g; + b0 = unfaded->b; + + faded = (struct PlttData *)&gPlttBufferFaded[i]; + r = faded->r + 2; + g = faded->g + 2; + b = faded->b + 2; + + if (r > r0) + r = r0; + if (g > g0) + g = g0; + if (b > b0) + b = b0; + + gPlttBufferFaded[i] = RGB(r, g, b); + } + break; + case FAST_FADE_OUT_TO_BLACK: + for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) + { + struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i]; + r = data->r - 2; + g = data->g - 2; + b = data->b - 2; + + if (r < 0) + r = 0; + if (g < 0) + g = 0; + if (b < 0) + b = 0; + + gPlttBufferFaded[i] = RGB(r, g, b); + } + } + + gPaletteFade.objPaletteToggle ^= 1; + + if (gPaletteFade.objPaletteToggle) + return gPaletteFade.active; + + if (gPaletteFade.y - gPaletteFade.deltaY < 0) + gPaletteFade.y = 0; + else + gPaletteFade.y -= gPaletteFade.deltaY; + + if (gPaletteFade.y == 0) + { + switch (gPaletteFade_submode) + { + case FAST_FADE_IN_FROM_WHITE: + case FAST_FADE_IN_FROM_BLACK: + CpuCopy32(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE); + break; + case FAST_FADE_OUT_TO_WHTIE: + CpuFill32(0xFFFFFFFF, gPlttBufferFaded, PLTT_SIZE); + break; + case FAST_FADE_OUT_TO_BLACK: + CpuFill32(0x00000000, gPlttBufferFaded, PLTT_SIZE); + break; + } + + gPaletteFade.mode = NORMAL_FADE; + gPaletteFade.softwareFadeFinishing = 1; + } + + return gPaletteFade.active; +} + +void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters) +{ + gPaletteFade_blendCnt = blendCnt; + gPaletteFade.delayCounter = delay; + gPaletteFade_delay = delay; + gPaletteFade.y = y; + gPaletteFade.targetY = targetY; + gPaletteFade.active = 1; + gPaletteFade.mode = HARDWARE_FADE; + gPaletteFade.shouldResetBlendRegisters = shouldResetBlendRegisters & 1; + gPaletteFade.hardwareFadeFinishing = 0; + + if (y < targetY) + gPaletteFade.yDec = 0; + else + gPaletteFade.yDec = 1; +} + +static u8 UpdateHardwarePaletteFade(void) +{ + if (!gPaletteFade.active) + return 0; + + if (gPaletteFade.delayCounter < gPaletteFade_delay) + { + gPaletteFade.delayCounter++; + return 2; + } + + gPaletteFade.delayCounter = 0; + + if (!gPaletteFade.yDec) + { + gPaletteFade.y++; + if (gPaletteFade.y > gPaletteFade.targetY) + { + gPaletteFade.hardwareFadeFinishing++; + gPaletteFade.y--; + } + } + else + { + s32 y = gPaletteFade.y--; + if (y - 1 < gPaletteFade.targetY) + { + gPaletteFade.hardwareFadeFinishing++; + gPaletteFade.y++; + } + } + + if (gPaletteFade.hardwareFadeFinishing) + { + if (gPaletteFade.shouldResetBlendRegisters) + { + gPaletteFade_blendCnt = 0; + gPaletteFade.y = 0; + } + gPaletteFade.shouldResetBlendRegisters = 0; + } + + return gPaletteFade.active; +} + +static void UpdateBlendRegisters(void) +{ + REG_BLDCNT = gPaletteFade_blendCnt; + REG_BLDY = gPaletteFade.y; + if (gPaletteFade.hardwareFadeFinishing) + { + gPaletteFade.hardwareFadeFinishing = 0; + gPaletteFade.mode = 0; + gPaletteFade_blendCnt = 0; + gPaletteFade.y = 0; + gPaletteFade.active = 0; + } +} + +static bool8 IsSoftwarePaletteFadeFinishing(void) +{ + if (gPaletteFade.softwareFadeFinishing) + { + if (gPaletteFade.softwareFadeFinishingCounter == 4) + { + gPaletteFade.active = 0; + gPaletteFade.softwareFadeFinishing = 0; + gPaletteFade.softwareFadeFinishingCounter = 0; + } + else + { + gPaletteFade.softwareFadeFinishingCounter++; + } + + return TRUE; + } + else + { + return FALSE; + } +} + +void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) +{ + u16 paletteOffset; + + for (paletteOffset = 0; selectedPalettes; paletteOffset += 16) + { + if (selectedPalettes & 1) + BlendPalette(paletteOffset, 16, coeff, color); + selectedPalettes >>= 1; + } +} + +void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) +{ + void *src = gPlttBufferUnfaded; + void *dest = gPlttBufferFaded; + DmaCopy32(3, src, dest, PLTT_SIZE); + BlendPalettes(selectedPalettes, coeff, color); +} diff --git a/src/engine/play_time.c b/src/engine/play_time.c new file mode 100644 index 000000000..9882c9c4b --- /dev/null +++ b/src/engine/play_time.c @@ -0,0 +1,73 @@ +#include "global.h" +#include "play_time.h" + +enum +{ + STOPPED, + RUNNING, + MAXED_OUT +}; + +static u8 sPlayTimeCounterState; + +void PlayTimeCounter_Reset() +{ + sPlayTimeCounterState = STOPPED; + + gSaveBlock2.playTimeHours = 0; + gSaveBlock2.playTimeMinutes = 0; + gSaveBlock2.playTimeSeconds = 0; + gSaveBlock2.playTimeVBlanks = 0; +} + +void PlayTimeCounter_Start() +{ + sPlayTimeCounterState = RUNNING; + + if (gSaveBlock2.playTimeHours > 999) + PlayTimeCounter_SetToMax(); +} + +void PlayTimeCounter_Stop() +{ + sPlayTimeCounterState = STOPPED; +} + +void PlayTimeCounter_Update() +{ + if (sPlayTimeCounterState == RUNNING) + { + gSaveBlock2.playTimeVBlanks++; + + if (gSaveBlock2.playTimeVBlanks > 59) + { + gSaveBlock2.playTimeVBlanks = 0; + gSaveBlock2.playTimeSeconds++; + + if (gSaveBlock2.playTimeSeconds > 59) + { + gSaveBlock2.playTimeSeconds = 0; + gSaveBlock2.playTimeMinutes++; + + if (gSaveBlock2.playTimeMinutes > 59) + { + gSaveBlock2.playTimeMinutes = 0; + gSaveBlock2.playTimeHours++; + + if (gSaveBlock2.playTimeHours > 999) + PlayTimeCounter_SetToMax(); + } + } + } + } +} + +void PlayTimeCounter_SetToMax() +{ + sPlayTimeCounterState = MAXED_OUT; + + gSaveBlock2.playTimeHours = 999; + gSaveBlock2.playTimeMinutes = 59; + gSaveBlock2.playTimeSeconds = 59; + gSaveBlock2.playTimeVBlanks = 59; +} diff --git a/src/engine/record_mixing.c b/src/engine/record_mixing.c new file mode 100644 index 000000000..d1083910c --- /dev/null +++ b/src/engine/record_mixing.c @@ -0,0 +1,1085 @@ +#include "global.h" +#include "record_mixing.h" +#include "battle_tower.h" +#include "cable_club.h" +#include "daycare.h" +#include "dewford_trend.h" +#include "event_data.h" +#include "fldeff_80C5CD4.h" +#include "item.h" +#include "items.h" +#include "load_save.h" +#include "link.h" +#include "mauville_old_man.h" +#include "menu.h" +#include "mystery_event_script.h" +#include "rng.h" +#include "rom4.h" +#include "save.h" +#include "script.h" +#include "secret_base.h" +#include "songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "tv.h" + +extern u8 ewram[]; +#define unk_2018000 (*(struct PlayerRecords *)(ewram + 0x18000)) +#define unk_2008000 (*(struct PlayerRecords *)(ewram + 0x08000)) + +extern struct RecordMixing_UnknownStruct gUnknown_02038738; +extern u16 gSpecialVar_0x8005; + +u32 gUnknown_03005D2C; + +static u8 gUnknown_03000718; +static u8 gUnknown_0300071C[4]; + +void *recordMixingSecretBases = &gSaveBlock1.secretBases; +void *recordMixingTvShows = &gSaveBlock1.tvShows; +void *gUnknown_083D0274 = &gSaveBlock1.unknown_2ABC; +void *gUnknown_083D0278 = &gSaveBlock1.oldMan; +void *recordMixingEasyChatPairs = &gSaveBlock1.easyChatPairs; +struct RecordMixing_UnknownStruct *gUnknown_083D0280 = &gUnknown_02038738; +void *gUnknown_083D0284 = &gSaveBlock2.filler_A8; + +#define BUFFER_CHUNK_SIZE 200 + +void sub_80B929C(void) +{ + sub_8083A84(Task_RecordMixing_Main); +} + +struct PlayerRecords +{ + struct SecretBaseRecord secretBases[20]; + TVShow tvShows[25]; + u8 filler1004[0x40]; + u8 filler1044[0x40]; + struct EasyChatPair easyChatPairs[5]; + struct RecordMixing_UnknownStruct filler10AC; + u8 filler1124[0xA4]; + u16 filler11C8[0x34]; +}; + +void RecordMixing_PrepareExchangePacket(void) +{ + sub_80BC300(); + sub_80C045C(); + + memcpy(unk_2018000.secretBases, recordMixingSecretBases, sizeof(unk_2018000.secretBases)); + memcpy(unk_2018000.tvShows, recordMixingTvShows, sizeof(unk_2018000.tvShows)); + memcpy(unk_2018000.filler1004, gUnknown_083D0274, sizeof(unk_2008000.filler1004)); + memcpy(unk_2018000.filler1044, gUnknown_083D0278, sizeof(unk_2008000.filler1044)); + memcpy(unk_2018000.easyChatPairs, recordMixingEasyChatPairs, sizeof(unk_2018000.easyChatPairs)); + gUnknown_02038738.data[0] = gSaveBlock1.filler_303C.data[0]; + gUnknown_02038738.data[1] = gSaveBlock1.filler_303C.data[1]; + sub_8041324(gSaveBlock1.daycareData, &gUnknown_02038738); + memcpy(&unk_2018000.filler10AC, gUnknown_083D0280, sizeof(struct RecordMixing_UnknownStruct)); + memcpy(unk_2018000.filler1124, gUnknown_083D0284, sizeof(unk_2018000.filler1124)); + + if (GetMultiplayerId() == 0) + unk_2018000.filler11C8[0] = GetRecordMixingGift(); +} + +void RecordMixing_ReceiveExchangePacket(u32 a) +{ + sub_80BD674(unk_2008000.secretBases, sizeof(struct PlayerRecords), a); + sub_80BFD44((u8 *)unk_2008000.tvShows, sizeof(struct PlayerRecords), a); + sub_80C0514(unk_2008000.filler1004, sizeof(struct PlayerRecords), a); + sub_80B9B1C(unk_2008000.filler1044, sizeof(struct PlayerRecords), a); + sub_80FA4E4(unk_2008000.easyChatPairs, sizeof(struct PlayerRecords), a); + sub_80B9C6C((u8 *)&unk_2008000.filler10AC, sizeof(struct PlayerRecords), a, unk_2008000.tvShows); + sub_80B9B70(unk_2008000.filler1124, sizeof(struct PlayerRecords), a); + sub_80B9F3C(unk_2008000.filler11C8, a); +} + +#define tCounter data[0] + +void Task_RecordMixing_SoundEffect(u8 taskId) +{ + gTasks[taskId].tCounter++; + if (gTasks[taskId].tCounter == 50) + { + PlaySE(SE_W213); + gTasks[taskId].tCounter = 0; + } +} + +#undef tCounter + + +#define tState data[0] +#define tSndEffTaskId data[15] + +void Task_RecordMixing_Main(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (tState) + { + case 0: // init + sub_8007270(gSpecialVar_0x8005); + VarSet(VAR_0x4000, 1); + gUnknown_03000718 = 0; + RecordMixing_PrepareExchangePacket(); + CreateRecordMixingSprite(); + tState = 1; + data[10] = CreateTask(sub_80B95F0, 0x50); + tSndEffTaskId = CreateTask(Task_RecordMixing_SoundEffect, 0x51); + break; + case 1: // wait for sub_80B95F0 + if (!gTasks[data[10]].isActive) + { + tState = 2; + FlagSet(SYS_MIX_RECORD); + DestroyRecordMixingSprite(); + DestroyTask(tSndEffTaskId); + } + break; + case 2: + data[10] = CreateTask(sub_80BA00C, 10); + tState = 3; + PlaySE(SE_W226); + break; + case 3: // wait for sub_80BA00C + if (!gTasks[data[10]].isActive) + { + tState = 4; + data[10] = sub_8083664(); + sub_80720B0(); + MenuPrint(gOtherText_MixingComplete, 2, 15); + data[8] = 0; + } + break; + case 4: // wait 60 frames + data[8]++; + if (data[8] > 60) + tState = 5; + break; + case 5: + if (!gTasks[data[10]].isActive) + { + sub_8055588(); + MenuZeroFillScreen(); + DestroyTask(taskId); + EnableBothScriptContexts(); + } + break; + } +} + +void sub_80B95F0(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->tState) + { + case 0: + sub_80B9A78(); + MenuDisplayMessageBox(); + MenuPrint(gOtherText_MixingRecordsWithFriend, 2, 15); + task->data[8] = 0x708; + task->tState = 400; + ClearLinkCallback_2(); + break; + case 100: // wait 20 frames + task->data[12]++; + if (task->data[12] > 20) + { + task->data[12] = 0; + task->tState = 101; + } + break; + case 101: + { + u8 players = GetLinkPlayerCount_2(); + + if (IsLinkMaster() == 1) + { + if (players == sub_800820C()) + { + PlaySE(SE_PIN); + task->tState = 201; + task->data[12] = 0; + } + } + else + { + PlaySE(SE_BOO); + task->tState = 301; + } + } + break; + case 201: + if (sub_800820C() == GetLinkPlayerCount_2()) + { + if (++task->data[12] > GetLinkPlayerCount_2() * 30) + { + sub_8007F4C(); + task->tState = 1; + } + } + break; + case 301: + if (sub_800820C() == GetLinkPlayerCount_2()) + task->tState = 1; + break; + case 400: // wait 20 frames + task->data[12]++; + if (task->data[12] > 20) + { + task->tState = 1; + task->data[12] = 0; + } + break; + case 1: // wait for handshake + if (gReceivedRemoteLinkPlayers) + { + ConvertIntToDecimalStringN(gStringVar1, GetMultiplayerId_(), 2, 2); + task->tState = 5; + } + break; + case 2: + { + u8 subTaskId; + + task->data[6] = GetLinkPlayerCount_2(); + task->tState = 0; + task->data[5] = GetMultiplayerId_(); + task->func = Task_RecordMixing_SendPacket; + StorePtrInTaskData(&unk_2018000, &task->data[2]); + subTaskId = CreateTask(Task_RecordMixing_CopyReceiveBuffer, 0x50); + task->data[10] = subTaskId; + gTasks[subTaskId].data[0] = taskId; + StorePtrInTaskData((u8 *)&unk_2008000, &gTasks[subTaskId].data[5]); + } + break; + case 5: // wait 60 frames + task->data[10]++; + if (task->data[10] > 60) + { + task->data[10] = 0; + task->tState = 2; + } + break; + } +} + +void Task_RecordMixing_SendPacket(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + // does this send the data 24 times? + + switch (task->tState) + { + case 0: //Copy record data to send buffer + { + void *recordData = (u8 *)LoadPtrFromTaskData(&task->data[2]) + BUFFER_CHUNK_SIZE * task->data[4]; + + memcpy(gBlockSendBuffer, recordData, BUFFER_CHUNK_SIZE); + task->tState++; + } + break; + case 1: + if (GetMultiplayerId() == 0) + sub_8007E9C(1); + task->tState++; + break; + case 2: + break; + case 3: + task->data[4]++; + if ((u16)task->data[4] == 24) + task->tState++; + else + task->tState = 0; + break; + case 4: + if (!gTasks[task->data[10]].isActive) + task->func = Task_RecordMixing_SendPacket_SwitchToReceive; + } +} + +void Task_RecordMixing_CopyReceiveBuffer(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s32 recvStatus = GetBlockReceivedStatus(); + u8 handledPlayers = 0; + + if (recvStatus == sub_8008198()) + { + u8 player; + + for (player = 0; player < GetLinkPlayerCount(); player++) + { + void *src; + u8 *dst; + + if ((recvStatus >> player) & 1) + { + dst = LoadPtrFromTaskData(&task->data[5]) + task->data[player + 1] * BUFFER_CHUNK_SIZE + player * sizeof(struct PlayerRecords); + src = GetPlayerRecvBuffer(player); + if ((task->data[player + 1] + 1) * BUFFER_CHUNK_SIZE > sizeof(struct PlayerRecords)) + memcpy(dst, src, sizeof(struct PlayerRecords) - task->data[player + 1] * BUFFER_CHUNK_SIZE); + else + memcpy(dst, src, BUFFER_CHUNK_SIZE); + ResetBlockReceivedFlag(player); + task->data[player + 1]++; + if ((u16)task->data[player + 1] == 0x18) + handledPlayers++; + } + } + gTasks[task->data[0]].data[0]++; + } + if (handledPlayers == GetLinkPlayerCount()) + DestroyTask(taskId); +} + +void sub_80B99B4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (!gTasks[task->data[10]].isActive) + DestroyTask(taskId); +} + +void Task_RecordMixing_ReceivePacket(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->func = sub_80B99B4; + if (gUnknown_03000718 == 1) + RecordMixing_ReceiveExchangePacket(task->data[5]); +} + +void Task_RecordMixing_SendPacket_SwitchToReceive(u8 taskId) +{ + gTasks[taskId].func = Task_RecordMixing_ReceivePacket; + gUnknown_03000718 = 1; +} + +void *LoadPtrFromTaskData(u16 *taskData) +{ + return (void *)(taskData[0] | (taskData[1] << 16)); +} + +void StorePtrInTaskData(void *ptr, u16 *taskData) +{ + taskData[0] = (u32)ptr; + taskData[1] = (u32)ptr >> 16; +} + +u8 GetMultiplayerId_(void) +{ + return GetMultiplayerId(); +} + +u16 *GetPlayerRecvBuffer(u8 player) +{ + return gBlockRecvBuffer[player]; +} + +void sub_80B9A78(void) +{ + gUnknown_03005D2C = sizeof(struct PlayerRecords); +} + +const u8 gUnknown_083D0288[2] = {1, 0}; + +const u8 gUnknown_083D028A[2][3] = +{ + {1, 2, 0}, + {2, 0, 1}, +}; + +const u8 gUnknown_083D0290[9][4] = +{ + {1, 0, 3, 2}, + {3, 0, 1, 2}, + {2, 0, 3, 1}, + {1, 3, 0, 2}, + {2, 3, 0, 1}, + {3, 2, 0, 1}, + {1, 2, 3, 0}, + {2, 3, 1, 0}, + {3, 2, 1, 0}, +}; + +void sub_80B9A88(u8 *a) +{ + u32 i; + u32 id; + u32 players = GetLinkPlayerCount(); + + switch (players) + { + case 2: + for (i = 0; i < 2; i++) + a[i] = gUnknown_083D0288[i]; + break; + case 3: + id = GetLinkPlayerTrainerId(0) % 2; + for (i = 0; i < 3; i++) + a[i] = gUnknown_083D028A[id][i]; + break; + case 4: + id = GetLinkPlayerTrainerId(0) % 9; + for (i = 0; i < 4; i++) + a[i] = gUnknown_083D0290[id][i]; + break; + default: + break; + } +} + +void sub_80B9B1C(u8 *a, size_t size, u8 index) +{ + u8 arr[4]; + u8 *ptr; + + sub_80B9A88(arr); + //Probably not how it was originally written, but this matches. + memcpy(a + index * size, (ptr = gUnknown_083D0278), 0x40); + memcpy(ptr, a + arr[index] * size, 0x40); + sub_80F7F30(); +} + +void sub_80B9B70(u8 *a, size_t size, u8 index) +{ + sub_80B9A88(gUnknown_0300071C); + memcpy(a + size * index, a + size * gUnknown_0300071C[index], 0xA4); + sub_8134AC0(a + size * index); +} + +u8 sub_80B9BBC(u16 *a) +{ + return a[16]; +} + +void sub_80B9BC4(u8 *a, size_t b, u8 c[][2], u8 d, u8 e) +{ + struct RecordMixing_UnknownStructSub *r6 = (struct RecordMixing_UnknownStructSub *)(a + b * c[d][0]); + struct RecordMixing_UnknownStructSub *src = r6 + c[d][1]; + struct RecordMixing_UnknownStructSub sp0 = *src; + struct RecordMixing_UnknownStructSub *r8 = (struct RecordMixing_UnknownStructSub *)(a + b * c[e][0]); + + r6 += c[d][1]; + *r6 = *(r8 + c[e][1]); + + r8 += c[e][1]; + *r8 = sp0; +} + +u8 sub_80B9C4C(u8 *a) +{ + int i; + u8 r2 = 0; + + for (i = 0; i < 0x100; i++) + r2 += a[i]; + return r2; +} + +const u8 gUnknown_083D02B4[][2] = +{ + {0, 1}, + {1, 2}, + {2, 0}, +}; + +const u8 gUnknown_083D02BA[3][4] = +{ + {0, 1, 2, 3}, + {0, 2, 1, 3}, + {0, 3, 2, 1}, +}; + +#ifdef NONMATCHING +void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) +{ + u8 r8; + u8 sp4[4]; + u8 sp8[4]; + void *spC[4]; + u8 sp1C[4][2]; + u8 sp24[4][2]; + u8 sp3C; + u16 sp40 = Random(); + u16 i; // r3 + u16 r7; + u8 r1; + struct RecordMixing_UnknownStruct *r6; + + //asm("":::"r8"); + SeedRng(gLinkPlayers[0].trainerId); + r8 = GetLinkPlayerCount(); + for (i = 0; i < 4; i++) + { + sp4[i] = 0xFF; + sp8[i] = 0; + sp1C[i][0] = 0; + sp1C[i][1] = 0; + } + sp3C = 0; + for (i = 0; i < r8; i++) + { + r6 = (struct RecordMixing_UnknownStruct *)(a + b * i); + if (r6->unk70 != 0) + { + for (r7 = 0; r7 < r6->unk70; r7++) + { + if (r6->unk74[r7] == 0) + sp1C[i][r7] = 1; + } + } + //_080B9D3C + } + //_080B9D46 + for (r7 = 0, i = 0; i < r8; i++) + { + r6 = (struct RecordMixing_UnknownStruct *)(a + b * i); + if (sp1C[i][0] == 1 || sp1C[i][1] == 1) + sp3C++; + if (sp1C[i][0] == 1 && sp1C[i][1] == 0) + { + sp24[r7][0] = i; + sp24[r7][1] = 0; + r7++; + } + else if (sp1C[i][0] == 0 && sp1C[i][1] == 1) + { + sp24[r7][0] = i; + sp24[r7][1] = 0; + r7++; + } + //else if (sp1C[i][0] == 1 + 1 && sp1C[i][1] + 1 == 1 + 1) + else if (sp1C[i][0] == 1 && sp1C[i][1] == 1) + { + u8 r4, r1; + + sp24[r7][0] = i; + r4 = sub_80B9BBC((u16 *)&r6->data[0]); + r1 = sub_80B9BBC((u16 *)&r6->data[1]); + + asm(""); + if (r4 == 0 && r1 != 0) + sp24[r7][1] = 1; + else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0)) + sp24[r7][1] = Random() % 2; + else + sp24[r7][1] = 0; + /* + if (r4 == 0 && r1 != 0) + sp24[r7][1] = 1; + else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0)) + sp24[r7][1] = Random() % 2; + else + sp24[r7][1] = 0; + */ + + /* + if (r4 == 0 && r1 != 0) + sp24[r7][1] = 1; + else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0)) + //sp24[r7][1] = ((Random() << 16) >> 16) % 2; + sp24[r7][1] = Random() % 2; + else + sp24[r7][1] = 0; + */ + //_080B9E2C: + r7++; + } + } + //_080B9E3E + for (i = 0; i < 4; i++) + { + r6 = (struct RecordMixing_UnknownStruct *)a + b * c; + spC[i] = r6; + } + r1 = sub_80B9C4C(d) % 3; + switch (sp3C) + { + case 2: + sub_80B9BC4(a, b, (u8 *)sp24, 0, 1); + break; + case 3: + { + u8 var1 = gUnknown_083D02B4[r1][0]; + u8 var2 = gUnknown_083D02B4[r1][1]; + sub_80B9BC4(a, b, (u8 *)sp24, var1, var2); + } + break; + case 4: + { + u8 *r6 = (u8 *)sp24; + u8 var1 = gUnknown_083D02BA[r1][0]; + u8 var2 = gUnknown_083D02BA[r1][1]; + sub_80B9BC4(a, b, r6, var1, var2); + } + { + u8 *r6 = (u8 *)sp24; + u8 var1 = gUnknown_083D02BA[r1][2]; + u8 var2 = gUnknown_083D02BA[r1][3]; + sub_80B9BC4(a, b, r6, var1, var2); + } + break; + } + //_080B9EF0 + //memcpy(&gSaveBlock1.filler_303C.data[0], a + b * c, 0x38); + //memcpy(&gSaveBlock1.filler_303C.data[1], a + b * c + 0x38, 0x38); + r6 = (struct RecordMixing_UnknownStruct *)(a + b * c); + gSaveBlock1.filler_303C.data[0] = r6->data[0]; + gSaveBlock1.filler_303C.data[1] = r6->data[1]; + //memcpy(&gSaveBlock1.filler_303C.data[0], &r6->data[0], 0x38); + //memcpy(&gSaveBlock1.filler_303C.data[1], &r6->data[1], 0x38); + SeedRng(sp40); +} +#else +__attribute__((naked)) +void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x58\n\ + str r0, [sp, 0x2C]\n\ + str r1, [sp, 0x30]\n\ + str r3, [sp, 0x38]\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + str r2, [sp, 0x34]\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x40]\n\ + ldr r0, _080B9DA8 @ =gLinkPlayers\n\ + ldrh r0, [r0, 0x4]\n\ + bl SeedRng\n\ + bl GetLinkPlayerCount\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + movs r3, 0\n\ + add r0, sp, 0x1C\n\ + mov r9, r0\n\ + movs r1, 0x1D\n\ + add r1, sp\n\ + mov r10, r1\n\ + mov r2, sp\n\ + adds r2, 0xC\n\ + str r2, [sp, 0x4C]\n\ + movs r7, 0xFF\n\ + add r4, sp, 0x8\n\ + movs r2, 0\n\ + mov r6, r9\n\ + mov r5, r10\n\ +_080B9CBC:\n\ + mov r1, sp\n\ + adds r1, r3\n\ + adds r1, 0x4\n\ + ldrb r0, [r1]\n\ + orrs r0, r7\n\ + strb r0, [r1]\n\ + adds r0, r4, r3\n\ + strb r2, [r0]\n\ + lsls r1, r3, 1\n\ + adds r0, r6, r1\n\ + strb r2, [r0]\n\ + adds r1, r5, r1\n\ + strb r2, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x3\n\ + bls _080B9CBC\n\ + movs r4, 0\n\ + str r4, [sp, 0x3C]\n\ + movs r3, 0\n\ + mov r1, r8\n\ + lsls r0, r1, 16\n\ + lsrs r1, r0, 16\n\ + str r0, [sp, 0x50]\n\ + ldr r4, [sp, 0x30]\n\ + ldr r0, [sp, 0x34]\n\ + adds r2, r4, 0\n\ + muls r2, r0\n\ + str r2, [sp, 0x48]\n\ + ldr r2, [sp, 0x3C]\n\ + cmp r2, r1\n\ + bcs _080B9D46\n\ + mov r8, r1\n\ +_080B9D00:\n\ + ldr r4, [sp, 0x30]\n\ + adds r0, r4, 0\n\ + muls r0, r3\n\ + ldr r1, [sp, 0x2C]\n\ + adds r6, r1, r0\n\ + ldr r0, [r6, 0x70]\n\ + cmp r0, 0\n\ + beq _080B9D3C\n\ + movs r7, 0\n\ + cmp r7, r0\n\ + bcs _080B9D3C\n\ + adds r4, r6, 0\n\ + adds r4, 0x74\n\ + mov r2, r9\n\ + lsls r1, r3, 1\n\ + movs r5, 0x1\n\ +_080B9D20:\n\ + lsls r0, r7, 1\n\ + adds r0, r4, r0\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + bne _080B9D30\n\ + adds r0, r7, r1\n\ + adds r0, r2, r0\n\ + strb r5, [r0]\n\ +_080B9D30:\n\ + adds r0, r7, 0x1\n\ + lsls r0, 16\n\ + lsrs r7, r0, 16\n\ + ldr r0, [r6, 0x70]\n\ + cmp r7, r0\n\ + bcc _080B9D20\n\ +_080B9D3C:\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, r8\n\ + bcc _080B9D00\n\ +_080B9D46:\n\ + movs r7, 0\n\ + movs r3, 0\n\ + ldr r2, [sp, 0x50]\n\ + cmp r2, 0\n\ + beq _080B9E3E\n\ + mov r4, sp\n\ + adds r4, 0x24\n\ + str r4, [sp, 0x44]\n\ + movs r0, 0x25\n\ + add r0, sp\n\ + mov r8, r0\n\ +_080B9D5C:\n\ + ldr r1, [sp, 0x30]\n\ + adds r0, r1, 0\n\ + muls r0, r3\n\ + ldr r2, [sp, 0x2C]\n\ + adds r6, r2, r0\n\ + lsls r1, r3, 1\n\ + mov r4, r9\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + beq _080B9D7C\n\ + mov r2, r10\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + bne _080B9D86\n\ +_080B9D7C:\n\ + ldr r0, [sp, 0x3C]\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x3C]\n\ +_080B9D86:\n\ + mov r4, r9\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + bne _080B9DAC\n\ + mov r2, r10\n\ + adds r0, r2, r1\n\ + ldrb r2, [r0]\n\ + cmp r2, 0\n\ + bne _080B9DAC\n\ +_080B9D9A:\n\ + lsls r1, r7, 1\n\ + ldr r4, [sp, 0x44]\n\ + adds r0, r4, r1\n\ + strb r3, [r0]\n\ + add r1, r8\n\ + strb r2, [r1]\n\ + b _080B9E2C\n\ + .align 2, 0\n\ +_080B9DA8: .4byte gLinkPlayers\n\ +_080B9DAC:\n\ + mov r2, r9\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _080B9DC0\n\ + mov r4, r10\n\ + adds r0, r4, r1\n\ + ldrb r2, [r0]\n\ + cmp r2, 0x1\n\ + beq _080B9D9A\n\ +_080B9DC0:\n\ + mov r2, r9\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + bne _080B9E32\n\ + mov r4, r10\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + bne _080B9E32\n\ + lsls r5, r7, 1\n\ + ldr r1, [sp, 0x44]\n\ + adds r0, r1, r5\n\ + strb r3, [r0]\n\ + adds r0, r6, 0\n\ + str r3, [sp, 0x54]\n\ + bl sub_80B9BBC\n\ + adds r4, r0, 0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + adds r0, r6, 0\n\ + adds r0, 0x38\n\ + bl sub_80B9BBC\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + ldr r3, [sp, 0x54]\n\ + cmp r4, 0\n\ + bne _080B9E0A\n\ + cmp r1, 0\n\ + beq _080B9E0E\n\ + mov r2, r8\n\ + adds r1, r2, r5\n\ + movs r0, 0x1\n\ + strb r0, [r1]\n\ + b _080B9E2C\n\ +_080B9E0A:\n\ + cmp r1, 0\n\ + beq _080B9E26\n\ +_080B9E0E:\n\ + str r3, [sp, 0x54]\n\ + bl Random\n\ + mov r4, r8\n\ + adds r2, r4, r5\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x1\n\ + ands r0, r1\n\ + strb r0, [r2]\n\ + ldr r3, [sp, 0x54]\n\ + b _080B9E2C\n\ +_080B9E26:\n\ + mov r2, r8\n\ + adds r0, r2, r5\n\ + strb r1, [r0]\n\ +_080B9E2C:\n\ + adds r0, r7, 0x1\n\ + lsls r0, 16\n\ + lsrs r7, r0, 16\n\ +_080B9E32:\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldr r4, [sp, 0x50]\n\ + cmp r0, r4\n\ + bcc _080B9D5C\n\ +_080B9E3E:\n\ + movs r3, 0\n\ + ldr r1, [sp, 0x48]\n\ + lsls r0, r1, 4\n\ + subs r0, r1\n\ + lsls r0, 3\n\ + ldr r2, [sp, 0x2C]\n\ + adds r6, r2, r0\n\ + ldr r1, [sp, 0x4C]\n\ +_080B9E4E:\n\ + lsls r0, r3, 2\n\ + adds r0, r1, r0\n\ + str r6, [r0]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x3\n\ + bls _080B9E4E\n\ + ldr r0, [sp, 0x38]\n\ + bl sub_80B9C4C\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + movs r1, 0x3\n\ + bl __umodsi3\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + ldr r4, [sp, 0x3C]\n\ + cmp r4, 0x3\n\ + beq _080B9E9C\n\ + cmp r4, 0x3\n\ + bgt _080B9E82\n\ + cmp r4, 0x2\n\ + beq _080B9E8A\n\ + b _080B9EF0\n\ +_080B9E82:\n\ + ldr r0, [sp, 0x3C]\n\ + cmp r0, 0x4\n\ + beq _080B9EBC\n\ + b _080B9EF0\n\ +_080B9E8A:\n\ + add r2, sp, 0x24\n\ + movs r0, 0x1\n\ + str r0, [sp]\n\ + ldr r0, [sp, 0x2C]\n\ + ldr r1, [sp, 0x30]\n\ + movs r3, 0\n\ + bl sub_80B9BC4\n\ + b _080B9EF0\n\ +_080B9E9C:\n\ + ldr r0, _080B9EB8 @ =gUnknown_083D02B4\n\ + lsls r1, 1\n\ + adds r2, r1, r0\n\ + ldrb r3, [r2]\n\ + adds r0, 0x1\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + add r2, sp, 0x24\n\ + str r0, [sp]\n\ + ldr r0, [sp, 0x2C]\n\ + ldr r1, [sp, 0x30]\n\ + bl sub_80B9BC4\n\ + b _080B9EF0\n\ + .align 2, 0\n\ +_080B9EB8: .4byte gUnknown_083D02B4\n\ +_080B9EBC:\n\ + add r6, sp, 0x24\n\ + ldr r4, _080B9F2C @ =gUnknown_083D02BA\n\ + lsls r5, r1, 2\n\ + adds r0, r5, r4\n\ + ldrb r3, [r0]\n\ + adds r0, r4, 0x1\n\ + adds r0, r5, r0\n\ + ldrb r0, [r0]\n\ + str r0, [sp]\n\ + ldr r0, [sp, 0x2C]\n\ + ldr r1, [sp, 0x30]\n\ + adds r2, r6, 0\n\ + bl sub_80B9BC4\n\ + adds r0, r4, 0x2\n\ + adds r0, r5, r0\n\ + ldrb r3, [r0]\n\ + adds r4, 0x3\n\ + adds r5, r4\n\ + ldrb r0, [r5]\n\ + str r0, [sp]\n\ + ldr r0, [sp, 0x2C]\n\ + ldr r1, [sp, 0x30]\n\ + adds r2, r6, 0\n\ + bl sub_80B9BC4\n\ +_080B9EF0:\n\ + ldr r1, [sp, 0x2C]\n\ + ldr r2, [sp, 0x48]\n\ + adds r6, r1, r2\n\ + ldr r4, _080B9F30 @ =gSaveBlock1\n\ + ldr r1, _080B9F34 @ =0x0000303c\n\ + adds r0, r4, r1\n\ + adds r1, r6, 0\n\ + movs r2, 0x38\n\ + bl memcpy\n\ + ldr r2, _080B9F38 @ =0x00003074\n\ + adds r4, r2\n\ + adds r1, r6, 0\n\ + adds r1, 0x38\n\ + adds r0, r4, 0\n\ + movs r2, 0x38\n\ + bl memcpy\n\ + ldr r0, [sp, 0x40]\n\ + bl SeedRng\n\ + add sp, 0x58\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B9F2C: .4byte gUnknown_083D02BA\n\ +_080B9F30: .4byte gSaveBlock1\n\ +_080B9F34: .4byte 0x0000303c\n\ +_080B9F38: .4byte 0x00003074\n\ + .syntax divided\n"); +} +#endif + +void sub_80B9F3C(u16 *a, u8 b) +{ + if (b != 0 && *a != 0) + { + if (GetPocketByItemId(*a) == 5) + { + if (!CheckBagHasItem(*a, 1) && !CheckPCHasItem(*a, 1) && AddBagItem(*a, 1)) + { + VarSet(VAR_0x4001, *a); + StringCopy(gStringVar1, gLinkPlayers[0].name); + if (*a == ITEM_EON_TICKET) + FlagSet(SYS_HAS_EON_TICKET); + } + else + { + VarSet(VAR_0x4001, ITEM_NONE); + } + } + else + { + if (AddBagItem(*a, 1) == TRUE) + { + VarSet(VAR_0x4001, *a); + StringCopy(gStringVar1, gLinkPlayers[0].name); + } + else + { + VarSet(VAR_0x4001, ITEM_NONE); + } + } + } +} + +void sub_80BA00C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[0]++; + break; + case 1: + task->data[0]++; + break; + case 2: + SetSecretBase2Field_9_AndHideBG(); + sub_8125E2C(); + task->data[0]++; + break; + case 3: + if (sub_8125E6C() != 0) + { + ClearSecretBase2Field_9_2(); + task->data[0]++; + task->data[1] = 0; + } + break; + case 4: + task->data[1]++; + if (task->data[1] > 10) + { + sub_800832C(); + task->data[0]++; + } + break; + case 5: + if (!gReceivedRemoteLinkPlayers) + DestroyTask(taskId); + break; + } +} diff --git a/src/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c new file mode 100644 index 000000000..d052992ad --- /dev/null +++ b/src/engine/reset_rtc_screen.c @@ -0,0 +1,496 @@ +#include "global.h" +#include "event_data.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "rtc.h" +#include "save.h" +#include "sprite.h" +#include "songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "strings2.h" +#include "task.h" +#include "text.h" +#include "unknown_task.h" + +struct ResetRtcStruct +{ + /*0x0*/ u8 dataIndex; + /*0x2*/ u16 minVal; + /*0x4*/ u16 maxVal; + /*0x6*/ u8 left; + /*0x7*/ u8 right; + /*0x8*/ u8 unk8; +}; + +extern u16 gSaveFileStatus; + +extern struct ResetRtcStruct gUnknown_08376420[]; +extern struct SpritePalette gUnknown_083764BC; +extern struct SpriteTemplate gSpriteTemplate_83764E8; +extern u8 gUnknown_08376500[]; + +void CB2_ResetRtcScreen(void); +void VBlankCB_ResetRtcScreen(void); +void Task_ResetRtcScreen(u8); + +void SpriteCB_ResetRtcCusor0(struct Sprite *sprite) +{ + int state = gTasks[sprite->data0].data[2]; + if (state != sprite->data1) + { + sprite->data1 = state; + switch (state) + { + case 1: + sprite->invisible = FALSE; + sprite->animNum = 1; + sprite->animDelayCounter = 0; + sprite->pos1.x = 53; + sprite->pos1.y = 68; + break; + case 2: + sprite->invisible = FALSE; + sprite->animNum = 1; + sprite->animDelayCounter = 0; + sprite->pos1.x = 86; + sprite->pos1.y = 68; + break; + case 3: + sprite->invisible = FALSE; + sprite->animNum = 1; + sprite->animDelayCounter = 0; + sprite->pos1.x = 107; + sprite->pos1.y = 68; + break; + case 4: + sprite->invisible = FALSE; + sprite->animNum = 1; + sprite->animDelayCounter = 0; + sprite->pos1.x = 128; + sprite->pos1.y = 68; + break; + case 5: + sprite->invisible = FALSE; + sprite->animNum = 2; + sprite->animDelayCounter = 0; + sprite->pos1.x = 155; + sprite->pos1.y = 80; + break; + case 6: + DestroySprite(sprite); + break; + } + } +} + +void SpriteCB_ResetRtcCusor1(struct Sprite *sprite) +{ + int state = gTasks[sprite->data0].data[2]; + if (state != sprite->data1) + { + sprite->data1 = state; + switch (state) + { + case 1: + sprite->invisible = FALSE; + sprite->animNum = 0; + sprite->animDelayCounter = 0; + sprite->pos1.x = 53; + sprite->pos1.y = 92; + break; + case 2: + sprite->invisible = FALSE; + sprite->animNum = 0; + sprite->animDelayCounter = 0; + sprite->pos1.x = 86; + sprite->pos1.y = 92; + break; + case 3: + sprite->invisible = FALSE; + sprite->animNum = 0; + sprite->animDelayCounter = 0; + sprite->pos1.x = 107; + sprite->pos1.y = 92; + break; + case 4: + sprite->invisible = FALSE; + sprite->animNum = 0; + sprite->animDelayCounter = 0; + sprite->pos1.x = 128; + sprite->pos1.y = 92; + break; + case 5: + sprite->invisible = TRUE; + break; + case 6: + DestroySprite(sprite); + break; + } + } +} + +void ResetRtcScreen_CreateCursor(u8 taskId) +{ + int spriteId; + + LoadSpritePalette(&gUnknown_083764BC); + + spriteId = CreateSpriteAtEnd(&gSpriteTemplate_83764E8, 53, 68, 0); + gSprites[spriteId].callback = SpriteCB_ResetRtcCusor0; + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].data1 = -1; + + spriteId = CreateSpriteAtEnd(&gSpriteTemplate_83764E8, 53, 68, 0); + gSprites[spriteId].callback = SpriteCB_ResetRtcCusor1; + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].data1 = -1; +} + +void ResetRtcScreen_FreeCursorPalette(void) +{ + FreeSpritePaletteByTag(gUnknown_083764BC.tag); +} + +void ResetRtcScreen_HideChooseTimeWindow(void) +{ + MenuZeroFillWindowRect(3, 8, 25, 11); +} + +void ResetRtcScreen_PrintTime(u8 x, u8 y, u16 days, u8 hours, u8 minutes, u8 seconds) +{ + u8 *dest = gStringVar4; + days %= 10000; + hours %= 24; + minutes %= 60; + seconds %= 60; + sub_8072C44(gStringVar1, days, 24, 1); + dest = StringCopy(dest, gStringVar1); + dest = StringCopy(dest, gOtherText_Day); + sub_8072C44(gStringVar1, hours, 18, 1); + dest = StringCopy(dest, gStringVar1); + dest = StringCopy(dest, gUnknown_08376500); + dest = ConvertIntToDecimalStringN(dest, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); + dest = StringCopy(dest, gUnknown_08376500); + ConvertIntToDecimalStringN(dest, seconds, STR_CONV_MODE_LEADING_ZEROS, 2); + MenuPrint(gStringVar4, x, y); +} + +void ResetRtcScreen_ShowChooseTimeWindow(u16 days, u8 hours, u8 minutes, u8 seconds) +{ + MenuDrawTextWindow(3, 8, 25, 11); + MenuPrint(gOtherText_OK, 20, 9); + ResetRtcScreen_PrintTime(4, 9, days, hours, minutes, seconds); +} + +bool32 ResetRtcScreen_MoveTimeUpDown(s16 *val, int minVal, int maxVal, u16 keys) +{ + if (keys & DPAD_DOWN) + { + (*val)--; + if (*val < minVal) + *val = maxVal; + } + else if (keys & DPAD_UP) + { + (*val)++; + if (*val > maxVal) + *val = minVal; + } + else if (keys & DPAD_LEFT) + { + *val -= 10; + if (*val < minVal) + *val = maxVal; + } + else if (keys & DPAD_RIGHT) + { + *val += 10; + if (*val > maxVal) + *val = minVal; + } + else + { + return FALSE; + } + + return TRUE; +} + +void Task_ResetRtc_3(u8 taskId) +{ + gTasks[taskId].data[0] = 1; +} + +void Task_ResetRtc_2(u8 taskId) +{ + ResetRtcScreen_HideChooseTimeWindow(); + ResetRtcScreen_FreeCursorPalette(); + gTasks[taskId].func = Task_ResetRtc_3; +} + +void Task_ResetRtc_1(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u8 selection = data[2]; + struct ResetRtcStruct *selectionInfo = &gUnknown_08376420[selection - 1]; + + if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].func = Task_ResetRtc_2; + data[1] = 0; + data[2] = 6; + PlaySE(SE_SELECT); + return; + } + + if (gMain.newKeys & DPAD_RIGHT) + { + if (selectionInfo->right) + { + data[2] = selectionInfo->right; + PlaySE(SE_SELECT); + return; + } + } + + if (gMain.newKeys & DPAD_LEFT) + { + if (selectionInfo->left) + { + data[2] = selectionInfo->left; + PlaySE(SE_SELECT); + return; + } + } + + if (selection == 5) + { + if (gMain.newKeys & A_BUTTON) + { + gLocalTime.days = data[3]; + gLocalTime.hours = data[4]; + gLocalTime.minutes = data[5]; + gLocalTime.seconds = data[6]; + PlaySE(SE_SELECT); + gTasks[taskId].func = Task_ResetRtc_2; + data[1] = 1; + data[2] = 6; + } + } + else if (ResetRtcScreen_MoveTimeUpDown(&data[selectionInfo->dataIndex], selectionInfo->minVal, selectionInfo->maxVal, gMain.newAndRepeatedKeys & (DPAD_UP | DPAD_DOWN))) + { + PlaySE(SE_SELECT); + ResetRtcScreen_PrintTime(4, 9, data[3], data[4], data[5], data[6]); + } +} + +void Task_ResetRtc_0(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + data[0] = 0; + data[3] = gLocalTime.days; + data[4] = gLocalTime.hours; + data[5] = gLocalTime.minutes; + data[6] = gLocalTime.seconds; + ResetRtcScreen_ShowChooseTimeWindow(data[3], data[4], data[5], data[6]); + ResetRtcScreen_CreateCursor(taskId); + data[2] = 2; + gTasks[taskId].func = Task_ResetRtc_1; +} + +void CB2_InitResetRtcScreen(void) +{ + u8 *addr; + u32 size; + + REG_DISPCNT = 0; + SetVBlankCallback(NULL); + + DmaClear16(3, PLTT, PLTT_SIZE); + + 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; + } + } + + ResetOamRange(0, 128); + LoadOam(); + remove_some_task(); + dp12_8087EA4(); + ResetSpriteData(); + ResetTasks(); + ResetPaletteFade(); + SetUpWindowConfig(&gWindowConfig_81E6CE4); + InitMenuWindow(&gWindowConfig_81E6CE4); + REG_DISPCNT = 4352; + SetVBlankCallback(VBlankCB_ResetRtcScreen); + SetMainCallback2(CB2_ResetRtcScreen); + CreateTask(Task_ResetRtcScreen, 80); +} + +void CB2_ResetRtcScreen(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void VBlankCB_ResetRtcScreen(void) +{ + ProcessSpriteCopyRequests(); + LoadOam(); + TransferPlttBuffer(); +} + +void ResetRtcScreen_ShowMessage(const u8 *str) +{ + MenuDisplayMessageBox(); + MenuPrint(str, 2, 15); +} + +void Task_ShowResetRtcPrompt(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + MenuZeroFillScreen(); + MenuDrawTextWindow(0, 0, 20, 10); + MenuPrint(gSystemText_PresentTime, 1, 1); + ResetRtcScreen_PrintTime( + 1, + 3, + gLocalTime.days, + gLocalTime.hours, + gLocalTime.minutes, + gLocalTime.seconds); + MenuPrint(gSystemText_PreviousTime, 1, 5); + ResetRtcScreen_PrintTime( + 1, + 7, + gSaveBlock2.lastBerryTreeUpdate.days, + gSaveBlock2.lastBerryTreeUpdate.hours, + gSaveBlock2.lastBerryTreeUpdate.minutes, + gSaveBlock2.lastBerryTreeUpdate.seconds); + ResetRtcScreen_ShowMessage(gSystemText_ResetRTCPrompt); + data[0]++; + case 1: + if (gMain.newKeys & B_BUTTON) + { + DestroyTask(taskId); + DoSoftReset(); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + DestroyTask(taskId); + } + break; + } +} + +void Task_ResetRtcScreen(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 1, 0x10, 0, 0xFFFF); + data[0] = 1; + break; + case 1: + if (!gPaletteFade.active) + { + if (gSaveFileStatus == 0 || gSaveFileStatus == 2) + { + ResetRtcScreen_ShowMessage(gSystemText_NoSaveFileNoTime); + data[0] = 5; + } + else + { + RtcCalcLocalTime(); + data[1] = CreateTask(Task_ShowResetRtcPrompt, 80); + data[0] = 2; + } + } + break; + case 2: + if (gTasks[data[1]].isActive != TRUE) + { + MenuZeroFillScreen(); + ResetRtcScreen_ShowMessage(gSystemText_PleaseResetTime); + gLocalTime = gSaveBlock2.lastBerryTreeUpdate; + data[1] = CreateTask(Task_ResetRtc_0, 80); + data[0] = 3; + } + break; + case 3: + if (gTasks[data[1]].data[0]) + { + if (!gTasks[data[1]].data[1]) + { + DestroyTask(data[1]); + data[0] = 2; + } + else + { + DestroyTask(data[1]); + RtcReset(); + RtcCalcLocalTimeOffset( + gLocalTime.days, + gLocalTime.hours, + gLocalTime.minutes, + gLocalTime.seconds); + gSaveBlock2.lastBerryTreeUpdate = gLocalTime; + VarSet(VAR_DAYS, gLocalTime.days); + DisableResetRTC(); + ResetRtcScreen_ShowMessage(gSystemText_ClockResetDataSave); + data[0] = 4; + } + } + break; + case 4: + if (TrySavingData(0) == TRUE) + { + ResetRtcScreen_ShowMessage(gSystemText_SaveCompleted); + PlaySE(SE_PINPON); + } + else + { + ResetRtcScreen_ShowMessage(gSystemText_SaveFailed); + PlaySE(SE_BOO); + } + data[0] = 5; + case 5: + if (gMain.newKeys & A_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 1, 0, 0x10, 0xFFFF); + data[0] = 6; + } + else + { + break; + } + case 6: + if (!gPaletteFade.active) + { + DestroyTask(taskId); + DoSoftReset(); + } + } +} diff --git a/src/engine/rng.c b/src/engine/rng.c new file mode 100644 index 000000000..7d4b5600e --- /dev/null +++ b/src/engine/rng.c @@ -0,0 +1,18 @@ +#include "global.h" +#include "rng.h" + +// The number 1103515245 comes from the example implementation of rand and srand +// in the ISO C standard. + +u32 gRngValue; + +u16 Random(void) +{ + gRngValue = 1103515245 * gRngValue + 24691; + return gRngValue >> 16; +} + +void SeedRng(u16 seed) +{ + gRngValue = seed; +} diff --git a/src/engine/rtc.c b/src/engine/rtc.c new file mode 100644 index 000000000..d73f943d2 --- /dev/null +++ b/src/engine/rtc.c @@ -0,0 +1,349 @@ +#include "global.h" +#include "rtc.h" +#include "string_util.h" +#include "text.h" + +static u16 sErrorStatus; +static struct SiiRtcInfo sRtc; +static u8 sProbeResult; +static u16 sSavedIme; + +struct Time gLocalTime; + +static const struct SiiRtcInfo sRtcDummy = {0, MONTH_JAN, 1}; // 2000 Jan 1 + +static const s32 sNumDaysInMonths[12] = +{ + 31, + 28, + 31, + 30, + 31, + 30, + 31, + 31, + 30, + 31, + 30, + 31, +}; + +void RtcDisableInterrupts() +{ + sSavedIme = REG_IME; + REG_IME = 0; +} + +void RtcRestoreInterrupts() +{ + REG_IME = sSavedIme; +} + +u32 ConvertBcdToBinary(u8 bcd) +{ + if (bcd > 0x9F) + return 0xFF; + + if ((bcd & 0xF) <= 9) + return (10 * ((bcd >> 4) & 0xF)) + (bcd & 0xF); + else + return 0xFF; +} + +bool8 IsLeapYear(u8 year) +{ + if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) + return TRUE; + + return FALSE; +} + +u16 ConvertDateToDayCount(u8 year, u8 month, u8 day) +{ + s32 i; + u16 dayCount = 0; + +#ifndef BUGFIX_BERRY + // The berry glitch was caused by not adding days for the year 2000. + for (i = year - 1; i > 0; i--) + { + dayCount += 365; + + if (IsLeapYear(i) == TRUE) + dayCount++; + } +#else + // The fix was to use "i >= 0" as the condition instead of "i > 0". + for (i = year - 1; i >= 0; i--) + { + dayCount += 365; + + if (IsLeapYear(i) == TRUE) + dayCount++; + } +#endif // BUGFIX_BERRY + + for (i = 0; i < month - 1; i++) + dayCount += sNumDaysInMonths[i]; + + if (month > MONTH_FEB && IsLeapYear(year) == TRUE) + dayCount++; + + dayCount += day; + + return dayCount; +} + +u16 RtcGetDayCount(struct SiiRtcInfo *rtc) +{ + u8 year = ConvertBcdToBinary(rtc->year); + u8 month = ConvertBcdToBinary(rtc->month); + u8 day = ConvertBcdToBinary(rtc->day); + return ConvertDateToDayCount(year, month, day); +} + +void RtcInit() +{ + sErrorStatus = 0; + + RtcDisableInterrupts(); + SiiRtcUnprotect(); + sProbeResult = SiiRtcProbe(); + RtcRestoreInterrupts(); + + if (!(sProbeResult & 0xF)) + { + sErrorStatus = RTC_INIT_ERROR; + return; + } + + if (sProbeResult & 0xF0) + sErrorStatus = RTC_INIT_WARNING; + else + sErrorStatus = 0; + + RtcGetRawInfo(&sRtc); + sErrorStatus = RtcCheckInfo(&sRtc); +} + +u16 RtcGetErrorStatus() +{ + return sErrorStatus; +} + +void RtcGetInfo(struct SiiRtcInfo *rtc) +{ + if (sErrorStatus & RTC_ERR_FLAG_MASK) + *rtc = sRtcDummy; + else + RtcGetRawInfo(rtc); +} + +void RtcGetDateTime(struct SiiRtcInfo *rtc) +{ + RtcDisableInterrupts(); + SiiRtcGetDateTime(rtc); + RtcRestoreInterrupts(); +} + +void RtcGetStatus(struct SiiRtcInfo *rtc) +{ + RtcDisableInterrupts(); + SiiRtcGetStatus(rtc); + RtcRestoreInterrupts(); +} + +void RtcGetRawInfo(struct SiiRtcInfo *rtc) +{ + RtcGetStatus(rtc); + RtcGetDateTime(rtc); +} + +u16 RtcCheckInfo(struct SiiRtcInfo *rtc) +{ + u16 errorFlags = 0; + s32 year; + s32 month; + s32 value; + + if (rtc->status & SIIRTCINFO_POWER) + errorFlags |= RTC_ERR_POWER_FAILURE; + + if (!(rtc->status & SIIRTCINFO_24HOUR)) + errorFlags |= RTC_ERR_12HOUR_CLOCK; + + year = ConvertBcdToBinary(rtc->year); + + if (year == 0xFF) + errorFlags |= RTC_ERR_INVALID_YEAR; + + month = ConvertBcdToBinary(rtc->month); + + if (month == 0xFF || month == 0 || month > 12) + errorFlags |= RTC_ERR_INVALID_MONTH; + + value = ConvertBcdToBinary(rtc->day); + + if (value == 0xFF) + errorFlags |= RTC_ERR_INVALID_DAY; + + if (month == MONTH_FEB) + { + if (value > IsLeapYear(year) + sNumDaysInMonths[month - 1]) + errorFlags |= RTC_ERR_INVALID_DAY; + } + else + { + if (value > sNumDaysInMonths[month - 1]) + errorFlags |= RTC_ERR_INVALID_DAY; + } + + value = ConvertBcdToBinary(rtc->hour); + + if (value > 24) + errorFlags |= RTC_ERR_INVALID_HOUR; + + value = ConvertBcdToBinary(rtc->minute); + + if (value > 60) + errorFlags |= RTC_ERR_INVALID_MINUTE; + + value = ConvertBcdToBinary(rtc->second); + + if (value > 60) + errorFlags |= RTC_ERR_INVALID_SECOND; + + return errorFlags; +} + +void RtcReset() +{ + RtcDisableInterrupts(); + SiiRtcReset(); + RtcRestoreInterrupts(); +} + +void FormatDecimalTime(u8 *dest, s32 hour, s32 minute, s32 second) +{ + dest = ConvertIntToDecimalStringN(dest, hour, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest++ = CHAR_COLON; + dest = ConvertIntToDecimalStringN(dest, minute, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest++ = CHAR_COLON; + dest = ConvertIntToDecimalStringN(dest, second, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest = EOS; +} + +void FormatHexTime(u8 *dest, s32 hour, s32 minute, s32 second) +{ + dest = ConvertIntToHexStringN(dest, hour, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest++ = CHAR_COLON; + dest = ConvertIntToHexStringN(dest, minute, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest++ = CHAR_COLON; + dest = ConvertIntToHexStringN(dest, second, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest = EOS; +} + +void FormatHexRtcTime(u8 *dest) +{ + FormatHexTime(dest, sRtc.hour, sRtc.minute, sRtc.second); +} + +void FormatDecimalDate(u8 *dest, s32 year, s32 month, s32 day) +{ + dest = ConvertIntToDecimalStringN(dest, year, STR_CONV_MODE_LEADING_ZEROS, 4); + *dest++ = CHAR_HYPHEN; + dest = ConvertIntToDecimalStringN(dest, month, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest++ = CHAR_HYPHEN; + dest = ConvertIntToDecimalStringN(dest, day, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest = EOS; +} + +void FormatHexDate(u8 *dest, s32 year, s32 month, s32 day) +{ + dest = ConvertIntToHexStringN(dest, year, STR_CONV_MODE_LEADING_ZEROS, 4); + *dest++ = CHAR_HYPHEN; + dest = ConvertIntToHexStringN(dest, month, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest++ = CHAR_HYPHEN; + dest = ConvertIntToHexStringN(dest, day, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest = EOS; +} + +void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct Time *t) +{ + u16 days = RtcGetDayCount(rtc); + result->seconds = ConvertBcdToBinary(rtc->second) - t->seconds; + result->minutes = ConvertBcdToBinary(rtc->minute) - t->minutes; + result->hours = ConvertBcdToBinary(rtc->hour) - t->hours; + result->days = days - t->days; + + if (result->seconds < 0) + { + result->seconds += 60; + --result->minutes; + } + + if (result->minutes < 0) + { + result->minutes += 60; + --result->hours; + } + + if (result->hours < 0) + { + result->hours += 24; + --result->days; + } +} + +void RtcCalcLocalTime() +{ + RtcGetInfo(&sRtc); + RtcCalcTimeDifference(&sRtc, &gLocalTime, &gSaveBlock2.localTimeOffset); +} + +void RtcInitLocalTimeOffset(s32 hour, s32 minute) +{ + RtcCalcLocalTimeOffset(0, hour, minute, 0); +} + +void RtcCalcLocalTimeOffset(s32 days, s32 hours, s32 minutes, s32 seconds) +{ + gLocalTime.days = days; + gLocalTime.hours = hours; + gLocalTime.minutes = minutes; + gLocalTime.seconds = seconds; + RtcGetInfo(&sRtc); + RtcCalcTimeDifference(&sRtc, &gSaveBlock2.localTimeOffset, &gLocalTime); +} + +void CalcTimeDifference(struct Time *result, struct Time *t1, struct Time *t2) +{ + result->seconds = t2->seconds - t1->seconds; + result->minutes = t2->minutes - t1->minutes; + result->hours = t2->hours - t1->hours; + result->days = t2->days - t1->days; + + if (result->seconds < 0) + { + result->seconds += 60; + --result->minutes; + } + + if (result->minutes < 0) + { + result->minutes += 60; + --result->hours; + } + + if (result->hours < 0) + { + result->hours += 24; + --result->days; + } +} + +u32 RtcGetMinuteCount() +{ + RtcGetInfo(&sRtc); + return (24 * 60) * RtcGetDayCount(&sRtc) + 60 * sRtc.hour + sRtc.minute; +} diff --git a/src/engine/save.c b/src/engine/save.c new file mode 100644 index 000000000..adf39268e --- /dev/null +++ b/src/engine/save.c @@ -0,0 +1,797 @@ +#include "global.h" +#include "gba/gba.h" +#include "gba/flash_internal.h" +#include "save.h" +#include "load_save.h" +#include "rom4.h" +#include "save_failed_screen.h" + +#define GETVALIDSTATUSBITFIELD ((1 << ARRAY_COUNT(gSaveSectionLocations)) - 1) +#define GETCHUNKSIZE(chunk, n) ((sizeof(chunk) - (0xF80 * (n - 1))) >= 0xF80 ? 0xF80 : (sizeof(chunk) - (0xF80 * (n - 1)))) +#define GETBLOCKOFFSET(n) (0xF80 * (n - 1)) +#define TOTALNUMSECTORS ((ARRAY_COUNT(gSaveSectionLocations) * 2) + (ARRAY_COUNT(gHallOfFameSaveSectionLocations) * 2)) // there are 2 slots, so double each array count and get the sum. + +extern struct SaveSection unk_2000000; // slow save RAM + +u16 gLastWrittenSector; +u32 gLastSaveCounter; +u16 gLastKnownGoodSector; +u32 gDamagedSaveSectors; +u32 gSaveCounter; +struct SaveSection *gFastSaveSection; // the pointer is in fast IWRAM but may sometimes point to the slower EWRAM. +u16 gUnknown_03005EB4; +u16 gSaveFileStatus; +u32 gGameContinueCallback; + +extern struct PokemonStorage gPokemonStorage; +extern struct HallOfFame gHallOfFame; + +static EWRAM_DATA u32 gLastSaveSectorStatus = 0; // used but in an unferenced function, so unused + +const struct SaveSectionLocation gSaveSectionLocations[] = +{ + {((u8 *) &gSaveBlock2) + GETBLOCKOFFSET(1), GETCHUNKSIZE(gSaveBlock2, 1)}, + {((u8 *) &gSaveBlock1) + GETBLOCKOFFSET(1), GETCHUNKSIZE(gSaveBlock1, 1)}, + {((u8 *) &gSaveBlock1) + GETBLOCKOFFSET(2), GETCHUNKSIZE(gSaveBlock1, 2)}, + {((u8 *) &gSaveBlock1) + GETBLOCKOFFSET(3), GETCHUNKSIZE(gSaveBlock1, 3)}, + {((u8 *) &gSaveBlock1) + GETBLOCKOFFSET(4), GETCHUNKSIZE(gSaveBlock1, 4)}, + {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(1), GETCHUNKSIZE(gPokemonStorage, 1)}, + {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(2), GETCHUNKSIZE(gPokemonStorage, 2)}, + {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(3), GETCHUNKSIZE(gPokemonStorage, 3)}, + {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(4), GETCHUNKSIZE(gPokemonStorage, 4)}, + {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(5), GETCHUNKSIZE(gPokemonStorage, 5)}, + {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(6), GETCHUNKSIZE(gPokemonStorage, 6)}, + {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(7), GETCHUNKSIZE(gPokemonStorage, 7)}, + {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(8), GETCHUNKSIZE(gPokemonStorage, 8)}, + {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(9), GETCHUNKSIZE(gPokemonStorage, 9)} +}; + +const struct SaveSectionLocation gHallOfFameSaveSectionLocations[] = +{ + {((u8 *) &gHallOfFame) + GETBLOCKOFFSET(1), GETCHUNKSIZE(struct HallOfFame, 1)}, // gHallOfFame is not a proper sym, so the struct must be used. + {((u8 *) &gHallOfFame) + GETBLOCKOFFSET(2), GETCHUNKSIZE(struct HallOfFame, 2)} +}; + +const u8 gFlashSectors[] = { 0x1E, 0x1F }; + +void ClearSaveData(void) +{ + u16 i; + + for (i = 0; i < NUM_SECTORS; i++) + EraseFlashSector(i); +} + +void ResetSaveCounters(void) +{ + gSaveCounter = 0; + gLastWrittenSector = 0; + gDamagedSaveSectors = 0; +} + +bool32 SetDamagedSectorBits(u8 op, u8 bit) +{ + bool32 retVal = FALSE; + + switch (op) + { + case ENABLE: + gDamagedSaveSectors |= (1 << bit); + break; + case DISABLE: + gDamagedSaveSectors &= ~(1 << bit); + break; + case CHECK: // unused + if (gDamagedSaveSectors & (1 << bit)) + retVal = TRUE; + break; + } + + return retVal; +} + +u8 save_write_to_flash(u16 a1, const struct SaveSectionLocation *location) +{ + u32 retVal; + u16 i; + + gFastSaveSection = &unk_2000000; + + if (a1 != 0xFFFF) // for link + { + retVal = HandleWriteSector(a1, location); + } + else + { + gLastKnownGoodSector = gLastWrittenSector; // backup the current written sector before attempting to write. + gLastSaveCounter = gSaveCounter; + gLastWrittenSector++; + gLastWrittenSector = gLastWrittenSector % ARRAY_COUNT(gSaveSectionLocations); + gSaveCounter++; + retVal = 1; + + for (i = 0; i < ARRAY_COUNT(gSaveSectionLocations); i++) + HandleWriteSector(i, location); + + if (gDamagedSaveSectors != 0) // skip the damaged sector. + { + retVal = 0xFF; + gLastWrittenSector = gLastKnownGoodSector; + gSaveCounter = gLastSaveCounter; + } + } + + return retVal; +} + +u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location) +{ + u16 i; + u16 sector; + u8 *data; + u16 size; + + sector = a1 + gLastWrittenSector; + sector %= ARRAY_COUNT(gSaveSectionLocations); + sector += ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); + + data = location[a1].data; + size = location[a1].size; + + // clear save section. + for (i = 0; i < sizeof(struct SaveSection); i++) + ((char *)gFastSaveSection)[i] = 0; + + gFastSaveSection->id = a1; + gFastSaveSection->security = UNKNOWN_CHECK_VALUE; + gFastSaveSection->counter = gSaveCounter; + + for (i = 0; i < size; i++) + gFastSaveSection->data[i] = data[i]; + + gFastSaveSection->checksum = CalculateChecksum(data, size); + return TryWriteSector(sector, gFastSaveSection->data); +} + +u8 HandleWriteSectorNBytes(u8 sector, u8 *data, u16 size) +{ + u16 i; + struct SaveSection *section = &unk_2000000; + + for (i = 0; i < sizeof(struct SaveSection); i++) + ((char *)section)[i] = 0; + + section->security = UNKNOWN_CHECK_VALUE; + + for (i = 0; i < size; i++) + section->data[i] = data[i]; + + section->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used. + return TryWriteSector(sector, section->data); +} + +u8 TryWriteSector(u8 sector, u8 *data) +{ + if (ProgramFlashSectorAndVerify(sector, data) != 0) // is damaged? + { + SetDamagedSectorBits(ENABLE, sector); // set damaged sector bits. + return 0xFF; + } + else + { + SetDamagedSectorBits(DISABLE, sector); // unset damaged sector bits. it's safe now. + return 1; + } +} + +u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectionLocation *location) // location is unused +{ + gFastSaveSection = &unk_2000000; + gLastKnownGoodSector = gLastWrittenSector; + gLastSaveCounter = gSaveCounter; + gLastWrittenSector++; + gLastWrittenSector = gLastWrittenSector % ARRAY_COUNT(gSaveSectionLocations); + gSaveCounter++; + gUnknown_03005EB4 = 0; + gDamagedSaveSectors = 0; + return 0; +} + +u32 RestoreSaveBackupVars(const struct SaveSectionLocation *location) // only ever called once, and gSaveBlock2 is passed to this function. location is unused +{ + gFastSaveSection = &unk_2000000; + gLastKnownGoodSector = gLastWrittenSector; + gLastSaveCounter = gSaveCounter; + gUnknown_03005EB4 = 0; + gDamagedSaveSectors = 0; + return 0; +} + +u8 sub_812550C(u16 a1, const struct SaveSectionLocation *location) +{ + u8 retVal; + + if (gUnknown_03005EB4 < a1 - 1) + { + retVal = 1; + HandleWriteSector(gUnknown_03005EB4, location); + gUnknown_03005EB4++; + if (gDamagedSaveSectors) + { + retVal = 0xFF; + gLastWrittenSector = gLastKnownGoodSector; + gSaveCounter = gLastSaveCounter; + } + } + else + { + retVal = 0xFF; + } + + return retVal; +} + +u8 sub_812556C(u16 a1, const struct SaveSectionLocation *location) +{ + u8 retVal = 1; + + sub_81255B8(a1 - 1, location); + + if (gDamagedSaveSectors) + { + retVal = 0xFF; + gLastWrittenSector = gLastKnownGoodSector; + gSaveCounter = gLastSaveCounter; + } + return retVal; +} + +u8 sub_81255B8(u16 a1, const struct SaveSectionLocation *location) +{ + u16 i; + u16 sector; + u8 *data; + u16 size; + u8 status; + + sector = a1 + gLastWrittenSector; + sector %= ARRAY_COUNT(gSaveSectionLocations); + sector += ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); + + data = location[a1].data; + size = location[a1].size; + + // clear temp save section. + for (i = 0; i < sizeof(struct SaveSection); i++) + ((char *)gFastSaveSection)[i] = 0; + + gFastSaveSection->id = a1; + gFastSaveSection->security = UNKNOWN_CHECK_VALUE; + gFastSaveSection->counter = gSaveCounter; + + // set temp section's data. + for (i = 0; i < size; i++) + gFastSaveSection->data[i] = data[i]; + + // calculate checksum. + gFastSaveSection->checksum = CalculateChecksum(data, size); + + EraseFlashSector(sector); + + status = 1; + + for (i = 0; i < sizeof(struct UnkSaveSection); i++) + { + if (ProgramFlashByte(sector, i, ((u8 *)gFastSaveSection)[i])) + { + status = 0xFF; + break; + } + } + + if (status == 0xFF) + { + SetDamagedSectorBits(ENABLE, sector); + return 0xFF; + } + else + { + status = 1; + + for (i = 0; i < 7; i++) + { + if (ProgramFlashByte(sector, 0xFF9 + i, ((u8 *)gFastSaveSection)[0xFF9 + i])) + { + status = 0xFF; + break; + } + } + + if (status == 0xFF) + { + SetDamagedSectorBits(ENABLE, sector); + return 0xFF; + } + else + { + SetDamagedSectorBits(DISABLE, sector); + return 1; + } + } +} + +u8 sub_8125758(u16 a1, const struct SaveSectionLocation *location) +{ + u16 sector; + + sector = a1 + gLastWrittenSector - 1; + sector %= ARRAY_COUNT(gSaveSectionLocations); + sector += ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); + + if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), ((u8 *)gFastSaveSection)[sizeof(struct UnkSaveSection)])) + { + // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. + SetDamagedSectorBits(ENABLE, sector); + gLastWrittenSector = gLastKnownGoodSector; + gSaveCounter = gLastSaveCounter; + return 0xFF; + } + else + { + SetDamagedSectorBits(DISABLE, sector); + return 1; + } +} + +u8 sub_81257F0(u16 a1, const struct SaveSectionLocation *location) +{ + u16 sector; + + sector = a1 + gLastWrittenSector - 1; + sector %= ARRAY_COUNT(gSaveSectionLocations); + sector += ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); + + if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25)) + { + // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. + SetDamagedSectorBits(ENABLE, sector); + gLastWrittenSector = gLastKnownGoodSector; + gSaveCounter = gLastSaveCounter; + return 0xFF; + } + else + { + SetDamagedSectorBits(DISABLE, sector); + return 1; + } +} + +u8 sub_812587C(u16 a1, const struct SaveSectionLocation *location) +{ + u8 retVal; + gFastSaveSection = &unk_2000000; + if (a1 != 0xFFFF) + { + retVal = 0xFF; + } + else + { + retVal = GetSaveValidStatus(location); + sub_81258BC(0xFFFF, location); + } + + return retVal; +} + +u8 sub_81258BC(u16 a1, const struct SaveSectionLocation *location) +{ + u16 i; + u16 checksum; + u16 v3 = ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); + u16 id; + + for (i = 0; i < ARRAY_COUNT(gSaveSectionLocations); i++) + { + DoReadFlashWholeSection(i + v3, gFastSaveSection); + id = gFastSaveSection->id; + if (id == 0) + gLastWrittenSector = i; + checksum = CalculateChecksum(gFastSaveSection->data, location[id].size); + if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE + && gFastSaveSection->checksum == checksum) + { + u16 j; + for (j = 0; j < location[id].size; j++) + ((u8 *)location[id].data)[j] = gFastSaveSection->data[j]; + } + } + + return 1; +} + +u8 GetSaveValidStatus(const struct SaveSectionLocation *location) +{ + u16 i; + u16 checksum; + u32 saveSlot1Counter = 0; + u32 saveSlot2Counter = 0; + u32 slotCheckField = 0; + bool8 securityPassed = FALSE; + u8 saveSlot1Status; + u8 saveSlot2Status; + + // check save slot 1. + for (i = 0; i < ARRAY_COUNT(gSaveSectionLocations); i++) + { + DoReadFlashWholeSection(i, gFastSaveSection); + if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE) + { + securityPassed = TRUE; + checksum = CalculateChecksum(gFastSaveSection->data, location[gFastSaveSection->id].size); + if (gFastSaveSection->checksum == checksum) + { + saveSlot1Counter = gFastSaveSection->counter; + slotCheckField |= 1 << gFastSaveSection->id; + } + } + } + + if (securityPassed) + { + if (slotCheckField == GETVALIDSTATUSBITFIELD) + saveSlot1Status = 1; + else + saveSlot1Status = 255; + } + else + { + saveSlot1Status = 0; + } + + slotCheckField = 0; + securityPassed = FALSE; + + // check save slot 2. + for (i = 0; i < ARRAY_COUNT(gSaveSectionLocations); i++) + { + DoReadFlashWholeSection(i + ARRAY_COUNT(gSaveSectionLocations), gFastSaveSection); + if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE) + { + securityPassed = TRUE; + checksum = CalculateChecksum(gFastSaveSection->data, location[gFastSaveSection->id].size); + if (gFastSaveSection->checksum == checksum) + { + saveSlot2Counter = gFastSaveSection->counter; + slotCheckField |= 1 << gFastSaveSection->id; + } + } + } + + if (securityPassed) + { + if (slotCheckField == GETVALIDSTATUSBITFIELD) + saveSlot2Status = 1; + else + saveSlot2Status = 255; + } + else + { + saveSlot2Status = 0; + } + + if (saveSlot1Status == 1 && saveSlot2Status == 1) + { + if ((saveSlot1Counter == -1 && saveSlot2Counter == 0) || (saveSlot1Counter == 0 && saveSlot2Counter == -1)) + { + if ((unsigned)(saveSlot1Counter + 1) < (unsigned)(saveSlot2Counter + 1)) + { + gSaveCounter = saveSlot2Counter; + } + else + { + gSaveCounter = saveSlot1Counter; + } + } + else + { + if (saveSlot1Counter < saveSlot2Counter) + { + gSaveCounter = saveSlot2Counter; + } + else + { + gSaveCounter = saveSlot1Counter; + } + } + return 1; + } + + if (saveSlot1Status == 1) + { + gSaveCounter = saveSlot1Counter; + if (saveSlot2Status == 255) + return 255; + return 1; + } + + if (saveSlot2Status == 1) + { + gSaveCounter = saveSlot2Counter; + if (saveSlot1Status == 255) + return 255; + return 1; + } + + if (saveSlot1Status == 0 && saveSlot2Status == 0) + { + gSaveCounter = 0; + gLastWrittenSector = 0; + return 0; + } + + gSaveCounter = 0; + gLastWrittenSector = 0; + return 2; +} + +u8 sub_8125B88(u8 a1, u8 *data, u16 size) +{ + u16 i; + struct SaveSection *section = &unk_2000000; + DoReadFlashWholeSection(a1, section); + if (section->security == UNKNOWN_CHECK_VALUE) + { + u16 checksum = CalculateChecksum(section->data, size); + if (section->id == checksum) + { + for (i = 0; i < size; i++) + data[i] = section->data[i]; + return 1; + } + else + { + return 2; + } + } + else + { + return 0; + } +} + +u8 DoReadFlashWholeSection(u8 sector, struct SaveSection *section) +{ + ReadFlash(sector, 0, section->data, sizeof(struct SaveSection)); + return 1; +} + +u16 CalculateChecksum(void *data, u16 size) +{ + u16 i; + u32 checksum = 0; + + for (i = 0; i < (size / 4); i++) + checksum += *((u32 *)data)++; + + return ((checksum >> 16) + checksum); +} + +u8 HandleSavingData(u8 saveType) +{ + u8 i; + switch (saveType) + { + case HOF_DELETE_SAVE: // deletes HOF before overwriting HOF completely. unused + for (i = (ARRAY_COUNT(gSaveSectionLocations) * 2 + 0); i < TOTALNUMSECTORS; i++) + EraseFlashSector(i); + case HOF_SAVE: // hall of fame. + if (GetGameStat(10) < 999) + IncrementGameStat(10); + for (i = 0; i < ARRAY_COUNT(gHallOfFameSaveSectionLocations); i++) + HandleWriteSectorNBytes((ARRAY_COUNT(gSaveSectionLocations) * 2 + 0) + i, gHallOfFameSaveSectionLocations[i].data, gHallOfFameSaveSectionLocations[i].size); + SaveSerializedGame(); + save_write_to_flash(0xFFFF, gSaveSectionLocations); + break; + case NORMAL_SAVE: // normal save. also called by overwriting your own save. + default: + SaveSerializedGame(); + save_write_to_flash(0xFFFF, gSaveSectionLocations); + break; + case LINK_SAVE: // link save. updates only gSaveBlock1 and gSaveBlock2. + SaveSerializedGame(); + for (i = 0; i < 5; i++) + save_write_to_flash(i, gSaveSectionLocations); + break; + case EREADER_SAVE: // used in mossdeep "game corner" before/after battling old man e-reader trainer + SaveSerializedGame(); + save_write_to_flash(0, gSaveSectionLocations); + break; + case DIFFERENT_FILE_SAVE: // there is a different file, so erase the file and overwrite it completely. + for (i = (ARRAY_COUNT(gSaveSectionLocations) * 2 + 0); i < TOTALNUMSECTORS; i++) + EraseFlashSector(i); // erase HOF. + SaveSerializedGame(); + save_write_to_flash(0xFFFF, gSaveSectionLocations); + break; + } + return 0; +} + +u8 TrySavingData(u8 saveType) // TrySave +{ + if (gFlashMemoryPresent != TRUE) + return 0xFF; + HandleSavingData(saveType); + if (!gDamagedSaveSectors) + return 1; + DoSaveFailedScreen(saveType); + return 0xFF; +} + +u8 sub_8125D80(void) // trade.s save +{ + if (gFlashMemoryPresent != TRUE) + return 1; + SaveSerializedGame(); + RestoreSaveBackupVarsAndIncrement(gSaveSectionLocations); + return 0; +} + +bool8 sub_8125DA8(void) // trade.s save +{ + u8 retVal = sub_812550C(ARRAY_COUNT(gSaveSectionLocations), gSaveSectionLocations); + if (gDamagedSaveSectors) + DoSaveFailedScreen(0); + if (retVal == 0xFF) + return 1; + else + return 0; +} + +u8 sub_8125DDC(void) // trade.s save +{ + sub_812556C(ARRAY_COUNT(gSaveSectionLocations), gSaveSectionLocations); + if (gDamagedSaveSectors) + DoSaveFailedScreen(0); + return 0; +} + +u8 sub_8125E04(void) // trade.s save +{ + sub_8125758(ARRAY_COUNT(gSaveSectionLocations), gSaveSectionLocations); + if (gDamagedSaveSectors) + DoSaveFailedScreen(0); + return 0; +} + +u8 sub_8125E2C(void) +{ + if (gFlashMemoryPresent != TRUE) + return 1; + + SaveSerializedGame(); + RestoreSaveBackupVars(gSaveSectionLocations); + sub_812556C(gUnknown_03005EB4 + 1, gSaveSectionLocations); + return 0; +} + +bool8 sub_8125E6C(void) +{ + u8 retVal = FALSE; + u16 val = ++gUnknown_03005EB4; + if (val <= 4) + { + sub_812556C(gUnknown_03005EB4 + 1, gSaveSectionLocations); + sub_81257F0(val, gSaveSectionLocations); + } + else + { + sub_81257F0(val, gSaveSectionLocations); + retVal = TRUE; + } + if (gDamagedSaveSectors) + DoSaveFailedScreen(1); + return retVal; +} + +u8 sub_8125EC8(u8 a1) +{ + u8 result; + + if (gFlashMemoryPresent != TRUE) + { + gSaveFileStatus = 4; + return 0xFF; + } + + switch (a1) + { + case 0: + default: + result = sub_812587C(0xFFFF, gSaveSectionLocations); + LoadSerializedGame(); + gSaveFileStatus = result; + gGameContinueCallback = 0; + break; + case 3: + result = sub_8125B88((ARRAY_COUNT(gSaveSectionLocations) * 2 + 0), gHallOfFameSaveSectionLocations[0].data, gHallOfFameSaveSectionLocations[0].size); + if (result == 1) + result = sub_8125B88((ARRAY_COUNT(gSaveSectionLocations) * 2 + 1), gHallOfFameSaveSectionLocations[1].data, gHallOfFameSaveSectionLocations[1].size); + break; + } + + return result; +} + +bool8 unref_sub_8125F4C(struct UnkSaveSection *a1) +{ + u16 i; + char *raw = (char *)a1; + + for (i = 0; i < sizeof(struct SaveSection); i++) + raw[i] = 0; + + ReadFlash(gFlashSectors[0], 0, a1->data, 4096); + + if (a1->security != UNKNOWN_CHECK_VALUE) + return FALSE; + + return TRUE; +} + +u8 unref_sub_8125FA0(void) +{ + u16 i; + u8 v0 = TrySavingData(0); + + for (i = 0; i < 2; i++) + EraseFlashSector(gFlashSectors[i]); + + if (v0 == 255) + { + return 3; + } + else if (v0 == 3) + { + return 2; + } + else + { + sub_8125EC8(0); + return 1; + } +} + +u8 unref_sub_8125FF0(u8 *data, u16 size) +{ + u16 i; + struct UnkSaveSection *section = (struct UnkSaveSection *)&unk_2000000; + + for (i = 0; i < sizeof(struct SaveSection); i++) + ((char *)section)[i] = 0; + + section->security = UNKNOWN_CHECK_VALUE; + + for (i = 0; i < size; i++) + section->data[i] = data[i]; + + gLastSaveSectorStatus = ProgramFlashSectorAndVerifyNBytes(gFlashSectors[0], (u8 *)section, sizeof(struct SaveSection)); + + if (gLastSaveSectorStatus) + return 0xFF; + else + return 1; +} + +u8 unref_sub_8126068(u8 sector, u8 *data, u32 size) +{ + if (ProgramFlashSectorAndVerify(sector, data)) + return 255; + else + return 1; +} + +u8 unref_sub_8126080(u8 sector, u8 *data) +{ + ReadFlash(sector, 0, data, sizeof(struct SaveSection)); + return 1; +} diff --git a/src/engine/save_failed_screen.c b/src/engine/save_failed_screen.c new file mode 100644 index 000000000..b91e8b5bf --- /dev/null +++ b/src/engine/save_failed_screen.c @@ -0,0 +1,310 @@ +#include "global.h" +#include "gba/flash_internal.h" +#include "save_failed_screen.h" +#include "m4a.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "save.h" +#include "sprite.h" +#include "starter_choose.h" +#include "strings.h" +#include "task.h" +#include "text.h" + +// In English 1.0, the text window is too small, causing text to overflow. + +#ifdef BUGFIX_SAVEFAILEDSCREEN1 +#define MSG_WIN_TOP 10 +#else +#define MSG_WIN_TOP 12 +#endif + +#define CLOCK_WIN_TOP (MSG_WIN_TOP - 4) + +extern u8 unk_2000000[]; + +static EWRAM_DATA u16 gSaveFailedType = 0; +static EWRAM_DATA u16 gSaveFailedClockInfo[9] = {0}; + +extern u32 gDamagedSaveSectors; +extern u32 gGameContinueCallback; + +static const struct OamData sClockOamData = +{ + 160, // Y + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 +}; + +static const u8 sClockFrames[8][3] = +{ + { 1, 0, 0 }, + { 5, 0, 0 }, + { 9, 0, 0 }, + { 5, 0, 1 }, + { 1, 0, 1 }, + { 5, 1, 1 }, + { 9, 1, 0 }, + { 5, 1, 0 }, +}; + +static const u8 gSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal"); +static const u8 gSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz"); + +static void VBlankCB(void); +static void CB2_SaveFailedScreen(void); +static void CB2_WipeSave(void); +static void CB2_GameplayCannotBeContinued(void); +static void CB2_FadeAndReturnToTitleScreen(void); +static void CB2_ReturnToTitleScreen(void); +static void VBlankCB_UpdateClockGraphics(void); +static bool8 VerifySectorWipe(u16 sector); +static bool8 WipeSector(u16 sector); +static bool8 WipeSectors(u32 sectorBits); + +void DoSaveFailedScreen(u8 saveType) +{ + SetMainCallback2(CB2_SaveFailedScreen); + gSaveFailedType = saveType; + gSaveFailedClockInfo[0] = FALSE; +} + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void CB2_SaveFailedScreen(void) +{ + u16 ime; + + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(0); + REG_DISPCNT = 0; + REG_BG3CNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16(3, 0, VRAM, VRAM_SIZE); + DmaFill32(3, 0, OAM, OAM_SIZE); + DmaFill16(3, 0, PLTT, PLTT_SIZE); + LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); + LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000)); + LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); + LZ77UnCompVram(&gSaveFailedClockGfx, (void *)(VRAM + 0x10020)); + ResetSpriteData(); + ResetTasks(); + ResetPaletteFade(); + LoadPalette(&gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal)); + LoadPalette(&gSaveFailedClockPal, 0x100, sizeof(gSaveFailedClockPal)); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + MenuDrawTextWindow(13, CLOCK_WIN_TOP, 16, CLOCK_WIN_TOP + 3); // clock window + MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); // message window + MenuPrint(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(VBlankCB); + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG2_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0; + gMain.state++; + break; + case 1: + if (!UpdatePaletteFade()) + { + SetMainCallback2(CB2_WipeSave); + SetVBlankCallback(VBlankCB_UpdateClockGraphics); + } + break; + } +} + +static void CB2_WipeSave(void) +{ + u8 wipeTries = 0; + + gSaveFailedClockInfo[0] = TRUE; + + while (gDamagedSaveSectors != 0 && wipeTries < 3) // while there are still attempts left, keep trying to fix the save sectors. + { + if (WipeSectors(gDamagedSaveSectors) != FALSE) + { + MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); + MenuPrint(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); + SetMainCallback2(CB2_GameplayCannotBeContinued); + return; + } + + MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); + MenuPrint(gSystemText_CheckCompleteSaveAttempt, 2, MSG_WIN_TOP + 1); + HandleSavingData(gSaveFailedType); + + if (gDamagedSaveSectors != 0) + { +#ifdef BUGFIX_SAVEFAILEDSCREEN2 + MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); +#endif + MenuPrint(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); + } + + wipeTries++; + } + + if (wipeTries == 3) + { + MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); + MenuPrint(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); + SetMainCallback2(CB2_FadeAndReturnToTitleScreen); // called again below + } + else + { + MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); + + // no callback exists, so the game cannot continue. + if (gGameContinueCallback == 0) + MenuPrint(gSystemText_SaveCompletedGameEnd, 2, MSG_WIN_TOP + 1); + else // callback exists, so continue + MenuPrint(gSystemText_SaveCompletedPressA, 2, MSG_WIN_TOP + 1); + } + + SetMainCallback2(CB2_FadeAndReturnToTitleScreen); +} + +static void CB2_GameplayCannotBeContinued(void) +{ + gSaveFailedClockInfo[0] = FALSE; + + if (gMain.newKeys & A_BUTTON) + { + MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); + MenuPrint(gSystemText_GameplayEnded, 2, MSG_WIN_TOP + 1); + SetVBlankCallback(VBlankCB); + SetMainCallback2(CB2_FadeAndReturnToTitleScreen); + } +} + +static void CB2_FadeAndReturnToTitleScreen(void) +{ + gSaveFailedClockInfo[0] = FALSE; + + if (gMain.newKeys & A_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + SetVBlankCallback(VBlankCB); + SetMainCallback2(CB2_ReturnToTitleScreen); + } +} + +static void CB2_ReturnToTitleScreen(void) +{ + if (!UpdatePaletteFade()) + { + if (gGameContinueCallback == 0) // no callback exists, so do a soft reset. + { + DoSoftReset(); + } + else + { + SetMainCallback2((MainCallback)gGameContinueCallback); + gGameContinueCallback = 0; + } + } +} + +static void VBlankCB_UpdateClockGraphics(void) +{ + unsigned int n = (gMain.vblankCounter2 >> 3) & 7; + + gMain.oamBuffer[0] = sClockOamData; + gMain.oamBuffer[0].x = 112; + gMain.oamBuffer[0].y = (CLOCK_WIN_TOP + 1) * 8; + + if (gSaveFailedClockInfo[0] != FALSE) + { + gMain.oamBuffer[0].tileNum = sClockFrames[n][0]; + gMain.oamBuffer[0].matrixNum = (sClockFrames[n][2] << 4) | (sClockFrames[n][1] << 3); + } + else + { + gMain.oamBuffer[0].tileNum = 1; + } + + CpuFastCopy(gMain.oamBuffer, (void *)OAM, 4); + + if (gSaveFailedClockInfo[1]) // maybe was used for debugging? + gSaveFailedClockInfo[1]--; +} + +static bool8 VerifySectorWipe(u16 sector) +{ + u32 *ptr = (u32 *)unk_2000000; + u16 i; + + ReadFlash(sector, 0, (u8 *)ptr, 4096); + + for (i = 0; i < 0x400; i++, ptr++) + if (*ptr) + return TRUE; + + return FALSE; +} + +static bool8 WipeSector(u16 sector) +{ + u16 i, j; + bool8 failed = TRUE; + + for (i = 0; failed && i < 130; i++) + { + for (j = 0; j < 0x1000; j++) + ProgramFlashByte(sector, j, 0); + + failed = VerifySectorWipe(sector); + } + + return failed; +} + +static bool8 WipeSectors(u32 sectorBits) +{ + u16 i; + + for (i = 0; i < 0x20; i++) + if ((sectorBits & (1 << i)) && !WipeSector(i)) + sectorBits &= ~(1 << i); + + if (sectorBits == 0) + return FALSE; + else + return TRUE; +} diff --git a/src/engine/save_menu_util.c b/src/engine/save_menu_util.c new file mode 100644 index 000000000..a2d17bd36 --- /dev/null +++ b/src/engine/save_menu_util.c @@ -0,0 +1,148 @@ +#include "global.h" +#include "save_menu_util.h" +#include "event_data.h" +#include "menu.h" +#include "pokedex.h" +#include "region_map.h" +#include "string_util.h" +#include "strings2.h" + +void HandleDrawSaveWindowInfo(s16 left, s16 top) +{ + u32 width = 12; + + // old handle for setting window width? + if (IsResizeSaveWindowEnabled()) + width = 13; + + if (FlagGet(SYS_POKEDEX_GET)) + { + // print info + dex information. + MenuDrawTextWindow(left, top, left + width, top + 11); + PrintSaveMapName(++left, ++top); // MAP NAME + PrintSavePlayerName(left, top + 2); // PLAYER + PrintSaveBadges(left, top + 4); // BADGES + PrintSavePokedexCount(left, top + 6); // POKEDEX + PrintSavePlayTime(left, top + 8); // PLAY TIME + } + else + { + // print everything besides dex. + MenuDrawTextWindow(left, top, left + width, top + 9); + PrintSaveMapName(++left, ++top); // MAP NAME + PrintSavePlayerName(left, top + 2); // PLAYER + PrintSaveBadges(left, top + 4); // BADGES + PrintSavePlayTime(left, top + 6); // PLAY TIME + } +} + +void HandleCloseSaveWindow(u16 left, u16 top) +{ + u32 width = 12; + + // old handle for setting window width? + if (IsResizeSaveWindowEnabled()) + width = 13; + + if (FlagGet(SYS_POKEDEX_GET)) + MenuZeroFillWindowRect(left, top, left + width, top + 11); + else + MenuZeroFillWindowRect(left, top, left + width, top + 9); +} + +/* +theory: This function was used to handle the save menu window's width being auto sized from +either 12 or 13 in an older source. Whatever was here might have either been optimized out by +GF's compiler or was dummied out to always return a TRUE at some point. +*/ +u8 IsResizeSaveWindowEnabled(void) // i don't know what else to name it.. +{ + return TRUE; +} + +void PrintSavePlayerName(s16 x, s16 y) +{ + MenuPrint(gOtherText_Player, x, y); + MenuPrint_RightAligned(gSaveBlock2.playerName, x + 12, y); +} + +void PrintSaveMapName(s16 x, s16 y) +{ + char name[32]; + + CopyMapName(name, gMapHeader.regionMapSectionId); + MenuPrint(name, x, y); +} + +void PrintSaveBadges(s16 x, s16 y) +{ + char badges[16]; + + MenuPrint(gOtherText_Badges, x, y); + ConvertIntToDecimalString(badges, GetBadgeCount()); + MenuPrint_RightAligned(badges, x + 12, y); +} + +void PrintSavePokedexCount(s16 x, s16 y) +{ + char pokedex[16]; + + MenuPrint(gOtherText_Pokedex, x, y); + ConvertIntToDecimalStringN(pokedex, GetPokedexSeenCount(), 1, 3); + MenuPrint_RightAligned(pokedex, x + 12, y); +} + +void PrintSavePlayTime(s16 x, s16 y) +{ + char playtime[16]; + + MenuPrint(gOtherText_PlayTime, x, y); + FormatPlayTime(playtime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); + MenuPrint_RightAligned(playtime, x + 12, y); +} + +u8 GetBadgeCount(void) +{ + u8 badgeCount = 0; + int badgeFlag; + + for (badgeFlag = BADGE01_GET; badgeFlag <= BADGE08_GET; badgeFlag++) + if (FlagGet(badgeFlag)) + badgeCount++; + + return badgeCount; +} + +u16 GetPokedexSeenCount() +{ + u16 pokedexSeenCount; + + if (IsNationalPokedexEnabled()) + pokedexSeenCount = GetNationalPokedexCount(1); + else + pokedexSeenCount = GetHoennPokedexCount(1); + + return pokedexSeenCount; +} + +void FormatPlayTime(char *playtime, u16 hours, u16 minutes, u16 unk) +{ + s16 colon = unk; + playtime = ConvertIntToDecimalString(playtime, hours); + + // playtime[0] is hours. + // playtime[1] is the character to render between hours and minutes. + // playtime[2] is minutes. + + playtime[0] = 0; + + if (colon) + playtime[1] = 0xF0; // set middle character to ":" + else + playtime[1] = 0; + + playtime[2] = 0; + playtime += 3; + + ConvertIntToDecimalStringN(playtime, minutes, 2, 2); +} diff --git a/src/engine/script.c b/src/engine/script.c new file mode 100644 index 000000000..8f12da437 --- /dev/null +++ b/src/engine/script.c @@ -0,0 +1,368 @@ +#include "global.h" +#include "script.h" +#include "event_data.h" + +#define RAM_SCRIPT_MAGIC 51 + +EWRAM_DATA u8 *gUnknown_0202E8AC = NULL; + +static u8 sScriptContext1Status; +static struct ScriptContext sScriptContext1; +static struct ScriptContext sScriptContext2; +static bool8 sScriptContext2Enabled; + +extern ScrCmdFunc gScriptCmdTable[]; +extern ScrCmdFunc gScriptCmdTableEnd[]; +extern void *gNullScriptPtr; + +void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd) +{ + s32 i; + + ctx->mode = 0; + ctx->scriptPtr = 0; + ctx->stackDepth = 0; + ctx->nativePtr = 0; + ctx->cmdTable = cmdTable; + ctx->cmdTableEnd = cmdTableEnd; + + for (i = 0; i < 4; i++) + ctx->data[i] = 0; + + for (i = 0; i < 20; i++) + ctx->stack[i] = 0; +} + +u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr) +{ + ctx->scriptPtr = ptr; + ctx->mode = 1; + return 1; +} + +void SetupNativeScript(struct ScriptContext *ctx, void *ptr) +{ + ctx->mode = 2; + ctx->nativePtr = ptr; +} + +void StopScript(struct ScriptContext *ctx) +{ + ctx->mode = 0; + ctx->scriptPtr = 0; +} + +u8 RunScriptCommand(struct ScriptContext *ctx) +{ + if (ctx->mode == 0) + return 0; + + switch (ctx->mode) + { + case 0: + return 0; + case 2: + if (ctx->nativePtr) + { + if (ctx->nativePtr() == 1) + ctx->mode = 1; + return 1; + } + ctx->mode = 1; + case 1: + while (1) + { + u8 cmdCode; + ScrCmdFunc *func; + + if (!ctx->scriptPtr) + { + ctx->mode = 0; + return 0; + } + + if (ctx->scriptPtr == gNullScriptPtr) + { + while (1) + asm("svc 2"); // HALT + } + + cmdCode = *(ctx->scriptPtr); + ctx->scriptPtr++; + func = &ctx->cmdTable[cmdCode]; + + if (func >= ctx->cmdTableEnd) + { + ctx->mode = 0; + return 0; + } + + if ((*func)(ctx) == 1) + return 1; + } + } + + return 1; +} + +u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr) +{ + if (ctx->stackDepth + 1 >= 20) + { + return 1; + } + else + { + ctx->stack[ctx->stackDepth] = ptr; + ctx->stackDepth++; + return 0; + } +} + +const u8 *ScriptPop(struct ScriptContext *ctx) +{ + if (ctx->stackDepth == 0) + return NULL; + + ctx->stackDepth--; + return ctx->stack[ctx->stackDepth]; +} + +void ScriptJump(struct ScriptContext *ctx, u8 *ptr) +{ + ctx->scriptPtr = ptr; +} + +void ScriptCall(struct ScriptContext *ctx, u8 *ptr) +{ + ScriptPush(ctx, ctx->scriptPtr); + ctx->scriptPtr = ptr; +} + +void ScriptReturn(struct ScriptContext *ctx) +{ + ctx->scriptPtr = ScriptPop(ctx); +} + +u16 ScriptReadHalfword(struct ScriptContext *ctx) +{ + u16 value = *(ctx->scriptPtr++); + value |= *(ctx->scriptPtr++) << 8; + return value; +} + +u32 ScriptReadWord(struct ScriptContext *ctx) +{ + u32 value0 = *(ctx->scriptPtr++); + u32 value1 = *(ctx->scriptPtr++); + u32 value2 = *(ctx->scriptPtr++); + u32 value3 = *(ctx->scriptPtr++); + return (((((value3 << 8) + value2) << 8) + value1) << 8) + value0; +} + +void ScriptContext2_Enable(void) +{ + sScriptContext2Enabled = TRUE; +} + +void ScriptContext2_Disable(void) +{ + sScriptContext2Enabled = FALSE; +} + +bool8 ScriptContext2_IsEnabled(void) +{ + return sScriptContext2Enabled; +} + +void ScriptContext1_Init(void) +{ + InitScriptContext(&sScriptContext1, gScriptCmdTable, gScriptCmdTableEnd); + sScriptContext1Status = 2; +} + +bool8 ScriptContext2_RunScript(void) +{ + if (sScriptContext1Status == 2) + return 0; + + if (sScriptContext1Status == 1) + return 0; + + ScriptContext2_Enable(); + + if (!RunScriptCommand(&sScriptContext1)) + { + sScriptContext1Status = 2; + ScriptContext2_Disable(); + return 0; + } + + return 1; +} + +void ScriptContext1_SetupScript(const u8 *ptr) +{ + InitScriptContext(&sScriptContext1, gScriptCmdTable, gScriptCmdTableEnd); + SetupBytecodeScript(&sScriptContext1, ptr); + ScriptContext2_Enable(); + sScriptContext1Status = 0; +} + +void ScriptContext1_Stop(void) +{ + sScriptContext1Status = 1; +} + +void EnableBothScriptContexts() +{ + sScriptContext1Status = 0; + ScriptContext2_Enable(); +} + +void ScriptContext2_RunNewScript(const u8 *ptr) +{ + InitScriptContext(&sScriptContext2, &gScriptCmdTable, &gScriptCmdTableEnd); + SetupBytecodeScript(&sScriptContext2, ptr); + while (RunScriptCommand(&sScriptContext2) == 1) + ; +} + +u8 *mapheader_get_tagged_pointer(u8 tag) +{ + u8 *mapScripts = gMapHeader.mapScripts; + + if (!mapScripts) + return NULL; + + while (1) + { + if (!*mapScripts) + return NULL; + if (*mapScripts == tag) + { + mapScripts++; + return (u8 *)(mapScripts[0] + (mapScripts[1] << 8) + (mapScripts[2] << 16) + (mapScripts[3] << 24)); + } + mapScripts += 5; + } +} + +void mapheader_run_script_by_tag(u8 tag) +{ + u8 *ptr = mapheader_get_tagged_pointer(tag); + if (ptr) + ScriptContext2_RunNewScript(ptr); +} + +u8 *mapheader_get_first_match_from_tagged_ptr_list(u8 tag) +{ + u8 *ptr = mapheader_get_tagged_pointer(tag); + + if (!ptr) + return NULL; + + while (1) + { + u16 varIndex1; + u16 varIndex2; + varIndex1 = ptr[0] | (ptr[1] << 8); + if (!varIndex1) + return NULL; + ptr += 2; + varIndex2 = ptr[0] | (ptr[1] << 8); + ptr += 2; + if (VarGet(varIndex1) == VarGet(varIndex2)) + return (u8 *)(ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24)); + ptr += 4; + } +} + +void mapheader_run_script_with_tag_x1(void) +{ + mapheader_run_script_by_tag(1); +} + +void mapheader_run_script_with_tag_x3(void) +{ + mapheader_run_script_by_tag(3); +} + +void mapheader_run_script_with_tag_x5(void) +{ + mapheader_run_script_by_tag(5); +} + +void mapheader_run_script_with_tag_x6(void) +{ + mapheader_run_script_by_tag(6); +} + +bool8 mapheader_run_first_tag2_script_list_match(void) +{ + u8 *ptr = mapheader_get_first_match_from_tagged_ptr_list(2); + + if (!ptr) + return 0; + + ScriptContext1_SetupScript(ptr); + return 1; +} + +void mapheader_run_first_tag4_script_list_match(void) +{ + u8 *ptr = mapheader_get_first_match_from_tagged_ptr_list(4); + if (ptr) + ScriptContext2_RunNewScript(ptr); +} + +u32 CalculateRamScriptChecksum(void) +{ + u32 i; + u32 sum = 0; + for (i = 0; i < sizeof(struct RamScriptData); i++) + sum += ((u8 *)&gSaveBlock1.ramScript.data)[i]; + return sum; +} + +void ClearRamScript(void) +{ + CpuFill32(0, &gSaveBlock1.ramScript, sizeof(struct RamScript)); +} + +bool8 InitRamScript(u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 objectId) +{ + struct RamScriptData *scriptData = &gSaveBlock1.ramScript.data; + + ClearRamScript(); + + if (scriptSize > sizeof(scriptData->script)) + return FALSE; + + scriptData->magic = RAM_SCRIPT_MAGIC; + scriptData->mapGroup = mapGroup; + scriptData->mapNum = mapNum; + scriptData->objectId = objectId; + memcpy(scriptData->script, script, scriptSize); + gSaveBlock1.ramScript.checksum = CalculateRamScriptChecksum(); + return TRUE; +} + +u8 *GetRamScript(u8 objectId, u8 *script) +{ + struct RamScriptData *scriptData = &gSaveBlock1.ramScript.data; + gUnknown_0202E8AC = 0; + if (scriptData->magic == RAM_SCRIPT_MAGIC + && scriptData->mapGroup == gSaveBlock1.location.mapGroup + && scriptData->mapNum == gSaveBlock1.location.mapNum + && scriptData->objectId == objectId) + { + if (CalculateRamScriptChecksum() == gSaveBlock1.ramScript.checksum) + { + gUnknown_0202E8AC = script; + return scriptData->script; + } + ClearRamScript(); + } + return script; +} diff --git a/src/engine/siirtc.c b/src/engine/siirtc.c new file mode 100644 index 000000000..965a068f1 --- /dev/null +++ b/src/engine/siirtc.c @@ -0,0 +1,432 @@ +// Ruby/Sapphire/Emerald cartridges contain a Seiko Instruments Inc. (SII) +// S-3511A real-time clock (RTC). This library ("SIIRTC_V001") is for +// communicating with the RTC. + +#include "gba/gba.h" +#include "siirtc.h" + +#define STATUS_INTFE 0x02 // frequency interrupt enable +#define STATUS_INTME 0x08 // per-minute interrupt enable +#define STATUS_INTAE 0x20 // alarm interrupt enable +#define STATUS_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode +#define STATUS_POWER 0x80 // power on or power failure occurred + +#define TEST_MODE 0x80 // flag in the "second" byte + +#define ALARM_AM 0x00 +#define ALARM_PM 0x80 + +#define OFFSET_YEAR offsetof(struct SiiRtcInfo, year) +#define OFFSET_MONTH offsetof(struct SiiRtcInfo, month) +#define OFFSET_DAY offsetof(struct SiiRtcInfo, day) +#define OFFSET_DAY_OF_WEEK offsetof(struct SiiRtcInfo, dayOfWeek) +#define OFFSET_HOUR offsetof(struct SiiRtcInfo, hour) +#define OFFSET_MINUTE offsetof(struct SiiRtcInfo, minute) +#define OFFSET_SECOND offsetof(struct SiiRtcInfo, second) +#define OFFSET_STATUS offsetof(struct SiiRtcInfo, status) +#define OFFSET_ALARM_HOUR offsetof(struct SiiRtcInfo, alarmHour) +#define OFFSET_ALARM_MINUTE offsetof(struct SiiRtcInfo, alarmMinute) + +#define INFO_BUF(info, index) (*((u8 *)(info) + (index))) + +#define DATETIME_BUF(info, index) INFO_BUF(info, OFFSET_YEAR + index) +#define DATETIME_BUF_LEN (OFFSET_SECOND - OFFSET_YEAR + 1) + +#define TIME_BUF(info, index) INFO_BUF(info, OFFSET_HOUR + index) +#define TIME_BUF_LEN (OFFSET_SECOND - OFFSET_HOUR + 1) + +#define WR 0 // command for writing data +#define RD 1 // command for reading data + +#define CMD(n) (0x60 | (n << 1)) + +#define CMD_RESET CMD(0) +#define CMD_STATUS CMD(1) +#define CMD_DATETIME CMD(2) +#define CMD_TIME CMD(3) +#define CMD_ALARM CMD(4) + +#define GPIO_PORT_DATA (*(vu16 *)0x80000C4) +#define GPIO_PORT_DIRECTION (*(vu16 *)0x80000C6) +#define GPIO_PORT_READ_ENABLE (*(vu16 *)0x80000C8) + +extern vu16 GPIOPortDirection; + +static u16 sDummy; // unused variable +static bool8 sLocked; + +static int WriteCommand(u8 value); +static int WriteData(u8 value); +static u8 ReadData(); +static void EnableGpioPortRead(); +static void DisableGpioPortRead(); + +static const char AgbLibRtcVersion[] = "SIIRTC_V001"; + +void SiiRtcUnprotect() +{ + EnableGpioPortRead(); + sLocked = FALSE; +} + +void SiiRtcProtect() +{ + DisableGpioPortRead(); + sLocked = TRUE; +} + +u8 SiiRtcProbe() +{ + u8 errorCode; + struct SiiRtcInfo rtc; + + if (!SiiRtcGetStatus(&rtc)) + return 0; + + errorCode = 0; + + if ((rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == SIIRTCINFO_POWER + || (rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == 0) + { + // The RTC is in 12-hour mode. Reset it and switch to 24-hour mode. + + // Note that the conditions are redundant and equivalent to simply + // "(rtc.status & SIIRTCINFO_24HOUR) == 0". It's possible that this + // was also intended to handle resetting the clock after power failure + // but a mistake was made. + + if (!SiiRtcReset()) + return 0; + + errorCode++; + } + + SiiRtcGetTime(&rtc); + + if (rtc.second & TEST_MODE) + { + // The RTC is in test mode. Reset it to leave test mode. + + if (!SiiRtcReset()) + return (errorCode << 4) & 0xF0; + + errorCode++; + } + + return (errorCode << 4) | 1; +} + +bool8 SiiRtcReset() +{ + u8 result; + struct SiiRtcInfo rtc; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_RESET | WR); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + rtc.status = SIIRTCINFO_24HOUR; + + result = SiiRtcSetStatus(&rtc); + + return result; +} + +bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc) +{ + u8 statusData; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_STATUS | RD); + + GPIO_PORT_DIRECTION = 5; + + statusData = ReadData(); + + rtc->status = (statusData & (STATUS_POWER | STATUS_24HOUR)) + | ((statusData & STATUS_INTAE) >> 3) + | ((statusData & STATUS_INTME) >> 2) + | ((statusData & STATUS_INTFE) >> 1); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc) +{ + u8 statusData; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + statusData = STATUS_24HOUR + | ((rtc->status & SIIRTCINFO_INTAE) << 3) + | ((rtc->status & SIIRTCINFO_INTME) << 2) + | ((rtc->status & SIIRTCINFO_INTFE) << 1); + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_STATUS | WR); + + WriteData(statusData); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc) +{ + u8 i; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_DATETIME | RD); + + GPIO_PORT_DIRECTION = 5; + + for (i = 0; i < DATETIME_BUF_LEN; i++) + DATETIME_BUF(rtc, i) = ReadData(); + + INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc) +{ + u8 i; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_DATETIME | WR); + + for (i = 0; i < DATETIME_BUF_LEN; i++) + WriteData(DATETIME_BUF(rtc, i)); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc) +{ + u8 i; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_TIME | RD); + + GPIO_PORT_DIRECTION = 5; + + for (i = 0; i < TIME_BUF_LEN; i++) + TIME_BUF(rtc, i) = ReadData(); + + INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc) +{ + u8 i; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_TIME | WR); + + for (i = 0; i < TIME_BUF_LEN; i++) + WriteData(TIME_BUF(rtc, i)); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc) +{ + u8 i; + u8 alarmData[2]; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + // Decode BCD. + alarmData[0] = (rtc->alarmHour & 0xF) + 10 * ((rtc->alarmHour >> 4) & 0xF); + + // The AM/PM flag must be set correctly even in 24-hour mode. + + if (alarmData[0] < 12) + alarmData[0] = rtc->alarmHour | ALARM_AM; + else + alarmData[0] = rtc->alarmHour | ALARM_PM; + + alarmData[1] = rtc->alarmMinute; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIOPortDirection = 7; // Why is this the only instance that uses a symbol? + + WriteCommand(CMD_ALARM | WR); + + for (i = 0; i < 2; i++) + WriteData(alarmData[i]); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +static int WriteCommand(u8 value) +{ + u8 i; + u8 temp; + + for (i = 0; i < 8; i++) + { + temp = ((value >> (7 - i)) & 1); + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 5; + } + + // control reaches end of non-void function +} + +static int WriteData(u8 value) +{ + u8 i; + u8 temp; + + for (i = 0; i < 8; i++) + { + temp = ((value >> i) & 1); + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 5; + } + + // control reaches end of non-void function +} + +static u8 ReadData() +{ + u8 i; + u8 temp; + u8 value; + + for (i = 0; i < 8; i++) + { + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 5; + + temp = ((GPIO_PORT_DATA & 2) >> 1); + value = (value >> 1) | (temp << 7); // UB: accessing uninitialized var + } + + return value; +} + +static void EnableGpioPortRead() +{ + GPIO_PORT_READ_ENABLE = 1; +} + +static void DisableGpioPortRead() +{ + GPIO_PORT_READ_ENABLE = 0; +} diff --git a/src/engine/sound.c b/src/engine/sound.c new file mode 100644 index 000000000..8d23b7d7a --- /dev/null +++ b/src/engine/sound.c @@ -0,0 +1,585 @@ +#include "global.h" +#include "gba/m4a_internal.h" +#include "sound.h" +#include "battle.h" +#include "m4a.h" +#include "main.h" +#include "songs.h" +#include "task.h" + +struct Fanfare +{ + u16 songNum; + u16 duration; +}; + +// FIXME: different prototype than definition +u32 SpeciesToCryId(u32); + +extern u16 gBattleTypeFlags; + +static EWRAM_DATA struct MusicPlayerInfo *gMPlay_PokemonCry = NULL; +static EWRAM_DATA u8 gPokemonCryBGMDuckingCounter = 0; + +static u16 sCurrentMapMusic; +static u16 sNextMapMusic; +static u8 sMapMusicState; +static u8 sMapMusicFadeInSpeed; +static u16 sFanfareCounter; + +bool8 gDisableMusic; + +extern struct MusicPlayerInfo gMPlay_BGM; +extern struct MusicPlayerInfo gMPlay_SE1; +extern struct MusicPlayerInfo gMPlay_SE2; +extern struct MusicPlayerInfo gMPlay_SE3; + +extern struct ToneData voicegroup_8452590[]; +extern struct ToneData voicegroup_8452B90[]; +extern struct ToneData voicegroup_8453190[]; +extern struct ToneData voicegroup_8453790[]; + +extern struct ToneData voicegroup_84537C0[]; +extern struct ToneData voicegroup_8453DC0[]; +extern struct ToneData voicegroup_84543C0[]; +extern struct ToneData voicegroup_84549C0[]; + +static const struct Fanfare sFanfares[] = +{ + { BGM_FANFA1, 80 }, + { BGM_FANFA4, 160 }, + { BGM_FANFA5, 220 }, + { BGM_ME_WAZA, 220 }, + { BGM_ME_ASA, 160 }, + { BGM_ME_BACHI, 340 }, + { BGM_ME_WASURE, 180 }, + { BGM_ME_KINOMI, 120 }, + { BGM_ME_TAMA, 710 }, + { BGM_ME_B_BIG, 250 }, + { BGM_ME_B_SMALL, 150 }, + { BGM_ME_ZANNEN, 160 }, +}; + +static void Task_Fanfare(u8 taskId); +static void CreateFanfareTask(void); +static void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode); +static void Task_DuckBGMForPokemonCry(u8 taskId); +static void RestoreBGMVolumeAfterPokemonCry(void); + +void InitMapMusic(void) +{ + gDisableMusic = FALSE; + ResetMapMusic(); +} + +void MapMusicMain(void) +{ + switch (sMapMusicState) + { + case 0: + break; + case 1: + sMapMusicState = 2; + PlayBGM(sCurrentMapMusic); + break; + case 2: + case 3: + case 4: + break; + case 5: + if (IsBGMStopped()) + { + sNextMapMusic = 0; + sMapMusicState = 0; + } + break; + case 6: + if (IsBGMStopped() && IsFanfareTaskInactive()) + { + sCurrentMapMusic = sNextMapMusic; + sNextMapMusic = 0; + sMapMusicState = 2; + PlayBGM(sCurrentMapMusic); + } + break; + case 7: + if (IsBGMStopped() && IsFanfareTaskInactive()) + { + FadeInNewBGM(sNextMapMusic, sMapMusicFadeInSpeed); + sCurrentMapMusic = sNextMapMusic; + sNextMapMusic = 0; + sMapMusicState = 2; + sMapMusicFadeInSpeed = 0; + } + break; + } +} + +void ResetMapMusic(void) +{ + sCurrentMapMusic = 0; + sNextMapMusic = 0; + sMapMusicState = 0; + sMapMusicFadeInSpeed = 0; +} + +u16 GetCurrentMapMusic(void) +{ + return sCurrentMapMusic; +} + +void PlayNewMapMusic(u16 songNum) +{ + sCurrentMapMusic = songNum; + sNextMapMusic = 0; + sMapMusicState = 1; +} + +void StopMapMusic(void) +{ + sCurrentMapMusic = 0; + sNextMapMusic = 0; + sMapMusicState = 1; +} + +void FadeOutMapMusic(u8 speed) +{ + if (IsNotWaitingForBGMStop()) + FadeOutBGM(speed); + sCurrentMapMusic = 0; + sNextMapMusic = 0; + sMapMusicState = 5; +} + +void FadeOutAndPlayNewMapMusic(u16 songNum, u8 speed) +{ + FadeOutMapMusic(speed); + sCurrentMapMusic = 0; + sNextMapMusic = songNum; + sMapMusicState = 6; +} + +void FadeOutAndFadeInNewMapMusic(u16 songNum, u8 fadeOutSpeed, u8 fadeInSpeed) +{ + FadeOutMapMusic(fadeOutSpeed); + sCurrentMapMusic = 0; + sNextMapMusic = songNum; + sMapMusicState = 7; + sMapMusicFadeInSpeed = fadeInSpeed; +} + +void FadeInNewMapMusic(u16 songNum, u8 speed) +{ + FadeInNewBGM(songNum, speed); + sCurrentMapMusic = songNum; + sNextMapMusic = 0; + sMapMusicState = 2; + sMapMusicFadeInSpeed = 0; +} + +bool8 IsNotWaitingForBGMStop(void) +{ + if (sMapMusicState == 6) + return FALSE; + if (sMapMusicState == 5) + return FALSE; + if (sMapMusicState == 7) + return FALSE; + return TRUE; +} + +void PlayFanfareByFanfareNum(u8 fanfareNum) +{ + u16 songNum; + m4aMPlayStop(&gMPlay_BGM); + songNum = sFanfares[fanfareNum].songNum; + sFanfareCounter = sFanfares[fanfareNum].duration; + m4aSongNumStart(songNum); +} + +bool8 WaitFanfare(bool8 stop) +{ + if (sFanfareCounter) + { + sFanfareCounter--; + return FALSE; + } + else + { + if (!stop) + m4aMPlayContinue(&gMPlay_BGM); + else + m4aSongNumStart(SE_STOP); + + return TRUE; + } +} + +void StopFanfareByFanfareNum(u8 fanfareNum) +{ + m4aSongNumStop(sFanfares[fanfareNum].songNum); +} + +void PlayFanfare(u16 songNum) +{ + s32 i; + for (i = 0; (u32)i < 12; i++) + { + if (sFanfares[i].songNum == songNum) + { + PlayFanfareByFanfareNum(i); + CreateFanfareTask(); + return; + } + } + + PlayFanfareByFanfareNum(0); + CreateFanfareTask(); +} + +bool8 IsFanfareTaskInactive(void) +{ + if (FuncIsActiveTask(Task_Fanfare) == TRUE) + return FALSE; + return TRUE; +} + +static void Task_Fanfare(u8 taskId) +{ + if (sFanfareCounter) + { + sFanfareCounter--; + } + else + { + m4aMPlayContinue(&gMPlay_BGM); + DestroyTask(taskId); + } +} + +static void CreateFanfareTask(void) +{ + if (FuncIsActiveTask(Task_Fanfare) != TRUE) + CreateTask(Task_Fanfare, 80); +} + +void FadeInNewBGM(u16 songNum, u8 speed) +{ + if (gDisableMusic) + songNum = 0; + m4aSongNumStart(songNum); + m4aMPlayImmInit(&gMPlay_BGM); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0); + m4aSongNumStop(songNum); + m4aMPlayFadeIn(&gMPlay_BGM, speed); +} + +void FadeOutBGMTemporarily(u8 speed) +{ + m4aMPlayFadeOutTemporarily(&gMPlay_BGM, speed); +} + +bool8 IsBGMPausedOrStopped(void) +{ + if (gMPlay_BGM.status & MUSICPLAYER_STATUS_PAUSE) + return TRUE; + if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) + return TRUE; + return FALSE; +} + +void FadeInBGM(u8 speed) +{ + m4aMPlayFadeIn(&gMPlay_BGM, speed); +} + +void FadeOutBGM(u8 speed) +{ + m4aMPlayFadeOut(&gMPlay_BGM, speed); +} + +bool8 IsBGMStopped(void) +{ + if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) + return TRUE; + return FALSE; +} + +void PlayCry1(u16 species, s8 pan) +{ + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); + PlayCryInternal(species, pan, 125, 10, 0); + gPokemonCryBGMDuckingCounter = 2; + RestoreBGMVolumeAfterPokemonCry(); +} + +void PlayCry2(u16 species, s8 pan, s8 volume, u8 priority) +{ + PlayCryInternal(species, pan, volume, priority, 0); +} + +void PlayCry3(u16 species, s8 pan, u8 mode) +{ + if (mode == 1) + { + PlayCryInternal(species, pan, 125, 10, 1); + } + else + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); + PlayCryInternal(species, pan, 125, 10, mode); + gPokemonCryBGMDuckingCounter = 2; + RestoreBGMVolumeAfterPokemonCry(); + } +} + +void PlayCry4(u16 species, s8 pan, u8 mode) +{ + if (mode == 1) + { + PlayCryInternal(species, pan, 125, 10, 1); + } + else + { + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); + PlayCryInternal(species, pan, 125, 10, mode); + } +} + +void PlayCry5(u16 species, u8 mode) +{ + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); + PlayCryInternal(species, 0, 125, 10, mode); + gPokemonCryBGMDuckingCounter = 2; + RestoreBGMVolumeAfterPokemonCry(); +} + +#define GET_CRY_PTR(a, b)\ +{\ + struct ToneData *tone;\ + if (v0)\ + tone = &a[index];\ + else\ + tone = &b[index];\ + gMPlay_PokemonCry = SetPokemonCryTone(tone);\ + break;\ +} + +static void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode) +{ + u32 cryId; + u32 v0; + u32 release; + u32 length; + u32 pitch; + u32 chorus; + u32 index; + u8 table; + + species--; + + cryId = species; + + v0 = 0; + release = 0; + length = 140; + pitch = 15360; + chorus = 0; + + switch (mode) + { + case 0: + break; + case 1: + length = 20; + release = 225; + break; + case 2: + length = 30; + release = 225; + pitch = 15600; + chorus = 20; + volume = 80; + break; + case 3: + length = 50; + release = 200; + pitch = 14800; + break; + case 4: + length = 20; + release = 220; + pitch = 15800; + break; + case 5: + release = 200; + pitch = 14500; + break; + } + + SetPokemonCryVolume(volume); + SetPokemonCryPanpot(pan); + SetPokemonCryPitch(pitch); + SetPokemonCryLength(length); + SetPokemonCryProgress(0); + SetPokemonCryRelease(release); + SetPokemonCryChorus(chorus); + SetPokemonCryPriority(priority); + + asm(""); + asm(""); + asm(""); + asm(""); + asm(""); + asm(""); + asm(""); + + cryId = SpeciesToCryId(cryId); + index = 0x7F; + asm("" ::: "r0"); + index &= cryId; + table = cryId >> 7; + + switch (table) + { + case 0: GET_CRY_PTR(voicegroup_84537C0, voicegroup_8452590); + case 1: GET_CRY_PTR(voicegroup_8453DC0, voicegroup_8452B90); + case 2: GET_CRY_PTR(voicegroup_84543C0, voicegroup_8453190); + case 3: GET_CRY_PTR(voicegroup_84549C0, voicegroup_8453790); + } +} + +bool8 IsCryFinished(void) +{ + if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) == TRUE) + { + return FALSE; + } + else + { + ClearPokemonCrySongs(); + return TRUE; + } +} + +void StopCryAndClearCrySongs(void) +{ + m4aMPlayStop(gMPlay_PokemonCry); + ClearPokemonCrySongs(); +} + +void StopCry(void) +{ + m4aMPlayStop(gMPlay_PokemonCry); +} + +bool8 IsCryPlayingOrClearCrySongs(void) +{ + if (IsPokemonCryPlaying(gMPlay_PokemonCry)) + { + return TRUE; + } + else + { + ClearPokemonCrySongs(); + return FALSE; + } +} + +bool8 IsCryPlaying(void) +{ + if (IsPokemonCryPlaying(gMPlay_PokemonCry)) + return TRUE; + else + return FALSE; +} + +static void Task_DuckBGMForPokemonCry(u8 taskId) +{ + if (gPokemonCryBGMDuckingCounter) + { + gPokemonCryBGMDuckingCounter--; + return; + } + + if (!IsPokemonCryPlaying(gMPlay_PokemonCry)) + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); + DestroyTask(taskId); + } +} + +static void RestoreBGMVolumeAfterPokemonCry(void) +{ + if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) != TRUE) + CreateTask(Task_DuckBGMForPokemonCry, 80); +} + +void PlayBGM(u16 songNum) +{ + if (gDisableMusic) + songNum = 0; + m4aSongNumStart(songNum); +} + +void PlaySE(u16 songNum) +{ + m4aSongNumStart(songNum); +} + +void PlaySE12WithPanning(u16 songNum, s8 pan) +{ + m4aSongNumStart(songNum); + m4aMPlayImmInit(&gMPlay_SE1); + m4aMPlayImmInit(&gMPlay_SE2); + m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); + m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); +} + +void PlaySE1WithPanning(u16 songNum, s8 pan) +{ + m4aSongNumStart(songNum); + m4aMPlayImmInit(&gMPlay_SE1); + m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); +} + +void PlaySE2WithPanning(u16 songNum, s8 pan) +{ + m4aSongNumStart(songNum); + m4aMPlayImmInit(&gMPlay_SE2); + m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); +} + +void SE12PanpotControl(s8 pan) +{ + m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); + m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); +} + +bool8 IsSEPlaying(void) +{ + if ((gMPlay_SE1.status & MUSICPLAYER_STATUS_PAUSE) && (gMPlay_SE2.status & MUSICPLAYER_STATUS_PAUSE)) + return FALSE; + if (!(gMPlay_SE1.status & MUSICPLAYER_STATUS_TRACK) && !(gMPlay_SE2.status & MUSICPLAYER_STATUS_TRACK)) + return FALSE; + return TRUE; +} + +bool8 IsBGMPlaying(void) +{ + if (gMPlay_BGM.status & MUSICPLAYER_STATUS_PAUSE) + return FALSE; + if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) + return FALSE; + return TRUE; +} + +bool8 IsSpecialSEPlaying(void) +{ + if (gMPlay_SE3.status & MUSICPLAYER_STATUS_PAUSE) + return FALSE; + if (!(gMPlay_SE3.status & MUSICPLAYER_STATUS_TRACK)) + return FALSE; + return TRUE; +} diff --git a/src/engine/sound_check_menu.c b/src/engine/sound_check_menu.c new file mode 100644 index 000000000..d97ae6d86 --- /dev/null +++ b/src/engine/sound_check_menu.c @@ -0,0 +1,2199 @@ +#include "global.h" +#include "sprite.h" +#include "palette.h" +#include "task.h" +#include "m4a.h" +#include "main.h" +#include "text.h" +#include "menu.h" +#include "songs.h" +#include "title_screen.h" +#include "sound.h" +#include "pokedex_cry_screen.h" + +// local task defines +#define WINDOW_SELECTED data[0] +#define BGM_INDEX data[1] +#define SE_INDEX data[2] +#define UNK_DATA3 data[3] +#define UNK_DATA4 data[4] +// data 5-7 are not used +// i dont have a define for data 8 yet because its used in a nonmatching and I can't be sure yet its actually used. + +// window selections +enum +{ + BGM_WINDOW, + SE_WINDOW +}; + +// driver test cry enums +enum +{ + CRY_TEST_UNK0, + CRY_TEST_VOLUME, + CRY_TEST_PANPOT, + CRY_TEST_PITCH, + CRY_TEST_LENGTH, + CRY_TEST_RELEASE, + CRY_TEST_PROGRESS, + CRY_TEST_CHORUS, + CRY_TEST_PRIORITY +}; + +// minmax range enums +enum +{ + MIN, + MAX +}; + +extern struct ToneData voicegroup_84537C0[]; +extern struct ToneData voicegroup_8452590[]; +extern struct ToneData voicegroup_8453DC0[]; +extern struct ToneData voicegroup_8452B90[]; +extern struct ToneData voicegroup_84543C0[]; +extern struct ToneData voicegroup_8453190[]; +extern struct ToneData voicegroup_84549C0[]; +extern struct ToneData voicegroup_8453790[]; + +static EWRAM_DATA u8 gUnknown_020387B0 = 0; +static EWRAM_DATA u8 gUnknown_020387B1 = 0; +static EWRAM_DATA u8 gUnknown_020387B2 = 0; +static EWRAM_DATA s8 gUnknown_020387B3 = 0; +static EWRAM_DATA int gUnknown_020387B4[9] = {0}; +static EWRAM_DATA u8 gUnknown_020387D8 = 0; +static EWRAM_DATA u8 gUnknown_020387D9 = 0; + +extern u16 gUnknown_03005D34; +extern u8 gUnknown_03005E98; + +struct MusicPlayerInfo *gUnknown_03005D30; + +extern struct MusicPlayerInfo gMPlay_BGM; + +void sub_80BA258(u8); +void sub_80BA384(u8); +void sub_80BA65C(u8); +void sub_80BA68C(u8); +void sub_80BA6B8(u8); +void sub_80BA700(u16, u16, u16); +void sub_80BA79C(const u8 *const, u16, u16); +void sub_80BA800(u8); +void sub_80BAA48(u8); +void sub_80BACDC(s8); +void sub_80BAD5C(void); +void sub_80BAE10(u8, u8); +void sub_80BAE78(int, u16, u16, u8); +void sub_80BAF84(u8); +void sub_80BB038(u8); +void sub_80BB1D4(void); +void sub_80BB25C(u8); +void sub_80BB3B4(u8); +void sub_80BB494(void); + +static const u8 gDebugText_SoundCheckJap[] = _("サウンドチェック"); +static const u8 gDebugText_BGM[] = _("BGM"); +static const u8 gDebugText_SE[] = _("SE "); +static const u8 gDebugText_ABDesc[] = _("A‥さいせい B‥おわり"); +static const u8 gDebugText_UpDown[] = _("L‥UP R‥DOWN"); +static const u8 gDebugText_DriverTest[] = _("R‥DRIVER-TEST"); + +// ideally this should be a multi Coords8 struct, but it wont match when its treated like a struct. +static const u8 gUnknown_083D0300[] = { 1, 1, 1, 3, 1, 5, 1, 7, 1, 9, 1, 11, 1, 13, 1, 15, 1, 17 }; + +static const u8 gDebugText_BBack[] = _("Bぼたんで もどる"); +static const u8 gDebugText_APlay[] = _("Aぼたんで さいせい"); +static const u8 gDebugText_Voice[] = _("VOICE‥‥‥‥"); +static const u8 gDebugText_Volume[] = _("VOLUME‥‥‥"); +static const u8 gDebugText_Panpot[] = _("PANPOT‥‥‥"); +static const u8 gDebugText_Pitch[] = _("PITCH‥‥‥‥"); +static const u8 gDebugText_Length[] = _("LENGTH‥‥‥"); +static const u8 gDebugText_Release[] = _("RELEASE‥‥"); +static const u8 gDebugText_Progress[] = _("PROGRESS‥"); +static const u8 gDebugText_Chorus[] = _("CHORUS‥‥‥"); +static const u8 gDebugText_Priority[] = _("PRIORITY‥"); +static const u8 gDebugText_Playing[] = _("さいせいちゆう‥"); // 再生中 (playing) +static const u8 gDebugText_Reverse[] = _("はんてん‥‥‥‥"); // 反転 (reverse) +static const u8 gDebugText_Stereo[] = _("すてれお‥‥‥‥"); // stereo + +// also ideally should be a MinMax struct, but any attempt to make this into a struct causes it to not match due to the weird multi dim access. +static const int gUnknown_083D039C[16] = +{ + 0, 387, + 0, 127, + -127, 127, + -128, 32639, + 0, 65535, + 0, 255, + 0, 65535, + -64, 63 +}; + +static const u8 gUnknown_083D03DC[] = _("▶"); +static const u8 gUnknown_083D03DE[] = _(" "); + +// why not just use Powers of ten from string_util? +static const int gUnknown_083D03E0[6] = +{ + 1, + 10, + 100, + 1000, + 10000, + 100000 +}; + +static const s8 gUnknown_083D03F8[5] = { 0x3F, 0x00, 0xC0, 0x7F, 0x80 }; + +static const u8 gOtherText_SE[] = _("SE"); +static const u8 gOtherText_Pan[] = _("PAN"); +static const u8 gOtherText_LR[] = _(" LR"); +static const u8 gOtherText_RL[] = _(" RL"); + +// bgm names +static const u8 BGMName_STOP[] = _("STOP"); +static const u8 BGMName_TETSUJI[] = _("TETSUJI"); +static const u8 BGMName_FIELD13[] = _("FIELD13"); +static const u8 BGMName_KACHI22[] = _("KACHI22"); +static const u8 BGMName_KACHI2[] = _("KACHI2"); +static const u8 BGMName_KACHI3[] = _("KACHI3"); +static const u8 BGMName_KACHI5[] = _("KACHI5"); +static const u8 BGMName_PCC[] = _("PCC"); +static const u8 BGMName_NIBI[] = _("NIBI"); +static const u8 BGMName_SUIKUN[] = _("SUIKUN"); +static const u8 BGMName_DOORO1[] = _("DOORO1"); +static const u8 BGMName_DOORO_X1[] = _("DOORO-X1"); +static const u8 BGMName_DOORO_X3[] = _("DOORO-X3"); +static const u8 BGMName_MACHI_S2[] = _("MACHI-S2"); +static const u8 BGMName_MACHI_S4[] = _("MACHI-S4"); +static const u8 BGMName_GIM[] = _("GIM"); +static const u8 BGMName_NAMINORI[] = _("NAMINORI"); +static const u8 BGMName_DAN01[] = _("DAN01"); +static const u8 BGMName_FANFA1[] = _("FANFA1"); +static const u8 BGMName_ME_ASA[] = _("ME-ASA"); +static const u8 BGMName_ME_BACHI[] = _("ME-BACHI"); +static const u8 BGMName_FANFA4[] = _("FANFA4"); +static const u8 BGMName_FANFA5[] = _("FANFA5"); +static const u8 BGMName_ME_WAZA[] = _("ME-WAZA"); +static const u8 BGMName_BIJYUTU[] = _("BIJYUTU"); +static const u8 BGMName_DOORO_X4[] = _("DOORO-X4"); +static const u8 BGMName_FUNE_KAN[] = _("FUNE-KAN"); +static const u8 BGMName_ME_SHINKA[] = _("ME-SHINKA"); +static const u8 BGMName_SHINKA[] = _("SHINKA"); +static const u8 BGMName_ME_WASURE[] = _("ME-WASURE"); +static const u8 BGMName_SYOUJOEYE[] = _("SYOUJOEYE"); +static const u8 BGMName_BOYEYE[] = _("BOYEYE"); +static const u8 BGMName_DAN02[] = _("DAN02"); +static const u8 BGMName_MACHI_S3[] = _("MACHI-S3"); +static const u8 BGMName_ODAMAKI[] = _("ODAMAKI"); +static const u8 BGMName_B_TOWER[] = _("B-TOWER"); +static const u8 BGMName_SWIMEYE[] = _("SWIMEYE"); +static const u8 BGMName_DAN03[] = _("DAN03"); +static const u8 BGMName_ME_KINOMI[] = _("ME-KINOMI"); +static const u8 BGMName_ME_TAMA[] = _("ME-TAMA"); +static const u8 BGMName_ME_B_BIG[] = _("ME-B-BIG"); +static const u8 BGMName_ME_B_SMALL[] = _("ME-B-SMALL"); +static const u8 BGMName_ME_ZANNEN[] = _("ME-ZANNEN"); +static const u8 BGMName_BD_TIME[] = _("BD-TIME"); +static const u8 BGMName_TEST1[] = _("TEST1"); +static const u8 BGMName_TEST2[] = _("TEST2"); +static const u8 BGMName_TEST3[] = _("TEST3"); +static const u8 BGMName_TEST4[] = _("TEST4"); +static const u8 BGMName_TEST[] = _("TEST"); +static const u8 BGMName_GOMACHI0[] = _("GOMACHI0"); +static const u8 BGMName_GOTOWN[] = _("GOTOWN"); +static const u8 BGMName_POKECEN[] = _("POKECEN"); +static const u8 BGMName_NEXTROAD[] = _("NEXTROAD"); +static const u8 BGMName_GRANROAD[] = _("GRANROAD"); +static const u8 BGMName_CYCLING[] = _("CYCLING"); +static const u8 BGMName_FRIENDLY[] = _("FRIENDLY"); +static const u8 BGMName_MISHIRO[] = _("MISHIRO"); +static const u8 BGMName_TOZAN[] = _("TOZAN"); +static const u8 BGMName_GIRLEYE[] = _("GIRLEYE"); +static const u8 BGMName_MINAMO[] = _("MINAMO"); +static const u8 BGMName_ASHROAD[] = _("ASHROAD"); +static const u8 BGMName_EVENT0[] = _("EVENT0"); +static const u8 BGMName_DEEPDEEP[] = _("DEEPDEEP"); +static const u8 BGMName_KACHI1[] = _("KACHI1"); +static const u8 BGMName_TITLE3[] = _("TITLE3"); +static const u8 BGMName_DEMO1[] = _("DEMO1"); +static const u8 BGMName_GIRL_SUP[] = _("GIRL-SUP"); +static const u8 BGMName_HAGESHII[] = _("HAGESHII"); +static const u8 BGMName_KAKKOII[] = _("KAKKOII"); +static const u8 BGMName_KAZANBAI[] = _("KAZANBAI"); +static const u8 BGMName_AQA_0[] = _("AQA-0"); +static const u8 BGMName_TSURETEK[] = _("TSURETEK"); +static const u8 BGMName_BOY_SUP[] = _("BOY-SUP"); +static const u8 BGMName_RAINBOW[] = _("RAINBOW"); +static const u8 BGMName_AYASII[] = _("AYASII"); +static const u8 BGMName_KACHI4[] = _("KACHI4"); +static const u8 BGMName_ROPEWAY[] = _("ROPEWAY"); +static const u8 BGMName_CASINO[] = _("CASINO"); +static const u8 BGMName_HIGHTOWN[] = _("HIGHTOWN"); +static const u8 BGMName_SAFARI[] = _("SAFARI"); +static const u8 BGMName_C_ROAD[] = _("C-ROAD"); +static const u8 BGMName_AJITO[] = _("AJITO"); +static const u8 BGMName_M_BOAT[] = _("M-BOAT"); +static const u8 BGMName_M_DUNGON[] = _("M-DUNGON"); +static const u8 BGMName_FINECITY[] = _("FINECITY"); +static const u8 BGMName_MACHUPI[] = _("MACHUPI"); +static const u8 BGMName_P_SCHOOL[] = _("P-SCHOOL"); +static const u8 BGMName_DENDOU[] = _("DENDOU"); +static const u8 BGMName_TONEKUSA[] = _("TONEKUSA"); +static const u8 BGMName_MABOROSI[] = _("MABOROSI"); +static const u8 BGMName_CON_FAN[] = _("CON-FAN"); +static const u8 BGMName_CONTEST0[] = _("CONTEST0"); +static const u8 BGMName_MGM0[] = _("MGM0"); +static const u8 BGMName_T_BATTLE[] = _("T-BATTLE"); +static const u8 BGMName_OOAME[] = _("OOAME"); +static const u8 BGMName_HIDERI[] = _("HIDERI"); +static const u8 BGMName_RUNECITY[] = _("RUNECITY"); +static const u8 BGMName_CON_K[] = _("CON-K"); +static const u8 BGMName_EIKOU_R[] = _("EIKOU-R"); +static const u8 BGMName_KARAKURI[] = _("KARAKURI"); +static const u8 BGMName_HUTAGO[] = _("HUTAGO"); +static const u8 BGMName_SITENNOU[] = _("SITENNOU"); +static const u8 BGMName_YAMA_EYE[] = _("YAMA-EYE"); +static const u8 BGMName_CONLOBBY[] = _("CONLOBBY"); +static const u8 BGMName_INTER_V[] = _("INTER-V"); +static const u8 BGMName_DAIGO[] = _("DAIGO"); +static const u8 BGMName_THANKFOR[] = _("THANKFOR"); +static const u8 BGMName_END[] = _("END"); +static const u8 BGMName_BATTLE27[] = _("BATTLE27"); +static const u8 BGMName_BATTLE31[] = _("BATTLE31"); +static const u8 BGMName_BATTLE20[] = _("BATTLE20"); +static const u8 BGMName_BATTLE32[] = _("BATTLE32"); +static const u8 BGMName_BATTLE33[] = _("BATTLE33"); +static const u8 BGMName_BATTLE36[] = _("BATTLE36"); +static const u8 BGMName_BATTLE34[] = _("BATTLE34"); +static const u8 BGMName_BATTLE35[] = _("BATTLE35"); +static const u8 BGMName_BATTLE38[] = _("BATTLE38"); +static const u8 BGMName_BATTLE30[] = _("BATTLE30"); + +static const u8 *const gBGMNames[] = +{ + BGMName_STOP, + BGMName_TETSUJI, + BGMName_FIELD13, + BGMName_KACHI22, + BGMName_KACHI2, + BGMName_KACHI3, + BGMName_KACHI5, + BGMName_PCC, + BGMName_NIBI, + BGMName_SUIKUN, + BGMName_DOORO1, + BGMName_DOORO_X1, + BGMName_DOORO_X3, + BGMName_MACHI_S2, + BGMName_MACHI_S4, + BGMName_GIM, + BGMName_NAMINORI, + BGMName_DAN01, + BGMName_FANFA1, + BGMName_ME_ASA, + BGMName_ME_BACHI, + BGMName_FANFA4, + BGMName_FANFA5, + BGMName_ME_WAZA, + BGMName_BIJYUTU, + BGMName_DOORO_X4, + BGMName_FUNE_KAN, + BGMName_ME_SHINKA, + BGMName_SHINKA, + BGMName_ME_WASURE, + BGMName_SYOUJOEYE, + BGMName_BOYEYE, + BGMName_DAN02, + BGMName_MACHI_S3, + BGMName_ODAMAKI, + BGMName_B_TOWER, + BGMName_SWIMEYE, + BGMName_DAN03, + BGMName_ME_KINOMI, + BGMName_ME_TAMA, + BGMName_ME_B_BIG, + BGMName_ME_B_SMALL, + BGMName_ME_ZANNEN, + BGMName_BD_TIME, + BGMName_TEST1, + BGMName_TEST2, + BGMName_TEST3, + BGMName_TEST4, + BGMName_TEST, + BGMName_GOMACHI0, + BGMName_GOTOWN, + BGMName_POKECEN, + BGMName_NEXTROAD, + BGMName_GRANROAD, + BGMName_CYCLING, + BGMName_FRIENDLY, + BGMName_MISHIRO, + BGMName_TOZAN, + BGMName_GIRLEYE, + BGMName_MINAMO, + BGMName_ASHROAD, + BGMName_EVENT0, + BGMName_DEEPDEEP, + BGMName_KACHI1, + BGMName_TITLE3, + BGMName_DEMO1, + BGMName_GIRL_SUP, + BGMName_HAGESHII, + BGMName_KAKKOII, + BGMName_KAZANBAI, + BGMName_AQA_0, + BGMName_TSURETEK, + BGMName_BOY_SUP, + BGMName_RAINBOW, + BGMName_AYASII, + BGMName_KACHI4, + BGMName_ROPEWAY, + BGMName_CASINO, + BGMName_HIGHTOWN, + BGMName_SAFARI, + BGMName_C_ROAD, + BGMName_AJITO, + BGMName_M_BOAT, + BGMName_M_DUNGON, + BGMName_FINECITY, + BGMName_MACHUPI, + BGMName_P_SCHOOL, + BGMName_DENDOU, + BGMName_TONEKUSA, + BGMName_MABOROSI, + BGMName_CON_FAN, + BGMName_CONTEST0, + BGMName_MGM0, + BGMName_T_BATTLE, + BGMName_OOAME, + BGMName_HIDERI, + BGMName_RUNECITY, + BGMName_CON_K, + BGMName_EIKOU_R, + BGMName_KARAKURI, + BGMName_HUTAGO, + BGMName_SITENNOU, + BGMName_YAMA_EYE, + BGMName_CONLOBBY, + BGMName_INTER_V, + BGMName_DAIGO, + BGMName_THANKFOR, + BGMName_END, + BGMName_BATTLE27, + BGMName_BATTLE31, + BGMName_BATTLE20, + BGMName_BATTLE32, + BGMName_BATTLE33, + BGMName_BATTLE36, + BGMName_BATTLE34, + BGMName_BATTLE35, + BGMName_BATTLE38, + BGMName_BATTLE30 +}; + +// SE names +static const u8 SEName_STOP[] = _("STOP"); +static const u8 SEName_KAIFUKU[] = _("KAIFUKU"); +static const u8 SEName_PC_LOGON[] = _("PC-LOGON"); +static const u8 SEName_PC_OFF[] = _("PC-OFF"); +static const u8 SEName_PC_ON[] = _("PC-ON"); +static const u8 SEName_SELECT[] = _("SELECT"); +static const u8 SEName_WIN_OPEN[] = _("WIN-OPEN"); +static const u8 SEName_WALL_HIT[] = _("WALL-HIT"); +static const u8 SEName_DOOR[] = _("DOOR"); +static const u8 SEName_KAIDAN[] = _("KAIDAN"); +static const u8 SEName_DANSA[] = _("DANSA"); +static const u8 SEName_JITENSYA[] = _("JITENSYA"); +static const u8 SEName_KOUKA_L[] = _("KOUKA-L"); +static const u8 SEName_KOUKA_M[] = _("KOUKA-M"); +static const u8 SEName_KOUKA_H[] = _("KOUKA-H"); +static const u8 SEName_BOWA2[] = _("BOWA2"); +static const u8 SEName_POKE_DEAD[] = _("POKE-DEAD"); +static const u8 SEName_NIGERU[] = _("NIGERU"); +static const u8 SEName_JIDO_DOA[] = _("JIDO-DOA"); +static const u8 SEName_NAMINORI[] = _("NAMINORI"); +static const u8 SEName_BAN[] = _("BAN"); +static const u8 SEName_PIN[] = _("PIN"); +static const u8 SEName_BOO[] = _("BOO"); +static const u8 SEName_BOWA[] = _("BOWA"); +static const u8 SEName_JYUNI[] = _("JYUNI"); +static const u8 SEName_A[] = _("A"); +static const u8 SEName_I[] = _("I"); +static const u8 SEName_U[] = _("U"); +static const u8 SEName_E[] = _("E"); +static const u8 SEName_O[] = _("O"); +static const u8 SEName_N[] = _("N"); +static const u8 SEName_SEIKAI[] = _("SEIKAI"); +static const u8 SEName_HAZURE[] = _("HAZURE"); +static const u8 SEName_EXP[] = _("EXP"); +static const u8 SEName_JITE_PYOKO[] = _("JITE-PYOKO"); +static const u8 SEName_MU_PACHI[] = _("MU-PACHI"); +static const u8 SEName_TK_KASYA[] = _("TK-KASYA"); +static const u8 SEName_FU_ZAKU[] = _("FU-ZAKU"); +static const u8 SEName_FU_ZAKU2[] = _("FU-ZAKU2"); +static const u8 SEName_FU_ZUZUZU[] = _("FU-ZUZUZU"); +static const u8 SEName_RU_GASHIN[] = _("RU-GASHIN"); +static const u8 SEName_RU_GASYAN[] = _("RU-GASYAN"); +static const u8 SEName_RU_BARI[] = _("RU-BARI"); +static const u8 SEName_RU_HYUU[] = _("RU-HYUU"); +static const u8 SEName_KI_GASYAN[] = _("KI-GASYAN"); +static const u8 SEName_TK_WARPIN[] = _("TK-WARPIN"); +static const u8 SEName_TK_WARPOUT[] = _("TK-WARPOUT"); +static const u8 SEName_TU_SAA[] = _("TU-SAA"); +static const u8 SEName_HI_TURUN[] = _("HI-TURUN"); +static const u8 SEName_TRACK_MOVE[] = _("TRACK-MOVE"); +static const u8 SEName_TRACK_STOP[] = _("TRACK-STOP"); +static const u8 SEName_TRACK_HAIK[] = _("TRACK-HAIK"); +static const u8 SEName_TRACK_DOOR[] = _("TRACK-DOOR"); +static const u8 SEName_MOTER[] = _("MOTER"); +static const u8 SEName_CARD[] = _("CARD"); +static const u8 SEName_SAVE[] = _("SAVE"); +static const u8 SEName_KON[] = _("KON"); +static const u8 SEName_KON2[] = _("KON2"); +static const u8 SEName_KON3[] = _("KON3"); +static const u8 SEName_KON4[] = _("KON4"); +static const u8 SEName_SUIKOMU[] = _("SUIKOMU"); +static const u8 SEName_NAGERU[] = _("NAGERU"); +static const u8 SEName_TOY_C[] = _("TOY-C"); +static const u8 SEName_TOY_D[] = _("TOY-D"); +static const u8 SEName_TOY_E[] = _("TOY-E"); +static const u8 SEName_TOY_F[] = _("TOY-F"); +static const u8 SEName_TOY_G[] = _("TOY-G"); +static const u8 SEName_TOY_A[] = _("TOY-A"); +static const u8 SEName_TOY_B[] = _("TOY-B"); +static const u8 SEName_TOY_C1[] = _("TOY-C1"); +static const u8 SEName_MIZU[] = _("MIZU"); +static const u8 SEName_HASHI[] = _("HASHI"); +static const u8 SEName_DAUGI[] = _("DAUGI"); +static const u8 SEName_PINPON[] = _("PINPON"); +static const u8 SEName_FUUSEN1[] = _("FUUSEN1"); +static const u8 SEName_FUUSEN2[] = _("FUUSEN2"); +static const u8 SEName_FUUSEN3[] = _("FUUSEN3"); +static const u8 SEName_TOY_KABE[] = _("TOY-KABE"); +static const u8 SEName_TOY_DANGO[] = _("TOY-DANGO"); +static const u8 SEName_DOKU[] = _("DOKU"); +static const u8 SEName_ESUKA[] = _("ESUKA"); +static const u8 SEName_T_AME[] = _("T-AME"); +static const u8 SEName_T_AME_E[] = _("T-AME-E"); +static const u8 SEName_T_OOAME[] = _("T-OOAME"); +static const u8 SEName_T_OOAME_E[] = _("T-OOAME-E"); +static const u8 SEName_T_KOAME[] = _("T-KOAME"); +static const u8 SEName_T_KOAME_E[] = _("T-KOAME-E"); +static const u8 SEName_T_KAMI[] = _("T-KAMI"); +static const u8 SEName_T_KAMI2[] = _("T-KAMI2"); +static const u8 SEName_ELEBETA[] = _("ELEBETA"); +static const u8 SEName_HINSI[] = _("HINSI"); +static const u8 SEName_EXPMAX[] = _("EXPMAX"); +static const u8 SEName_TAMAKORO[] = _("TAMAKORO"); +static const u8 SEName_TAMAKORO_E[] = _("TAMAKORO-E"); +static const u8 SEName_BASABASA[] = _("BASABASA"); +static const u8 SEName_REGI[] = _("REGI"); +static const u8 SEName_C_GAJI[] = _("C-GAJI"); +static const u8 SEName_C_MAKU_U[] = _("C-MAKU-U"); +static const u8 SEName_C_MAKU_D[] = _("C-MAKU-D"); +static const u8 SEName_C_PASI[] = _("C-PASI"); +static const u8 SEName_C_SYU[] = _("C-SYU"); +static const u8 SEName_C_PIKON[] = _("C-PIKON"); +static const u8 SEName_REAPOKE[] = _("REAPOKE"); +static const u8 SEName_OP_BASYU[] = _("OP-BASYU"); +static const u8 SEName_BT_START[] = _("BT-START"); +static const u8 SEName_DENDOU[] = _("DENDOU"); +static const u8 SEName_JIHANKI[] = _("JIHANKI"); +static const u8 SEName_TAMA[] = _("TAMA"); +static const u8 SEName_Z_SCROLL[] = _("Z-SCROLL"); +static const u8 SEName_Z_PAGE[] = _("Z-PAGE"); +static const u8 SEName_PN_ON[] = _("PN-ON"); +static const u8 SEName_PN_OFF[] = _("PN-OFF"); +static const u8 SEName_Z_SEARCH[] = _("Z-SEARCH"); +static const u8 SEName_TAMAGO[] = _("TAMAGO"); +static const u8 SEName_TB_START[] = _("TB-START"); +static const u8 SEName_TB_KON[] = _("TB-KON"); +static const u8 SEName_TB_KARA[] = _("TB-KARA"); +static const u8 SEName_BIDORO[] = _("BIDORO"); +static const u8 SEName_W085[] = _("W085"); +static const u8 SEName_W085B[] = _("W085B"); +static const u8 SEName_W231[] = _("W231"); +static const u8 SEName_W171[] = _("W171"); +static const u8 SEName_W233[] = _("W233"); +static const u8 SEName_W233B[] = _("W233B"); +static const u8 SEName_W145[] = _("W145"); +static const u8 SEName_W145B[] = _("W145B"); +static const u8 SEName_W145C[] = _("W145C"); +static const u8 SEName_W240[] = _("W240"); +static const u8 SEName_W015[] = _("W015"); +static const u8 SEName_W081[] = _("W081"); +static const u8 SEName_W081B[] = _("W081B"); +static const u8 SEName_W088[] = _("W088"); +static const u8 SEName_W016[] = _("W016"); +static const u8 SEName_W016B[] = _("W016B"); +static const u8 SEName_W003[] = _("W003"); +static const u8 SEName_W104[] = _("W104"); +static const u8 SEName_W013[] = _("W013"); +static const u8 SEName_W196[] = _("W196"); +static const u8 SEName_W086[] = _("W086"); +static const u8 SEName_W004[] = _("W004"); +static const u8 SEName_W025[] = _("W025"); +static const u8 SEName_W025B[] = _("W025B"); +static const u8 SEName_W152[] = _("W152"); +static const u8 SEName_W026[] = _("W026"); +static const u8 SEName_W172[] = _("W172"); +static const u8 SEName_W172B[] = _("W172B"); +static const u8 SEName_W053[] = _("W053"); +static const u8 SEName_W007[] = _("W007"); +static const u8 SEName_W092[] = _("W092"); +static const u8 SEName_W221[] = _("W221"); +static const u8 SEName_W221B[] = _("W221B"); +static const u8 SEName_W052[] = _("W052"); +static const u8 SEName_W036[] = _("W036"); +static const u8 SEName_W059[] = _("W059"); +static const u8 SEName_W059B[] = _("W059B"); +static const u8 SEName_W010[] = _("W010"); +static const u8 SEName_W011[] = _("W011"); +static const u8 SEName_W017[] = _("W017"); +static const u8 SEName_W019[] = _("W019"); +static const u8 SEName_W028[] = _("W028"); +static const u8 SEName_W013B[] = _("W013B"); +static const u8 SEName_W044[] = _("W044"); +static const u8 SEName_W029[] = _("W029"); +static const u8 SEName_W057[] = _("W057"); +static const u8 SEName_W056[] = _("W056"); +static const u8 SEName_W250[] = _("W250"); +static const u8 SEName_W030[] = _("W030"); +static const u8 SEName_W039[] = _("W039"); +static const u8 SEName_W054[] = _("W054"); +static const u8 SEName_W077[] = _("W077"); +static const u8 SEName_W020[] = _("W020"); +static const u8 SEName_W082[] = _("W082"); +static const u8 SEName_W047[] = _("W047"); +static const u8 SEName_W195[] = _("W195"); +static const u8 SEName_W006[] = _("W006"); +static const u8 SEName_W091[] = _("W091"); +static const u8 SEName_W146[] = _("W146"); +static const u8 SEName_W120[] = _("W120"); +static const u8 SEName_W153[] = _("W153"); +static const u8 SEName_W071B[] = _("W071B"); +static const u8 SEName_W071[] = _("W071"); +static const u8 SEName_W103[] = _("W103"); +static const u8 SEName_W062[] = _("W062"); +static const u8 SEName_W062B[] = _("W062B"); +static const u8 SEName_W048[] = _("W048"); +static const u8 SEName_W187[] = _("W187"); +static const u8 SEName_W118[] = _("W118"); +static const u8 SEName_W155[] = _("W155"); +static const u8 SEName_W122[] = _("W122"); +static const u8 SEName_W060[] = _("W060"); +static const u8 SEName_W185[] = _("W185"); +static const u8 SEName_W014[] = _("W014"); +static const u8 SEName_W043[] = _("W043"); +static const u8 SEName_W207[] = _("W207"); +static const u8 SEName_W207B[] = _("W207B"); +static const u8 SEName_W215[] = _("W215"); +static const u8 SEName_W109[] = _("W109"); +static const u8 SEName_W173[] = _("W173"); +static const u8 SEName_W280[] = _("W280"); +static const u8 SEName_W202[] = _("W202"); +static const u8 SEName_W060B[] = _("W060B"); +static const u8 SEName_W076[] = _("W076"); +static const u8 SEName_W080[] = _("W080"); +static const u8 SEName_W100[] = _("W100"); +static const u8 SEName_W107[] = _("W107"); +static const u8 SEName_W166[] = _("W166"); +static const u8 SEName_W129[] = _("W129"); +static const u8 SEName_W115[] = _("W115"); +static const u8 SEName_W112[] = _("W112"); +static const u8 SEName_W197[] = _("W197"); +static const u8 SEName_W199[] = _("W199"); +static const u8 SEName_W236[] = _("W236"); +static const u8 SEName_W204[] = _("W204"); +static const u8 SEName_W268[] = _("W268"); +static const u8 SEName_W070[] = _("W070"); +static const u8 SEName_W063[] = _("W063"); +static const u8 SEName_W127[] = _("W127"); +static const u8 SEName_W179[] = _("W179"); +static const u8 SEName_W151[] = _("W151"); +static const u8 SEName_W201[] = _("W201"); +static const u8 SEName_W161[] = _("W161"); +static const u8 SEName_W161B[] = _("W161B"); +static const u8 SEName_W227[] = _("W227"); +static const u8 SEName_W227B[] = _("W227B"); +static const u8 SEName_W226[] = _("W226"); +static const u8 SEName_W208[] = _("W208"); +static const u8 SEName_W213[] = _("W213"); +static const u8 SEName_W213B[] = _("W213B"); +static const u8 SEName_W234[] = _("W234"); +static const u8 SEName_W260[] = _("W260"); +static const u8 SEName_W328[] = _("W328"); +static const u8 SEName_W320[] = _("W320"); +static const u8 SEName_W255[] = _("W255"); +static const u8 SEName_W291[] = _("W291"); +static const u8 SEName_W089[] = _("W089"); +static const u8 SEName_W239[] = _("W239"); +static const u8 SEName_W230[] = _("W230"); +static const u8 SEName_W281[] = _("W281"); +static const u8 SEName_W327[] = _("W327"); +static const u8 SEName_W287[] = _("W287"); +static const u8 SEName_W257[] = _("W257"); +static const u8 SEName_W253[] = _("W253"); +static const u8 SEName_W258[] = _("W258"); +static const u8 SEName_W322[] = _("W322"); +static const u8 SEName_W298[] = _("W298"); +static const u8 SEName_W287B[] = _("W287B"); +static const u8 SEName_W114[] = _("W114"); +static const u8 SEName_W063B[] = _("W063B"); + +static const u8 *const gSENames[] = +{ + SEName_STOP, + SEName_KAIFUKU, + SEName_PC_LOGON, + SEName_PC_OFF, + SEName_PC_ON, + SEName_SELECT, + SEName_WIN_OPEN, + SEName_WALL_HIT, + SEName_DOOR, + SEName_KAIDAN, + SEName_DANSA, + SEName_JITENSYA, + SEName_KOUKA_L, + SEName_KOUKA_M, + SEName_KOUKA_H, + SEName_BOWA2, + SEName_POKE_DEAD, + SEName_NIGERU, + SEName_JIDO_DOA, + SEName_NAMINORI, + SEName_BAN, + SEName_PIN, + SEName_BOO, + SEName_BOWA, + SEName_JYUNI, + SEName_A, + SEName_I, + SEName_U, + SEName_E, + SEName_O, + SEName_N, + SEName_SEIKAI, + SEName_HAZURE, + SEName_EXP, + SEName_JITE_PYOKO, + SEName_MU_PACHI, + SEName_TK_KASYA, + SEName_FU_ZAKU, + SEName_FU_ZAKU2, + SEName_FU_ZUZUZU, + SEName_RU_GASHIN, + SEName_RU_GASYAN, + SEName_RU_BARI, + SEName_RU_HYUU, + SEName_KI_GASYAN, + SEName_TK_WARPIN, + SEName_TK_WARPOUT, + SEName_TU_SAA, + SEName_HI_TURUN, + SEName_TRACK_MOVE, + SEName_TRACK_STOP, + SEName_TRACK_HAIK, + SEName_TRACK_DOOR, + SEName_MOTER, + SEName_CARD, + SEName_SAVE, + SEName_KON, + SEName_KON2, + SEName_KON3, + SEName_KON4, + SEName_SUIKOMU, + SEName_NAGERU, + SEName_TOY_C, + SEName_TOY_D, + SEName_TOY_E, + SEName_TOY_F, + SEName_TOY_G, + SEName_TOY_A, + SEName_TOY_B, + SEName_TOY_C1, + SEName_MIZU, + SEName_HASHI, + SEName_DAUGI, + SEName_PINPON, + SEName_FUUSEN1, + SEName_FUUSEN2, + SEName_FUUSEN3, + SEName_TOY_KABE, + SEName_TOY_DANGO, + SEName_DOKU, + SEName_ESUKA, + SEName_T_AME, + SEName_T_AME_E, + SEName_T_OOAME, + SEName_T_OOAME_E, + SEName_T_KOAME, + SEName_T_KOAME_E, + SEName_T_KAMI, + SEName_T_KAMI2, + SEName_ELEBETA, + SEName_HINSI, + SEName_EXPMAX, + SEName_TAMAKORO, + SEName_TAMAKORO_E, + SEName_BASABASA, + SEName_REGI, + SEName_C_GAJI, + SEName_C_MAKU_U, + SEName_C_MAKU_D, + SEName_C_PASI, + SEName_C_SYU, + SEName_C_PIKON, + SEName_REAPOKE, + SEName_OP_BASYU, + SEName_BT_START, + SEName_DENDOU, + SEName_JIHANKI, + SEName_TAMA, + SEName_Z_SCROLL, + SEName_Z_PAGE, + SEName_PN_ON, + SEName_PN_OFF, + SEName_Z_SEARCH, + SEName_TAMAGO, + SEName_TB_START, + SEName_TB_KON, + SEName_TB_KARA, + SEName_BIDORO, + SEName_W085, + SEName_W085B, + SEName_W231, + SEName_W171, + SEName_W233, + SEName_W233B, + SEName_W145, + SEName_W145B, + SEName_W145C, + SEName_W240, + SEName_W015, + SEName_W081, + SEName_W081B, + SEName_W088, + SEName_W016, + SEName_W016B, + SEName_W003, + SEName_W104, + SEName_W013, + SEName_W196, + SEName_W086, + SEName_W004, + SEName_W025, + SEName_W025B, + SEName_W152, + SEName_W026, + SEName_W172, + SEName_W172B, + SEName_W053, + SEName_W007, + SEName_W092, + SEName_W221, + SEName_W221B, + SEName_W052, + SEName_W036, + SEName_W059, + SEName_W059B, + SEName_W010, + SEName_W011, + SEName_W017, + SEName_W019, + SEName_W028, + SEName_W013B, + SEName_W044, + SEName_W029, + SEName_W057, + SEName_W056, + SEName_W250, + SEName_W030, + SEName_W039, + SEName_W054, + SEName_W077, + SEName_W020, + SEName_W082, + SEName_W047, + SEName_W195, + SEName_W006, + SEName_W091, + SEName_W146, + SEName_W120, + SEName_W153, + SEName_W071B, + SEName_W071, + SEName_W103, + SEName_W062, + SEName_W062B, + SEName_W048, + SEName_W187, + SEName_W118, + SEName_W155, + SEName_W122, + SEName_W060, + SEName_W185, + SEName_W014, + SEName_W043, + SEName_W207, + SEName_W207B, + SEName_W215, + SEName_W109, + SEName_W173, + SEName_W280, + SEName_W202, + SEName_W060B, + SEName_W076, + SEName_W080, + SEName_W100, + SEName_W107, + SEName_W166, + SEName_W129, + SEName_W115, + SEName_W112, + SEName_W197, + SEName_W199, + SEName_W236, + SEName_W204, + SEName_W268, + SEName_W070, + SEName_W063, + SEName_W127, + SEName_W179, + SEName_W151, + SEName_W201, + SEName_W161, + SEName_W161B, + SEName_W227, + SEName_W227B, + SEName_W226, + SEName_W208, + SEName_W213, + SEName_W213B, + SEName_W234, + SEName_W260, + SEName_W328, + SEName_W320, + SEName_W255, + SEName_W291, + SEName_W089, + SEName_W239, + SEName_W230, + SEName_W281, + SEName_W327, + SEName_W287, + SEName_W257, + SEName_W253, + SEName_W258, + SEName_W322, + SEName_W298, + SEName_W287B, + SEName_W114, + SEName_W063B +}; + +void sub_80BA0A8(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_80BA0C0(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + + if(gUnknown_020387B0 != 0) + { + m4aSoundMain(); + m4aSoundMain(); + m4aSoundMain(); + } +} + +// unused +void CB2_StartSoundCheckMenu(void) +{ + u8 taskId; + + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16(3, 0, VRAM, VRAM_SIZE); + DmaFill32(3, 0, OAM, OAM_SIZE); + DmaFill16(3, 0, PLTT, PLTT_SIZE); + ResetPaletteFade(); + ResetTasks(); + ResetSpriteData(); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + REG_WIN0H = WIN_RANGE(0, 0); + REG_WIN0V = WIN_RANGE(0, 0); + REG_WIN1H = WIN_RANGE(0, 0); + REG_WIN1V = WIN_RANGE(0, 0); + REG_WININ = 0x1111; + REG_WINOUT = 0x31; + REG_BLDCNT = 0xE1; + REG_BLDALPHA = 0; + REG_BLDY = 7; + REG_IE = 1; // could be a typo of REG_IME + REG_IE |= 1; + REG_DISPSTAT |= 8; + SetVBlankCallback(sub_80BA0C0); + SetMainCallback2(sub_80BA0A8); + REG_DISPCNT = 0x7140; + taskId = CreateTask(sub_80BA258, 0); + TASK.WINDOW_SELECTED = BGM_WINDOW; + TASK.BGM_INDEX = 0; + TASK.SE_INDEX = 0; + TASK.UNK_DATA3 = 0; + gUnknown_020387B0 = 0; + TASK.UNK_DATA3 = 0; // why? + m4aSoundInit(); +} + +// Task_InitSoundCheckMenu +void sub_80BA258(u8 taskId) +{ + u8 soundcheckStr[sizeof(gDebugText_SoundCheckJap)]; + u8 bgmStr[sizeof(gDebugText_BGM)]; + u8 seStr[sizeof(gDebugText_SE)]; + u8 abDescStr[sizeof(gDebugText_ABDesc)]; + u8 upDownStr[sizeof(gDebugText_UpDown)]; + u8 driverStr[sizeof(gDebugText_DriverTest)]; + + memcpy(soundcheckStr, gDebugText_SoundCheckJap, sizeof(gDebugText_SoundCheckJap)); + memcpy(bgmStr, gDebugText_BGM, sizeof(gDebugText_BGM)); + memcpy(seStr, gDebugText_SE, sizeof(gDebugText_SE)); + memcpy(abDescStr, gDebugText_ABDesc, sizeof(gDebugText_ABDesc)); + memcpy(upDownStr, gDebugText_UpDown, sizeof(gDebugText_UpDown)); + memcpy(driverStr, gDebugText_DriverTest, sizeof(gDebugText_DriverTest)); + + if(!gPaletteFade.active) + { + MenuDrawTextWindow(0x2, 0, 0x1B, 0x3); + MenuDrawTextWindow(0x2, 0x5, 0x1B, 0xA); + MenuDrawTextWindow(0x2, 0xC, 0x1B, 0x11); + MenuPrint(soundcheckStr, 4, 1); + MenuPrint(abDescStr, 14, 1); + MenuPrint(bgmStr, 4, 6); + MenuPrint(upDownStr, 14, 6); + MenuPrint(seStr, 4, 13); + MenuPrint(upDownStr, 14, 13); + MenuPrint(driverStr, 14, 18); + TASK.FUNC = sub_80BA384; + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(1, 31); + } +} + +void sub_80BA384(u8 taskId) // Task_HandleDrawingSoundCheckMenuText +{ + sub_80BA6B8(TASK.WINDOW_SELECTED); + sub_80BA700(TASK.BGM_INDEX + BGM_STOP, 7, 8); // print by BGM index + sub_80BA79C(gBGMNames[TASK.BGM_INDEX], 11, 8); + sub_80BA700(TASK.SE_INDEX, 7, 15); + sub_80BA79C(gSENames[TASK.SE_INDEX], 11, 15); + TASK.FUNC = sub_80BA65C; +} + +#ifdef NONMATCHING +bool8 sub_80BA400(u8 taskId) // Task_ProcessSoundCheckMenuInput +{ + if(gMain.newKeys & R_BUTTON) // driver test + { + TASK.FUNC = sub_80BA800; + return FALSE; + } + if(gMain.newKeys & L_BUTTON) + { + TASK.FUNC = sub_80BAF84; + return FALSE; + } + if(gMain.newKeys & START_BUTTON) + { + TASK.FUNC = sub_80BB25C; + return FALSE; + } + if(gMain.newKeys & A_BUTTON) // both these cases insist on non reuses of certain data variables and cause the function to not match. + { + if(TASK.WINDOW_SELECTED != 0) // is playing? + { + if(TASK.UNK_DATA4 != 0) + { + if(TASK.SE_INDEX != 0) // why are you insiting on a non signed halfword? + { + m4aSongNumStop(TASK.UNK_DATA4); + } + else + { + m4aSongNumStop(TASK.SE_INDEX); + TASK.UNK_DATA4 = TASK.SE_INDEX; + return FALSE; + } + } + else if(TASK.SE_INDEX == 0) // _080BA4BA + { + return FALSE; + } + // _080BA4C4 + m4aSongNumStart(TASK.SE_INDEX); + TASK.UNK_DATA4 = TASK.SE_INDEX; + return FALSE; + } + else // _080BA4D0 + { + if(TASK.UNK_DATA3 != 0) + { + if(TASK.BGM_INDEX != 0) + { + m4aSongNumStop(TASK.UNK_DATA3 + BGM_STOP); + } + else // _080BA500 + { + m4aSongNumStop(TASK.UNK_DATA3 + BGM_STOP); + TASK.UNK_DATA3 = TASK.BGM_INDEX; + return FALSE; + } + } + else if(TASK.BGM_INDEX == 0) // _080BA514 + return FALSE; + + m4aSongNumStart(TASK.BGM_INDEX + BGM_STOP); + TASK.UNK_DATA3 = TASK.BGM_INDEX; + } + return FALSE; + } + if(gMain.newKeys & B_BUTTON) + { + m4aSongNumStart(5); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + TASK.FUNC = sub_80BA68C; + return FALSE; + } + if(gMain.newAndRepeatedKeys & DPAD_UP) + { + TASK.data[8] ^= A_BUTTON; // huh? + return TRUE; + } + if(gMain.newAndRepeatedKeys & DPAD_DOWN) + { + TASK.data[8] ^= A_BUTTON; // huh? + return TRUE; + } + else + { + u16 keys = gMain.newAndRepeatedKeys & DPAD_RIGHT; + if(keys) + { + if(TASK.WINDOW_SELECTED != 0) + { + if(TASK.SE_INDEX > 0) + { + TASK.SE_INDEX--; + } + else + { + TASK.SE_INDEX = 0xF7; + } + } + else if(TASK.BGM_INDEX > 0) + { + TASK.BGM_INDEX--; + } + else + { + TASK.BGM_INDEX = 0x75; + } + return TRUE; + } + if(gMain.newAndRepeatedKeys & DPAD_LEFT) + { + if(TASK.WINDOW_SELECTED != 0) + { + if(TASK.SE_INDEX < 0xF7) + { + TASK.SE_INDEX++; + } + else + { + TASK.SE_INDEX = keys; // ?? + } + } + else if(TASK.BGM_INDEX < 0x75) + { + TASK.BGM_INDEX++; + return TRUE; + } + else + { + TASK.BGM_INDEX = TASK.SE_INDEX; + return TRUE; + } + return TRUE; + } + if(gMain.heldKeys & SELECT_BUTTON) + { + gUnknown_020387B0 = A_BUTTON; + return FALSE; + } + else + { + gUnknown_020387B0 = (gMain.heldKeys & SELECT_BUTTON); + return FALSE; + } + } +} +#else +__attribute__((naked)) +bool8 sub_80BA400(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + ldr r2, _080BA428 @ =gMain\n\ + ldrh r1, [r2, 0x2E]\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080BA434\n\ + ldr r0, _080BA42C @ =gTasks\n\ + lsls r1, r4, 2\n\ + adds r1, r4\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + ldr r0, _080BA430 @ =sub_80BA800\n\ + str r0, [r1]\n\ + b _080BA64C\n\ + .align 2, 0\n\ +_080BA428: .4byte gMain\n\ +_080BA42C: .4byte gTasks\n\ +_080BA430: .4byte sub_80BA800\n\ +_080BA434:\n\ + movs r0, 0x80\n\ + lsls r0, 2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080BA458\n\ + ldr r0, _080BA450 @ =gTasks\n\ + lsls r1, r4, 2\n\ + adds r1, r4\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + ldr r0, _080BA454 @ =sub_80BAF84\n\ + str r0, [r1]\n\ + b _080BA64C\n\ + .align 2, 0\n\ +_080BA450: .4byte gTasks\n\ +_080BA454: .4byte sub_80BAF84\n\ +_080BA458:\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080BA478\n\ + ldr r0, _080BA470 @ =gTasks\n\ + lsls r1, r4, 2\n\ + adds r1, r4\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + ldr r0, _080BA474 @ =sub_80BB25C\n\ + str r0, [r1]\n\ + b _080BA64C\n\ + .align 2, 0\n\ +_080BA470: .4byte gTasks\n\ +_080BA474: .4byte sub_80BB25C\n\ +_080BA478:\n\ + movs r6, 0x1\n\ + movs r5, 0x1\n\ + ands r5, r1\n\ + cmp r5, 0\n\ + beq _080BA538\n\ + ldr r0, _080BA4AC @ =gTasks\n\ + lsls r1, r4, 2\n\ + adds r1, r4\n\ + lsls r1, 3\n\ + adds r5, r1, r0\n\ + movs r1, 0x8\n\ + ldrsh r0, [r5, r1]\n\ + cmp r0, 0\n\ + beq _080BA4D0\n\ + movs r2, 0x10\n\ + ldrsh r0, [r5, r2]\n\ + cmp r0, 0\n\ + beq _080BA4BA\n\ + movs r3, 0xC\n\ + ldrsh r4, [r5, r3]\n\ + cmp r4, 0\n\ + beq _080BA4B0\n\ + ldrh r0, [r5, 0x10]\n\ + bl m4aSongNumStop\n\ + b _080BA4C4\n\ + .align 2, 0\n\ +_080BA4AC: .4byte gTasks\n\ +_080BA4B0:\n\ + ldrh r0, [r5, 0x10]\n\ + bl m4aSongNumStop\n\ + strh r4, [r5, 0x10]\n\ + b _080BA64C\n\ +_080BA4BA:\n\ + movs r4, 0xC\n\ + ldrsh r0, [r5, r4]\n\ + cmp r0, 0\n\ + bne _080BA4C4\n\ + b _080BA64C\n\ +_080BA4C4:\n\ + ldrh r0, [r5, 0xC]\n\ + bl m4aSongNumStart\n\ + ldrh r0, [r5, 0xC]\n\ + strh r0, [r5, 0x10]\n\ + b _080BA64C\n\ +_080BA4D0:\n\ + ldrh r1, [r5, 0xE]\n\ + movs r2, 0xE\n\ + ldrsh r0, [r5, r2]\n\ + cmp r0, 0\n\ + beq _080BA514\n\ + movs r3, 0xA\n\ + ldrsh r4, [r5, r3]\n\ + cmp r4, 0\n\ + beq _080BA500\n\ + ldr r0, _080BA4FC @ =0x0000015d\n\ + adds r4, r0, 0\n\ + adds r0, r1, r4\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + bl m4aSongNumStop\n\ + ldrh r1, [r5, 0xA]\n\ + adds r4, r1\n\ + lsls r4, 16\n\ + lsrs r4, 16\n\ + adds r0, r4, 0\n\ + b _080BA528\n\ + .align 2, 0\n\ +_080BA4FC: .4byte 0x0000015d\n\ +_080BA500:\n\ + ldr r2, _080BA510 @ =0x0000015d\n\ + adds r0, r1, r2\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + bl m4aSongNumStop\n\ + strh r4, [r5, 0xE]\n\ + b _080BA64C\n\ + .align 2, 0\n\ +_080BA510: .4byte 0x0000015d\n\ +_080BA514:\n\ + ldrh r1, [r5, 0xA]\n\ + movs r3, 0xA\n\ + ldrsh r0, [r5, r3]\n\ + cmp r0, 0\n\ + bne _080BA520\n\ + b _080BA64C\n\ +_080BA520:\n\ + ldr r4, _080BA534 @ =0x0000015d\n\ + adds r0, r1, r4\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ +_080BA528:\n\ + bl m4aSongNumStart\n\ + ldrh r0, [r5, 0xA]\n\ + strh r0, [r5, 0xE]\n\ + b _080BA64C\n\ + .align 2, 0\n\ +_080BA534: .4byte 0x0000015d\n\ +_080BA538:\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080BA570\n\ + movs r0, 0x5\n\ + bl m4aSongNumStart\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + str r5, [sp]\n\ + movs r1, 0\n\ + movs r2, 0\n\ + movs r3, 0x10\n\ + bl BeginNormalPaletteFade\n\ + ldr r1, _080BA568 @ =gTasks\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldr r1, _080BA56C @ =sub_80BA68C\n\ + str r1, [r0]\n\ + b _080BA64C\n\ + .align 2, 0\n\ +_080BA568: .4byte gTasks\n\ +_080BA56C: .4byte sub_80BA68C\n\ +_080BA570:\n\ + ldrh r1, [r2, 0x30]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080BA582\n\ + movs r0, 0x80\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080BA59C\n\ +_080BA582:\n\ + ldr r0, _080BA598 @ =gTasks\n\ + lsls r1, r4, 2\n\ + adds r1, r4\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + ldrh r0, [r1, 0x8]\n\ + eors r0, r6\n\ + strh r0, [r1, 0x8]\n\ +_080BA592:\n\ + movs r0, 0x1\n\ + b _080BA64E\n\ + .align 2, 0\n\ +_080BA598: .4byte gTasks\n\ +_080BA59C:\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0\n\ + beq _080BA5EA\n\ + ldr r0, _080BA5CC @ =gTasks\n\ + lsls r1, r4, 2\n\ + adds r1, r4\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + movs r2, 0x8\n\ + ldrsh r0, [r1, r2]\n\ + cmp r0, 0\n\ + beq _080BA5D6\n\ + ldrh r2, [r1, 0xC]\n\ + movs r3, 0xC\n\ + ldrsh r0, [r1, r3]\n\ + cmp r0, 0\n\ + ble _080BA5D0\n\ + subs r0, r2, 0x1\n\ + strh r0, [r1, 0xC]\n\ + b _080BA592\n\ + .align 2, 0\n\ +_080BA5CC: .4byte gTasks\n\ +_080BA5D0:\n\ + movs r0, 0xF7\n\ + strh r0, [r1, 0xC]\n\ + b _080BA592\n\ +_080BA5D6:\n\ + ldrh r2, [r1, 0xA]\n\ + movs r4, 0xA\n\ + ldrsh r0, [r1, r4]\n\ + cmp r0, 0\n\ + ble _080BA5E4\n\ + subs r0, r2, 0x1\n\ + b _080BA5E6\n\ +_080BA5E4:\n\ + movs r0, 0x75\n\ +_080BA5E6:\n\ + strh r0, [r1, 0xA]\n\ + b _080BA592\n\ +_080BA5EA:\n\ + movs r0, 0x20\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080BA630\n\ + ldr r1, _080BA614 @ =gTasks\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 3\n\ + adds r1, r0, r1\n\ + movs r0, 0x8\n\ + ldrsh r2, [r1, r0]\n\ + cmp r2, 0\n\ + beq _080BA61C\n\ + ldrh r2, [r1, 0xC]\n\ + movs r4, 0xC\n\ + ldrsh r0, [r1, r4]\n\ + cmp r0, 0xF6\n\ + bgt _080BA618\n\ + adds r0, r2, 0x1\n\ + strh r0, [r1, 0xC]\n\ + b _080BA592\n\ + .align 2, 0\n\ +_080BA614: .4byte gTasks\n\ +_080BA618:\n\ + strh r3, [r1, 0xC]\n\ + b _080BA592\n\ +_080BA61C:\n\ + ldrh r3, [r1, 0xA]\n\ + movs r4, 0xA\n\ + ldrsh r0, [r1, r4]\n\ + cmp r0, 0x74\n\ + bgt _080BA62C\n\ + adds r0, r3, 0x1\n\ + strh r0, [r1, 0xA]\n\ + b _080BA592\n\ +_080BA62C:\n\ + strh r2, [r1, 0xA]\n\ + b _080BA592\n\ +_080BA630:\n\ + ldrh r1, [r2, 0x2C]\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + cmp r1, 0\n\ + beq _080BA648\n\ + ldr r0, _080BA644 @ =gUnknown_020387B0\n\ + strb r6, [r0]\n\ + b _080BA64C\n\ + .align 2, 0\n\ +_080BA644: .4byte gUnknown_020387B0\n\ +_080BA648:\n\ + ldr r0, _080BA658 @ =gUnknown_020387B0\n\ + strb r1, [r0]\n\ +_080BA64C:\n\ + movs r0, 0\n\ +_080BA64E:\n\ + add sp, 0x4\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_080BA658: .4byte gUnknown_020387B0\n\ + .syntax divided"); +} +#endif + +void sub_80BA65C(u8 taskId) +{ + if(sub_80BA400(taskId) != FALSE) + TASK.FUNC = sub_80BA384; +} + +void sub_80BA68C(u8 taskId) +{ + if(!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(CB2_InitTitleScreen); + } +} + +void sub_80BA6B8(u8 windowType) +{ + switch(windowType) + { + case BGM_WINDOW: + default: + REG_WIN1H = WIN_RANGE(17, 223); + REG_WIN1V = WIN_RANGE(41, 87); + break; + case SE_WINDOW: + REG_WIN1H = WIN_RANGE(17, 223); + REG_WIN1V = WIN_RANGE(97, 143); + break; + } +} + +void sub_80BA700(u16 soundIndex, u16 x, u16 y) // PrintSoundNumber ? +{ + u8 i; + u8 str[5]; + bool8 someBool; + u8 divisorValue; + + for(i = 0; i < 3; i++) + str[i] = 0; // initialize array + + str[3] = CHAR_ELLIPSIS; + str[4] = EOS; + someBool = FALSE; + + divisorValue = soundIndex / 100; + if(divisorValue) + { + str[0] = divisorValue + CHAR_0; + someBool = TRUE; + } + + divisorValue = (soundIndex % 100) / 10; + if(divisorValue || someBool != FALSE) + str[1] = divisorValue + CHAR_0; + + str[2] = ((soundIndex % 100) % 10) + CHAR_0; + MenuPrint(str, x, y); +} + +void sub_80BA79C(const u8 *const string, u16 x, u16 y) +{ + u8 i; + u8 str[11]; + + for(i = 0; i < 11; i++) + str[i] = 0; // format string. + + str[10] = EOS; // the above for loop formats the last element of the array unnecessarily. + + for(i = 0; string[i] != EOS && i < 10; i++) + str[i] = string[i]; + + MenuPrint(str, x, y); +} + +void sub_80BA800(u8 taskId) // Task_DrawDriverTestMenu +{ + u8 bbackStr[sizeof(gDebugText_BBack)]; + u8 aplayStr[sizeof(gDebugText_APlay)]; + u8 voiceStr[sizeof(gDebugText_Voice)]; + u8 volumeStr[sizeof(gDebugText_Volume)]; + u8 panpotStr[sizeof(gDebugText_Panpot)]; + u8 pitchStr[sizeof(gDebugText_Pitch)]; + u8 lengthStr[sizeof(gDebugText_Length)]; + u8 releaseStr[sizeof(gDebugText_Release)]; + u8 progressStr[sizeof(gDebugText_Progress)]; + u8 chorusStr[sizeof(gDebugText_Chorus)]; + u8 priorityStr[sizeof(gDebugText_Priority)]; + u8 playingStr[sizeof(gDebugText_Playing)]; + u8 reverseStr[sizeof(gDebugText_Reverse)]; + u8 stereoStr[sizeof(gDebugText_Stereo)]; + + memcpy(bbackStr, gDebugText_BBack, sizeof(gDebugText_BBack)); + memcpy(aplayStr, gDebugText_APlay, sizeof(gDebugText_APlay)); + memcpy(voiceStr, gDebugText_Voice, sizeof(gDebugText_Voice)); + memcpy(volumeStr, gDebugText_Volume, sizeof(gDebugText_Volume)); + memcpy(panpotStr, gDebugText_Panpot, sizeof(gDebugText_Panpot)); + memcpy(pitchStr, gDebugText_Pitch, sizeof(gDebugText_Pitch)); + memcpy(lengthStr, gDebugText_Length, sizeof(gDebugText_Length)); + memcpy(releaseStr, gDebugText_Release, sizeof(gDebugText_Release)); + memcpy(progressStr, gDebugText_Progress, sizeof(gDebugText_Progress)); + memcpy(chorusStr, gDebugText_Chorus, sizeof(gDebugText_Chorus)); + memcpy(priorityStr, gDebugText_Priority, sizeof(gDebugText_Priority)); + memcpy(playingStr, gDebugText_Playing, sizeof(gDebugText_Playing)); + memcpy(reverseStr, gDebugText_Reverse, sizeof(gDebugText_Reverse)); + memcpy(stereoStr, gDebugText_Stereo, sizeof(gDebugText_Stereo)); + + REG_DISPCNT = 0x3140; + MenuDrawTextWindow(0, 0, 0x1D, 0x13); + MenuPrint(bbackStr, 0x13, 0x4); + MenuPrint(aplayStr, 0x13, 0x2); + MenuPrint(voiceStr, 0x2, 0x1); + MenuPrint(volumeStr, 0x2, 0x3); + MenuPrint(panpotStr, 0x2, 0x5); + MenuPrint(pitchStr, 0x2, 0x7); + MenuPrint(lengthStr, 0x2, 0x9); + MenuPrint(releaseStr, 0x2, 0xB); + MenuPrint(progressStr, 0x2, 0xD); + MenuPrint(chorusStr, 0x2, 0xF); + MenuPrint(priorityStr, 0x2, 0x11); + MenuPrint(playingStr, 0x13, 0x10); + MenuPrint(reverseStr, 0x13, 0xE); + MenuPrint(stereoStr, 0x13, 0xC); + REG_WIN0H = WIN_RANGE(0, 240); + REG_WIN0V = WIN_RANGE(0, 160); + gUnknown_020387B3 = 0; + gUnknown_020387B1 = 0; + gUnknown_020387B2 = 0; + gUnknown_03005D30 = NULL; + gUnknown_020387D8 = 0; + gUnknown_020387D9 = 1; + gUnknown_020387B4[CRY_TEST_UNK0] = 0; + gUnknown_020387B4[CRY_TEST_VOLUME] = 0x78; + gUnknown_020387B4[CRY_TEST_PANPOT] = 0; + gUnknown_020387B4[CRY_TEST_PITCH] = 0x3C00; + gUnknown_020387B4[CRY_TEST_LENGTH] = 0xB4; + gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; + gUnknown_020387B4[CRY_TEST_RELEASE] = 0; + gUnknown_020387B4[CRY_TEST_CHORUS] = 0; + gUnknown_020387B4[CRY_TEST_PRIORITY] = 2; + sub_80BAD5C(); + sub_80BAE10(0, 0); + TASK.FUNC = sub_80BAA48; +} + +void sub_80BAA48(u8 taskId) // Task_ProcessDriverTestInput +{ + if(gMain.newKeys & B_BUTTON) + { + REG_DISPCNT = 0x7140; + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(1, 31); + MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); + TASK.FUNC = sub_80BA258; + return; + } + if(gMain.newAndRepeatedKeys & DPAD_UP) // _080BAAA8 + { + u8 backupVar = gUnknown_020387B3; + if(--gUnknown_020387B3 < 0) + gUnknown_020387B3 = 8; + + sub_80BAE10(backupVar, gUnknown_020387B3); + return; + } + if(gMain.newAndRepeatedKeys & DPAD_DOWN) // _080BAAD0 + { + u8 backupVar = gUnknown_020387B3; + if(++gUnknown_020387B3 > 8) + gUnknown_020387B3 = 0; + + sub_80BAE10(backupVar, gUnknown_020387B3); + return; + } + if(gMain.newKeys & START_BUTTON) // _080BAAF8 + { + gUnknown_020387D8 ^= 1; + sub_80BAD5C(); + return; + } + if(gMain.newKeys & SELECT_BUTTON) // _080BAB14 + { + gUnknown_020387D9 ^= 1; + sub_80BAD5C(); + SetPokemonCryStereo(gUnknown_020387D9); + return; + } + if(gMain.newAndRepeatedKeys & R_BUTTON) // _080BAB38 + { + sub_80BACDC(10); + sub_80BAD5C(); + return; + } + if(gMain.newAndRepeatedKeys & L_BUTTON) // _080BAB46 + { + sub_80BACDC(-10); + sub_80BAD5C(); + return; + } + if(gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BAB56 + { + sub_80BACDC(-1); + sub_80BAD5C(); + return; + } + if(gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BAB64 + { + sub_80BACDC(1); + sub_80BAD5C(); + return; + } + if(gMain.newKeys & A_BUTTON) // _080BAB78 + { + u8 divide, remaining; + + SetPokemonCryVolume(gUnknown_020387B4[CRY_TEST_VOLUME]); + SetPokemonCryPanpot(gUnknown_020387B4[CRY_TEST_PANPOT]); + SetPokemonCryPitch(gUnknown_020387B4[CRY_TEST_PITCH]); + SetPokemonCryLength(gUnknown_020387B4[CRY_TEST_LENGTH]); + SetPokemonCryProgress(gUnknown_020387B4[CRY_TEST_PROGRESS]); + SetPokemonCryRelease(gUnknown_020387B4[CRY_TEST_RELEASE]); + SetPokemonCryChorus(gUnknown_020387B4[CRY_TEST_CHORUS]); + SetPokemonCryPriority(gUnknown_020387B4[CRY_TEST_PRIORITY]); + + remaining = gUnknown_020387B4[CRY_TEST_UNK0] % 128; + divide = gUnknown_020387B4[CRY_TEST_UNK0] / 128; + + switch(divide) + { + case 0: + if(gUnknown_020387D8) + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84537C0[remaining]); + else + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452590[remaining]); + break; + case 1: + if(gUnknown_020387D8) + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453DC0[remaining]); + else + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452B90[remaining]); + break; + case 2: + if(gUnknown_020387D8) + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84543C0[remaining]); + else + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453190[remaining]); + break; + case 3: + if(gUnknown_020387D8) + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84549C0[remaining]); + else + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453790[remaining]); + break; + } + } + + // _080BACA2 + if(gUnknown_03005D30 != NULL) + { + gUnknown_020387B1 = IsPokemonCryPlaying(gUnknown_03005D30); + + if(gUnknown_020387B1 != gUnknown_020387B2) + sub_80BAD5C(); + + gUnknown_020387B2 = gUnknown_020387B1; + } +} + +void sub_80BACDC(s8 var) +{ + int minMaxArray[ARRAY_COUNT(gUnknown_083D039C)]; + + memcpy(minMaxArray, gUnknown_083D039C, sizeof(gUnknown_083D039C)); + gUnknown_020387B4[gUnknown_020387B3] += var; + + if(gUnknown_020387B4[gUnknown_020387B3] > minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MAX)]) + gUnknown_020387B4[gUnknown_020387B3] = minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MIN)]; + + if(gUnknown_020387B4[gUnknown_020387B3] < minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MIN)]) + gUnknown_020387B4[gUnknown_020387B3] = minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MAX)]; +} + +void sub_80BAD5C(void) +{ + sub_80BAE78(gUnknown_020387B4[CRY_TEST_UNK0] + 1, 0xB, 0x1, 0x5); + sub_80BAE78(gUnknown_020387B4[CRY_TEST_VOLUME], 0xB, 0x3, 0x5); + sub_80BAE78(gUnknown_020387B4[CRY_TEST_PANPOT], 0xB, 0x5, 0x5); + sub_80BAE78(gUnknown_020387B4[CRY_TEST_PITCH], 0xB, 0x7, 0x5); + sub_80BAE78(gUnknown_020387B4[CRY_TEST_LENGTH], 0xB, 0x9, 0x5); + sub_80BAE78(gUnknown_020387B4[CRY_TEST_RELEASE], 0xB, 0xB, 0x5); + sub_80BAE78(gUnknown_020387B4[CRY_TEST_PROGRESS], 0xB, 0xD, 0x5); + sub_80BAE78(gUnknown_020387B4[CRY_TEST_CHORUS], 0xB, 0xF, 0x5); + sub_80BAE78(gUnknown_020387B4[CRY_TEST_PRIORITY], 0xB, 0x11, 0x5); + sub_80BAE78(gUnknown_020387B1, 0x1B, 0x10, 0x1); + sub_80BAE78(gUnknown_020387D8, 0x1B, 0xE, 0x1); + sub_80BAE78(gUnknown_020387D9, 0x1B, 0xC, 0x1); +} + +void sub_80BAE10(u8 var1, u8 var2) +{ + u8 str1[sizeof(gUnknown_083D03DC)]; + u8 str2[sizeof(gUnknown_083D03DE)]; + + memcpy(str1, gUnknown_083D03DC, sizeof(gUnknown_083D03DC)); + memcpy(str2, gUnknown_083D03DE, sizeof(gUnknown_083D03DE)); + + MenuPrint(str2, gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 1)]); + MenuPrint(str1, gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 1)]); +} + +/*void sub_80BAE78(int var1, u16 var2, u16 var3, u8 var4) +{ + u32 powers[6]; + u8 str[8]; + u8 i; + u8 someVar, someVar2; + + memcpy(powers, gUnknown_083D03E0, sizeof(powers); + + for(i = 0; i < var4; i++) + str[i] = 0; + + str[var4 + 1] = CHAR_0; + someVar = 0; + + if(var1 < 0) // make absolute value? wtf + { + var1 = -var1; // just use abs? + someVar = 1; + } + + // _080BAED6 + someVar2 = 0; + if(var4 == 1) + someVar2 = 1; + + // _080BAEE2 + for(;;) + { + + } +}*/ + +// no. +__attribute__((naked)) +void sub_80BAE78(int var1, u16 var2, u16 var3, u8 var4) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x2C\n\ + mov r8, r0\n\ + lsls r1, 16\n\ + lsrs r6, r1, 16\n\ + lsls r2, 16\n\ + lsrs r2, 16\n\ + lsls r3, 24\n\ + lsrs r7, r3, 24\n\ + mov r1, sp\n\ + ldr r0, _080BAF80 @ =gUnknown_083D03E0\n\ + ldm r0!, {r3-r5}\n\ + stm r1!, {r3-r5}\n\ + ldm r0!, {r3-r5}\n\ + stm r1!, {r3-r5}\n\ + movs r5, 0\n\ + add r0, sp, 0x18\n\ + mov r9, r0\n\ + cmp r5, r7\n\ + bgt _080BAEC0\n\ + mov r4, r9\n\ + movs r3, 0\n\ +_080BAEAC:\n\ + lsls r0, r5, 24\n\ + asrs r0, 24\n\ + adds r1, r4, r0\n\ + strb r3, [r1]\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, r7\n\ + ble _080BAEAC\n\ +_080BAEC0:\n\ + adds r0, r7, 0x1\n\ + add r0, r9\n\ + movs r1, 0xFF\n\ + strb r1, [r0]\n\ + movs r1, 0\n\ + mov r3, r8\n\ + cmp r3, 0\n\ + bge _080BAED6\n\ + negs r3, r3\n\ + mov r8, r3\n\ + movs r1, 0x1\n\ +_080BAED6:\n\ + movs r4, 0\n\ + mov r10, r4\n\ + cmp r7, 0x1\n\ + bne _080BAEE2\n\ + movs r5, 0x1\n\ + mov r10, r5\n\ +_080BAEE2:\n\ + subs r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + lsls r0, r5, 24\n\ + lsls r6, 24\n\ + str r6, [sp, 0x24]\n\ + lsls r2, 24\n\ + str r2, [sp, 0x28]\n\ + cmp r0, 0\n\ + blt _080BAF62\n\ + str r1, [sp, 0x20]\n\ +_080BAEF8:\n\ + asrs r6, r0, 24\n\ + lsls r0, r6, 2\n\ + add r0, sp\n\ + ldr r1, [r0]\n\ + mov r0, r8\n\ + bl __divsi3\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r0, 0\n\ + bne _080BAF1A\n\ + mov r0, r10\n\ + cmp r0, 0\n\ + bne _080BAF1A\n\ + lsls r4, r5, 24\n\ + cmp r6, 0\n\ + bne _080BAF46\n\ +_080BAF1A:\n\ + lsls r4, r5, 24\n\ + ldr r3, [sp, 0x20]\n\ + cmp r3, 0\n\ + beq _080BAF34\n\ + mov r5, r10\n\ + cmp r5, 0\n\ + bne _080BAF34\n\ + asrs r0, r4, 24\n\ + subs r0, r7, r0\n\ + subs r0, 0x1\n\ + add r0, r9\n\ + movs r1, 0xAE\n\ + strb r1, [r0]\n\ +_080BAF34:\n\ + asrs r1, r4, 24\n\ + subs r1, r7, r1\n\ + add r1, r9\n\ + lsls r0, r2, 24\n\ + asrs r0, 24\n\ + subs r0, 0x5F\n\ + strb r0, [r1]\n\ + movs r0, 0x1\n\ + mov r10, r0\n\ +_080BAF46:\n\ + asrs r4, 24\n\ + lsls r0, r4, 2\n\ + add r0, sp\n\ + ldr r1, [r0]\n\ + mov r0, r8\n\ + bl __modsi3\n\ + mov r8, r0\n\ + subs r4, 0x1\n\ + lsls r4, 24\n\ + lsrs r5, r4, 24\n\ + lsls r0, r5, 24\n\ + cmp r0, 0\n\ + bge _080BAEF8\n\ +_080BAF62:\n\ + ldr r3, [sp, 0x24]\n\ + lsrs r1, r3, 24\n\ + ldr r4, [sp, 0x28]\n\ + lsrs r2, r4, 24\n\ + mov r0, r9\n\ + bl MenuPrint\n\ + add sp, 0x2C\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080BAF80: .4byte gUnknown_083D03E0\n\ + .syntax divided"); +} + +void sub_80BAF84(u8 taskId) +{ + u8 seStr[sizeof(gOtherText_SE)]; + u8 panStr[sizeof(gOtherText_Pan)]; + u8 playingStr[sizeof(gDebugText_Playing)]; + + memcpy(seStr, gOtherText_SE, sizeof(gOtherText_SE)); + memcpy(panStr, gOtherText_Pan, sizeof(gOtherText_Pan)); + memcpy(playingStr, gDebugText_Playing, sizeof(gDebugText_Playing)); + + REG_DISPCNT = 0x3140; + MenuDrawTextWindow(0, 0, 0x1D, 0x13); + MenuPrint(seStr, 3, 2); + MenuPrint(panStr, 3, 4); + MenuPrint(playingStr, 3, 8); + REG_WIN0H = WIN_RANGE(0, 240); + REG_WIN0V = WIN_RANGE(0, 160); + gUnknown_020387B4[CRY_TEST_UNK0] = 1; + gUnknown_020387B4[CRY_TEST_PANPOT] = 0; + gUnknown_020387B4[CRY_TEST_CHORUS] = 0; + gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; + gUnknown_020387B4[CRY_TEST_RELEASE] = 0; + sub_80BB1D4(); + TASK.FUNC = sub_80BB038; +} + +void sub_80BB038(u8 taskId) +{ + sub_80BB1D4(); + if(gUnknown_020387B4[CRY_TEST_PROGRESS]) + { + if(gUnknown_020387B4[CRY_TEST_RELEASE]) + { + gUnknown_020387B4[CRY_TEST_RELEASE]--; + } + else // _080BB05C + { + s8 panpot = gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]; + if(panpot != -128) + { + if(panpot == 0x7F) + { + gUnknown_020387B4[CRY_TEST_CHORUS] += 2; + if(gUnknown_020387B4[CRY_TEST_CHORUS] < 0x3F) + SE12PanpotControl(gUnknown_020387B4[CRY_TEST_CHORUS]); + } + } + else // _080BB08C + { + gUnknown_020387B4[CRY_TEST_CHORUS] -= 2; + if(gUnknown_020387B4[CRY_TEST_CHORUS] > -0x40) + SE12PanpotControl(gUnknown_020387B4[CRY_TEST_CHORUS]); + } + } + } + // _080BB0A2 + if(gMain.newKeys & B_BUTTON) + { + REG_DISPCNT = 0x7140; + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(1, 31); + MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); + TASK.FUNC = sub_80BA258; + return; + } + if(gMain.newKeys & A_BUTTON) // _080BB104 + { + s8 panpot = gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]; + if(panpot != -128) + { + if(panpot == 0x7F) + { + PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], -0x40); + gUnknown_020387B4[CRY_TEST_CHORUS] = -0x40; + gUnknown_020387B4[CRY_TEST_PROGRESS] = 1; + gUnknown_020387B4[CRY_TEST_RELEASE] = 0x1E; + return; + } + } + else // _080BB140 + { + PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], 0x3F); + gUnknown_020387B4[CRY_TEST_CHORUS] = 0x3F; + gUnknown_020387B4[CRY_TEST_PROGRESS] = 1; + gUnknown_020387B4[CRY_TEST_RELEASE] = 0x1E; + return; + } + // _080BB154 + PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], panpot); + gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; + return; + } + if(gMain.newKeys & L_BUTTON) // _080BB15E + { + gUnknown_020387B4[CRY_TEST_PANPOT]++; + if(gUnknown_020387B4[CRY_TEST_PANPOT] > 4) + gUnknown_020387B4[CRY_TEST_PANPOT] = 0; + } + if(gMain.newKeys & R_BUTTON) // _080BB176 + { + gUnknown_020387B4[CRY_TEST_PANPOT]--; + if(gUnknown_020387B4[CRY_TEST_PANPOT] < 0) + gUnknown_020387B4[CRY_TEST_PANPOT] = 4; + } + if(gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BB192 + { + gUnknown_020387B4[CRY_TEST_UNK0]++; + if(gUnknown_020387B4[CRY_TEST_UNK0] > 0xF7) + gUnknown_020387B4[CRY_TEST_UNK0] = 0; + } + else if(gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BB1B0 + { + gUnknown_020387B4[CRY_TEST_UNK0]--; + if(gUnknown_020387B4[CRY_TEST_UNK0] < 0) + gUnknown_020387B4[CRY_TEST_UNK0] = 0xF7; + } +} + +void sub_80BB1D4(void) +{ + u8 lrStr[sizeof(gOtherText_LR)]; + u8 rlStr[sizeof(gOtherText_RL)]; + + memcpy(lrStr, gOtherText_LR, sizeof(lrStr)); + memcpy(rlStr, gOtherText_RL, sizeof(rlStr)); + + sub_80BAE78(gUnknown_020387B4[CRY_TEST_UNK0], 7, 2, 3); + + switch(gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]) + { + case 0x7F: + MenuPrint(lrStr, 7, 4); + break; + case -0x80: + MenuPrint(rlStr, 7, 4); + break; + default: + sub_80BAE78(gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]], 7, 4, 3); + break; + } + sub_80BAE78(IsSEPlaying(), 12, 8, 1); +} + +void sub_80BB25C(u8 taskId) +{ + struct CryRelatedStruct cryStruct, cryStruct2; + u8 zero; + + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + gUnknown_03005D34 = 1; + ResetSpriteData(); + FreeAllSpritePalettes(); + + cryStruct.unk0 = 0x2000; + cryStruct.unk2 = 29; + cryStruct.paletteNo = 12; + cryStruct.yPos = 30; + cryStruct.xPos = 4; + + zero = 0; // wtf? + gUnknown_03005E98 = 0; + + while(sub_8119E3C(&cryStruct, 3) == FALSE); + + cryStruct2.unk0 = 0; + cryStruct2.unk2 = 15; + cryStruct2.paletteNo = 13; + cryStruct2.xPos = 12; + cryStruct2.yPos = 12; + + zero = 0; // wtf? + gUnknown_03005E98 = 0; + + while(ShowPokedexCryScreen(&cryStruct2, 2) == FALSE); + + MenuDrawTextWindow(0, 16, 5, 19); + sub_80BB494(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG2CNT = 0xF01; + REG_BG3CNT = 0x1D03; + REG_DISPCNT = 0x1d40; + m4aMPlayFadeOutTemporarily(&gMPlay_BGM, 2); + TASK.FUNC = sub_80BB3B4; +} + +void sub_80BB3B4(u8 taskId) +{ + sub_8119F88(3); + + if(gMain.newKeys & A_BUTTON) + { + sub_811A050(gUnknown_03005D34); + } + if(gMain.newKeys & R_BUTTON) + { + StopCryAndClearCrySongs(); + } + if(gMain.newAndRepeatedKeys & DPAD_UP) + { + if(--gUnknown_03005D34 == 0) + gUnknown_03005D34 = 384; // total species + sub_80BB494(); + } + if(gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if(++gUnknown_03005D34 > 384) + gUnknown_03005D34 = 1; + sub_80BB494(); + } + if(gMain.newKeys & B_BUTTON) + { + REG_DISPCNT = 0x7140; + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(1, 31); + MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); + TASK.FUNC = sub_80BA258; + DestroyCryMeterNeedleSprite(); + } +} + +void sub_80BB494(void) +{ + sub_80BAE78(gUnknown_03005D34, 1, 17, 3); +} diff --git a/src/engine/sprite.c b/src/engine/sprite.c new file mode 100644 index 000000000..fb8c2b648 --- /dev/null +++ b/src/engine/sprite.c @@ -0,0 +1,1802 @@ +#include "global.h" +#include "sprite.h" +#include "main.h" +#include "menu_cursor.h" +#include "palette.h" + +#define MAX_SPRITE_COPY_REQUESTS 64 + +#define OAM_MATRIX_COUNT 32 + +#define SET_SPRITE_TILE_RANGE(index, start, count) \ +{ \ + sSpriteTileRanges[index * 2] = start; \ + (sSpriteTileRanges + 1)[index * 2] = count; \ +} + +#define ALLOC_SPRITE_TILE(n) \ +{ \ + gSpriteTileAllocBitmap[(n) / 8] |= (1 << ((n) % 8)); \ +} + +#define FREE_SPRITE_TILE(n) \ +{ \ + gSpriteTileAllocBitmap[(n) / 8] &= ~(1 << ((n) % 8)); \ +} + +#define SPRITE_TILE_IS_ALLOCATED(n) ((gSpriteTileAllocBitmap[(n) / 8] >> ((n) % 8)) & 1) + +struct OamMatrix +{ + s16 a; + s16 b; + s16 c; + s16 d; +}; + +struct SpriteCopyRequest +{ + const u8 *src; + u8 *dest; + u16 size; +}; + +struct OamDimensions +{ + s8 width; + s8 height; +}; + +static void UpdateOamCoords(void); +static void BuildSpritePriorities(void); +static void SortSprites(void); +static void CopyMatricesToOamBuffer(void); +static void AddSpritesToOamBuffer(void); +static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority); +static void ClearSpriteCopyRequests(void); +static void ResetOamMatrices(void); +static void ResetSprite(struct Sprite *sprite); +static s16 AllocSpriteTiles(u16 tileCount); +static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images); +static void ResetAllSprites(void); +static void BeginAnim(struct Sprite *sprite); +static void ContinueAnim(struct Sprite *sprite); +static void AnimCmd_frame(struct Sprite *sprite); +static void AnimCmd_end(struct Sprite *sprite); +static void AnimCmd_jump(struct Sprite *sprite); +static void AnimCmd_loop(struct Sprite *sprite); +static void BeginAnimLoop(struct Sprite *sprite); +static void ContinueAnimLoop(struct Sprite *sprite); +static void JumpToTopOfAnimLoop(struct Sprite *sprite); +static void BeginAffineAnim(struct Sprite *sprite); +static void ContinueAffineAnim(struct Sprite *sprite); +static void AffineAnimDelay(u8 matrixNum, struct Sprite *sprite); +static void AffineAnimCmd_loop(u8 matrixNum, struct Sprite *sprite); +static void BeginAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); +static void ContinueAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); +static void JumpToTopOfAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); +static void AffineAnimCmd_jump(u8 matrixNum, struct Sprite *sprite); +static void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite); +static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite); +static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix); +static u8 GetSpriteMatrixNum(struct Sprite *sprite); +static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip); +static void AffineAnimStateRestartAnim(u8 matrixNum); +static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum); +static void AffineAnimStateReset(u8 matrixNum); +static void ApplyAffineAnimFrameAbsolute(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); +static void DecrementAnimDelayCounter(struct Sprite *sprite); +static bool8 DecrementAffineAnimDelayCounter(struct Sprite *sprite, u8 matrixNum); +static void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); +static s16 ConvertScaleParam(s16 scale); +static void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd); +static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); +static void ResetAffineAnimData(void); +static u8 IndexOfSpriteTileTag(u16 tag); +static void AllocSpriteTileRange(u16 tag, u16 start, u16 count); +static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset); + +typedef void (*AnimFunc)(struct Sprite *); +typedef void (*AnimCmdFunc)(struct Sprite *); +typedef void (*AffineAnimCmdFunc)(u8 matrixNum, struct Sprite *); + +#define DUMMY_OAM_DATA \ +{ \ + 160, /* Y (off-screen) */ \ + 0, \ + 0, \ + 0, \ + 0, \ + 0, \ + 304, /* X */ \ + 0, \ + 0, \ + 0, \ + 3, /* lowest priority */ \ + 0, \ + 0 \ +} + +#define ANIM_END 0xFFFF +#define AFFINE_ANIM_END 0x7FFF + +// forward declarations +const union AnimCmd * const gDummySpriteAnimTable[]; +const union AffineAnimCmd * const gDummySpriteAffineAnimTable[]; +const struct SpriteTemplate gDummySpriteTemplate; + +// Unreferenced error message. +// It means "The DMA transfer request table has exceeded its limit." +static const u8 sDmaOverErrorMsg[] = + _( + "DMA OVER\n" + "DMAてんそう\n" + "リクエストテーブルが\n" + "オーバーしました" + ); + +// Unreferenced data. +static const u8 sUnknownData[24] = +{ + 0x01, 0x04, 0x10, 0x40, + 0x02, 0x04, 0x08, 0x20, + 0x02, 0x04, 0x08, 0x20, + 0x01, 0x04, 0x10, 0x40, + 0x02, 0x04, 0x08, 0x20, + 0x02, 0x04, 0x08, 0x20, +}; + +static const u8 sCenterToCornerVecTable[3][4][2] = +{ + { // square + { -4, -4 }, + { -8, -8 }, + { -16, -16 }, + { -32, -32 }, + }, + { // horizontal rectangle + { -8, -4 }, + { -16, -4 }, + { -16, -8 }, + { -32, -16 }, + }, + { // vertical rectangle + { -4, -8 }, + { -4, -16 }, + { -8, -16 }, + { -16, -32 }, + }, +}; + +static const struct Sprite sDummySprite = +{ + .oam = DUMMY_OAM_DATA, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .template = &gDummySpriteTemplate, + .subspriteTables = NULL, + .callback = SpriteCallbackDummy, + .pos1 = { 304, 160 }, + .pos2 = { 0, 0 }, + .centerToCornerVecX = 0, + .centerToCornerVecY = 0, + .animNum = 0, + .animCmdIndex = 0, + .animDelayCounter = 0, + .animPaused = 0, + .affineAnimPaused = 0, + .animLoopCounter = 0, + .data0 = 0, + .data1 = 0, + .data2 = 0, + .data3 = 0, + .data4 = 0, + .data5 = 0, + .data6 = 0, + .data7 = 0, + .inUse = 0, + .coordOffsetEnabled = 0, + .invisible = 0, + .flags_3 = 0, + .flags_4 = 0, + .flags_5 = 0, + .flags_6 = 0, + .flags_7 = 0, + .hFlip = 0, + .vFlip = 0, + .animBeginning = 0, + .affineAnimBeginning = 0, + .animEnded = 0, + .affineAnimEnded = 0, + .usingSheet = 0, + .flags_f = 0, + .sheetTileStart = 0, + .subspriteTableNum = 0, + .subspriteMode = 0, + .subpriority = 0xFF +}; + +const struct OamData gDummyOamData = DUMMY_OAM_DATA; + +static const union AnimCmd sDummyAnim = { ANIM_END }; + +const union AnimCmd * const gDummySpriteAnimTable[] = { &sDummyAnim }; + +static const union AffineAnimCmd sDummyAffineAnim = { AFFINE_ANIM_END }; + +const union AffineAnimCmd * const gDummySpriteAffineAnimTable[] = { &sDummyAffineAnim }; + +const struct SpriteTemplate gDummySpriteTemplate = +{ + .tileTag = 0, + .paletteTag = 0xFFFF, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +// TODO: Find out what these are used for. +static const u16 sOamBitmasks[9] = +{ + 0xFF00, 0x00FF, 0x001F, + 0xFE00, 0x01FF, 0x03E0, + 0xFC00, 0x03FF, 0xFC00, +}; + +static const AnimFunc sAnimFuncs[] = +{ + ContinueAnim, + BeginAnim, +}; + +static const AnimFunc sAffineAnimFuncs[] = +{ + ContinueAffineAnim, + BeginAffineAnim, +}; + +static const AnimCmdFunc sAnimCmdFuncs[] = +{ + AnimCmd_loop, + AnimCmd_jump, + AnimCmd_end, + AnimCmd_frame, +}; + +static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] = +{ + AffineAnimCmd_loop, + AffineAnimCmd_jump, + AffineAnimCmd_end, + AffineAnimCmd_frame, +}; + +static const struct OamDimensions sOamDimensions[3][4] = +{ + { // square + { 8, 8 }, + { 16, 16 }, + { 32, 32 }, + { 64, 64 }, + }, + { // horizontal rectangle + { 16, 8 }, + { 32, 8 }, + { 32, 16 }, + { 64, 32 }, + }, + { // vertical rectangle + { 8, 16 }, + { 8, 32 }, + { 16, 32 }, + { 32, 64 }, + }, +}; + +static u16 sSpriteTileRangeTags[MAX_SPRITES]; +static u16 sSpriteTileRanges[MAX_SPRITES * 2]; +static struct AffineAnimState sAffineAnimStates[OAM_MATRIX_COUNT]; +static u16 sSpritePaletteTags[16]; + +u8 gSpriteOrder[MAX_SPRITES]; +bool8 gShouldProcessSpriteCopyRequests; +u8 gSpriteCopyRequestCount; +struct SpriteCopyRequest gSpriteCopyRequests[MAX_SPRITE_COPY_REQUESTS]; +u8 gOamLimit; +u16 gReservedSpriteTileCount; +u8 gSpriteTileAllocBitmap[128]; +s16 gSpriteCoordOffsetX; +s16 gSpriteCoordOffsetY; +u32 gOamMatrixAllocBitmap; +struct OamMatrix gOamMatrices[OAM_MATRIX_COUNT]; +u8 gReservedSpritePaletteCount; + +EWRAM_DATA struct Sprite gSprites[MAX_SPRITES + 1] = {0}; +EWRAM_DATA u16 gSpritePriorities[MAX_SPRITES] = {0}; +EWRAM_DATA u8 gAffineAnimsDisabled = {0}; + +void ResetSpriteData(void) +{ + ResetOamRange(0, 128); + ResetAllSprites(); + ClearSpriteCopyRequests(); + ResetAffineAnimData(); + FreeSpriteTileRanges(); + gOamLimit = 64; + gReservedSpriteTileCount = 0; + AllocSpriteTiles(0); + gSpriteCoordOffsetX = 0; + gSpriteCoordOffsetY = 0; +} + +void AnimateSprites(void) +{ + u8 i; + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + + if (sprite->inUse) + { + sprite->callback(sprite); + + if (sprite->inUse) + AnimateSprite(sprite); + } + } +} + +void BuildOamBuffer(void) +{ + u8 temp; + UpdateOamCoords(); + BuildSpritePriorities(); + SortSprites(); + temp = gMain.oamLoadDisabled; + gMain.oamLoadDisabled = TRUE; + AddSpritesToOamBuffer(); + CopyMatricesToOamBuffer(); + gMain.oamLoadDisabled = temp; + gShouldProcessSpriteCopyRequests = TRUE; +} + +static void UpdateOamCoords(void) +{ + u8 i; + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + if (sprite->inUse && !sprite->invisible) + { + if (sprite->coordOffsetEnabled) + { + sprite->oam.x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + sprite->oam.y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } + else + { + sprite->oam.x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + sprite->oam.y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + } + } + } +} + +static void BuildSpritePriorities(void) +{ + u16 i; + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + u16 priority = sprite->subpriority | (sprite->oam.priority << 8); + gSpritePriorities[i] = priority; + } +} + +static void SortSprites(void) +{ + u8 i; + for (i = 1; i < MAX_SPRITES; i++) + { + u8 j = i; + struct Sprite *sprite1 = &gSprites[gSpriteOrder[i - 1]]; + struct Sprite *sprite2 = &gSprites[gSpriteOrder[i]]; + u16 sprite1Priority = gSpritePriorities[gSpriteOrder[i - 1]]; + u16 sprite2Priority = gSpritePriorities[gSpriteOrder[i]]; + s16 sprite1Y = sprite1->oam.y; + s16 sprite2Y = sprite2->oam.y; + + if (sprite1Y >= DISPLAY_HEIGHT) + sprite1Y = sprite1Y - 256; + + if (sprite2Y >= DISPLAY_HEIGHT) + sprite2Y = sprite2Y - 256; + + if (sprite1->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite1->oam.size == 3) + { + u32 shape = sprite1->oam.shape; + if (shape == ST_OAM_SQUARE || shape == 2) + { + if (sprite1Y > 128) + sprite1Y = sprite1Y - 256; + } + } + + if (sprite2->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite2->oam.size == 3) + { + u32 shape = sprite2->oam.shape; + if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) + { + if (sprite2Y > 128) + sprite2Y = sprite2Y - 256; + } + } + + while (j > 0 + && ((sprite1Priority > sprite2Priority) + || (sprite1Priority == sprite2Priority && sprite1Y < sprite2Y))) + { + u8 temp = gSpriteOrder[j]; + gSpriteOrder[j] = gSpriteOrder[j - 1]; + gSpriteOrder[j - 1] = temp; + + // UB: If j equals 1, then j-- makes j equal 0. + // Then, gSpriteOrder[-1] gets accessed below. + // Although this doesn't result in a bug in the ROM, + // the behavior is undefined. + j--; + + sprite1 = &gSprites[gSpriteOrder[j - 1]]; + sprite2 = &gSprites[gSpriteOrder[j]]; + sprite1Priority = gSpritePriorities[gSpriteOrder[j - 1]]; + sprite2Priority = gSpritePriorities[gSpriteOrder[j]]; + sprite1Y = sprite1->oam.y; + sprite2Y = sprite2->oam.y; + + if (sprite1Y >= DISPLAY_HEIGHT) + sprite1Y = sprite1Y - 256; + + if (sprite2Y >= DISPLAY_HEIGHT) + sprite2Y = sprite2Y - 256; + + if (sprite1->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite1->oam.size == 3) + { + u32 shape = sprite1->oam.shape; + if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) + { + if (sprite1Y > 128) + sprite1Y = sprite1Y - 256; + } + } + + if (sprite2->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite2->oam.size == 3) + { + u32 shape = sprite2->oam.shape; + if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) + { + if (sprite2Y > 128) + sprite2Y = sprite2Y - 256; + } + } + } + } +} + +static void CopyMatricesToOamBuffer(void) +{ + u8 i; + for (i = 0; i < OAM_MATRIX_COUNT; i++) + { + u32 base = 4 * i; + gMain.oamBuffer[base + 0].affineParam = gOamMatrices[i].a; + gMain.oamBuffer[base + 1].affineParam = gOamMatrices[i].b; + gMain.oamBuffer[base + 2].affineParam = gOamMatrices[i].c; + gMain.oamBuffer[base + 3].affineParam = gOamMatrices[i].d; + } +} + +static void AddSpritesToOamBuffer(void) +{ + u8 i = 0; + u8 oamIndex = 0; + + while (i < MAX_SPRITES) + { + struct Sprite *sprite = &gSprites[gSpriteOrder[i]]; + if (sprite->inUse && !sprite->invisible && AddSpriteToOamBuffer(sprite, &oamIndex)) + break; + i++; + } + + gMain.objCount = oamIndex; + + while (oamIndex < gOamLimit) + { + gMain.oamBuffer[oamIndex] = gDummyOamData; + oamIndex++; + } +} + +u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + if (!gSprites[i].inUse) + return CreateSpriteAt(i, template, x, y, subpriority); + + return MAX_SPRITES; +} + +u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) +{ + s16 i; + + for (i = MAX_SPRITES - 1; i > -1; i--) + if (!gSprites[i].inUse) + return CreateSpriteAt(i, template, x, y, subpriority); + + return MAX_SPRITES; +} + +u8 CreateInvisibleSprite(void (*callback)(struct Sprite *)) +{ + u8 index = CreateSprite(&gDummySpriteTemplate, 0, 0, 31); + + if (index == MAX_SPRITES) + { + return MAX_SPRITES; + } + else + { + gSprites[index].invisible = TRUE; + gSprites[index].callback = callback; + return index; + } +} + +static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) +{ + struct Sprite *sprite = &gSprites[index]; + + ResetSprite(sprite); + + sprite->inUse = TRUE; + sprite->animBeginning = TRUE; + sprite->affineAnimBeginning = TRUE; + sprite->usingSheet = TRUE; + + sprite->subpriority = subpriority; + sprite->oam = *template->oam; + sprite->anims = template->anims; + sprite->affineAnims = template->affineAnims; + sprite->template = template; + sprite->callback = template->callback; + sprite->pos1.x = x; + sprite->pos1.y = y; + + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); + + if (template->tileTag == 0xFFFF) + { + s16 tileNum; + sprite->images = template->images; + tileNum = AllocSpriteTiles((u8)(sprite->images->size / TILE_SIZE_4BPP)); + if (tileNum == -1) + { + ResetSprite(sprite); + return MAX_SPRITES; + } + sprite->oam.tileNum = tileNum; + sprite->usingSheet = FALSE; + sprite->sheetTileStart = 0; + } + else + { + sprite->sheetTileStart = GetSpriteTileStartByTag(template->tileTag); + SetSpriteSheetFrameTileNum(sprite); + } + + if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) + InitSpriteAffineAnim(sprite); + + if (template->paletteTag != 0xFFFF) + sprite->oam.paletteNum = IndexOfSpritePaletteTag(template->paletteTag); + + return index; +} + +u8 CreateSpriteAndAnimate(struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + + if (!gSprites[i].inUse) + { + u8 index = CreateSpriteAt(i, template, x, y, subpriority); + + if (index == MAX_SPRITES) + return MAX_SPRITES; + + gSprites[i].callback(sprite); + + if (gSprites[i].inUse) + AnimateSprite(sprite); + + return index; + } + } + + return MAX_SPRITES; +} + +void DestroySprite(struct Sprite *sprite) +{ + if (sprite->inUse) + { + if (!sprite->usingSheet) + { + u16 i; + u16 tileEnd = (sprite->images->size / TILE_SIZE_4BPP) + sprite->oam.tileNum; + for (i = sprite->oam.tileNum; i < tileEnd; i++) + FREE_SPRITE_TILE(i); + } + ResetSprite(sprite); + } +} + +void ResetOamRange(u8 a, u8 b) +{ + u8 i; + + for (i = a; i < b; i++) + { + struct OamData *oamBuffer = gMain.oamBuffer; + oamBuffer[i] = *(struct OamData *)&gDummyOamData; + } +} + +void LoadOam(void) +{ + if (!gMain.oamLoadDisabled) + CpuCopy32(gMain.oamBuffer, (void *)OAM, sizeof(gMain.oamBuffer)); +} + +static void ClearSpriteCopyRequests(void) +{ + u8 i; + + gShouldProcessSpriteCopyRequests = FALSE; + gSpriteCopyRequestCount = 0; + + for (i = 0; i < MAX_SPRITE_COPY_REQUESTS; i++) + { + gSpriteCopyRequests[i].src = 0; + gSpriteCopyRequests[i].dest = 0; + gSpriteCopyRequests[i].size = 0; + } +} + +static void ResetOamMatrices(void) +{ + u8 i; + for (i = 0; i < OAM_MATRIX_COUNT; i++) + { + // set to identity matrix + gOamMatrices[i].a = 0x0100; + gOamMatrices[i].b = 0x0000; + gOamMatrices[i].c = 0x0000; + gOamMatrices[i].d = 0x0100; + } +} + +void SetOamMatrix(u8 matrixNum, u16 a, u16 b, u16 c, u16 d) +{ + gOamMatrices[matrixNum].a = a; + gOamMatrices[matrixNum].b = b; + gOamMatrices[matrixNum].c = c; + gOamMatrices[matrixNum].d = d; +} + +static void ResetSprite(struct Sprite *sprite) +{ + *sprite = sDummySprite; +} + +void CalcCenterToCornerVec(struct Sprite *sprite, u8 shape, u8 size, u8 affineMode) +{ + u8 x = sCenterToCornerVecTable[shape][size][0]; + u8 y = sCenterToCornerVecTable[shape][size][1]; + + if (affineMode & ST_OAM_AFFINE_DOUBLE_MASK) + { + x *= 2; + y *= 2; + } + + sprite->centerToCornerVecX = x; + sprite->centerToCornerVecY = y; +} + +static s16 AllocSpriteTiles(u16 tileCount) +{ + u16 i; + s16 start; + u16 numTilesFound; + + if (tileCount == 0) + { + // Free all unreserved tiles if the tile count is 0. + for (i = gReservedSpriteTileCount; i < TOTAL_OBJ_TILE_COUNT; i++) + FREE_SPRITE_TILE(i); + + return 0; + } + + i = gReservedSpriteTileCount; + + for (;;) + { + while (SPRITE_TILE_IS_ALLOCATED(i)) + { + i++; + + if (i == TOTAL_OBJ_TILE_COUNT) + return -1; + } + + start = i; + numTilesFound = 1; + + while (numTilesFound != tileCount) + { + i++; + + if (i == TOTAL_OBJ_TILE_COUNT) + return -1; + + if (!SPRITE_TILE_IS_ALLOCATED(i)) + numTilesFound++; + else + break; + } + + if (numTilesFound == tileCount) + break; + } + + for (i = start; i < tileCount + start; i++) + ALLOC_SPRITE_TILE(i); + + return start; +} + +u8 SpriteTileAllocBitmapOp(u16 bit, u8 op) +{ + u8 index = bit / 8; + u8 shift = bit % 8; + u8 val = bit % 8; + u8 retVal = 0; + + if (op == 0) + { + val = ~(1 << val); + gSpriteTileAllocBitmap[index] &= val; + } + else if (op == 1) + { + val = (1 << val); + gSpriteTileAllocBitmap[index] |= val; + } + else + { + retVal = 1 << shift; + retVal &= gSpriteTileAllocBitmap[index]; + } + + return retVal; +} + +void SpriteCallbackDummy(struct Sprite *sprite) +{ +} + +void ProcessSpriteCopyRequests(void) +{ + if (gShouldProcessSpriteCopyRequests) + { + u8 i = 0; + + while (gSpriteCopyRequestCount > 0) + { + CpuCopy16(gSpriteCopyRequests[i].src, gSpriteCopyRequests[i].dest, gSpriteCopyRequests[i].size); + gSpriteCopyRequestCount--; + i++; + } + + gShouldProcessSpriteCopyRequests = FALSE; + } +} + +static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images) +{ + if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) + { + gSpriteCopyRequests[gSpriteCopyRequestCount].src = images[index].data; + gSpriteCopyRequests[gSpriteCopyRequestCount].dest = (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileNum; + gSpriteCopyRequests[gSpriteCopyRequestCount].size = images[index].size; + gSpriteCopyRequestCount++; + } +} + +void RequestSpriteCopy(const u8 *src, u8 *dest, u16 size) +{ + if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) + { + gSpriteCopyRequests[gSpriteCopyRequestCount].src = src; + gSpriteCopyRequests[gSpriteCopyRequestCount].dest = dest; + gSpriteCopyRequests[gSpriteCopyRequestCount].size = size; + gSpriteCopyRequestCount++; + } +} + +void CopyFromSprites(u8 *dest) +{ + u32 i; + u8 *src = (u8 *)gSprites; + for (i = 0; i < sizeof(struct Sprite) * MAX_SPRITES; i++) + { + *dest = *src; + dest++; + src++; + } +} + +void CopyToSprites(u8 *src) +{ + u32 i; + u8 *dest = (u8 *)gSprites; + for (i = 0; i < sizeof(struct Sprite) * MAX_SPRITES; i++) + { + *dest = *src; + src++; + dest++; + } +} + +static void ResetAllSprites(void) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + { + ResetSprite(&gSprites[i]); + gSpriteOrder[i] = i; + } + + ResetSprite(&gSprites[i]); + sub_814A590(); +} + +void FreeSpriteTiles(struct Sprite *sprite) +{ + if (sprite->template->tileTag != 0xFFFF) + FreeSpriteTilesByTag(sprite->template->tileTag); +} + +void FreeSpritePalette(struct Sprite *sprite) +{ + FreeSpritePaletteByTag(sprite->template->paletteTag); +} + +void FreeSpriteOamMatrix(struct Sprite *sprite) +{ + if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) + { + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = ST_OAM_AFFINE_OFF; + } +} + +void DestroySpriteAndFreeResources(struct Sprite *sprite) +{ + FreeSpriteTiles(sprite); + FreeSpritePalette(sprite); + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); +} + +void sub_800142C(u32 a1, u32 a2, u16 *a3, u16 a4, u32 a5) +{ + u16 *d = a3; + struct OamData *oam = &gMain.oamBuffer[gMain.objCount]; + while (!(gMain.objCount & 0x80) && (s16)(d[0] + 1) != 0) + { + u16 *x = (u16 *)oam; + x[0] = (d[0] & sOamBitmasks[0]) | ((d[0] + a2) & sOamBitmasks[1]) | ((a4 & sOamBitmasks[2]) << 8); + x[1] = (d[1] & sOamBitmasks[3]) | ((d[1] + a1) & sOamBitmasks[4]) | ((a4 & sOamBitmasks[5]) << 4); + x[2] = (d[2] & sOamBitmasks[6]) | ((d[2] + a5) & sOamBitmasks[7]) | (a4 & sOamBitmasks[8]); + oam++; + gMain.objCount++; + d += 3; + } +} + +void AnimateSprite(struct Sprite *sprite) +{ + sAnimFuncs[sprite->animBeginning](sprite); + + if (!gAffineAnimsDisabled) + sAffineAnimFuncs[sprite->affineAnimBeginning](sprite); +} + +static void BeginAnim(struct Sprite *sprite) +{ + s16 imageValue; + u8 duration; + u8 hFlip; + u8 vFlip; + + sprite->animCmdIndex = 0; + sprite->animEnded = FALSE; + sprite->animLoopCounter = 0; + imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; + + if (imageValue != -1) + { + sprite->animBeginning = FALSE; + duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; + hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; + vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; + + if (duration) + duration--; + + sprite->animDelayCounter = duration; + + if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) + SetSpriteOamFlipBits(sprite, hFlip, vFlip); + + if (sprite->usingSheet) + sprite->oam.tileNum = sprite->sheetTileStart + imageValue; + else + RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); + } +} + +static void ContinueAnim(struct Sprite *sprite) +{ + if (sprite->animDelayCounter) + { + u8 hFlip; + u8 vFlip; + DecrementAnimDelayCounter(sprite); + hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; + vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; + if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) + SetSpriteOamFlipBits(sprite, hFlip, vFlip); + } + else if (!sprite->animPaused) + { + s16 type; + s16 funcIndex; + sprite->animCmdIndex++; + type = sprite->anims[sprite->animNum][sprite->animCmdIndex].type; + funcIndex = 3; + if (type < 0) + funcIndex = type + 3; + sAnimCmdFuncs[funcIndex](sprite); + } +} + +static void AnimCmd_frame(struct Sprite *sprite) +{ + s16 imageValue; + u8 duration; + u8 hFlip; + u8 vFlip; + + imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; + duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; + hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; + vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; + + if (duration) + duration--; + + sprite->animDelayCounter = duration; + + if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) + SetSpriteOamFlipBits(sprite, hFlip, vFlip); + + if (sprite->usingSheet) + sprite->oam.tileNum = sprite->sheetTileStart + imageValue; + else + RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); +} + +static void AnimCmd_end(struct Sprite *sprite) +{ + sprite->animCmdIndex--; + sprite->animEnded = TRUE; +} + +static void AnimCmd_jump(struct Sprite *sprite) +{ + s16 imageValue; + u8 duration; + u8 hFlip; + u8 vFlip; + + sprite->animCmdIndex = sprite->anims[sprite->animNum][sprite->animCmdIndex].jump.target; + + imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; + duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; + hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; + vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; + + if (duration) + duration--; + + sprite->animDelayCounter = duration; + + if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) + SetSpriteOamFlipBits(sprite, hFlip, vFlip); + + if (sprite->usingSheet) + sprite->oam.tileNum = sprite->sheetTileStart + imageValue; + else + RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); +} + +static void AnimCmd_loop(struct Sprite *sprite) +{ + if (sprite->animLoopCounter) + ContinueAnimLoop(sprite); + else + BeginAnimLoop(sprite); +} + +static void BeginAnimLoop(struct Sprite *sprite) +{ + sprite->animLoopCounter = sprite->anims[sprite->animNum][sprite->animCmdIndex].loop.count; + JumpToTopOfAnimLoop(sprite); + ContinueAnim(sprite); +} + +static void ContinueAnimLoop(struct Sprite *sprite) +{ + sprite->animLoopCounter--; + JumpToTopOfAnimLoop(sprite); + ContinueAnim(sprite); +} + +static void JumpToTopOfAnimLoop(struct Sprite *sprite) +{ + if (sprite->animLoopCounter) + { + sprite->animCmdIndex--; + + while (sprite->anims[sprite->animNum][sprite->animCmdIndex - 1].type != -3) + { + if (sprite->animCmdIndex == 0) + break; + sprite->animCmdIndex--; + } + + sprite->animCmdIndex--; + } +} + +static void BeginAffineAnim(struct Sprite *sprite) +{ + if ((sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) && sprite->affineAnims[0][0].type != 32767) + { + struct AffineAnimFrameCmd frameCmd; + u8 matrixNum = GetSpriteMatrixNum(sprite); + AffineAnimStateRestartAnim(matrixNum); + GetAffineAnimFrame(matrixNum, sprite, &frameCmd); + sprite->affineAnimBeginning = FALSE; + sprite->affineAnimEnded = FALSE; + ApplyAffineAnimFrame(matrixNum, &frameCmd); + sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; + } +} + +static void ContinueAffineAnim(struct Sprite *sprite) +{ + if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) + { + u8 matrixNum = GetSpriteMatrixNum(sprite); + + if (sAffineAnimStates[matrixNum].delayCounter) + { + AffineAnimDelay(matrixNum, sprite); + } + else if (!sprite->affineAnimPaused) + { + s16 type; + s16 funcIndex; + sAffineAnimStates[matrixNum].animCmdIndex++; + type = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].type; + funcIndex = 3; + if (type >= 32765) + funcIndex = type - 32765; + sAffineAnimCmdFuncs[funcIndex](matrixNum, sprite); + } + } +} + +static void AffineAnimDelay(u8 matrixNum, struct Sprite *sprite) +{ + if (!DecrementAffineAnimDelayCounter(sprite, matrixNum)) + { + struct AffineAnimFrameCmd frameCmd; + GetAffineAnimFrame(matrixNum, sprite, &frameCmd); + ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &frameCmd); + } +} + +static void AffineAnimCmd_loop(u8 matrixNum, struct Sprite *sprite) +{ + if (sAffineAnimStates[matrixNum].loopCounter) + ContinueAffineAnimLoop(matrixNum, sprite); + else + BeginAffineAnimLoop(matrixNum, sprite); +} + +static void BeginAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) +{ + sAffineAnimStates[matrixNum].loopCounter = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].loop.count; + JumpToTopOfAffineAnimLoop(matrixNum, sprite); + ContinueAffineAnim(sprite); +} + +static void ContinueAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) +{ + sAffineAnimStates[matrixNum].loopCounter--; + JumpToTopOfAffineAnimLoop(matrixNum, sprite); + ContinueAffineAnim(sprite); +} + +static void JumpToTopOfAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) +{ + if (sAffineAnimStates[matrixNum].loopCounter) + { + sAffineAnimStates[matrixNum].animCmdIndex--; + + while (sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex - 1].type != 32765) + { + if (sAffineAnimStates[matrixNum].animCmdIndex == 0) + break; + sAffineAnimStates[matrixNum].animCmdIndex--; + } + + sAffineAnimStates[matrixNum].animCmdIndex--; + } +} + +static void AffineAnimCmd_jump(u8 matrixNum, struct Sprite *sprite) +{ + struct AffineAnimFrameCmd frameCmd; + sAffineAnimStates[matrixNum].animCmdIndex = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].jump.target; + GetAffineAnimFrame(matrixNum, sprite, &frameCmd); + ApplyAffineAnimFrame(matrixNum, &frameCmd); + sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; +} + +static void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite) +{ + struct AffineAnimFrameCmd dummyFrameCmd = {0}; + sprite->affineAnimEnded = TRUE; + sAffineAnimStates[matrixNum].animCmdIndex--; + ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &dummyFrameCmd); +} + +static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite) +{ + struct AffineAnimFrameCmd frameCmd; + GetAffineAnimFrame(matrixNum, sprite, &frameCmd); + ApplyAffineAnimFrame(matrixNum, &frameCmd); + sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; +} + +static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix) +{ + gOamMatrices[destMatrixIndex].a = srcMatrix->a; + gOamMatrices[destMatrixIndex].b = srcMatrix->b; + gOamMatrices[destMatrixIndex].c = srcMatrix->c; + gOamMatrices[destMatrixIndex].d = srcMatrix->d; +} + +static u8 GetSpriteMatrixNum(struct Sprite *sprite) +{ + u8 matrixNum = 0; + if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) + matrixNum = sprite->oam.matrixNum; + return matrixNum; +} + +static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip) +{ + sprite->oam.matrixNum &= 0x7; + sprite->oam.matrixNum |= (((hFlip ^ sprite->hFlip) & 1) << 3); + sprite->oam.matrixNum |= (((vFlip ^ sprite->vFlip) & 1) << 4); +} + +static void AffineAnimStateRestartAnim(u8 matrixNum) +{ + sAffineAnimStates[matrixNum].animCmdIndex = 0; + sAffineAnimStates[matrixNum].delayCounter = 0; + sAffineAnimStates[matrixNum].loopCounter = 0; +} + +static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum) +{ + sAffineAnimStates[matrixNum].animNum = animNum; + sAffineAnimStates[matrixNum].animCmdIndex = 0; + sAffineAnimStates[matrixNum].delayCounter = 0; + sAffineAnimStates[matrixNum].loopCounter = 0; + sAffineAnimStates[matrixNum].xScale = 0x0100; + sAffineAnimStates[matrixNum].yScale = 0x0100; + sAffineAnimStates[matrixNum].rotation = 0; +} + +static void AffineAnimStateReset(u8 matrixNum) +{ + sAffineAnimStates[matrixNum].animNum = 0; + sAffineAnimStates[matrixNum].animCmdIndex = 0; + sAffineAnimStates[matrixNum].delayCounter = 0; + sAffineAnimStates[matrixNum].loopCounter = 0; + sAffineAnimStates[matrixNum].xScale = 0x0100; + sAffineAnimStates[matrixNum].yScale = 0x0100; + sAffineAnimStates[matrixNum].rotation = 0; +} + +static void ApplyAffineAnimFrameAbsolute(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) +{ + sAffineAnimStates[matrixNum].xScale = frameCmd->xScale; + sAffineAnimStates[matrixNum].yScale = frameCmd->yScale; + sAffineAnimStates[matrixNum].rotation = frameCmd->rotation << 8; +} + +static void DecrementAnimDelayCounter(struct Sprite *sprite) +{ + if (!sprite->animPaused) + sprite->animDelayCounter--; +} + +static bool8 DecrementAffineAnimDelayCounter(struct Sprite *sprite, u8 matrixNum) +{ + if (!sprite->affineAnimPaused) + --sAffineAnimStates[matrixNum].delayCounter; + return sprite->affineAnimPaused; +} + +static void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) +{ + struct ObjAffineSrcData srcData; + struct OamMatrix matrix; + sAffineAnimStates[matrixNum].xScale += frameCmd->xScale; + sAffineAnimStates[matrixNum].yScale += frameCmd->yScale; + sAffineAnimStates[matrixNum].rotation = (sAffineAnimStates[matrixNum].rotation + (frameCmd->rotation << 8)) & ~0xFF; + srcData.xScale = ConvertScaleParam(sAffineAnimStates[matrixNum].xScale); + srcData.yScale = ConvertScaleParam(sAffineAnimStates[matrixNum].yScale); + srcData.rotation = sAffineAnimStates[matrixNum].rotation; + ObjAffineSet(&srcData, &matrix, 1, 2); + CopyOamMatrix(matrixNum, &matrix); +} + +static s16 ConvertScaleParam(s16 scale) +{ + s32 val = 0x10000; + return val / scale; +} + +static void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd) +{ + frameCmd->xScale = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.xScale; + frameCmd->yScale = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.yScale; + frameCmd->rotation = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.rotation; + frameCmd->duration = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.duration; +} + +static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) +{ + struct AffineAnimFrameCmd dummyFrameCmd = {0}; + + if (frameCmd->duration) + { + frameCmd->duration--; + ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, frameCmd); + } + else + { + ApplyAffineAnimFrameAbsolute(matrixNum, frameCmd); + ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &dummyFrameCmd); + } +} + +void StartSpriteAnim(struct Sprite *sprite, u8 animNum) +{ + sprite->animNum = animNum; + sprite->animBeginning = TRUE; + sprite->animEnded = FALSE; +} + +void StartSpriteAnimIfDifferent(struct Sprite *sprite, u8 animNum) +{ + if (sprite->animNum != animNum) + StartSpriteAnim(sprite, animNum); +} + +void SeekSpriteAnim(struct Sprite *sprite, u8 animCmdIndex) +{ + u8 temp = sprite->animPaused; + sprite->animCmdIndex = animCmdIndex - 1; + sprite->animDelayCounter = 0; + sprite->animBeginning = FALSE; + sprite->animEnded = FALSE; + sprite->animPaused = FALSE; + ContinueAnim(sprite); + if (sprite->animDelayCounter) + sprite->animDelayCounter++; + sprite->animPaused = temp; +} + +void StartSpriteAffineAnim(struct Sprite *sprite, u8 animNum) +{ + u8 matrixNum = GetSpriteMatrixNum(sprite); + AffineAnimStateStartAnim(matrixNum, animNum); + sprite->affineAnimBeginning = TRUE; + sprite->affineAnimEnded = FALSE; +} + +void StartSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum) +{ + u8 matrixNum = GetSpriteMatrixNum(sprite); + if (sAffineAnimStates[matrixNum].animNum != animNum) + StartSpriteAffineAnim(sprite, animNum); +} + +void ChangeSpriteAffineAnim(struct Sprite *sprite, u8 animNum) +{ + u8 matrixNum = GetSpriteMatrixNum(sprite); + sAffineAnimStates[matrixNum].animNum = animNum; + sprite->affineAnimBeginning = TRUE; + sprite->affineAnimEnded = FALSE; +} + +void ChangeSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum) +{ + u8 matrixNum = GetSpriteMatrixNum(sprite); + if (sAffineAnimStates[matrixNum].animNum != animNum) + ChangeSpriteAffineAnim(sprite, animNum); +} + +void SetSpriteSheetFrameTileNum(struct Sprite *sprite) +{ + if (sprite->usingSheet) + { + s16 tileOffset = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; + if (tileOffset < 0) + tileOffset = 0; + sprite->oam.tileNum = sprite->sheetTileStart + tileOffset; + } +} + +static void ResetAffineAnimData(void) +{ + u8 i; + + gAffineAnimsDisabled = 0; + gOamMatrixAllocBitmap = 0; + + ResetOamMatrices(); + + for (i = 0; i < OAM_MATRIX_COUNT; i++) + AffineAnimStateReset(i); +} + +u8 AllocOamMatrix(void) +{ + u8 i = 0; + u32 bit = 1; + u32 bitmap = gOamMatrixAllocBitmap; + + while (i < OAM_MATRIX_COUNT) + { + if (!(bitmap & bit)) + { + gOamMatrixAllocBitmap |= bit; + return i; + } + + i++; + bit <<= 1; + } + + return 0xFF; +} + +void FreeOamMatrix(u8 matrixNum) +{ + u8 i = 0; + u32 bit = 1; + + while (i < matrixNum) + { + i++; + bit <<= 1; + } + + gOamMatrixAllocBitmap &= ~bit; + SetOamMatrix(matrixNum, 0x100, 0, 0, 0x100); +} + +void InitSpriteAffineAnim(struct Sprite *sprite) +{ + u8 matrixNum = AllocOamMatrix(); + if (matrixNum != 0xFF) + { + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); + sprite->oam.matrixNum = matrixNum; + sprite->affineAnimBeginning = TRUE; + AffineAnimStateReset(matrixNum); + } +} + +void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation) +{ + struct ObjAffineSrcData srcData; + struct OamMatrix matrix; + srcData.xScale = ConvertScaleParam(xScale); + srcData.yScale = ConvertScaleParam(yScale); + srcData.rotation = rotation; + ObjAffineSet(&srcData, &matrix, 1, 2); + CopyOamMatrix(matrixNum, &matrix); +} + +u16 LoadSpriteSheet(const struct SpriteSheet *sheet) +{ + s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); + + if (tileStart < 0) + { + return 0; + } + else + { + AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); + CpuCopy16(sheet->data, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); + return (u16)tileStart; + } +} + +void LoadSpriteSheets(const struct SpriteSheet *sheets) +{ + u8 i; + for (i = 0; sheets[i].data != NULL; i++) + LoadSpriteSheet(&sheets[i]); +} + +u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet) +{ + s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); + + if (tileStart < 0) + { + return 0; + } + else + { + AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); + return (u16)tileStart; + } +} + +void AllocTilesForSpriteSheets(struct SpriteSheet *sheets) +{ + u8 i; + for (i = 0; sheets[i].data != NULL; i++) + AllocTilesForSpriteSheet(&sheets[i]); +} + +void LoadTilesForSpriteSheet(const struct SpriteSheet *sheet) +{ + const u8 *data = sheet->data; + u16 tileStart = GetSpriteTileStartByTag(sheet->tag); + CpuCopy16(data, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); +} + +void LoadTilesForSpriteSheets(struct SpriteSheet *sheets) +{ + u8 i; + for (i = 0; sheets[i].data != NULL; i++) + LoadTilesForSpriteSheet(&sheets[i]); +} + +void FreeSpriteTilesByTag(u16 tag) +{ + u8 index = IndexOfSpriteTileTag(tag); + if (index != 0xFF) + { + u16 i; + u16 *rangeStarts; + u16 *rangeCounts; + u16 start; + u16 count; + rangeStarts = sSpriteTileRanges; + start = rangeStarts[index * 2]; + rangeCounts = sSpriteTileRanges + 1; + count = rangeCounts[index * 2]; + + for (i = start; i < start + count; i++) + FREE_SPRITE_TILE(i); + + sSpriteTileRangeTags[index] = 0xFFFF; + } +} + +void FreeSpriteTileRanges(void) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + { + sSpriteTileRangeTags[i] = 0xFFFF; + SET_SPRITE_TILE_RANGE(i, 0, 0); + } +} + +u16 GetSpriteTileStartByTag(u16 tag) +{ + u8 index = IndexOfSpriteTileTag(tag); + if (index == 0xFF) + return 0xFFFF; + return sSpriteTileRanges[index * 2]; +} + +static u8 IndexOfSpriteTileTag(u16 tag) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + if (sSpriteTileRangeTags[i] == tag) + return i; + + return 0xFF; +} + +u16 GetSpriteTileTagByTileStart(u16 start) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + { + if (sSpriteTileRangeTags[i] != 0xFFFF && sSpriteTileRanges[i * 2] == start) + return sSpriteTileRangeTags[i]; + } + + return 0xFFFF; +} + +static void AllocSpriteTileRange(u16 tag, u16 start, u16 count) +{ + u8 freeIndex = IndexOfSpriteTileTag(0xFFFF); + sSpriteTileRangeTags[freeIndex] = tag; + SET_SPRITE_TILE_RANGE(freeIndex, start, count); +} + +void RequestSpriteSheetCopy(const struct SpriteSheet *sheet) +{ + const u8 *data = sheet->data; + u16 tileStart = GetSpriteTileStartByTag(sheet->tag); + RequestSpriteCopy(data, (u8 *)OBJ_VRAM0 + tileStart * TILE_SIZE_4BPP, sheet->size); +} + +u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet) +{ + s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); + + if (tileStart < 0) + { + return 0; + } + else + { + AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); + RequestSpriteSheetCopy(sheet); + return (u16)tileStart; + } +} + +void FreeAllSpritePalettes(void) +{ + u8 i; + gReservedSpritePaletteCount = 0; + for (i = 0; i < 16; i++) + sSpritePaletteTags[i] = 0xFFFF; +} + +u8 LoadSpritePalette(const struct SpritePalette *palette) +{ + u8 index = IndexOfSpritePaletteTag(palette->tag); + + if (index != 0xFF) + return index; + + index = IndexOfSpritePaletteTag(0xFFFF); + + if (index == 0xFF) + { + return 0xFF; + } + else + { + sSpritePaletteTags[index] = palette->tag; + DoLoadSpritePalette(palette->data, index * 16); + return index; + } +} + +void LoadSpritePalettes(const struct SpritePalette *palettes) +{ + u8 i; + for (i = 0; palettes[i].data != NULL; i++) + if (LoadSpritePalette(&palettes[i]) == 0xFF) + break; +} + +static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset) +{ + LoadPalette(src, paletteOffset + 0x100, 32); +} + +u8 AllocSpritePalette(u16 tag) +{ + u8 index = IndexOfSpritePaletteTag(0xFFFF); + if (index == 0xFF) + { + return 0xFF; + } + else + { + sSpritePaletteTags[index] = tag; + return index; + } +} + +u8 IndexOfSpritePaletteTag(u16 tag) +{ + u8 i; + for (i = gReservedSpritePaletteCount; i < 16; i++) + if (sSpritePaletteTags[i] == tag) + return i; + + return 0xFF; +} + +u16 GetSpritePaletteTagByPaletteNum(u8 paletteNum) +{ + return sSpritePaletteTags[paletteNum]; +} + +void FreeSpritePaletteByTag(u16 tag) +{ + u8 index = IndexOfSpritePaletteTag(tag); + if (index != 0xFF) + sSpritePaletteTags[index] = 0xFFFF; +} + +void SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables) +{ + sprite->subspriteTables = subspriteTables; + sprite->subspriteTableNum = 0; + sprite->subspriteMode = SUBSPRITES_ON; +} + +bool8 AddSpriteToOamBuffer(struct Sprite *sprite, u8 *oamIndex) +{ + if (*oamIndex >= gOamLimit) + return 1; + + if (!sprite->subspriteTables || sprite->subspriteMode == SUBSPRITES_OFF) + { + gMain.oamBuffer[*oamIndex] = sprite->oam; + (*oamIndex)++; + return 0; + } + else + { + return AddSubspritesToOamBuffer(sprite, &gMain.oamBuffer[*oamIndex], oamIndex); + } +} + +bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u8 *oamIndex) +{ + const struct SubspriteTable *subspriteTable; + struct OamData *oam; + + if (*oamIndex >= gOamLimit) + return 1; + + subspriteTable = &sprite->subspriteTables[sprite->subspriteTableNum]; + oam = &sprite->oam; + + if (!subspriteTable || !subspriteTable->subsprites) + { + *destOam = *oam; + (*oamIndex)++; + return 0; + } + else + { + u16 tileNum; + u16 baseX; + u16 baseY; + u8 subspriteCount; + u8 hFlip; + u8 vFlip; + u8 i; + + tileNum = oam->tileNum; + subspriteCount = subspriteTable->subspriteCount; + hFlip = ((s32)oam->matrixNum >> 3) & 1; + vFlip = ((s32)oam->matrixNum >> 4) & 1; + baseX = oam->x - sprite->centerToCornerVecX; + baseY = oam->y - sprite->centerToCornerVecY; + + for (i = 0; i < subspriteCount; i++, (*oamIndex)++) + { + u16 x; + u16 y; + + if (*oamIndex >= gOamLimit) + return 1; + + x = subspriteTable->subsprites[i].x; + y = subspriteTable->subsprites[i].y; + + if (hFlip) + { + s8 width = sOamDimensions[subspriteTable->subsprites[i].shape][subspriteTable->subsprites[i].size].width; + s16 right = x; + right += width; + x = right; + x = ~x + 1; + } + + if (vFlip) + { + s8 height = sOamDimensions[subspriteTable->subsprites[i].shape][subspriteTable->subsprites[i].size].height; + s16 bottom = y; + bottom += height; + y = bottom; + y = ~y + 1; + } + + destOam[i] = *oam; + destOam[i].shape = subspriteTable->subsprites[i].shape; + destOam[i].size = subspriteTable->subsprites[i].size; + destOam[i].x = (s16)baseX + (s16)x; + destOam[i].y = baseY + y; + destOam[i].tileNum = tileNum + subspriteTable->subsprites[i].tileOffset; + + if (sprite->subspriteMode != SUBSPRITES_IGNORE_PRIORITY) + destOam[i].priority = subspriteTable->subsprites[i].priority; + } + } + + return 0; +} diff --git a/src/engine/string_util.c b/src/engine/string_util.c new file mode 100644 index 000000000..9686256a1 --- /dev/null +++ b/src/engine/string_util.c @@ -0,0 +1,561 @@ +#include "global.h" +#include "string_util.h" +#include "strings.h" +#include "text.h" + +u8 gUnknownStringVar[16]; + +const u8 gEmptyString_81E72B0[] = _(""); +const u8 gRightPointingTriangleString[] = _("▶"); + +static const u8 sDigits[] = __("0123456789ABCDEF"); + +static const s32 sPowersOfTen[] = +{ + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, +}; + +u8 *StringCopy10(u8 *dest, const u8 *src) +{ + u8 i; + u32 limit = 10; + + for (i = 0; i < limit; i++) + { + dest[i] = src[i]; + + if (dest[i] == EOS) + return &dest[i]; + } + + dest[i] = EOS; + return &dest[i]; +} + +u8 *StringGetEnd10(u8 *str) +{ + u8 i; + u32 limit = 10; + + for (i = 0; i < limit; i++) + if (str[i] == EOS) + return &str[i]; + + str[i] = EOS; + return &str[i]; +} + +u8 *StringCopy8(u8 *dest, const u8 *src) +{ + s32 i; + + for (i = 0; i < 8; i++) + { + dest[i] = src[i]; + + if (dest[i] == EOS) + return &dest[i]; + } + + dest[i] = EOS; + return &dest[i]; +} + +u8 *StringCopy(u8 *dest, const u8 *src) +{ + while (*src != EOS) + { + *dest = *src; + dest++; + src++; + } + + *dest = EOS; + return dest; +} + +u8 *StringAppend(u8 *dest, const u8 *src) +{ + while (*dest != EOS) + dest++; + + return StringCopy(dest, src); +} + +u8 *StringCopyN(u8 *dest, const u8 *src, u8 n) +{ + u16 i; + + for (i = 0; i < n; i++) + dest[i] = src[i]; + + return &dest[n]; +} + +u8 *StringAppendN(u8 *dest, const u8 *src, u8 n) +{ + while (*dest != EOS) + dest++; + + return StringCopyN(dest, src, n); +} + +u16 StringLength(const u8 *str) +{ + u16 length = 0; + + while (str[length] != EOS) + { + u16 temp = length; + length++; + if (str[temp] == EXT_CTRL_CODE_BEGIN) + length += GetExtCtrlCodeLength(str[length]); + } + + return length; +} + +#ifdef GERMAN +s32 StringLengthN(const u8 *str, s32 n) +{ + s32 i; + + for (i = 0; i < n && str[i] != EOS; i++) + ; + + if (i == n) + i = 0; + + return i; +} +#endif + +s32 StringCompare(const u8 *str1, const u8 *str2) +{ + while (*str1 == *str2) + { + if (*str1 == EOS) + return 0; + str1++; + str2++; + } + + return *str1 - *str2; +} + +s32 StringCompareN(const u8 *str1, const u8 *str2, u32 n) +{ + while (*str1 == *str2) + { + if (*str1 == EOS) + return 0; + str1++; + str2++; + if (--n == 0) + return 0; + } + + return *str1 - *str2; +} + +u8 *ConvertIntToDecimalStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) +{ + enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; + s32 powerOfTen; + s32 largestPowerOfTen = sPowersOfTen[n - 1]; + + state = WAITING_FOR_NONZERO_DIGIT; + + if (mode == STR_CONV_MODE_RIGHT_ALIGN) + state = WRITING_SPACES; + + if (mode == STR_CONV_MODE_LEADING_ZEROS) + state = WRITING_DIGITS; + + for (powerOfTen = largestPowerOfTen; powerOfTen > 0; powerOfTen /= 10) + { + char *out; + u8 c; + u16 digit = value / powerOfTen; + s32 temp = value - (powerOfTen * digit); + + if (state == WRITING_DIGITS) + { + out = dest++; + + if (digit <= 9) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (digit != 0 || powerOfTen == 1) + { + state = WRITING_DIGITS; + out = dest++; + + if (digit <= 9) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (state == WRITING_SPACES) + { + *dest++ = CHAR_SPACE; + } + + value = temp; + } + + *dest = EOS; + return dest; +} + +u8 *ConvertIntToDecimalStringN_DigitWidth6(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) +{ + enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; + s32 powerOfTen; + s32 largestPowerOfTen = sPowersOfTen[n - 1]; + + *dest++ = EXT_CTRL_CODE_BEGIN; + *dest++ = 0x14; + *dest++ = 6; + + state = WAITING_FOR_NONZERO_DIGIT; + + if (mode == STR_CONV_MODE_RIGHT_ALIGN) + state = WRITING_SPACES; + + if (mode == STR_CONV_MODE_LEADING_ZEROS) + state = WRITING_DIGITS; + + for (powerOfTen = largestPowerOfTen; powerOfTen > 0; powerOfTen /= 10) + { + char *out; + u8 c; + u16 digit = value / powerOfTen; + s32 temp = value - (powerOfTen * digit); + + if (state == WRITING_DIGITS) + { + out = dest++; + + if (digit <= 9) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (digit != 0 || powerOfTen == 1) + { + state = WRITING_DIGITS; + out = dest++; + + if (digit <= 9) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (state == WRITING_SPACES) + { + *dest++ = CHAR_SPACE; + } + + value = temp; + } + + *dest++ = EXT_CTRL_CODE_BEGIN; + *dest++ = 0x14; + *dest++ = 0x00; + + *dest = EOS; + return dest; +} + +u8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) +{ + enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; + u8 i; + s32 powerOfSixteen; + s32 largestPowerOfSixteen = 1; + + for (i = 1; i < n; i++) + largestPowerOfSixteen *= 16; + + state = WAITING_FOR_NONZERO_DIGIT; + + if (mode == STR_CONV_MODE_RIGHT_ALIGN) + state = WRITING_SPACES; + + if (mode == STR_CONV_MODE_LEADING_ZEROS) + state = WRITING_DIGITS; + + for (powerOfSixteen = largestPowerOfSixteen; powerOfSixteen > 0; powerOfSixteen /= 16) + { + char *out; + u8 c; + u32 digit = value / powerOfSixteen; + s32 temp = value % powerOfSixteen; + + if (state == WRITING_DIGITS) + { + out = dest++; + + if (digit <= 0xF) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (digit != 0 || powerOfSixteen == 1) + { + state = WRITING_DIGITS; + out = dest++; + + if (digit <= 0xF) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (state == WRITING_SPACES) + { + *dest++ = CHAR_SPACE; + } + + value = temp; + } + + *dest = EOS; + return dest; +} + +u8 *ConvertIntToDecimalString(u8 *dest, s32 value) +{ + char temp[12]; + s32 length = 0; + + do + { + temp[length++] = sDigits[value % 10]; + value /= 10; + } while (value != 0); + + length--; + + while (length != -1) + { + *dest++ = temp[length]; + length--; + } + + *dest = EOS; + return dest; +} + +u8 *StringExpandPlaceholders(u8 *dest, const u8 *src) +{ + for (;;) + { + u8 c = *src++; + u8 placeholderId; + u8 *expandedString; + u8 length; + + switch (c) + { + case PLACEHOLDER_BEGIN: + placeholderId = *src++; + expandedString = GetExpandedPlaceholder(placeholderId); + dest = StringExpandPlaceholders(dest, expandedString); + break; + case EXT_CTRL_CODE_BEGIN: + *dest++ = c; + length = GetExtCtrlCodeLength(*src); + memcpy(dest, src, length); + dest += length; + src += length; + break; + case EOS: + *dest = EOS; + return dest; + case 0xFA: + case 0xFB: + case 0xFE: + default: + *dest++ = c; + } + } +} + +u8 *StringBraille(u8 *dest, const u8 *src) +{ + u8 setBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF }; + u8 gotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF }; + + dest = StringCopy(dest, setBrailleFont); + + for (;;) + { + u8 c = *src++; + + switch (c) + { + case EOS: + *dest = c; + return dest; + case 0xFE: + dest = StringCopy(dest, gotoLine2); + break; + default: + *dest++ = c; + *dest++ = c + 0x40; + break; + } + } +} + +static u8 *ExpandPlaceholder_UnknownStringVar(void) +{ + return gUnknownStringVar; +} + +static u8 *ExpandPlaceholder_PlayerName(void) +{ + return gSaveBlock2.playerName; +} + +static u8 *ExpandPlaceholder_StringVar1(void) +{ + return gStringVar1; +} + +static u8 *ExpandPlaceholder_StringVar2(void) +{ + return gStringVar2; +} + +static u8 *ExpandPlaceholder_StringVar3(void) +{ + return gStringVar3; +} + +static u8 *ExpandPlaceholder_KunChan(void) +{ + if (gSaveBlock2.playerGender == MALE) + return (u8 *) gExpandedPlaceholder_Kun; + else + return (u8 *) gExpandedPlaceholder_Chan; +} + +static u8 *ExpandPlaceholder_RivalName(void) +{ + if (gSaveBlock2.playerGender == MALE) + return (u8 *) gExpandedPlaceholder_May; + else + return (u8 *) gExpandedPlaceholder_Brendan; +} + +#define VERSION_DEPENDENT_PLACEHOLDER_LIST \ + X(Version, Ruby, Sapphire) \ + X(EvilTeam, Magma, Aqua) \ + X(GoodTeam, Aqua, Magma) \ + X(EvilLeader, Maxie, Archie) \ + X(GoodLeader, Archie, Maxie) \ + X(EvilLegendary, Groudon, Kyogre) \ + X(GoodLegendary, Kyogre, Groudon) + +#ifdef SAPPHIRE +#define X(ph, r, s) \ +static u8 *ExpandPlaceholder_##ph(void) { return (u8 *) gExpandedPlaceholder_##s; } +VERSION_DEPENDENT_PLACEHOLDER_LIST +#else +#define X(ph, r, s) \ +static u8 *ExpandPlaceholder_##ph(void) { return (u8 *) gExpandedPlaceholder_##r; } +VERSION_DEPENDENT_PLACEHOLDER_LIST +#endif + +#undef X + +u8 *GetExpandedPlaceholder(u32 id) +{ + typedef u8 *(*ExpandPlaceholderFunc)(void); + + static const ExpandPlaceholderFunc funcs[] = + { + ExpandPlaceholder_UnknownStringVar, + ExpandPlaceholder_PlayerName, + ExpandPlaceholder_StringVar1, + ExpandPlaceholder_StringVar2, + ExpandPlaceholder_StringVar3, + ExpandPlaceholder_KunChan, + ExpandPlaceholder_RivalName, + ExpandPlaceholder_Version, + ExpandPlaceholder_EvilTeam, + ExpandPlaceholder_GoodTeam, + ExpandPlaceholder_EvilLeader, + ExpandPlaceholder_GoodLeader, + ExpandPlaceholder_EvilLegendary, + ExpandPlaceholder_GoodLegendary, + }; + + if (id >= ARRAY_COUNT(funcs)) + return (u8 *) gExpandedPlaceholder_Empty; + else + return funcs[id](); +} + +u8 *StringFill(u8 *dest, u8 c, u16 n) +{ + u16 i; + + for (i = 0; i < n; i++) + *dest++ = c; + + *dest = EOS; + return dest; +} + +u8 *StringCopyPadded(u8 *dest, const u8 *src, u8 c, u16 n) +{ + while (*src != EOS) + { + *dest++ = *src++; + + if (n) + n--; + } + + n--; + + while (n != (u16)-1) + { + *dest++ = c; + n--; + } + + *dest = EOS; + return dest; +} + +u8 *StringFillWithTerminator(u8 *dest, u16 n) +{ + return StringFill(dest, EOS, n); +} diff --git a/src/engine/task.c b/src/engine/task.c new file mode 100644 index 000000000..7bd2b5937 --- /dev/null +++ b/src/engine/task.c @@ -0,0 +1,209 @@ +#include "global.h" +#include "task.h" + +#define ACTIVE_SENTINEL 0x10 +#define HEAD_SENTINEL 0xFE +#define TAIL_SENTINEL 0xFF + +// gTasks is a queue of the active 16 tasks +struct Task gTasks[ACTIVE_SENTINEL]; + +static void InsertTask(u8 newTaskId); +static u8 FindFirstActiveTask(); + +// Unused string +const u8 sTaskOverString[] = _("TASK OVER\nタスクがオーバーしました"); + +void ResetTasks() +{ + u8 taskId; + + for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++) + { + gTasks[taskId].isActive = FALSE; + gTasks[taskId].func = TaskDummy; + gTasks[taskId].prev = taskId; + gTasks[taskId].next = taskId + 1; + gTasks[taskId].priority = -1; + memset(gTasks[taskId].data, 0, sizeof(gTasks[taskId].data)); + } + + gTasks[0].prev = HEAD_SENTINEL; + gTasks[ACTIVE_SENTINEL - 1].next = TAIL_SENTINEL; +} + +u8 CreateTask(TaskFunc func, u8 priority) +{ + u8 taskId; + + for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++) + { + if (!gTasks[taskId].isActive) + { + gTasks[taskId].func = func; + gTasks[taskId].priority = priority; + InsertTask(taskId); + memset(gTasks[taskId].data, 0, sizeof(gTasks[taskId].data)); + gTasks[taskId].isActive = TRUE; + return taskId; + } + } + + return 0; +} + +static void InsertTask(u8 newTaskId) +{ + u8 taskId = FindFirstActiveTask(); + + if (taskId == ACTIVE_SENTINEL) + { + // The task system inserts from the top downwards starting from the end (0xFF) to 0. If FindFirstActiveTask returned the value equivalent to ACTIVE_SENTINEL, it means it is the only task because it searched the entire queue. + gTasks[newTaskId].prev = HEAD_SENTINEL; + gTasks[newTaskId].next = TAIL_SENTINEL; + return; + } + + while (1) + { + if (gTasks[newTaskId].priority < gTasks[taskId].priority) + { + // We've found a task with a higher priority value, + // so we insert the new task before it. + gTasks[newTaskId].prev = gTasks[taskId].prev; + gTasks[newTaskId].next = taskId; + + if (gTasks[taskId].prev != HEAD_SENTINEL) + gTasks[gTasks[taskId].prev].next = newTaskId; // as long as we are not at the end, insert the newTask appropriately. + + gTasks[taskId].prev = newTaskId; + return; + } + if (gTasks[taskId].next == TAIL_SENTINEL) // we did not find a space for the task, so overwrite the last task as it is the lowest priority. + { + // We've reached the end. + gTasks[newTaskId].prev = taskId; + gTasks[newTaskId].next = gTasks[taskId].next; + gTasks[taskId].next = newTaskId; + return; + } + taskId = gTasks[taskId].next; // neither the priority was lower, nor the end. check the next task. + } +} + +void DestroyTask(u8 taskId) +{ + if (gTasks[taskId].isActive) + { + gTasks[taskId].isActive = FALSE; + + if (gTasks[taskId].prev == HEAD_SENTINEL) + { + if (gTasks[taskId].next != TAIL_SENTINEL) + gTasks[gTasks[taskId].next].prev = HEAD_SENTINEL; + } + else + { + if (gTasks[taskId].next == TAIL_SENTINEL) + { + gTasks[gTasks[taskId].prev].next = TAIL_SENTINEL; + } + else + { + gTasks[gTasks[taskId].prev].next = gTasks[taskId].next; + gTasks[gTasks[taskId].next].prev = gTasks[taskId].prev; + } + } + } +} + +void RunTasks(void) +{ + u8 taskId = FindFirstActiveTask(); + + if (taskId != ACTIVE_SENTINEL) + { + do + { + gTasks[taskId].func(taskId); + taskId = gTasks[taskId].next; + } while (taskId != TAIL_SENTINEL); + } +} + +static u8 FindFirstActiveTask(void) +{ + u8 taskId; + + for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++) + if (gTasks[taskId].isActive == TRUE && gTasks[taskId].prev == HEAD_SENTINEL) + break; + + return taskId; +} + +void TaskDummy(u8 taskId) +{ +} + +#define TASK_DATA_OP(taskId, offset, op) \ +{ \ + u32 tasksAddr = (u32)gTasks; \ + u32 addr = taskId * sizeof(struct Task) + offset; \ + u32 dataAddr = tasksAddr + offsetof(struct Task, data); \ + addr += dataAddr; \ + op; \ +} + +void SetTaskFuncWithFollowupFunc(u8 taskId, TaskFunc func, TaskFunc followupFunc) +{ + TASK_DATA_OP(taskId, 28, *((u16 *)addr) = (u32)followupFunc) + TASK_DATA_OP(taskId, 30, *((u16 *)addr) = (u32)followupFunc >> 16) + gTasks[taskId].func = func; +} + +void SwitchTaskToFollowupFunc(u8 taskId) +{ + s32 func; + + gTasks[taskId].func = NULL; + + TASK_DATA_OP(taskId, 28, func = *((u16 *)addr)) + TASK_DATA_OP(taskId, 30, func |= *((s16 *)addr) << 16) + + gTasks[taskId].func = (TaskFunc)func; +} + +bool8 FuncIsActiveTask(TaskFunc func) +{ + u8 i; + + for (i = 0; i < ACTIVE_SENTINEL; i++) + if (gTasks[i].isActive == TRUE && gTasks[i].func == func) + return TRUE; + + return FALSE; +} + +u8 FindTaskIdByFunc(TaskFunc func) +{ + s32 i; + + for (i = 0; i < ACTIVE_SENTINEL; i++) + if (gTasks[i].isActive == TRUE && gTasks[i].func == func) + return (u8)i; + + return -1; +} + +u8 GetTaskCount(void) +{ + u8 i; + u8 count = 0; + + for (i = 0; i < ACTIVE_SENTINEL; i++) + if (gTasks[i].isActive == TRUE) + count++; + + return count; +} diff --git a/src/engine/text.c b/src/engine/text.c new file mode 100644 index 000000000..abde4484a --- /dev/null +++ b/src/engine/text.c @@ -0,0 +1,4324 @@ +#include "global.h" +#include "text.h" +#include "battle.h" +#include "main.h" +#include "palette.h" +#include "songs.h" +#include "sound.h" +#include "string_util.h" + +enum +{ + WIN_STATE_END, + WIN_STATE_BEGIN, + WIN_STATE_NORMAL, + WIN_STATE_INTERRUPTIBLE_PAUSE, + WIN_STATE_PAUSE, + WIN_STATE_WAIT_BUTTON, + WIN_STATE_NEWLINE, + WIN_STATE_PLACEHOLDER, + WIN_STATE_PARAGRAPH, + WIN_STATE_NEWLINE_WAIT, + WIN_STATE_WAIT_SOUND, +}; + +struct Font +{ + u32 type; + u8 *glyphs; + u16 glyphSize; + u16 lowerTileOffset; +}; + +struct GlyphBuffer +{ + // 0-7 left tile + // 8-15 right tile (if it exists) + u32 pixelRows[16]; + + // pixel row filled with BG color + u32 background; + + // table of color indices (not a palette) + u32 colors[16]; +}; + +struct GlyphTileInfo +{ + u8 textMode; + u8 startPixel; + u8 width; + u8 *src; + u32 *dest; + u32 *colors; +}; + +struct ShiftAmount +{ + u32 left; + u32 right; +}; + +static u16 InitVariableWidthFontTileData(struct Window *, u16); +static u16 LoadFixedWidthFont(struct Window *, u16); +static u16 LoadFixedWidthFont_Font1Latin(struct Window *, u16); +static u16 LoadFixedWidthFont_Font4Latin(struct Window *, u16); +static u16 LoadFixedWidthFont_Braille(struct Window *, u16); +static void MultistepLoadFont_LoadGlyph(struct Window *, u16, u8); +static u8 sub_8002FA0(struct Window *, const u8 *); +static u8 InterpretText(struct Window *); +static u8 HandleExtCtrlCode(struct Window *); +static u8 UpdateWindowText(struct Window *); +static u8 DrawGlyph_TextMode0(struct Window *, u32); +static void DrawGlyph_TextMode2(struct Window *, u32); +static void LoadFixedWidthGlyph(struct Window *, u32, u8 *); +static void WriteGlyphTilemap(struct Window *, u16, u16); +static void GetGlyphTilePointers(u8, u8, u16, u8 **, u8 **); +static u16 *GetCursorTilemapPointer(struct Window *); +static void ApplyColors_UnshadowedFont(const u8 *, u32 *, u8, u8); +static void ApplyColors_ShadowedFont(const void *, void *, u8, u8, u8); +static void SetCursorX(struct Window *, u8); +static void AddToCursorX(struct Window *, u8); +static void AddToCursorY(struct Window *, u8); +static void ClipLeft(struct Window *); +static void ClipRight(struct Window *); +static void InitColors(struct Window *); +static void SetBackgroundColor(struct Window *, u8); +static void SetShadowColor(struct Window *, u8); +static void SetForegroundColor(struct Window *, u8); +static u8 GetTextDelay(struct Window *); +static bool8 PlayerCanInterruptWait(struct Window *); +static void ScrollWindowTextLines(struct Window *); +static void ScrollWindowTextLines_TextMode0(struct Window *); +static void DoScroll_TextMode0(struct Window *, u16); +static void ScrollWindowTextLines_TextMode1(struct Window *); +static void DoScroll_TextMode1(struct Window *, u16); +static void ScrollWindowTextLines_TextMode2(struct Window *); +static void DoScroll_TextMode2(struct Window *, u8); +void ClearWindowTextLines(struct Window *); +static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *, u8); +static void ClearWindowTextLines_TextMode2(struct Window *, u8); +static void TryEraseDownArrow(struct Window *); +static u16 GetBlankTileNum(struct Window *); +static u8 WaitWithDownArrow(struct Window *); +static void DrawInitialDownArrow(struct Window *); +static void DrawMovingDownArrow(struct Window *); +static u16 GetCursorTileNum(struct Window *, u32, u32); +static s32 DrawGlyphTiles(struct Window *, u32, u32); +static void UpdateTilemap(struct Window *, u32); +static u8 GetGlyphWidth(struct Window *, u32); +static s32 DrawGlyphTile_ShadowedFont(struct GlyphTileInfo *); + +static void PrintGlyph_TextMode0(struct Window *, u32); +static void PrintGlyph_TextMode1(struct Window *, u32); +static void PrintGlyph_TextMode2(struct Window *, u32); + +static void WriteGlyphTilemap_Font0_Font3(struct Window *, u32); +static void WriteGlyphTilemap_Font1_Font4(struct Window *, u32); +static void WriteGlyphTilemap_Font2_Font5(struct Window *, u32); +static void WriteGlyphTilemap_Font1_Font4(struct Window *, u32); +static void WriteGlyphTilemap_Font2_Font5(struct Window *, u32); +static void WriteGlyphTilemap_Font6(struct Window *, u32); + +static u8 ExtCtrlCode_Nop(struct Window *); +static u8 ExtCtrlCode_ForegroundColor(struct Window *); +static u8 ExtCtrlCode_BackgroundColor(struct Window *); +static u8 ExtCtrlCode_ShadowColor(struct Window *); +static u8 ExtCtrlCode_AllColors(struct Window *); +static u8 ExtCtrlCode_Palette(struct Window *); +static u8 ExtCtrlCode_Font(struct Window *); +static u8 ExtCtrlCode_DefaultFont(struct Window *); +static u8 ExtCtrlCode_Pause(struct Window *); +static u8 ExtCtrlCode_WaitButton(struct Window *); +static u8 ExtCtrlCode_WaitSound(struct Window *); +static u8 ExtCtrlCode_PlayBGM(struct Window *); +static u8 ExtCtrlCode_Escape(struct Window *); +static u8 ExtCtrlCode_Nop2(struct Window *); +static u8 ExtCtrlCode_SetCursorY(struct Window *); +static u8 ExtCtrlCode_ClearWindowTextLines(struct Window *); +static u8 ExtCtrlCode_PlaySE(struct Window *); +static u8 ExtCtrlCode_Skip(struct Window *); +static u8 ExtCtrlCode_SetCursorX(struct Window *); +static u8 ExtCtrlCode_SkipTo(struct Window *); +static u8 ExtCtrlCode_Spacing(struct Window *); +static u8 ExtCtrlCode_Japanese(struct Window *); +static u8 ExtCtrlCode_Latin(struct Window *); + +static void ShiftGlyphTile_UnshadowedFont_Width0(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width1(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width2(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width3(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width4(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width5(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width6(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width7(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width8(struct GlyphBuffer *, u8 *, u32 *, u8); + +static void ShiftGlyphTile_ShadowedFont_Width0(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width1(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width2(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width3(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width4(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width5(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width6(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width7(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width8(struct GlyphBuffer *, u32 *, u32 *, u8); + +static struct Window *sMultistepLoadFont_Window; +static u16 sMultistepLoadFont_StartOffset; +static u16 sMultistepLoadFont_Index; +static struct Window sTempWindow; +static u8 sWaitType; +static u8 sLineLength; +static struct GlyphBuffer sGlyphBuffer; + +EWRAM_DATA u16 gBGTilemapBuffers[4][0x400] = {0}; + +EWRAM_DATA u8 gStringVar1[0x100] = {0}; +EWRAM_DATA u8 gStringVar2[0x100] = {0}; +EWRAM_DATA u8 gStringVar3[0x100] = {0}; +EWRAM_DATA u8 gStringVar4[0x100] = {0}; + +extern u16 gBattleTypeFlags; +extern u8 gIsLinkContest; +extern u8 gTileBuffer[]; + +vu16 *const gBGControlRegs[] = +{ + ®_BG0CNT, + ®_BG1CNT, + ®_BG2CNT, + ®_BG3CNT, +}; + +vu16 *const gBGHOffsetRegs[] = +{ + ®_BG0HOFS, + ®_BG1HOFS, + ®_BG2HOFS, + ®_BG3HOFS, +}; + +vu16 *const gBGVOffsetRegs[] = +{ + ®_BG0VOFS, + ®_BG1VOFS, + ®_BG2VOFS, + ®_BG3VOFS, +}; + +const u16 gUnknown_081E29D8[] = { 0x100, 0x200, 0x400, 0x800 }; +const u16 gUnknown_081E29E0[] = { 0x100, 0x200, 0x400, 0x800 }; +const u16 gUnknown_081E29E8[] = { 1, 2, 4, 8 }; + +static const u8 sFont0LatinGlyphs[] = INCBIN_U8("graphics/fonts/font0_lat.1bpp"); +static const u8 sFont1LatinGlyphs[] = INCBIN_U8("graphics/fonts/font1_lat.1bpp"); +static const u8 sFont0JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font0_jpn.1bpp"); +static const u8 sFont1JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font1_jpn.1bpp"); +static const u8 sBrailleGlyphs[] = INCBIN_U8("graphics/fonts/font6_braille.1bpp"); +static const u32 sDownArrowTiles[] = INCBIN_U32("graphics/fonts/down_arrow.4bpp"); + +// clang-format off +#include "../data/text/type1_map.h" +#include "../data/text/type3_map.h" +#include "../data/text/font1_widths.h" +#include "../data/text/font4_widths.h" +#include "../data/text/font0_widths.h" +#include "../data/text/font3_widths.h" +// clang-format on + +const u16 gUnknownPalette_81E6692[] = INCBIN_U16("graphics/fonts/unknown_81E6692.gbapal"); +const u16 gFontDefaultPalette[] = INCBIN_U16("graphics/fonts/default.gbapal"); + +const u8 sBlankTile[8] = { 0, 0, 0, 0, 0, 0, 0, 0, }; + +static const u32 sGlyphMasks[9][8][3] = +{ + { + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xFFFFFFF0, }, + { 0x0000000F,0xFFFFFFFF,0xFFFFFF00, }, + { 0x000000FF,0xFFFFFFFF,0xFFFFF000, }, + { 0x00000FFF,0xFFFFFFFF,0xFFFF0000, }, + { 0x0000FFFF,0xFFFFFFFF,0xFFF00000, }, + { 0x000FFFFF,0xFFFFFFFF,0xFF000000, }, + { 0x00FFFFFF,0xFFFFFFFF,0xF0000000, }, + { 0x0FFFFFFF,0xFFFFFFFF,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xFFFFFF00, }, + { 0x0000000F,0xFFFFFFFF,0xFFFFF000, }, + { 0x000000FF,0xFFFFFFFF,0xFFFF0000, }, + { 0x00000FFF,0xFFFFFFFF,0xFFF00000, }, + { 0x0000FFFF,0xFFFFFFFF,0xFF000000, }, + { 0x000FFFFF,0xFFFFFFFF,0xF0000000, }, + { 0x00FFFFFF,0xFFFFFFFF,0x00000000, }, + { 0x0FFFFFFF,0xFFFFFFF0,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xFFFFF000, }, + { 0x0000000F,0xFFFFFFFF,0xFFFF0000, }, + { 0x000000FF,0xFFFFFFFF,0xFFF00000, }, + { 0x00000FFF,0xFFFFFFFF,0xFF000000, }, + { 0x0000FFFF,0xFFFFFFFF,0xF0000000, }, + { 0x000FFFFF,0xFFFFFFFF,0x00000000, }, + { 0x00FFFFFF,0xFFFFFFF0,0x00000000, }, + { 0x0FFFFFFF,0xFFFFFF00,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xFFFF0000, }, + { 0x0000000F,0xFFFFFFFF,0xFFF00000, }, + { 0x000000FF,0xFFFFFFFF,0xFF000000, }, + { 0x00000FFF,0xFFFFFFFF,0xF0000000, }, + { 0x0000FFFF,0xFFFFFFFF,0x00000000, }, + { 0x000FFFFF,0xFFFFFFF0,0x00000000, }, + { 0x00FFFFFF,0xFFFFFF00,0x00000000, }, + { 0x0FFFFFFF,0xFFFFF000,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xFFF00000, }, + { 0x0000000F,0xFFFFFFFF,0xFF000000, }, + { 0x000000FF,0xFFFFFFFF,0xF0000000, }, + { 0x00000FFF,0xFFFFFFFF,0x00000000, }, + { 0x0000FFFF,0xFFFFFFF0,0x00000000, }, + { 0x000FFFFF,0xFFFFFF00,0x00000000, }, + { 0x00FFFFFF,0xFFFFF000,0x00000000, }, + { 0x0FFFFFFF,0xFFFF0000,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xFF000000, }, + { 0x0000000F,0xFFFFFFFF,0xF0000000, }, + { 0x000000FF,0xFFFFFFFF,0x00000000, }, + { 0x00000FFF,0xFFFFFFF0,0x00000000, }, + { 0x0000FFFF,0xFFFFFF00,0x00000000, }, + { 0x000FFFFF,0xFFFFF000,0x00000000, }, + { 0x00FFFFFF,0xFFFF0000,0x00000000, }, + { 0x0FFFFFFF,0xFFF00000,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xF0000000, }, + { 0x0000000F,0xFFFFFFFF,0x00000000, }, + { 0x000000FF,0xFFFFFFF0,0x00000000, }, + { 0x00000FFF,0xFFFFFF00,0x00000000, }, + { 0x0000FFFF,0xFFFFF000,0x00000000, }, + { 0x000FFFFF,0xFFFF0000,0x00000000, }, + { 0x00FFFFFF,0xFFF00000,0x00000000, }, + { 0x0FFFFFFF,0xFF000000,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0x00000000, }, + { 0x0000000F,0xFFFFFFF0,0x00000000, }, + { 0x000000FF,0xFFFFFF00,0x00000000, }, + { 0x00000FFF,0xFFFFF000,0x00000000, }, + { 0x0000FFFF,0xFFFF0000,0x00000000, }, + { 0x000FFFFF,0xFFF00000,0x00000000, }, + { 0x00FFFFFF,0xFF000000,0x00000000, }, + { 0x0FFFFFFF,0xF0000000,0x00000000, }, + }, +}; + +static const struct ShiftAmount sGlyphShiftAmounts[8] = +{ + { 0, 32 }, + { 4, 28 }, + { 8, 24 }, + { 12, 20 }, + { 16, 16 }, + { 20, 12 }, + { 24, 8 }, + { 28, 4 }, +}; + +typedef void (*PrintGlyphFunc)(struct Window *, u32); + +static const PrintGlyphFunc sPrintGlyphFuncs[] = +{ + PrintGlyph_TextMode0, + PrintGlyph_TextMode1, + PrintGlyph_TextMode2, +}; + +typedef void (*WriteGlyphTilemapFunc)(struct Window *, u32); + +static const WriteGlyphTilemapFunc sWriteGlyphTilemapFuncs[] = +{ + WriteGlyphTilemap_Font0_Font3, + WriteGlyphTilemap_Font1_Font4, + WriteGlyphTilemap_Font2_Font5, + WriteGlyphTilemap_Font0_Font3, + WriteGlyphTilemap_Font1_Font4, + WriteGlyphTilemap_Font2_Font5, + WriteGlyphTilemap_Font6, +}; + +static const struct Window sDefaultWindow = { .language = GAME_LANGUAGE }; + +typedef u8 (*ExtCtrlCodeFunc)(struct Window *); + +static const ExtCtrlCodeFunc sExtCtrlCodeFuncs[] = +{ + ExtCtrlCode_Nop, + ExtCtrlCode_ForegroundColor, + ExtCtrlCode_BackgroundColor, + ExtCtrlCode_ShadowColor, + ExtCtrlCode_AllColors, + ExtCtrlCode_Palette, + ExtCtrlCode_Font, + ExtCtrlCode_DefaultFont, + ExtCtrlCode_Pause, + ExtCtrlCode_WaitButton, + ExtCtrlCode_WaitSound, + ExtCtrlCode_PlayBGM, + ExtCtrlCode_Escape, + ExtCtrlCode_Nop2, + ExtCtrlCode_SetCursorY, + ExtCtrlCode_ClearWindowTextLines, + ExtCtrlCode_PlaySE, + ExtCtrlCode_Skip, + ExtCtrlCode_SetCursorX, + ExtCtrlCode_SkipTo, + ExtCtrlCode_Spacing, + ExtCtrlCode_Japanese, + ExtCtrlCode_Latin, +}; + +extern const u32 gFont3LatinGlyphs[]; +extern const u32 gFont4LatinGlyphs[]; +extern const u32 gFont3JapaneseGlyphs[]; +extern const u32 gFont4JapaneseGlyphs[]; + +static const struct Font sFonts[] = +{ + // Japanese fonts + { 0, (u8 *)sFont0JapaneseGlyphs, 16, 8 }, + { 1, (u8 *)sFont1JapaneseGlyphs, 8, 0 }, + { 2, (u8 *)sFont1JapaneseGlyphs, 8, 0 }, + { 4, (u8 *)gFont3JapaneseGlyphs, 64, 512 }, + { 1, (u8 *)gFont4JapaneseGlyphs, 32, 0 }, + { 2, (u8 *)gFont4JapaneseGlyphs, 32, 0 }, + { 3, (u8 *)sBrailleGlyphs, 8, 0 }, + // Latin + { 0, (u8 *)sFont0LatinGlyphs, 16, 8 }, + { 1, (u8 *)sFont1LatinGlyphs, 8, 0 }, + { 2, (u8 *)sFont1LatinGlyphs, 8, 0 }, + { 0, (u8 *)gFont3LatinGlyphs, 64, 32 }, + { 1, (u8 *)gFont4LatinGlyphs, 32, 0 }, + { 2, (u8 *)gFont4LatinGlyphs, 32, 0 }, + { 3, (u8 *)sBrailleGlyphs, 8, 0 }, +}; + +static const u8 sTextSpeedDelays[] = { 6, 3, 1 }; // slow, mid, fast + +static const u8 sExtCtrlCodeLengths[] = +{ + 1, + 2, + 2, + 2, + 4, + 2, + 2, + 1, + 2, + 1, + 1, + 3, + 2, + 2, + 2, + 1, + 3, + 2, + 2, + 2, + 2, + 1, + 1, +}; + +typedef void (*ShiftGlyphTileUnshadowedFunc)(struct GlyphBuffer *, u8 *, u32 *, u8); + +static const ShiftGlyphTileUnshadowedFunc sShiftGlyphTileUnshadowedFuncs[] = +{ + ShiftGlyphTile_UnshadowedFont_Width0, + ShiftGlyphTile_UnshadowedFont_Width1, + ShiftGlyphTile_UnshadowedFont_Width2, + ShiftGlyphTile_UnshadowedFont_Width3, + ShiftGlyphTile_UnshadowedFont_Width4, + ShiftGlyphTile_UnshadowedFont_Width5, + ShiftGlyphTile_UnshadowedFont_Width6, + ShiftGlyphTile_UnshadowedFont_Width7, + ShiftGlyphTile_UnshadowedFont_Width8, +}; + +typedef void (*ShiftGlyphTileShadowedFunc)(struct GlyphBuffer *, u32 *, u32 *, u8); + +static const ShiftGlyphTileShadowedFunc sShiftGlyphTileShadowedFuncs[] = +{ + ShiftGlyphTile_ShadowedFont_Width0, + ShiftGlyphTile_ShadowedFont_Width1, + ShiftGlyphTile_ShadowedFont_Width2, + ShiftGlyphTile_ShadowedFont_Width3, + ShiftGlyphTile_ShadowedFont_Width4, + ShiftGlyphTile_ShadowedFont_Width5, + ShiftGlyphTile_ShadowedFont_Width6, + ShiftGlyphTile_ShadowedFont_Width7, + ShiftGlyphTile_ShadowedFont_Width8, +}; + +const struct WindowConfig gWindowConfig_81E6C3C = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 0, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6C58 = +{ + 0, // BG number + 0, // BG character base block + 24, // BG screen base block + 0, // BG priority + 0, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 26, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(24), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6C74 = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 1, // foreground color + 0, // background color + 3, // shadow color + 4, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)OBJ_VRAM0, // tile data + NULL, // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6C90 = +{ + 0, // BG number + 1, // BG character base block + 30, // BG screen base block + 2, // BG priority + 31, // palette number + 15, // foreground color + 0, // background color + 1, // shadow color + 4, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(1), // tile data + (u16 *)BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6CAC = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 15, // foreground color + 0, // background color + 1, // shadow color + 4, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 8, // width + 60, // height + gTileBuffer, // tile data + NULL, // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6CC8 = +{ + 2, // BG number + 2, // BG character base block + 15, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(15), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6CE4 = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6D00 = +{ + 0, // BG number + 0, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 2, // foreground color + 15, // background color + 3, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6D1C = +{ + 1, // BG number + 0, // BG character base block + 31, // BG screen base block + 1, // BG priority + 15, // palette number + 2, // foreground color + 15, // background color + 3, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6D38 = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 15, // foreground color + 0, // background color + 14, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 8, // width + 64, // height + gTileBuffer, // tile data + NULL, // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6D54 = +{ + 3, // BG number + 3, // BG character base block + 15, // BG screen base block + 3, // BG priority + 2, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(3), // tile data + (u16 *)BG_SCREEN_ADDR(15), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6D70 = +{ + 3, // BG number + 3, // BG character base block + 15, // BG screen base block + 3, // BG priority + 3, // palette number + 1, // foreground color + 3, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(3), // tile data + (u16 *)BG_SCREEN_ADDR(15), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6D8C = +{ + 1, // BG number + 0, // BG character base block + 14, // BG screen base block + 1, // BG priority + 0, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(14), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6DA8 = +{ + 0, // BG number + 0, // BG character base block + 12, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(11), // tilemap +}; + +const struct WindowConfig WindowConfig_TrainerCard_Back_Values = +{ + 0, // BG number + 2, // BG character base block + 30, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowConfig WindowConfig_TrainerCard_Back_Labels = +{ + 0, // BG number + 2, // BG character base block + 30, // BG screen base block + 0, // BG priority + 14, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6DFC = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6E18 = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 1, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6E34 = +{ + 1, // BG number + 0, // BG character base block + 31, // BG screen base block + 1, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6E50 = +{ + 0, // BG number + 2, // BG character base block + 28, // BG screen base block + 0, // BG priority + 13, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(28), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6E6C = +{ + 0, // BG number + 2, // BG character base block + 30, // BG screen base block + 0, // BG priority + 13, // palette number + 15, // foreground color + 0, // background color + 10, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6E88 = +{ + 0, // BG number + 0, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6EA4 = +{ + 1, // BG number + 0, // BG character base block + 28, // BG screen base block + 1, // BG priority + 1, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 8, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(28), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6EC0 = +{ + 2, // BG number + 2, // BG character base block + 29, // BG screen base block + 2, // BG priority + 1, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 8, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(29), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6EDC = +{ + 1, // BG number + 0, // BG character base block + 28, // BG screen base block + 1, // BG priority + 2, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 8, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(28), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6EF8 = +{ + 2, // BG number + 2, // BG character base block + 29, // BG screen base block + 2, // BG priority + 2, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 8, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(29), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6F14 = +{ + 1, // BG number + 0, // BG character base block + 28, // BG screen base block + 1, // BG priority + 3, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 8, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(28), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6F30 = +{ + 2, // BG number + 2, // BG character base block + 29, // BG screen base block + 2, // BG priority + 3, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 8, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(29), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6F4C = +{ + 3, // BG number + 0, // BG character base block + 30, // BG screen base block + 3, // BG priority + 0, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6F68 = +{ + 0, // BG number + 2, // BG character base block + 13, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(13), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6F84 = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 15, // foreground color + 0, // background color + 1, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6FA0 = +{ + 1, // BG number + 0, // BG character base block + 24, // BG screen base block + 3, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(24), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6FBC = +{ + 0, // BG number + 0, // BG character base block + 30, // BG screen base block + 0, // BG priority + 15, // palette number + 15, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6FD8 = +{ + 0, // BG number + 0, // BG character base block + 24, // BG screen base block + 0, // BG priority + 15, // palette number + 15, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(24), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E6FF4 = +{ + 0, // BG number + 0, // BG character base block + 24, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(24), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7010 = +{ + 0, // BG number + 0, // BG character base block + 30, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E702C = +{ + 3, // BG number + 2, // BG character base block + 15, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(15), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7048 = +{ + 2, // BG number + 2, // BG character base block + 14, // BG screen base block + 2, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 16, // tilemap left coordinate + 0, // tilemap top coordinate + 16, // width + 32, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(14), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7064 = +{ + 2, // BG number + 2, // BG character base block + 14, // BG screen base block + 2, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(14), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7080 = +{ + 3, // BG number + 0, // BG character base block + 30, // BG screen base block + 3, // BG priority + 11, // palette number + 1, // foreground color + 15, // background color + 5, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E709C = +{ + 0, // BG number + 0, // BG character base block + 31, // BG screen base block + 1, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E70B8 = +{ + 2, // BG number + 0, // BG character base block + 30, // BG screen base block + 2, // BG priority + 11, // palette number + 1, // foreground color + 0, // background color + 5, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E70D4 = +{ + 3, // BG number + 0, // BG character base block + 30, // BG screen base block + 3, // BG priority + 11, // palette number + 1, // foreground color + 15, // background color + 5, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E70F0 = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 15, // foreground color + 1, // background color + 14, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 32, // width + 32, // height + gTileBuffer, // tile data + NULL, // tilemap +}; + +const struct WindowConfig gWindowConfig_81E710C = +{ + 0, // BG number + 0, // BG character base block + 31, // BG screen base block + 1, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7128 = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7144 = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 0, // BG priority + 13, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7160 = +{ + 1, // BG number + 1, // BG character base block + 10, // BG screen base block + 1, // BG priority + 14, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(1), // tile data + (u16 *)BG_SCREEN_ADDR(10), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E717C = +{ + 0, // BG number + 3, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 15, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(3), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7198 = +{ + 0, // BG number + 2, // BG character base block + 15, // BG screen base block + 0, // BG priority + 15, // palette number + 15, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(15), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E71B4 = +{ + 0, // BG number + 2, // BG character base block + 15, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(15), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E71D0 = +{ + 1, // BG number + 1, // BG character base block + 28, // BG screen base block + 0, // BG priority + 5, // palette number + 13, // foreground color + 14, // background color + 15, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(1), // tile data + (u16 *)BG_SCREEN_ADDR(28), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E71EC = +{ + 2, // BG number + 1, // BG character base block + 30, // BG screen base block + 0, // BG priority + 5, // palette number + 13, // foreground color + 14, // background color + 15, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(1), // tile data + (u16 *)BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7208 = +{ + 0, // BG number + 2, // BG character base block + 28, // BG screen base block + 0, // BG priority + 8, // palette number + 1, // foreground color + 0, // background color + 2, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(28), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7224 = +{ + 0, // BG number + 0, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(0), // tile data + (u16 *)BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7240 = +{ + 1, // BG number + 2, // BG character base block + 30, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)BG_CHAR_ADDR(2), // tile data + (u16 *)BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowConfig gWindowConfig_81E725C = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 15, // foreground color + 0, // background color + 14, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + (u8 *)OBJ_VRAM0, // tile data + NULL, // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7278 = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 16, // width + 32, // height + gTileBuffer, // tile data + NULL, // tilemap +}; + +const struct WindowConfig gWindowConfig_81E7294 = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 4, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 16, // width + 32, // height + gTileBuffer, // tile data + NULL, // tilemap +}; + +static void UpdateBGRegs(const struct WindowConfig *winConfig) +{ + u8 bgNum = winConfig->bgNum; + *gBGHOffsetRegs[bgNum] = 0; + *gBGVOffsetRegs[bgNum] = 0; + *gBGControlRegs[bgNum] = winConfig->priority | (winConfig->screenBaseBlock << 8) | (winConfig->charBaseBlock << 2); +} + +static void ClearBGMem(const struct WindowConfig *winConfig) +{ + CpuFastFill(0, winConfig->tileData, 32); + + if (winConfig->tilemap) + CpuFastFill(0, winConfig->tilemap, 0x800); +} + +void LoadFontDefaultPalette(const struct WindowConfig *winConfig) +{ + LoadPalette(gFontDefaultPalette, 16 * winConfig->paletteNum, 32); +} + +void SetUpWindowConfig(const struct WindowConfig *winConfig) +{ + UpdateBGRegs(winConfig); + ClearBGMem(winConfig); + LoadFontDefaultPalette(winConfig); +} + +u16 InitWindowTileData(struct Window *win, u16 startOffset) +{ + u16 retVal; + + win->tileDataStartOffset = startOffset; + retVal = 0; + + switch (win->config->textMode) + { + case 2: + retVal = InitVariableWidthFontTileData(win, startOffset); + break; + case 1: + switch (win->config->fontNum) + { + case 0: + case 3: + retVal = LoadFixedWidthFont(win, startOffset); + break; + case 1: + case 2: + retVal = LoadFixedWidthFont_Font1Latin(win, startOffset); + break; + case 4: + case 5: + retVal = LoadFixedWidthFont_Font4Latin(win, startOffset); + break; + case 6: + retVal = LoadFixedWidthFont_Braille(win, startOffset); + break; + } + break; + } + + return retVal; +} + +static u16 InitVariableWidthFontTileData(struct Window *win, u16 startOffset) +{ + u8 *buffer; + + win->tileDataStartOffset = startOffset; + win->tileDataOffset = 2; + buffer = win->tileData + 32 * win->tileDataStartOffset; + CpuFastFill(0, buffer, 32); + ApplyColors_UnshadowedFont(sBlankTile, (u32 *)(buffer + 32), win->config->foregroundColor, win->config->backgroundColor); + return win->tileDataStartOffset + win->tileDataOffset + win->width * win->height; +} + +static u16 LoadFixedWidthFont(struct Window *win, u16 startOffset) +{ + s32 glyph; + u8 *buffer = win->tileData + 32 * startOffset; + for (glyph = 0; glyph < 256; glyph++) + { + LoadFixedWidthGlyph(win, glyph, buffer); + buffer += 64; + } + return 2 * glyph; +} + +static u16 LoadFixedWidthFont_Font1Latin(struct Window *win, u16 startOffset) +{ + s32 i; + u8 *buffer = win->tileData + 32 * startOffset; + for (i = 0; i < 256; i++) + { + ApplyColors_UnshadowedFont(&sFont1LatinGlyphs[8 * i], (u32 *)buffer, win->foregroundColor, win->backgroundColor); + buffer += 32; + } + return i; +} + +static u16 LoadFixedWidthFont_Font4Latin(struct Window *win, u16 startOffset) +{ + s32 i; + u8 *buffer = win->tileData + 32 * startOffset; + for (i = 0; i < 256; i++) + { + ApplyColors_ShadowedFont(&gFont4LatinGlyphs[8 * i], buffer, win->foregroundColor, win->shadowColor, win->backgroundColor); + buffer += 32; + } + return i; +} + +static u16 LoadFixedWidthFont_Braille(struct Window *win, u16 startOffset) +{ + s32 i; + u8 *buffer = win->tileData + 32 * startOffset; + for (i = 0; i < 256; i++) + { + ApplyColors_UnshadowedFont(&sBrailleGlyphs[8 * i], (u32 *)buffer, win->foregroundColor, win->backgroundColor); + buffer += 32; + } + return i; +} + +u32 MultistepInitWindowTileData(struct Window *win, u16 startOffset) +{ + u32 retVal; + sMultistepLoadFont_Window = win; + sMultistepLoadFont_Index = 0; + sMultistepLoadFont_StartOffset = startOffset; + win->tileDataStartOffset = startOffset; + retVal = 0; + + switch (win->config->textMode) + { + case 2: + retVal = InitVariableWidthFontTileData(win, startOffset); + break; + case 1: + retVal = 256; + if (win->config->fontNum == 0 + || win->config->fontNum == 3) + retVal *= 2; + break; + } + + return retVal; +} + +bool32 MultistepLoadFont(void) +{ + bool32 retVal = TRUE; + + if (sMultistepLoadFont_Window->config->textMode == 1) + { + s32 i; + + for (i = sMultistepLoadFont_Index; i < sMultistepLoadFont_Index + 16; i++) + MultistepLoadFont_LoadGlyph(sMultistepLoadFont_Window, sMultistepLoadFont_StartOffset, i); + + sMultistepLoadFont_Index += 16; + + if (sMultistepLoadFont_Index < 256) + retVal = FALSE; + } + + return retVal; +} + +static void MultistepLoadFont_LoadGlyph(struct Window *win, u16 startOffset, u8 glyph) +{ + u8 *buffer; + + switch (win->config->fontNum) + { + case 0: + case 3: + buffer = win->tileData + 32 * startOffset + 64 * glyph; + LoadFixedWidthGlyph(win, glyph, buffer); + break; + case 1: + case 2: + buffer = win->tileData + 32 * (glyph + startOffset); + ApplyColors_UnshadowedFont( + &sFont1LatinGlyphs[8 * glyph], + (u32 *)buffer, + win->foregroundColor, + win->backgroundColor); + break; + case 4: + case 5: + buffer = win->tileData + 32 * (glyph + startOffset); + ApplyColors_ShadowedFont( + &gFont4LatinGlyphs[8 * glyph], + buffer, + win->foregroundColor, + win->shadowColor, + win->backgroundColor); + break; + } +} + +void EmptyFunc(void) +{ +} + +void InitWindowFromConfig(struct Window *win, const struct WindowConfig *winConfig) +{ + *win = sDefaultWindow; + win->config = (struct WindowConfig *)winConfig; + win->textMode = winConfig->textMode; + win->spacing = winConfig->spacing; + win->fontNum = winConfig->fontNum; + win->paletteNum = winConfig->paletteNum; + win->tilemapLeft = winConfig->tilemapLeft; + win->tilemapTop = winConfig->tilemapTop; + win->width = winConfig->width; + win->height = winConfig->height; + win->tileData = winConfig->tileData; + win->tilemap = winConfig->tilemap; + InitColors(win); + SetBackgroundColor(win, winConfig->backgroundColor); + SetShadowColor(win, winConfig->shadowColor); + SetForegroundColor(win, winConfig->foregroundColor); +} + +void InitWindow(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) +{ + struct WindowConfig *winConfig = win->config; + win->textMode = winConfig->textMode; + win->fontNum = winConfig->fontNum; + win->language = GAME_LANGUAGE; + win->paletteNum = winConfig->paletteNum; + win->win_field_B = 0; + win->win_field_C = 0; + win->delayCounter = 0; + win->spacing = winConfig->spacing; + win->win_field_F = 0; + win->tilemapLeft = winConfig->tilemapLeft; + win->tilemapTop = winConfig->tilemapTop; + win->width = winConfig->width; + win->height = winConfig->height; + win->text = text; + win->textIndex = 0; + win->tileDataStartOffset = tileDataStartOffset; + win->tileDataOffset = 0; + win->left = 8 * left; + win->cursorX = 0; + win->top = 8 * top; + win->cursorY = 0; + win->state = WIN_STATE_BEGIN; + win->downArrowCounter = 0; + win->tileData = winConfig->tileData; + win->tilemap = winConfig->tilemap; + InitColors(win); + SetBackgroundColor(win, winConfig->backgroundColor); + SetShadowColor(win, winConfig->shadowColor); + SetForegroundColor(win, winConfig->foregroundColor); +} + +void sub_8002E4C(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) +{ + u8 val; + + InitWindow(win, text, tileDataStartOffset, 0, 0); + win->left = left; + win->top = top; + val = 0; + if (a6) + val = 255; + win->win_field_F = val; + if (val) + ClipLeft(win); +} + +void sub_8002E90(struct Window *win, const u8 *text) +{ + win->state = WIN_STATE_NORMAL; + win->text = text; + win->textIndex = 0; + win->downArrowCounter = 0; + win->win_field_B = -1; + win->win_field_C = 0; + win->delayCounter = 0; +} + +void sub_8002EB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) +{ + gMain.watchedKeysMask = A_BUTTON | B_BUTTON; + gMain.watchedKeysPressed = 0; + sWaitType = 0; + sLineLength = 26; + InitWindow(win, text, tileDataStartOffset, left, top); + win->win_field_B = -1; + if (win->textMode == 0) + { + u16 val = GetCursorTileNum(win, 0, 0); + u8 *buffer = win->tileData + 32 * val; + ApplyColors_UnshadowedFont(sBlankTile, (u32 *)buffer, win->backgroundColor, win->backgroundColor); + ApplyColors_UnshadowedFont(&sFont1LatinGlyphs[8 * 0x6E], (u32 *)(buffer + 32), win->foregroundColor, win->backgroundColor); + win->tileDataOffset = 2; + } +} + +u8 sub_8002F44(struct Window *win) +{ + while (win->state) + { + if (win->state == WIN_STATE_NEWLINE) + { + AddToCursorY(win, 16); + win->cursorX = 0; + if (win->win_field_F) + ClipLeft(win); + win->state = WIN_STATE_NORMAL; + } + else if (win->state == WIN_STATE_PLACEHOLDER) + { + sub_8002FA0(win, GetExpandedPlaceholder(win->text[win->textIndex++])); + } + + InterpretText(win); + } + return 1; +} + +static u8 sub_8002FA0(struct Window *win, const u8 *text) +{ + u8 retVal; + u8 savedLanguage = win->language; + const u8 *savedText = win->text; + u16 savedTextIndex = win->textIndex; + win->text = text; + win->textIndex = 0; + win->state = WIN_STATE_NORMAL; + retVal = sub_8002F44(win); + win->text = savedText; + win->textIndex = savedTextIndex; + win->state = WIN_STATE_NORMAL; + win->language = savedLanguage; + return retVal; +} + +static u8 InterpretText(struct Window *win) +{ + u8 c = win->text[win->textIndex++]; + + switch (c) + { + case 0xFF: + ClipRight(win); + win->state = WIN_STATE_END; + return 0; + case 0xFD: + win->state = WIN_STATE_PLACEHOLDER; + return 2; + case 0xFE: + ClipRight(win); + win->state = WIN_STATE_NEWLINE; + return 2; + case 0xFB: + DrawInitialDownArrow(win); + win->state = WIN_STATE_PARAGRAPH; + return 2; + case 0xFA: + DrawInitialDownArrow(win); + win->state = WIN_STATE_NEWLINE_WAIT; + return 2; + case 0xFC: + return HandleExtCtrlCode(win); + } + + sPrintGlyphFuncs[win->textMode](win, c); + return 1; +} + +static u8 HandleExtCtrlCode(struct Window *win) +{ + return sExtCtrlCodeFuncs[win->text[win->textIndex++]](win); +} + +static u8 ExtCtrlCode_Nop(struct Window *win) +{ + return 2; +} + +static u8 ExtCtrlCode_ForegroundColor(struct Window *win) +{ + SetForegroundColor(win, win->text[win->textIndex++]); + return 2; +} + +static u8 ExtCtrlCode_BackgroundColor(struct Window *win) +{ + SetBackgroundColor(win, win->text[win->textIndex++]); + return 2; +} + +static u8 ExtCtrlCode_ShadowColor(struct Window *win) +{ + SetShadowColor(win, win->text[win->textIndex++]); + return 2; +} + +static u8 ExtCtrlCode_AllColors(struct Window *win) +{ + SetForegroundColor(win, win->text[win->textIndex++]); + SetBackgroundColor(win, win->text[win->textIndex++]); + SetShadowColor(win, win->text[win->textIndex++]); + return 2; +} + +static u8 ExtCtrlCode_Palette(struct Window *win) +{ + win->paletteNum = win->text[win->textIndex++]; + return 2; +} + +static u8 ExtCtrlCode_Font(struct Window *win) +{ + win->fontNum = win->text[win->textIndex++]; + return 2; +} + +static u8 ExtCtrlCode_DefaultFont(struct Window *win) +{ + win->fontNum = win->config->fontNum; + return 2; +} + +static u8 ExtCtrlCode_Pause(struct Window *win) +{ + ClipRight(win); + win->state = WIN_STATE_PAUSE; + win->delayCounter = win->text[win->textIndex++]; + return 2; +} + +static u8 ExtCtrlCode_WaitButton(struct Window *win) +{ + ClipRight(win); + win->state = WIN_STATE_WAIT_BUTTON; + return 2; +} + +static u8 ExtCtrlCode_WaitSound(struct Window *win) +{ + ClipRight(win); + win->state = WIN_STATE_WAIT_SOUND; + return 2; +} + +static u8 ExtCtrlCode_PlayBGM(struct Window *win) +{ + u16 loByte = win->text[win->textIndex++]; + u16 hiByte = win->text[win->textIndex++] << 8; + PlayBGM(loByte | hiByte); + return 2; +} + +static u8 ExtCtrlCode_Escape(struct Window *win) +{ + sPrintGlyphFuncs[win->textMode](win, win->text[win->textIndex++]); + return 1; +} + +u8 ExtCtrlCode_Nop2(struct Window *win) +{ + return 1; +} + +static u8 ExtCtrlCode_SetCursorY(struct Window *win) +{ + ClipRight(win); + AddToCursorY(win, 8 * win->text[win->textIndex++]); + return 1; +} + +static u8 ExtCtrlCode_ClearWindowTextLines(struct Window *win) +{ + ClearWindowTextLines(win); + return 2; +} + +static u8 ExtCtrlCode_PlaySE(struct Window *win) +{ + u16 loByte = win->text[win->textIndex++]; + u16 hiByte = win->text[win->textIndex++] << 8; + PlaySE(loByte | hiByte); + return 2; +} + +static void DrawSpace(struct Window *win) +{ + if (win->textMode == 1 || (win->left + win->cursorX) & 7 || win->spacing <= 7) + { + sPrintGlyphFuncs[win->textMode](win, 0); + } + else + { + u32 val = sGlyphBuffer.background; + u16 index = GetCursorTileNum(win, 0, 0); + u32 *buffer = (u32 *)(win->tileData + 32 * index); + buffer[0] = val; + buffer[1] = val; + buffer[2] = val; + buffer[3] = val; + buffer[4] = val; + buffer[5] = val; + buffer[6] = val; + buffer[7] = val; + index = GetCursorTileNum(win, 0, 1); + buffer = (u32 *)(win->tileData + 32 * index); + buffer[0] = val; + buffer[1] = val; + buffer[2] = val; + buffer[3] = val; + buffer[4] = val; + buffer[5] = val; + buffer[6] = val; + buffer[7] = val; + UpdateTilemap(win, 1); + AddToCursorX(win, 8); + } +} + +static void sub_8003344(struct Window *win, u8 newX) +{ + u8 savedSpacing = win->spacing; + + if (newX - win->cursorX <= 8) + win->spacing = newX - win->cursorX; + else + win->spacing = 8 - ((win->left + win->cursorX) & 7); + + while (win->cursorX < newX) + { + s32 spacing; + DrawSpace(win); + spacing = newX - win->cursorX; + if (spacing >= 8) + spacing = 8; + win->spacing = spacing; + } + + win->spacing = savedSpacing; +} + +static u8 ExtCtrlCode_Skip(struct Window *win) +{ + sub_8003344(win, win->cursorX + win->text[win->textIndex++]); + return 1; +} + +static u8 ExtCtrlCode_SetCursorX(struct Window *win) +{ + ClipRight(win); + SetCursorX(win, win->text[win->textIndex++]); + return 1; +} + +static u8 ExtCtrlCode_SkipTo(struct Window *win) +{ + sub_8003344(win, win->text[win->textIndex++]); + return 1; +} + +static u8 ExtCtrlCode_Spacing(struct Window *win) +{ + win->spacing = win->text[win->textIndex++]; + return 2; +} + +static u8 ExtCtrlCode_Japanese(struct Window *win) +{ + win->language = LANGUAGE_JAPANESE; + return 2; +} + +static u8 ExtCtrlCode_Latin(struct Window *win) +{ + win->language = GAME_LANGUAGE; + return 2; +} + +u8 sub_8003418(struct Window *win) +{ + u8 retVal = 1; + while (win->state) + { + if (win->state == WIN_STATE_NEWLINE) + { + AddToCursorY(win, 16); + win->cursorX = 0; + if (win->win_field_F) + ClipLeft(win); + win->state = WIN_STATE_NORMAL; + } + if (InterpretText(win) == 1) + { + retVal = 0; + break; + } + } + return retVal; +} + +u8 sub_8003460(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) +{ + InitWindow(win, text, tileDataStartOffset, left, top); + return sub_8002F44(win); +} + +u8 sub_8003490(struct Window *win, u8 c, u16 tileDataStartOffset, u8 left, u8 top) +{ + u8 retVal; + u8 text[2]; + text[0] = c; + text[1] = EOS; + InitWindow(win, text, tileDataStartOffset, left, top); + retVal = InterpretText(win); + ClipRight(win); + return retVal; +} + +void sub_80034D4(u8 *tileData, const u8 *text) +{ + sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6C74, tileData, text); +} + +u8 sub_80034EC(u8 *str) +{ + return GetStringWidthGivenWindowConfig((struct WindowConfig *)&gWindowConfig_81E6C74, str); +} + +u8 *sub_8003504(u8 *dest, s32 value, u8 alignAmount, u8 alignType) +{ + sTempWindow.config = (struct WindowConfig *)&gWindowConfig_81E6C74; + InitWindow(&sTempWindow, 0, 0, 0, 0); + return AlignInt2(&sTempWindow, dest, value, alignAmount, alignType); +} + +u8 *sub_8003558(u8 *dest, const u8 *src, u8 alignAmount, u8 alignType) +{ + sTempWindow.config = (struct WindowConfig *)&gWindowConfig_81E6C74; + InitWindow(&sTempWindow, src, 0, 0, 0); + return AlignString(&sTempWindow, dest, src, alignAmount, alignType); +} + +u8 sub_80035AC(struct Window *win) +{ + sWaitType = 0; + return UpdateWindowText(win); +} + +static u8 UpdateWindowText(struct Window *win) +{ + switch (win->state) + { + case WIN_STATE_WAIT_BUTTON: + if (PlayerCanInterruptWait(win)) + { + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PlaySE(SE_SELECT); + } + else + { + return 0; + } + } + else + { + win->delayCounter--; + if (win->delayCounter) + return 0; + } + win->state = WIN_STATE_NORMAL; + return 0; + case WIN_STATE_INTERRUPTIBLE_PAUSE: + if (PlayerCanInterruptWait(win) && (gMain.heldKeys & (A_BUTTON | B_BUTTON)) && gMain.watchedKeysPressed == TRUE) + { + win->delayCounter = 0; + win->state = WIN_STATE_NORMAL; + break; + } + case WIN_STATE_PAUSE: + if (win->delayCounter) + { + win->delayCounter--; + if (win->delayCounter) + return 0; + } + + win->state = WIN_STATE_NORMAL; + break; + case WIN_STATE_PARAGRAPH: + if (!WaitWithDownArrow(win)) + return 0; + ClearWindowTextLines(win); + win->state = WIN_STATE_NORMAL; + BLOCK_CROSS_JUMP + return 0; + case WIN_STATE_NEWLINE_WAIT: + if (!WaitWithDownArrow(win)) + return 0; + ScrollWindowTextLines(win); + win->state = WIN_STATE_NORMAL; + BLOCK_CROSS_JUMP + return 0; + case WIN_STATE_PLACEHOLDER: + win->textIndex++; + win->state = WIN_STATE_NORMAL; + break; + case WIN_STATE_NEWLINE: + ScrollWindowTextLines(win); + win->state = WIN_STATE_NORMAL; + BLOCK_CROSS_JUMP + return 0; + case WIN_STATE_BEGIN: + ClearWindowTextLines(win); + break; + case WIN_STATE_WAIT_SOUND: + if (IsSEPlaying()) + return 0; + win->state = WIN_STATE_NORMAL; + break; + case WIN_STATE_END: + return 1; + case WIN_STATE_NORMAL: + break; + default: + win->state = WIN_STATE_END; + return 1; + } + + InterpretText(win); + + switch (win->state) + { + case WIN_STATE_END: + return 1; + case WIN_STATE_WAIT_BUTTON: + case WIN_STATE_PARAGRAPH: + case WIN_STATE_NEWLINE_WAIT: + if (PlayerCanInterruptWait(win)) + return 0; + win->delayCounter = 60; + break; + case WIN_STATE_PAUSE: + case WIN_STATE_NEWLINE: + case WIN_STATE_WAIT_SOUND: + break; + default: + win->state = WIN_STATE_INTERRUPTIBLE_PAUSE; + win->delayCounter = GetTextDelay(win); + } + + return 0; +} + +#if defined(ENGLISH) +#define SUB_800374C_LINE_LENGTH 26 +#elif defined(GERMAN) +#define SUB_800374C_LINE_LENGTH 27 +#endif + +u8 sub_800374C(struct Window *win) +{ + u8 retVal; + + sWaitType = 1; + sLineLength = SUB_800374C_LINE_LENGTH; + retVal = UpdateWindowText(win); + sLineLength = 26; + sWaitType = 0; + return retVal; +} + +u8 sub_8003778(struct Window *win) +{ + u8 retVal; + + sWaitType = 2; + sLineLength = 26; + retVal = UpdateWindowText(win); + sWaitType = 0; + return retVal; +} + +u8 sub_80037A0(struct Window *win) +{ + u8 retVal; + + sWaitType = 3; + sLineLength = 17; + retVal = UpdateWindowText(win); + sLineLength = 26; + return retVal; +} + +u32 sub_80037C8(struct Window *win, u8 lineLength) +{ + u8 retVal; + + sWaitType = 0; + sLineLength = lineLength; + retVal = UpdateWindowText(win); + sLineLength = 26; + return retVal; +} + +static void PrintGlyph_TextMode0(struct Window *win, u32 glyph) +{ + AddToCursorX(win, DrawGlyph_TextMode0(win, glyph)); + if (win->win_field_B) + ClipRight(win); +} + +static u8 DrawGlyph_TextMode0(struct Window *win, u32 glyph) +{ + u8 pixelsWidth = GetGlyphWidth(win, glyph); + u32 tilesWidth = DrawGlyphTiles(win, glyph, pixelsWidth); + UpdateTilemap(win, tilesWidth); + return pixelsWidth; +} + +static void PrintGlyph_TextMode1(struct Window *win, u32 glyph) +{ + sWriteGlyphTilemapFuncs[win->fontNum](win, glyph); + win->cursorX += 8; +} + +static void WriteGlyphTilemap_Font0_Font3(struct Window *win, u32 glyph) +{ + s16 val = win->tileDataStartOffset + 2 * glyph; + WriteGlyphTilemap(win, val, val + 1); +} + +static void WriteGlyphTilemap_Font1_Font4(struct Window *win, u32 glyph) +{ + u32 val = glyph * 2; + WriteGlyphTilemap( + win, + win->tileDataStartOffset + sFontType1Map[val], + win->tileDataStartOffset + sFontType1Map[val + 1]); +} + +static void WriteGlyphTilemap_Font2_Font5(struct Window *win, u32 glyph) +{ + WriteGlyphTilemap( + win, + win->tileDataStartOffset + 212, + win->tileDataStartOffset + glyph); +} + +static void WriteGlyphTilemap_Font6(struct Window *win, u32 glyph) +{ + u32 val = glyph * 2; + WriteGlyphTilemap( + win, + win->tileDataStartOffset + sFontType3Map[val], + win->tileDataStartOffset + sFontType3Map[val + 1]); +} + +static void PrintGlyph_TextMode2(struct Window *win, u32 glyph) +{ + u8 width = GetGlyphWidth(win, glyph); + DrawGlyph_TextMode2(win, glyph); + AddToCursorX(win, width); + if (win->win_field_B) + ClipRight(win); +} + +static void DrawGlyph_TextMode2(struct Window *win, u32 glyph) +{ + u8 pixelsWidth = GetGlyphWidth(win, glyph); + u32 tilesWidth = DrawGlyphTiles(win, glyph, pixelsWidth); + UpdateTilemap(win, tilesWidth); +} + +static void LoadFixedWidthGlyph(struct Window *win, u32 glyph, u8 *dest) +{ + u8 *upperTile; + u8 *lowerTile; + + GetGlyphTilePointers(win->fontNum, win->language, glyph, &upperTile, &lowerTile); + + switch (win->fontNum) + { + case 0: + case 1: + case 2: + case 6: + ApplyColors_UnshadowedFont(upperTile, (u32 *)dest, win->foregroundColor, win->backgroundColor); + ApplyColors_UnshadowedFont(lowerTile, (u32 *)(dest + 32), win->foregroundColor, win->backgroundColor); + break; + case 3: + case 4: + case 5: + ApplyColors_ShadowedFont(upperTile, dest, win->foregroundColor, win->shadowColor, win->backgroundColor); + ApplyColors_ShadowedFont(lowerTile, dest + 32, win->foregroundColor, win->shadowColor, win->backgroundColor); + break; + } +} + +static void WriteGlyphTilemap(struct Window *win, u16 upperTileNum, u16 lowerTileNum) +{ + u16 *buffer = GetCursorTilemapPointer(win); + if (buffer) + { + u16 palette = (win->paletteNum << 12); + buffer[0] = upperTileNum | palette; + buffer[32] = lowerTileNum | palette; + } +} + +static void GetGlyphTilePointers(u8 fontNum, u8 language, u16 glyph, u8 **upperTilePtr, u8 **lowerTilePtr) +{ + u16 index; + const struct Font *font; + + if (language == LANGUAGE_JAPANESE) + language = 0; + else + language = 7; + + font = &sFonts[language + fontNum]; + + switch (font->type) + { + case 0: + *upperTilePtr = font->glyphs + glyph * font->glyphSize; + *lowerTilePtr = *upperTilePtr + font->lowerTileOffset; + break; + case 1: + index = 2 * glyph; + *upperTilePtr = font->glyphs + sFontType1Map[index] * font->glyphSize; + *lowerTilePtr = font->glyphs + sFontType1Map[index + 1] * font->glyphSize; + break; + case 2: + *upperTilePtr = font->glyphs + 212 * font->glyphSize; + *lowerTilePtr = font->glyphs + glyph * font->glyphSize; + break; + case 3: + index = 2 * glyph; + *upperTilePtr = font->glyphs + sFontType3Map[index] * font->glyphSize; + *lowerTilePtr = font->glyphs + sFontType3Map[index + 1] * font->glyphSize; + break; + case 4: + *upperTilePtr = font->glyphs + + (glyph & 0xFFF0) * font->glyphSize + + (((glyph &= 0xF) * font->glyphSize) >> 1); + *lowerTilePtr = *upperTilePtr + font->lowerTileOffset; + break; + } +} + +static u16 *GetCursorTilemapPointer(struct Window *win) +{ + u16 *ptr = NULL; + if (win->tilemap) + { + u8 x = ((win->left + win->cursorX) >> 3) + win->tilemapLeft; + u8 y = ((win->top + win->cursorY) >> 3) + win->tilemapTop; + ptr = &win->tilemap[(y * 32) + x]; + } + return ptr; +} + +static void ApplyColors_UnshadowedFont(const u8 *src, u32 *dest, u8 foreground, u8 background) +{ + u32 a[2]; + s32 i; + const u8 *srcRows = src; + + a[0] = background; + a[1] = foreground; + + for (i = 0; i < 8; i++) + { + u32 destRow = a[srcRows[i] & 1] + | (a[(srcRows[i] >> 1) & 1] << 4) + | (a[(srcRows[i] >> 2) & 1] << 8) + | (a[(srcRows[i] >> 3) & 1] << 12) + | (a[(srcRows[i] >> 4) & 1] << 16) + | (a[(srcRows[i] >> 5) & 1] << 20) + | (a[(srcRows[i] >> 6) & 1] << 24) + | (a[(srcRows[i] >> 7) ] << 28); + dest[i] = destRow; + } +} + +static void ApplyColors_ShadowedFont(const void *src, void *dest, u8 foreground, u8 shadow, u8 background) +{ + u32 a[0x10]; + s32 i; + const u32 *curSrc; + u32 *curDest; + u32 colorMask; + + a[0x1] = 0x1; + a[0x2] = 0x2; + a[0x3] = 0x3; + a[0x4] = 0x4; + a[0x5] = 0x5; + a[0x6] = 0x6; + a[0x7] = 0x7; + a[0x8] = 0x8; + a[0x9] = 0x9; + a[0xA] = 0xA; + a[0xB] = 0xB; + a[0xC] = 0xC; + a[0xD] = 0xD; + a[0x0] = background; + a[0xE] = shadow; + a[0xF] = foreground; + + colorMask = 0xF; + + curSrc = src; + curDest = dest; + + for (i = 7; i >= 0; i--) + { + u32 row = *curSrc++; + u32 recoloredRow = a[row & colorMask] + | (a[(row >> 4) & colorMask] << 4) + | (a[(row >> 8) & colorMask] << 8) + | (a[(row >> 12) & colorMask] << 12) + | (a[(row >> 16) & colorMask] << 16) + | (a[(row >> 20) & colorMask] << 20) + | (a[(row >> 24) & colorMask] << 24) + | (a[(row >> 28) ] << 28); + *curDest++ = recoloredRow; + } +} + +static void SetCursorX(struct Window *win, u8 x) +{ + if (win->textMode == 0 && ((win->left + win->cursorX) & 7)) + win->tileDataOffset += 2; + win->cursorX = x; +} + +static void AddToCursorX(struct Window *win, u8 deltaX) +{ + if (win->textMode == 0) + { + u8 x = win->cursorX; + win->cursorX += deltaX; + if (((win->left + win->cursorX) & 0xF8) != ((win->left + x) & 0xF8)) + win->tileDataOffset += 2; + } + else + { + win->cursorX += deltaX; + } +} + +static void AddToCursorY(struct Window *win, u8 deltaY) +{ + if (win->textMode == 0 && ((win->left + win->cursorX) & 7)) + win->tileDataOffset += 2; + win->cursorY += deltaY; +} + +static void EraseAtCursor(struct Window *win) +{ + switch (win->textMode) + { + case 0: + case 2: + DrawGlyphTiles(win, 0, 8); + break; + case 1: + sWriteGlyphTilemapFuncs[win->fontNum](win, 0); + break; + } +} + +static void ClipLeft(struct Window *win) +{ + u32 pixel = win->left & 7; + if (win->textMode != 1 && pixel) + { + const u32 *masks = sGlyphMasks[8][pixel]; + u32 outsideMask = masks[0]; + u32 insideMask = ~outsideMask; + u32 outside = sGlyphBuffer.background & outsideMask; + u16 tileNum = GetCursorTileNum(win, 0, 0); + u32 *buffer = (u32 *)(win->tileData + 32 * tileNum); + buffer[0] = (buffer[0] & insideMask) | outside; + buffer[1] = (buffer[1] & insideMask) | outside; + buffer[2] = (buffer[2] & insideMask) | outside; + buffer[3] = (buffer[3] & insideMask) | outside; + buffer[4] = (buffer[4] & insideMask) | outside; + buffer[5] = (buffer[5] & insideMask) | outside; + buffer[6] = (buffer[6] & insideMask) | outside; + buffer[7] = (buffer[7] & insideMask) | outside; + tileNum = GetCursorTileNum(win, 0, 1); + buffer = (u32 *)(win->tileData + 32 * tileNum); + buffer[0] = (buffer[0] & insideMask) | outside; + buffer[1] = (buffer[1] & insideMask) | outside; + buffer[2] = (buffer[2] & insideMask) | outside; + buffer[3] = (buffer[3] & insideMask) | outside; + buffer[4] = (buffer[4] & insideMask) | outside; + buffer[5] = (buffer[5] & insideMask) | outside; + buffer[6] = (buffer[6] & insideMask) | outside; + buffer[7] = (buffer[7] & insideMask) | outside; + } +} + +static void ClipRight(struct Window *win) +{ + register u8 cursorX asm("r0") = win->cursorX; + u8 left = win->left; + u32 pixel = (cursorX + left) & 7; + if (win->textMode != 1 && pixel) + { + const u32 *masks = sGlyphMasks[8 - pixel][pixel]; + u32 insideMask = masks[0]; + u32 outside = (sGlyphBuffer.background & ~insideMask); + u16 tileNum = GetCursorTileNum(win, 0, 0); + u32 *buffer = (u32 *)(win->tileData + 32 * tileNum); + buffer[0] = (buffer[0] & insideMask) | outside; + buffer[1] = (buffer[1] & insideMask) | outside; + buffer[2] = (buffer[2] & insideMask) | outside; + buffer[3] = (buffer[3] & insideMask) | outside; + buffer[4] = (buffer[4] & insideMask) | outside; + buffer[5] = (buffer[5] & insideMask) | outside; + buffer[6] = (buffer[6] & insideMask) | outside; + buffer[7] = (buffer[7] & insideMask) | outside; + tileNum = GetCursorTileNum(win, 0, 1); + buffer = (u32 *)(win->tileData + 32 * tileNum); + buffer[0] = (buffer[0] & insideMask) | outside; + buffer[1] = (buffer[1] & insideMask) | outside; + buffer[2] = (buffer[2] & insideMask) | outside; + buffer[3] = (buffer[3] & insideMask) | outside; + buffer[4] = (buffer[4] & insideMask) | outside; + buffer[5] = (buffer[5] & insideMask) | outside; + buffer[6] = (buffer[6] & insideMask) | outside; + buffer[7] = (buffer[7] & insideMask) | outside; + UpdateTilemap(win, 1); + } +} + +static void InitColors(struct Window *win) +{ + u32 i; + + win->backgroundColor = 0; + win->shadowColor = 14; + win->foregroundColor = 15; + + for (i = 0; i < 16; i++) + sGlyphBuffer.colors[i] = i; +} + +static void SetBackgroundColor(struct Window *win, u8 color) +{ + u32 val1; + u32 val2; + u32 val3; + win->backgroundColor = color; + sGlyphBuffer.colors[0] = color; + val1 = color | (color << 4); + val2 = val1 | (val1 << 8); + val3 = val2 | (val2 << 16); + sGlyphBuffer.background = val3; +} + +static void SetShadowColor(struct Window *win, u8 color) +{ + win->shadowColor = color; + sGlyphBuffer.colors[14] = color; +} + +static void SetForegroundColor(struct Window *win, u8 color) +{ + win->foregroundColor = color; + sGlyphBuffer.colors[15] = color; +} + +static u8 GetTextDelay(struct Window *win) +{ + if (!PlayerCanInterruptWait(win)) + return 3; + + return sTextSpeedDelays[gSaveBlock2.optionsTextSpeed]; +} + +static bool8 PlayerCanInterruptWait(struct Window *win) +{ + bool8 retVal = TRUE; + + switch (sWaitType) + { + case 2: + retVal = FALSE; + break; + case 3: + retVal = gIsLinkContest ? FALSE : TRUE; + break; + case 1: + retVal = (gBattleTypeFlags & BATTLE_TYPE_LINK) ? FALSE : TRUE; + break; + } + + return retVal; +} + +static void ScrollWindowTextLines(struct Window *win) +{ + switch (win->textMode) + { + case 0: + ScrollWindowTextLines_TextMode0(win); + break; + case 1: + ScrollWindowTextLines_TextMode1(win); + break; + case 2: + ScrollWindowTextLines_TextMode2(win); + break; + } +} + +static void ScrollWindowTextLines_TextMode0(struct Window *win) +{ + if (win->cursorY == 0) + { + win->tileDataOffset = 2 * sLineLength + 2; + win->cursorX = 0; + win->cursorY += 16; + } + else + { + if (win->win_field_C & 2) + win->tileDataOffset = 2 * sLineLength + 2; + else + win->tileDataOffset = 2; + win->win_field_C = win->win_field_C ^ 2; + win->cursorX = 0; + DoScroll_TextMode0(win, sLineLength); + } +} + +static void DoScroll_TextMode0(struct Window *win, u16 lineLength) +{ + u16 *buffer = win->tilemap; + u32 val1 = 32 * (win->top >> 3); + u32 val2 = (win->left >> 3); + u16 fill; + buffer += val1 + val2; + fill = (win->paletteNum << 12) | GetBlankTileNum(win); + CpuCopy16(buffer + 64, buffer, lineLength * 2); + CpuCopy16(buffer + 96, buffer + 32, lineLength * 2); + CpuFill16(fill, buffer + 64, lineLength * 2); + CpuFill16(fill, buffer + 96, lineLength * 2); +} + +static void ScrollWindowTextLines_TextMode1(struct Window *win) +{ + if (win->cursorY == 0) + { + win->cursorX = 0; + win->cursorY += 16; + } + else + { + win->win_field_C ^= 2; + win->cursorX = 0; + DoScroll_TextMode1(win, sLineLength); + } +} + +static void DoScroll_TextMode1(struct Window *win, u16 lineLength) +{ + u16 *buffer = GetCursorTilemapPointer(win); + u16 *dest = buffer - 32; + u16 fill = (win->paletteNum << 12) | GetBlankTileNum(win); + CpuCopy16(buffer + 32, dest, lineLength * 2); + CpuCopy16(buffer + 64, buffer, lineLength * 2); + CpuFill16(fill, buffer + 32, lineLength * 2); + CpuFill16(fill, buffer + 64, lineLength * 2); +} + +static void ScrollWindowTextLines_TextMode2(struct Window *win) +{ + if (win->cursorY == 0) + { + win->cursorX = 0; + win->cursorY += 16; + } + else + { + win->win_field_C ^= 2; + win->cursorX = 0; + DoScroll_TextMode2(win, sLineLength); + } +} + +static void DoScroll_TextMode2(struct Window *win, u8 lineLength) +{ + u8 i; + u8 *buf1 = win->tileData + 32 * GetCursorTileNum(win, 0, -2); + u8 *buf2 = win->tileData + 32 * GetCursorTileNum(win, 0, 0); + u8 *buf4; + u16 *buf3; + u16 a[4]; + + CpuFastCopy(buf2, buf1, 32 * lineLength); + CpuFastFill(sGlyphBuffer.background, buf2, 32 * lineLength); + buf4 = buf2 + 32 * win->width; + CpuFastCopy(buf4, buf1 + 32 * win->width, 32 * lineLength); + CpuFastFill(sGlyphBuffer.background, buf4, 32 * lineLength); + + buf3 = GetCursorTilemapPointer(win) - 64; + + a[0] = (win->tileDataStartOffset + win->tileDataOffset + + ((win->top >> 3) * win->width) + + (win->left >> 3)) + | (win->paletteNum << 12); + a[1] = a[0] + win->width; + a[2] = a[1] + win->width; + a[3] = a[2] + win->width; + + for (i = 0; i < lineLength; i++) + { + buf3[0] = a[0]++; + buf3[32] = a[1]++; + buf3[64] = a[2]++; + buf3[96] = a[3]++; + buf3++; + } +} + +void ClearWindowTextLines(struct Window *win) +{ + switch (win->textMode) + { + case 0: + ClearWindowTextLines_TextMode0_TextMode1(win, sLineLength); + win->tileDataOffset = 2; + break; + case 1: + ClearWindowTextLines_TextMode0_TextMode1(win, sLineLength); + break; + case 2: + ClearWindowTextLines_TextMode2(win, sLineLength); + break; + } +} + +static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *win, u8 lineLength) +{ + u8 i; + u16 *buffer; + u16 fill; + + win->cursorX = 0; + win->cursorY = 0; + win->win_field_C = 0; + + buffer = GetCursorTilemapPointer(win); + fill = GetBlankTileNum(win) | (win->paletteNum << 12); + + for (i = 0; i < 4; i++) + { + u8 j; + for (j = 0; j < lineLength; j++) + buffer[j] = fill; + buffer += 32; + } +} + +static void ClearWindowTextLines_TextMode2(struct Window *win, u8 lineLength) +{ + u8 *buffer; + + win->cursorX = 0; + win->cursorY = 0; + win->win_field_C = 0; + + buffer = win->tileData + 32 * GetCursorTileNum(win, 0, 0); + CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); + buffer += 32 * win->width; + CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); + buffer += 32 * win->width; + CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); + buffer += 32 * win->width; + CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); +} + +static void DrawDownArrow(struct Window *win) +{ + if (PlayerCanInterruptWait(win)) + { + const u32 *downArrowTiles = &sDownArrowTiles[((win->downArrowCounter & 0x0F00) >> 8) * 16]; + + switch (win->textMode) + { + case 1: + { + u8 *buffer; + u16 tileNum = win->tileDataStartOffset + 254; + if (win->fontNum == 0 || win->fontNum == 3) + tileNum *= 2; + buffer = win->tileData + 32 * tileNum; + ApplyColors_ShadowedFont(downArrowTiles, buffer, win->foregroundColor, win->shadowColor, win->backgroundColor); + ApplyColors_ShadowedFont(downArrowTiles + 8, buffer + 32, win->foregroundColor, win->shadowColor, win->backgroundColor); + WriteGlyphTilemap(win, tileNum, tileNum + 1); + break; + } + case 0: + case 2: + { + struct GlyphTileInfo glyphTileInfo; + glyphTileInfo.textMode = win->textMode; + glyphTileInfo.startPixel = (win->left + win->cursorX) & 7; + if (glyphTileInfo.startPixel != 0) + { + u8 *upperTile; + u8 *lowerTile; + GetGlyphTilePointers(win->fontNum, win->language, 0, &upperTile, &lowerTile); + glyphTileInfo.width = 8 - glyphTileInfo.startPixel; + glyphTileInfo.src = upperTile; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 1, 0)); + glyphTileInfo.colors = sGlyphBuffer.colors; + DrawGlyphTile_ShadowedFont(&glyphTileInfo); + glyphTileInfo.src = lowerTile; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 1, 1)); + DrawGlyphTile_ShadowedFont(&glyphTileInfo); + } + glyphTileInfo.width = 8; + glyphTileInfo.src = (u8 *)downArrowTiles; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 0)); + glyphTileInfo.colors = sGlyphBuffer.colors; + DrawGlyphTile_ShadowedFont(&glyphTileInfo); + glyphTileInfo.src += 32; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); + DrawGlyphTile_ShadowedFont(&glyphTileInfo); + if (glyphTileInfo.startPixel != 0) + UpdateTilemap(win, 2); + else + UpdateTilemap(win, 1); + break; + } + } + } +} + +static u8 WaitWithDownArrow(struct Window *win) +{ + u8 retVal = 1; + + if (!PlayerCanInterruptWait(win)) + { + win->delayCounter--; + if (!win->delayCounter) + { + TryEraseDownArrow(win); + } + else + { + DrawMovingDownArrow(win); + retVal = 0; + } + } + else + { + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PlaySE(SE_SELECT); + TryEraseDownArrow(win); + } + else + { + DrawMovingDownArrow(win); + retVal = 0; + } + } + + return retVal; +} + +static void DrawInitialDownArrow(struct Window *win) +{ + win->downArrowCounter = 0; + DrawDownArrow(win); +} + +static void DrawMovingDownArrow(struct Window *win) +{ + u16 downArrowPos = (win->downArrowCounter & 0x0F00) >> 8; + u16 wait = win->downArrowCounter & 0x000F; + u16 newVal; + + wait++; + + if (wait == 6) + { + wait = 0; + downArrowPos++; + if (downArrowPos > 3) + downArrowPos = 0; + win->downArrowCounter = downArrowPos << 8; + DrawDownArrow(win); + } + + newVal = downArrowPos << 8; + newVal |= wait; + + win->downArrowCounter = newVal; +} + +static void TryEraseDownArrow(struct Window *win) +{ + win->downArrowCounter = 0; + if (PlayerCanInterruptWait(win) == TRUE) + EraseAtCursor(win); +} + +u16 GetWindowTilemapEntry(struct Window *win, u8 x, u8 y) +{ + u16 *tilemap = win->tilemap; + return tilemap[32 * y + x]; +} + +void DrawWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) +{ + u8 i; + u16 *buffer = &win->tilemap[top * 32]; + + for (i = left; i <= right; i++) + buffer[i] = tilemapEntry; + + for (i = top + 1; i < bottom - 1; i++) + { + buffer += 32; + buffer[left] = tilemapEntry; + buffer[right] = tilemapEntry; + } + + if (top != bottom) + { + buffer += 32; + for (i = left; i <= right; i++) + buffer[i] = tilemapEntry; + } +} + +void DrawWindowRect_DefaultPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) +{ + DrawWindowRect(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); +} + +void FillWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) +{ + u16 *buffer = &win->tilemap[top * 32]; + while (top++ <= bottom) + { + u8 j; + for (j = left; j <= right; j++) + buffer[j] = tilemapEntry; + buffer += 32; + } +} + +void FillWindowRect_DefaultPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) +{ + FillWindowRect(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); +} + +void ZeroFillWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) +{ + FillWindowRect_DefaultPalette(win, 0, left, top, right, bottom); +} + +void FillWindowRectWithBlankTile(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) +{ + u16 tileNum = GetBlankTileNum(win); + FillWindowRect_DefaultPalette(win, tileNum, left, top, right, bottom); +} + +static u16 GetBlankTileNum(struct Window *win) +{ + u16 retVal = win->tileDataStartOffset; + + switch (win->textMode) + { + case 0: + break; + case 2: + retVal++; + break; + case 1: + switch (win->fontNum) + { + case 1: + case 2: + case 4: + case 5: + retVal += 212; + case 0: + case 3: + case 6: + break; + default: + retVal = 0; + } + break; + } + + return retVal; +} + +static s32 sub_80048D8(struct Window *win, u8 x, u8 y) +{ + win->cursorX = x; + win->cursorY = y & 0xF8; +} + +static u8 GetGlyphWidth(struct Window *win, u32 glyph) +{ + u8 width = 8; + +#ifdef BUGFIX_GLYPHWIDTH + if (win->language != LANGUAGE_JAPANESE) +#else + if (win->language == LANGUAGE_ENGLISH) +#endif + { + width = win->spacing; + if (!win->spacing) + { + switch (win->fontNum) + { + case 3: + width = sFont3Widths[glyph]; + break; + case 4: + case 5: + width = sFont4Widths[sFontType1Map[2 * glyph + 1]]; + break; + case 0: + width = sFont0Widths[glyph]; + break; + case 1: + case 2: + width = sFont1Widths[sFontType1Map[2 * glyph + 1]]; + break; + case 6: + width = 8; + break; + default: + width = 8; + } + } + } + + return width; +} + +u8 GetExtCtrlCodeLength(u8 code) +{ + u8 length = 0; + if (code <= 0x16) + length = sExtCtrlCodeLengths[code]; + return length; +} + +u8 *AlignInt1(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignType) +{ + u8 temp[16]; + u8 width; + switch (alignType) + { + case 0: + ConvertIntToDecimalString(temp, value); + dest = StringCopy(dest, temp); + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = alignAmount; + dest += 3; + *dest = 0xFF; + break; + case 1: + ConvertIntToDecimalString(temp, value); + width = GetStringWidth(win, temp); + if (alignAmount > width) + { + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = alignAmount - width; + dest += 3; + } + dest = StringCopy(dest, temp); + break; + case 2: + ConvertIntToDecimalString(temp, value); + width = GetStringWidth(win, temp); + if (alignAmount > width) + { + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = (alignAmount - width) / 2; + dest += 3; + } + dest = StringCopy(dest, temp); + if (alignAmount > width) + { + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = alignAmount; + dest += 3; + *dest = 0xFF; + } + break; + } + return dest; +} + +u8 *AlignInt2(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignType) +{ + u8 temp[16]; + u8 width; + switch (alignType) + { + case 0: + ConvertIntToDecimalString(temp, value); + width = GetStringWidth(win, temp); + dest = StringCopy(dest, temp); + dest[0] = 0xFC; + dest[1] = 17; + dest[2] = alignAmount - width; + dest += 3; + *dest = 0xFF; + break; + case 1: + ConvertIntToDecimalString(temp, value); + width = GetStringWidth(win, temp); + if (alignAmount > width) + { + dest[0] = 0xFC; + dest[1] = 17; + dest[2] = alignAmount - width; + dest += 3; + } + dest = StringCopy(dest, temp); + break; + case 2: + ConvertIntToDecimalString(temp, value); + width = GetStringWidth(win, temp); + if (alignAmount > width) + { + dest[0] = 0xFC; + dest[1] = 17; + dest[2] = (alignAmount - width) / 2; + dest += 3; + } + dest = StringCopy(dest, temp); + if (alignAmount > width) + { + dest[0] = 0xFC; + dest[1] = 17; + dest[2] = (alignAmount - width) / 2; + dest += 3; + *dest = 0xFF; + } + break; + } + return dest; +} + +u8 *AlignString(struct Window *win, u8 *dest, const u8 *src, u8 alignAmount, u8 alignType) +{ + u8 width; + switch (alignType) + { + case 0: + dest = StringCopy(dest, src); + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = alignAmount; + dest += 3; + *dest = 0xFF; + break; + case 1: + width = GetStringWidth(win, src); + if (alignAmount > width) + { + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = alignAmount - width; + dest += 3; + } + dest = StringCopy(dest, src); + break; + case 2: + width = GetStringWidth(win, src); + if (alignAmount > width) + { + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = (alignAmount - width) / 2; + dest += 3; + } + dest = StringCopy(dest, src); + if (alignAmount > width) + { + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = alignAmount; + dest += 3; + *dest = 0xFF; + } + break; + } + return dest; +} + +u8 GetStringWidth(struct Window *win, const u8 *s) +{ + u8 width = 0; + u8 savedFontNum = win->fontNum; + u8 savedCharset = win->language; + u8 savedSpacing = win->spacing; + s32 i = 0; + + while (s[i] != 0xFF) + { + u8 c = s[i]; + switch (c) + { + case 0xFD: + { + u8 temp; + i++; + temp = win->language; + width += GetStringWidth(win, GetExpandedPlaceholder(s[i])); + win->language = temp; + i++; + break; + } + case 0xFC: + i++; + switch (s[i]) + { + case 6: + win->fontNum = s[i + 1]; + break; + case 7: + win->fontNum = win->config->fontNum; + break; + case 0x11: + width += s[i + 1]; + break; + case 0x12: + case 0x13: + if (width < s[i + 1]) + width = s[i + 1]; + break; + case 0x14: + win->spacing = s[i + 1]; + break; + case 0x15: + win->language = LANGUAGE_JAPANESE; + break; + case 0x16: + win->language = GAME_LANGUAGE; + break; + } + + i += GetExtCtrlCodeLength(s[i]); + break; + default: + i++; + width += GetGlyphWidth(win, c); + } + } + + win->spacing = savedSpacing; + win->language = savedCharset; + win->fontNum = savedFontNum; + + return width; +} + +u8 sub_8004D04(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) +{ + sub_8002E4C(win, text, tileDataStartOffset, left, top, a6); + return sub_8002F44(win); +} + +u8 sub_8004D38(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) +{ + u8 width = GetStringWidth(win, text); + InitWindow(win, text, tileDataStartOffset, left - ((u32)(width + 7) >> 3), top); + EraseAtCursor(win); + width &= 7; + if (width) + width = 8 - width; + sub_80048D8(win, width, 0); + return sub_8002F44(win); +} + +u8 sub_8004DB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top, u16 a6) +{ + register u32 val asm("r5") = (u8)((a6 >> 1) - (GetStringWidth(win, text) >> 1)); + left += (val >> 3); + InitWindow(win, text, tileDataStartOffset, left, top); + EraseAtCursor(win); + sub_80048D8(win, val & 7, 0); + return sub_8002F44(win); +} + +u8 sub_8004E24(struct Window *win) +{ + return win->paletteNum; +} + +void sub_8004E28(struct Window *win, u8 *foreground, u8 *background, u8 *shadow) +{ + *foreground = win->foregroundColor; + *background = win->backgroundColor; + *shadow = win->shadowColor; +} + +void sub_8004E3C(struct WindowConfig *winConfig, u8 *tileData, const u8 *text) +{ + sTempWindow.config = winConfig; + InitWindow(&sTempWindow, text, 0, 0, 0); + sTempWindow.tileData = tileData; + sub_8002F44(&sTempWindow); +} + +u8 GetStringWidthGivenWindowConfig(struct WindowConfig *winConfig, const u8 *s) +{ + sTempWindow.config = winConfig; + InitWindow(&sTempWindow, s, 0, 0, 0); + return GetStringWidth(&sTempWindow, s); +} + +void ConvertInternationalString(u8 *s, u8 language) +{ + if (language == LANGUAGE_JAPANESE) + { + u8 i; + + StripExtCtrlCodes(s); + i = StringLength(s); + s[i++] = 0xFC; + s[i++] = 22; + s[i++] = 0xFF; + + i--; + + while (i != (u8)-1) + { + s[i + 2] = s[i]; + i--; + } + + s[0] = 0xFC; + s[1] = 21; + } +} + +void StripExtCtrlCodes(u8 *str) +{ + u16 srcIndex = 0; + u16 destIndex = 0; + while (str[srcIndex] != 0xFF) + { + if (str[srcIndex] == 0xFC) + { + srcIndex++; + srcIndex += GetExtCtrlCodeLength(str[srcIndex]); + } + else + { + str[destIndex++] = str[srcIndex++]; + } + } + str[destIndex] = 0xFF; +} + +static const u8 *SkipExtCtrlCode(const u8 *s) +{ + while (*s == 0xFC) + { + s++; + s += GetExtCtrlCodeLength(*s); + } + + return s; +} + +s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2) +{ + s32 retVal = 0; + + while (1) + { + str1 = SkipExtCtrlCode(str1); + str2 = SkipExtCtrlCode(str2); + + if (*str1 > *str2) + break; + + if (*str1 < *str2) + { + retVal = -1; + if (*str2 == 0xFF) + retVal = 1; + } + + if (*str1 == 0xFF) + return retVal; + + str1++; + str2++; + } + + retVal = 1; + + if (*str1 == 0xFF) + retVal = -1; + + return retVal; +} + +u8 sub_8004FD0(struct Window *win, u8 *dest, const u8 *src, u16 tileDataStartOffset, u8 left, u16 top, u8 width, u32 a8) +{ + u8 newlineCount = 0; + u8 extCtrlCodeLength; + u8 *start; + u32 endsWithoutNewline; + + if (dest == NULL) + dest = gStringVar4; + + start = dest; + endsWithoutNewline = FALSE; + + while (*src != 0xFF) + { + switch (*src) + { + default: + *dest = *src; + dest++; + src++; + endsWithoutNewline = TRUE; + break; + case 0xFC: + extCtrlCodeLength = GetExtCtrlCodeLength(src[1]) + 1; + memcpy(dest, src, extCtrlCodeLength); + dest += extCtrlCodeLength; + src += extCtrlCodeLength; + break; + case 0xFE: + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = width; + dest[3] = 0xFE; + dest += 4; + src++; + newlineCount++; + endsWithoutNewline = FALSE; + break; + } + } + + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = width; + dest[3] = 0xFF; + + if (endsWithoutNewline) + newlineCount++; + + sub_8002E4C(win, start, tileDataStartOffset, left, top, a8); + sub_8002F44(win); + + return newlineCount; +} + +static s32 DrawGlyphTile_UnshadowedFont(struct GlyphTileInfo *glyphTileInfo) +{ + struct GlyphBuffer *glyphBuffer = &sGlyphBuffer; + u32 colors[2]; + u32 *buffer = glyphTileInfo->dest; + const u32 *masks = sGlyphMasks[glyphTileInfo->width][glyphTileInfo->startPixel]; + u32 mask1 = masks[0] | masks[2]; + + glyphBuffer->pixelRows[0] = buffer[0] & mask1; + glyphBuffer->pixelRows[1] = buffer[1] & mask1; + glyphBuffer->pixelRows[2] = buffer[2] & mask1; + glyphBuffer->pixelRows[3] = buffer[3] & mask1; + glyphBuffer->pixelRows[4] = buffer[4] & mask1; + glyphBuffer->pixelRows[5] = buffer[5] & mask1; + glyphBuffer->pixelRows[6] = buffer[6] & mask1; + glyphBuffer->pixelRows[7] = buffer[7] & mask1; + + if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) + { + u32 mask2 = masks[1]; + if (glyphTileInfo->textMode == 2) + { + glyphBuffer->pixelRows[8] = buffer[8] & mask2; + glyphBuffer->pixelRows[9] = buffer[9] & mask2; + glyphBuffer->pixelRows[10] = buffer[10] & mask2; + glyphBuffer->pixelRows[11] = buffer[11] & mask2; + glyphBuffer->pixelRows[12] = buffer[12] & mask2; + glyphBuffer->pixelRows[13] = buffer[13] & mask2; + glyphBuffer->pixelRows[14] = buffer[14] & mask2; + glyphBuffer->pixelRows[15] = buffer[15] & mask2; + } + else + { + glyphBuffer->pixelRows[8] = buffer[16] & mask2; + glyphBuffer->pixelRows[9] = buffer[17] & mask2; + glyphBuffer->pixelRows[10] = buffer[18] & mask2; + glyphBuffer->pixelRows[11] = buffer[19] & mask2; + glyphBuffer->pixelRows[12] = buffer[20] & mask2; + glyphBuffer->pixelRows[13] = buffer[21] & mask2; + glyphBuffer->pixelRows[14] = buffer[22] & mask2; + glyphBuffer->pixelRows[15] = buffer[23] & mask2; + } + } + + colors[0] = glyphTileInfo->colors[0]; + colors[1] = glyphTileInfo->colors[15]; + + sShiftGlyphTileUnshadowedFuncs[glyphTileInfo->width](glyphBuffer, glyphTileInfo->src, colors, glyphTileInfo->startPixel); + + buffer[0] = glyphBuffer->pixelRows[0]; + buffer[1] = glyphBuffer->pixelRows[1]; + buffer[2] = glyphBuffer->pixelRows[2]; + buffer[3] = glyphBuffer->pixelRows[3]; + buffer[4] = glyphBuffer->pixelRows[4]; + buffer[5] = glyphBuffer->pixelRows[5]; + buffer[6] = glyphBuffer->pixelRows[6]; + buffer[7] = glyphBuffer->pixelRows[7]; + + if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) + { + if (glyphTileInfo->textMode != 2) + buffer += 8; + buffer[8] = glyphBuffer->pixelRows[8]; + buffer[9] = glyphBuffer->pixelRows[9]; + buffer[10] = glyphBuffer->pixelRows[10]; + buffer[11] = glyphBuffer->pixelRows[11]; + buffer[12] = glyphBuffer->pixelRows[12]; + buffer[13] = glyphBuffer->pixelRows[13]; + buffer[14] = glyphBuffer->pixelRows[14]; + buffer[15] = glyphBuffer->pixelRows[15]; + } + + return (glyphTileInfo->startPixel + glyphTileInfo->width) / 8; +} + +static void ShiftGlyphTile_UnshadowedFont_Width0(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *a3, u8 startPixel) +{ +} + +static void ShiftGlyphTile_UnshadowedFont_Width1(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = colors[src[i] >> 7]; + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width2(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width3(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + // XXX: why 4? + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4) + | (colors[(src[i] >> 5) & 1] << 8) + | (colors[(src[i] >> 4) & 1] << 12); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width4(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4) + | (colors[(src[i] >> 5) & 1] << 8) + | (colors[(src[i] >> 4) & 1] << 12); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width5(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4) + | (colors[(src[i] >> 5) & 1] << 8) + | (colors[(src[i] >> 4) & 1] << 12) + | (colors[(src[i] >> 3) & 1] << 16); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width6(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4) + | (colors[(src[i] >> 5) & 1] << 8) + | (colors[(src[i] >> 4) & 1] << 12) + | (colors[(src[i] >> 3) & 1] << 16) + | (colors[(src[i] >> 2) & 1] << 20); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width7(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4) + | (colors[(src[i] >> 5) & 1] << 8) + | (colors[(src[i] >> 4) & 1] << 12) + | (colors[(src[i] >> 3) & 1] << 16) + | (colors[(src[i] >> 2) & 1] << 20) + | (colors[(src[i] >> 1) & 1] << 24); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width8(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4) + | (colors[(src[i] >> 5) & 1] << 8) + | (colors[(src[i] >> 4) & 1] << 12) + | (colors[(src[i] >> 3) & 1] << 16) + | (colors[(src[i] >> 2) & 1] << 20) + | (colors[(src[i] >> 1) & 1] << 24) + | (colors[(src[i] >> 0) & 1] << 28); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static s32 DrawGlyphTile_ShadowedFont(struct GlyphTileInfo *glyphTileInfo) +{ + struct GlyphBuffer *glyphBuffer = &sGlyphBuffer; + u32 *buffer = glyphTileInfo->dest; + const u32 *masks = sGlyphMasks[glyphTileInfo->width][glyphTileInfo->startPixel]; + u32 mask1 = masks[0] | masks[2]; + + glyphBuffer->pixelRows[0] = buffer[0] & mask1; + glyphBuffer->pixelRows[1] = buffer[1] & mask1; + glyphBuffer->pixelRows[2] = buffer[2] & mask1; + glyphBuffer->pixelRows[3] = buffer[3] & mask1; + glyphBuffer->pixelRows[4] = buffer[4] & mask1; + glyphBuffer->pixelRows[5] = buffer[5] & mask1; + glyphBuffer->pixelRows[6] = buffer[6] & mask1; + glyphBuffer->pixelRows[7] = buffer[7] & mask1; + + if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) + { + u32 mask2 = masks[1]; + if (glyphTileInfo->textMode == 2) + { + glyphBuffer->pixelRows[8] = buffer[8] & mask2; + glyphBuffer->pixelRows[9] = buffer[9] & mask2; + glyphBuffer->pixelRows[10] = buffer[10] & mask2; + glyphBuffer->pixelRows[11] = buffer[11] & mask2; + glyphBuffer->pixelRows[12] = buffer[12] & mask2; + glyphBuffer->pixelRows[13] = buffer[13] & mask2; + glyphBuffer->pixelRows[14] = buffer[14] & mask2; + glyphBuffer->pixelRows[15] = buffer[15] & mask2; + } + else + { + glyphBuffer->pixelRows[8] = buffer[16] & mask2; + glyphBuffer->pixelRows[9] = buffer[17] & mask2; + glyphBuffer->pixelRows[10] = buffer[18] & mask2; + glyphBuffer->pixelRows[11] = buffer[19] & mask2; + glyphBuffer->pixelRows[12] = buffer[20] & mask2; + glyphBuffer->pixelRows[13] = buffer[21] & mask2; + glyphBuffer->pixelRows[14] = buffer[22] & mask2; + glyphBuffer->pixelRows[15] = buffer[23] & mask2; + } + } + + sShiftGlyphTileShadowedFuncs[glyphTileInfo->width](glyphBuffer, (u32 *)glyphTileInfo->src, glyphTileInfo->colors, glyphTileInfo->startPixel); + + buffer[0] = glyphBuffer->pixelRows[0]; + buffer[1] = glyphBuffer->pixelRows[1]; + buffer[2] = glyphBuffer->pixelRows[2]; + buffer[3] = glyphBuffer->pixelRows[3]; + buffer[4] = glyphBuffer->pixelRows[4]; + buffer[5] = glyphBuffer->pixelRows[5]; + buffer[6] = glyphBuffer->pixelRows[6]; + buffer[7] = glyphBuffer->pixelRows[7]; + + if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) + { + if (glyphTileInfo->textMode != 2) + buffer += 8; + buffer[8] = glyphBuffer->pixelRows[8]; + buffer[9] = glyphBuffer->pixelRows[9]; + buffer[10] = glyphBuffer->pixelRows[10]; + buffer[11] = glyphBuffer->pixelRows[11]; + buffer[12] = glyphBuffer->pixelRows[12]; + buffer[13] = glyphBuffer->pixelRows[13]; + buffer[14] = glyphBuffer->pixelRows[14]; + buffer[15] = glyphBuffer->pixelRows[15]; + } + + return (glyphTileInfo->startPixel + glyphTileInfo->width) / 8; +} + +static void ShiftGlyphTile_ShadowedFont_Width0(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ +} + +static void ShiftGlyphTile_ShadowedFont_Width1(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = colors[src[i] & 0xF]; + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_ShadowedFont_Width2(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 0) & 0xF] << 0) + | (colors[(src[i] >> 4) & 0xF] << 4); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_ShadowedFont_Width3(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 0) & 0xF] << 0) + | (colors[(src[i] >> 4) & 0xF] << 4) + | (colors[(src[i] >> 8) & 0xF] << 8); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_ShadowedFont_Width4(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 0) & 0xF] << 0) + | (colors[(src[i] >> 4) & 0xF] << 4) + | (colors[(src[i] >> 8) & 0xF] << 8) + | (colors[(src[i] >> 12) & 0xF] << 12); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +#define SHIFT_GLYPH_WIDTH5_STEP(i) \ +val = (colors[(src[i] >> 0) & 0xF] << 0) \ + | (colors[(src[i] >> 4) & 0xF] << 4) \ + | (colors[(src[i] >> 8) & 0xF] << 8) \ + | (colors[(src[i] >> 12) & 0xF] << 12) \ + | (colors[(src[i] >> 16) & 0xF] << 16); \ +glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ +glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ + +static void ShiftGlyphTile_ShadowedFont_Width5(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u32 val; + SHIFT_GLYPH_WIDTH5_STEP(0) + SHIFT_GLYPH_WIDTH5_STEP(1) + SHIFT_GLYPH_WIDTH5_STEP(2) + SHIFT_GLYPH_WIDTH5_STEP(3) + SHIFT_GLYPH_WIDTH5_STEP(4) + SHIFT_GLYPH_WIDTH5_STEP(5) + SHIFT_GLYPH_WIDTH5_STEP(6) + SHIFT_GLYPH_WIDTH5_STEP(7) +} + +#define SHIFT_GLYPH_WIDTH6_STEP(i) \ +val = (colors[(src[i] >> 0) & 0xF] << 0) \ + | (colors[(src[i] >> 4) & 0xF] << 4) \ + | (colors[(src[i] >> 8) & 0xF] << 8) \ + | (colors[(src[i] >> 12) & 0xF] << 12) \ + | (colors[(src[i] >> 16) & 0xF] << 16) \ + | (colors[(src[i] >> 20) & 0xF] << 20); \ +glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ +glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ + +static void ShiftGlyphTile_ShadowedFont_Width6(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u32 val; + SHIFT_GLYPH_WIDTH6_STEP(0) + SHIFT_GLYPH_WIDTH6_STEP(1) + SHIFT_GLYPH_WIDTH6_STEP(2) + SHIFT_GLYPH_WIDTH6_STEP(3) + SHIFT_GLYPH_WIDTH6_STEP(4) + SHIFT_GLYPH_WIDTH6_STEP(5) + SHIFT_GLYPH_WIDTH6_STEP(6) + SHIFT_GLYPH_WIDTH6_STEP(7) +} + +#define SHIFT_GLYPH_WIDTH7_STEP(i) \ +val = (colors[(src[i] >> 0) & 0xF] << 0) \ + | (colors[(src[i] >> 4) & 0xF] << 4) \ + | (colors[(src[i] >> 8) & 0xF] << 8) \ + | (colors[(src[i] >> 12) & 0xF] << 12) \ + | (colors[(src[i] >> 16) & 0xF] << 16) \ + | (colors[(src[i] >> 20) & 0xF] << 20) \ + | (colors[(src[i] >> 24) & 0xF] << 24); \ +glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ +glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ + +static void ShiftGlyphTile_ShadowedFont_Width7(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u32 val; + SHIFT_GLYPH_WIDTH7_STEP(0) + SHIFT_GLYPH_WIDTH7_STEP(1) + SHIFT_GLYPH_WIDTH7_STEP(2) + SHIFT_GLYPH_WIDTH7_STEP(3) + SHIFT_GLYPH_WIDTH7_STEP(4) + SHIFT_GLYPH_WIDTH7_STEP(5) + SHIFT_GLYPH_WIDTH7_STEP(6) + SHIFT_GLYPH_WIDTH7_STEP(7) +} + +#define SHIFT_GLYPH_WIDTH8_STEP(i) \ +val = (colors[(src[i] >> 0) & 0xF] << 0) \ + | (colors[(src[i] >> 4) & 0xF] << 4) \ + | (colors[(src[i] >> 8) & 0xF] << 8) \ + | (colors[(src[i] >> 12) & 0xF] << 12) \ + | (colors[(src[i] >> 16) & 0xF] << 16) \ + | (colors[(src[i] >> 20) & 0xF] << 20) \ + | (colors[(src[i] >> 24) & 0xF] << 24) \ + | (colors[(src[i] >> 28) ] << 28); \ +glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ +glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ + +static void ShiftGlyphTile_ShadowedFont_Width8(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u32 val; + SHIFT_GLYPH_WIDTH8_STEP(0) + SHIFT_GLYPH_WIDTH8_STEP(1) + SHIFT_GLYPH_WIDTH8_STEP(2) + SHIFT_GLYPH_WIDTH8_STEP(3) + SHIFT_GLYPH_WIDTH8_STEP(4) + SHIFT_GLYPH_WIDTH8_STEP(5) + SHIFT_GLYPH_WIDTH8_STEP(6) + SHIFT_GLYPH_WIDTH8_STEP(7) +} + +static s32 DrawGlyphTiles(struct Window *win, u32 glyph, u32 glyphWidth) +{ + struct GlyphTileInfo glyphTileInfo; + u8 *upperTile; + u8 *lowerTile; + s32 retVal = 0; + + GetGlyphTilePointers(win->fontNum, win->language, glyph, &upperTile, &lowerTile); + glyphTileInfo.textMode = win->textMode; + glyphTileInfo.startPixel = (win->left + win->cursorX) & 7; + glyphTileInfo.width = glyphWidth; + glyphTileInfo.src = upperTile; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 0)); + glyphTileInfo.colors = sGlyphBuffer.colors; + + switch (win->fontNum) + { + case 0: + case 1: + case 2: + case 6: + DrawGlyphTile_UnshadowedFont(&glyphTileInfo); + glyphTileInfo.src = lowerTile; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); + retVal = DrawGlyphTile_UnshadowedFont(&glyphTileInfo); + break; + case 3: + case 4: + case 5: + DrawGlyphTile_ShadowedFont(&glyphTileInfo); + glyphTileInfo.src = lowerTile; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); + retVal = DrawGlyphTile_ShadowedFont(&glyphTileInfo); + break; + } + + return retVal; +} + +static void UpdateTilemap(struct Window *win, u32 tilesWidth) +{ + u16 *tilemap = GetCursorTilemapPointer(win); + if (tilesWidth && tilemap) + { + u16 paletteNum = (win->paletteNum << 12); + u16 upperLeftTileNum = GetCursorTileNum(win, 0, 0); + u16 lowerLeftTileNum = GetCursorTileNum(win, 0, 1); + tilemap[0] = upperLeftTileNum | paletteNum; + tilemap[32] = lowerLeftTileNum | paletteNum; + if (tilesWidth == 2) + { + u16 upperRightTileNum = GetCursorTileNum(win, 1, 0); + u16 lowerRightTileNum = GetCursorTileNum(win, 1, 1); + tilemap[1] = upperRightTileNum | paletteNum; + tilemap[33] = lowerRightTileNum | paletteNum; + } + } +} + +static u16 GetCursorTileNum(struct Window *win, u32 xOffset, u32 yOffset) +{ + u16 index; + + if (win->textMode == 2) + index = win->tileDataStartOffset + + win->tileDataOffset + + (((win->top + win->cursorY) >> 3) + yOffset) * win->width + + (((win->left + win->cursorX) >> 3) + xOffset); + else + index = win->tileDataStartOffset + win->tileDataOffset + 2 * xOffset + yOffset; + + return index; +} diff --git a/src/engine/text_window.c b/src/engine/text_window.c new file mode 100644 index 000000000..9a88789d1 --- /dev/null +++ b/src/engine/text_window.c @@ -0,0 +1,184 @@ +#include "global.h" +#include "text_window.h" +#include "main.h" +#include "palette.h" +#include "text.h" + +#define STD_MSG_BOX_LEFT 0 +#define STD_MSG_BOX_TOP 14 +#define STD_MSG_BOX_WIDTH 26 +#define STD_MSG_BOX_HEIGHT 4 + +static void LoadTextWindowTiles(u8, void *); +static void LoadTextWindowPalette(u8, u8); +static void DrawTextWindowInternal(u16 *dest, u16 baseTileNum, u8 left, u8 top, u8 right, u8 bottom); +static u16 GetMessageBoxTilemapEntry(u16 tilemapEntry, u8 x, u8 y, u8 width, u8 height); +static void DrawMessageBox(struct Window *win, u8 left, u8 top, u8 width, u8 height); + +static u16 sTextWindowBaseTileNum; +static u16 sMessageBoxBaseTileNum; + +extern const struct FrameGraphics gUnknown_083761F0[20]; + +extern const u16 gMessageBoxTilemap[5][7]; +extern const u8 gMessageBox_Gfx[]; + +u16 SetTextWindowBaseTileNum(u16 baseTileNum) +{ + sTextWindowBaseTileNum = baseTileNum; + return baseTileNum + 9; +} + +void LoadTextWindowGraphics(struct Window *win) +{ + u8 *tileData = win->config->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; + LoadTextWindowTiles(gSaveBlock2.optionsWindowFrameType, tileData); + LoadTextWindowPalette(gSaveBlock2.optionsWindowFrameType, 0xE); +} + +void LoadTextWindowGraphics_OverridePalSlot(struct Window *win, u8 palSlot) +{ + u8 *tileData = win->config->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; + LoadTextWindowTiles(gSaveBlock2.optionsWindowFrameType, tileData); + LoadTextWindowPalette(gSaveBlock2.optionsWindowFrameType, palSlot); +} + +void LoadTextWindowGraphics_OverrideFrameType(struct Window *win, u8 frameType) +{ + u8 *tileData = win->config->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; + LoadTextWindowTiles(frameType, tileData); + LoadTextWindowPalette(frameType, 0xE); +} + +void DrawTextWindow(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) +{ + DrawTextWindowInternal(win->config->tilemap, sTextWindowBaseTileNum, left, top, right, bottom); +} + +const struct FrameGraphics *GetTextWindowFrameGraphics(u8 frameType) +{ + if (frameType > 19) + return &gUnknown_083761F0[0]; + else + return &gUnknown_083761F0[frameType]; +} + +static void LoadTextWindowTiles(u8 frameType, void *dest) +{ + const struct FrameGraphics *frameGraphics = GetTextWindowFrameGraphics(frameType); + CpuFastCopy(frameGraphics->tiles, dest, 9 * TILE_SIZE_4BPP); +} + +static void LoadTextWindowPalette(u8 frameType, u8 palSlot) +{ + const struct FrameGraphics *frameGraphics = GetTextWindowFrameGraphics(frameType); + LoadPalette(frameGraphics->palette, 16 * palSlot, 0x20); +} + +static void DrawTextWindowInternal(u16 *dest, u16 baseTileNum, u8 left, u8 top, u8 right, u8 bottom) +{ + u8 x, y; + u8 startX, endX; + u8 startY, endY; + + startX = (left < right) ? left : right; + endX = (right > left) ? right : left; + + startY = (top < bottom) ? top : bottom; + endY = (bottom > top) ? bottom : top; + + dest[32 * startY + startX] = baseTileNum | 0xE000; + + for (x = startX + 1; x < endX; x++) + dest[32 * startY + x] = (baseTileNum + 1) | 0xE000; + + dest[32 * startY + endX] = (baseTileNum + 2) | 0xE000; + + for (y = startY + 1; y < endY; y++) + { + dest[32 * y + startX] = (baseTileNum + 3) | 0xE000; + + for (x = startX + 1; x < endX; x++) + dest[32 * y + x] = (baseTileNum + 4) | 0xE000; + + dest[32 * y + endX] = (baseTileNum + 5) | 0xE000; + } + + dest[32 * endY + startX] = (baseTileNum + 6) | 0xE000; + + for (x = startX + 1; x < endX; x++) + dest[32 * endY + x] = (baseTileNum + 7) | 0xE000; + + dest[32 * endY + endX] = (baseTileNum + 8) | 0xE000; +} + +u16 SetMessageBoxBaseTileNum(u16 baseTileNum) +{ + sMessageBoxBaseTileNum = baseTileNum; + return baseTileNum + 14; +} + +void unref_sub_80651DC(struct Window *win, u8 *text) +{ + sub_8002EB0(win, text, sMessageBoxBaseTileNum + 14, 2, 15); +} + +void DisplayMessageBox(struct Window *win) +{ + LoadMessageBoxTiles(win); + DrawStandardMessageBox(win); +} + +static u16 GetMessageBoxTilemapEntry(u16 baseTilemapEntry, u8 x, u8 y, u8 width, u8 height) +{ + u16 tilemapEntry = 9; + + if (y >= height) + y = y - height + 3; + else if (y > 1) + y = 2; + + if (x >= width + 2) + x = x - (width + 2) + 4; + else if (x > 2) + x = 3; + + if (x <= 6 && y <= 4) + tilemapEntry = gMessageBoxTilemap[y][x]; + + tilemapEntry += baseTilemapEntry; + + return tilemapEntry; +} + +static void DrawMessageBox(struct Window *win, u8 left, u8 top, u8 width, u8 height) +{ + u8 i, j; + u16 tilemapEntry = (win->paletteNum << 12) | sMessageBoxBaseTileNum; + u16 *tilemap = win->config->tilemap; + + for (i = 0; i < height + 2; i++) + for (j = 0; j < width + 6; j++) + tilemap[(left + j) + 32 * (top + i)] = (win->paletteNum << 12) | GetMessageBoxTilemapEntry(tilemapEntry, j, i, width, height); +} + +void DrawStandardMessageBox(struct Window *win) +{ + DrawMessageBox(win, STD_MSG_BOX_LEFT, STD_MSG_BOX_TOP, STD_MSG_BOX_WIDTH, STD_MSG_BOX_HEIGHT); +} + +void LoadMessageBoxTiles(struct Window *win) +{ + u8 *tileData = win->config->tileData; + CpuFastCopy(gMessageBox_Gfx, tileData + 32 * sMessageBoxBaseTileNum, 14 * TILE_SIZE_4BPP); +} + +void ClearStandardMessageBox(struct Window *win) +{ + u8 i; + u16 *tilemap = win->config->tilemap + (STD_MSG_BOX_TOP * 32); + u16 tilemapEntry = win->paletteNum << 12; + + for (i = 0; i < ((STD_MSG_BOX_HEIGHT + 2) * 32); i++) + tilemap[i] = tilemapEntry; +} diff --git a/src/engine/tileset_anim.c b/src/engine/tileset_anim.c new file mode 100644 index 000000000..34685381d --- /dev/null +++ b/src/engine/tileset_anim.c @@ -0,0 +1,630 @@ +#include "global.h" +#include "tileset_anim.h" + +extern u8 *gTilesetAnimTable_General_0[]; +extern u8 *gTilesetAnimTable_General_1[]; +extern u8 *gTilesetAnimTable_General_2[]; +extern u8 *gTilesetAnimTable_General_3[]; +extern u8 *gTilesetAnimTable_General_4[]; +extern u8 *gTilesetAnimTable_Lavaridge[]; +extern u8 *gTilesetAnimTable_Pacifidlog_0[]; +extern u8 *gTilesetAnimTable_Underwater[]; +extern u8 *gTilesetAnimTable_Pacifidlog_1[]; +extern u8 *gUnknown_0837BAE4[]; +extern u8 *gUnknown_0837BB04[]; +extern u8 *gTilesetAnimTable_Mauville_0A[]; +extern u8 *gTilesetAnimTable_Mauville_1A[]; +extern u8 *gTilesetAnimTable_Mauville_0B[]; +extern u8 *gTilesetAnimTable_Mauville_1B[]; +extern u8 *gUnknown_0837BFA4[]; +extern u8 *gTilesetAnimTable_Rustboro_0[]; +extern u8 *gTilesetAnimTable_Rustboro_1[]; +extern u8 *gTilesetAnimTable_Cave[]; +extern u8 *gUnknown_0837C93C[]; +extern u8 *gTilesetAnimTable_EverGrande[]; +extern u8 *gTilesetAnimTable_Building[]; +extern u8 *gTilesetAnimTable_SootopolisGym_0[]; +extern u8 *gTilesetAnimTable_SootopolisGym_1[]; +extern u8 *gTilesetAnimTable_EliteFour_0[]; +extern u8 *gTilesetAnimTable_EliteFour_1[]; +extern u8 *gTilesetAnimTable_MauvilleGym[]; +extern u8 *gTilesetAnimTable_BikeShop[]; + +struct Dma +{ + u8 *src; + u8 *dest; + u16 size; +}; + +EWRAM_DATA static struct Dma gTilesetAnimDmas[20] = {0}; + +static u8 gNumTilesetAnimDmas; +static u16 gTileset1AnimFrame; +static u16 gTileset1AnimLength; +static u16 gTileset2AnimFrame; +static u16 gTileset2AnimLength; +static void (*gTileset1AnimCallback)(u16); +static void (*gTileset2AnimCallback)(u16); + +static void StartTileset1Animation(void); +static void StartTileset2Animation(void); + +static void sub_8073014(u16); +static void sub_8073058(u16); + +static void sub_8073070(u16); +static void sub_8073098(u16); +static void sub_80730C0(u16); +static void sub_80730E8(u16); +static void sub_807361C(u16); + +static void sub_8073424(u16); +static void sub_80734A0(u16); +static void sub_8073514(u16); +static void sub_8073540(u16); +static void sub_80735B4(u16); +static void sub_80735E4(u16); +static void sub_80738A8(u16); +static void sub_8073600(u16); +static void sub_80738C0(u16); +static void sub_8073890(u16); +static void sub_80738EC(u16); + +static void sub_80737A4(u16, u8); +static void sub_80737E0(u16); +static void sub_8073704(u16, u8); +static void sub_8073644(u8); +static void sub_8073808(u16); +static void sub_8073830(u16, u8); +static void sub_807368C(u8); +static void sub_80736DC(u8); +static void sub_80736B4(u8); +static void sub_8073868(u16); + +static void sub_8073904(u16); +static void sub_80739C4(u16); +static void sub_807392C(u16); +static void sub_807399C(u16); +static void sub_8073974(u16); +static void sub_80739EC(u16); + +static void ClearTilesetAnimDmas(void) +{ + gNumTilesetAnimDmas = 0; + CpuFill32(0, &gTilesetAnimDmas, sizeof(gTilesetAnimDmas)); +} + +static void QueueTilesetAnimDma(u8 *src, u8 *dest, u16 size) +{ + if (gNumTilesetAnimDmas < 20) + { + gTilesetAnimDmas[gNumTilesetAnimDmas].src = src; + gTilesetAnimDmas[gNumTilesetAnimDmas].dest = dest; + gTilesetAnimDmas[gNumTilesetAnimDmas].size = size; + gNumTilesetAnimDmas++; + } +} + +void sub_8072E74(void) +{ + int i; + for (i = 0; i < gNumTilesetAnimDmas; i++) + { + DmaCopy16(3, + gTilesetAnimDmas[i].src, + gTilesetAnimDmas[i].dest, + gTilesetAnimDmas[i].size); + } + gNumTilesetAnimDmas = 0; +} + +void cur_mapheader_run_tileset_funcs_after_some_cpuset(void) +{ + ClearTilesetAnimDmas(); + StartTileset1Animation(); + StartTileset2Animation(); +} + +void sub_8072ED0(void) +{ + StartTileset2Animation(); +} + +void sub_8072EDC(void) +{ + ClearTilesetAnimDmas(); + if (++gTileset1AnimFrame >= gTileset1AnimLength) + { + gTileset1AnimFrame = 0; + } + if (++gTileset2AnimFrame >= gTileset2AnimLength) + { + gTileset2AnimFrame = 0; + } + if (gTileset1AnimCallback) + { + gTileset1AnimCallback(gTileset1AnimFrame); + } + if (gTileset2AnimCallback) + { + gTileset2AnimCallback(gTileset2AnimFrame); + } +} + +static void StartTileset1Animation(void) +{ + gTileset1AnimFrame = 0; + gTileset1AnimLength = 0; + gTileset1AnimCallback = 0; + if (gMapHeader.mapData->primaryTileset) + { + if (gMapHeader.mapData->primaryTileset->callback) + { + gMapHeader.mapData->primaryTileset->callback(); + } + } +} + +static void StartTileset2Animation(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = 0; + gTileset2AnimCallback = 0; + if (gMapHeader.mapData->secondaryTileset) + { + if (gMapHeader.mapData->secondaryTileset->callback) + { + gMapHeader.mapData->secondaryTileset->callback(); + } + } +} + +void TilesetCB_General(void) +{ + gTileset1AnimFrame = 0; + gTileset1AnimLength = 0x100; + gTileset1AnimCallback = sub_8073014; +} + +void TilesetCB_Building(void) +{ + gTileset1AnimFrame = 0; + gTileset1AnimLength = 0x100; + gTileset1AnimCallback = sub_8073058; +} + +static void sub_8073014(u16 a1) +{ + int v1; + v1 = a1 % 0x10; + if (v1 == 0) sub_8073070(a1 / 0x10); + if (v1 == 1) sub_8073098(a1 / 0x10); + if (v1 == 2) sub_80730C0(a1 / 0x10); + if (v1 == 3) sub_80730E8(a1 / 0x10); + if (v1 == 4) sub_807361C(a1 / 0x10); +} + +static void sub_8073058(u16 a1) +{ + if (a1 % 8 == 0) + { + sub_8073904(a1 / 8); + } +} + +static void sub_8073070(u16 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_General_0[v1], (u8 *)(BG_VRAM + 0x3f80), 0x80); +} + +static void sub_8073098(u16 a1) +{ + u8 v1; + v1 = a1 % 8; + QueueTilesetAnimDma(gTilesetAnimTable_General_1[v1], (u8 *)(BG_VRAM + 0x3600), 0x3c0); +} + +static void sub_80730C0(u16 a1) +{ + int v1; + v1 = a1 % 8; + QueueTilesetAnimDma(gTilesetAnimTable_General_2[v1], (u8 *)(BG_VRAM + 0x3a00), 0x140); +} + +static void sub_80730E8(u16 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_General_3[v1], (u8 *)(BG_VRAM + 0x3e00), 0xc0); +} + +void TilesetCB_Petalburg(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Rustboro(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_8073424; +} + +void TilesetCB_Dewford(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Slateport(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Mauville(void) +{ + gTileset2AnimFrame = gTileset1AnimFrame; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_80734A0; +} + +void TilesetCB_Lavaridge(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_8073514; +} + +void TilesetCB_Fallarbor(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Fortree(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Lilycove(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Mossdeep(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_EverGrande(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_8073540; +} + +void TilesetCB_Pacifidlog(void) +{ + gTileset2AnimFrame = gTileset1AnimFrame; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_80735B4; +} + +void TilesetCB_Sootopolis(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Underwater(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = 0x80; + gTileset2AnimCallback = sub_80735E4; +} + +void TilesetCB_SootopolisGym(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = 0xf0; + gTileset2AnimCallback = sub_80738A8; +} + +void TilesetCB_Cave(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_8073600; +} + +void TilesetCB_EliteFour(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = 0x80; + gTileset2AnimCallback = sub_80738C0; +} + +void TilesetCB_MauvilleGym(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_8073890; +} + +void TilesetCB_BikeShop(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_80738EC; +} + +static void sub_8073424(u16 a1) +{ + int v1; + v1 = a1 % 8; + if (v1 == 0) + { + sub_80737A4(a1 / 8, 0); + sub_80737E0(a1 / 8); + } + if (v1 == 1) sub_80737A4(a1 / 8, 1); + if (v1 == 2) sub_80737A4(a1 / 8, 2); + if (v1 == 3) sub_80737A4(a1 / 8, 3); + if (v1 == 4) sub_80737A4(a1 / 8, 4); + if (v1 == 5) sub_80737A4(a1 / 8, 5); + if (v1 == 6) sub_80737A4(a1 / 8, 6); + if (v1 == 7) sub_80737A4(a1 / 8, 7); +} + +static void sub_80734A0(u16 a1) +{ + int v1; + v1 = a1 % 8; + if (v1 == 0) sub_8073704(a1 / 8, 0); + if (v1 == 1) sub_8073704(a1 / 8, 1); + if (v1 == 2) sub_8073704(a1 / 8, 2); + if (v1 == 3) sub_8073704(a1 / 8, 3); + if (v1 == 4) sub_8073704(a1 / 8, 4); + if (v1 == 5) sub_8073704(a1 / 8, 5); + if (v1 == 6) sub_8073704(a1 / 8, 6); + if (v1 == 7) sub_8073704(a1 / 8, 7); +} + +static void sub_8073514(u16 a1) +{ + int v1; + v1 = a1 % 0x10; + if (v1 == 0) sub_8073644(a1 / 0x10); + if (v1 == 1) sub_8073808(a1 / 0x10); +} + +static void sub_8073540(u16 a1) +{ + int v1; + v1 = a1 % 8; + if (v1 == 0) sub_8073830(a1 / 8, 0); + if (v1 == 1) sub_8073830(a1 / 8, 1); + if (v1 == 2) sub_8073830(a1 / 8, 2); + if (v1 == 3) sub_8073830(a1 / 8, 3); + if (v1 == 4) sub_8073830(a1 / 8, 4); + if (v1 == 5) sub_8073830(a1 / 8, 5); + if (v1 == 6) sub_8073830(a1 / 8, 6); + if (v1 == 7) sub_8073830(a1 / 8, 7); +} + +static void sub_80735B4(u16 a1) +{ + int v1; + v1 = a1 % 0x10; + if (v1 == 0) sub_807368C(a1 / 0x10); + if (v1 == 1) sub_80736DC(a1 / 0x10); +} + +static void sub_80735E4(u16 a1) +{ + int v1; + v1 = a1 % 0x10; + if (v1 == 0) sub_80736B4(a1 / 0x10); +} + +static void sub_8073600(u16 a1) +{ + int v1; + v1 = a1 % 0x10; + if (v1 == 1) sub_8073868(a1 / 0x10); +} + +static void sub_807361C(u16 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_General_4[v1], (u8 *)(BG_VRAM + 0x3c00), 0x140); +} + +static void sub_8073644(u8 a1) +{ + u8 v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], (u8 *)(BG_VRAM + 0x6400), 0x80); + v1 = (a1 + 2) % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], (u8 *)(BG_VRAM + 0x6480), 0x80); +} + +static void sub_807368C(u8 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_0[v1], (u8 *)(BG_VRAM + 0x7a00), 0x3c0); +} + +static void sub_80736B4(u8 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Underwater[v1], (u8 *)(BG_VRAM + 0x7e00), 0x80); +} + +static void sub_80736DC(u8 a1) +{ + int v1; + v1 = a1 % 8; + QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_1[v1], (u8 *)(BG_VRAM + 0x7e00), 0x100); +} + +static void sub_8073704(u16 a1, u8 a2) +{ + int v1; + a1 -= a2; + if (a1 < 12) + { + v1 = a1 % 12; + QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0A[v1], gUnknown_0837BAE4[a2], 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1A[v1], gUnknown_0837BB04[a2], 0x80); + } + else + { + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0B[v1], gUnknown_0837BAE4[a2], 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1B[v1], gUnknown_0837BB04[a2], 0x80); + } +} + +static void sub_80737A4(u16 a1, u8 a2) +{ + int v1; + a1 -= a2; + + v1 = a1 % 8; + if (gTilesetAnimTable_Rustboro_0[v1]) + { + QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_0[v1], gUnknown_0837BFA4[a2], 0x80); + } +} + +static void sub_80737E0(u16 a1) +{ + int v1; + v1 = a1 % 2; + QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_1[v1], (u8 *)(BG_VRAM + 0x7800), 0x80); +} + +static void sub_8073808(u16 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], (u8 *)(BG_VRAM + 0x5400), 0x80); +} + +static void sub_8073830(u16 a1, u8 a2) +{ + int v1; + a1 -= a2; + v1 = a1 % 8; + QueueTilesetAnimDma(gTilesetAnimTable_EverGrande[v1], gUnknown_0837C93C[a2], 0x80); +} + +static void sub_8073868(u16 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], (u8 *)(BG_VRAM + 0x7400), 0x80); +} + +static void sub_8073890(u16 a1) +{ + int v1; + v1 = a1 % 2; + if (!v1) + { + sub_80739C4(a1 / 2); + } +} + +static void sub_80738A8(u16 a1) +{ + int v1; + v1 = a1 % 8; + if (!v1) + { + sub_807392C(a1 / 8); + } +} + +static void sub_80738C0(u16 a1) +{ + if (a1 % 0x40 == 0) + { + sub_807399C(a1 / 0x40); + } + if (a1 % 8 == 1) + { + sub_8073974(a1 / 8); + } +} + +static void sub_80738EC(u16 a1) +{ + if (a1 % 4 == 0) + { + sub_80739EC(a1 / 4); + } +} + +static void sub_8073904(u16 a1) +{ + int v1; + v1 = a1 % 2; + QueueTilesetAnimDma(gTilesetAnimTable_Building[v1], (u8 *)(BG_VRAM + 0x3e00), 0x80); +} + +static void sub_807392C(u16 a1) +{ + int v1; + v1 = a1 % 3; + QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_0[v1], (u8 *)(BG_VRAM + 0x7e00), 0x180); + QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_1[v1], (u8 *)(BG_VRAM + 0x7a00), 0x280); +} + +static void sub_8073974(u16 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_0[v1], (u8 *)(BG_VRAM + 0x7f00), 0x20); +} + +static void sub_807399C(u16 a1) +{ + int v1; + v1 = a1 % 2; + QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_1[v1], (u8 *)(BG_VRAM + 0x7c00), 0x80); +} + +static void sub_80739C4(u16 a1) +{ + int v1; + v1 = a1 % 2; + QueueTilesetAnimDma(gTilesetAnimTable_MauvilleGym[v1], (u8 *)(BG_VRAM + 0x5200), 0x200); +} + +static void sub_80739EC(u16 a1) +{ + int v1; + v1 = a1 % 2; + QueueTilesetAnimDma(gTilesetAnimTable_BikeShop[v1], (u8 *)(BG_VRAM + 0x7e00), 0x120); +} diff --git a/src/engine/time_events.c b/src/engine/time_events.c new file mode 100644 index 000000000..e1b9a2e9e --- /dev/null +++ b/src/engine/time_events.c @@ -0,0 +1,118 @@ +#include "global.h" +#include "time_events.h" +#include "event_data.h" +#include "field_weather.h" +#include "pokemon.h" +#include "rng.h" +#include "rom4.h" +#include "rtc.h" +#include "script.h" +#include "task.h" + +static u32 GetMirageRnd(void) +{ + u32 hi = VarGet(VAR_MIRAGE_RND_H); + u32 lo = VarGet(VAR_MIRAGE_RND_L); + return (hi << 16) | lo; +} + +static void SetMirageRnd(u32 rnd) +{ + VarSet(VAR_MIRAGE_RND_H, rnd >> 16); + VarSet(VAR_MIRAGE_RND_L, rnd); +} + +// unused +void InitMirageRnd(void) +{ + SetMirageRnd((Random() << 16) | Random()); +} + +void UpdateMirageRnd(u16 days) +{ + s32 rnd = GetMirageRnd(); + while (days) + { + rnd = 1103515245 * rnd + 12345; + days--; + } + SetMirageRnd(rnd); +} + +bool8 IsMirageIslandPresent(void) +{ + u16 rnd = GetMirageRnd() >> 16; + int i; + + for (i = 0; i < PARTY_SIZE; i++) + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && (GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY) & 0xFFFF) == rnd) + return TRUE; + + return FALSE; +} + +void UpdateShoalTideFlag(void) +{ + static const u8 tide[] = + { + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + }; + + if (is_light_level_1_2_3_5_or_6(get_map_light_from_warp0())) + { + RtcCalcLocalTime(); + if (tide[gLocalTime.hours]) + FlagSet(SYS_SHOAL_TIDE); + else + FlagReset(SYS_SHOAL_TIDE); + } +} + +static void Task_WaitWeather(u8 taskId) +{ + if (sub_807DDFC()) + { + EnableBothScriptContexts(); + DestroyTask(taskId); + } +} + +void WaitWeather(void) +{ + CreateTask(Task_WaitWeather, 80); +} + +void InitBirchState(void) +{ + *(u16 *)GetVarPointer(VAR_BIRCH_STATE) = 0; +} + +void UpdateBirchState(u16 days) +{ + u16 *state = GetVarPointer(VAR_BIRCH_STATE); + *state += days; + *state %= 7; +} diff --git a/src/engine/trade.c b/src/engine/trade.c new file mode 100644 index 000000000..cb190d194 --- /dev/null +++ b/src/engine/trade.c @@ -0,0 +1,88 @@ +#include "global.h" +#include "name_string_util.h" +#include "string_util.h" +#include "text.h" + +struct InGameTrade { + /*0x00*/ u8 name[11]; + /*0x0C*/ u16 species; + /*0x0E*/ u8 ivs[6]; + /*0x14*/ bool8 secondAbility; + /*0x18*/ u32 otId; + /*0x1C*/ u8 stats[5]; + /*0x24*/ u32 personality; + /*0x28*/ u16 heldItem; + /*0x2A*/ u8 mailNum; + /*0x2B*/ u8 otName[11]; + /*0x36*/ u8 otGender; + /*0x37*/ u8 sheen; + /*0x38*/ u16 playerSpecies; +}; + +struct UnkStructC { + /*0x00*/ u16 words[9]; + /*0x10*/ u8 string[8]; + /*0x1A*/ u8 otId[4]; + /*0x1E*/ u16 species; + /*0x20*/ u16 heldItem; +}; + +struct UnkStructD { + /*0x00*/ u8 pad00[0x10]; + /*0x10*/ u8 var10; + /*0x11*/ u8 pad11[1]; + /*0x12*/ u16 var12[1]; +}; + +extern const struct InGameTrade gIngameTrades[]; +extern const u16 gIngameTradeMail[][10]; + + +void sub_804A96C(struct UnkStructD *arg0, u8 left, u8 top, u16 *tilemap, u8 width, u8 height, u16 sp8) { + int y, x; + + for (y = 0; y < height; y++) + { + + for (x = 0; x < width; x++) + { + arg0->var12[(top * 32 + left) + y * 32 + x] = tilemap[width * y + x] | sp8; + } + } + +#if ENGLISH + arg0->var10 = 1; +#endif +} + +#if GERMAN +void sub_804A96C_alt(struct UnkStructD *arg0, u8 left, u8 top, u16 *tilemap, u8 width, u8 height, u16 sp8) { + sub_804A96C(arg0, left, top, tilemap, width, height, sp8); + + arg0->var10 = 1; +} +#endif + +asm(".section .text.sub_804DAD4"); + +void sub_804DAD4(struct UnkStructC *arg0, struct InGameTrade *trade) { + s32 i; + + for (i = 0; i < 9; i++) + { + arg0->words[i] = gIngameTradeMail[trade->mailNum][i]; + } + + StringCopy(arg0->string, trade->otName); + +#if GERMAN + PadNameString(arg0->string, CHAR_SPACE); +#endif + + arg0->otId[0] = trade->otId >> 24; + arg0->otId[1] = trade->otId >> 16; + arg0->otId[2] = trade->otId >> 8; + arg0->otId[3] = trade->otId; + arg0->species = trade->species; + arg0->heldItem = trade->heldItem; +} diff --git a/src/engine/trainer_card.c b/src/engine/trainer_card.c new file mode 100644 index 000000000..626c5a7bf --- /dev/null +++ b/src/engine/trainer_card.c @@ -0,0 +1,1569 @@ +#include "global.h" +#include "trainer_card.h" +#include "easy_chat.h" +#include "event_data.h" +#include "field_effect.h" +#include "graphics.h" +#include "link.h" +#include "main.h" +#include "menu.h" +#include "money.h" +#include "palette.h" +#include "pokedex.h" +#include "rom4.h" +#include "script_pokemon_80C4.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "unknown_task.h" +#include "util.h" + +typedef void (*Callback)(void); + +struct Struct2000000 +{ + /*0x00*/ u8 var_0; + /*0x01*/ bool8 var_1; + /*0x02*/ u8 var_2; + /*0x03*/ bool8 var_3; + /*0x04*/ u8 var_4; + /*0x05*/ u8 var_5; + /*0x06*/ u8 var_6; + /*0x07*/ bool8 var_7; + /*0x08*/ bool8 var_8; + /*0x09*/ bool8 var_9; + /*0x0A*/ bool8 var_a; + /*0x0B*/ bool8 var_b; + /*0x0C*/ bool8 var_c; + /*0x0D*/ bool8 var_d; + /*0x0E*/ u8 var_e[8]; + /*0x16*/ u8 filler_16[10]; + /*0x20*/ u8 var_20[4][0x10]; + /*0x60*/ Callback *var_60; + /*0x64*/ struct TrainerCard var_64; + /*0x9C*/ u8 language; // 0x9C +}; + +extern u8 ewram[]; +#define ewram0 (*(struct Struct2000000 *)(ewram)) + +extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; + +EWRAM_DATA struct TrainerCard gTrainerCards[4] = {0}; + +struct UnknownStruct1 +{ + u16 filler0[0x3C0]; + u16 unk780[160]; +}; +extern struct UnknownStruct1 gUnknown_03004DE0; + +extern const u8 gBadgesTiles[]; +extern const u16 gUnknown_083B5F0C[]; +extern const u16 gBadgesPalette[]; +extern const u16 gUnknown_083B5F4C[]; +extern const u16 gUnknown_083B5F6C[]; +extern const u16 gUnknown_083B5F8C[][4]; + +const u8 gBadgesTiles[] = INCBIN_U8("graphics/trainer_card/badges.4bpp"); +// XXX: what is this? +u8 *const ewram_ = ewram; + +bool8 sub_8093864(struct Task *); +bool8 sub_80938A8(struct Task *); +bool8 sub_80938CC(struct Task *); +bool8 sub_8093918(struct Task *); +bool8 sub_8093938(struct Task *); +bool8 sub_8093954(struct Task *); +bool8 sub_8093980(struct Task *); + +bool8 (*const gUnknown_083B5EBC[])(struct Task *) = +{ + sub_8093864, + sub_80938A8, + sub_80938CC, + sub_8093918, + sub_8093938, + sub_8093954, + sub_8093980, +}; + +bool8 sub_8093AA0(struct Task *); +bool8 sub_8093AF0(struct Task *); +bool8 sub_8093C0C(struct Task *); +bool8 sub_8093C38(struct Task *); +bool8 sub_8093D50(struct Task *); + +bool8 (*const gUnknown_083B5ED8[])(struct Task *) = +{ + sub_8093AA0, + sub_8093AF0, + sub_8093C0C, + sub_8093C38, + sub_8093D50, +}; + +// FIXME: Other signature than on save_menu_util.h +void FormatPlayTime(u8 *playtime, u16 hours, u16 minutes, s16 colon); +u16 GetPokedexSeenCount(void); + +enum +{ + TD_0, + TD_1, + TD_CALLBACK, +}; + +static void sub_8093174(void); +static void sub_809323C(void); +static void sub_8093254(void); +static void sub_80932AC(Callback callBack); +static void sub_80932E4(u8 arg1, Callback callBack); +void sub_8093324(void); +static void nullsub_60(u8); +static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal); +static u8 sub_80934F4(struct TrainerCard *); +static void sub_8093534(void); +static void sub_8093550(void); +static void sub_8093598(void); +static void sub_80935EC(void); +static void sub_8093610(void); +static void sub_8093688(void); +void sub_80936D4(void); +static void sub_80937A4(void); +static void sub_80937BC(void); +static void sub_80937D8(void); +static void sub_80937F0(void); +static void nullsub_15(void); +static void sub_8093800(void); +static void sub_809380C(); +static void sub_809382C(u8 taskId); +static void sub_80939A4(void); +static void sub_80939C0(void); +static void sub_80939DC(u8 taskId); +static void sub_8093A28(void); +static u8 sub_8093A48(void); +static void sub_8093A68(u8 taskId); +void sub_8093D7C(void); +static void sub_8093DAC(void); +static void sub_8093DC8(void); +static void sub_8093DEC(void); +static void sub_8093E04(void); +static void sub_8093E28(void); +void sub_8093EA0(void); +static void sub_8093EF8(void); +static void sub_8093F14(void); +static void sub_8093F48(void); +static void sub_8093F64(void); +static void sub_8093F80(void); +static void sub_8093FD0(void); +static void sub_8094038(void); +static void sub_80940E4(void); +static void sub_8094110(void); +static void sub_8094140(void); +static void sub_8094188(void); +static void TrainerCard_Front_PrintTrainerID(void); +static void TrainerCard_Front_PrintMoney(void); +static void TrainerCard_Front_PrintPokedexCount(void); +static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon); +static void sub_809429C(void); +static void TrainerCard_Back_PrintName(void); +static void TrainerCard_Back_PrintHallOfFameTime_Label(void); +static void TrainerCard_Back_PrintHallOfFameTime(void); +static void TrainerCard_Back_PrintLinkBattlesLabel(void); +static void TrainerCard_Back_PrintLinkBattles(void); +static void TrainerCard_Back_PrintBattleTower_Label(void); +static void TrainerCard_Back_PrintBattleTower(void); +static void TrainerCard_Back_PrintLinkContests_Label(void); +static void TrainerCard_Back_PrintLinkContests(void); +static void TrainerCard_Back_PrintLinkPokeblocks_Label(void); +static void TrainerCard_Back_PrintLinkPokeblocks(void); +static void TrainerCard_Back_PrintPokemonTrades_Label(void); +static void TrainerCard_Back_PrintPokemonTrades(void); +void unref_sub_8094588(u16 left, u16 top); + +void sub_8093110(Callback arg1) +{ + sub_80932AC(arg1); + SetMainCallback2(sub_8093174); + ewram0.language = GAME_LANGUAGE; +} + +void sub_8093130(u8 playerIndex, Callback arg2) +{ + sub_80932E4(playerIndex, arg2); + SetMainCallback2(sub_8093174); + ewram0.language = gLinkPlayers[gLinkPlayerMapObjects[playerIndex].linkPlayerId].language; +} + +static void sub_8093174(void) +{ + switch (gMain.state) + { + case 0: + sub_8093534(); + sub_8093688(); + gMain.state++; + break; + case 1: + sub_8093598(); + gMain.state++; + break; + case 2: + sub_80935EC(); + gMain.state++; + break; + case 3: + sub_8093610(); + sub_80937A4(); + gMain.state++; + break; + case 4: + sub_80937BC(); + gMain.state++; + case 5: + if (MultistepInitMenuWindowContinue()) + gMain.state++; + break; + case 6: + sub_80937F0(); + gMain.state++; + break; + case 7: + sub_80937D8(); + gMain.state++; + break; + case 8: + nullsub_15(); + sub_8093800(); + sub_8093550(); + SetMainCallback2(sub_809323C); + break; + } +} + +static void sub_809323C(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_8093254(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ewram0.var_6++; + if (ewram0.var_6 >= 60) + { + ewram0.var_6 = 0; + ewram0.var_5 ^= 1; + } + if (ewram0.var_4) + DmaCopy16(3, gUnknown_03004DE0.filler0, gUnknown_03004DE0.unk780, sizeof(gUnknown_03004DE0.unk780)); +} + +static void sub_80932AC(Callback callBack) +{ + u8 taskId = CreateTask(nullsub_60, 0xFF); + struct Task *task = &gTasks[taskId]; + task->data[TD_0] = FALSE; + StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32)callBack); +} + +static void sub_80932E4(u8 arg1, Callback callBack) +{ + u8 taskId = CreateTask(nullsub_60, 0xFF); + + struct Task *task = &gTasks[taskId]; + task->data[TD_0] = TRUE; + task->data[TD_1] = arg1; + StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32)callBack); +} + +void sub_8093324(void) +{ + u8 taskId = FindTaskIdByFunc(nullsub_60); + struct Task *task = &gTasks[taskId]; + ewram0.var_1 = task->data[TD_0]; + + LoadWordFromTwoHalfwords((u16 *)&task->data[TD_CALLBACK], (u32 *)&ewram0.var_60); + + if (ewram0.var_1) + { + struct TrainerCard(*trainerCards)[4] = &gTrainerCards; + s16 var = task->data[TD_1]; + struct TrainerCard *dest = &(*trainerCards)[var]; + memcpy(&ewram0.var_64, dest, sizeof(struct TrainerCard)); + } + else + { + sub_8093390(&ewram0.var_64); + } +} + +static void nullsub_60(u8 taskid) +{ +} + +void sub_8093390(struct TrainerCard *arg1) +{ + u32 playTime; + bool32 enteredHallOfFame; + bool8 r4; + u8 i; + + arg1->gender = gSaveBlock2.playerGender; + arg1->playTimeHours = gSaveBlock2.playTimeHours; + arg1->playTimeMinutes = gSaveBlock2.playTimeMinutes; + + playTime = GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME); + enteredHallOfFame = GetGameStat(GAME_STAT_ENTERED_HOF); + if (!enteredHallOfFame) + { + playTime = 0; + } + arg1->firstHallOfFameA = playTime >> 16; + arg1->firstHallOfFameB = (playTime >> 8) & 0xFF; + arg1->firstHallOfFameC = playTime & 0xFF; + + arg1->hasPokedex = FlagGet(SYS_POKEDEX_GET); + arg1->var_3 = sub_8090FC0(); + arg1->pokedexSeen = GetPokedexSeenCount(); + + arg1->trainerId = (gSaveBlock2.playerTrainerId[1] << 8) | gSaveBlock2.playerTrainerId[0]; + + // Link Cable Battles + arg1->linkBattleWins = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_WINS, 9999); + arg1->linkBattleLosses = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_LOSSES, 9999); + + // Contests w/ Friends + arg1->contestsWithFriends = sav12_xor_get_clamped_above(GAME_STAT_WON_LINK_CONTEST, 999); + + // Pokéblocks w/ Friends + arg1->pokeblocksWithFriends = sav12_xor_get_clamped_above(GAME_STAT_POKEBLOCKS_WITH_FRIENDS, 0xFFFF); + + // Pokémon Trades + arg1->pokemonTrades = sav12_xor_get_clamped_above(GAME_STAT_POKEMON_TRADES, 0xFFFF); + + // Battle tower? + arg1->battleTowerWins = gSaveBlock2.filler_A8.var_4C8; + arg1->battleTowerLosses = gSaveBlock2.filler_A8.var_4CA; + if (arg1->battleTowerWins > 9999) + { + arg1->battleTowerWins = 9999; + } + if (arg1->battleTowerLosses > 9999) + { + arg1->battleTowerLosses = 9999; + } + + r4 = FALSE; + if (sub_80C4D50() > 4) + { + r4 = TRUE; + } + arg1->var_4 = r4; + + arg1->money = gSaveBlock1.money; + + for (i = 0; i < 4; i++) + { + arg1->var_28[i] = gSaveBlock1.unk2B1C[i]; + } + + for (i = 0; i < 8; i++) + { + arg1->playerName[i] = gSaveBlock2.playerName[i]; + } + + arg1->stars = sub_80934F4(arg1); +} + +u8 sub_80934C4(u8 id) +{ + return gTrainerCards[id].stars; +} + +static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal) +{ + u32 value = GetGameStat(index); + + if (value > maxVal) + { + value = maxVal; + } + + return value; +} + +static u8 sub_80934F4(struct TrainerCard *trainerCard) +{ + u8 value = 0; + + if (trainerCard->firstHallOfFameA != 0 || trainerCard->firstHallOfFameB != 0 || trainerCard->firstHallOfFameC != 0) + { + value++; + } + + if (trainerCard->var_3) + { + value++; + } + + if (trainerCard->battleTowerLosses > 49) + { + value++; + } + + if (trainerCard->var_4) + { + value++; + } + + return value; +} + +static void sub_8093534(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + REG_DISPCNT = 0; +} + +static void sub_8093550(void) +{ + u16 backup; + + SetVBlankCallback(sub_8093254); + + backup = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK | INTR_FLAG_HBLANK; + REG_IME = backup; + + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR | DISPSTAT_HBLANK_INTR; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; +} + +void sub_8093598(void) +{ + u8 *addr = (void *)VRAM; + u32 size = 0x10000; + + while (1) + { + DmaFill16(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaFill16(3, 0, addr, size); + break; + } + } +} + +void sub_80935EC(void) +{ + void *addr = (void *)OAM; + + DmaFill16(3, 0, addr, 0x400); +} + +void sub_8093610(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_CHARBASE(2) | BGCNT_SCREENBASE(30) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(10) | BGCNT_16COLOR | BGCNT_TXT256x256; +} + +static void sub_8093688(void) +{ + u8 i; + + sub_8093324(); + ewram0.var_0 = 0; + ewram0.var_3 = 0; + ewram0.var_4 = FALSE; + ewram0.var_2 = ewram0.var_64.stars; + ewram0.var_5 = 0; + ewram0.var_6 = 0; + for (i = 0; i < 4; i++) + sub_80EB3FC(ewram0.var_20[i], ewram0.var_64.var_28[i]); + sub_80936D4(); +} + +void sub_80936D4(void) +{ + ewram0.var_7 = 0; + ewram0.var_8 = 0; + ewram0.var_9 = 0; + ewram0.var_a = 0; + ewram0.var_b = 0; + ewram0.var_c = 0; + ewram0.var_d = 0; + memset(ewram0.var_e, 0, sizeof(ewram0.var_e)); + + if (ewram0.var_64.hasPokedex) + ewram0.var_7++; + + if (ewram0.var_64.firstHallOfFameA != 0 + || ewram0.var_64.firstHallOfFameB != 0 + || ewram0.var_64.firstHallOfFameC != 0) + ewram0.var_8++; + + if (ewram0.var_64.linkBattleWins != 0 || ewram0.var_64.linkBattleLosses != 0) + ewram0.var_9++; + + if (ewram0.var_64.battleTowerWins != 0 || ewram0.var_64.battleTowerLosses != 0) + ewram0.var_a++; + + if (ewram0.var_64.contestsWithFriends != 0) + ewram0.var_b++; + + if (ewram0.var_64.pokeblocksWithFriends != 0) + ewram0.var_c++; + + if (ewram0.var_64.pokemonTrades != 0) + ewram0.var_d++; + + if (!ewram0.var_1) + { + u32 badgeFlag; + int i = 0; + + badgeFlag = BADGE01_GET; + while (1) + { + if (FlagGet(badgeFlag)) + ewram0.var_e[i]++; + badgeFlag++; + i++; + if (badgeFlag > BADGE08_GET) + { + break; + } + } + } +} + +void sub_80937A4() +{ + ResetPaletteFade(); + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); +} + +void sub_80937BC() +{ + SetUpWindowConfig(&WindowConfig_TrainerCard_Back_Values); + MultistepInitMenuWindowBegin(&WindowConfig_TrainerCard_Back_Values); +} + +static void sub_80937D8() +{ + sub_8093E04(); + sub_8093E28(); + sub_8093F64(); + sub_8093DAC(); +} + +static void sub_80937F0() +{ + sub_8093EF8(); +} + +static void nullsub_15(void) +{ +} + +static void sub_8093800() +{ + sub_809380C(); +} + +static void sub_809380C() +{ + u8 taskId; + + taskId = CreateTask(sub_809382C, 0); + sub_809382C(taskId); +} + +static void sub_809382C(u8 taskId) +{ + while (gUnknown_083B5EBC[ewram0.var_0](&gTasks[taskId]) != 0) + ; +} + +bool8 sub_8093864(struct Task *task) +{ + ewram0.var_5 = gSaveBlock2.playTimeSeconds & 1; + ewram0.var_6 = gSaveBlock2.playTimeVBlanks; + sub_80939A4(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + ewram0.var_0++; + return FALSE; +} + +bool8 sub_80938A8(struct Task *task) +{ + if (!gPaletteFade.active) + ewram0.var_0++; + return FALSE; +} + +bool8 sub_80938CC(struct Task *task) +{ + if (gMain.newKeys & B_BUTTON) + { + ewram0.var_0 = 5; + return TRUE; + } + else if (gMain.newKeys & A_BUTTON) + { + if (ewram0.var_3 != 0) + { + ewram0.var_0 = 5; + } + else + { + ewram0.var_3 ^= 1; + ewram0.var_0 = 3; + } + return TRUE; + } + return FALSE; +} + +bool8 sub_8093918(struct Task *task) +{ + sub_8093A28(); + PlaySE(SE_CARD); + ewram0.var_0++; + return FALSE; +} + +bool8 sub_8093938(struct Task *task) +{ + if (sub_8093A48()) + ewram0.var_0 = 2; + return FALSE; +} + +bool8 sub_8093954(struct Task *task) +{ + sub_80939C0(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + ewram0.var_0++; + return FALSE; +} + +bool8 sub_8093980(struct Task *task) +{ + if (!gPaletteFade.active) + SetMainCallback2((MainCallback)ewram0.var_60); + return FALSE; +} + +static void sub_80939A4(void) +{ + CreateTask(sub_80939DC, 0); + BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values); +} + +static void sub_80939C0(void) +{ + u8 taskId = FindTaskIdByFunc(sub_80939DC); + + if (taskId != 0xFF) + DestroyTask(taskId); +} + +static void sub_80939DC(u8 taskId) +{ + u8 buffer[32]; + struct Task *task = &gTasks[taskId]; + + if (ewram0.var_5 != task->data[TD_1]) + { + task->data[TD_1] = ewram0.var_5; + task->data[TD_0] ^= TRUE; + } + TrainerCard_Front_PrintPlayTime(buffer, task->data[TD_0]); + MenuPrint(buffer, 10, 12); +} + +static void sub_8093A28(void) +{ + u8 taskId; + + taskId = CreateTask(sub_8093A68, 0); + sub_8093A68(taskId); +} + +static u8 sub_8093A48(void) +{ + if (FindTaskIdByFunc(sub_8093A68) == 0xFF) + return TRUE; + else + return FALSE; +} + +static void sub_8093A68(u8 taskId) +{ + while (gUnknown_083B5ED8[gTasks[taskId].data[0]](&gTasks[taskId]) != 0) + ; +} + +bool8 sub_8093AA0(struct Task *task) +{ + s32 i; + + ewram0.var_4 = FALSE; + dp12_8087EA4(); + for (i = 0; i < ARRAY_COUNT(gUnknown_03004DE0.unk780); i++) + gUnknown_03004DE0.unk780[i] = -4; + SetHBlankCallback(sub_8093D7C); + ewram0.var_4 = TRUE; + task->data[0]++; + return FALSE; +} + +/* +bool8 sub_8093AF0(struct Task *task) +{ + u32 r7; + u16 r9; + u32 r6; + u32 r5; + u32 r4; + u32 r10; + u32 sp0; + s16 i; + + ewram0.var_4 = 0; + task->data[1] += 3; + if (task->data[1] > 79) + task->data[1] = 79; + + r7 = task->data[1]; + r9 = 160 - r7; + r4 = r9 - r7; + r6 = -r7 << 16; + r5 = (160 << 16) / r4; + r5 -= 1 << 16; + r10 = r5 * r4 + r6; + sp0 = r5 / r4; + r5 *= 2; + + for (i = 0; i < r7; i++) + { + gUnknown_03004DE0.filler0[i] = -4 - (u32)i; + } + //_08093B74 + for (; i < r9; i++) + { + u16 var = r6 >> 16; + r6 += r5; + r5 -= sp0; + gUnknown_03004DE0.filler0[i] = -4 + var; + } + for (; i < 160; i++) + gUnknown_03004DE0.filler0[i] = -4 + (u16)(r10 >> 16); + ewram0.var_4 = 1; + if (task->data[1] > 0x4A) + task->data[0]++; + return FALSE; +} +*/ + +__attribute__((naked)) +bool8 sub_8093AF0(struct Task *task) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + mov r8, r0\n\ + ldr r1, _08093BFC @ =0x02000000\n\ + movs r0, 0\n\ + strb r0, [r1, 0x4]\n\ + mov r2, r8\n\ + ldrh r0, [r2, 0xA]\n\ + adds r0, 0x3\n\ + strh r0, [r2, 0xA]\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x4F\n\ + ble _08093B18\n\ + movs r0, 0x4F\n\ + strh r0, [r2, 0xA]\n\ +_08093B18:\n\ + mov r4, r8\n\ + movs r0, 0xA\n\ + ldrsh r7, [r4, r0]\n\ + movs r0, 0xA0\n\ + subs r0, r7\n\ + mov r9, r0\n\ + subs r4, r0, r7\n\ + negs r0, r7\n\ + lsls r6, r0, 16\n\ + movs r0, 0xA0\n\ + lsls r0, 16\n\ + adds r1, r4, 0\n\ + bl __udivsi3\n\ + adds r5, r0, 0\n\ + ldr r1, _08093C00 @ =0xffff0000\n\ + adds r5, r1\n\ + adds r0, r5, 0\n\ + muls r0, r4\n\ + adds r0, r6\n\ + mov r10, r0\n\ + adds r0, r5, 0\n\ + adds r1, r4, 0\n\ + bl __udivsi3\n\ + str r0, [sp]\n\ + lsls r5, 1\n\ + movs r3, 0\n\ + cmp r3, r7\n\ + bcs _08093B74\n\ + ldr r2, _08093C04 @ =gUnknown_03004DE0\n\ + mov r12, r2\n\ + ldr r0, _08093C08 @ =0x0000fffc\n\ + adds r4, r0, 0\n\ +_08093B5C:\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + lsls r1, r0, 1\n\ + add r1, r12\n\ + subs r2, r4, r0\n\ + strh r2, [r1]\n\ + adds r0, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, r7\n\ + bcc _08093B5C\n\ +_08093B74:\n\ + lsls r2, r3, 16\n\ + mov r1, r9\n\ + lsls r0, r1, 16\n\ + asrs r1, r0, 16\n\ + mov r4, r10\n\ + lsrs r7, r4, 16\n\ + cmp r2, r0\n\ + bge _08093BAE\n\ + ldr r0, _08093C04 @ =gUnknown_03004DE0\n\ + mov r9, r0\n\ + ldr r4, _08093C08 @ =0x0000fffc\n\ + mov r12, r4\n\ + adds r4, r1, 0\n\ +_08093B8E:\n\ + lsrs r1, r6, 16\n\ + adds r6, r5\n\ + ldr r0, [sp]\n\ + subs r5, r0\n\ + asrs r2, 16\n\ + lsls r0, r2, 1\n\ + add r0, r9\n\ + add r1, r12\n\ + strh r1, [r0]\n\ + adds r2, 0x1\n\ + lsls r2, 16\n\ + lsrs r3, r2, 16\n\ + lsls r2, r3, 16\n\ + asrs r0, r2, 16\n\ + cmp r0, r4\n\ + blt _08093B8E\n\ +_08093BAE:\n\ + adds r1, r7, 0\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x9F\n\ + bgt _08093BD4\n\ + ldr r4, _08093C04 @ =gUnknown_03004DE0\n\ + ldr r0, _08093C08 @ =0x0000fffc\n\ + adds r2, r1, r0\n\ +_08093BBE:\n\ + lsls r1, r3, 16\n\ + asrs r1, 16\n\ + lsls r0, r1, 1\n\ + adds r0, r4\n\ + strh r2, [r0]\n\ + adds r1, 0x1\n\ + lsls r1, 16\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + cmp r1, 0x9F\n\ + ble _08093BBE\n\ +_08093BD4:\n\ + movs r0, 0x1\n\ + ldr r1, _08093BFC @ =0x02000000\n\ + strb r0, [r1, 0x4]\n\ + mov r2, r8\n\ + movs r4, 0xA\n\ + ldrsh r0, [r2, r4]\n\ + cmp r0, 0x4A\n\ + ble _08093BEA\n\ + ldrh r0, [r2, 0x8]\n\ + adds r0, 0x1\n\ + strh r0, [r2, 0x8]\n\ +_08093BEA:\n\ + movs r0, 0\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08093BFC: .4byte 0x02000000\n\ +_08093C00: .4byte 0xffff0000\n\ +_08093C04: .4byte gUnknown_03004DE0\n\ +_08093C08: .4byte 0x0000fffc\n\ + .syntax divided\n"); +} + +bool8 sub_8093C0C(struct Task *task) +{ + sub_80939C0(); + sub_8093DAC(); + if (!ewram0.var_3) + sub_80939A4(); + task->data[0]++; + return TRUE; +} + +__attribute__((naked)) +bool8 sub_8093C38(struct Task *task) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + mov r8, r0\n\ + ldr r1, _08093D40 @ =0x02000000\n\ + movs r2, 0\n\ + strb r2, [r1, 0x4]\n\ + ldrh r0, [r0, 0xA]\n\ + subs r0, 0x3\n\ + mov r3, r8\n\ + strh r0, [r3, 0xA]\n\ + lsls r0, 16\n\ + cmp r0, 0\n\ + bgt _08093C5C\n\ + strh r2, [r3, 0xA]\n\ +_08093C5C:\n\ + mov r4, r8\n\ + movs r0, 0xA\n\ + ldrsh r7, [r4, r0]\n\ + movs r0, 0xA0\n\ + subs r0, r7\n\ + mov r9, r0\n\ + subs r4, r0, r7\n\ + negs r0, r7\n\ + lsls r6, r0, 16\n\ + movs r0, 0xA0\n\ + lsls r0, 16\n\ + adds r1, r4, 0\n\ + bl __udivsi3\n\ + adds r5, r0, 0\n\ + ldr r1, _08093D44 @ =0xffff0000\n\ + adds r5, r1\n\ + adds r0, r5, 0\n\ + muls r0, r4\n\ + adds r0, r6\n\ + mov r10, r0\n\ + adds r0, r5, 0\n\ + adds r1, r4, 0\n\ + bl __udivsi3\n\ + str r0, [sp]\n\ + lsrs r5, 1\n\ + movs r3, 0\n\ + cmp r3, r7\n\ + bcs _08093CB8\n\ + ldr r2, _08093D48 @ =gUnknown_03004DE0\n\ + mov r12, r2\n\ + ldr r0, _08093D4C @ =0x0000fffc\n\ + adds r4, r0, 0\n\ +_08093CA0:\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + lsls r1, r0, 1\n\ + add r1, r12\n\ + subs r2, r4, r0\n\ + strh r2, [r1]\n\ + adds r0, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, r7\n\ + bcc _08093CA0\n\ +_08093CB8:\n\ + lsls r2, r3, 16\n\ + mov r1, r9\n\ + lsls r0, r1, 16\n\ + asrs r1, r0, 16\n\ + mov r4, r10\n\ + lsrs r7, r4, 16\n\ + cmp r2, r0\n\ + bge _08093CF2\n\ + ldr r0, _08093D48 @ =gUnknown_03004DE0\n\ + mov r9, r0\n\ + ldr r3, _08093D4C @ =0x0000fffc\n\ + mov r12, r3\n\ + adds r4, r1, 0\n\ +_08093CD2:\n\ + lsrs r1, r6, 16\n\ + adds r6, r5\n\ + ldr r0, [sp]\n\ + adds r5, r0\n\ + asrs r2, 16\n\ + lsls r0, r2, 1\n\ + add r0, r9\n\ + add r1, r12\n\ + strh r1, [r0]\n\ + adds r2, 0x1\n\ + lsls r2, 16\n\ + lsrs r3, r2, 16\n\ + lsls r2, r3, 16\n\ + asrs r0, r2, 16\n\ + cmp r0, r4\n\ + blt _08093CD2\n\ +_08093CF2:\n\ + adds r1, r7, 0\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x9F\n\ + bgt _08093D18\n\ + ldr r4, _08093D48 @ =gUnknown_03004DE0\n\ + ldr r0, _08093D4C @ =0x0000fffc\n\ + adds r2, r1, r0\n\ +_08093D02:\n\ + lsls r1, r3, 16\n\ + asrs r1, 16\n\ + lsls r0, r1, 1\n\ + adds r0, r4\n\ + strh r2, [r0]\n\ + adds r1, 0x1\n\ + lsls r1, 16\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + cmp r1, 0x9F\n\ + ble _08093D02\n\ +_08093D18:\n\ + movs r0, 0x1\n\ + ldr r1, _08093D40 @ =0x02000000\n\ + strb r0, [r1, 0x4]\n\ + mov r2, r8\n\ + movs r3, 0xA\n\ + ldrsh r0, [r2, r3]\n\ + cmp r0, 0\n\ + bgt _08093D2E\n\ + ldrh r0, [r2, 0x8]\n\ + adds r0, 0x1\n\ + strh r0, [r2, 0x8]\n\ +_08093D2E:\n\ + movs r0, 0\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08093D40: .4byte 0x02000000\n\ +_08093D44: .4byte 0xffff0000\n\ +_08093D48: .4byte gUnknown_03004DE0\n\ +_08093D4C: .4byte 0x0000fffc\n\ + .syntax divided\n"); +} + +bool8 sub_8093D50(struct Task *task) +{ + u8 taskId; + + ewram0.var_4 = FALSE; + SetHBlankCallback(NULL); + sub_8093E04(); + taskId = FindTaskIdByFunc(sub_8093A68); + DestroyTask(taskId); + return FALSE; +} + +void sub_8093D7C(void) +{ + u16 bgVOffset = gUnknown_03004DE0.unk780[REG_VCOUNT & 0xFF]; + + REG_BG0VOFS = bgVOffset; + REG_BG1VOFS = bgVOffset; + REG_BG2VOFS = bgVOffset; +} + +static void sub_8093DAC(void) +{ + if (ewram0.var_3) + sub_8093DEC(); + else + sub_8093DC8(); +} + +static void sub_8093DC8(void) +{ + MenuZeroFillScreen(); + sub_80940E4(); + sub_8093F14(); + sub_8093F80(); + sub_8093FD0(); + sub_8094038(); + sub_8094140(); +} + +static void sub_8093DEC(void) +{ + MenuZeroFillScreen(); + sub_80940E4(); + sub_8093F48(); + sub_8094188(); +} + +static void sub_8093E04(void) +{ + REG_BG0VOFS = -4; + REG_BG1HOFS = 0; + REG_BG1VOFS = -4; + REG_BG2HOFS = 0; + REG_BG2VOFS = -4; +} + +static void sub_8093E28(void) +{ + const u8 *src; + u8 *dst; + u32 size; + + sub_8093EA0(); + LoadPalette(gUnknown_083B5F6C, 0xE0, 32); + src = gMenuTrainerCard_Gfx; + dst = (void *)VRAM; + size = 0x1480; + while (1) + { + DmaCopy16(3, src, dst, 0x1000); + src += 0x1000; + dst += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaCopy16(3, src, dst, size); + break; + } + } + { + const void *src = gBadgesTiles; + void *dst = (void *)(VRAM + 0x1480); + + DmaCopy16(3, src, dst, 0x400); + } +} + +extern const u16 *const gUnknown_083B5EF8[]; + +void sub_8093EA0(void) +{ + LoadPalette(gUnknown_083B5EF8[ewram0.var_2], 0, 48 * 2); + LoadPalette(gBadgesPalette, 48, 16 * 2); + LoadPalette(gUnknown_083B5F4C, 64, 16 * 2); + if (ewram0.var_64.gender != MALE) + LoadPalette(gUnknown_083B5F0C, 16, 16 * 2); +} + +static void sub_8093EF8(void) +{ + LoadTrainerGfx_TrainerCard(ewram0.var_64.gender, 80, (void *)(VRAM + 0x1880)); +} + +static void sub_8093F14(void) +{ + const void *arr[] = {gUnknown_08E8CAC0, gUnknown_08E8D4C0}; + + CpuFastSet(arr[ewram0.var_1], (void *)(VRAM + 0x4800), 0x140); +} + +// I don't really know where to put the data. It's in such a weird order. + +const u8 gUnknown_083B5EF4[] = _(" : "); + +const u16 *const gUnknown_083B5EF8[] = +{ + gMenuTrainerCard0Star_Pal, + gMenuTrainerCard1Star_Pal, + gMenuTrainerCard2Star_Pal, + gMenuTrainerCard3Star_Pal, + gMenuTrainerCard4Star_Pal, +}; + +const u16 gUnknown_083B5F0C[] = INCBIN_U16("graphics/trainer_card/83B5F0C.gbapal"); +const u16 gBadgesPalette[] = INCBIN_U16("graphics/trainer_card/badges.gbapal"); +const u16 gUnknown_083B5F4C[] = INCBIN_U16("graphics/trainer_card/83B5F4C.gbapal"); +const u16 gUnknown_083B5F6C[] = INCBIN_U16("graphics/trainer_card/83B5F6C.gbapal"); +const u16 gUnknown_083B5F8C[][4] = INCBIN_U16("graphics/trainer_card/83B5F8C_map.bin"); + +static void sub_8093F48(void) +{ + CpuFastSet(gUnknown_08E8CFC0, (void *)(VRAM + 0x4800), 320); +} + +static void sub_8093F64(void) +{ + CpuFastSet(gUnknown_08E8D9C0, (void *)(VRAM + 0x5000), 320); +} + +static void sub_8093F80(void) +{ + u16 r5 = 0xC4; + u16 *ptr = (u16 *)(VRAM + 0x4000); + s16 i; + s16 j; + + for (i = 5; i < 13; i++) + { + for (j = 19; j < 27; j++, r5++) + ptr[i * 32 + j] = r5 | 0x5000; + } +} + +static void sub_8093FD0(void) +{ + u16 *ptr = (u16 *)(VRAM + 0x4000); + s16 i = 15; + s16 var = 15 + ewram0.var_2; + + while (i < var) + { + ptr[6 * 32 + i] = 0x408F; + i++; + } + while (i < 0x13) + { + ptr[6 * 32 + i] = 0; + i++; + } +} + +static void sub_8094038(void) +{ + if (ewram0.var_1 == 0) + { + u16 *ptr = (u16 *)(VRAM + 0x4000); + s16 i; + s16 r2; + + for (i = 0, r2 = 4; i < 8; i++, r2 += 3) + { + if (ewram0.var_e[i] != 0) + { + ptr[15 * 32 + r2 + 0] = gUnknown_083B5F8C[i][0] | 0x3000; + ptr[15 * 32 + r2 + 1] = gUnknown_083B5F8C[i][1] | 0x3000; + ptr[16 * 32 + r2 + 0] = gUnknown_083B5F8C[i][2] | 0x3000; + ptr[16 * 32 + r2 + 1] = gUnknown_083B5F8C[i][3] | 0x3000; + } + } + } +} + +static void sub_80940E4(void) +{ + s16 i; + u16 *ptr; + + for (i = 0, ptr = (u16 *)(VRAM + 0x4000); i < 0x400; i++, ptr++) + *ptr = 0; +} + +static void sub_8094110(void) +{ + u16 *ptr = (u16 *)(VRAM + 0x4800); + u16 i; + + for (i = 3; i < 17; i++) + { + ptr[10 * 32 + i] = 1; + ptr[11 * 32 + i] = 1; + } +} + +static void sub_8094140(void) +{ + u8 *buffer; + + BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values); + + buffer = gStringVar1; + StringCopy(buffer, ewram0.var_64.playerName); + ConvertInternationalString(buffer, ewram0.language); + MenuPrint(buffer, 7, 5); + + TrainerCard_Front_PrintTrainerID(); + TrainerCard_Front_PrintMoney(); + TrainerCard_Front_PrintPokedexCount(); + sub_809429C(); +} + +static void sub_8094188(void) +{ + BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values); + TrainerCard_Back_PrintName(); + TrainerCard_Back_PrintHallOfFameTime_Label(); + TrainerCard_Back_PrintLinkBattlesLabel(); + TrainerCard_Back_PrintBattleTower_Label(); + TrainerCard_Back_PrintLinkContests_Label(); + TrainerCard_Back_PrintLinkPokeblocks_Label(); + TrainerCard_Back_PrintPokemonTrades_Label(); + + BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Labels); + TrainerCard_Back_PrintHallOfFameTime(); + TrainerCard_Back_PrintLinkBattles(); + TrainerCard_Back_PrintBattleTower(); + TrainerCard_Back_PrintLinkContests(); + TrainerCard_Back_PrintLinkPokeblocks(); + TrainerCard_Back_PrintPokemonTrades(); +} + +static void TrainerCard_Front_PrintTrainerID(void) +{ + u8 buffer[8]; + + ConvertIntToDecimalStringN(buffer, ewram0.var_64.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5); + MenuPrint(buffer, 20, 2); +} + +static void TrainerCard_Front_PrintMoney(void) +{ + sub_80B7AEC(ewram0.var_64.money, 16, 8); +} + +static void TrainerCard_Front_PrintPokedexCount(void) +{ + u8 buffer[16]; + + if (ewram0.var_7 == FALSE) + { + sub_8094110(); + } + else + { + ConvertIntToDecimalStringN(buffer, ewram0.var_64.pokedexSeen, STR_CONV_MODE_LEFT_ALIGN, 3); + MenuPrint_RightAligned(buffer, 16, 10); + } +} + +static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon) +{ + u8 buffer[16]; + u16 playTimeHours; + u16 playTimeMinutes; + + playTimeHours = gSaveBlock2.playTimeHours; + playTimeMinutes = gSaveBlock2.playTimeMinutes; + if (ewram0.var_1 != 0) + { + playTimeHours = ewram0.var_64.playTimeHours; + playTimeMinutes = ewram0.var_64.playTimeMinutes; + } + FormatPlayTime(buffer, playTimeHours, playTimeMinutes, colon); + sub_8072C74(arg1, buffer, 48, 1); +} + +static void sub_809429C(void) +{ + u8 *str; + + if (ewram0.var_1 != 0) + { + str = gStringVar1; + str = StringCopy(str, ewram0.var_20[0]); + str[0] = 00; + str++; + str = StringCopy(str, ewram0.var_20[1]); + MenuPrint(gStringVar1, 2, 14); + + str = gStringVar1; + str = StringCopy(str, ewram0.var_20[2]); + str[0] = 00; + str++; + str = StringCopy(str, ewram0.var_20[3]); + MenuPrint(gStringVar1, 2, 16); + } +} + +static void TrainerCard_Back_PrintName(void) +{ + u8 *str; + + str = gStringVar1; + StringCopy(str, ewram0.var_64.playerName); + ConvertInternationalString(str, ewram0.language); + +#if ENGLISH + StringAppend(str, gOtherText_TrainersTrainerCard); +#elif GERMAN + de_sub_8073174(str, gOtherText_TrainersTrainerCard); +#endif + + MenuPrint_RightAligned(gStringVar1, 28, 2); +} + +static void TrainerCard_Back_PrintHallOfFameTime_Label(void) +{ + if (ewram0.var_8 != 0) + MenuPrint(gOtherText_FirstHOF, 3, 5); +} + +static void TrainerCard_Back_PrintHallOfFameTime(void) +{ + u8 *str; + + if (ewram0.var_8 != 0) + { + str = gStringVar1; + str = ConvertIntToDecimalStringN(str, ewram0.var_64.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN, 3); + str = StringCopy(str, gUnknown_083B5EF4); + str = ConvertIntToDecimalStringN(str, ewram0.var_64.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS, 2); + str = StringCopy(str, gUnknown_083B5EF4); + str = ConvertIntToDecimalStringN(str, ewram0.var_64.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS, 2); + MenuPrint_RightAligned(gStringVar1, 28, 5); + } +} + +static void TrainerCard_Back_PrintLinkBattlesLabel(void) +{ + if (ewram0.var_9 != 0) + MenuPrint(gOtherText_LinkCableBattles, 3, 7); +} + +static void TrainerCard_Back_PrintLinkBattles(void) +{ + u8 buffer[16]; + + if (ewram0.var_9 != 0) + { + ConvertIntToDecimalString(buffer, ewram0.var_64.linkBattleWins); + MenuPrint_RightAligned(buffer, 22, 7); + + ConvertIntToDecimalString(buffer, ewram0.var_64.linkBattleLosses); + MenuPrint_RightAligned(buffer, 28, 7); + } +} + +static void TrainerCard_Back_PrintBattleTower_Label(void) +{ + if (ewram0.var_a != 0) + MenuPrint(gOtherText_BattleTowerWinRecord, 3, 15); +} + +static void TrainerCard_Back_PrintBattleTower(void) +{ + u8 buffer[16]; + + if (ewram0.var_a != 0) + { + sub_8072C44(buffer, ewram0.var_64.battleTowerWins, 24, 1); + MenuPrint_PixelCoords(buffer, 112, 120, 0); + + sub_8072C44(buffer, ewram0.var_64.battleTowerLosses, 24, 1); + MenuPrint_PixelCoords(buffer, 149, 120, 0); + } +} + +static void TrainerCard_Back_PrintLinkContests_Label(void) +{ + if (ewram0.var_b != 0) + MenuPrint(gOtherText_ContestRecord, 3, 13); +} + +static void TrainerCard_Back_PrintLinkContests(void) +{ + u8 buffer[8]; + + if (ewram0.var_b != 0) + { + ConvertIntToDecimalStringN(buffer, ewram0.var_64.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 3); + MenuPrint_RightAligned(buffer, 28, 13); + } +} + +static void TrainerCard_Back_PrintLinkPokeblocks_Label(void) +{ + if (ewram0.var_c != 0) + MenuPrint(gOtherText_MixingRecord, 3, 11); +} + +static void TrainerCard_Back_PrintLinkPokeblocks(void) +{ + u8 buffer[8]; + + if (ewram0.var_c != 0) + { + ConvertIntToDecimalStringN(buffer, ewram0.var_64.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); + MenuPrint_RightAligned(buffer, 28, 11); + } +} + +static void TrainerCard_Back_PrintPokemonTrades_Label(void) +{ + if (ewram0.var_d != 0) + MenuPrint(gOtherText_TradeRecord, 3, 9); +} + +static void TrainerCard_Back_PrintPokemonTrades(void) +{ + u8 buffer[8]; + + if (ewram0.var_d != 0) + { + ConvertIntToDecimalStringN(buffer, ewram0.var_64.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5); + MenuPrint_RightAligned(buffer, 28, 9); + } +} + +void unref_sub_8094588(u16 left, u16 top) +{ + const u8 *text = gOtherText_Boy; + + if (gSaveBlock2.playerGender == FEMALE) + text = gOtherText_Girl; + MenuPrint(text, left, top); +} diff --git a/src/engine/trig.c b/src/engine/trig.c new file mode 100644 index 000000000..e16a69e63 --- /dev/null +++ b/src/engine/trig.c @@ -0,0 +1,549 @@ +#include "global.h" +#include "trig.h" + +// Converts a number to Q8.8 fixed-point format +#define Q_8_8(n) ((s16)((n) * 256)) + +// Converts a number to Q4.12 fixed-point format +#define Q_4_12(n) ((s16)((n) * 4096)) + +// Values of sin(x*(π/128)) as Q8.8 fixed-point numbers from x = 0 to x = 319 +const s16 gSineTable[] = +{ + Q_8_8(0), // sin(0*(π/128)) + Q_8_8(0.0234375), // sin(1*(π/128)) + Q_8_8(0.046875), // sin(2*(π/128)) + Q_8_8(0.0703125), // sin(3*(π/128)) + Q_8_8(0.09765625), // sin(4*(π/128)) + Q_8_8(0.12109375), // sin(5*(π/128)) + Q_8_8(0.14453125), // sin(6*(π/128)) + Q_8_8(0.16796875), // sin(7*(π/128)) + Q_8_8(0.19140625), // sin(8*(π/128)) + Q_8_8(0.21875), // sin(9*(π/128)) + Q_8_8(0.2421875), // sin(10*(π/128)) + Q_8_8(0.265625), // sin(11*(π/128)) + Q_8_8(0.2890625), // sin(12*(π/128)) + Q_8_8(0.3125), // sin(13*(π/128)) + Q_8_8(0.3359375), // sin(14*(π/128)) + Q_8_8(0.359375), // sin(15*(π/128)) + Q_8_8(0.37890625), // sin(16*(π/128)) + Q_8_8(0.40234375), // sin(17*(π/128)) + Q_8_8(0.42578125), // sin(18*(π/128)) + Q_8_8(0.44921875), // sin(19*(π/128)) + Q_8_8(0.46875), // sin(20*(π/128)) + Q_8_8(0.4921875), // sin(21*(π/128)) + Q_8_8(0.51171875), // sin(22*(π/128)) + Q_8_8(0.53125), // sin(23*(π/128)) + Q_8_8(0.5546875), // sin(24*(π/128)) + Q_8_8(0.57421875), // sin(25*(π/128)) + Q_8_8(0.59375), // sin(26*(π/128)) + Q_8_8(0.61328125), // sin(27*(π/128)) + Q_8_8(0.6328125), // sin(28*(π/128)) + Q_8_8(0.65234375), // sin(29*(π/128)) + Q_8_8(0.66796875), // sin(30*(π/128)) + Q_8_8(0.6875), // sin(31*(π/128)) + Q_8_8(0.70703125), // sin(32*(π/128)) + Q_8_8(0.72265625), // sin(33*(π/128)) + Q_8_8(0.73828125), // sin(34*(π/128)) + Q_8_8(0.75390625), // sin(35*(π/128)) + Q_8_8(0.76953125), // sin(36*(π/128)) + Q_8_8(0.78515625), // sin(37*(π/128)) + Q_8_8(0.80078125), // sin(38*(π/128)) + Q_8_8(0.81640625), // sin(39*(π/128)) + Q_8_8(0.828125), // sin(40*(π/128)) + Q_8_8(0.84375), // sin(41*(π/128)) + Q_8_8(0.85546875), // sin(42*(π/128)) + Q_8_8(0.8671875), // sin(43*(π/128)) + Q_8_8(0.87890625), // sin(44*(π/128)) + Q_8_8(0.890625), // sin(45*(π/128)) + Q_8_8(0.90234375), // sin(46*(π/128)) + Q_8_8(0.9140625), // sin(47*(π/128)) + Q_8_8(0.921875), // sin(48*(π/128)) + Q_8_8(0.9296875), // sin(49*(π/128)) + Q_8_8(0.94140625), // sin(50*(π/128)) + Q_8_8(0.94921875), // sin(51*(π/128)) + Q_8_8(0.953125), // sin(52*(π/128)) + Q_8_8(0.9609375), // sin(53*(π/128)) + Q_8_8(0.96875), // sin(54*(π/128)) + Q_8_8(0.97265625), // sin(55*(π/128)) + Q_8_8(0.98046875), // sin(56*(π/128)) + Q_8_8(0.984375), // sin(57*(π/128)) + Q_8_8(0.98828125), // sin(58*(π/128)) + Q_8_8(0.9921875), // sin(59*(π/128)) + Q_8_8(0.9921875), // sin(60*(π/128)) + Q_8_8(0.99609375), // sin(61*(π/128)) + Q_8_8(0.99609375), // sin(62*(π/128)) + Q_8_8(0.99609375), // sin(63*(π/128)) + Q_8_8(1), // sin(64*(π/128)) + Q_8_8(0.99609375), // sin(65*(π/128)) + Q_8_8(0.99609375), // sin(66*(π/128)) + Q_8_8(0.99609375), // sin(67*(π/128)) + Q_8_8(0.9921875), // sin(68*(π/128)) + Q_8_8(0.9921875), // sin(69*(π/128)) + Q_8_8(0.98828125), // sin(70*(π/128)) + Q_8_8(0.984375), // sin(71*(π/128)) + Q_8_8(0.98046875), // sin(72*(π/128)) + Q_8_8(0.97265625), // sin(73*(π/128)) + Q_8_8(0.96875), // sin(74*(π/128)) + Q_8_8(0.9609375), // sin(75*(π/128)) + Q_8_8(0.953125), // sin(76*(π/128)) + Q_8_8(0.94921875), // sin(77*(π/128)) + Q_8_8(0.94140625), // sin(78*(π/128)) + Q_8_8(0.9296875), // sin(79*(π/128)) + Q_8_8(0.921875), // sin(80*(π/128)) + Q_8_8(0.9140625), // sin(81*(π/128)) + Q_8_8(0.90234375), // sin(82*(π/128)) + Q_8_8(0.890625), // sin(83*(π/128)) + Q_8_8(0.87890625), // sin(84*(π/128)) + Q_8_8(0.8671875), // sin(85*(π/128)) + Q_8_8(0.85546875), // sin(86*(π/128)) + Q_8_8(0.84375), // sin(87*(π/128)) + Q_8_8(0.828125), // sin(88*(π/128)) + Q_8_8(0.81640625), // sin(89*(π/128)) + Q_8_8(0.80078125), // sin(90*(π/128)) + Q_8_8(0.78515625), // sin(91*(π/128)) + Q_8_8(0.76953125), // sin(92*(π/128)) + Q_8_8(0.75390625), // sin(93*(π/128)) + Q_8_8(0.73828125), // sin(94*(π/128)) + Q_8_8(0.72265625), // sin(95*(π/128)) + Q_8_8(0.70703125), // sin(96*(π/128)) + Q_8_8(0.6875), // sin(97*(π/128)) + Q_8_8(0.66796875), // sin(98*(π/128)) + Q_8_8(0.65234375), // sin(99*(π/128)) + Q_8_8(0.6328125), // sin(100*(π/128)) + Q_8_8(0.61328125), // sin(101*(π/128)) + Q_8_8(0.59375), // sin(102*(π/128)) + Q_8_8(0.57421875), // sin(103*(π/128)) + Q_8_8(0.5546875), // sin(104*(π/128)) + Q_8_8(0.53125), // sin(105*(π/128)) + Q_8_8(0.51171875), // sin(106*(π/128)) + Q_8_8(0.4921875), // sin(107*(π/128)) + Q_8_8(0.46875), // sin(108*(π/128)) + Q_8_8(0.44921875), // sin(109*(π/128)) + Q_8_8(0.42578125), // sin(110*(π/128)) + Q_8_8(0.40234375), // sin(111*(π/128)) + Q_8_8(0.37890625), // sin(112*(π/128)) + Q_8_8(0.359375), // sin(113*(π/128)) + Q_8_8(0.3359375), // sin(114*(π/128)) + Q_8_8(0.3125), // sin(115*(π/128)) + Q_8_8(0.2890625), // sin(116*(π/128)) + Q_8_8(0.265625), // sin(117*(π/128)) + Q_8_8(0.2421875), // sin(118*(π/128)) + Q_8_8(0.21875), // sin(119*(π/128)) + Q_8_8(0.19140625), // sin(120*(π/128)) + Q_8_8(0.16796875), // sin(121*(π/128)) + Q_8_8(0.14453125), // sin(122*(π/128)) + Q_8_8(0.12109375), // sin(123*(π/128)) + Q_8_8(0.09765625), // sin(124*(π/128)) + Q_8_8(0.0703125), // sin(125*(π/128)) + Q_8_8(0.046875), // sin(126*(π/128)) + Q_8_8(0.0234375), // sin(127*(π/128)) + Q_8_8(0), // sin(128*(π/128)) + Q_8_8(-0.0234375), // sin(129*(π/128)) + Q_8_8(-0.046875), // sin(130*(π/128)) + Q_8_8(-0.0703125), // sin(131*(π/128)) + Q_8_8(-0.09765625), // sin(132*(π/128)) + Q_8_8(-0.12109375), // sin(133*(π/128)) + Q_8_8(-0.14453125), // sin(134*(π/128)) + Q_8_8(-0.16796875), // sin(135*(π/128)) + Q_8_8(-0.19140625), // sin(136*(π/128)) + Q_8_8(-0.21875), // sin(137*(π/128)) + Q_8_8(-0.2421875), // sin(138*(π/128)) + Q_8_8(-0.265625), // sin(139*(π/128)) + Q_8_8(-0.2890625), // sin(140*(π/128)) + Q_8_8(-0.3125), // sin(141*(π/128)) + Q_8_8(-0.3359375), // sin(142*(π/128)) + Q_8_8(-0.359375), // sin(143*(π/128)) + Q_8_8(-0.37890625), // sin(144*(π/128)) + Q_8_8(-0.40234375), // sin(145*(π/128)) + Q_8_8(-0.42578125), // sin(146*(π/128)) + Q_8_8(-0.44921875), // sin(147*(π/128)) + Q_8_8(-0.46875), // sin(148*(π/128)) + Q_8_8(-0.4921875), // sin(149*(π/128)) + Q_8_8(-0.51171875), // sin(150*(π/128)) + Q_8_8(-0.53125), // sin(151*(π/128)) + Q_8_8(-0.5546875), // sin(152*(π/128)) + Q_8_8(-0.57421875), // sin(153*(π/128)) + Q_8_8(-0.59375), // sin(154*(π/128)) + Q_8_8(-0.61328125), // sin(155*(π/128)) + Q_8_8(-0.6328125), // sin(156*(π/128)) + Q_8_8(-0.65234375), // sin(157*(π/128)) + Q_8_8(-0.66796875), // sin(158*(π/128)) + Q_8_8(-0.6875), // sin(159*(π/128)) + Q_8_8(-0.70703125), // sin(160*(π/128)) + Q_8_8(-0.72265625), // sin(161*(π/128)) + Q_8_8(-0.73828125), // sin(162*(π/128)) + Q_8_8(-0.75390625), // sin(163*(π/128)) + Q_8_8(-0.76953125), // sin(164*(π/128)) + Q_8_8(-0.78515625), // sin(165*(π/128)) + Q_8_8(-0.80078125), // sin(166*(π/128)) + Q_8_8(-0.81640625), // sin(167*(π/128)) + Q_8_8(-0.828125), // sin(168*(π/128)) + Q_8_8(-0.84375), // sin(169*(π/128)) + Q_8_8(-0.85546875), // sin(170*(π/128)) + Q_8_8(-0.8671875), // sin(171*(π/128)) + Q_8_8(-0.87890625), // sin(172*(π/128)) + Q_8_8(-0.890625), // sin(173*(π/128)) + Q_8_8(-0.90234375), // sin(174*(π/128)) + Q_8_8(-0.9140625), // sin(175*(π/128)) + Q_8_8(-0.921875), // sin(176*(π/128)) + Q_8_8(-0.9296875), // sin(177*(π/128)) + Q_8_8(-0.94140625), // sin(178*(π/128)) + Q_8_8(-0.94921875), // sin(179*(π/128)) + Q_8_8(-0.953125), // sin(180*(π/128)) + Q_8_8(-0.9609375), // sin(181*(π/128)) + Q_8_8(-0.96875), // sin(182*(π/128)) + Q_8_8(-0.97265625), // sin(183*(π/128)) + Q_8_8(-0.98046875), // sin(184*(π/128)) + Q_8_8(-0.984375), // sin(185*(π/128)) + Q_8_8(-0.98828125), // sin(186*(π/128)) + Q_8_8(-0.9921875), // sin(187*(π/128)) + Q_8_8(-0.9921875), // sin(188*(π/128)) + Q_8_8(-0.99609375), // sin(189*(π/128)) + Q_8_8(-0.99609375), // sin(190*(π/128)) + Q_8_8(-0.99609375), // sin(191*(π/128)) + Q_8_8(-1), // sin(192*(π/128)) + Q_8_8(-0.99609375), // sin(193*(π/128)) + Q_8_8(-0.99609375), // sin(194*(π/128)) + Q_8_8(-0.99609375), // sin(195*(π/128)) + Q_8_8(-0.9921875), // sin(196*(π/128)) + Q_8_8(-0.9921875), // sin(197*(π/128)) + Q_8_8(-0.98828125), // sin(198*(π/128)) + Q_8_8(-0.984375), // sin(199*(π/128)) + Q_8_8(-0.98046875), // sin(200*(π/128)) + Q_8_8(-0.97265625), // sin(201*(π/128)) + Q_8_8(-0.96875), // sin(202*(π/128)) + Q_8_8(-0.9609375), // sin(203*(π/128)) + Q_8_8(-0.953125), // sin(204*(π/128)) + Q_8_8(-0.94921875), // sin(205*(π/128)) + Q_8_8(-0.94140625), // sin(206*(π/128)) + Q_8_8(-0.9296875), // sin(207*(π/128)) + Q_8_8(-0.921875), // sin(208*(π/128)) + Q_8_8(-0.9140625), // sin(209*(π/128)) + Q_8_8(-0.90234375), // sin(210*(π/128)) + Q_8_8(-0.890625), // sin(211*(π/128)) + Q_8_8(-0.87890625), // sin(212*(π/128)) + Q_8_8(-0.8671875), // sin(213*(π/128)) + Q_8_8(-0.85546875), // sin(214*(π/128)) + Q_8_8(-0.84375), // sin(215*(π/128)) + Q_8_8(-0.828125), // sin(216*(π/128)) + Q_8_8(-0.81640625), // sin(217*(π/128)) + Q_8_8(-0.80078125), // sin(218*(π/128)) + Q_8_8(-0.78515625), // sin(219*(π/128)) + Q_8_8(-0.76953125), // sin(220*(π/128)) + Q_8_8(-0.75390625), // sin(221*(π/128)) + Q_8_8(-0.73828125), // sin(222*(π/128)) + Q_8_8(-0.72265625), // sin(223*(π/128)) + Q_8_8(-0.70703125), // sin(224*(π/128)) + Q_8_8(-0.6875), // sin(225*(π/128)) + Q_8_8(-0.66796875), // sin(226*(π/128)) + Q_8_8(-0.65234375), // sin(227*(π/128)) + Q_8_8(-0.6328125), // sin(228*(π/128)) + Q_8_8(-0.61328125), // sin(229*(π/128)) + Q_8_8(-0.59375), // sin(230*(π/128)) + Q_8_8(-0.57421875), // sin(231*(π/128)) + Q_8_8(-0.5546875), // sin(232*(π/128)) + Q_8_8(-0.53125), // sin(233*(π/128)) + Q_8_8(-0.51171875), // sin(234*(π/128)) + Q_8_8(-0.4921875), // sin(235*(π/128)) + Q_8_8(-0.46875), // sin(236*(π/128)) + Q_8_8(-0.44921875), // sin(237*(π/128)) + Q_8_8(-0.42578125), // sin(238*(π/128)) + Q_8_8(-0.40234375), // sin(239*(π/128)) + Q_8_8(-0.37890625), // sin(240*(π/128)) + Q_8_8(-0.359375), // sin(241*(π/128)) + Q_8_8(-0.3359375), // sin(242*(π/128)) + Q_8_8(-0.3125), // sin(243*(π/128)) + Q_8_8(-0.2890625), // sin(244*(π/128)) + Q_8_8(-0.265625), // sin(245*(π/128)) + Q_8_8(-0.2421875), // sin(246*(π/128)) + Q_8_8(-0.21875), // sin(247*(π/128)) + Q_8_8(-0.19140625), // sin(248*(π/128)) + Q_8_8(-0.16796875), // sin(249*(π/128)) + Q_8_8(-0.14453125), // sin(250*(π/128)) + Q_8_8(-0.12109375), // sin(251*(π/128)) + Q_8_8(-0.09765625), // sin(252*(π/128)) + Q_8_8(-0.0703125), // sin(253*(π/128)) + Q_8_8(-0.046875), // sin(254*(π/128)) + Q_8_8(-0.0234375), // sin(255*(π/128)) + Q_8_8(0), // sin(256*(π/128)) + Q_8_8(0.0234375), // sin(257*(π/128)) + Q_8_8(0.046875), // sin(258*(π/128)) + Q_8_8(0.0703125), // sin(259*(π/128)) + Q_8_8(0.09765625), // sin(260*(π/128)) + Q_8_8(0.12109375), // sin(261*(π/128)) + Q_8_8(0.14453125), // sin(262*(π/128)) + Q_8_8(0.16796875), // sin(263*(π/128)) + Q_8_8(0.19140625), // sin(264*(π/128)) + Q_8_8(0.21875), // sin(265*(π/128)) + Q_8_8(0.2421875), // sin(266*(π/128)) + Q_8_8(0.265625), // sin(267*(π/128)) + Q_8_8(0.2890625), // sin(268*(π/128)) + Q_8_8(0.3125), // sin(269*(π/128)) + Q_8_8(0.3359375), // sin(270*(π/128)) + Q_8_8(0.359375), // sin(271*(π/128)) + Q_8_8(0.37890625), // sin(272*(π/128)) + Q_8_8(0.40234375), // sin(273*(π/128)) + Q_8_8(0.42578125), // sin(274*(π/128)) + Q_8_8(0.44921875), // sin(275*(π/128)) + Q_8_8(0.46875), // sin(276*(π/128)) + Q_8_8(0.4921875), // sin(277*(π/128)) + Q_8_8(0.51171875), // sin(278*(π/128)) + Q_8_8(0.53125), // sin(279*(π/128)) + Q_8_8(0.5546875), // sin(280*(π/128)) + Q_8_8(0.57421875), // sin(281*(π/128)) + Q_8_8(0.59375), // sin(282*(π/128)) + Q_8_8(0.61328125), // sin(283*(π/128)) + Q_8_8(0.6328125), // sin(284*(π/128)) + Q_8_8(0.65234375), // sin(285*(π/128)) + Q_8_8(0.66796875), // sin(286*(π/128)) + Q_8_8(0.6875), // sin(287*(π/128)) + Q_8_8(0.70703125), // sin(288*(π/128)) + Q_8_8(0.72265625), // sin(289*(π/128)) + Q_8_8(0.73828125), // sin(290*(π/128)) + Q_8_8(0.75390625), // sin(291*(π/128)) + Q_8_8(0.76953125), // sin(292*(π/128)) + Q_8_8(0.78515625), // sin(293*(π/128)) + Q_8_8(0.80078125), // sin(294*(π/128)) + Q_8_8(0.81640625), // sin(295*(π/128)) + Q_8_8(0.828125), // sin(296*(π/128)) + Q_8_8(0.84375), // sin(297*(π/128)) + Q_8_8(0.85546875), // sin(298*(π/128)) + Q_8_8(0.8671875), // sin(299*(π/128)) + Q_8_8(0.87890625), // sin(300*(π/128)) + Q_8_8(0.890625), // sin(301*(π/128)) + Q_8_8(0.90234375), // sin(302*(π/128)) + Q_8_8(0.9140625), // sin(303*(π/128)) + Q_8_8(0.921875), // sin(304*(π/128)) + Q_8_8(0.9296875), // sin(305*(π/128)) + Q_8_8(0.94140625), // sin(306*(π/128)) + Q_8_8(0.94921875), // sin(307*(π/128)) + Q_8_8(0.953125), // sin(308*(π/128)) + Q_8_8(0.9609375), // sin(309*(π/128)) + Q_8_8(0.96875), // sin(310*(π/128)) + Q_8_8(0.97265625), // sin(311*(π/128)) + Q_8_8(0.98046875), // sin(312*(π/128)) + Q_8_8(0.984375), // sin(313*(π/128)) + Q_8_8(0.98828125), // sin(314*(π/128)) + Q_8_8(0.9921875), // sin(315*(π/128)) + Q_8_8(0.9921875), // sin(316*(π/128)) + Q_8_8(0.99609375), // sin(317*(π/128)) + Q_8_8(0.99609375), // sin(318*(π/128)) + Q_8_8(0.99609375), // sin(319*(π/128)) +}; + +// values of sin(x) as Q4.12 fixed-point numbers from x = 0° to x = 179° +const s16 gSineDegreeTable[] = +{ + Q_4_12(0), // sin(0°) + Q_4_12(0.017333984375), // sin(1°) + Q_4_12(0.034912109375), // sin(2°) + Q_4_12(0.05224609375), // sin(3°) + Q_4_12(0.06982421875), // sin(4°) + Q_4_12(0.087158203125), // sin(5°) + Q_4_12(0.1044921875), // sin(6°) + Q_4_12(0.121826171875), // sin(7°) + Q_4_12(0.13916015625), // sin(8°) + Q_4_12(0.156494140625), // sin(9°) + Q_4_12(0.173583984375), // sin(10°) + Q_4_12(0.19091796875), // sin(11°) + Q_4_12(0.2080078125), // sin(12°) + Q_4_12(0.224853515625), // sin(13°) + Q_4_12(0.241943359375), // sin(14°) + Q_4_12(0.2587890625), // sin(15°) + Q_4_12(0.275634765625), // sin(16°) + Q_4_12(0.29248046875), // sin(17°) + Q_4_12(0.30908203125), // sin(18°) + Q_4_12(0.32568359375), // sin(19°) + Q_4_12(0.342041015625), // sin(20°) + Q_4_12(0.3583984375), // sin(21°) + Q_4_12(0.37451171875), // sin(22°) + Q_4_12(0.390625), // sin(23°) + Q_4_12(0.40673828125), // sin(24°) + Q_4_12(0.422607421875), // sin(25°) + Q_4_12(0.4384765625), // sin(26°) + Q_4_12(0.4541015625), // sin(27°) + Q_4_12(0.469482421875), // sin(28°) + Q_4_12(0.48486328125), // sin(29°) + Q_4_12(0.5), // sin(30°) + Q_4_12(0.51513671875), // sin(31°) + Q_4_12(0.530029296875), // sin(32°) + Q_4_12(0.544677734375), // sin(33°) + Q_4_12(0.55908203125), // sin(34°) + Q_4_12(0.573486328125), // sin(35°) + Q_4_12(0.587890625), // sin(36°) + Q_4_12(0.601806640625), // sin(37°) + Q_4_12(0.61572265625), // sin(38°) + Q_4_12(0.62939453125), // sin(39°) + Q_4_12(0.642822265625), // sin(40°) + Q_4_12(0.656005859375), // sin(41°) + Q_4_12(0.669189453125), // sin(42°) + Q_4_12(0.681884765625), // sin(43°) + Q_4_12(0.694580078125), // sin(44°) + Q_4_12(0.70703125), // sin(45°) + Q_4_12(0.71923828125), // sin(46°) + Q_4_12(0.7314453125), // sin(47°) + Q_4_12(0.7431640625), // sin(48°) + Q_4_12(0.754638671875), // sin(49°) + Q_4_12(0.76611328125), // sin(50°) + Q_4_12(0.777099609375), // sin(51°) + Q_4_12(0.7880859375), // sin(52°) + Q_4_12(0.798583984375), // sin(53°) + Q_4_12(0.80908203125), // sin(54°) + Q_4_12(0.819091796875), // sin(55°) + Q_4_12(0.8291015625), // sin(56°) + Q_4_12(0.838623046875), // sin(57°) + Q_4_12(0.84814453125), // sin(58°) + Q_4_12(0.857177734375), // sin(59°) + Q_4_12(0.865966796875), // sin(60°) + Q_4_12(0.87451171875), // sin(61°) + Q_4_12(0.883056640625), // sin(62°) + Q_4_12(0.89111328125), // sin(63°) + Q_4_12(0.898681640625), // sin(64°) + Q_4_12(0.90625), // sin(65°) + Q_4_12(0.91357421875), // sin(66°) + Q_4_12(0.92041015625), // sin(67°) + Q_4_12(0.92724609375), // sin(68°) + Q_4_12(0.93359375), // sin(69°) + Q_4_12(0.939697265625), // sin(70°) + Q_4_12(0.945556640625), // sin(71°) + Q_4_12(0.951171875), // sin(72°) + Q_4_12(0.956298828125), // sin(73°) + Q_4_12(0.961181640625), // sin(74°) + Q_4_12(0.9658203125), // sin(75°) + Q_4_12(0.97021484375), // sin(76°) + Q_4_12(0.974365234375), // sin(77°) + Q_4_12(0.97802734375), // sin(78°) + Q_4_12(0.981689453125), // sin(79°) + Q_4_12(0.98486328125), // sin(80°) + Q_4_12(0.98779296875), // sin(81°) + Q_4_12(0.990234375), // sin(82°) + Q_4_12(0.992431640625), // sin(83°) + Q_4_12(0.994384765625), // sin(84°) + Q_4_12(0.99609375), // sin(85°) + Q_4_12(0.99755859375), // sin(86°) + Q_4_12(0.99853515625), // sin(87°) + Q_4_12(0.999267578125), // sin(88°) + Q_4_12(0.999755859375), // sin(89°) + Q_4_12(1), // sin(90°) + Q_4_12(0.999755859375), // sin(91°) + Q_4_12(0.999267578125), // sin(92°) + Q_4_12(0.99853515625), // sin(93°) + Q_4_12(0.99755859375), // sin(94°) + Q_4_12(0.99609375), // sin(95°) + Q_4_12(0.994384765625), // sin(96°) + Q_4_12(0.992431640625), // sin(97°) + Q_4_12(0.990234375), // sin(98°) + Q_4_12(0.98779296875), // sin(99°) + Q_4_12(0.98486328125), // sin(100°) + Q_4_12(0.981689453125), // sin(101°) + Q_4_12(0.97802734375), // sin(102°) + Q_4_12(0.974365234375), // sin(103°) + Q_4_12(0.97021484375), // sin(104°) + Q_4_12(0.9658203125), // sin(105°) + Q_4_12(0.961181640625), // sin(106°) + Q_4_12(0.956298828125), // sin(107°) + Q_4_12(0.951171875), // sin(108°) + Q_4_12(0.945556640625), // sin(109°) + Q_4_12(0.939697265625), // sin(110°) + Q_4_12(0.93359375), // sin(111°) + Q_4_12(0.92724609375), // sin(112°) + Q_4_12(0.92041015625), // sin(113°) + Q_4_12(0.91357421875), // sin(114°) + Q_4_12(0.90625), // sin(115°) + Q_4_12(0.898681640625), // sin(116°) + Q_4_12(0.89111328125), // sin(117°) + Q_4_12(0.883056640625), // sin(118°) + Q_4_12(0.87451171875), // sin(119°) + Q_4_12(0.865966796875), // sin(120°) + Q_4_12(0.857177734375), // sin(121°) + Q_4_12(0.84814453125), // sin(122°) + Q_4_12(0.838623046875), // sin(123°) + Q_4_12(0.8291015625), // sin(124°) + Q_4_12(0.819091796875), // sin(125°) + Q_4_12(0.80908203125), // sin(126°) + Q_4_12(0.798583984375), // sin(127°) + Q_4_12(0.7880859375), // sin(128°) + Q_4_12(0.777099609375), // sin(129°) + Q_4_12(0.76611328125), // sin(130°) + Q_4_12(0.754638671875), // sin(131°) + Q_4_12(0.7431640625), // sin(132°) + Q_4_12(0.7314453125), // sin(133°) + Q_4_12(0.71923828125), // sin(134°) + Q_4_12(0.70703125), // sin(135°) + Q_4_12(0.694580078125), // sin(136°) + Q_4_12(0.681884765625), // sin(137°) + Q_4_12(0.669189453125), // sin(138°) + Q_4_12(0.656005859375), // sin(139°) + Q_4_12(0.642822265625), // sin(140°) + Q_4_12(0.62939453125), // sin(141°) + Q_4_12(0.61572265625), // sin(142°) + Q_4_12(0.601806640625), // sin(143°) + Q_4_12(0.587890625), // sin(144°) + Q_4_12(0.573486328125), // sin(145°) + Q_4_12(0.55908203125), // sin(146°) + Q_4_12(0.544677734375), // sin(147°) + Q_4_12(0.530029296875), // sin(148°) + Q_4_12(0.51513671875), // sin(149°) + Q_4_12(0.5), // sin(150°) + Q_4_12(0.48486328125), // sin(151°) + Q_4_12(0.469482421875), // sin(152°) + Q_4_12(0.4541015625), // sin(153°) + Q_4_12(0.4384765625), // sin(154°) + Q_4_12(0.422607421875), // sin(155°) + Q_4_12(0.40673828125), // sin(156°) + Q_4_12(0.390625), // sin(157°) + Q_4_12(0.37451171875), // sin(158°) + Q_4_12(0.3583984375), // sin(159°) + Q_4_12(0.342041015625), // sin(160°) + Q_4_12(0.32568359375), // sin(161°) + Q_4_12(0.30908203125), // sin(162°) + Q_4_12(0.29248046875), // sin(163°) + Q_4_12(0.275634765625), // sin(164°) + Q_4_12(0.2587890625), // sin(165°) + Q_4_12(0.241943359375), // sin(166°) + Q_4_12(0.224853515625), // sin(167°) + Q_4_12(0.2080078125), // sin(168°) + Q_4_12(0.19091796875), // sin(169°) + Q_4_12(0.173583984375), // sin(170°) + Q_4_12(0.156494140625), // sin(171°) + Q_4_12(0.13916015625), // sin(172°) + Q_4_12(0.121826171875), // sin(173°) + Q_4_12(0.1044921875), // sin(174°) + Q_4_12(0.087158203125), // sin(175°) + Q_4_12(0.06982421875), // sin(176°) + Q_4_12(0.05224609375), // sin(177°) + Q_4_12(0.034912109375), // sin(178°) + Q_4_12(0.017333984375), // sin(179°) +}; + +// amplitude * sin(index*(π/128)) +s16 Sin(s16 index, s16 amplitude) +{ + return (amplitude * gSineTable[index]) >> 8; +} + +// amplitude * cos(index*(π/128)) +s16 Cos(s16 index, s16 amplitude) +{ + return (amplitude * gSineTable[index + 64]) >> 8; +} + +// angle in degrees +s16 Sin2(u16 angle) +{ + s32 angleMod = angle % 180; + s32 negate = ((angle / 180) & 1); + s16 value = gSineDegreeTable[angleMod]; + + if (negate) + return -value; + else + return value; +} + +// angle in degrees +s16 Cos2(u16 angle) +{ + return Sin2(angle + 90); +} diff --git a/src/engine/util.c b/src/engine/util.c new file mode 100644 index 000000000..582b9f806 --- /dev/null +++ b/src/engine/util.c @@ -0,0 +1,525 @@ +#include "global.h" +#include "util.h" + +const u32 gBitTable[] = +{ + 1 << 0, + 1 << 1, + 1 << 2, + 1 << 3, + 1 << 4, + 1 << 5, + 1 << 6, + 1 << 7, + 1 << 8, + 1 << 9, + 1 << 10, + 1 << 11, + 1 << 12, + 1 << 13, + 1 << 14, + 1 << 15, + 1 << 16, + 1 << 17, + 1 << 18, + 1 << 19, + 1 << 20, + 1 << 21, + 1 << 22, + 1 << 23, + 1 << 24, + 1 << 25, + 1 << 26, + 1 << 27, + 1 << 28, + 1 << 29, + 1 << 30, + 1 << 31, +}; + +static const struct SpriteTemplate gInvisibleSpriteTemplate = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const u8 gSpriteDimensions[3][4][2] = +{ + // square + { + {1, 1}, + {2, 2}, + {4, 4}, + {8, 8}, + }, + + // horizontal rectangle + { + {2, 1}, + {4, 1}, + {4, 2}, + {8, 4}, + }, + + // vertical rectangle + { + {1, 2}, + {1, 4}, + {2, 4}, + {4, 8}, + }, +}; + +static const u16 gCrc16Table[] = +{ + 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, + 0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7, + 0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E, + 0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876, + 0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD, + 0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5, + 0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C, + 0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974, + 0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB, + 0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3, + 0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A, + 0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72, + 0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9, + 0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1, + 0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738, + 0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70, + 0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7, + 0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF, + 0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036, + 0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E, + 0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5, + 0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD, + 0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134, + 0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C, + 0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3, + 0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB, + 0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232, + 0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A, + 0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1, + 0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9, + 0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330, + 0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78, +}; + +const u8 gMiscBlank_Gfx[] = INCBIN_U8("graphics/interface/blank.4bpp"); + + +u8 CreateInvisibleSpriteWithCallback(void (*callback)(struct Sprite *)) +{ + u8 sprite = CreateSprite(&gInvisibleSpriteTemplate, 248, 168, 14); + gSprites[sprite].invisible = TRUE; + gSprites[sprite].callback = callback; + return sprite; +} + +void StoreWordInTwoHalfwords(u16 *h, u32 w) +{ + h[0] = (u16)(w); + h[1] = (u16)(w >> 16); +} + +void LoadWordFromTwoHalfwords(u16 *h, u32 *w) +{ + *w = h[0] | (s16)h[1] << 16; +} + +void SetBgAffineStruct(struct BgAffineSrcData *src, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha) +{ + src->texX = texX; + src->texY = texY; + src->scrX = scrX; + src->scrY = scrY; + src->sx = sx; + src->sy = sy; + src->alpha = alpha; +} + +void DoBgAffineSet(struct BgAffineDstData *dest, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha) +{ + struct BgAffineSrcData src; + + SetBgAffineStruct(&src, texX, texY, scrX, scrY, sx, sy, alpha); + BgAffineSet(&src, dest, 1); +} + +#ifdef NONMATCHING + +// Functionally equivalent. +// Only the two yflip loops don't match. +void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) +{ + u8 x, y; + s8 i, j; + u8 xflip[32]; + u8 h = gSpriteDimensions[shape][size][1]; + u8 w = gSpriteDimensions[shape][size][0]; + + for (y = 0; y < h; y++) + { + int filler = 32 - w; + + for (x = 0; x < w; x++) + { + int tile = (*tilemap & 0x3ff) * 32; + int attr = *tilemap & 0xc00; + + if (attr == 0) + { + void *src = tiles + tile; + void *dest = output; + int length = 32; + DmaCopy32(3, src, dest, length); + } + else if (attr == 0x800) // yflip + { + for (i = 0; i < 8; i++) + { + void *src = tiles; + void *dest = output; + int length = 4; + // this is likely wrong, but makes it closer to matching + src += tile + (7 - i) * 4; + dest += i * 4; + DmaCopy32(3, src, dest, length); + } + } + else // xflip + { + for (i = 0; i < 8; i++) + { + for (j = 0; j < 4; j++) + { + u8 i2 = i * 4; + xflip[i2 + (3-j)] = (tiles[tile + i2 + j] & 0xf) << 4; + xflip[i2 + (3-j)] |= tiles[tile + i2 + j] >> 4; + } + } + if (*tilemap & 0x800) // yflip + { + for (i = 0; i < 8; i++) + { + void *src = xflip + (7-i) * 4; + void *dest = output + i*4; + int length = 4; + DmaCopy32(3, src, dest, length); + } + } + else + { + void *src = xflip; + void *dest = output; + int length = 32; + DmaCopy32(3, src, dest, length); + } + } + tilemap++; + output += 32; + } + tilemap += filler; + } +} + +#else + +__attribute__((naked)) void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) +{ + asm("\n" + " .syntax unified\n" + " push {r4-r7,lr}\n" + " mov r7, r10\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5-r7}\n" + " sub sp, 0x3C\n" + " str r2, [sp, 0x20]\n" + " adds r4, r3, 0\n" + " ldr r7, [sp, 0x5C]\n" + " lsls r0, 24\n" + " lsls r1, 24\n" + " ldr r2, _08041008 @ =gSpriteDimensions\n" + " lsrs r1, 23\n" + " lsrs r0, 21\n" + " adds r1, r0\n" + " adds r0, r2, 0x1\n" + " adds r0, r1, r0\n" + " ldrb r0, [r0]\n" + " str r0, [sp, 0x24]\n" + " adds r1, r2\n" + " ldrb r1, [r1]\n" + " str r1, [sp, 0x28]\n" + " movs r1, 0\n" + " cmp r1, r0\n" + " bcc _08040FB4\n" + " b _08041136\n" + "_08040FB4:\n" + " movs r0, 0x20\n" + " ldr r2, [sp, 0x28]\n" + " subs r0, r2\n" + " lsls r0, 1\n" + " str r0, [sp, 0x2C]\n" + "_08040FBE:\n" + " movs r2, 0\n" + " adds r1, 0x1\n" + " str r1, [sp, 0x34]\n" + " ldr r3, [sp, 0x28]\n" + " cmp r2, r3\n" + " bcc _08040FCC\n" + " b _08041124\n" + "_08040FCC:\n" + " ldr r0, _0804100C @ =0x040000d4\n" + " mov r8, r0\n" + "_08040FD0:\n" + " ldrh r1, [r4]\n" + " ldr r0, _08041010 @ =0x000003ff\n" + " ands r0, r1\n" + " lsls r0, 5\n" + " mov r12, r0\n" + " movs r0, 0xC0\n" + " lsls r0, 4\n" + " ands r0, r1\n" + " mov r3, sp\n" + " strh r1, [r3, 0x38]\n" + " cmp r0, 0\n" + " bne _08041018\n" + " ldr r0, [sp, 0x20]\n" + " add r0, r12\n" + " mov r1, r8\n" + " str r0, [r1]\n" + " str r7, [r1, 0x4]\n" + " ldr r3, _08041014 @ =0x84000008\n" + " str r3, [r1, 0x8]\n" + " ldr r0, [r1, 0x8]\n" + " adds r4, 0x2\n" + " str r4, [sp, 0x30]\n" + " adds r7, 0x20\n" + " mov r10, r7\n" + " adds r2, 0x1\n" + " mov r9, r2\n" + " b _08041112\n" + " .align 2, 0\n" + "_08041008: .4byte gSpriteDimensions\n" + "_0804100C: .4byte 0x040000d4\n" + "_08041010: .4byte 0x000003ff\n" + "_08041014: .4byte 0x84000008\n" + "_08041018:\n" + " movs r1, 0x80\n" + " lsls r1, 4\n" + " cmp r0, r1\n" + " bne _08041068\n" + " movs r3, 0\n" + " adds r4, 0x2\n" + " str r4, [sp, 0x30]\n" + " movs r0, 0x20\n" + " adds r0, r7\n" + " mov r10, r0\n" + " adds r2, 0x1\n" + " mov r9, r2\n" + " ldr r4, _08041060 @ =0x040000d4\n" + " ldr r6, _08041064 @ =0x84000001\n" + " movs r5, 0x7\n" + "_08041036:\n" + " lsls r2, r3, 24\n" + " asrs r2, 24\n" + " subs r0, r5, r2\n" + " lsls r0, 2\n" + " add r0, r12\n" + " ldr r1, [sp, 0x20]\n" + " adds r0, r1, r0\n" + " lsls r1, r2, 2\n" + " adds r1, r7, r1\n" + " str r0, [r4]\n" + " str r1, [r4, 0x4]\n" + " str r6, [r4, 0x8]\n" + " ldr r0, [r4, 0x8]\n" + " adds r2, 0x1\n" + " lsls r2, 24\n" + " lsrs r3, r2, 24\n" + " asrs r2, 24\n" + " cmp r2, 0x7\n" + " ble _08041036\n" + " b _08041112\n" + " .align 2, 0\n" + "_08041060: .4byte 0x040000d4\n" + "_08041064: .4byte 0x84000001\n" + "_08041068:\n" + " movs r3, 0\n" + " adds r4, 0x2\n" + " str r4, [sp, 0x30]\n" + " movs r0, 0x20\n" + " adds r0, r7\n" + " mov r10, r0\n" + " adds r2, 0x1\n" + " mov r9, r2\n" + "_08041078:\n" + " movs r2, 0\n" + " lsls r4, r3, 24\n" + " lsls r0, r4, 2\n" + " lsrs r0, 24\n" + " adds r6, r0, 0x3\n" + " mov r1, r12\n" + " adds r5, r1, r0\n" + "_08041086:\n" + " lsls r1, r2, 24\n" + " asrs r1, 24\n" + " subs r0, r6, r1\n" + " mov r2, sp\n" + " adds r3, r2, r0\n" + " adds r0, r5, r1\n" + " ldr r2, [sp, 0x20]\n" + " adds r0, r2, r0\n" + " ldrb r2, [r0]\n" + " movs r0, 0xF\n" + " ands r0, r2\n" + " lsls r0, 4\n" + " lsrs r2, 4\n" + " orrs r0, r2\n" + " strb r0, [r3]\n" + " adds r1, 0x1\n" + " lsls r1, 24\n" + " lsrs r2, r1, 24\n" + " asrs r1, 24\n" + " cmp r1, 0x3\n" + " ble _08041086\n" + " movs r3, 0x80\n" + " lsls r3, 17\n" + " adds r0, r4, r3\n" + " lsrs r3, r0, 24\n" + " asrs r0, 24\n" + " cmp r0, 0x7\n" + " ble _08041078\n" + " movs r0, 0x80\n" + " lsls r0, 4\n" + " mov r1, sp\n" + " ldrh r1, [r1, 0x38]\n" + " ands r0, r1\n" + " cmp r0, 0\n" + " beq _08041104\n" + " movs r3, 0\n" + " ldr r4, _080410FC @ =0x040000d4\n" + " ldr r6, _08041100 @ =0x84000001\n" + " movs r5, 0x7\n" + "_080410D4:\n" + " lsls r1, r3, 24\n" + " asrs r1, 24\n" + " subs r0, r5, r1\n" + " lsls r0, 2\n" + " mov r3, sp\n" + " adds r2, r3, r0\n" + " lsls r0, r1, 2\n" + " adds r0, r7, r0\n" + " str r2, [r4]\n" + " str r0, [r4, 0x4]\n" + " str r6, [r4, 0x8]\n" + " ldr r0, [r4, 0x8]\n" + " adds r1, 0x1\n" + " lsls r1, 24\n" + " lsrs r3, r1, 24\n" + " asrs r1, 24\n" + " cmp r1, 0x7\n" + " ble _080410D4\n" + " b _08041112\n" + " .align 2, 0\n" + "_080410FC: .4byte 0x040000d4\n" + "_08041100: .4byte 0x84000001\n" + "_08041104:\n" + " mov r0, sp\n" + " mov r1, r8\n" + " str r0, [r1]\n" + " str r7, [r1, 0x4]\n" + " ldr r2, _08041148 @ =0x84000008\n" + " str r2, [r1, 0x8]\n" + " ldr r0, [r1, 0x8]\n" + "_08041112:\n" + " ldr r4, [sp, 0x30]\n" + " mov r7, r10\n" + " mov r3, r9\n" + " lsls r0, r3, 24\n" + " lsrs r2, r0, 24\n" + " ldr r0, [sp, 0x28]\n" + " cmp r2, r0\n" + " bcs _08041124\n" + " b _08040FD0\n" + "_08041124:\n" + " ldr r1, [sp, 0x2C]\n" + " adds r4, r1\n" + " ldr r2, [sp, 0x34]\n" + " lsls r0, r2, 24\n" + " lsrs r1, r0, 24\n" + " ldr r3, [sp, 0x24]\n" + " cmp r1, r3\n" + " bcs _08041136\n" + " b _08040FBE\n" + "_08041136:\n" + " add sp, 0x3C\n" + " pop {r3-r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov r10, r5\n" + " pop {r4-r7}\n" + " pop {r0}\n" + " bx r0\n" + " .align 2, 0\n" + "_08041148: .4byte 0x84000008\n" + " .syntax divided\n" + ); +} + +#endif + +int CountTrailingZeroBits(u32 value) +{ + u8 i; + + for (i = 0; i < 32; i++) + { + if ((value & 1) == 0) + value >>= 1; + else + return i; + } + return 0; +} + +u16 CalcCRC16(u8 *data, int length) +{ + u16 i, j; + u16 crc = 0x1121; + + for (i = 0; i < length; i++) + { + crc ^= data[i]; + for (j = 0; j < 8; j++) + { + if (crc & 1) + crc = (crc >> 1) ^ 0x8408; + else + crc >>= 1; + } + } + return ~crc; +} + +u16 CalcCRC16WithTable(u8 *data, int length) +{ + u16 i; + u16 crc = 0x1121; + u8 byte; + + for (i = 0; i < length; i++) + { + byte = crc >> 8; + crc ^= data[i]; + crc = byte ^ gCrc16Table[(u8)crc]; + } + return ~crc; +} diff --git a/src/event_data.c b/src/event_data.c deleted file mode 100644 index 0484bae02..000000000 --- a/src/event_data.c +++ /dev/null @@ -1,184 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "pokedex.h" - -#define TEMP_FLAGS_SIZE 0x4 -#define TEMP_UPPER_FLAGS_SIZE 0x8 -#define TEMP_VARS_SIZE 0x20 - -EWRAM_DATA u16 gSpecialVar_0x8000 = 0; -EWRAM_DATA u16 gSpecialVar_0x8001 = 0; -EWRAM_DATA u16 gSpecialVar_0x8002 = 0; -EWRAM_DATA u16 gSpecialVar_0x8003 = 0; -EWRAM_DATA u16 gSpecialVar_0x8004 = 0; -EWRAM_DATA u16 gSpecialVar_0x8005 = 0; -EWRAM_DATA u16 gSpecialVar_0x8006 = 0; -EWRAM_DATA u16 gSpecialVar_0x8007 = 0; -EWRAM_DATA u16 gSpecialVar_0x8008 = 0; -EWRAM_DATA u16 gSpecialVar_0x8009 = 0; -EWRAM_DATA u16 gSpecialVar_0x800A = 0; -EWRAM_DATA u16 gSpecialVar_0x800B = 0; -EWRAM_DATA u16 gScriptResult = 0; -EWRAM_DATA u16 gScriptLastTalked = 0; -EWRAM_DATA u16 gScriptFacing = 0; -EWRAM_DATA u8 gUnknown_0202E8E2[16] = {0}; - -extern u16 *gSpecialVars[]; - -void InitEventData(void) -{ - memset(gSaveBlock1.flags, 0, sizeof(gSaveBlock1.flags)); - memset(gSaveBlock1.vars, 0, sizeof(gSaveBlock1.vars)); - memset(gUnknown_0202E8E2, 0, sizeof(gUnknown_0202E8E2)); -} - -void ClearTempFieldEventData(void) -{ - memset(gSaveBlock1.flags, 0, TEMP_FLAGS_SIZE); - memset(gSaveBlock1.vars, 0, TEMP_VARS_SIZE); - FlagReset(SYS_ENC_UP_ITEM); - FlagReset(SYS_ENC_DOWN_ITEM); - FlagReset(SYS_USE_STRENGTH); - FlagReset(SYS_CTRL_OBJ_DELETE); -} - -// probably had different flag splits at one point. -void ClearUpperFlags(void) -{ - memset(gSaveBlock1.flags + 0x118, 0, TEMP_UPPER_FLAGS_SIZE); -} - -void DisableNationalPokedex(void) -{ - u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); - gSaveBlock2.pokedex.nationalMagic = 0; - *nationalDexVar = 0; - FlagReset(SYS_NATIONAL_DEX); -} - -void EnableNationalPokedex(void) -{ - u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); - gSaveBlock2.pokedex.nationalMagic = 0xDA; - *nationalDexVar = 0x302; - FlagSet(SYS_NATIONAL_DEX); - gSaveBlock2.pokedex.unknown1 = 1; - gSaveBlock2.pokedex.order = 0; - sub_808C0A0(); -} - -bool32 IsNationalPokedexEnabled(void) -{ - if (gSaveBlock2.pokedex.nationalMagic == 0xDA && VarGet(VAR_NATIONAL_DEX) == 0x302 && FlagGet(SYS_NATIONAL_DEX)) - return TRUE; - else - return FALSE; -} - -void DisableMysteryGift(void) -{ - FlagReset(SYS_EXDATA_ENABLE); -} - -void EnableMysteryGift(void) -{ - FlagSet(SYS_EXDATA_ENABLE); -} - -bool32 IsMysteryGiftEnabled(void) -{ - return FlagGet(SYS_EXDATA_ENABLE); -} - -void DisableResetRTC(void) -{ - VarSet(VAR_RESET_RTC_ENABLE, 0); - FlagReset(SYS_RESET_RTC_ENABLE); -} - -void EnableResetRTC(void) -{ - VarSet(VAR_RESET_RTC_ENABLE, 0x920); - FlagSet(SYS_RESET_RTC_ENABLE); -} - -bool32 CanResetRTC(void) -{ - if (FlagGet(SYS_RESET_RTC_ENABLE) && VarGet(VAR_RESET_RTC_ENABLE) == 0x920) - return TRUE; - else - return FALSE; -} - -u16 *GetVarPointer(u16 id) -{ - if (id < 0x4000) - return NULL; - - if ((s16)id >= 0) - return &gSaveBlock1.vars[id - 0x4000]; - - return gSpecialVars[id - 0x8000]; -} - -u16 VarGet(u16 id) -{ - u16 *ptr = GetVarPointer(id); - if (!ptr) - return id; - return *ptr; -} - -bool8 VarSet(u16 id, u16 value) -{ - u16 *ptr = GetVarPointer(id); - if (!ptr) - return FALSE; - *ptr = value; - return TRUE; -} - -u8 VarGetFieldObjectGraphicsId(u8 id) -{ - return VarGet(0x4010 + id); -} - -u8 *GetFlagPointer(u16 id) -{ - if (id == 0) - return 0; - - if (id < 0x4000) - return &gSaveBlock1.flags[id / 8]; - - return &gUnknown_0202E8E2[(id - 0x4000) / 8]; -} - -u8 FlagSet(u16 id) -{ - u8 *ptr = GetFlagPointer(id); - if (ptr) - *ptr |= 1 << (id & 7); - return 0; -} - -u8 FlagReset(u16 id) -{ - u8 *ptr = GetFlagPointer(id); - if (ptr) - *ptr &= ~(1 << (id & 7)); - return 0; -} - -bool8 FlagGet(u16 id) -{ - u8 *ptr = GetFlagPointer(id); - - if (!ptr) - return FALSE; - - if (!(((*ptr) >> (id & 7)) & 1)) - return FALSE; - - return TRUE; -} diff --git a/src/field/bard_music.c b/src/field/bard_music.c new file mode 100644 index 000000000..a31568475 --- /dev/null +++ b/src/field/bard_music.c @@ -0,0 +1,97 @@ +#include "global.h" +#include "easy_chat.h" + +struct BardSound +{ + u8 pad_00[48]; +}; + +struct UnkBard +{ + /*0x00*/ u8 var00; + /*0x01*/ s8 var01; + /*0x02*/ u16 var02; + /*0x04*/ u16 var04; + /*0x06*/ u16 var06; +}; + +struct UnkBard3 +{ + /*0x00*/ u16 var00; + /*0x02*/ u16 var02; + /*0x04*/ s16 var04; + /*0x06*/ u16 var06; +}; + +struct UnkBard2 +{ + /*0x00*/ u8 var00; + /*0x01*/ u8 var01; + /*0x02*/ u8 var02; + /*0x03*/ u8 var03; + /*0x04*/ u16 var04; + u8 pad06[4]; + /*0x0A*/ u16 var0A; + u8 pad0C[12]; + /*0x18*/ struct UnkBard3 var18[6]; +}; + +extern struct BardSound *gBardMusicTable[]; +extern s16 *gUnknown_08417068[]; +extern u32 gUnknown_084170F4[]; + +static s16 sub_814A2B8(u32 arg0, u32 arg1) +{ + return gUnknown_08417068[arg0][arg1]; +} + +#if ENGLISH +struct BardSound *sub_814A2D0(u16 arg0, u16 arg1) +{ + struct BardSound *sounds = gBardMusicTable[arg0]; + + return &sounds[arg1]; +} +#elif GERMAN +struct BardSound *sub_814A2D0(u16 arg0, u16 arg1) +{ + u32 index; + struct BardSound *sounds; + + sounds = gBardMusicTable[arg0]; + index = de_sub_80EB748(arg0, arg1); + + return &sounds[index]; +} +#endif + +s32 sub_814A2EC(struct UnkBard2 *dest, struct UnkBard *src, u16 arg2) +{ + s32 i; + s32 j; + s32 thirty; + + for (i = 0; i < 6; i++) + { + dest->var18[i].var00 = src[i].var00; + if (src[i].var00 != 0xFF) + { + s32 r1 = src[i].var01 +gUnknown_084170F4[src[i].var00]; + + dest->var18[i].var02 = r1; + dest->var18[i].var06 = src[i].var04; + dest->var04 += r1; + } + } + + for (j = 0, thirty = 30; j < i; j++) + dest->var18[j].var04 = sub_814A2B8(thirty + arg2, j); + + dest->var00++; + dest->var01 = 0; + dest->var02 = 0; + dest->var03 = 0; + dest->var0A = 0; + + //warning: no return statement in function returning non-void +} diff --git a/src/field/berry.c b/src/field/berry.c new file mode 100644 index 000000000..fa15672e7 --- /dev/null +++ b/src/field/berry.c @@ -0,0 +1,1380 @@ +#include "global.h" +#include "berry.h" +#include "field_control_avatar.h" +#include "field_map_obj.h" +#include "fieldmap.h" +#include "item.h" +#include "item_menu.h" +#include "item_use.h" +#include "items.h" +#include "main.h" +#include "rng.h" +#include "text.h" + +#define BERRY_NAME_LENGTH 6 + +#define FIRST_BERRY ITEM_CHERI_BERRY +#define LAST_BERRY ITEM_ENIGMA_BERRY + +#ifdef ENGLISH +#define NAME_CHERI_BERRY _("CHERI") +#define NAME_CHESTO_BERRY _("CHESTO") +#define NAME_PECHA_BERRY _("PECHA") +#define NAME_RAWST_BERRY _("RAWST") +#define NAME_ASPEAR_BERRY _("ASPEAR") +#define NAME_LEPPA_BERRY _("LEPPA") +#define NAME_ORAN_BERRY _("ORAN") +#define NAME_PERSIM_BERRY _("PERSIM") +#define NAME_LUM_BERRY _("LUM") +#define NAME_SITRUS_BERRY _("SITRUS") +#define NAME_FIGY_BERRY _("FIGY") +#define NAME_WIKI_BERRY _("WIKI") +#define NAME_MAGO_BERRY _("MAGO") +#define NAME_AGUAV_BERRY _("AGUAV") +#define NAME_IAPAPA_BERRY _("IAPAPA") +#define NAME_RAZZ_BERRY _("RAZZ") +#define NAME_BLUK_BERRY _("BLUK") +#define NAME_NANAB_BERRY _("NANAB") +#define NAME_WEPEAR_BERRY _("WEPEAR") +#define NAME_PINAP_BERRY _("PINAP") +#define NAME_POMEG_BERRY _("POMEG") +#define NAME_KELPSY_BERRY _("KELPSY") +#define NAME_QUALOT_BERRY _("QUALOT") +#define NAME_HONDEW_BERRY _("HONDEW") +#define NAME_GREPA_BERRY _("GREPA") +#define NAME_TAMATO_BERRY _("TAMATO") +#define NAME_CORNN_BERRY _("CORNN") +#define NAME_MAGOST_BERRY _("MAGOST") +#define NAME_RABUTA_BERRY _("RABUTA") +#define NAME_NOMEL_BERRY _("NOMEL") +#define NAME_SPELON_BERRY _("SPELON") +#define NAME_PAMTRE_BERRY _("PAMTRE") +#define NAME_WATMEL_BERRY _("WATMEL") +#define NAME_DURIN_BERRY _("DURIN") +#define NAME_BELUE_BERRY _("BELUE") +#define NAME_LIECHI_BERRY _("LIECHI") +#define NAME_GANLON_BERRY _("GANLON") +#define NAME_SALAC_BERRY _("SALAC") +#define NAME_PETAYA_BERRY _("PETAYA") +#define NAME_APICOT_BERRY _("APICOT") +#define NAME_LANSAT_BERRY _("LANSAT") +#define NAME_STARF_BERRY _("STARF") +#define NAME_ENIGMA_BERRY _("ENIGMA") + +const u8 gBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers."); +const u8 gBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy."); +const u8 gBerryDescriptionPart1_Chesto[] = _("The BERRY’s thick skin and fruit are"); +const u8 gBerryDescriptionPart2_Chesto[] = _("very tough. It is dry-tasting all over."); +const u8 gBerryDescriptionPart1_Pecha[] = _("Very sweet and delicious."); +const u8 gBerryDescriptionPart2_Pecha[] = _("Also very tender - handle with care."); +const u8 gBerryDescriptionPart1_Rawst[] = _("If the leaves grow long and curly,"); +const u8 gBerryDescriptionPart2_Rawst[] = _("the BERRY seems to grow very bitter."); +const u8 gBerryDescriptionPart1_Aspear[] = _("The hard BERRY is dense with a rich"); +const u8 gBerryDescriptionPart2_Aspear[] = _("juice. It is quite sour."); +const u8 gBerryDescriptionPart1_Leppa[] = _("Grows slower than CHERI and others."); +const u8 gBerryDescriptionPart2_Leppa[] = _("The smaller the BERRY, the tastier."); +const u8 gBerryDescriptionPart1_Oran[] = _("A peculiar BERRY with a mix of flavors."); +const u8 gBerryDescriptionPart2_Oran[] = _("BERRIES grow in half a day."); +const u8 gBerryDescriptionPart1_Persim[] = _("Loves sunlight. The BERRY’s color"); +const u8 gBerryDescriptionPart2_Persim[] = _("grows vivid when exposed to the sun."); +const u8 gBerryDescriptionPart1_Lum[] = _("Slow to grow. If raised with loving"); +const u8 gBerryDescriptionPart2_Lum[] = _("care, it may grow two BERRIES."); +const u8 gBerryDescriptionPart1_Sitrus[] = _("Closely related to ORAN. The large"); +const u8 gBerryDescriptionPart2_Sitrus[] = _("BERRY has a well-rounded flavor."); +const u8 gBerryDescriptionPart1_Figy[] = _("The BERRY, which looks chewed up,"); +const u8 gBerryDescriptionPart2_Figy[] = _("brims with spicy substances."); +const u8 gBerryDescriptionPart1_Wiki[] = _("The BERRY is said to have grown lumpy"); +const u8 gBerryDescriptionPart2_Wiki[] = _("to help POKéMON grip it."); +const u8 gBerryDescriptionPart1_Mago[] = _("The BERRY turns curvy as it grows."); +const u8 gBerryDescriptionPart2_Mago[] = _("The curvier, the sweeter and tastier."); +const u8 gBerryDescriptionPart1_Aguav[] = _("The flower is dainty. It is rare in its"); +const u8 gBerryDescriptionPart2_Aguav[] = _("ability to grow without light."); +const u8 gBerryDescriptionPart1_Iapapa[] = _("The BERRY is very big and sour."); +const u8 gBerryDescriptionPart2_Iapapa[] = _("It takes at least a day to grow."); +const u8 gBerryDescriptionPart1_Razz[] = _("The red BERRY tastes slightly spicy."); +const u8 gBerryDescriptionPart2_Razz[] = _("It grows quickly in just four hours."); +const u8 gBerryDescriptionPart1_Bluk[] = _("The BERRY is blue on the outside, but"); +const u8 gBerryDescriptionPart2_Bluk[] = _("it blackens the mouth when eaten."); +const u8 gBerryDescriptionPart1_Nanab[] = _("This BERRY was the seventh"); +const u8 gBerryDescriptionPart2_Nanab[] = _("discovered in the world. It is sweet."); +const u8 gBerryDescriptionPart1_Wepear[] = _("The flower is small and white. It has a"); +const u8 gBerryDescriptionPart2_Wepear[] = _("delicate balance of bitter and sour."); +const u8 gBerryDescriptionPart1_Pinap[] = _("Weak against wind and cold."); +const u8 gBerryDescriptionPart2_Pinap[] = _("The fruit is spicy and the skin, sour."); +const u8 gBerryDescriptionPart1_Pomeg[] = _("However much it is watered,"); +const u8 gBerryDescriptionPart2_Pomeg[] = _("it only grows up to six BERRIES."); +const u8 gBerryDescriptionPart1_Kelpsy[] = _("A rare variety shaped like a root."); +const u8 gBerryDescriptionPart2_Kelpsy[] = _("Grows a very large flower."); +const u8 gBerryDescriptionPart1_Qualot[] = _("Loves water. Grows strong even in"); +const u8 gBerryDescriptionPart2_Qualot[] = _("locations with constant rainfall."); +const u8 gBerryDescriptionPart1_Hondew[] = _("A BERRY that is very valuable and"); +const u8 gBerryDescriptionPart2_Hondew[] = _("rarely seen. It is very delicious."); +const u8 gBerryDescriptionPart1_Grepa[] = _("Despite its tenderness and round"); +const u8 gBerryDescriptionPart2_Grepa[] = _("shape, the BERRY is unimaginably sour."); +const u8 gBerryDescriptionPart1_Tamato[] = _("The BERRY is lip-bendingly spicy."); +const u8 gBerryDescriptionPart2_Tamato[] = _("It takes time to grow."); +const u8 gBerryDescriptionPart1_Cornn[] = _("A BERRY from an ancient era. May not"); +const u8 gBerryDescriptionPart2_Cornn[] = _("grow unless planted in quantity."); +const u8 gBerryDescriptionPart1_Magost[] = _("A BERRY that is widely said to have"); +const u8 gBerryDescriptionPart2_Magost[] = _("a finely balanced flavor."); +const u8 gBerryDescriptionPart1_Rabuta[] = _("A rare variety that is overgrown with"); +const u8 gBerryDescriptionPart2_Rabuta[] = _("hair. It is quite bitter."); +const u8 gBerryDescriptionPart1_Nomel[] = _("Quite sour. Just one bite makes it"); +const u8 gBerryDescriptionPart2_Nomel[] = _("impossible to taste for three days."); +const u8 gBerryDescriptionPart1_Spelon[] = _("The vividly red BERRY is very spicy."); +const u8 gBerryDescriptionPart2_Spelon[] = _("Its warts secrete a spicy substance."); +const u8 gBerryDescriptionPart1_Pamtre[] = _("Drifts on the sea from somewhere."); +const u8 gBerryDescriptionPart2_Pamtre[] = _("It is thought to grow elsewhere."); +const u8 gBerryDescriptionPart1_Watmel[] = _("A huge BERRY, with some over 20"); +const u8 gBerryDescriptionPart2_Watmel[] = _("inches discovered. Exceedingly sweet."); +const u8 gBerryDescriptionPart1_Durin[] = _("Bitter to even look at. It is so"); +const u8 gBerryDescriptionPart2_Durin[] = _("bitter, no one has ever eaten it as is."); +const u8 gBerryDescriptionPart1_Belue[] = _("It is glossy and looks delicious, but"); +const u8 gBerryDescriptionPart2_Belue[] = _("it is awfully sour. Takes time to grow."); +const u8 gBerryDescriptionPart1_Liechi[] = _("A mysterious BERRY. It is rumored to"); +const u8 gBerryDescriptionPart2_Liechi[] = _("contain the power of the sea."); +const u8 gBerryDescriptionPart1_Ganlon[] = _("A mysterious BERRY. It is rumored to"); +const u8 gBerryDescriptionPart2_Ganlon[] = _("contain the power of the land."); +const u8 gBerryDescriptionPart1_Salac[] = _("A mysterious BERRY. It is rumored to"); +const u8 gBerryDescriptionPart2_Salac[] = _("contain the power of the sky."); +const u8 gBerryDescriptionPart1_Petaya[] = _("A mysterious BERRY. It is rumored to"); +const u8 gBerryDescriptionPart2_Petaya[] = _("contain the power of all living things."); +const u8 gBerryDescriptionPart1_Apicot[] = _("A very mystifying BERRY. No telling"); +const u8 gBerryDescriptionPart2_Apicot[] = _("what may happen or how it can be used."); +const u8 gBerryDescriptionPart1_Lansat[] = _("Said to be a legendary BERRY."); +const u8 gBerryDescriptionPart2_Lansat[] = _("Holding it supposedly brings joy."); +const u8 gBerryDescriptionPart1_Starf[] = _("So strong, it was abandoned at the"); +const u8 gBerryDescriptionPart2_Starf[] = _("world’s edge. Considered a mirage."); +const u8 gBerryDescriptionPart1_Enigma[] = _("A completely enigmatic BERRY."); +const u8 gBerryDescriptionPart2_Enigma[] = _("Appears to have the power of stars."); +#elif defined(GERMAN) +#define NAME_CHERI_BERRY _("AMRENA") +#define NAME_CHESTO_BERRY _("MARON") +#define NAME_PECHA_BERRY _("PIRSIF") +#define NAME_RAWST_BERRY _("FRAGIA") +#define NAME_ASPEAR_BERRY _("WILBIR") +#define NAME_LEPPA_BERRY _("JONAGO") +#define NAME_ORAN_BERRY _("SINEL") +#define NAME_PERSIM_BERRY _("PERSIM") +#define NAME_LUM_BERRY _("PRUNUS") +#define NAME_SITRUS_BERRY _("TSITRU") +#define NAME_FIGY_BERRY _("GIEFE") +#define NAME_WIKI_BERRY _("WIKI") +#define NAME_MAGO_BERRY _("MAGO") +#define NAME_AGUAV_BERRY _("GAUVE") +#define NAME_IAPAPA_BERRY _("YAPA") +#define NAME_RAZZ_BERRY _("HIMMIH") +#define NAME_BLUK_BERRY _("MORB") +#define NAME_NANAB_BERRY _("NANAB") +#define NAME_WEPEAR_BERRY _("NIRBE") +#define NAME_PINAP_BERRY _("SANANA") +#define NAME_POMEG_BERRY _("GRANA") +#define NAME_KELPSY_BERRY _("SETANG") +#define NAME_QUALOT_BERRY _("QUALOT") +#define NAME_HONDEW_BERRY _("HONMEL") +#define NAME_GREPA_BERRY _("LABRUS") +#define NAME_TAMATO_BERRY _("TAMOT") +#define NAME_CORNN_BERRY _("SAIM") +#define NAME_MAGOST_BERRY _("MAGOST") +#define NAME_RABUTA_BERRY _("RABUTA") +#define NAME_NOMEL_BERRY _("TRONZI") +#define NAME_SPELON_BERRY _("KIWAN") +#define NAME_PAMTRE_BERRY _("PALLM") +#define NAME_WATMEL_BERRY _("WASMEL") +#define NAME_DURIN_BERRY _("DURIN") +#define NAME_BELUE_BERRY _("MYRTIL") +#define NAME_LIECHI_BERRY _("LYDZI") +#define NAME_GANLON_BERRY _("LINGAN") +#define NAME_SALAC_BERRY _("SALKA") +#define NAME_PETAYA_BERRY _("TAHAY") +#define NAME_APICOT_BERRY _("APIKO") +#define NAME_LANSAT_BERRY _("LANSAT") +#define NAME_STARF_BERRY _("KRAMBO") +#define NAME_ENIGMA_BERRY _("ENIGMA") + +const u8 gBerryDescriptionPart1_Cheri[] = _("Erblüht mit hübschen, zarten Blumen."); +const u8 gBerryDescriptionPart2_Cheri[] = _("Diese knallrote BEERE ist sehr scharf."); +const u8 gBerryDescriptionPart1_Chesto[] = _("Diese BEERE hat eine dicke Haut und"); +const u8 gBerryDescriptionPart2_Chesto[] = _("hartes Fruchtfleisch. Trocken!"); +const u8 gBerryDescriptionPart1_Pecha[] = _("Sehr süß und delikat."); +const u8 gBerryDescriptionPart2_Pecha[] = _("Sehr zart. Vorsichtig anfassen!"); +const u8 gBerryDescriptionPart1_Rawst[] = _("Wenn die Blätter lang und wellig sind,"); +const u8 gBerryDescriptionPart2_Rawst[] = _("wird die BEERE sehr bitter."); +const u8 gBerryDescriptionPart1_Aspear[] = _("Diese harte BEERE ist sehr"); +const u8 gBerryDescriptionPart2_Aspear[] = _("saftig und sauer im Geschmack!"); +const u8 gBerryDescriptionPart1_Leppa[] = _("Wächst langsamer als AMRENA und"); +const u8 gBerryDescriptionPart2_Leppa[] = _("andere. Je kleiner, desto delikater."); +const u8 gBerryDescriptionPart1_Oran[] = _("Eine BEERE unterschiedlichsten Ge-"); +const u8 gBerryDescriptionPart2_Oran[] = _("schmacks. Wächst an einem halben Tag."); +const u8 gBerryDescriptionPart1_Persim[] = _("Liebt Sonnenlicht. Die BEERE"); +const u8 gBerryDescriptionPart2_Persim[] = _("wächst im Sonnenlicht sehr schnell."); +const u8 gBerryDescriptionPart1_Lum[] = _("Langsamer Wuchs. Wird sie liebevoll ge-"); +const u8 gBerryDescriptionPart2_Lum[] = _("pflegt, kann sie 2 BEEREN tragen."); +const u8 gBerryDescriptionPart1_Sitrus[] = _("Eng verwandt mit SINEL. Diese große"); +const u8 gBerryDescriptionPart2_Sitrus[] = _("BEERE ist von rundem Geschmack."); +const u8 gBerryDescriptionPart1_Figy[] = _("Die BEERE sieht angekaut aus. Sie ist"); +const u8 gBerryDescriptionPart2_Figy[] = _("voller scharfer Substanzen."); +const u8 gBerryDescriptionPart1_Wiki[] = _("Die BEERE wächst unförmig,"); +const u8 gBerryDescriptionPart2_Wiki[] = _("damit PKMN sie besser greifen können."); +const u8 gBerryDescriptionPart1_Mago[] = _("Die BEERE hat Ausbeulungen. Je mehr"); +const u8 gBerryDescriptionPart2_Mago[] = _("Beulen, desto schmackhafter ist sie."); +const u8 gBerryDescriptionPart1_Aguav[] = _("Die Blume ist zart. Sie ist fähig,"); +const u8 gBerryDescriptionPart2_Aguav[] = _("ohne Licht wachsen zu können."); +const u8 gBerryDescriptionPart1_Iapapa[] = _("Die BEERE ist groß und sauer."); +const u8 gBerryDescriptionPart2_Iapapa[] = _("Sie braucht einen Tag zum Wachsen."); +const u8 gBerryDescriptionPart1_Razz[] = _("Diese rote BEERE schmeckt etwas"); +const u8 gBerryDescriptionPart2_Razz[] = _("scharf. Sie wächst in nur 4 Stunden."); +const u8 gBerryDescriptionPart1_Bluk[] = _("Die BEERE ist außen blau, verfärbt"); +const u8 gBerryDescriptionPart2_Bluk[] = _("sich im Mund aber schwarz."); +const u8 gBerryDescriptionPart1_Nanab[] = _("Diese BEERE war die 7., die auf der"); +const u8 gBerryDescriptionPart2_Nanab[] = _("Welt entdeckt wurde. Sie ist süß."); +const u8 gBerryDescriptionPart1_Wepear[] = _("Die Blume ist klein und weiß. Angenehm"); +const u8 gBerryDescriptionPart2_Wepear[] = _("bitter und sauer zugleich."); +const u8 gBerryDescriptionPart1_Pinap[] = _("Wind und Kälte verträgt sie nicht."); +const u8 gBerryDescriptionPart2_Pinap[] = _("Fruchtfleisch: Scharf. Haut: Sauer."); +const u8 gBerryDescriptionPart1_Pomeg[] = _("Egal wie viel Wasser sie bekommt, sie"); +const u8 gBerryDescriptionPart2_Pomeg[] = _("trägt immer bis zu 6 BEEREN."); +const u8 gBerryDescriptionPart1_Kelpsy[] = _("Eine Seltenheit. Geformt wie eine"); +const u8 gBerryDescriptionPart2_Kelpsy[] = _("Wurzel. Hat eine große Blume."); +const u8 gBerryDescriptionPart1_Qualot[] = _("Liebt das Wasser. Wächst besonders"); +const u8 gBerryDescriptionPart2_Qualot[] = _("gut in regenreichen Gegenden."); +const u8 gBerryDescriptionPart1_Hondew[] = _("Eine wertvolle und seltene BEERE."); +const u8 gBerryDescriptionPart2_Hondew[] = _("Sie ist sehr schmackhaft."); +const u8 gBerryDescriptionPart1_Grepa[] = _("Die BEERE ist zart und von runder"); +const u8 gBerryDescriptionPart2_Grepa[] = _("Form. Aber sie ist unglaublich sauer!"); +const u8 gBerryDescriptionPart1_Tamato[] = _("Die Schärfe der BEERE verbrennt die"); +const u8 gBerryDescriptionPart2_Tamato[] = _("Lippen. Sie braucht Zeit zum Wachsen."); +const u8 gBerryDescriptionPart1_Cornn[] = _("Eine BEERE aus alten Zeiten. Wächst"); +const u8 gBerryDescriptionPart2_Cornn[] = _("nur, wenn in großen Mengen gepflanzt."); +const u8 gBerryDescriptionPart1_Magost[] = _("Eine BEERE, die für ihren feinen, aus-"); +const u8 gBerryDescriptionPart2_Magost[] = _("gewogenen Geschmack bekannt ist."); +const u8 gBerryDescriptionPart1_Rabuta[] = _("Eine Seltenheit, die über und über mit"); +const u8 gBerryDescriptionPart2_Rabuta[] = _("Haaren bewachsen ist. Sehr bitter!"); +const u8 gBerryDescriptionPart1_Nomel[] = _("Sehr sauer. Ein Biss betäubt die"); +const u8 gBerryDescriptionPart2_Nomel[] = _("Geschmacksnerven für 3 Tage!"); +const u8 gBerryDescriptionPart1_Spelon[] = _("Die leuchtend rote BEERE ist sehr"); +const u8 gBerryDescriptionPart2_Spelon[] = _("scharf. Gibt scharfe Substanzen ab!"); +const u8 gBerryDescriptionPart1_Pamtre[] = _("Wird vom Meer angespült. Sie wächst"); +const u8 gBerryDescriptionPart2_Pamtre[] = _("an einem anderen Ort."); +const u8 gBerryDescriptionPart1_Watmel[] = _("Eine große BEERE, 25 cm groß."); +const u8 gBerryDescriptionPart2_Watmel[] = _("Außergewöhnlich süß."); +const u8 gBerryDescriptionPart1_Durin[] = _("Bitter schon ihr Anblick! Sie ist so"); +const u8 gBerryDescriptionPart2_Durin[] = _("bitter, dass niemand sie pur isst."); +const u8 gBerryDescriptionPart1_Belue[] = _("Sie glänzt, sieht zart aus, ist extrem"); +const u8 gBerryDescriptionPart2_Belue[] = _("sauer und braucht Zeit zum Wachsen."); +const u8 gBerryDescriptionPart1_Liechi[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +const u8 gBerryDescriptionPart2_Liechi[] = _("sie enthalte die Kraft des Meeres."); +const u8 gBerryDescriptionPart1_Ganlon[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +const u8 gBerryDescriptionPart2_Ganlon[] = _("sie enthalte die Kraft des Landes."); +const u8 gBerryDescriptionPart1_Salac[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +const u8 gBerryDescriptionPart2_Salac[] = _("sie enthalte die Kraft des Himmels."); +const u8 gBerryDescriptionPart1_Petaya[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +const u8 gBerryDescriptionPart2_Petaya[] = _("sie enthalte die Kraft allen Lebens."); +const u8 gBerryDescriptionPart1_Apicot[] = _("Eine rätselhafte BEERE. Man kann"); +const u8 gBerryDescriptionPart2_Apicot[] = _("nicht sagen, wie und was sie ist."); +const u8 gBerryDescriptionPart1_Lansat[] = _("Eine legendäre BEERE. Sie zu"); +const u8 gBerryDescriptionPart2_Lansat[] = _("tragen bringt Freude."); +const u8 gBerryDescriptionPart1_Starf[] = _("So stark, dass sie an den Rand der"); +const u8 gBerryDescriptionPart2_Starf[] = _("Welt verbannt wurde. Ein Märchen?"); +const u8 gBerryDescriptionPart1_Enigma[] = _("Eine enigmatische BEERE. Sie scheint"); +const u8 gBerryDescriptionPart2_Enigma[] = _("die Macht der Sterne zu besitzen."); +#endif + +const struct Berry gBerries[] = +{ + { + .name = NAME_CHERI_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 20, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Cheri, + .description2 = gBerryDescriptionPart2_Cheri, + .stageDuration = 3, + .spicy = 10, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_CHESTO_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 80, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Chesto, + .description2 = gBerryDescriptionPart2_Chesto, + .stageDuration = 3, + .spicy = 0, + .dry = 10, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_PECHA_BERRY, + .firmness = BERRY_FIRMNESS_VERY_SOFT, + .size = 40, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Pecha, + .description2 = gBerryDescriptionPart2_Pecha, + .stageDuration = 3, + .spicy = 0, + .dry = 0, + .sweet = 10, + .bitter = 0, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_RAWST_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 32, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Rawst, + .description2 = gBerryDescriptionPart2_Rawst, + .stageDuration = 3, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 10, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_ASPEAR_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 50, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Aspear, + .description2 = gBerryDescriptionPart2_Aspear, + .stageDuration = 3, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 10, + .smoothness = 25, + }, + { + .name = NAME_LEPPA_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 28, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Leppa, + .description2 = gBerryDescriptionPart2_Leppa, + .stageDuration = 4, + .spicy = 10, + .dry = 0, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_ORAN_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 35, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Oran, + .description2 = gBerryDescriptionPart2_Oran, + .stageDuration = 3, + .spicy = 10, + .dry = 10, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_PERSIM_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 47, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Persim, + .description2 = gBerryDescriptionPart2_Persim, + .stageDuration = 3, + .spicy = 10, + .dry = 10, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_LUM_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 34, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Lum, + .description2 = gBerryDescriptionPart2_Lum, + .stageDuration = 12, + .spicy = 10, + .dry = 10, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_SITRUS_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 95, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Sitrus, + .description2 = gBerryDescriptionPart2_Sitrus, + .stageDuration = 6, + .spicy = 10, + .dry = 10, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_FIGY_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 100, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Figy, + .description2 = gBerryDescriptionPart2_Figy, + .stageDuration = 6, + .spicy = 10, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_WIKI_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 115, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Wiki, + .description2 = gBerryDescriptionPart2_Wiki, + .stageDuration = 6, + .spicy = 0, + .dry = 10, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_MAGO_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 126, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Mago, + .description2 = gBerryDescriptionPart2_Mago, + .stageDuration = 6, + .spicy = 0, + .dry = 0, + .sweet = 10, + .bitter = 0, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_AGUAV_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 64, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Aguav, + .description2 = gBerryDescriptionPart2_Aguav, + .stageDuration = 6, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 10, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_IAPAPA_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 223, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Iapapa, + .description2 = gBerryDescriptionPart2_Iapapa, + .stageDuration = 6, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 10, + .smoothness = 25, + }, + { + .name = NAME_RAZZ_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 120, + .maxYield = 6, + .minYield = 3, + .description1 = gBerryDescriptionPart1_Razz, + .description2 = gBerryDescriptionPart2_Razz, + .stageDuration = 1, + .spicy = 10, + .dry = 10, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 20, + }, + { + .name = NAME_BLUK_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 108, + .maxYield = 6, + .minYield = 3, + .description1 = gBerryDescriptionPart1_Bluk, + .description2 = gBerryDescriptionPart2_Bluk, + .stageDuration = 1, + .spicy = 0, + .dry = 10, + .sweet = 10, + .bitter = 0, + .sour = 0, + .smoothness = 20, + }, + { + .name = NAME_NANAB_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 77, + .maxYield = 6, + .minYield = 3, + .description1 = gBerryDescriptionPart1_Nanab, + .description2 = gBerryDescriptionPart2_Nanab, + .stageDuration = 1, + .spicy = 0, + .dry = 0, + .sweet = 10, + .bitter = 10, + .sour = 0, + .smoothness = 20, + }, + { + .name = NAME_WEPEAR_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 74, + .maxYield = 6, + .minYield = 3, + .description1 = gBerryDescriptionPart1_Wepear, + .description2 = gBerryDescriptionPart2_Wepear, + .stageDuration = 1, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_PINAP_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 80, + .maxYield = 6, + .minYield = 3, + .description1 = gBerryDescriptionPart1_Pinap, + .description2 = gBerryDescriptionPart2_Pinap, + .stageDuration = 1, + .spicy = 10, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_POMEG_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 135, + .maxYield = 6, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Pomeg, + .description2 = gBerryDescriptionPart2_Pomeg, + .stageDuration = 3, + .spicy = 10, + .dry = 0, + .sweet = 10, + .bitter = 10, + .sour = 0, + .smoothness = 20, + }, + { + .name = NAME_KELPSY_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 150, + .maxYield = 6, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Kelpsy, + .description2 = gBerryDescriptionPart2_Kelpsy, + .stageDuration = 3, + .spicy = 0, + .dry = 10, + .sweet = 0, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_QUALOT_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 110, + .maxYield = 6, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Qualot, + .description2 = gBerryDescriptionPart2_Qualot, + .stageDuration = 3, + .spicy = 10, + .dry = 0, + .sweet = 10, + .bitter = 0, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_HONDEW_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 162, + .maxYield = 6, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Hondew, + .description2 = gBerryDescriptionPart2_Hondew, + .stageDuration = 3, + .spicy = 10, + .dry = 10, + .sweet = 0, + .bitter = 10, + .sour = 0, + .smoothness = 20, + }, + { + .name = NAME_GREPA_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 149, + .maxYield = 6, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Grepa, + .description2 = gBerryDescriptionPart2_Grepa, + .stageDuration = 3, + .spicy = 0, + .dry = 10, + .sweet = 10, + .bitter = 0, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_TAMATO_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 200, + .maxYield = 4, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Tamato, + .description2 = gBerryDescriptionPart2_Tamato, + .stageDuration = 6, + .spicy = 20, + .dry = 10, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 30, + }, + { + .name = NAME_CORNN_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 75, + .maxYield = 4, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Cornn, + .description2 = gBerryDescriptionPart2_Cornn, + .stageDuration = 6, + .spicy = 0, + .dry = 20, + .sweet = 10, + .bitter = 0, + .sour = 0, + .smoothness = 30, + }, + { + .name = NAME_MAGOST_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 140, + .maxYield = 4, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Magost, + .description2 = gBerryDescriptionPart2_Magost, + .stageDuration = 6, + .spicy = 0, + .dry = 0, + .sweet = 20, + .bitter = 10, + .sour = 0, + .smoothness = 30, + }, + { + .name = NAME_RABUTA_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 226, + .maxYield = 4, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Rabuta, + .description2 = gBerryDescriptionPart2_Rabuta, + .stageDuration = 6, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 20, + .sour = 10, + .smoothness = 30, + }, + { + .name = NAME_NOMEL_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 285, + .maxYield = 4, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Nomel, + .description2 = gBerryDescriptionPart2_Nomel, + .stageDuration = 6, + .spicy = 10, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 20, + .smoothness = 30, + }, + { + .name = NAME_SPELON_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 133, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Spelon, + .description2 = gBerryDescriptionPart2_Spelon, + .stageDuration = 18, + .spicy = 40, + .dry = 10, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 70, + }, + { + .name = NAME_PAMTRE_BERRY, + .firmness = BERRY_FIRMNESS_VERY_SOFT, + .size = 244, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Pamtre, + .description2 = gBerryDescriptionPart2_Pamtre, + .stageDuration = 18, + .spicy = 0, + .dry = 40, + .sweet = 10, + .bitter = 0, + .sour = 0, + .smoothness = 70, + }, + { + .name = NAME_WATMEL_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 250, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Watmel, + .description2 = gBerryDescriptionPart2_Watmel, + .stageDuration = 18, + .spicy = 0, + .dry = 0, + .sweet = 40, + .bitter = 10, + .sour = 0, + .smoothness = 70, + }, + { + .name = NAME_DURIN_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 280, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Durin, + .description2 = gBerryDescriptionPart2_Durin, + .stageDuration = 18, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 40, + .sour = 10, + .smoothness = 70, + }, + { + .name = NAME_BELUE_BERRY, + .firmness = BERRY_FIRMNESS_VERY_SOFT, + .size = 300, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Belue, + .description2 = gBerryDescriptionPart2_Belue, + .stageDuration = 18, + .spicy = 10, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 40, + .smoothness = 70, + }, + { + .name = NAME_LIECHI_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 111, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Liechi, + .description2 = gBerryDescriptionPart2_Liechi, + .stageDuration = 24, + .spicy = 40, + .dry = 0, + .sweet = 40, + .bitter = 0, + .sour = 10, + .smoothness = 80, + }, + { + .name = NAME_GANLON_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 33, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Ganlon, + .description2 = gBerryDescriptionPart2_Ganlon, + .stageDuration = 24, + .spicy = 0, + .dry = 40, + .sweet = 0, + .bitter = 40, + .sour = 0, + .smoothness = 80, + }, + { + .name = NAME_SALAC_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 95, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Salac, + .description2 = gBerryDescriptionPart2_Salac, + .stageDuration = 24, + .spicy = 0, + .dry = 0, + .sweet = 40, + .bitter = 0, + .sour = 40, + .smoothness = 80, + }, + { + .name = NAME_PETAYA_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 237, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Petaya, + .description2 = gBerryDescriptionPart2_Petaya, + .stageDuration = 24, + .spicy = 40, + .dry = 0, + .sweet = 0, + .bitter = 40, + .sour = 0, + .smoothness = 80, + }, + { + .name = NAME_APICOT_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 75, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Apicot, + .description2 = gBerryDescriptionPart2_Apicot, + .stageDuration = 24, + .spicy = 0, + .dry = 40, + .sweet = 0, + .bitter = 0, + .sour = 40, + .smoothness = 80, + }, + { + .name = NAME_LANSAT_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 97, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Lansat, + .description2 = gBerryDescriptionPart2_Lansat, + .stageDuration = 24, + .spicy = 10, + .dry = 10, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 30, + }, + { + .name = NAME_STARF_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 153, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Starf, + .description2 = gBerryDescriptionPart2_Starf, + .stageDuration = 24, + .spicy = 10, + .dry = 10, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 30, + }, + { + .name = NAME_ENIGMA_BERRY, + .firmness = BERRY_FIRMNESS_UNKNOWN, + .size = 0, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Enigma, + .description2 = gBerryDescriptionPart2_Enigma, + .stageDuration = 24, + .spicy = 40, + .dry = 40, + .sweet = 40, + .bitter = 40, + .sour = 40, + .smoothness = 40, + }, +}; + +const struct BerryTree gBlankBerryTree = {0}; + +extern u8 BerryTreeScript; +extern u16 gScriptLastTalked; +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; + +// unused +void ClearEnigmaBerries(void) +{ + CpuFill16(0, &gSaveBlock1.enigmaBerry, sizeof(gSaveBlock1.enigmaBerry)); +} + +void SetEnigmaBerry(u8 *src) +{ + u32 i; + u8 *dest = (u8*)&gSaveBlock1.enigmaBerry; + + for (i = 0; i < sizeof(gSaveBlock1.enigmaBerry); i++) + dest[i] = src[i]; + + gSaveBlock1.enigmaBerry.berry.description1 = gSaveBlock1.enigmaBerry.description1; + gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2; +} + +u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) +{ + const u8 *description1; + const u8 *description2; + u32 i; + u32 checksum; + u8 *dest; + + description1 = gSaveBlock1.enigmaBerry.berry.description1; + description2 = gSaveBlock1.enigmaBerry.berry.description2; + gSaveBlock1.enigmaBerry.berry.description1 = 0; + gSaveBlock1.enigmaBerry.berry.description2 = 0; + + dest = (u8*)enigmaBerry; + checksum = 0; + for (i = 0; i < ((u32)&gSaveBlock1.enigmaBerry.checksum - (u32)&gSaveBlock1.enigmaBerry); i++) + { + checksum += dest[i]; + } + + gSaveBlock1.enigmaBerry.berry.description1 = description1; + gSaveBlock1.enigmaBerry.berry.description2 = description2; + + return checksum; +} + +bool32 IsEnigmaBerryValid(void) +{ + if (!gSaveBlock1.enigmaBerry.berry.stageDuration) + return FALSE; + if (!gSaveBlock1.enigmaBerry.berry.maxYield) + return FALSE; + if (GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry) != gSaveBlock1.enigmaBerry.checksum) + return FALSE; + return TRUE; +} + +const struct Berry *GetBerryInfo(u8 berry) +{ + if (berry == 0x2B && IsEnigmaBerryValid()) + return &gSaveBlock1.enigmaBerry.berry; + else + { + if (berry == 0 || berry > 0x2B) + berry = 1; + return &gBerries[berry - 1]; + } +} + +struct BerryTree *GetBerryTreeInfo(u8 id) +{ + return &gSaveBlock1.berryTrees[id]; +} + +bool32 FieldObjectInteractionWaterBerryTree(void) +{ + struct BerryTree *tree = GetBerryTreeInfo(FieldObjectGetBerryTreeId(gSelectedMapObject)); + + switch (tree->stage) + { + case 1: + tree->watered1 = TRUE; + break; + case 2: + tree->watered2 = TRUE; + break; + case 3: + tree->watered3 = TRUE; + break; + case 4: + tree->watered4 = TRUE; + break; + default: + return FALSE; + } + return TRUE; +} + +bool8 IsPlayerFacingPlantedBerryTree(void) +{ + if (GetFieldObjectScriptPointerForComparison() == &BerryTreeScript + && GetStageByBerryTreeId(FieldObjectGetBerryTreeId(gSelectedMapObject)) == 0) + return TRUE; + else + return FALSE; +} + +bool8 TryToWaterBerryTree(void) +{ + if (GetFieldObjectScriptPointerForComparison() != &BerryTreeScript) + return FALSE; + else + return FieldObjectInteractionWaterBerryTree(); +} + +void ClearBerryTrees(void) +{ + int i; + struct SaveBlock1 *saveBlock1 = &gSaveBlock1; + struct BerryTree berryTree = gBlankBerryTree; + + for (i = 0; i < (u8)ARRAY_COUNT(saveBlock1->berryTrees); i++) // casting to u8 fixes a mismatched signed compare. what + saveBlock1->berryTrees[i] = berryTree; +} + +bool32 BerryTreeGrow(struct BerryTree *tree) +{ + if (tree->growthSparkle) + return FALSE; + switch (tree->stage) + { + case 0: + return FALSE; + case 4: + tree->berryYield = CalcBerryYield(tree); + case 1: + case 2: + case 3: + tree->stage++; + break; + case 5: + tree->watered1 = 0; + tree->watered2 = 0; + tree->watered3 = 0; + tree->watered4 = 0; + tree->berryYield = 0; + tree->stage = 2; + if (++tree->regrowthCount == 10) + *tree = gBlankBerryTree; + break; + } + return TRUE; +} + +void BerryTreeTimeUpdate(s32 minutes) +{ + int i; + struct BerryTree *tree; + + for (i = 0; i < (u8)ARRAY_COUNT(gSaveBlock1.berryTrees); i++) + { + tree = &gSaveBlock1.berryTrees[i]; + + if (tree->berry && tree->stage && !tree->growthSparkle) + { + if (minutes >= GetStageDurationByBerryType(tree->berry) * 71) + { + *tree = gBlankBerryTree; + } + else + { + s32 time = minutes; + + while (time != 0) + { + if (tree->minutesUntilNextStage > time) + { + tree->minutesUntilNextStage -= time; + break; + } + time -= tree->minutesUntilNextStage; + tree->minutesUntilNextStage = GetStageDurationByBerryType(tree->berry); + if (!BerryTreeGrow(tree)) + break; + if (tree->stage == 5) + tree->minutesUntilNextStage *= 4; + } + } + } + } +} + +void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle) +{ + struct BerryTree *tree = GetBerryTreeInfo(id); + + *tree = gBlankBerryTree; + tree->berry = berry; + tree->minutesUntilNextStage = GetStageDurationByBerryType(berry); + tree->stage = stage; + if (stage == 5) + { + tree->berryYield = CalcBerryYield(tree); + tree->minutesUntilNextStage *= 4; + } + if (!sparkle) + { + tree->growthSparkle = TRUE; + } +} + +void RemoveBerryTree(u8 id) +{ + gSaveBlock1.berryTrees[id] = gBlankBerryTree; +} + +u8 GetBerryTypeByBerryTreeId(u8 id) +{ + return gSaveBlock1.berryTrees[id].berry; +} + +u8 GetStageByBerryTreeId(u8 id) +{ + return gSaveBlock1.berryTrees[id].stage; +} + +u8 ItemIdToBerryType(u16 item) +{ + u16 berry = item - FIRST_BERRY; + + if (berry > LAST_BERRY - FIRST_BERRY) + return 1; + else + return item - FIRST_BERRY + 1; +} + +u16 BerryTypeToItemId(u16 berry) +{ + u16 item = berry - 1; + + if (item > LAST_BERRY - FIRST_BERRY) + return FIRST_BERRY; + else + return berry + FIRST_BERRY - 1; +} + +void GetBerryNameByBerryType(u8 berry, u8 *string) +{ + memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_LENGTH); + string[BERRY_NAME_LENGTH] = EOS; +} + +void ResetBerryTreeSparkleFlag(u8 id) +{ + GetBerryTreeInfo(id)->growthSparkle = 0; +} + +u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree) +{ + u8 count = 0; + + if (tree->watered1) + count++; + if (tree->watered2) + count++; + if (tree->watered3) + count++; + if (tree->watered4) + count++; + return count; +} + +u8 GetNumStagesWateredByBerryTreeId(u8 id) +{ + return BerryTreeGetNumStagesWatered(GetBerryTreeInfo(id)); +} + +u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water) +{ + u32 randMin; + u32 randMax; + u32 rand; + u32 extraYield; + + if (water == 0) + return min; + else + { + randMin = (max - min) * (water - 1); + randMax = (max - min) * (water); + rand = randMin + Random() % (randMax - randMin + 1); + + if ((rand & 3) > 1) + extraYield = rand / 4 + 1; + else + extraYield = rand / 4; + return extraYield + min; + } +} + +u8 CalcBerryYield(struct BerryTree *tree) +{ + const struct Berry *berry = GetBerryInfo(tree->berry); + u8 min = berry->minYield; + u8 max = berry->maxYield; + + return CalcBerryYieldInternal(max, min, BerryTreeGetNumStagesWatered(tree)); +} + +u8 GetBerryCountByBerryTreeId(u8 id) +{ + return gSaveBlock1.berryTrees[id].berryYield; +} + +u16 GetStageDurationByBerryType(u8 berry) +{ + return GetBerryInfo(berry)->stageDuration * 60; +} + +void FieldObjectInteractionGetBerryTreeData(void) +{ + u8 id; + u8 berry; + u8 unk; + u8 group; + u8 num; + + id = FieldObjectGetBerryTreeId(gSelectedMapObject); + berry = GetBerryTypeByBerryTreeId(id); + ResetBerryTreeSparkleFlag(id); + unk = gScriptLastTalked; + num = gSaveBlock1.location.mapNum; + group = gSaveBlock1.location.mapGroup; + if (sub_8060234(unk, num, group)) + gSpecialVar_0x8004 = 0xFF; + else + gSpecialVar_0x8004 = GetStageByBerryTreeId(id); + gSpecialVar_0x8005 = GetNumStagesWateredByBerryTreeId(id); + gSpecialVar_0x8006 = GetBerryCountByBerryTreeId(id); + GetBerryNameByBerryType(berry, gStringVar1); +} + +void sub_80B4EE4(void) +{ + SetMainCallback2(sub_80A68CC); +} + +void FieldObjectInteractionPlantBerryTree(void) +{ + u8 berry = ItemIdToBerryType(gScriptItemId); + + PlantBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject), berry, 1, TRUE); + FieldObjectInteractionGetBerryTreeData(); +} + +void FieldObjectInteractionPickBerryTree(void) +{ + u8 id = FieldObjectGetBerryTreeId(gSelectedMapObject); + u8 berry = GetBerryTypeByBerryTreeId(id); + + gSpecialVar_0x8004 = AddBagItem(BerryTypeToItemId(berry), GetBerryCountByBerryTreeId(id)); +} + +void FieldObjectInteractionRemoveBerryTree(void) +{ + RemoveBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject)); + sub_8060288(gScriptLastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); +} + +u8 PlayerHasBerries(void) +{ + return IsBagPocketNonEmpty(BAG_BERRIES); +} + +void ResetBerryTreeSparkleFlags(void) +{ + s16 cam_left; + s16 cam_top; + s16 left; + s16 top; + s16 right; + s16 bottom; + int i; + + GetCameraCoords(&cam_left, &cam_top); + left = cam_left; + top = cam_top + 3; + right = cam_left + 14; + bottom = top + 8; + for (i = 0; i < (u8)ARRAY_COUNT(gSaveBlock1.mapObjects); i++) + { + if (gMapObjects[i].active && gMapObjects[i].animPattern == 12) + { + cam_left = gMapObjects[i].coords2.x; + cam_top = gMapObjects[i].coords2.y; + if (left <= cam_left && cam_left <= right && top <= cam_top && cam_top <= bottom) + ResetBerryTreeSparkleFlag(gMapObjects[i].trainerRange_berryTreeId); + } + } +} diff --git a/src/field/berry_tag_screen.c b/src/field/berry_tag_screen.c new file mode 100644 index 000000000..ff430e7b2 --- /dev/null +++ b/src/field/berry_tag_screen.c @@ -0,0 +1,580 @@ +#include "global.h" +#include "berry_tag_screen.h" +#include "berry.h" +#include "decompress.h" +#include "field_map_obj.h" +#include "item_menu.h" +#include "items.h" +#include "item_use.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "palette.h" +#include "rom4.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" + +#define OFFSET_7B (123) +#define FIRST_BERRY ITEM_CHERI_BERRY + +struct Struct2000000 +{ + /*0x00*/ u8 filler_0[0x1FFFF]; + /*0x1FFFF*/ u8 var_1FFFF; +}; + +extern struct Struct2000000 unk_2000000; +extern u16 gUnknown_030041B4; + +static EWRAM_DATA u8 gUnknown_0203932C = 0; +static EWRAM_DATA s16 gUnknown_0203932E[5] = {0}; + +extern const struct CompressedSpriteSheet gUnknown_083C1F74; +extern const struct CompressedSpritePalette gUnknown_083C1F7C; + +extern u8 gBerryCheck_Gfx[]; +extern u8 gBerryCheck_Pal[]; +extern u8 gUnknown_08E788E4[]; +extern u8 gUnknown_08E78A84[]; + +static const u8 *const gUnknown_0841192C[] = +{ + ContestStatsText_VerySoft, + ContestStatsText_Soft, + ContestStatsText_Hard, + ContestStatsText_VeryHard, + ContestStatsText_SuperHard, +}; + +static void sub_8146014(void); +static void sub_814602C(void); +static bool8 sub_8146058(void); +static void sub_8146288(void); +static bool8 sub_81462B8(void); +static void sub_814640C(u8 taskId); +static void sub_8146440(u8 taskId); +static void sub_8146480(u8 taskid); +static void sub_81464E4(void); +static void sub_8146600(u8 berry); +// static void sub_81466A0(void); +static void sub_81466E8(u8 taskId, s8 direction); +// static void sub_8146798(u8 berry); +static void sub_8146810(s8 berry); +static void sub_81468BC(void); + +static void sub_8146014(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); +} + +static void sub_814602C(void) +{ + REG_BG0VOFS = gUnknown_030041B4; + REG_BG1VOFS = gUnknown_030041B4; + + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static bool8 sub_8146058(void) +{ + u8 berry; + u16 backup; + + switch (gMain.state) + { + case 0: + sub_80F9438(); + sub_80F9368(); + sub_8146288(); + REG_BLDCNT = 0; + gMain.state += 1; + break; + case 1: + ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = 1; + gMain.state += 1; + break; + case 2: + ResetSpriteData(); + gMain.state += 1; + break; + case 3: + SetUpWindowConfig(&gWindowConfig_81E6E18); + gMain.state += 1; + break; + case 4: + MultistepInitMenuWindowBegin(&gWindowConfig_81E6E18); + gMain.state += 1; + break; + case 5: + if (!MultistepInitMenuWindowContinue()) + break; + unk_2000000.var_1FFFF = 0; + gMain.state += 1; + break; + case 6: + if (!sub_81462B8()) + break; + unk_2000000.var_1FFFF = 0; + gMain.state += 1; + break; + case 7: + sub_81464E4(); + gMain.state += 1; + break; + case 8: + berry = gScriptItemId + OFFSET_7B; + gUnknown_0203932C = CreateBerrySprite(berry, 56, 64); + gMain.state += 1; + break; + case 9: + sub_8146600(gScriptItemId + OFFSET_7B); + gMain.state += 1; + break; + case 10: + backup = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = backup; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(sub_814602C); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP; + gMain.state += 1; + break; + case 11: + if (sub_8055870() == TRUE) + break; + gMain.state += 1; + break; + case 12: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + gPaletteFade.bufferTransferDisabled = 0; + SetMainCallback2(sub_8146014); + return TRUE; + } + + return FALSE; +} + +void BerryTagScreen_814625C(u8 taskId) +{ + do + { + if (sub_8146058() == TRUE) + { + CreateTask(sub_8146480, 0); + return; + } + } while (sub_80F9344() != TRUE); +} + +static void sub_8146288(void) +{ + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + gUnknown_030041B4 = 0; +} + +bool8 sub_81462B8(void) +{ + u16 i; + void *addr; + + switch (unk_2000000.var_1FFFF) + { + case 0: + LZDecompressVram(gBerryCheck_Gfx, (void *)VRAM); + unk_2000000.var_1FFFF += 1; + break; + case 1: + LZDecompressVram(gUnknown_08E788E4, (void *)VRAM + 0x2800); + unk_2000000.var_1FFFF += 1; + break; + case 2: + LZDecompressVram(gUnknown_08E78A84, (void *)VRAM + 0x3000); + unk_2000000.var_1FFFF += 1; + break; + case 3: + for (i = 0; i < 0x400; i++) + { + if (gSaveBlock2.playerGender == MALE) + gBGTilemapBuffers[2][i] = 0x4042; + else + gBGTilemapBuffers[2][i] = 0x5042; + } + addr = (void *)(VRAM + 0x3800); + DmaCopy16(3, gBGTilemapBuffers[2], addr, 0x800); + unk_2000000.var_1FFFF += 1; + break; + case 4: + LoadCompressedPalette(gBerryCheck_Pal, 0, 96 * 2); + unk_2000000.var_1FFFF += 1; + break; + case 5: + LoadCompressedObjectPic(&gUnknown_083C1F74); + unk_2000000.var_1FFFF += 1; + break; + case 6: + LoadCompressedObjectPalette(&gUnknown_083C1F7C); + unk_2000000.var_1FFFF = 0; + return TRUE; + } + + return FALSE; +} + +static void sub_814640C(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(sub_80A5B40); + sub_80A7DD4(); + gpu_pal_allocator_reset__manage_upper_four(); + DestroyTask(taskId); + } +} + +static void sub_8146440(u8 taskId) +{ + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = sub_814640C; +} + +static void sub_8146480(u8 taskid) +{ + if (!gPaletteFade.active) + { + if ((gMain.newAndRepeatedKeys & (DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) == DPAD_UP) + sub_81466E8(taskid, -1); + if ((gMain.newAndRepeatedKeys & (DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) == DPAD_DOWN) + sub_81466E8(taskid, 1); + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + sub_8146440(taskid); + } +} + +static void sub_81464E4(void) +{ + const struct Berry *berryInfo; +#ifdef UNITS_IMPERIAL + u32 size; + s32 sizeMajor; + s32 sizeMinor; +#endif +#if GERMAN + u8 buffer[16]; +#endif + + berryInfo = GetBerryInfo(gScriptItemId + OFFSET_7B + 1); + + ConvertIntToDecimalStringN(gStringVar1, gScriptItemId - FIRST_BERRY + 1, STR_CONV_MODE_LEADING_ZEROS, 2); + MenuPrint(gStringVar1, 12, 4); + +#if ENGLISH + MenuPrint(berryInfo->name, 14, 4); +#elif GERMAN + StringCopy(buffer, berryInfo->name); + StringAppend(buffer, gOtherText_Berry2); + MenuPrint(buffer, 14, 4); +#endif + + MenuPrint(berryInfo->description1, 4, 14); + MenuPrint(berryInfo->description2, 4, 16); + +#ifdef UNITS_IMPERIAL + size = (berryInfo->size * 1000) / 254; + if (size % 10 >= 5) + size += 10; + sizeMinor = (size % 100) / 10; + sizeMajor = size / 100; +#endif + + MenuPrint(gOtherText_Size, 11, 7); + if (berryInfo->size != 0) + { +#ifdef UNITS_IMPERIAL + ConvertIntToDecimalStringN(gStringVar1, sizeMajor, STR_CONV_MODE_LEFT_ALIGN, 2); + ConvertIntToDecimalStringN(gStringVar2, sizeMinor, STR_CONV_MODE_LEFT_ALIGN, 2); +#else + 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); + } + else + { + MenuPrint(gOtherText_ThreeQuestions2, 16, 7); + } + + MenuPrint(gOtherText_Firm, 11, 9); + if (berryInfo->firmness != 0) + MenuPrint(gUnknown_0841192C[berryInfo->firmness - 1], 16, 9); + else + MenuPrint(gOtherText_ThreeQuestions2, 16, 9); +} + +static void sub_8146600(u8 berry) +{ + const struct Berry *berryInfo; + u16 i; + + berryInfo = GetBerryInfo(berry + 1); + for (i = 0; i < 5; i++) + gUnknown_0203932E[i] = (u16)gUnknown_0203932E[i] | 0xFFFF; + + // argument is the center of the circle + if (berryInfo->spicy) + gUnknown_0203932E[0] = sub_80A7E5C(48); + if (berryInfo->dry) + gUnknown_0203932E[1] = sub_80A7E5C(88); + if (berryInfo->sweet) + gUnknown_0203932E[2] = sub_80A7E5C(128); + if (berryInfo->bitter) + gUnknown_0203932E[3] = sub_80A7E5C(168); + if (berryInfo->sour) + gUnknown_0203932E[4] = sub_80A7E5C(208); +} + +void sub_81466A0(void) +{ + u16 i; + + for (i = 0; i < 5; i++) + { + if (gUnknown_0203932E[i] != -1) + { + DestroySprite(&gSprites[gUnknown_0203932E[i]]); + gUnknown_0203932E[i] = -1; + } + } +} + +__attribute__((naked)) +static void sub_81466E8(u8 taskId, s8 direction) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + lsls r1, 24\n\ + lsrs r2, r1, 24\n\ + lsls r0, r7, 2\n\ + adds r0, r7\n\ + lsls r0, 3\n\ + ldr r1, _08146748 @ =gTasks + 0x8\n\ + adds r6, r0, r1\n\ + ldr r4, _0814674C @ =gBagPocketScrollStates\n\ + movs r0, 0xC\n\ + adds r0, r4\n\ + mov r8, r0\n\ + ldrb r1, [r0, 0x1]\n\ + ldrb r0, [r4, 0xC]\n\ + adds r1, r0\n\ + cmp r1, 0\n\ + bne _08146718\n\ + lsls r0, r2, 24\n\ + cmp r0, 0\n\ + blt _0814678C\n\ +_08146718:\n\ + adds r0, r1, 0x1\n\ + lsls r5, r2, 24\n\ + mov r1, r8\n\ + ldrb r1, [r1, 0x2]\n\ + cmp r0, r1\n\ + bne _08146728\n\ + cmp r5, 0\n\ + bgt _0814678C\n\ +_08146728:\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + mov r2, r8\n\ + ldrb r3, [r2, 0x1]\n\ + ldrb r4, [r4, 0xC]\n\ + mov r12, r4\n\ + adds r0, r3, r4\n\ + asrs r2, r5, 24\n\ + adds r1, r0, r2\n\ + cmp r1, 0\n\ + bge _08146750\n\ + negs r0, r0\n\ + strh r0, [r6, 0x2]\n\ + b _08146766\n\ + .align 2, 0\n\ +_08146748: .4byte gTasks + 0x8\n\ +_0814674C: .4byte gBagPocketScrollStates\n\ +_08146750:\n\ + mov r4, r8\n\ + ldrb r0, [r4, 0x2]\n\ + cmp r1, r0\n\ + blt _08146764\n\ + subs r0, r3\n\ + mov r1, r12\n\ + subs r0, r1\n\ + subs r0, 0x1\n\ + strh r0, [r6, 0x2]\n\ + b _08146766\n\ +_08146764:\n\ + strh r2, [r6, 0x2]\n\ +_08146766:\n\ + ldr r0, _08146780 @ =gTasks\n\ + lsls r1, r7, 2\n\ + adds r1, r7\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + ldr r0, _08146784 @ =sub_8146798\n\ + str r0, [r1]\n\ + cmp r5, 0\n\ + bge _08146788\n\ + movs r2, 0x10\n\ + negs r2, r2\n\ + adds r0, r2, 0\n\ + b _0814678A\n\ + .align 2, 0\n\ +_08146780: .4byte gTasks\n\ +_08146784: .4byte sub_8146798\n\ +_08146788:\n\ + movs r0, 0x10\n\ +_0814678A:\n\ + strh r0, [r6]\n\ +_0814678C:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} + +void sub_8146798(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + gUnknown_030041B4 = (gUnknown_030041B4 + taskData[0]) & 0xFF; + if ((taskData[0] > 0 && gUnknown_030041B4 == 144) + || (taskData[0] < 0 && gUnknown_030041B4 == 112)) + { + sub_8146810(gTasks[taskId].data[1]); + sub_81468BC(); + } + if (gUnknown_030041B4 == 0) + { + gTasks[taskId].data[0] = gUnknown_030041B4; + gTasks[taskId].data[1] = gUnknown_030041B4; + gTasks[taskId].func = sub_8146480; + } +} + +__attribute__((naked)) +static void sub_8146810(s8 berry) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + adds r4, r3, 0\n\ + lsls r0, r3, 24\n\ + asrs r1, r0, 24\n\ + cmp r1, 0\n\ + ble _08146848\n\ + ldr r0, _08146840 @ =gBagPocketScrollStates\n\ + adds r4, r0, 0\n\ + adds r4, 0xC\n\ + ldrb r2, [r0, 0xC]\n\ + adds r1, r2, r1\n\ + adds r6, r0, 0\n\ + cmp r1, 0x7\n\ + ble _08146844\n\ + adds r0, r3, 0\n\ + adds r0, 0xF9\n\ + adds r0, r2, r0\n\ + ldrb r1, [r4, 0x1]\n\ + adds r0, r1\n\ + strb r0, [r4, 0x1]\n\ + movs r0, 0x7\n\ + b _0814686E\n\ + .align 2, 0\n\ +_08146840: .4byte gBagPocketScrollStates\n\ +_08146844:\n\ + adds r0, r2, r3\n\ + b _0814686E\n\ +_08146848:\n\ + ldr r0, _08146868 @ =gBagPocketScrollStates\n\ + adds r5, r0, 0\n\ + adds r5, 0xC\n\ + ldrb r2, [r0, 0xC]\n\ + adds r1, r2, r1\n\ + adds r6, r0, 0\n\ + cmp r1, 0\n\ + bge _0814686C\n\ + adds r0, r2, r3\n\ + ldrb r1, [r5, 0x1]\n\ + adds r0, r1\n\ + movs r1, 0\n\ + strb r0, [r5, 0x1]\n\ + strb r1, [r6, 0xC]\n\ + b _08146870\n\ + .align 2, 0\n\ +_08146868: .4byte gBagPocketScrollStates\n\ +_0814686C:\n\ + adds r0, r2, r4\n\ +_0814686E:\n\ + strb r0, [r6, 0xC]\n\ +_08146870:\n\ + ldr r2, _081468AC @ =gScriptItemId\n\ + movs r0, 0x3\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldrb r1, [r0, 0x1]\n\ + ldrb r0, [r0]\n\ + adds r1, r0\n\ + ldr r0, _081468B0 @ =gCurrentBagPocketItemSlots\n\ + ldr r0, [r0]\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldrh r0, [r1]\n\ + strh r0, [r2]\n\ + ldr r0, _081468B4 @ =gUnknown_0203932C\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _081468B8 @ =gSprites\n\ + adds r0, r1\n\ + bl DestroySprite\n\ + bl sub_81466A0\n\ + bl sub_80A7DD4\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_081468AC: .4byte gScriptItemId\n\ +_081468B0: .4byte gCurrentBagPocketItemSlots\n\ +_081468B4: .4byte gUnknown_0203932C\n\ +_081468B8: .4byte gSprites\n\ + .syntax divided\n"); +} + +static void sub_81468BC(void) +{ + MenuZeroFillWindowRect(0, 4, 29, 19); + sub_81464E4(); + + // center of berry sprite + gUnknown_0203932C = CreateBerrySprite(gScriptItemId + OFFSET_7B, 56, 64); + + sub_8146600(gScriptItemId + OFFSET_7B); +} diff --git a/src/field/bike.c b/src/field/bike.c new file mode 100644 index 000000000..58a4f38f4 --- /dev/null +++ b/src/field/bike.c @@ -0,0 +1,1013 @@ +#include "global.h" +#include "bike.h" +#include "field_map_obj.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "flags.h" +#include "global.fieldmap.h" +#include "metatile_behavior.h" +#include "rom4.h" +#include "songs.h" +#include "sound.h" + +extern u8 sub_80608A4(u8); + +extern u8 gUnknown_02039250; +extern u8 gUnknown_02039251; +extern u8 gUnknown_0202E854; + +static void MovePlayerOnMachBike(u8, u16, u16); +static u8 GetMachBikeTransition(u8 *); +static void MachBikeTransition_FaceDirection(u8); +static void MachBikeTransition_80E517C(u8); +static void MachBikeTransition_80E51C4(u8); +static void MachBikeTransition_80E5270(u8); +static void MovePlayerOnAcroBike(u8, u16, u16); +static u8 CheckMovementInputAcroBike(u8 *, u16, u16); +static u8 AcroBikeHandleInputNormal(u8 *, u16, u16); +static u8 AcroBikeHandleInputTurning(u8 *, u16, u16); +static u8 AcroBikeHandleInputWheelieStanding(u8 *, u16, u16); +static u8 AcroBikeHandleInputBunnyHop(u8 *, u16, u16); +static u8 AcroBikeHandleInputWheelieMoving(u8 *, u16, u16); +static u8 AcroBikeHandleInputState5(u8 *, u16, u16); +static u8 AcroBikeHandleInputState6(u8 *, u16, u16); +static void AcroBikeTransition_FaceDirection(u8); +static void AcroBikeTransition_80E5708(u8); +static void AcroBikeTransition_80E5744(u8); +static void AcroBikeTransition_NormalToWheelie(u8); +static void AcroBikeTransition_80E57F8(u8); +static void AcroBikeTransition_80E5834(u8); +static void AcroBikeTransition_80E5870(u8); +static void AcroBikeTransition_80E58AC(u8); +static void AcroBikeTransition_80E5920(u8); +static void AcroBikeTransition_80E5990(u8); +static void AcroBikeTransition_80E59A0(u8); +static void AcroBikeTransition_80E5A30(u8); +static void AcroBikeTransition_80E5AC0(u8); +static void sub_80E5B60(u16, u16); +static u8 sub_80E5C2C(void); +static void sub_80E5C7C(u8); +static void sub_80E5CB8(u8); +static u8 sub_80E5CF4(u16); +static u8 get_some_collision(u8); +static u8 sub_80E5DA0(struct MapObject *, s16, s16, u8, u8); +static bool8 IsRunningDisallowedByMetatile(u8); +static void sub_80E5E4C(); +static u8 CanBikeFaceDirOnMetatile(u8, u8); +static bool8 sub_80E5EC0(u8, u8); +static void sub_80E6024(void); + +static void (*const sMachBikeTransitions[])(u8) = +{ + MachBikeTransition_FaceDirection, + MachBikeTransition_80E517C, + MachBikeTransition_80E51C4, + MachBikeTransition_80E5270, +}; + +static void (*const gUnknown_083DB5A4[])(u8) = +{ + PlayerGoSpeed0, + sub_80593C4, + sub_80593F4, +}; + +static void (*const sAcroBikeTransitions[])(u8) = +{ + AcroBikeTransition_FaceDirection, + AcroBikeTransition_80E5708, + AcroBikeTransition_80E5744, + AcroBikeTransition_NormalToWheelie, + AcroBikeTransition_80E57F8, + AcroBikeTransition_80E5834, + AcroBikeTransition_80E5870, + AcroBikeTransition_80E58AC, + AcroBikeTransition_80E5920, + AcroBikeTransition_80E5990, + AcroBikeTransition_80E59A0, + AcroBikeTransition_80E5A30, + AcroBikeTransition_80E5AC0, +}; + +static u8 (*const sAcroBikeInputHandlers[])(u8 *, u16, u16) = +{ + AcroBikeHandleInputNormal, + AcroBikeHandleInputTurning, + AcroBikeHandleInputWheelieStanding, + AcroBikeHandleInputBunnyHop, + AcroBikeHandleInputWheelieMoving, + AcroBikeHandleInputState5, + AcroBikeHandleInputState6, +}; + +const u16 gMachBikeSpeeds[] = {SPEED_NORMAL, SPEED_FAST, SPEED_FASTEST}; +static const u8 Unknown_3DB606[] = {4, 0}; + +static const struct UnknownStruct1 gUnknown_083DB608[] = +{ + {1, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 1}, + {2, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 2}, + {3, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 3}, + {4, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 4}, +}; + +void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) +{ + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) + MovePlayerOnMachBike(direction, newKeys, heldKeys); + else + MovePlayerOnAcroBike(direction, newKeys, heldKeys); +} + +static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys) +{ + sMachBikeTransitions[GetMachBikeTransition(&direction)](direction); +} + +static u8 GetMachBikeTransition(u8 *ptr) +{ + u8 direction = player_get_direction_upper_nybble(); + + if (*ptr == 0) + { + *ptr = direction; + if (gPlayerAvatar.unkB == 0) + { + gPlayerAvatar.running2 = 0; + return 0; + } + gPlayerAvatar.running2 = 2; + return 3; + } + + if (*ptr != direction && gPlayerAvatar.running2 != 2) + { + if (gPlayerAvatar.unkB != 0) + { + *ptr = direction; + gPlayerAvatar.running2 = 2; + return 3; + } + gPlayerAvatar.running2 = 1; + return 1; + } + else + { + gPlayerAvatar.running2 = 2; + return 2; + } +} + +static void MachBikeTransition_FaceDirection(u8 direction) +{ + PlayerFaceDirection(direction); + sub_80E6024(); +} + +static void MachBikeTransition_80E517C(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E)) + { + PlayerTurnInPlace(direction); + sub_80E6024(); + } + else + { + MachBikeTransition_FaceDirection(playerMapObj->mapobj_unk_18); + } +} + +static void MachBikeTransition_80E51C4(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + u8 collision; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + if (gPlayerAvatar.unkB) + MachBikeTransition_80E5270(playerMapObj->placeholder18); + else + MachBikeTransition_FaceDirection(playerMapObj->placeholder18); + } + else + { + collision = get_some_collision(direction); + if (collision > 0 && collision < 12) + { + if (collision == COLLISION_LEDGE_JUMP) + { + PlayerJumpLedge(direction); + } + else + { + sub_80E6024(); + if (collision < 5 || collision > 8) + PlayerOnBikeCollide(direction); + } + } + else + { + gUnknown_083DB5A4[gPlayerAvatar.bikeFrameCounter](direction); + gPlayerAvatar.unkB = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // same as dividing by 2, but compiler is insistent on >> 1 + if (gPlayerAvatar.bikeFrameCounter < 2) // do not go faster than the last element in the mach bike array + gPlayerAvatar.bikeFrameCounter++; + } + } +} + +static void MachBikeTransition_80E5270(u8 var) +{ + u8 collision; + + if (gPlayerAvatar.unkB != 0) + gPlayerAvatar.bikeFrameCounter = --gPlayerAvatar.unkB; + + collision = get_some_collision(var); + + if (collision > 0 && collision < 12) + { + if (collision == COLLISION_LEDGE_JUMP) + { + PlayerJumpLedge(var); + } + else + { + sub_80E6024(); + if (collision < 5 || collision > 8) + PlayerOnBikeCollide(var); + } + } + else + { + gUnknown_083DB5A4[gPlayerAvatar.bikeFrameCounter](var); + } +} + +static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys) +{ + sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection); +} + +static u8 CheckMovementInputAcroBike(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + return sAcroBikeInputHandlers[gPlayerAvatar.acroBikeState](newDirection, newKeys, heldKeys); +} + +static u8 AcroBikeHandleInputNormal(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + u8 direction = player_get_direction_upper_nybble(); + + gPlayerAvatar.bikeFrameCounter = 0; + if (*newDirection == DIR_NONE) + { + if (newKeys & B_BUTTON) + { + //We're standing still with the B button held. + //Do a wheelie. + *newDirection = direction; + gPlayerAvatar.running2 = 0; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + return ACRO_TRANS_NORMAL_TO_WHEELIE; + } + else + { + *newDirection = direction; + gPlayerAvatar.running2 = 0; + return ACRO_TRANS_FACE_DIRECTION; + } + } + if (*newDirection == direction && (heldKeys & B_BUTTON) && gPlayerAvatar.unkB == 0) + { + gPlayerAvatar.unkB++; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING; + return 11; + } + if (*newDirection != direction && gPlayerAvatar.running2 != 2) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_TURNING; + gPlayerAvatar.unk9 = *newDirection; + gPlayerAvatar.running2 = 0; + return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys); + } + gPlayerAvatar.running2 = 2; + return 2; +} + +static u8 AcroBikeHandleInputTurning(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + u8 direction; + + *newDirection = gPlayerAvatar.unk9; + gPlayerAvatar.bikeFrameCounter++; + + //Wait 6 frames before actually changing direction + if (gPlayerAvatar.bikeFrameCounter > 6) + { + gPlayerAvatar.running2 = 1; + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + sub_80E6024(); + return 1; + } + direction = player_get_direction_upper_nybble(); + if (*newDirection == sub_80E5C2C()) + { + sub_80E6024(); + gPlayerAvatar.unkB = 1; + if (*newDirection == GetOppositeDirection(direction)) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_6; + return 9; + } + else + { + gPlayerAvatar.running2 = 2; + gPlayerAvatar.acroBikeState = ACRO_STATE_5; + return 8; + } + } + *newDirection = direction; + return 0; +} + +static u8 AcroBikeHandleInputWheelieStanding(u8 *ptr, u16 newKeys, u16 heldKeys) +{ + u8 direction; + struct MapObject *playerMapObj; + + direction = player_get_direction_upper_nybble(); + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + gPlayerAvatar.running2 = 0; + + if (heldKeys & B_BUTTON) + gPlayerAvatar.bikeFrameCounter++; + else + { + //B button was released. + gPlayerAvatar.bikeFrameCounter = 0; + if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + { + //Go back to normal on flat ground + *ptr = direction; + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + sub_80E6024(); + return 4; + } + } + if (gPlayerAvatar.bikeFrameCounter >= 40) + { + *ptr = direction; + gPlayerAvatar.acroBikeState = ACRO_STATE_BUNNY_HOP; + sub_80E6024(); + return 6; + } + if (*ptr == direction) + { + gPlayerAvatar.running2 = 2; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING; + sub_80E6024(); + return 10; + } + if (*ptr == 0) + { + *ptr = direction; + return 5; + } + gPlayerAvatar.running2 = 1; + return 5; +} + +static u8 AcroBikeHandleInputBunnyHop(u8 *ptr, u16 newKeys, u16 heldKeys) +{ + u8 direction; + struct MapObject *playerMapObj; + + direction = player_get_direction_upper_nybble(); + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!(heldKeys & B_BUTTON)) + { + //B button was released + sub_80E6024(); + if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + { + //Do a standing wheelie on a bumpy slope + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); + } + else + { + //Go back to normal on flat ground + *ptr = direction; + gPlayerAvatar.running2 = 0; + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + return 4; + } + } + + //B Button is still held + + if (*ptr == DIR_NONE) + { + *ptr = direction; + gPlayerAvatar.running2 = 0; + return 6; + } + if (*ptr != direction && gPlayerAvatar.running2 != 2) + { + gPlayerAvatar.running2 = 1; + return 6; + } + gPlayerAvatar.running2 = 2; + return 7; +} + +static u8 AcroBikeHandleInputWheelieMoving(u8 *ptr, u16 newKeys, u16 heldKeys) +{ + u8 direction; + struct MapObject *playerMapObj; + + direction = player_get_direction_lower_nybble(); + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!(heldKeys & B_BUTTON)) + { + sub_80E6024(); + if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + if (*ptr == 0) + { + *ptr = direction; + gPlayerAvatar.running2 = 0; + return 4; + } + if (*ptr != direction && gPlayerAvatar.running2 != 2) + { + gPlayerAvatar.running2 = 0; + return 4; + } + gPlayerAvatar.running2 = 2; + return 12; + } + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); + } + if (*ptr == 0) + { + *ptr = direction; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + gPlayerAvatar.running2 = 0; + sub_80E6024(); + return 5; + } + if (direction != *ptr && gPlayerAvatar.running2 != 2) + { + gPlayerAvatar.running2 = 0; + return 5; + } + gPlayerAvatar.running2 = 2; + return 10; +} + +static u8 AcroBikeHandleInputState5(u8 *ptr, u16 newKeys, u16 heldKeys) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + playerMapObj->mapobj_bit_9 = 0; + FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); +} + +static u8 AcroBikeHandleInputState6(u8 *ptr, u16 newKeys, u16 heldKeys) +{ + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); +} + +static void AcroBikeTransition_FaceDirection(u8 direction) +{ + PlayerFaceDirection(direction); +} + +static void AcroBikeTransition_80E5708(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + PlayerFaceDirection(direction); +} + +static void AcroBikeTransition_80E5744(u8 direction) +{ + u8 collision; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + AcroBikeTransition_FaceDirection(playerMapObj->placeholder18); + return; + } + collision = get_some_collision(direction); + if (collision > 0 && collision < 12) + { + if (collision == COLLISION_LEDGE_JUMP) + PlayerJumpLedge(direction); + else if (collision < 5 || collision > 8) + PlayerOnBikeCollide(direction); + } + else + { + npc_use_some_d2s(direction); + } +} + +static void AcroBikeTransition_NormalToWheelie(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + PlayerStartWheelie(direction); +} + +static void AcroBikeTransition_80E57F8(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + sub_8059534(direction); +} + +static void AcroBikeTransition_80E5834(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + sub_8059504(direction); +} + +static void AcroBikeTransition_80E5870(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + sub_805954C(direction); +} + +static void AcroBikeTransition_80E58AC(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + AcroBikeTransition_80E5870(playerMapObj->placeholder18); + return; + } + var = get_some_collision(direction); + //TODO: Try to get rid of this goto + if (var == 0 || var == 9) + { + goto derp; + } + else if (var == 6) + { + sub_8059594(direction); + } + else if (var < 5 || var > 8) + { + if (var <= 11) + { + AcroBikeTransition_80E5870(direction); + } + else + { + derp: + sub_8059570(direction); + } + } +} + +static void AcroBikeTransition_80E5920(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj; + + var = get_some_collision(direction); + if (var != 0) + { + if (var == 7) + return; + if (var < 10) + { + AcroBikeTransition_80E5708(direction); + return; + } + if (sub_80E5EC0(var, direction) == 0) + { + AcroBikeTransition_80E5708(direction); + return; + } + } + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + PlaySE(SE_JITE_PYOKO); + playerMapObj->mapobj_bit_9 = 1; + PlayerSetAnimId(sub_80608A4(direction), 2); +} + +static void AcroBikeTransition_80E5990(u8 direction) +{ + sub_80595B8(direction); +} + +static void AcroBikeTransition_80E59A0(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + sub_8059504(playerMapObj->placeholder18); + return; + } + var = get_some_collision(direction); + if (var > 0 && var < 12) + { + if (var == 6) + { + sub_8059594(direction); + } + else if (var == 9) + { + sub_8059504(direction); + } + else if (var <= 4) + { + if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + sub_8059504(direction); + else + sub_80595DC(direction); //hit wall? + } + return; + } + sub_8059618(direction); + gPlayerAvatar.running2 = 2; +} + +static void AcroBikeTransition_80E5A30(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + PlayerStartWheelie(playerMapObj->placeholder18); + return; + } + var = get_some_collision(direction); + if (var > 0 && var < 12) + { + if (var == 6) + { + sub_8059594(direction); + } + else if (var == 9) + { + sub_8059504(direction); + } + else if (var <= 4) + { + if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + sub_8059504(direction); + else + sub_80595DC(direction); //hit wall? + } + return; + } + sub_8059600(direction); + gPlayerAvatar.running2 = 2; +} + +static void AcroBikeTransition_80E5AC0(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + sub_8059534(playerMapObj->placeholder18); + return; + } + var = get_some_collision(direction); + if (var > 0 && var < 12) + { + if (var == 6) + PlayerJumpLedge(direction); + else if (var < 5 || var > 8) + sub_8059534(direction); + return; + } + sub_8059630(direction); +} + +void sub_80E5B38(u16 a, u16 b) +{ + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) + sub_80E5B60(a, b); +} + +static void sub_80E5B60(u16 unused, u16 b) +{ + u8 var; + + var = sub_80E5CF4(b); + if (var == (gPlayerAvatar.unkC & 0xF)) + { + if (gPlayerAvatar.unk14[0] < 0xFF) + gPlayerAvatar.unk14[0]++; + } + else + { + sub_80E5C7C(var); + gPlayerAvatar.unkB = 0; + } + + var = b & 0xF; + if (var == (gPlayerAvatar.unk10 & 0xF)) + { + if (gPlayerAvatar.unk1C[0] < 0xFF) + gPlayerAvatar.unk1C[0]++; + } + else + { + sub_80E5CB8(var); + gPlayerAvatar.unkB = 0; + } +} + +static bool8 sub_80E5BC8(const u8 *a, const u8 *b) +{ + u8 i; + + for (i = 0; a[i] != 0; i++) + { + if (gPlayerAvatar.unk14[i] > a[i]) + return FALSE; + } + for (i = 0; b[i] != 0; i++) + { + if (gPlayerAvatar.unk1C[i] > b[i]) + return FALSE; + } + return TRUE; +} + +static u8 sub_80E5C2C(void) +{ + u32 i; + + for (i = 0; i < 4; i++) + { + const struct UnknownStruct1 *s = &gUnknown_083DB608[i]; + u32 r1 = gPlayerAvatar.unkC; + u32 r2 = gPlayerAvatar.unk10; + + r1 &= s->unk8; + r2 &= s->unkC; + if (r1 == s->unk0 && r2 == s->unk4 && sub_80E5BC8(s->unk10, s->unk14)) + return s->unk18; + } + return 0; +} + +static void sub_80E5C7C(u8 a) +{ + u8 i; + + gPlayerAvatar.unkC = (gPlayerAvatar.unkC << 4) | (a & 0xF); + + for (i = 7; i != 0; i--) + gPlayerAvatar.unk14[i] = gPlayerAvatar.unk14[i - 1]; + gPlayerAvatar.unk14[0] = 1; +} + +static void sub_80E5CB8(u8 a) +{ + u8 i; + + gPlayerAvatar.unk10 = (gPlayerAvatar.unk10 << 4) | (a & 0xF); + + for (i = 7; i != 0; i--) + gPlayerAvatar.unk1C[i] = gPlayerAvatar.unk1C[i - 1]; + gPlayerAvatar.unk1C[0] = 1; +} + +static u8 sub_80E5CF4(u16 a) +{ + if (a & 0x40) + return 2; + if (a & 0x80) + return 1; + if (a & 0x20) + return 3; + if (a & 0x10) + return 4; + return 0; +} + +static u8 get_some_collision(u8 direction) +{ + s16 x; + s16 y; + u8 metatitleBehavior; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + x = playerMapObj->coords2.x; + y = playerMapObj->coords2.y; + MoveCoords(direction, &x, &y); + metatitleBehavior = MapGridGetMetatileBehaviorAt(x, y); + return sub_80E5DA0(playerMapObj, x, y, direction, metatitleBehavior); +} + +static u8 sub_80E5DA0(struct MapObject *mapObject, s16 x, s16 y, u8 direction, u8 metatitleBehavior) +{ + u8 collision = CheckForFieldObjectCollision(mapObject, x, y, direction, metatitleBehavior); + + if (collision > 4) + return collision; + + if (collision == 0 && IsRunningDisallowedByMetatile(metatitleBehavior)) + collision = 2; + + if (collision) + sub_80E5E4C(); + + return collision; +} + +bool8 IsRunningDisallowed(u8 tile) +{ + if (IsRunningDisallowedByMetatile(tile) != FALSE || gMapHeader.mapType == MAP_TYPE_INDOOR) + return TRUE; + else + return FALSE; +} + +static bool8 IsRunningDisallowedByMetatile(u8 tile) +{ + if (MetatileBehavior_IsRunningDisallowed(tile)) + return TRUE; + if (MetatileBehavior_IsFortreeBridge(tile) && (PlayerGetZCoord() & 1) == 0) + return TRUE; + return FALSE; +} + +static void sub_80E5E4C(void) +{ + if (gUnknown_02039250 != 0 && gUnknown_02039251 < 100) + gUnknown_02039251++; +} + +static bool8 CanBikeFaceDirOnMetatile(u8 direction, u8 tile) +{ + if (direction == DIR_EAST || direction == DIR_WEST) + { + //Bike cannot face east or west on a vertical rail + if (MetatileBehavior_IsIsolatedVerticalRail(tile) + || MetatileBehavior_IsVerticalRail(tile)) + return FALSE; + } + else + { + //Bike cannot face north or south on a horizontal rail + if (MetatileBehavior_IsIsolatedHorizontalRail(tile) + || MetatileBehavior_IsHorizontalRail(tile)) + return FALSE; + } + return TRUE; +} + +static bool8 sub_80E5EC0(u8 var1, u8 direction) +{ + if (direction == DIR_NORTH || direction == DIR_SOUTH) + { + if (var1 == 10 || var1 == 12) + return FALSE; + } + else if (var1 == 11 || var1 == 13) + { + return FALSE; + } + + return TRUE; +} + +bool8 IsBikingDisallowedByPlayer(void) +{ + s16 x, y; + u8 tileBehavior; + + if (!(gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_4))) + { + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (!IsRunningDisallowedByMetatile(tileBehavior)) + return FALSE; + } + return TRUE; +} + +bool8 player_should_look_direction_be_enforced_upon_movement(void) +{ + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE) != FALSE && MetatileBehavior_IsBumpySlope(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) != FALSE) + return FALSE; + else + return TRUE; +} + +void GetOnOffBike(u8 var) +{ + gUnknown_0202E854 = 0; + + if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) + { + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); + sav1_reset_battle_music_maybe(); + sub_8053E90(); + } + else + { + SetPlayerAvatarTransitionFlags(var); + sav1_set_battle_music_maybe(BGM_CYCLING); + sub_8053FB0(BGM_CYCLING); + } +} + +void BikeClearState(int var1, int var2) +{ + u8 i; + + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + gPlayerAvatar.unk9 = 0; + gPlayerAvatar.bikeFrameCounter = 0; + gPlayerAvatar.unkB = 0; + gPlayerAvatar.unkC = var1; + gPlayerAvatar.unk10 = var2; + + for (i = 0; i < 8; i++) + gPlayerAvatar.unk14[i] = 0; + + for (i = 0; i < 8; i++) + gPlayerAvatar.unk1C[i] = 0; +} + +void sub_80E6010(u8 var) +{ + gPlayerAvatar.bikeFrameCounter = var; + gPlayerAvatar.unkB = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // lazy way of multiplying by 1.5. +} + +static void sub_80E6024(void) +{ + gPlayerAvatar.bikeFrameCounter = 0; + gPlayerAvatar.unkB = 0; +} + +s16 GetPlayerSpeed(void) +{ + // because the player pressed a direction, it won't ever return a speed of 0 since this function returns the player's current speed. + s16 machSpeeds[3]; + + memcpy(machSpeeds, gMachBikeSpeeds, sizeof(machSpeeds)); + + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) + return machSpeeds[gPlayerAvatar.bikeFrameCounter]; + else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) + return SPEED_FASTER; + else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_DASH)) + return SPEED_FAST; + else + return SPEED_NORMAL; +} + +void sub_80E6084(void) +{ + s16 x, y; + u8 tileBehavior; + + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) + { + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsBumpySlope(tileBehavior)) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + sub_8059C94(player_get_direction_upper_nybble()); + } + } +} diff --git a/src/field/birch_pc.c b/src/field/birch_pc.c new file mode 100644 index 000000000..5fb6427c3 --- /dev/null +++ b/src/field/birch_pc.c @@ -0,0 +1,114 @@ +#include "global.h" +#include "event_data.h" +#include "field_message_box.h" +#include "pokedex.h" +#include "species.h" + +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; + +extern const u8 gBirchDexRatingText_LessThan10[]; +extern const u8 gBirchDexRatingText_LessThan20[]; +extern const u8 gBirchDexRatingText_LessThan30[]; +extern const u8 gBirchDexRatingText_LessThan40[]; +extern const u8 gBirchDexRatingText_LessThan50[]; +extern const u8 gBirchDexRatingText_LessThan60[]; +extern const u8 gBirchDexRatingText_LessThan70[]; +extern const u8 gBirchDexRatingText_LessThan80[]; +extern const u8 gBirchDexRatingText_LessThan90[]; +extern const u8 gBirchDexRatingText_LessThan100[]; +extern const u8 gBirchDexRatingText_LessThan110[]; +extern const u8 gBirchDexRatingText_LessThan120[]; +extern const u8 gBirchDexRatingText_LessThan130[]; +extern const u8 gBirchDexRatingText_LessThan140[]; +extern const u8 gBirchDexRatingText_LessThan150[]; +extern const u8 gBirchDexRatingText_LessThan160[]; +extern const u8 gBirchDexRatingText_LessThan170[]; +extern const u8 gBirchDexRatingText_LessThan180[]; +extern const u8 gBirchDexRatingText_LessThan190[]; +extern const u8 gBirchDexRatingText_LessThan200[]; +extern const u8 gBirchDexRatingText_DexCompleted[]; + +bool16 ScriptGetPokedexInfo(void) +{ + if (gSpecialVar_0x8004 == 0) // is national dex not present? + { + gSpecialVar_0x8005 = GetHoennPokedexCount(0); + gSpecialVar_0x8006 = GetHoennPokedexCount(1); + } + else + { + gSpecialVar_0x8005 = GetNationalPokedexCount(0); + gSpecialVar_0x8006 = GetNationalPokedexCount(1); + } + + return IsNationalPokedexEnabled(); +} + +// This shows your Hoenn Pokedex rating and not your National Dex. +const u8 *GetPokedexRatingText(u16 count) +{ + if (count < 10) + return gBirchDexRatingText_LessThan10; + if (count < 20) + return gBirchDexRatingText_LessThan20; + if (count < 30) + return gBirchDexRatingText_LessThan30; + if (count < 40) + return gBirchDexRatingText_LessThan40; + if (count < 50) + return gBirchDexRatingText_LessThan50; + if (count < 60) + return gBirchDexRatingText_LessThan60; + if (count < 70) + return gBirchDexRatingText_LessThan70; + if (count < 80) + return gBirchDexRatingText_LessThan80; + if (count < 90) + return gBirchDexRatingText_LessThan90; + if (count < 100) + return gBirchDexRatingText_LessThan100; + if (count < 110) + return gBirchDexRatingText_LessThan110; + if (count < 120) + return gBirchDexRatingText_LessThan120; + if (count < 130) + return gBirchDexRatingText_LessThan130; + if (count < 140) + return gBirchDexRatingText_LessThan140; + if (count < 150) + return gBirchDexRatingText_LessThan150; + if (count < 160) + return gBirchDexRatingText_LessThan160; + if (count < 170) + return gBirchDexRatingText_LessThan170; + if (count < 180) + return gBirchDexRatingText_LessThan180; + if (count < 190) + return gBirchDexRatingText_LessThan190; + if (count < 200) + return gBirchDexRatingText_LessThan200; + if (count == 200) + { + if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) + || GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // Jirachi or Deoxys is not counted towards the dex completion. If either of these flags are enabled, it means the actual count is less than 200. + return gBirchDexRatingText_LessThan200; + return gBirchDexRatingText_DexCompleted; + } + if (count == 201) + { + if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) + && GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // If both of these flags are enabled, it means the actual count is less than 200. + return gBirchDexRatingText_LessThan200; + return gBirchDexRatingText_DexCompleted; + } + if (count == 202) + return gBirchDexRatingText_DexCompleted; // Hoenn dex is considered complete, even though the hoenn dex count is 210. + return gBirchDexRatingText_LessThan10; +} + +void ShowPokedexRatingMessage(void) +{ + ShowFieldMessage(GetPokedexRatingText(gSpecialVar_0x8004)); +} diff --git a/src/field/braille_puzzles.c b/src/field/braille_puzzles.c new file mode 100644 index 000000000..b8d7cd386 --- /dev/null +++ b/src/field/braille_puzzles.c @@ -0,0 +1,258 @@ +#include "global.h" +#include "braille_puzzles.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_effect.h" +#include "fieldmap.h" +#include "flags.h" +#include "main.h" +#include "map_obj_lock.h" +#include "menu.h" +#include "rom6.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "task.h" +#include "text.h" + +extern u8 gPlayerPartyCount; +extern u8 gLastFieldPokeMenuOpened; + +extern u8 gIslandCave_EventScript_OpenRegiiceChamber[]; // regiice event script + +bool8 ShouldDoBrailleDigEffect(void) +{ + if (!FlagGet(SYS_BRAILLE_DIG) && (gSaveBlock1.location.mapGroup == 0x18 && gSaveBlock1.location.mapNum == 0x47)) + { + if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 3) + return TRUE; + else if (gSaveBlock1.pos.x == 9 && gSaveBlock1.pos.y == 3) + return TRUE; + else if (gSaveBlock1.pos.x == 11 && gSaveBlock1.pos.y == 3) + return TRUE; + } + + return FALSE; +} + +void DoBrailleDigEffect(void) +{ + MapGridSetMetatileIdAt(16, 8, 554); + MapGridSetMetatileIdAt(17, 8, 555); + MapGridSetMetatileIdAt(18, 8, 556); + MapGridSetMetatileIdAt(16, 9, 3634); + MapGridSetMetatileIdAt(17, 9, 563); + MapGridSetMetatileIdAt(18, 9, 3636); + DrawWholeMapView(); + PlaySE(SE_BAN); + FlagSet(SYS_BRAILLE_DIG); + ScriptContext2_Disable(); +} + +bool8 CheckRelicanthWailord(void) +{ + if (GetMonData(&gPlayerParty, MON_DATA_SPECIES2, 0) == SPECIES_RELICANTH) + { + CalculatePlayerPartyCount(); + + if (GetMonData(&gPlayerParty[gPlayerPartyCount - 1], MON_DATA_SPECIES2, 0) == SPECIES_WAILORD) + return TRUE; + } + return FALSE; +} + +bool8 ShouldDoBrailleStrengthEffect(void) +{ + if (!FlagGet(SYS_BRAILLE_STRENGTH) && (gSaveBlock1.location.mapGroup == 0x18 && gSaveBlock1.location.mapNum == 0x6)) + { + if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 23) + return TRUE; + else if (gSaveBlock1.pos.x == 9 && gSaveBlock1.pos.y == 23) + return TRUE; + else if (gSaveBlock1.pos.x == 11 && gSaveBlock1.pos.y == 23) + return TRUE; + } + + return FALSE; +} + +void DoBrailleStrengthEffect(void) +{ + FieldEffectActiveListRemove(0x28); + MapGridSetMetatileIdAt(14, 26, 554); + MapGridSetMetatileIdAt(15, 26, 555); + MapGridSetMetatileIdAt(16, 26, 556); + MapGridSetMetatileIdAt(14, 27, 3634); + MapGridSetMetatileIdAt(15, 27, 563); + MapGridSetMetatileIdAt(16, 27, 3636); + DrawWholeMapView(); + PlaySE(SE_BAN); + FlagSet(SYS_BRAILLE_STRENGTH); + ScriptContext2_Disable(); +} + +bool8 ShouldDoBrailleFlyEffect(void) +{ + if (!FlagGet(SYS_BRAILLE_FLY) && (gSaveBlock1.location.mapGroup == 0x18 && gSaveBlock1.location.mapNum == 0x44)) + { + if (gSaveBlock1.pos.x == 8 && gSaveBlock1.pos.y == 25) + return TRUE; + } + + return FALSE; +} + +void DoBrailleFlyEffect(void) +{ + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; + FieldEffectStart(0x3C); +} + +bool8 FldEff_UseFlyAncientTomb(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)UseFlyAncientTomb_Callback >> 16; + gTasks[taskId].data[9] = (u32)UseFlyAncientTomb_Callback; + return FALSE; +} + +void UseFlyAncientTomb_Callback(void) +{ + FieldEffectActiveListRemove(0x3C); + UseFlyAncientTomb_Finish(); +} + +void UseFlyAncientTomb_Finish(void) +{ + MapGridSetMetatileIdAt(14, 26, 554); + MapGridSetMetatileIdAt(15, 26, 555); + MapGridSetMetatileIdAt(16, 26, 556); + MapGridSetMetatileIdAt(14, 27, 3634); + MapGridSetMetatileIdAt(15, 27, 563); + MapGridSetMetatileIdAt(16, 27, 3636); + DrawWholeMapView(); + PlaySE(SE_BAN); + FlagSet(SYS_BRAILLE_FLY); + ScriptContext2_Disable(); +} + +void DoBrailleWait(void) +{ + if (!FlagGet(SYS_BRAILLE_WAIT)) + CreateTask(Task_BrailleWait, 0x50); +} + +void Task_BrailleWait(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + data[1] = 7200; + data[0] = 1; + break; + case 1: + if (BrailleWait_CheckButtonPress() != FALSE) + { + MenuZeroFillScreen(); + PlaySE(5); + data[0] = 2; + } + else + { + data[1] = data[1] - 1; + if (data[1] == 0) + { + MenuZeroFillScreen(); + data[0] = 3; + data[1] = 30; + } + } + break; + case 2: + if (BrailleWait_CheckButtonPress() == FALSE) + { + data[1] = data[1] - 1; + if (data[1] == 0) + data[0] = 4; + break; + } + sub_8064E2C(); + DestroyTask(taskId); + ScriptContext2_Disable(); + break; + case 3: + data[1] = data[1] - 1; + if (data[1] == 0) + data[0] = 4; + break; + case 4: + sub_8064E2C(); + ScriptContext1_SetupScript(gIslandCave_EventScript_OpenRegiiceChamber); + DestroyTask(taskId); + break; + } +} + +bool32 BrailleWait_CheckButtonPress(void) +{ + u16 var = 0xFF; + + if (gSaveBlock2.optionsButtonMode == 1) + var |= 0x300; + if (gSaveBlock2.optionsButtonMode == 2) + var |= 0x200; + + if ((var & gMain.newKeys) != FALSE) + return TRUE; + else + return FALSE; +} + +void DoSealedChamberShakingEffect1(void) +{ + u8 taskId = CreateTask(SealedChamberShakingEffect, 0x9); + + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[4] = 2; + gTasks[taskId].data[5] = 5; + gTasks[taskId].data[6] = 50; + SetCameraPanningCallback(0); +} + +void DoSealedChamberShakingEffect2(void) +{ + u8 taskId = CreateTask(SealedChamberShakingEffect, 0x9); + + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[4] = 3; + gTasks[taskId].data[5] = 5; + gTasks[taskId].data[6] = 2; + SetCameraPanningCallback(0); +} + +void SealedChamberShakingEffect(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->data[1]++; + + if (!(task->data[1] % task->data[5])) + { + task->data[1] = 0; + task->data[2]++; + task->data[4] = -task->data[4]; + SetCameraPanning(0, task->data[4]); + if (task->data[2] == task->data[6]) + { + DestroyTask(taskId); + EnableBothScriptContexts(); + InstallCameraPanAheadCallback(); + } + } +} diff --git a/src/field/choose_party.c b/src/field/choose_party.c new file mode 100644 index 000000000..d8df44028 --- /dev/null +++ b/src/field/choose_party.c @@ -0,0 +1,1072 @@ +#include "global.h" +#include "decoration.h" +#include "field_fadetransition.h" +#include "main.h" +#include "menu.h" +#include "name_string_util.h" +#include "palette.h" +#include "party_menu.h" +#include "pokemon.h" +#include "pokemon_summary_screen.h" +#include "rom4.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "strings.h" +#include "string_util.h" +#include "task.h" +#include "text.h" + +struct UnknownPokemonStruct2 +{ + /*0x00*/ u16 species; + /*0x02*/ u16 heldItem; + /*0x04*/ u8 nickname[11]; + /*0x0F*/ u8 level; + /*0x10*/ u16 hp; + /*0x12*/ u16 maxhp; + /*0x14*/ u32 status; + /*0x18*/ u32 personality; + /*0x1C*/ u8 gender; + /*0x1D*/ u8 language; +}; + +extern u8 gPlayerPartyCount; +extern u8 gLastFieldPokeMenuOpened; +extern u8 gUnknown_020384F0; +extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; +extern u8 gUnknown_0202E8F6; +extern struct Pokemon gUnknown_030042FC[]; +extern const u16 gBattleTowerBanlist[]; + +EWRAM_DATA u8 gSelectedOrderFromParty[3] = {0}; + +extern void OpenPartyMenu(); +extern void TryCreatePartyMenuMonIcon(u8, u8, struct Pokemon *); +extern void LoadHeldItemIconGraphics(void); +extern void CreateHeldItemIcons_806DC34(); +extern u8 sub_806BD58(u8, u8); +extern void PartyMenuPrintMonsLevelOrStatus(void); +extern void PrintPartyMenuMonNicknames(void); +extern void sub_806BC3C(u8, u8); +extern u8 sub_806B58C(u8); +extern void sub_806D538(); +extern u16 sub_806BE38(); +extern u8 sub_806CA38(); +extern void sub_808B5B4(); +extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, u8); +extern u8 sub_806B124(); +extern void sub_806C994(); +extern void sub_806C658(); +extern void sub_806AEDC(void); +extern void sub_806AF4C(); +extern void ShowPokemonSummaryScreen(struct Pokemon *, u8, u8, void (*)(void), int); +extern void sub_806C890(); +extern void sub_806D5A4(); +extern void sub_806B908(void); +extern void CreateMonIcon_806D99C(int, u8, int, struct UnknownPokemonStruct2 *); +extern void sub_806D50C(int, u8); +extern void CreatePartyMenuMonIcon(); +extern void CreateHeldItemIcon_806DCD4(int, u8, int); +extern u8 GetMonStatusAndPokerus(); +extern void PartyMenuPrintHP(); +extern void PartyMenuPutStatusTilemap(u8, int, u8); +extern void PartyMenuPrintLevel(); +extern void PartyMenuPutNicknameTilemap(); +extern void PrintPartyMenuMonNickname(); +extern void PartyMenuDrawHPBar(); +extern bool8 sub_80F9344(void); +extern void sub_806D4AC(); +extern void sub_806D3B4(); +extern void PartyMenuDoPrintLevel(u8, u8, u8); +extern void PartyMenuDoDrawHPBar(u8, u8, u16, u16); +extern void PartyMenuDoPutNicknameTilemap(u16, u8, u8, u8, const u8 *); +extern void box_print(u8, int, const u8 *); +extern void sub_806BCE8(void); +extern void sub_806E750(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, int); +extern u16 sub_806BD80(); +extern void sub_806BF74(); + +static void ClearPartySelection(void); +static bool8 IsMonAllowedInBattleTower(struct Pokemon *); +static void sub_812238C(u8); +static void sub_8122450(u8); +static void sub_81224A8(u8); +static void sub_8122728(u8); +static void BattleTowerEntryMenuCallback_Exit(u8); +static void sub_81228E8(u8); +static void sub_8122950(u8); +static void sub_81229B8(void); +static void sub_8122AB8(u8); +static void sub_8122B10(u8); +static void sub_8122C18(u8); +static void Task_DaycareStorageMenu8122EAC(u8); +void sub_8123138(u8); +static void sub_8123170(u8); +static void sub_81231AC(void); + +void sub_8121E10(void) +{ + ClearPartySelection(); + ewram1B000.unk263 = 0; + OpenPartyMenu(4, 0); +} + +void sub_8121E34(void) +{ + ClearPartySelection(); + ewram1B000.unk263 = 1; + OpenPartyMenu(4, 0); +} + +static void ClearPartySelection(void) +{ + u8 i; + + for (i = 0; i < 3; i++) + gSelectedOrderFromParty[i] = 0; +} + +bool8 sub_8121E78(void) +{ + u8 i; + + switch (ewram1B000_alt.unk264) + { + case 0: + if (ewram1B000_alt.unk266 < gPlayerPartyCount) + { + TryCreatePartyMenuMonIcon(ewram1B000_alt.unk260, ewram1B000_alt.unk266, &gPlayerParty[ewram1B000_alt.unk266]); + ewram1B000_alt.unk266++; + } + else + { + ewram1B000_alt.unk266 = 0; + ewram1B000_alt.unk264++; + } + break; + case 1: + LoadHeldItemIconGraphics(); + ewram1B000_alt.unk264++; + break; + case 2: + CreateHeldItemIcons_806DC34(ewram1B000_alt.unk260); + ewram1B000_alt.unk264++; + break; + case 3: + if (sub_806BD58(ewram1B000_alt.unk260, ewram1B000_alt.unk266) == 1) + { + ewram1B000_alt.unk266 = 0; + ewram1B000_alt.unk264++; + } + else + { + ewram1B000_alt.unk266++; + } + break; + case 4: + PartyMenuPrintMonsLevelOrStatus(); + ewram1B000_alt.unk264++; + break; + case 5: + PrintPartyMenuMonNicknames(); + ewram1B000_alt.unk264++; + break; + case 6: + for (i = 0; i < gPlayerPartyCount; i++) + { + u8 j; + + for (j = 0; j < 3; j++) + { + if (gSelectedOrderFromParty[j] == i + 1) + { + sub_806BC3C(i, j * 14 + 0x1C); + break; + } + } + if (j == 3) + { + if (IsMonAllowedInBattleTower(&gPlayerParty[i]) == TRUE) + sub_806BC3C(i, 0x70); + else + sub_806BC3C(i, 0x7E); + } + } + ewram1B000_alt.unk264++; + break; + case 7: + if (sub_806B58C(ewram1B000_alt.unk266) == 1) + { + ewram1B000_alt.unk266 = 0; + ewram1B000_alt.unk264 = 0; + return TRUE; + } + else + { + ewram1B000_alt.unk266++; + } + break; + } + return FALSE; +} + +#ifdef NONMATCHING +static bool8 IsMonAllowedInBattleTower(struct Pokemon *pkmn) +{ + u16 r3; + s32 i; + + if (GetMonData(pkmn, MON_DATA_IS_EGG)) + return FALSE; + + if (ewram1B000.unk263 == 0) + { + if (GetMonData(pkmn, MON_DATA_HP) == 0) + return FALSE; + else + return TRUE; + } + + if ((gSaveBlock2.filler_A8.var_4AC & 1) == 0 + && GetMonData(pkmn, MON_DATA_LEVEL) > 50) + return FALSE; + + r3 = GetMonData(pkmn, MON_DATA_SPECIES); + // Can't stop the compiler from optimizing out the first index + for (i = 0; gBattleTowerBanlist[i] != 0xFFFF; i++) + { + if (gBattleTowerBanlist[i] == r3) + return FALSE; + } + return TRUE; +} +#else +__attribute__((naked)) +static bool8 IsMonAllowedInBattleTower(struct Pokemon *pkmn) +{ + asm_unified( + "push {r4,lr}\n\ + adds r4, r0, 0\n\ + movs r1, 0x2D\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _0812207C\n\ + ldr r0, _08122058 @ =0x0201b000\n\ + ldr r1, _0812205C @ =0x00000263\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _08122060\n\ + adds r0, r4, 0\n\ + movs r1, 0x39\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0812207C\n\ + b _081220B6\n\ + .align 2, 0\n\ +_08122058: .4byte 0x0201b000\n\ +_0812205C: .4byte 0x00000263\n\ +_08122060:\n\ + ldr r0, _08122080 @ =gSaveBlock2\n\ + ldr r1, _08122084 @ =0x00000554\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08122088\n\ + adds r0, r4, 0\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + cmp r0, 0x32\n\ + bls _08122088\n\ +_0812207C:\n\ + movs r0, 0\n\ + b _081220B8\n\ + .align 2, 0\n\ +_08122080: .4byte gSaveBlock2\n\ +_08122084: .4byte 0x00000554\n\ +_08122088:\n\ + adds r0, r4, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldr r1, _081220C0 @ =gBattleTowerBanlist\n\ + movs r0, 0\n\ + lsls r0, 1\n\ + adds r2, r0, r1\n\ + ldrh r0, [r2]\n\ + ldr r1, _081220C4 @ =0x0000ffff\n\ + cmp r0, r1\n\ + beq _081220B6\n\ + adds r4, r1, 0\n\ + adds r1, r2, 0\n\ +_081220A8:\n\ + ldrh r0, [r1]\n\ + cmp r0, r3\n\ + beq _0812207C\n\ + adds r1, 0x2\n\ + ldrh r0, [r1]\n\ + cmp r0, r4\n\ + bne _081220A8\n\ +_081220B6:\n\ + movs r0, 0x1\n\ +_081220B8:\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_081220C0: .4byte gBattleTowerBanlist\n\ +_081220C4: .4byte 0x0000ffff\n" + ); +} +#endif + +static u8 sub_81220C8(void) +{ + u8 i; + + if (ewram1B000.unk263 == 0) + return 0xFF; + if (gSelectedOrderFromParty[2] == 0) + return 0x11; + for (i = 0; i < 2; i++) + { + u8 j; + + ewram1B000.unk282 = GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[i]], MON_DATA_SPECIES); + ewram1B000.unk280 = GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[i]], MON_DATA_HELD_ITEM); + for (j = i + 1; j < 3; j++) + { + if (ewram1B000.unk282 == GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[j]], MON_DATA_SPECIES)) + return 0x12; + if (ewram1B000.unk280 != 0 && ewram1B000.unk280 == GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[j]], MON_DATA_HELD_ITEM)) + return 0x13; + } + } + return 0xFF; +} + +//------------------------------------------------------------------------------ +// Battle Tower Entry Menu +//------------------------------------------------------------------------------ + +static void BattleTowerEntryMenuCallback_Summary(u8); +static void BattleTowerEntryMenuCallback_Enter(u8); +static void BattleTowerEntryMenuCallback_NoEntry(u8); +static void BattleTowerEntryMenuCallback_Exit(u8); + +static const struct PartyMenuItem sBattleTowerEntryMenuItems[] = +{ + {OtherText_Summary, BattleTowerEntryMenuCallback_Summary}, + {OtherText_Enter2, BattleTowerEntryMenuCallback_Enter}, + {OtherText_NoEntry, BattleTowerEntryMenuCallback_NoEntry}, + {gUnknownText_Exit, BattleTowerEntryMenuCallback_Exit}, +}; + +static const u8 gUnknown_084017D0[] = {1, 0, 3}; +static const u8 gUnknown_084017D3[] = {2, 0, 3}; +static const u8 gUnknown_084017D6[] = {0, 3}; + +static const struct PartyPopupMenu sBattleTowerEntryMenu[] = +{ + {ARRAY_COUNT(gUnknown_084017D0), 9, gUnknown_084017D0}, + {ARRAY_COUNT(gUnknown_084017D3), 9, gUnknown_084017D3}, + {ARRAY_COUNT(gUnknown_084017D6), 9, gUnknown_084017D6}, +}; + + +static bool8 IsPartyMemberAlreadySelected(u8 partyMember) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (gSelectedOrderFromParty[i] == partyMember) + return TRUE; + } + return FALSE; +} + +static void sub_81221F8(u8 taskId) +{ + sub_806D538(5, 1); + if (IsMonAllowedInBattleTower(&gPlayerParty[gLastFieldPokeMenuOpened]) == TRUE) + { + if (IsPartyMemberAlreadySelected(gLastFieldPokeMenuOpened + 1) == TRUE) + { + gTasks[taskId].data[4] = 1; + sub_806E750(1, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); + } + else + { + gTasks[taskId].data[4] = 0; + sub_806E750(0, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); + } + } + else + { + gTasks[taskId].data[4] = 2; + sub_806E750(2, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); + } +} + +void sub_81222B0(u8 taskId) +{ + if (!gPaletteFade.active) + { + switch (sub_806BE38(taskId)) + { + case 1: + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = sub_806CA38(taskId); + if (gLastFieldPokeMenuOpened != 6) + { + GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); + sub_81221F8(taskId); + gTasks[taskId].func = sub_812238C; + } + else + { + gTasks[taskId].func = sub_81224A8; + } + sub_808B5B4(taskId); + break; + case 2: + PlaySE(SE_SELECT); + ClearPartySelection(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8122450; + break; + } + } +} + +// Handle input +static void sub_812238C(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gMain.newAndRepeatedKeys & 0x40) + { + if (GetMenuCursorPos() != 0) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + } + return; + } + if (gMain.newAndRepeatedKeys & 0x80) + { + if (GetMenuCursorPos() != 3) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + } + return; + } + if (gMain.newKeys & A_BUTTON) + { + TaskFunc popupMenuFunc; + + PlaySE(SE_SELECT); + popupMenuFunc = PartyMenuGetPopupMenuFunc( + gTasks[taskId].data[4], + sBattleTowerEntryMenu, + sBattleTowerEntryMenuItems, + GetMenuCursorPos()); + popupMenuFunc(taskId); + return; + } + if (gMain.newKeys & B_BUTTON) + { + BattleTowerEntryMenuCallback_Exit(taskId); + return; + } + } +} + +// Return from menu? +static void sub_8122450(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(gMain.savedCallback); + DestroyTask(taskId); + } +} + +// Wait for A or B press +static void sub_8122480(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + BattleTowerEntryMenuCallback_Exit(taskId); +} + +static void sub_81224A8(u8 taskId) +{ + u8 val = sub_81220C8(); + + if (val != 0xFF) + { + sub_806D538(val, 0); + gTasks[taskId].func = sub_8122480; + } + else + { + if (gSelectedOrderFromParty[0] != 0) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8122450; + } + else + { + PlaySE(SE_HAZURE); + sub_806D538(14, 0); + gTasks[taskId].func = sub_8122480; + } + } +} + +// CB2 for menu? +static void sub_8122530(void) +{ + while (1) + { + if (sub_806B124() == 1) + { + sub_806C994(ewram1B000.unk260, gUnknown_020384F0); + sub_806C658(ewram1B000.unk260, 0); + GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); + gLastFieldPokeMenuOpened = gUnknown_020384F0; + sub_81221F8(ewram1B000.unk260); + SetMainCallback2(sub_806AEDC); + break; + } + if (sub_80F9344() == 1) + break; + } +} + +static void sub_81225A4(void) +{ + gPaletteFade.bufferTransferDisabled = TRUE; + sub_806AF4C(4, 0xFF, sub_812238C, 5); + SetMainCallback2(sub_8122530); +} + +// Wait for fade, then show summary screen +static void sub_81225D4(u8 taskId) +{ + if (!gPaletteFade.active) + { + u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data0; + + DestroyTask(taskId); + ewram1B000.unk262 = 1; + ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_81225A4, 0); + } +} + +// Summary callback? +static void BattleTowerEntryMenuCallback_Summary(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_81225D4; +} + +static void BattleTowerEntryMenuCallback_Enter(u8 taskId) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (gSelectedOrderFromParty[i] == 0) + { + gSelectedOrderFromParty[i] = gLastFieldPokeMenuOpened + 1; + sub_806BC3C(gLastFieldPokeMenuOpened, i * 14 + 0x1C); + if (i == 2) + sub_806C890(taskId); + BattleTowerEntryMenuCallback_Exit(taskId); + return; + } + } + PlaySE(SE_HAZURE); + MenuZeroFillWindowRect(20, 10, 29, 19); + HandleDestroyMenuCursors(); + sub_806D5A4(); + sub_806E834(gOtherText_NoMoreThreePoke, 1); + gTasks[taskId].func = sub_8122728; +} + +static void sub_8122728(u8 taskId) +{ + if (gUnknown_0202E8F6 == 1) + return; + + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + MenuZeroFillWindowRect(0, 14, 29, 19); + HandleDestroyMenuCursors(); + BattleTowerEntryMenuCallback_Exit(taskId); + } +} + +static void BattleTowerEntryMenuCallback_NoEntry(u8 taskId) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (gSelectedOrderFromParty[i] == gLastFieldPokeMenuOpened + 1) + { + gSelectedOrderFromParty[i] = 0; + switch (i) + { + case 0: + gSelectedOrderFromParty[0] = gSelectedOrderFromParty[1]; + gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2]; + gSelectedOrderFromParty[2] = 0; + break; + case 1: + gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2]; + gSelectedOrderFromParty[2] = 0; + break; + } + break; // exit loop + } + } + sub_806BC3C(gLastFieldPokeMenuOpened, 0x70); + if (gSelectedOrderFromParty[0] != 0) + sub_806BC3C(gSelectedOrderFromParty[0] - 1, 0x1C); + if (gSelectedOrderFromParty[1] != 0) + sub_806BC3C(gSelectedOrderFromParty[1] - 1, 0x2A); + BattleTowerEntryMenuCallback_Exit(taskId); +} + +static void sub_81227FC(u8 taskId) +{ + MenuZeroFillWindowRect(20, 10, 29, 19); + HandleDestroyMenuCursors(); + sub_806D538(0, 0); + gTasks[taskId].func = sub_81222B0; +} + +static void BattleTowerEntryMenuCallback_Exit(u8 taskId) +{ + PlaySE(SE_SELECT); + sub_81227FC(taskId); +} + +bool8 sub_8122854(void) +{ + switch (ewram1B000_alt.unk264) + { + case 0: + sub_81228E8(ewram1B000_alt.unk260); + ewram1B000_alt.unk264++; + break; + case 1: + LoadHeldItemIconGraphics(); + ewram1B000_alt.unk264++; + break; + case 2: + sub_8122950(ewram1B000_alt.unk260); + ewram1B000_alt.unk264++; + break; + case 3: + sub_81229B8(); + ewram1B000_alt.unk264++; + break; + case 4: + sub_806B908(); + return TRUE; + } + return FALSE; +} + +static void sub_81228E8(u8 a) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) + CreatePartyMenuMonIcon(a, i, 3, &gPlayerParty[i]); + if (gUnknown_02023A00[i].species != 0) + { + CreateMonIcon_806D99C(a, i + 3, 3, &gUnknown_02023A00[i]); + sub_806D50C(a, i + 3); + } + } +} + +static void sub_8122950(u8 a) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) + { + u16 item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + + CreateHeldItemIcon_806DCD4(a, i, item); + } + if (gUnknown_02023A00[i].species != 0) + CreateHeldItemIcon_806DCD4(a, i + 3, gUnknown_02023A00[i].heldItem); + } +} + +static void sub_81229B8(void) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) + { + u8 status; + + PartyMenuPrintHP(i, 3, &gPlayerParty[i]); + status = GetMonStatusAndPokerus(&gPlayerParty[i]); + if (status != 0 && status != 6) + PartyMenuPutStatusTilemap(i, 3, status - 1); + else + PartyMenuPrintLevel(i, 3, &gPlayerParty[i]); + PartyMenuPutNicknameTilemap(i, 3, &gPlayerParty[i]); + PrintPartyMenuMonNickname(i, 3, &gPlayerParty[i]); + PartyMenuDrawHPBar(i, 3, &gPlayerParty[i]); + } + } +} + +void sub_8122A48(u8 taskId) +{ + if (!gPaletteFade.active) + { + gTasks[taskId].data[0] = 30; + sub_806D4AC(taskId, gUnknown_02023A00[0].species, 0); + sub_806D4AC(taskId, gUnknown_02023A00[1].species, 1); + sub_806D4AC(taskId, gUnknown_02023A00[2].species, 2); + gTasks[taskId].func = sub_8122AB8; + ewram1B000.unk261 = 1; + } +} + +static void sub_8122AB8(u8 taskId) +{ + sub_806D3B4(taskId, gUnknown_02023A00[1].species, gUnknown_02023A00[2].species); + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].func = sub_8122B10; + ewram1B000.unk261 = 2; + PlaySE(SE_W231); + } +} + +static void sub_8122B10(u8 taskId) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (gUnknown_02023A00[i].species != 0) + { + u8 r2; + + PartyMenuDoPrintHP(i + 3, 3, gUnknown_02023A00[i].hp, gUnknown_02023A00[i].maxhp); + if (gUnknown_02023A00[i].hp == 0) + r2 = 7; + else + r2 = pokemon_ailments_get_primary(gUnknown_02023A00[i].status); + if (r2 != 0) + PartyMenuPutStatusTilemap(i + 3, 3, r2 - 1); + else + PartyMenuDoPrintLevel(i + 3, 3, gUnknown_02023A00[i].level); + PartyMenuDoPutNicknameTilemap(gUnknown_02023A00[i].species, gUnknown_02023A00[i].gender, 3, i + 3, gUnknown_02023A00[i].nickname); + StringCopy(gStringVar1, gUnknown_02023A00[i].nickname); + StringGetEnd10(gStringVar1); + SanitizeNameString(gStringVar1); + box_print(i + 3, 3, gStringVar1); + PartyMenuDoDrawHPBar(i + 3, 3, gUnknown_02023A00[i].hp, gUnknown_02023A00[i].maxhp); + } + } + gTasks[taskId].func = sub_8122C18; + gTasks[taskId].data[0] = 0; +} + +static void sub_8122C18(u8 taskId) +{ + gTasks[taskId].data[0]++; + if (gTasks[taskId].data[0] == 256) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8122450; + } +} + +// Exactly the same as sub_8121E78 except for case 6 +bool8 unref_sub_8122C60(void) +{ + switch (ewram1B000_alt.unk264) + { + case 0: + if (ewram1B000_alt.unk266 < gPlayerPartyCount) + { + TryCreatePartyMenuMonIcon(ewram1B000_alt.unk260, ewram1B000_alt.unk266, &gPlayerParty[ewram1B000_alt.unk266]); + ewram1B000_alt.unk266++; + } + else + { + ewram1B000_alt.unk266 = 0; + ewram1B000_alt.unk264++; + } + break; + case 1: + LoadHeldItemIconGraphics(); + ewram1B000_alt.unk264++; + break; + case 2: + CreateHeldItemIcons_806DC34(ewram1B000_alt.unk260); + ewram1B000_alt.unk264++; + break; + case 3: + if (sub_806BD58(ewram1B000_alt.unk260, ewram1B000_alt.unk266) == 1) + { + ewram1B000_alt.unk266 = 0; + ewram1B000_alt.unk264++; + } + else + { + ewram1B000_alt.unk266++; + } + break; + case 4: + PartyMenuPrintMonsLevelOrStatus(); + ewram1B000_alt.unk264++; + break; + case 5: + PrintPartyMenuMonNicknames(); + ewram1B000_alt.unk264++; + break; + case 6: + sub_806BCE8(); + ewram1B000_alt.unk264++; + break; + case 7: + if (sub_806B58C(ewram1B000_alt.unk266) == 1) + { + ewram1B000_alt.unk266 = 0; + ewram1B000_alt.unk264 = 0; + return TRUE; + } + else + { + ewram1B000_alt.unk266++; + } + break; + } + return FALSE; +} + +//------------------------------------------------------------------------------ +// Daycare Pokemon Storage Menu +//------------------------------------------------------------------------------ + +static void DaycareStorageMenuCallback_Store(u8); +static void DaycareStorageMenuCallback_Summary(u8); +static void DaycareStorageMenuCallback_Exit(u8); + +static const struct PartyMenuItem sDaycareStorageMenuItems[] = +{ + {OtherText_Store, DaycareStorageMenuCallback_Store}, + {OtherText_Summary, DaycareStorageMenuCallback_Summary}, + {gUnknownText_Exit, DaycareStorageMenuCallback_Exit}, +}; + +static const u8 gUnknown_08401808[] = {0, 1, 2}; +static const u8 gUnknown_0840180B[] = {1, 2}; + +static const struct PartyPopupMenu sDaycareStorageMenus[] = +{ + {ARRAY_COUNT(gUnknown_08401808), 9, gUnknown_08401808}, + {ARRAY_COUNT(gUnknown_0840180B), 9, gUnknown_0840180B}, +}; + +static void sub_8122D94(u8 taskId) +{ + if (!GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG)) + { + gTasks[taskId].data[4] = 0; + sub_806E750(0, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); + } + else + { + gTasks[taskId].data[4] = 1; + sub_806E750(1, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); + } +} + +void sub_8122E0C(u8 taskId) +{ + if (!gPaletteFade.active) + { + switch (sub_806BD80(taskId)) + { + case 1: + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = sub_806CA38(taskId); + GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); + sub_8122D94(taskId); + gTasks[taskId].func = Task_DaycareStorageMenu8122EAC; + break; + case 2: + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = 0xFF; + gSpecialVar_0x8004 = 0xFF; + sub_8123138(taskId); + break; + } + } +} + +static void Task_DaycareStorageMenu8122EAC(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gMain.newAndRepeatedKeys & 0x40) + { + if (GetMenuCursorPos() != 0) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + } + return; + } + if (gMain.newAndRepeatedKeys & 0x80) + { + if (GetMenuCursorPos() != 3) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + } + return; + } + if (gMain.newKeys & A_BUTTON) + { + TaskFunc popupMenuFunc; + + PlaySE(SE_SELECT); + popupMenuFunc = PartyMenuGetPopupMenuFunc( + gTasks[taskId].data[4], + sDaycareStorageMenus, + sDaycareStorageMenuItems, + GetMenuCursorPos()); + popupMenuFunc(taskId); + return; + } + if (gMain.newKeys & B_BUTTON) + { + DaycareStorageMenuCallback_Exit(taskId); + return; + } + } +} + +static void DaycareStorageMenuCallback_Store(u8 taskId) +{ + gSpecialVar_0x8004 = gLastFieldPokeMenuOpened; + sub_8123138(taskId); +} + +static void sub_8122F90(void) +{ + while (1) + { + if (sub_806B124() == 1) + { + sub_806C994(ewram1B000.unk260, gUnknown_020384F0); + sub_806BF74(ewram1B000.unk260, 0); + GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); + gLastFieldPokeMenuOpened = gUnknown_020384F0; + sub_8122D94(ewram1B000.unk260); + SetMainCallback2(sub_806AEDC); + break; + } + if (sub_80F9344() == 1) + break; + } +} + +static void sub_8123004(void) +{ + gPaletteFade.bufferTransferDisabled = TRUE; + sub_806AF4C(6, 0xFF, Task_DaycareStorageMenu8122EAC, 5); + SetMainCallback2(sub_8122F90); +} + +static void sub_8123034(u8 taskId) +{ + if (!gPaletteFade.active) + { + u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data0; + + DestroyTask(taskId); + ewram1B000.unk262 = 1; + ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_8123004, 0); + } +} + +static void DaycareStorageMenuCallback_Summary(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8123034; +} + +static void DaycareStorageMenuCallback_Exit(u8 taskId) +{ + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(20, 10, 29, 19); + HandleDestroyMenuCursors(); + sub_806D538(15, 0); + gTasks[taskId].func = sub_8122E0C; +} + +void sub_8123138(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8123170; +} + +static void sub_8123170(u8 taskId) +{ + if (!gPaletteFade.active) + { + gFieldCallback = sub_81231AC; + SetMainCallback2(c2_exit_to_overworld_2_switch); + DestroyTask(taskId); + } +} + +// Do these last two functions really belong in here? + +static void sub_81231C4(u8); + +void sub_81231AC(void) +{ + pal_fill_black(); + CreateTask(sub_81231C4, 10); +} + +static void sub_81231C4(u8 taskId) +{ + if (sub_807D770() == TRUE) + { + DestroyTask(taskId); + ScriptContext2_Disable(); + EnableBothScriptContexts(); + } +} diff --git a/src/field/coins.c b/src/field/coins.c new file mode 100644 index 000000000..3c6356612 --- /dev/null +++ b/src/field/coins.c @@ -0,0 +1,84 @@ +#include "global.h" +#include "coins.h" +#include "menu.h" +#include "string_util.h" +#include "strings.h" + +#define MAX_COINS 9999 + +void UpdateCoinsWindow(s32 a, u8 b, u8 c) +{ + PrintCoins(a, 4, b + 2, c + 1); +} + +void ShowCoinsWindow(u32 a, u8 b, u8 c) +{ + MenuDrawTextWindow(b, c, b + 9, c + 3); + UpdateCoinsWindow(a, b, c); +} + +void HideCoinsWindow(u8 a, u8 b) +{ + MenuZeroFillWindowRect(a, b, a + 9, b + 3); +} + +void PrintCoins(s32 a, u8 b, u8 c, u8 d) +{ + u8 string[16]; + u8 *ptr; + u8 r1; + u8 foo; + + ConvertIntToDecimalString(string, a); + r1 = (b * 6 + 0x21 - 8 * (b + 2)); + c = c - r1 / 8; + foo = r1 % 8; + ptr = gStringVar1; + if (foo) + { + ptr[0] = 0xFC; + ptr[1] = 0x11; + ptr[2] = 8 - (foo); + ptr += 3; + } + ptr[0] = 0xFC; + ptr[1] = 0x11; + ptr[2] = (b - StringLength(string)) * 6; + ptr += 3; + StringCopy(ptr, string); + MenuPrint(gOtherText_Coins2, c, d); +} + +u16 GetCoins(void) +{ + return gSaveBlock1.coins; +} + +bool8 GiveCoins(u16 coins) +{ + u32 newCoins; + + if (GetCoins() >= MAX_COINS) + return FALSE; + newCoins = coins + gSaveBlock1.coins; + if (gSaveBlock1.coins > (u16)newCoins) + gSaveBlock1.coins = MAX_COINS; + else + { + gSaveBlock1.coins = newCoins; + if ((u16)newCoins > MAX_COINS) + gSaveBlock1.coins = MAX_COINS; + } + return TRUE; +} + +bool8 TakeCoins(u16 coins) +{ + if (GetCoins() >= coins) + { + gSaveBlock1.coins -= coins; + return TRUE; + } + else + return FALSE; +} diff --git a/src/field/coord_event_weather.c b/src/field/coord_event_weather.c new file mode 100644 index 000000000..9c5a1ca4d --- /dev/null +++ b/src/field/coord_event_weather.c @@ -0,0 +1,118 @@ +#include "global.h" +#include "coord_event_weather.h" +#include "field_weather.h" + +struct CoordEventWeather +{ + u8 weather; + void (*func)(void); +}; + +static void CoordEventWeather_Indoor(void); +static void CoordEventWeather_Sunny(void); +static void CoordEventWeather_Rain(void); +static void CoordEventWeather_Snowflakes(void); +static void CoordEventWeather_Thunderstorm(void); +static void CoordEventWeather_Fog(void); +static void CoordEventWeather_DiagonalFog(void); +static void CoordEventWeather_Snow(void); +static void CoordEventWeather_Sandstorm(void); +static void CoordEventWeather_Cloudy(void); +static void CoordEventWeather_Drought(void); +static void CoordEventWeather_UnderwaterFog(void); +static void CoordEventWeather_UnderwaterBubbles(void); + +static const struct CoordEventWeather sCoordEventWeatherFuncs[] = +{ + { 0x1, CoordEventWeather_Indoor }, + { 0x2, CoordEventWeather_Sunny }, + { 0x3, CoordEventWeather_Rain }, + { 0x4, CoordEventWeather_Snowflakes }, + { 0x5, CoordEventWeather_Thunderstorm }, + { 0x6, CoordEventWeather_Fog }, + { 0x7, CoordEventWeather_DiagonalFog }, + { 0x8, CoordEventWeather_Snow }, + { 0x9, CoordEventWeather_Sandstorm }, + { 0xa, CoordEventWeather_Cloudy }, + { 0xb, CoordEventWeather_Drought }, + { 0x14, CoordEventWeather_UnderwaterFog }, + { 0x15, CoordEventWeather_UnderwaterBubbles }, +}; + +static void CoordEventWeather_Indoor(void) +{ + SetWeather(1); +} + +static void CoordEventWeather_Sunny(void) +{ + SetWeather(2); +} + +static void CoordEventWeather_Rain(void) +{ + SetWeather(3); +} + +static void CoordEventWeather_Snowflakes(void) +{ + SetWeather(4); +} + +static void CoordEventWeather_Thunderstorm(void) +{ + SetWeather(5); +} + +static void CoordEventWeather_Fog(void) +{ + SetWeather(6); +} + +static void CoordEventWeather_DiagonalFog(void) +{ + SetWeather(9); +} + +static void CoordEventWeather_Snow(void) +{ + SetWeather(7); +} + +static void CoordEventWeather_Sandstorm(void) +{ + SetWeather(8); +} + +static void CoordEventWeather_Cloudy(void) +{ + SetWeather(11); +} + +static void CoordEventWeather_Drought(void) +{ + SetWeather(12); +} + +static void CoordEventWeather_UnderwaterFog(void) +{ + SetWeather(20); +} + +static void CoordEventWeather_UnderwaterBubbles(void) +{ + SetWeather(21); +} + +void DoCoordEventWeather(u8 n) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sCoordEventWeatherFuncs); i++) + { + if (sCoordEventWeatherFuncs[i].weather == n) + { + sCoordEventWeatherFuncs[i].func(); + return; + } + } +} diff --git a/src/field/daycare.c b/src/field/daycare.c new file mode 100644 index 000000000..cded18207 --- /dev/null +++ b/src/field/daycare.c @@ -0,0 +1,350 @@ +#include "global.h" +#include "daycare.h" +#include "pokemon.h" +#include "species.h" +#include "items.h" +#include "string_util.h" + +extern u8 gLastFieldPokeMenuOpened; + +u8 *GetMonNick(struct Pokemon *mon, u8 *dest) +{ + s8 nickname[POKEMON_NAME_LENGTH * 2]; + + GetMonData(mon, MON_DATA_NICKNAME, nickname); + return StringCopy10(dest, nickname); +} + +u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest) +{ + s8 nickname[POKEMON_NAME_LENGTH * 2]; + + GetBoxMonData(mon, MON_DATA_NICKNAME, nickname); + return StringCopy10(dest, nickname); +} + +u8 Daycare_CountPokemon(struct BoxPokemon *daycare_data) +{ + u8 i, count; + count = 0; + + for(i = 0;i <= 1;i++) + if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) != 0) + count++; + + return count; +} + +void sub_8041324(struct BoxPokemon * box_pokemon, struct RecordMixing_UnknownStruct * void_pointer) +{ + u8 i; + u8 specCount; + specCount = 0; + for (i=0; i<2; i++) + { + if (GetBoxMonData(&box_pokemon[i], MON_DATA_SPECIES) != SPECIES_NONE) + { + specCount ++; + if (GetBoxMonData(&box_pokemon[i], MON_DATA_HELD_ITEM) == ITEM_NONE) + { + void_pointer->unk74[i] = 0; + } else + { + void_pointer->unk74[i] = 1; + } + } else + { + void_pointer->unk74[i] = 1; + } + } + void_pointer->unk70 = specCount; +} + +s8 Daycare_FindEmptySpot(struct BoxPokemon * daycare_data) +{ + u8 i; + + for(i = 0;i <= 1;i++) + if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) == 0) + return i; + + return -1; +} + +/*void Daycare_SendPokemon(struct Pokemon * mon, struct BoxPokemon * daycare_data){ // unfinished + s8 empty_slot; + + empty_slot = Daycare_FindEmptySpot(daycare_data); + if(MonHasMail(mon) != 0){ // if the mon holds a mail? + u8 empty_slot_times_56 = empty_slot * 56; + u8 * something2 = ((u8 *) (daycare_data + 2)) + empty_slot_times_56 + 36; + StringCopy(something2, gSaveBlock2.playerName); + PadNameString(something2, 0xFC); + something2 += 8; + GetMonNick(mon, something2); + u8 pokerus = GetMonData(mon, MON_DATA_64); + something1 += (u8 * daycare_data) +}*/ + +__attribute__((naked)) +void Daycare_SendPokemon() +{ + // strange stack usage - happens because THUMB ARM only allows R0-R7 to be pushed/popped: + // all registers in reglist must be Lo registers, except that PUSH can include the LR, and POP can include the PC + // the ldm/stm section probably copies some struct, but I'm not sure how the code would look + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + adds r7, r0, 0\n\ + mov r8, r1\n\ + mov r0, r8\n\ + bl Daycare_FindEmptySpot\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + mov r9, r4\n\ + adds r0, r7, 0\n\ + bl MonHasMail\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0804144A\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + lsls r4, r0, 3\n\ + subs r4, r0\n\ + lsls r4, 3\n\ + adds r5, r4, 0\n\ + adds r5, 0xA0\n\ + add r5, r8\n\ + adds r6, r5, 0\n\ + adds r6, 0x24\n\ + ldr r1, _08041490 @ =gSaveBlock2\n\ + adds r0, r6, 0\n\ + bl StringCopy\n\ + adds r0, r6, 0\n\ + movs r1, 0xFC\n\ + bl PadNameString\n\ + adds r6, 0x8\n\ + adds r0, r7, 0\n\ + adds r1, r6, 0\n\ + bl GetMonNick\n\ + adds r0, r7, 0\n\ + movs r1, 0x40\n\ + bl GetMonData\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + add r4, r8\n\ + ldr r2, _08041494 @ =gSaveBlock1\n\ + lsls r1, r0, 3\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r2\n\ + adds r4, 0xA0\n\ + ldr r0, _08041498 @ =0x00002b4c\n\ + adds r1, r0\n\ + ldm r1!, {r0,r2,r3}\n\ + stm r4!, {r0,r2,r3}\n\ + ldm r1!, {r0,r2,r3}\n\ + stm r4!, {r0,r2,r3}\n\ + ldm r1!, {r0,r2,r3}\n\ + stm r4!, {r0,r2,r3}\n\ + adds r0, r7, 0\n\ + bl TakeMailFromMon\n\ +_0804144A:\n\ + mov r2, r9\n\ + lsls r4, r2, 24\n\ + asrs r4, 24\n\ + lsls r5, r4, 2\n\ + adds r4, r5, r4\n\ + lsls r4, 4\n\ + add r4, r8\n\ + adds r0, r4, 0\n\ + adds r1, r7, 0\n\ + movs r2, 0x50\n\ + bl memcpy\n\ + adds r0, r4, 0\n\ + bl BoxMonRestorePP\n\ + movs r0, 0x88\n\ + lsls r0, 1\n\ + add r0, r8\n\ + adds r0, r5\n\ + movs r1, 0\n\ + str r1, [r0]\n\ + adds r0, r7, 0\n\ + bl ZeroMonData\n\ + bl party_compaction\n\ + bl CalculatePlayerPartyCount\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08041490: .4byte gSaveBlock2\n\ +_08041494: .4byte gSaveBlock1\n\ +_08041498: .4byte 0x00002b4c\n\ + .syntax divided\n"); +} + +void Daycare_SendPokemon_Special() +{ + Daycare_SendPokemon(gPlayerParty + gLastFieldPokeMenuOpened, gSaveBlock1.daycareData); +} + +void sub_80417F4(u8 *); + +void sub_80414C0(struct BoxPokemon * daycare_data) +{ + u32 second_species; + if((GetBoxMonData(&daycare_data[1], MON_DATA_SPECIES) != 0) && ((second_species = GetBoxMonData(&daycare_data[0], MON_DATA_SPECIES)) == 0)){ + daycare_data[0] = daycare_data[1]; + ZeroBoxMonData(&daycare_data[1]); + memcpy(daycare_data + 2, (u8 *) (daycare_data + 1) + 0x88, 0x38); + *((u32 *)(daycare_data) + 68) = *((u32 *)(daycare_data) + 69); + *((u32 *)(daycare_data) + 69) = second_species; + sub_80417F4((u8 *) (daycare_data + 1) + 0x88); + } +} + +u8 TryIncrementMonLevel(struct Pokemon *); +extern u16 word_2024E82; + +void sub_804151C(struct Pokemon * mon) +{ + s32 i; + u8 r6; + u16 temp; + + for(i = 0; i < 100; i++){ + if(TryIncrementMonLevel(mon) == FALSE) goto end; + + r6 = 1; + while((temp = sub_803B7C8(mon, r6)) != 0){ + r6 = 0; + if(temp == 0xffff){ + DeleteFirstMoveAndGiveMoveToMon(mon, word_2024E82); + } + } + } + + end: + + CalculateMonStats(mon); +} + +__attribute__((naked)) +u16 sub_8041570(struct BoxPokemon * daycare_data, u8 a2){ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + sub sp, 0x68\n\ + adds r5, r0, 0\n\ + lsls r1, 24\n\ + lsrs r4, r1, 24\n\ + lsls r7, r4, 2\n\ + adds r0, r7, r4\n\ + lsls r0, 4\n\ + adds r6, r5, r0\n\ + ldr r1, _08041640 @ =gStringVar1\n\ + adds r0, r6, 0\n\ + bl GetBoxMonNick\n\ + adds r0, r6, 0\n\ + movs r1, 0xB\n\ + bl GetBoxMonData\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r9, r0\n\ + adds r0, r6, 0\n\ + mov r1, sp\n\ + bl sub_803B4B4\n\ + mov r0, sp\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + cmp r0, 0x64\n\ + beq _080415D8\n\ + mov r0, sp\n\ + movs r1, 0x19\n\ + bl GetMonData\n\ + movs r2, 0x88\n\ + lsls r2, 1\n\ + adds r1, r5, r2\n\ + adds r1, r7\n\ + ldr r1, [r1]\n\ + adds r0, r1\n\ + str r0, [sp, 0x64]\n\ + add r2, sp, 0x64\n\ + mov r0, sp\n\ + movs r1, 0x19\n\ + bl SetMonData\n\ + mov r0, sp\n\ + bl sub_804151C\n\ +_080415D8:\n\ + ldr r0, _08041644 @ =gPlayerParty\n\ + movs r1, 0xFA\n\ + lsls r1, 1\n\ + adds r1, r0\n\ + mov r8, r1\n\ + mov r0, r8\n\ + mov r1, sp\n\ + movs r2, 0x64\n\ + bl memcpy\n\ + lsls r0, r4, 3\n\ + subs r0, r4\n\ + lsls r1, r0, 3\n\ + adds r0, r5, r1\n\ + adds r0, 0xC0\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + beq _08041610\n\ + adds r4, r1, 0\n\ + adds r4, 0xA0\n\ + adds r4, r5, r4\n\ + mov r0, r8\n\ + adds r1, r4, 0\n\ + bl GiveMailToMon2\n\ + adds r0, r4, 0\n\ + bl sub_80417F4\n\ +_08041610:\n\ + bl party_compaction\n\ + adds r0, r6, 0\n\ + bl ZeroBoxMonData\n\ + movs r2, 0x88\n\ + lsls r2, 1\n\ + adds r0, r5, r2\n\ + adds r0, r7\n\ + movs r1, 0\n\ + str r1, [r0]\n\ + adds r0, r5, 0\n\ + bl sub_80414C0\n\ + bl CalculatePlayerPartyCount\n\ + mov r0, r9\n\ + add sp, 0x68\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08041640: .4byte gStringVar1\n\ +_08041644: .4byte gPlayerParty\n\ + .syntax divided"); +} + +extern u8 gSpecialVar_0x8004; + +u16 sub_8041648() +{ + return sub_8041570(gSaveBlock1.daycareData, gSpecialVar_0x8004); +} + +u8 Daycare_GetLevelAfterSteps(struct BoxPokemon * mon, u32 steps){ + struct BoxPokemon temp = *mon; + u32 new_exp = GetBoxMonData(mon, MON_DATA_EXP) + steps; + SetBoxMonData(&temp, MON_DATA_EXP, (u8 *) &new_exp); + return GetLevelFromBoxMonExp(&temp); +} diff --git a/src/field/decoration.c b/src/field/decoration.c new file mode 100644 index 000000000..da33b3ab7 --- /dev/null +++ b/src/field/decoration.c @@ -0,0 +1,4280 @@ +#include "global.h" +#include "main.h" +#include "map_object_constants.h" +#include "rom4.h" +#include "sound.h" +#include "songs.h" +#include "string_util.h" +#include "menu.h" +#include "menu_helpers.h" +#include "strings.h" +#include "script.h" +#include "palette.h" +#include "field_player_avatar.h" +#include "field_camera.h" +#include "field_fadetransition.h" +#include "fieldmap.h" +#include "metatile_behavior.h" +#include "event_data.h" +#include "field_weather.h" +#include "decoration.h" + +EWRAM_DATA u8 *gUnknown_020388D0 = NULL; +EWRAM_DATA u8 gUnknown_020388D4 = 0; +EWRAM_DATA u8 gUnknown_020388D5 = 0; +EWRAM_DATA u8 gUnknown_020388D6[16] = {0}; +EWRAM_DATA u8 gUnknown_020388E6[12] = {0}; +EWRAM_DATA u8 gUnknown_020388F2 = 0; +EWRAM_DATA u8 gUnknown_020388F3 = 0; +EWRAM_DATA u8 gUnknown_020388F4 = 0; +EWRAM_DATA u8 gUnknown_020388F5 = 0; +EWRAM_DATA u8 gUnknown_020388F6 = 0; +EWRAM_DATA u8 gUnknown_020388F7[8] = {0}; +EWRAM_DATA struct UnkStruct_02038900 gUnknown_02038900 = {0}; +EWRAM_DATA u16 gUnknown_020391A4 = 0; +EWRAM_DATA u16 gUnknown_020391A6 = 0; +EWRAM_DATA u8 gUnknown_020391A8 = 0; +EWRAM_DATA u8 gUnknown_020391A9 = 0; +EWRAM_DATA u8 gUnknown_020391AA = 0; +EWRAM_DATA struct OamData gUnknown_020391AC = {0}; +EWRAM_DATA struct UnkStruct_020391B4 gUnknown_020391B4[16] = {0}; +EWRAM_DATA u8 gUnknown_02039234 = 0; + +#if ENGLISH +const u8 DecorDesc_SMALL_DESK[] = _( + "A small desk built\n" + "for one."); + +const u8 DecorDesc_POKEMON_DESK[] = _( + "A small desk built in\n" + "the shape of a POKé\n" + "BALL."); + +const u8 DecorDesc_HEAVY_DESK[] = _( + "A large desk made\n" + "of steel. Put some\n" + "decorations on it."); + +const u8 DecorDesc_RAGGED_DESK[] = _( + "A large desk made\n" + "of wood. Put some\n" + "decorations on it."); + +const u8 DecorDesc_COMFORT_DESK[] = _( + "A large desk made\n" + "of leaves. Put some\n" + "decorations on it."); + +const u8 DecorDesc_PRETTY_DESK[] = _( + "A huge desk made\n" + "of glass. Holds lots\n" + "of decorations."); + +const u8 DecorDesc_BRICK_DESK[] = _( + "A huge desk made\n" + "of brick. Holds lots\n" + "of decorations."); + +const u8 DecorDesc_CAMP_DESK[] = _( + "A huge desk made\n" + "of logs. Put lots of\n" + "decorations on it."); + +const u8 DecorDesc_HARD_DESK[] = _( + "A huge desk made\n" + "of rocks. Holds\n" + "many decorations."); + +const u8 DecorDesc_SMALL_CHAIR[] = _( + "A small chair made\n" + "for one."); + +const u8 DecorDesc_POKEMON_CHAIR[] = _( + "A small chair built\n" + "in the shape of a\n" + "POKé BALL."); + +const u8 DecorDesc_HEAVY_CHAIR[] = _( + "A small chair made\n" + "of steel."); + +const u8 DecorDesc_PRETTY_CHAIR[] = _( + "A small chair made\n" + "of glass."); + +const u8 DecorDesc_COMFORT_CHAIR[] = _( + "A small chair made\n" + "of leaves."); + +const u8 DecorDesc_RAGGED_CHAIR[] = _( + "A small chair made\n" + "of wood."); + +const u8 DecorDesc_BRICK_CHAIR[] = _( + "A small chair made\n" + "of brick."); + +const u8 DecorDesc_CAMP_CHAIR[] = _( + "A small chair made\n" + "of logs."); + +const u8 DecorDesc_HARD_CHAIR[] = _( + "A small chair made\n" + "of rock."); + +const u8 DecorDesc_RED_PLANT[] = _( + "A vivid red potted\n" + "plant."); + +const u8 DecorDesc_TROPICAL_PLANT[] = _( + "A flowering tropical\n" + "plant in a pot."); + +const u8 DecorDesc_PRETTY_FLOWERS[] = _( + "A pot of cute\n" + "flowers."); + +const u8 DecorDesc_COLORFUL_PLANT[] = _( + "A large pot with\n" + "many colorful\n" + "flowers."); + +const u8 DecorDesc_BIG_PLANT[] = _( + "A large, umbrella-\n" + "shaped plant in a\n" + "big pot."); + +const u8 DecorDesc_GORGEOUS_PLANT[] = _( + "A large, impressive\n" + "plant in a big pot."); + +const u8 DecorDesc_RED_BRICK[] = _( + "A red-colored brick.\n" + "Decorations can be\n" + "placed on top."); + +const u8 DecorDesc_YELLOW_BRICK[] = _( + "A yellow-colored\n" + "brick. Put some\n" + "decorations on top."); + +const u8 DecorDesc_BLUE_BRICK[] = _( + "A blue-colored\n" + "brick. Put some\n" + "decorations on top."); + +const u8 DecorDesc_RED_BALLOON[] = _( + "A red balloon filled\n" + "with water. Bursts\n" + "if stepped on."); + +const u8 DecorDesc_BLUE_BALLOON[] = _( + "A blue balloon filled\n" + "with water. Bursts\n" + "if stepped on."); + +const u8 DecorDesc_YELLOW_BALLOON[] = _( + "A yellow balloon\n" + "filled with water.\n" + "Pops if stepped on."); + +const u8 DecorDesc_RED_TENT[] = _( + "A large red tent.\n" + "You can hide inside\n" + "it."); + +const u8 DecorDesc_BLUE_TENT[] = _( + "A large blue tent.\n" + "You can hide inside\n" + "it."); + +const u8 DecorDesc_SOLID_BOARD[] = _( + "Place over a hole to\n" + "cross to the other\n" + "side."); + +const u8 DecorDesc_SLIDE[] = _( + "Use to slide down\n" + "from the platform."); + +const u8 DecorDesc_FENCE_LENGTH[] = _( + "A small fence that\n" + "blocks passage."); + +const u8 DecorDesc_FENCE_WIDTH[] = _( + "A small fence that\n" + "blocks passage."); + +const u8 DecorDesc_TIRE[] = _( + "An old large tire.\n" + "Decorations can be\n" + "placed on top."); + +const u8 DecorDesc_STAND[] = _( + "A large pedestal\n" + "with steps."); + +const u8 DecorDesc_MUD_BALL[] = _( + "A large ball of mud.\n" + "Crumbles if stepped\n" + "on."); + +const u8 DecorDesc_BREAKABLE_DOOR[] = _( + "A weird door that\n" + "people can walk\n" + "right through."); + +const u8 DecorDesc_SAND_ORNAMENT[] = _( + "An ornament made\n" + "of sand. Crumbles if\n" + "touched."); + +const u8 DecorDesc_SILVER_SHIELD[] = _( + "Awarded for 50\n" + "straight wins at\n" + "the BATTLE TOWER."); + +const u8 DecorDesc_GOLD_SHIELD[] = _( + "Awarded for 100\n" + "straight wins at\n" + "the BATTLE TOWER."); + +const u8 DecorDesc_GLASS_ORNAMENT[] = _( + "A glass replica of\n" + "a famous sculpture\n" + "at the ART MUSEUM."); + +const u8 DecorDesc_TV[] = _( + "A small, gray-\n" + "colored toy TV."); + +const u8 DecorDesc_ROUND_TV[] = _( + "A toy TV modeled\n" + "in the image of a\n" + "SEEDOT."); + +const u8 DecorDesc_CUTE_TV[] = _( + "A toy TV modeled\n" + "in the image of a\n" + "SKITTY."); + +const u8 DecorDesc_GLITTER_MAT[] = _( + "An odd mat that\n" + "glitters if stepped\n" + "on."); + +const u8 DecorDesc_JUMP_MAT[] = _( + "A trick mat that\n" + "jumps when it is\n" + "stepped on."); + +const u8 DecorDesc_SPIN_MAT[] = _( + "A trick mat that\n" + "spins around when\n" + "stepped on."); + +const u8 DecorDesc_C_LOW_NOTE_MAT[] = _( + "A mat that plays\n" + "a low C note when\n" + "stepped on."); + +const u8 DecorDesc_D_NOTE_MAT[] = _( + "A mat that plays\n" + "a D note when\n" + "stepped on."); + +const u8 DecorDesc_E_NOTE_MAT[] = _( + "A mat that plays\n" + "an E note when\n" + "stepped on."); + +const u8 DecorDesc_F_NOTE_MAT[] = _( + "A mat that plays\n" + "an F note when\n" + "stepped on."); + +const u8 DecorDesc_G_NOTE_MAT[] = _( + "A mat that plays\n" + "a G note when\n" + "stepped on."); + +const u8 DecorDesc_A_NOTE_MAT[] = _( + "A mat that plays\n" + "an A note when\n" + "stepped on."); + +const u8 DecorDesc_B_NOTE_MAT[] = _( + "A mat that plays\n" + "a B note when\n" + "stepped on."); + +const u8 DecorDesc_C_HIGH_NOTE_MAT[] = _( + "A mat that plays\n" + "a high C note when\n" + "stepped on."); + +const u8 DecorDesc_SURF_MAT[] = _( + "A mat designed with\n" + "a SURF image.\n" + "Put items on top."); + +const u8 DecorDesc_THUNDER_MAT[] = _( + "A mat designed with\n" + "a THUNDER image.\n" + "Put items on top."); + +const u8 DecorDesc_FIRE_BLAST_MAT[] = _( + "A mat designed with\n" + "a FIRE BLAST image.\n" + "Put items on top."); + +const u8 DecorDesc_POWDER_SNOW_MAT[] = _( + "A mat with a POWDER\n" + "SNOW image design.\n" + "Put items on top."); + +const u8 DecorDesc_ATTRACT_MAT[] = _( + "A mat designed with\n" + "an ATTRACT image.\n" + "Put items on top."); + +const u8 DecorDesc_FISSURE_MAT[] = _( + "A mat designed with\n" + "a FISSURE image.\n" + "Put items on top."); + +const u8 DecorDesc_SPIKES_MAT[] = _( + "A mat designed with\n" + "a SPIKES image.\n" + "Put items on top."); + +const u8 DecorDesc_BALL_POSTER[] = _( + "A small poster\n" + "printed with POKé\n" + "BALLS."); + +const u8 DecorDesc_GREEN_POSTER[] = _( + "A small poster with\n" + "a TREECKO print."); + +const u8 DecorDesc_RED_POSTER[] = _( + "A small poster with\n" + "a TORCHIC print."); + +const u8 DecorDesc_BLUE_POSTER[] = _( + "A small poster with\n" + "a MUDKIP print."); + +const u8 DecorDesc_CUTE_POSTER[] = _( + "A small poster with\n" + "an AZURILL print."); + +const u8 DecorDesc_PIKA_POSTER[] = _( + "A large poster with\n" + "a PIKACHU and\n" + "PICHU print."); + +const u8 DecorDesc_LONG_POSTER[] = _( + "A large poster with\n" + "a SEVIPER print."); + +const u8 DecorDesc_SEA_POSTER[] = _( + "A large poster with\n" + "a RELICANTH print."); + +const u8 DecorDesc_SKY_POSTER[] = _( + "A large poster with\n" + "a WINGULL print."); + +const u8 DecorDesc_KISS_POSTER[] = _( + "A large poster with\n" + "a SMOOCHUM print."); + +const u8 DecorDesc_PICHU_DOLL[] = _( + "A PICHU doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_PIKACHU_DOLL[] = _( + "A PIKACHU doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_MARILL_DOLL[] = _( + "A MARILL doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_TOGEPI_DOLL[] = _( +#if REVISION >= 1 + "A TOGEPI doll.\n" +#else + "A TOPGEPI doll.\n" +#endif + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_CYNDAQUIL_DOLL[] = _( + "A CYNDAQUIL doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_CHIKORITA_DOLL[] = _( + "A CHIKORITA doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_TOTODILE_DOLL[] = _( + "A TOTODILE doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_JIGGLYPUFF_DOLL[] = _( + "A JIGGLYPUFF doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_MEOWTH_DOLL[] = _( + "A MEOWTH doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_CLEFAIRY_DOLL[] = _( + "A CLEFAIRY doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_DITTO_DOLL[] = _( + "A DITTO doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_SMOOCHUM_DOLL[] = _( + "A SMOOCHUM doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_TREECKO_DOLL[] = _( + "A TREECKO doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_TORCHIC_DOLL[] = _( + "A TORCHIC doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_MUDKIP_DOLL[] = _( + "A MUDKIP doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_DUSKULL_DOLL[] = _( + "A DUSKULL doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_WYNAUT_DOLL[] = _( + "A WYNAUT doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_BALTOY_DOLL[] = _( + "A BALTOY doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_KECLEON_DOLL[] = _( + "A KECLEON doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_AZURILL_DOLL[] = _( + "An AZURILL doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_SKITTY_DOLL[] = _( + "A SKITTY doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_SWABLU_DOLL[] = _( + "A SWABLU doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_GULPIN_DOLL[] = _( + "A GULPIN doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_LOTAD_DOLL[] = _( + "A LOTAD doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_SEEDOT_DOLL[] = _( + "A SEEDOT doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_PIKA_CUSHION[] = _( + "A PIKACHU cushion.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_ROUND_CUSHION[] = _( + "A MARILL cushion.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_KISS_CUSHION[] = _( + "A SMOOCHUM\n" + "cushion. Place it on\n" + "a mat or a desk."); + +const u8 DecorDesc_ZIGZAG_CUSHION[] = _( + "A ZIGZAGOON\n" + "cushion. Place it on\n" + "a mat or a desk."); + +const u8 DecorDesc_SPIN_CUSHION[] = _( + "A SPINDA cushion.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_DIAMOND_CUSHION[] = _( + "A SABLEYE cushion.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_BALL_CUSHION[] = _( + "A BALL cushion.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_GRASS_CUSHION[] = _( + "A grass-mark\n" + "cushion. Place it on\n" + "a mat or a desk."); + +const u8 DecorDesc_FIRE_CUSHION[] = _( + "A fire-mark\n" + "cushion. Place it on\n" + "a mat or a desk."); + +const u8 DecorDesc_WATER_CUSHION[] = _( + "A water-mark\n" + "cushion. Place it on\n" + "a mat or a desk."); + +const u8 DecorDesc_SNORLAX_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_RHYDON_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_LAPRAS_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_VENUSAUR_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_CHARIZARD_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_BLASTOISE_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_WAILMER_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_REGIROCK_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_REGICE_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_REGISTEEL_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); +#elif GERMAN +#include "data/decoration/descriptions_de.h" +#endif + +const u16 DecorGfx_SMALL_DESK[] = { + 0x87 +}; + +const u16 DecorGfx_POKEMON_DESK[] = { + 0x8F +}; + +const u16 DecorGfx_HEAVY_DESK[] = { + 0x90, + 0x91, + 0x92, + 0x98, + 0x99, + 0x9A +}; + +const u16 DecorGfx_RAGGED_DESK[] = { + 0x93, + 0x94, + 0x95, + 0x9B, + 0x9C, + 0x9D +}; + +const u16 DecorGfx_COMFORT_DESK[] = { + 0x96, + 0x97, + 0xA3, + 0x9E, + 0x9F, + 0xAB +}; + +const u16 DecorGfx_PRETTY_DESK[] = { + 0xBD, + 0xBE, + 0xBF, + 0xC5, + 0xC6, + 0xC7, + 0xCD, + 0xCE, + 0xCF +}; + +const u16 DecorGfx_BRICK_DESK[] = { + 0xA0, + 0xA1, + 0xA2, + 0xA8, + 0xA9, + 0xAA, + 0xB0, + 0xB1, + 0xB2 +}; + +const u16 DecorGfx_CAMP_DESK[] = { + 0xA4, + 0xA5, + 0xA6, + 0xAC, + 0xAD, + 0xAE, + 0xB4, + 0xB5, + 0xB6 +}; + +const u16 DecorGfx_HARD_DESK[] = { + 0xA7, + 0xBB, + 0xBC, + 0xAF, + 0xC3, + 0xC4, + 0xB7, + 0xCB, + 0xCC +}; + +const u16 DecorGfx_SMALL_CHAIR[] = { + 0xB8 +}; + +const u16 DecorGfx_POKEMON_CHAIR[] = { + 0xB9 +}; + +const u16 DecorGfx_HEAVY_CHAIR[] = { + 0xBA +}; + +const u16 DecorGfx_PRETTY_CHAIR[] = { + 0xC0 +}; + +const u16 DecorGfx_COMFORT_CHAIR[] = { + 0xC1 +}; + +const u16 DecorGfx_RAGGED_CHAIR[] = { + 0xC2 +}; + +const u16 DecorGfx_BRICK_CHAIR[] = { + 0xC8 +}; + +const u16 DecorGfx_CAMP_CHAIR[] = { + 0xC9 +}; + +const u16 DecorGfx_HARD_CHAIR[] = { + 0xCA +}; + +const u16 DecorGfx_RED_PLANT[] = { + 0xD0, + 0xD8 +}; + +const u16 DecorGfx_TROPICAL_PLANT[] = { + 0xD2, + 0xDA +}; + +const u16 DecorGfx_PRETTY_FLOWERS[] = { + 0xD4, + 0xDC +}; + +const u16 DecorGfx_COLORFUL_PLANT[] = { + 0xE0, + 0xE2, + 0xE8, + 0xE9 +}; + +const u16 DecorGfx_BIG_PLANT[] = { + 0xE4, + 0xE6, + 0xEC, + 0xED +}; + +const u16 DecorGfx_GORGEOUS_PLANT[] = { + 0xF0, + 0xF2, + 0xF8, + 0xF9 +}; + +const u16 DecorGfx_RED_BRICK[] = { + 0x25, + 0x2D +}; + +const u16 DecorGfx_YELLOW_BRICK[] = { + 0x26, + 0x2E +}; + +const u16 DecorGfx_BLUE_BRICK[] = { + 0x27, + 0x2F +}; + +const u16 DecorGfx_RED_BALLOON[] = { + 0x138 +}; + +const u16 DecorGfx_BLUE_BALLOON[] = { + 0x13C +}; + +const u16 DecorGfx_YELLOW_BALLOON[] = { + 0x140 +}; + +const u16 DecorGfx_RED_TENT[] = { + 0x30, + 0x31, + 0x32, + 0x38, + 0x39, + 0x3A, + 0x40, + 0x41, + 0x3B +}; + +const u16 DecorGfx_BLUE_TENT[] = { + 0x48, + 0x49, + 0x68, + 0x50, + 0x51, + 0x70, + 0x58, + 0x59, + 0x69 +}; + +const u16 DecorGfx_SOLID_BOARD[] = { + 0x34, + 0x3C +}; + +const u16 DecorGfx_SLIDE[] = { + 0x35, + 0x36, + 0x3D, + 0x3E, + 0x63, + 0x64, + 0x6F, + 0x77 +}; + +const u16 DecorGfx_FENCE_LENGTH[] = { + 0x33 +}; + +const u16 DecorGfx_FENCE_WIDTH[] = { + 0x2C +}; + +const u16 DecorGfx_TIRE[] = { + 0x80, + 0x81, + 0x88, + 0x89 +}; + +const u16 DecorGfx_STAND[] = { + 0x6A, + 0x6B, + 0x6C, + 0x6D, + 0x72, + 0x73, + 0x74, + 0x75 +}; + +const u16 DecorGfx_MUD_BALL[] = { + 0x28 +}; + +const u16 DecorGfx_BREAKABLE_DOOR[] = { + 0x37, + 0x3F +}; + +const u16 DecorGfx_SAND_ORNAMENT[] = { + 0x85, + 0x8D +}; + +const u16 DecorGfx_SILVER_SHIELD[] = { + 0xD6, + 0xDE +}; + +const u16 DecorGfx_GOLD_SHIELD[] = { + 0x12E, + 0x136 +}; + +const u16 DecorGfx_GLASS_ORNAMENT[] = { + 0x82, + 0x8A +}; + +const u16 DecorGfx_TV[] = { + 0xF4 +}; + +const u16 DecorGfx_ROUND_TV[] = { + 0xF5 +}; + +const u16 DecorGfx_CUTE_TV[] = { + 0xF6 +}; + +const u16 DecorGfx_GLITTER_MAT[] = { + 0x60 +}; + +const u16 DecorGfx_JUMP_MAT[] = { + 0x61 +}; + +const u16 DecorGfx_SPIN_MAT[] = { + 0x62 +}; + +const u16 DecorGfx_C_LOW_NOTE_MAT[] = { + 0x78 +}; + +const u16 DecorGfx_D_NOTE_MAT[] = { + 0x79 +}; + +const u16 DecorGfx_E_NOTE_MAT[] = { + 0x7A +}; + +const u16 DecorGfx_F_NOTE_MAT[] = { + 0x7B +}; + +const u16 DecorGfx_G_NOTE_MAT[] = { + 0x7C +}; + +const u16 DecorGfx_A_NOTE_MAT[] = { + 0x7D +}; + +const u16 DecorGfx_B_NOTE_MAT[] = { + 0x7E +}; + +const u16 DecorGfx_C_HIGH_NOTE_MAT[] = { + 0xB3 +}; + +const u16 DecorGfx_SURF_MAT[] = { + 0x42, + 0x43, + 0x44, + 0x4A, + 0x4B, + 0x4C, + 0x52, + 0x53, + 0x54 +}; + +const u16 DecorGfx_THUNDER_MAT[] = { + 0x45, + 0x46, + 0x47, + 0x4D, + 0x4E, + 0x4F, + 0x55, + 0x56, + 0x57 +}; + +const u16 DecorGfx_FIRE_BLAST_MAT[] = { + 0x5A, + 0x5B, + 0x5C, + 0x5D, + 0x5E, + 0x5F, + 0x65, + 0x66, + 0x67 +}; + +const u16 DecorGfx_POWDER_SNOW_MAT[] = { + 0x100, + 0x101, + 0x102, + 0x108, + 0x109, + 0x10A, + 0x110, + 0x111, + 0x112 +}; + +const u16 DecorGfx_ATTRACT_MAT[] = { + 0x103, + 0x104, + 0x105, + 0x10B, + 0x10C, + 0x10D, + 0x113, + 0x114, + 0x115 +}; + +const u16 DecorGfx_FISSURE_MAT[] = { + 0x106, + 0x107, + 0x118, + 0x10E, + 0x10F, + 0x120, + 0x116, + 0x117, + 0x128 +}; + +const u16 DecorGfx_SPIKES_MAT[] = { + 0x119, + 0x11A, + 0x11B, + 0x121, + 0x122, + 0x123, + 0x129, + 0x12A, + 0x12B +}; + +const u16 DecorGfx_BALL_POSTER[] = { + 0x130 +}; + +const u16 DecorGfx_GREEN_POSTER[] = { + 0x131 +}; + +const u16 DecorGfx_RED_POSTER[] = { + 0x132 +}; + +const u16 DecorGfx_BLUE_POSTER[] = { + 0x133 +}; + +const u16 DecorGfx_CUTE_POSTER[] = { + 0x134 +}; + +const u16 DecorGfx_PIKA_POSTER[] = { + 0x11C, + 0x11D +}; + +const u16 DecorGfx_LONG_POSTER[] = { + 0x11E, + 0x11F +}; + +const u16 DecorGfx_SEA_POSTER[] = { + 0x124, + 0x125 +}; + +const u16 DecorGfx_SKY_POSTER[] = { + 0x126, + 0x127 +}; + +const u16 DecorGfx_KISS_POSTER[] = { + 0x12C, + 0x12D +}; + +const u16 DecorGfx_PICHU_DOLL[] = { + MAP_OBJ_GFX_PICHU_DOLL +}; + +const u16 DecorGfx_PIKACHU_DOLL[] = { + MAP_OBJ_GFX_PIKACHU_DOLL +}; + +const u16 DecorGfx_MARILL_DOLL[] = { + MAP_OBJ_GFX_MARILL_DOLL +}; + +const u16 DecorGfx_TOGEPI_DOLL[] = { + MAP_OBJ_GFX_TOGEPI_DOLL +}; + +const u16 DecorGfx_CYNDAQUIL_DOLL[] = { + MAP_OBJ_GFX_CYNDAQUIL_DOLL +}; + +const u16 DecorGfx_CHIKORITA_DOLL[] = { + MAP_OBJ_GFX_CHIKORITA_DOLL +}; + +const u16 DecorGfx_TOTODILE_DOLL[] = { + MAP_OBJ_GFX_TOTODILE_DOLL +}; + +const u16 DecorGfx_JIGGLYPUFF_DOLL[] = { + MAP_OBJ_GFX_JIGGLYPUFF_DOLL +}; + +const u16 DecorGfx_MEOWTH_DOLL[] = { + MAP_OBJ_GFX_MEOWTH_DOLL +}; + +const u16 DecorGfx_CLEFAIRY_DOLL[] = { + MAP_OBJ_GFX_CLEFAIRY_DOLL +}; + +const u16 DecorGfx_DITTO_DOLL[] = { + MAP_OBJ_GFX_DITTO_DOLL +}; + +const u16 DecorGfx_SMOOCHUM_DOLL[] = { + MAP_OBJ_GFX_SMOOCHUM_DOLL +}; + +const u16 DecorGfx_TREECKO_DOLL[] = { + MAP_OBJ_GFX_TREECKO_DOLL +}; + +const u16 DecorGfx_TORCHIC_DOLL[] = { + MAP_OBJ_GFX_TORCHIC_DOLL +}; + +const u16 DecorGfx_MUDKIP_DOLL[] = { + MAP_OBJ_GFX_MUDKIP_DOLL +}; + +const u16 DecorGfx_DUSKULL_DOLL[] = { + MAP_OBJ_GFX_DUSKULL_DOLL +}; + +const u16 DecorGfx_WYNAUT_DOLL[] = { + MAP_OBJ_GFX_WYNAUT_DOLL +}; + +const u16 DecorGfx_BALTOY_DOLL[] = { + MAP_OBJ_GFX_BALTOY_DOLL +}; + +const u16 DecorGfx_KECLEON_DOLL[] = { + MAP_OBJ_GFX_KECLEON_DOLL +}; + +const u16 DecorGfx_AZURILL_DOLL[] = { + MAP_OBJ_GFX_AZURILL_DOLL +}; + +const u16 DecorGfx_SKITTY_DOLL[] = { + MAP_OBJ_GFX_SKITTY_DOLL +}; + +const u16 DecorGfx_SWABLU_DOLL[] = { + MAP_OBJ_GFX_SWABLU_DOLL +}; + +const u16 DecorGfx_GULPIN_DOLL[] = { + MAP_OBJ_GFX_GULPIN_DOLL +}; + +const u16 DecorGfx_LOTAD_DOLL[] = { + MAP_OBJ_GFX_LOTAD_DOLL +}; + +const u16 DecorGfx_SEEDOT_DOLL[] = { + MAP_OBJ_GFX_SEEDOT_DOLL +}; + +const u16 DecorGfx_PIKA_CUSHION[] = { + MAP_OBJ_GFX_PIKA_CUSHION +}; + +const u16 DecorGfx_ROUND_CUSHION[] = { + MAP_OBJ_GFX_ROUND_CUSHION +}; + +const u16 DecorGfx_KISS_CUSHION[] = { + MAP_OBJ_GFX_KISS_CUSHION +}; + +const u16 DecorGfx_ZIGZAG_CUSHION[] = { + MAP_OBJ_GFX_ZIGZAG_CUSHION +}; + +const u16 DecorGfx_SPIN_CUSHION[] = { + MAP_OBJ_GFX_SPIN_CUSHION +}; + +const u16 DecorGfx_DIAMOND_CUSHION[] = { + MAP_OBJ_GFX_DIAMOND_CUSHION +}; + +const u16 DecorGfx_BALL_CUSHION[] = { + MAP_OBJ_GFX_BALL_CUSHION +}; + +const u16 DecorGfx_GRASS_CUSHION[] = { + MAP_OBJ_GFX_GRASS_CUSHION +}; + +const u16 DecorGfx_FIRE_CUSHION[] = { + MAP_OBJ_GFX_FIRE_CUSHION +}; + +const u16 DecorGfx_WATER_CUSHION[] = { + MAP_OBJ_GFX_WATER_CUSHION +}; + +const u16 DecorGfx_SNORLAX_DOLL[] = { + MAP_OBJ_GFX_BIG_SNORLAX_DOLL +}; + +const u16 DecorGfx_RHYDON_DOLL[] = { + MAP_OBJ_GFX_BIG_RHYDON_DOLL +}; + +const u16 DecorGfx_LAPRAS_DOLL[] = { + MAP_OBJ_GFX_BIG_LAPRAS_DOLL +}; + +const u16 DecorGfx_VENUSAUR_DOLL[] = { + MAP_OBJ_GFX_BIG_VENUSAUR_DOLL +}; + +const u16 DecorGfx_CHARIZARD_DOLL[] = { + MAP_OBJ_GFX_BIG_CHARIZARD_DOLL +}; + +const u16 DecorGfx_BLASTOISE_DOLL[] = { + MAP_OBJ_GFX_BIG_BLASTOISE_DOLL +}; + +const u16 DecorGfx_WAILMER_DOLL[] = { + MAP_OBJ_GFX_BIG_WAILMER_DOLL +}; + +const u16 DecorGfx_REGIROCK_DOLL[] = { + MAP_OBJ_GFX_BIG_REGIROCK_DOLL +}; + +const u16 DecorGfx_REGICE_DOLL[] = { + MAP_OBJ_GFX_BIG_REGICE_DOLL +}; + +const u16 DecorGfx_REGISTEEL_DOLL[] = { + MAP_OBJ_GFX_BIG_REGISTEEL_DOLL +}; + +#if ENGLISH +const struct Decoration gDecorations[] = { + {DECOR_NONE, _("SMALL DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 0, DecorDesc_SMALL_DESK, DecorGfx_SMALL_DESK}, + {DECOR_SMALL_DESK, _("SMALL DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 3000, DecorDesc_SMALL_DESK, DecorGfx_SMALL_DESK}, + {DECOR_POKEMON_DESK, _("POKéMON DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 3000, DecorDesc_POKEMON_DESK, DecorGfx_POKEMON_DESK}, + {DECOR_HEAVY_DESK, _("HEAVY DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_HEAVY_DESK, DecorGfx_HEAVY_DESK}, + {DECOR_RAGGED_DESK, _("RAGGED DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_RAGGED_DESK, DecorGfx_RAGGED_DESK}, + {DECOR_COMFORT_DESK, _("COMFORT DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_COMFORT_DESK, DecorGfx_COMFORT_DESK}, + {DECOR_PRETTY_DESK, _("PRETTY DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_PRETTY_DESK, DecorGfx_PRETTY_DESK}, + {DECOR_BRICK_DESK, _("BRICK DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_BRICK_DESK, DecorGfx_BRICK_DESK}, + {DECOR_CAMP_DESK, _("CAMP DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_CAMP_DESK, DecorGfx_CAMP_DESK}, + {DECOR_HARD_DESK, _("HARD DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_HARD_DESK, DecorGfx_HARD_DESK}, + {DECOR_SMALL_CHAIR, _("SMALL CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_SMALL_CHAIR, DecorGfx_SMALL_CHAIR}, + {DECOR_POKEMON_CHAIR, _("POKéMON CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_POKEMON_CHAIR, DecorGfx_POKEMON_CHAIR}, + {DECOR_HEAVY_CHAIR, _("HEAVY CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_HEAVY_CHAIR, DecorGfx_HEAVY_CHAIR}, + {DECOR_PRETTY_CHAIR, _("PRETTY CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_PRETTY_CHAIR, DecorGfx_PRETTY_CHAIR}, + {DECOR_COMFORT_CHAIR, _("COMFORT CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_COMFORT_CHAIR, DecorGfx_COMFORT_CHAIR}, + {DECOR_RAGGED_CHAIR, _("RAGGED CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_RAGGED_CHAIR, DecorGfx_RAGGED_CHAIR}, + {DECOR_BRICK_CHAIR, _("BRICK CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_BRICK_CHAIR, DecorGfx_BRICK_CHAIR}, + {DECOR_CAMP_CHAIR, _("CAMP CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_CAMP_CHAIR, DecorGfx_CAMP_CHAIR}, + {DECOR_HARD_CHAIR, _("HARD CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_HARD_CHAIR, DecorGfx_HARD_CHAIR}, + {DECOR_RED_PLANT, _("RED PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_RED_PLANT, DecorGfx_RED_PLANT}, + {DECOR_TROPICAL_PLANT, _("TROPICAL PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_TROPICAL_PLANT, DecorGfx_TROPICAL_PLANT}, + {DECOR_PRETTY_FLOWERS, _("PRETTY FLOWERS"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_PRETTY_FLOWERS, DecorGfx_PRETTY_FLOWERS}, + {DECOR_COLORFUL_PLANT, _("COLORFUL PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_COLORFUL_PLANT, DecorGfx_COLORFUL_PLANT}, + {DECOR_BIG_PLANT, _("BIG PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_BIG_PLANT, DecorGfx_BIG_PLANT}, + {DECOR_GORGEOUS_PLANT, _("GORGEOUS PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_GORGEOUS_PLANT, DecorGfx_GORGEOUS_PLANT}, + {DECOR_RED_BRICK, _("RED BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_RED_BRICK, DecorGfx_RED_BRICK}, + {DECOR_YELLOW_BRICK, _("YELLOW BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_YELLOW_BRICK, DecorGfx_YELLOW_BRICK}, + {DECOR_BLUE_BRICK, _("BLUE BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_BLUE_BRICK, DecorGfx_BLUE_BRICK}, + {DECOR_RED_BALLOON, _("RED BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_RED_BALLOON, DecorGfx_RED_BALLOON}, + {DECOR_BLUE_BALLOON, _("BLUE BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_BLUE_BALLOON, DecorGfx_BLUE_BALLOON}, + {DECOR_YELLOW_BALLOON, _("YELLOW BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_YELLOW_BALLOON, DecorGfx_YELLOW_BALLOON}, + {DECOR_RED_TENT, _("RED TENT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_ORNAMENT, 10000, DecorDesc_RED_TENT, DecorGfx_RED_TENT}, + {DECOR_BLUE_TENT, _("BLUE TENT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_ORNAMENT, 10000, DecorDesc_BLUE_TENT, DecorGfx_BLUE_TENT}, + {DECOR_SOLID_BOARD, _("SOLID BOARD"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_SOLID_BOARD, DecorGfx_SOLID_BOARD}, + {DECOR_SLIDE, _("SLIDE"), DECORPERM_PASS_FLOOR, DECORSHAPE_2x4, DECORCAT_ORNAMENT, 8000, DecorDesc_SLIDE, DecorGfx_SLIDE}, + {DECOR_FENCE_LENGTH, _("FENCE LENGTH"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_FENCE_LENGTH, DecorGfx_FENCE_LENGTH}, + {DECOR_FENCE_WIDTH, _("FENCE WIDTH"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_FENCE_WIDTH, DecorGfx_FENCE_WIDTH}, + {DECOR_TIRE, _("TIRE"), DECORPERM_SOLID_FLOOR, DECORSHAPE_2x2, DECORCAT_ORNAMENT, 800, DecorDesc_TIRE, DecorGfx_TIRE}, + {DECOR_STAND, _("STAND"), DECORPERM_PASS_FLOOR, DECORSHAPE_4x2, DECORCAT_ORNAMENT, 7000, DecorDesc_STAND, DecorGfx_STAND}, + {DECOR_MUD_BALL, _("MUD BALL"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 200, DecorDesc_MUD_BALL, DecorGfx_MUD_BALL}, + {DECOR_BREAKABLE_DOOR, _("BREAKABLE DOOR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_BREAKABLE_DOOR, DecorGfx_BREAKABLE_DOOR}, + {DECOR_SAND_ORNAMENT, _("SAND ORNAMENT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_SAND_ORNAMENT, DecorGfx_SAND_ORNAMENT}, + {DECOR_SILVER_SHIELD, _("SILVER SHIELD"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_SILVER_SHIELD, DecorGfx_SILVER_SHIELD}, + {DECOR_GOLD_SHIELD, _("GOLD SHIELD"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_GOLD_SHIELD, DecorGfx_GOLD_SHIELD}, + {DECOR_GLASS_ORNAMENT, _("GLASS ORNAMENT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_GLASS_ORNAMENT, DecorGfx_GLASS_ORNAMENT}, + {DECOR_TV, _("TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 3000, DecorDesc_TV, DecorGfx_TV}, + {DECOR_ROUND_TV, _("ROUND TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 4000, DecorDesc_ROUND_TV, DecorGfx_ROUND_TV}, + {DECOR_CUTE_TV, _("CUTE TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 4000, DecorDesc_CUTE_TV, DecorGfx_CUTE_TV}, + {DECOR_GLITTER_MAT, _("GLITTER MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_GLITTER_MAT, DecorGfx_GLITTER_MAT}, + {DECOR_JUMP_MAT, _("JUMP MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_JUMP_MAT, DecorGfx_JUMP_MAT}, + {DECOR_SPIN_MAT, _("SPIN MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_SPIN_MAT, DecorGfx_SPIN_MAT}, + {DECOR_C_LOW_NOTE_MAT, _("C Low NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_C_LOW_NOTE_MAT, DecorGfx_C_LOW_NOTE_MAT}, + {DECOR_D_NOTE_MAT, _("D NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_D_NOTE_MAT, DecorGfx_D_NOTE_MAT}, + {DECOR_E_NOTE_MAT, _("E NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_E_NOTE_MAT, DecorGfx_E_NOTE_MAT}, + {DECOR_F_NOTE_MAT, _("F NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_F_NOTE_MAT, DecorGfx_F_NOTE_MAT}, + {DECOR_G_NOTE_MAT, _("G NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_G_NOTE_MAT, DecorGfx_G_NOTE_MAT}, + {DECOR_A_NOTE_MAT, _("A NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_A_NOTE_MAT, DecorGfx_A_NOTE_MAT}, + {DECOR_B_NOTE_MAT, _("B NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_B_NOTE_MAT, DecorGfx_B_NOTE_MAT}, + {DECOR_C_HIGH_NOTE_MAT, _("C High NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_C_HIGH_NOTE_MAT, DecorGfx_C_HIGH_NOTE_MAT}, + {DECOR_SURF_MAT, _("SURF MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_SURF_MAT, DecorGfx_SURF_MAT}, + {DECOR_THUNDER_MAT, _("THUNDER MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_THUNDER_MAT, DecorGfx_THUNDER_MAT}, + {DECOR_FIRE_BLAST_MAT, _("FIRE BLAST MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_FIRE_BLAST_MAT, DecorGfx_FIRE_BLAST_MAT}, + {DECOR_POWDER_SNOW_MAT, _("POWDER SNOW MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_POWDER_SNOW_MAT, DecorGfx_POWDER_SNOW_MAT}, + {DECOR_ATTRACT_MAT, _("ATTRACT MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_ATTRACT_MAT, DecorGfx_ATTRACT_MAT}, + {DECOR_FISSURE_MAT, _("FISSURE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_FISSURE_MAT, DecorGfx_FISSURE_MAT}, + {DECOR_SPIKES_MAT, _("SPIKES MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_SPIKES_MAT, DecorGfx_SPIKES_MAT}, + {DECOR_BALL_POSTER, _("BALL POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_BALL_POSTER, DecorGfx_BALL_POSTER}, + {DECOR_GREEN_POSTER, _("GREEN POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_GREEN_POSTER, DecorGfx_GREEN_POSTER}, + {DECOR_RED_POSTER, _("RED POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_RED_POSTER, DecorGfx_RED_POSTER}, + {DECOR_BLUE_POSTER, _("BLUE POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_BLUE_POSTER, DecorGfx_BLUE_POSTER}, + {DECOR_CUTE_POSTER, _("CUTE POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_CUTE_POSTER, DecorGfx_CUTE_POSTER}, + {DECOR_PIKA_POSTER, _("PIKA POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_PIKA_POSTER, DecorGfx_PIKA_POSTER}, + {DECOR_LONG_POSTER, _("LONG POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_LONG_POSTER, DecorGfx_LONG_POSTER}, + {DECOR_SEA_POSTER, _("SEA POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_SEA_POSTER, DecorGfx_SEA_POSTER}, + {DECOR_SKY_POSTER, _("SKY POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_SKY_POSTER, DecorGfx_SKY_POSTER}, + {DECOR_KISS_POSTER, _("KISS POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_KISS_POSTER, DecorGfx_KISS_POSTER}, + {DECOR_PICHU_DOLL, _("PICHU DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_PICHU_DOLL, DecorGfx_PICHU_DOLL}, + {DECOR_PIKACHU_DOLL, _("PIKACHU DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_PIKACHU_DOLL, DecorGfx_PIKACHU_DOLL}, + {DECOR_MARILL_DOLL, _("MARILL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MARILL_DOLL, DecorGfx_MARILL_DOLL}, + {DECOR_TOGEPI_DOLL, _("TOGEPI DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TOGEPI_DOLL, DecorGfx_TOGEPI_DOLL}, + {DECOR_CYNDAQUIL_DOLL, _("CYNDAQUIL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CYNDAQUIL_DOLL, DecorGfx_CYNDAQUIL_DOLL}, + {DECOR_CHIKORITA_DOLL, _("CHIKORITA DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CHIKORITA_DOLL, DecorGfx_CHIKORITA_DOLL}, + {DECOR_TOTODILE_DOLL, _("TOTODILE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TOTODILE_DOLL, DecorGfx_TOTODILE_DOLL}, + {DECOR_JIGGLYPUFF_DOLL, _("JIGGLYPUFF DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_JIGGLYPUFF_DOLL, DecorGfx_JIGGLYPUFF_DOLL}, + {DECOR_MEOWTH_DOLL, _("MEOWTH DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MEOWTH_DOLL, DecorGfx_MEOWTH_DOLL}, + {DECOR_CLEFAIRY_DOLL, _("CLEFAIRY DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CLEFAIRY_DOLL, DecorGfx_CLEFAIRY_DOLL}, + {DECOR_DITTO_DOLL, _("DITTO DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_DITTO_DOLL, DecorGfx_DITTO_DOLL}, + {DECOR_SMOOCHUM_DOLL, _("SMOOCHUM DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SMOOCHUM_DOLL, DecorGfx_SMOOCHUM_DOLL}, + {DECOR_TREECKO_DOLL, _("TREECKO DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TREECKO_DOLL, DecorGfx_TREECKO_DOLL}, + {DECOR_TORCHIC_DOLL, _("TORCHIC DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TORCHIC_DOLL, DecorGfx_TORCHIC_DOLL}, + {DECOR_MUDKIP_DOLL, _("MUDKIP DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MUDKIP_DOLL, DecorGfx_MUDKIP_DOLL}, + {DECOR_DUSKULL_DOLL, _("DUSKULL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_DUSKULL_DOLL, DecorGfx_DUSKULL_DOLL}, + {DECOR_WYNAUT_DOLL, _("WYNAUT DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_WYNAUT_DOLL, DecorGfx_WYNAUT_DOLL}, + {DECOR_BALTOY_DOLL, _("BALTOY DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_BALTOY_DOLL, DecorGfx_BALTOY_DOLL}, + {DECOR_KECLEON_DOLL, _("KECLEON DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_KECLEON_DOLL, DecorGfx_KECLEON_DOLL}, + {DECOR_AZURILL_DOLL, _("AZURILL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_AZURILL_DOLL, DecorGfx_AZURILL_DOLL}, + {DECOR_SKITTY_DOLL, _("SKITTY DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SKITTY_DOLL, DecorGfx_SKITTY_DOLL}, + {DECOR_SWABLU_DOLL, _("SWABLU DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SWABLU_DOLL, DecorGfx_SWABLU_DOLL}, + {DECOR_GULPIN_DOLL, _("GULPIN DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_GULPIN_DOLL, DecorGfx_GULPIN_DOLL}, + {DECOR_LOTAD_DOLL, _("LOTAD DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_LOTAD_DOLL, DecorGfx_LOTAD_DOLL}, + {DECOR_SEEDOT_DOLL, _("SEEDOT DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SEEDOT_DOLL, DecorGfx_SEEDOT_DOLL}, + {DECOR_PIKA_CUSHION, _("PIKA CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_PIKA_CUSHION, DecorGfx_PIKA_CUSHION}, + {DECOR_ROUND_CUSHION, _("ROUND CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_ROUND_CUSHION, DecorGfx_ROUND_CUSHION}, + {DECOR_KISS_CUSHION, _("KISS CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_KISS_CUSHION, DecorGfx_KISS_CUSHION}, + {DECOR_ZIGZAG_CUSHION, _("ZIGZAG CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_ZIGZAG_CUSHION, DecorGfx_ZIGZAG_CUSHION}, + {DECOR_SPIN_CUSHION, _("SPIN CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_SPIN_CUSHION, DecorGfx_SPIN_CUSHION}, + {DECOR_DIAMOND_CUSHION, _("DIAMOND CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_DIAMOND_CUSHION, DecorGfx_DIAMOND_CUSHION}, + {DECOR_BALL_CUSHION, _("BALL CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_BALL_CUSHION, DecorGfx_BALL_CUSHION}, + {DECOR_GRASS_CUSHION, _("GRASS CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_GRASS_CUSHION, DecorGfx_GRASS_CUSHION}, + {DECOR_FIRE_CUSHION, _("FIRE CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_FIRE_CUSHION, DecorGfx_FIRE_CUSHION}, + {DECOR_WATER_CUSHION, _("WATER CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_WATER_CUSHION, DecorGfx_WATER_CUSHION}, + {DECOR_SNORLAX_DOLL, _("SNORLAX DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_SNORLAX_DOLL, DecorGfx_SNORLAX_DOLL}, + {DECOR_RHYDON_DOLL, _("RHYDON DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_RHYDON_DOLL, DecorGfx_RHYDON_DOLL}, + {DECOR_LAPRAS_DOLL, _("LAPRAS DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_LAPRAS_DOLL, DecorGfx_LAPRAS_DOLL}, + {DECOR_VENUSAUR_DOLL, _("VENUSAUR DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_VENUSAUR_DOLL, DecorGfx_VENUSAUR_DOLL}, + {DECOR_CHARIZARD_DOLL, _("CHARIZARD DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_CHARIZARD_DOLL, DecorGfx_CHARIZARD_DOLL}, + {DECOR_BLASTOISE_DOLL, _("BLASTOISE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_BLASTOISE_DOLL, DecorGfx_BLASTOISE_DOLL}, + {DECOR_WAILMER_DOLL, _("WAILMER DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_WAILMER_DOLL, DecorGfx_WAILMER_DOLL}, + {DECOR_REGIROCK_DOLL, _("REGIROCK DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGIROCK_DOLL, DecorGfx_REGIROCK_DOLL}, + {DECOR_REGICE_DOLL, _("REGICE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGICE_DOLL, DecorGfx_REGICE_DOLL}, + {DECOR_REGISTEEL_DOLL, _("REGISTEEL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGISTEEL_DOLL, DecorGfx_REGISTEEL_DOLL} +}; +#elif GERMAN +#include "data/decoration/decorations.h" +#endif + +const u8 *const gUnknown_083EC5E4[] = { + SecretBaseText_Desk, + SecretBaseText_Chair, + SecretBaseText_Plant, + SecretBaseText_Ornament, + SecretBaseText_Mat, + SecretBaseText_Poster, + SecretBaseText_Doll, + SecretBaseText_Cushion +}; + +const struct MenuAction2 gUnknown_083EC604[] = { + {SecretBaseText_Decorate, sub_80FF160}, + {SecretBaseText_PutAway, sub_8100A0C}, + {SecretBaseText_Toss, sub_8101700}, + {gUnknownText_Exit, gpu_pal_decompress_alloc_tag_and_upload} +}; + +const u8 *const gUnknown_083EC624[] = { + SecretBaseText_PutOutDecor, + SecretBaseText_StoreChosenDecor, + SecretBaseText_ThrowAwayDecor, + gMenuText_GoBackToPrev +}; + +const struct YesNoFuncTable gUnknown_083EC634[] = { + {sub_80FF5BC, sub_80FF058}, + {sub_81017A0, sub_80FF058}, + {sub_81017A0, sub_80FF058}, + {sub_8109D04, sub_80FF058} +}; + +const u16 gUnknown_083EC654[] = {0x6318, 0x739C, 0x7FFF}; +const u8 gUnknown_083EC65A[] = _("{PALETTE 13}{STR_VAR_1}"); + +const u8 Unknown_3EC660[] = {0, 1, 2, 3}; +const u8 Unknown_3EC664[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13}; +const u8 Unknown_3EC670[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; +const u8 Unknown_3EC680[] = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21}; +const u8 Unknown_3EC68C[] = {0, 1, 2, 3, 4, 5, 6, 7}; +const u8 Unknown_3EC694[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; +const u8 Unknown_3EC6B4[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45}; +const u8 Unknown_3EC6D8[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29}; + +const u8 Unknown_3EC6F0[] = {0, 0, 0, 0}; +const u8 Unknown_3EC6F4[] = {0, 0, 1, 1, 0, 0, 1, 1}; +const u8 Unknown_3EC6FC[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2}; +const u8 Unknown_3EC708[] = {0, 0, 1, 1, 2, 2, 3, 3, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 4, 4, 5, 5, 6, 6, 7, 7}; +const u8 Unknown_3EC728[] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3}; +const u8 Unknown_3EC738[] = {0, 0, 0, 0, 1, 1, 1, 1}; +const u8 Unknown_3EC740[] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2}; +const u8 Unknown_3EC74C[] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3, 4, 4, 5, 5, 4, 4, 5, 5, 6, 6, 7, 7, 6, 6, 7, 7}; +const u8 Unknown_3EC76C[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 6, 6, 7, 7, 8, 8}; +const u8 Unknown_3EC790[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 3, 3, 4, 4, 5, 5}; + +const u8 Unknown_3EC7A8[] = {4, 5, 6, 7}; +const u8 Unknown_3EC7AC[] = {4, 5, 4, 5, 6, 7, 6, 7}; +const u8 Unknown_3EC7B4[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7}; +const u8 Unknown_3EC7C0[] = {4, 5, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 6, 7}; +const u8 Unknown_3EC7E0[] = {4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7}; +const u8 Unknown_3EC7F0[] = {4, 5, 6, 7, 4, 5, 6, 7}; +const u8 Unknown_3EC7F8[] = {4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7}; +const u8 Unknown_3EC804[] = {4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7}; +const u8 Unknown_3EC824[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7}; +const u8 Unknown_3EC848[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7}; + +const struct UnkStruct_803EC860 gUnknown_083EC860[] = { + {Unknown_3EC660, Unknown_3EC6F0, Unknown_3EC7A8, 0x4}, + {Unknown_3EC68C, Unknown_3EC6F4, Unknown_3EC7AC, 0x8}, + {Unknown_3EC664, Unknown_3EC6FC, Unknown_3EC7B4, 0xc}, + {Unknown_3EC694, Unknown_3EC708, Unknown_3EC7C0, 0x20}, + {Unknown_3EC670, Unknown_3EC728, Unknown_3EC7E0, 0x10}, + {Unknown_3EC68C, Unknown_3EC738, Unknown_3EC7F0, 0x8}, + {Unknown_3EC680, Unknown_3EC740, Unknown_3EC7F8, 0xc}, + {Unknown_3EC694, Unknown_3EC74C, Unknown_3EC804, 0x20}, + {Unknown_3EC6B4, Unknown_3EC76C, Unknown_3EC824, 0x24}, + {Unknown_3EC6D8, Unknown_3EC790, Unknown_3EC848, 0x18} +}; + +const struct UnkStruct_083EC900 gUnknown_083EC900[] = { + {0, 1, 0x78, 0x4e}, + {1, 2, 0x80, 0x4e}, + {1, 3, 0x90, 0x56}, + {1, 3, 0x90, 0x46}, + {0, 2, 0x80, 0x46}, + {2, 2, 0x78, 0x46}, + {2, 3, 0x80, 0x56}, + {2, 3, 0x80, 0x36}, + {0, 3, 0x90, 0x46}, + {1, 3, 0x90, 0x46} +}; + +const union AnimCmd gSpriteAnim_83EC928[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 0), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83EC930[] = { + gSpriteAnim_83EC928 +}; + +const struct SpriteFrameImage gSpriteImageTable_83EC934[] = { + {.data = (u8 *)&gUnknown_02038900.image, .size = sizeof gUnknown_02038900.image} +}; + +const struct SpriteTemplate gSpriteTemplate_83EC93C = { + .tileTag = 0xffff, + .paletteTag = 3000, + .oam = &gUnknown_020391AC, + .anims = gSpriteAnimTable_83EC930, + .images = gSpriteImageTable_83EC934, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_81009A8 +}; + +const struct SpritePalette gUnknown_083EC954 = {.data = (u16 *)&gUnknown_02038900.palette, .tag = 3000}; + +const struct YesNoFuncTable gUnknown_083EC95C = {.yesFunc = sub_81000C4, .noFunc = sub_810065C}; +const struct YesNoFuncTable gUnknown_083EC964 = {.yesFunc = sub_810026C, .noFunc = sub_810065C}; +const struct YesNoFuncTable gUnknown_083EC96C[] = { + {.yesFunc = sub_80FFAB0, .noFunc = sub_80FFB08}, + {.yesFunc = sub_8100F88, .noFunc = sub_8100FB4} +}; + +const u8 gUnknown_083EC97C[] = {4, 4, 4, 4, 0, 3, 3, 0}; +const u8 gUnknown_083EC984[] = {4, 4, 4, 4, 0, 4, 3, 0}; + +const u16 gUnknown_083EC98C[] = INCBIN_U16("graphics/unknown/83EC98C.gbapal"); +const u16 Unknown_3EC9AC[] = INCBIN_U16("graphics/unknown/83EC9AC.gbapal"); +const struct YesNoFuncTable gUnknown_083EC9CC = {.yesFunc = sub_810153C, .noFunc = sub_8100EEC}; +const struct YesNoFuncTable gUnknown_083EC9D4 = {.yesFunc = sub_8101590, .noFunc = sub_8100EEC}; +const u32 gSpriteImage_83EC9DC[] = INCBIN_U32("graphics/unknown_sprites/83EC9DC.4bpp"); +const struct SpritePalette gUnknown_083ECA5C = {.data = gUnknown_083EC98C, .tag = 8}; +const struct SpritePalette gUnknown_083ECA64 = {.data = Unknown_3EC9AC, .tag = 8}; +const struct OamData gOamData_83ECA6C = { + .size = 1, .priority = 1 +}; + +const union AnimCmd gSpriteAnim_83ECA74[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 0), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83ECA7C[] = { + gSpriteAnim_83ECA74 +}; + +const struct SpriteFrameImage gSpriteImageTable_83ECA80[] = { + obj_frame_tiles(gSpriteImage_83EC9DC) +}; + +const struct SpriteTemplate gSpriteTemplate_83ECA88 = { + .tileTag = 0xffff, + .paletteTag = 8, + .oam = &gOamData_83ECA6C, + .anims = gSpriteAnimTable_83ECA7C, + .images = gSpriteImageTable_83ECA80, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8101698 +}; + +const struct YesNoFuncTable gUnknown_083ECAA0 = {.yesFunc = sub_8101848, .noFunc = sub_80FED3C}; + +u8 *const unref_label_083ECAA8[] = {ewram}; + +// text + +extern u8 gUnknown_0815F399[]; + +void sub_80FE1DC(void) +{ + sub_80FE2B4(); + MenuDrawTextWindow(0, 0, 10, 9); + PrintMenuItems(1, 1, 4, (const struct MenuAction *)gUnknown_083EC604); + InitMenu(0, 1, 1, 4, gUnknown_020388D4, 9); +} + +void sub_80FE220(void) +{ + gUnknown_020388D4 = 0; + ScriptContext2_Enable(); + sub_80FE1DC(); + sub_80FE394(); +} + +void DecorationPC(u8 taskId) +{ + sub_80FE220(); + gTasks[taskId].func = Task_DecorationPCProcessMenuInput; +} + +void Task_SecretBasePC_Decoration(u8 taskId) +{ + DecorationPC(taskId); + ewram_1f000.items = gSaveBlock1.secretBases[0].decorations; + ewram_1f000.pos = gSaveBlock1.secretBases[0].decorationPos; + ewram_1f000.size = sizeof gSaveBlock1.secretBases[0].decorations; + ewram_1f000.isPlayerRoom = 0; +} + +void DoPlayerPCDecoration(u8 taskId) +{ + DecorationPC(taskId); + ewram_1f000.items = gSaveBlock1.playerRoomDecor; + ewram_1f000.pos = gSaveBlock1.playerRoomDecorPos; + ewram_1f000.size = sizeof gSaveBlock1.playerRoomDecor; + ewram_1f000.isPlayerRoom = 1; +} + +void sub_80FE2B4(void) +{ + u16 palettes[3]; + memcpy(palettes, gUnknown_083EC654, sizeof gUnknown_083EC654); + LoadPalette(&palettes[2], 0xdf, 2); + LoadPalette(&palettes[1], 0xd1, 2); + LoadPalette(&palettes[0], 0xd8, 2); +} + +void Task_DecorationPCProcessMenuInput(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gUnknown_020388D4 = MoveMenuCursor(-1); + sub_80FE394(); + } + if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gUnknown_020388D4 = MoveMenuCursor(1); + sub_80FE394(); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_083EC604[gUnknown_020388D4].func(taskId); + } else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gpu_pal_decompress_alloc_tag_and_upload(taskId); + } + } +} + +void sub_80FE394(void) +{ + MenuFillWindowRectWithBlankTile(2, 15, 27, 18); + MenuPrint(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); + FreeSpritePaletteByTag(6); + if (ewram_1f000.isPlayerRoom == 0) + { + ScriptContext1_SetupScript(gUnknown_0815F399); + DestroyTask(taskId); + } else + { + ReshowPlayerPC(taskId); + } +} + +void sub_80FE418(u8 taskId) +{ + sub_80FE5AC(taskId); +} + +void sub_80FE428(u8 taskId) +{ + InitMenu(0, 1, 1, 4, gUnknown_020388D4, 9); + sub_80FE394(); + gTasks[taskId].func = Task_DecorationPCProcessMenuInput; +} + +void sub_80FE470(u8 decoCat, u8 left, u8 top, u8 palIdx) // PrintDecorationCategorySelectionMenuString +{ + u8 *strptr; + u8 v0; + v0 = sub_8072CBC(); + // PALETTE {palIdx} + strptr = gStringVar4; + strptr[0] = EXT_CTRL_CODE_BEGIN; + strptr[1] = 5; + strptr[2] = palIdx; + strptr += 3; + strptr = StringCopy(strptr, gUnknown_083EC5E4[decoCat]); + strptr = sub_8072C14(strptr, sub_8134194(decoCat), 0x56, 1); + *strptr++ = 0xba; + strptr = sub_8072C14(strptr, gDecorationInventories[decoCat].size, 0x68, 1); + strptr[0] = EXT_CTRL_CODE_BEGIN; + strptr[1] = 5; + strptr[2] = v0; + strptr[3] = EOS; + MenuPrint(gStringVar4, left, top); +} + +void sub_80FE528(u8 taskId) // PrintDecorationCategorySelectionMenuStrings +{ + u8 decoCat; + MenuDrawTextWindow(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) + { + sub_80FE470(decoCat, 1, 2 * decoCat + 1, 13); // Selectable + } else + { + sub_80FE470(decoCat, 1, 2 * decoCat + 1, 255); // Unselectable + } + } + MenuPrint(gUnknownText_Exit, 1, 17); +} + +void sub_80FE5AC(u8 taskId) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 29, 19); + sub_80FE528(taskId); + InitMenu(0, 1, 1, 9, gUnknown_020388F6, 13); + gTasks[taskId].func = sub_80FE604; +} + +void sub_80FE604(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + } else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_020388F6 = GetMenuCursorPos(); + if (gUnknown_020388F6 != 8) + { + gUnknown_020388D5 = sub_8134194(gUnknown_020388F6); + if (gUnknown_020388D5) + { + sub_8134104(gUnknown_020388F6); + gUnknown_020388D0 = gDecorationInventories[gUnknown_020388F6].items; + sub_80FEF50(taskId); + sub_80F944C(); + sub_80F9480(gUnknown_020388F7, 8); + LoadScrollIndicatorPalette(); + gTasks[taskId].func = sub_80FE868; + } else + { + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 14, 19); + DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE418, 0); + } + } else + { + sub_80FE728(taskId); + } + } else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_80FE728(taskId); + } + } +} + +void sub_80FE728(u8 taskId) +{ + if (gTasks[taskId].data[11] != 3) + { + sub_80FE758(taskId); + } else + { + sub_8109DAC(taskId); + } +} + +void sub_80FE758(u8 taskId) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 14, 19); + if (gTasks[taskId].data[11] != 2) + { + sub_80FE1DC(); + MenuDisplayMessageBox(); + sub_80FE394(); + gTasks[taskId].func = Task_DecorationPCProcessMenuInput; + } else + { + sub_80B3068(taskId); + } +} + +void sub_80FE7A8(u8 taskId) +{ + gTasks[taskId].data[11] = 3; + gUnknown_020388F6 = 0; + sub_80FE5AC(taskId); +} + +void sub_80FE7D4(u8 *dest, u8 decClass) +{ + StringCopy(dest, gUnknown_083EC5E4[decClass]); +} + +void sub_80FE7EC(u8 taskId) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 29, 19); + + sub_80FEC94(taskId); + sub_80FECB8(gUnknown_020388F6); + +#if ENGLISH + MenuDrawTextWindow(15, 12, 29, 19); +#elif GERMAN + if ((gUnknown_020388F2 + gUnknown_020388F4) != gUnknown_020388D5) + { + MenuDrawTextWindow(15, 12, 29, 19); + } +#endif + + sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4); + InitMenu(0, 1, 2, gUnknown_020388F3 + 1, gUnknown_020388F2, 13); +} + +void sub_80FE868(u8 taskId) +{ + sub_80FE7EC(taskId); + gTasks[taskId].func = sub_80FE948; +} + +void sub_80FE894(u8 taskId /*r8*/, s8 cursorVector /*r5*/, s8 bgVector /*r7*/) +{ + int v0 /*r10*/; + u8 v1; + v0 = gUnknown_020388F2 + gUnknown_020388F4 == gUnknown_020388D5; + PlaySE(SE_SELECT); + if (cursorVector != 0) + { + gUnknown_020388F2 = MoveMenuCursor(cursorVector); + } + if (bgVector != 0) + { + v1 = gUnknown_020388F4; + gUnknown_020388F4 = v1 + bgVector; + sub_80FEABC(taskId, 1); + } + if (gUnknown_020388F2 + gUnknown_020388F4 != gUnknown_020388D5) + { + if (v0) + { + MenuDrawTextWindow(15, 12, 29, 19); + } + sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4); + } else + { + MenuZeroFillWindowRect(15, 12, 29, 19); + } +} + +void sub_80FE948(u8 taskId) +{ + if (!gPaletteFade.active) + { + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) + { + if (gUnknown_020388F2 != 0) + { + sub_80FE894(taskId, -1, 0); + } else if (gUnknown_020388F4 != 0) + { + sub_80FE894(taskId, 0, -1); + } + } + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) + { + if (gUnknown_020388F2 != gUnknown_020388F3) + { + sub_80FE894(taskId, 1, 0); + } else if (gUnknown_020388F4 + gUnknown_020388F2 != gUnknown_020388D5) + { + sub_80FE894(taskId, 0, 1); + } + } + if (gMain.newKeys & A_BUTTON) + { + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + gUnknown_020388F5 = gUnknown_020388F2 + gUnknown_020388F4; + if (gUnknown_020388F5 == gUnknown_020388D5) + { + gUnknown_083EC634[gTasks[taskId].data[11]].noFunc(taskId); + } else + { + gUnknown_083EC634[gTasks[taskId].data[11]].yesFunc(taskId); + } + } else if (gMain.newKeys & B_BUTTON) + { + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + gUnknown_083EC634[gTasks[taskId].data[11]].noFunc(taskId); + } + } +} + +void sub_80FEABC(u8 taskId, u8 dummy1) +{ + u16 i; + u16 j; + u8 ni; + if (gUnknown_020388F4 != 0 || (DestroyVerticalScrollIndicator(0), gUnknown_020388F4 != 0)) + { + CreateVerticalScrollIndicators(0, 0x3c, 0x08); + } + if (gUnknown_020388F4 + 7 == gUnknown_020388D5) + { + DestroyVerticalScrollIndicator(1); + } + if (gUnknown_020388F4 + 7 < gUnknown_020388D5) + { + CreateVerticalScrollIndicators(1, 0x3c, 0x98); + } + for (i=gUnknown_020388F4; i gUnknown_020388D5 && gUnknown_020388F4 != 0) + { + gUnknown_020388F4--; + } + sub_8134104(gUnknown_020388F6); + sub_80FED90(taskId); + sub_80FEF28(); +} + +void sub_80FF0E0(u8 taskId) +{ + gTasks[taskId].data[3] = gSaveBlock1.pos.x; + gTasks[taskId].data[4] = gSaveBlock1.pos.y; + PlayerGetDestCoords(&gTasks[taskId].data[0], &gTasks[taskId].data[1]); +} + +void sub_80FF114(u8 taskId) +{ + DrawWholeMapView(); + warp1_set(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]); + warp_in(); +} +void sub_80FF160(u8 taskId) +{ + if (!sub_81341D4()) + { + DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE428, 0); + } else + { + gTasks[taskId].data[11] = 0; + gUnknown_020388F6 = 0; + sub_80FE5AC(taskId); + } +} + +u16 sub_80FF1B0(u8 decoId, u8 a1) +{ + u16 retval; + retval = 0xffff; + + switch (decoId) + { + case DECOR_STAND: + retval = gUnknown_083EC97C[a1] << 12; + return retval; + case DECOR_SLIDE: + retval = gUnknown_083EC984[a1] << 12; + return retval; + default: + return retval; + } +} + +void sub_80FF1EC(u16 mapX, u16 mapY, u8 decWidth, u8 decHeight, u16 decIdx) +{ + u16 i; + u16 j; // r10 + u16 behavior; + u16 flags; // r8 + u16 v0; + u16 v1; + s16 x; + s16 decBottom; + + for (i=0; i> 12))) + { + flags = 0xc00; + } else + { + flags = 0x000; + } + if (gDecorations[decIdx].permission != DECORPERM_NA_WALL && sub_80572B0(MapGridGetMetatileBehaviorAt(x, decBottom)) == 1) + { + v0 = 1; + } else + { + v0 = 0; + } + v1 = sub_80FF1B0(gDecorations[decIdx].id, i * decWidth + j); + if (v1 != 0xffff) + { + MapGridSetMetatileEntryAt(x, decBottom, (gDecorations[decIdx].tiles[i * decWidth + j] + (0x200 | v0)) | flags | v1); + } else + { + MapGridSetMetatileIdAt(x, decBottom, (gDecorations[decIdx].tiles[i * decWidth + j] + (0x200 | v0)) | flags); + } + } + } +} + +void sub_80FF394(u16 mapX, u16 mapY, u16 decIdx) +{ + switch (gDecorations[decIdx].shape) + { + case DECORSHAPE_1x1: + sub_80FF1EC(mapX, mapY, 1, 1, decIdx); + break; + case DECORSHAPE_2x1: + sub_80FF1EC(mapX, mapY, 2, 1, decIdx); + break; + case DECORSHAPE_3x1: // unused + sub_80FF1EC(mapX, mapY, 3, 1, decIdx); + break; + case DECORSHAPE_4x2: + sub_80FF1EC(mapX, mapY, 4, 2, decIdx); + break; + case DECORSHAPE_2x2: + sub_80FF1EC(mapX, mapY, 2, 2, decIdx); + break; + case DECORSHAPE_1x2: + sub_80FF1EC(mapX, mapY, 1, 2, decIdx); + break; + case DECORSHAPE_1x3: // unused + sub_80FF1EC(mapX, mapY, 1, 3, decIdx); + break; + case DECORSHAPE_2x4: + sub_80FF1EC(mapX, mapY, 2, 4, decIdx); + break; + case DECORSHAPE_3x3: + sub_80FF1EC(mapX, mapY, 3, 3, decIdx); + break; + case DECORSHAPE_3x2: + sub_80FF1EC(mapX, mapY, 3, 2, decIdx); + break; + } +} + +void sub_80FF474(void) +{ + u8 i; + u8 j; + for (i=0; i<14; i++) + { + if (FlagGet(i + 0xae) == 1) + { + FlagReset(i + 0xae); + for (j=0; jmapObjectCount; j++) + { + if (gMapHeader.events->mapObjects[j].flagId == i + 0xae) + { + break; + } + } + VarSet(0x3f20 + gMapHeader.events->mapObjects[j].graphicsId, gUnknown_02038900.decoration->tiles[0]); + gSpecialVar_0x8005 = gMapHeader.events->mapObjects[j].localId; + gSpecialVar_0x8006 = gUnknown_020391A4; + gSpecialVar_0x8007 = gUnknown_020391A6; + show_sprite(gSpecialVar_0x8005, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + sub_805C0F8(gSpecialVar_0x8005, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); + sub_805C78C(gSpecialVar_0x8005, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + break; + } + } +} + +bool8 sub_80FF58C/*IsThereRoomForMoreDecorations*/(void) +{ + u16 i; + for (i=0; idecoration = &gDecorations[decoIdx]; + if (gDecorations[decoIdx].permission != DECORPERM_SOLID_MAT) + { + sub_81008BC(unk_02038900); + sub_8100930(unk_02038900->decoration->shape); + sub_8100874(unk_02038900); + sub_810070C(unk_02038900->palette, ((u16 *)gMapHeader.mapData->secondaryTileset->metatiles + 8 * unk_02038900->decoration->tiles[0])[7] >> 12); + LoadSpritePalette(&gUnknown_083EC954); + gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data0; + gUnknown_03004880.unk4 = CreateSprite(&gSpriteTemplate_83EC93C, gUnknown_083EC900[unk_02038900->decoration->shape].x, gUnknown_083EC900[unk_02038900->decoration->shape].y, 0); + } else + { + gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data0; + gUnknown_03004880.unk4 = AddPseudoFieldObject(unk_02038900->decoration->tiles[0], sub_81009A8, gUnknown_083EC900[unk_02038900->decoration->shape].x, gUnknown_083EC900[unk_02038900->decoration->shape].y, 1); + gSprites[gUnknown_03004880.unk4].oam.priority = 1; + } +} + +void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct UnkStruct_02038900 *unk_02038900) +{ + u8 v0; + v0 = 16 * (u8)gTasks[taskId].data[5] + gUnknown_083EC900[unk_02038900->decoration->shape].x - 8 * ((u8)gTasks[taskId].data[5] - 1); + if (unk_02038900->decoration->shape == DECORSHAPE_3x1 || unk_02038900->decoration->shape == DECORSHAPE_3x3 || unk_02038900->decoration->shape == DECORSHAPE_3x2) + { + v0 -= 8; + } + if (gSaveBlock2.playerGender == MALE) + { + gUnknown_020391A9 = AddPseudoFieldObject(0xc1, SpriteCallbackDummy, v0, 0x48, 0); + } else + { + gUnknown_020391A9 = AddPseudoFieldObject(0xc2, SpriteCallbackDummy, v0, 0x48, 0); + } + gSprites[gUnknown_020391A9].oam.priority = 1; + DestroySprite(&gSprites[gUnknown_020391A8]); + gUnknown_020391A8 = gUnknown_03004880.unk4; +} + +void sub_80FF960(u8 taskId) +{ + switch (gDecorations[gUnknown_020388D0[gUnknown_020388F5]].shape) + { + case DECORSHAPE_1x1: + gTasks[taskId].data[5] = 1; + gTasks[taskId].data[6] = 1; + break; + case DECORSHAPE_2x1: + gTasks[taskId].data[5] = 2; + gTasks[taskId].data[6] = 1; + break; + case DECORSHAPE_3x1: + gTasks[taskId].data[5] = 3; + gTasks[taskId].data[6] = 1; + break; + case DECORSHAPE_4x2: + gTasks[taskId].data[5] = 4; + gTasks[taskId].data[6] = 2; + break; + case DECORSHAPE_2x2: + gTasks[taskId].data[5] = 2; + gTasks[taskId].data[6] = 2; + break; + case DECORSHAPE_1x2: + gTasks[taskId].data[5] = 1; + gTasks[taskId].data[6] = 2; + break; + case DECORSHAPE_1x3: + gTasks[taskId].data[5] = 1; + gTasks[taskId].data[6] = 3; + gTasks[taskId].data[1]++; + break; + case DECORSHAPE_2x4: + gTasks[taskId].data[5] = 2; + gTasks[taskId].data[6] = 4; + break; + case DECORSHAPE_3x3: + gTasks[taskId].data[5] = 3; + gTasks[taskId].data[6] = 3; + break; + case DECORSHAPE_3x2: + gTasks[taskId].data[5] = 3; + gTasks[taskId].data[6] = 2; + break; + } +} + +void sub_80FFAB0(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + gSprites[gUnknown_020391A8].data7 = 1; + gSprites[gUnknown_020391A9].data7 = 1; + sub_810045C(); + sub_8100038(taskId); +} + +void sub_80FFB08(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + gSprites[gUnknown_020391A8].data7 = 1; + gSprites[gUnknown_020391A9].data7 = 1; + sub_810045C(); + DisplayItemMessageOnField(taskId, gSecretBaseText_CancelDecorating, sub_8100248, 0); +} + +bool8 sub_80FFB6C(u8 a0, u16 a1) +{ + if (sub_8057274(a0) != 1 || a1 != 0) + { + return FALSE; + } + return TRUE; +} + +bool8 sub_80FFB94(u8 taskId, s16 x, s16 y, u16 decoId) +{ + if (x == gTasks[taskId].data[3] + 7 && y == gTasks[taskId].data[4] + 7 && decoId != 0) + { + return FALSE; + } + return TRUE; +} + +bool8 sub_80FFBDC(u16 a0, const struct Decoration *decoration) +{ + if (sub_8057274(a0) != 1) + { + if (decoration->id == DECOR_SOLID_BOARD && sub_8057300(a0) == 1) + { + return TRUE; + } + if (sub_805729C(a0)) + { + return TRUE; + } + } + return FALSE; +} + +// When behaviorBy is set, it is masked by 0xf000. This is the step that fails to match when built. +#ifdef NONMATCHING +bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration) +{ + u8 i; + u8 j; + u8 behaviorAt; + u16 behaviorBy; + u8 mapY; + u8 mapX; + s16 curY; + s16 curX; + mapY = gTasks[taskId].data[6]; + mapX = gTasks[taskId].data[5]; + switch (decoration->permission) + { + case DECORPERM_SOLID_FLOOR: + case DECORPERM_PASS_FLOOR: + for (i=0; itiles[(mapY - 1 - i) * mapX + j]) & 0xf000; + if (!sub_80FFBDC(behaviorAt, decoration)) + { + return FALSE; + } + if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) + { + return FALSE; + } + behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0); + if (behaviorAt != 0 && behaviorAt != 16) + { + return FALSE; + } + } + } + break; + case DECORPERM_BEHIND_FLOOR: + for (i=0; itiles[(mapY - 1 - i) * mapX + j]) & 0xf000; + if (!sub_805729C(behaviorAt) && !sub_80FFB6C(behaviorAt, behaviorBy)) + { + return FALSE; + } + if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) + { + return FALSE; + } + if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16) + { + return FALSE; + } + } + } + curY = gTasks[taskId].data[1] - mapY + 1; + for (j=0; jtiles[j]) & 0xf000; + if (!sub_805729C(behaviorAt) && !sub_80572B0(behaviorAt)) + { + return FALSE; + } + if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) + { + return FALSE; + } + behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0); + if (behaviorAt != 0 && behaviorAt != 16) + { + return FALSE; + } + } + break; + case DECORPERM_NA_WALL: + for (i=0; ishape == DECORSHAPE_1x2) + { + if (!sub_80572EC(behaviorAt)) + { + return FALSE; + } + } + else if (!sub_80572D8(behaviorAt)) + { + if (!sub_80572EC(behaviorAt)) + { + return FALSE; + } + } + if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16) + { + return FALSE; + } + } + break; + } + return TRUE; +} +#else +__attribute__((naked)) +bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration) +{ + asm(".syntax unified\n" + "\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x24\n" + "\tstr r1, [sp]\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r10, r0\n" + "\tldr r1, _080FFC60 @ =gTasks\n" + "\tlsls r0, 2\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tadds r0, r1\n" + "\tldrb r2, [r0, 0x14]\n" + "\tstr r2, [sp, 0x4]\n" + "\tldrb r0, [r0, 0x12]\n" + "\tstr r0, [sp, 0x8]\n" + "\tldr r3, [sp]\n" + "\tldrb r0, [r3, 0x11]\n" + "\tadds r2, r1, 0\n" + "\tcmp r0, 0x4\n" + "\tbls _080FFC56\n" + "\tb _08100024\n" + "_080FFC56:\n" + "\tlsls r0, 2\n" + "\tldr r1, _080FFC64 @ =_080FFC68\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_080FFC60: .4byte gTasks\n" + "_080FFC64: .4byte _080FFC68\n" + "\t.align 2, 0\n" + "_080FFC68:\n" + "\t.4byte _080FFC7C\n" + "\t.4byte _080FFC7C\n" + "\t.4byte _080FFD68\n" + "\t.4byte _080FFF1C\n" + "\t.4byte _080FFFA0\n" + "_080FFC7C:\n" + "\tmovs r6, 0\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r6, r0\n" + "\tbcc _080FFC86\n" + "\tb _08100024\n" + "_080FFC86:\n" + "\tmov r1, r10\n" + "\tlsls r1, 2\n" + "\tstr r1, [sp, 0x1C]\n" + "_080FFC8C:\n" + "\tmov r2, r10\n" + "\tlsls r0, r2, 2\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tldr r3, _080FFD64 @ =gTasks\n" + "\tadds r0, r3\n" + "\tldrh r0, [r0, 0xA]\n" + "\tsubs r0, r6\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r9, r0\n" + "\tmovs r7, 0\n" + "\tadds r6, 0x1\n" + "\tstr r6, [sp, 0x14]\n" + "\tldr r0, [sp, 0x8]\n" + "\tcmp r7, r0\n" + "\tbcs _080FFD56\n" + "\tmov r1, r9\n" + "\tlsls r1, 16\n" + "\tstr r1, [sp, 0xC]\n" + "\tasrs r1, 16\n" + "\tmov r9, r1\n" + "_080FFCB8:\n" + "\tldr r0, [sp, 0x1C]\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tldr r2, _080FFD64 @ =gTasks\n" + "\tadds r0, r2\n" + "\tldrh r0, [r0, 0x8]\n" + "\tadds r0, r7\n" + "\tlsls r0, 16\n" + "\tmov r8, r0\n" + "\tasrs r6, r0, 16\n" + "\tadds r0, r6, 0\n" + "\tmov r1, r9\n" + "\tbl MapGridGetMetatileBehaviorAt\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tldr r3, [sp, 0x4]\n" + "\tldr r1, [sp, 0x14]\n" + "\tsubs r0, r3, r1\n" + "\tldr r2, [sp, 0x8]\n" + "\tadds r1, r0, 0\n" + "\tmuls r1, r2\n" + "\tadds r1, r7\n" + "\tldr r3, [sp]\n" + "\tldr r0, [r3, 0x1C]\n" + "\tlsls r1, 1\n" + "\tadds r1, r0\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 2\n" + "\tadds r0, r2, 0\n" + "\tldrh r1, [r1]\n" + "\tadds r0, r1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tbl GetBehaviorByMetatileId\n" + "\tmovs r3, 0xF0\n" + "\tlsls r3, 8\n" + "\tadds r1, r3, 0\n" + "\tadds r5, r1, 0\n" + "\tands r5, r0\n" + "\tadds r0, r4, 0\n" + "\tldr r1, [sp]\n" + "\tbl sub_80FFBDC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFD1A\n" + "\tb _080FFFF4\n" + "_080FFD1A:\n" + "\tmov r0, r10\n" + "\tadds r1, r6, 0\n" + "\tmov r2, r9\n" + "\tadds r3, r5, 0\n" + "\tbl sub_80FFB94\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFD2E\n" + "\tb _080FFFF4\n" + "_080FFD2E:\n" + "\tmov r1, r8\n" + "\tlsrs r0, r1, 16\n" + "\tldr r2, [sp, 0xC]\n" + "\tlsrs r1, r2, 16\n" + "\tmovs r2, 0\n" + "\tbl GetFieldObjectIdByXYZ\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tcmp r4, 0\n" + "\tbeq _080FFD4A\n" + "\tcmp r4, 0x10\n" + "\tbeq _080FFD4A\n" + "\tb _080FFFF4\n" + "_080FFD4A:\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcc _080FFCB8\n" + "_080FFD56:\n" + "\tldr r1, [sp, 0x14]\n" + "\tlsls r0, r1, 24\n" + "\tlsrs r6, r0, 24\n" + "\tldr r2, [sp, 0x4]\n" + "\tcmp r6, r2\n" + "\tbcc _080FFC8C\n" + "\tb _08100024\n" + "\t.align 2, 0\n" + "_080FFD64: .4byte gTasks\n" + "_080FFD68:\n" + "\tmovs r6, 0\n" + "\tmov r3, r10\n" + "\tlsls r3, 2\n" + "\tstr r3, [sp, 0x1C]\n" + "\tldr r0, [sp, 0x4]\n" + "\tsubs r0, 0x1\n" + "\tstr r0, [sp, 0x18]\n" + "\tcmp r6, r0\n" + "\tbge _080FFE54\n" + "\tadds r0, r3, 0\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tstr r0, [sp, 0x10]\n" + "_080FFD82:\n" + "\tldr r1, [sp, 0x10]\n" + "\tadds r0, r1, r2\n" + "\tldrh r0, [r0, 0xA]\n" + "\tsubs r0, r6\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r9, r0\n" + "\tmovs r7, 0\n" + "\tadds r6, 0x1\n" + "\tstr r6, [sp, 0x14]\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcs _080FFE48\n" + "\tlsls r0, 16\n" + "\tstr r0, [sp, 0x20]\n" + "_080FFDA0:\n" + "\tldr r1, [sp, 0x10]\n" + "\tadds r0, r1, r2\n" + "\tldrh r0, [r0, 0x8]\n" + "\tadds r0, r7\n" + "\tlsls r0, 16\n" + "\tmov r8, r0\n" + "\tasrs r6, r0, 16\n" + "\tmov r2, r9\n" + "\tlsls r1, r2, 16\n" + "\tadds r0, r6, 0\n" + "\tasrs r1, 16\n" + "\tbl MapGridGetMetatileBehaviorAt\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tldr r3, [sp, 0x4]\n" + "\tldr r1, [sp, 0x14]\n" + "\tsubs r0, r3, r1\n" + "\tldr r2, [sp, 0x8]\n" + "\tadds r1, r0, 0\n" + "\tmuls r1, r2\n" + "\tadds r1, r7\n" + "\tldr r3, [sp]\n" + "\tldr r0, [r3, 0x1C]\n" + "\tlsls r1, 1\n" + "\tadds r1, r0\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 2\n" + "\tadds r0, r2, 0\n" + "\tldrh r1, [r1]\n" + "\tadds r0, r1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tbl GetBehaviorByMetatileId\n" + "\tmovs r3, 0xF0\n" + "\tlsls r3, 8\n" + "\tadds r1, r3, 0\n" + "\tadds r5, r1, 0\n" + "\tands r5, r0\n" + "\tadds r0, r4, 0\n" + "\tbl sub_805729C\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFE0C\n" + "\tadds r0, r4, 0\n" + "\tadds r1, r5, 0\n" + "\tbl sub_80FFB6C\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFE0C\n" + "\tb _080FFFF4\n" + "_080FFE0C:\n" + "\tmov r0, r10\n" + "\tadds r1, r6, 0\n" + "\tldr r3, [sp, 0x20]\n" + "\tasrs r2, r3, 16\n" + "\tadds r3, r5, 0\n" + "\tbl sub_80FFB94\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFE22\n" + "\tb _080FFFF4\n" + "_080FFE22:\n" + "\tmov r1, r8\n" + "\tlsrs r0, r1, 16\n" + "\tldr r2, [sp, 0x20]\n" + "\tlsrs r1, r2, 16\n" + "\tmovs r2, 0\n" + "\tbl GetFieldObjectIdByXYZ\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x10\n" + "\tbeq _080FFE3A\n" + "\tb _080FFFF4\n" + "_080FFE3A:\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tldr r2, _080FFF18 @ =gTasks\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcc _080FFDA0\n" + "_080FFE48:\n" + "\tldr r1, [sp, 0x14]\n" + "\tlsls r0, r1, 24\n" + "\tlsrs r6, r0, 24\n" + "\tldr r3, [sp, 0x18]\n" + "\tcmp r6, r3\n" + "\tblt _080FFD82\n" + "_080FFE54:\n" + "\tldr r0, [sp, 0x1C]\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tadds r0, r2\n" + "\tldrh r0, [r0, 0xA]\n" + "\tldr r1, [sp, 0x4]\n" + "\tsubs r0, r1\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r9, r0\n" + "\tmovs r7, 0\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcc _080FFE74\n" + "\tb _08100024\n" + "_080FFE74:\n" + "\tlsls r0, 16\n" + "\tstr r0, [sp, 0x20]\n" + "_080FFE78:\n" + "\tldr r0, [sp, 0x1C]\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tldr r1, _080FFF18 @ =gTasks\n" + "\tadds r0, r1\n" + "\tldrh r0, [r0, 0x8]\n" + "\tadds r0, r7\n" + "\tlsls r0, 16\n" + "\tmov r8, r0\n" + "\tasrs r6, r0, 16\n" + "\tmov r2, r9\n" + "\tlsls r1, r2, 16\n" + "\tadds r0, r6, 0\n" + "\tasrs r1, 16\n" + "\tbl MapGridGetMetatileBehaviorAt\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tldr r3, [sp]\n" + "\tldr r0, [r3, 0x1C]\n" + "\tlsls r1, r7, 1\n" + "\tadds r1, r0\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 2\n" + "\tadds r0, r2, 0\n" + "\tldrh r1, [r1]\n" + "\tadds r0, r1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tbl GetBehaviorByMetatileId\n" + "\tmovs r3, 0xF0\n" + "\tlsls r3, 8\n" + "\tadds r1, r3, 0\n" + "\tadds r5, r1, 0\n" + "\tands r5, r0\n" + "\tadds r0, r4, 0\n" + "\tbl sub_805729C\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFEDA\n" + "\tadds r0, r4, 0\n" + "\tbl sub_80572B0\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFEDA\n" + "\tb _080FFFF4\n" + "_080FFEDA:\n" + "\tmov r0, r10\n" + "\tadds r1, r6, 0\n" + "\tldr r3, [sp, 0x20]\n" + "\tasrs r2, r3, 16\n" + "\tadds r3, r5, 0\n" + "\tbl sub_80FFB94\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFEF0\n" + "\tb _080FFFF4\n" + "_080FFEF0:\n" + "\tmov r1, r8\n" + "\tlsrs r0, r1, 16\n" + "\tldr r2, [sp, 0x20]\n" + "\tlsrs r1, r2, 16\n" + "\tmovs r2, 0\n" + "\tbl GetFieldObjectIdByXYZ\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tcmp r4, 0\n" + "\tbeq _080FFF0A\n" + "\tcmp r4, 0x10\n" + "\tbne _080FFFF4\n" + "_080FFF0A:\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcc _080FFE78\n" + "\tb _08100024\n" + "\t.align 2, 0\n" + "_080FFF18: .4byte gTasks\n" + "_080FFF1C:\n" + "\tmovs r6, 0\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r6, r0\n" + "\tbcc _080FFF26\n" + "\tb _08100024\n" + "_080FFF26:\n" + "\tmov r1, r10\n" + "\tlsls r0, r1, 2\n" + "\tadd r0, r10\n" + "\tlsls r1, r0, 3\n" + "\tldr r2, _080FFF9C @ =gTasks\n" + "\tadds r0, r1, r2\n" + "\tldrh r0, [r0, 0xA]\n" + "\tsubs r0, r6\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r9, r0\n" + "\tmovs r7, 0\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcs _080FFF8C\n" + "\tadds r0, r2, 0\n" + "\tadds r1, r0\n" + "\tmov r8, r1\n" + "\tmov r1, r9\n" + "\tlsls r0, r1, 16\n" + "\tasrs r5, r0, 16\n" + "_080FFF50:\n" + "\tmov r2, r8\n" + "\tldrh r0, [r2, 0x8]\n" + "\tadds r0, r7\n" + "\tlsls r0, 16\n" + "\tasrs r4, r0, 16\n" + "\tadds r0, r4, 0\n" + "\tadds r1, r5, 0\n" + "\tbl MapGridGetMetatileBehaviorAt\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tbl sub_80572B0\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _080FFFF4\n" + "\tadds r0, r4, 0\n" + "\tadds r1, r5, 0x1\n" + "\tbl MapGridGetMetatileIdAt\n" + "\tmovs r1, 0xA3\n" + "\tlsls r1, 2\n" + "\tcmp r0, r1\n" + "\tbeq _080FFFF4\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcc _080FFF50\n" + "_080FFF8C:\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r6, r0\n" + "\tbcc _080FFF26\n" + "\tb _08100024\n" + "\t.align 2, 0\n" + "_080FFF9C: .4byte gTasks\n" + "_080FFFA0:\n" + "\tmov r3, r10\n" + "\tlsls r1, r3, 2\n" + "\tadds r0, r1, r3\n" + "\tlsls r0, 3\n" + "\tadds r0, r2\n" + "\tldrh r0, [r0, 0xA]\n" + "\tmov r9, r0\n" + "\tmovs r7, 0\n" + "\tstr r1, [sp, 0x1C]\n" + "\tldr r0, [sp, 0x8]\n" + "\tcmp r7, r0\n" + "\tbcs _08100024\n" + "\tadds r6, r2, 0\n" + "\tmov r1, r9\n" + "\tlsls r1, 16\n" + "\tstr r1, [sp, 0x20]\n" + "_080FFFC0:\n" + "\tldr r0, [sp, 0x1C]\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tadds r0, r6\n" + "\tldrh r0, [r0, 0x8]\n" + "\tadds r0, r7\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tasrs r0, 16\n" + "\tmov r2, r9\n" + "\tlsls r1, r2, 16\n" + "\tasrs r1, 16\n" + "\tbl MapGridGetMetatileBehaviorAt\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tldr r3, [sp]\n" + "\tldrb r0, [r3, 0x12]\n" + "\tcmp r0, 0x5\n" + "\tbne _080FFFF8\n" + "_080FFFE8:\n" + "\tadds r0, r4, 0\n" + "\tbl sub_80572EC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _08100004\n" + "_080FFFF4:\n" + "\tmovs r0, 0\n" + "\tb _08100026\n" + "_080FFFF8:\n" + "\tadds r0, r4, 0\n" + "\tbl sub_80572D8\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _080FFFE8\n" + "_08100004:\n" + "\tadds r0, r5, 0\n" + "\tldr r2, [sp, 0x20]\n" + "\tlsrs r1, r2, 16\n" + "\tmovs r2, 0\n" + "\tbl GetFieldObjectIdByXYZ\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x10\n" + "\tbne _080FFFF4\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcc _080FFFC0\n" + "_08100024:\n" + "\tmovs r0, 0x1\n" + "_08100026:\n" + "\tadd sp, 0x24\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + ".syntax divided\n"); +} +#endif + +void sub_8100038(u8 taskId) +{ + if (sub_80FFC24(taskId, &gDecorations[gUnknown_020388D0[gUnknown_020388F5]]) == 1) + { + DisplayItemMessageOnField(taskId, gSecretBaseText_PlaceItHere, sub_81000A0, 0); + } else + { + PlaySE(SE_HAZURE); + DisplayItemMessageOnField(taskId, gSecretBaseText_CantBePlacedHere, sub_81006A8, 0); + } +} + +void sub_81000A0(u8 taskId) +{ + DisplayYesNoMenu(20, 8, 1); + DoYesNoFuncWithChoice(taskId, &gUnknown_083EC95C); +} + +void sub_81000C4(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0, 29, 19); + sub_8100174(taskId); + if (gDecorations[gUnknown_020388D0[gUnknown_020388F5]].permission != DECORPERM_SOLID_MAT) + { + sub_80FF394(gTasks[taskId].data[0], gTasks[taskId].data[1], gUnknown_020388D0[gUnknown_020388F5]); + } else + { + gUnknown_020391A4 = gTasks[taskId].data[0] - 7; + gUnknown_020391A6 = gTasks[taskId].data[1] - 7; + ScriptContext1_SetupScript(gUnknown_081A2F7B); + } + gSprites[gUnknown_020391A8].pos1.y += 2; + sub_810028C(taskId); +} + +void sub_8100174(u8 taskId) +{ + u16 i; + for (i=0; i= gMapHeader.mapData->height) + { + data[1]--; + return FALSE; + } else if (gUnknown_020391AA == DIR_WEST && data[0] - 7 < 0) + { + data[0]++; + return FALSE; + } else if (gUnknown_020391AA == DIR_EAST && data[0] + data[5] - 8 >= gMapHeader.mapData->width) + { + data[0]--; + return FALSE; + } + return TRUE; +} + +bool8 sub_8100430(void) +{ + if ((gMain.heldKeys & DPAD_ANY) != DPAD_UP && (gMain.heldKeys & DPAD_ANY) != DPAD_DOWN && (gMain.heldKeys & DPAD_ANY) != DPAD_LEFT && (gMain.heldKeys & DPAD_ANY) != DPAD_RIGHT) + { + return FALSE; + } + return TRUE; +} + +void sub_810045C(void) +{ + gUnknown_020391AA = 0; + gSprites[gUnknown_020391A8].data2 = 0; + gSprites[gUnknown_020391A8].data3 = 0; +} + +void sub_8100494(u8 taskId) +{ + if (!gSprites[gUnknown_020391A8].data4) + { + if (gTasks[taskId].data[10] == 1) + { + gUnknown_083EC96C[gTasks[taskId].data[12]].yesFunc(taskId); + return; + } else if (gTasks[taskId].data[10] == 2) + { + gUnknown_083EC96C[gTasks[taskId].data[12]].noFunc(taskId); + return; + } + if ((gMain.heldKeys & DPAD_ANY) == DPAD_UP) + { + gUnknown_020391AA = DIR_SOUTH; + gSprites[gUnknown_020391A8].data2 = 0; + gSprites[gUnknown_020391A8].data3 = -2; + gTasks[taskId].data[1]--; + } + if ((gMain.heldKeys & DPAD_ANY) == DPAD_DOWN) + { + gUnknown_020391AA = DIR_NORTH; + gSprites[gUnknown_020391A8].data2 = 0; + gSprites[gUnknown_020391A8].data3 = 2; + gTasks[taskId].data[1]++; + } + if ((gMain.heldKeys & DPAD_ANY) == DPAD_LEFT) + { + gUnknown_020391AA = DIR_WEST; + gSprites[gUnknown_020391A8].data2 = -2; + gSprites[gUnknown_020391A8].data3 = 0; + gTasks[taskId].data[0]--; + } + if ((gMain.heldKeys & DPAD_ANY) == DPAD_RIGHT) + { + gUnknown_020391AA = DIR_EAST; + gSprites[gUnknown_020391A8].data2 = 2; + gSprites[gUnknown_020391A8].data3 = 0; + gTasks[taskId].data[0]++; + } + if (!sub_8100430() || !sub_810038C(taskId)) + { + sub_810045C(); + } + } + if (gUnknown_020391AA) + { + gSprites[gUnknown_020391A8].data4++; + gSprites[gUnknown_020391A8].data4 &= 7; + } + if (!gTasks[taskId].data[10]) + { + if (gMain.newKeys & A_BUTTON) + { + gTasks[taskId].data[10] = A_BUTTON; + } + if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].data[10] = B_BUTTON; + } + } +} + +void sub_810065C(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0, 29, 19); + gSprites[gUnknown_020391A8].data7 = 0; + gTasks[taskId].data[10] = 0; + gTasks[taskId].func = sub_8100494; +} + +void sub_81006A8(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + sub_810065C(taskId); + } +} + +void sub_81006D0(struct UnkStruct_02038900 *unk_02038900) +{ + u16 i; + for (i=0; i<0x800; i++) + { + unk_02038900->image[i] = 0; + } + for (i=0; i<0x40; i++) + { + unk_02038900->tiles[i] = 0; + } +} + +void sub_810070C(u16 *a0, u16 a1) +{ + u16 i; + for (i=0; i<16; i++) + { + a0[i] = ((u16 *)gMapHeader.mapData->primaryTileset->palettes)[16 * a1 + i]; + } +} + +void sub_8100740(u8 *dest, u16 flags) +{ + u8 buffer[32]; + u16 mode; + u16 i; + mode = flags >> 10; + if (flags != 0) + { + flags &= 0x3ff; + } + for (i=0; i<32; i++) + { + buffer[i] = ((u8 *)gMapHeader.mapData->primaryTileset->tiles)[flags * 32 + i]; + } + switch (mode) + { + case 0: + for (i=0; i<32; i++) + { + dest[i] = buffer[i]; + } + break; + case 1: + for (i=0; i<8; i++) + { + dest[4*i] = (buffer[4*(i+1) - 1] >> 4) + ((buffer[4*(i+1) - 1] & 0xf) << 4); + dest[4*i + 1] = (buffer[4*(i+1) - 2] >> 4) + ((buffer[4*(i+1) - 2] & 0xf) << 4); + dest[4*i + 2] = (buffer[4*(i+1) - 3] >> 4) + ((buffer[4*(i+1) - 3] & 0xf) << 4); + dest[4*i + 3] = (buffer[4*(i+1) - 4] >> 4) + ((buffer[4*(i+1) - 4] & 0xf) << 4); + } + break; + case 2: + for (i=0; i<8; i++) + { + dest[4*i] = buffer[4*(7-i)]; + dest[4*i + 1] = buffer[4*(7-i) + 1]; + dest[4*i + 2] = buffer[4*(7-i) + 2]; + dest[4*i + 3] = buffer[4*(7-i) + 3]; + } + break; + case 3: + for (i=0; i<32; i++) + { + dest[i] = (buffer[31-i] >> 4) + ((buffer[31-i] & 0xf) << 4); + } + break; + } +} + +void sub_8100874(struct UnkStruct_02038900 *unk_02038900) +{ + u16 i; + for (i=0; i<0x40; i++) + sub_8100740(&unk_02038900->image[i * 32], unk_02038900->tiles[i]); +} + +u16 sub_810089C(u16 a0) +{ + return ((u16 *)gMapHeader.mapData->secondaryTileset->metatiles)[a0] & 0xfff; +} + +void sub_81008BC(struct UnkStruct_02038900 *unk_02038900) +{ + u8 i; + u8 shape; + shape = unk_02038900->decoration->shape; + for (i=0; itiles[gUnknown_083EC860[shape].tiles[i]] = sub_810089C(unk_02038900->decoration->tiles[gUnknown_083EC860[shape].y[i]] * 8 + gUnknown_083EC860[shape].x[i]); + } +} + +void sub_8100930(u8 decoShape) +{ + gUnknown_020391AC.y = 0; + gUnknown_020391AC.affineMode = 0; + gUnknown_020391AC.objMode = 0; + gUnknown_020391AC.mosaic = 0; + gUnknown_020391AC.bpp = 0; + gUnknown_020391AC.shape = gUnknown_083EC900[decoShape].shape; + gUnknown_020391AC.x = 0; + gUnknown_020391AC.matrixNum = 0; + gUnknown_020391AC.size = gUnknown_083EC900[decoShape].size; + gUnknown_020391AC.tileNum = 0; + gUnknown_020391AC.priority = 1; + gUnknown_020391AC.paletteNum = 0; +} + +void sub_81009A8(struct Sprite *sprite) +{ + sprite->data2 = 0; + sprite->data3 = 0; + sprite->data4 = 0; + sprite->data5 = 0; + sprite->data6 = 0; + sprite->data7 = 0; + sprite->callback = sub_81009C0; +} + +void sub_81009C0(struct Sprite *sprite) +{ + if (sprite->data7 == 0) + { + if (sprite->data6 < 15) + { + sprite->invisible = 0; + } else + { + sprite->invisible = 1; + } + sprite->data6 = (sprite->data6 + 1) & 0x1f; + } else + { + sprite->invisible = 0; + } +} + +void sub_8100A0C(u8 taskId) +{ + if (sub_8100D38(taskId) == 1) + { + fade_screen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_8100E70; + } else + { + DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecorInUse, sub_80FE428, 0); + } +} + +void sub_8100A60(u8 a0) +{ + ewram_1f000.items[a0] = 0; + ewram_1f000.pos[a0] = 0; +} + +void sub_8100A7C(void) +{ + u16 i; + gSpecialVar_0x8005 = 0; + gScriptResult = 0; + if (gSpecialVar_0x8004 == gUnknown_02039234) + { + gScriptResult = 1; + } else if (gDecorations[ewram_1f000.items[gUnknown_020391B4[gSpecialVar_0x8004].decorId]].permission == DECORPERM_SOLID_MAT) + { + gSpecialVar_0x8005 = gUnknown_020391B4[gSpecialVar_0x8004].flagId; + sub_8100A60(gUnknown_020391B4[gSpecialVar_0x8004].decorId); + for (i=0; imapObjectCount; i++) + { + if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8005) + { + gSpecialVar_0x8006 = gMapHeader.events->mapObjects[i].localId; + break; + } + } + } +} + +void sub_8100B20(void) +{ + u8 i; + for (i=0; imapObjectCount; i++) + { + if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8004) + { + gSpecialVar_0x8005 = gMapHeader.events->mapObjects[i].localId; + break; + } + } +} + +void sub_8100B6C(void) +{ + u8 i; + u8 j; + u8 k; + u8 x; + u8 y; + u8 permission; + for (i=0; i> 4; + y = ewram_1f000.pos[gUnknown_020391B4[i].decorId] & 0xf; + if (permission != DECORPERM_SOLID_MAT) + { + if (ewram_1f000.items[gUnknown_020391B4[i].decorId] == DECOR_SAND_ORNAMENT && MapGridGetMetatileIdAt(x + 7, y + 7) == 0x28c) + { + gUnknown_020391B4[i].height++; + } + for (j=0; jmap)[(x + k) + gMapHeader.mapData->width * (y - j)] | 0x3000); + } + } + sub_8100A60(gUnknown_020391B4[i].decorId); + } + } +} + +void sub_8100C88(u8 taskId) +{ + switch (gTasks[taskId].data[2]) + { + case 0: + sub_8100B6C(); + gTasks[taskId].data[2] = 1; + break; + case 1: + if (!gPaletteFade.active) + { + DrawWholeMapView(); + ScriptContext1_SetupScript(gUnknown_081A2F8A); + MenuZeroFillWindowRect(0, 0, 29, 19); + gTasks[taskId].data[2] = 2; + } + break; + case 2: + ScriptContext2_Enable(); + sub_80FED90(taskId); + pal_fill_black(); + gTasks[taskId].data[2] = 3; + break; + case 3: + if (sub_807D770() == 1) + { + gTasks[taskId].data[13] = -1; + DisplayItemMessageOnField(taskId, gSecretBaseText_DecorReturned, sub_81010F0, 0); + } + break; + } +} + +bool8 sub_8100D38(u8 taskId) +{ + u16 i; + for (i=0; iwidth = 1; + unk_020391B4->height = 1; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_2x1) + { + unk_020391B4->width = 2; + unk_020391B4->height = 1; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_3x1) + { + unk_020391B4->width = 3; + unk_020391B4->height = 1; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_4x2) + { + unk_020391B4->width = 4; + unk_020391B4->height = 2; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_2x2) + { + unk_020391B4->width = 2; + unk_020391B4->height = 2; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_1x2) + { + unk_020391B4->width = 1; + unk_020391B4->height = 2; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_1x3) + { + unk_020391B4->width = 1; + unk_020391B4->height = 3; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_2x4) + { + unk_020391B4->width = 2; + unk_020391B4->height = 4; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_3x3) + { + unk_020391B4->width = 3; + unk_020391B4->height = 3; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_3x2) + { + unk_020391B4->width = 3; + unk_020391B4->height = 2; + } +} + +void sub_8101198(u8 x, u8 y) +{ + gSprites[gUnknown_020391A8].invisible = 1; + gSprites[gUnknown_020391A8].callback = SpriteCallbackDummy; + gSprites[gUnknown_020391A9].pos1.x = 0x88 + x * 16; + gSprites[gUnknown_020391A9].pos1.y = 0x48 + y * 16; +} + +bool8 sub_8101200(u8 taskId, u8 decorIdx, struct UnkStruct_020391B4 *unk_020391B4) +{ + u8 x; + u8 y; + u8 xOff; + u8 yOff; + x = gTasks[taskId].data[0] - 7; + y = gTasks[taskId].data[1] - 7; + xOff = ewram_1f000.pos[decorIdx] >> 4; + yOff = ewram_1f000.pos[decorIdx] & 0xf; + if (ewram_1f000.items[decorIdx] == DECOR_SAND_ORNAMENT && MapGridGetMetatileIdAt(xOff + 7, yOff + 7) == 0x28c) + { + unk_020391B4->height--; + } + if (x >= xOff && x < xOff + unk_020391B4->width && y > yOff - unk_020391B4->height && y <= yOff) + { + sub_8101198(unk_020391B4->width - (x - xOff + 1), yOff - y); + return TRUE; + } + return FALSE; +} + +void sub_81012A0(void) +{ + u8 xOff; + u8 yOff; + u16 i; + xOff = ewram_1f000.pos[gUnknown_020391B4[gUnknown_02039234].decorId] >> 4; + yOff = ewram_1f000.pos[gUnknown_020391B4[gUnknown_02039234].decorId] & 0xf; + for (i=0; i<0x40; i++) + { + if (gSaveBlock1.mapObjectTemplates[i].x == xOff && gSaveBlock1.mapObjectTemplates[i].y == yOff && !FlagGet(gSaveBlock1.mapObjectTemplates[i].flagId)) + { + gUnknown_020391B4[gUnknown_02039234].flagId = gSaveBlock1.mapObjectTemplates[i].flagId; + break; + } + } +} + +bool8 sub_8101340(u8 taskId) +{ + u16 i; + for (i=0; idecorId = i; + sub_81012A0(); + gUnknown_02039234 = 1; + return TRUE; + } + } + } + } + return FALSE; +} + +void sub_81013B8(u8 a0, u8 a1, u8 a2, u8 a3) +{ + u8 i; + u8 xOff; + u8 yOff; + u8 decorIdx; + for (i=0; i> 4; + yOff = ewram_1f000.pos[i] & 0xf; + if (decorIdx != 0 && gDecorations[decorIdx].permission == DECORPERM_SOLID_MAT && a0 <= xOff && a1 <= yOff && a2 >= xOff && a3 >= yOff) + { + gUnknown_020391B4[gUnknown_02039234].decorId = i; + sub_81012A0(); + gUnknown_02039234++; + } + } +} + +#ifdef NONMATCHING +void sub_8101460(u8 taskId) +{ + u8 i; + u8 xOff; + u8 yOff; + gUnknown_02039234 = 0; + if (sub_8101340(taskId) != TRUE) + { + for (i=0; i> 4; + yOff = ewram_1f000.pos[gUnknown_020391B4[0].decorId] & 0xf; + sub_81013B8(xOff, yOff - gUnknown_020391B4[0].height + 1, xOff + gUnknown_020391B4[0].width - 1, yOff); + } + } +} +#else +__attribute__((naked)) +void sub_8101460(u8 taskId) +{ + asm(".syntax unified\n" + "\tpush {r4-r7,lr}\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tldr r4, _081014B8 @ =gUnknown_02039234\n" + "\tmovs r0, 0\n" + "\tstrb r0, [r4]\n" + "\tadds r0, r6, 0\n" + "\tbl sub_8101340\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x1\n" + "\tbeq _08101504\n" + "\tmovs r5, 0\n" + "\tldr r0, _081014BC @ =ewram_1f000\n" + "\tldrb r1, [r0, 0x8]\n" + "\tcmp r5, r1\n" + "\tbcs _081014D2\n" + "\tadds r7, r4, 0\n" + "_08101486:\n" + "\tldr r0, [r0]\n" + "\tadds r0, r5\n" + "\tldrb r1, [r0] @ compiler incorrectly uses r0 for this and the next instruction\n" + "\tcmp r1, 0\n" + "\tbeq _081014C4\n" + "\tldr r4, _081014C0 @ =gUnknown_020391B4\n" + "\tadds r0, r1, 0\n" + "\tadds r1, r4, 0\n" + "\tbl sub_8101118\n" + "\tadds r0, r6, 0\n" + "\tadds r1, r5, 0\n" + "\tadds r2, r4, 0\n" + "\tbl sub_8101200\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x1\n" + "\tbne _081014C4\n" + "\tstrb r5, [r4]\n" + "\tldrb r0, [r7]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r7]\n" + "\tb _081014D2\n" + "\t.align 2, 0\n" + "_081014B8: .4byte gUnknown_02039234\n" + "_081014BC: .4byte 0x201f000\n" + "_081014C0: .4byte gUnknown_020391B4\n" + "_081014C4:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tldr r0, _0810150C @ =ewram_1f000\n" + "\tldrb r1, [r0, 0x8]\n" + "\tcmp r5, r1\n" + "\tbcc _08101486\n" + "_081014D2:\n" + "\tldr r0, _08101510 @ =gUnknown_02039234\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbeq _08101504\n" + "\tldr r0, _0810150C @ =ewram_1f000\n" + "\tldr r2, _08101514 @ =gUnknown_020391B4\n" + "\tldrb r1, [r2]\n" + "\tldr r0, [r0, 0x4]\n" + "\tadds r0, r1\n" + "\tldrb r1, [r0]\n" + "\tlsrs r0, r1, 4\n" + "\tmovs r3, 0xF\n" + "\tands r3, r1\n" + "\tldrb r1, [r2, 0x2]\n" + "\tsubs r1, r3, r1\n" + "\tadds r1, 0x1\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tldrb r2, [r2, 0x1]\n" + "\tadds r2, r0\n" + "\tsubs r2, 0x1\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tbl sub_81013B8\n" + "_08101504:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0810150C: .4byte 0x201f000\n" + "_08101510: .4byte gUnknown_02039234\n" + "_08101514: .4byte gUnknown_020391B4\n" + ".syntax divided\n"); +} +#endif + +void sub_8101518(u8 taskId) +{ + DisplayYesNoMenu(20, 8, 1); + DoYesNoFuncWithChoice(taskId, &gUnknown_083EC9CC); +} + +void sub_810153C(u8 taskId) +{ + fade_screen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_8100C88; +} + +void sub_810156C(u8 taskId) +{ + DisplayYesNoMenu(20, 8, 1); + DoYesNoFuncWithChoice(taskId, &gUnknown_083EC9D4); +} + +void sub_8101590(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0, 29, 19); + sub_81015B0(taskId); +} + +void sub_81015B0(u8 taskId) +{ + fade_screen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_81015E0; +} + +void sub_81015E0(u8 taskId) +{ + switch (gTasks[taskId].data[2]) + { + case 0: + if (!gPaletteFade.active) + { + sub_80FF114(taskId); + gTasks[taskId].data[2] = 1; + } + break; + case 1: + sub_81016F4(); + gFieldCallback = sub_8101678; + SetMainCallback2(c2_exit_to_overworld_2_switch); + DestroyTask(taskId); + break; + } +} + +void sub_8101648(u8 taskId) +{ + if (sub_807D770() == TRUE) + { + gTasks[taskId].func = Task_DecorationPCProcessMenuInput; + } +} + +void sub_8101678(void) +{ + pal_fill_black(); + MenuDisplayMessageBox(); + sub_80FE220(); + CreateTask(sub_8101648, 8); +} + +void sub_8101698(struct Sprite *sprite) +{ + sprite->data0 = (sprite->data0 + 1) & 0x1f; + if (sprite->data0 >= 16) + { + sprite->invisible = TRUE; + } else + { + sprite->invisible = FALSE; + } +} + +void sub_81016C8(void) +{ + if (gSaveBlock2.playerGender == MALE) + { + LoadSpritePalette(&gUnknown_083ECA5C); + } else + { + LoadSpritePalette(&gUnknown_083ECA64); + } +} + +void sub_81016F4(void) +{ + FreeSpritePaletteByTag(8); +} + +void sub_8101700(u8 taskId) +{ + if (!sub_81341D4()) + { + DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE428, 0); + } else + { + gTasks[taskId].data[11] = 1; + gUnknown_020388F6 = 0; + sub_80FE5AC(taskId); + } +} + +void sub_8101750(u8 taskId) +{ + if (!sub_81341D4()) + { + DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE428, 0); + } else + { + gTasks[taskId].data[11] = 2; + gUnknown_020388F6 = 0; + sub_80FE5AC(taskId); + } +} + +void sub_81017A0(u8 taskId) +{ + sub_80FEF74(); + sub_80FED1C(); + if (sub_80FEFA4() == TRUE) + { + StringCopy(gStringVar1, gDecorations[gUnknown_020388D0[gUnknown_020388F5]].name); + StringExpandPlaceholders(gStringVar4, gSecretBaseText_WillBeDiscarded); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8101824, 0); + } else + { + DisplayItemMessageOnField(taskId, gSecretBaseText_DecorInUse, sub_80FEFF4, 0); + } +} + +void sub_8101824(u8 taskId) +{ + DisplayYesNoMenu(20, 8, 1); + DoYesNoFuncWithChoice(taskId, &gUnknown_083ECAA0); +} + +void sub_8101848(u8 taskId) +{ + MenuZeroFillWindowRect(20, 8, 26, 14); + sub_8109A30(gUnknown_020388D0[gUnknown_020388F5]); + gUnknown_020388D0[gUnknown_020388F5] = DECOR_NONE; + sub_80FF098(taskId); + DisplayItemMessageOnField(taskId, gSecretBaseText_DecorThrownAway, sub_80FEFF4, 0); +} diff --git a/src/field/decoration_inventory.c b/src/field/decoration_inventory.c new file mode 100644 index 000000000..35ba7e228 --- /dev/null +++ b/src/field/decoration_inventory.c @@ -0,0 +1,169 @@ +// +// Created by Scott Norton on 6/5/17. +// + +#include "global.h" +#include "sprite.h" +#include "task.h" +#include "decoration.h" +#include "decoration_inventory.h" + +#define DECOR_INV(ptr) {.items = (u8 *)&ptr, .size = sizeof ptr} + +struct DecorationInventory const gDecorationInventories[] = { + DECOR_INV(gSaveBlock1.decorDesk), + DECOR_INV(gSaveBlock1.decorChair), + DECOR_INV(gSaveBlock1.decorPlant), + DECOR_INV(gSaveBlock1.decorOrnament), + DECOR_INV(gSaveBlock1.decorMat), + DECOR_INV(gSaveBlock1.decorPoster), + DECOR_INV(gSaveBlock1.decorDoll), + DECOR_INV(gSaveBlock1.decorCushion) +}; + +void ClearDecorationInventory(u8 invIdx) +{ + u8 i; + for (i=0; i gDecorationInventories[invIdx].items[j])) + { + tmp = gDecorationInventories[invIdx].items[i]; + gDecorationInventories[invIdx].items[i] = gDecorationInventories[invIdx].items[j]; + gDecorationInventories[invIdx].items[j] = tmp; + } + } + } +} + +u8 sub_8134194(u8 invIdx) +{ + u8 i; + u8 count; + count = 0; + for (i=0; iunk1_6 == 0) + { + if (r5->unk0_0 >= (u16)r2) + { + r5->unk0_0 -= r2; + if (r5->unk0_0 == 0) + r5->unk1_6 = 1; + continue; + } + //_080FA290 + r2 -= r5->unk0_0; + r5->unk0_0 = 0; + r5->unk1_6 = 1; + } + //_080FA2A0 + r4 = r5->unk0_0 + r2; + if ((u16)r4 > r5->unk0_7) + { + u32 sp4 = r4 % r5->unk0_7; + r4 = r4 / r5->unk0_7; + + r5->unk1_6 = r4 ^ 1; + if (r5->unk1_6) + r5->unk0_0 = sp4; + else + //_080FA2FA + r5->unk0_0 = r5->unk0_7 - sp4; + } + else + { + //_080FA310 + r5->unk0_0 = r4; + + if (r5->unk0_0 == r5->unk0_7) + r5->unk1_6 = 0; + } + } + sub_80FA46C(gSaveBlock1.easyChatPairs, 5, 0); + } + //_080FA34E +} + +bool8 sub_80FA364(u16 *a) +{ + struct EasyChatPair s = {0}; + u16 i; + + if (!SB1ContainsWords(a)) + { + if (!FlagGet(SYS_POPWORD_INPUT)) + { + FlagSet(SYS_POPWORD_INPUT); + if (!FlagGet(SYS_MIX_RECORD)) + { + gSaveBlock1.easyChatPairs[0].words[0] = a[0]; + gSaveBlock1.easyChatPairs[0].words[1] = a[1]; + return 1; + } + } + + //_080FA3C8 + s.words[0] = a[0]; + s.words[1] = a[1]; + s.unk1_6 = 1; + sub_80FA740(&s); + + for (i = 0; i < 5; i++) + { + if (sub_80FA670(&s, &gSaveBlock1.easyChatPairs[i], 0)) + { + u16 r3 = 4; + + while (r3 > i) + { + gSaveBlock1.easyChatPairs[r3] = gSaveBlock1.easyChatPairs[r3 - 1]; + r3--; + } + gSaveBlock1.easyChatPairs[i] = s; + return (i == 0); + } + //_080FA450 + } + gSaveBlock1.easyChatPairs[4] = s; + } + return 0; +} + +static void sub_80FA46C(struct EasyChatPair *s, u16 b, u8 c) +{ + u16 h; + + for (h = 0; h < b; h++) + { + u16 i; + + for (i = h + 1; i < b; i++) + { + if (sub_80FA670(&s[i], &s[h], c)) + { + struct EasyChatPair temp; + + temp = s[i]; + s[i] = s[h]; + s[h] = temp; + } + } + } +} + +void sub_80FA4E4(void *a, u32 b, u8 unused) +{ + u16 i; + u16 j; + u16 r7; + struct EasyChatPair *src; + struct EasyChatPair *dst; + u16 players = GetLinkPlayerCount(); + + for (i = 0; i < players; i++) + memcpy(&ARRAY_2007800[i * 5], (u8 *)a + i * b, 40); + src = ARRAY_2007800; + dst = ARRAY_2007900; + r7 = 0; + for (i = 0; i < players; i++) + { + for (j = 0; j < 5; j++) + { + s16 foo = sub_80FA828(src, r7); + if (foo < 0) + { + *(dst++) = *src; + r7++; + } + else + { + if (ARRAY_2007900[foo].unk0_0 < src->unk0_0) + { + ARRAY_2007900[foo] = *src; + } + } + src++; + } + } + sub_80FA46C(ARRAY_2007900, r7, 2); + src = ARRAY_2007900; + dst = gSaveBlock1.easyChatPairs; + for (i = 0; i < 5; i++) + *(dst++) = *(src++); +} + +void sub_80FA5BC(void) +{ + struct EasyChatPair *s = &gSaveBlock1.easyChatPairs[gSpecialVar_0x8004]; + + ConvertEasyChatWordsToString(gStringVar1, s->words, 2, 1); +} + +void sub_80FA5E4(void) +{ + u16 result = 0; + + if (gSaveBlock1.easyChatPairs[0].unk0_0 - gSaveBlock1.easyChatPairs[1].unk0_0 < 2) + { + asm("":::"r2"); //Force the compiler to store address of gSaveBlock1 in r3 instead of r2 + if (!gSaveBlock1.easyChatPairs[0].unk1_6 && gSaveBlock1.easyChatPairs[1].unk1_6) + result = 1; + } + gScriptResult = result; +} + +void sub_80FA648(void) +{ + gScriptResult = (gSaveBlock1.easyChatPairs[0].words[0] + gSaveBlock1.easyChatPairs[0].words[1]) & 7; +} + +static bool8 sub_80FA670(struct EasyChatPair *a, struct EasyChatPair *b, u8 c) +{ + switch (c) + { + case 0: + if (a->unk0_0 > b->unk0_0) + return 1; + if (a->unk0_0 < b->unk0_0) + return 0; + if (a->unk0_7 > b->unk0_7) + return 1; + if (a->unk0_7 < b->unk0_7) + return 0; + break; + case 1: + if (a->unk0_7 > b->unk0_7) + return 1; + if (a->unk0_7 < b->unk0_7) + return 0; + if (a->unk0_0 > b->unk0_0) + return 1; + if (a->unk0_0 < b->unk0_0) + return 0; + break; + case 2: + if (a->unk0_0 > b->unk0_0) + return 1; + if (a->unk0_0 < b->unk0_0) + return 0; + if (a->unk0_7 > b->unk0_7) + return 1; + if (a->unk0_7 < b->unk0_7) + return 0; + if (a->unk2 > b->unk2) + return 1; + if (a->unk2 < b->unk2) + return 0; + if (a->words[0] > b->words[0]) + return 1; + if (a->words[0] < b->words[0]) + return 0; + if (a->words[1] > b->words[1]) + return 1; + if (a->words[1] < b->words[1]) + return 0; + return 1; + } + return Random() & 1; +} + +static void sub_80FA740(struct EasyChatPair *s) +{ + u16 r4; + + r4 = Random() % 98; + if (r4 > 50) + { + r4 = Random() % 98; + if (r4 > 80) + r4 = Random() % 98; + } + s->unk0_7 = r4 + 30; + s->unk0_0 = (Random() % (r4 + 1)) + 30; + s->unk2 = Random(); +} + +static bool8 SB1ContainsWords(u16 *a) +{ + u16 i; + + for (i = 0; i < 5; i++) + { + if (IsEasyChatPairEqual(a, gSaveBlock1.easyChatPairs[i].words) != 0) + return TRUE; + } + return FALSE; +} + +static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + if (*(words1++) != *(words2++)) + return FALSE; + } + return TRUE; +} + +static s16 sub_80FA828(struct EasyChatPair *a, u16 b) +{ + s16 i; + struct EasyChatPair *s = ARRAY_2007900; + + for (i = 0; i < b; i++) + { + if (IsEasyChatPairEqual(a->words, s->words)) + return i; + s++; + } + return -1; +} diff --git a/src/field/diploma.c b/src/field/diploma.c new file mode 100644 index 000000000..ba7de58aa --- /dev/null +++ b/src/field/diploma.c @@ -0,0 +1,139 @@ +#include "global.h" +#include "diploma.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "pokedex.h" +#include "rom4.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "text.h" +#include "unknown_task.h" + +static void VBlankCB(void); +static void MainCB2(void); +static void Task_DiplomaFadeIn(u8); +static void Task_DiplomaWaitForKeyPress(u8); +static void Task_DiplomaFadeOut(u8); +static void DisplayDiplomaText(void); + +static const u16 gDiplomaPalettes[][16] = +{ + INCBIN_U16("graphics/misc/diploma_national.gbapal"), + INCBIN_U16("graphics/misc/diploma_hoenn.gbapal"), +}; + +static const u8 gDiplomaTilemap[] = INCBIN_U8("graphics/misc/diploma_map.bin.lz"); +static const u8 gDiplomaTiles[] = INCBIN_U8("graphics/misc/diploma.4bpp.lz"); + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_8145D88(void) +{ + u32 savedIme; + + SetVBlankCallback(NULL); + + REG_DISPCNT = 0; + REG_BG3CNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + DmaFill16(3, 0, VRAM, VRAM_SIZE); + DmaFill32(3, 0, OAM, OAM_SIZE); + DmaFill16(3, 0, PLTT, PLTT_SIZE); + + LZ77UnCompVram(gDiplomaTiles, (void *)VRAM); + LZ77UnCompVram(gDiplomaTilemap, (void *)(VRAM + 0x3000)); + + remove_some_task(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + LoadPalette(gDiplomaPalettes, 0, 64); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + DisplayDiplomaText(); + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + + SetVBlankCallback(VBlankCB); + SetMainCallback2(MainCB2); + + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT512x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + + CreateTask(Task_DiplomaFadeIn, 0); +} + +static void MainCB2(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void Task_DiplomaFadeIn(u8 taskId) +{ + if (!gPaletteFade.active) + gTasks[taskId].func = Task_DiplomaWaitForKeyPress; +} + +static void Task_DiplomaWaitForKeyPress(u8 taskId) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_DiplomaFadeOut; + } +} + +static void Task_DiplomaFadeOut(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(sub_80546F0); + } +} + +static void DisplayDiplomaText(void) +{ + if (sub_8090FF4()) + { + REG_BG3HOFS = 256; + StringCopy(gStringVar1, gOtherText_NationalDex); + } + else + { + REG_BG3HOFS = 0; + StringCopy(gStringVar1, gOtherText_HoennDex); + } + MenuPrint(gOtherText_DiplomaCertificationGameFreak, 6, 2); +} \ No newline at end of file diff --git a/src/field/easy_chat.c b/src/field/easy_chat.c new file mode 100644 index 000000000..cca8c1355 --- /dev/null +++ b/src/field/easy_chat.c @@ -0,0 +1,442 @@ +#include "global.h" +#include "easy_chat.h" +#include "data2.h" +#include "event_data.h" +#include "field_message_box.h" +#include "pokedex.h" +#include "rng.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; + + +u8 *sub_80EB3FC(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[0] = EOS; + return dst; + } + else + { + group = word >> 9; + wordIndex = word & 0x1FF; + 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[0] = 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 = sub_80EB3FC(dst, words[0]); + + if (words[0] != 0xFFFF) + { + dst[0] = CHAR_SPACE; + dst++; + } + + words++; + } + + word = words[0]; + words++; + dst = sub_80EB3FC(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 = sub_80EB3FC(dst, words[0]); + + if (words[0] != 0xFFFF) + { + dst[0] = CHAR_SPACE; + dst++; + } + + words++; + } + + word = words[0]; + words++; + dst = sub_80EB3FC(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) +{ + u8 *chars; + u16 i; + u16 length; + int group, word; + + + if (arg0 == 0xFFFF) + return 0; + + group = arg0 >> 9; + word = arg0 & 0x1FF; + switch (group) + { + case EC_GROUP_POKEMON: // 0 + case EC_GROUP_POKEMON_2: // 21 + chars = (u8 *) 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.unk2B1C; + arg1 = 2; + arg2 = 2; + break; + case 1: + words = gSaveBlock1.unk2B28; + if (sub_80EB680(gSaveBlock1.unk2B28, 3, 2, 20)) + { + arg1 = 2; + arg2 = 3; + } + else + { + arg1 = 3; + arg2 = 2; + } + break; + case 2: + words = gSaveBlock1.unk2B34; + arg1 = 3; + arg2 = 2; + break; + case 3: + words = gSaveBlock1.unk2B40; + arg1 = 3; + arg2 = 2; + break; + default: + return; + } + + ConvertEasyChatWordsToString(gStringVar4, words, arg1, arg2); + ShowFieldAutoScrollMessage(gStringVar4); +} + +void sub_80EB83C(void) +{ + u16 group, local2; + + if (Random() & 1) + group = EC_GROUP_HOBBIES; + else + group = EC_GROUP_LIFESTYLE; + + local2 = sub_80EB784(group); + sub_80EB3FC(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 = GetNationalPokedexFlag(dexNum, 0); + + if (local2) + { + if (local1 == 0) + return *speciesList & 0x1FF; + local1--; + } + speciesList++; + } + return -1; +} diff --git a/src/field/event_data.c b/src/field/event_data.c new file mode 100644 index 000000000..0484bae02 --- /dev/null +++ b/src/field/event_data.c @@ -0,0 +1,184 @@ +#include "global.h" +#include "event_data.h" +#include "pokedex.h" + +#define TEMP_FLAGS_SIZE 0x4 +#define TEMP_UPPER_FLAGS_SIZE 0x8 +#define TEMP_VARS_SIZE 0x20 + +EWRAM_DATA u16 gSpecialVar_0x8000 = 0; +EWRAM_DATA u16 gSpecialVar_0x8001 = 0; +EWRAM_DATA u16 gSpecialVar_0x8002 = 0; +EWRAM_DATA u16 gSpecialVar_0x8003 = 0; +EWRAM_DATA u16 gSpecialVar_0x8004 = 0; +EWRAM_DATA u16 gSpecialVar_0x8005 = 0; +EWRAM_DATA u16 gSpecialVar_0x8006 = 0; +EWRAM_DATA u16 gSpecialVar_0x8007 = 0; +EWRAM_DATA u16 gSpecialVar_0x8008 = 0; +EWRAM_DATA u16 gSpecialVar_0x8009 = 0; +EWRAM_DATA u16 gSpecialVar_0x800A = 0; +EWRAM_DATA u16 gSpecialVar_0x800B = 0; +EWRAM_DATA u16 gScriptResult = 0; +EWRAM_DATA u16 gScriptLastTalked = 0; +EWRAM_DATA u16 gScriptFacing = 0; +EWRAM_DATA u8 gUnknown_0202E8E2[16] = {0}; + +extern u16 *gSpecialVars[]; + +void InitEventData(void) +{ + memset(gSaveBlock1.flags, 0, sizeof(gSaveBlock1.flags)); + memset(gSaveBlock1.vars, 0, sizeof(gSaveBlock1.vars)); + memset(gUnknown_0202E8E2, 0, sizeof(gUnknown_0202E8E2)); +} + +void ClearTempFieldEventData(void) +{ + memset(gSaveBlock1.flags, 0, TEMP_FLAGS_SIZE); + memset(gSaveBlock1.vars, 0, TEMP_VARS_SIZE); + FlagReset(SYS_ENC_UP_ITEM); + FlagReset(SYS_ENC_DOWN_ITEM); + FlagReset(SYS_USE_STRENGTH); + FlagReset(SYS_CTRL_OBJ_DELETE); +} + +// probably had different flag splits at one point. +void ClearUpperFlags(void) +{ + memset(gSaveBlock1.flags + 0x118, 0, TEMP_UPPER_FLAGS_SIZE); +} + +void DisableNationalPokedex(void) +{ + u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); + gSaveBlock2.pokedex.nationalMagic = 0; + *nationalDexVar = 0; + FlagReset(SYS_NATIONAL_DEX); +} + +void EnableNationalPokedex(void) +{ + u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); + gSaveBlock2.pokedex.nationalMagic = 0xDA; + *nationalDexVar = 0x302; + FlagSet(SYS_NATIONAL_DEX); + gSaveBlock2.pokedex.unknown1 = 1; + gSaveBlock2.pokedex.order = 0; + sub_808C0A0(); +} + +bool32 IsNationalPokedexEnabled(void) +{ + if (gSaveBlock2.pokedex.nationalMagic == 0xDA && VarGet(VAR_NATIONAL_DEX) == 0x302 && FlagGet(SYS_NATIONAL_DEX)) + return TRUE; + else + return FALSE; +} + +void DisableMysteryGift(void) +{ + FlagReset(SYS_EXDATA_ENABLE); +} + +void EnableMysteryGift(void) +{ + FlagSet(SYS_EXDATA_ENABLE); +} + +bool32 IsMysteryGiftEnabled(void) +{ + return FlagGet(SYS_EXDATA_ENABLE); +} + +void DisableResetRTC(void) +{ + VarSet(VAR_RESET_RTC_ENABLE, 0); + FlagReset(SYS_RESET_RTC_ENABLE); +} + +void EnableResetRTC(void) +{ + VarSet(VAR_RESET_RTC_ENABLE, 0x920); + FlagSet(SYS_RESET_RTC_ENABLE); +} + +bool32 CanResetRTC(void) +{ + if (FlagGet(SYS_RESET_RTC_ENABLE) && VarGet(VAR_RESET_RTC_ENABLE) == 0x920) + return TRUE; + else + return FALSE; +} + +u16 *GetVarPointer(u16 id) +{ + if (id < 0x4000) + return NULL; + + if ((s16)id >= 0) + return &gSaveBlock1.vars[id - 0x4000]; + + return gSpecialVars[id - 0x8000]; +} + +u16 VarGet(u16 id) +{ + u16 *ptr = GetVarPointer(id); + if (!ptr) + return id; + return *ptr; +} + +bool8 VarSet(u16 id, u16 value) +{ + u16 *ptr = GetVarPointer(id); + if (!ptr) + return FALSE; + *ptr = value; + return TRUE; +} + +u8 VarGetFieldObjectGraphicsId(u8 id) +{ + return VarGet(0x4010 + id); +} + +u8 *GetFlagPointer(u16 id) +{ + if (id == 0) + return 0; + + if (id < 0x4000) + return &gSaveBlock1.flags[id / 8]; + + return &gUnknown_0202E8E2[(id - 0x4000) / 8]; +} + +u8 FlagSet(u16 id) +{ + u8 *ptr = GetFlagPointer(id); + if (ptr) + *ptr |= 1 << (id & 7); + return 0; +} + +u8 FlagReset(u16 id) +{ + u8 *ptr = GetFlagPointer(id); + if (ptr) + *ptr &= ~(1 << (id & 7)); + return 0; +} + +bool8 FlagGet(u16 id) +{ + u8 *ptr = GetFlagPointer(id); + + if (!ptr) + return FALSE; + + if (!(((*ptr) >> (id & 7)) & 1)) + return FALSE; + + return TRUE; +} diff --git a/src/field/field_camera.c b/src/field/field_camera.c new file mode 100644 index 000000000..db51cf054 --- /dev/null +++ b/src/field/field_camera.c @@ -0,0 +1,495 @@ +#include "global.h" +#include "field_camera.h" +#include "berry.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "rotating_gate.h" +#include "sprite.h" +#include "text.h" + +EWRAM_DATA u8 gUnknown_0202E854 = 0; + +struct UnknownStruct +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + bool8 unk4; +}; + +static struct UnknownStruct gUnknown_03000590; +static u16 gUnknown_03000598; +static s16 gUnknown_0300059A; +static u8 gUnknown_0300059C; +static void (*gUnknown_030005A0)(void); + +struct CameraSomething gUnknown_03004880; +u16 gUnknown_03004898; +u16 gUnknown_0300489C; + +static void RedrawMapSliceNorth(struct UnknownStruct *a, struct MapData *mapData); +static void RedrawMapSliceSouth(struct UnknownStruct *a, struct MapData *mapData); +static void RedrawMapSliceEast(struct UnknownStruct *a, struct MapData *mapData); +static void RedrawMapSliceWest(struct UnknownStruct *a, struct MapData *mapData); +static s32 MapPosToBgTilemapOffset(struct UnknownStruct *a, s32 x, s32 y); + +static void DrawWholeMapViewInternal(int x, int y, struct MapData *mapData); +static void DrawMetatileAt(struct MapData *mapData, u16, int, int); +static void DrawMetatile(s32 a, u16 *b, u16 c); +static void CameraPanningCB_PanAhead(void); + +static void move_tilemap_camera_to_upper_left_corner_(struct UnknownStruct *a) +{ + a->unk2 = 0; + a->unk3 = 0; + a->unk0 = 0; + a->unk1 = 0; + a->unk4 = TRUE; +} + +static void tilemap_move_something(struct UnknownStruct *a, u32 b, u32 c) +{ + a->unk2 += b; + a->unk2 %= 32; + a->unk3 += c; + a->unk3 %= 32; +} + +static void coords8_add(struct UnknownStruct *a, u32 b, u32 c) +{ + a->unk0 += b; + a->unk1 += c; +} + +void move_tilemap_camera_to_upper_left_corner(void) +{ + move_tilemap_camera_to_upper_left_corner_(&gUnknown_03000590); + CpuFill16(0, gBGTilemapBuffers[2], 0x800); + CpuFill16(0, gBGTilemapBuffers[1], 0x800); + CpuFill16(0x3014, gBGTilemapBuffers[3], 0x800); +} + +void sub_8057A58(void) +{ + *gBGHOffsetRegs[1] = gUnknown_03000590.unk0 + gUnknown_03000598; + *gBGVOffsetRegs[1] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; + *gBGHOffsetRegs[2] = gUnknown_03000590.unk0 + gUnknown_03000598; + *gBGVOffsetRegs[2] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; + *gBGHOffsetRegs[3] = gUnknown_03000590.unk0 + gUnknown_03000598; + *gBGVOffsetRegs[3] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; + + if (gUnknown_03000590.unk4) + { + DmaCopy16(3, gBGTilemapBuffers[1], (void *)(VRAM + 0xE800), 0x800); + DmaCopy16(3, gBGTilemapBuffers[2], (void *)(VRAM + 0xE000), 0x800); + DmaCopy16(3, gBGTilemapBuffers[3], (void *)(VRAM + 0xF000), 0x800); + gUnknown_03000590.unk4 = FALSE; + } +} + +void sub_8057B14(u16 *a, u16 *b) +{ + *a = gUnknown_03000590.unk0 + gUnknown_03000598; + *b = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; +} + +void DrawWholeMapView(void) +{ + DrawWholeMapViewInternal(gSaveBlock1.pos.x, gSaveBlock1.pos.y, gMapHeader.mapData); + gUnknown_03000590.unk4 = TRUE; +} + +static void DrawWholeMapViewInternal(int x, int y, struct MapData *mapData) +{ + u8 i; + u8 j; + u32 r6; + u8 temp; + + for (i = 0; i < 32; i += 2) + { + temp = gUnknown_03000590.unk3 + i; + if (temp >= 32) + temp -= 32; + r6 = temp * 32; + for (j = 0; j < 32; j += 2) + { + temp = gUnknown_03000590.unk2 + j; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapData, r6 + temp, x + j / 2, y + i / 2); + } + } +} + +static void RedrawMapSlicesForCameraUpdate(struct UnknownStruct *a, int x, int y) +{ + struct MapData *mapData = gMapHeader.mapData; + + if (x > 0) + RedrawMapSliceWest(a, mapData); + if (x < 0) + RedrawMapSliceEast(a, mapData); + if (y > 0) + RedrawMapSliceNorth(a, mapData); + if (y < 0) + RedrawMapSliceSouth(a, mapData); + a->unk4 = TRUE; +} + +static void RedrawMapSliceNorth(struct UnknownStruct *a, struct MapData *mapData) +{ + u8 i; + u8 temp; + u32 r7; + + temp = a->unk3 + 28; + if (temp >= 32) + temp -= 32; + r7 = temp * 32; + for (i = 0; i < 32; i += 2) + { + temp = a->unk2 + i; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapData, r7 + temp, gSaveBlock1.pos.x + i / 2, gSaveBlock1.pos.y + 14); + } +} + +static void RedrawMapSliceSouth(struct UnknownStruct *a, struct MapData *mapData) +{ + u8 i; + u8 temp; + u32 r7 = a->unk3 * 32; + + for (i = 0; i < 32; i += 2) + { + temp = a->unk2 + i; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapData, r7 + temp, gSaveBlock1.pos.x + i / 2, gSaveBlock1.pos.y); + } +} + +static void RedrawMapSliceEast(struct UnknownStruct *a, struct MapData *mapData) +{ + u8 i; + u8 temp; + u32 r6 = a->unk2; + + for (i = 0; i < 32; i += 2) + { + temp = a->unk3 + i; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapData, temp * 32 + r6, gSaveBlock1.pos.x, gSaveBlock1.pos.y + i / 2); + } +} + +static void RedrawMapSliceWest(struct UnknownStruct *a, struct MapData *mapData) +{ + u8 i; + u8 temp; + u8 r5 = a->unk2 + 28; + + if (r5 >= 32) + r5 -= 32; + for (i = 0; i < 32; i += 2) + { + temp = a->unk3 + i; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapData, temp * 32 + r5, gSaveBlock1.pos.x + 14, gSaveBlock1.pos.y + i / 2); + } +} + +void CurrentMapDrawMetatileAt(int a, int b) +{ + int offset = MapPosToBgTilemapOffset(&gUnknown_03000590, a, b); + + if (offset >= 0) + { + DrawMetatileAt(gMapHeader.mapData, offset, a, b); + gUnknown_03000590.unk4 = TRUE; + } +} + +void DrawDoorMetatileAt(int x, int y, u16 *arr) +{ + int offset = MapPosToBgTilemapOffset(&gUnknown_03000590, x, y); + + if (offset >= 0) + { + DrawMetatile(1, arr, offset); + gUnknown_03000590.unk4 = TRUE; + } +} + +static void DrawMetatileAt(struct MapData *mapData, u16 b, int c, int d) +{ + u16 metatileId = MapGridGetMetatileIdAt(c, d); + u16 *metatiles; + + if (metatileId > 1024) + metatileId = 0; + if (metatileId < 512) + metatiles = mapData->primaryTileset->metatiles; + else + { + metatiles = mapData->secondaryTileset->metatiles; + metatileId -= 512; + } + DrawMetatile(MapGridGetMetatileLayerTypeAt(c, d), metatiles + metatileId * 8, b); +} + +static void DrawMetatile(s32 a, u16 *b, u16 c) +{ + switch (a) + { + case 2: + gBGTilemapBuffers[3][c] = b[0]; + gBGTilemapBuffers[3][c + 1] = b[1]; + gBGTilemapBuffers[3][c + 0x20] = b[2]; + gBGTilemapBuffers[3][c + 0x21] = b[3]; + + gBGTilemapBuffers[2][c] = 0; + gBGTilemapBuffers[2][c + 1] = 0; + gBGTilemapBuffers[2][c + 0x20] = 0; + gBGTilemapBuffers[2][c + 0x21] = 0; + + gBGTilemapBuffers[1][c] = b[4]; + gBGTilemapBuffers[1][c + 1] = b[5]; + gBGTilemapBuffers[1][c + 0x20] = b[6]; + gBGTilemapBuffers[1][c + 0x21] = b[7]; + break; + case 1: + gBGTilemapBuffers[3][c] = b[0]; + gBGTilemapBuffers[3][c + 1] = b[1]; + gBGTilemapBuffers[3][c + 0x20] = b[2]; + gBGTilemapBuffers[3][c + 0x21] = b[3]; + + gBGTilemapBuffers[2][c] = b[4]; + gBGTilemapBuffers[2][c + 1] = b[5]; + gBGTilemapBuffers[2][c + 0x20] = b[6]; + gBGTilemapBuffers[2][c + 0x21] = b[7]; + + gBGTilemapBuffers[1][c] = 0; + gBGTilemapBuffers[1][c + 1] = 0; + gBGTilemapBuffers[1][c + 0x20] = 0; + gBGTilemapBuffers[1][c + 0x21] = 0; + break; + case 0: + gBGTilemapBuffers[3][c] = 0x3014; + gBGTilemapBuffers[3][c + 1] = 0x3014; + gBGTilemapBuffers[3][c + 0x20] = 0x3014; + gBGTilemapBuffers[3][c + 0x21] = 0x3014; + + gBGTilemapBuffers[2][c] = b[0]; + gBGTilemapBuffers[2][c + 1] = b[1]; + gBGTilemapBuffers[2][c + 0x20] = b[2]; + gBGTilemapBuffers[2][c + 0x21] = b[3]; + + gBGTilemapBuffers[1][c] = b[4]; + gBGTilemapBuffers[1][c + 1] = b[5]; + gBGTilemapBuffers[1][c + 0x20] = b[6]; + gBGTilemapBuffers[1][c + 0x21] = b[7]; + break; + } +} + +static s32 MapPosToBgTilemapOffset(struct UnknownStruct *a, s32 x, s32 y) +{ + x -= gSaveBlock1.pos.x; + x *= 2; + if (x >= 32 || x < 0) + return -1; + x = x + a->unk2; + if (x >= 32) + x -= 32; + + y = (y - gSaveBlock1.pos.y) * 2; + if (y >= 32 || y < 0) + return -1; + y = y + a->unk3; + if (y >= 32) + y -= 32; + + return y * 32 + x; +} + +static void CameraUpdateCallback(struct CameraSomething *a) +{ + if (a->unk4 != 0) + { + a->unk8 = gSprites[a->unk4].data2; + a->unkC = gSprites[a->unk4].data3; + } +} + +void ResetCameraUpdateInfo(void) +{ + gUnknown_03004880.unk8 = 0; + gUnknown_03004880.unkC = 0; + gUnknown_03004880.unk10 = 0; + gUnknown_03004880.unk14 = 0; + gUnknown_03004880.unk4 = 0; + gUnknown_03004880.callback = NULL; +} + +u32 InitCameraUpdateCallback(u8 a) +{ + if (gUnknown_03004880.unk4 != 0) + DestroySprite(&gSprites[gUnknown_03004880.unk4]); + gUnknown_03004880.unk4 = AddCameraObject(a); + gUnknown_03004880.callback = CameraUpdateCallback; + return 0; +} + +void CameraUpdate(void) +{ + int deltaX; + int deltaY; + int r0; + int r1; + int r7; + int r8; + + if (gUnknown_03004880.callback != NULL) + gUnknown_03004880.callback(&gUnknown_03004880); + r7 = gUnknown_03004880.unk8; + r8 = gUnknown_03004880.unkC; + deltaX = 0; + deltaY = 0; + r1 = gUnknown_03004880.unk10; + r0 = gUnknown_03004880.unk14; + + + if (r1 == 0 && r7 != 0) + { + if (r7 > 0) + deltaX = 1; + else + deltaX = -1; + } + if (r0 == 0 && r8 != 0) + { + if (r8 > 0) + deltaY = 1; + else + deltaY = -1; + } + if (r1 != 0 && r1 == -r7) + { + if (r7 > 0) + deltaX = 1; + else + deltaX = -1; + } + if (r0 != 0 && r0 == -r8) + { + if (r8 > 0) + deltaX = 1; + else + deltaX = -1; + } + + gUnknown_03004880.unk10 += r7; + gUnknown_03004880.unk10 = gUnknown_03004880.unk10 - 16 * (gUnknown_03004880.unk10 / 16); + gUnknown_03004880.unk14 += r8; + gUnknown_03004880.unk14 = gUnknown_03004880.unk14 - 16 * (gUnknown_03004880.unk14 / 16); + + if (deltaX != 0 || deltaY != 0) + { + CameraMove(deltaX, deltaY); + UpdateFieldObjectsForCameraUpdate(deltaX, deltaY); + RotatingGatePuzzleCameraUpdate(deltaX, deltaY); + ResetBerryTreeSparkleFlags(); + tilemap_move_something(&gUnknown_03000590, deltaX * 2, deltaY * 2); + RedrawMapSlicesForCameraUpdate(&gUnknown_03000590, deltaX * 2, deltaY * 2); + } + + coords8_add(&gUnknown_03000590, r7, r8); + gUnknown_0300489C -= r7; + gUnknown_03004898 -= r8; +} + +void camera_move_and_redraw(int a, int b) +{ + CameraMove(a, b); + UpdateFieldObjectsForCameraUpdate(a, b); + DrawWholeMapView(); + gUnknown_0300489C -= a * 16; + gUnknown_03004898 -= b * 16; +} + +void SetCameraPanningCallback(void (*a)(void)) +{ + gUnknown_030005A0 = a; +} + +void SetCameraPanning(s16 a, s16 b) +{ + gUnknown_03000598 = a; + gUnknown_0300059A = b + 32; +} + +void InstallCameraPanAheadCallback(void) +{ + gUnknown_030005A0 = CameraPanningCB_PanAhead; + gUnknown_0300059C = 0; + gUnknown_03000598 = 0; + gUnknown_0300059A = 32; +} + +void UpdateCameraPanning(void) +{ + if (gUnknown_030005A0 != NULL) + gUnknown_030005A0(); + //Update sprite offset of overworld objects + gSpriteCoordOffsetX = gUnknown_0300489C - gUnknown_03000598; + gSpriteCoordOffsetY = gUnknown_03004898 - gUnknown_0300059A - 8; +} + +static void CameraPanningCB_PanAhead(void) +{ + u8 var; + + if (gUnknown_0202E854 == 0) + { + InstallCameraPanAheadCallback(); + } + else + { + if (gPlayerAvatar.running1 == 1) + { + gUnknown_0300059C ^= 1; + if (gUnknown_0300059C == 0) + return; + } + else + { + gUnknown_0300059C = 0; + } + + var = player_get_direction_upper_nybble(); + if (var == 2) + { + if (gUnknown_0300059A > -8) + gUnknown_0300059A -= 2; + } + else if (var == 1) + { + if (gUnknown_0300059A < 72) + gUnknown_0300059A += 2; + } + else if (gUnknown_0300059A < 32) + { + gUnknown_0300059A += 2; + } + else if (gUnknown_0300059A > 32) + { + gUnknown_0300059A -= 2; + } + } +} diff --git a/src/field/field_control_avatar.c b/src/field/field_control_avatar.c new file mode 100644 index 000000000..a8f6b6b9b --- /dev/null +++ b/src/field/field_control_avatar.c @@ -0,0 +1,878 @@ +#include "global.h" +#include "field_control_avatar.h" +#include "battle_setup.h" +#include "bike.h" +#include "coord_event_weather.h" +#include "daycare.h" +#include "event_data.h" +#include "field_fadetransition.h" +#include "field_player_avatar.h" +#include "field_poison.h" +#include "field_specials.h" +#include "fieldmap.h" +#include "flags.h" +#include "item_menu.h" +#include "metatile_behavior.h" +#include "rom4.h" +#include "safari_zone.h" +#include "script.h" +#include "secret_base.h" +#include "songs.h" +#include "sound.h" +#include "start_menu.h" +#include "trainer_see.h" +#include "vars.h" +#include "wild_encounter.h" + +struct Coords32 +{ + s32 x; + s32 y; +}; + +extern u16 gScriptLastTalked; +extern u16 gScriptFacing; +extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; + +static EWRAM_DATA u8 gUnknown_0202E8C0 = 0; +static EWRAM_DATA u16 gUnknown_0202E8C2 = 0; + +u8 gSelectedMapObject; + +//scripts +extern u8 gUnknown_081A2C51[]; +extern u8 gUnknown_0815281E[]; +extern u8 gUnknown_08152C39[]; +extern u8 gUnknown_0815F36C[]; +extern u8 gUnknown_0815F43A[]; +extern u8 gUnknown_081A0009[]; +extern u8 gUnknown_081C6C02[]; +extern u8 HiddenItemScript[]; +extern u8 Event_TV[]; +extern u8 gUnknown_081A0009[]; +extern u8 ClosedSootopolisGymDoorScript[]; +extern u8 gUnknown_081A4363[]; +extern u8 gUnknown_081C346A[]; +extern u8 gUnknown_081616E1[]; +extern u8 Event_WorldMap[]; +extern u8 Event_RunningShoesManual[]; +extern u8 PictureBookShelfScript[]; +extern u8 BookshelfScript[]; +extern u8 PokemonCenterBookshelfScript[]; +extern u8 VaseScript[]; +extern u8 TrashCanScript[]; +extern u8 ShopShelfScript[]; +extern u8 BlueprintScript[]; +extern u8 gUnknown_0815F36C[]; +extern u8 gUnknown_0815F43A[]; +extern u8 gUnknown_0815F523[]; +extern u8 gUnknown_0815F528[]; +extern u8 UseSurfScript[]; +extern u8 UseWaterfallScript[]; +extern u8 CannotUseWaterfallScript[]; +extern u8 UseDiveScript[]; +extern u8 UnderwaterUseDiveScript[]; +extern u8 GraniteCave_B1F_EventScript_1C6BC5[]; +extern u8 gUnknown_081A14B8[]; +extern u8 Event_EggHatch[]; +extern u8 gUnknown_0815FD0D[]; +extern u8 gUnknown_081C6BDE[]; + +static void player_get_pos_to_and_height(struct MapPosition *); +static void player_get_next_pos_and_height(struct MapPosition *); +static u16 cur_mapdata_block_role_at_player_pos(int); +static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c); +static u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c); +static u8 *sub_8068364(struct MapPosition *, u8, u8); +static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *, u8, u8 c); +static u8 *sub_8068500(struct MapPosition *, u8, u8); +static u8 *TryGetFieldMoveScript(struct MapPosition *, u8, u8); +static bool32 sub_8068770(void); +static bool32 sub_80687A4(void); +static bool8 sub_80687E4(struct MapPosition *, u16, u16); +static void happiness_algorithm_step(void); +static bool8 overworld_poison_step(void); +static bool8 is_it_battle_time_3(u16); +static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *, u16, u8); +static bool8 sub_8068B30(u16); +static bool8 is_non_stair_warp_tile(u16, u8); +static s8 map_warp_check_packed(struct MapHeader *, struct MapPosition *); +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); + +void FieldClearPlayerInput(struct FieldInput *input) +{ + input->pressedAButton = 0; + input->input_field_0_1 = 0; + input->pressedStartButton = 0; + input->pressedSelectButton = 0; + input->input_field_0_4 = 0; + input->input_field_0_5 = 0; + input->input_field_0_6 = 0; + input->pressedBButton = 0; + input->input_field_1_0 = 0; + input->input_field_1_1 = 0; + input->input_field_1_2 = 0; + input->input_field_1_3 = 0; + input->dpadDirection = 0; +} + +void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) +{ + u8 r6 = gPlayerAvatar.running1; + u8 r9 = gPlayerAvatar.running2; + bool8 forcedMove = MetatileBehavior_IsMoveTile(cur_mapdata_block_role_at_player_pos(r9)); + + if ((r6 == 2 && forcedMove == FALSE) || r6 == 0) + { + if (GetPlayerSpeed() != 4) + { + if (newKeys & START_BUTTON) + input->pressedStartButton = TRUE; + if (newKeys & SELECT_BUTTON) + input->pressedSelectButton = TRUE; + if (newKeys & A_BUTTON) + input->pressedAButton = TRUE; + if (newKeys & B_BUTTON) + input->pressedBButton = TRUE; + } + if (heldKeys & (DPAD_UP | DPAD_DOWN | DPAD_LEFT | DPAD_RIGHT)) + { + input->input_field_0_4 = TRUE; + input->input_field_0_5 = TRUE; + } + } + if (forcedMove == FALSE) + { + if (r6 == 2 && r9 == 2) + input->input_field_0_6 = TRUE; + if (forcedMove == FALSE && r6 == 2) + input->input_field_0_1 = TRUE; + } + if (heldKeys & DPAD_UP) + input->dpadDirection = DIR_NORTH; + else if (heldKeys & DPAD_DOWN) + input->dpadDirection = DIR_SOUTH; + else if (heldKeys & DPAD_LEFT) + input->dpadDirection = DIR_WEST; + else if (heldKeys & DPAD_RIGHT) + input->dpadDirection = DIR_EAST; +} + +int sub_8068024(struct FieldInput *input) +{ + struct MapPosition position; + u8 r6; + u16 r4; + + r6 = player_get_direction_lower_nybble(); + player_get_pos_to_and_height(&position); + r4 = MapGridGetMetatileBehaviorAt(position.x, position.y); + if (CheckTrainers() == TRUE) + return TRUE; + if (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); + if (sub_80687E4(&position, r4, r6) == 1) + return TRUE; + } + if (input->input_field_0_1 && is_it_battle_time_3(r4) == 1) + return TRUE; + if (input->input_field_0_4 && input->dpadDirection == r6) + { + if (mapheader_run_first_tag2_script_list_match_conditionally(&position, r4, r6) == 1) + return TRUE; + } + player_get_next_pos_and_height(&position); + r4 = MapGridGetMetatileBehaviorAt(position.x, position.y); + if (input->pressedAButton && sub_80681F0(&position, r4, r6) == 1) + return TRUE; + if (input->input_field_0_5 && input->dpadDirection == r6) + { + if (map_warp_consider_2_to_inside(&position, r4, r6) == 1) + return TRUE; + } + if (input->pressedAButton && sub_8068770() == 1) + return TRUE; + if (input->pressedStartButton) + { + PlaySE(SE_WIN_OPEN); + sub_8071310(); + return TRUE; + } + if (input->pressedSelectButton && sub_80A6D1C() == TRUE) + return TRUE; + return FALSE; +} + +static void player_get_pos_to_and_height(struct MapPosition *position) +{ + PlayerGetDestCoords(&position->x, &position->y); + position->height = PlayerGetZCoord(); +} + +static void player_get_next_pos_and_height(struct MapPosition *position) +{ + s16 x, y; + + GetXYCoordsOneStepInFrontOfPlayer(&position->x, &position->y); + PlayerGetDestCoords(&x, &y); + if (MapGridGetZCoordAt(x, y) != 0) + position->height = PlayerGetZCoord(); + else + position->height = 0; +} + +static u16 cur_mapdata_block_role_at_player_pos(int unused) +{ + s16 x, y; + + PlayerGetDestCoords(&x, &y); + return MapGridGetMetatileBehaviorAt(x, y); +} + +static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c) +{ + u8 *script = TryGetScriptOnPressingA(position, b, c); + + if (script == NULL) + return FALSE; + + if (script != gUnknown_0815281E + && script != gUnknown_08152C39 + && script != gUnknown_0815F36C + && script != gUnknown_0815F43A + && script != gUnknown_081A0009) + PlaySE(5); + + ScriptContext1_SetupScript(script); + return TRUE; +} + +static u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c) +{ + u8 *script; + + script = sub_8068364(position, b, c); + if (script != NULL) + return script; + script = TryGetInvisibleMapObjectScript(position, b, c); + if (script != NULL) + return script; + script = sub_8068500(position, b, c); + if (script != NULL) + return script; + script = TryGetFieldMoveScript(position, b, c); + if (script != NULL) + return script; + + return NULL; +} + +u8 *sub_80682A8(struct MapPosition *position, u8 unused, u8 c) +{ + u8 r3; + s32 i; + + if (!MetatileBehavior_IsCounter(MapGridGetMetatileBehaviorAt(position->x, position->y))) + r3 = GetFieldObjectIdByXYZ(position->x, position->y, position->height); + else + r3 = GetFieldObjectIdByXYZ(position->x + gUnknown_0821664C[c].x, position->y + gUnknown_0821664C[c].y, position->height); + if (r3 == 16 || gMapObjects[r3].localId == 0xFF) + return NULL; + for (i = 0; i < 4; i++) + { + if (gLinkPlayerMapObjects[i].active == TRUE && gLinkPlayerMapObjects[i].mapObjId == r3) + return NULL; + } + gSelectedMapObject = r3; + gScriptLastTalked = gMapObjects[r3].localId; + gScriptFacing = c; + return GetFieldObjectScriptPointerByFieldObjectId(r3); +} + +static u8 *sub_8068364(struct MapPosition *position, u8 b, u8 c) +{ + u8 r3; + u8 *script; + + r3 = GetFieldObjectIdByXYZ(position->x, position->y, position->height); + if (r3 == 16 || gMapObjects[r3].localId == 0xFF) + { + if (MetatileBehavior_IsCounter(b) != TRUE) + return NULL; + r3 = GetFieldObjectIdByXYZ(position->x + gUnknown_0821664C[c].x, position->y + gUnknown_0821664C[c].y, position->height); + if (r3 == 16 || gMapObjects[r3].localId == 0xFF) + return NULL; + } + //_080683E8 + gSelectedMapObject = r3; + gScriptLastTalked = gMapObjects[r3].localId; + gScriptFacing = c; + script = GetFieldObjectScriptPointerByFieldObjectId(r3); + script = GetRamScript(gScriptLastTalked, script); + return script; +} + +static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *position, u8 unused, u8 c) +{ + struct BgEvent *bgEvent = FindInvisibleMapObjectByPosition(&gMapHeader, position->x - 7, position->y - 7, position->height); + + if (bgEvent == NULL) + return NULL; + if (bgEvent->bgUnion.script == NULL) + return gUnknown_081C6C02; + switch (bgEvent->kind) + { + case 0: + default: + return bgEvent->bgUnion.script; + case 1: + if (c != 2) + return NULL; + break; + case 2: + if (c != 1) + return NULL; + break; + case 3: + if (c != 4) + return NULL; + break; + case 4: + if (c != 3) + return NULL; + break; + case 5: + case 6: + case 7: + gSpecialVar_0x8004 = ((u32)bgEvent->bgUnion.script >> 16) + 0x258; + gSpecialVar_0x8005 = (u32)bgEvent->bgUnion.script; + if (FlagGet(gSpecialVar_0x8004) == TRUE) + return NULL; + return HiddenItemScript; + case 8: + if (c == 2) + { + gSpecialVar_0x8004 = (u32)bgEvent->bgUnion.script; + if (sub_80BC050()) + return gUnknown_081A2C51; + } + return NULL; + } + return bgEvent->bgUnion.script; +} + +static u8 *sub_8068500(struct MapPosition *position, u8 b, u8 c) +{ + s8 height; + + if (MetatileBehavior_IsPlayerFacingTVScreen(b, c) == TRUE) + return Event_TV; + if (MetatileBehavior_IsPC(b) == TRUE) + return gUnknown_081A0009; + if (MetatileBehavior_IsClosedSootopolisGymDoor(b) == TRUE) + return ClosedSootopolisGymDoorScript; + if (is_tile_x84(b) == TRUE) + return gUnknown_081A4363; + if (MetatileBehavior_IsPokeblockFeeder(b) == TRUE) + return gUnknown_081C346A; + if (MetatileBehavior_IsTrickHousePuzzleDoor(b) == TRUE) + return gUnknown_081616E1; + if (MetatileBehavior_IsRegionMap(b) == TRUE) + return Event_WorldMap; + if (sub_805791C(b) == TRUE) + return Event_RunningShoesManual; + if (MetatileBehavior_IsPictureBookShelf(b) == TRUE) + return PictureBookShelfScript; + if (MetatileBehavior_IsBookShelf(b) == TRUE) + return BookshelfScript; + if (MetatileBehavior_IsPokeCenterBookShelf(b) == TRUE) + return PokemonCenterBookshelfScript; + if (MetatileBehavior_IsVase(b) == TRUE) + return VaseScript; + if (MetatileBehavior_IsTrashCan(b) == TRUE) + return TrashCanScript; + if (MetatileBehavior_IsShopShelf(b) == TRUE) + return ShopShelfScript; + if (MetatileBehavior_IsBlueprint(b) == TRUE) + return BlueprintScript; + height = position->height; + if (height == MapGridGetZCoordAt(position->x, position->y)) + { + if (MetatileBehavior_IsSecretBasePC(b) == TRUE) + return gUnknown_0815F36C; + if (sub_805724C(b) == TRUE) + return gUnknown_0815F43A; + if (sub_8057364(b) == TRUE) + return gUnknown_0815F523; + if (sub_8057378(b) == TRUE) + return gUnknown_0815F528; + } + return NULL; +} + +static u8 *TryGetFieldMoveScript(struct MapPosition *unused1, u8 b, u8 unused2) +{ + if (FlagGet(BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) + return UseSurfScript; + if (MetatileBehavior_IsWaterfall(b) == TRUE) + { + if (FlagGet(BADGE08_GET) == TRUE && IsPlayerSurfingNorth() == TRUE) + return UseWaterfallScript; + else + return CannotUseWaterfallScript; + } + return NULL; +} + +static bool32 sub_8068770(void) +{ + if (FlagGet(BADGE07_GET) && sub_8068F18() == 2) + { + ScriptContext1_SetupScript(UseDiveScript); + return TRUE; + } + return FALSE; +} + +static bool32 sub_80687A4(void) +{ + if (FlagGet(BADGE07_GET) && gMapHeader.mapType == 5 && sub_8068F18() == 1) + { + ScriptContext1_SetupScript(UnderwaterUseDiveScript); + return TRUE; + } + return FALSE; +} + +static bool8 sub_80687E4(struct MapPosition *position, u16 b, u16 unused) +{ + if (mapheader_trigger_activate_at__run_now(position) == TRUE) + return TRUE; + if (sub_8068A64(position, b) == TRUE) + return TRUE; + if (sub_8068870(b) == TRUE) + return TRUE; + if (sub_8068894() == TRUE) + return TRUE; + if (UpdateRepelCounter() == TRUE) + return TRUE; + return FALSE; +} + +bool8 mapheader_trigger_activate_at__run_now(struct MapPosition *position) +{ + u8 *script = mapheader_trigger_activate_at(&gMapHeader, position->x - 7, position->y - 7, position->height); + + if (script == NULL) + return FALSE; + ScriptContext1_SetupScript(script); + return TRUE; +} + +//can be u8, u16, or u32 +bool8 sub_8068870(u16 a) +{ + if (MetatileBehavior_IsCrackedFloorHole(a)) + { + ScriptContext1_SetupScript(GraniteCave_B1F_EventScript_1C6BC5); + return TRUE; + } + return FALSE; +} + +bool8 sub_8068894(void) +{ + sub_8082B78(); + happiness_algorithm_step(); + if (overworld_poison_step() == TRUE) + { + ScriptContext1_SetupScript(gUnknown_081A14B8); + return TRUE; + } + if (sub_80422A0()) + { + IncrementGameStat(13); + ScriptContext1_SetupScript(Event_EggHatch); + return TRUE; + } + if (SafariZoneTakeStep() == TRUE) + return TRUE; + if (CountSSTidalStep(1) == TRUE) + { + ScriptContext1_SetupScript(gUnknown_0815FD0D); + return TRUE; + } + return FALSE; +} + +void unref_sub_80688F8(void) +{ + VarSet(VAR_HAPPINESS_STEP_COUNTER, 0); +} + +static void happiness_algorithm_step(void) +{ + u16 *ptr = GetVarPointer(VAR_HAPPINESS_STEP_COUNTER); + int i; + + (*ptr)++; + (*ptr) %= 128; + if (*ptr == 0) + { + struct Pokemon *pkmn = gPlayerParty; + + for (i = 5; i >= 0; i--) + { + AdjustFriendship(pkmn, 5); + pkmn++; + } + } +} + +void overworld_poison_timer_set(void) +{ + VarSet(VAR_POISON_STEP_COUNTER, 0); +} + +static bool8 overworld_poison_step(void) +{ + u16 *ptr; + + if (gMapHeader.mapType != 9) + { + ptr = GetVarPointer(VAR_POISON_STEP_COUNTER); + (*ptr)++; + (*ptr) %= 4; + if (*ptr == 0) + { + switch (overworld_poison()) + { + case 0: + return FALSE; + case 1: + return FALSE; + case 2: + return TRUE; + } + } + } + return FALSE; +} + +void prev_quest_postbuffer_cursor_backup_reset(void) +{ + gUnknown_0202E8C0 = 0; +} + +static bool8 is_it_battle_time_3(u16 a) +{ + if (gUnknown_0202E8C0 < 4) + { + gUnknown_0202E8C0++; + gUnknown_0202E8C2 = a; + return FALSE; + } + if (StandardWildEncounter(a, gUnknown_0202E8C2) == TRUE) + { + gUnknown_0202E8C0 = 0; + gUnknown_0202E8C2 = a; + return TRUE; + } + else + { + gUnknown_0202E8C2 = a; + return FALSE; + } +} + +static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *position, u16 b, u8 c) +{ + s8 r6 = map_warp_check_packed(&gMapHeader, position); + + if (is_non_stair_warp_tile(b, c) == TRUE && r6 != -1) + { + walkrun_find_lowest_active_bit_in_bitfield(); + sub_8068C30(&gMapHeader, r6, position); + sub_8080E88(); + return TRUE; + } + return FALSE; +} + +bool8 sub_8068A64(struct MapPosition *position, u16 b) +{ + s8 r4 = map_warp_check_packed(&gMapHeader, position); + + if (r4 != -1 && sub_8068B30(b) == TRUE) + { + walkrun_find_lowest_active_bit_in_bitfield(); + sub_8068C30(&gMapHeader, r4, position); + if (MetatileBehavior_IsEscalator(b) == TRUE) + { + sub_8080F2C(b); + return TRUE; + } + if (MetatileBehavior_IsLavaridgeB1FWarp(b) == TRUE) + { + sub_8080F48(); + return TRUE; + } + if (MetatileBehavior_IsLavaridge1FWarp(b) == TRUE) + { + sub_8080F58(); + return TRUE; + } + if (MetatileBehavior_IsAquaHideoutWarp(b) == TRUE) + { + sub_8080F68(); + return TRUE; + } + if (MetatileBehavior_IsMtPyreHole(b) == TRUE) + { + ScriptContext1_SetupScript(gUnknown_081C6BDE); + return TRUE; + } + sub_8080E88(); + return TRUE; + } + return FALSE; +} + +static bool8 sub_8068B30(u16 a) +{ + if (MetatileBehavior_IsWarpDoor(a) != TRUE + && MetatileBehavior_IsLadder(a) != TRUE + && MetatileBehavior_IsEscalator(a) != TRUE + && MetatileBehavior_IsNonAnimDoor(a) != TRUE + && MetatileBehavior_IsLavaridgeB1FWarp(a) != TRUE + && MetatileBehavior_IsLavaridge1FWarp(a) != TRUE + && MetatileBehavior_IsAquaHideoutWarp(a) != TRUE + && MetatileBehavior_IsMtPyreHole(a) != TRUE) + return FALSE; + return TRUE; +} + +static bool8 is_non_stair_warp_tile(u16 a, u8 b) +{ + switch (b) + { + case 2: + return MetatileBehavior_IsNorthArrowWarp(a); + case 1: + return MetatileBehavior_IsSouthArrowWarp(a); + case 3: + return MetatileBehavior_IsWestArrowWarp(a); + case 4: + return MetatileBehavior_IsEastArrowWarp(a); + } + return FALSE; +} + +static s8 map_warp_check_packed(struct MapHeader *mapHeader, struct MapPosition *position) +{ + return map_warp_check(mapHeader, position->x - 7, position->y - 7, position->height); +} + +static void sub_8068C30(struct MapHeader *unused, s8 b, struct MapPosition *position) +{ + struct WarpEvent *warpEvent = &gMapHeader.events->warps[b]; + + if (warpEvent->mapNum == 0x7F) + { + copy_saved_warp2_bank_and_enter_x_to_warp1(warpEvent->mapGroup); + } + else + { + struct MapHeader *mapHeader; + + warp1_set_2(warpEvent->unk7, warpEvent->mapNum, warpEvent->mapGroup); + sub_80535C4(position->x, position->y); + mapHeader = get_mapheader_by_bank_and_number(warpEvent->unk7, warpEvent->mapNum); + if (mapHeader->events->warps[warpEvent->mapGroup].mapNum == 0x7F) + saved_warp2_set(mapHeader->events->warps[b].mapGroup, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, b); + } +} + +static bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 b, u8 c) +{ + s8 r4; + + if (c == 2) + { + if (sub_80571C0(b) == TRUE) + { + sub_80BC038(position, gMapHeader.events); + return TRUE; + } + if (MetatileBehavior_IsWarpDoor(b) == TRUE) + { + r4 = map_warp_check_packed(&gMapHeader, position); + if (r4 != -1 && sub_8068B30(b) == TRUE) + { + walkrun_find_lowest_active_bit_in_bitfield(); + sub_8068C30(&gMapHeader, r4, position); + sub_8080EF0(); + return TRUE; + } + } + } + return FALSE; +} + +static s8 map_warp_check(struct MapHeader *mapHeader, u16 b, u16 c, u8 d) +{ + s32 i; + struct WarpEvent *warpEvent = mapHeader->events->warps; + u8 warpCount = mapHeader->events->warpCount; + + for (i = 0; i < warpCount; i++, warpEvent++) + { + if ((u16)warpEvent->x == b && (u16)warpEvent->y == c) + { + if ((u8)warpEvent->warpId == d || (u8)warpEvent->warpId == 0) + return i; + } + } + return -1; +} + +static u8 *trigger_activate(struct CoordEvent *coordEvent) +{ + if (coordEvent != NULL) + { + if (coordEvent->script == NULL) + { + DoCoordEventWeather(coordEvent->trigger); + return NULL; + } + if (coordEvent->trigger == 0) + { + ScriptContext2_RunNewScript(coordEvent->script); + return NULL; + } + if (VarGet(coordEvent->trigger) == (u8)coordEvent->index) + return coordEvent->script; + } + return NULL; +} + +static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 b, u16 c, u8 d) +{ + 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 == b && (u16)coordEvents[i].y == c) + { + if (coordEvents[i].unk4 == d || coordEvents[i].unk4 == 0) + { + script = trigger_activate(&coordEvents[i]); + if (script != NULL) + return script; + } + } + } + return NULL; +} + +u8 *sub_8068E24(struct MapPosition *position) +{ + return mapheader_trigger_activate_at(&gMapHeader, position->x - 7, position->y - 7, position->height); +} + +static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *mapHeader, u16 b, u16 c, u8 d) +{ + u8 i; + struct BgEvent *bgEvents = mapHeader->events->bgEvents; + u8 bgEventCount = mapHeader->events->bgEventCount; + + for (i = 0; i < bgEventCount; i++) + { + if ((u16)bgEvents[i].x == b && (u16)bgEvents[i].y == c) + { + if (bgEvents[i].unk4 == d || bgEvents[i].unk4 == 0) + return &bgEvents[i]; + } + } + return NULL; +} + +int dive_warp(struct MapPosition *position, u16 b) +{ + if (gMapHeader.mapType == 5 && sub_805750C(b) == 0) + { + if (sub_80538B0(position->x - 7, position->y - 7)) + { + walkrun_find_lowest_active_bit_in_bitfield(); + sp13E_warp_to_last_warp(); + PlaySE(SE_W291); + return TRUE; + } + } + else if (sub_80574EC(b) == TRUE) + { + if (sub_80538D0(position->x - 7, position->y - 7)) + { + walkrun_find_lowest_active_bit_in_bitfield(); + sp13E_warp_to_last_warp(); + PlaySE(SE_W291); + return TRUE; + } + } + return FALSE; +} + +u8 sub_8068F18(void) +{ + s16 x, y; + u8 r5; + + PlayerGetDestCoords(&x, &y); + r5 = MapGridGetMetatileBehaviorAt(x, y); + if (gMapHeader.mapType == 5 && sub_805750C(r5) == 0) + { + if (sub_80538B0(x - 7, y - 7) == TRUE) + return 1; + } + else if (sub_80574EC(r5) == TRUE) + { + if (sub_80538D0(x - 7, y - 7) == TRUE) + return 2; + } + return 0; +} + +u8 *GetFieldObjectScriptPointerForComparison(void) +{ + u8 r4; + struct MapPosition position; + + r4 = player_get_direction_upper_nybble(); + player_get_next_pos_and_height(&position); + return sub_8068364(&position, MapGridGetMetatileBehaviorAt(position.x, position.y), r4); +} + +int SetCableClubWarp(void) +{ + struct MapPosition position; + + player_get_direction_upper_nybble(); //unnecessary + player_get_pos_to_and_height(&position); + MapGridGetMetatileBehaviorAt(position.x, position.y); //unnecessary + sub_8068C30(&gMapHeader, map_warp_check_packed(&gMapHeader, &position), &position); + return 0; +} diff --git a/src/field/field_door.c b/src/field/field_door.c new file mode 100644 index 000000000..791ed4c94 --- /dev/null +++ b/src/field/field_door.c @@ -0,0 +1,221 @@ +#include "global.h" +#include "field_door.h" +#include "field_camera.h" +#include "fieldmap.h" +#include "metatile_behavior.h" +#include "task.h" + +extern struct DoorAnimFrame gDoorOpenAnimFrames[]; +extern struct DoorAnimFrame gDoorCloseAnimFrames[]; +extern struct DoorGraphics gDoorAnimGraphicsTable[]; + +static void CopyDoorTilesToVram(void *src) +{ + CpuFastSet(src, (void *)(VRAM + 0x7F00), 0x40); +} + +static void door_build_blockdef(u16 *a, u16 b, u8 *c) +{ + int i; + u16 unk; + + for (i = 0; i < 4; i++) + { + unk = *(c++) << 12; + a[i] = unk | (b + i); + } + for (; i < 8; i++) + { + unk = *(c++) << 12; + a[i] = unk; + } +} + +static void DrawCurrentDoorAnimFrame(u32 x, u32 y, u8 *c) +{ + u16 arr[8]; + + door_build_blockdef(arr, 0x3F8, c); + DrawDoorMetatileAt(x, y - 1, arr); + door_build_blockdef(arr, 0x3FC, c + 4); + DrawDoorMetatileAt(x, y, arr); +} + +static void DrawClosedDoorTiles(u32 x, u32 y) +{ + CurrentMapDrawMetatileAt(x, y - 1); + CurrentMapDrawMetatileAt(x, y); +} + +static void DrawDoor(struct DoorGraphics *gfx, struct DoorAnimFrame *frame, u32 x, u32 y) +{ + if (frame->offset == 0xFFFF) + DrawClosedDoorTiles(x, y); + else + { + CopyDoorTilesToVram(gfx->tiles + frame->offset); + DrawCurrentDoorAnimFrame(x, y, gfx->palette); + } +} + +enum +{ + TD_FRAMELIST = 0, + TD_GFX = 2, + TD_FRAME = 4, + TD_COUNTER, + TD_X, + TD_Y +}; + +static bool32 sub_8058464(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *taskData) +{ + if (taskData[TD_COUNTER] == 0) + DrawDoor(gfx, &frames[taskData[TD_FRAME]], taskData[TD_X], taskData[TD_Y]); + if (taskData[TD_COUNTER] == frames[taskData[TD_FRAME]].time) + { + taskData[TD_COUNTER] = 0; + taskData[TD_FRAME]++; + if (frames[taskData[TD_FRAME]].time == 0) + return FALSE; + else + return TRUE; + } + taskData[TD_COUNTER]++; + return TRUE; +} + +static void Task_AnimateDoor(u8 taskId) +{ + u16 *taskData = gTasks[taskId].data; + struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(taskData[TD_FRAMELIST] << 16 | taskData[TD_FRAMELIST + 1]); + struct DoorGraphics *gfx = (struct DoorGraphics *)(taskData[TD_GFX] << 16 | taskData[TD_GFX + 1]); + + if (sub_8058464(gfx, frames, taskData) == FALSE) + DestroyTask(taskId); +} + +static struct DoorAnimFrame *GetLastDoorFrame(struct DoorAnimFrame *frame, void *unused) +{ + while (frame->time != 0) + frame++; + return frame - 1; +} + +static struct DoorGraphics *GetDoorGraphics(struct DoorGraphics *gfx, u16 metatileNum) +{ + while (gfx->tiles != NULL) + { + if (gfx->metatileNum == metatileNum) + return gfx; + gfx++; + } + return NULL; +} + +static s8 StartDoorAnimationTask(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, u32 x, u32 y) +{ + if (FuncIsActiveTask(Task_AnimateDoor) == TRUE) + return -1; + else + { + u8 taskId = CreateTask(Task_AnimateDoor, 0x50); + s16 *taskData = gTasks[taskId].data; + + taskData[TD_X] = x; + taskData[TD_Y] = y; + + taskData[TD_FRAMELIST + 1] = (u32)frames; + taskData[TD_FRAMELIST] = (u32)frames >> 16; + + taskData[TD_GFX + 1] = (u32)gfx; + taskData[TD_GFX] = (u32)gfx >> 16; + + return taskId; + } +} + +static void DrawClosedDoor(struct DoorGraphics *unused, u32 x, u32 y) +{ + DrawClosedDoorTiles(x, y); +} + +static void DrawOpenedDoor(struct DoorGraphics *gfx, u32 x, u32 y) +{ + gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); + if (gfx != NULL) + DrawDoor(gfx, GetLastDoorFrame(gDoorOpenAnimFrames, gDoorOpenAnimFrames), x, y); +} + +static s8 StartDoorOpenAnimation(struct DoorGraphics *gfx, u32 x, u32 y) +{ + gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); + if (gfx == NULL) + return -1; + else + return StartDoorAnimationTask(gfx, gDoorOpenAnimFrames, x, y); +} + +static s8 StartDoorCloseAnimation(struct DoorGraphics *gfx, u32 x, u32 y) +{ + gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); + if (gfx == NULL) + return -1; + else + return StartDoorAnimationTask(gfx, gDoorCloseAnimFrames, x, y); +} + +static s8 cur_mapdata_get_door_x2_at(struct DoorGraphics *gfx, u32 x, u32 y) +{ + gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); + if (gfx == NULL) + return -1; + else + return gfx->unk2; +} + +void unref_sub_805869C(u32 x, u32 y) +{ + StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y); +} + +void FieldSetDoorOpened(u32 x, u32 y) +{ + if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) + DrawOpenedDoor(gDoorAnimGraphicsTable, x, y); +} + +void FieldSetDoorClosed(u32 x, u32 y) +{ + if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) + DrawClosedDoor(gDoorAnimGraphicsTable, x, y); +} + +s8 FieldAnimateDoorClose(u32 x, u32 y) +{ + if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) + return -1; + else + return StartDoorCloseAnimation(gDoorAnimGraphicsTable, x, y); +} + +s8 FieldAnimateDoorOpen(u32 x, u32 y) +{ + if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) + return -1; + else + return StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y); +} + +bool8 FieldIsDoorAnimationRunning(void) +{ + return FuncIsActiveTask(Task_AnimateDoor); +} + +u32 sub_8058790(u32 x, u32 y) +{ + if (cur_mapdata_get_door_x2_at(gDoorAnimGraphicsTable, x, y) == 0) + return 8; + else + return 18; +} diff --git a/src/field/field_effect.c b/src/field/field_effect.c new file mode 100644 index 000000000..3632d7053 --- /dev/null +++ b/src/field/field_effect.c @@ -0,0 +1,3406 @@ +#include "global.h" +#include "data2.h" +#include "script.h" +#include "trig.h" +#include "main.h" +#include "field_weather.h" +#include "decompress.h" +#include "sprite.h" +#include "menu.h" +#include "palette.h" +#include "text.h" +#include "rom4.h" +#include "task.h" +#include "sound.h" +#include "songs.h" +#include "decoration.h" +#include "field_player_avatar.h" +#include "field_map_obj_helpers.h" +#include "field_map_obj.h" +#include "metatile_behavior.h" +#include "field_camera.h" +#include "field_effect.h" +#include "field_fadetransition.h" +#include "fieldmap.h" +#include "field_map_obj.h" +#include "util.h" +#include "field_effect_helpers.h" + +#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} + +EWRAM_DATA u32 gUnknown_0202FF84[8] = {0}; + +const u32 gSpriteImage_839DC14[] = INCBIN_U32("graphics/birch_speech/birch.4bpp"); +const u16 gBirchPalette[16] = INCBIN_U16("graphics/birch_speech/birch.gbapal"); +const u32 gSpriteImage_839E434[] = INCBIN_U32("graphics/misc/pokeball_glow.4bpp"); +const u16 gFieldEffectObjectPalette4[16] = INCBIN_U16("graphics/field_effect_objects/palettes/04.gbapal"); +const u32 gSpriteImage_839E474[] = INCBIN_U32("graphics/misc/pokecenter_monitor/0.4bpp"); +const u32 gSpriteImage_839E534[] = INCBIN_U32("graphics/misc/pokecenter_monitor/1.4bpp"); +const u32 gSpriteImage_839E5F4[] = INCBIN_U32("graphics/misc/big_hof_monitor.4bpp"); +const u32 gSpriteImage_839E7F4[] = INCBIN_U32("graphics/misc/small_hof_monitor.4bpp"); +const u16 gFieldEffectObjectPalette5[16] = INCBIN_U16("graphics/field_effect_objects/palettes/05.gbapal"); + +// Graphics for the lights streaking past your Pokemon when it uses a field move. +const u32 gFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/field_move_streaks.4bpp"); +const u16 gFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/field_move_streaks.gbapal"); +const u16 gFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/field_move_streaks_map.bin"); + +// The following light streaks effect is used when the map is dark (e.g. a cave). +const u32 gDarknessFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/darkness_field_move_streaks.4bpp"); +const u16 gDarknessFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/darkness_field_move_streaks.gbapal"); +const u16 gDarknessFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/darkness_field_move_streaks_map.bin"); + +bool8 (*const gFieldEffectScriptFuncs[])(u8 **, u32 *) = { + FieldEffectCmd_loadtiles, + FieldEffectCmd_loadfadedpal, + FieldEffectCmd_loadpal, + FieldEffectCmd_callnative, + FieldEffectCmd_end, + FieldEffectCmd_loadgfx_callnative, + FieldEffectCmd_loadtiles_callnative, + FieldEffectCmd_loadfadedpal_callnative, +}; + +const struct OamData gOamData_839F0F4 = {.size = 3}; +const struct OamData gOamData_839F0FC = {.size = 0}; +const struct OamData gOamData_839F104 = {.size = 1}; + +const struct SpriteFrameImage gSpriteImageTable_839F10C[] = { + obj_frame_tiles(gSpriteImage_839DC14) +}; +const struct SpritePalette gUnknown_0839F114 = {.data = gBirchPalette, .tag = 0x1006}; + +const union AnimCmd gSpriteAnim_839F11C[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 1), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_839F124[] = { + gSpriteAnim_839F11C +}; + +const struct SpriteTemplate gSpriteTemplate_839F128 = { + .tileTag = 0xffff, + .paletteTag = 4102, + .oam = &gOamData_839F0F4, + .anims = (const union AnimCmd *const *)&gSpriteAnimTable_839F124, + .images = gSpriteImageTable_839F10C, + .affineAnims = (const union AffineAnimCmd *const *)&gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo4 = {.data = gFieldEffectObjectPalette4, .tag = 0x1007}; +const struct SpritePalette gFieldEffectObjectPaletteInfo5 = {.data = gFieldEffectObjectPalette5, .tag = 0x1010}; +const struct OamData gOamData_839F150 = { + .shape = 1, + .size = 2 +}; + +const struct SpriteFrameImage gSpriteImageTable_839F158[] = { + obj_frame_tiles(gSpriteImage_839E434) +}; + +const struct SpriteFrameImage gSpriteImageTable_839F160[] = { + obj_frame_tiles(gSpriteImage_839E474), + obj_frame_tiles(gSpriteImage_839E534) +}; + +const struct SpriteFrameImage gSpriteImageTable_839F170[] = { + obj_frame_tiles(gSpriteImage_839E5F4) +}; + +const struct SpriteFrameImage gSpriteImageTable_839F178[] = { + {.data = (u8 *)gSpriteImage_839E7F4, .size = 0x200} // the macro breaks down here +}; + +const struct Subsprite Unknown_39F180[] = { + {.x = -12, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 0}, + {.x = 4, .y = -8, .priority = 2, .tileOffset = 2, .shape = 0, .size = 0}, + {.x = -12, .y = 0, .priority = 2, .tileOffset = 3, .shape = 1, .size = 0}, + {.x = 4, .y = 0, .priority = 2, .tileOffset = 5, .shape = 0, .size = 0} +}; + +const struct SubspriteTable gUnknown_0839F1A0 = subsprite_table(Unknown_39F180); + +const struct Subsprite Unknown_39F1A8[] = { + {.x = -32, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 1}, + {.x = 0, .y = -8, .priority = 2, .tileOffset = 4, .shape = 1, .size = 1}, + {.x = -32, .y = 0, .priority = 2, .tileOffset = 8, .shape = 1, .size = 1}, + {.x = 0, .y = 0, .priority = 2, .tileOffset = 12, .shape = 1, .size = 1} +}; + +const struct SubspriteTable gUnknown_0839F1C8 = subsprite_table(Unknown_39F1A8); + +const union AnimCmd gSpriteAnim_839F1D0[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gSpriteAnim_839F1D8[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_839F1FC[] = { + gSpriteAnim_839F1D0, + gSpriteAnim_839F1D8 +}; + +const union AnimCmd *const gSpriteAnimTable_839F204[] = { + gSpriteAnim_839F1D0 +}; + +const struct SpriteTemplate gSpriteTemplate_839F208 = { + .tileTag = 0xffff, + .paletteTag = 4103, + .oam = &gOamData_839F0FC, + .anims = gSpriteAnimTable_839F1FC, + .images = gSpriteImageTable_839F158, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PokeballGlow +}; + + +const struct SpriteTemplate gSpriteTemplate_839F220 = { + .tileTag = 0xffff, + .paletteTag = 4100, + .oam = &gOamData_839F104, + .anims = gSpriteAnimTable_839F1FC, + .images = gSpriteImageTable_839F160, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PokecenterMonitor +}; + + +const struct SpriteTemplate gSpriteTemplate_839F238 = { + .tileTag = 0xffff, + .paletteTag = 4112, + .oam = &gOamData_839F104, + .anims = gSpriteAnimTable_839F204, + .images = gSpriteImageTable_839F170, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_HallOfFameMonitor +}; + + +const struct SpriteTemplate gSpriteTemplate_839F250 = { + .tileTag = 0xffff, + .paletteTag = 4112, + .oam = &gOamData_839F150, + .anims = gSpriteAnimTable_839F204, + .images = gSpriteImageTable_839F178, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_HallOfFameMonitor +}; + +void (*const gUnknown_0839F268[])(struct Task *) = { + PokecenterHealEffect_0, + PokecenterHealEffect_1, + PokecenterHealEffect_2, + PokecenterHealEffect_3 +}; + +void (*const gUnknown_0839F278[])(struct Task *) = { + HallOfFameRecordEffect_0, + HallOfFameRecordEffect_1, + HallOfFameRecordEffect_2, + HallOfFameRecordEffect_3 +}; + +void (*const gUnknown_0839F288[])(struct Sprite *) = { + PokeballGlowEffect_0, + PokeballGlowEffect_1, + PokeballGlowEffect_2, + PokeballGlowEffect_3, + PokeballGlowEffect_4, + PokeballGlowEffect_5, + PokeballGlowEffect_6, + PokeballGlowEffect_7 +}; + +const struct Coords16 gUnknown_0839F2A8[] = { + {.x = 0, .y = 0}, + {.x = 6, .y = 0}, + {.x = 0, .y = 4}, + {.x = 6, .y = 4}, + {.x = 0, .y = 8}, + {.x = 6, .y = 8} +}; + +const u8 gUnknown_0839F2C0[] = {16, 12, 8, 0}; +const u8 gUnknown_0839F2C4[] = {16, 12, 8, 0}; +const u8 gUnknown_0839F2C8[] = { 0, 0, 0, 0}; + +bool8 (*const gUnknown_0839F2CC[])(struct Task *) = { + sub_80867AC, + sub_8086854, + sub_8086870, + sub_80868E4, + sub_808699C, + sub_80869B8, + sub_80869F8 +}; + +bool8 (*const gUnknown_0839F2E8[])(struct Task *) = { + sub_8086AA0, + sub_8086AC0, + sub_8086B30, + sub_8086B54, + sub_8086B64, + sub_8086B88 +}; + +bool8 (*const gUnknown_0839F300[])(struct Task *) = { + sub_8086CF4, + sub_8086D70, + sub_8086DB0, + sub_8086E10, + sub_8086E50, + sub_8086EB0, + sub_8086ED4 +}; + +bool8 (*const gUnknown_0839F31C[])(struct Task *, struct MapObject *) = { + sub_8086FB0, + waterfall_1_do_anim_probably, + waterfall_2_wait_anim_finish_probably, + sub_8087030, + sub_8087058 +}; + +bool8 (*const gUnknown_0839F330[])(struct Task *) = { + sub_8087124, + dive_2_unknown, + dive_3_unknown +}; + +bool8 (*const gUnknown_0839F33C[])(struct Task *, struct MapObject *, struct Sprite *) = { + sub_808722C, + sub_8087264, + sub_8087298, + sub_80872E4, + sub_80873D8, + sub_80873F4 +}; + +bool8 (*const gUnknown_0839F354[])(struct Task *, struct MapObject *, struct Sprite *) = { + sub_80874CC, + sub_80874FC, + sub_8087548, + sub_808759C +}; + +bool8 (*const gUnknown_0839F364[])(struct Task *, struct MapObject *, struct Sprite *) = { + sub_80876C8, + sub_80876F8, + sub_8087774, + sub_80877AC, + sub_80877D4 +}; + +void (*const gUnknown_0839F378[])(struct Task *) = { + sub_80878F4, + sub_8087914 +}; + +const u8 gUnknown_0839F380[] = {1, 3, 4, 2, 1}; + +void (*const gUnknown_0839F388[])(struct Task *) = { + sub_8087AA4, + sub_8087AC8 +}; + +void (*const gUnknown_0839F390[])(struct Task *) = { + sub_8087BEC, + sub_8087C14, + sub_8087CA4, + sub_8087D78 +}; + +void (*const gUnknown_0839F3A0[])(struct Task *) = { + sub_8087E4C, + sub_8087ED8, + sub_8087FDC +}; + +void (*const gUnknown_0839F3AC[])(struct Task *) = { + sub_8088150, + sub_80881C0, + sub_8088228, + sub_80882B4, + sub_80882E4, + sub_8088338, + sub_8088380 +}; + +void (*const gUnknown_0839F3C8[])(struct Task *) = { + sub_80884AC, + sub_80884E8, + sub_8088554, + sub_80885A8, + sub_80885D8, + sub_808860C, + sub_808862C +}; + +void (*const gUnknown_0839F3E4[])(struct Task *) = { + sub_8088984, + sub_80889E4, + sub_8088A30, + sub_8088A78, + sub_8088AF4 +}; + +void (*const gUnknown_0839F3F8[])(struct Task *) = { + sub_8088CA0, + sub_8088CF8, + sub_8088D3C, + sub_8088D94, + sub_8088DD8, + sub_8088E2C, + sub_8088EB4, + sub_8088F10, + sub_8088F30 +}; + +const union AffineAnimCmd SpriteAffineAnim_839F41C[] = { + AFFINEANIMCMD_FRAME(8, 8, -30, 0), + AFFINEANIMCMD_FRAME(28, 28, 0, 30), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd SpriteAffineAnim_839F434[] = { + AFFINEANIMCMD_FRAME(256, 256, 64, 0), + AFFINEANIMCMD_FRAME(-10, -10, 0, 22), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_0839F44C[] = { + SpriteAffineAnim_839F41C, + SpriteAffineAnim_839F434 +}; + +void (*const gUnknown_0839F454[])(struct Task *) = { + sub_80892A0, + sub_8089354, + sub_80893C0, + sub_8089414, + sub_808948C, + sub_80894C4, + fishE +}; + +const s16 gUnknown_0839F470[] = { + -2, + -4, + -5, + -6, + -7, + -8, + -8, + -8, + -7, + -7, + -6, + -5, + -3, + -2, + 0, + 2, + 4, + 8 +}; + +static u8 sActiveList[32]; + +extern u8 *gFieldEffectScriptPointers[]; + +u32 FieldEffectStart(u8 id) +{ + u8 *script; + u32 val; + + FieldEffectActiveListAdd(id); + + script = gFieldEffectScriptPointers[id]; + + while (gFieldEffectScriptFuncs[*script](&script, &val)) + ; + + return val; +} + +bool8 FieldEffectCmd_loadtiles(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadTiles(script); + return TRUE; +} + +bool8 FieldEffectCmd_loadfadedpal(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadFadedPalette(script); + return TRUE; +} + +bool8 FieldEffectCmd_loadpal(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadPalette(script); + return TRUE; +} + +bool8 FieldEffectCmd_callnative(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_CallNative(script, val); + return TRUE; +} + +bool8 FieldEffectCmd_end(u8 **script, u32 *val) +{ + return FALSE; +} + +bool8 FieldEffectCmd_loadgfx_callnative(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadTiles(script); + FieldEffectScript_LoadFadedPalette(script); + FieldEffectScript_CallNative(script, val); + return TRUE; +} + +bool8 FieldEffectCmd_loadtiles_callnative(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadTiles(script); + FieldEffectScript_CallNative(script, val); + return TRUE; +} + +bool8 FieldEffectCmd_loadfadedpal_callnative(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadFadedPalette(script); + FieldEffectScript_CallNative(script, val); + return TRUE; +} + +u32 FieldEffectScript_ReadWord(u8 **script) +{ + return (*script)[0] + + ((*script)[1] << 8) + + ((*script)[2] << 16) + + ((*script)[3] << 24); +} + +void FieldEffectScript_LoadTiles(u8 **script) +{ + struct SpriteSheet *sheet = (struct SpriteSheet *)FieldEffectScript_ReadWord(script); + if (GetSpriteTileStartByTag(sheet->tag) == 0xFFFF) + LoadSpriteSheet(sheet); + (*script) += 4; +} + +void FieldEffectScript_LoadFadedPalette(u8 **script) +{ + struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); + LoadSpritePalette(palette); + sub_807D78C(IndexOfSpritePaletteTag(palette->tag)); + (*script) += 4; +} + +void FieldEffectScript_LoadPalette(u8 **script) +{ + struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); + LoadSpritePalette(palette); + (*script) += 4; +} + +void FieldEffectScript_CallNative(u8 **script, u32 *val) +{ + u32 (*func)(void) = (u32 (*)(void))FieldEffectScript_ReadWord(script); + *val = func(); + (*script) += 4; +} + +void FieldEffectFreeGraphicsResources(struct Sprite *sprite) +{ + u16 sheetTileStart = sprite->sheetTileStart; + u32 paletteNum = sprite->oam.paletteNum; + DestroySprite(sprite); + FieldEffectFreeTilesIfUnused(sheetTileStart); + FieldEffectFreePaletteIfUnused(paletteNum); +} + +void FieldEffectStop(struct Sprite *sprite, u8 id) +{ + FieldEffectFreeGraphicsResources(sprite); + FieldEffectActiveListRemove(id); +} + +void FieldEffectFreeTilesIfUnused(u16 tileStart) +{ + u8 i; + u16 tag = GetSpriteTileTagByTileStart(tileStart); + + if (tag != 0xFFFF) + { + for (i = 0; i < MAX_SPRITES; i++) + if (gSprites[i].inUse && gSprites[i].usingSheet && tileStart == gSprites[i].sheetTileStart) + return; + FreeSpriteTilesByTag(tag); + } +} + +void FieldEffectFreePaletteIfUnused(u8 paletteNum) +{ + u8 i; + u16 tag = GetSpritePaletteTagByPaletteNum(paletteNum); + + if (tag != 0xFFFF) + { + for (i = 0; i < MAX_SPRITES; i++) + if (gSprites[i].inUse && gSprites[i].oam.paletteNum == paletteNum) + return; + FreeSpritePaletteByTag(tag); + } +} + +void FieldEffectActiveListClear(void) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sActiveList); i++) + sActiveList[i] = 0xFF; +} + +void FieldEffectActiveListAdd(u8 id) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sActiveList); i++) + { + if (sActiveList[i] == 0xFF) + { + sActiveList[i] = id; + return; + } + } +} + +void FieldEffectActiveListRemove(u8 id) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sActiveList); i++) + { + if (sActiveList[i] == id) + { + sActiveList[i] = 0xFF; + return; + } + } +} + +bool8 FieldEffectActiveListContains(u8 id) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sActiveList); i++) + if (sActiveList[i] == id) + return TRUE; + return FALSE; +} + +u8 CreateTrainerSprite_BirchSpeech(u8 gender, s16 x, s16 y, u8 subpriority, u8 *buffer) +{ + struct SpriteTemplate spriteTemplate; + LoadCompressedObjectPaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[gender], buffer); + LoadCompressedObjectPicOverrideBuffer(&gTrainerFrontPicTable[gender], buffer); + spriteTemplate.tileTag = gTrainerFrontPicTable[gender].tag; + spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[gender].tag; + spriteTemplate.oam = &gOamData_839F0F4; + spriteTemplate.anims = gDummySpriteAnimTable; + spriteTemplate.images = NULL; + spriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + spriteTemplate.callback = SpriteCallbackDummy; + return CreateSprite(&spriteTemplate, x, y, subpriority); +} + +void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) +{ + LZDecompressVram(gTrainerFrontPicTable[gender].data, dest); + LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, 0x20); +} + +u8 CreateBirchSprite(s16 x, s16 y, u8 subpriority) +{ + LoadSpritePalette(&gUnknown_0839F114); + return CreateSprite(&gSpriteTemplate_839F128, x, y, subpriority); +} + +u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) +{ + DecompressPicFromTable_2(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, gUnknown_081FAF4C[3], gUnknown_081FAF4C[3], species); + LoadCompressedObjectPalette(&gMonPaletteTable[species]); + GetMonSpriteTemplate_803C56C(species, 3); + gUnknown_02024E8C.paletteTag = gMonPaletteTable[0].tag; + sub_807DE38(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10); + return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); +} + +u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subpriority) +{ + const struct CompressedSpritePalette *spritePalette; + + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gUnknown_081FAF4C[3] /* this is actually u8* or something, pointing to ewram */, gUnknown_081FAF4C[3], species, g); + spritePalette = sub_80409C8(species, d, g); + LoadCompressedObjectPalette(spritePalette); + GetMonSpriteTemplate_803C56C(species, 3); + gUnknown_02024E8C.paletteTag = spritePalette->tag; + sub_807DE38(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); + return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); +} + +void FreeResourcesAndDestroySprite(struct Sprite *sprite) +{ + sub_807DE68(); + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); + if (sprite->oam.affineMode != 0) + { + FreeOamMatrix(sprite->oam.matrixNum); + } + DestroySprite(sprite); +} + +#ifdef NONMATCHING +void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + int curRed; + int curGreen; + int curBlue; + + curRed = gPlttBufferUnfaded[i] & 0x1f; + curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; + curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; + curRed += (((0x1f - curRed) * r) >> 4); + curGreen += (((0x1f - curGreen) * g) >> 4); + curBlue += (((0x1f - curBlue) * b) >> 4); + gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); +} + +void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + int curRed; + int curGreen; + int curBlue; + + curRed = gPlttBufferUnfaded[i] & 0x1f; + curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; + curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; + curRed -= ((curRed * r) >> 4); + curGreen -= ((curGreen * g) >> 4); + curBlue -= ((curBlue * b) >> 4); + gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); +} +#else +__attribute__((naked)) +void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + asm(".syntax unified\n" + "\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tlsls r0, 16\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tldr r4, _08085D00 @ =gPlttBufferUnfaded\n" + "\tlsrs r0, 15\n" + "\tadds r4, r0, r4\n" + "\tldrh r4, [r4]\n" + "\tmovs r5, 0x1F\n" + "\tmov r9, r5\n" + "\tmov r8, r4\n" + "\tmov r6, r8\n" + "\tands r6, r5\n" + "\tmov r8, r6\n" + "\tmovs r6, 0xF8\n" + "\tlsls r6, 2\n" + "\tands r6, r4\n" + "\tlsrs r6, 5\n" + "\tmovs r5, 0xF8\n" + "\tlsls r5, 7\n" + "\tands r4, r5\n" + "\tlsrs r4, 10\n" + "\tmov r7, r9\n" + "\tmov r5, r8\n" + "\tsubs r7, r5\n" + "\tmov r12, r7\n" + "\tmov r7, r12\n" + "\tmuls r7, r1\n" + "\tadds r1, r7, 0\n" + "\tasrs r1, 4\n" + "\tadd r8, r1\n" + "\tmov r5, r9\n" + "\tsubs r1, r5, r6\n" + "\tmuls r1, r2\n" + "\tasrs r1, 4\n" + "\tadds r6, r1\n" + "\tsubs r5, r4\n" + "\tmov r9, r5\n" + "\tmov r1, r9\n" + "\tmuls r1, r3\n" + "\tasrs r1, 4\n" + "\tadds r4, r1\n" + "\tmov r7, r8\n" + "\tlsls r7, 16\n" + "\tlsls r6, 21\n" + "\torrs r6, r7\n" + "\tlsls r4, 26\n" + "\torrs r4, r6\n" + "\tlsrs r4, 16\n" + "\tldr r1, _08085D04 @ =gPlttBufferFaded\n" + "\tadds r0, r1\n" + "\tstrh r4, [r0]\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08085D00: .4byte gPlttBufferUnfaded\n" + "_08085D04: .4byte gPlttBufferFaded\n" + ".syntax divided"); +} + +__attribute__((naked)) +void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + asm(".syntax unified\n" + "\tpush {r4-r6,lr}\n" + "\tmov r6, r8\n" + "\tpush {r6}\n" + "\tlsls r0, 16\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tldr r4, _08085D78 @ =gPlttBufferUnfaded\n" + "\tlsrs r0, 15\n" + "\tadds r4, r0, r4\n" + "\tldrh r4, [r4]\n" + "\tmovs r5, 0x1F\n" + "\tmov r8, r5\n" + "\tmov r6, r8\n" + "\tands r6, r4\n" + "\tmov r8, r6\n" + "\tmovs r5, 0xF8\n" + "\tlsls r5, 2\n" + "\tands r5, r4\n" + "\tlsrs r5, 5\n" + "\tmovs r6, 0xF8\n" + "\tlsls r6, 7\n" + "\tands r4, r6\n" + "\tlsrs r4, 10\n" + "\tmov r6, r8\n" + "\tmuls r6, r1\n" + "\tadds r1, r6, 0\n" + "\tasrs r1, 4\n" + "\tmov r6, r8\n" + "\tsubs r6, r1\n" + "\tadds r1, r5, 0\n" + "\tmuls r1, r2\n" + "\tasrs r1, 4\n" + "\tsubs r5, r1\n" + "\tadds r1, r4, 0\n" + "\tmuls r1, r3\n" + "\tasrs r1, 4\n" + "\tsubs r4, r1\n" + "\tlsls r6, 16\n" + "\tlsls r5, 21\n" + "\torrs r5, r6\n" + "\tlsls r4, 26\n" + "\torrs r4, r5\n" + "\tlsrs r4, 16\n" + "\tldr r1, _08085D7C @ =gPlttBufferFaded\n" + "\tadds r0, r1\n" + "\tstrh r4, [r0]\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08085D78: .4byte gPlttBufferUnfaded\n" + "_08085D7C: .4byte gPlttBufferFaded\n" + ".syntax divided"); +} +#endif + +void Task_PokecenterHeal(u8 taskId); +u8 CreatePokeballGlowSprite(s16, s16, s16, u16); +u8 PokecenterHealEffectHelper(s16, s16); + +bool8 FldEff_PokecenterHeal(void) +{ + u8 nPokemon; + struct Task *task; + + nPokemon = CalculatePlayerPartyCount(); + task = &gTasks[CreateTask(Task_PokecenterHeal, 0xff)]; + task->data[1] = nPokemon; + task->data[2] = 0x5d; + task->data[3] = 0x24; + task->data[4] = 0x7c; + task->data[5] = 0x18; + return FALSE; +} + +void Task_PokecenterHeal(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + gUnknown_0839F268[task->data[0]](task); +} + +void PokecenterHealEffect_0(struct Task *task) +{ + task->data[0]++; + task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 1); + task->data[7] = PokecenterHealEffectHelper(task->data[4], task->data[5]); +} + +void PokecenterHealEffect_1(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 1) + { + gSprites[task->data[7]].data0++; + task->data[0]++; + } +} + +void PokecenterHealEffect_2(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 4) + { + task->data[0]++; + } +} + +void PokecenterHealEffect_3(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 6) + { + DestroySprite(&gSprites[task->data[6]]); + FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL); + DestroyTask(FindTaskIdByFunc(Task_PokecenterHeal)); + } +} + +void Task_HallOfFameRecord(u8 taskId); +void HallOfFameRecordEffectHelper(s16, s16, s16, u8); + +bool8 FldEff_HallOfFameRecord(void) +{ + u8 nPokemon; + struct Task *task; + + nPokemon = CalculatePlayerPartyCount(); + task = &gTasks[CreateTask(Task_HallOfFameRecord, 0xff)]; + task->data[1] = nPokemon; + task->data[2] = 0x75; + task->data[3] = 0x34; + return FALSE; +} + +void Task_HallOfFameRecord(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + gUnknown_0839F278[task->data[0]](task); +} + +void HallOfFameRecordEffect_0(struct Task *task) +{ + u8 taskId; + task->data[0]++; + task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 0); + taskId = FindTaskIdByFunc(Task_HallOfFameRecord); + HallOfFameRecordEffectHelper(taskId, 0x78, 0x18, 0); + HallOfFameRecordEffectHelper(taskId, 0x28, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0x48, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0xa8, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0xc8, 0x08, 1); +} + +void HallOfFameRecordEffect_1(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 1) + { + task->data[15]++; // was this ever initialized? is this ever used? + task->data[0]++; + } +} + +void HallOfFameRecordEffect_2(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 4) + { + task->data[0]++; + } +} + +void HallOfFameRecordEffect_3(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 6) + { + DestroySprite(&gSprites[task->data[6]]); + FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD); + DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord)); + } +} + +void SpriteCB_PokeballGlowEffect(struct Sprite *); + +u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect); + sprite = &gSprites[spriteId]; + sprite->pos2.x = x; + sprite->pos2.y = y; + sprite->data5 = data5; + sprite->data6 = data6; + sprite->data7 = spriteId; + return spriteId; +} + +void SpriteCB_PokeballGlowEffect(struct Sprite *sprite) +{ + gUnknown_0839F288[sprite->data0](sprite); +} + +void PokeballGlowEffect_0(struct Sprite *sprite) +{ + u8 endSpriteId; + if (sprite->data1 == 0 || (--sprite->data1) == 0) + { + sprite->data1 = 25; + endSpriteId = CreateSpriteAtEnd(&gSpriteTemplate_839F208, gUnknown_0839F2A8[sprite->data2].x + sprite->pos2.x, gUnknown_0839F2A8[sprite->data2].y + sprite->pos2.y, 0); + gSprites[endSpriteId].oam.priority = 2; + gSprites[endSpriteId].data0 = sprite->data7; + sprite->data2++; + sprite->data6--; + PlaySE(SE_BOWA); + } + if (sprite->data6 == 0) + { + sprite->data1 = 32; + sprite->data0++; + } +} + +void PokeballGlowEffect_1(struct Sprite *sprite) +{ + if ((--sprite->data1) == 0) + { + sprite->data0++; + sprite->data1 = 8; + sprite->data2 = 0; + sprite->data3 = 0; + if (sprite->data5) + { + PlayFanfare(BGM_ME_ASA); + } + } +} + +void PokeballGlowEffect_2(struct Sprite *sprite) +{ + u8 phase; + if ((--sprite->data1) == 0) + { + sprite->data1 = 8; + sprite->data2++; + sprite->data2 &= 3; + if (sprite->data2 == 0) + { + sprite->data3++; + } + } + phase = (sprite->data2 + 3) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + phase = (sprite->data2 + 2) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + phase = (sprite->data2 + 1) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + phase = sprite->data2; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + if (sprite->data3 > 2) + { + sprite->data0++; + sprite->data1 = 8; + sprite->data2 = 0; + } +} + +void PokeballGlowEffect_3(struct Sprite *sprite) +{ + u8 phase; + if ((--sprite->data1) == 0) + { + sprite->data1 = 8; + sprite->data2++; + sprite->data2 &= 3; + if (sprite->data2 == 3) + { + sprite->data0++; + sprite->data1 = 30; + } + } + phase = sprite->data2; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); +} + +void PokeballGlowEffect_4(struct Sprite *sprite) +{ + if ((--sprite->data1) == 0) + { + sprite->data0++; + } +} + +void PokeballGlowEffect_5(struct Sprite *sprite) +{ + sprite->data0++; +} + +void PokeballGlowEffect_6(struct Sprite *sprite) +{ + if (sprite->data5 == 0 || IsFanfareTaskInactive()) + { + sprite->data0++; + } +} + +void PokeballGlowEffect_7(struct Sprite *sprite) +{ +} + +void SpriteCB_PokeballGlow(struct Sprite *sprite) +{ + if (gSprites[sprite->data0].data0 > 4) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +u8 PokecenterHealEffectHelper(s16 x, s16 y) +{ + u8 spriteIdAtEnd; + struct Sprite *sprite; + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F220, x, y, 0); + sprite = &gSprites[spriteIdAtEnd]; + sprite->oam.priority = 2; + sprite->invisible = 1; + SetSubspriteTables(sprite, &gUnknown_0839F1A0); + return spriteIdAtEnd; +} + +void SpriteCB_PokecenterMonitor(struct Sprite *sprite) +{ + if (sprite->data0 != 0) + { + sprite->data0 = 0; + sprite->invisible = 0; + StartSpriteAnim(sprite, 1); + } + if (sprite->animEnded) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +void HallOfFameRecordEffectHelper(s16 a0, s16 a1, s16 a2, u8 a3) +{ + u8 spriteIdAtEnd; + if (!a3) + { + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F238, a1, a2, 0); + SetSubspriteTables(&gSprites[spriteIdAtEnd], &gUnknown_0839F1C8); + } else + { + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F250, a1, a2, 0); + } + gSprites[spriteIdAtEnd].invisible = 1; + gSprites[spriteIdAtEnd].data0 = a0; +} + +void SpriteCB_HallOfFameMonitor(struct Sprite *sprite) +{ + if (gTasks[sprite->data0].data[15]) + { + if (sprite->data1 == 0 || (--sprite->data1) == 0) + { + sprite->data1 = 16; + sprite->invisible ^= 1; + } + sprite->data2++; + } + if (sprite->data2 > 127) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +void mapldr_080842E8(void); +void mapldr_08084390(void); +void task00_8084310(u8); +void c3_080843F8(u8); + +void sub_80865BC(void) +{ + SetMainCallback2(c2_exit_to_overworld_2_switch); + gFieldCallback = mapldr_080842E8; +} + +void mapldr_080842E8(void) +{ + pal_fill_black(); + CreateTask(task00_8084310, 0); + ScriptContext2_Enable(); + FreezeMapObjects(); + gFieldCallback = NULL; +} + +void task00_8084310(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + if (!task->data[0]) + { + if (!sub_807D770()) + { + return; + } + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; + if ((int)gUnknown_0202FF84[0] > 5) + { + gUnknown_0202FF84[0] = 0; + } + FieldEffectStart(FLDEFF_USE_FLY); + task->data[0]++; + } + if (!FieldEffectActiveListContains(FLDEFF_USE_FLY)) + { + flag_var_implications_of_teleport_(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + gFieldCallback = mapldr_08084390; + DestroyTask(taskId); + } +} + +void mapldr_08084390(void) +{ + sub_8053E90(); + pal_fill_black(); + CreateTask(c3_080843F8, 0); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + if (gPlayerAvatar.flags & 0x08) + { + FieldObjectTurn(&gMapObjects[gPlayerAvatar.mapObjectId], DIR_WEST); + } + ScriptContext2_Enable(); + FreezeMapObjects(); + gFieldCallback = NULL; +} + +void c3_080843F8(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + if (task->data[0] == 0) + { + if (gPaletteFade.active) + { + return; + } + FieldEffectStart(FLDEFF_FLY_IN); + task->data[0]++; + } + if (!FieldEffectActiveListContains(FLDEFF_FLY_IN)) + { + ScriptContext2_Disable(); + UnfreezeMapObjects(); + DestroyTask(taskId); + } +} + +extern void pal_fill_for_map_transition(void); +void sub_8086774(u8); +extern void CameraObjectReset2(void); +extern void CameraObjectReset1(void); + +void sub_8086748(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + FreezeMapObjects(); + CreateTask(sub_8086774, 0); + gFieldCallback = NULL; +} + +void sub_8086774(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F2CC[task->data[0]](task)); // return code signifies whether to continue blocking here +} + +bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0] +{ + struct MapObject *playerObject; + struct Sprite *playerSprite; + playerObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + playerSprite = &gSprites[gPlayerAvatar.spriteId]; + CameraObjectReset2(); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + gPlayerAvatar.unk6 = 1; + FieldObjectSetSpecialAnim(playerObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); + task->data[4] = playerSprite->subspriteMode; + playerObject->mapobj_bit_26 = 1; + playerSprite->oam.priority = 1; + playerSprite->subspriteMode = 2; + task->data[0]++; + return TRUE; +} + +bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1] +{ + if (sub_807D770()) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] +{ + struct Sprite *sprite; + s16 centerToCornerVecY; + sprite = &gSprites[gPlayerAvatar.spriteId]; + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); + task->data[1] = 1; + task->data[2] = 0; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; + PlaySE(SE_RU_HYUU); + task->data[0]++; + return FALSE; +} + +bool8 sub_80868E4(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.y += task->data[1]; + if (task->data[1] < 8) + { + task->data[2] += task->data[1]; + if (task->data[2] & 0xf) + { + task->data[1] <<= 1; + } + } + if (task->data[3] == 0 && sprite->pos2.y >= -16) + { + task->data[3]++; + mapObject->mapobj_bit_26 = 0; + sprite->subspriteMode = task->data[4]; + mapObject->mapobj_bit_2 = 1; + } + if (sprite->pos2.y >= 0) + { + PlaySE(SE_W070); + mapObject->mapobj_bit_3 = 1; + mapObject->mapobj_bit_5 = 1; + sprite->pos2.y = 0; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_808699C(struct Task *task) +{ + task->data[0]++; + task->data[1] = 4; + task->data[2] = 0; + SetCameraPanningCallback(NULL); + return TRUE; +} + +bool8 sub_80869B8(struct Task *task) +{ + SetCameraPanning(0, task->data[1]); + task->data[1] = -task->data[1]; + task->data[2]++; + if ((task->data[2] & 3) == 0) + { + task->data[1] >>= 1; + } + if (task->data[1] == 0) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80869F8(struct Task *task) +{ + gPlayerAvatar.unk6 = 0; + ScriptContext2_Disable(); + CameraObjectReset1(); + UnfreezeMapObjects(); + InstallCameraPanAheadCallback(); + DestroyTask(FindTaskIdByFunc(sub_8086774)); + return FALSE; +} + +void sub_8086A68(u8); +extern void sub_80B4824(u8); +extern void sub_8053FF8(void); +extern void fade_8080918(void); + +void sub_8086B98(struct Task *); +void sub_8086BE4(struct Task *); +void sub_8086C30(void); +void sub_8086C40(void); +bool8 sub_8054034(void); +void sub_8086C94(void); +void sub_80B483C(void); +void sub_8086CBC(u8); + +void sub_8086A2C(u8 a0, u8 priority) +{ + u8 taskId; + taskId = CreateTask(sub_8086A68, priority); + gTasks[taskId].data[1] = 0; + if (a0 == 0x6a) + { + gTasks[taskId].data[1] = 1; + } +} + +void sub_8086A68(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F2E8[task->data[0]](task)); +} + +bool8 sub_8086AA0(struct Task *task) +{ + FreezeMapObjects(); + CameraObjectReset2(); + sub_80B4824(task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086AC0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); + task->data[0]++; + task->data[2] = 0; + task->data[3] = 0; + if ((u8)task->data[1] == 0) + { + task->data[0] = 4; + } + PlaySE(SE_ESUKA); + } + return FALSE; +} + +bool8 sub_8086B30(struct Task *task) +{ + sub_8086B98(task); + if (task->data[2] > 3) + { + sub_8086C30(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086B54(struct Task *task) +{ + sub_8086B98(task); + sub_8086C40(); + return FALSE; +} + +bool8 sub_8086B64(struct Task *task) +{ + sub_8086BE4(task); + if (task->data[2] > 3) + { + sub_8086C30(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086B88(struct Task *task) +{ + sub_8086BE4(task); + sub_8086C40(); + return FALSE; +} + +void sub_8086B98(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[2]); + sprite->pos2.y = Sin(0x94, task->data[2]); + task->data[3]++; + if (task->data[3] & 1) + { + task->data[2]++; + } +} + +void sub_8086BE4(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[2]); + sprite->pos2.y = Sin(0x76, task->data[2]); + task->data[3]++; + if (task->data[3] & 1) + { + task->data[2]++; + } +} + +void sub_8086C30(void) +{ + sub_8053FF8(); + fade_8080918(); +} + +void sub_8086C40(void) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + sub_80B483C(); + warp_in(); + gFieldCallback = sub_8086C94; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_8086A68)); + } +} + +void sub_8086C94(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + CreateTask(sub_8086CBC, 0); + gFieldCallback = NULL; +} + +void sub_8086CBC(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F300[task->data[0]](task)); +} + +bool8 sub_8086CF4(struct Task *task) +{ + struct MapObject *mapObject; + s16 x; + s16 y; + u8 behavior; + CameraObjectReset2(); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(DIR_EAST)); + PlayerGetDestCoords(&x, &y); + behavior = MapGridGetMetatileBehaviorAt(x, y); + task->data[0]++; + task->data[1] = 16; + if (behavior == 0x6b) + { + behavior = 1; + task->data[0] = 3; + } else + { + behavior = 0; + } + sub_80B4824(behavior); + return TRUE; +} + +bool8 sub_8086D70(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[1]); + sprite->pos2.y = Sin(0x94, task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086DB0(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[1]); + sprite->pos2.y = Sin(0x94, task->data[1]); + task->data[2]++; + if (task->data[2] & 1) + { + task->data[1]--; + } + if (task->data[1] == 0) + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0] = 5; + } + return FALSE; +} + +bool8 sub_8086E10(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[1]); + sprite->pos2.y = Sin(0x76, task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086E50(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[1]); + sprite->pos2.y = Sin(0x76, task->data[1]); + task->data[2]++; + if (task->data[2] & 1) + { + task->data[1]--; + } + if (task->data[1] == 0) + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0]++; + } + return FALSE; +} + +extern bool8 sub_80B4850(void); + +bool8 sub_8086EB0(struct Task *task) +{ + if (sub_80B4850()) + { + return FALSE; + } + sub_80B483C(); + task->data[0]++; + return TRUE; +} + +bool8 sub_8086ED4(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + CameraObjectReset1(); + ScriptContext2_Disable(); + FieldObjectSetSpecialAnim(mapObject, GetGoSpeed0AnimId(DIR_EAST)); + DestroyTask(FindTaskIdByFunc(sub_8086CBC)); + } + return FALSE; +} + +void sub_8086F64(u8); + +bool8 FldEff_UseWaterfall(void) +{ + u8 taskId; + taskId = CreateTask(sub_8086F64, 0xff); + gTasks[taskId].data[1] = gUnknown_0202FF84[0]; + sub_8086F64(taskId); + return FALSE; +} + +void sub_8086F64(u8 taskId) +{ + while (gUnknown_0839F31C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])); +} + +bool8 sub_8086FB0(struct Task *task, struct MapObject *mapObject) +{ + ScriptContext2_Enable(); + gPlayerAvatar.unk6 = 1; + task->data[0]++; + return FALSE; +} + +bool8 waterfall_1_do_anim_probably(struct Task *task, struct MapObject *mapObject) +{ + ScriptContext2_Enable(); + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) + { + FieldObjectClearAnimIfSpecialAnimFinished(mapObject); + gUnknown_0202FF84[0] = task->data[1]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + } + return FALSE; +} + +bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct MapObject *mapObject) +{ + if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + return FALSE; + } + task->data[0]++; + return TRUE; +} + +bool8 sub_8087030(struct Task *task, struct MapObject *mapObject) +{ + FieldObjectSetSpecialAnim(mapObject, GetSimpleGoAnimId(DIR_NORTH)); + task->data[0]++; + return FALSE; +} + +bool8 sub_8087058(struct Task *task, struct MapObject *mapObject) +{ + if (!FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + return FALSE; + } + if (MetatileBehavior_IsWaterfall(mapObject->mapobj_unk_1E)) + { + task->data[0] = 3; + return TRUE; + } + ScriptContext2_Disable(); + gPlayerAvatar.unk6 = 0; + DestroyTask(FindTaskIdByFunc(sub_8086F64)); + FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL); + return FALSE; +} + +void Task_Dive(u8); +extern int dive_warp(struct MapPosition *, u16); + +bool8 FldEff_UseDive(void) +{ + u8 taskId; + taskId = CreateTask(Task_Dive, 0xff); + gTasks[taskId].data[15] = gUnknown_0202FF84[0]; + gTasks[taskId].data[14] = gUnknown_0202FF84[1]; + Task_Dive(taskId); + return FALSE; +} + +void Task_Dive(u8 taskId) +{ + while (gUnknown_0839F330[gTasks[taskId].data[0]](&gTasks[taskId])); +} + +bool8 sub_8087124(struct Task *task) +{ + gPlayerAvatar.unk6 = 1; + task->data[0]++; + return FALSE; +} + +bool8 dive_2_unknown(struct Task *task) +{ + ScriptContext2_Enable(); + gUnknown_0202FF84[0] = task->data[15]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + return FALSE; +} + +bool8 dive_3_unknown(struct Task *task) +{ + struct MapPosition mapPosition; + PlayerGetDestCoords(&mapPosition.x, &mapPosition.y); + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + dive_warp(&mapPosition, gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E); + DestroyTask(FindTaskIdByFunc(Task_Dive)); + FieldEffectActiveListRemove(FLDEFF_USE_DIVE); + } + return FALSE; +} + +void sub_80871D0(u8); +void mapldr_080851BC(void); + +void sub_80871B8(u8 priority) +{ + CreateTask(sub_80871D0, priority); +} + +void sub_80871D0(u8 taskId) +{ + while (gUnknown_0839F33C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_808722C(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + FreezeMapObjects(); + CameraObjectReset2(); + SetCameraPanningCallback(NULL); + gPlayerAvatar.unk6 = 1; + mapObject->mapobj_bit_26 = 1; + task->data[1] = 1; + task->data[0]++; + return TRUE; +} + +bool8 sub_8087264(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + SetCameraPanning(0, task->data[1]); + task->data[1] = -task->data[1]; + task->data[2]++; + if (task->data[2] > 7) + { + task->data[2] = 0; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8087298(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->pos2.y = 0; + task->data[3] = 1; + gUnknown_0202FF84[0] = mapObject->coords2.x; + gUnknown_0202FF84[1] = mapObject->coords2.y; + gUnknown_0202FF84[2] = sprite->subpriority - 1; + gUnknown_0202FF84[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_LAVARIDGE_GYM_WARP); + PlaySE(SE_W153); + task->data[0]++; + return TRUE; +} + +bool8 sub_80872E4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + s16 centerToCornerVecY; + SetCameraPanning(0, task->data[1]); + if (task->data[1] = -task->data[1], ++task->data[2] <= 17) + { + if (!(task->data[2] & 1) && (task->data[1] <= 3)) + { + task->data[1] <<= 1; + } + } else if (!(task->data[2] & 4) && (task->data[1] > 0)) + { + task->data[1] >>= 1; + } + if (task->data[2] > 6) + { + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + if (sprite->pos2.y > -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY)) + { + sprite->pos2.y -= task->data[3]; + if (task->data[3] <= 7) + { + task->data[3]++; + } + } else + { + task->data[4] = 1; + } + } + if (task->data[5] == 0 && sprite->pos2.y < -0x10) + { + task->data[5]++; + mapObject->mapobj_bit_26 = 1; + sprite->oam.priority = 1; + sprite->subspriteMode = 2; + } + if (task->data[1] == 0 && task->data[4] != 0) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80873D8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8053FF8(); + fade_8080918(); + task->data[0]++; + return FALSE; +} + +bool8 sub_80873F4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + warp_in(); + gFieldCallback = mapldr_080851BC; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_80871D0)); + } + return FALSE; +} + +void sub_8087470(u8); +extern u8 sub_80608A4(u8); + +void mapldr_080851BC(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + gFieldCallback = NULL; + CreateTask(sub_8087470, 0); +} + +void sub_8087470(u8 taskId) +{ + while (gUnknown_0839F354[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_80874CC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + CameraObjectReset2(); + FreezeMapObjects(); + gPlayerAvatar.unk6 = 1; + mapObject->mapobj_bit_13 = 1; + task->data[0]++; + return FALSE; +} + +bool8 sub_80874FC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_807D770()) + { + gUnknown_0202FF84[0] = mapObject->coords2.x; + gUnknown_0202FF84[1] = mapObject->coords2.y; + gUnknown_0202FF84[2] = sprite->subpriority - 1; + gUnknown_0202FF84[3] = sprite->oam.priority; + task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8087548(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite = &gSprites[task->data[1]]; + if (sprite->animCmdIndex > 1) + { + task->data[0]++; + mapObject->mapobj_bit_13 = 0; + CameraObjectReset1(); + PlaySE(SE_W091); + FieldObjectSetSpecialAnim(mapObject, sub_80608A4(DIR_EAST)); + } + return FALSE; +} + +bool8 sub_808759C(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + gPlayerAvatar.unk6 = 0; + ScriptContext2_Disable(); + UnfreezeMapObjects(); + DestroyTask(FindTaskIdByFunc(sub_8087470)); + } + return FALSE; +} + +extern void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy); +extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36]; + +u8 FldEff_LavaridgeGymWarp(void) +{ + u8 spriteId; + sub_8060470((s16 *)&gUnknown_0202FF84[0], (s16 *)&gUnknown_0202FF84[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]); + gSprites[spriteId].oam.priority = gUnknown_0202FF84[3]; + gSprites[spriteId].coordOffsetEnabled = 1; + return spriteId; +} + +void sub_8087638(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_LAVARIDGE_GYM_WARP); + } +} + +void sub_808766C(u8); + +void sub_8087654(u8 priority) +{ + CreateTask(sub_808766C, priority); +} + +void sub_808766C(u8 taskId) +{ + while(gUnknown_0839F364[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_80876C8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + FreezeMapObjects(); + CameraObjectReset2(); + gPlayerAvatar.unk6 = 1; + mapObject->mapobj_bit_26 = 1; + task->data[0]++; + return FALSE; +} + +bool8 sub_80876F8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + if (task->data[1] > 3) + { + gUnknown_0202FF84[0] = mapObject->coords2.x; + gUnknown_0202FF84[1] = mapObject->coords2.y; + gUnknown_0202FF84[2] = sprite->subpriority - 1; + gUnknown_0202FF84[3] = sprite->oam.priority; + task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } else + { + task->data[1]++; + FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); + PlaySE(SE_FU_ZUZUZU); + } + } + return FALSE; +} + +bool8 sub_8087774(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gSprites[task->data[1]].animCmdIndex == 2) + { + mapObject->mapobj_bit_13 = 1; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80877AC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) + { + sub_8053FF8(); + fade_8080918(); + task->data[0]++; + } + return FALSE; +} + +void sub_80878C4(u8); +void mapldr_080859D4(void); + +bool8 sub_80877D4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + warp_in(); + gFieldCallback = sub_8086748; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_808766C)); + } + return FALSE; +} + +u8 FldEff_PopOutOfAsh(void) +{ + u8 spriteId; + sub_8060470((s16 *)&gUnknown_0202FF84[0], (s16 *)&gUnknown_0202FF84[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]); + gSprites[spriteId].oam.priority = gUnknown_0202FF84[3]; + gSprites[spriteId].coordOffsetEnabled = 1; + return spriteId; +} + +void sub_808788C(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_POP_OUT_OF_ASH); + } +} + +void sub_80878A8(void) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + CreateTask(sub_80878C4, 0x50); +} + +void sub_80878C4(u8 taskId) +{ + gUnknown_0839F378[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80878F4(struct Task *task) +{ + task->data[0]++; + task->data[14] = 64; + task->data[15] = player_get_direction_lower_nybble(); +} + +void sub_8087914(struct Task *task) +{ + struct MapObject *mapObject; + u8 unknown_0839F380[5]; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + if (task->data[14] != 0 && (--task->data[14]) == 0) + { + sub_8053FF8(); + fade_8080918(); + } + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + if (task->data[14] == 0 && !gPaletteFade.active && sub_8054034() == TRUE) + { + FieldObjectSetDirection(mapObject, task->data[15]); + sub_8053678(); + warp_in(); + gFieldCallback = mapldr_080859D4; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_80878C4)); + } else if (task->data[1] == 0 || (--task->data[1]) == 0) + { + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(unknown_0839F380[mapObject->mapobj_unk_18])); + if (task->data[2] < 12) + { + task->data[2]++; + } + task->data[1] = 8 >> (task->data[2] >> 2); + } + } +} + +void sub_8087A74(u8); + +void mapldr_080859D4(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + FreezeMapObjects(); + gFieldCallback = NULL; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + CreateTask(sub_8087A74, 0); +} + +void sub_8087A74(u8 taskId) +{ + gUnknown_0839F388[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8087AA4(struct Task *task) +{ + if (sub_807D770()) + { + task->data[0]++; + task->data[15] = player_get_direction_lower_nybble(); + } +} + +void sub_8087AC8(struct Task *task) +{ + struct MapObject *mapObject; + u8 unknown_0839F380[5]; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (task->data[1] == 0 || (--task->data[1]) == 0) + { + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) && !FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + return; + } + if (task->data[2] >= 32 && task->data[15] == player_get_direction_lower_nybble()) + { + mapObject->mapobj_bit_13 = 0; + ScriptContext2_Disable(); + UnfreezeMapObjects(); + DestroyTask(FindTaskIdByFunc(sub_8087A74)); + return; + } + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(unknown_0839F380[mapObject->mapobj_unk_18])); + if (task->data[2] < 32) + { + task->data[2]++; + } + task->data[1] = task->data[2] >> 2; + } + mapObject->mapobj_bit_13 ^= 1; +} + +void sub_8087BBC(u8); +void mapldr_08085D88(void); + +void sub_8087BA8(void) +{ + CreateTask(sub_8087BBC, 0); +} + +void sub_8087BBC(u8 taskId) +{ + gUnknown_0839F390[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8087BEC(struct Task *task) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + CameraObjectReset2(); + task->data[15] = player_get_direction_lower_nybble(); + task->data[0]++; +} + +void sub_8087C14(struct Task *task) +{ + struct MapObject *mapObject; + u8 unknown_0839F380[5]; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (task->data[1] == 0 || (--task->data[1]) == 0) + { + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + task->data[1] = 8; + task->data[2]++; + } + if (task->data[2] > 7 && task->data[15] == mapObject->mapobj_unk_18) + { + task->data[0]++; + task->data[1] = 4; + task->data[2] = 8; + task->data[3] = 1; + PlaySE(SE_TK_WARPIN); + } +} + +void sub_8087CA4(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + u8 unknown_0839F380[5]; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[gPlayerAvatar.spriteId]; + if ((--task->data[1]) <= 0) + { + task->data[1] = 4; + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + } + sprite->pos1.y -= task->data[3]; + task->data[4] += task->data[3]; + if ((--task->data[2]) <= 0 && (task->data[2] = 4, task->data[3] < 8)) + { + task->data[3] <<= 1; + } + if (task->data[4] > 8 && (sprite->oam.priority = 1, sprite->subspriteMode != 0)) + { + sprite->subspriteMode = 2; + } + if (task->data[4] >= 0xa8) + { + task->data[0]++; + sub_8053FF8(); + fade_8080918(); + } +} + +void sub_8087D78(struct Task *task) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + sub_8053570(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + gFieldCallback = mapldr_08085D88; + DestroyTask(FindTaskIdByFunc(sub_8087BBC)); + } +} + +void sub_8087E1C(u8); + +void mapldr_08085D88(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + FreezeMapObjects(); + gFieldCallback = NULL; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + CameraObjectReset2(); + CreateTask(sub_8087E1C, 0); +} + +void sub_8087E1C(u8 taskId) +{ + gUnknown_0839F3A0[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8087E4C(struct Task *task) +{ + struct Sprite *sprite; + s16 centerToCornerVecY; + if (sub_807D770()) + { + sprite = &gSprites[gPlayerAvatar.spriteId]; + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; + task->data[0]++; + task->data[1] = 8; + task->data[2] = 1; + task->data[14] = sprite->subspriteMode; + task->data[15] = player_get_direction_lower_nybble(); + PlaySE(SE_TK_WARPIN); + } +} + +void sub_8087ED8(struct Task *task) +{ + u8 unknown_0839F380[5]; + struct MapObject *mapObject; + struct Sprite *sprite; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[gPlayerAvatar.spriteId]; + if ((sprite->pos2.y += task->data[1]) >= -8) + { + if (task->data[13] == 0) + { + task->data[13]++; + mapObject->mapobj_bit_2 = 1; + sprite->subspriteMode = task->data[14]; + } + } else + { + sprite->oam.priority = 1; + if (sprite->subspriteMode != 0) + { + sprite->subspriteMode = 2; + } + } + if (sprite->pos2.y >= -0x30 && task->data[1] > 1 && !(sprite->pos2.y & 1)) + { + task->data[1]--; + } + if ((--task->data[2]) == 0) + { + task->data[2] = 4; + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + } + if (sprite->pos2.y >= 0) + { + sprite->pos2.y = 0; + task->data[0]++; + task->data[1] = 1; + task->data[2] = 0; + } +} + +void sub_8087FDC(struct Task *task) +{ + u8 unknown_0839F380[5]; + struct MapObject *mapObject; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if ((--task->data[1]) == 0) + { + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + task->data[1] = 8; + if ((++task->data[2]) > 4 && task->data[14] == mapObject->mapobj_unk_18) + { + ScriptContext2_Disable(); + CameraObjectReset1(); + UnfreezeMapObjects(); + DestroyTask(FindTaskIdByFunc(sub_8087E1C)); + } + } +} + +void sub_8088120(u8); +void sub_808847C(u8); +u8 sub_8088830(u32, u32, u32); +void sub_80883DC(void); +void sub_808843C(u16); +void sub_8088890(struct Sprite *); + +bool8 FldEff_FieldMoveShowMon(void) +{ + u8 taskId; + if (is_light_level_1_2_3_5_or_6(sav1_map_get_light_level()) == TRUE) + { + taskId = CreateTask(sub_8088120, 0xff); + } else + { + taskId = CreateTask(sub_808847C, 0xff); + } + gTasks[taskId].data[15] = sub_8088830(gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]); + return FALSE; +} + +bool8 FldEff_FieldMoveShowMonInit(void) +{ + struct Pokemon *pokemon; + u32 flag = gUnknown_0202FF84[0] & 0x80000000; + pokemon = &gPlayerParty[(u8)gUnknown_0202FF84[0]]; + gUnknown_0202FF84[0] = GetMonData(pokemon, MON_DATA_SPECIES); + gUnknown_0202FF84[1] = GetMonData(pokemon, MON_DATA_OT_ID); + gUnknown_0202FF84[2] = GetMonData(pokemon, MON_DATA_PERSONALITY); + gUnknown_0202FF84[0] |= flag; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + return FALSE; +} + +void sub_8088120(u8 taskId) +{ + gUnknown_0839F3AC[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8088150(struct Task *task) +{ + task->data[11] = REG_WININ; + task->data[12] = REG_WINOUT; + StoreWordInTwoHalfwords(&task->data[13], (u32)gMain.vblankCallback); + task->data[1] = 0xf0f1; + task->data[2] = 0x5051; + task->data[3] = 0x3f; + task->data[4] = 0x3e; + REG_WIN0H = task->data[1]; + REG_WIN0V = task->data[2]; + REG_WININ = task->data[3]; + REG_WINOUT = task->data[4]; + SetVBlankCallback(sub_80883DC); + task->data[0]++; +} + +void sub_80881C0(struct Task *task) +{ + u16 offset; + u16 delta; + offset = ((REG_BG0CNT >> 2) << 14); + delta = ((REG_BG0CNT >> 8) << 11); + CpuCopy16(gFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x200); + CpuFill32(0, (void *)(VRAM + delta), 0x800); + LoadPalette(gFieldMoveStreaksPalette, 0xf0, 0x20); + sub_808843C(delta); + task->data[0]++; +} + +void sub_8088228(struct Task *task) +{ + s16 v0; + s16 v2; + s16 v3; + task->data[5] -= 16; + v0 = ((u16)task->data[1] >> 8); + v2 = ((u16)task->data[2] >> 8); + v3 = ((u16)task->data[2] & 0xff); + v0 -= 16; + v2 -= 2; + v3 += 2; + if (v0 < 0) + { + v0 = 0; + } + if (v2 < 0x28) + { + v2 = 0x28; + } + if (v3 > 0x78) + { + v3 = 0x78; + } + task->data[1] = (v0 << 8) | (task->data[1] & 0xff); + task->data[2] = (v2 << 8) | v3; + if (v0 == 0 && v2 == 0x28 && v3 == 0x78) + { + gSprites[task->data[15]].callback = sub_8088890; + task->data[0]++; + } +} + +void sub_80882B4(struct Task *task) +{ + task->data[5] -= 16; + if (gSprites[task->data[15]].data7) + { + task->data[0]++; + } +} + +void sub_80882E4(struct Task *task) +{ + s16 v2; + s16 v3; + task->data[5] -= 16; + v2 = (task->data[2] >> 8); + v3 = (task->data[2] & 0xff); + v2 += 6; + v3 -= 6; + if (v2 > 0x50) + { + v2 = 0x50; + } + if (v3 < 0x51) + { + v3 = 0x51; + } + task->data[2] = (v2 << 8) | v3; + if (v2 == 0x50 && v3 == 0x51) + { + task->data[0]++; + } +} + +void sub_8088338(struct Task *task) +{ + u16 bg0cnt; + bg0cnt = (REG_BG0CNT >> 8) << 11; + CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); + task->data[1] = 0xf1; + task->data[2] = 0xa1; + task->data[3] = task->data[11]; + task->data[4] = task->data[12]; + task->data[0]++; +} + +void sub_8088380(struct Task *task) +{ + IntrCallback callback; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); + SetVBlankCallback(callback); + SetUpWindowConfig(&gWindowConfig_81E6CE4); + InitMenuWindow(&gWindowConfig_81E6CE4); + FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + DestroyTask(FindTaskIdByFunc(sub_8088120)); +} + +void sub_80883DC(void) +{ + struct Task *task; + IntrCallback callback; + task = &gTasks[FindTaskIdByFunc(sub_8088120)]; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); + callback(); + REG_WIN0H = task->data[1]; + REG_WIN0V = task->data[2]; + REG_WININ = task->data[3]; + REG_WINOUT = task->data[4]; + REG_BG0HOFS = task->data[5]; + REG_BG0VOFS = task->data[6]; +} + +void sub_808843C(u16 offs) +{ + u16 i; + u16 *dest; + dest = (u16 *)(VRAM + 0x140 + offs); + for (i=0; i<0x140; i++, dest++) + { + *dest = gFieldMoveStreaksTilemap[i] | 0xf000; + } +} + +void sub_80886B0(void); +bool8 sub_8088708(struct Task *); +void sub_80886F8(struct Task *); +bool8 sub_80887C0(struct Task *); + +void sub_808847C(u8 taskId) +{ + gUnknown_0839F3C8[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80884AC(struct Task *task) +{ + REG_BG0HOFS = task->data[1]; + REG_BG0VOFS = task->data[2]; + StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback); + SetVBlankCallback(sub_80886B0); + task->data[0]++; +} + +void sub_80884E8(struct Task *task) +{ + u16 offset; + u16 delta; + offset = ((REG_BG0CNT >> 2) << 14); + delta = ((REG_BG0CNT >> 8) << 11); + task->data[12] = delta; + CpuCopy16(gDarknessFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x80); + CpuFill32(0, (void *)(VRAM + delta), 0x800); + LoadPalette(gDarknessFieldMoveStreaksPalette, 0xf0, 0x20); + task->data[0]++; +} + +void sub_8088554(struct Task *task) +{ + if (sub_8088708(task)) + { + REG_WIN1H = 0x00f0; + REG_WIN1V = 0x2878; + gSprites[task->data[15]].callback = sub_8088890; + task->data[0]++; + } + sub_80886F8(task); +} + +void sub_80885A8(struct Task *task) +{ + sub_80886F8(task); + if (gSprites[task->data[15]].data7) + { + task->data[0]++; + } +} + +void sub_80885D8(struct Task *task) +{ + sub_80886F8(task); + task->data[3] = task->data[1] & 7; + task->data[4] = 0; + REG_WIN1H = 0xffff; + REG_WIN1V = 0xffff; + task->data[0]++; +} + +void sub_808860C(struct Task *task) +{ + sub_80886F8(task); + if (sub_80887C0(task)) + { + task->data[0]++; + } +} + +void sub_808862C(struct Task *task) +{ + IntrCallback intrCallback; + u16 bg0cnt; + bg0cnt = (REG_BG0CNT >> 8) << 11; + CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); + SetVBlankCallback(intrCallback); + SetUpWindowConfig(&gWindowConfig_81E6CE4); + InitMenuWindow(&gWindowConfig_81E6CE4); + FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + DestroyTask(FindTaskIdByFunc(sub_808847C)); +} + +void sub_80886B0(void) +{ + IntrCallback intrCallback; + struct Task *task; + task = &gTasks[FindTaskIdByFunc(sub_808847C)]; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); + intrCallback(); + REG_BG0HOFS = task->data[1]; + REG_BG0VOFS = task->data[2]; +} + +void sub_80886F8(struct Task *task) +{ + task->data[1] -= 16; + task->data[3] += 16; +} + +#ifdef NONMATCHING +bool8 sub_8088708(struct Task *task) +{ + u16 i; + u16 srcOffs; + u16 dstOffs; + u16 *dest; + if (task->data[4] >= 32) + { + return TRUE; + } + dstOffs = (task->data[3] >> 3) & 0x1f; + if (dstOffs >= task->data[4]) + { + dstOffs = (32 - dstOffs) & 0x1f; + srcOffs = (32 - task->data[4]) & 0x1f; + dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); + for (i=0; i<10; i++) + { + dest[dstOffs + i * 32] = gDarknessFieldMoveStreaksTilemap[srcOffs + i * 32] | 0xf000; + dest[((dstOffs + 1) & 0x1f) + i * 32] = gDarknessFieldMoveStreaksTilemap[((srcOffs + 1) & 0x1f) + i * 32] | 0xf000; + } + task->data[4] += 2; + } + return FALSE; +} +#else +__attribute__((naked)) +bool8 sub_8088708(struct Task *task) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x4\n" + "\tadds r5, r0, 0\n" + "\tldrh r2, [r5, 0x10]\n" + "\tmovs r1, 0x10\n" + "\tldrsh r0, [r5, r1]\n" + "\tcmp r0, 0x1F\n" + "\tble _08088724\n" + "\tmovs r0, 0x1\n" + "\tb _080887A8\n" + "_08088724:\n" + "\tldrh r0, [r5, 0xE]\n" + "\tlsls r0, 16\n" + "\tasrs r3, r0, 19\n" + "\tmovs r1, 0x1F\n" + "\tands r3, r1\n" + "\tmovs r4, 0x10\n" + "\tldrsh r0, [r5, r4]\n" + "\tcmp r3, r0\n" + "\tblt _080887A6\n" + "\tmovs r0, 0x20\n" + "\tsubs r3, r0, r3\n" + "\tands r3, r1\n" + "\tsubs r0, r2\n" + "\tmov r12, r0\n" + "\tmov r7, r12\n" + "\tands r7, r1\n" + "\tmov r12, r7\n" + "\tldrh r0, [r5, 0x20]\n" + "\tldr r1, _080887B8 @ =0x06000140\n" + "\tadds r1, r0\n" + "\tmov r8, r1\n" + "\tmovs r4, 0\n" + "\tldr r7, _080887BC @ =gDarknessFieldMoveStreaksTilemap\n" + "\tmov r10, r7\n" + "\tmovs r0, 0xF0\n" + "\tlsls r0, 8\n" + "\tmov r9, r0\n" + "\tadds r1, r3, 0x1\n" + "\tmovs r0, 0x1F\n" + "\tands r1, r0\n" + "\tstr r1, [sp]\n" + "\tmov r6, r12\n" + "\tadds r6, 0x1\n" + "\tands r6, r0\n" + "_08088768:\n" + "\tlsls r1, r4, 5\n" + "\tadds r2, r1, r3\n" + "\tlsls r2, 1\n" + "\tadd r2, r8\n" + "\tmov r7, r12\n" + "\tadds r0, r7, r1\n" + "\tlsls r0, 1\n" + "\tadd r0, r10\n" + "\tldrh r0, [r0]\n" + "\tmov r7, r9\n" + "\torrs r0, r7\n" + "\tstrh r0, [r2]\n" + "\tldr r0, [sp]\n" + "\tadds r2, r1, r0\n" + "\tlsls r2, 1\n" + "\tadd r2, r8\n" + "\tadds r1, r6, r1\n" + "\tlsls r1, 1\n" + "\tadd r1, r10\n" + "\tldrh r0, [r1]\n" + "\tmov r1, r9\n" + "\torrs r0, r1\n" + "\tstrh r0, [r2]\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r4, r0, 16\n" + "\tcmp r4, 0x9\n" + "\tbls _08088768\n" + "\tldrh r0, [r5, 0x10]\n" + "\tadds r0, 0x2\n" + "\tstrh r0, [r5, 0x10]\n" + "_080887A6:\n" + "\tmovs r0, 0\n" + "_080887A8:\n" + "\tadd sp, 0x4\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" + "_080887B8: .4byte 0x06000140\n" + "_080887BC: .4byte gDarknessFieldMoveStreaksTilemap"); +} +#endif + +bool8 sub_80887C0(struct Task *task) +{ + u16 i; + u16 dstOffs; + u16 *dest; + if (task->data[4] >= 32) + { + return TRUE; + } + dstOffs = task->data[3] >> 3; + if (dstOffs >= task->data[4]) + { + dstOffs = (task->data[1] >> 3) & 0x1f; + dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); + for (i=0; i<10; i++) + { + dest[dstOffs + i * 32] = 0xf000; + dest[((dstOffs + 1) & 0x1f) + i * 32] = 0xf000; + } + task->data[4] += 2; + } + return FALSE; +} + +u8 sub_8088830(u32 a0, u32 a1, u32 a2) +{ + u16 v0; + u8 monSprite; + struct Sprite *sprite; + v0 = (a0 & 0x80000000) >> 16; + a0 &= 0x7fffffff; + monSprite = CreateMonSprite_FieldMove(a0, a1, a2, 0x140, 0x50, 0); + sprite = &gSprites[monSprite]; + sprite->callback = SpriteCallbackDummy; + sprite->oam.priority = 0; + sprite->data0 = a0; + sprite->data6 = v0; + return monSprite; +} + +void sub_80888D4(struct Sprite *); + +void sub_8088890(struct Sprite *sprite) +{ + if ((sprite->pos1.x -= 20) <= 0x78) + { + sprite->pos1.x = 0x78; + sprite->data1 = 30; + sprite->callback = sub_80888D4; + if (sprite->data6) + { + PlayCry2(sprite->data0, 0, 0x7d, 0xa); + } else + { + PlayCry1(sprite->data0, 0); + } + } +} + +void sub_80888F0(struct Sprite *); + +void sub_80888D4(struct Sprite *sprite) +{ + if ((--sprite->data1) == 0) + { + sprite->callback = sub_80888F0; + } +} + +void sub_80888F0(struct Sprite *sprite) +{ + if (sprite->pos1.x < -0x40) + { + sprite->data7 = 1; + } else + { + sprite->pos1.x -= 20; + } +} + +void sub_8088954(u8); + +u8 FldEff_UseSurf(void) +{ + u8 taskId; + taskId = CreateTask(sub_8088954, 0xff); + gTasks[taskId].data[15] = gUnknown_0202FF84[0]; + sav1_reset_battle_music_maybe(); + sub_8053FB0(0x016d); + return FALSE; +} + +void sub_8088954(u8 taskId) +{ + gUnknown_0839F3E4[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8088984(struct Task *task) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + gPlayerAvatar.unk6 = 1; + SetPlayerAvatarStateMask(8); + PlayerGetDestCoords(&task->data[1], &task->data[2]); + MoveCoords(gMapObjects[gPlayerAvatar.mapObjectId].placeholder18, &task->data[1], &task->data[2]); + task->data[0]++; +} + +void sub_80889E4(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + sub_8059BF4(); + FieldObjectSetSpecialAnim(mapObject, 0x39); + task->data[0]++; + } +} + +void sub_8088A30(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject)) + { + gUnknown_0202FF84[0] = task->data[15] | 0x80000000; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + } +} + +void sub_8088A78(struct Task *task) +{ + struct MapObject *mapObject; + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(3)); + FieldObjectClearAnimIfSpecialAnimFinished(mapObject); + FieldObjectSetSpecialAnim(mapObject, sub_80608D0(mapObject->placeholder18)); + gUnknown_0202FF84[0] = task->data[1]; + gUnknown_0202FF84[1] = task->data[2]; + gUnknown_0202FF84[2] = gPlayerAvatar.mapObjectId; + mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_SURF_BLOB); + task->data[0]++; + } +} + +void sub_8088AF4(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + gPlayerAvatar.unk6 = 0; + gPlayerAvatar.flags &= 0xdf; + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(mapObject->placeholder18)); + sub_8127ED0(mapObject->mapobj_unk_1A, 1); + UnfreezeMapObjects(); + ScriptContext2_Disable(); + FieldEffectActiveListRemove(FLDEFF_USE_SURF); + DestroyTask(FindTaskIdByFunc(sub_8088954)); + } +} + +void sub_8088BC4(struct Sprite *); + +u8 FldEff_NPCFlyOut(void) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0x78, 0, 1); + sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = 0; + sprite->oam.priority = 1; + sprite->callback = sub_8088BC4; + sprite->data1 = gUnknown_0202FF84[0]; + PlaySE(SE_W019); + return spriteId; +} + +void sub_8088BC4(struct Sprite *sprite) +{ + struct Sprite *npcSprite; + sprite->pos2.x = Cos(sprite->data2, 0x8c); + sprite->pos2.y = Sin(sprite->data2, 0x48); + sprite->data2 = (sprite->data2 + 4) & 0xff; + if (sprite->data0) + { + npcSprite = &gSprites[sprite->data1]; + npcSprite->coordOffsetEnabled = 0; + npcSprite->pos1.x = sprite->pos1.x + sprite->pos2.x; + npcSprite->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; + npcSprite->pos2.x = 0; + npcSprite->pos2.y = 0; + } + if (sprite->data2 >= 0x80) + { + FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT); + } +} + +void sub_8088C70(u8); +extern void sub_8127EFC(u8, u8); +u8 sub_8088F60(void); +bool8 sub_8088FA4(u8); +void sub_8088FC0(u8); +void sub_8088FFC(u8, u8); +void sub_8089018(struct Sprite *); +void sub_80890D8(struct Sprite *); + +u8 FldEff_UseFly(void) +{ + u8 taskId; + taskId = CreateTask(sub_8088C70, 0xfe); + gTasks[taskId].data[1] = gUnknown_0202FF84[0]; + return 0; +} + +void sub_8088C70(u8 taskId) +{ + gUnknown_0839F3F8[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8088CA0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[15] = gPlayerAvatar.flags; + gPlayerAvatar.unk6 = 0x01; + SetPlayerAvatarStateMask(1); + sub_8059BF4(); + FieldObjectSetSpecialAnim(mapObject, 0x39); + task->data[0]++; + } +} + +void sub_8088CF8(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[0]++; + gUnknown_0202FF84[0] = task->data[1]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + } +} + +void sub_8088D3C(struct Task *task) +{ + struct MapObject *mapObject; + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (task->data[15] & 0x08) + { + sub_8127ED0(mapObject->mapobj_unk_1A, 2); + sub_8127EFC(mapObject->mapobj_unk_1A, 0); + } + task->data[1] = sub_8088F60(); + task->data[0]++; + } +} + +void sub_8088D94(struct Task *task) +{ + if (sub_8088FA4(task->data[1])) + { + task->data[0]++; + task->data[2] = 16; + SetPlayerAvatarTransitionFlags(0x01); + FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], 0x02); + } +} + +void sub_8088DD8(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if ((task->data[2] == 0 || (--task->data[2]) == 0) && FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[0]++; + PlaySE(SE_W019); + sub_8088FC0(task->data[1]); + } +} + +void sub_8088E2C(struct Task *task) +{ + struct MapObject *mapObject; + if ((++task->data[2]) >= 8) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(0x03)); + StartSpriteAnim(&gSprites[mapObject->spriteId], 0x16); + mapObject->mapobj_bit_12 = 1; + FieldObjectSetSpecialAnim(mapObject, 0x48); + if (task->data[15] & 0x08) + { + DestroySprite(&gSprites[mapObject->mapobj_unk_1A]); + } + task->data[0]++; + task->data[2] = 0; + } +} + +void sub_8088EB4(struct Task *task) +{ + struct MapObject *mapObject; + if ((++task->data[2]) >= 10) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + FieldObjectClearAnimIfSpecialAnimActive(mapObject); + mapObject->mapobj_bit_12 = 0; + mapObject->mapobj_bit_22 = 0; + sub_8088FFC(task->data[1], mapObject->spriteId); + CameraObjectReset2(); + task->data[0]++; + } +} + +void sub_8088F10(struct Task *task) +{ + if (sub_8088FA4(task->data[1])) + { + fade_8080918(); + task->data[0]++; + } +} + +void sub_8088F30(struct Task *task) +{ + if (!gPaletteFade.active) + { + FieldEffectActiveListRemove(FLDEFF_USE_FLY); + DestroyTask(FindTaskIdByFunc(sub_8088C70)); + } +} + +u8 sub_8088F60(void) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0xff, 0xb4, 0x1); + sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = 0; + sprite->oam.priority = 1; + sprite->callback = sub_8089018; + return spriteId; +} + +u8 sub_8088FA4(u8 spriteId) +{ + return gSprites[spriteId].data7; +} + +void sub_8088FC0(u8 spriteId) +{ + struct Sprite *sprite; + sprite = &gSprites[spriteId]; + sprite->callback = sub_80890D8; + sprite->pos1.x = 0x78; + sprite->pos1.y = 0x00; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + memset(&sprite->data0, 0, 8 * sizeof(u16) /* zero all data cells */); + sprite->data6 = 0x40; +} + +void sub_8088FFC(u8 a0, u8 a1) +{ + gSprites[a0].data6 = a1; +} + +void sub_8089018(struct Sprite *sprite) +{ + if (sprite->data7 == 0) + { + if (sprite->data0 == 0) + { + sprite->oam.affineMode = 3; + sprite->affineAnims = gSpriteAffineAnimTable_0839F44C; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, 0); + sprite->pos1.x = 0x76; + sprite->pos1.y = -0x30; + sprite->data0++; + sprite->data1 = 0x40; + sprite->data2 = 0x100; + } + sprite->data1 += (sprite->data2 >> 8); + sprite->pos2.x = Cos(sprite->data1, 0x78); + sprite->pos2.y = Sin(sprite->data1, 0x78); + if (sprite->data2 < 0x800) + { + sprite->data2 += 0x60; + } + if (sprite->data1 > 0x81) + { + sprite->data7++; + sprite->oam.affineMode = 0; + FreeOamMatrix(sprite->oam.matrixNum); + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, 0); + } + } +} + +void sub_80890D8(struct Sprite *sprite) +{ + struct Sprite *sprite1; + sprite->pos2.x = Cos(sprite->data2, 0x8c); + sprite->pos2.y = Sin(sprite->data2, 0x48); + sprite->data2 = (sprite->data2 + 4) & 0xff; + if (sprite->data6 != 0x40) + { + sprite1 = &gSprites[sprite->data6]; + sprite1->coordOffsetEnabled = 0; + sprite1->pos1.x = sprite->pos1.x + sprite->pos2.x; + sprite1->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; + sprite1->pos2.x = 0; + sprite1->pos2.y = 0; + } + if (sprite->data2 >= 0x80) + { + sprite->data7 = 1; + } +} + +void sub_808914C(struct Sprite *sprite) +{ + if (sprite->data7 == 0) + { + if (sprite->data0 == 0) + { + sprite->oam.affineMode = 3; + sprite->affineAnims = gSpriteAffineAnimTable_0839F44C; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, 1); + sprite->pos1.x = 0x5e; + sprite->pos1.y = -0x20; + sprite->data0++; + sprite->data1 = 0xf0; + sprite->data2 = 0x800; + sprite->data4 = 0x80; + } + sprite->data1 += sprite->data2 >> 8; + sprite->data3 += sprite->data2 >> 8; + sprite->data1 &= 0xff; + sprite->pos2.x = Cos(sprite->data1, 0x20); + sprite->pos2.y = Sin(sprite->data1, 0x78); + if (sprite->data2 > 0x100) + { + sprite->data2 -= sprite->data4; + } + if (sprite->data4 < 0x100) + { + sprite->data4 += 24; + } + if (sprite->data2 < 0x100) + { + sprite->data2 = 0x100; + } + if (sprite->data3 >= 60) + { + sprite->data7++; + sprite->oam.affineMode = 0; + FreeOamMatrix(sprite->oam.matrixNum); + sprite->invisible = 1; + } + } +} + +void sub_8089230(u8 spriteId) +{ + sub_8088FC0(spriteId); + gSprites[spriteId].callback = sub_808914C; +} + +void sub_8089270(u8); + +u8 FldEff_FlyIn(void) +{ + CreateTask(sub_8089270, 0xfe); + return 0; +} + +void sub_8089270(u8 taskId) +{ + gUnknown_0839F454[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80892A0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[0]++; + task->data[2] = 17; + task->data[15] = gPlayerAvatar.flags; + gPlayerAvatar.unk6 = 1; + SetPlayerAvatarStateMask(0x01); + if (task->data[15] & 0x08) + { + sub_8127ED0(mapObject->mapobj_unk_1A, 0); + } + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(0x3)); + CameraObjectReset2(); + FieldObjectTurn(mapObject, DIR_WEST); + StartSpriteAnim(&gSprites[mapObject->spriteId], 0x16); + mapObject->mapobj_bit_13 = 0; + task->data[1] = sub_8088F60(); + sub_8088FC0(task->data[1]); + sub_8088FFC(task->data[1], mapObject->spriteId); + } +} + +void sub_8089354(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + if (task->data[2] == 0 || (--task->data[2]) == 0) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[mapObject->spriteId]; + sub_8088FFC(task->data[1], 0x40); + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0]++; + task->data[2] = 0; + } +} + +void sub_80893C0(struct Task *task) +{ + s16 unknown_0839F470[18]; + struct Sprite *sprite; + memcpy(unknown_0839F470, gUnknown_0839F470, sizeof gUnknown_0839F470); + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.y = unknown_0839F470[task->data[2]]; + if ((++task->data[2]) >= 18) + { + task->data[0]++; + } +} + +void sub_8089414(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + if (sub_8088FA4(task->data[1])) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[mapObject->spriteId]; + mapObject->mapobj_bit_12 = 0; + sub_805C058(mapObject, mapObject->coords2.x, mapObject->coords2.y); + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->coordOffsetEnabled = 1; + sub_8059BF4(); + FieldObjectSetSpecialAnim(mapObject, 0x39); + task->data[0]++; + } +} + +void sub_808948C(struct Task *task) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gPlayerAvatar.mapObjectId])) + { + task->data[0]++; + sub_8089230(task->data[1]); + } +} + +void sub_80894C4(struct Task *task) +{ + if (sub_8088FA4(task->data[1])) + { + DestroySprite(&gSprites[task->data[1]]); + task->data[0]++; + task->data[1] = 0x10; + } +} + +void fishE(struct Task *task) +{ + u8 state; + struct MapObject *mapObject; + if ((--task->data[1]) == 0) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + state = 0; + if (task->data[15] & 0x08) + { + state = 3; + sub_8127ED0(mapObject->mapobj_unk_1A, 1); + } + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(state)); + FieldObjectTurn(mapObject, DIR_SOUTH); + gPlayerAvatar.flags = task->data[15]; + gPlayerAvatar.unk6 = 0; + FieldEffectActiveListRemove(FLDEFF_FLY_IN); + DestroyTask(FindTaskIdByFunc(sub_8089270)); + } +} diff --git a/src/field/field_fadetransition.c b/src/field/field_fadetransition.c new file mode 100644 index 000000000..e614d899a --- /dev/null +++ b/src/field/field_fadetransition.c @@ -0,0 +1,626 @@ +#include "global.h" +#include "cable_club.h" +#include "fieldmap.h" +#include "field_door.h" +#include "field_effect.h" +#include "field_fadetransition.h" +#include "field_map_obj.h" +#include "field_map_obj_helpers.h" +#include "field_player_avatar.h" +#include "field_special_scene.h" +#include "field_weather.h" +#include "fldeff_flash.h" +#include "link.h" +#include "main.h" +#include "map_obj_lock.h" +#include "metatile_behavior.h" +#include "palette.h" +#include "rom4.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "start_menu.h" +#include "task.h" + +void sub_8080B9C(u8); +void task_map_chg_seq_0807E20C(u8); +void task_map_chg_seq_0807E2CC(u8); +void task0A_fade_n_map_maybe(u8); +void sub_808115C(u8); + +void palette_bg_fill_white(void) +{ + CpuFastFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE); +} + +void palette_bg_fill_black(void) +{ + CpuFastFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE); +} + +void pal_fill_for_map_transition(void) +{ + u8 map_light = get_map_light_from_warp0(); + switch (fade_type_for_given_maplight_pair(map_light, sav1_map_get_light_level())) + { + case 0: + fade_screen(0, 0); + palette_bg_fill_black(); + break; + case 1: + fade_screen(2, 0); + palette_bg_fill_white(); + } +} + +void pal_fill_black(void) +{ + fade_screen(0, 0); + palette_bg_fill_black(); +} + +void fade_8080918(void) +{ + u8 light_level = sav1_map_get_light_level(); + switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType)) + { + case 0: + fade_screen(1, 0); + break; + case 1: + fade_screen(3, 0); + } +} + +void sub_8080958(u8 arg) +{ + sub_8059B88(!arg); +} + +void task0A_asap_script_env_2_enable_and_set_ctx_running(u8 taskID) +{ + if (sub_8080E70() == TRUE) + { + DestroyTask(taskID); + EnableBothScriptContexts(); + } +} + +void sub_8080990(void) +{ + ScriptContext2_Enable(); + sub_8053E90(); + pal_fill_black(); + CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10); +} + +void sub_80809B0(void) +{ + ScriptContext2_Enable(); + pal_fill_black(); + CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10); +} + +void task_mpl_807DD60(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[1] = sub_8083664(); + task->data[0]++; + break; + case 1: + if (gTasks[task->data[1]].isActive != TRUE) + { + pal_fill_for_map_transition(); + task->data[0]++; + } + break; + case 2: + if (sub_8080E70() == TRUE) + { + ScriptContext2_Disable(); + DestroyTask(taskId); + } + } +} + +void sub_8080A3C(void) +{ + ScriptContext2_Enable(); + sub_8053E90(); + palette_bg_fill_black(); + CreateTask(task_mpl_807DD60, 10); +} + +void sub_8080A5C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + sub_80084A4(); + task->data[0]++; + break; + case 1: + if (sub_8007ECC()) + { + pal_fill_for_map_transition(); + task->data[0]++; + } + break; + case 2: + if (sub_8080E70() == TRUE) + { + sub_8007B14(); + ScriptContext2_Disable(); + DestroyTask(taskId); + } + } +} + +void sub_8080AC4(void) +{ + ScriptContext2_Enable(); + sub_8053E90(); + palette_bg_fill_black(); + CreateTask(sub_8080A5C, 10); +} + +void sub_8080AE4(void) +{ + s16 x, y; + u8 behavior; + TaskFunc func; + PlayerGetDestCoords(&x, &y); + behavior = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsDoor(behavior) == TRUE) + func = sub_8080B9C; + else if (MetatileBehavior_IsNonAnimDoor(behavior) == TRUE) + func = task_map_chg_seq_0807E20C; + else + func = task_map_chg_seq_0807E2CC; + CreateTask(func, 10); +} + +void mapldr_default(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + sub_8080AE4(); + ScriptContext2_Enable(); +} + +void sub_8080B60(void) +{ + sub_8053E90(); + pal_fill_black(); + sub_8080AE4(); + ScriptContext2_Enable(); +} + +void sub_8080B78(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + PlaySE(SE_TK_WARPOUT); + CreateTask(task_map_chg_seq_0807E2CC, 10); + ScriptContext2_Enable(); +} + +void sub_8080B9C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s16 *x = &task->data[2]; + s16 *y = &task->data[3]; + + switch (task->data[0]) + { + case 0: + sub_8080958(0); + FreezeMapObjects(); + PlayerGetDestCoords(x, y); + FieldSetDoorOpened(*x, *y); + task->data[0] = 1; + break; + case 1: + if (sub_8080E70()) + { + u8 mapObjId; + sub_8080958(1); + mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 8); + task->data[0] = 2; + } + break; + case 2: + if (walkrun_is_standing_still()) + { + u8 mapObjId; + task->data[1] = FieldAnimateDoorClose(*x, *y); + mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]); + task->data[0] = 3; + } + break; + case 3: + if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) + { + UnfreezeMapObjects(); + task->data[0] = 4; + } + break; + case 4: + ScriptContext2_Disable(); + DestroyTask(taskId); + break; + } +} + +void task_map_chg_seq_0807E20C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s16 *x = &task->data[2]; + s16 *y = &task->data[3]; + + switch (task->data[0]) + { + case 0: + sub_8080958(0); + FreezeMapObjects(); + PlayerGetDestCoords(x, y); + task->data[0] = 1; + break; + case 1: + if (sub_8080E70()) + { + u8 mapObjId; + sub_8080958(1); + mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], GetGoSpeed0AnimId(player_get_direction_lower_nybble())); + task->data[0] = 2; + } + break; + case 2: + if (walkrun_is_standing_still()) + { + UnfreezeMapObjects(); + task->data[0] = 3; + } + break; + case 3: + ScriptContext2_Disable(); + DestroyTask(taskId); + break; + } +} + +void task_map_chg_seq_0807E2CC(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + FreezeMapObjects(); + ScriptContext2_Enable(); + gTasks[taskId].data[0]++; + break; + case 1: + if (sub_8080E70()) + { + UnfreezeMapObjects(); + ScriptContext2_Disable(); + DestroyTask(taskId); + } + break; + } +} + +void sub_8080DC4(u8 taskId) +{ + if (sub_8080E70() == TRUE) + { + DestroyTask(taskId); + CreateTask(sub_80712B4, 80); + } +} + +void atk17_seteffectuser(void) +{ + pal_fill_black(); + CreateStartMenuTask(sub_8080DC4); + ScriptContext2_Enable(); +} + +void task_mpl_807E3C8(u8 taskId) +{ + if (sub_8080E70() == 1) + { + ScriptContext2_Disable(); + DestroyTask(taskId); + sub_8064E2C(); + } +} + +void sub_8080E28(void) +{ + ScriptContext2_Enable(); + pal_fill_black(); + CreateTask(task_mpl_807E3C8, 10); +} + +void sub_8080E44(void) +{ + ScriptContext2_Enable(); + sub_8053E90(); + pal_fill_black(); + CreateTask(task_mpl_807E3C8, 10); +} + +bool32 sub_8080E64(void) +{ + return gPaletteFade.active; +} + +bool32 sub_8080E70(void) +{ + if (sub_807D770() == TRUE) + return TRUE; + else + return FALSE; +} + +void sub_8080E88(void) +{ + ScriptContext2_Enable(); + sub_8053FF8(); + fade_8080918(); + PlayRainSoundEffect(); + PlaySE(SE_KAIDAN); + gFieldCallback = mapldr_default; + CreateTask(task0A_fade_n_map_maybe, 10); +} + +void sp13E_warp_to_last_warp(void) +{ + ScriptContext2_Enable(); + sub_8053FF8(); + fade_8080918(); + PlayRainSoundEffect(); + gFieldCallback = mapldr_default; + CreateTask(task0A_fade_n_map_maybe, 10); +} + +void sub_8080EF0(void) +{ + ScriptContext2_Enable(); + gFieldCallback = mapldr_default; + CreateTask(sub_808115C, 10); +} + +void sp13F_fall_to_last_warp(void) +{ + sp13E_warp_to_last_warp(); + gFieldCallback = sub_8086748; +} + +void sub_8080F2C(u8 metatileBehavior) +{ + ScriptContext2_Enable(); + sub_8086A2C(metatileBehavior, 10); +} + +void sub_8080F48(void) +{ + ScriptContext2_Enable(); + sub_80871B8(10); +} + +void sub_8080F58(void) +{ + ScriptContext2_Enable(); + sub_8087654(10); +} + +void sub_8080F68(void) +{ + ScriptContext2_Enable(); + sub_8053FF8(); + fade_8080918(); + PlaySE(SE_TK_WARPIN); + CreateTask(task0A_fade_n_map_maybe, 10); + gFieldCallback = sub_8080B78; +} + +void sub_8080F9C(void) +{ + ScriptContext2_Enable(); + fade_8080918(); + CreateTask(task0A_fade_n_map_maybe, 10); + gFieldCallback = sub_80C791C; +} + +void sub_8080FC4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + ScriptContext2_Enable(); + task->data[0]++; + break; + case 1: + if (!sub_8080E64() && sub_8054034()) + { + task->data[0]++; + } + break; + case 2: + warp_in(); + SetMainCallback2(sub_8054588); + DestroyTask(taskId); + break; + } +} + +void DoCableClubWarp(void) +{ + ScriptContext2_Enable(); + sub_8053FF8(); + fade_8080918(); + PlaySE(SE_KAIDAN); + CreateTask(sub_8080FC4, 10); +} + +void sub_8081050(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + ClearLinkCallback_2(); + fade_screen(1, 0); + sub_8053FF8(); + PlaySE(SE_KAIDAN); + data[0]++; + break; + case 1: + if (!sub_8080E64() && sub_8054034()) + { + sub_800832C(); + data[0]++; + } + break; + case 2: + if (!gReceivedRemoteLinkPlayers) + { + warp_in(); + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskId); + } + break; + } +} + +void sub_80810DC(void) +{ + CreateTask(sub_8081050, 10); +} + +void task0A_fade_n_map_maybe(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + FreezeMapObjects(); + ScriptContext2_Enable(); + task->data[0]++; + break; + case 1: + if (!sub_8080E64() && sub_8054034()) + { + task->data[0]++; + } + break; + case 2: + warp_in(); + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskId); + break; + } +} + +void sub_808115C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s16 *x = &task->data[2]; + s16 *y = &task->data[3]; + + switch (task->data[0]) + { + case 0: + FreezeMapObjects(); + PlayerGetDestCoords(x, y); + PlaySE(sub_8058790(*x, *y - 1)); + task->data[1] = FieldAnimateDoorOpen(*x, *y - 1); + task->data[0] = 1; + break; + case 1: + if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) + { + u8 mapObjId; + mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimActive(&gMapObjects[mapObjId]); + mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 9); + task->data[0] = 2; + } + break; + case 2: + if (walkrun_is_standing_still()) + { + u8 mapObjId; + task->data[1] = FieldAnimateDoorClose(*x, *y - 1); + mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]); + sub_8080958(0); + task->data[0] = 3; + } + break; + case 3: + if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) + { + task->data[0] = 4; + } + break; + case 4: + sub_8053FF8(); + fade_8080918(); + PlayRainSoundEffect(); + task->data[0] = 0; + task->func = task0A_fade_n_map_maybe; + break; + } +} + +void sub_80812C8(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + FreezeMapObjects(); + ScriptContext2_Enable(); + task->data[0]++; + break; + case 1: + if (!sub_8080E64() && sub_8054034()) + { + task->data[0]++; + } + break; + case 2: + warp_in(); + SetMainCallback2(sub_8054534); + DestroyTask(taskId); + break; + } +} + +void sub_8081334(void) +{ + ScriptContext2_Enable(); + sub_8053FF8(); + fade_8080918(); + PlayRainSoundEffect(); + PlaySE(SE_KAIDAN); + gFieldCallback = sub_8080B60; + CreateTask(sub_80812C8, 10); +} diff --git a/src/field/field_ground_effect.c b/src/field/field_ground_effect.c new file mode 100644 index 000000000..42862d0ff --- /dev/null +++ b/src/field/field_ground_effect.c @@ -0,0 +1,240 @@ +#include "global.h" +#include "field_ground_effect.h" +#include "fieldmap.h" +#include "metatile_behavior.h" + +extern u32 gUnknown_08376008[]; + +void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) +{ + FieldObjectUpdateMetatileBehaviors(mapObj); + GetGroundEffectFlags_Reflection(mapObj, flags); + GetGroundEffectFlags_TallGrassOnSpawn(mapObj, flags); + GetGroundEffectFlags_LongGrassOnSpawn(mapObj, flags); + GetGroundEffectFlags_SandPile(mapObj, flags); + GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); + GetGroundEffectFlags_ShortGrass(mapObj, flags); + GetGroundEffectFlags_HotSprings(mapObj, flags); +} + +void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags) +{ + FieldObjectUpdateMetatileBehaviors(mapObj); + GetGroundEffectFlags_Reflection(mapObj, flags); + GetGroundEffectFlags_TallGrassOnBeginStep(mapObj, flags); + GetGroundEffectFlags_LongGrassOnBeginStep(mapObj, flags); + GetGroundEffectFlags_Tracks(mapObj, flags); + GetGroundEffectFlags_SandPile(mapObj, flags); + GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); + GetGroundEffectFlags_Puddle(mapObj, flags); + GetGroundEffectFlags_ShortGrass(mapObj, flags); + GetGroundEffectFlags_HotSprings(mapObj, flags); +} + +void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags) +{ + FieldObjectUpdateMetatileBehaviors(mapObj); + GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); + GetGroundEffectFlags_SandPile(mapObj, flags); + GetGroundEffectFlags_Puddle(mapObj, flags); + GetGroundEffectFlags_Ripple(mapObj, flags); + GetGroundEffectFlags_ShortGrass(mapObj, flags); + GetGroundEffectFlags_HotSprings(mapObj, flags); + GetGroundEffectFlags_Seaweed(mapObj, flags); + GetGroundEffectFlags_JumpLanding(mapObj, flags); +} + +void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj) +{ + mapObj->mapobj_unk_1F = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y); + mapObj->mapobj_unk_1E = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y); +} + +void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags) +{ + u32 reflectionFlags[2] = { 0x00000020, 0x00000010 }; + u8 type = FieldObjectCheckForReflectiveSurface(mapObj); + + if (type) + { + if (!mapObj->mapobj_bit_17) + { + mapObj->mapobj_bit_17 = 0; + mapObj->mapobj_bit_17 = 1; + *flags |= reflectionFlags[type - 1]; + } + } + else + { + mapObj->mapobj_bit_17 = 0; + } +} + +void GetGroundEffectFlags_TallGrassOnSpawn(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x1; +} + +void GetGroundEffectFlags_TallGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x2; +} + +void GetGroundEffectFlags_LongGrassOnSpawn(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x4; +} + +void GetGroundEffectFlags_LongGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x8; +} + +void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) + { + *flags |= 0x100; + } + else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F) + || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F)) + { + *flags |= 0x80; + } +} + +void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) + { + if (!mapObj->mapobj_bit_20) + { + mapObj->mapobj_bit_20 = 0; + mapObj->mapobj_bit_20 = 1; + *flags |= 0x800; + } + } + else + { + mapObj->mapobj_bit_20 = 0; + } +} + +void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags) +{ + if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F)) + || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F))) + { + if (!mapObj->mapobj_bit_19) + { + mapObj->mapobj_bit_19 = 0; + mapObj->mapobj_bit_19 = 1; + *flags |= 0x40; + } + } + else + { + mapObj->mapobj_bit_19 = 0; + } +} + +void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F)) + { + *flags |= 0x400; + } +} + +void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_HasRipples(mapObj->mapobj_unk_1E)) + *flags |= 0x200; +} + +void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F)) + { + if (!mapObj->mapobj_bit_18) + { + mapObj->mapobj_bit_18 = 0; + mapObj->mapobj_bit_18 = 1; + *flags |= 0x20000; + } + } + else + { + mapObj->mapobj_bit_18 = 0; + } +} + +void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F)) + { + if (!mapObj->mapobj_bit_21) + { + mapObj->mapobj_bit_21 = 0; + mapObj->mapobj_bit_21 = 1; + *flags |= 0x40000; + } + } + else + { + mapObj->mapobj_bit_21 = 0; + } +} + +void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsSeaweed(mapObj->mapobj_unk_1E)) + *flags |= 0x80000; +} + +void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) +{ + typedef bool8 (*MetatileFunc)(u8); + + static const MetatileFunc metatileFuncs[] = + { + MetatileBehavior_IsTallGrass, + MetatileBehavior_IsLongGrass, + MetatileBehavior_IsPuddle, + MetatileBehavior_IsSurfableWaterOrUnderwater, + MetatileBehavior_IsShallowFlowingWater, + MetatileBehavior_IsATile, + }; + + static const u32 jumpLandingFlags[] = + { + 0x00001000, // Landing in tall grass + 0x00002000, // Landing in long grass + 0x00004000, // Landing on puddle + 0x00008000, // Landing on surfable water or underwater + 0x00004000, // Landing on shallow flowing water + 0x00010000, // Landing on any other type of ground + }; + + if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25) + { + u8 i; + + for (i = 0; i < 6; i++) + { + if (metatileFuncs[i](mapObj->mapobj_unk_1E)) + { + *flags |= jumpLandingFlags[i]; + return; + } + } + } +} diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c new file mode 100644 index 000000000..f60b1b233 --- /dev/null +++ b/src/field/field_map_obj.c @@ -0,0 +1,8474 @@ +#include "global.h" +#include "field_map_obj.h" +#include "berry.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_effect.h" +#include "field_effect_helpers.h" +#include "field_ground_effect.h" +#include "field_map_obj_helpers.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "palette.h" +#include "rng.h" +#include "rom4.h" +#include "sprite.h" +#include "metatile_behavior.h" +#include "map_constants.h" +#include "map_object_constants.h" +#include "trainer_see.h" + +// rodata + +const u8 gUnknown_0830FD14[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0}; + +void ObjectCB_CameraObject(struct Sprite *sprite); +const struct SpriteTemplate gSpriteTemplate_830FD24 = {0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, ObjectCB_CameraObject}; + +void CameraObject_0(struct Sprite *); +void CameraObject_1(struct Sprite *); +void CameraObject_2(struct Sprite *); +void (*const gCameraObjectFuncs[])(struct Sprite *) = { + CameraObject_0, + CameraObject_1, + CameraObject_2, +}; + +const u32 gMapObjectPic_BrendanNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/00.4bpp"); +const u32 gMapObjectPic_BrendanNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/01.4bpp"); +const u32 gMapObjectPic_BrendanNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/02.4bpp"); +const u32 gMapObjectPic_BrendanNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/03.4bpp"); +const u32 gMapObjectPic_BrendanNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/04.4bpp"); +const u32 gMapObjectPic_BrendanNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/05.4bpp"); +const u32 gMapObjectPic_BrendanNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/06.4bpp"); +const u32 gMapObjectPic_BrendanNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/07.4bpp"); +const u32 gMapObjectPic_BrendanNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/08.4bpp"); +const u32 gMapObjectPic_BrendanNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/09.4bpp"); +const u32 gMapObjectPic_BrendanNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/10.4bpp"); +const u32 gMapObjectPic_BrendanNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/11.4bpp"); +const u32 gMapObjectPic_BrendanNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/12.4bpp"); +const u32 gMapObjectPic_BrendanNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/13.4bpp"); +const u32 gMapObjectPic_BrendanNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/14.4bpp"); +const u32 gMapObjectPic_BrendanNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/15.4bpp"); +const u32 gMapObjectPic_BrendanNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/16.4bpp"); +const u32 gMapObjectPic_BrendanNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/17.4bpp"); +const u16 gMapObjectPalette8[] = INCBIN_U16("graphics/map_objects/palettes/08.gbapal"); +const u16 NullPalette_8310F68[16] = {}; +const u16 NullPalette_8310F88[16] = {}; +const u16 NullPalette_8310FA8[16] = {}; +const u16 NullPalette_8310FC8[16] = {}; +const u16 NullPalette_8310FE8[16] = {}; +const u16 NullPalette_8311008[16] = {}; +const u16 NullPalette_8311028[16] = {}; +const u16 NullPalette_8311048[16] = {}; +const u16 NullPalette_8311068[16] = {}; +const u16 NullPalette_8311088[16] = {}; +const u16 NullPalette_83110A8[16] = {}; +const u16 NullPalette_83110C8[16] = {}; +const u16 NullPalette_83110E8[16] = {}; +const u16 NullPalette_8311108[16] = {}; +const u16 NullPalette_8311128[16] = {}; +const u16 gMapObjectPalette9[] = INCBIN_U16("graphics/map_objects/palettes/09.gbapal"); +const u16 gMapObjectPalette10[] = INCBIN_U16("graphics/map_objects/palettes/10.gbapal"); +const u32 gMapObjectPic_BrendanFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/0.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/1.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/2.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/3.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/4.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/0.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/3.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/1.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/4.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/2.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/5.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/0.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/1.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/2.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/3.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/4.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/5.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/6.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/7.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/8.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/00.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/01.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/02.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/03.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/04.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/05.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/06.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/07.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/08.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/09.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/10.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/11.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/12.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/13.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/14.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/15.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/16.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/17.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/18.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/19.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/20.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/21.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/22.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/23.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/24.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/25.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/26.4bpp"); +const u32 gMapObjectPic_BrendanFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/00.4bpp"); +const u32 gMapObjectPic_BrendanFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/01.4bpp"); +const u32 gMapObjectPic_BrendanFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/02.4bpp"); +const u32 gMapObjectPic_BrendanFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/03.4bpp"); +const u32 gMapObjectPic_BrendanFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/04.4bpp"); +const u32 gMapObjectPic_BrendanFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/05.4bpp"); +const u32 gMapObjectPic_BrendanFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/06.4bpp"); +const u32 gMapObjectPic_BrendanFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/07.4bpp"); +const u32 gMapObjectPic_BrendanFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/08.4bpp"); +const u32 gMapObjectPic_BrendanFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/09.4bpp"); +const u32 gMapObjectPic_BrendanFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/10.4bpp"); +const u32 gMapObjectPic_BrendanFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/11.4bpp"); +const u32 gMapObjectPic_BrendanWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/0.4bpp"); +const u32 gMapObjectPic_BrendanWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/3.4bpp"); +const u32 gMapObjectPic_BrendanWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/1.4bpp"); +const u32 gMapObjectPic_BrendanWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/4.4bpp"); +const u32 gMapObjectPic_BrendanWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/2.4bpp"); +const u32 gMapObjectPic_BrendanWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/5.4bpp"); +const u32 gMapObjectPic_BrendanDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/decorating.4bpp"); +const u32 gMapObjectPic_MayDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/may/decorating.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/0.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/1.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/2.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/3.4bpp"); +const u32 gMapObjectPic_MayUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/0.4bpp"); +const u32 gMapObjectPic_MayUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/1.4bpp"); +const u32 gMapObjectPic_MayUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/2.4bpp"); +const u32 gMapObjectPic_MayUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/3.4bpp"); +const u16 gMapObjectPalette11[] = INCBIN_U16("graphics/map_objects/palettes/11.gbapal"); +const u32 gMapObjectPic_MayNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/00.4bpp"); +const u32 gMapObjectPic_MayNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/01.4bpp"); +const u32 gMapObjectPic_MayNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/02.4bpp"); +const u32 gMapObjectPic_MayNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/03.4bpp"); +const u32 gMapObjectPic_MayNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/04.4bpp"); +const u32 gMapObjectPic_MayNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/05.4bpp"); +const u32 gMapObjectPic_MayNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/06.4bpp"); +const u32 gMapObjectPic_MayNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/07.4bpp"); +const u32 gMapObjectPic_MayNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/08.4bpp"); +const u32 gMapObjectPic_MayNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/09.4bpp"); +const u32 gMapObjectPic_MayNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/10.4bpp"); +const u32 gMapObjectPic_MayNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/11.4bpp"); +const u32 gMapObjectPic_MayNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/12.4bpp"); +const u32 gMapObjectPic_MayNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/13.4bpp"); +const u32 gMapObjectPic_MayNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/14.4bpp"); +const u32 gMapObjectPic_MayNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/15.4bpp"); +const u32 gMapObjectPic_MayNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/16.4bpp"); +const u32 gMapObjectPic_MayNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/17.4bpp"); +const u16 gMapObjectPalette17[] = INCBIN_U16("graphics/map_objects/palettes/17.gbapal"); +const u16 gMapObjectPalette18[] = INCBIN_U16("graphics/map_objects/palettes/18.gbapal"); +const u16 NullPalette_831B7E8[16] = {}; +const u16 NullPalette_831B808[16] = {}; +const u16 NullPalette_831B828[16] = {}; +const u16 NullPalette_831B848[16] = {}; +const u16 NullPalette_831B868[16] = {}; +const u16 NullPalette_831B888[16] = {}; +const u16 NullPalette_831B8A8[16] = {}; +const u16 NullPalette_831B8C8[16] = {}; +const u16 NullPalette_831B8E8[16] = {}; +const u16 NullPalette_831B908[16] = {}; +const u16 NullPalette_831B928[16] = {}; +const u16 NullPalette_831B948[16] = {}; +const u16 NullPalette_831B968[16] = {}; +const u16 NullPalette_831B988[16] = {}; +const u32 gMapObjectPic_MayMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/0.4bpp"); +const u32 gMapObjectPic_MayMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/1.4bpp"); +const u32 gMapObjectPic_MayMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/2.4bpp"); +const u32 gMapObjectPic_MayMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/3.4bpp"); +const u32 gMapObjectPic_MayMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/4.4bpp"); +const u32 gMapObjectPic_MayMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/5.4bpp"); +const u32 gMapObjectPic_MayMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/6.4bpp"); +const u32 gMapObjectPic_MayMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/7.4bpp"); +const u32 gMapObjectPic_MayMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/8.4bpp"); +const u32 gMapObjectPic_MayAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/00.4bpp"); +const u32 gMapObjectPic_MayAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/01.4bpp"); +const u32 gMapObjectPic_MayAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/02.4bpp"); +const u32 gMapObjectPic_MayAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/03.4bpp"); +const u32 gMapObjectPic_MayAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/04.4bpp"); +const u32 gMapObjectPic_MayAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/05.4bpp"); +const u32 gMapObjectPic_MayAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/06.4bpp"); +const u32 gMapObjectPic_MayAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/07.4bpp"); +const u32 gMapObjectPic_MayAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/08.4bpp"); +const u32 gMapObjectPic_MayAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/09.4bpp"); +const u32 gMapObjectPic_MayAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/10.4bpp"); +const u32 gMapObjectPic_MayAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/11.4bpp"); +const u32 gMapObjectPic_MayAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/12.4bpp"); +const u32 gMapObjectPic_MayAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/13.4bpp"); +const u32 gMapObjectPic_MayAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/14.4bpp"); +const u32 gMapObjectPic_MayAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/15.4bpp"); +const u32 gMapObjectPic_MayAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/16.4bpp"); +const u32 gMapObjectPic_MayAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/17.4bpp"); +const u32 gMapObjectPic_MayAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/18.4bpp"); +const u32 gMapObjectPic_MayAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/19.4bpp"); +const u32 gMapObjectPic_MayAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/20.4bpp"); +const u32 gMapObjectPic_MayAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/21.4bpp"); +const u32 gMapObjectPic_MayAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/22.4bpp"); +const u32 gMapObjectPic_MayAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/23.4bpp"); +const u32 gMapObjectPic_MayAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/24.4bpp"); +const u32 gMapObjectPic_MayAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/25.4bpp"); +const u32 gMapObjectPic_MayAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/26.4bpp"); +const u32 gMapObjectPic_MaySurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/0.4bpp"); +const u32 gMapObjectPic_MaySurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/3.4bpp"); +const u32 gMapObjectPic_MaySurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/1.4bpp"); +const u32 gMapObjectPic_MaySurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/4.4bpp"); +const u32 gMapObjectPic_MaySurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/2.4bpp"); +const u32 gMapObjectPic_MaySurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/5.4bpp"); +const u32 gMapObjectPic_MayFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/0.4bpp"); +const u32 gMapObjectPic_MayFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/1.4bpp"); +const u32 gMapObjectPic_MayFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/2.4bpp"); +const u32 gMapObjectPic_MayFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/3.4bpp"); +const u32 gMapObjectPic_MayFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/4.4bpp"); +const u32 gMapObjectPic_MayFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/00.4bpp"); +const u32 gMapObjectPic_MayFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/01.4bpp"); +const u32 gMapObjectPic_MayFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/02.4bpp"); +const u32 gMapObjectPic_MayFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/03.4bpp"); +const u32 gMapObjectPic_MayFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/04.4bpp"); +const u32 gMapObjectPic_MayFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/05.4bpp"); +const u32 gMapObjectPic_MayFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/06.4bpp"); +const u32 gMapObjectPic_MayFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/07.4bpp"); +const u32 gMapObjectPic_MayFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/08.4bpp"); +const u32 gMapObjectPic_MayFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/09.4bpp"); +const u32 gMapObjectPic_MayFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/10.4bpp"); +const u32 gMapObjectPic_MayFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/11.4bpp"); +const u32 gMapObjectPic_MayWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/0.4bpp"); +const u32 gMapObjectPic_MayWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/3.4bpp"); +const u32 gMapObjectPic_MayWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/1.4bpp"); +const u32 gMapObjectPic_MayWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/4.4bpp"); +const u32 gMapObjectPic_MayWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/2.4bpp"); +const u32 gMapObjectPic_MayWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/5.4bpp"); +const u16 gMapObjectPalette0[] = INCBIN_U16("graphics/map_objects/palettes/00.gbapal"); +const u16 gMapObjectPalette1[] = INCBIN_U16("graphics/map_objects/palettes/01.gbapal"); +const u16 gMapObjectPalette2[] = INCBIN_U16("graphics/map_objects/palettes/02.gbapal"); +const u16 gMapObjectPalette3[] = INCBIN_U16("graphics/map_objects/palettes/03.gbapal"); +const u16 gMapObjectPalette4[] = INCBIN_U16("graphics/map_objects/palettes/04.gbapal"); +const u16 gMapObjectPalette5[] = INCBIN_U16("graphics/map_objects/palettes/05.gbapal"); +const u16 gMapObjectPalette6[] = INCBIN_U16("graphics/map_objects/palettes/06.gbapal"); +const u16 gMapObjectPalette7[] = INCBIN_U16("graphics/map_objects/palettes/07.gbapal"); +const u32 gMapObjectPic_LittleBoy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/0.4bpp"); +const u32 gMapObjectPic_LittleBoy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/1.4bpp"); +const u32 gMapObjectPic_LittleBoy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/2.4bpp"); +const u32 gMapObjectPic_LittleBoy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/3.4bpp"); +const u32 gMapObjectPic_LittleBoy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/4.4bpp"); +const u32 gMapObjectPic_LittleBoy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/5.4bpp"); +const u32 gMapObjectPic_LittleBoy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/6.4bpp"); +const u32 gMapObjectPic_LittleBoy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/7.4bpp"); +const u32 gMapObjectPic_LittleBoy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/8.4bpp"); +const u32 gMapObjectPic_LittleGirl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/0.4bpp"); +const u32 gMapObjectPic_LittleGirl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/1.4bpp"); +const u32 gMapObjectPic_LittleGirl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/2.4bpp"); +const u32 gMapObjectPic_LittleGirl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/3.4bpp"); +const u32 gMapObjectPic_LittleGirl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/4.4bpp"); +const u32 gMapObjectPic_LittleGirl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/5.4bpp"); +const u32 gMapObjectPic_LittleGirl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/6.4bpp"); +const u32 gMapObjectPic_LittleGirl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/7.4bpp"); +const u32 gMapObjectPic_LittleGirl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/8.4bpp"); +const u32 gMapObjectPic_Boy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/0.4bpp"); +const u32 gMapObjectPic_Boy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/1.4bpp"); +const u32 gMapObjectPic_Boy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/2.4bpp"); +const u32 gMapObjectPic_Boy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/3.4bpp"); +const u32 gMapObjectPic_Boy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/4.4bpp"); +const u32 gMapObjectPic_Boy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/5.4bpp"); +const u32 gMapObjectPic_Boy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/6.4bpp"); +const u32 gMapObjectPic_Boy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/7.4bpp"); +const u32 gMapObjectPic_Boy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/8.4bpp"); +const u32 gMapObjectPic_Girl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/0.4bpp"); +const u32 gMapObjectPic_Girl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/1.4bpp"); +const u32 gMapObjectPic_Girl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/2.4bpp"); +const u32 gMapObjectPic_Girl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/3.4bpp"); +const u32 gMapObjectPic_Girl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/4.4bpp"); +const u32 gMapObjectPic_Girl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/5.4bpp"); +const u32 gMapObjectPic_Girl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/6.4bpp"); +const u32 gMapObjectPic_Girl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/7.4bpp"); +const u32 gMapObjectPic_Girl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/8.4bpp"); +const u32 gMapObjectPic_Boy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/0.4bpp"); +const u32 gMapObjectPic_Boy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/1.4bpp"); +const u32 gMapObjectPic_Boy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/2.4bpp"); +const u32 gMapObjectPic_Boy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/3.4bpp"); +const u32 gMapObjectPic_Boy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/4.4bpp"); +const u32 gMapObjectPic_Boy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/5.4bpp"); +const u32 gMapObjectPic_Boy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/6.4bpp"); +const u32 gMapObjectPic_Boy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/7.4bpp"); +const u32 gMapObjectPic_Boy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/8.4bpp"); +const u32 gMapObjectPic_Girl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/0.4bpp"); +const u32 gMapObjectPic_Girl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/1.4bpp"); +const u32 gMapObjectPic_Girl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/2.4bpp"); +const u32 gMapObjectPic_Girl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/3.4bpp"); +const u32 gMapObjectPic_Girl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/4.4bpp"); +const u32 gMapObjectPic_Girl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/5.4bpp"); +const u32 gMapObjectPic_Girl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/6.4bpp"); +const u32 gMapObjectPic_Girl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/7.4bpp"); +const u32 gMapObjectPic_Girl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/8.4bpp"); +const u32 gMapObjectPic_LittleBoy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/0.4bpp"); +const u32 gMapObjectPic_LittleBoy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/1.4bpp"); +const u32 gMapObjectPic_LittleBoy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/2.4bpp"); +const u32 gMapObjectPic_LittleBoy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/3.4bpp"); +const u32 gMapObjectPic_LittleBoy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/4.4bpp"); +const u32 gMapObjectPic_LittleBoy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/5.4bpp"); +const u32 gMapObjectPic_LittleBoy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/6.4bpp"); +const u32 gMapObjectPic_LittleBoy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/7.4bpp"); +const u32 gMapObjectPic_LittleBoy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/8.4bpp"); +const u32 gMapObjectPic_LittleGirl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/0.4bpp"); +const u32 gMapObjectPic_LittleGirl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/1.4bpp"); +const u32 gMapObjectPic_LittleGirl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/2.4bpp"); +const u32 gMapObjectPic_LittleGirl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/3.4bpp"); +const u32 gMapObjectPic_LittleGirl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/4.4bpp"); +const u32 gMapObjectPic_LittleGirl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/5.4bpp"); +const u32 gMapObjectPic_LittleGirl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/6.4bpp"); +const u32 gMapObjectPic_LittleGirl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/7.4bpp"); +const u32 gMapObjectPic_LittleGirl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/8.4bpp"); +const u32 gMapObjectPic_Boy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/0.4bpp"); +const u32 gMapObjectPic_Boy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/1.4bpp"); +const u32 gMapObjectPic_Boy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/2.4bpp"); +const u32 gMapObjectPic_Boy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/3.4bpp"); +const u32 gMapObjectPic_Boy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/4.4bpp"); +const u32 gMapObjectPic_Boy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/5.4bpp"); +const u32 gMapObjectPic_Boy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/6.4bpp"); +const u32 gMapObjectPic_Boy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/7.4bpp"); +const u32 gMapObjectPic_Boy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/8.4bpp"); +const u32 gMapObjectPic_Girl3_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/0.4bpp"); +const u32 gMapObjectPic_Girl3_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/1.4bpp"); +const u32 gMapObjectPic_Girl3_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/2.4bpp"); +const u32 gMapObjectPic_Girl3_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/3.4bpp"); +const u32 gMapObjectPic_Girl3_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/4.4bpp"); +const u32 gMapObjectPic_Girl3_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/5.4bpp"); +const u32 gMapObjectPic_Girl3_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/6.4bpp"); +const u32 gMapObjectPic_Girl3_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/7.4bpp"); +const u32 gMapObjectPic_Girl3_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/8.4bpp"); +const u32 gMapObjectPic_Boy4_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/0.4bpp"); +const u32 gMapObjectPic_Boy4_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/1.4bpp"); +const u32 gMapObjectPic_Boy4_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/2.4bpp"); +const u32 gMapObjectPic_Boy4_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/3.4bpp"); +const u32 gMapObjectPic_Boy4_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/4.4bpp"); +const u32 gMapObjectPic_Boy4_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/5.4bpp"); +const u32 gMapObjectPic_Boy4_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/6.4bpp"); +const u32 gMapObjectPic_Boy4_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/7.4bpp"); +const u32 gMapObjectPic_Boy4_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/8.4bpp"); +const u32 gMapObjectPic_Woman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/0.4bpp"); +const u32 gMapObjectPic_Woman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/1.4bpp"); +const u32 gMapObjectPic_Woman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/2.4bpp"); +const u32 gMapObjectPic_Woman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/3.4bpp"); +const u32 gMapObjectPic_Woman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/4.4bpp"); +const u32 gMapObjectPic_Woman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/5.4bpp"); +const u32 gMapObjectPic_Woman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/6.4bpp"); +const u32 gMapObjectPic_Woman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/7.4bpp"); +const u32 gMapObjectPic_Woman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/8.4bpp"); +const u32 gMapObjectPic_FatMan_0[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/0.4bpp"); +const u32 gMapObjectPic_FatMan_1[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/1.4bpp"); +const u32 gMapObjectPic_FatMan_2[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/2.4bpp"); +const u32 gMapObjectPic_FatMan_3[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/3.4bpp"); +const u32 gMapObjectPic_FatMan_4[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/4.4bpp"); +const u32 gMapObjectPic_FatMan_5[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/5.4bpp"); +const u32 gMapObjectPic_FatMan_6[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/6.4bpp"); +const u32 gMapObjectPic_FatMan_7[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/7.4bpp"); +const u32 gMapObjectPic_FatMan_8[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/8.4bpp"); +const u32 gMapObjectPic_Woman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/0.4bpp"); +const u32 gMapObjectPic_Woman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/1.4bpp"); +const u32 gMapObjectPic_Woman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/2.4bpp"); +const u32 gMapObjectPic_Woman2_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/3.4bpp"); +const u32 gMapObjectPic_Woman2_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/4.4bpp"); +const u32 gMapObjectPic_Woman2_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/5.4bpp"); +const u32 gMapObjectPic_Woman2_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/6.4bpp"); +const u32 gMapObjectPic_Woman2_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/7.4bpp"); +const u32 gMapObjectPic_Woman2_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/8.4bpp"); +const u32 gMapObjectPic_Man1_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/0.4bpp"); +const u32 gMapObjectPic_Man1_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/1.4bpp"); +const u32 gMapObjectPic_Man1_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/2.4bpp"); +const u32 gMapObjectPic_Man1_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/3.4bpp"); +const u32 gMapObjectPic_Man1_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/4.4bpp"); +const u32 gMapObjectPic_Man1_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/5.4bpp"); +const u32 gMapObjectPic_Man1_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/6.4bpp"); +const u32 gMapObjectPic_Man1_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/7.4bpp"); +const u32 gMapObjectPic_Man1_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/8.4bpp"); +const u32 gMapObjectPic_Woman3_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/0.4bpp"); +const u32 gMapObjectPic_Woman3_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/1.4bpp"); +const u32 gMapObjectPic_Woman3_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/2.4bpp"); +const u32 gMapObjectPic_Woman3_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/3.4bpp"); +const u32 gMapObjectPic_Woman3_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/4.4bpp"); +const u32 gMapObjectPic_Woman3_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/5.4bpp"); +const u32 gMapObjectPic_Woman3_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/6.4bpp"); +const u32 gMapObjectPic_Woman3_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/7.4bpp"); +const u32 gMapObjectPic_Woman3_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/8.4bpp"); +const u32 gMapObjectPic_OldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/0.4bpp"); +const u32 gMapObjectPic_OldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/1.4bpp"); +const u32 gMapObjectPic_OldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/2.4bpp"); +const u32 gMapObjectPic_OldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/3.4bpp"); +const u32 gMapObjectPic_OldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/4.4bpp"); +const u32 gMapObjectPic_OldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/5.4bpp"); +const u32 gMapObjectPic_OldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/6.4bpp"); +const u32 gMapObjectPic_OldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/7.4bpp"); +const u32 gMapObjectPic_OldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/8.4bpp"); +const u32 gMapObjectPic_OldWoman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/0.4bpp"); +const u32 gMapObjectPic_OldWoman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/1.4bpp"); +const u32 gMapObjectPic_OldWoman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/2.4bpp"); +const u32 gMapObjectPic_OldWoman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/3.4bpp"); +const u32 gMapObjectPic_OldWoman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/4.4bpp"); +const u32 gMapObjectPic_OldWoman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/5.4bpp"); +const u32 gMapObjectPic_OldWoman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/6.4bpp"); +const u32 gMapObjectPic_OldWoman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/7.4bpp"); +const u32 gMapObjectPic_OldWoman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/8.4bpp"); +const u32 gMapObjectPic_Man2_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/0.4bpp"); +const u32 gMapObjectPic_Man2_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/1.4bpp"); +const u32 gMapObjectPic_Man2_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/2.4bpp"); +const u32 gMapObjectPic_Man2_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/3.4bpp"); +const u32 gMapObjectPic_Man2_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/4.4bpp"); +const u32 gMapObjectPic_Man2_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/5.4bpp"); +const u32 gMapObjectPic_Man2_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/6.4bpp"); +const u32 gMapObjectPic_Man2_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/7.4bpp"); +const u32 gMapObjectPic_Man2_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/8.4bpp"); +const u32 gMapObjectPic_Woman4_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/0.4bpp"); +const u32 gMapObjectPic_Woman4_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/1.4bpp"); +const u32 gMapObjectPic_Woman4_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/2.4bpp"); +const u32 gMapObjectPic_Woman4_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/3.4bpp"); +const u32 gMapObjectPic_Woman4_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/4.4bpp"); +const u32 gMapObjectPic_Woman4_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/5.4bpp"); +const u32 gMapObjectPic_Woman4_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/6.4bpp"); +const u32 gMapObjectPic_Woman4_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/7.4bpp"); +const u32 gMapObjectPic_Woman4_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/8.4bpp"); +const u32 gMapObjectPic_Man3_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/0.4bpp"); +const u32 gMapObjectPic_Man3_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/1.4bpp"); +const u32 gMapObjectPic_Man3_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/2.4bpp"); +const u32 gMapObjectPic_Man3_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/3.4bpp"); +const u32 gMapObjectPic_Man3_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/4.4bpp"); +const u32 gMapObjectPic_Man3_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/5.4bpp"); +const u32 gMapObjectPic_Man3_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/6.4bpp"); +const u32 gMapObjectPic_Man3_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/7.4bpp"); +const u32 gMapObjectPic_Man3_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/8.4bpp"); +const u32 gMapObjectPic_Woman5_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/0.4bpp"); +const u32 gMapObjectPic_Woman5_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/1.4bpp"); +const u32 gMapObjectPic_Woman5_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/2.4bpp"); +const u32 gMapObjectPic_Woman5_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/3.4bpp"); +const u32 gMapObjectPic_Woman5_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/4.4bpp"); +const u32 gMapObjectPic_Woman5_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/5.4bpp"); +const u32 gMapObjectPic_Woman5_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/6.4bpp"); +const u32 gMapObjectPic_Woman5_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/7.4bpp"); +const u32 gMapObjectPic_Woman5_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/8.4bpp"); +const u32 gMapObjectPic_Cook_0[] = INCBIN_U32("graphics/map_objects/pics/people/cook/0.4bpp"); +const u32 gMapObjectPic_Cook_1[] = INCBIN_U32("graphics/map_objects/pics/people/cook/1.4bpp"); +const u32 gMapObjectPic_Cook_2[] = INCBIN_U32("graphics/map_objects/pics/people/cook/2.4bpp"); +const u32 gMapObjectPic_Woman6_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/0.4bpp"); +const u32 gMapObjectPic_Woman6_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/1.4bpp"); +const u32 gMapObjectPic_Woman6_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/2.4bpp"); +const u32 gMapObjectPic_Woman6_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/3.4bpp"); +const u32 gMapObjectPic_Woman6_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/4.4bpp"); +const u32 gMapObjectPic_Woman6_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/5.4bpp"); +const u32 gMapObjectPic_Woman6_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/6.4bpp"); +const u32 gMapObjectPic_Woman6_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/7.4bpp"); +const u32 gMapObjectPic_Woman6_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/8.4bpp"); +const u32 gMapObjectPic_OldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/0.4bpp"); +const u32 gMapObjectPic_OldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/1.4bpp"); +const u32 gMapObjectPic_OldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/2.4bpp"); +const u32 gMapObjectPic_OldWoman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/0.4bpp"); +const u32 gMapObjectPic_OldWoman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/1.4bpp"); +const u32 gMapObjectPic_OldWoman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/2.4bpp"); +const u32 gMapObjectPic_Camper_0[] = INCBIN_U32("graphics/map_objects/pics/people/camper/0.4bpp"); +const u32 gMapObjectPic_Camper_1[] = INCBIN_U32("graphics/map_objects/pics/people/camper/1.4bpp"); +const u32 gMapObjectPic_Camper_2[] = INCBIN_U32("graphics/map_objects/pics/people/camper/2.4bpp"); +const u32 gMapObjectPic_Camper_3[] = INCBIN_U32("graphics/map_objects/pics/people/camper/3.4bpp"); +const u32 gMapObjectPic_Camper_4[] = INCBIN_U32("graphics/map_objects/pics/people/camper/4.4bpp"); +const u32 gMapObjectPic_Camper_5[] = INCBIN_U32("graphics/map_objects/pics/people/camper/5.4bpp"); +const u32 gMapObjectPic_Camper_6[] = INCBIN_U32("graphics/map_objects/pics/people/camper/6.4bpp"); +const u32 gMapObjectPic_Camper_7[] = INCBIN_U32("graphics/map_objects/pics/people/camper/7.4bpp"); +const u32 gMapObjectPic_Camper_8[] = INCBIN_U32("graphics/map_objects/pics/people/camper/8.4bpp"); +const u32 gMapObjectPic_Picnicker_0[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/0.4bpp"); +const u32 gMapObjectPic_Picnicker_1[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/1.4bpp"); +const u32 gMapObjectPic_Picnicker_2[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/2.4bpp"); +const u32 gMapObjectPic_Picnicker_3[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/3.4bpp"); +const u32 gMapObjectPic_Picnicker_4[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/4.4bpp"); +const u32 gMapObjectPic_Picnicker_5[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/5.4bpp"); +const u32 gMapObjectPic_Picnicker_6[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/6.4bpp"); +const u32 gMapObjectPic_Picnicker_7[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/7.4bpp"); +const u32 gMapObjectPic_Picnicker_8[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/8.4bpp"); +const u32 gMapObjectPic_Man4_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/0.4bpp"); +const u32 gMapObjectPic_Man4_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/1.4bpp"); +const u32 gMapObjectPic_Man4_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/2.4bpp"); +const u32 gMapObjectPic_Man4_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/3.4bpp"); +const u32 gMapObjectPic_Man4_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/4.4bpp"); +const u32 gMapObjectPic_Man4_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/5.4bpp"); +const u32 gMapObjectPic_Man4_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/6.4bpp"); +const u32 gMapObjectPic_Man4_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/7.4bpp"); +const u32 gMapObjectPic_Man4_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/8.4bpp"); +const u32 gMapObjectPic_Woman7_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/0.4bpp"); +const u32 gMapObjectPic_Woman7_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/1.4bpp"); +const u32 gMapObjectPic_Woman7_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/2.4bpp"); +const u32 gMapObjectPic_Woman7_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/3.4bpp"); +const u32 gMapObjectPic_Woman7_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/4.4bpp"); +const u32 gMapObjectPic_Woman7_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/5.4bpp"); +const u32 gMapObjectPic_Woman7_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/6.4bpp"); +const u32 gMapObjectPic_Woman7_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/7.4bpp"); +const u32 gMapObjectPic_Woman7_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/8.4bpp"); +const u32 gMapObjectPic_Youngster_0[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/0.4bpp"); +const u32 gMapObjectPic_Youngster_1[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/1.4bpp"); +const u32 gMapObjectPic_Youngster_2[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/2.4bpp"); +const u32 gMapObjectPic_Youngster_3[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/3.4bpp"); +const u32 gMapObjectPic_Youngster_4[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/4.4bpp"); +const u32 gMapObjectPic_Youngster_5[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/5.4bpp"); +const u32 gMapObjectPic_Youngster_6[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/6.4bpp"); +const u32 gMapObjectPic_Youngster_7[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/7.4bpp"); +const u32 gMapObjectPic_Youngster_8[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/8.4bpp"); +const u32 gMapObjectPic_BugCatcher_0[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/0.4bpp"); +const u32 gMapObjectPic_BugCatcher_1[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/1.4bpp"); +const u32 gMapObjectPic_BugCatcher_2[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/2.4bpp"); +const u32 gMapObjectPic_BugCatcher_3[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/3.4bpp"); +const u32 gMapObjectPic_BugCatcher_4[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/4.4bpp"); +const u32 gMapObjectPic_BugCatcher_5[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/5.4bpp"); +const u32 gMapObjectPic_BugCatcher_6[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/6.4bpp"); +const u32 gMapObjectPic_BugCatcher_7[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/7.4bpp"); +const u32 gMapObjectPic_BugCatcher_8[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/8.4bpp"); +const u32 gMapObjectPic_PsychicM_0[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/0.4bpp"); +const u32 gMapObjectPic_PsychicM_1[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/1.4bpp"); +const u32 gMapObjectPic_PsychicM_2[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/2.4bpp"); +const u32 gMapObjectPic_PsychicM_3[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/3.4bpp"); +const u32 gMapObjectPic_PsychicM_4[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/4.4bpp"); +const u32 gMapObjectPic_PsychicM_5[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/5.4bpp"); +const u32 gMapObjectPic_PsychicM_6[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/6.4bpp"); +const u32 gMapObjectPic_PsychicM_7[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/7.4bpp"); +const u32 gMapObjectPic_PsychicM_8[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/8.4bpp"); +const u32 gMapObjectPic_SchoolKidM_0[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/0.4bpp"); +const u32 gMapObjectPic_SchoolKidM_1[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/1.4bpp"); +const u32 gMapObjectPic_SchoolKidM_2[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/2.4bpp"); +const u32 gMapObjectPic_SchoolKidM_3[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/3.4bpp"); +const u32 gMapObjectPic_SchoolKidM_4[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/4.4bpp"); +const u32 gMapObjectPic_SchoolKidM_5[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/5.4bpp"); +const u32 gMapObjectPic_SchoolKidM_6[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/6.4bpp"); +const u32 gMapObjectPic_SchoolKidM_7[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/7.4bpp"); +const u32 gMapObjectPic_SchoolKidM_8[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/8.4bpp"); +const u32 gMapObjectPic_Maniac_0[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/0.4bpp"); +const u32 gMapObjectPic_Maniac_1[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/1.4bpp"); +const u32 gMapObjectPic_Maniac_2[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/2.4bpp"); +const u32 gMapObjectPic_Maniac_3[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/3.4bpp"); +const u32 gMapObjectPic_Maniac_4[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/4.4bpp"); +const u32 gMapObjectPic_Maniac_5[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/5.4bpp"); +const u32 gMapObjectPic_Maniac_6[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/6.4bpp"); +const u32 gMapObjectPic_Maniac_7[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/7.4bpp"); +const u32 gMapObjectPic_Maniac_8[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/8.4bpp"); +const u32 gMapObjectPic_HexManiac_0[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/0.4bpp"); +const u32 gMapObjectPic_HexManiac_1[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/1.4bpp"); +const u32 gMapObjectPic_HexManiac_2[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/2.4bpp"); +const u32 gMapObjectPic_HexManiac_3[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/3.4bpp"); +const u32 gMapObjectPic_HexManiac_4[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/4.4bpp"); +const u32 gMapObjectPic_HexManiac_5[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/5.4bpp"); +const u32 gMapObjectPic_HexManiac_6[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/6.4bpp"); +const u32 gMapObjectPic_HexManiac_7[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/7.4bpp"); +const u32 gMapObjectPic_HexManiac_8[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/8.4bpp"); +const u32 gMapObjectPic_Woman8_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/0.4bpp"); +const u32 gMapObjectPic_Woman8_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/1.4bpp"); +const u32 gMapObjectPic_Woman8_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/2.4bpp"); +const u32 gMapObjectPic_Woman8_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/3.4bpp"); +const u32 gMapObjectPic_Woman8_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/4.4bpp"); +const u32 gMapObjectPic_Woman8_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/5.4bpp"); +const u32 gMapObjectPic_Woman8_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/6.4bpp"); +const u32 gMapObjectPic_Woman8_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/7.4bpp"); +const u32 gMapObjectPic_Woman8_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/8.4bpp"); +const u32 gMapObjectPic_SwimmerM_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/0.4bpp"); +const u32 gMapObjectPic_SwimmerM_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/1.4bpp"); +const u32 gMapObjectPic_SwimmerM_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/2.4bpp"); +const u32 gMapObjectPic_SwimmerM_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/3.4bpp"); +const u32 gMapObjectPic_SwimmerM_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/4.4bpp"); +const u32 gMapObjectPic_SwimmerM_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/5.4bpp"); +const u32 gMapObjectPic_SwimmerM_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/6.4bpp"); +const u32 gMapObjectPic_SwimmerM_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/7.4bpp"); +const u32 gMapObjectPic_SwimmerM_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/8.4bpp"); +const u32 gMapObjectPic_SwimmerF_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/0.4bpp"); +const u32 gMapObjectPic_SwimmerF_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/1.4bpp"); +const u32 gMapObjectPic_SwimmerF_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/2.4bpp"); +const u32 gMapObjectPic_SwimmerF_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/3.4bpp"); +const u32 gMapObjectPic_SwimmerF_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/4.4bpp"); +const u32 gMapObjectPic_SwimmerF_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/5.4bpp"); +const u32 gMapObjectPic_SwimmerF_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/6.4bpp"); +const u32 gMapObjectPic_SwimmerF_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/7.4bpp"); +const u32 gMapObjectPic_SwimmerF_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/8.4bpp"); +const u32 gMapObjectPic_BlackBelt_0[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/0.4bpp"); +const u32 gMapObjectPic_BlackBelt_1[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/1.4bpp"); +const u32 gMapObjectPic_BlackBelt_2[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/2.4bpp"); +const u32 gMapObjectPic_BlackBelt_3[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/3.4bpp"); +const u32 gMapObjectPic_BlackBelt_4[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/4.4bpp"); +const u32 gMapObjectPic_BlackBelt_5[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/5.4bpp"); +const u32 gMapObjectPic_BlackBelt_6[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/6.4bpp"); +const u32 gMapObjectPic_BlackBelt_7[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/7.4bpp"); +const u32 gMapObjectPic_BlackBelt_8[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/8.4bpp"); +const u32 gMapObjectPic_Beauty_0[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/0.4bpp"); +const u32 gMapObjectPic_Beauty_1[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/1.4bpp"); +const u32 gMapObjectPic_Beauty_2[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/2.4bpp"); +const u32 gMapObjectPic_Beauty_3[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/3.4bpp"); +const u32 gMapObjectPic_Beauty_4[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/4.4bpp"); +const u32 gMapObjectPic_Beauty_5[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/5.4bpp"); +const u32 gMapObjectPic_Beauty_6[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/6.4bpp"); +const u32 gMapObjectPic_Beauty_7[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/7.4bpp"); +const u32 gMapObjectPic_Beauty_8[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/8.4bpp"); +const u32 gMapObjectPic_Scientist1_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/0.4bpp"); +const u32 gMapObjectPic_Scientist1_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/1.4bpp"); +const u32 gMapObjectPic_Scientist1_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/2.4bpp"); +const u32 gMapObjectPic_Scientist1_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/3.4bpp"); +const u32 gMapObjectPic_Scientist1_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/4.4bpp"); +const u32 gMapObjectPic_Scientist1_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/5.4bpp"); +const u32 gMapObjectPic_Scientist1_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/6.4bpp"); +const u32 gMapObjectPic_Scientist1_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/7.4bpp"); +const u32 gMapObjectPic_Scientist1_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/8.4bpp"); +const u32 gMapObjectPic_Lass_0[] = INCBIN_U32("graphics/map_objects/pics/people/lass/0.4bpp"); +const u32 gMapObjectPic_Lass_1[] = INCBIN_U32("graphics/map_objects/pics/people/lass/1.4bpp"); +const u32 gMapObjectPic_Lass_2[] = INCBIN_U32("graphics/map_objects/pics/people/lass/2.4bpp"); +const u32 gMapObjectPic_Lass_3[] = INCBIN_U32("graphics/map_objects/pics/people/lass/3.4bpp"); +const u32 gMapObjectPic_Lass_4[] = INCBIN_U32("graphics/map_objects/pics/people/lass/4.4bpp"); +const u32 gMapObjectPic_Lass_5[] = INCBIN_U32("graphics/map_objects/pics/people/lass/5.4bpp"); +const u32 gMapObjectPic_Lass_6[] = INCBIN_U32("graphics/map_objects/pics/people/lass/6.4bpp"); +const u32 gMapObjectPic_Lass_7[] = INCBIN_U32("graphics/map_objects/pics/people/lass/7.4bpp"); +const u32 gMapObjectPic_Lass_8[] = INCBIN_U32("graphics/map_objects/pics/people/lass/8.4bpp"); +const u32 gMapObjectPic_Gentleman_0[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/0.4bpp"); +const u32 gMapObjectPic_Gentleman_1[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/1.4bpp"); +const u32 gMapObjectPic_Gentleman_2[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/2.4bpp"); +const u32 gMapObjectPic_Gentleman_3[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/3.4bpp"); +const u32 gMapObjectPic_Gentleman_4[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/4.4bpp"); +const u32 gMapObjectPic_Gentleman_5[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/5.4bpp"); +const u32 gMapObjectPic_Gentleman_6[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/6.4bpp"); +const u32 gMapObjectPic_Gentleman_7[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/7.4bpp"); +const u32 gMapObjectPic_Gentleman_8[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/8.4bpp"); +const u32 gMapObjectPic_Sailor_0[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/0.4bpp"); +const u32 gMapObjectPic_Sailor_1[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/1.4bpp"); +const u32 gMapObjectPic_Sailor_2[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/2.4bpp"); +const u32 gMapObjectPic_Sailor_3[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/3.4bpp"); +const u32 gMapObjectPic_Sailor_4[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/4.4bpp"); +const u32 gMapObjectPic_Sailor_5[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/5.4bpp"); +const u32 gMapObjectPic_Sailor_6[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/6.4bpp"); +const u32 gMapObjectPic_Sailor_7[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/7.4bpp"); +const u32 gMapObjectPic_Sailor_8[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/8.4bpp"); +const u32 gMapObjectPic_Fisherman_0[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/0.4bpp"); +const u32 gMapObjectPic_Fisherman_1[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/1.4bpp"); +const u32 gMapObjectPic_Fisherman_2[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/2.4bpp"); +const u32 gMapObjectPic_Fisherman_3[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/3.4bpp"); +const u32 gMapObjectPic_Fisherman_4[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/4.4bpp"); +const u32 gMapObjectPic_Fisherman_5[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/5.4bpp"); +const u32 gMapObjectPic_Fisherman_6[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/6.4bpp"); +const u32 gMapObjectPic_Fisherman_7[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/7.4bpp"); +const u32 gMapObjectPic_Fisherman_8[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/8.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/0.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/1.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/2.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/3.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/4.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/5.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/6.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/7.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/8.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/0.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/1.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/2.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/3.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/4.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/5.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/6.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/7.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/8.4bpp"); +const u32 gMapObjectPic_TuberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/0.4bpp"); +const u32 gMapObjectPic_TuberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/1.4bpp"); +const u32 gMapObjectPic_TuberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/2.4bpp"); +const u32 gMapObjectPic_TuberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/3.4bpp"); +const u32 gMapObjectPic_TuberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/4.4bpp"); +const u32 gMapObjectPic_TuberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/5.4bpp"); +const u32 gMapObjectPic_TuberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/6.4bpp"); +const u32 gMapObjectPic_TuberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/7.4bpp"); +const u32 gMapObjectPic_TuberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/8.4bpp"); +const u32 gMapObjectPic_TuberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/0.4bpp"); +const u32 gMapObjectPic_TuberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/1.4bpp"); +const u32 gMapObjectPic_TuberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/2.4bpp"); +const u32 gMapObjectPic_TuberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/3.4bpp"); +const u32 gMapObjectPic_TuberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/4.4bpp"); +const u32 gMapObjectPic_TuberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/5.4bpp"); +const u32 gMapObjectPic_TuberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/6.4bpp"); +const u32 gMapObjectPic_TuberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/7.4bpp"); +const u32 gMapObjectPic_TuberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/8.4bpp"); +const u32 gMapObjectPic_Hiker_0[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/0.4bpp"); +const u32 gMapObjectPic_Hiker_1[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/1.4bpp"); +const u32 gMapObjectPic_Hiker_2[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/2.4bpp"); +const u32 gMapObjectPic_Hiker_3[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/3.4bpp"); +const u32 gMapObjectPic_Hiker_4[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/4.4bpp"); +const u32 gMapObjectPic_Hiker_5[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/5.4bpp"); +const u32 gMapObjectPic_Hiker_6[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/6.4bpp"); +const u32 gMapObjectPic_Hiker_7[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/7.4bpp"); +const u32 gMapObjectPic_Hiker_8[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/8.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/0.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/1.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/2.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/3.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/4.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/5.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/6.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/7.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/8.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/0.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/1.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/2.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/3.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/4.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/5.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/6.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/7.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/8.4bpp"); +const u32 gMapObjectPic_Man5_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/0.4bpp"); +const u32 gMapObjectPic_Man5_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/1.4bpp"); +const u32 gMapObjectPic_Man5_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/2.4bpp"); +const u32 gMapObjectPic_Man5_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/3.4bpp"); +const u32 gMapObjectPic_Man5_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/4.4bpp"); +const u32 gMapObjectPic_Man5_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/5.4bpp"); +const u32 gMapObjectPic_Man5_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/6.4bpp"); +const u32 gMapObjectPic_Man5_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/7.4bpp"); +const u32 gMapObjectPic_Man5_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/8.4bpp"); +const u32 gMapObjectPic_Man6_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/0.4bpp"); +const u32 gMapObjectPic_Man6_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/1.4bpp"); +const u32 gMapObjectPic_Man6_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/2.4bpp"); +const u32 gMapObjectPic_Man6_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/3.4bpp"); +const u32 gMapObjectPic_Man6_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/4.4bpp"); +const u32 gMapObjectPic_Man6_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/5.4bpp"); +const u32 gMapObjectPic_Man6_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/6.4bpp"); +const u32 gMapObjectPic_Man6_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/7.4bpp"); +const u32 gMapObjectPic_Man6_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/8.4bpp"); +const u32 gMapObjectPic_Nurse_0[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/0.4bpp"); +const u32 gMapObjectPic_Nurse_1[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/1.4bpp"); +const u32 gMapObjectPic_Nurse_2[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/2.4bpp"); +const u32 gMapObjectPic_Nurse_3[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/3.4bpp"); +const u32 gMapObjectPic_Nurse_4[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/4.4bpp"); +const u32 gMapObjectPic_Nurse_5[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/5.4bpp"); +const u32 gMapObjectPic_Nurse_6[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/6.4bpp"); +const u32 gMapObjectPic_Nurse_7[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/7.4bpp"); +const u32 gMapObjectPic_Nurse_8[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/8.4bpp"); +const u32 gMapObjectPic_Nurse_9[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/9.4bpp"); +const u32 gMapObjectPic_ItemBall[] = INCBIN_U32("graphics/map_objects/pics/misc/item_ball.4bpp"); +const u32 gMapObjectPic_ProfBirch_0[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/0.4bpp"); +const u32 gMapObjectPic_ProfBirch_1[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/1.4bpp"); +const u32 gMapObjectPic_ProfBirch_2[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/2.4bpp"); +const u32 gMapObjectPic_ProfBirch_3[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/3.4bpp"); +const u32 gMapObjectPic_ProfBirch_4[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/4.4bpp"); +const u32 gMapObjectPic_ProfBirch_5[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/5.4bpp"); +const u32 gMapObjectPic_ProfBirch_6[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/6.4bpp"); +const u32 gMapObjectPic_ProfBirch_7[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/7.4bpp"); +const u32 gMapObjectPic_ProfBirch_8[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/8.4bpp"); +const u32 gMapObjectPic_ReporterM_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/0.4bpp"); +const u32 gMapObjectPic_ReporterM_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/1.4bpp"); +const u32 gMapObjectPic_ReporterM_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/2.4bpp"); +const u32 gMapObjectPic_ReporterM_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/3.4bpp"); +const u32 gMapObjectPic_ReporterM_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/4.4bpp"); +const u32 gMapObjectPic_ReporterM_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/5.4bpp"); +const u32 gMapObjectPic_ReporterM_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/6.4bpp"); +const u32 gMapObjectPic_ReporterM_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/7.4bpp"); +const u32 gMapObjectPic_ReporterM_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/8.4bpp"); +const u32 gMapObjectPic_ReporterF_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/0.4bpp"); +const u32 gMapObjectPic_ReporterF_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/1.4bpp"); +const u32 gMapObjectPic_ReporterF_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/2.4bpp"); +const u32 gMapObjectPic_ReporterF_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/3.4bpp"); +const u32 gMapObjectPic_ReporterF_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/4.4bpp"); +const u32 gMapObjectPic_ReporterF_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/5.4bpp"); +const u32 gMapObjectPic_ReporterF_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/6.4bpp"); +const u32 gMapObjectPic_ReporterF_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/7.4bpp"); +const u32 gMapObjectPic_ReporterF_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/8.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/0.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/1.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/2.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/3.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/4.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/5.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/6.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/7.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/8.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/0.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/1.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/2.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/3.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/4.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/5.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/6.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/7.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/8.4bpp"); +const u32 gMapObjectPic_MartEmployee_0[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/0.4bpp"); +const u32 gMapObjectPic_MartEmployee_1[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/1.4bpp"); +const u32 gMapObjectPic_MartEmployee_2[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/2.4bpp"); +const u32 gMapObjectPic_MartEmployee_3[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/3.4bpp"); +const u32 gMapObjectPic_MartEmployee_4[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/4.4bpp"); +const u32 gMapObjectPic_MartEmployee_5[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/5.4bpp"); +const u32 gMapObjectPic_MartEmployee_6[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/6.4bpp"); +const u32 gMapObjectPic_MartEmployee_7[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/7.4bpp"); +const u32 gMapObjectPic_MartEmployee_8[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/8.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/0.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/1.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/2.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/3.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/4.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/5.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/6.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/7.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/8.4bpp"); +const u32 gMapObjectPic_Teala_0[] = INCBIN_U32("graphics/map_objects/pics/people/teala/0.4bpp"); +const u32 gMapObjectPic_Teala_1[] = INCBIN_U32("graphics/map_objects/pics/people/teala/1.4bpp"); +const u32 gMapObjectPic_Teala_2[] = INCBIN_U32("graphics/map_objects/pics/people/teala/2.4bpp"); +const u32 gMapObjectPic_Teala_3[] = INCBIN_U32("graphics/map_objects/pics/people/teala/3.4bpp"); +const u32 gMapObjectPic_Teala_4[] = INCBIN_U32("graphics/map_objects/pics/people/teala/4.4bpp"); +const u32 gMapObjectPic_Teala_5[] = INCBIN_U32("graphics/map_objects/pics/people/teala/5.4bpp"); +const u32 gMapObjectPic_Teala_6[] = INCBIN_U32("graphics/map_objects/pics/people/teala/6.4bpp"); +const u32 gMapObjectPic_Teala_7[] = INCBIN_U32("graphics/map_objects/pics/people/teala/7.4bpp"); +const u32 gMapObjectPic_Teala_8[] = INCBIN_U32("graphics/map_objects/pics/people/teala/8.4bpp"); +const u32 gMapObjectPic_Artist_0[] = INCBIN_U32("graphics/map_objects/pics/people/artist/0.4bpp"); +const u32 gMapObjectPic_Artist_1[] = INCBIN_U32("graphics/map_objects/pics/people/artist/1.4bpp"); +const u32 gMapObjectPic_Artist_2[] = INCBIN_U32("graphics/map_objects/pics/people/artist/2.4bpp"); +const u32 gMapObjectPic_Artist_3[] = INCBIN_U32("graphics/map_objects/pics/people/artist/3.4bpp"); +const u32 gMapObjectPic_Artist_4[] = INCBIN_U32("graphics/map_objects/pics/people/artist/4.4bpp"); +const u32 gMapObjectPic_Artist_5[] = INCBIN_U32("graphics/map_objects/pics/people/artist/5.4bpp"); +const u32 gMapObjectPic_Artist_6[] = INCBIN_U32("graphics/map_objects/pics/people/artist/6.4bpp"); +const u32 gMapObjectPic_Artist_7[] = INCBIN_U32("graphics/map_objects/pics/people/artist/7.4bpp"); +const u32 gMapObjectPic_Artist_8[] = INCBIN_U32("graphics/map_objects/pics/people/artist/8.4bpp"); +const u32 gMapObjectPic_Cameraman_0[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/0.4bpp"); +const u32 gMapObjectPic_Cameraman_1[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/1.4bpp"); +const u32 gMapObjectPic_Cameraman_2[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/2.4bpp"); +const u32 gMapObjectPic_Cameraman_3[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/3.4bpp"); +const u32 gMapObjectPic_Cameraman_4[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/4.4bpp"); +const u32 gMapObjectPic_Cameraman_5[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/5.4bpp"); +const u32 gMapObjectPic_Cameraman_6[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/6.4bpp"); +const u32 gMapObjectPic_Cameraman_7[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/7.4bpp"); +const u32 gMapObjectPic_Cameraman_8[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/8.4bpp"); +const u32 gMapObjectPic_Scientist2_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/0.4bpp"); +const u32 gMapObjectPic_Scientist2_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/1.4bpp"); +const u32 gMapObjectPic_Scientist2_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/2.4bpp"); +const u32 gMapObjectPic_Scientist2_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/3.4bpp"); +const u32 gMapObjectPic_Scientist2_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/4.4bpp"); +const u32 gMapObjectPic_Scientist2_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/5.4bpp"); +const u32 gMapObjectPic_Scientist2_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/6.4bpp"); +const u32 gMapObjectPic_Scientist2_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/7.4bpp"); +const u32 gMapObjectPic_Scientist2_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/8.4bpp"); +const u32 gMapObjectPic_Man7_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/0.4bpp"); +const u32 gMapObjectPic_Man7_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/1.4bpp"); +const u32 gMapObjectPic_Man7_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/2.4bpp"); +const u32 gMapObjectPic_Man7_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/3.4bpp"); +const u32 gMapObjectPic_Man7_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/4.4bpp"); +const u32 gMapObjectPic_Man7_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/5.4bpp"); +const u32 gMapObjectPic_Man7_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/6.4bpp"); +const u32 gMapObjectPic_Man7_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/7.4bpp"); +const u32 gMapObjectPic_Man7_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/8.4bpp"); +const u32 gMapObjectPic_AquaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/0.4bpp"); +const u32 gMapObjectPic_AquaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/1.4bpp"); +const u32 gMapObjectPic_AquaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/2.4bpp"); +const u32 gMapObjectPic_AquaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/3.4bpp"); +const u32 gMapObjectPic_AquaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/4.4bpp"); +const u32 gMapObjectPic_AquaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/5.4bpp"); +const u32 gMapObjectPic_AquaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/6.4bpp"); +const u32 gMapObjectPic_AquaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/7.4bpp"); +const u32 gMapObjectPic_AquaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/8.4bpp"); +const u32 gMapObjectPic_AquaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/0.4bpp"); +const u32 gMapObjectPic_AquaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/1.4bpp"); +const u32 gMapObjectPic_AquaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/2.4bpp"); +const u32 gMapObjectPic_AquaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/3.4bpp"); +const u32 gMapObjectPic_AquaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/4.4bpp"); +const u32 gMapObjectPic_AquaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/5.4bpp"); +const u32 gMapObjectPic_AquaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/6.4bpp"); +const u32 gMapObjectPic_AquaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/7.4bpp"); +const u32 gMapObjectPic_AquaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/8.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/0.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/1.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/2.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/3.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/4.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/5.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/6.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/7.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/8.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/0.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/1.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/2.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/3.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/4.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/5.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/6.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/7.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/8.4bpp"); +const u32 gMapObjectPic_Sidney_0[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/0.4bpp"); +const u32 gMapObjectPic_Sidney_1[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/1.4bpp"); +const u32 gMapObjectPic_Sidney_2[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/2.4bpp"); +const u32 gMapObjectPic_Phoebe_0[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/0.4bpp"); +const u32 gMapObjectPic_Phoebe_1[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/1.4bpp"); +const u32 gMapObjectPic_Phoebe_2[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/2.4bpp"); +const u32 gMapObjectPic_Glacia_0[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/0.4bpp"); +const u32 gMapObjectPic_Glacia_1[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/1.4bpp"); +const u32 gMapObjectPic_Glacia_2[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/2.4bpp"); +const u32 gMapObjectPic_Drake_0[] = INCBIN_U32("graphics/map_objects/pics/people/drake/0.4bpp"); +const u32 gMapObjectPic_Drake_1[] = INCBIN_U32("graphics/map_objects/pics/people/drake/1.4bpp"); +const u32 gMapObjectPic_Drake_2[] = INCBIN_U32("graphics/map_objects/pics/people/drake/2.4bpp"); +const u32 gMapObjectPic_Roxanne_0[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/0.4bpp"); +const u32 gMapObjectPic_Roxanne_1[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/1.4bpp"); +const u32 gMapObjectPic_Roxanne_2[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/2.4bpp"); +const u32 gMapObjectPic_Brawly_0[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/0.4bpp"); +const u32 gMapObjectPic_Brawly_1[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/1.4bpp"); +const u32 gMapObjectPic_Brawly_2[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/2.4bpp"); +const u32 gMapObjectPic_Wattson_0[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/0.4bpp"); +const u32 gMapObjectPic_Wattson_1[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/1.4bpp"); +const u32 gMapObjectPic_Wattson_2[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/2.4bpp"); +const u32 gMapObjectPic_Flannery_0[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/0.4bpp"); +const u32 gMapObjectPic_Flannery_1[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/1.4bpp"); +const u32 gMapObjectPic_Flannery_2[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/2.4bpp"); +const u32 gMapObjectPic_Norman_0[] = INCBIN_U32("graphics/map_objects/pics/people/norman/0.4bpp"); +const u32 gMapObjectPic_Norman_1[] = INCBIN_U32("graphics/map_objects/pics/people/norman/1.4bpp"); +const u32 gMapObjectPic_Norman_2[] = INCBIN_U32("graphics/map_objects/pics/people/norman/2.4bpp"); +const u32 gMapObjectPic_Norman_3[] = INCBIN_U32("graphics/map_objects/pics/people/norman/3.4bpp"); +const u32 gMapObjectPic_Norman_4[] = INCBIN_U32("graphics/map_objects/pics/people/norman/4.4bpp"); +const u32 gMapObjectPic_Norman_5[] = INCBIN_U32("graphics/map_objects/pics/people/norman/5.4bpp"); +const u32 gMapObjectPic_Norman_6[] = INCBIN_U32("graphics/map_objects/pics/people/norman/6.4bpp"); +const u32 gMapObjectPic_Norman_7[] = INCBIN_U32("graphics/map_objects/pics/people/norman/7.4bpp"); +const u32 gMapObjectPic_Norman_8[] = INCBIN_U32("graphics/map_objects/pics/people/norman/8.4bpp"); +const u32 gMapObjectPic_Winona_0[] = INCBIN_U32("graphics/map_objects/pics/people/winona/0.4bpp"); +const u32 gMapObjectPic_Winona_1[] = INCBIN_U32("graphics/map_objects/pics/people/winona/1.4bpp"); +const u32 gMapObjectPic_Winona_2[] = INCBIN_U32("graphics/map_objects/pics/people/winona/2.4bpp"); +const u32 gMapObjectPic_Liza_0[] = INCBIN_U32("graphics/map_objects/pics/people/liza/0.4bpp"); +const u32 gMapObjectPic_Liza_1[] = INCBIN_U32("graphics/map_objects/pics/people/liza/1.4bpp"); +const u32 gMapObjectPic_Liza_2[] = INCBIN_U32("graphics/map_objects/pics/people/liza/2.4bpp"); +const u32 gMapObjectPic_Tate_0[] = INCBIN_U32("graphics/map_objects/pics/people/tate/0.4bpp"); +const u32 gMapObjectPic_Tate_1[] = INCBIN_U32("graphics/map_objects/pics/people/tate/1.4bpp"); +const u32 gMapObjectPic_Tate_2[] = INCBIN_U32("graphics/map_objects/pics/people/tate/2.4bpp"); +const u32 gMapObjectPic_Wallace_0[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/0.4bpp"); +const u32 gMapObjectPic_Wallace_1[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/1.4bpp"); +const u32 gMapObjectPic_Wallace_2[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/2.4bpp"); +const u32 gMapObjectPic_Wallace_3[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/3.4bpp"); +const u32 gMapObjectPic_Wallace_4[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/4.4bpp"); +const u32 gMapObjectPic_Wallace_5[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/5.4bpp"); +const u32 gMapObjectPic_Wallace_6[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/6.4bpp"); +const u32 gMapObjectPic_Wallace_7[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/7.4bpp"); +const u32 gMapObjectPic_Wallace_8[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/8.4bpp"); +const u32 gMapObjectPic_Steven_0[] = INCBIN_U32("graphics/map_objects/pics/people/steven/0.4bpp"); +const u32 gMapObjectPic_Steven_1[] = INCBIN_U32("graphics/map_objects/pics/people/steven/1.4bpp"); +const u32 gMapObjectPic_Steven_2[] = INCBIN_U32("graphics/map_objects/pics/people/steven/2.4bpp"); +const u32 gMapObjectPic_Steven_3[] = INCBIN_U32("graphics/map_objects/pics/people/steven/3.4bpp"); +const u32 gMapObjectPic_Steven_4[] = INCBIN_U32("graphics/map_objects/pics/people/steven/4.4bpp"); +const u32 gMapObjectPic_Steven_5[] = INCBIN_U32("graphics/map_objects/pics/people/steven/5.4bpp"); +const u32 gMapObjectPic_Steven_6[] = INCBIN_U32("graphics/map_objects/pics/people/steven/6.4bpp"); +const u32 gMapObjectPic_Steven_7[] = INCBIN_U32("graphics/map_objects/pics/people/steven/7.4bpp"); +const u32 gMapObjectPic_Steven_8[] = INCBIN_U32("graphics/map_objects/pics/people/steven/8.4bpp"); +const u32 gMapObjectPic_Wally_0[] = INCBIN_U32("graphics/map_objects/pics/people/wally/0.4bpp"); +const u32 gMapObjectPic_Wally_1[] = INCBIN_U32("graphics/map_objects/pics/people/wally/1.4bpp"); +const u32 gMapObjectPic_Wally_2[] = INCBIN_U32("graphics/map_objects/pics/people/wally/2.4bpp"); +const u32 gMapObjectPic_Wally_3[] = INCBIN_U32("graphics/map_objects/pics/people/wally/3.4bpp"); +const u32 gMapObjectPic_Wally_4[] = INCBIN_U32("graphics/map_objects/pics/people/wally/4.4bpp"); +const u32 gMapObjectPic_Wally_5[] = INCBIN_U32("graphics/map_objects/pics/people/wally/5.4bpp"); +const u32 gMapObjectPic_Wally_6[] = INCBIN_U32("graphics/map_objects/pics/people/wally/6.4bpp"); +const u32 gMapObjectPic_Wally_7[] = INCBIN_U32("graphics/map_objects/pics/people/wally/7.4bpp"); +const u32 gMapObjectPic_Wally_8[] = INCBIN_U32("graphics/map_objects/pics/people/wally/8.4bpp"); +const u32 gMapObjectPic_LittleBoy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/0.4bpp"); +const u32 gMapObjectPic_LittleBoy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/1.4bpp"); +const u32 gMapObjectPic_LittleBoy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/2.4bpp"); +const u32 gMapObjectPic_LittleBoy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/3.4bpp"); +const u32 gMapObjectPic_LittleBoy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/4.4bpp"); +const u32 gMapObjectPic_LittleBoy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/5.4bpp"); +const u32 gMapObjectPic_LittleBoy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/6.4bpp"); +const u32 gMapObjectPic_LittleBoy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/7.4bpp"); +const u32 gMapObjectPic_LittleBoy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/8.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/0.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/1.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/2.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/3.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/4.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/5.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/6.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/7.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/8.4bpp"); +const u32 gMapObjectPic_LatiasLatios_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/0.4bpp"); +const u32 gMapObjectPic_LatiasLatios_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/1.4bpp"); +const u32 gMapObjectPic_LatiasLatios_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/2.4bpp"); +const u32 gMapObjectPic_Boy5_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/0.4bpp"); +const u32 gMapObjectPic_Boy5_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/1.4bpp"); +const u32 gMapObjectPic_Boy5_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/2.4bpp"); +const u32 gMapObjectPic_ContestJudge_0[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/0.4bpp"); +const u32 gMapObjectPic_ContestJudge_1[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/1.4bpp"); +const u32 gMapObjectPic_ContestJudge_2[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/2.4bpp"); +const u32 gMapObjectPic_ContestJudge_3[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/3.4bpp"); +const u32 gMapObjectPic_ContestJudge_4[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/4.4bpp"); +const u32 gMapObjectPic_ContestJudge_5[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/5.4bpp"); +const u32 gMapObjectPic_ContestJudge_6[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/6.4bpp"); +const u32 gMapObjectPic_ContestJudge_7[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/7.4bpp"); +const u32 gMapObjectPic_ContestJudge_8[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/8.4bpp"); +const u32 gMapObjectPic_Archie_0[] = INCBIN_U32("graphics/map_objects/pics/people/archie/0.4bpp"); +const u32 gMapObjectPic_Archie_1[] = INCBIN_U32("graphics/map_objects/pics/people/archie/1.4bpp"); +const u32 gMapObjectPic_Archie_2[] = INCBIN_U32("graphics/map_objects/pics/people/archie/2.4bpp"); +const u32 gMapObjectPic_Archie_3[] = INCBIN_U32("graphics/map_objects/pics/people/archie/3.4bpp"); +const u32 gMapObjectPic_Archie_4[] = INCBIN_U32("graphics/map_objects/pics/people/archie/4.4bpp"); +const u32 gMapObjectPic_Archie_5[] = INCBIN_U32("graphics/map_objects/pics/people/archie/5.4bpp"); +const u32 gMapObjectPic_Archie_6[] = INCBIN_U32("graphics/map_objects/pics/people/archie/6.4bpp"); +const u32 gMapObjectPic_Archie_7[] = INCBIN_U32("graphics/map_objects/pics/people/archie/7.4bpp"); +const u32 gMapObjectPic_Archie_8[] = INCBIN_U32("graphics/map_objects/pics/people/archie/8.4bpp"); +const u32 gMapObjectPic_Maxie_0[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/0.4bpp"); +const u32 gMapObjectPic_Maxie_1[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/1.4bpp"); +const u32 gMapObjectPic_Maxie_2[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/2.4bpp"); +const u32 gMapObjectPic_Maxie_3[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/3.4bpp"); +const u32 gMapObjectPic_Maxie_4[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/4.4bpp"); +const u32 gMapObjectPic_Maxie_5[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/5.4bpp"); +const u32 gMapObjectPic_Maxie_6[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/6.4bpp"); +const u32 gMapObjectPic_Maxie_7[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/7.4bpp"); +const u32 gMapObjectPic_Maxie_8[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/8.4bpp"); +const u32 gMapObjectPic_Kyogre_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/0.4bpp"); +const u32 gMapObjectPic_Kyogre_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/1.4bpp"); +const u32 gMapObjectPic_Groudon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/0.4bpp"); +const u32 gMapObjectPic_Groudon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/1.4bpp"); +const u32 gMapObjectPic_Regi[] = INCBIN_U32("graphics/map_objects/pics/pokemon/regi.4bpp"); +const u32 gMapObjectPic_Skitty_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/0.4bpp"); +const u32 gMapObjectPic_Skitty_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/1.4bpp"); +const u32 gMapObjectPic_Skitty_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/2.4bpp"); +const u32 gMapObjectPic_Kecleon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/0.4bpp"); +const u32 gMapObjectPic_Kecleon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/1.4bpp"); +const u32 gMapObjectPic_Kecleon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/2.4bpp"); +const u32 gMapObjectPic_Rayquaza_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/0.4bpp"); +const u32 gMapObjectPic_Rayquaza_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/1.4bpp"); +const u32 gMapObjectPic_Zigzagoon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/0.4bpp"); +const u32 gMapObjectPic_Zigzagoon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/1.4bpp"); +const u32 gMapObjectPic_Zigzagoon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/2.4bpp"); +const u32 gMapObjectPic_Pikachu_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/0.4bpp"); +const u32 gMapObjectPic_Pikachu_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/1.4bpp"); +const u32 gMapObjectPic_Pikachu_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/2.4bpp"); +const u32 gMapObjectPic_Azumarill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/0.4bpp"); +const u32 gMapObjectPic_Azumarill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/1.4bpp"); +const u32 gMapObjectPic_Azumarill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/2.4bpp"); +const u32 gMapObjectPic_Wingull_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/0.4bpp"); +const u32 gMapObjectPic_Wingull_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/3.4bpp"); +const u32 gMapObjectPic_Wingull_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/1.4bpp"); +const u32 gMapObjectPic_Wingull_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/4.4bpp"); +const u32 gMapObjectPic_Wingull_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/2.4bpp"); +const u32 gMapObjectPic_Wingull_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/5.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/0.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/1.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/2.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/3.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/4.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/5.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/6.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/7.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/8.4bpp"); +const u32 gMapObjectPic_Azurill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/0.4bpp"); +const u32 gMapObjectPic_Azurill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/1.4bpp"); +const u32 gMapObjectPic_Azurill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/2.4bpp"); +const u32 gMapObjectPic_Mom_0[] = INCBIN_U32("graphics/map_objects/pics/people/mom/0.4bpp"); +const u32 gMapObjectPic_Mom_1[] = INCBIN_U32("graphics/map_objects/pics/people/mom/1.4bpp"); +const u32 gMapObjectPic_Mom_2[] = INCBIN_U32("graphics/map_objects/pics/people/mom/2.4bpp"); +const u32 gMapObjectPic_Mom_3[] = INCBIN_U32("graphics/map_objects/pics/people/mom/3.4bpp"); +const u32 gMapObjectPic_Mom_4[] = INCBIN_U32("graphics/map_objects/pics/people/mom/4.4bpp"); +const u32 gMapObjectPic_Mom_5[] = INCBIN_U32("graphics/map_objects/pics/people/mom/5.4bpp"); +const u32 gMapObjectPic_Mom_6[] = INCBIN_U32("graphics/map_objects/pics/people/mom/6.4bpp"); +const u32 gMapObjectPic_Mom_7[] = INCBIN_U32("graphics/map_objects/pics/people/mom/7.4bpp"); +const u32 gMapObjectPic_Mom_8[] = INCBIN_U32("graphics/map_objects/pics/people/mom/8.4bpp"); +const u16 gMapObjectPalette22[] = INCBIN_U16("graphics/map_objects/palettes/22.gbapal"); +const u16 gMapObjectPalette23[] = INCBIN_U16("graphics/map_objects/palettes/23.gbapal"); +const u16 gMapObjectPalette24[] = INCBIN_U16("graphics/map_objects/palettes/24.gbapal"); +const u16 gMapObjectPalette25[] = INCBIN_U16("graphics/map_objects/palettes/25.gbapal"); +const u32 gMapObjectPic_UnusedNatuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_natu_doll.4bpp"); +const u32 gMapObjectPic_UnusedMagnemiteDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_magnemite_doll.4bpp"); +const u32 gMapObjectPic_UnusedSquirtleDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_squirtle_doll.4bpp"); +const u32 gMapObjectPic_UnusedWooperDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_wooper_doll.4bpp"); +const u32 gMapObjectPic_UnusedPikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_pikachu_doll.4bpp"); +const u32 gMapObjectPic_UnusedPorygon2Doll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_porygon2_doll.4bpp"); +const u32 gMapObjectPic_PichuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pichu_doll.4bpp"); +const u32 gMapObjectPic_PikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pikachu_doll.4bpp"); +const u32 gMapObjectPic_MarillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/marill_doll.4bpp"); +const u32 gMapObjectPic_TogepiDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/togepi_doll.4bpp"); +const u32 gMapObjectPic_CyndaquilDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/cyndaquil_doll.4bpp"); +const u32 gMapObjectPic_ChikoritaDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/chikorita_doll.4bpp"); +const u32 gMapObjectPic_TotodileDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/totodile_doll.4bpp"); +const u32 gMapObjectPic_JigglypuffDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/jigglypuff_doll.4bpp"); +const u32 gMapObjectPic_MeowthDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/meowth_doll.4bpp"); +const u32 gMapObjectPic_ClefairyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/clefairy_doll.4bpp"); +const u32 gMapObjectPic_DittoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/ditto_doll.4bpp"); +const u32 gMapObjectPic_SmoochumDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/smoochum_doll.4bpp"); +const u32 gMapObjectPic_TreeckoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/treecko_doll.4bpp"); +const u32 gMapObjectPic_TorchicDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/torchic_doll.4bpp"); +const u32 gMapObjectPic_MudkipDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/mudkip_doll.4bpp"); +const u32 gMapObjectPic_DuskullDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/duskull_doll.4bpp"); +const u32 gMapObjectPic_WynautDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/wynaut_doll.4bpp"); +const u32 gMapObjectPic_BaltoyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/baltoy_doll.4bpp"); +const u32 gMapObjectPic_KecleonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/kecleon_doll.4bpp"); +const u32 gMapObjectPic_AzurillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/azurill_doll.4bpp"); +const u32 gMapObjectPic_SkittyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/skitty_doll.4bpp"); +const u32 gMapObjectPic_SwabluDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/swablu_doll.4bpp"); +const u32 gMapObjectPic_GulpinDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/gulpin_doll.4bpp"); +const u32 gMapObjectPic_LotadDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/lotad_doll.4bpp"); +const u32 gMapObjectPic_SeedotDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/seedot_doll.4bpp"); +const u32 gMapObjectPic_PikaCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/pika_cushion.4bpp"); +const u32 gMapObjectPic_RoundCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/round_cushion.4bpp"); +const u32 gMapObjectPic_KissCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/kiss_cushion.4bpp"); +const u32 gMapObjectPic_ZigzagCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/zigzag_cushion.4bpp"); +const u32 gMapObjectPic_SpinCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/spin_cushion.4bpp"); +const u32 gMapObjectPic_DiamondCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/diamond_cushion.4bpp"); +const u32 gMapObjectPic_BallCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/ball_cushion.4bpp"); +const u32 gMapObjectPic_GrassCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/grass_cushion.4bpp"); +const u32 gMapObjectPic_FireCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/fire_cushion.4bpp"); +const u32 gMapObjectPic_WaterCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/water_cushion.4bpp"); +const u32 gMapObjectPic_BigSnorlaxDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_snorlax_doll.4bpp"); +const u32 gMapObjectPic_BigRhydonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_rhydon_doll.4bpp"); +const u32 gMapObjectPic_BigLaprasDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_lapras_doll.4bpp"); +const u32 gMapObjectPic_BigVenusaurDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_venusaur_doll.4bpp"); +const u32 gMapObjectPic_BigCharizardDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_charizard_doll.4bpp"); +const u32 gMapObjectPic_BigBlastoiseDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_blastoise_doll.4bpp"); +const u32 gMapObjectPic_BigWailmerDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_wailmer_doll.4bpp"); +const u32 gMapObjectPic_BigRegirockDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regirock_doll.4bpp"); +const u32 gMapObjectPic_BigRegiceDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regice_doll.4bpp"); +const u32 gMapObjectPic_BigRegisteelDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_registeel_doll.4bpp"); +const u32 gMapObjectPic_CuttableTree_0[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/0.4bpp"); +const u32 gMapObjectPic_CuttableTree_1[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/1.4bpp"); +const u32 gMapObjectPic_CuttableTree_2[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/2.4bpp"); +const u32 gMapObjectPic_CuttableTree_3[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/3.4bpp"); +const u32 gMapObjectPic_BreakableRock_0[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/0.4bpp"); +const u32 gMapObjectPic_BreakableRock_1[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/1.4bpp"); +const u32 gMapObjectPic_BreakableRock_2[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/2.4bpp"); +const u32 gMapObjectPic_BreakableRock_3[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/3.4bpp"); +const u32 gMapObjectPic_PushableBoulder[] = INCBIN_U32("graphics/map_objects/pics/misc/pushable_boulder.4bpp"); +const u32 gMapObjectPic_MrBrineysBoat_0[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/0.4bpp"); +const u32 gMapObjectPic_MrBrineysBoat_1[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/1.4bpp"); +const u32 gMapObjectPic_MrBrineysBoat_2[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/2.4bpp"); +const u32 gMapObjectPic_Fossil[] = INCBIN_U32("graphics/map_objects/pics/misc/fossil.4bpp"); +const u32 gMapObjectPic_SubmarineShadow[] = INCBIN_U32("graphics/map_objects/pics/misc/submarine_shadow.4bpp"); +const u16 gMapObjectPalette26[] = INCBIN_U16("graphics/map_objects/palettes/26.gbapal"); +const u32 gMapObjectPic_Truck[] = INCBIN_U32("graphics/map_objects/pics/misc/truck.4bpp"); +const u16 gMapObjectPalette14[] = INCBIN_U16("graphics/map_objects/palettes/14.gbapal"); +const u32 gMapObjectPic_MachokeCarryingBox_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/0.4bpp"); +const u32 gMapObjectPic_MachokeCarryingBox_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/1.4bpp"); +const u32 gMapObjectPic_MachokeCarryingBox_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/2.4bpp"); +const u32 gMapObjectPic_MachokeFacingAway_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/0.4bpp"); +const u32 gMapObjectPic_MachokeFacingAway_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/1.4bpp"); +const u16 gMapObjectPalette15[] = INCBIN_U16("graphics/map_objects/palettes/15.gbapal"); +const u32 gMapObjectPic_BirchsBag[] = INCBIN_U32("graphics/map_objects/pics/misc/birchs_bag.4bpp"); +const u32 gMapObjectPic_Poochyena_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/0.4bpp"); +const u32 gMapObjectPic_Poochyena_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/1.4bpp"); +const u32 gMapObjectPic_Poochyena_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/2.4bpp"); +const u32 gMapObjectPic_Poochyena_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/3.4bpp"); +const u32 gMapObjectPic_Poochyena_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/4.4bpp"); +const u32 gMapObjectPic_Poochyena_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/5.4bpp"); +const u32 gMapObjectPic_Poochyena_6[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/6.4bpp"); +const u32 gMapObjectPic_Poochyena_7[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/7.4bpp"); +const u32 gMapObjectPic_Poochyena_8[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/8.4bpp"); +const u16 gMapObjectPalette16[] = INCBIN_U16("graphics/map_objects/palettes/16.gbapal"); +const u32 gMapObjectPic_CableCar[] = INCBIN_U32("graphics/map_objects/pics/misc/cable_car.4bpp"); +const u16 gMapObjectPalette20[] = INCBIN_U16("graphics/map_objects/palettes/20.gbapal"); +const u32 gMapObjectPic_SSTidal[] = INCBIN_U32("graphics/map_objects/pics/misc/ss_tidal.4bpp"); +const u16 gMapObjectPalette21[] = INCBIN_U16("graphics/map_objects/palettes/21.gbapal"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/0.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/1.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_2[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/2.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_3[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/3.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_4[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/4.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_5[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/5.4bpp"); +const u32 gMapObjectPic_BerryTreeDirtPile[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/dirt_pile.4bpp"); +const u32 gMapObjectPic_BerryTreeSprout_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/0.4bpp"); +const u32 gMapObjectPic_BerryTreeSprout_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/1.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/0.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/1.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/2.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/3.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/4.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/5.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/0.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/1.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/2.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/3.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/4.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/5.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/0.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/1.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/2.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/3.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/4.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/5.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/0.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/1.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/2.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/3.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/4.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/5.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/0.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/1.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/2.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/3.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/4.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/5.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/0.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/1.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/2.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/3.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/4.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/5.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/0.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/1.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/2.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/3.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/4.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/5.4bpp"); +const u32 gMapObjectPic_LumBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/0.4bpp"); +const u32 gMapObjectPic_LumBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/1.4bpp"); +const u32 gMapObjectPic_LumBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/2.4bpp"); +const u32 gMapObjectPic_LumBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/3.4bpp"); +const u32 gMapObjectPic_LumBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/4.4bpp"); +const u32 gMapObjectPic_LumBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/5.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/0.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/1.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/2.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/3.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/4.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/5.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/0.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/1.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/2.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/3.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/4.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/5.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/0.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/1.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/2.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/3.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/4.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/5.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/0.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/1.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/2.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/3.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/4.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/5.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/0.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/1.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/2.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/3.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/4.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/5.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/0.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/1.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/2.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/3.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/4.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/5.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/0.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/1.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/2.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/3.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/4.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/5.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/0.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/1.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/2.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/3.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/4.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/5.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/0.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/1.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/2.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/3.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/4.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/5.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/0.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/1.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/2.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/3.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/4.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/5.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/0.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/1.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/2.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/3.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/4.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/5.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/0.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/1.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/2.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/3.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/4.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/5.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/0.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/1.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/2.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/3.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/4.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/5.4bpp"); +const u32 gMapObjectPic_OranBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/0.4bpp"); +const u32 gMapObjectPic_OranBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/1.4bpp"); +const u32 gMapObjectPic_OranBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/2.4bpp"); +const u32 gMapObjectPic_OranBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/3.4bpp"); +const u32 gMapObjectPic_OranBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/4.4bpp"); +const u32 gMapObjectPic_OranBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/5.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/0.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/1.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/2.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/3.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/4.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/5.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/0.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/1.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/2.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/3.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/4.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/5.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/0.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/1.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/2.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/3.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/4.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/5.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/0.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/1.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/2.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/3.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/4.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/5.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/0.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/1.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/2.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/3.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/4.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/5.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/0.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/1.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/2.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/3.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/4.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/5.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/0.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/1.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/2.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/3.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/4.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/5.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/0.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/1.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/2.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/3.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/4.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/5.4bpp"); +const u32 gFieldEffectPic_SurfBlob_0[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/0.4bpp"); +const u32 gFieldEffectPic_SurfBlob_1[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/1.4bpp"); +const u32 gFieldEffectPic_SurfBlob_2[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/2.4bpp"); +const u32 gMapObjectPic_QuintyPlump_0[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/0.4bpp"); +const u32 gMapObjectPic_QuintyPlump_1[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/1.4bpp"); +const u32 gMapObjectPic_QuintyPlump_2[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/2.4bpp"); +const u32 gMapObjectPic_QuintyPlump_3[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/3.4bpp"); +const u32 gMapObjectPic_QuintyPlump_4[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/4.4bpp"); +const u32 gMapObjectPic_QuintyPlump_5[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/5.4bpp"); +const u32 gMapObjectPic_QuintyPlump_6[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/6.4bpp"); +const u16 gMapObjectPalette12[] = INCBIN_U16("graphics/map_objects/palettes/12.gbapal"); +const u16 gMapObjectPalette13[] = INCBIN_U16("graphics/map_objects/palettes/13.gbapal"); + +const u32 gFieldEffectPic_ShadowSmall[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_small.4bpp"); +const u32 gFieldEffectPic_ShadowMedium[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_medium.4bpp"); +const u32 gFieldEffectPic_ShadowLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_large.4bpp"); +const u32 gFieldEffectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_extra_large.4bpp"); +const u32 filler_8368A08[0x48] = {}; +const u32 gFieldEffectPic_CutGrass[] = INCBIN_U32("graphics/field_effect_objects/pics/cut_grass.4bpp"); +const u32 FieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/field_effect_objects/pics/cut_grass.4bpp"); +const u16 gFieldEffectObjectPalette6[] = INCBIN_U16("graphics/field_effect_objects/palettes/06.gbapal"); +const u32 gFieldEffectPic_Ripple_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/0.4bpp"); +const u32 gFieldEffectPic_Ripple_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/1.4bpp"); +const u32 gFieldEffectPic_Ripple_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/2.4bpp"); +const u32 gFieldEffectPic_Ripple_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/3.4bpp"); +const u32 gFieldEffectPic_Ripple_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/4.4bpp"); +const u32 gFieldEffectPic_Ash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/0.4bpp"); +const u32 gFieldEffectPic_Ash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/1.4bpp"); +const u32 gFieldEffectPic_Ash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/2.4bpp"); +const u32 gFieldEffectPic_Ash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/3.4bpp"); +const u32 gFieldEffectPic_Ash_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/4.4bpp"); +const u32 gFieldEffectPic_Arrow_0[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/0.4bpp"); +const u32 gFieldEffectPic_Arrow_1[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/1.4bpp"); +const u32 gFieldEffectPic_Arrow_2[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/2.4bpp"); +const u32 gFieldEffectPic_Arrow_3[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/3.4bpp"); +const u32 gFieldEffectPic_Arrow_4[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/4.4bpp"); +const u32 gFieldEffectPic_Arrow_5[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/5.4bpp"); +const u32 gFieldEffectPic_Arrow_6[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/6.4bpp"); +const u32 gFieldEffectPic_Arrow_7[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/7.4bpp"); +const u16 gFieldEffectObjectPalette0[] = INCBIN_U16("graphics/field_effect_objects/palettes/00.gbapal"); +const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/field_effect_objects/palettes/01.gbapal"); +const u32 gFieldEffectPic_Dust_0[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/0.4bpp"); +const u32 gFieldEffectPic_Dust_1[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/1.4bpp"); +const u32 gFieldEffectPic_Dust_2[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/2.4bpp"); +const u32 unknown_8369588[] = INCBIN_U32("graphics/field_effect_objects/unknown.bin"); +const u32 gFieldEffectPic_JumpTallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/0.4bpp"); +const u32 gFieldEffectPic_JumpTallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/1.4bpp"); +const u32 gFieldEffectPic_JumpTallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/2.4bpp"); +const u32 gFieldEffectPic_JumpTallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/3.4bpp"); +const u32 UnusedGrass0[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/0.4bpp"); +const u32 UnusedGrass1[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/1.4bpp"); +const u32 UnusedGrass2[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/2.4bpp"); +const u32 UnusedGrass3[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/3.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/0.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/1.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/2.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/3.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/4.4bpp"); +const u32 UnusedGrassLong[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/unused.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_5[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/5.4bpp"); +const u32 gFieldEffectPic_Unknown17_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/0.4bpp"); +const u32 gFieldEffectPic_Unknown17_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/1.4bpp"); +const u32 gFieldEffectPic_Unknown17_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/2.4bpp"); +const u32 gFieldEffectPic_Unknown17_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/3.4bpp"); +const u32 gFieldEffectPic_Unknown17_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/4.4bpp"); +const u32 gFieldEffectPic_Unknown17_5[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/5.4bpp"); +const u32 gFieldEffectPic_Unknown17_6[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/6.4bpp"); +const u32 gFieldEffectPic_Unknown17_7[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/7.4bpp"); +const u32 gFieldEffectPic_Unknown18_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/0.4bpp"); +const u32 gFieldEffectPic_Unknown18_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/1.4bpp"); +const u32 gFieldEffectPic_Unknown18_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/2.4bpp"); +const u32 gFieldEffectPic_Unknown18_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/3.4bpp"); +const u32 gFieldEffectPic_LongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/0.4bpp"); +const u32 gFieldEffectPic_LongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/1.4bpp"); +const u32 gFieldEffectPic_LongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/2.4bpp"); +const u32 gFieldEffectPic_LongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/3.4bpp"); +const u32 gFieldEffectPic_TallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/0.4bpp"); +const u32 gFieldEffectPic_TallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/1.4bpp"); +const u32 gFieldEffectPic_TallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/2.4bpp"); +const u32 gFieldEffectPic_TallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/3.4bpp"); +const u32 gFieldEffectPic_TallGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/4.4bpp"); +const u32 gFieldEffectPic_ShortGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/0.4bpp"); +const u32 gFieldEffectPic_ShortGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/1.4bpp"); +const u32 gFieldEffectPic_SandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/0.4bpp"); +const u32 gFieldEffectPic_SandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/1.4bpp"); +const u32 gFieldEffectPic_DeepSandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/0.4bpp"); +const u32 gFieldEffectPic_DeepSandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/1.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/0.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/1.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/2.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/3.4bpp"); +const u32 gFieldEffectPic_Unknown19_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/0.4bpp"); +const u32 gFieldEffectPic_Unknown19_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/1.4bpp"); +const u32 gFieldEffectPic_Unknown19_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/2.4bpp"); +const u32 gFieldEffectPic_Unknown19_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/3.4bpp"); +const u32 gFieldEffectPic_SandPile_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/0.4bpp"); +const u32 gFieldEffectPic_SandPile_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/1.4bpp"); +const u32 gFieldEffectPic_SandPile_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/2.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/0.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/1.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/2.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/3.4bpp"); +const u32 gFieldEffectPic_Splash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/0.4bpp"); +const u32 gFieldEffectPic_Splash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/1.4bpp"); +const u32 gFieldEffectPic_JumpSmallSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/0.4bpp"); +const u32 gFieldEffectPic_JumpSmallSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/1.4bpp"); +const u32 gFieldEffectPic_JumpSmallSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/2.4bpp"); +const u32 gFieldEffectPic_Unknown20_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/0.4bpp"); +const u32 gFieldEffectPic_Unknown20_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/1.4bpp"); +const u32 gFieldEffectPic_Unknown20_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/2.4bpp"); +const u32 gFieldEffectPic_Unknown20_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/3.4bpp"); +const u32 gFieldEffectPic_Unknown20_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/4.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/0.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/1.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/2.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/3.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/4.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/5.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/6.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/0.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/1.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/2.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/3.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/4.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/5.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/6.4bpp"); +const u32 gFieldEffectPic_SandDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/0.4bpp"); +const u32 gFieldEffectPic_SandDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/1.4bpp"); +const u32 gFieldEffectPic_SandDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/2.4bpp"); +const u32 gFieldEffectPic_SandDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/3.4bpp"); +const u32 gFieldEffectPic_SandDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/4.4bpp"); +const u32 gFieldEffectPic_SandDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/5.4bpp"); +const u32 gFieldEffectPic_SandDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/6.4bpp"); +const u32 gFieldEffectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effect_objects/pics/hot_springs_water.4bpp"); +const u16 gFieldEffectObjectPalette2[] = INCBIN_U16("graphics/field_effect_objects/palettes/02.gbapal"); +const u32 gFieldEffectPic_PopOutOfAsh_0[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/0.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_1[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/1.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_2[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/2.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_3[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/3.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_4[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/4.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_0[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/0.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_1[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/1.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_2[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/2.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_3[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/3.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_4[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/4.4bpp"); +const u32 gFieldEffectPic_Bubbles_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/0.4bpp"); +const u32 gFieldEffectPic_Bubbles_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/1.4bpp"); +const u32 gFieldEffectPic_Bubbles_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/2.4bpp"); +const u32 gFieldEffectPic_Bubbles_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/3.4bpp"); +const u32 gFieldEffectPic_Bubbles_4[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/4.4bpp"); +const u32 gFieldEffectPic_Bubbles_5[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/5.4bpp"); +const u32 gFieldEffectPic_Bubbles_6[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/6.4bpp"); +const u32 gFieldEffectPic_Bubbles_7[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/7.4bpp"); +const u32 gFieldEffectPic_Sparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/0.4bpp"); +const u32 gFieldEffectPic_Sparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/1.4bpp"); +const u16 gFieldEffectObjectPalette3[] = INCBIN_U16("graphics/field_effect_objects/palettes/03.gbapal"); +const u32 gFieldEffectPic_Bird[] = INCBIN_U32("graphics/field_effect_objects/pics/bird.4bpp"); + +void (*const gUnknown_0836DA88[])(struct Sprite *) = +{ + sub_805C884, + sub_805CDE8, + sub_805C8AC, + sub_805CF28, + sub_805CF28, + sub_805D0AC, + sub_805D0AC, + sub_805D230, + sub_805D230, + sub_805D230, + sub_805D230, + sub_80587B4, + FieldObjectCB_BerryTree, + sub_805D4F4, + sub_805D634, + sub_805D774, + sub_805D8B4, + sub_805D9F4, + sub_805DB34, + sub_805DC74, + sub_805DDB4, + sub_805DEF4, + sub_805E034, + sub_805E174, + sub_805E278, + sub_805E37C, + sub_805E37C, + sub_805E37C, + sub_805E37C, + sub_805E5DC, + sub_805E668, + sub_805E6F4, + sub_805E780, + sub_805E80C, + sub_805E898, + sub_805E924, + sub_805E9B0, + sub_805EA3C, + sub_805EAC8, + sub_805EB54, + sub_805EBE0, + sub_805EC6C, + sub_805ECF8, + sub_805ED84, + sub_805EE10, + sub_805EE9C, + sub_805EF28, + sub_805EFB4, + sub_805F040, + sub_805F0CC, + sub_805F158, + sub_805F1E4, + sub_805F270, + sub_805F2FC, + sub_805F2FC, + sub_805F2FC, + sub_805F2FC, + FieldObjectCB_TreeDisguise, + FieldObjectCB_MountainDisguise, + sub_805F8E0, + sub_805F8E0, + sub_805F8E0, + sub_805F8E0, + FieldObjectCB_Hidden1, + sub_805FB20, + sub_805FB20, + sub_805FB20, + sub_805FB20, + sub_805FB90, + sub_805FB90, + sub_805FB90, + sub_805FB90, + sub_805FC00, + sub_805FC00, + sub_805FC00, + sub_805FC00, + sub_805FC70 +}; + +const u8 gUnknown_0836DBBC[] = {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +const u8 gUnknown_0836DC09[] = {DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH}; + +#include "data/field_map_obj/map_object_graphics_info_pointers.h" +#include "data/field_map_obj/field_effect_object_template_pointers.h" +#include "data/field_map_obj/map_object_pic_tables.h" +#include "data/field_map_obj/map_object_anims.h" +#include "data/field_map_obj/base_oam.h" +#include "data/field_map_obj/map_object_subsprites.h" +#include "data/field_map_obj/map_object_graphics_info.h" + +const struct SpritePalette gUnknown_0837377C[] = { + {gMapObjectPalette0, 0x1103}, + {gMapObjectPalette1, 0x1104}, + {gMapObjectPalette2, 0x1105}, + {gMapObjectPalette3, 0x1106}, + {gMapObjectPalette4, 0x1107}, + {gMapObjectPalette5, 0x1108}, + {gMapObjectPalette6, 0x1109}, + {gMapObjectPalette7, 0x110A}, + {gMapObjectPalette8, 0x1100}, + {gMapObjectPalette9, 0x1101}, + {gMapObjectPalette10, 0x1102}, + {gMapObjectPalette11, 0x1115}, + {gMapObjectPalette12, 0x110B}, + {gMapObjectPalette13, 0x110C}, + {gMapObjectPalette14, 0x110D}, + {gMapObjectPalette15, 0x110E}, + {gMapObjectPalette16, 0x110F}, + {gMapObjectPalette17, 0x1110}, + {gMapObjectPalette18, 0x1111}, + {gMapObjectPalette19, 0x1112}, + {gMapObjectPalette20, 0x1113}, + {gMapObjectPalette21, 0x1114}, + {gMapObjectPalette22, 0x1116}, + {gMapObjectPalette23, 0x1117}, + {gMapObjectPalette24, 0x1118}, + {gMapObjectPalette25, 0x1119}, + {gMapObjectPalette26, 0x111A}, + {NULL, 0x0000} +}; + +const u16 Palettes_837385C[] = { + 0x1101, + 0x1101, + 0x1101, + 0x1101 +}; + +const u16 Palettes_8373864[] = { + 0x1111, + 0x1111, + 0x1111, + 0x1111 +}; + +const u16 Palettes_837386C[] = { + 0x1115, + 0x1115, + 0x1115, + 0x1115 +}; + +const struct PairedPalettes gUnknown_08373874[] = { + {0x1100, Palettes_837385C}, + {0x1110, Palettes_837385C}, + {0x1115, Palettes_837386C}, + {0x11FF, NULL} +}; + +const u16 Palettes_8373894[] = { + 0x110C, + 0x110C, + 0x110C, + 0x110C +}; + +const u16 Palettes_837389C[] = { + 0x110D, + 0x110D, + 0x110D, + 0x110D +}; + +const u16 Palettes_83738A4[] = { + 0x110E, + 0x110E, + 0x110E, + 0x110E +}; + +const u16 Palettes_83738AC[] = { + 0x1112, + 0x1112, + 0x1112, + 0x1112 +}; + +const u16 Palettes_83738B4[] = { + 0x1113, + 0x1113, + 0x1113, + 0x1113 +}; + +const u16 Palettes_83738BC[] = { + 0x1114, + 0x1114, + 0x1114, + 0x1114 +}; + +const u16 Palettes_83738C4[] = { + 0x111A, + 0x111A, + 0x111A, + 0x111A +}; + +const u16 Palettes_83738CC[] = { + 0x1117, + 0x1117, + 0x1117, + 0x1117 +}; + +const u16 Palettes_83738D4[] = { + 0x1119, + 0x1119, + 0x1119, + 0x1119 +}; + +const u16 Palettes_83738DC[] = { + 0x1109, + 0x1109, + 0x1109, + 0x1109 +}; + +const struct PairedPalettes gUnknown_083738E4[] = { + {0x1100, Palettes_837385C}, + {0x1110, Palettes_837385C}, + {0x110B, Palettes_8373894}, + {0x110D, Palettes_837389C}, + {0x110E, Palettes_83738A4}, + {0x1112, Palettes_83738AC}, + {0x1113, Palettes_83738B4}, + {0x1114, Palettes_83738BC}, + {0x1116, Palettes_83738CC}, + {0x1118, Palettes_83738D4}, + {0x1105, Palettes_83738DC}, + {0x111A, Palettes_83738C4}, + {0x11FF, NULL} +}; + +const u16 Unknown_837394C[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 Unknown_8373960[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 Unknown_8373974[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 Unknown_8373988[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 *const gUnknown_0837399C[] = { + Unknown_837394C, + Unknown_8373960, + Unknown_8373974, + Unknown_8373988 +}; + +#include "data/field_map_obj/berry_tree_graphics_tables.h" +#include "data/field_map_obj/field_effect_objects.h" + +const s16 gUnknown_0837520C[] = {0x20, 0x40, 0x60, 0x80}; +const s16 gUnknown_08375204[] = {0x20, 0x40, 0x80, 0xc0}; +const s16 gUnknown_0837521C[] = {0x20, 0x30, 0x40, 0x50}; + +#include "data/field_map_obj/callback_subroutine_pointers.h" + +const u8 gUnknown_083755F4[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; +const u8 gUnknown_083755FD[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; +const u8 gUnknown_08375606[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; +const u8 gUnknown_0837560F[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F, 0x0C, 0x0C, 0x0D, 0x0D}; +const u8 gUnknown_08375618[] = {0x10, 0x10, 0x11, 0x12, 0x13, 0x10, 0x10, 0x11, 0x11}; +const u8 gUnknown_08375621[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; +const u8 gUnknown_0837562A[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; +const u8 gUnknown_08375633[] = {0x18, 0x18, 0x19, 0x1A, 0x1B, 0x18, 0x18, 0x19, 0x19}; +const u8 gUnknown_0837563C[] = {0x1C, 0x1C, 0x1D, 0x1E, 0x1F, 0x1C, 0x1C, 0x1D, 0x1D}; +const u8 gUnknown_08375645[] = {0x20, 0x20, 0x21, 0x22, 0x23, 0x20, 0x20, 0x21, 0x21}; +const u8 gUnknown_0837564E[] = {0x24, 0x24, 0x25, 0x26, 0x27, 0x24, 0x24, 0x25, 0x25}; +const u8 gUnknown_08375657[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; +const u8 gUnknown_08375660[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; +const u8 gUnknown_08375669[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; +const u8 gUnknown_08375672[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; +const u8 gUnknown_0837567B[] = {0x08, 0x08, 0x07, 0x09, 0x0A, 0x08, 0x08, 0x07, 0x07}; + +bool8 (*const gUnknown_08375684[])(u8) = { + MetatileBehavior_IsSouthBlocked, + MetatileBehavior_IsNorthBlocked, + MetatileBehavior_IsWestBlocked, + MetatileBehavior_IsEastBlocked +}; + +bool8 (*const gUnknown_08375694[])(u8) = { + MetatileBehavior_IsNorthBlocked, + MetatileBehavior_IsSouthBlocked, + MetatileBehavior_IsEastBlocked, + MetatileBehavior_IsWestBlocked +}; + +const struct Coords16 gDirectionToVector[] = { + { 0, 0}, + { 0, 1}, + { 0, -1}, + {-1, 0}, + { 1, 0}, + {-1, 1}, + { 1, 1}, + {-1, -1}, + { 1, -1} +}; + +const u8 gUnknown_083756C8[] = {0x00, 0x00, 0x01, 0x02, 0x03}; +const u8 gUnknown_083756CD[] = {0x04, 0x04, 0x05, 0x06, 0x07}; +const u8 gUnknown_083756D2[] = {0x08, 0x08, 0x09, 0x0A, 0x0B}; +const u8 gUnknown_083756D7[] = {0x15, 0x15, 0x16, 0x17, 0x18}; +const u8 gUnknown_083756DC[] = {0x29, 0x29, 0x2A, 0x2B, 0x2C}; +const u8 gUnknown_083756E1[] = {0x2D, 0x2D, 0x2E, 0x2F, 0x30}; +const u8 gUnknown_083756E6[] = {0x31, 0x31, 0x32, 0x33, 0x34}; +const u8 gUnknown_083756EB[] = {0x35, 0x35, 0x36, 0x37, 0x38}; +const u8 gUnknown_083756F0[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F}; +const u8 gUnknown_083756F5[] = {0x46, 0x46, 0x47, 0x48, 0x49}; +const u8 gUnknown_083756FA[] = {0x4B, 0x4B, 0x4A, 0x4D, 0x4C}; +const u8 gUnknown_083756FF[] = {0x42, 0x42, 0x43, 0x44, 0x45}; +const u8 gUnknown_08375704[] = {0x3A, 0x3A, 0x3B, 0x3C, 0x3D}; +const u8 gUnknown_08375709[] = {0x19, 0x19, 0x1A, 0x1B, 0x1C}; +const u8 gUnknown_0837570E[] = {0x1D, 0x1D, 0x1E, 0x1F, 0x20}; +const u8 gUnknown_08375713[] = {0x21, 0x21, 0x22, 0x23, 0x24}; +const u8 gUnknown_08375718[] = {0x25, 0x25, 0x26, 0x27, 0x28}; +const u8 gUnknown_0837571D[] = {0x62, 0x62, 0x63, 0x64, 0x65}; +const u8 gUnknown_08375722[] = {0x66, 0x66, 0x67, 0x68, 0x69}; +const u8 gUnknown_08375727[] = {0x6A, 0x6A, 0x6B, 0x6C, 0x6D}; +const u8 gUnknown_0837572C[] = {0x6E, 0x6E, 0x6F, 0x70, 0x71}; +const u8 gUnknown_08375731[] = {0x72, 0x72, 0x73, 0x74, 0x75}; +const u8 gUnknown_08375736[] = {0x76, 0x76, 0x77, 0x78, 0x79}; +const u8 gUnknown_0837573B[] = {0x7A, 0x7A, 0x7B, 0x7C, 0x7D}; +const u8 gUnknown_08375740[] = {0x7E, 0x7E, 0x7F, 0x80, 0x81}; +const u8 gUnknown_08375745[] = {0x82, 0x82, 0x83, 0x84, 0x85}; +const u8 gUnknown_0837574A[] = {0x86, 0x86, 0x87, 0x88, 0x89}; + +const u8 gUnknown_0837574F[] = {2, 1, 4, 3, 8, 7, 6, 5}; + +const u8 gUnknown_08375757[][4] = { + {2, 1, 4, 3}, + {1, 2, 3, 4}, + {3, 4, 2, 1}, + {4, 3, 1, 2} +}; + +const u8 gUnknown_08375767[][4] = { + {2, 1, 4, 3}, + {1, 2, 3, 4}, + {4, 3, 1, 2}, + {3, 4, 2, 1} +}; + +#include "data/field_map_obj/anim_func_ptrs.h" + +// text + +extern void strange_npc_table_clear(void); +extern void ClearPlayerAvatarInfo(void); +extern void npc_load_two_palettes__no_record(u16, u8); +extern void npc_load_two_palettes__and_record(u16, u8); +extern void sub_8060388(s16, s16, s16 *, s16 *); +void sub_80634D0(struct MapObject *, struct Sprite *); +extern void pal_patch_for_npc(u16, u16); +extern void CameraObjectReset1(void); + +extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; +extern u8 gReservedSpritePaletteCount; +extern struct Camera gUnknown_0202E844; + +static u8 gUnknown_030005A4; +static u16 gUnknown_030005A6; + +struct MapObject gMapObjects[16]; + +void npc_clear_ids_and_state(struct MapObject *mapObj) +{ + memset(mapObj, 0, sizeof(struct MapObject)); + mapObj->localId = 0xFF; + mapObj->mapNum = 0xFF; + mapObj->mapGroup = 0xFF; + mapObj->mapobj_unk_1C = 0xFF; +} + +void npcs_clear_ids_and_state(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + npc_clear_ids_and_state(&gMapObjects[i]); +} + +void sub_805AA98(void) +{ + strange_npc_table_clear(); + npcs_clear_ids_and_state(); + ClearPlayerAvatarInfo(); + sub_805AAB0(); +} + +void sub_805AAB0(void) +{ + u8 spriteId; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); + + gSprites[spriteId].oam.affineMode = 1; + InitSpriteAffineAnim(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], 0); + gSprites[spriteId].invisible = 1; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); + + gSprites[spriteId].oam.affineMode = 1; + InitSpriteAffineAnim(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], 1); + gSprites[spriteId].invisible = 1; +} + +u8 sub_805AB54(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (!gMapObjects[i].active) + break; + } + return i; +} + +u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + if (localId <= 0xFE) + return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup); + else + return GetFieldObjectIdByLocalId(localId); +} + +bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 *mapObjectId) +{ + *mapObjectId = GetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup); + if (*mapObjectId == 16) + return TRUE; + else + return FALSE; +} + +u8 GetFieldObjectIdByXY(s16 x, s16 y) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) + break; + } + return i; +} + +u8 GetFieldObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup) + return i; + } + return 16; +} + +u8 GetFieldObjectIdByLocalId(u8 localId) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].localId == localId) + return i; + } + return 16; +} + +#ifdef NONMATCHING +u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) +{ + struct MapObject2 *mapObj; //TODO: resolve the mapobj_unk_19b weirdness + u8 var; + u16 r3; + u16 r2; + + //asm("nop"::"r"(b)); + if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0) + return 16; + //_0805ACCE + mapObj = (struct MapObject2 *)&gMapObjects[var]; + npc_clear_ids_and_state((struct MapObject *)mapObj); + r3 = template->x + 7; + r2 = template->y + 7; + mapObj->active = TRUE; + mapObj->mapobj_bit_2 = TRUE; + mapObj->graphicsId = template->graphicsId; + mapObj->animPattern = template->movementType; + mapObj->localId = template->localId; + mapObj->mapNum = b; + mapObj->mapGroup = c; + mapObj->coords1.x = r3; + mapObj->coords1.y = r2; + mapObj->coords2.x = r3; + mapObj->coords2.y = r2; + mapObj->coords3.x = r3; + mapObj->coords3.y = r2; + mapObj->mapobj_unk_0B_0 = template->elevation; + mapObj->elevation = template->elevation; + mapObj->mapobj_unk_19 = template->unkA_0; + mapObj->mapobj_unk_19b = template->unkA_4; + mapObj->trainerType = template->unkC; + mapObj->trainerRange_berryTreeId = template->unkE; + mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType]; + FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20); + FieldObjectHandleDynamicGraphicsId(mapObj); + //asm("":::"r5","r6"); + if (gUnknown_0836DBBC[mapObj->animPattern] != 0) + { + if (mapObj->mapobj_unk_19 == 0) + mapObj->mapobj_unk_19++; + if (mapObj->mapobj_unk_19b == 0) + mapObj->mapobj_unk_19b++; + } + return var; +} +#else +__attribute__((naked)) +u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + sub sp, 0x4\n\ + adds r5, r0, 0\n\ + lsls r1, 24\n\ + lsrs r6, r1, 24\n\ + lsls r2, 24\n\ + lsrs r7, r2, 24\n\ + ldrb r0, [r5]\n\ + adds r1, r6, 0\n\ + adds r2, r7, 0\n\ + mov r3, sp\n\ + bl GetAvailableFieldObjectSlot\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0805ACCE\n\ + movs r0, 0x10\n\ + b _0805ADC2\n\ +_0805ACCE:\n\ + mov r0, sp\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 3\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0805ADD0 @ =gMapObjects\n\ + adds r4, r0, r1\n\ + adds r0, r4, 0\n\ + bl npc_clear_ids_and_state\n\ + ldrh r3, [r5, 0x4]\n\ + adds r3, 0x7\n\ + lsls r3, 16\n\ + lsrs r3, 16\n\ + ldrh r2, [r5, 0x6]\n\ + adds r2, 0x7\n\ + lsls r2, 16\n\ + lsrs r2, 16\n\ + ldrb r0, [r4]\n\ + movs r1, 0x1\n\ + orrs r0, r1\n\ + movs r1, 0x4\n\ + orrs 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\ + movs r7, 0xF\n\ + adds r1, r7, 0\n\ + ands r1, r0\n\ + ldrb r2, [r4, 0xB]\n\ + movs r0, 0x10\n\ + negs r0, r0\n\ + mov r8, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r4, 0xB]\n\ + ldrb r1, [r5, 0x8]\n\ + lsls r1, 4\n\ + ands r0, r7\n\ + orrs r0, r1\n\ + strb r0, [r4, 0xB]\n\ + ldrb r1, [r5, 0xA]\n\ + lsls r1, 28\n\ + movs r0, 0xF\n\ + mov r9, r0\n\ + lsrs r1, 28\n\ + ldrb r2, [r4, 0x19]\n\ + mov r0, r8\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x19]\n\ + ldrb r1, [r5, 0xA]\n\ + lsrs r1, 4\n\ + lsls r1, 4\n\ + ands r0, r7\n\ + orrs 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, _0805ADD4 @ =gUnknown_0836DC09\n\ + ldrb r0, [r5, 0x9]\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + adds r0, r4, 0\n\ + adds r0, 0x20\n\ + strb r1, [r0]\n\ + ldrb r1, [r0]\n\ + adds r0, r4, 0\n\ + bl FieldObjectSetDirection\n\ + adds r0, r4, 0\n\ + bl FieldObjectHandleDynamicGraphicsId\n\ + ldr r1, _0805ADD8 @ =gUnknown_0836DBBC\n\ + ldrb r0, [r4, 0x6]\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _0805ADBE\n\ + ldrb r2, [r4, 0x19]\n\ + adds r0, r7, 0\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _0805ADA6\n\ + lsls r0, r2, 28\n\ + lsrs r0, 28\n\ + adds r0, 0x1\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r8\n\ + ands r1, r2\n\ + orrs r1, r0\n\ + strb r1, [r4, 0x19]\n\ +_0805ADA6:\n\ + ldrb r2, [r4, 0x19]\n\ + movs r0, 0xF0\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _0805ADBE\n\ + lsrs r1, r2, 4\n\ + adds r1, 0x1\n\ + lsls r1, 4\n\ + adds r0, r7, 0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x19]\n\ +_0805ADBE:\n\ + mov r0, sp\n\ + ldrb r0, [r0]\n\ +_0805ADC2:\n\ + add sp, 0x4\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_0805ADD0: .4byte gMapObjects\n\ +_0805ADD4: .4byte gUnknown_0836DC09\n\ +_0805ADD8: .4byte gUnknown_0836DBBC\n\ + .syntax divided\n"); +} +#endif + +u8 sub_805ADDC(u8 localId) +{ + u8 objectCount; + u8 i; + + if (gMapHeader.events == NULL) + return 16; + objectCount = gMapHeader.events->mapObjectCount; + for (i = 0; i < objectCount; i++) + { + struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; + + if (template->localId == localId && !FlagGet(template->flagId)) + return InitFieldObjectStateFromTemplate(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + } + return 16; +} + +u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d) +{ + u8 i = 0; + + for (i = 0; i < 16 && gMapObjects[i].active; i++) + { + if (gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) + return 1; + } + if (i >= 16) + return 1; + *d = i; + for (; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) + return 1; + } + return 0; +} + +void RemoveFieldObject(struct MapObject *mapObject) +{ + mapObject->active = FALSE; + RemoveFieldObjectInternal(mapObject); +} + +void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + return; + FlagSet(GetFieldObjectFlagIdByFieldObjectId(mapObjectId)); + RemoveFieldObject(&gMapObjects[mapObjectId]); +} + +void RemoveFieldObjectInternal(struct MapObject *mapObject) +{ + struct SpriteFrameImage image; + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + + image.size = gfxInfo->size; + gSprites[mapObject->spriteId].images = ℑ + DestroySprite(&gSprites[mapObject->spriteId]); +} + +void npc_hide_all_but_player(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (i != gPlayerAvatar.mapObjectId) + RemoveFieldObject(&gMapObjects[i]); + } +} + +u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) +{ + u8 mapObjectId; + u8 spriteId; + const struct MapObjectGraphicsInfo *gfxInfo; + struct MapObject *mapObject; + struct Sprite *sprite; + + mapObjectId = InitFieldObjectStateFromTemplate(mapObjTemplate, c, d); + if (mapObjectId == 16) + return 16; + + mapObject = &gMapObjects[mapObjectId]; + gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (gfxInfo->paletteSlot == 0) + npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + else if (gfxInfo->paletteSlot == 10) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (mapObject->animPattern == 0x4C) + mapObject->mapobj_bit_13 = TRUE; + +#ifdef NONMATCHING + sprTemplate->paletteTag = 0xFFFF; +#else + *(u16 *)&sprTemplate->paletteTag = 0xFFFF; +#endif + spriteId = CreateSprite(sprTemplate, 0, 0, 0); + if (spriteId == 64) + { + gMapObjects[mapObjectId].active = FALSE; + return 16; + } + sprite = &gSprites[spriteId]; + sub_8060388(e + mapObject->coords2.x, f + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data0 = mapObjectId; + mapObject->spriteId = spriteId; + mapObject->mapobj_bit_12 = gfxInfo->inanimate; + if (!mapObject->mapobj_bit_12) + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); + SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); + sub_80634D0(mapObject, sprite); + return mapObjectId; +} + +u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e) +{ + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables = NULL; + struct SpriteFrameImage spriteFrameImage; + const struct MapObjectGraphicsInfo *gfxInfo; + u8 mapObjectId; + + gfxInfo = GetFieldObjectGraphicsInfo(mapObjTemplate->graphicsId); + MakeObjectTemplateFromFieldObjectTemplate(mapObjTemplate, &spriteTemplate, &subspriteTables); + spriteFrameImage.size = gfxInfo->size; + spriteTemplate.images = &spriteFrameImage; + mapObjectId = sub_805AFCC(mapObjTemplate, &spriteTemplate, b, c, d, e); + if (mapObjectId == 16) + return 16; + gSprites[gMapObjects[mapObjectId].spriteId].images = gfxInfo->images; + if (subspriteTables != NULL) + SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTables); + return mapObjectId; +} + +u8 SpawnSpecialFieldObject(struct MapObjectTemplate *mapObjTemplate) +{ + s16 x; + s16 y; + + GetFieldObjectMovingCameraOffset(&x, &y); + return SpawnFieldObject(mapObjTemplate, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); +} + +u8 SpawnSpecialFieldObjectParametrized(u8 a, u8 b, u8 c, s16 d, s16 e, u8 f) +{ + struct MapObjectTemplate mapObjTemplate; + + d -= 7; + e -= 7; + mapObjTemplate.localId = c; + mapObjTemplate.graphicsId = a; + mapObjTemplate.unk2 = 0; + mapObjTemplate.x = d; + mapObjTemplate.y = e; + mapObjTemplate.elevation = f; + mapObjTemplate.movementType = b; + mapObjTemplate.unkA_0 = 0; + mapObjTemplate.unkA_4 = 0; + mapObjTemplate.unkC = 0; + mapObjTemplate.unkE = 0; + return SpawnSpecialFieldObject(&mapObjTemplate); +} + +u8 show_sprite(u8 a, u8 b, u8 c) +{ + struct MapObjectTemplate *r5; + s16 x; + s16 y; + + r5 = GetFieldObjectTemplateByLocalIdAndMap(a, b, c); + if (r5 == NULL) + return 16; + GetFieldObjectMovingCameraOffset(&x, &y); + return SpawnFieldObject(r5, b, c, x, y); +} + +void MakeObjectTemplateFromFieldObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + + sprTemplate->tileTag = gfxInfo->tileTag; + sprTemplate->paletteTag = gfxInfo->paletteTag1; + sprTemplate->oam = gfxInfo->oam; + sprTemplate->anims = gfxInfo->anims; + sprTemplate->images = gfxInfo->images; + sprTemplate->affineAnims = gfxInfo->affineAnims; + sprTemplate->callback = callback; + *subspriteTables = gfxInfo->subspriteTables; +} + +void MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, gUnknown_0836DA88[callbackIndex], sprTemplate, subspriteTables); +} + +void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables); +} + +u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c, s16 d, u8 subpriority) +{ + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables; + u8 spriteId; + + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables); + if (spriteTemplate.paletteTag != 0xFFFF) + sub_805BDF8(spriteTemplate.paletteTag); + spriteId = CreateSprite(&spriteTemplate, c, d, subpriority); + if (spriteId != 64 && subspriteTables != NULL) + { + SetSubspriteTables(&gSprites[spriteId], subspriteTables); + gSprites[spriteId].subspriteMode = 2; + } + return spriteId; +} + +extern void sub_8064970(struct Sprite *); +extern void sub_8060470(s16 *, s16 *, s16, s16); +extern void InitObjectPriorityByZCoord(); + +u8 sub_805B410(u8 a, u8 b, s16 c, s16 d, u8 e, u8 f) +{ + const struct MapObjectGraphicsInfo *gfxInfo; + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables; + u8 spriteId; + + gfxInfo = GetFieldObjectGraphicsInfo(a); + MakeObjectTemplateFromFieldObjectGraphicsInfo(a, sub_8064970, &spriteTemplate, &subspriteTables); +#ifdef NONMATCHING + spriteTemplate.paletteTag = 0xFFFF; +#else + *(u16 *)&spriteTemplate.paletteTag = 0xFFFF; +#endif + c += 7; + d += 7; + sub_8060470(&c, &d, 8, 16); + spriteId = CreateSpriteAtEnd(&spriteTemplate, c, d, 0); + if (spriteId != 64) + { + struct Sprite *sprite = &gSprites[spriteId]; + + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.y += sprite->centerToCornerVecY; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data0 = b; + sprite->data1 = e; + if (gfxInfo->paletteSlot == 10) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (subspriteTables != NULL) + { + SetSubspriteTables(sprite, subspriteTables); + sprite->subspriteMode = 2; + } + InitObjectPriorityByZCoord(sprite, e); + SetObjectSubpriorityByZCoord(e, sprite, 1); + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(f)); + } + return spriteId; +} + +void sub_805B55C(s16 a, s16 b) +{ + u8 i; + + if (gMapHeader.events != NULL) + { + s16 r9 = gSaveBlock1.pos.x - 2; + s16 sp8 = gSaveBlock1.pos.x + 17; + s16 r10 = gSaveBlock1.pos.y; + s16 spC = gSaveBlock1.pos.y + 16; + u8 objectCount = gMapHeader.events->mapObjectCount; + + for (i = 0; i < objectCount; i++) + { + struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; + s16 foo = template->x + 7; + s16 bar = template->y + 7; + + if (r10 <= bar && spC >= bar && r9 <= foo && sp8 >= foo + && !FlagGet(template->flagId)) + SpawnFieldObject(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, a, b); + } + } +} + +void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject); + +void RemoveFieldObjectsOutsideView(void) +{ + u8 i; + u8 j; + + for (i = 0; i < 16; i++) + { + bool8 isActiveLinkPlayer; + + for (j = 0, isActiveLinkPlayer = 0; j < 4; j++) + { + if (gLinkPlayerMapObjects[j].active && i == gLinkPlayerMapObjects[j].mapObjId) + isActiveLinkPlayer = TRUE; + } + if (!isActiveLinkPlayer) + { + struct MapObject *mapObject = &gMapObjects[i]; + + if (mapObject->active && !mapObject->mapobj_bit_16) + RemoveFieldObjectIfOutsideView(mapObject); + } + } +} + +void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) +{ + s16 r7 = gSaveBlock1.pos.x - 2; + s16 r5 = gSaveBlock1.pos.x + 17; + s16 r4 = gSaveBlock1.pos.y; + s16 r6 = gSaveBlock1.pos.y + 16; + + if (mapObject->coords2.x >= r7 && mapObject->coords2.x <= r5 + && mapObject->coords2.y >= r4 && mapObject->coords2.y <= r6) + return; + if (mapObject->coords1.x >= r7 && mapObject->coords1.x <= r5 + && mapObject->coords1.y >= r4 && mapObject->coords1.y <= r6) + return; + RemoveFieldObject(mapObject); +} + +void sub_805B75C(u8, s16, s16); + +void sub_805B710(u16 a, u16 b) +{ + u8 i; + + ClearPlayerAvatarInfo(); + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active) + sub_805B75C(i, a, b); + } + sub_805AAB0(); +} + +extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); +extern void sub_805B914(struct MapObject *); + +void sub_805B75C(u8 a, s16 b, s16 c) +{ + struct SpriteTemplate sp0; + struct SpriteFrameImage sp18; + const struct SubspriteTable *subspriteTables; + const struct MapObjectGraphicsInfo *gfxInfo; + struct MapObject *mapObject; + u8 spriteId; + + #define i spriteId + for (i = 0; i < 4; i++) + { + if (gLinkPlayerMapObjects[i].active && a == gLinkPlayerMapObjects[i].mapObjId) + return; + } + #undef i + + mapObject = &gMapObjects[a]; + asm("":::"r5"); + subspriteTables = NULL; + gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sp18.size = gfxInfo->size; + MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObject->graphicsId, mapObject->animPattern, &sp0, &subspriteTables); + sp0.images = &sp18; + *(u16 *)&sp0.paletteTag = 0xFFFF; + if (gfxInfo->paletteSlot == 0) + npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (gfxInfo->paletteSlot > 9) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + *(u16 *)&sp0.paletteTag = 0xFFFF; + spriteId = CreateSprite(&sp0, 0, 0, 0); + if (spriteId != 64) + { + struct Sprite *sprite = &gSprites[spriteId]; + + sub_8060388(b + mapObject->coords2.x, c + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + sprite->images = gfxInfo->images; + if (mapObject->animPattern == 11) + { + SetPlayerAvatarFieldObjectIdAndObjectId(a, spriteId); + mapObject->mapobj_unk_1B = sub_8126B54(); + } + if (subspriteTables != NULL) + SetSubspriteTables(sprite, subspriteTables); + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data0 = a; + mapObject->spriteId = spriteId; + if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 11) + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); + sub_805B914(mapObject); + SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); + } +} + +void sub_805B914(struct MapObject *mapObject) +{ + mapObject->mapobj_bit_1 = FALSE; + mapObject->mapobj_bit_2 = TRUE; + mapObject->mapobj_bit_22 = FALSE; + mapObject->mapobj_bit_17 = FALSE; + mapObject->mapobj_bit_18 = FALSE; + mapObject->mapobj_bit_19 = FALSE; + mapObject->mapobj_bit_20 = FALSE; + mapObject->mapobj_bit_21 = FALSE; + FieldObjectClearAnim(mapObject); +} + +void SetPlayerAvatarFieldObjectIdAndObjectId(u8 mapObjectId, u8 spriteId) +{ + gPlayerAvatar.mapObjectId = mapObjectId; + gPlayerAvatar.spriteId = spriteId; + gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gMapObjects[mapObjectId].graphicsId); + SetPlayerAvatarExtraStateTransition(gMapObjects[mapObjectId].graphicsId, 0x20); +} + +void sub_805B980(struct MapObject *mapObject, u8 graphicsId) +{ + const struct MapObjectGraphicsInfo *gfxInfo; + struct Sprite *sprite; + + gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + sprite = &gSprites[mapObject->spriteId]; + if (gfxInfo->paletteSlot == 0) + pal_patch_for_npc(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (gfxInfo->paletteSlot == 10) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + sprite->oam.shape = gfxInfo->oam->shape; + sprite->oam.size = gfxInfo->oam->size; + sprite->images = gfxInfo->images; + sprite->anims = gfxInfo->anims; + sprite->subspriteTables = gfxInfo->subspriteTables; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + mapObject->mapobj_bit_12 = gfxInfo->inanimate; + mapObject->graphicsId = graphicsId; + sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + if (mapObject->mapobj_bit_15) + CameraObjectReset1(); +} + +void unref_sub_805BA80(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + sub_805B980(&gMapObjects[mapObjectId], graphicsId); +} + +void FieldObjectTurn(struct MapObject *mapObject, u8 direction) +{ + FieldObjectSetDirection(mapObject, direction); + if (!mapObject->mapobj_bit_12) + { + StartSpriteAnim(&gSprites[mapObject->spriteId], FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); + SeekSpriteAnim(&gSprites[mapObject->spriteId], 0); + } +} + +void FieldObjectTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + FieldObjectTurn(&gMapObjects[mapObjectId], direction); +} + +void unref_TurnPlayer(struct PlayerAvatar *player, u8 direction) +{ + FieldObjectTurn(&gMapObjects[player->mapObjectId], direction); +} + +void get_berry_tree_graphics(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 treeStage; + u8 treeId; + + mapObject->mapobj_bit_13 = TRUE; + sprite->invisible = TRUE; + treeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); + if (treeStage != 0) + { + mapObject->mapobj_bit_13 = FALSE; + sprite->invisible = FALSE; + treeId = GetBerryTypeByBerryTreeId(mapObject->trainerRange_berryTreeId) - 1; + treeStage--; + if (treeId > 0x2B) + treeId = 0; + sub_805B980(mapObject, gBerryTreeGraphicsIdTablePointers[treeId][treeStage]); + sprite->images = gBerryTreePicTablePointers[treeId]; + sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[treeId][treeStage]; + StartSpriteAnim(sprite, treeStage); + } +} + +const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8 graphicsId) +{ + if (graphicsId > 0xEF) + graphicsId = VarGetFieldObjectGraphicsId(graphicsId + 16); + if (graphicsId > 0xD9) + graphicsId = 5; + return gMapObjectGraphicsInfoPointers[graphicsId]; +} + +void FieldObjectHandleDynamicGraphicsId(struct MapObject *mapObject) +{ + if (mapObject->graphicsId > 0xEF) + mapObject->graphicsId = VarGetFieldObjectGraphicsId(mapObject->graphicsId + 16); +} + +void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 d) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + gMapObjects[mapObjectId].mapobj_bit_13 = d; +} + +void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, u8 *localId, u8 *mapNum, u8 *mapGroup) +{ + *localId = mapObject->localId; + *mapNum = mapObject->mapNum; + *mapGroup = mapObject->mapGroup; +} + +void sub_805BCC0(s16 x, s16 y) +{ + u8 mapObjectId; + struct MapObject *mapObject; + + mapObjectId = GetFieldObjectIdByXY(x, y); + if (mapObjectId != 16) + { + mapObject = &gMapObjects[mapObjectId]; + mapObject->mapobj_bit_2 = TRUE; + } +} + +void sub_805BCF0(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) +{ + u8 mapObjectId; + struct MapObject *mapObject; + struct Sprite *sprite; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + mapObject = &gMapObjects[mapObjectId]; + sprite = &gSprites[mapObject->spriteId]; + mapObject->mapobj_bit_26 = TRUE; + sprite->subpriority = subpriority; + } +} + +void sub_805BD48(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + struct MapObject *mapObject; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + mapObject = &gMapObjects[mapObjectId]; + mapObject->mapobj_bit_26 = FALSE; + mapObject->mapobj_bit_2 = TRUE; + } +} + +void sub_805BD90(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + u8 mapObjectId; + struct Sprite *sprite; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + sprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + sprite->pos2.x = x; + sprite->pos2.y = y; + } +} + +void gpu_pal_allocator_reset__manage_upper_four(void) +{ + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 12; +} + +void sub_805BDF8(u16 tag) +{ + u16 paletteIndex = FindFieldObjectPaletteIndexByTag(tag); + + if (paletteIndex != 0x11FF) //always happens. FindFieldObjectPaletteIndexByTag returns u8 + sub_805BE58(&gUnknown_0837377C[paletteIndex]); +} + +void unref_sub_805BE24(u16 *arr) +{ + u8 i; + + for (i = 0; arr[i] != 0x11FF; i++) + sub_805BDF8(arr[i]); +} + +u8 sub_805BE58(const struct SpritePalette *palette) +{ + if (IndexOfSpritePaletteTag(palette->tag) != 0xFF) + return 0xFF; + else + return LoadSpritePalette(palette); +} + +void pal_patch_for_npc(u16 a, u16 b) +{ + u8 var = b; + u8 paletteIndex = FindFieldObjectPaletteIndexByTag(a); + + LoadPalette(gUnknown_0837377C[paletteIndex].data, var * 16 + 0x100, 0x20); +} + +void pal_patch_for_npc_range(const u16 *arr, u8 b, u8 c) +{ + for (; b < c; arr++, b++) + pal_patch_for_npc(*arr, b); +} + +u8 FindFieldObjectPaletteIndexByTag(u16 tag) +{ + u8 i; + + for (i = 0; gUnknown_0837377C[i].tag != 0x11FF; i++) + { + if (gUnknown_0837377C[i].tag == tag) + return i; + } + return 0xFF; +} + +void npc_load_two_palettes__no_record(u16 a, u8 b) +{ + u8 i; + + pal_patch_for_npc(a, b); + for (i = 0; gUnknown_08373874[i].tag != 0x11FF; i++) + { + if (gUnknown_08373874[i].tag == a) + { + pal_patch_for_npc(gUnknown_08373874[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); + break; + } + } +} + +void npc_load_two_palettes__and_record(u16 a, u8 b) +{ + u8 i; + + gUnknown_030005A6 = a; + pal_patch_for_npc(a, b); + for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) + { + if (gUnknown_083738E4[i].tag == a) + { + pal_patch_for_npc(gUnknown_083738E4[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); + break; + } + } +} + +void unref_sub_805C014(struct MapObject *mapObject, s16 x, s16 y) +{ + mapObject->coords3.x = mapObject->coords2.x; + mapObject->coords3.y = mapObject->coords2.y; + mapObject->coords2.x += x; + mapObject->coords2.y += y; +} + +void npc_coords_shift(struct MapObject *mapObject, s16 x, s16 y) +{ + mapObject->coords3.x = mapObject->coords2.x; + mapObject->coords3.y = mapObject->coords2.y; + mapObject->coords2.x = x; + mapObject->coords2.y = y; +} + +void npc_coords_set(struct MapObject *mapObject, s16 x, s16 y) +{ + mapObject->coords3.x = x; + mapObject->coords3.y = y; + mapObject->coords2.x = x; + mapObject->coords2.y = y; +} + +void sub_805C058(struct MapObject *mapObject, s16 x, s16 y) +{ + struct Sprite *sprite = &gSprites[mapObject->spriteId]; + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + + npc_coords_set(mapObject, x, y); + sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + sub_805B914(mapObject); + if (mapObject->mapobj_bit_15) + CameraObjectReset1(); +} + +void sub_805C0F8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + x += 7; + y += 7; + sub_805C058(&gMapObjects[mapObjectId], x, y); + } +} + +void npc_coords_shift_still(struct MapObject *mapObject) +{ + npc_coords_shift(mapObject, mapObject->coords2.x, mapObject->coords2.y); +} + +void UpdateFieldObjectCoordsForCameraUpdate(void) +{ + u8 i; + s16 deltaX; + s16 deltaY; + +#ifndef NONMATCHING + asm(""::"r"(i)); //makes the compiler store i in r3 +#endif + + if (gUnknown_0202E844.field_0) + { + for (i = 0, deltaX = gUnknown_0202E844.x, deltaY = gUnknown_0202E844.y; i < 16; i++) + { + struct MapObject *mapObject = &gMapObjects[i]; + + if (mapObject->active) + { + mapObject->coords1.x -= deltaX; + mapObject->coords1.y -= deltaY; + mapObject->coords2.x -= deltaX; + mapObject->coords2.y -= deltaY; + mapObject->coords3.x -= deltaX; + mapObject->coords3.y -= deltaY; + } + } + } +} + +bool8 FieldObjectDoesZCoordMatch(struct MapObject *, u8); + +u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y + && FieldObjectDoesZCoordMatch(&gMapObjects[i], z)) + return i; + } + return 16; +} + +bool8 FieldObjectDoesZCoordMatch(struct MapObject *mapObject, u8 z) +{ + if (mapObject->mapobj_unk_0B_0 != 0 && z != 0 + && mapObject->mapobj_unk_0B_0 != z) + return FALSE; + else + return TRUE; +} + +void UpdateFieldObjectsForCameraUpdate(s16 x, s16 y) +{ + UpdateFieldObjectCoordsForCameraUpdate(); + sub_805B55C(x, y); + RemoveFieldObjectsOutsideView(); +} + +u8 AddCameraObject(u8 a) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_830FD24, 0, 0, 4); + + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].data0 = a; + return spriteId; +} + +void ObjectCB_CameraObject(struct Sprite *sprite) +{ + void (*cameraObjectFuncs[3])(struct Sprite *); + memcpy(cameraObjectFuncs, gCameraObjectFuncs, sizeof gCameraObjectFuncs); + cameraObjectFuncs[sprite->data1](sprite); +} + +void CameraObject_0(struct Sprite *sprite) +{ + sprite->pos1.x = gSprites[sprite->data0].pos1.x; + sprite->pos1.y = gSprites[sprite->data0].pos1.y; + sprite->invisible = TRUE; + sprite->data1 = 1; + CameraObject_1(sprite); +} + +void CameraObject_1(struct Sprite *sprite) +{ + s16 x = gSprites[sprite->data0].pos1.x; + s16 y = gSprites[sprite->data0].pos1.y; + + sprite->data2 = x - sprite->pos1.x; + sprite->data3 = y - sprite->pos1.y; + sprite->pos1.x = x; + sprite->pos1.y = y; +} + +void CameraObject_2(struct Sprite *sprite) +{ + sprite->pos1.x = gSprites[sprite->data0].pos1.x; + sprite->pos1.y = gSprites[sprite->data0].pos1.y; + sprite->data2 = 0; + sprite->data3 = 0; +} + +struct Sprite *FindCameraObject(void) +{ + u8 i; + + for (i = 0; i < 64; i++) + { + if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject) + return &gSprites[i]; + } + return NULL; +} + +void CameraObjectReset1(void) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + if (cameraSprite != NULL) + { + cameraSprite->data1 = 0; + cameraSprite->callback(cameraSprite); + } +} + +void CameraObjectSetFollowedObjectId(u8 spriteId) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + if (cameraSprite != NULL) + { + cameraSprite->data0 = spriteId; + CameraObjectReset1(); + } +} + +u8 CameraObjectGetFollowedObjectId(void) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + if (cameraSprite == NULL) + return 64; + else + return cameraSprite->data0; +} + +void CameraObjectReset2(void) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + cameraSprite->data1 = 2; +} + +u8 unref_sub_805C43C(struct Sprite *src, s16 x, s16 y, u8 subpriority) +{ + u8 i; + + for (i = 0; i < 64; i++) + { + if (!gSprites[i].inUse) + { + gSprites[i] = *src; + gSprites[i].pos1.x = x; + gSprites[i].pos1.y = y; + gSprites[i].subpriority = subpriority; + break; + } + } + return i; +} + +u8 obj_unfreeze(struct Sprite *src, s16 x, s16 y, u8 subpriority) +{ + s16 i; + + for (i = 63; i > -1; i--) + { + if (!gSprites[i].inUse) + { + gSprites[i] = *src; + gSprites[i].pos1.x = x; + gSprites[i].pos1.y = y; + gSprites[i].subpriority = subpriority; + return i; + } + } + return 64; +} + +void FieldObjectSetDirection(struct MapObject *mapObject, u8 direction) +{ + mapObject->mapobj_unk_20 = mapObject->mapobj_unk_18; + if (!mapObject->mapobj_bit_9) + { + s8 _direction = direction; //needed for the asm to match + mapObject->mapobj_unk_18 = _direction; + } + mapObject->placeholder18 = direction; +} + +u8 *GetFieldObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); + + return template->script; +} + +u8 *GetFieldObjectScriptPointerByFieldObjectId(u8 mapObjectId) +{ + return GetFieldObjectScriptPointerByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); +} + +u16 GetFieldObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); + + return template->flagId; +} + +u16 GetFieldObjectFlagIdByFieldObjectId(u8 mapObjectId) +{ + return GetFieldObjectFlagIdByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); +} + +u8 unref_sub_805C5D0(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + return 0xFF; + else + return gMapObjects[mapObjectId].trainerType; +} + +u8 unref_sub_805C60C(u8 mapObjectId) +{ + return gMapObjects[mapObjectId].trainerType; +} + +u8 unref_sub_805C624(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + return 0xFF; + else + return gMapObjects[mapObjectId].trainerRange_berryTreeId; +} + +u8 FieldObjectGetBerryTreeId(u8 mapObjectId) +{ + return gMapObjects[mapObjectId].trainerRange_berryTreeId; +} + +struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8, struct MapObjectTemplate *, u8); + +struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + if (gSaveBlock1.location.mapNum == mapNum && gSaveBlock1.location.mapGroup == mapGroup) + return FindFieldObjectTemplateInArrayByLocalId(localId, gSaveBlock1.mapObjectTemplates, gMapHeader.events->mapObjectCount); + else + { + struct MapHeader *mapHeader = get_mapheader_by_bank_and_number(mapGroup, mapNum); + + return FindFieldObjectTemplateInArrayByLocalId(localId, mapHeader->events->mapObjects, mapHeader->events->mapObjectCount); + } +} + +struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8 localId, struct MapObjectTemplate *templates, u8 count) +{ + u8 i; + + for (i = 0; i < count; i++) + { + if (templates[i].localId == localId) + return &templates[i]; + } + return NULL; +} + +struct MapObjectTemplate *sub_805C700(struct MapObject *mapObject) +{ + s32 i; + + if (mapObject->mapNum != gSaveBlock1.location.mapNum + || mapObject->mapGroup != gSaveBlock1.location.mapGroup) + return NULL; + + for (i = 0; i < 64; i++) + { + if (mapObject->localId == gSaveBlock1.mapObjectTemplates[i].localId) + return &gSaveBlock1.mapObjectTemplates[i]; + } + return NULL; +} + +void sub_805C754(struct MapObject *mapObject) +{ + struct MapObjectTemplate *template = sub_805C700(mapObject); + + if (template != NULL) + { + template->x = mapObject->coords2.x - 7; + template->y = mapObject->coords2.y - 7; + } +} + +void sub_805C774(struct MapObject *mapObject, u8 movementType) +{ + struct MapObjectTemplate *template = sub_805C700(mapObject); + + if (template != NULL) + template->movementType = movementType; +} + +void sub_805C78C(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + sub_805C754(&gMapObjects[mapObjectId]); +} + +void sub_805C7C4(u8 a) +{ + gpu_pal_allocator_reset__manage_upper_four(); + gUnknown_030005A6 = 0x11FF; + gUnknown_030005A4 = a; + pal_patch_for_npc_range(gUnknown_0837399C[gUnknown_030005A4], 0, 10); +} + +u16 npc_paltag_by_palslot(u8 a) +{ + u8 i; + + if (a < 10) + return gUnknown_0837399C[gUnknown_030005A4][a]; + + for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) + { + if (gUnknown_083738E4[i].tag == gUnknown_030005A6) + { + return gUnknown_083738E4[i].data[gUnknown_030005A4]; + } + } + return 0x11FF; +} + +fieldmap_object_null_cb(sub_805C884, sub_805C8A8); +fieldmap_object_cb(sub_805C8AC, sub_805C8D0, gUnknown_08375224); + +u8 sub_805C8F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +extern void FieldObjectSetRegularAnim(struct MapObject *, struct Sprite *, u8); + +u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +extern u8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *); +extern void sub_8064820(struct Sprite *, s16); + +u8 sub_805C930(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) + { + return 0; + } + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + sprite->data1 = 3; + return 1; +} + +extern u8 sub_8064824(struct Sprite *); + +u8 sub_805C96C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) != 0) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +extern u8 sub_805FF20(struct MapObject *, u8); + +u8 sub_805C98C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375240, 4); + direction = directions[Random() & 3]; + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 5; + if (sub_805FF20(mapObject, direction) != 0) + { + sprite->data1 = 1; + } + return 1; +} + +u8 sub_805C9D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); + mapObject->mapobj_bit_1 = 1; + sprite->data1 = 6; + return 1; +} + +u8 sub_805CA08(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 1; + } + return 0; +} + +u8 FieldObjectIsTrainerAndCloseToPlayer(struct MapObject *mapObject) +{ + s16 x; + s16 y; + s16 objx; + s16 objy; + s16 minx; + s16 maxx; + s16 miny; + s16 maxy; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH) == 0) + { + return 0; + } + if (mapObject->trainerType != 1 && mapObject->trainerType != 3) + { + return 0; + } + PlayerGetDestCoords(&x, &y); + objx = mapObject->coords2.x; + objy = mapObject->coords2.y; + minx = objx - mapObject->trainerRange_berryTreeId; + miny = objy - mapObject->trainerRange_berryTreeId; + maxx = objx + mapObject->trainerRange_berryTreeId; + maxy = objy + mapObject->trainerRange_berryTreeId; + if (minx > x || maxx < x || miny > y || maxy < y) + { + return 0; + } + return 1; +} + +u8 sub_805CAAC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + if (a2 > a3) + { + dirn = DIR_EAST; + if (a0 < 0) + { + dirn = DIR_WEST; + } + } + else + { + dirn = DIR_SOUTH; + if (a1 < 0) + { + dirn = DIR_NORTH; + } + } + return dirn; +} + +u8 sub_805CADC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = DIR_SOUTH; + if (a1 < 0) + { + dirn = DIR_NORTH; + } + return dirn; +} + +u8 sub_805CAEC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = DIR_EAST; + if (a0 < 0) + { + dirn = DIR_WEST; + } + return dirn; +} + +u8 sub_805CB00(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_EAST) + { + dirn = DIR_NORTH; + } + } + else if (dirn == DIR_EAST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = DIR_NORTH; + } + } + return dirn; +} + +u8 sub_805CB5C(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_WEST) + { + dirn = DIR_NORTH; + } + } + else if (dirn == DIR_WEST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = DIR_NORTH; + } + } + return dirn; +} + +u8 sub_805CBB8(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_EAST) + { + dirn = DIR_SOUTH; + } + } + else if (dirn == DIR_EAST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = DIR_SOUTH; + } + } + return dirn; +} + +u8 sub_805CC14(s16 a0, s16 a1, s16 a2, s16 a3) { + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_WEST) + { + dirn = DIR_SOUTH; + } + } + else if (dirn == DIR_WEST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = DIR_SOUTH; + } + } + return dirn; +} + +u8 sub_805CC70(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_EAST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CCAC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_WEST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CCE8(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CD24(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CD60(struct MapObject *mapObject, u8 a1) +{ + s16 x; + s16 y; + s16 x2; + s16 y2; + if (!FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + return 0; + } + PlayerGetDestCoords(&x, &y); + x -= mapObject->coords2.x; + y -= mapObject->coords2.y; + x2 = x; + y2 = y; + if (x2 < 0) + { + x2 = -x2; + } + if (y2 < 0) + { + y2 = -y2; + } + return gUnknown_08375244[a1](x, y, x2, y2); +} + +fieldmap_object_cb(sub_805CDE8, sub_805CE0c, gUnknown_08375270); + +u8 sub_805CE2C(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805CE40(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805CE6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805CEB0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805CEE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375240, 4); + direction = sub_805CD60(mapObject, 0); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805CF28, sub_805CF4C, gUnknown_08375284); + +u8 sub_805CF6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805CF80(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805CFAC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) + { + return 0; + } + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + sprite->data1 = 3; + return 1; +} + +u8 sub_805CFE8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) != 0) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805D008(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752A0, 2); + direction = directions[Random() & 1]; + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 5; + if (sub_805FF20(mapObject, direction) != 0) + { + sprite->data1 = 1; + } + return 1; +} + +u8 sub_805D054(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); + mapObject->mapobj_bit_1 = 1; + sprite->data1 = 6; + return 1; +} + +u8 sub_805D084(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 1; + } + return 0; +} + +fieldmap_object_cb(sub_805D0AC, sub_805D0D0, gUnknown_083752A4); + +u8 sub_805D0F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805D104(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805D130(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) + { + return 0; + } + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + sprite->data1 = 3; + return 1; +} + +u8 sub_805D16C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) != 0) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805D18C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752C0, 2); + direction = directions[Random() & 1]; + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 5; + if (sub_805FF20(mapObject, direction) != 0) + { + sprite->data1 = 1; + } + return 1; +} + +u8 sub_805D1D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); + mapObject->mapobj_bit_1 = 1; + sprite->data1 = 6; + return 1; +} + +u8 sub_805D208(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 1; + } + return 0; +} + +fieldmap_object_cb(sub_805D230, sub_805D254, gUnknown_083752C4); + +u8 sub_805D274(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 1; + return 1; +} + +u8 sub_805D2A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + sprite->data1 = 2; + return 1; + } + return 0; +} + +u8 sub_805D2C0(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 0; + return 0; +} + +u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite); + +void FieldObjectCB_BerryTree(struct Sprite *sprite) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[sprite->data0]; + if (!(sprite->data7 & 1)) + { + get_berry_tree_graphics(mapObject, sprite); + sprite->data7 |= 1; + } + meta_step(mapObject, sprite, sub_805D314); +} + +u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite) +{ + return gUnknown_083752D0[sprite->data1](mapObject, sprite); +} + +u8 do_berry_tree_growth_sparkle_1(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 berryTreeStage; + npc_reset(mapObject, sprite); + mapObject->mapobj_bit_13 = 1; + sprite->invisible = 1; + berryTreeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); + if (!berryTreeStage) + { + if (!(sprite->data7 & 4) && sprite->animNum == 4) + { + gUnknown_0202FF84[0] = mapObject->coords2.x; + gUnknown_0202FF84[1] = mapObject->coords2.y; + gUnknown_0202FF84[2] = sprite->subpriority - 1; + gUnknown_0202FF84[3] = sprite->oam.priority; + FieldEffectStart(0x17); + sprite->animNum = 0; + } + return 0; + } + mapObject->mapobj_bit_13 = 0; + sprite->invisible = 0; + berryTreeStage--; + if (sprite->animNum != berryTreeStage) + { + sprite->data1 = 2; + return 1; + } + get_berry_tree_graphics(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, 0x39); + sprite->data1 = 1; + return 1; +} + +u8 sub_805D3EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sprite->data1 = 0; + return 1; + } + return 0; +} + +u8 do_berry_tree_growth_sparkle_2(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 1; + sprite->data1 = 3; + sprite->data2 = 0; + sprite->data7 |= 2; + gUnknown_0202FF84[0] = mapObject->coords2.x; + gUnknown_0202FF84[1] = mapObject->coords2.y; + gUnknown_0202FF84[2] = sprite->subpriority - 1; + gUnknown_0202FF84[3] = sprite->oam.priority; + FieldEffectStart(0x17); + return 1; +} + +u8 sub_805D458(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data2++; + mapObject->mapobj_bit_13 = ((sprite->data2 & 0x2) >> 1); + sprite->animPaused = 1; + if (sprite->data2 > 64) + { + get_berry_tree_graphics(mapObject, sprite); + sprite->data1 = 4; + sprite->data2 = 0; + return 1; + } + return 0; +} + +u8 sub_805D4A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data2++; + mapObject->mapobj_bit_13 = ((sprite->data2 & 0x2) >> 1); + sprite->animPaused = 1; + if (sprite->data2 > 64) + { + sprite->data1 = 0; + sprite->data7 &= (-3); + return 1; + } + return 0; +} + +fieldmap_object_cb(sub_805D4F4, sub_805D518, gUnknown_083752E4); + +u8 sub_805D538(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805D54C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805D578(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805D5BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805D5EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752A0, 2); + direction = sub_805CD60(mapObject, 1); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805D634, sub_805D658, gUnknown_083752F8); + +u8 sub_805D678(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805D68C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805D6B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805D6FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805D72C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752C0, 2); + direction = sub_805CD60(mapObject, 2); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805D774, sub_805D798, gUnknown_0837530C); + +u8 sub_805D7B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805D7CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805D7F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805D83C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805D86C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375320, 2); + direction = sub_805CD60(mapObject, 3); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805D8B4, sub_805D8D8, gUnknown_08375324); + +u8 sub_805D8F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805D90C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805D938(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805D97C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805D9AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375338, 2); + direction = sub_805CD60(mapObject, 4); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805D9F4, sub_805DA18, gUnknown_0837533C); + +u8 sub_805DA38(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805DA4C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805DA78(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805DABC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805DAEC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375350, 2); + direction = sub_805CD60(mapObject, 5); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805DB34, sub_805DB58, gUnknown_08375354); + +u8 sub_805DB78(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805DB8C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805DBB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805DBFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805DC2C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375368, 2); + direction = sub_805CD60(mapObject, 6); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805DC74, sub_805DC98, gUnknown_0837536C); + +u8 sub_805DCB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805DCCC(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805DCF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805DD3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805DD6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375380, 4); + direction = sub_805CD60(mapObject, 7); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805DDB4, sub_805DDD8, gUnknown_08375384); + +u8 sub_805DDF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805DE0C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805DE38(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805DE7C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805DEAC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375398, 4); + direction = sub_805CD60(mapObject, 8); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805DEF4, sub_805DF18, gUnknown_0837539C); + +u8 sub_805DF38(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805DF4C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805DF78(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805DFBC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805DFEC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_083753B0, 4); + direction = sub_805CD60(mapObject, 9); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805E034, sub_805E058, gUnknown_083753B4); + +u8 sub_805E078(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805E08C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 2; + return 1; +} + +u8 sub_805E0B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805E0FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 4; + return 1; + } + return 0; +} + +u8 sub_805E12C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_083753C8, 4); + direction = sub_805CD60(mapObject, 10); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805E174, sub_805E198, gUnknown_083753CC); + +u8 sub_805E1B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 1; + return 1; +} + +u8 sub_805E1E4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, 0x30); + sprite->data1 = 2; + } + return 0; +} + +u8 sub_805E208(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805E234(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[5]; + memcpy(directions, gUnknown_083753DC, 5); + direction = sub_805CD60(mapObject, 0); + if (direction == 0) + { + direction = directions[mapObject->mapobj_unk_18]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 0; + return 1; +} + +fieldmap_object_cb(sub_805E278, sub_803E29C, gUnknown_083753E4); + +u8 sub_805E2BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 1; + return 1; +} + +u8 sub_805E2E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, 0x30); + sprite->data1 = 2; + } + return 0; +} + +u8 sub_805E30C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data1 = 3; + } + return 0; +} + +u8 sub_805E338(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[5]; + memcpy(directions, gUnknown_083753F4, 5); + direction = sub_805CD60(mapObject, 0); + if (direction == 0) + { + direction = directions[mapObject->mapobj_unk_18]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 0; + return 1; +} + +fieldmap_object_cb(sub_805E37C, sub_805E3A0, gUnknown_083753FC); + +u8 sub_805E3C0(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 sub_805E3D4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + direction = gUnknown_0836DC09[mapObject->animPattern]; + if (mapObject->mapobj_unk_21 != 0) + { + direction = GetOppositeDirection(direction); + } + FieldObjectSetDirection(mapObject, direction); + sprite->data1 = 2; + return 1; +} + +u8 sub_805E40C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 v0; + u8 goSpeed0AnimId; + if (mapObject->mapobj_unk_21 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 0; + FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); + } + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + if (v0 == 1) + { + mapObject->mapobj_unk_21 ++; + FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + } + if (v0 != 0) + { + goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); + } + FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); + mapObject->mapobj_bit_1 = 1; + sprite->data1 = 3; + return 1; +} + +u8 sub_805E4C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 1; + } + return 0; +} + +u8 sub_805E4EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data1 = 1; + return 1; +} + +u8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, struct Sprite *sprite, u8 *directionSequence) +{ + u8 v0; + u8 goSpeed0AnimId; + if (mapObject->mapobj_unk_21 == 3 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 0; + } + FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + if (v0 == 1) + { + mapObject->mapobj_unk_21 ++; + FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + } + if (v0 != 0) + { + goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); + } + FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); + mapObject->mapobj_bit_1 = 1; + sprite->data1 = 2; + return 1; +} + +u8 sub_805E5B4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 1; + } + return 0; +} + +fieldmap_object_cb(sub_805E5DC, sub_805E600, gUnknown_0837540C); + +u8 sub_805E620(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375418, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E668, sub_805E68C, gUnknown_0837541C); + +u8 sub_805E6AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375428, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E6F4, sub_805E718, gUnknown_0837542C); + +u8 sub_805E738(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375438, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E780, sub_805E7A4, gUnknown_0837543C); + +u8 sub_805E7C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375448, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + + + +fieldmap_object_cb(sub_805E80C, sub_805E830, gUnknown_0837544C); + +u8 sub_805E850(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375458, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E898, sub_805E8BC, gUnknown_0837545C); + +u8 sub_805E8DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375468, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E924, sub_805E948, gUnknown_0837546C); + +u8 sub_805E968(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375240, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E9B0, sub_805E9D4, gUnknown_08375478); + +u8 sub_805E9F4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375484, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EA3C, sub_805EA60, gUnknown_08375488); + +u8 sub_805EA80(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375494, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EAC8, sub_805EAEC, gUnknown_08375498); + +u8 sub_805EB0C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754A4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EB54, sub_805EB78, gUnknown_083754A8); + +u8 sub_805EB98(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754B4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EBE0, sub_805EC04, gUnknown_083754B8); + +u8 sub_805EC24(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754C4, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EC6C, sub_805EC90, gUnknown_083754C8); + +u8 sub_805ECB0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754D4, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805ECF8, sub_805ED1C, gUnknown_083754D8); + +u8 sub_805ED3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754E4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805ED84, sub_805EDA8, gUnknown_083754E8); + +u8 sub_805EDC8(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754F4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EE10, sub_805EE34, gUnknown_083754F8); + +u8 sub_805EE54(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375504, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EE9C, sub_805EEC0, gUnknown_08375508); + +u8 sub_805EEE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375514, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EF28, sub_805EF4C, gUnknown_08375518); + +u8 sub_805EF6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375524, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EFB4, sub_805EFD8, gUnknown_08375528); + +u8 sub_805EFF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375534, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F040, sub_805F064, gUnknown_08375538); + +u8 sub_805F084(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375544, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F0CC, sub_805F0F0, gUnknown_08375548); + +u8 sub_805F110(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375554, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F158, sub_805F17C, gUnknown_08375558); + +u8 sub_805F19C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375564, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F1E4, sub_805F208, gUnknown_08375568); + +u8 sub_805F228(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375574, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F270, sub_805F294, gUnknown_08375578); + +u8 sub_805F2B4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375584, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +}; + +fieldmap_object_cb(sub_805F2FC, sub_805F320, gUnknown_08375588); + +u8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + if (mapObject->mapobj_unk_21 == 0) + { + mapObject->mapobj_unk_21 = player_get_direction_lower_nybble(); + } + sprite->data1 = 1; + return 1; +} + +u8 sub_805F364(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2) + { + return 0; + } + return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), NULL); +} + +u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + mapObject->mapobj_bit_1 = 0; + sprite->data1 = 1; + } + return 0; +} + +#ifdef NONMATCHING + +u8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8)) +{ + return 0; +} + +u8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8)) +{ + int direction; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + mapObject->mapobj_bit_1 = 1; + sprite->data1 = 2; + return 1; +} + +u8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8)) +{ + s16 x; + s16 y; + int direction; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction)); + if (!npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = 1; + sprite->data1 = 2; + return 1; +} +#endif + +asm(".section .text_fmocb2_c\n"); + +fieldmap_object_cb(sub_805F8E0, sub_805F904, gUnknown_083755C0); + +u8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2) + { + return 0; + } + return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), MetatileBehavior_IsPokeGrass); +} + +u8 sub_805F9F8(struct MapObject *, struct Sprite *); + +void FieldObjectCB_TreeDisguise(struct Sprite *sprite) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[sprite->data0]; + if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data7 == 0)) + { + FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); + mapObject->mapobj_unk_1A = FieldEffectStart(0x1c); + mapObject->mapobj_unk_21 = 1; + sprite->data7 ++; + } + meta_step(&gMapObjects[sprite->data0], sprite, sub_805F9F8); +} + +u8 sub_805F9F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + return 0; +} + +void FieldObjectCB_MountainDisguise(struct Sprite *sprite) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[sprite->data0]; + if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data7 == 0)) + { + FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); + mapObject->mapobj_unk_1A = FieldEffectStart(0x1d); + mapObject->mapobj_unk_21 = 1; + sprite->data7 ++; + } + meta_step(&gMapObjects[sprite->data0], sprite, sub_805F9F8); +} + +u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite); + +void FieldObjectCB_Hidden1(struct Sprite *sprite) +{ + if (sprite->data7 == 0) + { + gMapObjects[sprite->data0].mapobj_bit_26 = 1; + sprite->subspriteMode = 2; + sprite->oam.priority = 3; + sprite->data7 ++; + } + meta_step(&gMapObjects[sprite->data0], sprite, sub_805FAD8); +} + +u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + return gUnknown_083755CC[sprite->data1](mapObject, sprite); +} + +u8 sub_805FAF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + return 0; +} + +u8 sub_805FB04(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sprite->data1 = 0; + } + return 0; +} + +fieldmap_object_cb(sub_805FB20, sub_805FB44, gUnknown_083755D0); + +u8 sub_805FB64(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805FB90, sub_805FBB4, gUnknown_083755D8); + +u8 sub_805FBD4(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805FC00, sub_805FC24, gUnknown_083755E0); + +u8 sub_805FC44(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); + sprite->data1 = 1; + return 1; +} + +fieldmap_object_cb(sub_805FC70, sub_805FC94, gUnknown_083755E8); + +u8 sub_805FCB4(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + mapObject->mapobj_bit_13 = 1; + sprite->data1 = 1; + return 1; +} + +u8 sub_805FCE8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sprite->data1 = 2; + return 1; + } + return 0; +} + +u8 sub_805FD08(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 0; + return 0; +} + +void sub_805FC70(struct Sprite *sprite); + +void npc_reset(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 0; + mapObject->mapobj_bit_6 = 0; + mapObject->mapobj_bit_7 = 0; + mapObject->mapobj_unk_1C = 0xff; + sprite->data1 = 0; +} + +u8 FieldObjectDirectionToImageAnimId(u8 direction) +{ + return gUnknown_083755F4[direction]; +} + +u8 get_go_image_anim_num(u8 direction) +{ + return gUnknown_083755FD[direction]; +} + +u8 get_go_fast_image_anim_num(u8 direction) +{ + return gUnknown_08375606[direction]; +} + +u8 get_go_faster_image_anim_num(u8 direction) +{ + return gUnknown_0837560F[direction]; +} + +u8 sub_805FD78(u8 direction) +{ + return gUnknown_08375618[direction]; +} + +u8 sub_805FD88(u8 direction) +{ + return gUnknown_08375621[direction]; +} + +u8 sub_805FD98(u8 direction) +{ + return gUnknown_0837562A[direction]; +} + +u8 unref_sub_805FDA8(u8 direction) +{ + return gUnknown_08375633[direction]; +} + +u8 sub_805FDB8(u8 direction) +{ + return gUnknown_0837563C[direction]; +} + +u8 sub_805FDC8(u8 direction) +{ + return gUnknown_08375645[direction]; +} + +u8 sub_805FDD8(u8 direction) +{ + return gUnknown_0837564E[direction]; +} + +u8 sub_805FDE8(u8 direction) +{ + return gUnknown_08375657[direction]; +} + +u8 sub_805FDF8(u8 direction) +{ + return gUnknown_08375660[direction]; +} + +u8 sub_805FE08(u8 direction) +{ + return gUnknown_08375669[direction]; +} + +u8 get_run_image_anim_num(u8 direction) +{ + return gUnknown_08375672[direction]; +} + +void sub_805FE28(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) +{ + if (!mapObject->mapobj_bit_12) + { + sprite->animNum = animNum; + if (sprite->animCmdIndex == 1) + { + sprite->animCmdIndex = 2; + } else if (sprite->animCmdIndex == 3) + { + sprite->animCmdIndex = 0; + } + SeekSpriteAnim(sprite, sprite->animCmdIndex); + } +} + +void sub_805FE64(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) +{ + u8 animCmdIndex; + if (!mapObject->mapobj_bit_12) + { + sprite->animNum = animNum; + animCmdIndex = 3; + if (sprite->animCmdIndex < 2) + { + animCmdIndex = 1; + } + SeekSpriteAnim(sprite, animCmdIndex); + } +} + +u8 sub_805FE90(s16 a0, s16 a1, s16 a2, s16 a3) +{ + if (a0 > a2) + { + return DIR_WEST; + } else if (a0 < a2) + { + return DIR_EAST; + } else if (a1 > a3) + { + return DIR_NORTH; + } else + { + return DIR_SOUTH; + } +} + +void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern) +{ + mapObject->animPattern = animPattern; + mapObject->mapobj_unk_21 = 0; + mapObject->animId = 0; + gSprites[mapObject->spriteId].callback = gUnknown_0836DA88[animPattern]; + gSprites[mapObject->spriteId].data1 = 0; +} + +u8 npc_running_behaviour_by_direction(u8 direction) +{ + return gUnknown_0837567B[direction]; +} + +u8 sub_805FF20(struct MapObject *mapObject, u8 direction) +{ + s16 x; + s16 y; + x = mapObject->coords2.x; + y = mapObject->coords2.y; + MoveCoords(direction, &x, &y); + return npc_block_way(mapObject, x, y, direction); +} + +bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject2 *mapObject, s16 x, s16 y); +bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y); +bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction); + +u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u8 direction) +{ + if (IsCoordOutsideFieldObjectMovementRect((struct MapObject2 *)mapObject, x, y)) + { + return 1; + } + if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction)) + { + return 2; + } else if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)) + { + return 2; + } + if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) + { + return 3; + } + if (CheckForCollisionBetweenFieldObjects(mapObject, x, y)) + { + return 4; + } + return 0; +} + +u8 sub_8060024(struct MapObject *mapObject, s16 x, s16 y, u8 direction) +{ + u8 flags; + flags = 0; + if (IsCoordOutsideFieldObjectMovementRect((struct MapObject2 *)mapObject, x, y)) + { + flags |= 1; + } + if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))) + { + flags |= 2; + } + if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) + { + flags |= 4; + } + if (CheckForCollisionBetweenFieldObjects(mapObject, x, y)) + { + flags |= 8; + } + return flags; +} + +bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject2 *mapObject, s16 x, s16 y) +{ + s16 minv; + s16 maxv; + if (mapObject->mapobj_unk_19 != 0) + { + minv = mapObject->coords1.x - (mapObject->mapobj_unk_19); + maxv = mapObject->coords1.x + (mapObject->mapobj_unk_19); + if (minv > x || maxv < x) + { + return 1; + } + } + if (mapObject->mapobj_unk_19b != 0) + { + minv = mapObject->coords1.y - (mapObject->mapobj_unk_19b); + maxv = mapObject->coords1.y + (mapObject->mapobj_unk_19b); + if (minv > y || maxv < y) + { + return 1; + } + } + return 0; +} + +bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction) +{ + if (gUnknown_08375684[direction - 1](mapObject->mapobj_unk_1E) || gUnknown_08375694[direction - 1](MapGridGetMetatileBehaviorAt(x, y))) + { + return 1; + } + return 0; +} + +bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y) +{ + struct MapObject *mapObject2; + u8 i; + for (i=0; i<16; i++) + { + mapObject2 = &gMapObjects[i]; + if (mapObject2->active && mapObject2 != mapObject) + { + if ((mapObject2->coords2.x != x || mapObject2->coords2.y != y) && (mapObject2->coords3.x != x || mapObject2->coords3.y != y)) + { + continue; + } + if (AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, mapObject2->mapobj_unk_0B_0)) + { + return 1; + } + } + } + return 0; +} + +bool8 sub_8060234(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + if (gSprites[gMapObjects[mapObjectId].spriteId].data7 & 2) + { + return 1; + } + } + return 0; +} + +void sub_8060288(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + gSprites[gMapObjects[mapObjectId].spriteId].data7 |= 4; + } +} + +void MoveCoords(u8 direction, s16 *x, s16 *y) +{ + *x += gDirectionToVector[direction].x; + *y += gDirectionToVector[direction].y; +} + +void unref_sub_80602F8(u8 direction, s16 *x, s16 *y) +{ + *x += gDirectionToVector[direction].x << 4; + *y += gDirectionToVector[direction].y << 4; +} + +void sub_8060320(u8 direction, s16 *x, s16 *y, s16 deltaX, s16 deltaY) +{ + if (gDirectionToVector[direction].x > 0) + { + *x += deltaX; + } + if (gDirectionToVector[direction].x < 0) + { + *x -= deltaX; + } + if (gDirectionToVector[direction].y > 0) + { + *y += deltaY; + } + if (gDirectionToVector[direction].y < 0) + { + *y -= deltaY; + } +} + +void sub_8060388(s16 x1, s16 y1, s16 *x2, s16 *y2) +{ + *x2 = (x1 - gSaveBlock1.pos.x) << 4; + *y2 = (y1 - gSaveBlock1.pos.y) << 4; + *x2 -= gUnknown_0300489C; + *y2 -= gUnknown_03004898; +} + +void sub_80603CC(s16 x1, s16 y1, s16 *x2, s16 *y2) +{ + s16 x3; + s16 y3; + x3 = -gUnknown_0300489C - gUnknown_03004880.unk10; + y3 = -gUnknown_03004898 - gUnknown_03004880.unk14; + if (gUnknown_03004880.unk10 > 0) + { + x3 += 0x10; + } + if (gUnknown_03004880.unk10 < 0) + { + x3 -= 0x10; + } + if (gUnknown_03004880.unk14 > 0) + { + y3 += 0x10; + } + if (gUnknown_03004880.unk14 < 0) + { + y3 -= 0x10; + } + *x2 = ((x1 - gSaveBlock1.pos.x) << 4) + x3; + *y2 = ((y1 - gSaveBlock1.pos.y) << 4) + y3; +} + +void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy) +{ + sub_80603CC(*x, *y, x, y); + *x += dx; + *y += dy; +} + +void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y) +{ + *x = 0; + *y = 0; + if (gUnknown_03004880.unk10 > 0) + { + (*x)++; + } + if (gUnknown_03004880.unk10 < 0) + { + (*x)--; + } + if (gUnknown_03004880.unk14 > 0) + { + (*y)++; + } + if (gUnknown_03004880.unk14 < 0) + { + (*y)--; + } +} + +void FieldObjectMoveDestCoords(struct MapObject *mapObject, u8 direction, s16 *x, s16 *y) +{ + *x = mapObject->coords2.x; + *y = mapObject->coords2.y; + MoveCoords(direction, x, y); +} + +bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_1 || mapObject->mapobj_bit_6) + { + return TRUE; + } + return FALSE; +} + +bool8 FieldObjectIsSpecialAnimActive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6 && mapObject->mapobj_unk_1C != 0xff) + { + return TRUE; + } + return FALSE; +} + +bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) +{ + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) + { + return TRUE; + } + UnfreezeMapObject(mapObject); + mapObject->mapobj_unk_1C = specialAnimId; + mapObject->mapobj_bit_6 = 1; + mapObject->mapobj_bit_7 = 0; + gSprites[mapObject->spriteId].data2 = 0; + return FALSE; +} + +void FieldObjectForceSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) +{ + FieldObjectClearAnimIfSpecialAnimActive(mapObject); + FieldObjectSetSpecialAnim(mapObject, specialAnimId); +} + +void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6) + { + FieldObjectClearAnim(mapObject); + } +} + +void FieldObjectClearAnim(struct MapObject *mapObject) +{ + mapObject->mapobj_unk_1C = 0xFF; + mapObject->mapobj_bit_6 = 0; + mapObject->mapobj_bit_7 = 0; + gSprites[mapObject->spriteId].data1 = 0; + gSprites[mapObject->spriteId].data2 = 0; +} + +bool8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6) + return mapObject->mapobj_bit_7; + return 0x10; +} + +bool8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *mapObject) +{ + u8 specialAnimStatus; + specialAnimStatus = FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject); + if (specialAnimStatus != 0 && specialAnimStatus != 0x10) + { + FieldObjectClearAnimIfSpecialAnimActive(mapObject); + } + return specialAnimStatus; +} + +u8 FieldObjectGetSpecialAnim(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6) + { + return mapObject->mapobj_unk_1C; + } + return 0xFF; +} + +extern void DoGroundEffects_OnSpawn(struct MapObject *mapObject, struct Sprite *sprite); +extern void DoGroundEffects_OnBeginStep(struct MapObject *mapObject, struct Sprite *sprite); +extern void DoGroundEffects_OnFinishStep(struct MapObject *mapObject, struct Sprite *sprite); +void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite); +void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite); +void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite); +void FieldObjectUpdateSubpriority(struct MapObject *mapObject, struct Sprite *sprite); + +void meta_step(struct MapObject *mapObject, struct Sprite *sprite, u8 (*callback)(struct MapObject *, struct Sprite *)) +{ + DoGroundEffects_OnSpawn(mapObject, sprite); + sub_80634A0(mapObject, sprite); + if (FieldObjectIsSpecialAnimActive(mapObject)) + { + FieldObjectExecSpecialAnim(mapObject, sprite); + } else + { + if (!mapObject->mapobj_bit_8) + { + while (callback(mapObject, sprite)); + } + } + DoGroundEffects_OnBeginStep(mapObject, sprite); + DoGroundEffects_OnFinishStep(mapObject, sprite); + npc_obj_transfer_image_anim_pause_flag(mapObject, sprite); + sub_80634D0(mapObject, sprite); + FieldObjectUpdateSubpriority(mapObject, sprite); +} + + +u8 GetFaceDirectionAnimId(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_083756C8, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 GetSimpleGoAnimId(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_083756CD, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 GetGoSpeed0AnimId(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_083756D2, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060744(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_083756D7, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 d2s_08064034(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_083756DC, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_806079C(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_083756E1, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_80607C8(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_083756E6, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_80607F4(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_083756EB, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 GetJumpLedgeAnimId(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_083756F0, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_806084C(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_083756F5, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060878(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_083756FA, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_80608A4(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_083756FF, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_80608D0(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375704, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 GetStepInPlaceDelay32AnimId(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375709, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 GetStepInPlaceDelay16AnimId(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837570E, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 GetStepInPlaceDelay8AnimId(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375713, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 GetStepInPlaceDelay4AnimId(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375718, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction) +{ + return FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(GetOppositeDirection(direction))); +} + +u8 sub_80609D8(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837571D, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A04(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375722, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A30(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375727, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A5C(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837572C, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A88(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375731, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060AB4(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375736, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060AE0(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837573B, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060B0C(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375740, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060B38(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375745, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060B64(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837574A, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 GetOppositeDirection(u8 direction) +{ + u8 directions[8]; + memcpy(directions, gUnknown_0837574F, 8); + if (direction == 0 || direction > 8) + { + return direction; + } + return directions[direction - 1]; +} + +int zffu_offset_calc(u8 a0, u8 a1) +{ + return gUnknown_08375757[a0 - 1][a1 - 1]; +} + +#ifdef NONMATCHING +int state_to_direction(u8 a0, u8 a1, u8 a2) +{ + int zffuOffset; + asm_comment("For some reason, r2 is being backed up to r3 and restored ahead of the zffu call."); + if (a1 == 0 || a2 == 0 || a1 > 4 || a2 > 4) + { + return 0; + } + zffuOffset = zffu_offset_calc(a1, a2); + return gUnknown_08375767[a0 - 1][zffuOffset - 1]; +} +#else +__attribute__((naked)) +int state_to_direction(u8 a0, u8 a1, u8 a2) +{ + asm(".syntax unified\n\ + push {r4,lr}\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + adds r0, r1, 0\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + cmp r1, 0\n\ + beq _08060BFC\n\ + cmp r2, 0\n\ + beq _08060BFC\n\ + cmp r1, 0x4\n\ + bhi _08060BFC\n\ + cmp r2, 0x4\n\ + bls _08060C00\n\ +_08060BFC:\n\ + movs r0, 0\n\ + b _08060C12\n\ +_08060C00:\n\ + adds r1, r2, 0\n\ + bl zffu_offset_calc\n\ + ldr r2, _08060C18 @ =gUnknown_08375767\n\ + lsls r1, r4, 2\n\ + subs r1, 0x5\n\ + adds r0, r1\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ +_08060C12:\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08060C18: .4byte gUnknown_08375767\n\ +.syntax divided\n"); +} +#endif + +void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite)) + { + mapObject->mapobj_bit_7 = 1; + } +} + +bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite)) + { + mapObject->mapobj_unk_1C = 0xFF; + sprite->data2 = 0; + return 1; + } + return 0; +} + +void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId) +{ + mapObject->mapobj_unk_1C = animId; + sprite->data2 = 0; +} + +void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + FieldObjectSetDirection(mapObject, direction); + npc_coords_shift_still(mapObject); + sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); + sprite->animPaused = 1; + sprite->data2 = 1; +} + +u8 sub_8060CE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_SOUTH); + return 1; +} + +u8 sub_8060CF0(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_NORTH); + return 1; +} + +u8 sub_8060D00(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_WEST); + return 1; +} + +u8 sub_8060D10(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_EAST); + return 1; +} + +void sub_8060D20(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + s16 x; + s16 y; + x = mapObject->coords2.x; + y = mapObject->coords2.y; + FieldObjectSetDirection(mapObject, direction); + MoveCoords(direction, &x, &y); + npc_coords_shift(mapObject, x, y); + oamt_npc_ministep_reset(sprite, direction, a3); + sprite->animPaused = 0; + mapObject->mapobj_bit_2 = 1; + sprite->data2 = 1; +} + +extern u8 (*const gUnknown_083759C0[5])(u8); + +void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + u8 (*const functions[5])(u8); + memcpy((void *)functions, gUnknown_083759C0, sizeof(gUnknown_083759C0)); + sub_8060D20(mapObject, sprite, direction, a3); + sub_805FE28(mapObject, sprite, functions[a3](mapObject->mapobj_unk_18)); +} + +void do_run_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + sub_8060D20(mapObject, sprite, direction, 1); + sub_805FE28(mapObject, sprite, get_run_image_anim_num(mapObject->mapobj_unk_18)); +} + +bool8 obj_npc_ministep(struct Sprite *); + +bool8 npc_obj_ministep_stop_on_arrival(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (obj_npc_ministep(sprite)) + { + npc_coords_shift_still(mapObject); + mapObject->mapobj_bit_3 = 1; + sprite->animPaused = 1; + return 1; + } + return 0; +} + +void sub_8060E68(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + s16 x; + s16 y; + x = mapObject->coords2.x; + y = mapObject->coords2.y; + FieldObjectSetDirection(mapObject, direction); + MoveCoords(direction, &x, &y); + npc_coords_shift(mapObject, x, y); + sub_806467C(sprite, direction); + sprite->animPaused = 0; + mapObject->mapobj_bit_2 = 1; + sprite->data2 = 1; +} + +void sub_8060ED8(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + sub_8060E68(mapObject, sprite, direction); + sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); +} + +bool8 an_walk_any_2(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_806468C(sprite)) + { + npc_coords_shift_still(mapObject); + mapObject->mapobj_bit_3 = 1; + sprite->animPaused = 1; + return TRUE; + } + return FALSE; +} + +bool8 sub_8060F5C(struct MapObject *, struct Sprite *); + +bool8 sub_8060F3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_SOUTH); + return sub_8060F5C(mapObject, sprite); +} + +bool8 sub_8060F5C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8060F9C(struct MapObject *, struct Sprite *); + +bool8 sub_8060F7C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_NORTH); + return sub_8060F9C(mapObject, sprite); +} + +bool8 sub_8060F9C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8060FDC(struct MapObject *, struct Sprite *); + +bool8 sub_8060FBC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_WEST); + return sub_8060FDC(mapObject, sprite); +} + +bool8 sub_8060FDC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806101C(struct MapObject *, struct Sprite *); + +bool8 sub_8060FFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_EAST); + return sub_806101C(mapObject, sprite); +} + +bool8 sub_806101C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806105C(struct MapObject *, struct Sprite *); + +bool8 sub_806103C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 0); + return sub_806105C(mapObject, sprite); +} + +bool8 sub_806105C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806109C(struct MapObject *, struct Sprite *); + +bool8 sub_806107C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 0); + return sub_806109C(mapObject, sprite); +} + +bool8 sub_806109C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80610DC(struct MapObject *, struct Sprite *); + +bool8 sub_80610BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 0); + return sub_80610DC(mapObject, sprite); +} + +bool8 sub_80610DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806111C(struct MapObject *, struct Sprite *); + +bool8 sub_80610FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 0); + return sub_806111C(mapObject, sprite); +} + +bool8 sub_806111C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +void sub_806113C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) +{ + s16 vSPp4[3]; + s16 x; + s16 y; + memcpy(vSPp4, gUnknown_08375A34, sizeof gUnknown_08375A34); + x = 0; + y = 0; + FieldObjectSetDirection(mapObject, direction); + sub_8060320(direction, &x, &y, vSPp4[a4], vSPp4[a4]); + npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); + sub_80646E4(sprite, direction, a4, a5); + sprite->data2 = 1; + sprite->animPaused = 0; + mapObject->mapobj_bit_2 = 1; + mapObject->mapobj_bit_4 = 1; +} + +void maybe_shadow_1(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) +{ + sub_806113C(mapObject, sprite, direction, a4, a5); + sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); + DoShadowFieldEffect(mapObject); +} + +u8 sub_806123C(struct MapObject *mapObject, struct Sprite *sprite, u8 (*const callback)(struct Sprite *)) +{ + s16 vSPp4[3]; + s16 x; + s16 y; + u8 retval; + memcpy(vSPp4, gUnknown_08375A3A, sizeof gUnknown_08375A3A); + retval = callback(sprite); + if (retval == 1 && vSPp4[sprite->data4] != 0) + { + x = 0; + y = 0; + sub_8060320(mapObject->placeholder18, &x, &y, vSPp4[sprite->data4], vSPp4[sprite->data4]); + npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); + mapObject->mapobj_bit_2 = 1; + mapObject->mapobj_bit_4 = 1; + } else if (retval == 0xff) + { + npc_coords_shift_still(mapObject); + mapObject->mapobj_bit_3 = 1; + mapObject->mapobj_bit_5 = 1; + sprite->animPaused = 1; + } + return retval; +} + +u8 sub_8061300(struct MapObject *mapObject, struct Sprite *sprite) +{ + return sub_806123C(mapObject, sprite, sub_8064704); +} + +u8 sub_8061314(struct MapObject *mapObject, struct Sprite *sprite) +{ + return sub_806123C(mapObject, sprite, sub_806478C); +} + +bool8 sub_8061328(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061300(mapObject, sprite) == 0xFF) + { + return TRUE; + } + return FALSE; +} + +bool8 sub_8061340(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061314(mapObject, sprite) == 0xFF) + { + return TRUE; + } + return FALSE; +} + +bool8 sub_8061358(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 retval; + + retval = sub_8061300(mapObject, sprite); + if (retval != 1) + { + if (retval == 0xFF) + { + return TRUE; + } + return FALSE; + } + FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); + sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); + return FALSE; +} + +bool8 sub_80613D4(struct MapObject *, struct Sprite *); +bool8 sub_806142C(struct MapObject *, struct Sprite *); +bool8 sub_8061484(struct MapObject *, struct Sprite *); +bool8 sub_80614DC(struct MapObject *, struct Sprite *); + +bool8 sub_80613A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 2, 0); + return sub_80613D4(mapObject, sprite); +} + +bool8 sub_80613D4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061400(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 2, 0); + return sub_806142C(mapObject, sprite); +} + +bool8 sub_806142C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061458(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 2, 0); + return sub_8061484(mapObject, sprite); +} + +bool8 sub_8061484(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80614B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 2, 0); + return sub_80614DC(mapObject, sprite); +} + +bool8 sub_80614DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +void sub_8061508(struct Sprite *sprite, u16 duration) +{ + sprite->data2 = 1; + sprite->data3 = duration; +} + +bool8 sub_8061510(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data3--; + if (!sprite->data3) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806152C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 1); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_806154C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 2); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_806156C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 4); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_806158C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 8); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_80615AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 16); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite); +bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite); +bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite); +bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80615CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 1); + return sub_80615EC(mapObject, sprite); +} + +bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} +bool8 sub_806160C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 1); + return sub_806162C(mapObject, sprite); +} + +bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} +bool8 sub_806164C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 1); + return sub_806166C(mapObject, sprite); +} + +bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} +bool8 sub_806168C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 1); + return sub_80616AC(mapObject, sprite); +} + +bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +void sub_80616CC(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animId, u16 duration) +{ + FieldObjectSetDirection(mapObject, direction); + sub_805FE28(mapObject, sprite, animId); + sprite->animPaused = 0; + sprite->data2 = 1; + sprite->data3 = duration; +} + +bool8 sub_8061714(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data3--; + if (sprite->data3 == 0) + { + sprite->data2 = 2; + sprite->animPaused = 1; + return TRUE; + } + return FALSE; +} + +bool8 sub_806173C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sprite->data3 & 1) + { + sprite->animDelayCounter++; + } + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061778(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_80617B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_80617E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_8061820(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_8061858(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061890(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_80618C8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061900(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061938(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_fast_image_anim_num(DIR_SOUTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061970(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_fast_image_anim_num(DIR_NORTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_80619A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_fast_image_anim_num(DIR_WEST), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_80619E0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_fast_image_anim_num(DIR_EAST), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061A18(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_faster_image_anim_num(DIR_SOUTH), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061A50(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_faster_image_anim_num(DIR_NORTH), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061A88(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_faster_image_anim_num(DIR_WEST), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061AC0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_faster_image_anim_num(DIR_EAST), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061B18(struct MapObject *, struct Sprite *); + +bool8 sub_8061AF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 2); + return sub_8061B18(mapObject, sprite); +} + +bool8 sub_8061B18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061B58(struct MapObject *, struct Sprite *); + +bool8 sub_8061B38(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 2); + return sub_8061B58(mapObject, sprite); +} + +bool8 sub_8061B58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061B98(struct MapObject *, struct Sprite *); + +bool8 sub_8061B78(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 2); + return sub_8061B98(mapObject, sprite); +} + +bool8 sub_8061B98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061BD8(struct MapObject *, struct Sprite *); + +bool8 sub_8061BB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 2); + return sub_8061BD8(mapObject, sprite); +} + +bool8 sub_8061BD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061C18(struct MapObject *, struct Sprite *); + +bool8 sub_8061BF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 3); + return sub_8061C18(mapObject, sprite); +} + +bool8 sub_8061C18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061C58(struct MapObject *, struct Sprite *); + +bool8 sub_8061C38(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 3); + return sub_8061C58(mapObject, sprite); +} + +bool8 sub_8061C58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061C98(struct MapObject *, struct Sprite *); + +bool8 sub_8061C78(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 3); + return sub_8061C98(mapObject, sprite); +} + +bool8 sub_8061C98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061CD8(struct MapObject *, struct Sprite *); + +bool8 sub_8061CB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 3); + return sub_8061CD8(mapObject, sprite); +} + +bool8 sub_8061CD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061D18(struct MapObject *, struct Sprite *); + +bool8 sub_8061CF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 4); + return sub_8061D18(mapObject, sprite); +} + +bool8 sub_8061D18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061D58(struct MapObject *, struct Sprite *); + +bool8 sub_8061D38(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 4); + return sub_8061D58(mapObject, sprite); +} + +bool8 sub_8061D58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061D98(struct MapObject *, struct Sprite *); + +bool8 sub_8061D78(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 4); + return sub_8061D98(mapObject, sprite); +} + +bool8 sub_8061D98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061DD8(struct MapObject *, struct Sprite *); + +bool8 sub_8061DB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 4); + return sub_8061DD8(mapObject, sprite); +} + +bool8 sub_8061DD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061E18(struct MapObject *, struct Sprite *); + +bool8 do_run_south_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_SOUTH); + return sub_8061E18(mapObject, sprite); +} + +bool8 sub_8061E18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061E58(struct MapObject *, struct Sprite *); + +bool8 do_run_north_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_NORTH); + return sub_8061E58(mapObject, sprite); +} + +bool8 sub_8061E58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061E98(struct MapObject *, struct Sprite *); + +bool8 do_run_west_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_WEST); + return sub_8061E98(mapObject, sprite); +} + +bool8 sub_8061E98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061ED8(struct MapObject *, struct Sprite *); + +bool8 do_run_east_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_EAST); + return sub_8061ED8(mapObject, sprite); +} + +bool8 sub_8061ED8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum) +{ + obj_anim_image_set_and_seek(sprite, animNum, 0); + FieldObjectSetDirection(mapObject, direction); + sprite->data2 = 1; +} + +bool8 sub_8061F24(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, mapObject->placeholder18, sprite->animNum); + return FALSE; +} + +bool8 sub_8064864(struct Sprite *); + +bool8 sub_8061F3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064864(sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +void sub_8061F5C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + sub_806113C(mapObject, sprite, direction, 1, 0); + StartSpriteAnim(sprite, sub_805FD88(direction)); +} + +bool8 sub_8061FB0(struct MapObject *, struct Sprite *); + +bool8 sub_8061F90(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_SOUTH); + return sub_8061FB0(mapObject, sprite); +} + +bool8 sub_8061FB0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data2 = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061FF8(struct MapObject *, struct Sprite *); + +bool8 sub_8061FD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_NORTH); + return sub_8061FF8(mapObject, sprite); +} + +bool8 sub_8061FF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data2 = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062040(struct MapObject *, struct Sprite *); + +bool8 sub_8062020(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_WEST); + return sub_8062040(mapObject, sprite); +} + +bool8 sub_8062040(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data2 = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062088(struct MapObject *, struct Sprite *); + +bool8 sub_8062068(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_EAST); + return sub_8062088(mapObject, sprite); +} + +bool8 sub_8062088(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data2 = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_80620B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 objectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, &objectId)) + { + an_look_any(mapObject, sprite, sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y)); + } + sprite->data2 = 1; + return TRUE; +} + +bool8 sub_806210C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 objectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, &objectId)) + { + an_look_any(mapObject, sprite, GetOppositeDirection(sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y))); + } + sprite->data2 = 1; + return TRUE; +} + +bool8 sub_8062170(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_9 = 1; + sprite->data2 = 1; + return TRUE; +} + +bool8 sub_8062180(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_9 = 0; + sprite->data2 = 1; + return TRUE; +} + +bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062190(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 1, 2); + return sub_80621BC(mapObject, sprite); +} + +bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80621E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 1, 2); + return sub_8062214(mapObject, sprite); +} + +bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062240(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 1, 2); + return sub_806226C(mapObject, sprite); +} + +bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062298(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 1, 2); + return sub_80622C4(mapObject, sprite); +} + +bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80622F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 0); + return sub_806231C(mapObject, sprite); +} + +bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062348(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 0); + return sub_8062374(mapObject, sprite); +} + +bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80623A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 0); + return sub_80623CC(mapObject, sprite); +} + +bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80623F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 0); + return sub_8062424(mapObject, sprite); +} + +bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062450(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 2); + return sub_806247C(mapObject, sprite); +} + +bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80624A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 2); + return sub_80624D4(mapObject, sprite); +} + +bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062500(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 2); + return sub_806252C(mapObject, sprite); +} + +bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062558(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 2); + return sub_8062584(mapObject, sprite); +} + +bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80625B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, gUnknown_0836DC09[mapObject->animPattern]); + return TRUE; +} + +bool8 sub_80625C8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, 0x14); + return FALSE; +} + +bool8 sub_80625D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_25 = 0; + sprite->data2 = 1; + return TRUE; +} + +bool8 sub_80625E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_25 = 1; + sprite->data2 = 1; + return TRUE; +} + +bool8 sub_80625F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_12 = 1; + sprite->data2 = 1; + return TRUE; +} + +bool8 sub_8062608(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate; + sprite->data2 = 1; + return TRUE; +} + +bool8 sub_8062634(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 = 1; + sprite->data2 = 1; + return TRUE; +} + +bool8 sub_8062644(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 = 0; + sprite->data2 = 1; + return TRUE; +} + +bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); + FieldEffectStart(0x0); + sprite->data2 = 1; + return TRUE; +} + +bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); + FieldEffectStart(0x21); + sprite->data2 = 1; + return TRUE; +} + +bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); + FieldEffectStart(0x2e); + sprite->data2 = 1; + return TRUE; +} + +bool8 sub_8062704(struct MapObject *, struct Sprite *); + +bool8 sub_80626C0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (mapObject->animPattern == 0x3F) + { + sub_8084794(mapObject); + return FALSE; + } + else if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A) + { + sprite->data2 = 2; + return TRUE; + } + else + { + sub_812869C(mapObject); + sprite->data2 = 1; + return sub_8062704(mapObject, sprite); + } +} + +bool8 sub_8062704(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_81286C4(mapObject)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062724(struct MapObject *mapObject, struct Sprite *sprite) +{ + obj_anim_image_set_and_seek(sprite, 1, 0); + sprite->data2 = 1; + return FALSE; +} + +bool8 sub_8062740(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064864(sprite)) + { + sub_8064820(sprite, 0x20); + sprite->data2 = 2; + } + return FALSE; +} + +bool8 sub_8062764(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 ^= 1; + if (sub_8064824(sprite)) + { + mapObject->mapobj_bit_13 = 1; + sprite->data2 = 3; + } + return FALSE; +} + +bool8 sub_80627A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + obj_anim_image_set_and_seek(sprite, 1, 0); + sprite->data2 = 1; + return FALSE; +} + +bool8 sub_80627BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064864(sprite)) + { + sub_8064820(sprite, 0x20); + sprite->data2 = 2; + } + return FALSE; +} + +bool8 sub_80627E0(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 ^= 1; + if (sub_8064824(sprite)) + { + mapObject->mapobj_bit_13 = 1; + sprite->data2 = 3; + } + return FALSE; +} + +bool8 sub_806281C(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_26 = 1; + sprite->data2 = 1; + return TRUE; +} + +bool8 sub_806282C(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_26 = 0; + sprite->data2 = 1; + return TRUE; +} + +bool8 sub_806283C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->oam.affineMode = 3; + InitSpriteAffineAnim(sprite); + sprite->affineAnimPaused = 1; + sprite->subspriteMode = 0; + return TRUE; +} + +bool8 sub_806286C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = 0; + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); + return TRUE; +} + +bool8 sub_80628D0(struct MapObject *, struct Sprite *); + +bool8 sub_806289C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_SOUTH); + sprite->affineAnimPaused = 0; + StartSpriteAffineAnimIfDifferent(sprite, 0); + return sub_80628D0(mapObject, sprite); +} + +bool8 sub_80628D0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->affineAnimPaused = 1; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062930(struct MapObject *, struct Sprite *); + +bool8 sub_80628FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_SOUTH); + sprite->affineAnimPaused = 0; + ChangeSpriteAffineAnimIfDifferent(sprite, 1); + return sub_8062930(mapObject, sprite); +} + +bool8 sub_8062930(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->affineAnimPaused = 1; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +void sub_806295C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + FieldObjectSetDirection(mapObject, direction); + npc_coords_shift_still(mapObject); + sub_805FE64(mapObject, sprite, sub_805FDD8(direction)); + sprite->animPaused = 1; + sprite->data2 = 1; +} + +bool8 sub_806299C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_SOUTH); + return TRUE; +} + +bool8 sub_80629AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_NORTH); + return TRUE; +} + +bool8 sub_80629BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_WEST); + return TRUE; +} + +bool8 sub_80629CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_EAST); + return TRUE; +} + +bool8 sub_80629DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FD98(DIR_SOUTH)); + return FALSE; +} + +bool8 sub_8062A00(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FD98(DIR_NORTH)); + return FALSE; +} + +bool8 sub_8062A24(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FD98(DIR_WEST)); + return FALSE; +} + +bool8 sub_8062A48(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FD98(DIR_EAST)); + return FALSE; +} + +bool8 sub_8062A6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDB8(DIR_SOUTH)); + return FALSE; +} + +bool8 sub_8062A90(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDB8(DIR_NORTH)); + return FALSE; +} + +bool8 sub_8062AB4(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDB8(DIR_WEST)); + return FALSE; +} + +bool8 sub_8062AD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDB8(DIR_EAST)); + return FALSE; +} + +bool8 sub_8062AFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDC8(DIR_SOUTH)); + return FALSE; +} + +bool8 sub_8062B20(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDC8(DIR_NORTH)); + return FALSE; +} + +bool8 sub_8062B44(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDC8(DIR_WEST)); + return FALSE; +} + +bool8 sub_8062B68(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDC8(DIR_EAST)); + return FALSE; +} + +void sub_8062B8C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3, u8 a4) +{ + sub_806113C(mapObject, sprite, direction, a3, a4); + StartSpriteAnimIfDifferent(sprite, sub_805FD98(direction)); + DoShadowFieldEffect(mapObject); +} + +bool8 sub_8062BFC(struct MapObject *, struct Sprite *); + +bool8 sub_8062BD0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_SOUTH, 0, 1); + return sub_8062BFC(mapObject, sprite); +} + +bool8 sub_8062BFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062C54(struct MapObject *, struct Sprite *); + +bool8 sub_8062C28(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_NORTH, 0, 1); + return sub_8062C54(mapObject, sprite); +} + +bool8 sub_8062C54(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062CAC(struct MapObject *, struct Sprite *); + +bool8 sub_8062C80(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_WEST, 0, 1); + return sub_8062CAC(mapObject, sprite); +} + +bool8 sub_8062CAC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062D04(struct MapObject *, struct Sprite *); + +bool8 sub_8062CD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_EAST, 0, 1); + return sub_8062D04(mapObject, sprite); +} + +bool8 sub_8062D04(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062D5C(struct MapObject *, struct Sprite *); + +bool8 sub_8062D30(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_SOUTH, 1, 1); + return sub_8062D5C(mapObject, sprite); +} + +bool8 sub_8062D5C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062DB4(struct MapObject *, struct Sprite *); + +bool8 sub_8062D88(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_NORTH, 1, 1); + return sub_8062DB4(mapObject, sprite); +} + +bool8 sub_8062DB4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062E0C(struct MapObject *, struct Sprite *); + +bool8 sub_8062DE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_WEST, 1, 1); + return sub_8062E0C(mapObject, sprite); +} + +bool8 sub_8062E0C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062E64(struct MapObject *, struct Sprite *); + +bool8 sub_8062E38(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_EAST, 1, 1); + return sub_8062E64(mapObject, sprite); +} + +bool8 sub_8062E64(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062EBC(struct MapObject *, struct Sprite *); + +bool8 sub_8062E90(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_SOUTH, 2, 0); + return sub_8062EBC(mapObject, sprite); +} + +bool8 sub_8062EBC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062F14(struct MapObject *, struct Sprite *); + +bool8 sub_8062EE8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_NORTH, 2, 0); + return sub_8062F14(mapObject, sprite); +} + +bool8 sub_8062F14(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062F6C(struct MapObject *, struct Sprite *); + +bool8 sub_8062F40(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_WEST, 2, 0); + return sub_8062F6C(mapObject, sprite); +} + +bool8 sub_8062F6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062FC4(struct MapObject *, struct Sprite *); + +bool8 sub_8062F98(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_EAST, 2, 0); + return sub_8062FC4(mapObject, sprite); +} + +bool8 sub_8062FC4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062FF0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, sub_805FDD8(DIR_SOUTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8063028(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, sub_805FDD8(DIR_NORTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8063060(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, sub_805FDD8(DIR_WEST), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8063098(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, sub_805FDD8(DIR_EAST), 8); + return sub_8061714(mapObject, sprite); +} + +void sub_80630D0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + sub_8060D20(mapObject, sprite, direction, a3); + StartSpriteAnim(sprite, sub_805FD98(mapObject->mapobj_unk_18)); + SeekSpriteAnim(sprite, 0); +} + +bool8 sub_8063128(struct MapObject *, struct Sprite *); + +bool8 sub_8063108(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_SOUTH, 1); + return sub_8063128(mapObject, sprite); +} + +bool8 sub_8063128(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063168(struct MapObject *, struct Sprite *); + +bool8 sub_8063148(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_NORTH, 1); + return sub_8063168(mapObject, sprite); +} + +bool8 sub_8063168(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80631A8(struct MapObject *, struct Sprite *); + +bool8 sub_8063188(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_WEST, 1); + return sub_80631A8(mapObject, sprite); +} + +bool8 sub_80631A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80631E8(struct MapObject *, struct Sprite *); + +bool8 sub_80631C8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_EAST, 1); + return sub_80631E8(mapObject, sprite); +} + +bool8 sub_80631E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +void sub_8063208(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + sub_8060D20(mapObject, sprite, direction, a3); + sub_805FE28(mapObject, sprite, sub_805FDD8(mapObject->mapobj_unk_18)); +} + +bool8 sub_8063258(struct MapObject *, struct Sprite *); + +bool8 sub_8063238(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_SOUTH, 1); + return sub_8063258(mapObject, sprite); +} + +bool8 sub_8063258(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063298(struct MapObject *, struct Sprite *); + +bool8 sub_8063278(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_NORTH, 1); + return sub_8063298(mapObject, sprite); +} + +bool8 sub_8063298(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80632D8(struct MapObject *, struct Sprite *); + +bool8 sub_80632B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_WEST, 1); + return sub_80632D8(mapObject, sprite); +} + +bool8 sub_80632D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063318(struct MapObject *, struct Sprite *); + +bool8 sub_80632F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_EAST, 1); + return sub_8063318(mapObject, sprite); +} + +bool8 sub_8063318(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +void sub_8063338(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + sub_8060D20(mapObject, sprite, direction, a3); + StartSpriteAnim(sprite, sub_805FDB8(mapObject->mapobj_unk_18)); + SeekSpriteAnim(sprite, 0); +} + +bool8 sub_8063390(struct MapObject *, struct Sprite *); + +bool8 sub_8063370(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_SOUTH, 1); + return sub_8063390(mapObject, sprite); +} + +bool8 sub_8063390(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80633D0(struct MapObject *, struct Sprite *); + +bool8 sub_80633B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_NORTH, 1); + return sub_80633D0(mapObject, sprite); +} + +bool8 sub_80633D0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063410(struct MapObject *, struct Sprite *); + +bool8 sub_80633F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_WEST, 1); + return sub_8063410(mapObject, sprite); +} + +bool8 sub_8063410(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063450(struct MapObject *, struct Sprite *); + +bool8 sub_8063430(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_EAST, 1); + return sub_8063450(mapObject, sprite); +} + +bool8 sub_8063450(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data2 = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063470(struct MapObject *mapObject, struct Sprite *sprite) +{ + return TRUE; +} + +bool8 sub_8063474(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->animPaused = 1; + return TRUE; +} + +void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (mapObject->mapobj_bit_10) + { + sprite->animPaused = 1; + } +} + +void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (mapObject->mapobj_bit_11) + { + sprite->animPaused = 0; + mapObject->mapobj_bit_10 = 0; + mapObject->mapobj_bit_11 = 0; + } +} + +void sub_80634E8(struct MapObject *, struct Sprite *); +void npc_update_obj_anim_flag(struct MapObject *, struct Sprite *); + +void sub_80634D0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80634E8(mapObject, sprite); + npc_update_obj_anim_flag(mapObject, sprite); +} + +#ifdef NONMATCHING +void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + u16 x; + u16 y; + s16 x2; + s16 y2; + const struct MapObjectGraphicsInfo *graphicsInfo; + mapObject->mapobj_bit_14 = 0; + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (sprite->coordOffsetEnabled) + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } else + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + } + x2 = graphicsInfo->width + x; // offending line + y2 = graphicsInfo->height + y; // similarly offending line + if ((s16)x >= 0x100 || x2 < -0x10) + { + mapObject->mapobj_bit_14 = 1; + } + if ((s16)y >= 0xB0 || y2 < -0x10) + { + mapObject->mapobj_bit_14 = 1; + } +} +#else +__attribute__((naked)) +void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + adds r5, r0, 0\n\ + adds r4, r1, 0\n\ + ldrb r1, [r5, 0x1]\n\ + movs r0, 0x41\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r5, 0x1]\n\ + ldrb r0, [r5, 0x5]\n\ + bl GetFieldObjectGraphicsInfo\n\ + adds r6, r0, 0\n\ + adds r0, r4, 0\n\ + adds r0, 0x3E\n\ + ldrb r1, [r0]\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0806354C\n\ + ldrh r1, [r4, 0x24]\n\ + ldrh r0, [r4, 0x20]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x28\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + ldr r2, _08063544 @ =gSpriteCoordOffsetX\n\ + adds r0, r1\n\ + ldrh r2, [r2]\n\ + adds r0, r2\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldrh r1, [r4, 0x26]\n\ + ldrh r0, [r4, 0x22]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x29\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + ldr r2, _08063548 @ =gSpriteCoordOffsetY\n\ + adds r0, r1\n\ + ldrh r2, [r2]\n\ + adds r0, r2\n\ + b _08063574\n\ + .align 2, 0\n\ +_08063544: .4byte gSpriteCoordOffsetX\n\ +_08063548: .4byte gSpriteCoordOffsetY\n\ +_0806354C:\n\ + ldrh r1, [r4, 0x24]\n\ + ldrh r0, [r4, 0x20]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x28\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + adds r0, r1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldrh r1, [r4, 0x26]\n\ + ldrh r0, [r4, 0x22]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x29\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + adds r0, r1\n\ +_08063574:\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + ldrh r0, [r6, 0x8]\n\ + adds r0, r3\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + ldrh r0, [r6, 0xA]\n\ + adds r0, r2\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + cmp r0, 0xFF\n\ + bgt _0806359C\n\ + lsls r0, r1, 16\n\ + asrs r0, 16\n\ + movs r1, 0x10\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + bge _080635A4\n\ +_0806359C:\n\ + ldrb r0, [r5, 0x1]\n\ + movs r1, 0x40\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x1]\n\ +_080635A4:\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + cmp r0, 0xAF\n\ + bgt _080635B8\n\ + lsls r0, r4, 16\n\ + asrs r0, 16\n\ + movs r1, 0x10\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + bge _080635C0\n\ +_080635B8:\n\ + ldrb r0, [r5, 0x1]\n\ + movs r1, 0x40\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x1]\n\ +_080635C0:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ +.syntax divided\n"); +} +#endif + +void npc_update_obj_anim_flag(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->invisible = 0; + if (mapObject->mapobj_bit_13 || mapObject->mapobj_bit_14) + { + sprite->invisible = 1; + } +} diff --git a/src/field/field_map_obj_helpers.c b/src/field/field_map_obj_helpers.c new file mode 100644 index 000000000..87be8e011 --- /dev/null +++ b/src/field/field_map_obj_helpers.c @@ -0,0 +1,318 @@ +#include "global.h" +#include "field_map_obj_helpers.h" +#include "field_effect.h" +#include "field_ground_effect.h" +#include "field_map_obj.h" +#include "sprite.h" + +typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir); + +extern s16 gUnknown_08376194[]; +extern SpriteStepFunc *gUnknown_08376180[]; +extern s8 *gUnknown_083761D0[]; +extern s16 gUnknown_083761DC[]; +extern u8 gUnknown_083761E2[]; +extern s16 gUnknown_083761E6[]; +extern u8 gUnknown_083761EC[]; + +bool8 FreezeMapObject(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8) + { + return TRUE; + } + else + { + mapObject->mapobj_bit_8 = 1; + mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused; + mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused; + gSprites[mapObject->spriteId].animPaused = 1; + gSprites[mapObject->spriteId].affineAnimPaused = 1; + return FALSE; + } +} + +void FreezeMapObjects(void) +{ + u8 i; + for (i = 0; i < 16; i++) + if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) + FreezeMapObject(&gMapObjects[i]); +} + +void FreezeMapObjectsExceptOne(u8 a1) +{ + u8 i; + for (i = 0; i < 16; i++) + if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) + FreezeMapObject(&gMapObjects[i]); +} + +void UnfreezeMapObject(struct MapObject *mapObject) +{ + if (mapObject->active && mapObject->mapobj_bit_8) + { + mapObject->mapobj_bit_8 = 0; + gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23; + gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24; + } +} + +void UnfreezeMapObjects(void) +{ + u8 i; + for (i = 0; i < 16; i++) + if (gMapObjects[i].active) + UnfreezeMapObject(&gMapObjects[i]); +} + +void Step1(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += gDirectionToVector[dir].x; + sprite->pos1.y += gDirectionToVector[dir].y; +} + +void Step2(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y; +} + +void Step3(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y; +} + +void Step4(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y; +} + +void Step8(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 8 * (u16) gDirectionToVector[dir].y; +} + +void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3) +{ + sprite->data3 = a2; + sprite->data4 = a3; + sprite->data5 = 0; +} + +bool8 obj_npc_ministep(struct Sprite *sprite) +{ + if (sprite->data5 >= gUnknown_08376194[sprite->data4]) + return FALSE; + + gUnknown_08376180[sprite->data4][sprite->data5](sprite, sprite->data3); + + sprite->data5++; + + if (sprite->data5 < gUnknown_08376194[sprite->data4]) + return FALSE; + + return TRUE; +} + +void sub_806467C(struct Sprite *sprite, u8 a2) +{ + sprite->data3 = a2; + sprite->data4 = 0; + sprite->data5 = 0; +} + +bool8 sub_806468C(struct Sprite *sprite) +{ + if (!(sprite->data4 & 1)) + { + Step1(sprite, sprite->data3); + sprite->data5++; + } + + sprite->data4++; + + if (sprite->data5 > 15) + return TRUE; + else + return FALSE; +} + +s16 sub_80646C8(s16 a1, u8 a2) +{ + return gUnknown_083761D0[a2][a1]; +} + +void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4) +{ + sprite->data3 = a2; + sprite->data4 = a3; + sprite->data5 = a4; + sprite->data6 = 0; +} + +u8 sub_8064704(struct Sprite *sprite) +{ + u8 v2; + s16 v5[3]; + u8 v6[3]; + + memcpy(v5, gUnknown_083761DC, 6); + memcpy(v6, gUnknown_083761E2, 3); + + v2 = 0; + + if (sprite->data4) + Step1(sprite, sprite->data3); + + sprite->pos2.y = sub_80646C8(sprite->data6 >> v6[sprite->data4], sprite->data5); + + sprite->data6++; + + if (sprite->data6 == (v5[sprite->data4] >> 1)) + v2 = 1; + + if (sprite->data6 >= v5[sprite->data4]) + { + sprite->pos2.y = 0; + v2 = -1; + } + + return v2; +} + +u8 sub_806478C(struct Sprite *sprite) +{ + u8 v2; + s16 v5[3]; + u8 v6[3]; + + memcpy(v5, gUnknown_083761E6, 6); + memcpy(v6, gUnknown_083761EC, 3); + + v2 = 0; + + if (sprite->data4 && !(sprite->data6 & 1)) + Step1(sprite, sprite->data3); + + sprite->pos2.y = sub_80646C8(sprite->data6 >> v6[sprite->data4], sprite->data5); + + sprite->data6++; + + if (sprite->data6 == (v5[sprite->data4] >> 1)) + v2 = 1; + + if (sprite->data6 >= v5[sprite->data4]) + { + sprite->pos2.y = 0; + v2 = -1; + } + + return v2; +} + +void sub_8064820(struct Sprite *sprite, u16 a2) +{ + sprite->data3 = a2; +} + +bool8 sub_8064824(struct Sprite *sprite) +{ + sprite->data3--; + + if (sprite->data3 == 0) + return TRUE; + else + return FALSE; +} + +void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3) +{ + sprite->animNum = a2; + sprite->animPaused = 0 ; + SeekSpriteAnim(sprite, a3); +} + +bool8 sub_8064864(struct Sprite *sprite) +{ + if (sprite->animEnded) + return TRUE; + else + return FALSE; +} + +void sub_806487C(struct Sprite *sprite, bool8 invisible) +{ + u16 x, y; + s16 x2, y2; + + sprite->invisible = invisible; + + if (sprite->coordOffsetEnabled) + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } + else + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + } + + x2 = x - (sprite->centerToCornerVecX >> 1); + y2 = y - (sprite->centerToCornerVecY >> 1); + + if ((s16)x > 255 || x2 < -16) + sprite->invisible = 1; + if ((s16)y > 175 || y2 < -16) + sprite->invisible = 1; +} + +void sub_8064970(struct Sprite *sprite) +{ + SetObjectSubpriorityByZCoord(sprite->data1, sprite, 1); + sub_806487C(sprite, 0); +} + +void sub_8064990(u8 a1, u8 dir) +{ + u8 i; + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data0 == a1) + { + u8 animNum = FieldObjectDirectionToImageAnimId(dir); + StartSpriteAnim(sprite, animNum); + break; + } + } +} + +u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject) +{ + FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); + return FieldEffectStart(fieldEffectId); +} + +void DoShadowFieldEffect(struct MapObject *mapObject) +{ + if (!mapObject->mapobj_bit_22) + { + mapObject->mapobj_bit_22 = 1; + oe_exec_and_other_stuff(3, mapObject); + } +} + +void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite) +{ + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + gUnknown_0202FF84[0] = sprite->pos1.x; + gUnknown_0202FF84[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2; + gUnknown_0202FF84[2] = 151; + gUnknown_0202FF84[3] = 3; + FieldEffectStart(5); +} diff --git a/src/field/field_message_box.c b/src/field/field_message_box.c new file mode 100644 index 000000000..35aac7ac9 --- /dev/null +++ b/src/field/field_message_box.c @@ -0,0 +1,155 @@ +#include "global.h" +#include "field_message_box.h" +#include "menu.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "text_window.h" + +static EWRAM_DATA struct Window gFieldMessageBoxWindow = {0}; + +static u8 sMessageBoxMode; + +static void Task_FieldMessageBox(u8 taskId); +static void CreateFieldMessageBoxTask(void); +static void DestroyFieldMessageBoxTask(void); +static void PrintFieldMessage(const u8 *message); +static void PrintFieldMessageFromStringVar4(void); + +void InitFieldMessageBox(void) +{ + sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; + SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); + InitWindowFromConfig(&gFieldMessageBoxWindow, &gWindowConfig_81E6CE4); +} + +static void Task_FieldMessageBox(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + switch (task->data[0]) + { + case 0: + LoadMessageBoxTiles(&gFieldMessageBoxWindow); + task->data[0]++; + break; + case 1: + DrawStandardMessageBox(&gFieldMessageBoxWindow); + task->data[0]++; + break; + case 2: + switch (sMessageBoxMode) + { + case FIELD_MESSAGE_BOX_NORMAL: + if (!sub_80035AC(&gFieldMessageBoxWindow)) + return; + break; + case FIELD_MESSAGE_BOX_AUTO_SCROLL: + if (!sub_8003778(&gFieldMessageBoxWindow)) + return; + break; + } + sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; + DestroyTask(taskId); + } +} + +static void CreateFieldMessageBoxTask(void) +{ + CreateTask(Task_FieldMessageBox, 80); +} + +static void DestroyFieldMessageBoxTask(void) +{ + u8 taskId = FindTaskIdByFunc(Task_FieldMessageBox); + if (taskId != 0xFF) + DestroyTask(taskId); +} + +bool8 ShowFieldMessage(const u8 *message) +{ + if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) + { + return FALSE; + } + else + { + PrintFieldMessage(message); + sMessageBoxMode = FIELD_MESSAGE_BOX_NORMAL; + return TRUE; + } +} + +bool8 ShowFieldAutoScrollMessage(const u8 *message) +{ + if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) + { + return FALSE; + } + else + { + sMessageBoxMode = FIELD_MESSAGE_BOX_AUTO_SCROLL; + PrintFieldMessage(message); + return TRUE; + } +} + +bool8 unref_sub_8064BB8(const u8 *message) +{ + sMessageBoxMode = FIELD_MESSAGE_BOX_AUTO_SCROLL; + PrintFieldMessage(message); + return TRUE; +} + +bool8 unref_sub_8064BD0(const u8 *message) +{ + if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) + { + return FALSE; + } + else + { + sMessageBoxMode = FIELD_MESSAGE_BOX_NORMAL; + PrintFieldMessageFromStringVar4(); + return TRUE; + } +} + +static void PrintFieldMessage(const u8 *message) +{ + StringExpandPlaceholders(gStringVar4, message); + sub_8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); + CreateFieldMessageBoxTask(); +} + +static void PrintFieldMessageFromStringVar4(void) +{ + sub_8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); + CreateFieldMessageBoxTask(); +} + +void HideFieldMessageBox(void) +{ + DestroyFieldMessageBoxTask(); + ClearStandardMessageBox(&gFieldMessageBoxWindow); + sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; +} + +u8 GetFieldMessageBoxMode(void) +{ + return sMessageBoxMode; +} + +bool8 IsFieldMessageBoxHidden(void) +{ + if (sMessageBoxMode == FIELD_MESSAGE_BOX_HIDDEN) + return TRUE; + else + return FALSE; +} + +void unref_sub_8064CA0(void) +{ + DestroyFieldMessageBoxTask(); + DrawStandardMessageBox(&gFieldMessageBoxWindow); + sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; +} diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c new file mode 100644 index 000000000..2a7b2f3e0 --- /dev/null +++ b/src/field/field_player_avatar.c @@ -0,0 +1,1728 @@ +#include "global.h" +#include "field_player_avatar.h" +#include "bike.h" +#include "event_data.h" +#include "field_effect.h" +#include "field_effect_helpers.h" +#include "field_ground_effect.h" +#include "field_map_obj.h" +#include "field_map_obj_helpers.h" +#include "fieldmap.h" +#include "main.h" +#include "map_object_constants.h" +#include "menu.h" +#include "metatile_behavior.h" +#include "party_menu.h" +#include "rng.h" +#include "rom4.h" +#include "rotating_gate.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "strings2.h" +#include "task.h" +#include "tv.h" +#include "wild_encounter.h" + +EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {0}; + +//Functions +static bool8 sub_8058854(struct MapObject *, u8); +static void npc_clear_strange_bits(struct MapObject *a); +static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c); +static void PlayerAllowForcedMovementIfMovingSameDirection(void); +static u8 TryDoMetatileBehaviorForcedMovement(void); +static u8 GetForcedMovementByMetatileBehavior(void); +static void MovePlayerNotOnBike(u8 a, u16 b); +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); +static u8 sub_8058F6C(s16 a, s16 b, u8 c); +static void check_acro_bike_metatile(int unused1, int unused2, u8 c, u8 *d); +static void DoPlayerAvatarTransition(void); +static bool8 player_is_anim_in_certain_ranges(void); +static bool8 sub_80592A4(void); +static bool8 PlayerIsAnimActive(void); +static bool8 PlayerCheckIfAnimFinishedOrInactive(void); +static void PlayerNotOnBikeCollide(u8 a); +static void PlayCollisionSoundIfNotFacingWarp(u8 a); +static void sub_8059D60(struct MapObject *a); +static void StartStrengthAnim(u8 a, u8 b); +static void sub_8059F94(void); +static void sub_805A06C(void); + +static bool8 (*const gUnknown_0830FB58[])(u8) = +{ + MetatileBehavior_IsTrickHouseSlipperyFloor, + MetatileBehavior_IsIce_2, + MetatileBehavior_IsWalkSouth, + MetatileBehavior_IsWalkNorth, + MetatileBehavior_IsWalkWest, + MetatileBehavior_IsWalkEast, + MetatileBehavior_IsSouthwardCurrent, + MetatileBehavior_IsNorthwardCurrent, + MetatileBehavior_IsWestwardCurrent, + MetatileBehavior_IsEastwardCurrent, + MetatileBehavior_IsSlideSouth, + MetatileBehavior_IsSlideNorth, + MetatileBehavior_IsSlideWest, + MetatileBehavior_IsSlideEast, + MetatileBehavior_IsWaterfall, + MetatileBehavior_0xBB, + MetatileBehavior_0xBC, + MetatileBehavior_IsMuddySlope, +}; +static u8 (*const gUnknown_0830FBA0[])(void) = +{ + ForcedMovement_None, + ForcedMovement_Slip, + ForcedMovement_Slip, + sub_8058AAC, + sub_8058AC4, + sub_8058ADC, + sub_8058AF4, + sub_8058B0C, + sub_8058B24, + sub_8058B3C, + sub_8058B54, + ForcedMovement_SlideSouth, + ForcedMovement_SlideNorth, + ForcedMovement_SlideWest, + ForcedMovement_SlideEast, + sub_8058B0C, + sub_8058C04, + sub_8058C10, + ForcedMovement_MuddySlope, +}; +static void (*const gUnknown_0830FBEC[])(u8, u16) = +{ + PlayerNotOnBikeNotMoving, + PlayerNotOnBikeTurningInPlace, + sub_8058D0C, +}; +static bool8 (*const gUnknown_0830FBF8[])(u8) = +{ + MetatileBehavior_IsBumpySlope, + MetatileBehavior_IsIsolatedVerticalRail, + MetatileBehavior_IsIsolatedHorizontalRail, + MetatileBehavior_IsVerticalRail, + MetatileBehavior_IsHorizontalRail, +}; +static const u8 gUnknown_0830FC0C[] = {9, 10, 11, 12, 13}; +static void (*const gUnknown_0830FC14[])(struct MapObject *) = +{ + PlayerAvatarTransition_Normal, + PlayerAvatarTransition_MachBike, + PlayerAvatarTransition_AcroBike, + PlayerAvatarTransition_Surfing, + PlayerAvatarTransition_Underwater, + sub_80591F4, + nullsub_49, + nullsub_49, +}; +static bool8 (*const gUnknown_0830FC34[])(u8) = +{ + MetatileBehavior_IsSouthArrowWarp, + MetatileBehavior_IsNorthArrowWarp, + MetatileBehavior_IsWestArrowWarp, + MetatileBehavior_IsEastArrowWarp, +}; +static const u8 sRivalAvatarGfxIds[][2] = +{ + {MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL, MAP_OBJ_GFX_RIVAL_MAY_NORMAL}, + {MAP_OBJ_GFX_RIVAL_BRENDAN_MACH_BIKE, MAP_OBJ_GFX_RIVAL_MAY_MACH_BIKE}, + {MAP_OBJ_GFX_RIVAL_BRENDAN_ACRO_BIKE, MAP_OBJ_GFX_RIVAL_MAY_ACRO_BIKE}, + {MAP_OBJ_GFX_RIVAL_BRENDAN_SURFING, MAP_OBJ_GFX_RIVAL_MAY_SURFING}, + {MAP_OBJ_GFX_BRENDAN_UNDERWATER, MAP_OBJ_GFX_MAY_UNDERWATER}, + {MAP_OBJ_GFX_RIVAL_BRENDAN_FIELD_MOVE, MAP_OBJ_GFX_RIVAL_MAY_FIELD_MOVE}, + {MAP_OBJ_GFX_BRENDAN_FISHING, MAP_OBJ_GFX_MAY_FISHING}, + {MAP_OBJ_GFX_BRENDAN_WATERING, MAP_OBJ_GFX_MAY_WATERING}, +}; +static const u8 sPlayerAvatarGfxIds[][2] = +{ + {MAP_OBJ_GFX_BRENDAN_NORMAL, MAP_OBJ_GFX_MAY_NORMAL}, + {MAP_OBJ_GFX_BRENDAN_MACH_BIKE, MAP_OBJ_GFX_MAY_MACH_BIKE}, + {MAP_OBJ_GFX_BRENDAN_ACRO_BIKE, MAP_OBJ_GFX_MAY_ACRO_BIKE}, + {MAP_OBJ_GFX_BRENDAN_SURFING, MAP_OBJ_GFX_MAY_SURFING}, + {MAP_OBJ_GFX_BRENDAN_UNDERWATER, MAP_OBJ_GFX_MAY_UNDERWATER}, + {MAP_OBJ_GFX_BRENDAN_FIELD_MOVE, MAP_OBJ_GFX_MAY_FIELD_MOVE}, + {MAP_OBJ_GFX_BRENDAN_FISHING, MAP_OBJ_GFX_MAY_FISHING}, + {MAP_OBJ_GFX_BRENDAN_WATERING, MAP_OBJ_GFX_MAY_WATERING}, +}; +static const u8 gUnknown_0830FC64[2][5][2] = +{ + //male + { + {MAP_OBJ_GFX_BRENDAN_NORMAL, 1}, + {MAP_OBJ_GFX_BRENDAN_MACH_BIKE, 2}, + {MAP_OBJ_GFX_BRENDAN_ACRO_BIKE, 4}, + {MAP_OBJ_GFX_BRENDAN_SURFING, 8}, + {MAP_OBJ_GFX_BRENDAN_UNDERWATER, 16}, + }, + //female + { + {MAP_OBJ_GFX_MAY_NORMAL, 1}, + {MAP_OBJ_GFX_MAY_MACH_BIKE, 2}, + {MAP_OBJ_GFX_MAY_ACRO_BIKE, 4}, + {MAP_OBJ_GFX_MAY_SURFING, 8}, + {MAP_OBJ_GFX_MAY_UNDERWATER, 16}, + } +}; +static bool8 (*const gUnknown_0830FC78[])(u8) = //Duplicate of gUnknown_0830FC34 +{ + MetatileBehavior_IsSouthArrowWarp, + MetatileBehavior_IsNorthArrowWarp, + MetatileBehavior_IsWestArrowWarp, + MetatileBehavior_IsEastArrowWarp, +}; +static u8 (*const gUnknown_0830FC88[])(struct Task *, struct MapObject *, struct MapObject *) = +{ + sub_8059E84, + sub_8059EA4, + sub_8059F40, +}; +static u8 (*const gUnknown_0830FC94[])(struct Task *, struct MapObject *) = +{ + sub_805A000, +}; +static u8 (*const gUnknown_0830FC98[])(struct Task *, struct MapObject *) = +{ + sub_805A0D8, + sub_805A100, + sub_805A178, + sub_805A1B8, +}; + +fieldmap_object_null_cb(sub_80587B4, sub_80587D8); + +void player_step(u8 direction, u16 newKeys, u16 heldKeys) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + sub_8059D60(playerMapObj); + if (gPlayerAvatar.unk6 == 0) + { + sub_80E5B38(newKeys, heldKeys); + if (!sub_8058854(playerMapObj, direction)) + { + npc_clear_strange_bits(playerMapObj); + DoPlayerAvatarTransition(); + if (TryDoMetatileBehaviorForcedMovement() == 0) + { + MovePlayerAvatarUsingKeypadInput(direction, newKeys, heldKeys); + PlayerAllowForcedMovementIfMovingSameDirection(); + } + } + } +} + +static bool8 sub_8058854(struct MapObject *playerMapObj, u8 direction) +{ + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerMapObj) + && !FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj)) + { + u8 specialAnim = FieldObjectGetSpecialAnim(playerMapObj); + + if (specialAnim > 24 && specialAnim < 29 && direction != DIR_NONE && playerMapObj->placeholder18 != direction) + { + FieldObjectClearAnim(playerMapObj); + return FALSE; + } + else + { + return TRUE; + } + } + return FALSE; +} + +static void npc_clear_strange_bits(struct MapObject *a) +{ + a->mapobj_bit_12 = 0; + a->mapobj_bit_10 = 0; + a->mapobj_bit_9 = 0; + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_DASH; +} + +static void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 heldKeys) +{ + if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) + || (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)) + MovePlayerOnBike(direction, newKeys, heldKeys); + else + MovePlayerNotOnBike(direction, heldKeys); +} + +static void PlayerAllowForcedMovementIfMovingSameDirection(void) +{ + if (gPlayerAvatar.running2 == 2) + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5; +} + +static u8 TryDoMetatileBehaviorForcedMovement(void) +{ + return gUnknown_0830FBA0[GetForcedMovementByMetatileBehavior()](); +} + +static u8 GetForcedMovementByMetatileBehavior(void) +{ + u8 i; + + if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_5)) + { + u8 r5 = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E; + + for (i = 0; i < 18; i++) + { + if (gUnknown_0830FB58[i](r5)) + return i + 1; + } + } + return 0; +} + +u8 ForcedMovement_None(void) +{ + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_6) + { + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + playerMapObj->mapobj_bit_9 = 0; + playerMapObj->mapobj_bit_11 = 1; + FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_6; + } + return 0; +} + +static u8 DoForcedMovement(u8 direction, void (*b)(u8)) +{ + struct PlayerAvatar *playerAvatar = &gPlayerAvatar; + u8 collisionType = CheckForPlayerAvatarCollision(direction); + + playerAvatar->flags |= PLAYER_AVATAR_FLAG_6; + if (collisionType != 0) + { + ForcedMovement_None(); + if (collisionType <= 4) + { + return 0; + } + else + { + if (collisionType == COLLISION_LEDGE_JUMP) + PlayerJumpLedge(direction); + playerAvatar->flags |= PLAYER_AVATAR_FLAG_6; + playerAvatar->running2 = 2; + return 1; + } + } + else + { + playerAvatar->running2 = 2; + b(direction); + return 1; + } +} + +static u8 DoForcedMovementInCurrentDirection(void (*a)(u8)) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + playerMapObj->mapobj_bit_10 = 1; + return DoForcedMovement(playerMapObj->placeholder18, a); +} + +u8 ForcedMovement_Slip(void) +{ + return DoForcedMovementInCurrentDirection(sub_80593C4); +} + +u8 sub_8058AAC(void) +{ + return DoForcedMovement(1, PlayerGoSpeed0); +} + +u8 sub_8058AC4(void) +{ + return DoForcedMovement(2, PlayerGoSpeed0); +} + +u8 sub_8058ADC(void) +{ + return DoForcedMovement(3, PlayerGoSpeed0); +} + +u8 sub_8058AF4(void) +{ + return DoForcedMovement(4, PlayerGoSpeed0); +} + +u8 sub_8058B0C(void) +{ + return DoForcedMovement(1, npc_use_some_d2s); +} + +u8 sub_8058B24(void) +{ + return DoForcedMovement(2, npc_use_some_d2s); +} + +u8 sub_8058B3C(void) +{ + return DoForcedMovement(3, npc_use_some_d2s); +} + +u8 sub_8058B54(void) +{ + return DoForcedMovement(4, npc_use_some_d2s); +} + +static u8 ForcedMovement_Slide(u8 direction, void (*b)(u8)) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + playerMapObj->mapobj_bit_10 = 1; + playerMapObj->mapobj_bit_9 = 1; + return DoForcedMovement(direction, b); +} + +u8 ForcedMovement_SlideSouth(void) +{ + return ForcedMovement_Slide(1, sub_80593C4); +} + +u8 ForcedMovement_SlideNorth(void) +{ + return ForcedMovement_Slide(2, sub_80593C4); +} + +u8 ForcedMovement_SlideWest(void) +{ + return ForcedMovement_Slide(3, sub_80593C4); +} + +u8 ForcedMovement_SlideEast(void) +{ + return ForcedMovement_Slide(4, sub_80593C4); +} + +u8 sub_8058C04(void) +{ + sub_8059F94(); + return 1; +} + +u8 sub_8058C10(void) +{ + sub_805A06C(); + return 1; +} + +u8 ForcedMovement_MuddySlope(void) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (playerMapObj->placeholder18 != 2 || GetPlayerSpeed() <= 3) + { + sub_80E6010(0); + playerMapObj->mapobj_bit_9 = 1; + return DoForcedMovement(1, sub_80593C4); + } + else + { + return 0; + } +} + +static void MovePlayerNotOnBike(u8 direction, u16 heldKeys) +{ + gUnknown_0830FBEC[CheckMovementInputNotOnBike(direction)](direction, heldKeys); +} + +static u8 CheckMovementInputNotOnBike(u8 direction) +{ + if (direction == DIR_NONE) + { + gPlayerAvatar.running2 = 0; + return 0; + } + else if (direction != player_get_direction_upper_nybble() && gPlayerAvatar.running2 != 2) + { + gPlayerAvatar.running2 = 1; + return 1; + } + else + { + gPlayerAvatar.running2 = 2; + return 2; + } +} + +void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys) +{ + PlayerFaceDirection(player_get_direction_lower_nybble()); +} + +void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys) +{ + PlayerTurnInPlace(direction); +} + +void sub_8058D0C(u8 direction, u16 heldKeys) +{ + u8 r1 = CheckForPlayerAvatarCollision(direction); + + switch (r1) + { + case 6: + PlayerJumpLedge(direction); + return; + default: + if (r1 > 8 || r1 < 5) + PlayerNotOnBikeCollide(direction); + return; + case 0: + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + { + sub_80593C4(direction); + return; + } + if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_4) && (heldKeys & B_BUTTON) && FlagGet(SYS_B_DASH) + && IsRunningDisallowed(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) == 0) + { + sub_805940C(direction); + gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH; + } + else + { + PlayerGoSpeed0(direction); + } + } +} + +static u8 CheckForPlayerAvatarCollision(u8 direction) +{ + s16 x, y; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + x = playerMapObj->coords2.x; + y = playerMapObj->coords2.y; + MoveCoords(direction, &x, &y); + return CheckForFieldObjectCollision(playerMapObj, x, y, direction, MapGridGetMetatileBehaviorAt(x, y)); +} + +u8 CheckForFieldObjectCollision(struct MapObject *a, s16 x, s16 y, u8 direction, u8 e) +{ + u8 collision; + + collision = npc_block_way(a, x, y, direction); + if (collision == 3 && sub_8058EF0(x, y, direction)) + return 5; + if (ShouldJumpLedge(x, y, direction)) + { + IncrementGameStat(0x2B); + return COLLISION_LEDGE_JUMP; + } + if (collision == 4 && sub_8058F6C(x, y, direction)) + return 7; + + if (collision == 0) + { + if (CheckForRotatingGatePuzzleCollision(direction, x, y)) + return 8; + check_acro_bike_metatile(x, y, e, &collision); + } + return collision; +} + +static u8 sub_8058EF0(s16 a, s16 b, u8 c) +{ + if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + && MapGridGetZCoordAt(a, b) == 3 + && GetFieldObjectIdByXYZ(a, b, 3) == 16) + { + sub_805A20C(c); + return 1; + } + else + { + return 0; + } +} + +static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c) +{ + if (GetLedgeJumpDirection(a, b, c) != 0) + return 1; + else + return 0; +} + +static u8 sub_8058F6C(s16 a, s16 b, u8 c) +{ + if (FlagGet(SYS_USE_STRENGTH)) + { + u8 mapObjectId = GetFieldObjectIdByXY(a, b); + + if (mapObjectId != 16) + { + if (gMapObjects[mapObjectId].graphicsId == 0x57) + { + a = gMapObjects[mapObjectId].coords2.x; + b = gMapObjects[mapObjectId].coords2.y; + MoveCoords(c, &a, &b); + if (npc_block_way(&gMapObjects[mapObjectId], a, b, c) == 0 + && MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(a, b)) == 0) + { + StartStrengthAnim(mapObjectId, c); + return 1; + } + } + } + } + return 0; +} + +static void check_acro_bike_metatile(int unused1, int unused2, u8 c, u8 *d) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (gUnknown_0830FBF8[i](c)) + { + *d = gUnknown_0830FC0C[i]; + return; + } + } +} + +void SetPlayerAvatarTransitionFlags(u16 a) +{ + gPlayerAvatar.bike |= a; + DoPlayerAvatarTransition(); +} + +static void DoPlayerAvatarTransition(void) +{ + u8 i; + u32 flags = gPlayerAvatar.bike; + + if (flags != 0) + { + for (i = 0; i < 8; i++, flags >>= 1) + { +#ifdef NONMATCHING + if (flags & 1) + { + gUnknown_0830FC14[i](&gMapObjects[gPlayerAvatar.mapObjectId]); + } +#else + if (flags & 1) + { + register void (*const *funcs)(struct MapObject *) asm("r0") = gUnknown_0830FC14; + funcs[i](&gMapObjects[gPlayerAvatar.mapObjectId]); + } +#endif + } + gPlayerAvatar.bike = 0; + } +} + +void nullsub_49(struct MapObject *a) +{ +} + +void PlayerAvatarTransition_Normal(struct MapObject *a) +{ + sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(0)); + FieldObjectTurn(a, a->placeholder18); + SetPlayerAvatarStateMask(1); +} + +void PlayerAvatarTransition_MachBike(struct MapObject *a) +{ + sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(1)); + FieldObjectTurn(a, a->placeholder18); + SetPlayerAvatarStateMask(2); + BikeClearState(0, 0); +} + +void PlayerAvatarTransition_AcroBike(struct MapObject *a) +{ + sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(2)); + FieldObjectTurn(a, a->placeholder18); + SetPlayerAvatarStateMask(4); + BikeClearState(0, 0); + sub_80E6084(); +} + +void PlayerAvatarTransition_Surfing(struct MapObject *a) +{ + u8 unk; + + sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(3)); + FieldObjectTurn(a, a->placeholder18); + SetPlayerAvatarStateMask(8); + gUnknown_0202FF84[0] = a->coords2.x; + gUnknown_0202FF84[1] = a->coords2.y; + gUnknown_0202FF84[2] = gPlayerAvatar.mapObjectId; + unk = FieldEffectStart(8); + a->mapobj_unk_1A = unk; + sub_8127ED0(unk, 1); +} + +void PlayerAvatarTransition_Underwater(struct MapObject *a) +{ + sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(4)); + FieldObjectTurn(a, a->placeholder18); + SetPlayerAvatarStateMask(16); + a->mapobj_unk_1A = sub_8128124(a->spriteId); +} + +void sub_80591F4(struct MapObject *a) +{ + gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_5; +} + +void sub_8059204(void) +{ + gPlayerAvatar.running1 = 0; + if (PlayerIsAnimActive()) + { + if (!PlayerCheckIfAnimFinishedOrInactive()) + { + if (!player_is_anim_in_certain_ranges()) + gPlayerAvatar.running1 = 1; + } + else + { + if (!sub_80592A4()) + gPlayerAvatar.running1 = 2; + } + } +} + +static bool8 player_is_anim_in_certain_ranges(void) +{ + u8 unk = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C; + + if (unk < 4 + || (unk >= 16 && unk < 0x15) + || (unk >= 25 && unk < 41) + || (unk >= 98 && unk < 110) + || (unk >= 122 && unk < 126)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80592A4(void) +{ + if (player_is_anim_in_certain_ranges() && gPlayerAvatar.running2 != 1) + return TRUE; + else + return FALSE; +} + +static bool8 PlayerIsAnimActive(void) +{ + return FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(&gMapObjects[gPlayerAvatar.mapObjectId]); +} + +static bool8 PlayerCheckIfAnimFinishedOrInactive(void) +{ + return FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[gPlayerAvatar.mapObjectId]); +} + +static void player_set_x22(u8 a) +{ + gMapObjects[gPlayerAvatar.mapObjectId].animId = a; +} + +u8 player_get_x22(void) +{ + return gMapObjects[gPlayerAvatar.mapObjectId].animId; +} + +static void sub_8059348(u8 a) +{ + FieldObjectForceSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], a); +} + +void PlayerSetAnimId(u8 animId, u8 b) +{ + if (!PlayerIsAnimActive()) + { + player_set_x22(b); + FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], animId); + } +} + +void PlayerGoSpeed0(u8 a) +{ + PlayerSetAnimId(GetGoSpeed0AnimId(a), 2); +} + +void sub_80593C4(u8 a) +{ + PlayerSetAnimId(sub_8060744(a), 2); +} + +void npc_use_some_d2s(u8 a) +{ + PlayerSetAnimId(d2s_08064034(a), 2); +} + +void sub_80593F4(u8 a) +{ + PlayerSetAnimId(sub_806079C(a), 2); +} + +void sub_805940C(u8 a) +{ + PlayerSetAnimId(sub_80607F4(a), 2); +} + +void PlayerOnBikeCollide(u8 a) +{ + PlayCollisionSoundIfNotFacingWarp(a); + PlayerSetAnimId(GetStepInPlaceDelay16AnimId(a), 2); +} + +static void PlayerNotOnBikeCollide(u8 a) +{ + PlayCollisionSoundIfNotFacingWarp(a); + PlayerSetAnimId(GetStepInPlaceDelay32AnimId(a), 2); +} + +void PlayerFaceDirection(u8 direction) +{ + PlayerSetAnimId(GetFaceDirectionAnimId(direction), 1); +} + +void PlayerTurnInPlace(u8 direction) +{ + PlayerSetAnimId(GetStepInPlaceDelay8AnimId(direction), 1); +} + +void PlayerJumpLedge(u8 direction) +{ + PlaySE(SE_DANSA); + PlayerSetAnimId(GetJumpLedgeAnimId(direction), 8); +} + +void sub_80594C0(void) +{ + if (gPlayerAvatar.running1 == 2 || gPlayerAvatar.running1 == 0) + { + if (player_should_look_direction_be_enforced_upon_movement()) + sub_8059348(GetFaceDirectionAnimId(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_18)); + } +} + +void sub_8059504(u8 a) +{ + PlayerSetAnimId(sub_80609D8(a), 1); +} + +//normal to wheelie +void PlayerStartWheelie(u8 a) +{ + PlayerSetAnimId(sub_8060A04(a), 1); +} + +void sub_8059534(u8 a) +{ + PlayerSetAnimId(sub_8060A30(a), 1); +} + +void sub_805954C(u8 a) +{ + PlaySE(SE_JITE_PYOKO); + PlayerSetAnimId(sub_8060A5C(a), 1); +} + +void sub_8059570(u8 a) +{ + PlaySE(SE_JITE_PYOKO); + PlayerSetAnimId(sub_8060A88(a), 2); +} + +void sub_8059594(u8 a) +{ + PlaySE(SE_JITE_PYOKO); + PlayerSetAnimId(sub_8060AB4(a), 8); +} + +void sub_80595B8(u8 direction) +{ + PlaySE(SE_JITE_PYOKO); + PlayerSetAnimId(sub_8060878(direction), 1); +} + +void sub_80595DC(u8 direction) +{ + PlaySE(SE_WALL_HIT); + PlayerSetAnimId(sub_8060AE0(direction), 2); +} + +void sub_8059600(u8 a) +{ + PlayerSetAnimId(sub_8060B0C(a), 2); +} + +void sub_8059618(u8 a) +{ + PlayerSetAnimId(sub_8060B38(a), 2); +} + +void sub_8059630(u8 a) +{ + PlayerSetAnimId(sub_8060B64(a), 2); +} + +static void PlayCollisionSoundIfNotFacingWarp(u8 a) +{ + s16 x, y; + u8 unk = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E; + + if (!gUnknown_0830FC34[a - 1](unk)) + { + if (a == 2) + { + PlayerGetDestCoords(&x, &y); + MoveCoords(2, &x, &y); + if (MetatileBehavior_IsWarpDoor(MapGridGetMetatileBehaviorAt(x, y))) + return; + } + PlaySE(SE_WALL_HIT); + } +} + +void GetXYCoordsOneStepInFrontOfPlayer(s16 *x, s16 *y) +{ + *x = gMapObjects[gPlayerAvatar.mapObjectId].coords2.x; + *y = gMapObjects[gPlayerAvatar.mapObjectId].coords2.y; + MoveCoords(player_get_direction_lower_nybble(), x, y); +} + +void PlayerGetDestCoords(s16 *x, s16 *y) +{ + *x = gMapObjects[gPlayerAvatar.mapObjectId].coords2.x; + *y = gMapObjects[gPlayerAvatar.mapObjectId].coords2.y; +} + +u8 player_get_direction_lower_nybble(void) +{ + return gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_18; +} + +u8 player_get_direction_upper_nybble(void) +{ + return gMapObjects[gPlayerAvatar.mapObjectId].placeholder18; +} + +u8 PlayerGetZCoord(void) +{ + return gMapObjects[gPlayerAvatar.mapObjectId].elevation; +} + +void unref_sub_8059790(s16 a, s16 b) +{ + sub_805C058(&gMapObjects[gPlayerAvatar.mapObjectId], a, b); +} + +u8 TestPlayerAvatarFlags(u8 a) +{ + return gPlayerAvatar.flags & a; +} + +u8 sub_80597D0(void) +{ + return gPlayerAvatar.flags; +} + +u8 GetPlayerAvatarObjectId(void) +{ + return gPlayerAvatar.spriteId; +} + +void sub_80597E8(void) +{ + ForcedMovement_None(); +} + +void sub_80597F4(void) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + npc_clear_strange_bits(playerMapObj); + FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) + { + sub_80E6084(); + sub_80E6010(0); + } +} + +u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) +{ + return sRivalAvatarGfxIds[state][gender]; +} + +static u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) +{ + return sPlayerAvatarGfxIds[state][gender]; +} + +u8 GetPlayerAvatarGraphicsIdByStateId(u8 state) +{ + return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender); +} + +u8 unref_GetRivalAvatarGenderByGraphcsId(u8 gfxId) +{ + switch (gfxId) + { + case MAP_OBJ_GFX_RIVAL_MAY_NORMAL: + case MAP_OBJ_GFX_RIVAL_MAY_MACH_BIKE: + case MAP_OBJ_GFX_RIVAL_MAY_ACRO_BIKE: + case MAP_OBJ_GFX_RIVAL_MAY_SURFING: + case MAP_OBJ_GFX_RIVAL_MAY_FIELD_MOVE: + case MAP_OBJ_GFX_MAY_UNDERWATER: + case MAP_OBJ_GFX_MAY_FISHING: + case MAP_OBJ_GFX_MAY_WATERING: + return FEMALE; + default: + return MALE; + } +} + +u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId) +{ + switch (gfxId) + { + case MAP_OBJ_GFX_MAY_NORMAL: + case MAP_OBJ_GFX_MAY_MACH_BIKE: + case MAP_OBJ_GFX_MAY_ACRO_BIKE: + case MAP_OBJ_GFX_MAY_SURFING: + case MAP_OBJ_GFX_MAY_FIELD_MOVE: + case MAP_OBJ_GFX_MAY_UNDERWATER: + case MAP_OBJ_GFX_MAY_FISHING: + case MAP_OBJ_GFX_MAY_WATERING: + return FEMALE; + default: + return MALE; + } +} + +bool8 PartyHasMonWithSurf(void) +{ + u8 i; + + if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + { + for (i = 0; i < 6; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == 0) + break; + if (pokemon_has_move(&gPlayerParty[i], 0x39)) + return TRUE; + } + } + return FALSE; +} + +bool8 IsPlayerSurfingNorth(void) +{ + if (player_get_direction_upper_nybble() == DIR_NORTH && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + return TRUE; + else + return FALSE; +} + +bool8 IsPlayerFacingSurfableFishableWater(void) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + s16 x = playerMapObj->coords2.x; + s16 y = playerMapObj->coords2.y; + + MoveCoords(playerMapObj->mapobj_unk_18, &x, &y); + if (npc_block_way(playerMapObj, x, y, playerMapObj->mapobj_unk_18) == 3 && PlayerGetZCoord() == 3 + && MetatileBehavior_IsSurfableFishableWater(MapGridGetMetatileBehaviorAt(x, y))) + return TRUE; + else + return FALSE; +} + +void ClearPlayerAvatarInfo(void) +{ + //TODO: 0x24 should be the size of gPlayerAvatar + memset(&gPlayerAvatar, 0, sizeof(struct PlayerAvatar)); +} + +void SetPlayerAvatarStateMask(u8 a) +{ + gPlayerAvatar.flags &= 0xE0; + gPlayerAvatar.flags |= a; +} + +static u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 a, u8 gender) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (gUnknown_0830FC64[gender][i][0] == a) + return gUnknown_0830FC64[gender][i][1]; + } + return 1; +} + +u8 GetPlayerAvatarGraphicsIdByCurrentState(void) +{ + u8 i; + u8 r5 = gPlayerAvatar.flags; + + for (i = 0; i < 5; i++) + { + if (gUnknown_0830FC64[gPlayerAvatar.gender][i][1] & r5) + return gUnknown_0830FC64[gPlayerAvatar.gender][i][0]; + } + return 0; +} + +void SetPlayerAvatarExtraStateTransition(u8 a, u8 b) +{ + u8 unk = GetPlayerAvatarStateTransitionByGraphicsId(a, gPlayerAvatar.gender); + + gPlayerAvatar.bike |= unk | b; + DoPlayerAvatarTransition(); +} + +void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) +{ + struct MapObjectTemplate playerMapObjTemplate; + u8 mapObjectId; + struct MapObject *mapObject; + + playerMapObjTemplate.localId = 0xFF; + playerMapObjTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(0, gender); + playerMapObjTemplate.x = x - 7; + playerMapObjTemplate.y = y - 7; + playerMapObjTemplate.elevation = 0; + playerMapObjTemplate.movementType = 11; + playerMapObjTemplate.unkA_0 = 0; + playerMapObjTemplate.unkA_4 = 0; + playerMapObjTemplate.unkC = 0; + playerMapObjTemplate.unkE = 0; + playerMapObjTemplate.script = NULL; + playerMapObjTemplate.flagId = 0; + mapObjectId = SpawnSpecialFieldObject(&playerMapObjTemplate); + mapObject = &gMapObjects[mapObjectId]; + mapObject->mapobj_bit_16 = 1; + mapObject->mapobj_unk_1B = sub_8126B54(); + FieldObjectTurn(mapObject, direction); + ClearPlayerAvatarInfo(); + gPlayerAvatar.running2 = 0; + gPlayerAvatar.running1 = 0; + gPlayerAvatar.mapObjectId = mapObjectId; + gPlayerAvatar.spriteId = mapObject->spriteId; + gPlayerAvatar.gender = gender; + SetPlayerAvatarStateMask(0x21); +} + +void sub_8059B88(u8 a) +{ + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = a; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + gSprites[gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A].invisible = a; +} + +void sub_8059BF4(void) +{ + sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(5)); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], 0); +} + +void sub_8059C3C(u8 a) +{ + sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(6)); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDE8(a)); +} + +void sub_8059C94(u8 a) +{ + sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(2)); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FD98(a)); + SeekSpriteAnim(&gSprites[gPlayerAvatar.spriteId], 1); +} + +void sub_8059D08(u8 a) +{ + sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(7)); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], FieldObjectDirectionToImageAnimId(a)); +} + +static void sub_8059D60(struct MapObject *a) +{ + s16 x; + s16 y; + u8 r6; + u8 r8 = a->mapobj_unk_1E; + + for (x = 0, r6 = 1; x < 4; x++, r6++) + { + if (gUnknown_0830FC78[x](r8) && r6 == a->placeholder18) + { + x = a->coords2.x; + y = a->coords2.y; + MoveCoords(r6, &x, &y); + sub_8126BC4(a->mapobj_unk_1B, r6, x, y); + return; + } + } + objid_set_invisible(a->mapobj_unk_1B); +} + +/* Strength */ + +static void sub_8059E2C(u8 taskId); + +static void StartStrengthAnim(u8 a, u8 b) +{ + u8 taskId = CreateTask(sub_8059E2C, 0xFF); + + gTasks[taskId].data[1] = a; + gTasks[taskId].data[2] = b; + sub_8059E2C(taskId); +} + +static void sub_8059E2C(u8 taskId) +{ + while (gUnknown_0830FC88[gTasks[taskId].data[0]](&gTasks[taskId], + &gMapObjects[gPlayerAvatar.mapObjectId], + &gMapObjects[gTasks[taskId].data[1]])) + ; +} + +u8 sub_8059E84(struct Task *task, struct MapObject *b, struct MapObject *c) +{ + ScriptContext2_Enable(); + gPlayerAvatar.unk6 = 1; + task->data[0]++; + return 0; +} + +u8 sub_8059EA4(struct Task *task, struct MapObject *b, struct MapObject *c) +{ + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(b) + && !FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(c)) + { + FieldObjectClearAnimIfSpecialAnimFinished(b); + FieldObjectClearAnimIfSpecialAnimFinished(c); + FieldObjectSetSpecialAnim(b, GetStepInPlaceDelay16AnimId(task->data[2])); + FieldObjectSetSpecialAnim(c, GetSimpleGoAnimId(task->data[2])); + gUnknown_0202FF84[0] = c->coords2.x; + gUnknown_0202FF84[1] = c->coords2.y; + gUnknown_0202FF84[2] = c->elevation; + gUnknown_0202FF84[3] = gSprites[c->spriteId].oam.priority; + FieldEffectStart(10); + PlaySE(SE_W070); + task->data[0]++; + } + return 0; +} + +u8 sub_8059F40(struct Task *task, struct MapObject *b, struct MapObject *c) +{ + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(b) + && FieldObjectCheckIfSpecialAnimFinishedOrInactive(c)) + { + FieldObjectClearAnimIfSpecialAnimFinished(b); + FieldObjectClearAnimIfSpecialAnimFinished(c); + gPlayerAvatar.unk6 = 0; + ScriptContext2_Disable(); + DestroyTask(FindTaskIdByFunc(sub_8059E2C)); + } + return 0; +} + +/* Some field effect */ + +static void sub_8059FB4(u8 taskId); + +static void sub_8059F94(void) +{ + u8 taskId = CreateTask(sub_8059FB4, 0xFF); + + sub_8059FB4(taskId); +} + +static void sub_8059FB4(u8 taskId) +{ + while (gUnknown_0830FC94[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])) + ; +} + +u8 sub_805A000(struct Task *task, struct MapObject *mapObject) +{ + gPlayerAvatar.unk6 = 1; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + PlaySE(SE_DANSA); + FieldObjectSetSpecialAnim(mapObject, sub_806084C(mapObject->mapobj_unk_18)); + task->data[1]++; + if (task->data[1] > 1) + { + gPlayerAvatar.unk6 = 0; + gPlayerAvatar.bike |= 0x20; + DestroyTask(FindTaskIdByFunc(sub_8059FB4)); + } + } + return 0; +} + +/* Some field effect */ + +static void sub_805A08C(u8 taskId); + +static void sub_805A06C(void) +{ + u8 taskId = CreateTask(sub_805A08C, 0xFF); + + sub_805A08C(taskId); +} + +static void sub_805A08C(u8 taskId) +{ + while (gUnknown_0830FC98[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])) + ; +} + +u8 sub_805A0D8(struct Task *task, struct MapObject *mapObject) +{ + task->data[0]++; + task->data[1] = mapObject->placeholder18; + gPlayerAvatar.unk6 = 1; + ScriptContext2_Enable(); + PlaySE(SE_TK_WARPIN); + return 1; +} + +u8 sub_805A100(struct Task *task, struct MapObject *mapObject) +{ + u8 directions[] = {DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; + + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + u8 direction; + + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(direction = directions[mapObject->placeholder18 - 1])); + if (direction == (u8)task->data[1]) + task->data[2]++; + task->data[0]++; + if (task->data[2] > 3 && direction == GetOppositeDirection(task->data[1])) + task->data[0]++; + } + return 0; +} + +u8 sub_805A178(struct Task *task, struct MapObject *mapObject) +{ + const u8 arr[] = {16, 16, 17, 18, 19}; + + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + FieldObjectSetSpecialAnim(mapObject, arr[task->data[2]]); + task->data[0] = 1; + } + return 0; +} + +u8 sub_805A1B8(struct Task *task, struct MapObject *mapObject) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + FieldObjectSetSpecialAnim(mapObject, GetSimpleGoAnimId(GetOppositeDirection(task->data[1]))); + ScriptContext2_Disable(); + gPlayerAvatar.unk6 = 0; + DestroyTask(FindTaskIdByFunc(sub_805A08C)); + } + return 0; +} + +/* Some Field effect */ + +static void taskFF_0805D1D4(u8 taskId); +static void sub_805A2D0(u8 taskId); + +void sub_805A20C(u8 a) +{ + u8 taskId; + + ScriptContext2_Enable(); + sav1_reset_battle_music_maybe(); + sub_8053F84(); + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; + gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; + gPlayerAvatar.unk6 = 1; + taskId = CreateTask(taskFF_0805D1D4, 0xFF); + gTasks[taskId].data[0] = a; + taskFF_0805D1D4(taskId); +} + +static void taskFF_0805D1D4(u8 taskId) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerMapObj)) + { + if (!FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj)) + return; + } + sub_8127ED0(playerMapObj->mapobj_unk_1A, 2); + FieldObjectSetSpecialAnim(playerMapObj, sub_80608D0(gTasks[taskId].data[0])); + gTasks[taskId].func = sub_805A2D0; +} + +static void sub_805A2D0(u8 taskId) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj)) + { + sub_805B980(playerMapObj, GetPlayerAvatarGraphicsIdByStateId(0)); + FieldObjectSetSpecialAnim(playerMapObj, GetFaceDirectionAnimId(playerMapObj->mapobj_unk_18)); + gPlayerAvatar.unk6 = 0; + ScriptContext2_Disable(); + DestroySprite(&gSprites[playerMapObj->mapobj_unk_1A]); + DestroyTask(taskId); + } +} + +/* Fishing */ + +static u8 (*const gUnknown_0830FCB4[])(struct Task *) = +{ + Fishing1, + Fishing2, + Fishing3, + Fishing4, + Fishing5, + Fishing6, + Fishing7, + Fishing8, + Fishing9, + Fishing10, + Fishing11, + Fishing12, + Fishing13, + Fishing14, + Fishing15, + Fishing16, +}; + +static void Task_Fishing(u8 taskId); +static void sub_805A954(void); + +void StartFishing(u8 a) +{ + u8 taskId = CreateTask(Task_Fishing, 0xFF); + + gTasks[taskId].data[15] = a; + Task_Fishing(taskId); +} + +static void Task_Fishing(u8 taskId) +{ + while (gUnknown_0830FCB4[gTasks[taskId].data[0]](&gTasks[taskId])) + ; +} + +u8 Fishing1(struct Task *task) +{ + ScriptContext2_Enable(); + gPlayerAvatar.unk6 = 1; + task->data[0]++; + return 0; +} + +u8 Fishing2(struct Task *task) +{ + struct MapObject *playerMapObj; + const s16 arr1[] = {1, 1, 1}; + const s16 arr2[] = {1, 3, 6}; + + task->data[12] = 0; + task->data[13] = arr1[task->data[15]] + (Random() % arr2[task->data[15]]); + task->data[14] = gMapObjects[gPlayerAvatar.mapObjectId].graphicsId; + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + FieldObjectClearAnimIfSpecialAnimActive(playerMapObj); + playerMapObj->mapobj_bit_11 = 1; + sub_8059C3C(playerMapObj->mapobj_unk_18); + task->data[0]++; + return 0; +} + +u8 Fishing3(struct Task *task) +{ + sub_805A954(); + task->data[1]++; + if (task->data[1] > 0x3B) + task->data[0]++; + return 0; +} + +u8 Fishing4(struct Task *task) +{ + u32 randVal; + + MenuDisplayMessageBox(); + task->data[0]++; + task->data[1] = 0; + task->data[2] = 0; + randVal = Random(); + randVal %= 10; + task->data[3] = randVal + 1; + if (task->data[12] == 0) + task->data[3] = randVal + 4; + if (task->data[3] > 9) + task->data[3] = 10; + return 1; +} + +u8 Fishing5(struct Task *task) +{ + const u8 dot[] = _("·"); + + sub_805A954(); + task->data[1]++; + if (gMain.newKeys & A_BUTTON) + { + task->data[0] = 11; + if (task->data[12] != 0) + task->data[0] = 12; + return 1; + } + else + { + if (task->data[1] > 0x13) + { + task->data[1] = 0; + if (task->data[2] >= task->data[3]) + { + task->data[0]++; + if (task->data[12] != 0) + task->data[0]++; + task->data[12]++; + } + else + { + MenuPrint(dot, task->data[2] + 4, 15); + task->data[2]++; + } + } + return 0; + } +} + +u8 Fishing6(struct Task *task) +{ + sub_805A954(); + task->data[0]++; + if (!GetFishingWildMonListHeader() || (Random() & 1)) + task->data[0] = 11; + else + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FE08(player_get_direction_lower_nybble())); + return 1; +} + +u8 Fishing7(struct Task *task) +{ + sub_805A954(); + MenuPrint(gOtherText_OhABite, 4, 17); + task->data[0]++; + task->data[1] = 0; + return 0; +} + +u8 Fishing8(struct Task *task) +{ + const s16 arr[3] = {36, 33, 30}; + + sub_805A954(); + task->data[1]++; + if (task->data[1] >= arr[task->data[15]]) + task->data[0] = 12; + else if (gMain.newKeys & A_BUTTON) + task->data[0]++; + return 0; +} + +u8 Fishing9(struct Task *task) +{ + const s16 arr[][2] = + { + {0, 0}, + {40, 10}, + {70, 30} + }; + + sub_805A954(); + task->data[0]++; + if (task->data[12] < task->data[13]) + { + task->data[0] = 3; + } + else if (task->data[12] < 2) + { + s16 randVal = Random() % 100; + + if (arr[task->data[15]][task->data[12]] > randVal) + task->data[0] = 3; + } + return 0; +} + +u8 Fishing10(struct Task *task) +{ + sub_805A954(); + sub_8072044(gOtherText_PokeOnHook); + MenuDisplayMessageBox(); + task->data[0]++; + task->data[1] = 0; + return 0; +} + +u8 Fishing11(struct Task *task) +{ + if (task->data[1] == 0) + { + sub_805A954(); + if (task->data[1] == 0) + { + if (MenuUpdateWindowText()) + { + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + sub_805B980(playerMapObj, task->data[14]); + FieldObjectTurn(playerMapObj, playerMapObj->placeholder18); + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0); + gSprites[gPlayerAvatar.spriteId].pos2.x = 0; + gSprites[gPlayerAvatar.spriteId].pos2.y = 0; + MenuZeroFillScreen(); + task->data[1]++; + return 0; + } + else + { + if (task->data[1] == 0) + return 0; + } + } + } + gPlayerAvatar.unk6 = 0; + ScriptContext2_Disable(); + FishingWildEncounter(task->data[15]); + sub_80BE97C(1); + DestroyTask(FindTaskIdByFunc(Task_Fishing)); + return 0; +} + +u8 Fishing12(struct Task *task) +{ + sub_805A954(); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDF8(player_get_direction_lower_nybble())); + sub_8072044(gOtherText_NotEvenANibble); + task->data[0] = 13; + return 1; +} + +u8 Fishing13(struct Task *task) +{ + sub_805A954(); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDF8(player_get_direction_lower_nybble())); + sub_8072044(gOtherText_ItGotAway); + task->data[0]++; + return 1; +} + +u8 Fishing14(struct Task *task) +{ + sub_805A954(); + MenuDisplayMessageBox(); + task->data[0]++; + return 0; +} + +u8 Fishing15(struct Task *task) +{ + sub_805A954(); + if (gSprites[gPlayerAvatar.spriteId].animEnded) + { + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + sub_805B980(playerMapObj, task->data[14]); + FieldObjectTurn(playerMapObj, playerMapObj->placeholder18); + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0); + gSprites[gPlayerAvatar.spriteId].pos2.x = 0; + gSprites[gPlayerAvatar.spriteId].pos2.y = 0; + task->data[0]++; + } + return 0; +} + +u8 Fishing16(struct Task *task) +{ + if (MenuUpdateWindowText()) + { + gPlayerAvatar.unk6 = 0; + ScriptContext2_Disable(); + UnfreezeMapObjects(); + MenuZeroFillScreen(); + sub_80BE97C(0); + DestroyTask(FindTaskIdByFunc(Task_Fishing)); + } + return 0; +} + +static void sub_805A954(void) +{ + struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId]; + u8 animCmdIndex; + u8 animType; + + AnimateSprite(playerSprite); + playerSprite->pos2.x = 0; + playerSprite->pos2.y = 0; + animCmdIndex = playerSprite->animCmdIndex; + if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) + { + animCmdIndex--; + } + else + { + playerSprite->animDelayCounter++; + if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) + animCmdIndex--; + } + animType = playerSprite->anims[playerSprite->animNum][animCmdIndex].type; + if (animType == 1 || animType == 2 || animType == 3) + { + playerSprite->pos2.x = 8; + if (player_get_direction_lower_nybble() == 3) + playerSprite->pos2.x = -8; + } + if (animType == 5) + playerSprite->pos2.y = -8; + if (animType == 10 || animType == 11) + playerSprite->pos2.y = 8; + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 1, playerSprite->pos2.y); +} diff --git a/src/field/field_poison.c b/src/field/field_poison.c new file mode 100644 index 000000000..8c9e029e1 --- /dev/null +++ b/src/field/field_poison.c @@ -0,0 +1,143 @@ +#include "global.h" +#include "field_poison.h" +#include "field_message_box.h" +#include "fldeff_80C5CD4.h" +#include "pokemon.h" +#include "pokemon_summary_screen.h" +#include "script.h" +#include "string_util.h" +#include "task.h" +#include "text.h" + +extern u16 gScriptResult; +extern u8 fieldPoisonText_PokemonFainted[]; + +bool32 CheckMonIsValid(struct Pokemon *pkmn) +{ + // UB: Too few arguments for function 'GetMonData' + u16 species2 = GetMonData(pkmn, MON_DATA_SPECIES2); + + if (species2 == 0 || species2 == 0x19C) + return FALSE; + else + return TRUE; +} + +bool32 AllMonsFainted(void) +{ + struct Pokemon *pkmn = &gPlayerParty[0]; + int i; + + for (i = 0; i < 6; i++, pkmn++) + { + // UB: Too few arguments for function 'GetMonData' + if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) != 0) + return FALSE; + } + return TRUE; +} + +void MonFaintFromPoisonOnField(u8 partyMember) +{ + struct Pokemon *pkmn = &gPlayerParty[partyMember]; + u32 val = 0; + + AdjustFriendship(pkmn, 7); + SetMonData(pkmn, MON_DATA_STATUS, (u8*)&val); + GetMonData(pkmn, MON_DATA_NICKNAME, gStringVar1); + StringGetEnd10(gStringVar1); +} + +bool32 CheckMonFaintedFromPoison(u8 partyMember) +{ + struct Pokemon *pkmn = &gPlayerParty[partyMember]; + + // UB: Too few arguments for function 'GetMonData' + if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) == 0 + && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1) + return TRUE; + else + return FALSE; +} + +//Task data +enum +{ + TD_STATE, + TD_PARTY_MEMBER, +}; + +void Task_WhiteOut(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + switch (taskData[TD_STATE]) + { + case 0: //Check if Pokemon have fainted due to poison + while (taskData[TD_PARTY_MEMBER] < 6) + { + if (CheckMonFaintedFromPoison(taskData[TD_PARTY_MEMBER])) + { + MonFaintFromPoisonOnField(taskData[TD_PARTY_MEMBER]); + ShowFieldMessage(fieldPoisonText_PokemonFainted); + taskData[TD_STATE]++; + return; + } + taskData[TD_PARTY_MEMBER]++; + } + taskData[TD_STATE] = 2; + break; + case 1: //Wait for message box to disappear + if (IsFieldMessageBoxHidden()) + taskData[TD_STATE]--; //Check next party member + break; + case 2: //Done checking Pokemon + if (AllMonsFainted()) + gScriptResult = 1; + else + gScriptResult = 0; + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + } +} + +void ExecuteWhiteOut(void) +{ + CreateTask(Task_WhiteOut, 0x50); + ScriptContext1_Stop(); +} + +s32 overworld_poison(void) +{ + struct Pokemon *pkmn = &gPlayerParty[0]; + u32 numPoisoned = 0; + u32 numFainting = 0; + int i; + + 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) + { + hp = GetMonData(pkmn, MON_DATA_HP); + if (hp != 0) + hp--; + if (hp == 0) + numFainting++; //Pokemon will now faint due to poison + SetMonData(pkmn, MON_DATA_HP, (u8 *)&hp); + numPoisoned++; + } + pkmn++; + } + if (numFainting != 0 || numPoisoned != 0) + DoFieldPoisonEffect(); + if (numFainting != 0) + return 2; + if (numPoisoned != 0) + return 1; + return 0; +} diff --git a/src/field/field_region_map.c b/src/field/field_region_map.c new file mode 100644 index 000000000..7cb22e5df --- /dev/null +++ b/src/field/field_region_map.c @@ -0,0 +1,125 @@ +#include "global.h" +#include "field_region_map.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "region_map.h" +#include "sprite.h" +#include "strings2.h" +#include "text.h" + +struct RegionMapStruct +{ + u8 str[0x16]; + u8 unk16; + u8 filler[0x869]; +}; + +struct UnkStruct +{ + MainCallback callback; + u8 filler[4]; + // This should be RegionMap, but I can't do that because it overlaps unk888. + struct RegionMapStruct unk8; + u16 unk888; +}; + +extern u8 ewram[]; +#define unk_2000000 (*(struct UnkStruct *)(ewram)) + +void FieldInitRegionMap(MainCallback callback) +{ + SetVBlankCallback(NULL); + unk_2000000.unk888 = 0; + unk_2000000.callback = callback; + SetMainCallback2(CB2_FieldInitRegionMap); +} + +void CB2_FieldInitRegionMap(void) +{ + REG_DISPCNT = 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; + ResetSpriteData(); + FreeAllSpritePalettes(); + // TODO: remove this cast + InitRegionMap((void *)&unk_2000000.unk8, 0); + CreateRegionMapPlayerIcon(0, 0); + CreateRegionMapCursor(1, 1); + SetUpWindowConfig(&gWindowConfig_81E709C); + InitMenuWindow(&gWindowConfig_81E709C); + MenuZeroFillScreen(); + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + MenuDrawTextWindow(21, 0, 29, 3); + sub_8072BD8(gOtherText_Hoenn, 0x16, 1, 0x38); + MenuDrawTextWindow(16, 16, 29, 19); + sub_813F0C8(); + SetMainCallback2(CB2_FieldRegionMap); + SetVBlankCallback(VBlankCB_FieldRegionMap); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); +} + +void VBlankCB_FieldRegionMap(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_FieldRegionMap(void) +{ + sub_813EFDC(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_813EFDC(void) +{ + switch (unk_2000000.unk888) + { + case 0: + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + unk_2000000.unk888++; + break; + case 1: + if (!gPaletteFade.active) + unk_2000000.unk888++; + break; + case 2: + switch (sub_80FAB60()) + { + case 3: + sub_813F0C8(); + break; + case 4: + case 5: + unk_2000000.unk888++; + } + break; + case 3: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + unk_2000000.unk888++; + break; + case 4: + if (!gPaletteFade.active) + { + FreeRegionMapIconResources(); + SetMainCallback2(unk_2000000.callback); + } + break; + } +} + +void sub_813F0C8(void) +{ + MenuFillWindowRectWithBlankTile(17, 17, 28, 18); + if (unk_2000000.unk8.unk16) + MenuPrint(unk_2000000.unk8.str, 17, 17); +} diff --git a/src/field/field_screen_effect.c b/src/field/field_screen_effect.c new file mode 100644 index 000000000..79913e1c5 --- /dev/null +++ b/src/field/field_screen_effect.c @@ -0,0 +1,340 @@ +#include "global.h" +#include "event_data.h" +#include "field_camera.h" +#include "menu.h" +#include "palette.h" +#include "rom4.h" +#include "script.h" +#include "task.h" +#include "text.h" +#include "unknown_task.h" + +struct UnknownStruct1 +{ + u8 filler0[0x14]; + u8 unk14; + u8 filler15[0xB]; +}; +extern struct UnknownStruct1 gUnknown_03004DC0; + +extern u16 gUnknown_03004DE0[][0x3C0]; + +const static u16 gUnknown_0839ACDC[] = { 0xC8, 0x48, 0x38, 0x28, 0x18, 0x0 }; + +const s32 gUnknown_0839ACE8 = 4; + +const static u32 gUnknown_0839ACEC[3] = +{ + REG_ADDR_WIN0H, + ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, + 1 +}; + +static void sub_808136C(u16 *dest, u32 a2, s32 a3, s32 a4) +{ + if (a2 <= 0xA0) + { + if (a3 < 0) + a3 = 0; + if (a3 > 255) + a3 = 255; + if (a4 < 0) + a4 = 0; + if (a4 > 255) + a4 = 255; + dest[a2] = (a3 << 8) | a4; + } +} + +static void sub_8081398(u16 *dest, s32 a2, s32 a3, s32 a4) +{ + s32 v1 = a4; + s32 v2 = a4; + s32 v3 = 0; + while (v1 >= v3) + { + sub_808136C(dest, a3 - v3, a2 - v1, a2 + v1); + sub_808136C(dest, a3 + v3, a2 - v1, a2 + v1); + sub_808136C(dest, a3 - v1, a2 - v3, a2 + v3); + sub_808136C(dest, a3 + v1, a2 - v3, a2 + v3); + v2 -= (v3 * 2) - 1; + v3++; + if (v2 < 0) + { + v2 += 2 * (v1 - 1); + v1--; + } + } +} + +static void sub_8081424(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.unk14][0], data[1], data[2], data[3]); + data[0] = 1; + break; + case 1: + sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.unk14][0], 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(); + data[0] = 2; + } + else + { + DestroyTask(taskId); + } + } + break; + case 2: + dp12_8087EA4(); + DestroyTask(taskId); + break; + } +} + +static void sub_80814E8(u8 taskId) +{ + if (!FuncIsActiveTask(sub_8081424)) + { + EnableBothScriptContexts(); + DestroyTask(taskId); + } +} + +static void sub_8081510(void) +{ + if (!FuncIsActiveTask(sub_80814E8)) + CreateTask(sub_80814E8, 80); +} + +static u8 sub_8081534(s32 a1, s32 a2, s32 a3, s32 a4, s32 a5, u8 a6) +{ + u8 taskId = CreateTask(sub_8081424, 80); + s16 *data = gTasks[taskId].data; + + data[3] = a3; + data[4] = a4; + data[1] = a1; + data[2] = a2; + data[6] = a5; + + if (a3 < a4) + data[5] = a6; + else + data[5] = -a6; + + return taskId; +} + +void sub_8081594(u8 a1) +{ + u8 index = sav1_get_flash_used_on_map(); + u8 value = 0; + if (!a1) + value = 1; + sub_8081534(120, 80, gUnknown_0839ACDC[index], gUnknown_0839ACDC[a1], value, 1); + sub_8081510(); + ScriptContext2_Enable(); +} + +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); + } +} + +static void sub_808161C(u8 a1) +{ + int i; + u16 color[1]; + + if (!a1) + color[0] = 0x1F; + else + color[0] = 0x7C00; + + for (i = 0; i < 16; i++) + { + LoadPalette(color, 0xF0 + i, 2); + } +} + +static bool8 sub_8081658(u16 a1) +{ + u8 lo = REG_BLDALPHA & 0xFF; + u8 hi = REG_BLDALPHA >> 8; + + if (a1) + { + if (lo) + { + lo--; + } + } + else + { + if (hi < 0x10) + { + hi++; + } + } + + REG_BLDALPHA = (hi << 8) | lo; + + if (lo == 0 && hi == 0x10) + { + return TRUE; + } + + return FALSE; +} + +static void sub_80816A8(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + data[6] = REG_DISPCNT; + data[7] = REG_BLDCNT; + data[8] = REG_BLDALPHA; + data[9] = REG_WININ; + data[10] = REG_WINOUT; + REG_DISPCNT &= 0xBFFF; + REG_BLDCNT |= gUnknown_081E29E8[0]; + 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]); + data[0] = 1; + break; + case 1: + MenuFillWindowRectWithBlankTile(0, 0, 29, 19); + sub_808161C(data[1]); + sub_8081534(data[2], data[3], 1, 160, 1, 2); + data[0] = 2; + break; + case 2: + if (!FuncIsActiveTask(sub_8081424)) + { + EnableBothScriptContexts(); + data[0] = 3; + } + break; + case 3: + InstallCameraPanAheadCallback(); + SetCameraPanningCallback(NULL); + data[5] = 0; + data[4] = 4; + data[0] = 4; + break; + case 4: + data[4]--; + if (!data[4]) + { + s32 panning; + data[4] = 4; + data[5] ^= 1; + if (data[5]) + panning = 4; + else + panning = -4; + SetCameraPanning(0, panning); + } + break; + case 6: + InstallCameraPanAheadCallback(); + data[4] = 8; + data[0] = 7; + break; + case 7: + data[4]--; + if (!data[4]) + { + data[4] = 8; + data[5] ^= 1; + if (sub_8081658(data[5]) == TRUE) + data[0] = 5; + } + break; + case 5: + MenuZeroFillWindowRect(0, 0, 29, 19); + LoadFontDefaultPalette(&gWindowConfig_81E6CE4); + REG_WIN0H = 255; + REG_DISPCNT = data[6]; + REG_BLDCNT = data[7]; + REG_BLDALPHA = data[8]; + REG_WININ = data[9]; + REG_WINOUT = data[10]; + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + } +} + +void sub_80818A4(void) +{ + u8 taskId = CreateTask(sub_80816A8, 80); + s16 *data = gTasks[taskId].data; + + if (gScriptResult == 0) + { + data[1] = 0; + data[2] = 104; + } + else if (gScriptResult == 1) + { + data[1] = 1; + data[2] = 104; + } + else if (gScriptResult == 2) + { + data[1] = 0; + data[2] = 120; + } + else + { + data[1] = 1; + data[2] = 120; + } + + data[3] = 80; +} + +void sub_80818FC(void) +{ + u8 taskId = FindTaskIdByFunc(sub_80816A8); + gTasks[taskId].data[0] = 6; +} + +static void task50_0807F0C8(u8); + +void sub_8081924(void) +{ + sub_8054044(); + CreateTask(task50_0807F0C8, 80); +} + +static void task50_0807F0C8(u8 taskId) +{ + if (sub_8054034() == TRUE) + { + DestroyTask(taskId); + EnableBothScriptContexts(); + } +} diff --git a/src/field/field_special_scene.c b/src/field/field_special_scene.c new file mode 100644 index 000000000..82a7a13e3 --- /dev/null +++ b/src/field/field_special_scene.c @@ -0,0 +1,349 @@ +#include "global.h" +#include "field_special_scene.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_fadetransition.h" +#include "field_map_obj.h" +#include "field_specials.h" +#include "fieldmap.h" +#include "main.h" +#include "palette.h" +#include "rom4.h" +#include "script.h" +#include "script_movement.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" + +#define SECONDS(value) ((signed) (60.0 * value + 0.5)) + +// porthole states +enum +{ + INIT_PORTHOLE, + IDLE_CHECK, + EXECUTE_MOVEMENT, + EXIT_PORTHOLE, +}; + +extern s8 gTruckCamera_HorizontalTable[]; + +extern u8 gUnknown_083D295F[]; +extern u8 gUnknown_083D2961[]; + +s32 GetTruckCameraBobbingY(int a1) +{ + if (!(a1 % 120)) + return -1; + else if ((a1 % 10) <= 4) + return 1; + + return 0; +} + +s32 GetTruckBoxMovement(int a1) // for the box movement? +{ + if (!((a1 + 120) % 180)) + return -1; + + return 0; +} + +void Task_Truck1(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s16 cameraYpan; + s16 box1 = 0; + s16 box2 = 0; + s16 box3 = 0; + u8 mapNum, mapGroup; + register s16 zero asm("r4"); + + box1 = GetTruckBoxMovement(data[0] + 30) * 4; // top box. + sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3, box1 + 3); + box2 = GetTruckBoxMovement(data[0]) * 2; // bottom left box. + sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 0, box2 - 3); + box3 = GetTruckBoxMovement(data[0]) * 4; // bottom right box. + mapNum = gSaveBlock1.location.mapNum; + mapGroup = gSaveBlock1.location.mapGroup; + zero = 0; + sub_805BD90(3, mapNum, mapGroup, -3, box3); + + if (++data[0] == SECONDS(500)) // this will never run + data[0] = zero; // reset the timer if it gets stuck. + + cameraYpan = GetTruckCameraBobbingY(data[0]); + SetCameraPanning(0, cameraYpan); +} + +void Task_Truck2(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s16 cameraYpan; + s16 cameraXpan; + s16 box1; + s16 box2; + s16 box3; + + data[0]++; + data[2]++; + + if (data[0] > 5) + { + data[0] = 0; + data[1]++; + } + if ((u16)data[1] == 19) + { + DestroyTask(taskId); + } + else + { + if (gTruckCamera_HorizontalTable[data[1]] == 2) + gTasks[taskId].func = Task_Truck3; + + cameraXpan = gTruckCamera_HorizontalTable[data[1]]; + cameraYpan = GetTruckCameraBobbingY(data[2]); + SetCameraPanning(cameraXpan, cameraYpan); + box1 = GetTruckBoxMovement(data[2] + 30) * 4; + sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3 - cameraXpan, box1 + 3); + box2 = GetTruckBoxMovement(data[2]) * 2; + sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -cameraXpan, box2 - 3); + box3 = GetTruckBoxMovement(data[2]) * 4; + sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3 - cameraXpan, box3); + } +} + +void Task_Truck3(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s16 cameraXpan; + s16 cameraYpan; + + data[0]++; + + if (data[0] > 5) + { + data[0] = 0; + data[1]++; + } + + if ((u16)data[1] == 19) + { + DestroyTask(taskId); + } + else + { + cameraXpan = gTruckCamera_HorizontalTable[data[1]]; + cameraYpan = 0; + SetCameraPanning(cameraXpan, 0); + sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3 - cameraXpan, cameraYpan + 3); + sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -cameraXpan, cameraYpan - 3); + sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3 - cameraXpan, cameraYpan); + } +} + +void Task_HandleTruckSequence(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + /* + Each case has a timer which is handled with data[1], incrementing + until it reaches the if function's condition, which sets the next task up. + */ + case 0: + data[1]++; + if (data[1] == SECONDS(1.5)) + { + SetCameraPanningCallback(0); + data[1] = 0; // reset the timer. + data[2] = CreateTask(Task_Truck1, 0xA); + data[0] = 1; // run the next case. + PlaySE(SE_TRACK_MOVE); + } + break; + case 1: + data[1]++; + if (data[1] == SECONDS(2.5)) + { + pal_fill_black(); + data[1] = 0; + data[0] = 2; + } + break; + case 2: + data[1]++; + if (!gPaletteFade.active && data[1] > SECONDS(5)) + { + data[1] = 0; + DestroyTask(data[2]); + data[3] = CreateTask(Task_Truck2, 0xA); + data[0] = 3; + PlaySE(SE_TRACK_STOP); + } + break; + case 3: + if (!gTasks[data[3]].isActive) // is Truck2 no longer active (is Truck3 active?) + { + InstallCameraPanAheadCallback(); + data[1] = 0; + data[0] = 4; + } + break; + case 4: + data[1]++; + if (data[1] == 90) + { + PlaySE(SE_TRACK_HAIK); + data[1] = 0; + data[0] = 5; + } + break; + case 5: + data[1]++; + if (data[1] == 120) + { + MapGridSetMetatileIdAt(11, 8, 520); + MapGridSetMetatileIdAt(11, 9, 528); + MapGridSetMetatileIdAt(11, 10, 536); + DrawWholeMapView(); + PlaySE(SE_TRACK_DOOR); + DestroyTask(taskId); + ScriptContext2_Disable(); + } + break; + } +} + +void ExecuteTruckSequence(void) +{ + MapGridSetMetatileIdAt(11, 8, 525); + MapGridSetMetatileIdAt(11, 9, 533); + MapGridSetMetatileIdAt(11, 10, 541); + DrawWholeMapView(); + ScriptContext2_Enable(); + CpuFastFill(0, gPlttBufferFaded, 0x400); + CreateTask(Task_HandleTruckSequence, 0xA); +} + +void EndTruckSequence(u8 taskId) +{ + if (!FuncIsActiveTask(Task_HandleTruckSequence)) + { + sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3, 3); + sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 0, -3); + sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3, 0); + } +} + +bool8 sub_80C7754(void) +{ + s8 mapGroup, mapNum; + s16 x, y; + + if (GetSSTidalLocation(&mapGroup, &mapNum, &x, &y)) + { + return FALSE; + } + else + { + warp1_set(mapGroup, mapNum, -1, x, y); + return TRUE; + } +} + +void Task_HandlePorthole(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u16 *var = GetVarPointer(VAR_PORTHOLE); + struct WarpData *location = &gSaveBlock1.location; + + switch (data[0]) + { + case INIT_PORTHOLE: // finish fading before making porthole finish. + if (!gPaletteFade.active) + { + data[1] = 0; + data[0] = EXECUTE_MOVEMENT; // execute movement before checking if should be exited. strange? + } + break; + case IDLE_CHECK: // idle and move. + if (gMain.newKeys & A_BUTTON) + data[1] = 1; + if (!sub_80A212C(0xFF, location->mapNum, location->mapGroup)) + return; + if (CountSSTidalStep(1) == TRUE) + { + if (*var == 2) + *var = 9; + else + *var = 10; + data[0] = 3; + return; + } + data[0] = 2; + case EXECUTE_MOVEMENT: // execute movement. + if (data[1]) + { + data[0] = EXIT_PORTHOLE; // exit porthole. + return; + } + // run this once. + if (*var == 2) // which direction? + { + exec_movement(0xFF, location->mapNum, location->mapGroup, gUnknown_083D295F); + data[0] = IDLE_CHECK; // run case 1. + } + else + { + exec_movement(0xFF, location->mapNum, location->mapGroup, gUnknown_083D2961); + data[0] = IDLE_CHECK; // run case 1. + } + break; + case EXIT_PORTHOLE: // exit porthole. + FlagReset(0x4001); + FlagReset(0x4000); + copy_saved_warp2_bank_and_enter_x_to_warp1(0); + sp13E_warp_to_last_warp(); + DestroyTask(taskId); + break; + } +} + +void sub_80C78A0(void) +{ + u8 spriteId = AddPseudoFieldObject(0x8C, SpriteCallbackDummy, 112, 80, 0); + + gSprites[spriteId].coordOffsetEnabled = FALSE; + + if (VarGet(0x40B4) == 2) + { + StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(4)); + } + else + { + StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(3)); + } +} + +void sub_80C791C(void) +{ + sub_80C78A0(); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = TRUE; + pal_fill_black(); + CreateTask(Task_HandlePorthole, 80); + ScriptContext2_Enable(); +} + +void sub_80C7958(void) +{ + FlagSet(SYS_CRUISE_MODE); + FlagSet(0x4001); + FlagSet(0x4000); + saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); + sub_80C7754(); + sub_8080F9C(); +} diff --git a/src/field/field_specials.c b/src/field/field_specials.c new file mode 100644 index 000000000..454bd8d96 --- /dev/null +++ b/src/field/field_specials.c @@ -0,0 +1,2383 @@ +#include "global.h" +#include "field_specials.h" +#include "diploma.h" +#include "fieldmap.h" +#include "event_data.h" +#include "battle_tower.h" +#include "field_map_obj.h" +#include "region_map.h" +#include "field_region_map.h" +#include "field_message_box.h" +#include "field_camera.h" +#include "field_player_avatar.h" +#include "main.h" +#include "map_constants.h" +#include "rom4.h" +#include "script.h" +#include "songs.h" +#include "string_util.h" +#include "strings.h" +#include "pokeblock.h" +#include "species.h" +#include "abilities.h" +#include "moves.h" +#include "text.h" +#include "wallclock.h" +#include "tv.h" +#include "rtc.h" +#include "link.h" +#include "songs.h" +#include "sound.h" +#include "menu.h" +#include "starter_choose.h" +#include "menu_helpers.h" +#include "battle_tower.h" +#include "field_weather.h" +#include "pokemon_summary_screen.h" +#include "rng.h" + +#if ENGLISH +#define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD +#elif GERMAN +#define CHAR_DECIMAL_SEPARATOR CHAR_COMMA +#endif + +extern struct WarpData gUnknown_020297F0; +extern u8 gBattleOutcome; +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gScriptResult; + +EWRAM_DATA u8 gUnknown_02039250 = 0; +EWRAM_DATA u8 gUnknown_02039251 = 0; +EWRAM_DATA u32 gUnknown_02039254 = 0; +EWRAM_DATA u8 gUnknown_02039258 = 0; +EWRAM_DATA u8 gUnknown_02039259 = 0; +EWRAM_DATA u8 gUnknown_0203925A = 0; +EWRAM_DATA u8 gUnknown_0203925B = 0; +EWRAM_DATA u8 gUnknown_0203925C = 0; + +static void RecordCyclingRoadResults(u32, u8); + +static struct ElevatorMenu gUnknown_03000760[20]; + +void sub_810D6A4(void) { + SetMainCallback2(sub_8145D88); + ScriptContext2_Enable(); +} + +void sub_810D6B8(void) { + gMain.savedCallback = c2_exit_to_overworld_2_switch; + SetMainCallback2(CB2_ViewWallClock); + ScriptContext2_Enable(); +} + +void ResetCyclingRoadChallengeData(void) { + gUnknown_02039250 = 0; + gUnknown_02039251 = 0; + gUnknown_02039254 = 0; +} + +void BeginCyclingRoadChallenge(void) { + gUnknown_02039250 = 1; + gUnknown_02039251 = 0; + gUnknown_02039254 = gMain.vblankCounter1; +} + +u16 GetPlayerAvatarBike(void) { + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) + { + return 1; + } + + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) + { + return 2; + } + + return 0; +} + +void DetermineCyclingRoadResults(u32 arg0, u8 arg1) { + u8 result; + + if (arg1 <= 99) + { + ConvertIntToDecimalStringN(gStringVar1, arg1, STR_CONV_MODE_LEFT_ALIGN, 2); + StringAppend(gStringVar1, gOtherText_Times); + } + else + { + StringCopy(gStringVar1, gOtherText_99Times); + } + + if (arg0 < 3600) + { + ConvertIntToDecimalStringN(gStringVar2, arg0 / 60, STR_CONV_MODE_RIGHT_ALIGN, 2); + gStringVar2[2] = CHAR_DECIMAL_SEPARATOR; + ConvertIntToDecimalStringN(&gStringVar2[3], ((arg0 % 60) * 100) / 60, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(gStringVar2, gOtherText_Seconds); + } + else + { + StringCopy(gStringVar2, gOtherText_1Minute); + } + + result = 0; + if (arg1 == 0) + { + result = 5; + } + else if (arg1 < 4) + { + result = 4; + } + else if (arg1 < 10) + { + result = 3; + } + else if (arg1 < 20) + { + result = 2; + } + else if (arg1 < 100) + { + result = 1; + } + + if (arg0 / 60 <= 10) + { + result += 5; + } + else if (arg0 / 60 <= 15) + { + result += 4; + } + else if (arg0 / 60 <= 20) + { + result += 3; + } + else if (arg0 / 60 <= 40) + { + result += 2; + } + else if (arg0 / 60 < 60) + { + result += 1; + } + + + gScriptResult = result; +} + +void FinishCyclingRoadChallenge(void) { + const u32 time = gMain.vblankCounter1 - gUnknown_02039254; + + DetermineCyclingRoadResults(time, gUnknown_02039251); + RecordCyclingRoadResults(time, gUnknown_02039251); +} + +static void RecordCyclingRoadResults(u32 arg0, u8 arg1) { + u16 high = VarGet(0x4028); + u16 low = VarGet(0x4029); + u32 record = high + (low << 16); + + if (record > arg0 || record == 0) + { + VarSet(0x4028, arg0); + VarSet(0x4029, arg0 >> 16); + VarSet(0x4027, arg1); + } +} + +u16 GetRecordedCyclingRoadResults(void) { + u16 high = VarGet(0x4028); + u16 low = VarGet(0x4029); + u32 record = high + (low << 16); + + if (record == 0) + { + return FALSE; + } + + DetermineCyclingRoadResults(record, VarGet(0x4027)); + return TRUE; +} + +void UpdateCyclingRoadState(void) { + if (gUnknown_020297F0.mapNum == MAP_ID_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE && gUnknown_020297F0.mapGroup == MAP_GROUP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE) + { + return; + } + + if (VarGet(0x40a9) == 2 || VarGet(0x40a9) == 3) + { + VarSet(0x40a9, 0); + sav1_set_battle_music_maybe(SE_STOP); + } +} + +void SetSSTidalFlag(void) +{ + FlagSet(SYS_CRUISE_MODE); + *GetVarPointer(VAR_CRUISE_STEP_COUNT) = 0; +} + +void ResetSSTidalFlag(void) +{ + FlagReset(SYS_CRUISE_MODE); +} + +bool32 CountSSTidalStep(u16 delta) +{ + if (!FlagGet(SYS_CRUISE_MODE) || (*GetVarPointer(VAR_CRUISE_STEP_COUNT) += delta) <= 0xcc) + { + return FALSE; + } + return TRUE; +} + +u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y) +{ + u16 *varCruiseStepCount = GetVarPointer(VAR_CRUISE_STEP_COUNT); + switch (*GetVarPointer(VAR_PORTHOLE)) + { + case 1: + case 8: + return 1; + case 3: + case 9: + return 4; + case 4: + case 5: + return 2; + case 6: + case 10: + return 3; + case 2: + if (*varCruiseStepCount < 60) + { + *mapNum = MAP_ID_ROUTE134; + *x = *varCruiseStepCount + 19; + } + else if (*varCruiseStepCount < 140) + { + *mapNum = MAP_ID_ROUTE133; + *x = *varCruiseStepCount - 60; + } + else + { + *mapNum = MAP_ID_ROUTE132; + *x = *varCruiseStepCount - 140; + } + break; + case 7: + if (*varCruiseStepCount < 66) + { + *mapNum = MAP_ID_ROUTE132; + *x = 65 - *varCruiseStepCount; + } + else if (*varCruiseStepCount < 146) { + *mapNum = MAP_ID_ROUTE133; + *x = 145 - *varCruiseStepCount; + } + else + { + *mapNum = MAP_ID_ROUTE134; + *x = 224 - *varCruiseStepCount; + } + break; + } + *mapGroup = MAP_GROUP_ROUTE132; + *y = 20; + return 0; +} + +u8 GetLinkPartnerNames(void) +{ + u8 i; + u8 j = 0; + u8 myLinkPlayerNumber = sub_8008218(); + u8 nLinkPlayers = sub_800820C(); + for (i=0; i=0; i--) + { + MapGridSetMetatileIdAt(switchCoords->x, switchCoords->y, 0x206); + switchCoords++; + } + for (y=12; y<24; y++) + { + for (x=7; x<16; x++) + { + switch (MapGridGetMetatileIdAt(x, y)) + { + case 0x220: + MapGridSetMetatileIdAt(x, y, 0x230); + break; + case 0x221: + MapGridSetMetatileIdAt(x, y, 0x231); + break; + case 0x228: + MapGridSetMetatileIdAt(x, y, 0x238); + break; + case 0x229: + MapGridSetMetatileIdAt(x, y, 0x239); + break; + case 0x222: + MapGridSetMetatileIdAt(x, y, 0x232); + break; + case 0x223: + MapGridSetMetatileIdAt(x, y, 0x233); + break; + case 0x22a: + MapGridSetMetatileIdAt(x, y, 0x23a); + break; + case 0x22b: + MapGridSetMetatileIdAt(x, y, 0x23b); + break; + case 0x240: + MapGridSetMetatileIdAt(x, y, 0xe42); + break; + case 0x241: + MapGridSetMetatileIdAt(x, y, 0xe43); + break; + case 0x248: + case 0x249: + MapGridSetMetatileIdAt(x, y, 0x21a); + break; + case 0x250: + MapGridSetMetatileIdAt(x, y, 0x251); + break; + } + } + } +} + +static void Task_PetalburgGym(u8); +static void PetalburgGymFunc(u8, u16); +const u8 gUnknown_083F8370[] = {0, 1, 1, 1, 1}; +const u16 gUnknown_083F8376[] = {0x218, 0x219, 0x21a, 0x21b, 0x21c}; + +void PetalburgGymSpecial1(void) +{ + gUnknown_02039258 = 0; + gUnknown_02039259 = 0; + PlaySE(SE_KI_GASYAN); + CreateTask(Task_PetalburgGym, 8); +} + +static void Task_PetalburgGym(u8 taskId) +{ + if (gUnknown_083F8370[gUnknown_02039259] == gUnknown_02039258) + { + PetalburgGymFunc(gSpecialVar_0x8004, gUnknown_083F8376[gUnknown_02039259]); + gUnknown_02039258 = 0; + if ((++gUnknown_02039259) == 5) + { + DestroyTask(taskId); + EnableBothScriptContexts(); + } + } + else + { + gUnknown_02039258++; + } +} + +static void PetalburgGymFunc(u8 a0, u16 a1) +{ + u16 x[4]; + u16 y[4]; + u8 i; + u8 nDoors = 0; + switch (a0) + { + case 1: + nDoors = 2; + x[0] = 1; + x[1] = 7; + y[0] = 0x68; + y[1] = 0x68; + break; + case 2: + nDoors = 2; + x[0] = 1; + x[1] = 7; + y[0] = 0x4e; + y[1] = 0x4e; + break; + case 3: + nDoors = 2; + x[0] = 1; + x[1] = 7; + y[0] = 0x5b; + y[1] = 0x5b; + break; + case 4: + nDoors = 1; + x[0] = 7; + y[0] = 0x27; + break; + case 5: + nDoors = 2; + x[0] = 1; + x[1] = 7; + y[0] = 0x34; + y[1] = 0x34; + break; + case 6: + nDoors = 1; + x[0] = 1; + y[0] = 0x41; + break; + case 7: + nDoors = 1; + x[0] = 7; + y[0] = 0xd; + break; + case 8: + nDoors = 1; + x[0] = 1; + y[0] = 0x1a; + break; + } + for (i=0; i 9999) + { + weekCount = 9999; + } + return weekCount; +} + +u8 GetLeadMonFriendshipScore(void) +{ + struct Pokemon *pokemon = &gPlayerParty[GetLeadMonIndex()]; + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255) + { + return 6; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 200) + { + return 5; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 150) + { + return 4; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 100) + { + return 3; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 50) + { + return 2; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 1) + { + return 1; + } + return 0; +} + +void CB2_FieldShowRegionMap(void) +{ + FieldInitRegionMap(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void FieldShowRegionMap(void) +{ + SetMainCallback2(CB2_FieldShowRegionMap); +} + +static void Task_PCTurnOnEffect(u8); +static void PCTurnOffEffect_0(struct Task *); +static void PCTurnOffEffect_1(s16, s8, s8); +static void PCTurnOffEffect(void); + +void DoPCTurnOnEffect(void) +{ + if (FuncIsActiveTask(Task_PCTurnOnEffect) != TRUE) + { + u8 taskId = CreateTask(Task_PCTurnOnEffect, 8); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = taskId; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 0; + } +} + +static void Task_PCTurnOnEffect(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + if (task->data[0] == 0) + { + PCTurnOffEffect_0(task); + } +} + +static void PCTurnOffEffect_0(struct Task *task) +{ + u8 playerDirectionLowerNybble; + s8 dx = 0; + s8 dy = 0; + if (task->data[3] == 6) + { + task->data[3] = 0; + playerDirectionLowerNybble = player_get_direction_lower_nybble(); + switch (playerDirectionLowerNybble) + { + case DIR_NORTH: + dx = 0; + dy = -1; + break; + case DIR_WEST: + dx = -1; + dy = -1; + break; + case DIR_EAST: + dx = 1; + dy = -1; + break; + } + PCTurnOffEffect_1(task->data[4], dx, dy); + DrawWholeMapView(); + task->data[4] ^= 1; + if ((++task->data[2]) == 5) + { + DestroyTask(task->data[1]); + } + } + task->data[3]++; +} + +static void PCTurnOffEffect_1(s16 flag, s8 dx, s8 dy) +{ + u16 tileId = 0; + if (flag != 0) + { + if (gSpecialVar_0x8004 == 0) + { + tileId = 0x4; + } + else if (gSpecialVar_0x8004 == 1) + { + tileId = 0x25a; + } + else if (gSpecialVar_0x8004 == 2) + { + tileId = 0x259; + } + } + else + { + if (gSpecialVar_0x8004 == 0) + { + tileId = 0x5; + } + else if (gSpecialVar_0x8004 == 1) + { + tileId = 0x27f; + } + else if (gSpecialVar_0x8004 == 2) + { + tileId = 0x27e; + } + } + MapGridSetMetatileIdAt(gSaveBlock1.pos.x + dx + 7, gSaveBlock1.pos.y + dy + 7, tileId | 0xc00); +} + +void DoPCTurnOffEffect(void) +{ + PCTurnOffEffect(); +} + +static void PCTurnOffEffect(void) +{ + s8 dx = 0; + s8 dy = 0; + u16 tileId = 0; + u8 playerDirectionLowerNybble = player_get_direction_lower_nybble(); + switch (playerDirectionLowerNybble) + { + case DIR_NORTH: + dx = 0; + dy = -1; + break; + case DIR_WEST: + dx = -1; + dy = -1; + break; + case DIR_EAST: + dx = 1; + dy = -1; + break; + } + if (gSpecialVar_0x8004 == 0) + { + tileId = 0x4; + } + else if (gSpecialVar_0x8004 == 1) + { + tileId = 0x25a; + } + else if (gSpecialVar_0x8004 == 2) + { + tileId = 0x259; + } + MapGridSetMetatileIdAt(gSaveBlock1.pos.x + dx + 7, gSaveBlock1.pos.y + dy + 7, tileId | 0xc00); + DrawWholeMapView(); +} + +static void Task_LotteryCornerComputerEffect(u8); +static void LotteryCornerComputerEffect(struct Task *); + +void DoLotteryCornerComputerEffect(void) +{ + if (FuncIsActiveTask(Task_LotteryCornerComputerEffect) != TRUE) + { + u8 taskId = CreateTask(Task_LotteryCornerComputerEffect, 8); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = taskId; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 0; + } +} + +static void Task_LotteryCornerComputerEffect(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + if (task->data[0] == 0) + { + LotteryCornerComputerEffect(task); + } +} + +static void LotteryCornerComputerEffect(struct Task *task) +{ + if (task->data[3] == 6) + { + task->data[3] = 0; + if (task->data[4] != 0) + { + MapGridSetMetatileIdAt(18, 8, 0xe9d); + MapGridSetMetatileIdAt(18, 9, 0xea5); + } + else + { + MapGridSetMetatileIdAt(18, 8, 0xe58); + MapGridSetMetatileIdAt(18, 9, 0xe60); + } + DrawWholeMapView(); + task->data[4] ^= 1; + if ((++task->data[2]) == 5) + { + DestroyTask(task->data[1]); + } + } + task->data[3]++; +} + +void EndLotteryCornerComputerEffect(void) +{ + MapGridSetMetatileIdAt(18, 8, 0xe9d); + MapGridSetMetatileIdAt(18, 9, 0xea5); + DrawWholeMapView(); +} + +static void sub_810E874(void); +void sub_810E944(void); +void sub_810E984(u8); +bool8 sub_810EAC8(u8, u8); +void sub_810EB90(u8, u8); +void sub_810EBEC(void); +void sub_810EC34(u8); +void sub_810EC9C(u8); +void sub_810ECB0(void); +void sub_810ECD4(void); +void sub_810ECFC(void); +void sub_810ED40(u8); +void sub_810ED60(struct Task *); +void sub_810EEDC(void); + +const u8 *const gUnknown_083F8380[] = { + OtherText_1F, + OtherText_2F, + OtherText_3F, + OtherText_4F, + OtherText_5F, + OtherText_6F, + OtherText_7F, + OtherText_8F, + OtherText_9F, + OtherText_10F, + OtherText_11F, + OtherText_B1F, + OtherText_B2F, + OtherText_B3F, + OtherText_B4F, + OtherText_Rooftop +}; + +void SetDepartmentStoreFloorVar(void) +{ + u8 deptStoreFloor; + switch (gSaveBlock1.warp2.mapNum) + { + case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_1F: + deptStoreFloor = 0; + break; + case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_2F: + deptStoreFloor = 1; + break; + case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_3F: + deptStoreFloor = 2; + break; + case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_4F: + deptStoreFloor = 3; + break; + case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_5F: + deptStoreFloor = 4; + break; + case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP: + deptStoreFloor = 15; + break; + default: + deptStoreFloor = 0; + break; + } + VarSet(VAR_DEPT_STORE_FLOOR, deptStoreFloor); +} + +void ScriptAddElevatorMenuItem(u8 a0, u8 a1, u8 a2, u8 a3) +{ + u8 i; + if (gSpecialVar_0x8004 == 0) + { + for (i=0; i<20; i++) + { + gUnknown_03000760[i].var0 = 16; + } + } + gUnknown_03000760[gSpecialVar_0x8004].var0 = a0; + gUnknown_03000760[gSpecialVar_0x8004].var1 = a1; + gUnknown_03000760[gSpecialVar_0x8004].var2 = a2; + gUnknown_03000760[gSpecialVar_0x8004].var3 = a3; + gSpecialVar_0x8004++; +} + +void ScriptShowElevatorMenu(void) +{ + u8 i = 0; + gUnknown_0203925A = 0; + gUnknown_0203925B = 0; + ScriptAddElevatorMenuItem(16, 0, 0, 0); + while (gUnknown_03000760[i].var0 != 16) + { + gUnknown_0203925A++; + i++; + } + sub_810E874(); +} + +static void sub_810E874(void) +{ + u8 i; + ScriptContext2_Enable(); + if (gUnknown_0203925A > 5) + { + MenuDrawTextWindow(0, 0, 8, 11); + InitMenu(0, 1, 1, 5, 0, 7); + gUnknown_0203925C = 0; + sub_80F944C(); + LoadScrollIndicatorPalette(); + sub_810ECD4(); + } + else + { + MenuDrawTextWindow(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); + } + sub_810E944(); + CreateTask(sub_810E984, 8); +} + +void sub_810E944(void) +{ + MenuDrawTextWindow(20, 0, 29, 5); + sub_8072BD8(gOtherText_NowOn, 21, 1, 64); + sub_8072BD8(gUnknown_083F8380[gSpecialVar_0x8005], 21, 3, 64); +} + +void sub_810E984(u8 taskId) +{ + u8 curMenuPos; + if (gMain.newKeys == DPAD_UP && gUnknown_0203925B != 0) + { + gUnknown_0203925B--; + curMenuPos = GetMenuCursorPos(); + MoveMenuCursorNoWrap(-1); + sub_810EAC8(curMenuPos, DPAD_UP); + } + if (gMain.newKeys == DPAD_DOWN && gUnknown_0203925B != gUnknown_0203925A - 1) + { + gUnknown_0203925B++; + curMenuPos = GetMenuCursorPos(); + MoveMenuCursorNoWrap(+1); + sub_810EAC8(curMenuPos, DPAD_DOWN); + } + if (gMain.newKeys & A_BUTTON) + { + saved_warp2_set_2(0, gUnknown_03000760[gUnknown_0203925B].var1, gUnknown_03000760[gUnknown_0203925B].var2, -1, 2, 1); + if (gSpecialVar_0x8005 == gUnknown_0203925B) + { + gScriptResult = 0; + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(0, 0, 29, 12); + sub_810EC9C(taskId); + } + else + { + gScriptResult = 1; + gSpecialVar_0x8005 = gUnknown_0203925B; + sub_810EBEC(); + FieldObjectTurnByLocalIdAndMap(gScriptLastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, DIR_SOUTH); + sub_810EEDC(); + MenuZeroFillScreen(); + DestroyTask(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) + { + gScriptResult = 0; + PlaySE(SE_SELECT); + sub_810EEDC(); + MenuZeroFillWindowRect(0, 0, 29, 12); + sub_810EC9C(taskId); + } +} + +// This function, as written, swaps the roles of r4 and r5 throughout. +#ifdef NONMATCHING +bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) +{ + u8 i; + bool8 flag = 0; + u8 newPos = 0; + if (gUnknown_0203925A < 5) + { + return FALSE; + } + if (dpadInput == DPAD_UP) + { + if (prevMenuPos == 0) + { + newPos = gUnknown_0203925B; + flag = 1; + } + } + else if (dpadInput == DPAD_DOWN) + { + if (prevMenuPos == 4) + { + newPos = gUnknown_0203925B - 4; + flag = 1; + } + } + if (flag) + { + sub_810EB90(newPos, 5); + MenuFillWindowRectWithBlankTile(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); + } + } + return flag; +} +#else +__attribute__((naked)) +bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r8\n" + "\tpush {r7}\n" + "\tlsls r0, 24\n" + "\tlsrs r2, r0, 24\n" + "\tadds r5, r2, 0\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tadds r3, r1, 0\n" + "\tmovs r7, 0\n" + "\tmovs r4, 0\n" + "\tldr r0, _0810EAEC @ =gUnknown_0203925A\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x4\n" + "\tbhi _0810EAF0\n" + "\tmovs r0, 0\n" + "\tb _0810EB78\n" + "\t.align 2, 0\n" + "_0810EAEC: .4byte gUnknown_0203925A\n" + "_0810EAF0:\n" + "\tcmp r1, 0x40\n" + "\tbne _0810EB04\n" + "\tcmp r2, 0\n" + "\tbne _0810EB18\n" + "\tldr r0, _0810EB00 @ =gUnknown_0203925B\n" + "\tldrb r4, [r0]\n" + "\tmovs r7, 0x1\n" + "\tb _0810EB1C\n" + "\t.align 2, 0\n" + "_0810EB00: .4byte gUnknown_0203925B\n" + "_0810EB04:\n" + "\tcmp r3, 0x80\n" + "\tbne _0810EB18\n" + "\tcmp r5, 0x4\n" + "\tbne _0810EB18\n" + "\tldr r0, _0810EB84 @ =gUnknown_0203925B\n" + "\tldrb r0, [r0]\n" + "\tsubs r0, 0x4\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tmovs r7, 0x1\n" + "_0810EB18:\n" + "\tcmp r7, 0\n" + "\tbeq _0810EB76\n" + "_0810EB1C:\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x5\n" + "\tbl sub_810EB90\n" + "\tmovs r0, 0x2\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x7\n" + "\tmovs r3, 0xA\n" + "\tbl MenuFillWindowRectWithBlankTile\n" + "\tmovs r5, 0\n" + "\tldr r2, _0810EB88 @ =gUnknown_03000760\n" + "\tlsls r1, r4, 2\n" + "\tadds r0, r1, r2\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x10\n" + "\tbeq _0810EB76\n" + "\tldr r0, _0810EB8C @ =gUnknown_083F8380\n" + "\tmov r8, r0\n" + "\tadds r6, r2, 0\n" + "_0810EB44:\n" + "\tadds r0, r1, r6\n" + "\tldrb r0, [r0]\n" + "\tlsls r0, 2\n" + "\tadd r0, r8\n" + "\tldr r0, [r0]\n" + "\tlsls r2, r5, 1\n" + "\tadds r2, 0x1\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tmovs r1, 0x1\n" + "\tbl MenuPrint\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tcmp r5, 0x4\n" + "\tbhi _0810EB76\n" + "\tlsls r1, r4, 2\n" + "\tadds r0, r1, r6\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x10\n" + "\tbne _0810EB44\n" + "_0810EB76:\n" + "\tadds r0, r7, 0\n" + "_0810EB78:\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" + "_0810EB84: .4byte gUnknown_0203925B\n" + "_0810EB88: .4byte gUnknown_03000760\n" + "_0810EB8C: .4byte gUnknown_083F8380"); +} +#endif + +void sub_810EB90(u8 newPos, u8 maxItems) +{ + if (newPos == 0) + { + gUnknown_0203925C ^= 0x02; + DestroyVerticalScrollIndicator(0); + } + else + { + sub_810ECB0(); + } + if (newPos + maxItems < gUnknown_0203925A) + { + sub_810ECD4(); + } + else if (newPos + maxItems == gUnknown_0203925A) + { + gUnknown_0203925C ^= 0x01; + DestroyVerticalScrollIndicator(1); + } +} + +void sub_810EBEC(void) +{ + u8 taskId = CreateTask(sub_810EC34, 9); + gTasks[taskId].data[0] = 1; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 1; + gTasks[taskId].data[5] = 3; + SetCameraPanningCallback(NULL); + sub_810ECFC(); + PlaySE(SE_ELEBETA); +} + +void sub_810EC34(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + task->data[1] ++; + if (task->data[1] % task->data[5] == 0) + { + task->data[1] = 0; + task->data[2] ++; + if (task->data[3] == 0) + { + task->data[4] = -task->data[4]; + SetCameraPanning(0, task->data[4]); + if (task->data[2] == 23) + { + PlaySE(SE_PINPON); + sub_810EC9C(taskId); + InstallCameraPanAheadCallback(); + } + } + } +} + +void sub_810EC9C(u8 taskId) +{ + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void sub_810ECB0(void) +{ + if (gUnknown_0203925C >> 1 != 1) + { + gUnknown_0203925C |= 0x2; + CreateVerticalScrollIndicators(0, 0x24, 0x08); + } +} + +void sub_810ECD4(void) +{ + if ((gUnknown_0203925C & 1) == 0) + { + gUnknown_0203925C |= 0x1; + CreateVerticalScrollIndicators(1, 0x24, 0x48); + } +} + +void sub_810ECFC(void) +{ + if (FuncIsActiveTask(sub_810ED40) != TRUE) + { + u8 taskId = CreateTask(sub_810ED40, 8); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = taskId; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 0; + } +} + +void sub_810ED40(u8 taskId) +{ + sub_810ED60(&gTasks[taskId]); +} + +void sub_810ED60(struct Task *task) +{ + if (task->data[3] == 8) + { + task->data[3] = 0; + if (task->data[4] != 0) + { + MapGridSetMetatileIdAt( 7, 7, 0xe68); + MapGridSetMetatileIdAt( 8, 7, 0xe69); + MapGridSetMetatileIdAt( 9, 7, 0xe69); + MapGridSetMetatileIdAt(10, 7, 0xe6a); + MapGridSetMetatileIdAt( 7, 8, 0xe70); + MapGridSetMetatileIdAt( 8, 8, 0xe71); + MapGridSetMetatileIdAt( 9, 8, 0xe71); + MapGridSetMetatileIdAt(10, 8, 0xe72); + MapGridSetMetatileIdAt( 7, 9, 0xe78); + MapGridSetMetatileIdAt( 8, 9, 0xe79); + MapGridSetMetatileIdAt( 9, 9, 0xe79); + MapGridSetMetatileIdAt(10, 9, 0xe7a); + } + else + { + MapGridSetMetatileIdAt( 7, 7, 0xe6b); + MapGridSetMetatileIdAt( 8, 7, 0xe6c); + MapGridSetMetatileIdAt( 9, 7, 0xe6c); + MapGridSetMetatileIdAt(10, 7, 0xe6d); + MapGridSetMetatileIdAt( 7, 8, 0xe73); + MapGridSetMetatileIdAt( 8, 8, 0xe74); + MapGridSetMetatileIdAt( 9, 8, 0xe74); + MapGridSetMetatileIdAt(10, 8, 0xe75); + MapGridSetMetatileIdAt( 7, 9, 0xe7b); + MapGridSetMetatileIdAt( 8, 9, 0xe7c); + MapGridSetMetatileIdAt( 9, 9, 0xe7c); + MapGridSetMetatileIdAt(10, 9, 0xe7d); + } + DrawWholeMapView(); + task->data[4] ^= 1; + task->data[2]++; + if (task->data[2] == 8) + { + DestroyTask(task->data[1]); + } + } + task->data[3]++; +} + +void sub_810EEDC(void) +{ + if ((gUnknown_0203925C & 1) != 0) + { + DestroyVerticalScrollIndicator(1); + } + if ((gUnknown_0203925C >> 1) == 1) + { + DestroyVerticalScrollIndicator(0); + } + BuyMenuFreeMemory(); +} + +void SetTrickHouseEndRoomFlag(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = 0x259; + *specVar = flag; + FlagSet(flag); +} + +void ResetTrickHouseEndRoomFlag(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = 0x259; + *specVar = flag; + FlagReset(flag); +} + +bool8 CheckLeadMonCool(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_COOL) < 200) + { + return FALSE; + } + return TRUE; +} + +bool8 CheckLeadMonBeauty(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_BEAUTY) < 200) + { + return FALSE; + } + return TRUE; +} + +bool8 CheckLeadMonCute(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_CUTE) < 200) + { + return FALSE; + } + return TRUE; +} + +bool8 CheckLeadMonSmart(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SMART) < 200) + { + return FALSE; + } + return TRUE; +} + +bool8 CheckLeadMonTough(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_TOUGH) < 200) + { + return FALSE; + } + return TRUE; +} + +void IsGrassTypeInParty(void) +{ + u8 i; + u16 species; + struct Pokemon *pokemon; + for (i=0; i> 1 != 1) + { + gUnknown_0203925C |= 0x02; + CreateVerticalScrollIndicators(0, 0x2c, 0x08); + } +} + +void sub_810F2B4(void) +{ + if (!(gUnknown_0203925C & 0x01)) + { + gUnknown_0203925C |= 0x01; + CreateVerticalScrollIndicators(1, 0x2c, 0x58); + } +} + +void GlassWorkshopUpdateScrollIndicators(u8 newPos, u8 maxItems) +{ + if (newPos == 0) + { + gUnknown_0203925C ^= 0x02; + DestroyVerticalScrollIndicator(0); + } + else + { + sub_810F290(); + } + if (newPos + maxItems < gUnknown_0203925A) + { + sub_810F2B4(); + } + else if (newPos + maxItems == gUnknown_0203925A) + { + gUnknown_0203925C ^= 0x01; + DestroyVerticalScrollIndicator(1); + } +} + +void SpawnCameraDummy(void) +{ + u8 mapObjectId = SpawnSpecialFieldObjectParametrized(7, 8, 0x7f, gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7, 3); + gMapObjects[mapObjectId].mapobj_bit_13 = 1; + CameraObjectSetFollowedObjectId(gMapObjects[mapObjectId].spriteId); +} + +void RemoveCameraDummy(void) +{ + CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId()); + RemoveFieldObjectByLocalIdAndMap(0x7f, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); +} + +u8 GetPokeblockNameByMonNature(void) +{ + return sub_810CB68(GetNature(&gPlayerParty[GetLeadMonIndex()]), gStringVar1); +} + +void GetSecretBaseNearbyMapName(void) +{ + GetMapSectionName(gStringVar1, VarGet(VAR_SECRET_BASE_MAP), 0); +} + +u16 sub_810F404(void) +{ + return GetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK); +} + +void sub_810F414(void) +{ + sub_8135FF4(gStringVar1); +} + +const u8 gUnknown_083F83E0[] = {12, 2, 4, 5, 1, 8, 7, 11, 3, 10, 9, 6}; +const u8 gUnknown_083F83EC[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5}; +const u8 gUnknown_083F83F8[] = {3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5}; + +u8 sub_810F424(void) +{ + u32 v0 = gSaveBlock1.easyChatPairs[0].unk0_0 + gSaveBlock1.easyChatPairs[0].unk2 + gUnknown_083F83E0[gSpecialVar_0x8004]; + if (GetPriceReduction(2)) + { + return gUnknown_083F83F8[v0 % 12]; + } + return gUnknown_083F83EC[v0 % 12]; +} + +bool8 sub_810F488(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = 0x277; + *specVar = flag; + if (!FlagGet(flag)) + { + return FALSE; + } + return TRUE; +} + +bool8 sub_810F4B0(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = 0x278; + *specVar = flag; + if (!FlagGet(flag)) + { + return FALSE; + } + return TRUE; +} + +bool8 sub_810F4D4(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = 0x279; + *specVar = flag; + if (!FlagGet(flag)) + { + return FALSE; + } + return TRUE; +} + +bool8 sub_810F4FC(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = 0x27a; + *specVar = flag; + if (!FlagGet(flag)) + { + return FALSE; + } + return TRUE; +} + +bool8 LeadMonHasEffortRibbon(void) +{ + return GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_EFFORT_RIBBON, NULL); +} + +void GivLeadMonEffortRibbon(void) +{ + bool8 ribbonSet; + IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); + FlagSet(SYS_RIBBON_GET); + ribbonSet = TRUE; + SetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_EFFORT_RIBBON, &ribbonSet); +} + +bool8 GetLeadMonEVCount(void) +{ + if (GetMonEVCount(&gPlayerParty[GetLeadMonIndex()]) >= 510) + { + return TRUE; + } + return FALSE; +} + +u8 sub_810F5BC(void) +{ + if (!FlagGet(0xc7) && gSaveBlock1.location.mapGroup == MAP_GROUP_RUSTURF_TUNNEL && gSaveBlock1.location.mapNum == MAP_ID_RUSTURF_TUNNEL) + { + if (FlagGet(0x3a3)) + { + VarSet(VAR_0x409a, 4); + return TRUE; + } + else if (FlagGet(0x3a4)) + { + VarSet(VAR_0x409a, 5); + return TRUE; + } + } + return FALSE; +} + +void SetShoalItemFlag(u16 v0) +{ + FlagSet(0x85f); +} + +void PutZigzagoonInPlayerParty(void) +{ + u16 monData; + CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, FALSE, 0); + monData = TRUE; + SetMonData(&gPlayerParty[0], MON_DATA_ALT_ABILITY, (u8 *)&monData); + monData = MOVE_TACKLE; + SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, (u8 *)&monData); + monData = MOVE_NONE; + SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, (u8 *)&monData); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, (u8 *)&monData); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, (u8 *)&monData); +} + +bool8 IsStarterInParty(void) +{ + u8 i; + u16 starter = GetStarterPokemon(VarGet(VAR_FIRST_POKE)); + u8 partyCount = CalculatePlayerPartyCount(); + for (i=0; idata[1]++; + if ((task->data[1] % task->data[5]) == 0) + { + task->data[1] = 0; + task->data[2]++; + if (task->data[3] == 0) + { + task->data[0] = -task->data[0]; + task->data[4] = -task->data[4]; + SetCameraPanning(task->data[0], task->data[4]); + if (task->data[2] == 8) + { + sub_810F814(taskId); + InstallCameraPanAheadCallback(); + } + } + } +} + +static void sub_810F814(u8 taskId) +{ + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +bool8 sub_810F828(void) +{ + return FlagGet(0x2b8); +} + +void SetRoute119Weather(void) +{ + if (is_light_level_1_2_3_5_or_6(get_map_light_from_warp0()) != TRUE) + { + SetSav1Weather(0x14); + } +} + +void SetRoute123Weather(void) +{ + if (is_light_level_1_2_3_5_or_6(get_map_light_from_warp0()) != TRUE) + { + SetSav1Weather(0x15); + } +} + +u8 GetLeadMonIndex(void) +{ + u8 i; + u8 partyCount = CalculatePlayerPartyCount(); + for (i=0; i= 7) + { + return 0; + } + else if (gLocalTime.days < 0) + { + return 8; + } + return 7 - (gLocalTime.days - var40c2); +} + +u16 sub_810F950(void) +{ + VarSet(VAR_0x40C2, gLocalTime.days); + return gLocalTime.days; +} + +bool8 sub_810F96C(void) +{ + GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_NAME, gStringVar1); + if (!StringCompareWithoutExtCtrlCodes(gSaveBlock2.playerName, gStringVar1)) + { + return FALSE; + } + return TRUE; +} + +void sub_810F9AC(void) +{ + if (gScriptResult >= 10000) + { + sub_80BF088(0, gScriptResult); + } + else if (gScriptResult >= 1000) + { + gStringVar1[0] = CHAR_0; + ConvertIntToDecimalStringN(gStringVar1 + 1, gScriptResult, 0, sub_80BF0B8(gScriptResult)); + } + else if (gScriptResult >= 100) + { + gStringVar1[0] = CHAR_0; + gStringVar1[1] = CHAR_0; + ConvertIntToDecimalStringN(gStringVar1 + 2, gScriptResult, 0, sub_80BF0B8(gScriptResult)); + } + else if (gScriptResult >= 10) + { + gStringVar1[0] = CHAR_0; + gStringVar1[1] = CHAR_0; + gStringVar1[2] = CHAR_0; + ConvertIntToDecimalStringN(gStringVar1 + 3, gScriptResult, 0, sub_80BF0B8(gScriptResult)); + } + else + { + gStringVar1[0] = CHAR_0; + gStringVar1[1] = CHAR_0; + gStringVar1[2] = CHAR_0; + gStringVar1[3] = CHAR_0; + ConvertIntToDecimalStringN(gStringVar1 + 4, gScriptResult, 0, sub_80BF0B8(gScriptResult)); + } +} + +const u8 gUnknown_083F8404[] = {2, 1, 2, 1}; +const u8 gUnknown_083F8408[] = {8, 9, 10, 11, 12, 13, 14, 15}; +const u8 gUnknown_083F8410[] = {8, 13, 14, 11, 10, 12, 15, 9}; + +bool8 sub_810FF30(void); +void sub_810FCE8(void); +void sub_810FF48(void); +void sub_810FD80(void); +u16 sub_810FCB0(void); +int sub_810FB9C(void); + +void ResetFanClub(void) +{ + gSaveBlock1.vars[0x41] = 0; + gSaveBlock1.vars[0x42] = 0; +} + +void sub_810FA74(void) +{ + if (sub_810FF30()) + { + sub_810FCE8(); + gSaveBlock1.vars[0x42] = gSaveBlock2.playTimeHours; + } +} + +void sub_810FAA0(void) +{ + if (!((gSaveBlock1.vars[0x41] >> 7) & 1)) + { + sub_810FF48(); + sub_810FD80(); + gSaveBlock1.vars[0x42] = gSaveBlock2.playTimeHours; + FlagReset(0x315); + FlagReset(0x316); + FlagReset(0x317); + FlagReset(0x318); + VarSet(VAR_0x4095, 1); + } +} + +u8 sub_810FB10(u8 a0) +{ + if (VarGet(VAR_0x4095) == 2) + { + if ((gSaveBlock1.vars[0x41] & 0x7f) + gUnknown_083F8404[a0] >= 20) + { + if (sub_810FCB0() < 3) + { + sub_810FB9C(); + gSaveBlock1.vars[0x41] &= 0xff80; + } + else + { + gSaveBlock1.vars[0x41] = (gSaveBlock1.vars[0x41] & 0xff80) | 20; + } + } + else + { + gSaveBlock1.vars[0x41] += gUnknown_083F8404[a0]; + } + } + return gSaveBlock1.vars[0x41] & 0x7f; +} + +int sub_810FB9C(void) +{ + u8 i; + int retval = 0; + for (i=0; i<8; i++) + { + if (!((gSaveBlock1.vars[0x41] >> gUnknown_083F8408[i]) & 0x01)) + { + retval = i; + if (Random() & 1) + { + gSaveBlock1.vars[0x41] |= (1 << gUnknown_083F8408[i]); + return retval; + } + } + } + gSaveBlock1.vars[0x41] |= (1 << gUnknown_083F8408[retval]); + return retval; +} + +int sub_810FC18(void) +{ + u8 i; + int retval = 0; + if (sub_810FCB0() == TRUE) + { + return 0; + } + for (i=0; i<8; i++) + { + if ((gSaveBlock1.vars[0x41] >> gUnknown_083F8410[i]) & 1) + { + retval = i; + if (Random() & 1) + { + gSaveBlock1.vars[0x41] ^= (1 << gUnknown_083F8410[i]); + return retval; + } + } + } + if ((gSaveBlock1.vars[0x41] >> gUnknown_083F8410[retval]) & 1) + { + gSaveBlock1.vars[0x41] ^= (1 << gUnknown_083F8410[retval]); + } + return retval; +} + +u16 sub_810FCB0(void) +{ + u8 i; + u8 retval = 0; + for (i=0; i<8; i++) + { + if ((gSaveBlock1.vars[0x41] >> (i + 8)) & 1) + { + retval ++; + } + } + return retval; +} + +void sub_810FCE8(void) +{ + u8 i = 0; + if (gSaveBlock2.playTimeHours < 999) + { + while (1) + { + if (sub_810FCB0() < 5) + { + gSaveBlock1.vars[0x42] = gSaveBlock2.playTimeHours; + break; + } + else if (i == 8) + { + break; + } + else if (gSaveBlock2.playTimeHours - gSaveBlock1.vars[0x42] < 12) + { + return; + } + sub_810FC18(); + gSaveBlock1.vars[0x42] += 12; + i++; + } + } +} + +bool8 sub_810FD60(void) +{ + return (gSaveBlock1.vars[0x41] >> gSpecialVar_0x8004) & 0x01; +} + +void sub_810FD80(void) +{ + gSaveBlock1.vars[0x41] |= 0x2000; + gSaveBlock1.vars[0x41] |= 0x100; + gSaveBlock1.vars[0x41] |= 0x400; +} + +void sub_810FE1C(void *, u8, u8); + +void sub_810FDAC(void) +{ + u8 a = 0; + u8 b = 0; + switch (gSpecialVar_0x8004) + { + case 8: + break; + case 9: + break; + case 10: + a = 0; + b = 3; + break; + case 11: + a = 0; + b = 1; + break; + case 12: + a = 1; + b = 0; + break; + case 13: + a = 0; + b = 4; + break; + case 14: + a = 1; + b = 5; + break; + case 15: + break; + } + sub_810FE1C(gSaveBlock1.linkBattleRecords, a, b); +} + +void sub_810FE1C(void *linkRecords, u8 a, u8 b) +{ + u8 *curRecord = (linkRecords + 16 * a); + if (*curRecord == EOS) + { + switch (b) + { + case 0: + StringCopy(gStringVar1, gOtherText_Wallace); + break; + case 1: + StringCopy(gStringVar1, gOtherText_Steven); + break; + case 2: + StringCopy(gStringVar1, gOtherText_Brawly); + break; + case 3: + StringCopy(gStringVar1, gOtherText_Winona); + break; + case 4: + StringCopy(gStringVar1, gOtherText_Phoebe); + break; + case 5: + StringCopy(gStringVar1, gOtherText_Glacia); + break; + default: + StringCopy(gStringVar1, gOtherText_Wallace); + break; + } + } + else + { + StringCopyN(gStringVar1, curRecord, 7); + gStringVar1[7] = EOS; + if (gStringVar1[0] == 0xfc && gStringVar1[1] == 0x15) + { + ConvertInternationalString(gStringVar1, 1); + } + } +} + +void sub_810FEFC(void) +{ + if (VarGet(VAR_0x4095) == 2) + { + sub_810FA74(); + if (gBattleOutcome == 1) + { + sub_810FB9C(); + } + else + { + sub_810FC18(); + } + } +} + +bool8 sub_810FF30(void) +{ + return (gSaveBlock1.vars[0x41] >> 7) & 0x01; +} + +void sub_810FF48(void) +{ + gSaveBlock1.vars[0x41] |= 0x80; +} + +u8 sub_810FF60(void) +{ + return sub_810FB10(gSpecialVar_0x8004); +} diff --git a/src/field/field_tasks.c b/src/field/field_tasks.c new file mode 100644 index 000000000..caf2ce6b9 --- /dev/null +++ b/src/field/field_tasks.c @@ -0,0 +1,859 @@ +// +// Created by scott on 6/22/2017. +// + +#include "global.h" +#include "task.h" +#include "main.h" +#include "vars.h" +#include "bike.h" +#include "item.h" +#include "items.h" +#include "event_data.h" +#include "rom4.h" +#include "clock.h" +#include "script.h" +#include "field_special_scene.h" +#include "field_effect_helpers.h" +#include "secret_base.h" +#include "metatile_behavior.h" +#include "fieldmap.h" +#include "field_player_avatar.h" +#include "field_camera.h" +#include "songs.h" +#include "sound.h" +#include "field_tasks.h" + +void DummyPerStepCallback(u8); +void PerStepCallback_8069F64(u8); +void PerStepCallback_8069AA0(u8); +void PerStepCallback_8069864(u8); +void PerStepCallback_8069DD4(u8); +void PerStepCallback_806A07C(u8); + +void (*const gUnknown_08376364[])(u8) = { + DummyPerStepCallback, + PerStepCallback_8069F64, + PerStepCallback_8069AA0, + PerStepCallback_8069864, + PerStepCallback_8069DD4, + EndTruckSequence, + sub_80BCF1C, + PerStepCallback_806A07C +}; + +void Task_RunPerStepCallback(u8 taskId) +{ + int idx = gTasks[taskId].data[0]; + gUnknown_08376364[idx](taskId); +} + +static void RunTimeBasedEvents(s16 *taskData) +{ + switch (*taskData) + { + case 0: + if (gMain.vblankCounter1 & 0x1000) + { + DoTimeBasedEvents(); + (*taskData)++; + } + break; + case 1: + if (!(gMain.vblankCounter1 & 0x1000)) + { + (*taskData)--; + } + break; + } +} + +void Task_RunTimeBasedEvents(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + if (!ScriptContext2_IsEnabled()) + { + RunTimeBasedEvents(taskData); + sub_80540D0(taskData + 1, taskData + 2); + } +} + +void Task_MuddySlope(u8); + +void SetUpFieldTasks(void) +{ + if (!FuncIsActiveTask(Task_RunPerStepCallback)) + { + u8 taskId = CreateTask(Task_RunPerStepCallback, 0x50); + gTasks[taskId].data[0] = 0; + } + if (!FuncIsActiveTask(Task_MuddySlope)) + { + CreateTask(Task_MuddySlope, 0x50); + } + if (!FuncIsActiveTask(Task_RunTimeBasedEvents)) + { + CreateTask(Task_RunTimeBasedEvents, 0x50); + } +} + +void ActivatePerStepCallback(u8 callback) +{ + s16 *dataPointer; + s16 *dataStart; + s16 zero; + u8 taskId = FindTaskIdByFunc(Task_RunPerStepCallback); + if (taskId != 0xff) + { + dataStart = gTasks[taskId].data; + zero = 0; + dataPointer = &dataStart[15]; + do + { + *dataPointer-- = zero; + } while ((int)dataPointer >= (int)dataStart); + if (callback >= ARRAY_COUNT(gUnknown_08376364)) + { + *dataStart = 0; + } + else + { + *dataStart = callback; + } + } +} + +void ResetFieldTasksArgs(void) +{ + u8 taskId; + s16 *taskData; + taskId = FindTaskIdByFunc(Task_RunPerStepCallback); + if (taskId != 0xff) + { + taskData = gTasks[taskId].data; + } + taskId = FindTaskIdByFunc(Task_RunTimeBasedEvents); + if (taskId != 0xff) + { + taskData = gTasks[taskId].data; + taskData[1] = 0; + taskData[2] = 0; + } +} + +const struct MetatileOffset gUnknown_08376384[][2] = { + {{ 0, 0,0x259}, { 0, 1,0x261}}, + {{ 0, -1,0x259}, { 0, 0,0x261}}, + {{ 0, 0,0x252}, { 1, 0,0x253}}, + {{ -1, 0,0x252}, { 0, 0,0x253}} +}; + +const struct MetatileOffset gUnknown_083763A4[][2] = { + {{ 0, 0,0x25A}, { 0, 1,0x262}}, + {{ 0, -1,0x25A}, { 0, 0,0x262}}, + {{ 0, 0,0x254}, { 1, 0,0x255}}, + {{ -1, 0,0x254}, { 0, 0,0x255}} +}; + +const struct MetatileOffset gUnknown_083763C4[][2] = { + {{ 0, 0,0x258}, { 0, 1,0x260}}, + {{ 0, -1,0x258}, { 0, 0,0x260}}, + {{ 0, 0,0x250}, { 1, 0,0x251}}, + {{ -1, 0,0x250}, { 0, 0,0x251}} +}; + +void DummyPerStepCallback(u8 taskId) {} + +const struct MetatileOffset *sub_80695E0(const struct MetatileOffset a0[][2], s8 a1) +{ + if (sub_80576A0(a1)) + { + return a0[0]; + } + else if (sub_80576B4(a1)) + { + return a0[1]; + } + else if (sub_80576C8(a1)) + { + return a0[2]; + } + else if (sub_80576DC(a1)) + { + return a0[3]; + } + else + { + return NULL; + } +} + +#ifdef NONMATCHING +void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag) +{ + const struct MetatileOffset *offsetData = sub_80695E0(offsets, MapGridGetMetatileBehaviorAt(x, y)); + const struct MetatileOffset *offsetData2 = offsetData; + if (offsetData != NULL) + { + MapGridSetMetatileIdAt(x + offsetData[0].x, y + offsetData[0].y, offsetData[0].tileId); + if (flag) + { + CurrentMapDrawMetatileAt(x + offsetData[0].x, y + offsetData[0].y); + } + MapGridSetMetatileIdAt(x + offsetData2[1].x, y + offsetData2[1].y, offsetData2[1].tileId); + if (flag) + { + CurrentMapDrawMetatileAt(x + offsetData2[1].x, y + offsetData2[1].y); + } + } +} +#else +__attribute__((naked)) +void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r8\n" + "\tpush {r7}\n" + "\tadds r5, r0, 0\n" + "\tmov r8, r3\n" + "\tlsls r1, 16\n" + "\tasrs r6, r1, 16\n" + "\tlsls r2, 16\n" + "\tasrs r7, r2, 16\n" + "\tadds r0, r6, 0\n" + "\tadds r1, r7, 0\n" + "\tbl MapGridGetMetatileBehaviorAt\n" + "\tadds r1, r0, 0\n" + "\tlsls r1, 16\n" + "\tlsrs r1, 16\n" + "\tadds r0, r5, 0\n" + "\tbl sub_80695E0\n" + "\tadds r4, r0, 0\n" + "\tadds r5, r4, 0\n" + "\tcmp r4, 0\n" + "\tbeq _080696B6\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r4, r0]\n" + "\tadds r0, r6, r0\n" + "\tmovs r1, 0x1\n" + "\tldrsb r1, [r4, r1]\n" + "\tadds r1, r7, r1\n" + "\tldrh r2, [r4, 0x2]\n" + "\tbl MapGridSetMetatileIdAt\n" + "\tmov r0, r8\n" + "\tcmp r0, 0\n" + "\tbeq _0806968E\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r4, r0]\n" + "\tadds r0, r6, r0\n" + "\tmovs r1, 0x1\n" + "\tldrsb r1, [r4, r1]\n" + "\tadds r1, r7, r1\n" + "\tbl CurrentMapDrawMetatileAt\n" + "_0806968E:\n" + "\tmovs r0, 0x4\n" + "\tldrsb r0, [r5, r0]\n" + "\tadds r0, r6, r0\n" + "\tmovs r1, 0x5\n" + "\tldrsb r1, [r5, r1]\n" + "\tadds r1, r7, r1\n" + "\tldrh r2, [r5, 0x6]\n" + "\tbl MapGridSetMetatileIdAt\n" + "\tmov r0, r8\n" + "\tcmp r0, 0\n" + "\tbeq _080696B6\n" + "\tmovs r0, 0x4\n" + "\tldrsb r0, [r5, r0]\n" + "\tadds r0, r6, r0\n" + "\tmovs r1, 0x5\n" + "\tldrsb r1, [r5, r1]\n" + "\tadds r1, r7, r1\n" + "\tbl CurrentMapDrawMetatileAt\n" + "_080696B6:\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif + +void sub_80696C0(s16 x, s16 y, bool32 flag) +{ + sub_8069638(gUnknown_08376384, x, y, flag); +} + +void sub_80696E4(s16 x, s16 y, bool32 flag) +{ + sub_8069638(gUnknown_083763A4, x, y, flag); +} + +void sub_8069708(s16 x, s16 y, bool32 flag) +{ + sub_8069638(gUnknown_083763C4, x, y, flag); +} + +bool32 sub_806972C(s16 x1, s16 y1, s16 x2, s16 y2) +{ + s8 metatileBehavior = MapGridGetMetatileBehaviorAt(x2, y2); + if (sub_80576A0(metatileBehavior)) + { + if (y1 > y2) + { + return FALSE; + } + } + else if (sub_80576B4(metatileBehavior)) + { + if (y1 < y2) + { + return FALSE; + } + } + else if (sub_80576C8(metatileBehavior)) + { + if (x1 > x2) + { + return FALSE; + } + } + else if (sub_80576DC(metatileBehavior)) + { + if (x1 < x2) + { + return FALSE; + } + } + return TRUE; +} + +bool32 sub_80697C8(s16 x1, s16 y1, s16 x2, s16 y2) +{ + s8 metatileBehavior = MapGridGetMetatileBehaviorAt(x1, y1); + if (sub_80576A0(metatileBehavior)) + { + if (y1 < y2) + { + return FALSE; + } + } + else if (sub_80576B4(metatileBehavior)) + { + if (y1 > y2) + { + return FALSE; + } + } + else if (sub_80576C8(metatileBehavior)) + { + if (x1 < x2) + { + return FALSE; + } + } + else if (sub_80576DC(metatileBehavior)) + { + if (x1 > x2) + { + return FALSE; + } + } + return TRUE; +} + +void PerStepCallback_8069864(u8 taskId) +{ + s16 *data; + s16 x, y; + data = gTasks[taskId].data; + PlayerGetDestCoords(&x, &y); + switch (data[1]) + { + case 0: + data[2] = x; + data[3] = y; + sub_80696E4(x, y, TRUE); + data[1] = 1; + break; + case 1: + if (x != data[2] || y != data[3]) + { + if (sub_806972C(x, y, data[2], data[3])) + { + sub_80696C0(data[2], data[3], TRUE); + sub_8069708(data[2], data[3], FALSE); + data[4] = data[2]; + data[5] = data[3]; + data[1] = 2; + data[6] = 8; + } + else + { + data[4] = -1; + data[5] = -1; + } + if (sub_80697C8(x, y, data[2], data[3])) + { + sub_80696C0(x, y, TRUE); + data[1] = 2; + data[6] = 8; + } + data[2] = x; + data[3] = y; + if (MetatileBehavior_IsPacifidlogLog(MapGridGetMetatileBehaviorAt(x, y))) + { + PlaySE(SE_MIZU); + } + } + break; + case 2: + if ((--data[6]) == 0) + { + sub_80696E4(x, y, TRUE); + if (data[4] != -1 && data[5] != -1) + { + sub_8069708(data[4], data[5], TRUE); + } + data[1] = 1; + } + break; + } +} + +void sub_80699D8(s16 x, s16 y) +{ + u8 z = PlayerGetZCoord(); + if (!(z & 0x01)) + { + switch (MapGridGetMetatileIdAt(x, y)) + { + case 0x24e: + MapGridSetMetatileIdAt(x, y, 0x24f); + break; + case 0x256: + MapGridSetMetatileIdAt(x, y, 0x257); + break; + } + } +} + +void sub_8069A3C(s16 x, s16 y) +{ + u8 z = PlayerGetZCoord(); + if (!(z & 0x01)) + { + switch (MapGridGetMetatileIdAt(x, y)) + { + case 0x24f: + MapGridSetMetatileIdAt(x, y, 0x24e); + break; + case 0x257: + MapGridSetMetatileIdAt(x, y, 0x256); + break; + } + } +} + +void PerStepCallback_8069AA0(u8 taskId) +{ + bool8 isFortreeBridgeCur; + bool8 isFortreeBridgePrev; + u8 z, flag; + s16 x, y, x2, y2; + s16 *data = gTasks[taskId].data; + PlayerGetDestCoords(&x, &y); + switch (data[1]) + { + default: + break; + case 0: + data[2] = x; + data[3] = y; + if (MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y))) + { + sub_80699D8(x, y); + CurrentMapDrawMetatileAt(x, y); + } + data[1] = 1; + break; + case 1: + x2 = data[2]; + y2 = data[3]; + if (x == x2 && y == y2) + { + break; + } + isFortreeBridgeCur = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y)); + isFortreeBridgePrev = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x2, y2)); + z = PlayerGetZCoord(); + flag = 0; + if ((u8)(z & 1) == 0) + { + flag = 1; + } + if (flag && (isFortreeBridgeCur == 1 || isFortreeBridgePrev == 1)) + { + PlaySE(SE_HASHI); + } + if (isFortreeBridgePrev) + { + sub_8069A3C(x2, y2); + CurrentMapDrawMetatileAt(x2, y2); + sub_80699D8(x, y); + CurrentMapDrawMetatileAt(x, y); + } + data[4] = x2; + data[5] = y2; + data[2] = x; + data[3] = y; + if (!isFortreeBridgePrev) + { + break; + } + data[6] = 16; + data[1] = 2; + // fallthrough + case 2: + data[6]--; + x2 = data[4]; + y2 = data[5]; + switch (data[6] % 7) + { + case 0: + CurrentMapDrawMetatileAt(x2, y2); + case 1: + case 2: + case 3: + break; + case 4: + sub_80699D8(x2, y2); + CurrentMapDrawMetatileAt(x2, y2); + sub_8069A3C(x2, y2); + case 5: + case 6: + case 7: + break; + } + if (data[6] == 0) + { + data[1] = 1; + } + break; + } +} + +const u16 gUnknown_083763E4[] = { + 0, + 0, + 0, + 0, + 0, + 0, + VAR_0x4001, + VAR_0x4002, + VAR_0x4003, + VAR_0x4004, + 0, + 0, + VAR_0x4005, + VAR_0x4006, + VAR_0x4007, + 0, + 0, + VAR_0x4008, + VAR_0x4009, + VAR_0x400A, + 0, + 0, + 0, + 0, + 0, + 0 +}; + +bool32 sub_8069CB8(s16 x, s16 y) +{ + if ((u16)(x - 3) < 11 && (u16)(y - 6) < 14 && gUnknown_083763E4[y]) + { + return TRUE; + } + return FALSE; +} + +void sub_8069CFC(s16 x, s16 y) +{ + if (sub_8069CB8(x, y)) + { + *GetVarPointer(gUnknown_083763E4[y]) |= (1 << (x - 3)); + } +} + +bool32 sub_8069D34(s16 x, s16 y) +{ + u32 var; + if (!sub_8069CB8(x, y)) + { + return FALSE; + } + var = VarGet(gUnknown_083763E4[y]) << 16; + if (((1 << 16) << (x - 3)) & var) + { + return TRUE; + } + return FALSE; +} + +void sub_8069D78(void) +{ + s32 x, y; + s32 width = gMapHeader.mapData->width; + s32 height = gMapHeader.mapData->height; + for (x=0; x> 8; + } + v9 = v4; + v10 = 0x1f00 - v4; + if ((0x1f00 - v4) < 0) + { + v10 += 0xf; + } + v11 = v10 >> 4; + if (v2 <= 0xb) + { + for (; v6 <= 0x12; 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++) + { + v4 += v11; + v1[v6][v2] = v4 >> 8; + if (v1[v6][v2] > 0x1f) + { + v1[v6][v2] = 0x1f; + } + } + } + } + } +} + +void sub_807CC24(void) +{ + if (gWeather.unknown_6C0 == gWeather.unknown_6C1) + { + gWeather.unknown_6C6 = 3; + } + else + { + if (++gWeather.unknown_6C3 >= gWeather.unknown_6C2) + { + gWeather.unknown_6C3 = 0; + if (gWeather.unknown_6C0 < gWeather.unknown_6C1) + { + gWeather.unknown_6C0++; + } + else + { + gWeather.unknown_6C0--; + } + sub_807CEBC(0, 0x20, gWeather.unknown_6C0); + } + } +} + +void sub_807CCAC(void) +{ + if (++gWeather.unknown_6CB > 1) + { + gWeather.unknown_6CA = 0; + } + switch (gWeather.unknown_6D0) + { + case 3: + case 4: + case 5: + case 11: + case 13: + if (sub_807CDC4() == 0) + { + gWeather.unknown_6C0 = 3; + gWeather.unknown_6C6 = 3; + } + break; + case 12: + if (sub_807CE24() == 0) + { + gWeather.unknown_6C0 = -6; + gWeather.unknown_6C6 = 3; + } + break; + case 6: + if (sub_807CE7C() == 0) + { + gWeather.unknown_6C0 = 0; + gWeather.unknown_6C6 = 3; + } + break; + case 7: + case 8: + case 9: + case 10: + default: + if (!gPaletteFade.active) + { + gWeather.unknown_6C0 = gWeather.unknown_6C1; + gWeather.unknown_6C6 = 3; + } + break; + } +} + +u8 sub_807CDC4(void) +{ + if (gWeather.unknown_6C7 == 0x10) + { + return 0; + } + if (++gWeather.unknown_6C7 >= 0x10) + { + sub_807CEBC(0, 0x20, 3); + gWeather.unknown_6C7 = 0x10; + return 0; + } + sub_807D1BC(0, 0x20, 3, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4); + return 1; +} + +u8 sub_807CE24(void) +{ + if (gWeather.unknown_6C7 == 0x10) + { + return 0; + } + if (++gWeather.unknown_6C7 >= 0x10) + { + sub_807CEBC(0, 0x20, -6); + gWeather.unknown_6C7 = 0x10; + return 0; + } + sub_807D304(-6, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4); + return 1; +} + +u8 sub_807CE7C(void) +{ + if (gWeather.unknown_6C7 == 0x10) + { + return 0; + } + ++gWeather.unknown_6C7; + sub_807D424(0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4); + return 1; +} + +void nullsub_39(void) +{ +} diff --git a/src/field/fieldmap.c b/src/field/fieldmap.c new file mode 100644 index 000000000..0e0ec246c --- /dev/null +++ b/src/field/fieldmap.c @@ -0,0 +1,955 @@ +#include "global.h" +#include "fieldmap.h" +#include "palette.h" +#include "rom4.h" +#include "script.h" +#include "secret_base.h" +#include "tv.h" + +struct ConnectionFlags +{ + u8 south:1; + u8 north:1; + u8 west:1; + u8 east:1; +}; + +struct Coords32 +{ + s32 x; + s32 y; +}; + +EWRAM_DATA static u16 gUnknown_02029828[0x2800] = {0}; +EWRAM_DATA struct MapHeader gMapHeader = {0}; +EWRAM_DATA struct Camera gUnknown_0202E844 = {0}; +EWRAM_DATA static struct ConnectionFlags gUnknown_0202E850 = {0}; + +struct BackupMapData gUnknown_03004870; + +static const struct ConnectionFlags sDummyConnectionFlags = {0}; + +struct MapHeader *mapconnection_get_mapheader(struct MapConnection *connection) +{ + return get_mapheader_by_bank_and_number(connection->mapGroup, connection->mapNum); +} + +void not_trainer_hill_battle_pyramid(void) +{ + mapheader_copy_mapdata_with_padding(&gMapHeader); + sub_80BB970(gMapHeader.events); + mapheader_run_script_with_tag_x1(); +} + +void sub_8055FC0(void) +{ + mapheader_copy_mapdata_with_padding(&gMapHeader); + sub_80BBCCC(0); + sub_80BB970(gMapHeader.events); + sub_8056670(); + mapheader_run_script_with_tag_x1(); + UpdateTVScreensOnMap(gUnknown_03004870.width, gUnknown_03004870.height); +} + +void mapheader_copy_mapdata_with_padding(struct MapHeader *mapHeader) +{ + struct MapData *mapData; + int width; + int height; + mapData = mapHeader->mapData; + CpuFastFill16(0x03ff, gUnknown_02029828, sizeof(gUnknown_02029828)); + gUnknown_03004870.map = gUnknown_02029828; + width = mapData->width + 15; + gUnknown_03004870.width = width; + height = mapData->height + 14; + gUnknown_03004870.height = height; + if (width * height <= 0x2800) + { + map_copy_with_padding(mapData->map, mapData->width, mapData->height); + sub_80560AC(mapHeader); + } +} + +void map_copy_with_padding(u16 *map, u16 width, u16 height) +{ + u16 *dest; + int y; + dest = gUnknown_03004870.map; + dest += gUnknown_03004870.width * 7 + 7; + for (y = 0; y < height; y++) + { + CpuCopy16(map, dest, width * 2); + dest += width + 0xf; + map += width; + } +} + +void sub_80560AC(struct MapHeader *mapHeader) +{ + 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; + switch (connection->direction) + { + case CONNECTION_SOUTH: + fillSouthConnection(mapHeader, cMap, offset); + gUnknown_0202E850.south = 1; + break; + case CONNECTION_NORTH: + fillNorthConnection(mapHeader, cMap, offset); + gUnknown_0202E850.north = 1; + break; + case CONNECTION_WEST: + fillWestConnection(mapHeader, cMap, offset); + gUnknown_0202E850.west = 1; + break; + case CONNECTION_EAST: + fillEastConnection(mapHeader, cMap, offset); + gUnknown_0202E850.east = 1; + break; + } + } +} + +void sub_8056134(int x, int y, struct MapHeader *mapHeader, int x2, int y2, int width, int height) +{ + int i; + u16 *src; + u16 *dest; + int mapWidth; + + mapWidth = mapHeader->mapData->width; + src = &mapHeader->mapData->map[mapWidth * y2 + x2]; + dest = &gUnknown_03004870.map[gUnknown_03004870.width * y + x]; + + for (i = 0; i < height; i++) + { + CpuCopy16(src, dest, width * 2); + dest += gUnknown_03004870.width; + src += mapWidth; + } +} + +void fillSouthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) +{ + int x, y; + int x2; + int width; + int cWidth; + + if (connectedMapHeader) + { + cWidth = connectedMapHeader->mapData->width; + x = offset + 7; + y = mapHeader->mapData->height + 7; + if (x < 0) + { + x2 = -x; + x += cWidth; + if (x < gUnknown_03004870.width) + { + width = x; + } + else + { + width = gUnknown_03004870.width; + } + x = 0; + } + else + { + x2 = 0; + if (x + cWidth < gUnknown_03004870.width) + { + width = cWidth; + } + else + { + width = gUnknown_03004870.width - x; + } + } + sub_8056134( + x, y, + connectedMapHeader, + x2, /*y2*/ 0, + width, /*height*/ 7); + } +} + +void fillNorthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) +{ + int x; + int x2, y2; + int width; + int cWidth, cHeight; + + if (connectedMapHeader) + { + cWidth = connectedMapHeader->mapData->width; + cHeight = connectedMapHeader->mapData->height; + x = offset + 7; + y2 = cHeight - 7; + if (x < 0) + { + x2 = -x; + x += cWidth; + if (x < gUnknown_03004870.width) + { + width = x; + } + else + { + width = gUnknown_03004870.width; + } + x = 0; + } + else + { + x2 = 0; + if (x + cWidth < gUnknown_03004870.width) + { + width = cWidth; + } + else + { + width = gUnknown_03004870.width - x; + } + } + + sub_8056134( + x, /*y*/ 0, + connectedMapHeader, + x2, y2, + width, /*height*/ 7); + + } +} + + +void fillWestConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) +{ + int y; + int x2, y2; + int height; + int cWidth, cHeight; + if (connectedMapHeader) + { + cWidth = connectedMapHeader->mapData->width; + cHeight = connectedMapHeader->mapData->height; + y = offset + 7; + x2 = cWidth - 7; + if (y < 0) + { + y2 = -y; + if (y + cHeight < gUnknown_03004870.height) + { + height = y + cHeight; + } + else + { + height = gUnknown_03004870.height; + } + y = 0; + } + else + { + y2 = 0; + if (y + cHeight < gUnknown_03004870.height) + { + height = cHeight; + } + else + { + height = gUnknown_03004870.height - y; + } + } + + sub_8056134( + /*x*/ 0, y, + connectedMapHeader, + x2, y2, + /*width*/ 7, height); + } +} + +void fillEastConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) +{ + int x, y; + int y2; + int height; + int cHeight; + if (connectedMapHeader) + { + cHeight = connectedMapHeader->mapData->height; + x = mapHeader->mapData->width + 7; + y = offset + 7; + if (y < 0) + { + y2 = -y; + if (y + cHeight < gUnknown_03004870.height) + { + height = y + cHeight; + } + else + { + height = gUnknown_03004870.height; + } + y = 0; + } + else + { + y2 = 0; + if (y + cHeight < gUnknown_03004870.height) + { + height = cHeight; + } + else + { + height = gUnknown_03004870.height - y; + } + } + + sub_8056134( + x, y, + connectedMapHeader, + /*x2*/ 0, y2, + /*width*/ 8, height); + } +} + +union Block +{ + struct + { + u16 block:10; + u16 collision:2; + u16 elevation:4; + } block; + u16 value; +}; + +u8 MapGridGetZCoordAt(int x, int y) +{ + u16 block; + int i; + u16 *border; + + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) + { + block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; + } + else + { + border = gMapHeader.mapData->border; + i = (x + 1) & 1; + i += ((y + 1) & 1) * 2; + block = gMapHeader.mapData->border[i]; + block |= 0xc00; + } + if (block == 0x3ff) + { + return 0; + } + return block >> 12; +} + +u8 MapGridIsImpassableAt(int x, int y) +{ + u16 block; + int i; + u16 *border; + + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) + { + block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; + } + else + { + border = gMapHeader.mapData->border; + i = (x + 1) & 1; + i += ((y + 1) & 1) * 2; + block = gMapHeader.mapData->border[i]; + block |= 0xc00; + } + if (block == 0x3ff) + { + return 1; + } + return (block & 0xc00) >> 10; +} + +u32 MapGridGetMetatileIdAt(int x, int y) +{ + u16 block; + int i; + int j; + struct MapData *mapData; + u16 *border; + u16 block2; + + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) + { + block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; + } + else + { + mapData = gMapHeader.mapData; + i = (x + 1) & 1; + i += ((y + 1) & 1) * 2; + block = mapData->border[i] | 0xc00; + } + if (block == 0x3ff) + { + border = gMapHeader.mapData->border; + j = (x + 1) & 1; + j += ((y + 1) & 1) * 2; + block2 = gMapHeader.mapData->border[j]; + block2 |= 0xc00; + return block2 & block; + } + return block & 0x3ff; +} + +u32 MapGridGetMetatileBehaviorAt(int x, int y) +{ + u16 metatile; + metatile = MapGridGetMetatileIdAt(x, y); + return GetBehaviorByMetatileId(metatile) & 0xff; +} + +u8 MapGridGetMetatileLayerTypeAt(int x, int y) +{ + u16 metatile; + metatile = MapGridGetMetatileIdAt(x, y); + return (GetBehaviorByMetatileId(metatile) & 0xf000) >> 12; +} + +void MapGridSetMetatileIdAt(int x, int y, u16 metatile) +{ + int i; + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) + { + i = x + y * gUnknown_03004870.width; + gUnknown_03004870.map[i] = (gUnknown_03004870.map[i] & 0xf000) | (metatile & 0xfff); + } +} + +void MapGridSetMetatileEntryAt(int x, int y, u16 metatile) +{ + int i; + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) + { + i = x + gUnknown_03004870.width * y; + gUnknown_03004870.map[i] = metatile; + } +} + +u32 GetBehaviorByMetatileId(u16 metatile) +{ + u16 *attributes; + if (metatile <= 0x1ff) + { + attributes = gMapHeader.mapData->primaryTileset->metatileAttributes; + return attributes[metatile]; + } + else if (metatile <= 0x3ff) + { + attributes = gMapHeader.mapData->secondaryTileset->metatileAttributes; + return attributes[metatile - 0x200]; + } + else + { + return 0xff; + } +} + +void save_serialize_map(void) +{ + int i, j; + int x, y; + u16 *mapView; + int width; + mapView = gSaveBlock1.mapView; + width = gUnknown_03004870.width; + x = gSaveBlock1.pos.x; + y = gSaveBlock1.pos.y; + for (i = y; i < y + 14; i++) + { + for (j = x; j < x + 15; j++) + { + *mapView++ = gUnknown_02029828[width * i + j]; + } + } +} + +int sub_8056618(void) +{ + u16 i; + u32 r2; + r2 = 0; + for (i = 0; i < 0x200; i++) + { + r2 |= gSaveBlock1.mapView[i]; + } + if (r2 == 0) + { + return 1; + } + return 0; +} + +void sav2_mapdata_clear(void) +{ + CpuFill16(0, gSaveBlock1.mapView, sizeof(gSaveBlock1.mapView)); +} + +void sub_8056670(void) +{ + int i, j; + int x, y; + u16 *mapView; + int width; + mapView = gSaveBlock1.mapView; + if (!sub_8056618()) + { + width = gUnknown_03004870.width; + x = gSaveBlock1.pos.x; + y = gSaveBlock1.pos.y; + for (i = y; i < y + 14; i++) + { + for (j = x; j < x + 15; j++) + { + gUnknown_02029828[width * i + j] = *mapView++; + } + } + sav2_mapdata_clear(); + } +} + +void sub_80566F0(u8 a1) +{ + u16 *mapView; + int width; + int x0, y0; + int x2, y2; + u16 *src, *dest; + int srci, desti; + int r9, r8; + int x, y; + int i, j; + mapView = gSaveBlock1.mapView; + width = gUnknown_03004870.width; + r9 = 0; + r8 = 0; + x0 = gSaveBlock1.pos.x; + y0 = gSaveBlock1.pos.y; + x2 = 15; + y2 = 14; + switch (a1) + { + case CONNECTION_NORTH: + y0 += 1; + y2 = 13; + break; + case CONNECTION_SOUTH: + r8 = 1; + y2 = 13; + break; + case CONNECTION_WEST: + x0 += 1; + x2 = 14; + break; + case CONNECTION_EAST: + r9 = 1; + x2 = 14; + break; + } + for (y = 0; y < y2; y++) + { + i = 0; + j = 0; + for (x = 0; x < x2; x++) + { + desti = width * (y + y0); + srci = (y + r8) * 15 + r9; + src = &mapView[srci + i]; + dest = &gUnknown_02029828[x0 + desti + j]; + *dest = *src; + i++; + j++; + } + } + sav2_mapdata_clear(); +} + +int GetMapBorderIdAt(int x, int y) +{ + struct MapData *mapData; + u16 block, block2; + int i, j; + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) + { + i = gUnknown_03004870.width; + i *= y; + block = gUnknown_03004870.map[x + i]; + if (block == 0x3ff) + { + goto fail; + } + } + else + { + mapData = gMapHeader.mapData; + j = (x + 1) & 1; + j += ((y + 1) & 1) * 2; + block2 = 0xc00 | mapData->border[j]; + if (block2 == 0x3ff) + { + goto fail; + } + } + goto success; +fail: + return -1; +success: + + if (x >= (gUnknown_03004870.width - 8)) + { + if (!gUnknown_0202E850.east) + { + return -1; + } + return CONNECTION_EAST; + } + else if (x < 7) + { + if (!gUnknown_0202E850.west) + { + return -1; + } + return CONNECTION_WEST; + } + else if (y >= (gUnknown_03004870.height - 7)) + { + if (!gUnknown_0202E850.south) + { + return -1; + } + return CONNECTION_SOUTH; + } + else if (y < 7) + { + if (!gUnknown_0202E850.north) + { + return -1; + } + return CONNECTION_NORTH; + } + else + { + return 0; + } +} + +int GetPostCameraMoveMapBorderId(int x, int y) +{ + return GetMapBorderIdAt(gSaveBlock1.pos.x + 7 + x, gSaveBlock1.pos.y + 7 + y); +} + +int CanCameraMoveInDirection(int direction) +{ + int x, y; + x = gSaveBlock1.pos.x + 7 + gUnknown_0821664C[direction].x; + y = gSaveBlock1.pos.y + 7 + gUnknown_0821664C[direction].y; + if (GetMapBorderIdAt(x, y) == -1) + { + return 0; + } + return 1; +} + +void sub_8056918(struct MapConnection *connection, int direction, int x, int y) +{ + struct MapHeader *mapHeader; + mapHeader = mapconnection_get_mapheader(connection); + switch (direction) + { + case CONNECTION_EAST: + gSaveBlock1.pos.x = -x; + gSaveBlock1.pos.y -= connection->offset; + break; + case CONNECTION_WEST: + gSaveBlock1.pos.x = mapHeader->mapData->width; + gSaveBlock1.pos.y -= connection->offset; + break; + case CONNECTION_SOUTH: + gSaveBlock1.pos.x -= connection->offset; + gSaveBlock1.pos.y = -y; + break; + case CONNECTION_NORTH: + gSaveBlock1.pos.x -= connection->offset; + gSaveBlock1.pos.y = mapHeader->mapData->height; + break; + } +} + +bool8 CameraMove(int x, int y) +{ + unsigned int direction; + struct MapConnection *connection; + int old_x, old_y; + gUnknown_0202E844.field_0 = FALSE; + direction = GetPostCameraMoveMapBorderId(x, y); + if (direction + 1 <= 1) + { + gSaveBlock1.pos.x += x; + gSaveBlock1.pos.y += y; + } + else + { + save_serialize_map(); + old_x = gSaveBlock1.pos.x; + old_y = gSaveBlock1.pos.y; + connection = sub_8056A64(direction, gSaveBlock1.pos.x, gSaveBlock1.pos.y); + sub_8056918(connection, direction, x, y); + sub_80538F0(connection->mapGroup, connection->mapNum); + gUnknown_0202E844.field_0 = TRUE; + gUnknown_0202E844.x = old_x - gSaveBlock1.pos.x; + gUnknown_0202E844.y = old_y - gSaveBlock1.pos.y; + gSaveBlock1.pos.x += x; + gSaveBlock1.pos.y += y; + sub_80566F0(direction); + } + return gUnknown_0202E844.field_0; +} + +struct MapConnection *sub_8056A64(u8 direction, int x, int y) +{ + int count; + struct MapConnection *connection; + int i; + count = gMapHeader.connections->count; + connection = gMapHeader.connections->connections; + for (i = 0; i < count; i++, connection++) + { + if (connection->direction == direction) + { + if (sub_8056ABC(direction, x, y, connection) == TRUE) + { + return connection; + } + } + } + return NULL; +} + +bool8 sub_8056ABC(u8 direction, int x, int y, struct MapConnection *connection) +{ + struct MapHeader *mapHeader; + mapHeader = mapconnection_get_mapheader(connection); + switch (direction) + { + case CONNECTION_SOUTH: + case CONNECTION_NORTH: + return sub_8056B20(x, gMapHeader.mapData->width, mapHeader->mapData->width, connection->offset); + case CONNECTION_WEST: + case CONNECTION_EAST: + return sub_8056B20(y, gMapHeader.mapData->height, mapHeader->mapData->height, connection->offset); + } + return FALSE; +} + +bool8 sub_8056B20(int x, int src_width, int dest_width, int offset) +{ + int offset2; + offset2 = offset; + if (offset2 < 0) + { + offset2 = 0; + } + if (dest_width + offset < src_width) + { + src_width = dest_width + offset; + } + if (offset2 <= x && x <= src_width) + { + return TRUE; + } + return FALSE; +} + +int sub_8056B4C(int x, int width) +{ + if (x >= 0 && x < width) + { + return TRUE; + } + return FALSE; +} + +int sub_8056B60(struct MapConnection *connection, int x, int y) +{ + struct MapHeader *mapHeader; + mapHeader = mapconnection_get_mapheader(connection); + switch (connection->direction) + { + case CONNECTION_SOUTH: + case CONNECTION_NORTH: + return sub_8056B4C(x - connection->offset, mapHeader->mapData->width); + case CONNECTION_WEST: + case CONNECTION_EAST: + return sub_8056B4C(y - connection->offset, mapHeader->mapData->height); + } + return FALSE; +} + +struct MapConnection *sub_8056BA0(s16 x, s16 y) +{ + int count; + struct MapConnection *connection; + int i; + u8 direction; + if (!gMapHeader.connections) + { + return NULL; + } + else + { + count = gMapHeader.connections->count; + connection = gMapHeader.connections->connections; + for (i = 0; i < count; i++, connection++) + { + direction = connection->direction; + if ((direction == CONNECTION_DIVE || direction == CONNECTION_EMERGE) + || (direction == CONNECTION_NORTH && y > 6) + || (direction == CONNECTION_SOUTH && y < gMapHeader.mapData->height + 7) + || (direction == CONNECTION_WEST && x > 6) + || (direction == CONNECTION_EAST && x < gMapHeader.mapData->width + 7)) + { + continue; + } + if (sub_8056B60(connection, x - 7, y - 7) == TRUE) + { + return connection; + } + } + } + return NULL; +} + +void sub_8056C50(u16 x, u16 y) +{ + gSaveBlock1.pos.x = x - 7; + gSaveBlock1.pos.y = y - 7; +} + +void sav1_camera_get_focus_coords(u16 *x, u16 *y) +{ + *x = gSaveBlock1.pos.x + 7; + *y = gSaveBlock1.pos.y + 7; +} + +void unref_sub_8056C7C(u16 x, u16 y) +{ + gSaveBlock1.pos.x = x; + gSaveBlock1.pos.y = y; +} + +void GetCameraCoords(u16 *x, u16 *y) +{ + *x = gSaveBlock1.pos.x; + *y = gSaveBlock1.pos.y; +} + +void sub_8056C98(struct Tileset *tileset, void *src) +{ + if (tileset) + { + if (!tileset->isCompressed) + { + CpuFastSet(tileset->tiles, src, 0x1000); + } + else + { + LZ77UnCompVram(tileset->tiles, src); + } + } +} + +void sub_8056CBC(struct Tileset *tileset, int offset, int size) +{ + u16 black; + if (tileset) + { + if (tileset->isSecondary == FALSE) + { + black = 0; + LoadPalette(&black, offset, 2); + LoadPalette(tileset->palettes + 2, offset + 1, size - 2); + } + else if (tileset->isSecondary == TRUE) + { + LoadPalette(tileset->palettes + 0xc0, offset, size); + } + else + { + LZ77UnCompVram(tileset->palettes, (void*)0x2000000); + LoadPalette((void*)0x2000000, offset, size); + } + } +} + +void sub_8056D28(struct MapData *mapData) +{ + void *src = (void*)(BG_VRAM); + sub_8056C98(mapData->primaryTileset, src); +} + +void sub_8056D38(struct MapData *mapData) +{ + void *src = (void*)(BG_VRAM + 0x4000); + sub_8056C98(mapData->secondaryTileset, src); +} + +void apply_map_tileset1_palette(struct MapData *mapData) +{ + sub_8056CBC(mapData->primaryTileset, 0, 0xc0); +} + +void apply_map_tileset2_palette(struct MapData *mapData) +{ + sub_8056CBC(mapData->secondaryTileset, 0x60, 0xc0); +} + +void copy_map_tileset1_tileset2_to_vram(struct MapData *mapData) +{ + if (mapData) + { + sub_8056D28(mapData); + sub_8056D38(mapData); + } +} + +void apply_map_tileset1_tileset2_palette(struct MapData *mapData) +{ + if (mapData) + { + apply_map_tileset1_palette(mapData); + apply_map_tileset2_palette(mapData); + } +} diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c new file mode 100644 index 000000000..b394d1e4c --- /dev/null +++ b/src/field/fldeff_cut.c @@ -0,0 +1,290 @@ +#include "global.h" +#include "fldeff_cut.h" +#include "field_camera.h" +#include "field_effect.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "map_obj_lock.h" +#include "metatile_behavior.h" +#include "metatile_behaviors.h" +#include "pokemon_menu.h" +#include "rom4.h" +#include "rom6.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" + +extern u8 gCutGrassSpriteArray[8]; // seems to be an array of 8 sprite IDs + +extern void (*gFieldCallback)(void); +extern void (*gUnknown_03005CE4)(void); + +extern struct SpriteTemplate gSpriteTemplate_CutGrass; + +extern struct MapPosition gUnknown_0203923C; + +extern u8 gLastFieldPokeMenuOpened; + +extern u8 UseCutScript; + +bool8 SetUpFieldMove_Cut(void) +{ + s16 x, y; + u8 i, j; + u8 tileBehavior; + + if(npc_before_player_of_type(0x52) == TRUE) // is in front of tree? + { + gFieldCallback = sub_808AB90; + gUnknown_03005CE4 = sub_80A2634; + return TRUE; + } + else // is in ash or grass to cut? + { + PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y); + for(i = 0; i < 3; i++) + { + y = i - 1 + gUnknown_0203923C.y; + for(j = 0; j < 3; j++) + { + x = j - 1 + gUnknown_0203923C.x; + if(MapGridGetZCoordAt(x, y) == (s8)gUnknown_0203923C.height) + { + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if(MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE + || MetatileBehavior_IsAshGrass(tileBehavior) == TRUE) + { + gFieldCallback = sub_808AB90; + gUnknown_03005CE4 = sub_80A25E8; + return TRUE; + } + } + } + } + return FALSE; // do not use cut + } +} + +void sub_80A25E8(void) +{ + FieldEffectStart(1); + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; +} + +bool8 FldEff_UseCutOnGrass(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_80A2684 >> 16; + gTasks[taskId].data[9] = (u32)sub_80A2684; + IncrementGameStat(0x12); + return FALSE; +} + +void sub_80A2634(void) +{ + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; + ScriptContext1_SetupScript(&UseCutScript); +} + +bool8 FldEff_UseCutOnTree(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_80A2B00 >> 16; + gTasks[taskId].data[9] = (u32)sub_80A2B00; + IncrementGameStat(0x12); + return FALSE; +} + +void sub_80A2684(void) +{ + FieldEffectActiveListRemove(1); + FieldEffectStart(0x3A); +} + +bool8 FldEff_CutGrass(void) +{ + s16 x, y; + u8 tileBehavior; + u8 i, j; // not in for loop? + + for(i = 0, PlaySE(SE_W015), PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y); i < 3; i++) + { + y = i - 1 + gUnknown_0203923C.y; + for(j = 0; j < 3; j++) + { + x = j - 1 + gUnknown_0203923C.x; + if(MapGridGetZCoordAt(x, y) == (s8)gUnknown_0203923C.height) + { + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if(MetatileBehavior_IsCuttableGrass(tileBehavior) == TRUE) + { + sub_80A27A8(x, y); + sub_805BCC0(x, y); + } + } + } + } + sub_80A28F4(gUnknown_0203923C.x - 1, gUnknown_0203923C.y - 2); + DrawWholeMapView(); + + // populate sprite ID array + for(i = 0; i < 8; i++) + { + gCutGrassSpriteArray[i] = CreateSprite((struct SpriteTemplate *)&gSpriteTemplate_CutGrass, + gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0); + gSprites[gCutGrassSpriteArray[i]].data2 = 32 * i; + } + return 0; +} + +// set map grid metatile depending on x, y +// TODO: enum for metatile IDs +void sub_80A27A8(s16 x, s16 y) +{ + int metatileId = MapGridGetMetatileIdAt(x, y); + + switch(metatileId) + { + case 0x208: + case 0x15: + case 0xD: + MapGridSetMetatileIdAt(x, y, 0x1); + break; + case 0x1C6: + MapGridSetMetatileIdAt(x, y, 0x1CE); + break; + case 0x1C7: + MapGridSetMetatileIdAt(x, y, 0x1CF); + break; + case 0x281: + MapGridSetMetatileIdAt(x, y, 0x279); + break; + case 0x282: + MapGridSetMetatileIdAt(x, y, 0x27A); + break; + case 0x283: + MapGridSetMetatileIdAt(x, y, 0x27B); + break; + case 0x206: + case 0x207: + MapGridSetMetatileIdAt(x, y, 0x271); + break; + case 0x212: + case 0x20A: + MapGridSetMetatileIdAt(x, y, 0x218); + break; + case 0x25: + MapGridSetMetatileIdAt(x, y, 0xE); + break; + } +} + +s32 sub_80A28A0(s16 x, s16 y) +{ + u16 metatileId = MapGridGetMetatileIdAt(x, y); + + if(metatileId == 1) + return 1; + else if(metatileId == 633) + return 2; + else if(metatileId == 634) + return 3; + else if(metatileId == 635) + return 4; + else + return 0; +} + +void sub_80A28F4(s16 x, s16 y) +{ + s16 i; + u16 lowerY = y + 3; + + for(i = 0; i < 3; i++) + { + u16 currentX = x + i; + s16 currentXsigned = x + i; + if(MapGridGetMetatileIdAt(currentXsigned, y) == 21) + { + switch((u8)sub_80A28A0(currentXsigned, y + 1)) + { + case 1: + MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x208); + break; + case 2: + MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x281); + break; + case 3: + MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x282); + break; + case 4: + MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x283); + break; + } + } + if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY) == 1) + { + if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x208) + MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x1); + if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x281) + MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x279); + if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x282) + MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x27A); + if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x283) + MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x27B); + } + } +} + +void sub_80A2A48(struct Sprite *sprite) +{ + sprite->data0 = 8; + sprite->data1 = 0; + sprite->data3 = 0; + sprite->callback = (void *)objc_8097BBC; +} + +void objc_8097BBC(struct Sprite *sprite) +{ + u16 tempdata; + u16 tempdata2; + + sprite->pos2.x = Sin(sprite->data2, sprite->data0); + sprite->pos2.y = Cos(sprite->data2, sprite->data0); + + sprite->data2 = (sprite->data2 + 8) & 0xFF; + sprite->data0 += ((tempdata2 = sprite->data3) << 16 >> 18) + 1; // what? + sprite->data3 = tempdata2 + 1; + + tempdata = sprite->data1; + if((s16)tempdata != 28) // done rotating the grass, execute clean up function + sprite->data1++; + else + sprite->callback = (void *)sub_80A2AB8; +} + +void sub_80A2AB8(void) +{ + u8 i; + + for(i = 1; i < 8; i++) + { + DestroySprite(&gSprites[gCutGrassSpriteArray[i]]); + } + + FieldEffectStop(&gSprites[gCutGrassSpriteArray[0]], 0x3A); + sub_8064E2C(); + ScriptContext2_Disable(); +} + +void sub_80A2B00(void) +{ + PlaySE(0x80); + FieldEffectActiveListRemove(2); + EnableBothScriptContexts(); +} diff --git a/src/field/fldeff_flash.c b/src/field/fldeff_flash.c new file mode 100644 index 000000000..6c2633567 --- /dev/null +++ b/src/field/fldeff_flash.c @@ -0,0 +1,306 @@ +#include "global.h" +#include "event_data.h" +#include "field_effect.h" +#include "main.h" +#include "palette.h" +#include "pokemon_menu.h" +#include "rom4.h" +#include "rom6.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" + +struct FlashStruct +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + void (*func)(void); +}; + +extern struct FlashStruct gUnknown_083F7FC4[]; +extern u16 gCaveTransitionPalette_White[]; +extern u16 gCaveTransitionPalette_Black[]; +extern u16 gUnknown_083F808C[]; +extern u16 gUnknown_083F809C[]; +extern u16 gCaveTransitionTilemap[]; +extern u8 gCaveTransitionTiles[]; + +extern u8 gLastFieldPokeMenuOpened; +extern void (*gUnknown_03005CE4)(void); + +extern u8 gUnknown_081B694A[]; + +void sub_810CBFC(void); +void sub_810CC34(void); +bool8 sub_810CD5C(void); +void sub_810CE5C(u8); +void sub_810CE78(u8); +void sub_810CF18(u8); +void sub_810CF5C(u8); +void sub_810CFC4(u8); +void sub_810D00C(u8); +void sub_810D028(u8); +void sub_810D0C4(u8); +void sub_810D128(u8); + +bool8 SetUpFieldMove_Flash(void) +{ + if (gMapHeader.cave == TRUE && !FlagGet(SYS_USE_FLASH)) + { + gFieldCallback = sub_808AB90; + gUnknown_03005CE4 = sub_810CBFC; + return TRUE; + } + + return FALSE; +} + +void sub_810CBFC(void) +{ + u8 taskId = oei_task_add(); + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; + gTasks[taskId].data[8] = (uintptr_t)sub_810CC34 >> 16; + gTasks[taskId].data[9] = (uintptr_t)sub_810CC34; +} + +void sub_810CC34(void) +{ + PlaySE(SE_W115); + FlagSet(SYS_USE_FLASH); + ScriptContext1_SetupScript(gUnknown_081B694A); +} + +void sub_810CC54(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_810CC80(void) +{ + u16 ime; + + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); + ResetPaletteFade(); + ResetTasks(); + ResetSpriteData(); + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + SetVBlankCallback(VBlankCB); + SetMainCallback2(sub_810CC54); + if (!sub_810CD5C()) + SetMainCallback2(gMain.savedCallback); +} + +bool8 sub_810CD5C(void) +{ + u8 i; + u8 v0 = get_map_light_from_warp0(); + u8 v1 = sav1_map_get_light_level(); + + for (i = 0; gUnknown_083F7FC4[i].unk0; i++) + { + if (gUnknown_083F7FC4[i].unk0 == v0 && gUnknown_083F7FC4[i].unk1 == v1) + { + gUnknown_083F7FC4[i].func(); + return TRUE; + } + } + + return FALSE; +} + +u8 sub_810CDB8(u8 a1, u8 a2) +{ + u8 i; + u8 v0 = a1; + u8 v1 = a2; + + for (i = 0; gUnknown_083F7FC4[i].unk0; i++) + { + if (gUnknown_083F7FC4[i].unk0 == v0 && gUnknown_083F7FC4[i].unk1 == v1) + { + return gUnknown_083F7FC4[i].unk2; + } + } + + return FALSE; +} + +u8 fade_type_for_given_maplight_pair(u8 a1, u8 a2) +{ + u8 i; + u8 v0 = a1; + u8 v1 = a2; + + for (i = 0; gUnknown_083F7FC4[i].unk0; i++) + { + if (gUnknown_083F7FC4[i].unk0 == v0 && gUnknown_083F7FC4[i].unk1 == v1) + { + return gUnknown_083F7FC4[i].unk3; + } + } + + return FALSE; +} + +void sub_810CE48(void) +{ + CreateTask(sub_810CE5C, 0); +} + +void sub_810CE5C(u8 taskId) +{ + gTasks[taskId].func = sub_810CE78; +} + +void sub_810CE78(u8 taskId) +{ + REG_DISPCNT = 0; + LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000); + LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800); + LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20); + LoadPalette(gUnknown_083F809C, 0xE0, 0x10); + REG_BLDCNT = 15937; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG0CNT = 7948; + REG_DISPCNT = 4416; + gTasks[taskId].func = sub_810CF18; + gTasks[taskId].data[0] = 16; + gTasks[taskId].data[1] = 0; +} + +void sub_810CF18(u8 taskId) +{ + u16 count = gTasks[taskId].data[1]; + u16 blend = count + 0x1000; + REG_BLDALPHA = blend; + if (count <= 0x10) + { + gTasks[taskId].data[1]++; + } + else + { + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_810CF5C; + } +} + +void sub_810CF5C(u8 taskId) +{ + u16 count; + + REG_BLDALPHA = 4112; + + count = gTasks[taskId].data[2]; + + if (count < 8) + { + gTasks[taskId].data[2]++; + LoadPalette(&gUnknown_083F809C[count], 0xE0, 16 - 2 * count); + } + else + { + LoadPalette(gCaveTransitionPalette_White, 0, 0x20); + gTasks[taskId].func = sub_810CFC4; + gTasks[taskId].data[2] = 8; + } +} + +void sub_810CFC4(u8 taskId) +{ + if (gTasks[taskId].data[2]) + gTasks[taskId].data[2]--; + else + SetMainCallback2(gMain.savedCallback); +} + +void sub_810CFF8(void) +{ + CreateTask(sub_810D00C, 0); +} + +void sub_810D00C(u8 taskId) +{ + gTasks[taskId].func = sub_810D028; +} + +void sub_810D028(u8 taskId) +{ + REG_DISPCNT = 0; + LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000); + LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG0CNT = 7948; + REG_DISPCNT = 4416; + LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20); + LoadPalette(gCaveTransitionPalette_Black, 0, 0x20); + gTasks[taskId].func = sub_810D0C4; + gTasks[taskId].data[0] = 16; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; +} + +void sub_810D0C4(u8 taskId) +{ + u16 count = gTasks[taskId].data[2]; + if (count < 16) + { + gTasks[taskId].data[2]++; + gTasks[taskId].data[2]++; + LoadPalette(&gUnknown_083F808C[15 - count], 0xE0, 2 * (count + 1)); + } + else + { + REG_BLDALPHA = 4112; + REG_BLDCNT = 15937; + gTasks[taskId].func = sub_810D128; + } +} + +void sub_810D128(u8 taskId) +{ + u16 count = 16 - gTasks[taskId].data[1]; + u16 blend = count + 0x1000; + REG_BLDALPHA = blend; + if (count) + { + gTasks[taskId].data[1]++; + } + else + { + LoadPalette(gCaveTransitionPalette_Black, 0, 0x20); + SetMainCallback2(gMain.savedCallback); + } +} diff --git a/src/field/fldeff_softboiled.c b/src/field/fldeff_softboiled.c new file mode 100644 index 000000000..cb26d9966 --- /dev/null +++ b/src/field/fldeff_softboiled.c @@ -0,0 +1,153 @@ +#include "global.h" +#include "fldeff_softboiled.h" +#include "menu.h" +#include "party_menu.h" +#include "pokemon.h" +#include "pokemon_menu.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "strings.h" +#include "task.h" + +struct Struct2001000 { + u8 unk0; + u8 unk1; + u8 unk2; + u8 filler3[9]; + void *unkC; +}; + +struct Struct201C000 { + struct Pokemon *unk0; + u8 filler4[1]; + u8 unk5; + u16 unk6; + u8 filler8[4]; + s32 unkC; + void* unk10; + u8 filler14[26]; + s16 unk2E; +}; + +#if ENGLISH +#define WINDOW_LEFT 3 +#define WINDOW_RIGHT 26 +#elif GERMAN +#define WINDOW_LEFT 0 +#define WINDOW_RIGHT 29 +#endif + +#define EWRAM_1000 (*(struct Struct2001000 *)(unk_2000000 + 0x1000)) +#define EWRAM_1B000_2 (*(struct Struct201B000 *)(unk_2000000 + 0x1B000)) +#define EWRAM_1C000 (*(struct Struct201C000 *)(unk_2000000 + 0x1C000)) + +// extern +extern u8 gUnknown_0202E8F6; +extern u8 gLastFieldPokeMenuOpened; + +extern u8 unk_2000000[]; +extern u8 gUnknown_0202E8F4; + +// Static +static void sub_8133D50(u8 taskId); +static void sub_8133E74(u8 taskId); +static void sub_8133EB8(u8 taskId); +static void sub_8133EF8(void); + +bool8 SetUpFieldMove_SoftBoiled(void) { + u16 maxHp; + u16 hp; + u16 minHp; + + maxHp = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_MAX_HP); + hp = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HP); + + minHp = (maxHp / 5); + if (hp >= minHp) + { + return TRUE; + } + + return FALSE; +} + +void sub_8133D28(u8 taskid) { + EWRAM_1000.unkC = sub_8133D50; + EWRAM_1B000_2.unk272 = 3; + sub_808A004(taskid); +} + +static void sub_8133D50(u8 taskId) { + u8 unk1, unk2; + u16 hp; + struct Pokemon *pokemon; + //struct Task *task; + + struct Sprite *sprites = gSprites; + + + unk1 = sprites[EWRAM_1000.unk1].data0; + unk2 = sprites[EWRAM_1000.unk2].data0; + + if (unk1 > 5 || unk2 > 5) + { + sub_806CD44(taskId); + return; + } + + EWRAM_1C000.unk0 = &gPlayerParty[sprites[EWRAM_1000.unk2].data0]; + hp = GetMonData(EWRAM_1C000.unk0, MON_DATA_HP); + + if (hp == 0 || unk1 == unk2 || GetMonData(EWRAM_1C000.unk0, MON_DATA_MAX_HP) == hp) + { + sub_8133EB8(taskId); + return; + } + + PlaySE(SE_KAIFUKU); + + EWRAM_1C000.unk5 = gSprites[EWRAM_1000.unk1].data0; + + pokemon = &gPlayerParty[EWRAM_1C000.unk5]; + EWRAM_1C000.unk0 = pokemon; + EWRAM_1C000.unk6 = 0; + EWRAM_1C000.unkC = -0x8000; + EWRAM_1C000.unk10 = sub_8133EF8; + + + gTasks[taskId].data[10] = GetMonData(EWRAM_1C000.unk0, MON_DATA_MAX_HP); + gTasks[taskId].data[11] = GetMonData(EWRAM_1C000.unk0, MON_DATA_HP); + gTasks[taskId].data[12] = gTasks[taskId].data[10] / 5; + + sub_806D5A4(); + gTasks[taskId].func = sub_806FA18; + EWRAM_1B000_2.unk282 = gTasks[taskId].data[11]; +} + +static void sub_8133E74(u8 taskId) { + if (gUnknown_0202E8F6) + { + return; + } + + MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + sub_806D538(3, 0); + gTasks[taskId].func = sub_806CB74; +} + +static void sub_8133EB8(u8 taskId) { + gUnknown_0202E8F4 = 0; + sub_806D5A4(); + sub_806E834(gOtherText_CantUseOnPoke, 1); + gTasks[taskId].func = sub_8133E74; +} + +static void sub_8133EF8(void) { + sub_806CCE4(); + EWRAM_1B000_2.unk261 = 2; + DestroySprite(&gSprites[EWRAM_1000.unk1]); + MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + sub_806D538(0, 0); + SwitchTaskToFollowupFunc(EWRAM_1000.unk0); +} diff --git a/src/field/fldeff_strength.c b/src/field/fldeff_strength.c new file mode 100644 index 000000000..81f4f63c6 --- /dev/null +++ b/src/field/fldeff_strength.c @@ -0,0 +1,76 @@ +#include "global.h" +#include "braille_puzzles.h" +#include "field_effect.h" +#include "party_menu.h" +#include "pokemon.h" +#include "pokemon_menu.h" +#include "rom6.h" +#include "script.h" +#include "task.h" +#include "text.h" + +static void sub_811AA18(void); +static void sub_811AA38(void); +static void sub_811AA9C(void); + +extern u8 gLastFieldPokeMenuOpened; +extern u16 gScriptResult; +extern void (*gFieldCallback)(void); +extern void (*gUnknown_03005CE4)(void); + +extern u8 UseStrengthScript[]; + +bool8 SetUpFieldMove_Strength(void) +{ + if (ShouldDoBrailleStrengthEffect()) + { + gScriptResult = gLastFieldPokeMenuOpened; + gFieldCallback = sub_808AB90; + gUnknown_03005CE4 = sub_811AA38; + } + else + { + if (npc_before_player_of_type(87) != TRUE) + return 0; + gScriptResult = gLastFieldPokeMenuOpened; + gFieldCallback = sub_808AB90; + gUnknown_03005CE4 = sub_811AA18; + } + + return TRUE; +} + +static void sub_811AA18(void) +{ + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; + ScriptContext1_SetupScript(UseStrengthScript); +} + +static void sub_811AA38(void) +{ + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; + FieldEffectStart(40); +} + +bool8 FldEff_UseStrength(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_811AA9C >> 16; + gTasks[taskId].data[9] = (u32)sub_811AA9C; + GetMonNickname(&gPlayerParty[gUnknown_0202FF84[0]], gStringVar1); + return FALSE; +} + +static void sub_811AA9C(void) +{ + if (ShouldDoBrailleStrengthEffect()) + { + DoBrailleStrengthEffect(); + } + else + { + FieldEffectActiveListRemove(40); + EnableBothScriptContexts(); + } +} diff --git a/src/field/fldeff_sweetscent.c b/src/field/fldeff_sweetscent.c new file mode 100644 index 000000000..4c3e6bf4a --- /dev/null +++ b/src/field/fldeff_sweetscent.c @@ -0,0 +1,88 @@ +#include "global.h" +#include "field_effect.h" +#include "field_player_avatar.h" +#include "palette.h" +#include "pokemon_menu.h" +#include "rom6.h" +#include "script.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "wild_encounter.h" + +static void sub_812BFD4(void); +static void sub_812C01C(void); +static void sub_812C084(u8); +static void sub_812C118(u8); + +extern u8 gLastFieldPokeMenuOpened; +extern void (*gFieldCallback)(void); +extern void (*gUnknown_03005CE4)(void); + +extern u8 SweetScentNothingHereScript[]; + +bool8 SetUpFieldMove_SweetScent(void) +{ + gFieldCallback = sub_808AB90; + gUnknown_03005CE4 = sub_812BFD4; + return TRUE; +} + +static void sub_812BFD4(void) +{ + FieldEffectStart(51); + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; +} + +bool8 FldEff_SweetScent() +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_812C01C >> 16; + gTasks[taskId].data[9] = (u32)sub_812C01C; + return FALSE; +} + +static void sub_812C01C(void) +{ + u8 taskId; + + PlaySE(0xEC); + BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, 0x1F); + taskId = CreateTask(sub_812C084, 0); + gTasks[taskId].data[0] = 0; + FieldEffectActiveListRemove(51); +} + +static void sub_812C084(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gTasks[taskId].data[0] == 64) + { + gTasks[taskId].data[0] = 0; + if (SweetScentWildEncounter() == TRUE) + { + DestroyTask(taskId); + } + else + { + gTasks[taskId].func = sub_812C118; + BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, 0x1F); + } + } + else + { + gTasks[taskId].data[0]++; + } + } +} + +static void sub_812C118(u8 taskId) +{ + if (!gPaletteFade.active) + { + ScriptContext1_SetupScript(SweetScentNothingHereScript); + DestroyTask(taskId); + } +} diff --git a/src/field/fldeff_teleport.c b/src/field/fldeff_teleport.c new file mode 100644 index 000000000..74e68df06 --- /dev/null +++ b/src/field/fldeff_teleport.c @@ -0,0 +1,46 @@ +#include "global.h" +#include "fldeff_teleport.h" +#include "field_effect.h" +#include "field_player_avatar.h" +#include "pokemon_menu.h" +#include "rom4.h" +#include "rom6.h" +#include "task.h" + +extern void (*gFieldCallback)(void); +extern u8 gLastFieldPokeMenuOpened; +extern void (*gUnknown_03005CE4)(void); + +bool8 SetUpFieldMove_Teleport(void) +{ + if (is_light_level_1_2_3_or_6(gMapHeader.mapType) == TRUE) + { + gFieldCallback = sub_808AB90; + gUnknown_03005CE4 = hm_teleport_run_dp02scr; + return TRUE; + } + + return FALSE; +} + +void hm_teleport_run_dp02scr(void) +{ + new_game(); + FieldEffectStart(63); + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; +} + +bool8 FldEff_UseTeleport(void) +{ + u8 taskId = oei_task_add(); + gTasks[taskId].data[8] = (u32)sub_814A404 >> 16; + gTasks[taskId].data[9] = (u32)sub_814A404; + SetPlayerAvatarTransitionFlags(1); + return 0; +} + +void sub_814A404(void) +{ + FieldEffectActiveListRemove(63); + sub_8087BA8(); +} diff --git a/src/field/heal_location.c b/src/field/heal_location.c new file mode 100644 index 000000000..42bc18567 --- /dev/null +++ b/src/field/heal_location.c @@ -0,0 +1,63 @@ +#include "global.h" +#include "heal_location.h" +#include "map_constants.h" + +#define NUM_HEAL_LOCATIONS 22 + +static const struct HealLocation sHealLocations[] = +{ + {MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, 4, 2}, + {MAP_GROUP_LITTLEROOT_TOWN_MAYS_HOUSE_2F, MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_2F, 4, 2}, + {MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, 20, 17}, + {MAP_GROUP_SLATEPORT_CITY, MAP_ID_SLATEPORT_CITY, 19, 20}, + {MAP_GROUP_MAUVILLE_CITY, MAP_ID_MAUVILLE_CITY, 22, 6}, + {MAP_GROUP_RUSTBORO_CITY, MAP_ID_RUSTBORO_CITY, 16, 39}, + {MAP_GROUP_FORTREE_CITY, MAP_ID_FORTREE_CITY, 5, 7}, + {MAP_GROUP_LILYCOVE_CITY, MAP_ID_LILYCOVE_CITY, 24, 15}, + {MAP_GROUP_MOSSDEEP_CITY, MAP_ID_MOSSDEEP_CITY, 28, 17}, + {MAP_GROUP_SOOTOPOLIS_CITY, MAP_ID_SOOTOPOLIS_CITY, 43, 32}, + {MAP_GROUP_EVER_GRANDE_CITY, MAP_ID_EVER_GRANDE_CITY, 27, 49}, + {MAP_GROUP_LITTLEROOT_TOWN, MAP_ID_LITTLEROOT_TOWN, 5, 9}, + {MAP_GROUP_LITTLEROOT_TOWN, MAP_ID_LITTLEROOT_TOWN, 14, 9}, + {MAP_GROUP_OLDALE_TOWN, MAP_ID_OLDALE_TOWN, 6, 17}, + {MAP_GROUP_DEWFORD_TOWN, MAP_ID_DEWFORD_TOWN, 2, 11}, + {MAP_GROUP_LAVARIDGE_TOWN, MAP_ID_LAVARIDGE_TOWN, 9, 7}, + {MAP_GROUP_FALLARBOR_TOWN, MAP_ID_FALLARBOR_TOWN, 14, 8}, + {MAP_GROUP_VERDANTURF_TOWN, MAP_ID_VERDANTURF_TOWN, 16, 4}, + {MAP_GROUP_PACIFIDLOG_TOWN, MAP_ID_PACIFIDLOG_TOWN, 8, 16}, + {MAP_GROUP_EVER_GRANDE_CITY, MAP_ID_EVER_GRANDE_CITY, 18, 6}, + {MAP_GROUP_BATTLE_TOWER_OUTSIDE, MAP_ID_BATTLE_TOWER_OUTSIDE, 14, 9}, + {MAP_GROUP_SOUTHERN_ISLAND_EXTERIOR, MAP_ID_SOUTHERN_ISLAND_EXTERIOR, 15, 20}, +}; + +u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum) +{ + u32 i; + + for (i = 0; i < NUM_HEAL_LOCATIONS; i++) + { + if (sHealLocations[i].group == mapGroup && sHealLocations[i].map == mapNum) + return i + 1; + } + return 0; +} + +const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum) +{ + u32 index = GetHealLocationIndexByMap(mapGroup, mapNum); + + if (index == 0) + return NULL; + else + return &sHealLocations[index - 1]; +} + +const struct HealLocation *GetHealLocation(u32 index) +{ + if (index == 0) + return NULL; + else if (index > NUM_HEAL_LOCATIONS) + return NULL; + else + return &sHealLocations[index - 1]; +} diff --git a/src/field/hof_pc.c b/src/field/hof_pc.c new file mode 100644 index 000000000..4646d171c --- /dev/null +++ b/src/field/hof_pc.c @@ -0,0 +1,42 @@ +#include "global.h" +#include "hall_of_fame.h" +#include "main.h" +#include "palette.h" +#include "rom4.h" +#include "script.h" +#include "script_menu.h" +#include "task.h" + +extern void (*gFieldCallback)(void); +extern void (*gUnknown_0300485C)(void); + +static void ReshowPCMenuAfterHallOfFamePC(void); +static void Task_WaitForPaletteFade(u8); + +void AccessHallOfFamePC(void) +{ + SetMainCallback2(sub_81428CC); + ScriptContext2_Enable(); +} + +void ReturnFromHallOfFamePC(void) +{ + SetMainCallback2(c2_exit_to_overworld_2_switch); + gFieldCallback = ReshowPCMenuAfterHallOfFamePC; +} + +static void ReshowPCMenuAfterHallOfFamePC(void) +{ + ScriptContext2_Enable(); + sub_8053E90(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); + TryCreatePCMenu(); + sub_80B5838(); + CreateTask(Task_WaitForPaletteFade, 10); +} + +static void Task_WaitForPaletteFade(u8 taskId) +{ + if (!gPaletteFade.active) + DestroyTask(taskId); +} diff --git a/src/field/item.c b/src/field/item.c new file mode 100644 index 000000000..fd49f5c39 --- /dev/null +++ b/src/field/item.c @@ -0,0 +1,674 @@ +#include "global.h" +#include "hold_effects.h" +#include "item.h" +#include "items.h" +#include "item_use.h" +#include "berry.h" +#include "string_util.h" +#include "strings.h" + +extern u8 gUnknown_02038560; + +// These constants are used in gItems +enum +{ + POCKET_NONE, + POCKET_ITEMS, + POCKET_POKE_BALLS, + POCKET_TM_HM, + POCKET_BERRIES, + POCKET_KEY_ITEMS, +}; + +enum +{ + ITEMS_POCKET, + BALLS_POCKET, + TMHM_POCKET, + BERRIES_POCKET, + KEYITEMS_POCKET +}; + +#if ENGLISH +#include "../data/item_descriptions_en.h" +#include "../data/items_en.h" +#elif GERMAN +#include "../data/item_descriptions_de.h" +#include "../data/items_de.h" +#endif + +static void CompactPCItems(void); + +void CopyItemName(u16 itemId, u8 *string) +{ + if (itemId == ITEM_ENIGMA_BERRY) + { + StringCopy(string, GetBerryInfo(0x2B)->name); // berry 0x2b = enigma berry + StringAppend(string, gOtherText_Berry2); + } + else + StringCopy(string, ItemId_GetItem(itemId)->name); +} + +//Unreferenced +s8 CountUsedBagPocketSlots(u8 pocket) +{ + u8 i; + + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == 0) + return i; + } + return -1; +} + +bool8 IsBagPocketNonEmpty(u8 pocket) +{ + u8 i; + + for (i = 0; i < gBagPockets[pocket - 1].capacity; i++) + { + if (gBagPockets[pocket - 1].itemSlots[i].itemId != 0) + return TRUE; + } + return FALSE; +} + +bool8 CheckBagHasItem(u16 itemId, u16 count) +{ + u8 i; + u8 pocket; + + if (ItemId_GetPocket(itemId) == 0) + return FALSE; + pocket = ItemId_GetPocket(itemId) - 1; + //Check for item slots that contain the item + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + { + //Does this item slot contain enough of the item? + if (gBagPockets[pocket].itemSlots[i].quantity >= count) + return TRUE; + count -= gBagPockets[pocket].itemSlots[i].quantity; + //Does this item slot and all previous slots contain enough of the item? + if (count == 0) + return TRUE; + } + } + return FALSE; +} + +bool8 CheckBagHasSpace(u16 itemId, u16 count) +{ + u8 i; + u8 pocket; + u16 slotCapacity; + + if (ItemId_GetPocket(itemId) == 0) + return FALSE; + pocket = ItemId_GetPocket(itemId) - 1; + if (pocket != BERRIES_POCKET) + slotCapacity = 99; + else + slotCapacity = 999; + + //Check space in any existing item slots that already contain this item + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + { + if (gBagPockets[pocket].itemSlots[i].quantity + count <= slotCapacity) + return TRUE; + if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) + return FALSE; + count -= slotCapacity - gBagPockets[pocket].itemSlots[i].quantity; + if (count == 0) + return TRUE; + } + } + + //Check space in empty item slots + if (count > 0) + { + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == 0) + { + if (count <= slotCapacity) + return TRUE; + else + count -= slotCapacity; + } + } + if (count > 0) + return FALSE; //No more item slots. The bag is full + } + + return TRUE; +} + +// This function matches if gBagPockets is declared non-const, +// but it should be fixed anyway. +#ifdef NONMATCHING +bool8 AddBagItem(u16 itemId, u16 count) +{ + u8 i; + u8 pocket; + u16 slotCapacity; + struct ItemSlot newItems[64]; + + if (ItemId_GetPocket(itemId) == 0) + return FALSE; + pocket = ItemId_GetPocket(itemId) - 1; + //Copy the bag pocket + memcpy(newItems, gBagPockets[pocket].itemSlots, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); + if (pocket != BERRIES_POCKET) + slotCapacity = 99; + else + slotCapacity = 999; + + //Use any item slots that already contain this item + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (newItems[i].itemId == itemId) + { + if (newItems[i].quantity + count <= slotCapacity) + { + newItems[i].quantity += count; + //Copy pocket back into the bag. + memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); + return TRUE; + } + if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) + return FALSE; + count -= slotCapacity - newItems[i].quantity; + newItems[i].quantity = slotCapacity; + if (count == 0) + goto copy_items; + } + } + + //Put any remaining items into new item slots. + if (count > 0) + { + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (newItems[i].itemId == 0) + { + newItems[i].itemId = itemId; + if (count <= slotCapacity) + { + newItems[i].quantity = count; + goto copy_items; + } + count -= slotCapacity; + newItems[i].quantity = slotCapacity; + } + } + if (count > 0) + return FALSE; //No more empty item slots. The bag is full. + } + + copy_items: + //Copy pocket back into the bag. + memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); + return TRUE; +} +#else +__attribute__((naked)) +bool8 AddBagItem(u16 itemId, u16 count) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + sub sp, 0x100\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r8, r0\n\ + lsls r1, 16\n\ + lsrs r4, r1, 16\n\ + bl ItemId_GetPocket\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080A9510\n\ + mov r0, r8\n\ + bl ItemId_GetPocket\n\ + subs r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + ldr r1, _080A94F8 @ =gBagPockets\n\ + lsls r0, r6, 3\n\ + adds r5, r0, r1\n\ + ldr r1, [r5]\n\ + ldrb r2, [r5, 0x4]\n\ + lsls r2, 2\n\ + mov r0, sp\n\ + bl memcpy\n\ + ldr r7, _080A94FC @ =0x000003e7\n\ + cmp r6, 0x3\n\ + beq _080A9468\n\ + movs r7, 0x63\n\ +_080A9468:\n\ + movs r1, 0\n\ + ldrb r0, [r5, 0x4]\n\ + cmp r1, r0\n\ + bcs _080A94B2\n\ + subs r0, r6, 0x2\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r12, r0\n\ +_080A9478:\n\ + lsls r0, r1, 2\n\ + mov r2, sp\n\ + adds r3, r2, r0\n\ + ldrh r0, [r3]\n\ + cmp r0, r8\n\ + bne _080A94A6\n\ + ldrh r2, [r3, 0x2]\n\ + adds r0, r2, r4\n\ + cmp r0, r7\n\ + ble _080A9500\n\ + mov r0, r12\n\ + cmp r0, 0x1\n\ + bls _080A9510\n\ + subs r0, r7, r2\n\ + subs r0, r4, r0\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + strh r7, [r3, 0x2]\n\ + ldr r2, _080A94F8 @ =gBagPockets\n\ + mov r9, r2\n\ + lsls r3, r6, 3\n\ + cmp r4, 0\n\ + beq _080A9516\n\ +_080A94A6:\n\ + adds r0, r1, 0x1\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + ldrb r0, [r5, 0x4]\n\ + cmp r1, r0\n\ + bcc _080A9478\n\ +_080A94B2:\n\ + ldr r2, _080A94F8 @ =gBagPockets\n\ + mov r9, r2\n\ + lsls r3, r6, 3\n\ + cmp r4, 0\n\ + beq _080A9516\n\ + movs r1, 0\n\ + adds r0, r3, r2\n\ + ldrb r0, [r0, 0x4]\n\ + cmp r1, r0\n\ + bcs _080A94F2\n\ + mov r6, r9\n\ + adds r5, r3, r6\n\ +_080A94CA:\n\ + lsls r0, r1, 2\n\ + mov r6, sp\n\ + adds r2, r6, r0\n\ + ldrh r0, [r2]\n\ + cmp r0, 0\n\ + bne _080A94E6\n\ + mov r0, r8\n\ + strh r0, [r2]\n\ + cmp r4, r7\n\ + bls _080A9514\n\ + subs r0, r4, r7\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + strh r7, [r2, 0x2]\n\ +_080A94E6:\n\ + adds r0, r1, 0x1\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + ldrb r2, [r5, 0x4]\n\ + cmp r1, r2\n\ + bcc _080A94CA\n\ +_080A94F2:\n\ + cmp r4, 0\n\ + beq _080A9516\n\ + b _080A9510\n\ + .align 2, 0\n\ +_080A94F8: .4byte gBagPockets\n\ +_080A94FC: .4byte 0x000003e7\n\ +_080A9500:\n\ + strh r0, [r3, 0x2]\n\ + ldr r0, _080A950C @ =gBagPockets\n\ + lsls r1, r6, 3\n\ + adds r1, r0\n\ + b _080A951A\n\ + .align 2, 0\n\ +_080A950C: .4byte gBagPockets\n\ +_080A9510:\n\ + movs r0, 0\n\ + b _080A9528\n\ +_080A9514:\n\ + strh r4, [r2, 0x2]\n\ +_080A9516:\n\ + mov r6, r9\n\ + adds r1, r3, r6\n\ +_080A951A:\n\ + ldr r0, [r1]\n\ + ldrb r2, [r1, 0x4]\n\ + lsls r2, 2\n\ + mov r1, sp\n\ + bl memcpy\n\ + movs r0, 0x1\n\ +_080A9528:\n\ + add sp, 0x100\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif + +bool8 RemoveBagItem(u16 itemId, u16 count) +{ + u8 i; + u8 pocket; + u16 totalQuantity = 0; + + if (ItemId_GetPocket(itemId) == 0 || itemId == 0) + return FALSE; + pocket = ItemId_GetPocket(itemId) - 1; + + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + totalQuantity += gBagPockets[pocket].itemSlots[i].quantity; + } + if (totalQuantity < count) + return FALSE; //We don't have enough of the item + + if (gBagPockets[pocket].capacity > gUnknown_02038560 + && gBagPockets[pocket].itemSlots[gUnknown_02038560].itemId == itemId) + { + if (gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity >= count) + { + gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity -= count; + count = 0; + } + else + { + count -= gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity; + gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity = 0; + } + if (gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity == 0) + gBagPockets[pocket].itemSlots[gUnknown_02038560].itemId = 0; + if (count == 0) + return TRUE; + } + + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + { + if (gBagPockets[pocket].itemSlots[i].quantity >= count) + { + gBagPockets[pocket].itemSlots[i].quantity -= count; + count = 0; + } + else + { + count -= gBagPockets[pocket].itemSlots[i].quantity; + gBagPockets[pocket].itemSlots[i].quantity = 0; + } + if (gBagPockets[pocket].itemSlots[i].quantity == 0) + gBagPockets[pocket].itemSlots[i].itemId = 0; + if (count == 0) + return TRUE; + } + } + return TRUE; +} + +u8 GetPocketByItemId(u16 itemId) +{ + return ItemId_GetPocket(itemId); +} + +void ClearItemSlots(struct ItemSlot *itemSlots, u8 b) +{ + u16 i; + + for (i = 0; i < b; i++) + { + itemSlots[i].itemId = 0; + itemSlots[i].quantity = 0; + } +} + +static s32 FindFreePCItemSlot(void) +{ + s8 i; + + for (i = 0; i < 50; i++) + { + if (gSaveBlock1.pcItems[i].itemId == 0) + return i; + } + return -1; +} + +u8 CountUsedPCItemSlots(void) +{ + u8 usedSlots = 0; + u8 i; + + for (i = 0; i < 50; i++) + { + if (gSaveBlock1.pcItems[i].itemId != 0) + usedSlots++; + } + return usedSlots; +} + +bool8 CheckPCHasItem(u16 itemId, u16 count) +{ + u8 i; + + for (i = 0; i < 50; i++) + { + if (gSaveBlock1.pcItems[i].itemId == itemId && gSaveBlock1.pcItems[i].quantity >= count) + return TRUE; + } + return FALSE; +} + +bool8 AddPCItem(u16 itemId, u16 count) +{ + u8 i; + s8 freeSlot; + struct ItemSlot newItems[50]; + + //Copy PC items + memcpy(newItems, gSaveBlock1.pcItems, sizeof(newItems)); + + //Use any item slots that already contain this item + for (i = 0; i < 50; i++) + { + if (newItems[i].itemId == itemId) + { + if (newItems[i].quantity + count <= 999) + { + newItems[i].quantity += count; + memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems)); + return TRUE; + } + count += newItems[i].quantity - 999; + newItems[i].quantity = 999; + if (count == 0) + { + memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems)); + return TRUE; + } + } + } + + //Put any remaining items into a new item slot. + if (count > 0) + { + freeSlot = FindFreePCItemSlot(); + if (freeSlot == -1) + return FALSE; + newItems[freeSlot].itemId = itemId; + newItems[freeSlot].quantity = count; + } + + //Copy items back to the PC + memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems)); + return TRUE; +} + +void RemovePCItem(u8 index, u16 count) +{ + gSaveBlock1.pcItems[index].quantity -= count; + if (gSaveBlock1.pcItems[index].quantity == 0) + { + gSaveBlock1.pcItems[index].itemId = 0; + CompactPCItems(); + } +} + +static void CompactPCItems(void) +{ + u16 i; + u16 j; + + for (i = 0; i < 49; i++) + { + for (j = i + 1; j <= 49; j++) + { + if (gSaveBlock1.pcItems[i].itemId == 0) + { + struct ItemSlot temp = gSaveBlock1.pcItems[i]; + gSaveBlock1.pcItems[i] = gSaveBlock1.pcItems[j]; + gSaveBlock1.pcItems[j] = temp; + } + } + } +} + +void SwapRegisteredBike(void) +{ + switch (gSaveBlock1.registeredItem) + { + case 0x103: + gSaveBlock1.registeredItem = 0x110; + break; + case 0x110: + gSaveBlock1.registeredItem = 0x103; + break; + } +} + +static u16 SanitizeItemId(u16 itemId) +{ + if (itemId > 0x15C) + return 0; + else + return itemId; +} + +const struct Item *ItemId_GetItem(u16 itemId) +{ + return &gItems[SanitizeItemId(itemId)]; +} + +u16 ItemId_GetId(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].itemId; +} + +u16 ItemId_GetPrice(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].price; +} + +u8 ItemId_GetHoldEffect(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].holdEffect; +} + +u8 ItemId_GetHoldEffectParam(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].holdEffectParam; +} + +const u8 *ItemId_GetDescription(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].description; +} + +bool32 ItemId_CopyDescription(u8 *a, u32 itemId, u32 c) +{ + u32 r5 = c + 1; + const u8 *description = gItems[SanitizeItemId(itemId)].description; + u8 *str = a; + + for (;;) + { + if (*description == 0xFF || *description == 0xFE) + { + r5--; + if (r5 == 0) + { + *str = 0xFF; + return TRUE; + } + if (*description == 0xFF) + return FALSE; + str = a; + description++; + } + else + *(str++) = *(description++); + } +} + +u8 ItemId_GetImportance(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].importance; +} + +u8 ItemId_GetUnknownValue(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].unk19; +} + +u8 ItemId_GetPocket(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].pocket; +} + +u8 ItemId_GetType(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].type; +} + +ItemUseFunc ItemId_GetFieldFunc(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].fieldUseFunc; +} + +u8 ItemId_GetBattleUsage(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].battleUsage; +} + +ItemUseFunc ItemId_GetBattleFunc(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].battleUseFunc; +} + +u8 ItemId_GetSecondaryId(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].secondaryId; +} diff --git a/src/field/item_menu.c b/src/field/item_menu.c new file mode 100644 index 000000000..350ba3db4 --- /dev/null +++ b/src/field/item_menu.c @@ -0,0 +1,4583 @@ +#include "global.h" +#include "berry.h" +#include "berry_tag_screen.h" +#include "data2.h" +#include "decompress.h" +#include "field_effect.h" +#include "field_map_obj_helpers.h" +#include "field_player_avatar.h" +#include "graphics.h" +#include "item.h" +#include "items.h" +#include "item_menu.h" +#include "item_use.h" +#include "link.h" +#include "mail_data.h" +#include "main.h" +#include "map_name_popup.h" +#include "menu.h" +#include "menu_cursor.h" +#include "menu_helpers.h" +#include "money.h" +#include "palette.h" +#include "party_menu.h" +#include "player_pc.h" +#include "pokemon_menu.h" +#include "rom4.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "strings.h" +#include "strings2.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "unknown_task.h" + +// External stuff +extern u8 ewram[]; +extern void gpu_pal_allocator_reset__manage_upper_four(void); +extern void sub_80F9020(void); +extern void sub_80F9988(); +extern void sub_809D104(u16 *, u16, u16, const u8 *, u16, u16, u16, u16); +extern void PauseVerticalScrollIndicator(); +extern u8 sub_80F9284(void); +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 u8 sub_80F931C(); +extern void sub_808A3F8(u8); +extern void sub_80B3050(void); +extern void sub_80546B8(u8); +extern void sub_804E990(u8); +extern void sub_802E424(u8); +extern void sub_8064E2C(void); + +struct PocketScrollState +{ + u8 cursorPos; + u8 scrollTop; + u8 numSlots; + u8 cursorMax; +}; + +struct UnknownStruct2 +{ + u8 unk0; + u8 textLine; + u8 unk2; +}; + +struct UnknownStruct3 +{ + u8 unk0; + u8 unk1; + u8 unk2; +}; + +struct UnknownStruct4 +{ + u8 unk0; + u8 unk1; + u16 unk2; + const u8 *unk4; + TaskFunc unk8; +}; + +struct UnknownStruct5 +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; +}; + +struct UnknownStruct6 +{ + u8 unk0; +}; + +enum +{ + BAG_POCKET_ITEMS, // 0 + BAG_POCKET_POKE_BALLS, // 1 + BAG_POCKET_TMs_HMs, // 2 + BAG_POCKET_BERRIES, // 3 + BAG_POCKET_KEY_ITEMS, // 4 +}; + +enum +{ + RETURN_TO_FIELD_0, + RETURN_TO_BATTLE, + RETURN_TO_PKMN_LIST, + RETURN_TO_SHOP, + RETURN_TO_FIELD_4, + RETURN_TO_FIELD_5, + RETURN_TO_PC, + RETURN_TO_WALLY_BATTLE, +}; + +enum +{ + ITEM_ACTION_USE_0, // 0 + ITEM_ACTION_TOSS, // 1 + ITEM_ACTION_CANCEL_2, // 2 + ITEM_ACTION_REGISTER, // 3 + ITEM_ACTION_USE_4, // 4 + ITEM_ACTION_CANCEL_5, // 5 + ITEM_ACTION_GIVE, // 6 + ITEM_ACTION_CHECK_TAG, // 7 + ITEM_ACTION_NONE, // 8 + ITEM_ACTION_CONFIRM, // 9 +}; + +// ewram +EWRAM_DATA static struct UnknownStruct2 gUnknown_0203853C = {0}; +EWRAM_DATA static struct UnknownStruct3 gUnknown_02038540 = {0}; +EWRAM_DATA static struct UnknownStruct4 gUnknown_02038544 = {0}; +EWRAM_DATA static struct UnknownStruct5 gUnknown_02038550 = {0}; +EWRAM_DATA static struct UnknownStruct6 gUnknown_02038554 = {0}; // There are 3 bytes of padding after this, so I assume it's a struct +EWRAM_DATA static u8 gUnknown_02038558 = 0; +EWRAM_DATA static s8 sCurrentBagPocket = 0; +EWRAM_DATA static u8 gUnknown_0203855A = 0; +EWRAM_DATA static s8 gUnknown_0203855B = 0; +EWRAM_DATA static s8 gUnknown_0203855C = 0; +EWRAM_DATA u16 gScriptItemId = 0; +EWRAM_DATA u8 gUnknown_02038560 = 0; +EWRAM_DATA u8 gUnknown_02038561 = 0; +EWRAM_DATA static u8 gUnknown_02038562 = 0; +EWRAM_DATA static u8 gUnknown_02038563 = 0; +EWRAM_DATA static u8 gUnknown_02038564 = 0; +EWRAM_DATA static u8 sPokeballSpriteId ALIGNED(4) = 0; // HACK: why is there a space before this variable? + +// bss +static u8 sPopupMenuSelection; +static u8 sReturnLocation; +static const u8 *sPopupMenuActionList; + +// common +void (*gUnknown_03005D00)(u8) = NULL; +extern u16 gUnknown_030041B4; +extern struct PocketScrollState gBagPocketScrollStates[]; +extern struct ItemSlot *gCurrentBagPocketItemSlots; // selected pocket item slots +extern const u8 Event_NoRegisteredItem[]; + +#define ewramBerryPic (ewram + 0) +#define ewramBerryPicTemp (ewram + 0x1000) +#define ewramSavedItemsPocket ((struct ItemSlot *)(ewram + 0x1E000)) // saved items pocket (for Wally battle) +#define ewramSavedPokeballsPocket ((struct ItemSlot *)(ewram + 0x1F000)) // saved Pokeballs pocket (for Wally battle) +#define ewramBagSetupStep (ewram[0x1FFFF]) + +extern const struct CompressedSpriteSheet sMaleBagSpriteSheet; +extern const struct CompressedSpriteSheet sFemaleBagSpriteSheet; +extern const struct CompressedSpritePalette sBagSpritePalette; + +const struct BagPocket gBagPockets[NUM_BAG_POCKETS] = +{ + {gSaveBlock1.bagPocket_Items, 20}, + {gSaveBlock1.bagPocket_PokeBalls, 16}, + {gSaveBlock1.bagPocket_TMHM, 64}, + {gSaveBlock1.bagPocket_Berries, 46}, + {gSaveBlock1.bagPocket_KeyItems, 20}, +}; + +static void HandlePopupMenuAction_UseOnField(u8); +static void HandlePopupMenuAction_Toss(u8); +static void sub_80A5F80(u8); +static void HandlePopupMenuAction_Register(u8); +static void HandlePopupMenuAction_UseInBattle(u8); +static void sub_80A7124(u8); +static void HandlePopupMenuAction_Give(u8); +static void HandlePopupMenuAction_CheckTag(u8); +static void HandlePopupMenuAction_Confirm(u8); + +static const struct MenuAction2 sItemPopupMenuActions[] = +{ + {OtherText_Use, HandlePopupMenuAction_UseOnField}, + {OtherText_Toss, HandlePopupMenuAction_Toss}, + {gOtherText_CancelNoTerminator, sub_80A5F80}, + {OtherText_Register, HandlePopupMenuAction_Register}, + {OtherText_Use, HandlePopupMenuAction_UseInBattle}, + {gOtherText_CancelNoTerminator, sub_80A7124}, + {OtherText_Give2, HandlePopupMenuAction_Give}, + {OtherText_CheckTag, HandlePopupMenuAction_CheckTag}, + {gOtherText_CancelWithTerminator, NULL}, + {OtherText_Confirm, HandlePopupMenuAction_Confirm}, +}; + +static const u8 sItemPopupMenuChoicesTable[][6] = +{ + [BAG_POCKET_ITEMS] = + { + ITEM_ACTION_USE_0, + ITEM_ACTION_TOSS, + ITEM_ACTION_GIVE, + ITEM_ACTION_CANCEL_2, + }, + + [BAG_POCKET_POKE_BALLS] = + { + ITEM_ACTION_GIVE, + ITEM_ACTION_TOSS, + ITEM_ACTION_NONE, + ITEM_ACTION_CANCEL_2, + }, + + [BAG_POCKET_TMs_HMs] = + { + ITEM_ACTION_USE_0, + ITEM_ACTION_NONE, + ITEM_ACTION_GIVE, + ITEM_ACTION_CANCEL_2, + }, + + [BAG_POCKET_BERRIES] = + { + ITEM_ACTION_CHECK_TAG, + ITEM_ACTION_USE_0, + ITEM_ACTION_TOSS, + ITEM_ACTION_NONE, + ITEM_ACTION_GIVE, + ITEM_ACTION_CANCEL_2 + }, + + [BAG_POCKET_KEY_ITEMS] = + { + ITEM_ACTION_USE_0, + ITEM_ACTION_NONE, + ITEM_ACTION_REGISTER, + ITEM_ACTION_CANCEL_2, + }, +}; + +const u8 gUnknown_083C16AE[][2] = +{ + {6, 2}, + {6, 2}, + {6, 2}, + {6, 2}, + {2, 0}, +}; + +const u8 gUnknown_083C16B8[] = {7, 9, 8, 2}; + +static void OnItemSelect_Field05(u8); +static void OnBagClose_Field0(u8); +static void OnBagClose_PkmnList(u8); +static void OnItemSelect_PkmnList(u8); +static void OnBagClose_Shop(u8); +static void OnItemSelect_Shop(u8); +static void OnBagClose_Field4(u8); +static void OnItemSelect_Field4(u8); +static void OnBagClose_Field5(u8); +static void OnBagClose_PC(u8); +static void OnItemSelect_PC(u8); +static void OnItemSelect_Battle(u8); +static void OnBagClose_Battle(u8); + +static const struct {TaskFunc onItemSelect; TaskFunc onBagClose;} gUnknown_083C16BC[] = +{ + [RETURN_TO_FIELD_0] = {OnItemSelect_Field05, OnBagClose_Field0}, + [RETURN_TO_BATTLE] = {OnItemSelect_Battle, OnBagClose_Battle}, + [RETURN_TO_PKMN_LIST] = {OnItemSelect_PkmnList, OnBagClose_PkmnList}, + [RETURN_TO_SHOP] = {OnItemSelect_Shop, OnBagClose_Shop}, + [RETURN_TO_FIELD_4] = {OnItemSelect_Field4, OnBagClose_Field4}, + [RETURN_TO_FIELD_5] = {OnItemSelect_Field05, OnBagClose_Field5}, + [RETURN_TO_PC] = {OnItemSelect_PC, OnBagClose_PC}, +}; + +static void sub_80A5E60(u8); +static void sub_80A5E90(u8); + +static const struct YesNoFuncTable gUnknown_083C16F4 = {sub_80A5E60, sub_80A5E90}; + +static void sub_80A65AC(u8); +static void sub_80A6618(u8); + +const struct YesNoFuncTable gUnknown_083C16FC = {sub_80A65AC, sub_80A6618}; + +void sub_80A34E8(void); +static bool8 LoadBagGraphicsMultistep(void); +static void sub_80A362C(void); +static void sub_80A3740(void); +static void sub_80A396C(u16 *, u8, u8, u8); +static void sub_80A39B8(u16 *, u8); +static void sub_80A39E4(u16 *, u8, u8, s8); +static void DrawPocketIndicatorDots(u16 *, u8); +static void SortItemSlots(struct BagPocket); +static void UpdateAllBagPockets(void); +static void sub_80A3D24(u8); +static void sub_80A3D40(void); +static void RemoveSelectIconFromRegisteredItem(void); +static void sub_80A48E8(u16, int, int); +static void ItemListMenu_InitDescription(s16); +static void ItemListMenu_ChangeDescription(s16, int); +static void sub_80A4F68(u8); +static void sub_80A50C8(u8); +static void sub_80A5AE4(u8); +static void sub_80A5BF8(u8); +static void Task_CallItemUseOnFieldCallback(u8); +static void sub_80A6444(u8); +static void sub_80A648C(u8); +static void Task_BuyHowManyDialogueHandleInput(u8); +static void BuyMenuPrintItemQuantityAndPrice(u8); +static void BuyMenuDisplayMessage(u16, u16); +static void sub_80A683C(void); +static void sub_80A6870(u16, u8); +static void sub_80A699C(void); +static void sub_80A7230(u8); +static void ItemListMenu_InitMenu(void); +static void sub_80A73C0(void); +static void sub_80A73F0(void); +static void sub_80A73FC(void); +static void sub_80A740C(void); +static void sub_80A7420(void); +static void sub_80A751C(void); +static void sub_80A7528(u8); +static void sub_80A7590(void); +static void sub_80A75E4(void); +static void sub_80A7630(void); +static void sub_80A763C(void); +static void sub_80A76A0(void); +static void sub_80A770C(void); +static void DisplayCannotUseItemMessage(int, const u8 *, TaskFunc, int); +static void sub_80A7768(void); +static void sub_80A7828(void); +static void sub_80A7834(int, int); +static bool32 sub_80A78A0(void); +static void sub_80A78B8(void); +static bool32 sub_80A78C4(void); +static void sub_80A78E8(void); +static int sub_80A78F4(void); +static void sub_80A7918(void); +static int sub_80A7924(void); +static int sub_80A7958(void); +static void sub_80A7970(void); +static void sub_80A797C(void); +static int sub_80A7988(void); +static void sub_80A79B4(struct Sprite *); +static void sub_80A79EC(struct Sprite *); +static void sub_80A7A94(struct Sprite *); +static void sub_80A7AE4(struct Sprite *); +static void CreateBagSprite(void); +static void sub_80A7B6C(struct Sprite *); +static void CreateBagPokeballSprite(u8); +static void sub_80A7C64(void); + +static void sub_80A3118(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + sub_80A740C(); + UpdatePaletteFade(); +} + +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); + } +} + +static bool8 SetupBagMultistep(void) +{ + u32 index; + u16 savedIme; + + switch (gMain.state) + { + case 0: + sub_80F9438(); + sub_80A34E8(); + gMain.state++; + break; + case 1: + remove_some_task(); + gMain.state++; + break; + case 2: + gpu_pal_allocator_reset__manage_upper_four(); + gMain.state++; + break; + case 3: + sub_80F9020(); + ewramBagSetupStep = 0; + gMain.state++; + break; + case 4: + ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = TRUE; + gMain.state++; + break; + case 5: + ResetSpriteData(); + gMain.state++; + break; + case 6: + if (LoadBagGraphicsMultistep() == FALSE) + break; + gMain.state++; + break; + case 7: + SetUpWindowConfig(&gWindowConfig_81E6DFC); + gMain.state++; + break; + case 8: + MultistepInitMenuWindowBegin(&gWindowConfig_81E6DFC); + gMain.state++; + break; + case 9: + if (!MultistepInitMenuWindowContinue()) + break; + gMain.state++; + break; + case 10: + sub_80F944C(); + 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); + if (sReturnLocation == RETURN_TO_FIELD_4 || sReturnLocation == RETURN_TO_FIELD_5) + { + sub_80F979C(2, 1); + sub_80F979C(3, 1); + } + gMain.state++; + break; + case 11: + gUnknown_0203855A = 16; + sub_80A39B8(gBGTilemapBuffers[2], sCurrentBagPocket + 1); + DrawPocketIndicatorDots(gBGTilemapBuffers[2], sCurrentBagPocket); + UpdateAllBagPockets(); + SortItemSlots(gBagPockets[2]); + SortItemSlots(gBagPockets[3]); + sub_80A3D40(); + gCurrentBagPocketItemSlots = gBagPockets[sCurrentBagPocket].itemSlots; + sub_80A362C(); + gMain.state++; + break; + case 12: + sub_80A48E8(0xFFFF, 0, 7); + index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + ItemListMenu_InitDescription(gCurrentBagPocketItemSlots[index].itemId); + ItemListMenu_InitMenu(); + gUnknown_0203855B = sCurrentBagPocket + 1; + gUnknown_0203855C = 0; + gMain.state++; + break; + case 13: + CreateBagSprite(); + CreateBagPokeballSprite(0); + sub_80A3740(); + gMain.state++; + break; + case 14: + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + gPaletteFade.bufferTransferDisabled = FALSE; + gMain.state++; + break; + case 15: + if (sub_8055870() == TRUE) + break; + gMain.state++; + break; + case 16: + SetVBlankCallback(sub_80A3134); + SetMainCallback2(sub_80A3118); + sub_80A751C(); + sub_80A7630(); + sub_80A770C(); + sub_80A7828(); + sub_80A78B8(); + return TRUE; + } + return FALSE; +} + +static bool8 sub_80A34B4(void) +{ + while (1) + { + if (SetupBagMultistep() == TRUE) + { + sPopupMenuSelection = 0; + ResetTasks(); + return TRUE; + } + if (sub_80F9344() == TRUE) + break; + } + return FALSE; +} + + +void sub_80A34E8(void) +{ + sub_80F9368(); + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(12) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(4) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + REG_BLDCNT = 0; +} + +static bool8 LoadBagGraphicsMultistep(void) +{ + switch (ewramBagSetupStep) + { + case 0: + LZDecompressVram(gBagScreen_Gfx, (void *)(VRAM + 0x4000)); + ewramBagSetupStep++; + break; + case 1: + CpuCopy16(gUnknown_08E77004, gBGTilemapBuffers[2], 0x800); + ewramBagSetupStep++; + break; + case 2: + if (gSaveBlock2.playerGender == MALE || sReturnLocation == RETURN_TO_WALLY_BATTLE) + LoadCompressedPalette(gBagScreenMale_Pal, 0, 64); + else + LoadCompressedPalette(gBagScreenFemale_Pal, 0, 64); + ewramBagSetupStep++; + break; + case 3: + if (gSaveBlock2.playerGender == MALE || sReturnLocation == RETURN_TO_WALLY_BATTLE) + LoadCompressedObjectPic(&sMaleBagSpriteSheet); + else + LoadCompressedObjectPic(&sFemaleBagSpriteSheet); + ewramBagSetupStep++; + break; + case 4: + LoadCompressedObjectPalette(&sBagSpritePalette); + ewramBagSetupStep = 0; + return TRUE; + } + return FALSE; +} + +static void sub_80A362C(void) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + u8 r3; + + if (sReturnLocation == RETURN_TO_FIELD_5) + r3 = gBagPocketScrollStates[i].numSlots - 1; + else + r3 = gBagPocketScrollStates[i].numSlots; + + if (gBagPocketScrollStates[i].scrollTop != 0) + { + if (gBagPocketScrollStates[i].scrollTop + gBagPocketScrollStates[i].cursorMax > r3) + gBagPocketScrollStates[i].scrollTop = r3 - gBagPocketScrollStates[i].cursorMax; + } + else + { + if (gBagPocketScrollStates[i].cursorPos > r3) + gBagPocketScrollStates[i].cursorPos = r3; + } + } +} + +void ResetBagScrollPositions(void) +{ + u16 i; + + for (i = 0; i < NUM_BAG_POCKETS; i++) + { + gBagPocketScrollStates[i].cursorPos = 0; + gBagPocketScrollStates[i].scrollTop = 0; + gBagPocketScrollStates[i].numSlots = 0; + gBagPocketScrollStates[i].cursorMax = 0; + } + sCurrentBagPocket = 0; +} + +static void sub_80A36B8(u16 *a, u8 b, u8 c, u8 d, u8 e) +{ + u16 i; + u16 j; + + for (i = c; i <= c + e; i++) + { + for (j = b; j <= b + d; j++) + { + u32 index = j + i * 32; + + a[index] = 0; + } + } +} + +void ClearBag(void) +{ + u16 i; + + for (i = 0; i < NUM_BAG_POCKETS; i++) + ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity); + ResetBagScrollPositions(); +} + +static void sub_80A3740(void) +{ + const u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE}; + + LoadPalette(&colors[1], 0xD1, sizeof(colors[1])); + LoadPalette(&colors[0], 0xD8, sizeof(colors[0])); +} + +static void sub_80A3770(void) +{ + if (sReturnLocation == RETURN_TO_FIELD_0) + { + sPopupMenuActionList = sItemPopupMenuChoicesTable[sCurrentBagPocket]; + if (sCurrentBagPocket != BAG_POCKET_BERRIES) + gUnknown_02038564 = 4; + else + gUnknown_02038564 = 6; + } +} + +static void sub_80A37C0(u8 taskId) +{ + gTasks[taskId].func = sub_80A50C8; + StartVerticalScrollIndicators(0); + StartVerticalScrollIndicators(1); + StartVerticalScrollIndicators(2); + StartVerticalScrollIndicators(3); +} + +static void sub_80A37F8(u8 taskId) +{ + u8 r5 = gUnknown_0203855A; + + if (r5 < 16) + { + gUnknown_0203855A++; + sub_80A396C(gBGTilemapBuffers[2], r5, gUnknown_0203855A, 0x4F); + sub_80A39E4(gBGTilemapBuffers[2], sCurrentBagPocket + 1, gUnknown_0203855A / 2, gTasks[taskId].data[5]); + gUnknown_02038558 = 1; + sub_80A48E8(taskId, r5 / 2, gUnknown_0203855A / 2 - 1); + gUnknown_02038558 = 0; + return; + } + + if (gLinkOpen == TRUE) + { + u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + + ItemListMenu_ChangeDescription(gCurrentBagPocketItemSlots[index].itemId, gUnknown_02038562); + gUnknown_02038562++; + } + else + { + while (gUnknown_02038562 < 3) + { + u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + + ItemListMenu_ChangeDescription(gCurrentBagPocketItemSlots[index].itemId, gUnknown_02038562); + gUnknown_02038562++; + } + } + if (gUnknown_02038562 == 3) + { + gUnknown_0203855A = 16; + gUnknown_0203855B = sCurrentBagPocket + 1; + sub_80A37C0(FindTaskIdByFunc(sub_80A4F68)); + DestroyTask(taskId); + ItemListMenu_InitMenu(); + sub_80F979C(2, 0); + sub_80F979C(3, 0); + } +} + +static void sub_80A3954(u16 *a) +{ + CpuCopy16(gUnknown_08E77004, a, 0x800); +} + +static void sub_80A396C(u16 *a, u8 b, u8 c, u8 d) +{ + u16 *dst = a + 14 + (b + 2) * 32; + u16 i; + + while (c > b++) + { + for (i = 0; i < 15; i++) + dst[i] = d; + dst += 32; + } +} + +static void sub_80A39B8(u16 *a, u8 b) +{ + u8 var = b * 2; + + sub_809D104(a, 4, 10, gUnknown_08E96EC8, 0, var, 8, 2); +} + +static void sub_80A39E4(u16 *a, u8 b, u8 c, s8 d) +{ + u16 r2 = b * 2; + u16 r7; + + if (d == -1) + { + r7 = (b + 1) * 2; + if (b == 5) + r7 = 2; + + sub_809D104(a, 4, 10, gUnknown_08E96EC8, 8 - c, r2, c, 2); + sub_809D104(a, c + 4, 10, gUnknown_08E96EC8, 0, r7, 8 - c, 2); + } + else if (d == 1) + { + r7 = (b - 1) * 2; + if (b == 1) + r7 = 10; + + sub_809D104(a, 4, 10, gUnknown_08E96EC8, c, r7, 8 - c, 2); + sub_809D104(a, 12 - c, 10, gUnknown_08E96EC8, 0, r2, c, 2); + } +} + +// Draws dots under the bag sprite, showing which pocket is selected +static void DrawPocketIndicatorDots(u16 *tileMapBuffer, u8 selectedPocket) +{ + u8 i; + + for (i = 0; i < NUM_BAG_POCKETS; i++) + { + if (i == selectedPocket) + tileMapBuffer[0x125 + i] = 0x107D; + else + tileMapBuffer[0x125 + i] = 0x107C; + } +} + +static void ChangePocket(u16 *tileMapBuffer, s8 delta) +{ + u8 taskId; + + sCurrentBagPocket += delta; + // Wrap around + if (sCurrentBagPocket >= NUM_BAG_POCKETS) + sCurrentBagPocket = 0; + if (sCurrentBagPocket < 0) + sCurrentBagPocket = NUM_BAG_POCKETS - 1; + + sub_80A76A0(); + sub_80A7590(); + gCurrentBagPocketItemSlots = gBagPockets[sCurrentBagPocket].itemSlots; + sub_80A3D24(sCurrentBagPocket); + gUnknown_0203855A = 0; + sub_80A3954(tileMapBuffer); + sub_80A396C(tileMapBuffer, 0, 16, 3); + sub_80A39B8(tileMapBuffer, 0); + gUnknown_0203855B = 6; + gUnknown_02038562 = 0; + taskId = FindTaskIdByFunc(sub_80A37F8); + if (taskId == 0xFF) + taskId = CreateTask(sub_80A37F8, 8); + gTasks[taskId].data[5] = delta; +} + +static void SwapItemSlots(struct ItemSlot *a, struct ItemSlot *b) +{ + struct ItemSlot temp = *a; + + *a = *b; + *b = temp; +} + +static void RemoveEmptyItemSlots(struct BagPocket pocket) +{ + u16 i; + u16 j; + + for (i = 0; i < pocket.capacity - 1; i++) + { + for (j = i + 1; j < pocket.capacity; j++) + { + if (pocket.itemSlots[i].quantity == 0) + SwapItemSlots(&pocket.itemSlots[i], &pocket.itemSlots[j]); + } + } +} + +static void SortItemSlots(struct BagPocket pocket) +{ + u16 i; + u16 j; + + for (i = 0; i < pocket.capacity; i++) + { + for (j = i + 1; j < pocket.capacity; j++) + { + if (pocket.itemSlots[i].quantity != 0 && pocket.itemSlots[j].quantity != 0 + && pocket.itemSlots[i].itemId > pocket.itemSlots[j].itemId) + SwapItemSlots(&pocket.itemSlots[i], &pocket.itemSlots[j]); + } + } +} + +static void UpdateBagPocket(u8 pocketNum) +{ + u16 i; + + gBagPocketScrollStates[pocketNum].numSlots = 0; + for (i = 0; i < gBagPockets[pocketNum].capacity; i++) + { + if (gBagPockets[pocketNum].itemSlots[i].quantity != 0) + gBagPocketScrollStates[pocketNum].numSlots++; + } + RemoveEmptyItemSlots(gBagPockets[pocketNum]); +} + +static void UpdateAllBagPockets(void) +{ + u8 i; + + for (i = 0; i < NUM_BAG_POCKETS; i++) + UpdateBagPocket(i); +} + +static void sub_80A3D24(u8 pocketNum) +{ + if (gBagPocketScrollStates[pocketNum].numSlots >= 7) + gBagPocketScrollStates[pocketNum].cursorMax = 7; + else + gBagPocketScrollStates[pocketNum].cursorMax = gBagPocketScrollStates[pocketNum].numSlots; +} + +static void sub_80A3D40(void) +{ + u8 i; + + for (i = 0; i < NUM_BAG_POCKETS; i++) + sub_80A3D24(i); +} + +static void sub_80A3D5C(u8 taskId) +{ + u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + + gCurrentBagPocketItemSlots[index].quantity -= gTasks[taskId].data[1]; + if (gCurrentBagPocketItemSlots[index].quantity == 0) // item slot will be removed if the quantity is zero + { + // Un-register the item if registered + if (gSaveBlock1.registeredItem == gCurrentBagPocketItemSlots[index].itemId) + { + RemoveSelectIconFromRegisteredItem(); + gSaveBlock1.registeredItem = ITEM_NONE; + } + + gCurrentBagPocketItemSlots[index].itemId = ITEM_NONE; + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 7 == gBagPocketScrollStates[sCurrentBagPocket].numSlots + && gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) + gBagPocketScrollStates[sCurrentBagPocket].scrollTop--; + UpdateBagPocket(sCurrentBagPocket); + } + sub_80A3D24(sCurrentBagPocket); +} + +void sub_80A3E0C(void) +{ + u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + + if (gCurrentBagPocketItemSlots[index].quantity == 0) + { + gCurrentBagPocketItemSlots[index].itemId = 0; + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 7 == gBagPocketScrollStates[sCurrentBagPocket].numSlots + && gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) + gBagPocketScrollStates[sCurrentBagPocket].scrollTop--; + UpdateBagPocket(sCurrentBagPocket); + } + sub_80A3D24(sCurrentBagPocket); +} + +static void nullsub_16(void) +{ +} + +static void sub_80A3E70(u8 a, u8 b) +{ + struct ItemSlot temp = gCurrentBagPocketItemSlots[a]; + + gCurrentBagPocketItemSlots[a] = gCurrentBagPocketItemSlots[b]; + gCurrentBagPocketItemSlots[b] = temp; +} + +static void sub_80A3E90(u8 taskId) +{ + PlaySE(SE_SELECT); + nullsub_16(); + sub_80A3E70( + gTasks[taskId].data[10] - 1, + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + gBagPocketScrollStates[sCurrentBagPocket].scrollTop); + gTasks[taskId].data[10] = 0; + sub_80A763C(); + sub_80A7528(0); + ItemListMenu_InitMenu(); +} + +static void sub_80A3EF4(u8 taskId) +{ + u8 r2; + + PlaySE(SE_SELECT); + nullsub_16(); + r2 = gTasks[taskId].data[10] - gBagPocketScrollStates[sCurrentBagPocket].scrollTop - 1; + gTasks[taskId].data[10] = 0; + if (r2 < 8) + sub_80A48E8(taskId, r2, r2); + sub_80A7528(0); +} + +static void sub_80A3F50(u8 taskId) +{ + gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A7528(1); +} + +void sub_80A3FA0(u16 *a, u8 b, u8 c, u8 d, u8 e, u16 f) +{ + s16 i; + s16 j; + + for (i = c; i < c + e; i++) + { + for (j = b; j < b + d; j++) + { + u32 index = j + i * 32; + + a[index] = f; + } + } +} + +static void sub_80A4008(u16 *a, u8 b, u8 c, u8 d, u8 e) +{ + sub_80A3FA0(a, b, c, d, e, 1); +} + +static void DrawSelectIcon(u32 itemPos) +{ + u16 *ptr1 = gBGTilemapBuffers[2] + 0x5A; + + ptr1 += itemPos * 64; + ptr1[0] = 0x5A; + ptr1[1] = 0x5B; + ptr1[2] = 0x5C; + ptr1[32] = 0x6A; + ptr1[33] = 0x6B; + ptr1[34] = 0x6C; +} + +static void MoveSelectIcon(u8 itemPos) +{ + u16 i; + u16 *ptr; + + ptr = gBGTilemapBuffers[2] + 0x5A; + for (i = 0; i < 16; i++) + { + ptr[0] = 0x4F; + ptr[1] = 0x4F; + ptr[2] = 0x4F; + ptr += 32; + } + + ptr = gBGTilemapBuffers[2] + 0x5A + itemPos * 64; + ptr[0] = 0x5A; + ptr[1] = 0x5B; + ptr[2] = 0x5C; + ptr[32] = 0x6A; + ptr[33] = 0x6B; + ptr[34] = 0x6C; +} + +static void EraseSelectIcon(u8 itemPos) +{ + u16 *ptr = gBGTilemapBuffers[2] + 0x5A; + + ptr += itemPos * 64; + ptr[0] = 0x4F; + ptr[1] = 0x4F; + ptr[2] = 0x4F; + ptr[32] = 0x4F; + ptr[33] = 0x4F; + ptr[34] = 0x4F; +} + +static void RemoveSelectIconFromRegisteredItem(void) +{ + u8 i; + + for (i = 0; i < 8; i++) + { + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i == gBagPocketScrollStates[sCurrentBagPocket].numSlots) + break; + if (gCurrentBagPocketItemSlots[gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i].itemId == gSaveBlock1.registeredItem) + { + EraseSelectIcon(i); + break; + } + } +} + +static void AddSelectIconToRegisteredItem(void) +{ + RemoveSelectIconFromRegisteredItem(); + MoveSelectIcon(gBagPocketScrollStates[sCurrentBagPocket].cursorPos); +} + +void sub_80A4164(u8 *dest, u16 value, enum StringConvertMode mode, u8 digits) +{ + *dest++ = CHAR_MULT_SIGN; + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 0x14; + dest[2] = 6; + dest += 3; + ConvertIntToDecimalStringN(dest, value, mode, 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); +} + +static void sub_80A41D4(u8 taskId) +{ + sub_80A763C(); +} + +static void sub_80A41E0(u8 *a, u16 b, const u8 *c, u16 d, u8 e) +{ + a[0] = EXT_CTRL_CODE_BEGIN; + a[1] = 0x13; + a[2] = 8; + a += 3; + a = ConvertIntToDecimalStringN(a, b, STR_CONV_MODE_LEADING_ZEROS, 2); + a[0] = EXT_CTRL_CODE_BEGIN; + a[1] = 0x13; + a[2] = 0x18; + a += 3; + a = sub_8072C74(a, c, 0x78 - (e + 1) * 6, 0); + *a++ = CHAR_MULT_SIGN; + sub_8072C14(a, d, 0x78, 1); +} + +static u8 *sub_80A425C(u8 taskId, u8 *text, u8 c) +{ + if (gTasks[taskId].data[10] - gBagPocketScrollStates[sCurrentBagPocket].scrollTop - 1 == c) + { + text[0] = EXT_CTRL_CODE_BEGIN; + text[1] = 1; + text[2] = 2; + text += 3; + } + return text; +} + +static bool8 sub_80A42B0(u8 itemPos, int b) +{ + u8 r5; + u16 *ptr; + struct UnknownStruct3 *r8 = &gUnknown_02038540; + + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + itemPos > gBagPocketScrollStates[sCurrentBagPocket].numSlots) + return TRUE; + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + itemPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) + { + if (sReturnLocation == RETURN_TO_FIELD_5) + return TRUE; + r5 = itemPos * 2 + 2; + sub_8072C74(gStringVar1, gOtherText_CloseBag, 0x78, 0); + MenuPrint(gStringVar1, 14, r5); + ptr = gBGTilemapBuffers[2] + 14 + r5 * 32; + ptr[0] = 0x4F; + ptr[1] = 0x4F; + ptr[32] = 0x4F; + ptr[33] = 0x4F; + if (itemPos == 7) + return TRUE; + if ((b == 1 && r8->unk2 != 0) || b == 2) + MenuFillWindowRectWithBlankTile(14, r5 + 2, 29, 13); + else + MenuFillWindowRectWithBlankTile(14, r5 + 2, 29, 17); + return TRUE; + } + return FALSE; +} + +static void sub_80A4380(u16 a, int b, int c, int d) +{ + u8 i; + + for (i = b; i <= c; i++) + { + u8 r4; + u8 r5; + u8 *text; + + if (sub_80A42B0(i, d) == TRUE) + break; + r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; + r5 = i * 2 + 2; + text = gStringVar1; + text = sub_80A425C(a, text, i); + 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); + } +} + +static void sub_80A444C(u16 a, int b, int c, int d) +{ + u8 i; + + for (i = b; i <= c; i++) + { + u8 r4; + u8 r5; + u8 *text; + + if (sub_80A42B0(i, d) == TRUE) + break; + r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; + r5 = i * 2 + 2; + text = gStringVar1; + text = sub_80A425C(a, text, i); +#if ENGLISH + sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x60, 0); +#else + sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x63, 0); +#endif + MenuPrint(gStringVar1, 14, r5); + if (gUnknown_02038558 != 0) + { + if (gCurrentBagPocketItemSlots[r4].itemId == gSaveBlock1.registeredItem) + DrawSelectIcon(i); + } + else + { + if (gCurrentBagPocketItemSlots[r4].itemId == gSaveBlock1.registeredItem) + MoveSelectIcon(i); + else + EraseSelectIcon(i); + } + } +} + +// more gBGTilemapBuffers shenanigans +#ifdef NONMATCHING +static void sub_80A4548(u16 a, int b, int c, int d) +{ + u8 i; + + for (i = b; i <= c; i++) + { + u8 r4; + u8 sp10; + u32 r5; + u8 *text; + + if (sub_80A42B0(i, d) == TRUE) + break; + r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; + sp10 = i * 2 + 2; + r5 = sp10 * 32 + 14; + text = gStringVar1; + text = sub_80A425C(a, text, i); + if (gCurrentBagPocketItemSlots[r4].itemId < 0x153) + { + const u8 *r2; + + gBGTilemapBuffers[2][r5 + 0] = 0x59; + gBGTilemapBuffers[2][r5 + 1] = 0x4F; + gBGTilemapBuffers[2][r5 + 32] = 0x69; + gBGTilemapBuffers[2][r5 + 33] = 0x4F; + r2 = gMoveNames[ItemIdToBattleMoveId(gCurrentBagPocketItemSlots[r4].itemId)]; + sub_80A41E0(text, gCurrentBagPocketItemSlots[r4].itemId - 288, r2, gCurrentBagPocketItemSlots[r4].quantity, 2); + } + else + { + const u8 *moveName; + + gBGTilemapBuffers[2][r5 + 0] = 0x105D; + gBGTilemapBuffers[2][r5 + 1] = 0x105E; + gBGTilemapBuffers[2][r5 + 32] = 0x106D; + gBGTilemapBuffers[2][r5 + 33] = 0x106E; + text[0] = EXT_CTRL_CODE_BEGIN; + text[1] = 0x13; + text[2] = 0x11; + text += 3; + text = ConvertIntToDecimalString(text, gCurrentBagPocketItemSlots[r4].itemId); + text[0] = EXT_CTRL_CODE_BEGIN; + text[1] = 0x13; + text[2] = 0x18; + text += 3; + moveName = gMoveNames[ItemIdToBattleMoveId(gCurrentBagPocketItemSlots[r4].itemId)]; + sub_8072C74(text, moveName, 0x78, 0); + } + MenuPrint(gStringVar1, 14, sp10); + } +} +#else +__attribute__((naked)) +static void sub_80A4548(u16 a, int b, int c, int d) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + str r2, [sp, 0x8]\n\ + str r3, [sp, 0xC]\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x4]\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r8, r1\n\ + ldr r0, _080A456C @ =gBGTilemapBuffers + 0x1000\n\ + mov r9, r0\n\ + b _080A46C2\n\ + .align 2, 0\n\ +_080A456C: .4byte gBGTilemapBuffers + 0x1000\n\ +_080A4570:\n\ + ldr r1, _080A461C @ =gBagPocketScrollStates\n\ + ldr r0, _080A4620 @ =sCurrentBagPocket\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r4, [r0, 0x1]\n\ + add r4, r8\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + mov r1, r8\n\ + lsls r0, r1, 25\n\ + movs r3, 0x80\n\ + lsls r3, 18\n\ + adds r0, r3\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x10]\n\ + lsls r0, 5\n\ + adds r0, 0xE\n\ + adds r5, r0, 0\n\ + ldr r6, _080A4624 @ =gStringVar1\n\ + ldr r1, [sp, 0x4]\n\ + lsls r0, r1, 24\n\ + lsrs r0, 24\n\ + adds r1, r6, 0\n\ + mov r2, r8\n\ + bl sub_80A425C\n\ + adds r6, r0, 0\n\ + ldr r3, _080A4628 @ =gCurrentBagPocketItemSlots\n\ + mov r10, r3\n\ + ldr r0, [r3]\n\ + lsls r7, r4, 2\n\ + adds r3, r7, r0\n\ + ldrh r1, [r3]\n\ + movs r0, 0xA9\n\ + lsls r0, 1\n\ + cmp r1, r0\n\ + bhi _080A4634\n\ + lsls r0, r5, 1\n\ + add r0, r9\n\ + movs r1, 0x59\n\ + strh r1, [r0]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 1\n\ + add r0, r9\n\ + movs r2, 0x4F\n\ + strh r2, [r0]\n\ + adds r0, r5, 0\n\ + adds r0, 0x20\n\ + lsls r0, 1\n\ + add r0, r9\n\ + movs r1, 0x69\n\ + strh r1, [r0]\n\ + adds r0, r5, 0\n\ + adds r0, 0x21\n\ + lsls r0, 1\n\ + add r0, r9\n\ + strh r2, [r0]\n\ + ldrh r0, [r3]\n\ + bl ItemIdToBattleMoveId\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0xD\n\ + adds r2, r0, 0\n\ + muls r2, r1\n\ + ldr r0, _080A462C @ =gMoveNames\n\ + adds r2, r0\n\ + mov r1, r10\n\ + ldr r0, [r1]\n\ + adds r0, r7, r0\n\ + ldr r3, _080A4630 @ =0xfffffee0\n\ + adds r1, r3, 0\n\ + ldrh r3, [r0]\n\ + adds r1, r3\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + ldrh r3, [r0, 0x2]\n\ + movs r0, 0x2\n\ + str r0, [sp]\n\ + adds r0, r6, 0\n\ + bl sub_80A41E0\n\ + b _080A46AE\n\ + .align 2, 0\n\ +_080A461C: .4byte gBagPocketScrollStates\n\ +_080A4620: .4byte sCurrentBagPocket\n\ +_080A4624: .4byte gStringVar1\n\ +_080A4628: .4byte gCurrentBagPocketItemSlots\n\ +_080A462C: .4byte gMoveNames\n\ +_080A4630: .4byte 0xfffffee0\n\ +_080A4634:\n\ + lsls r0, r5, 1\n\ + add r0, r9\n\ + ldr r1, _080A46EC @ =0x0000105d\n\ + strh r1, [r0]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 1\n\ + add r0, r9\n\ + adds r1, 0x1\n\ + strh r1, [r0]\n\ + adds r0, r5, 0\n\ + adds r0, 0x20\n\ + lsls r0, 1\n\ + add r0, r9\n\ + adds r1, 0xF\n\ + strh r1, [r0]\n\ + adds r0, r5, 0\n\ + adds r0, 0x21\n\ + lsls r0, 1\n\ + add r0, r9\n\ + adds r1, 0x1\n\ + strh r1, [r0]\n\ + movs r0, 0xFC\n\ + strb r0, [r6]\n\ + movs r4, 0x13\n\ + strb r4, [r6, 0x1]\n\ + movs r0, 0x11\n\ + strb r0, [r6, 0x2]\n\ + adds r6, 0x3\n\ + mov r1, r10\n\ + ldr r0, [r1]\n\ + adds r0, r7, r0\n\ + ldrh r1, [r0]\n\ + ldr r3, _080A46F0 @ =0xfffffeae\n\ + adds r1, r3\n\ + adds r0, r6, 0\n\ + bl ConvertIntToDecimalString\n\ + adds r6, r0, 0\n\ + movs r0, 0xFC\n\ + strb r0, [r6]\n\ + strb r4, [r6, 0x1]\n\ + movs r0, 0x18\n\ + strb r0, [r6, 0x2]\n\ + adds r6, 0x3\n\ + mov r1, r10\n\ + ldr r0, [r1]\n\ + adds r0, r7, r0\n\ + ldrh r0, [r0]\n\ + bl ItemIdToBattleMoveId\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0xD\n\ + muls r1, r0\n\ + ldr r0, _080A46F4 @ =gMoveNames\n\ + adds r1, r0\n\ + adds r0, r6, 0\n\ + movs r2, 0x78\n\ + movs r3, 0\n\ + bl sub_8072C74\n\ +_080A46AE:\n\ + ldr r0, _080A46F8 @ =gStringVar1\n\ + movs r1, 0xE\n\ + ldr r2, [sp, 0x10]\n\ + bl MenuPrint\n\ + mov r0, r8\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ +_080A46C2:\n\ + ldr r3, [sp, 0x8]\n\ + cmp r8, r3\n\ + bgt _080A46DA\n\ + mov r0, r8\n\ + ldr r1, [sp, 0xC]\n\ + bl sub_80A42B0\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _080A46DA\n\ + b _080A4570\n\ +_080A46DA:\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A46EC: .4byte 0x0000105d\n\ +_080A46F0: .4byte 0xfffffeae\n\ +_080A46F4: .4byte gMoveNames\n\ +_080A46F8: .4byte gStringVar1\n\ + .syntax divided\n"); +} +#endif + +static void sub_80A46FC(u16 a, int b, int c, int d) +{ + u8 i; + + for (i = b; i <= c; i++) + { + u8 r4; + u8 r5; + u8 *text; + register int var asm("r0"); + + if (sub_80A42B0(i, d) == TRUE) + break; + r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; + r5 = i * 2 + 2; + + var = 14 + r5 * 32; + gBGTilemapBuffers[2][var] = 0x59; + var += 32; + gBGTilemapBuffers[2][var] = 0x69; + + text = gStringVar1; + 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); + } +} + +static void sub_80A47E8(u16 a, int b, int c, int d) +{ + switch (sCurrentBagPocket) + { + case BAG_POCKET_ITEMS: + case BAG_POCKET_POKE_BALLS: + sub_80A4380(a, b, c, d); + break; + case BAG_POCKET_KEY_ITEMS: + sub_80A444C(a, b, c, d); + break; + case BAG_POCKET_TMs_HMs: + sub_80A4548(a, b, c, d); + break; + case BAG_POCKET_BERRIES: + sub_80A46FC(a, b, c, d); + break; + } + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) + sub_80F979C(0, 0); + else + sub_80F979C(0, 1); + 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); + else + sub_80F979C(1, 1); +} + +static void sub_80A48E8(u16 taskId, int b, int c) +{ + sub_80A47E8(taskId, b, c, 0); +} + +static void sub_80A48F8(u16 taskId) +{ + sub_80A47E8(taskId, 0, 5, 2); +} + +static void ItemListMenu_InitDescription(s16 itemId) +{ + u8 r5; + + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) + { + r5 = sub_8072A18(gOtherText_ReturnTo, 4, 0x68, 0x68, 1); + r5 += sub_8072A18(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0x68, 1); + } + else + { + r5 = sub_8072A18(ItemId_GetDescription(itemId), 4, 0x68, 0x68, 1); + } + + if (r5 < 3) + MenuZeroFillWindowRect(0, 13 + r5 * 2, 13, 20); +} + +static void ItemListMenu_ChangeDescription(s16 itemId, int b) +{ + u8 description[100]; + + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) + { + if (b == 0) + { + MenuZeroFillWindowRect(0, 13, 13, 20); + MenuPrint_PixelCoords(gOtherText_ReturnTo, 4, 0x68, 0); + } + else if (b == 1) + { + MenuPrint_PixelCoords(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0); + } + } + else + { + if (b == 0) + MenuZeroFillWindowRect(0, 13, 13, 20); + if (ItemId_CopyDescription(description, itemId, b)) + MenuPrint_PixelCoords(description, 4, 104 + b * 16, 0); + } +} + +static bool32 CopyTextLine(u8 *destination, const u8 *source, u32 c) +{ + u32 r4 = c + 1; + const u8 *src = source; + u8 *dst = destination; + + while (1) + { + if (*src == CHAR_NEWLINE || *src == EOS) + { + r4--; + if (r4 == 0) + { + *dst = EOS; + return TRUE; + } + if (*src == EOS) + return FALSE; + // got a new line - reset dst pointer + dst = destination; + src++; + } + else + { + *dst++ = *src++; + } + } +} + +static void sub_80A4A98(const u8 *text, u32 line) +{ + u8 buffer[100]; + + if (line == 0) + MenuZeroFillWindowRect(0, 13, 13, 20); + if (CopyTextLine(buffer, text, line)) + MenuPrint_PixelCoords(buffer, 4, 104 + line * 16, 0); +} + +static void sub_80A4ADC(u8 taskId) +{ + if (gTasks[taskId].data[10] == 0) + sub_80A7528(0); + PlaySE(SE_SELECT); + gUnknown_0203855C = 1; +} + +static void sub_80A4B14(s8 a, u8 b) +{ + gBagPocketScrollStates[sCurrentBagPocket].scrollTop += a; + MoveMenuCursor(0); + sub_80A73C0(); + sub_80A763C(); + sub_80A4ADC(b); +} + +static void sub_80A4B58(s8 delta, u8 b) +{ + gBagPocketScrollStates[sCurrentBagPocket].cursorPos = MoveMenuCursor(delta); + sub_80A73C0(); + sub_80A4ADC(b); +} + +static const u8 *sub_80A4B90(u16 itemId) +{ + if (TestPlayerAvatarFlags(6)) + { + if (itemId == ITEM_MACH_BIKE || itemId == ITEM_ACRO_BIKE) + return gOtherText_Walk; + } + if (ItemIsMail(itemId) == TRUE) + return gOtherText_Check; + return sItemPopupMenuActions[sPopupMenuActionList[0]].text; +} + +static void sub_80A4BF0(u16 *a) +{ + u8 i; + + if (gUnknown_02038564 == 4) + { + MenuDrawTextWindow(0, 7, 13, 12); + sub_80A4008(a, 1, 8, 12, 4); + if (sub_80F9344() == TRUE && sReturnLocation == RETURN_TO_FIELD_5) + { + sub_80A7834(1, 0); + } + else + { + for (i = 0; i < gUnknown_02038564; i++) + { + const u8 *text; + + if (i == 0) + text = sub_80A4B90(gScriptItemId); + else + text = sItemPopupMenuActions[sPopupMenuActionList[i]].text; + MenuPrint(text, 1 + (i / 2) * 6, 8 + (i % 2) * 2); + } + } + if (sReturnLocation == RETURN_TO_FIELD_5) + InitMenu(0, 1, 8, gUnknown_02038564, sPopupMenuSelection, 1); + else + InitMenu(0, 1, 8, gUnknown_02038564, 0, 1); + sub_8072DCC(0x2F); + } + else + { + MenuDrawTextWindow(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); + InitMenu(0, 1, 6, gUnknown_02038564, 0, 1); + sub_8072DCC(0x2F); + } + sub_80A7528(2); +} + +static void sub_80A4DA4(u16 *a) +{ + sub_80A73FC(); + sub_80A36B8(a, 0, 6, 13, 6); + MenuZeroFillWindowRect(0, 5, 13, 12); + sub_80A7590(); +} + +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); + sub_80A4008(gBGTilemapBuffers[1], b + 1, c + 1, d - 1, e - 1); + sub_80A418C(1, 1, b + 2, c + 1, 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); + ChangePocket(gBGTilemapBuffers[2], delta); + DrawPocketIndicatorDots(gBGTilemapBuffers[2], sCurrentBagPocket); + sub_80A3770(); + sub_80A7C64(); + CreateBagPokeballSprite(b); +} + +static bool8 sub_80A4F0C(void) +{ + if (sReturnLocation == RETURN_TO_FIELD_5 || sReturnLocation == RETURN_TO_FIELD_4) + return FALSE; + if (gMain.newKeys == DPAD_RIGHT || sub_80F9284() == 2) + { + sub_80A4E8C(1, 2); + return TRUE; + } + if (gMain.newKeys == DPAD_LEFT || sub_80F9284() == 1) + { + sub_80A4E8C(-1, 1); + return TRUE; + } + return FALSE; +} + +static void sub_80A4F68(u8 taskId) +{ + sub_80A4F0C(); +} + +static bool8 sub_80A4F74(u8 a) +{ + bool8 retVal = FALSE; + + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) + { + if (gBagPocketScrollStates[sCurrentBagPocket].cursorPos != 0) + sub_80A4B58(-1, a); + else if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) + sub_80A4B14(-1, a); + if (gLinkOpen == TRUE && gMain.keyRepeatCounter == 5) + gMain.keyRepeatCounter = 11; + retVal = TRUE; + } + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) + { + if (sReturnLocation != RETURN_TO_FIELD_5) + { + if (gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].cursorMax) + { + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots) + sub_80A4B14(1, a); + } + else + { + sub_80A4B58(1, a); + } + } + else + { + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots - 1) + { + if (gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].cursorMax) + sub_80A4B58(1, a); + else + sub_80A4B14(1, a); + } + } + retVal = TRUE; + if (gLinkOpen == TRUE && gMain.keyRepeatCounter == 5) + gMain.keyRepeatCounter = 11; + } + else + { + if (gTasks[a].data[10] == 0 && sub_80A4F0C() == TRUE) + { + sub_80A73F0(); + gTasks[a].func = sub_80A4F68; + retVal = TRUE; + } + else + { + sub_80A73C0(); + } + } + return retVal; +} + +static void sub_80A50C8(u8 taskId) +{ + s16 *r5 = gTasks[taskId].data; + + if (!gPaletteFade.active) + { + if (sub_80A4F74(taskId) == TRUE) + { + sub_808B5B4(taskId); + return; + } + + if ((gMain.newKeys & SELECT_BUTTON) + && !(sCurrentBagPocket == BAG_POCKET_BERRIES || sCurrentBagPocket == BAG_POCKET_TMs_HMs) + && (sReturnLocation == RETURN_TO_FIELD_0 || sReturnLocation == RETURN_TO_BATTLE)) + { + if (r5[10] == 0) + { + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots) + { + PlaySE(SE_SELECT); + sub_80A3F50(taskId); + } + sub_808B5B4(taskId); + } + else + { + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots) + { + PlaySE(SE_SELECT); + sub_80A3E90(taskId); + } + else + { + sub_80A3EF4(taskId); + } + sub_808B5B4(taskId); + } + return; + } + + if (gMain.newKeys & A_BUTTON) + { + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) + { + if (r5[10] == 0) + { + gScriptItemId = 0; + gUnknown_083C16BC[sReturnLocation].onBagClose(taskId); + } + else + { + sub_80A3EF4(taskId); + } + sub_808B5B4(taskId); + } + else + { + if (r5[10] == 0) + { + PlaySE(SE_SELECT); + gUnknown_02038560 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + gScriptItemId = gCurrentBagPocketItemSlots[gUnknown_02038560].itemId; + gUnknown_083C16BC[sReturnLocation].onItemSelect(taskId); + sub_80F98A4(0); + sub_80F98A4(1); + sub_80F98A4(2); + sub_80F98A4(3); + sub_80A797C(); + } + else + { + sub_80A3E90(taskId); + } + sub_808B5B4(taskId); + } + return; + } + + if (gMain.newKeys & B_BUTTON) + { + if (r5[10] == 0) + { + if (sReturnLocation != RETURN_TO_FIELD_5) + { + gScriptItemId = 0; + gUnknown_083C16BC[sReturnLocation].onBagClose(taskId); + } + } + else + { + sub_80A3EF4(taskId); + } + sub_808B5B4(taskId); + return; + } + } +} + +bool8 sub_80A52C4(u8 taskId, u16 b) +{ + s16 *taskData = gTasks[taskId].data; + + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) + { + if (taskData[1] != b) + taskData[1]++; + else + taskData[1] = 1; + return TRUE; + } + + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) + { + if (taskData[1] != 1) + taskData[1]--; + else + taskData[1] = b; + return TRUE; + } + + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_RIGHT) + { + if (taskData[1] + 10 < b) + taskData[1] += 10; + else + taskData[1] = b; + return TRUE; + } + + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_LEFT) + { + if (taskData[1] > 10) + taskData[1] -= 10; + else + taskData[1] = 1; + return TRUE; + } + + return FALSE; +} + +static bool8 sub_80A5350(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + if (sub_80A52C4(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) + sub_80A418C(taskData[1], 1, taskData[2], taskData[3], 3); + else + sub_80A418C(taskData[1], 1, taskData[2], taskData[3], 2); + return TRUE; + } + return FALSE; +} + +static void sub_80A53CC(void) +{ + if (sub_80A34B4() == TRUE) + { + sub_80A3770(); + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); + } +} + +void sub_80A53F8(void) +{ + sReturnLocation = RETURN_TO_FIELD_0; + SetMainCallback2(sub_80A53CC); +} + +#ifdef NONMATCHING +static void sub_80A5414(u8 taskId) +{ + TaskFunc r5 = NULL; + + if (sub_80A78A0() != 0) + { + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x40) + { + if ((sPopupMenuSelection & 1) && sPopupMenuActionList[sPopupMenuSelection - 1] == 8) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = MoveMenuCursor3(-1); + } + } + //_080A546C + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x80) + { + if (!(sPopupMenuSelection & 1) && sPopupMenuActionList[sPopupMenuSelection + 1] != 8) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = MoveMenuCursor3(1); + } + } + //_080A549C + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x20) + { + if (sPopupMenuSelection > 1 && sPopupMenuActionList[sPopupMenuSelection - 2] != 8) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = MoveMenuCursor3(-2); + } + } + //_080A54CC + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x10) + { + if (sPopupMenuSelection <= 1 && sPopupMenuActionList[sPopupMenuSelection + 2] != 8) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = MoveMenuCursor3(2); + } + } + //_080A5500 + else if (!(gMain.newKeys & A_BUTTON)) + { + if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].data[10] = 0; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A4DA4(gBGTilemapBuffers[1]); + r5 = sItemPopupMenuActions[sPopupMenuActionList[3]].func; + r5(taskId); + } + } + else + { + //_080A5590 + gTasks[taskId].data[10] = 0; + sub_80A4DA4(gBGTilemapBuffers[1]); + r5 = sItemPopupMenuActions[sPopupMenuActionList[sPopupMenuSelection]].func; + r5(taskId); + } + } + //_080A5552 + if (r5 == NULL) + { + if (sReturnLocation == RETURN_TO_FIELD_5) + { + if (sPopupMenuSelection == 0) + { + sub_8072DDC(12); + return; + } + //_080A55D4 + //else + //{ + if (sPopupMenuSelection == 0 || sPopupMenuSelection == 1) + sub_8072DCC(0x2F); + else + sub_8072DCC(0x30); + //} + } + //_080A55E0 + else + { + if (sPopupMenuSelection == 0 || sPopupMenuSelection == 1) + sub_8072DCC(0x2F); + else + sub_8072DCC(0x30); + } + } +} +#else +__attribute__((naked)) +static void sub_80A5414(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + movs r5, 0\n\ + bl sub_80A78A0\n\ + cmp r0, 0\n\ + bne _080A5426\n\ + b _080A5552\n\ +_080A5426:\n\ + ldr r2, _080A5460 @ =gMain\n\ + ldrh r0, [r2, 0x30]\n\ + movs r1, 0xF0\n\ + ands r1, r0\n\ + cmp r1, 0x40\n\ + bne _080A546C\n\ + ldr r4, _080A5464 @ =sPopupMenuSelection\n\ + ldrb r1, [r4]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080A5440\n\ + b _080A5552\n\ +_080A5440:\n\ + ldrb r1, [r4]\n\ + ldr r0, _080A5468 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + subs r1, 0x1\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x8\n\ + bne _080A5452\n\ + b _080A5552\n\ +_080A5452:\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + b _080A54EE\n\ + .align 2, 0\n\ +_080A5460: .4byte gMain\n\ +_080A5464: .4byte sPopupMenuSelection\n\ +_080A5468: .4byte sPopupMenuActionList\n\ +_080A546C:\n\ + cmp r1, 0x80\n\ + bne _080A549C\n\ + ldr r4, _080A5494 @ =sPopupMenuSelection\n\ + ldrb r1, [r4]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080A5552\n\ + ldrb r1, [r4]\n\ + ldr r0, _080A5498 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x1]\n\ + cmp r0, 0x8\n\ + beq _080A5552\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x1\n\ + b _080A54EE\n\ + .align 2, 0\n\ +_080A5494: .4byte sPopupMenuSelection\n\ +_080A5498: .4byte sPopupMenuActionList\n\ +_080A549C:\n\ + cmp r1, 0x20\n\ + bne _080A54CC\n\ + ldr r4, _080A54C4 @ =sPopupMenuSelection\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x1\n\ + bls _080A5552\n\ + adds r1, r0, 0\n\ + ldr r0, _080A54C8 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + subs r1, 0x2\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x8\n\ + beq _080A5552\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x2\n\ + negs r0, r0\n\ + b _080A54EE\n\ + .align 2, 0\n\ +_080A54C4: .4byte sPopupMenuSelection\n\ +_080A54C8: .4byte sPopupMenuActionList\n\ +_080A54CC:\n\ + cmp r1, 0x10\n\ + bne _080A5500\n\ + ldr r4, _080A54F8 @ =sPopupMenuSelection\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x1\n\ + bhi _080A5552\n\ + adds r1, r0, 0\n\ + ldr r0, _080A54FC @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x2]\n\ + cmp r0, 0x8\n\ + beq _080A5552\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x2\n\ +_080A54EE:\n\ + bl MoveMenuCursor3\n\ + strb r0, [r4]\n\ + b _080A5552\n\ + .align 2, 0\n\ +_080A54F8: .4byte sPopupMenuSelection\n\ +_080A54FC: .4byte sPopupMenuActionList\n\ +_080A5500:\n\ + ldrh r1, [r2, 0x2E]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080A5590\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080A5552\n\ + ldr r1, _080A5570 @ =gTasks\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + strh r5, [r0, 0x1C]\n\ + ldr r1, _080A5574 @ =gBagPocketScrollStates\n\ + ldr r0, _080A5578 @ =sCurrentBagPocket\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r2, [r0]\n\ + adds r0, r4, 0\n\ + adds r1, r2, 0\n\ + bl sub_80A48E8\n\ + ldr r0, _080A557C @ =gBGTilemapBuffers + 0x800\n\ + bl sub_80A4DA4\n\ + ldr r1, _080A5580 @ =sItemPopupMenuActions\n\ + ldr r0, _080A5584 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + ldrb r0, [r0, 0x3]\n\ + lsls r0, 3\n\ + adds r1, 0x4\n\ + adds r0, r1\n\ + ldr r5, [r0]\n\ + adds r0, r4, 0\n\ + bl _call_via_r5\n\ +_080A5552:\n\ + cmp r5, 0\n\ + bne _080A55FA\n\ + ldr r0, _080A5588 @ =sReturnLocation\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x5\n\ + bne _080A55E0\n\ + ldr r0, _080A558C @ =sPopupMenuSelection\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _080A55D4\n\ + movs r0, 0xC\n\ + bl sub_8072DDC\n\ + b _080A55FA\n\ + .align 2, 0\n\ +_080A5570: .4byte gTasks\n\ +_080A5574: .4byte gBagPocketScrollStates\n\ +_080A5578: .4byte sCurrentBagPocket\n\ +_080A557C: .4byte gBGTilemapBuffers + 0x800\n\ +_080A5580: .4byte sItemPopupMenuActions\n\ +_080A5584: .4byte sPopupMenuActionList\n\ +_080A5588: .4byte sReturnLocation\n\ +_080A558C: .4byte sPopupMenuSelection\n\ +_080A5590:\n\ + ldr r1, _080A55C0 @ =gTasks\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + strh r5, [r0, 0x1C]\n\ + ldr r0, _080A55C4 @ =gBGTilemapBuffers + 0x800\n\ + bl sub_80A4DA4\n\ + ldr r1, _080A55C8 @ =sItemPopupMenuActions\n\ + ldr r0, _080A55CC @ =sPopupMenuSelection\n\ + ldrb r2, [r0]\n\ + ldr r0, _080A55D0 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + lsls r0, 3\n\ + adds r1, 0x4\n\ + adds r0, r1\n\ + ldr r5, [r0]\n\ + adds r0, r4, 0\n\ + bl _call_via_r5\n\ + b _080A5552\n\ + .align 2, 0\n\ +_080A55C0: .4byte gTasks\n\ +_080A55C4: .4byte gBGTilemapBuffers + 0x800\n\ +_080A55C8: .4byte sItemPopupMenuActions\n\ +_080A55CC: .4byte sPopupMenuSelection\n\ +_080A55D0: .4byte sPopupMenuActionList\n\ +_080A55D4:\n\ + cmp r0, 0x1\n\ + bls _080A55E8\n\ + movs r0, 0x30\n\ + bl sub_8072DCC\n\ + b _080A55FA\n\ +_080A55E0:\n\ + ldr r0, _080A55F0 @ =sPopupMenuSelection\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + bhi _080A55F4\n\ +_080A55E8:\n\ + movs r0, 0x2F\n\ + bl sub_8072DCC\n\ + b _080A55FA\n\ + .align 2, 0\n\ +_080A55F0: .4byte sPopupMenuSelection\n\ +_080A55F4:\n\ + movs r0, 0x30\n\ + bl sub_8072DCC\n\ +_080A55FA:\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +__attribute__((naked)) +static void sub_80A5600(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + movs r5, 0\n\ + ldr r2, _080A563C @ =gMain\n\ + ldrh r0, [r2, 0x30]\n\ + movs r1, 0xF0\n\ + ands r1, r0\n\ + cmp r1, 0x40\n\ + bne _080A5648\n\ + ldr r4, _080A5640 @ =sPopupMenuSelection\n\ + ldrb r0, [r4]\n\ + cmp r0, 0\n\ + bne _080A561E\n\ + b _080A5736\n\ +_080A561E:\n\ + adds r1, r0, 0\n\ + ldr r0, _080A5644 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + subs r1, 0x1\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x8\n\ + bne _080A5630\n\ + b _080A5736\n\ +_080A5630:\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + b _080A56D2\n\ + .align 2, 0\n\ +_080A563C: .4byte gMain\n\ +_080A5640: .4byte sPopupMenuSelection\n\ +_080A5644: .4byte sPopupMenuActionList\n\ +_080A5648:\n\ + cmp r1, 0x80\n\ + bne _080A5680\n\ + ldr r4, _080A5674 @ =sPopupMenuSelection\n\ + ldrb r1, [r4]\n\ + ldr r0, _080A5678 @ =gUnknown_02038564\n\ + ldrb r0, [r0]\n\ + subs r0, 0x1\n\ + cmp r1, r0\n\ + beq _080A5736\n\ + cmp r1, 0x2\n\ + beq _080A5736\n\ + ldr r0, _080A567C @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r0, r1, r0\n\ + ldrb r0, [r0, 0x1]\n\ + cmp r0, 0x8\n\ + beq _080A5736\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x1\n\ + b _080A56D2\n\ + .align 2, 0\n\ +_080A5674: .4byte sPopupMenuSelection\n\ +_080A5678: .4byte gUnknown_02038564\n\ +_080A567C: .4byte sPopupMenuActionList\n\ +_080A5680:\n\ + cmp r1, 0x20\n\ + bne _080A56B0\n\ + ldr r4, _080A56A8 @ =sPopupMenuSelection\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x2\n\ + bls _080A5736\n\ + adds r1, r0, 0\n\ + ldr r0, _080A56AC @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + subs r1, 0x3\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x8\n\ + beq _080A5736\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x3\n\ + negs r0, r0\n\ + b _080A56D2\n\ + .align 2, 0\n\ +_080A56A8: .4byte sPopupMenuSelection\n\ +_080A56AC: .4byte sPopupMenuActionList\n\ +_080A56B0:\n\ + cmp r1, 0x10\n\ + bne _080A56E4\n\ + ldr r4, _080A56DC @ =sPopupMenuSelection\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x2\n\ + bhi _080A5736\n\ + adds r1, r0, 0\n\ + ldr r0, _080A56E0 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x3]\n\ + cmp r0, 0x8\n\ + beq _080A5736\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x3\n\ +_080A56D2:\n\ + bl MoveMenuCursor3\n\ + strb r0, [r4]\n\ + b _080A5736\n\ + .align 2, 0\n\ +_080A56DC: .4byte sPopupMenuSelection\n\ +_080A56E0: .4byte sPopupMenuActionList\n\ +_080A56E4:\n\ + ldrh r1, [r2, 0x2E]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080A5768\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080A5736\n\ + ldr r1, _080A574C @ =gTasks\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + strh r5, [r0, 0x1C]\n\ + ldr r1, _080A5750 @ =gBagPocketScrollStates\n\ + ldr r0, _080A5754 @ =sCurrentBagPocket\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r2, [r0]\n\ + adds r0, r4, 0\n\ + adds r1, r2, 0\n\ + bl sub_80A48E8\n\ + ldr r0, _080A5758 @ =gBGTilemapBuffers + 0x800\n\ + bl sub_80A4DA4\n\ + ldr r1, _080A575C @ =sItemPopupMenuActions\n\ + ldr r0, _080A5760 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + ldrb r0, [r0, 0x5]\n\ + lsls r0, 3\n\ + adds r1, 0x4\n\ + adds r0, r1\n\ + ldr r5, [r0]\n\ + adds r0, r4, 0\n\ + bl _call_via_r5\n\ +_080A5736:\n\ + cmp r5, 0\n\ + bne _080A57BE\n\ + ldr r0, _080A5764 @ =sPopupMenuSelection\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _080A57AC\n\ + movs r0, 0xC\n\ + bl sub_8072DDC\n\ + b _080A57BE\n\ + .align 2, 0\n\ +_080A574C: .4byte gTasks\n\ +_080A5750: .4byte gBagPocketScrollStates\n\ +_080A5754: .4byte sCurrentBagPocket\n\ +_080A5758: .4byte gBGTilemapBuffers + 0x800\n\ +_080A575C: .4byte sItemPopupMenuActions\n\ +_080A5760: .4byte sPopupMenuActionList\n\ +_080A5764: .4byte sPopupMenuSelection\n\ +_080A5768:\n\ + ldr r1, _080A5798 @ =gTasks\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + strh r5, [r0, 0x1C]\n\ + ldr r0, _080A579C @ =gBGTilemapBuffers + 0x800\n\ + bl sub_80A4DA4\n\ + ldr r1, _080A57A0 @ =sItemPopupMenuActions\n\ + ldr r0, _080A57A4 @ =sPopupMenuSelection\n\ + ldrb r2, [r0]\n\ + ldr r0, _080A57A8 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + lsls r0, 3\n\ + adds r1, 0x4\n\ + adds r0, r1\n\ + ldr r5, [r0]\n\ + adds r0, r4, 0\n\ + bl _call_via_r5\n\ + b _080A5736\n\ + .align 2, 0\n\ +_080A5798: .4byte gTasks\n\ +_080A579C: .4byte gBGTilemapBuffers + 0x800\n\ +_080A57A0: .4byte sItemPopupMenuActions\n\ +_080A57A4: .4byte sPopupMenuSelection\n\ +_080A57A8: .4byte sPopupMenuActionList\n\ +_080A57AC:\n\ + cmp r0, 0x2\n\ + bhi _080A57B8\n\ + movs r0, 0x2F\n\ + bl sub_8072DCC\n\ + b _080A57BE\n\ +_080A57B8:\n\ + movs r0, 0x30\n\ + bl sub_8072DCC\n\ +_080A57BE:\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} + +static void sub_80A57C4(void) +{ + u8 r5; + + sPopupMenuActionList = gUnknown_083C16AE[sCurrentBagPocket]; + if (sCurrentBagPocket == BAG_POCKET_KEY_ITEMS) + { + gUnknown_02038564 = 1; + r5 = 9; + } + else if (sub_80F92F4(gScriptItemId) == 0) + { + sPopupMenuActionList = gUnknown_083C16AE[4]; + gUnknown_02038564 = 1; + r5 = 9; + } + else + { + gUnknown_02038564 = 2; + r5 = 7; + } + sub_80A4008(gBGTilemapBuffers[1], 7, r5 + 1, 6, gUnknown_02038564 * 2); + MenuDrawTextWindow(6, r5, 13, gUnknown_02038564 * 2 + 1 + r5); + sub_80A7834(0, r5); + InitMenu(0, 7, r5 + 1, gUnknown_02038564, 0, 6); +} + +static void sub_80A5888(u8 taskId) +{ + if (sub_80A78A0() != 0) + { + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (sPopupMenuSelection != 0) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = MoveMenuCursor(-1); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (sPopupMenuSelection != gUnknown_02038564 - 1) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = MoveMenuCursor(1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + gTasks[taskId].data[10] = 0; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A4DA4(gBGTilemapBuffers[1]); + sItemPopupMenuActions[sPopupMenuActionList[sPopupMenuSelection]].func(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].data[10] = 0; + sub_80A4DA4(gBGTilemapBuffers[1]); + sItemPopupMenuActions[2].func(taskId); + } + } +} + +static void OnBagClose_Field0(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_805469C >> 16; + gTasks[taskId].data[9] = (u32)sub_805469C; + gLastFieldPokeMenuOpened = 0; + sub_80A5AE4(taskId); +} + +static void OnItemSelect_Field05(u8 taskId) +{ + sPopupMenuSelection = 0; + if (sReturnLocation == RETURN_TO_FIELD_5) + sPopupMenuSelection = 1; + gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A73FC(); + if (sub_80F9344() == TRUE && sReturnLocation != RETURN_TO_FIELD_5) + { + sub_80A57C4(); + gTasks[taskId].func = sub_80A5888; + } + else + { + sub_80A4BF0(gBGTilemapBuffers[1]); + if (sCurrentBagPocket != BAG_POCKET_BERRIES || sReturnLocation == RETURN_TO_FIELD_5) + gTasks[taskId].func = sub_80A5414; + else + gTasks[taskId].func = sub_80A5600; + } +} + +static void sub_80A5AAC(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = HandleItemMenuPaletteFade; +} + +static void sub_80A5AE4(u8 taskId) +{ + PlaySE(SE_SELECT); + sub_80A5AAC(taskId); +} + +void HandleItemMenuPaletteFade(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + if (!gPaletteFade.active) + { + MainCallback cb = (MainCallback)((u16)taskData[8] << 16 | (u16)taskData[9]); + + SetMainCallback2(cb); + gpu_pal_allocator_reset__manage_upper_four(); + DestroyTask(taskId); + } +} + +void sub_80A5B40(void) +{ + while (1) + { + if (SetupBagMultistep() == TRUE) + { + ResetTasks(); + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +static void HandlePopupMenuAction_UseOnField(u8 taskId) +{ + if (ItemId_GetFieldFunc(gScriptItemId) != NULL) + { + PlaySE(SE_SELECT); + if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gScriptItemId) == 1) + { + sub_80A5BF8(taskId); + } + else + { + gTasks[taskId].data[2] = 0; + if (sCurrentBagPocket != BAG_POCKET_BERRIES) + ItemId_GetFieldFunc(gScriptItemId)(taskId); + else + sub_80C9C7C(taskId); + } + } +} + +static void sub_80A5BF8(u8 taskId) +{ + sub_80A73FC(); + sub_80A7590(); + DisplayCannotUseItemMessage(taskId, gOtherText_NoPokemon, CleanUpItemMenuMessage, 1); +} + +static void sub_80A5C24(u8 taskId) +{ + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +void CleanUpItemMenuMessage(u8 taskId) +{ + sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); + MenuZeroFillWindowRect(7, 7, 13, 12); + MenuZeroFillWindowRect(0, 14, 29, 19); + gTasks[taskId].func = sub_80A5C24; +} + +void CleanUpOverworldMessage(u8 taskId) +{ + MenuZeroFillWindowRect(0, 13, 29, 19); + DestroyTask(taskId); + sub_8064E2C(); + ScriptContext2_Disable(); +} + +void ExecuteItemUseFromBlackPalette(void) +{ + pal_fill_black(); + CreateTask(Task_CallItemUseOnFieldCallback, 8); +} + +static void Task_CallItemUseOnFieldCallback(u8 taskId) +{ + if (sub_807D770() == TRUE) + gUnknown_03005D00(taskId); +} + +void sub_80A5D04(void) +{ + while (1) + { + if (SetupBagMultistep() == TRUE) + { + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +static void sub_80A5D38(u8 taskId) +{ + gTasks[taskId].data[1] = 0; + sub_80A4DA4(gBGTilemapBuffers[1]); + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void sub_80A5D78(void) +{ + sub_80A4008(gBGTilemapBuffers[1], 8, 8, 5, 4); + DisplayYesNoMenu(7, 7, 1); +} + +static void sub_80A5DA0(u16 itemId, u16 quantity) +{ + CopyItemName(itemId, gStringVar1); + if (quantity >= 100) + ConvertIntToDecimalStringN(gStringVar2, quantity, STR_CONV_MODE_LEFT_ALIGN, 3); + else + ConvertIntToDecimalStringN(gStringVar2, quantity, STR_CONV_MODE_LEFT_ALIGN, 2); + sub_80A4DA4(gBGTilemapBuffers[1]); + sub_80A7528(5); + sub_80A5D78(); +} + +static void sub_80A5DF8(void) +{ + sub_80A4DA4(gBGTilemapBuffers[1]); + MenuZeroFillWindowRect(7, 6, 11, 13); + sub_80A7528(4); +} + +static void sub_80A5E1C(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + gTasks[taskId].data[10] = 0; + sub_80A41D4(taskId); + sub_80A5D38(taskId); + } +} + +static void sub_80A5E60(u8 taskId) +{ + sub_80A5DF8(); + sub_80A3D5C(taskId); + gTasks[taskId].func = sub_80A5E1C; +} + +static void sub_80A5E90(u8 taskId) +{ + sub_80A5D38(taskId); +} + +static void sub_80A5EA0(u8 taskId) +{ + if (sub_80A5350(taskId) == TRUE) + return; + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_80A5DA0(gScriptItemId, gTasks[taskId].data[1]); + DoYesNoFuncWithChoice(taskId, &gUnknown_083C16F4); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_80A5D38(taskId); + } +} + +static void HandlePopupMenuAction_Toss(u8 taskId) +{ + PlaySE(SE_SELECT); + gTasks[taskId].func = sub_80A5EA0; + sub_80A7528(3); + // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way + if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) + sub_80A4DD8(taskId, 6, 9, 7, 3, 3); + else + sub_80A4DD8(taskId, 7, 9, 6, 3, 2); +} + +static void sub_80A5F80(u8 taskId) +{ + PlaySE(SE_SELECT); + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void HandlePopupMenuAction_Register(u8 taskId) +{ + PlaySE(SE_SELECT); + if (gSaveBlock1.registeredItem == gScriptItemId) + { + // Un-register the registered item + RemoveSelectIconFromRegisteredItem(); + gSaveBlock1.registeredItem = 0; + } + else + { + AddSelectIconToRegisteredItem(); + gSaveBlock1.registeredItem = gScriptItemId; + } + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void sub_80A6000(u8 taskId) +{ + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void sub_80A6024(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); + MenuZeroFillWindowRect(0, 14, 29, 19); + gTasks[taskId].func = sub_80A6000; + } +} + +static void DisplayCannotBeHeldMessage(u8 taskId) +{ + sub_80A73FC(); + CopyItemName(gScriptItemId, gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_CantBeHeld); + sub_80A7590(); + DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6024, 1); +} + +static void HandlePopupMenuAction_Give(u8 taskId) +{ + PlaySE(SE_SELECT); + if (sub_80F931C(gScriptItemId) == 0) + { + sub_80A73FC(); + sub_80A7590(); + DisplayCannotUseItemMessage(taskId, gOtherText_CantWriteMail, sub_80A6024, 1); + } + else if (ItemId_GetImportance(gScriptItemId) == 0) + { + if (CalculatePlayerPartyCount() == 0) + { + sub_80A5BF8(taskId); + } + else + { + gTasks[taskId].data[8] = (u32)sub_808B020 >> 16; + gTasks[taskId].data[9] = (u32)sub_808B020; + gTasks[taskId].func = HandleItemMenuPaletteFade; + gUnknown_02038561 = 1; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + } + } + else + { + DisplayCannotBeHeldMessage(taskId); + } +} + +static void HandlePopupMenuAction_CheckTag(u8 taskId) +{ + sub_80A5AE4(taskId); + gTasks[taskId].data[8] = (u32)BerryTagScreen_814625C >> 16; + gTasks[taskId].data[9] = (u32)BerryTagScreen_814625C; +} + +static void sub_80A61A8(void) +{ + if (sub_80A34B4() == TRUE) + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); +} + +void sub_80A61D0(void) +{ + sReturnLocation = RETURN_TO_PKMN_LIST; + SetMainCallback2(sub_80A61A8); +} + +static void OnBagClose_PkmnList(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_808A3F8 >> 16; + gTasks[taskId].data[9] = (u32)sub_808A3F8; + sub_80A5AE4(taskId); +} + +static void OnItemSelect_PkmnList(u8 taskId) +{ + u8 r6 = sCurrentBagPocket + 1; + + if (sub_80F931C(gScriptItemId) == 0) + { + sub_80A73FC(); + sub_80A7590(); + DisplayCannotUseItemMessage(taskId, gOtherText_CantWriteMail, sub_80A6024, 1); + } + else if (sub_80F92F4(gScriptItemId) == 0) + { + sub_80A73FC(); + CopyItemName(gScriptItemId, gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_CantBeHeldHere); + sub_80A7590(); + DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6024, 1); + } + else if (r6 != 5 && ItemId_GetImportance(gScriptItemId) == 0) + { + gTasks[taskId].data[8] = (u32)sub_808A3F8 >> 16; + gTasks[taskId].data[9] = (u32)sub_808A3F8; + sub_80A5AAC(taskId); + } + else + { + DisplayCannotBeHeldMessage(taskId); + } +} + +static void sub_80A62D8(void) +{ + if (sub_80A34B4() == TRUE) + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); +} + +void sub_80A6300(void) +{ + sReturnLocation = RETURN_TO_SHOP; + SetMainCallback2(sub_80A62D8); +} + +static void OnBagClose_Shop(u8 taskId) +{ + gFieldCallback = sub_80B3050; + 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); +} + +static void OnItemSelect_Shop(u8 taskId) +{ + sub_80A7590(); + gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A73FC(); + CopyItemName(gScriptItemId, gStringVar2); + if (ItemId_GetPrice(gScriptItemId) == 0) + { + StringExpandPlaceholders(gStringVar4, gOtherText_CantBuyThat); + DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6444, 1); + } + else + { + StringExpandPlaceholders(gStringVar4, gOtherText_HowManyToSell); + DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A648C, 1); + } +} + +static void sub_80A640C(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void sub_80A6444(u8 taskId) +{ + sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); + MenuZeroFillWindowRect(0, 14, 29, 19); + gTasks[taskId].func = sub_80A640C; +} + +static void sub_80A648C(u8 taskId) +{ + gTasks[taskId].func = Task_BuyHowManyDialogueHandleInput; + sub_80A4008(gBGTilemapBuffers[1], 1, 11, 12, 2); + MenuDrawTextWindow(0, 10, 13, 13); + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[2] = 1; + gTasks[taskId].data[3] = 11; + // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way + if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) + sub_80A418C(1, 1, 1, 11, 3); + else + sub_80A418C(1, 1, 1, 11, 2); + BuyMenuDisplayMessage(gScriptItemId, 1); + sub_80A683C(); +} + +static void sub_80A6520(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + BuyMenuPrintItemQuantityAndPrice(taskId); + } +} + +static void sub_80A6548(u8 taskId) +{ + sub_80A48F8(taskId); + gTasks[taskId].func = sub_80A6520; +} + +static void sub_80A6574(u8 taskId) +{ + PlaySE(SE_REGI); + sub_80A6870(gScriptItemId, gTasks[taskId].data[1]); + gTasks[taskId].func = sub_80A6548; +} + +static void sub_80A65AC(u8 taskId) +{ + MenuZeroFillWindowRect(7, 6, 13, 12); + sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6); + CopyItemName(gScriptItemId, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_SoldItem); + DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6574, 1); + sub_80A3D5C(taskId); +} + +static void sub_80A6618(u8 taskId) +{ + MenuZeroFillWindowRect(7, 6, 13, 12); + sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6); + BuyMenuPrintItemQuantityAndPrice(taskId); +} + +static void sub_80A6650(u8 taskId) +{ + sub_80A5D78(); + DoYesNoFuncWithChoice(taskId, &gUnknown_083C16FC); +} + +static void Task_BuyHowManyDialogueHandleInput(u8 taskId) +{ + if (sub_80A5350(taskId) == TRUE) + { + MenuZeroFillWindowRect(6, 11, 12, 11); + BuyMenuDisplayMessage(gScriptItemId, gTasks[taskId].data[1]); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(0, 10, 13, 13); + sub_80A36B8(gBGTilemapBuffers[1], 0, 10, 13, 3); + ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(gScriptItemId) / 2 * gTasks[taskId].data[1], STR_CONV_MODE_LEFT_ALIGN, 6); + StringExpandPlaceholders(gStringVar4, gOtherText_CanPay); + DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6650, 1); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + BuyMenuPrintItemQuantityAndPrice(taskId); + } +} + +static void sub_80A6760(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void BuyMenuPrintItemQuantityAndPrice(u8 taskId) +{ + sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); + RemoveMoneyLabelObject(0, 0); + MenuZeroFillWindowRect(0, 4, 13, 13); + MenuZeroFillWindowRect(0, 14, 29, 19); + gTasks[taskId].func = sub_80A6760; +} + +static void BuyMenuDisplayMessage(u16 itemId, u16 quantity) +{ + sub_80B7A94(ItemId_GetPrice(itemId) / 2 * quantity, 6, 6, 11); + ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(itemId) / 2 * quantity, STR_CONV_MODE_LEFT_ALIGN, 6); +} + +static void sub_80A683C(void) +{ + sub_80B7C14(gSaveBlock1.money, 0, 0); + sub_80A4008(gBGTilemapBuffers[1], 1, 1, 12, 2); +} + +static void sub_80A6870(u16 itemId, u8 quantity) +{ + sub_80B79B8(&gSaveBlock1.money, ItemId_GetPrice(itemId) / 2 * quantity); + sub_80B7BEC(gSaveBlock1.money, 0, 0); +} + +static void sub_80A68A4(void) +{ + if (sub_80A34B4() == TRUE) + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); +} + +void sub_80A68CC(void) +{ + sCurrentBagPocket = BAG_POCKET_BERRIES; + sReturnLocation = RETURN_TO_FIELD_4; + SetMainCallback2(sub_80A68A4); +} + +static void OnBagClose_Field4(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_80546B8 >> 16; + gTasks[taskId].data[9] = (u32)sub_80546B8; + sub_80A5AE4(taskId); +} + +static void OnItemSelect_Field4(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_80546B8 >> 16; + gTasks[taskId].data[9] = (u32)sub_80546B8; + sub_80A5AAC(taskId); +} + +static void sub_80A6940(void) +{ + while (1) + { + if (SetupBagMultistep() == TRUE) + { + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); + sub_80A699C(); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +void sub_80A6978(void) +{ + sCurrentBagPocket = BAG_POCKET_BERRIES; + sReturnLocation = RETURN_TO_FIELD_5; + SetMainCallback2(sub_80A6940); +} + +static void sub_80A699C(void) +{ + sPopupMenuActionList = gUnknown_083C16B8; + gUnknown_02038564 = 4; +} + +static void OnBagClose_Field5(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_804E990 >> 16; + gTasks[taskId].data[9] = (u32)sub_804E990; + sub_80A5AE4(taskId); +} + +static void HandlePopupMenuAction_Confirm(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_804E990 >> 16; + gTasks[taskId].data[9] = (u32)sub_804E990; + sub_80A5AAC(taskId); +} + +static void sub_80A6A08(void) +{ + if (sub_80A34B4() == TRUE) + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); +} + +void sub_80A6A30(void) +{ + sReturnLocation = RETURN_TO_PC; + SetMainCallback2(sub_80A6A08); +} + +static void OnBagClose_PC(u8 taskId) +{ + gFieldCallback = ItemStorage_ReturnToMenuAfterDeposit; + 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); +} + +static void sub_80A6A84(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + sub_80A4DA4(gBGTilemapBuffers[1]); + CopyItemName(gScriptItemId, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, taskData[1], STR_CONV_MODE_LEFT_ALIGN, 3); + MenuZeroFillWindowRect(7, 6, 11, 13); + sub_80A7528(7); + sub_80A3D5C(taskId); + gTasks[taskId].func = sub_80A5E1C; +} + +static void sub_80A6B00(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + gTasks[taskId].data[10] = 0; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + PlaySE(SE_SELECT); + sub_80A5D38(taskId); + } +} + +static void sub_80A6B64(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + if (ItemId_GetImportance(gScriptItemId) == 2) + { + gTasks[taskId].func = sub_80A6B00; + sub_80A7528(9); + } + else + { + if (AddPCItem(gScriptItemId, taskData[1]) == TRUE) + { + sub_80A6A84(taskId); + } + else + { + gTasks[taskId].func = sub_80A6B00; + sub_80A7528(8); + } + } +} + +static void sub_80A6BE0(u8 taskId) +{ + if (sub_80A5350(taskId) == TRUE) + return; + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_80A4DA4(gBGTilemapBuffers[1]); + sub_80A6B64(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].data[10] = 0; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + PlaySE(SE_SELECT); + sub_80A5D38(taskId); + } +} + +static void OnItemSelect_PC(u8 taskId) +{ + gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A73FC(); + PlaySE(SE_SELECT); + sub_80A7590(); + if (sCurrentBagPocket != BAG_POCKET_KEY_ITEMS) + { + gTasks[taskId].func = sub_80A6BE0; + sub_80A7528(6); + // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way + if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) + sub_80A4DD8(taskId, 6, 9, 7, 3, 3); + else + sub_80A4DD8(taskId, 7, 9, 6, 3, 2); + } + else + { + gTasks[taskId].data[1] = 1; + sub_80A6B64(taskId); + } +} + +bool32 sub_80A6D1C(void) +{ + HideMapNamePopup(); + if (gSaveBlock1.registeredItem != 0) + { + if (CheckBagHasItem(gSaveBlock1.registeredItem, 1) == TRUE) + { + u8 taskId; + + ScriptContext2_Enable(); + FreezeMapObjects(); + sub_80594C0(); + sub_80597F4(); + gScriptItemId = gSaveBlock1.registeredItem; + taskId = CreateTask(ItemId_GetFieldFunc(gSaveBlock1.registeredItem), 8); + gTasks[taskId].data[2] = 1; + return TRUE; + } + gSaveBlock1.registeredItem = 0; + } + ScriptContext1_SetupScript(Event_NoRegisteredItem); + return TRUE; +} + +static void sub_80A6D98(void) +{ + while (1) + { + if (SetupBagMultistep() == TRUE) + { + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +void sub_80A6DCC(void) +{ + sPopupMenuSelection = 0; + sReturnLocation = RETURN_TO_BATTLE; + SetMainCallback2(sub_80A6D98); +} + +static void sub_80A6DF0(u16 *a) +{ + u8 r6 = (gUnknown_02038564 - 1) * 2; + + MenuDrawTextWindow(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); + } + else + { + MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 8); + MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[1]].text, 8, 10); + } + InitMenu(0, 8, 10 - r6, gUnknown_02038564, 0, 5); + sub_80A7528(2); +} + +static void sub_80A6EB8(u8 taskId) +{ + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) + { + if (sPopupMenuSelection == 1) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = MoveMenuCursor(-1); + } + } + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) + { + if (sPopupMenuSelection + 1 < gUnknown_02038564) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = MoveMenuCursor(1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + gTasks[taskId].data[10] = 0; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A4DA4(gBGTilemapBuffers[1]); + sItemPopupMenuActions[sPopupMenuActionList[sPopupMenuSelection]].func(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].data[10] = 0; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A4DA4(gBGTilemapBuffers[1]); + sItemPopupMenuActions[5].func(taskId); + } +} + +static const u8 gUnknown_083C1708[] = {4, 5}; +static const u8 gUnknown_083C170A[] = {5, 0}; + +static void sub_80A6FDC(void) +{ + if (ItemId_GetBattleUsage(gScriptItemId) != 0) + { + sPopupMenuActionList = gUnknown_083C1708; + gUnknown_02038564 = 2; + } + else + { + sPopupMenuActionList = gUnknown_083C170A; + gUnknown_02038564 = 1; + } +} + +static void OnItemSelect_Battle(u8 taskId) +{ + sPopupMenuSelection = 0; + sub_80A6FDC(); + gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A73FC(); + sub_80A6DF0(gBGTilemapBuffers[1]); + gTasks[taskId].func = sub_80A6EB8; +} + +void sub_80A7094(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_802E424 >> 16; + gTasks[taskId].data[9] = (u32)sub_802E424; + gTasks[taskId].func = HandleItemMenuPaletteFade; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +static void OnBagClose_Battle(u8 taskId) +{ + PlaySE(SE_SELECT); + sub_80A7094(taskId); +} + +static void HandlePopupMenuAction_UseInBattle(u8 taskId) +{ + if (ItemId_GetBattleFunc(gScriptItemId) != NULL) + { + PlaySE(SE_SELECT); + ItemId_GetBattleFunc(gScriptItemId)(taskId); + } +} + +static void sub_80A7124(u8 taskId) +{ + PlaySE(SE_SELECT); + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void sub_80A7150(void) +{ + while (1) + { + if (SetupBagMultistep() == TRUE) + { + gUnknown_02038563 = CreateTask(sub_80A7230, 0); + gTasks[gUnknown_02038563].data[15] = 0; + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +void PrepareBagForWallyTutorial(void) +{ + u8 i; + + sPopupMenuSelection = 0; + sCurrentBagPocket = BAG_POCKET_ITEMS; + for (i = 0; i < 5; i++) + { + gBagPocketScrollStates[i].cursorPos = 0; + gBagPocketScrollStates[i].scrollTop = 0; + } + + // Save player's items + memcpy(ewramSavedItemsPocket, gSaveBlock1.bagPocket_Items, sizeof(gSaveBlock1.bagPocket_Items)); + memcpy(ewramSavedPokeballsPocket, gSaveBlock1.bagPocket_PokeBalls, sizeof(gSaveBlock1.bagPocket_PokeBalls)); + + // Add Wally's items to the bag + ClearItemSlots(gSaveBlock1.bagPocket_Items, ARRAY_COUNT(gSaveBlock1.bagPocket_Items)); + ClearItemSlots(gSaveBlock1.bagPocket_PokeBalls, ARRAY_COUNT(gSaveBlock1.bagPocket_PokeBalls)); + AddBagItem(ITEM_POTION, 1); + AddBagItem(ITEM_POKE_BALL, 1); + + sReturnLocation = RETURN_TO_WALLY_BATTLE; + SetMainCallback2(sub_80A7150); +} + +static void sub_80A7230(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + switch (taskData[15]) + { + case 102: + PlaySE(SE_SELECT); + sub_80A4E8C(1, 2); + break; + case 204: + PlaySE(SE_SELECT); + sub_80F98A4(2); + sub_80F98A4(3); + gScriptItemId = ITEM_POKE_BALL; + sPopupMenuActionList = gUnknown_083C1708; + gUnknown_02038564 = 2; + gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A73FC(); + sub_80A6DF0(gBGTilemapBuffers[1]); + break; + case 306: + PlaySE(SE_SELECT); + sub_80A4DA4(gBGTilemapBuffers[1]); + + // Restore player's items + memcpy(gSaveBlock1.bagPocket_Items, ewramSavedItemsPocket, sizeof(gSaveBlock1.bagPocket_Items)); + memcpy(gSaveBlock1.bagPocket_PokeBalls, ewramSavedPokeballsPocket, sizeof(gSaveBlock1.bagPocket_PokeBalls)); + + taskData[8] = (u32)sub_802E424 >> 16; + taskData[9] = (u32)sub_802E424; + gTasks[taskId].func = HandleItemMenuPaletteFade; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + return; + } + taskData[15]++; +} + +static void ItemListMenu_InitMenu(void) +{ + InitMenu(0, 14, 2, gBagPocketScrollStates[sCurrentBagPocket].cursorMax + 1, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, 0); + CreateBlendedOutlineCursor(16, 0xFFFF, 12, 0x2D9F, 15); + sub_80A73C0(); +} + +static void sub_80A73C0(void) +{ + sub_814AD7C(0x70, gBagPocketScrollStates[sCurrentBagPocket].cursorPos * 16 + 16); +} + +static void sub_80A73F0(void) +{ + sub_814ADC8(); +} + +static void sub_80A73FC(void) +{ + HandleDestroyMenuCursors(); + sub_814AD44(); +} + +static void sub_80A740C(void) +{ + sub_80A75E4(); + sub_80A7768(); + sub_80A7420(); +} + +static void sub_80A7420(void) +{ + struct UnknownStruct2 *unkStruct = &gUnknown_0203853C; + int index; + + switch (unkStruct->unk0) + { + case 3: + unkStruct->unk0 = 2; + break; + case 2: + switch (unkStruct->unk2) + { + case 0: + index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + ItemListMenu_ChangeDescription(gCurrentBagPocketItemSlots[index].itemId, unkStruct->textLine); + break; + case 1: + sub_80A4A98(gOtherText_SwitchWhichItem, unkStruct->textLine); + break; + case 2: + sub_80A4A98(gOtherText_WhatWillYouDo2, unkStruct->textLine); + break; + case 3: + sub_80A4A98(gOtherText_HowManyToToss, unkStruct->textLine); + break; + case 4: + sub_80A4A98(gOtherText_ThrewAwayItem, unkStruct->textLine); + break; + case 5: + sub_80A4A98(gOtherText_OkayToThrowAwayPrompt, unkStruct->textLine); + break; + case 6: + sub_80A4A98(gOtherText_HowManyToDeposit, unkStruct->textLine); + break; + case 7: + sub_80A4A98(gOtherText_DepositedItems, unkStruct->textLine); + break; + case 8: + sub_80A4A98(gOtherText_NoRoomForItems, unkStruct->textLine); + break; + case 9: + sub_80A4A98(gOtherText_CantStoreSomeoneItem, unkStruct->textLine); + break; + } + unkStruct->textLine++; + if (unkStruct->textLine == 3) + { + unkStruct->unk0 = 0; + sub_80A7918(); + } + break; + } +} + +static void sub_80A751C(void) +{ + gUnknown_0203853C.unk0 = 0; +} + +static void sub_80A7528(u8 a) +{ + gUnknown_0203853C.textLine = 0; + gUnknown_0203853C.unk2 = a; + switch (sub_80A78F4()) + { + case 0: + gUnknown_0203853C.unk0 = 2; + while (gUnknown_0203853C.unk0 != 0) + sub_80A7420(); + break; + case 1: + gUnknown_0203853C.unk0 = 3; + break; + case 2: + gUnknown_0203853C.unk0 = 1; + break; + } +} + +static void sub_80A756C(void) +{ + if (gUnknown_0203853C.unk0 == 2 || gUnknown_0203853C.unk0 == 3) + sub_80A7918(); + gUnknown_0203853C.unk0 = 0; +} + +static void sub_80A7590(void) +{ + MenuZeroFillWindowRect(0, 13, 13, 20); + sub_80A756C(); +} + +static void sub_80A75A8(void) +{ + if (gUnknown_0203853C.unk0 == 2 || gUnknown_0203853C.unk0 == 3) + gUnknown_0203853C.unk0 = 1; +} + +static void sub_80A75C4(void) +{ + switch (gUnknown_0203853C.unk0) + { + case 1: + gUnknown_0203853C.unk0 = 3; + break; + case 0: + sub_80A7918(); + break; + } +} + +static void sub_80A75E4(void) +{ + if (gUnknown_02038540.unk0 == 1 && sub_80A7988() == 0) + { + int r1; + + sub_80A47E8(gUnknown_02038563, gUnknown_02038540.unk1, gUnknown_02038540.unk1, 1); + gUnknown_02038540.unk1++; + if (gUnknown_02038540.unk2 != 0) + r1 = 5; + else + r1 = 7; + if (r1 < gUnknown_02038540.unk1) + { + gUnknown_02038540.unk0 = 0; + sub_80A78E8(); + } + } +} + +static void sub_80A7630(void) +{ + gUnknown_02038540.unk0 = 0; +} + +static void sub_80A763C(void) +{ + struct UnknownStruct3 *r4 = &gUnknown_02038540; + + switch (sub_80A78C4()) + { + case FALSE: + sub_80A48E8(gUnknown_02038563, 0, 7); + break; + case TRUE: + r4->unk0 = 1; + r4->unk1 = 0; + r4->unk2 = 0; + break; + } +} + +static void sub_80A7678(void) +{ + if (gUnknown_02038540.unk0 == 1) + sub_80A78E8(); + gUnknown_02038540.unk0 = 0; +} + +static void sub_80A7694(void) +{ + gUnknown_02038540.unk2 = 1; +} + +static void sub_80A76A0(void) +{ + MenuZeroFillWindowRect(14, 2, 29, 18); + sub_80A7678(); +} + +static bool32 sub_80A76B8(void) +{ + struct UnknownStruct3 *s = &gUnknown_02038540; + + return (s->unk0 == 0); +} + +static bool32 sub_80A76D0(void) +{ + struct UnknownStruct3 *s = &gUnknown_02038540; + + return (s->unk1 > 5); +} + +static void sub_80A76E8(void) +{ + if (gUnknown_02038544.unk0 == 1) + { + DisplayItemMessageOnField( + gUnknown_02038544.unk1, + gUnknown_02038544.unk4, + gUnknown_02038544.unk8, + gUnknown_02038544.unk2); + gUnknown_02038544.unk0 = 0; + } +} + +static void sub_80A770C(void) +{ + gUnknown_02038544.unk0 = 0; +} + +static void DisplayCannotUseItemMessage(int a, const u8 *b, TaskFunc func, int d) +{ + struct UnknownStruct4 *r4 = &gUnknown_02038544; + + switch (sub_80A7924()) + { + case 0: + DisplayItemMessageOnField(a, b, func, d); + break; + case 2: + r4->unk0 = 1; + r4->unk1 = a; + r4->unk4 = b; + r4->unk8 = func; + r4->unk2 = d; + break; + } +} + +static void sub_80A7768(void) +{ + struct UnknownStruct5 *r4 = &gUnknown_02038550; + + if (r4->unk0 == 2) + { + if (r4->unk1 != 0) + { + if (r4->unk2 != 1) + { + const u8 *text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text; + int var = r4->unk1 - 1; + + MenuPrint(text, 7, var * 2 + 1 + r4->unk3); + } + else + { + const u8 *text; + int var; + + if (r4->unk1 == 1) + text = sub_80A4B90(gScriptItemId); + else + text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text; + var = r4->unk1 - 1; + MenuPrint(text, (var >> 1) * 6 + 1, (var & 1) * 2 + 8); + } + if (r4->unk1 == gUnknown_02038564) + { + r4->unk0 = 0; + sub_80A7970(); + } + } + r4->unk1++; + } +} + +static void sub_80A7828(void) +{ + gUnknown_02038550.unk0 = 0; +} + +static void sub_80A7834(int a, int b) +{ + struct UnknownStruct5 *r4 = &gUnknown_02038550; + + switch (sub_80A7958()) + { + case 1: + r4->unk0 = 2; + r4->unk1 = 0; + r4->unk2 = a; + r4->unk3 = b; + break; + case 2: + r4->unk0 = 1; + r4->unk1 = 0; + r4->unk2 = a; + r4->unk3 = b; + break; + } +} + +static void sub_80A7868(void) +{ + if (gUnknown_02038550.unk0 == 2) + gUnknown_02038550.unk0 = 1; +} + +static void sub_80A7880(void) +{ + switch (gUnknown_02038550.unk0) + { + case 1: + gUnknown_02038550.unk0 = 2; + break; + case 0: + sub_80A7970(); + break; + } +} + +static bool32 sub_80A78A0(void) +{ + struct UnknownStruct5 *r0 = &gUnknown_02038550; + + return (r0->unk0 == 0); +} + +static void sub_80A78B8(void) +{ + gUnknown_02038554.unk0 = 0; +} + +static bool32 sub_80A78C4(void) +{ + bool32 retVal; + + if (gLinkOpen == TRUE) + { + sub_80A7868(); + sub_80A75A8(); + retVal = TRUE; + } + else + { + retVal = FALSE; + } + return retVal; +} + +static void sub_80A78E8(void) +{ + sub_80A7880(); +} + +static int sub_80A78F4(void) +{ + int retVal; + + if (gLinkOpen == TRUE) + { + if (sub_80A76B8() != 0) + retVal = 1; + else + retVal = 2; + } + else + { + retVal = 0; + } + return retVal; +} + +static void sub_80A7918(void) +{ + sub_80A76E8(); +} + +static int sub_80A7924(void) +{ + if (gLinkOpen == TRUE && sub_80A76B8() == 0) + { + if (sub_80A76D0() != 0) + { + sub_80A7678(); + return 0; + } + } + else + { + return 0; + } + sub_80A7694(); + return 2; +} + +static int sub_80A7958(void) +{ + if (sub_80A76B8() == 0) + return 2; + sub_80A75A8(); + return 1; +} + +static void sub_80A7970(void) +{ + sub_80A75C4(); +} + +static void sub_80A797C(void) +{ + gUnknown_02038554.unk0 = 1; +} + +static int sub_80A7988(void) +{ + int val = gUnknown_02038554.unk0; + + gUnknown_02038554.unk0 = 0; + return val; +} + +static const u16 gPalette_83C170C[] = INCBIN_U16("graphics/unknown/83C170C.gbapal"); +static const u8 gSpriteImage_83C172C[] = INCBIN_U8("graphics/unknown_sprites/83C172C.4bpp"); + +const u8 gSpriteImage_UnusedCherry[] = INCBIN_U8("graphics/unused/cherry.4bpp"); +const u16 gSpritePalette_UnusedCherry[] = INCBIN_U16("graphics/unused/cherry.gbapal"); + +//------------------------------------------------------------------------------ +// Bag Sprite +//------------------------------------------------------------------------------ + +static const struct OamData sBagSpriteOamData = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 2, + .paletteNum = 7, + .affineParam = 0, +}; + +static const union AnimCmd sBagSpriteAnimSeq0[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; + +static const union AnimCmd sBagSpriteAnimSeq1[] = +{ + ANIMCMD_FRAME(64, 4), + ANIMCMD_END, +}; + +static const union AnimCmd sBagSpriteAnimSeq5[] = +{ + ANIMCMD_FRAME(128, 4), + ANIMCMD_END, +}; + +static const union AnimCmd sBagSpriteAnimSeq2[] = +{ + ANIMCMD_FRAME(192, 4), + ANIMCMD_END, +}; + +static const union AnimCmd sBagSpriteAnimSeq3[] = +{ + ANIMCMD_FRAME(256, 4), + ANIMCMD_END, +}; + +static const union AnimCmd sBagSpriteAnimSeq4[] = +{ + ANIMCMD_FRAME(320, 4), + ANIMCMD_END, +}; + +static const union AnimCmd *const sBagSpriteAnimTable[] = +{ + sBagSpriteAnimSeq0, + sBagSpriteAnimSeq1, + sBagSpriteAnimSeq2, + sBagSpriteAnimSeq3, + sBagSpriteAnimSeq4, + sBagSpriteAnimSeq5, +}; + +static const union AffineAnimCmd sBagSpriteAffineAnimSeq[] = +{ + AFFINEANIMCMD_FRAME(0, 0, -2, 2), + AFFINEANIMCMD_FRAME(0, 0, 2, 4), + AFFINEANIMCMD_FRAME(0, 0, -2, 4), + AFFINEANIMCMD_FRAME(0, 0, 2, 2), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const sBagSpriteAffineAnimTable[] = +{ + sBagSpriteAffineAnimSeq, +}; + +static const struct CompressedSpriteSheet sMaleBagSpriteSheet = {gBagMaleTiles, 0x3000, 30000}; +static const struct CompressedSpriteSheet sFemaleBagSpriteSheet = {gBagFemaleTiles, 0x3000, 30000}; +static const struct CompressedSpritePalette sBagSpritePalette = {gBagPalette, 30000}; + +static void sub_80A7998(struct Sprite *sprite) +{ + sprite->animNum = 0; + sprite->data0 = 0; + sprite->data1 = 0; + sprite->data2 = 0; + sprite->data3 = 0; + sprite->data4 = 0; + sprite->callback = sub_80A79B4; +} + +static void sub_80A79B4(struct Sprite *sprite) +{ + if (gUnknown_0203855B != -1) + sub_80A79EC(sprite); + if (gUnknown_0203855C != 0) + sub_80A7A94(sprite); +} + +static void sub_80A79EC(struct Sprite *sprite) +{ + switch (sprite->data3) + { + case 0: + if (gUnknown_0203855B != 6) + { + sprite->animBeginning = TRUE; + sprite->animNum = gUnknown_0203855B; + gUnknown_0203855B = -1; + } + else + { + sprite->animBeginning = TRUE; + sprite->animNum = 0; + sprite->pos1.y -= 4; + sprite->data0 = 4; + sprite->data3 = 1; + sub_80A7AE4(sprite); + } + break; + case 1: + if (sprite->data0 != 0) + { + if (sprite->data1 != 0) + { + sprite->pos1.y++; + sprite->data0--; + } + sprite->data1 = (sprite->data1 + 1) & 1; + } + else + { + gUnknown_0203855B = -1; + sprite->data1 = 0; + sprite->data3 = 0; + } + break; + } +} + +static void sub_80A7A94(struct Sprite *sprite) +{ + switch (sprite->data4) + { + case 0: + sprite->oam.affineMode = 1; + sprite->affineAnims = sBagSpriteAffineAnimTable; + InitSpriteAffineAnim(sprite); + sprite->data4 = 1; + break; + case 1: + sprite->data2++; + if (sprite->data2 == 12) + sub_80A7AE4(sprite); + break; + } +} + +static void sub_80A7AE4(struct Sprite *sprite) +{ + gUnknown_0203855C = 0; + sprite->oam.affineMode = 0; + sprite->data2 = 0; + sprite->data4 = 0; + FreeOamMatrix(sprite->oam.matrixNum); +} + +static const struct SpriteTemplate sBagSpriteTemplate = +{ + .tileTag = 30000, + .paletteTag = 30000, + .oam = &sBagSpriteOamData, + .anims = sBagSpriteAnimTable, + .images = NULL, + .affineAnims = sBagSpriteAffineAnimTable, + .callback = sub_80A7998, +}; + +static void CreateBagSprite(void) +{ + CreateSprite(&sBagSpriteTemplate, 58, 40, 0); +} + +//------------------------------------------------------------------------------ +// Pokeball Sprite +//------------------------------------------------------------------------------ + +static const struct OamData gOamData_83C1CF8 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 4, + .size = 1, + .tileNum = 0, + .priority = 2, + .paletteNum = 8, + .affineParam = 0, +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83C1D00[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 8, 32), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83C1D10[] = +{ + AFFINEANIMCMD_FRAME(0, 0, -8, 32), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83C1D20[] = +{ + gSpriteAffineAnim_83C1D00, + gSpriteAffineAnim_83C1D10, +}; + +static const struct SpriteFrameImage gSpriteImageTable_83C1D28[] = +{ + {gSpriteImage_83C172C, sizeof(gSpriteImage_83C172C)}, +}; + +static const struct SpritePalette sPokeballSpritePalette = {gPalette_83C170C, 8}; + +static void sub_80A7B28(struct Sprite *sprite) +{ + sprite->data3 = 0; + sprite->data0 = 0; + sub_80A7B6C(sprite); + sprite->callback = sub_80A7B6C; +} + +static void sub_80A7B48(struct Sprite *sprite) +{ + sprite->centerToCornerVecX = sprite->data5 - ((sprite->data0 + 1) & 1); + sprite->centerToCornerVecY = sprite->data6 - ((sprite->data0 + 1) & 1); +} + +static void sub_80A7B6C(struct Sprite *sprite) +{ + if (sprite->data7 != 0) + { + switch (sprite->data3) + { + case 0: + sprite->oam.affineMode = 1; + if (sprite->data7 == 1) + sprite->affineAnims = gSpriteAffineAnimTable_83C1D20; + else + sprite->affineAnims = gSpriteAffineAnimTable_83C1D20 + 1; + InitSpriteAffineAnim(sprite); + sprite->data3 = 1; + sprite->data5 = sprite->centerToCornerVecX; + sprite->data6 = sprite->centerToCornerVecY; + sub_80A7B48(sprite); + break; + case 1: + sprite->data0++; + sub_80A7B48(sprite); + if (sprite->data0 == 32) + { + sprite->data0 = 0; + sprite->data3 = 0; + sprite->centerToCornerVecX = sprite->data5; + sprite->centerToCornerVecY = sprite->data6; + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = 0; + sprite->callback = SpriteCallbackDummy; + } + break; + } + } +} + +static const struct SpriteTemplate sPokeballSpriteTemplate = +{ + .tileTag = 0xFFFF, + .paletteTag = 8, + .oam = &gOamData_83C1CF8, + .anims = sBagSpriteAnimTable, + .images = gSpriteImageTable_83C1D28, + .affineAnims = gSpriteAffineAnimTable_83C1D20, + .callback = sub_80A7B28, +}; + +static void CreateBagPokeballSprite(u8 a) +{ + LoadSpritePalette(&sPokeballSpritePalette); + sPokeballSpriteId = CreateSprite(&sPokeballSpriteTemplate, 16, 88, 0); + gSprites[sPokeballSpriteId].data7 = a; +} + +static void sub_80A7C64(void) +{ + FreeSpritePaletteByTag(8); + FreeOamMatrix(gSprites[sPokeballSpriteId].oam.matrixNum); + DestroySprite(&gSprites[sPokeballSpriteId]); +} + +static const struct OamData sBerrySpriteOamData = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 7, + .affineParam = 0, +}; + +static const struct OamData gOamData_83C1D58 = +{ + .y = 0, + .affineMode = 3, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 7, + .affineParam = 0, +}; + +static const union AnimCmd sBerrySpriteAnimSeq[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd *const sBerrySpriteAnimTable[] = +{ + sBerrySpriteAnimSeq, +}; + +static const struct SpriteFrameImage sBerrySpriteImageTable[] = +{ + {ewramBerryPic, 0x800}, +}; + +static void SpriteCB_BerrySprite(struct Sprite *); +static const struct SpriteTemplate sBerrySpriteTemplate = +{ + .tileTag = 0xFFFF, + .paletteTag = 30020, + .oam = &sBerrySpriteOamData, + .anims = sBerrySpriteAnimTable, + .images = sBerrySpriteImageTable, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_BerrySprite, +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83C1D8C[] = +{ + AFFINEANIMCMD_FRAME(-1, -1, -3, 96), + AFFINEANIMCMD_FRAME(0, 0, 0, 16), + AFFINEANIMCMD_FRAME(-2, -2, -1, 64), + AFFINEANIMCMD_FRAME(-8, 0, 0, 16), + AFFINEANIMCMD_FRAME(0, -8, 0, 16), + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83C1DC4[] = +{ + AFFINEANIMCMD_FRAME(-1, -1, 3, 96), + AFFINEANIMCMD_FRAME(0, 0, 0, 16), + AFFINEANIMCMD_FRAME(-2, -2, 1, 64), + AFFINEANIMCMD_FRAME(-8, 0, 0, 16), + AFFINEANIMCMD_FRAME(0, -8, 0, 16), + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83C1DFC[] = +{ + gSpriteAffineAnim_83C1D8C, + gSpriteAffineAnim_83C1DC4, +}; + +static const struct SpriteTemplate gSpriteTemplate_83C1E04 = +{ + .tileTag = 0xFFFF, + .paletteTag = 30020, + .oam = &gOamData_83C1D58, + .anims = sBerrySpriteAnimTable, + .images = sBerrySpriteImageTable, + .affineAnims = gSpriteAffineAnimTable_83C1DFC, + .callback = SpriteCallbackDummy, +}; + +static const struct {const u8 *lzPic; const u8 *lzPalette;} sBerryGraphicsTable[] = +{ + {gBerryPic_Cheri, gBerryPalette_Cheri}, + {gBerryPic_Chesto, gBerryPalette_Chesto}, + {gBerryPic_Pecha, gBerryPalette_Pecha}, + {gBerryPic_Rawst, gBerryPalette_Rawst}, + {gBerryPic_Aspear, gBerryPalette_Aspear}, + {gBerryPic_Leppa, gBerryPalette_Leppa}, + {gBerryPic_Oran, gBerryPalette_Oran}, + {gBerryPic_Persim, gBerryPalette_Persim}, + {gBerryPic_Lum, gBerryPalette_Lum}, + {gBerryPic_Sitrus, gBerryPalette_Sitrus}, + {gBerryPic_Figy, gBerryPalette_Figy}, + {gBerryPic_Wiki, gBerryPalette_Wiki}, + {gBerryPic_Mago, gBerryPalette_Mago}, + {gBerryPic_Aguav, gBerryPalette_Aguav}, + {gBerryPic_Iapapa, gBerryPalette_Iapapa}, + {gBerryPic_Razz, gBerryPalette_Razz}, + {gBerryPic_Bluk, gBerryPalette_Bluk}, + {gBerryPic_Nanab, gBerryPalette_Nanab}, + {gBerryPic_Wepear, gBerryPalette_Wepear}, + {gBerryPic_Pinap, gBerryPalette_Pinap}, + {gBerryPic_Pomeg, gBerryPalette_Pomeg}, + {gBerryPic_Kelpsy, gBerryPalette_Kelpsy}, + {gBerryPic_Qualot, gBerryPalette_Qualot}, + {gBerryPic_Hondew, gBerryPalette_Hondew}, + {gBerryPic_Grepa, gBerryPalette_Grepa}, + {gBerryPic_Tamato, gBerryPalette_Tamato}, + {gBerryPic_Cornn, gBerryPalette_Cornn}, + {gBerryPic_Magost, gBerryPalette_Magost}, + {gBerryPic_Rabuta, gBerryPalette_Rabuta}, + {gBerryPic_Nomel, gBerryPalette_Nomel}, + {gBerryPic_Spelon, gBerryPalette_Spelon}, + {gBerryPic_Pamtre, gBerryPalette_Pamtre}, + {gBerryPic_Watmel, gBerryPalette_Watmel}, + {gBerryPic_Durin, gBerryPalette_Durin}, + {gBerryPic_Belue, gBerryPalette_Belue}, + {gBerryPic_Liechi, gBerryPalette_Liechi}, + {gBerryPic_Ganlon, gBerryPalette_Ganlon}, + {gBerryPic_Salac, gBerryPalette_Salac}, + {gBerryPic_Petaya, gBerryPalette_Petaya}, + {gBerryPic_Apicot, gBerryPalette_Apicot}, + {gBerryPic_Lansat, gBerryPalette_Lansat}, + {gBerryPic_Starf, gBerryPalette_Starf}, + {gBerryPic_Enigma, gBerryPalette_Enigma}, +}; + +static void DrawBerryPic(const u8 *src, u8 *dst) +{ + u8 i; + u8 j; + + memset(dst, 0, 0x800); + dst += 0x100; + for (i = 0; i < 6; i++) + { + dst += 32; + for (j = 0; j < 6; j++) + { + memcpy(dst, src, 32); + dst += 32; + src += 32; + } + if (i != 5) + dst += 32; + } +} + +static void LoadBerryPic(u8 berryId) +{ + struct SpritePalette spritePal; + + if (berryId == 0x2A && IsEnigmaBerryValid() == TRUE) + { + DrawBerryPic(gSaveBlock1.enigmaBerry.pic, ewramBerryPic); + spritePal.data = gSaveBlock1.enigmaBerry.palette; + spritePal.tag = 0x7544; + LoadSpritePalette(&spritePal); + } + else + { + spritePal.data = (u16 *)sBerryGraphicsTable[berryId].lzPalette; + spritePal.tag = 0x7544; + LoadCompressedObjectPalette((struct CompressedSpritePalette *)&spritePal); + sub_800D238(sBerryGraphicsTable[berryId].lzPic, ewramBerryPicTemp); + DrawBerryPic(ewramBerryPicTemp, ewramBerryPic); + } +} + +u8 CreateBerrySprite(u8 berryId, s16 x, s16 y) +{ + LoadBerryPic(berryId); + return CreateSprite(&sBerrySpriteTemplate, x, y, 0); +} + +static void SpriteCB_BerrySprite(struct Sprite *sprite) +{ + sprite->pos2.y = -gUnknown_030041B4; +} + +void sub_80A7DD4(void) +{ + FreeSpritePaletteByTag(0x7544); + FreeSpritePaletteByTag(8); +} + +u8 sub_80A7DEC(u8 berryId, u8 x, u8 y, bool8 animate) +{ + u8 spriteId; + + FreeSpritePaletteByTag(0x7544); + LoadBerryPic(berryId); + spriteId = CreateSprite(&gSpriteTemplate_83C1E04, x, y, 0); + if (animate == TRUE) + StartSpriteAffineAnim(&gSprites[spriteId], 1); + return spriteId; +} + +const struct CompressedSpriteSheet gUnknown_083C1F74 = {gBerryCheckCircle_Gfx, 2048, 0x2710}; + +const struct CompressedSpritePalette gUnknown_083C1F7C = {gBerryCheck_Pal, 0x2710}; + +static const struct OamData gOamData_83C1F84 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd gSpriteAnim_83C1F8C[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd *const gSpriteAnimTable_83C1F94[] = +{ + gSpriteAnim_83C1F8C, +}; + +static const struct SpriteTemplate gSpriteTemplate_83C1F98 = +{ + .tileTag = 10000, + .paletteTag = 10000, + .oam = &gOamData_83C1F84, + .anims = gSpriteAnimTable_83C1F94, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_BerrySprite, +}; + +u8 sub_80A7E5C(s16 x) +{ + return CreateSprite(&gSpriteTemplate_83C1F98, x, 99, 0); +} diff --git a/src/field/item_use.c b/src/field/item_use.c new file mode 100644 index 000000000..1750c1584 --- /dev/null +++ b/src/field/item_use.c @@ -0,0 +1,1198 @@ +#include "global.h" +#include "item_use.h" +#include "battle.h" +#include "berry.h" +#include "bike.h" +#include "coins.h" +#include "data2.h" +#include "event_data.h" +#include "field_effect.h" +#include "field_fadetransition.h" +#include "field_map_obj_helpers.h" +#include "field_player_avatar.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "item.h" +#include "item_menu.h" +#include "items.h" +#include "mail.h" +#include "main.h" +#include "map_obj_lock.h" +#include "menu.h" +#include "menu_helpers.h" +#include "metatile_behavior.h" +#include "palette.h" +#include "party_menu.h" +#include "pokeblock.h" +#include "pokemon_item_effect.h" +#include "pokemon_menu.h" +#include "rom4.h" +#include "rom_8094928.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "vars.h" + +extern void (* gUnknown_03005D00)(u8); +extern void (* gFieldCallback)(void); +extern void (* gUnknown_0300485C)(void); +extern void (* gUnknown_03004AE4)(u8, u16, TaskFunc); + +extern u8 gUnknown_02038561; +extern u8 gLastFieldPokeMenuOpened; +extern u8 gBankInMenu; + +extern u8 gUnknown_081A1654[]; +extern u8 gUnknown_081A168F[]; + +extern u16 gBattlePartyID[]; + +extern u16 gBattleTypeFlags; + +static const u8 gSSTidalBetaString[] = _("この チケットで ふねに のりほうだい\nはやく のってみたいな"); +static const u8 gSSTidalBetaString2[] = _("この チケットで ふねに のりほうだい\nはやく のってみたいな"); + +static const u8 *const gUnknown_083D61DC[2] = +{ + gSSTidalBetaString, + gSSTidalBetaString2, +}; + +static const MainCallback gExitToOverworldFuncList[] = +{ + sub_808B020, + c2_exit_to_overworld_2_switch, + sub_810B96C, +}; + +static const u8 gItemFinderDirections[] = { DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST }; + +static const struct YesNoFuncTable gUnknown_083D61F4 = +{ + .yesFunc = sub_80C9FC0, + .noFunc = CleanUpItemMenuMessage, +}; + +void ExecuteSwitchToOverworldFromItemUse(u8 taskId) +{ + u8 taskData; + + if (gScriptItemId == 0xAF) + taskData = gTasks[taskId].data[15] - 1; + else + taskData = ItemId_GetType(gScriptItemId) - 1; + + gTasks[taskId].data[8] = (u32)gExitToOverworldFuncList[taskData] >> 16; + gTasks[taskId].data[9] = (u32)gExitToOverworldFuncList[taskData]; + gTasks[taskId].func = HandleItemMenuPaletteFade; +} + +void ItemMenu_ConfirmNormalFade(u8 var) +{ + ExecuteSwitchToOverworldFromItemUse(var); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void ItemMenu_ConfirmComplexFade(u8 var) +{ + ExecuteSwitchToOverworldFromItemUse(var); + fade_screen(1, 0); +} + +void SetUpItemUseOnFieldCallback(u8 taskId) +{ + if (gTasks[taskId].data[2] != 1) + { + gFieldCallback = (void *)ExecuteItemUseFromBlackPalette; + ItemMenu_ConfirmNormalFade(taskId); + } + else + gUnknown_03005D00(taskId); +} + +void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text) +{ + StringExpandPlaceholders(gStringVar4, text); + + switch (playerMenuStatus) + { + case 0: // Item Menu + MenuZeroFillWindowRect(0, 13, 13, 20); + DisplayItemMessageOnField(var1, gStringVar4, CleanUpItemMenuMessage, 1); + break; + default: // Field + DisplayItemMessageOnField(var1, gStringVar4, CleanUpOverworldMessage, 0); + break; + } +} + +void DisplayDadsAdviceCannotUseItemMessage(u8 var1, u8 playerMenuStatus) +{ + HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_DadsAdvice); +} + +void DisplayCantGetOffBikeItemMessage(u8 var1, u8 playerMenuStatus) +{ + HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_CantGetOffBike); +} + +u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId) +{ + if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_TMHM) + return 1; + else if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_EvolutionStone) + return 2; + else + return 0; +} + +void ItemMenu_ReadMail(u8 taskId) +{ + struct MailStruct mailStruct; + + if (!gPaletteFade.active) + { + mailStruct.itemId = gScriptItemId; + HandleReadMail(&mailStruct, sub_80A5D04, 0); + DestroyTask(taskId); + } +} + +void ItemUseOutOfBattle_Mail(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = ItemMenu_ReadMail; +} + +void ItemUseOutOfBattle_Bike(u8 taskId) +{ + s16 x, y; + u8 tileBehavior; + + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + + if (FlagGet(SYS_CYCLING_ROAD) == TRUE // on cycling road? + || MetatileBehavior_IsVerticalRail(tileBehavior) == TRUE + || MetatileBehavior_IsHorizontalRail(tileBehavior) == TRUE + || MetatileBehavior_IsIsolatedVerticalRail(tileBehavior) == TRUE + || MetatileBehavior_IsIsolatedHorizontalRail(tileBehavior) == TRUE) + { + DisplayCantGetOffBikeItemMessage(taskId, gTasks[taskId].data[2]); + } + else + { + if (IsBikingAllowedByMap() == TRUE && IsBikingDisallowedByPlayer() == FALSE) + { + gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Bike; + SetUpItemUseOnFieldCallback(taskId); + } + else + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } +} + +void ItemUseOnFieldCB_Bike(u8 taskId) +{ + if (ItemId_GetSecondaryId(gScriptItemId) == 0) + GetOnOffBike(2); + if (ItemId_GetSecondaryId(gScriptItemId) == 1) + GetOnOffBike(4); + + sub_8064E2C(); + ScriptContext2_Disable(); + DestroyTask(taskId); +} + +bool32 CanFish(void) +{ + s16 x, y; + u16 tileBehavior; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + + if (MetatileBehavior_IsWaterfall(tileBehavior)) + return FALSE; + + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4)) + return FALSE; + + if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + { + if (IsPlayerFacingSurfableFishableWater()) + return TRUE; + } + else + { + if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior) && !MapGridIsImpassableAt(x, y)) + return TRUE; + if (MetatileBehavior_IsBridge(tileBehavior) == TRUE) + return TRUE; + } + + return FALSE; +} + +void ItemUseOutOfBattle_Rod(u8 taskId) +{ + if (CanFish() == TRUE) + { + gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Rod; + SetUpItemUseOnFieldCallback(taskId); + } + else + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); +} + +void ItemUseOnFieldCB_Rod(u8 taskId) +{ + StartFishing(ItemId_GetSecondaryId(gScriptItemId)); + DestroyTask(taskId); +} + +void ItemUseOutOfBattle_Itemfinder(u8 var) +{ + IncrementGameStat(0x27); + gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Itemfinder; + SetUpItemUseOnFieldCallback(var); +} + +void ItemUseOnFieldCB_Itemfinder(u8 taskId) +{ + if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE) + gTasks[taskId].func = RunItemfinderResults; + else + DisplayItemMessageOnField(taskId, gOtherText_NoResponse, ExitItemfinder, 0); +} + +void RunItemfinderResults(u8 taskId) +{ + u8 playerDir; + u8 playerDirToItem; + u8 i; + s16 *data = gTasks[taskId].data; + + if (!data[3]) + { + if (data[4] == 4) + { + playerDirToItem = GetPlayerDirectionTowardsHiddenItem(data[0], data[1]); + if (playerDirToItem) + { + SetPlayerDirectionTowardsItem(gItemFinderDirections[playerDirToItem - 1]); + gTasks[taskId].func = DisplayItemRespondingMessageAndExitItemfinder; + } + else // player is above hidden item. + { + playerDir = player_get_direction_lower_nybble(); + + // rotate player clockwise depending on current direction. + for (i = 0; i < 4; i++) + if (playerDir == gItemFinderDirections[i]) + data[5] = (i + 1) & 3; + + gTasks[taskId].func = RotatePlayerAndExitItemfinder; + data[3] = 0; + data[2] = 0; + } + return; + } + PlaySE(SE_DAUGI); // play the itemfinder jingle 4 times before executing the itemfinder. + data[4]++; + } + data[3] = (data[3] + 1) & 0x1F; +} + +void ExitItemfinder(u8 taskId) +{ + MenuZeroFillWindowRect(0, 14, 29, 19); + sub_8064E2C(); + ScriptContext2_Disable(); + DestroyTask(taskId); +} + +bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId) +{ + int distanceX, distanceY; + u16 x, y; + s16 newDistanceX, newDistanceY, i; + + PlayerGetDestCoords(&x, &y); + gTasks[taskId].data[2] = FALSE; + + for (i = 0; i < events->bgEventCount; i++) + { + if ((events -> bgEvents[i].kind == 7) && !FlagGet(events -> bgEvents[i].bgUnion.hiddenItem.hiddenItemId + 600)) + { + // do a distance lookup of each item so long as the index remains less than the objects on the current map. + distanceX = (u16)events -> bgEvents[i].x + 7; + newDistanceX = distanceX - x; + distanceY = (u16)events -> bgEvents[i].y + 7; + newDistanceY = distanceY - y; + + // is item in range? + if ((u16)(newDistanceX + 7) < 15 && (newDistanceY >= -5) && (newDistanceY < 6)) + sub_80C9838(taskId, newDistanceX, newDistanceY); // send coordinates of the item relative to the player + } + } + sub_80C9720(taskId); + + // hidden item detected? + if(gTasks[taskId].data[2] == TRUE) + return TRUE; + else + return FALSE; +} + +bool8 HiddenItemAtPos(struct MapEvents *events, s16 x, s16 y) +{ + u8 bgEventCount = events->bgEventCount; + struct BgEvent *bgEvent = events->bgEvents; + int i; + + for(i = 0; i < bgEventCount; i++) + { + if(bgEvent[i].kind == 7 && x == (u16)bgEvent[i].x && y == (u16)bgEvent[i].y) // hidden item and coordinates matches x and y passed? + { + if(!FlagGet(bgEvent[i].bgUnion.hiddenItem.hiddenItemId + 600)) + return TRUE; + else + return FALSE; + } + } + return FALSE; +} + +bool8 sub_80C9688(struct MapConnection *connection, int x, int y) +{ + struct MapHeader *mapHeader; + u16 localX, localY; + u32 localOffset; + s32 localLength; + + mapHeader = mapconnection_get_mapheader(connection); + + switch(connection->direction) + { + // same weird temp variable behavior seen in HiddenItemAtPos + case 2: + localOffset = connection->offset + 7; + localX = x - localOffset; + localLength = mapHeader->mapData->height - 7; + localY = localLength + y; // additions are reversed for some reason + break; + case 1: + localOffset = connection->offset + 7; + localX = x - localOffset; + localLength = gMapHeader.mapData->height + 7; + localY = y - localLength; + break; + case 3: + localLength = mapHeader->mapData->width - 7; + localX = localLength + x; // additions are reversed for some reason + localOffset = connection->offset + 7; + localY = y - localOffset; + break; + case 4: + localLength = gMapHeader.mapData->width + 7; + localX = x - localLength; + localOffset = connection->offset + 7; + localY = y - localOffset; + break; + default: + return FALSE; + } + return HiddenItemAtPos(mapHeader->events, localX, localY); +} + +// weird math +#ifdef NONMATCHING +void sub_80C9720(u8 taskId) +{ + s16 x, y; + s16 curX, curY; + s16 width = gMapHeader.mapData->width + 7; + s16 height = gMapHeader.mapData->height + 7; + + PlayerGetDestCoords(&x, &y); + + for (curX = x - 7; curX <= x + 7; curX++) + { + for (curY = y - 5; curY <= y + 5; curY++) + { + if (7 > curX + || curX >= width + || 7 > curY + || curY >= height) + { + struct MapConnection *conn = sub_8056BA0(curX, curY); + if (conn && sub_80C9688(conn, curX, curY) == TRUE) + sub_80C9838(taskId, curX - x, curY - y); + } + } + } +} +#else +__attribute__((naked)) +void sub_80C9720(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x4]\n\ + ldr r0, _080C9834 @ =gMapHeader\n\ + ldr r1, [r0]\n\ + ldr r0, [r1]\n\ + adds r0, 0x7\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x8]\n\ + ldr r0, [r1, 0x4]\n\ + adds r0, 0x7\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0xC]\n\ + mov r4, sp\n\ + adds r4, 0x2\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl PlayerGetDestCoords\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + subs r0, 0x7\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + mov r1, sp\n\ + movs r2, 0\n\ + ldrsh r1, [r1, r2]\n\ + adds r1, 0x7\n\ + cmp r0, r1\n\ + bgt _080C9824\n\ +_080C976E:\n\ + mov r5, sp\n\ + ldrh r0, [r5, 0x2]\n\ + subs r0, 0x5\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + lsls r2, r4, 16\n\ + asrs r1, r2, 16\n\ + movs r6, 0x2\n\ + ldrsh r0, [r5, r6]\n\ + adds r0, 0x5\n\ + lsls r3, 16\n\ + mov r8, r3\n\ + cmp r1, r0\n\ + bgt _080C980E\n\ + movs r0, 0x7\n\ + str r0, [sp, 0x10]\n\ + mov r1, r8\n\ + asrs r1, 16\n\ + mov r9, r1\n\ + mov r10, r0\n\ +_080C9796:\n\ + ldr r3, [sp, 0x10]\n\ + cmp r3, r9\n\ + bgt _080C97B8\n\ + ldr r5, [sp, 0x8]\n\ + lsls r0, r5, 16\n\ + asrs r0, 16\n\ + cmp r9, r0\n\ + bge _080C97B8\n\ + asrs r1, r2, 16\n\ + cmp r10, r1\n\ + bgt _080C97B8\n\ + ldr r6, [sp, 0xC]\n\ + lsls r0, r6, 16\n\ + asrs r0, 16\n\ + lsls r7, r4, 16\n\ + cmp r1, r0\n\ + blt _080C97F6\n\ +_080C97B8:\n\ + mov r0, r8\n\ + asrs r5, r0, 16\n\ + lsls r4, 16\n\ + asrs r6, r4, 16\n\ + adds r0, r5, 0\n\ + adds r1, r6, 0\n\ + bl sub_8056BA0\n\ + adds r7, r4, 0\n\ + cmp r0, 0\n\ + beq _080C97F6\n\ + adds r1, r5, 0\n\ + adds r2, r6, 0\n\ + bl sub_80C9688\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _080C97F6\n\ + mov r0, sp\n\ + ldrh r1, [r0]\n\ + subs r1, r5, r1\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + ldrh r2, [r0, 0x2]\n\ + subs r2, r6, r2\n\ + lsls r2, 16\n\ + asrs r2, 16\n\ + ldr r0, [sp, 0x4]\n\ + bl sub_80C9838\n\ +_080C97F6:\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + adds r0, r7, r1\n\ + lsrs r4, r0, 16\n\ + lsls r2, r4, 16\n\ + asrs r1, r2, 16\n\ + mov r3, sp\n\ + movs r5, 0x2\n\ + ldrsh r0, [r3, r5]\n\ + adds r0, 0x5\n\ + cmp r1, r0\n\ + ble _080C9796\n\ +_080C980E:\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + add r1, r8\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + mov r0, sp\n\ + movs r6, 0\n\ + ldrsh r0, [r0, r6]\n\ + adds r0, 0x7\n\ + cmp r1, r0\n\ + ble _080C976E\n\ +_080C9824:\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080C9834: .4byte gMapHeader\n\ + .syntax divided"); +} +#endif + +void sub_80C9838(u8 taskId, s16 x, s16 y) +{ + s16 *data = gTasks[taskId].data; + s16 var1, var2, var3, var4; + + if(data[2] == FALSE) + { + data[0] = x; + data[1] = y; + data[2] = TRUE; + } + else + { + // data[0] and data[1] contain the player's coordinates. + // x and y contain the item's coordinates. + if(data[0] < 0) + var1 = data[0] * -1; // item is to the left + else + var1 = data[0]; // item is to the right + + if(data[1] < 0) + var2 = data[1] * -1; // item is to the north + else + var2 = data[1]; // item is to the south + + if(x < 0) + var3 = x * -1; + else + var3 = x; + + if(y < 0) + var4 = y * -1; + else + var4 = y; + + if(var1 + var2 > var3 + var4) + { + data[0] = x; + data[1] = y; + } + else + { + if(var1 + var2 == var3 + var4 && (var2 > var4 || (var2 == var4 && data[1] < y))) + { + data[0] = x; + data[1] = y; + } + } + } +} + +u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY) +{ + s16 abX, abY; + + if(itemX == 0 && itemY == 0) + return DIR_NONE; // player is standing on the item. + + // get absolute X distance. + if(itemX < 0) + abX = itemX * -1; + else + abX = itemX; + + // get absolute Y distance. + if(itemY < 0) + abY = itemY * -1; + else + abY = itemY; + + if(abX > abY) + { + if(itemX < 0) + return DIR_EAST; + else + return DIR_NORTH; + } + else + { + if(abX < abY) + { + if(itemY < 0) + return DIR_SOUTH; + else + return DIR_WEST; + } + if(abX == abY) + { + if(itemY < 0) + return DIR_SOUTH; + else + return DIR_WEST; + } + return DIR_NONE; // should never get here. return something so it doesnt crash. + } +} + +void SetPlayerDirectionTowardsItem(u8 direction) +{ + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + FieldObjectClearAnim(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + UnfreezeMapObject(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + PlayerTurnInPlace(direction); +} + +void DisplayItemRespondingMessageAndExitItemfinder(u8 taskId) +{ + if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE) + DisplayItemMessageOnField(taskId, gOtherText_ItemfinderResponding, ExitItemfinder, 0); +} + +void RotatePlayerAndExitItemfinder(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE + || data[2] == FALSE) + { + SetPlayerDirectionTowardsItem(gItemFinderDirections[data[5]]); + data[2] = 1; + data[5] = (data[5] + 1) & 3; + data[3]++; + + if(data[3] == 4) + DisplayItemMessageOnField(taskId, gOtherText_ItemfinderItemUnderfoot, ExitItemfinder, 0); + } +} + +void ItemUseOutOfBattle_PokeblockCase(u8 taskId) +{ + if(sub_80F9344() == TRUE) + { + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } + else if(gTasks[taskId].data[2] != TRUE) + { + sub_810BA7C(0); + ItemMenu_ConfirmNormalFade(taskId); + } + else + { + gFieldCallback = (void *)sub_8080E28; + sub_810BA7C(1); + ItemMenu_ConfirmComplexFade(taskId); + } +} + +void ItemUseOutOfBattle_CoinCase(u8 taskId) +{ + ConvertIntToDecimalStringN(gStringVar1, GetCoins(), 0, 4); + StringExpandPlaceholders(gStringVar4, gOtherText_Coins3); + + if(!gTasks[taskId].data[2]) + { + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); + } + else + { + DisplayItemMessageOnField(taskId, gStringVar4, CleanUpOverworldMessage, 0); + } +} + +void sub_80C9BB8(u8 var) +{ + if(gMain.newKeys & A_BUTTON) + CleanUpItemMenuMessage(var); +} + +void sub_80C9BD8(u8 var) +{ + if(gMain.newKeys & A_BUTTON) + CleanUpOverworldMessage(var); +} + +// unused +void ItemUseOutOfBattle_SSTicket(u8 taskId) +{ + if(gTasks[taskId].data[2] == 0) + { + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gScriptItemId)], sub_80C9BB8, 1); + } + else + { + DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gScriptItemId)], sub_80C9BD8, 0); + } +} + +void sub_80C9C7C(u8 taskId) +{ + if(IsPlayerFacingPlantedBerryTree() == TRUE) + { + gUnknown_03005D00 = sub_80C9D00; + gFieldCallback = ExecuteItemUseFromBlackPalette; + gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; + gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; + gTasks[taskId].func = HandleItemMenuPaletteFade; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + } + else + { + ItemId_GetFieldFunc(gScriptItemId)(taskId); + } +} + +void sub_80C9D00(u8 taskId) +{ + RemoveBagItem(gScriptItemId, 1); + ScriptContext2_Enable(); + ScriptContext1_SetupScript(gUnknown_081A1654); + DestroyTask(taskId); +} + +void ItemUseOutOfBattle_WailmerPail(u8 taskId) +{ + if(TryToWaterBerryTree() == TRUE) + { + gUnknown_03005D00 = sub_80C9D74; + SetUpItemUseOnFieldCallback(taskId); + } + else + { + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } +} + +void sub_80C9D74(u8 taskId) +{ + ScriptContext2_Enable(); + ScriptContext1_SetupScript(gUnknown_081A168F); + DestroyTask(taskId); +} + +void sub_80C9D98(u8 taskId) +{ + gUnknown_02038561 = 0; + ItemMenu_ConfirmNormalFade(taskId); +} + +void ItemUseOutOfBattle_Medicine(u8 taskId) +{ + gUnknown_03004AE4 = UseMedicine; + sub_80C9D98(taskId); +} + +void ItemUseOutOfBattle_SacredAsh(u8 taskId) +{ + u8 i; + + gLastFieldPokeMenuOpened = 0; + + for(i = 0; i < 6; i++) + { + if(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0 && GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) + { + gLastFieldPokeMenuOpened = i; + break; + } + } + gUnknown_03004AE4 = sub_8070048; + gUnknown_02038561 = 4; + ItemMenu_ConfirmNormalFade(taskId); +} + +void ItemUseOutOfBattle_PPRecovery(u8 taskId) +{ + gUnknown_03004AE4 = DoPPRecoveryItemEffect; + sub_80C9D98(taskId); +} + +void ItemUseOutOfBattle_PPUp(u8 taskId) +{ + gUnknown_03004AE4 = DoPPUpItemEffect; + sub_80C9D98(taskId); +} + +void ItemUseOutOfBattle_RareCandy(u8 taskId) +{ + gUnknown_03004AE4 = DoRareCandyItemEffect; + sub_80C9D98(taskId); +} + +void ItemUseOutOfBattle_TMHM(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + + if(gScriptItemId >= ITEM_HM01) + DisplayItemMessageOnField(taskId, gOtherText_BootedHM, sub_80C9EE4, 1); // HM + else + DisplayItemMessageOnField(taskId, gOtherText_BootedTM, sub_80C9EE4, 1); // TM +} + +void sub_80C9EE4(u8 taskId) +{ + PlaySE(2); + gTasks[taskId].func = sub_80C9F10; +} + +void sub_80C9F10(u8 taskId) +{ + if(gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gScriptItemId)]); + StringExpandPlaceholders(gStringVar4, gOtherText_ContainsMove); + DisplayItemMessageOnField(taskId, gStringVar4, sub_80C9F80, 1); + } +} + +void sub_80C9F80(u8 var) +{ + DisplayYesNoMenu(7, 7, 1); + sub_80A3FA0(gBGTilemapBuffers[1], 8, 8, 5, 4, 1); + DoYesNoFuncWithChoice(var, &gUnknown_083D61F4); +} + +void sub_80C9FC0(u8 var) +{ + gUnknown_03004AE4 = TeachMonTMMove; + sub_80C9D98(var); +} + +void sub_80C9FDC(void) +{ + RemoveBagItem(gScriptItemId, 1); + sub_80A3E0C(); + CopyItemName(gScriptItemId, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_UsedItem); +} + +void ItemUseOutOfBattle_Repel(u8 var) +{ + if(VarGet(VAR_REPEL_STEP_COUNT) == FALSE) + { + VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gScriptItemId)); + sub_80C9FDC(); + DisplayItemMessageOnField(var, gStringVar4, CleanUpItemMenuMessage, 1); + } + else + { + DisplayItemMessageOnField(var, gOtherText_RepelLingers, CleanUpItemMenuMessage, 1); + } +} + +void sub_80CA07C(void) +{ + sub_80A3E0C(); + CopyItemName(gScriptItemId, gStringVar2); +} + +void sub_80CA098(u8 taskId) +{ + if(++gTasks[taskId].data[15] > 7) + { + PlaySE(0x75); + DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); + } +} + +void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId) +{ + if(gScriptItemId == 43) + { + FlagSet(SYS_ENC_UP_ITEM); + FlagReset(SYS_ENC_DOWN_ITEM); + sub_80CA07C(); + StringExpandPlaceholders(gStringVar4, gOtherText_UsedFlute); + gTasks[taskId].func = sub_80CA098; + gTasks[taskId].data[15] = 0; + } + else if(gScriptItemId == 42) + { + FlagSet(SYS_ENC_DOWN_ITEM); + FlagReset(SYS_ENC_UP_ITEM); + sub_80CA07C(); + StringExpandPlaceholders(gStringVar4, gOtherText_UsedRepel); + gTasks[taskId].func = sub_80CA098; + gTasks[taskId].data[15] = 0; + } +} + +void task08_080A1C44(u8 taskId) +{ + player_avatar_init_params_reset(); + sub_80878A8(); + DestroyTask(taskId); +} + +void sub_80CA18C(u8 taskId) +{ + sub_8053014(); + sub_80C9FDC(); + gTasks[taskId].data[0] = 0; + DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44, 0); +} + +bool8 sub_80CA1C8(void) +{ + if(gMapHeader.mapType == MAP_TYPE_UNDERGROUND) + return TRUE; + else + return FALSE; +} + +void ItemUseOutOfBattle_EscapeRope(u8 taskId) +{ + if(sub_80CA1C8() == TRUE) // is map type an area you can use escape rope? + { + gUnknown_03005D00 = sub_80CA18C; + SetUpItemUseOnFieldCallback(taskId); + } + else + { + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } +} + +void ItemUseOutOfBattle_EvolutionStone(u8 var) +{ + gUnknown_03004AE4 = DoEvolutionStoneItemEffect; + sub_80C9D98(var); +} + +void ItemUseInBattle_PokeBall(u8 var) +{ + if(PlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon? + { + RemoveBagItem(gScriptItemId, 1); + sub_80A7094(var); + } + else + { + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + DisplayItemMessageOnField(var, gOtherText_BoxIsFull, CleanUpItemMenuMessage, 1); + } +} + +void sub_80CA294(u8 var) +{ + if(gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + sub_80A7094(var); +} + +void sub_80CA2BC(u8 taskId) +{ + if(++gTasks[taskId].data[15] > 7) + { + PlaySE(1); + RemoveBagItem(gScriptItemId, 1); + DisplayItemMessageOnField(taskId, sub_803F378(gScriptItemId), sub_80CA294, 1); + } +} + +void ItemUseInBattle_StatIncrease(u8 taskId) +{ + u16 partyId = gBattlePartyID[gBankInMenu]; + + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + + if(ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gScriptItemId, partyId, 0) != FALSE) + { + DisplayItemMessageOnField(taskId, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1); + } + else + { + gTasks[taskId].func = sub_80CA2BC; + gTasks[taskId].data[15] = 0; + } +} + +void sub_80CA394(u8 taskId) +{ + if(!gPaletteFade.active) + { + sub_8094E4C(); + gpu_pal_allocator_reset__manage_upper_four(); + DestroyTask(taskId); + } +} + +void sub_80CA3C0(u8 taskId) +{ + gTasks[taskId].func = sub_80CA394; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void ItemUseInBattle_Medicine(u8 var) +{ + gUnknown_03004AE4 = UseMedicine; + sub_80CA3C0(var); +} + +void unref_sub_80CA410(u8 var) +{ + gUnknown_03004AE4 = sub_8070048; + sub_80CA3C0(var); +} + +void ItemUseInBattle_PPRecovery(u8 var) +{ + gUnknown_03004AE4 = DoPPRecoveryItemEffect; + sub_80CA3C0(var); +} + +void unref_sub_80CA448(u8 var) +{ + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + + if(ExecuteTableBasedItemEffect__(0, gScriptItemId, 0) == FALSE) + { + RemoveBagItem(gScriptItemId, 1); + GetMonNickname(&gPlayerParty[0], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); + DisplayItemMessageOnField(var, gStringVar4, sub_80A7094, 1); + } + else + { + DisplayItemMessageOnField(var, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1); + } +} + +void ItemUseInBattle_Escape(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + + if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE) + { + sub_80C9FDC(); + DisplayItemMessageOnField(taskId, gStringVar4, sub_80A7094, 1); + } + else + { + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } +} + +void ItemUseOutOfBattle_EnigmaBerry(u8 taskId) +{ + switch(GetItemEffectType(gScriptItemId) - 1) + { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_Medicine(taskId); + break; + case 9: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_SacredAsh(taskId); + break; + case 0: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_RareCandy(taskId); + break; + case 18: + case 19: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_PPUp(taskId); + break; + case 20: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_PPRecovery(taskId); + break; + default: + gTasks[taskId].data[15] = 4; + ItemUseOutOfBattle_CannotUse(taskId); + } +} + +void ItemUseInBattle_EnigmaBerry(u8 taskId) +{ + switch(GetItemEffectType(gScriptItemId)) + { + case 0: + ItemUseInBattle_StatIncrease(taskId); + break; + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 11: + ItemUseInBattle_Medicine(taskId); + break; + case 21: + ItemUseInBattle_PPRecovery(taskId); + break; + default: + ItemUseOutOfBattle_CannotUse(taskId); + } +} + +void ItemUseOutOfBattle_CannotUse(u8 taskId) +{ + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); +} diff --git a/src/field/landmark.c b/src/field/landmark.c new file mode 100644 index 000000000..6a53716bb --- /dev/null +++ b/src/field/landmark.c @@ -0,0 +1,73 @@ +#include "global.h" +#include "landmark.h" +#include "event_data.h" + +#define MAPSEC_NONE 0x58 + +struct Landmark +{ + u8 *name; + u16 flag; +}; + +struct LandmarkList +{ + u8 mapSection; + u8 id; + const struct Landmark **landmarks; +}; + +extern const struct LandmarkList gLandmarkLists[]; + +static const struct Landmark **GetLandmarks(u8 mapSection, u8 id); + +u8 *GetLandmarkName(u8 mapSection, u8 id, u8 count) +{ + const struct Landmark **landmarks = GetLandmarks(mapSection, id); + + if (!landmarks) + return NULL; + + while (1) + { + const struct Landmark *landmark = *landmarks; + + if (landmark->flag == 0xFFFF || FlagGet(landmark->flag) == TRUE) + { + if (count == 0) + break; + else + count--; + } + + landmarks++; + if (!*landmarks) + return NULL; + } + + return (*landmarks)->name; +} + +static const struct Landmark **GetLandmarks(u8 mapSection, u8 id) +{ + u16 i = 0; + + for (; gLandmarkLists[i].mapSection != MAPSEC_NONE; i++) + { + if (gLandmarkLists[i].mapSection > mapSection) + return NULL; + if (gLandmarkLists[i].mapSection == mapSection) + break; + } + + if (gLandmarkLists[i].mapSection == MAPSEC_NONE) + return NULL; + + for (; gLandmarkLists[i].mapSection == mapSection; i++) + { + if (gLandmarkLists[i].id == id) + return gLandmarkLists[i].landmarks; + } + + return NULL; +} diff --git a/src/field/lottery_corner.c b/src/field/lottery_corner.c new file mode 100644 index 000000000..c2c25b9ac --- /dev/null +++ b/src/field/lottery_corner.c @@ -0,0 +1,174 @@ +#include "global.h" +#include "lottery_corner.h" +#include "event_data.h" +#include "items.h" +#include "rng.h" +#include "species.h" +#include "string_util.h" +#include "text.h" + +extern u16 gScriptResult; +extern u16 gSpecialVar_0x8004; +extern struct PokemonStorage gPokemonStorage; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; +static EWRAM_DATA u16 sWinNumberDigit = 0; +static EWRAM_DATA u16 sOtIdDigit = 0; + +static const u16 sLotteryPrizes[] = +{ + ITEM_PP_UP, + ITEM_EXP_SHARE, + ITEM_MAX_REVIVE, + ITEM_MASTER_BALL, +}; + +static u8 GetMatchingDigits(u16, u16); + +void ResetLotteryCorner(void) +{ + u16 rand = Random(); + + SetLotteryNumber((Random() << 16) | rand); + VarSet(VAR_POKELOT_PRIZE, 0); +} + +void SetRandomLotteryNumber(u16 i) +{ + u32 var = Random(); + + while (--i != 0xFFFF) + var = var * 1103515245 + 12345; + + SetLotteryNumber(var); +} + +void RetrieveLotteryNumber(void) +{ + u16 lottoNumber = GetLotteryNumber(); + gScriptResult = lottoNumber; +} + +void PickLotteryCornerTicket(void) +{ + u16 i; + u16 j; + u32 box; + u32 slot; + + gSpecialVar_0x8004 = 0; + slot = 0; + box = 0; + for (i = 0; i < 6; i++) + { + struct Pokemon *pkmn = &gPlayerParty[i]; + + // UB: Too few arguments for function GetMonData + if (GetMonData(pkmn, MON_DATA_SPECIES) != SPECIES_NONE) + { + // do not calculate ticket values for eggs. + if (!GetMonData(pkmn, MON_DATA_IS_EGG)) + { + u32 otId = GetMonData(pkmn, MON_DATA_OT_ID); + u8 numMatchingDigits = GetMatchingDigits(gScriptResult, otId); + + if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1) + { + gSpecialVar_0x8004 = numMatchingDigits - 1; + box = 14; + slot = i; + } + } + } + else // pokemon are always arranged from populated spots first to unpopulated, so the moment a NONE species is found, that's the end of the list. + break; + } + + // player has 14 boxes. + for (i = 0; i < 14; i++) + { + // player has 30 slots per box. + for (j = 0; j < 30; j++) + { + struct BoxPokemon *pkmn = &gPokemonStorage.boxes[i][j]; + + // UB: Too few arguments for function GetMonData + if (GetBoxMonData(pkmn, MON_DATA_SPECIES) != SPECIES_NONE && + !GetBoxMonData(pkmn, MON_DATA_IS_EGG)) + { + u32 otId = GetBoxMonData(pkmn, MON_DATA_OT_ID); + u8 numMatchingDigits = GetMatchingDigits(gScriptResult, otId); + + if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1) + { + gSpecialVar_0x8004 = numMatchingDigits - 1; + box = i; + slot = j; + } + } + } + } + + if (gSpecialVar_0x8004 != 0) + { + gSpecialVar_0x8005 = sLotteryPrizes[gSpecialVar_0x8004 - 1]; + + if (box == 14) + { + gSpecialVar_0x8006 = 0; + GetMonData(&gPlayerParty[slot], MON_DATA_NICKNAME, gStringVar1); + } + else + { + gSpecialVar_0x8006 = 1; + GetBoxMonData(&gPokemonStorage.boxes[box][slot], MON_DATA_NICKNAME, gStringVar1); + } + StringGetEnd10(gStringVar1); + } +} + +static u8 GetMatchingDigits(u16 winNumber, u16 otId) +{ + u8 i; + u8 matchingDigits = 0; + + for (i = 0; i < 5; i++) + { + sWinNumberDigit = winNumber % 10; + sOtIdDigit = otId % 10; + + if (sWinNumberDigit == sOtIdDigit) + { + winNumber = winNumber / 10; + otId = otId / 10; + matchingDigits++; + } + else + break; + } + return matchingDigits; +} + +// lottery numbers go from 0 to 99999, not 65535 (0xFFFF). interestingly enough, the function that calls GetLotteryNumber shifts to u16, so it cant be anything above 65535 anyway. +void SetLotteryNumber(u32 lotteryNum) +{ + u16 lowNum = lotteryNum >> 16; + u16 highNum = lotteryNum; + + VarSet(VAR_POKELOT_RND1, highNum); + VarSet(VAR_POKELOT_RND2, lowNum); +} + +u32 GetLotteryNumber(void) +{ + u16 highNum = VarGet(VAR_POKELOT_RND1); + u16 lowNum = VarGet(VAR_POKELOT_RND2); + + return (lowNum << 16) | highNum; +} + +// interestingly, this may have been the original lottery number set function, but GF tried to change it to 32-bit later but didnt finish changing all calls as one GetLotteryNumber still shifts to u16. +void SetLotteryNumber16_Unused(u16 lotteryNum) +{ + SetLotteryNumber(lotteryNum); +} diff --git a/src/field/map_name_popup.c b/src/field/map_name_popup.c new file mode 100644 index 000000000..01105d0db --- /dev/null +++ b/src/field/map_name_popup.c @@ -0,0 +1,107 @@ +#include "global.h" +#include "map_name_popup.h" +#include "event_data.h" +#include "menu.h" +#include "region_map.h" +#include "task.h" + +EWRAM_DATA static u8 sTaskId = 0; + +static void Task_MapNamePopup(u8); +static void DrawMapNamePopup(void); + +bool8 unref_sub_80A2F44(void) +{ + CloseMenu(); + ShowMapNamePopup(); + return 1; +} + +void ShowMapNamePopup(void) +{ + if (FlagGet(0x4000) != TRUE) + { + if (!FuncIsActiveTask(Task_MapNamePopup)) + { + sTaskId = CreateTask(Task_MapNamePopup, 90); + REG_BG0VOFS = 32; + DrawMapNamePopup(); + gTasks[sTaskId].data[0] = 0; + gTasks[sTaskId].data[2] = 32; + } + else + { + if (gTasks[sTaskId].data[0] != 2) + gTasks[sTaskId].data[0] = 2; + gTasks[sTaskId].data[3] = 1; + } + } +} + +void Task_MapNamePopup(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[2] -= 2; + if (task->data[2] <= 0 ) + { + task->data[0] = 1; + gTasks[sTaskId].data[1] = 0; + } + break; + case 1: + task->data[1]++; + if (task->data[1] > 120 ) + { + task->data[1] = 0; + task->data[0] = 2; + } + break; + case 2: + task->data[2] += 2; + if (task->data[2] > 31) + { + if (task->data[3]) + { + DrawMapNamePopup(); + task->data[0] = 0; + task->data[3] = 0; + } + else + { + task->data[0] = 4; + return; + } + } + break; + case 4: + HideMapNamePopup(); + return; + } + + REG_BG0VOFS = task->data[2]; +} + +void HideMapNamePopup(void) +{ + if (FuncIsActiveTask(Task_MapNamePopup)) + { + MenuLoadTextWindowGraphics(); + MenuZeroFillWindowRect(0, 0, 13, 3); + REG_BG0VOFS = 0; + DestroyTask(sTaskId); + } +} + +void DrawMapNamePopup(void) +{ + u8 name[20]; + + MenuLoadTextWindowGraphics_OverrideFrameType(0); + GetMapSectionName(name, gMapHeader.regionMapSectionId, 0); + MenuDrawTextWindow(0, 0, 13, 3); + sub_8072BD8(name, 1, 1, 0x60); +} diff --git a/src/field/map_obj_lock.c b/src/field/map_obj_lock.c new file mode 100644 index 000000000..bd40bcacc --- /dev/null +++ b/src/field/map_obj_lock.c @@ -0,0 +1,118 @@ +#include "global.h" +#include "map_obj_lock.h" +#include "field_map_obj.h" +#include "field_map_obj_helpers.h" +#include "field_player_avatar.h" +#include "script_movement.h" +#include "task.h" + +extern u16 gScriptFacing; + +bool8 walkrun_is_standing_still(void) +{ + if (gPlayerAvatar.running1 == 1) + return FALSE; + else + return TRUE; +} + +void sub_8064CDC(u8 taskId) +{ + if (walkrun_is_standing_still()) + { + sub_80594C0(); + DestroyTask(taskId); + } +} + +bool8 sub_8064CFC(void) +{ + if (FuncIsActiveTask(sub_8064CDC)) + { + return FALSE; + } + else + { + sub_80597F4(); + return TRUE; + } +} + +void ScriptFreezeMapObjects(void) +{ + FreezeMapObjects(); + CreateTask(sub_8064CDC, 80); +} + +void sub_8064D38(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (!task->data[0] && walkrun_is_standing_still() == TRUE) + { + sub_80594C0(); + task->data[0] = 1; + } + if (!task->data[1] && !gMapObjects[gSelectedMapObject].mapobj_bit_1) + { + FreezeMapObject(&gMapObjects[gSelectedMapObject]); + task->data[1] = 1; + } + if (task->data[0] && task->data[1]) + DestroyTask(taskId); +} + +bool8 sub_8064DB4(void) +{ + if (FuncIsActiveTask(sub_8064D38)) + { + return FALSE; + } + else + { + sub_80597F4(); + return TRUE; + } +} + +void sub_8064DD8(void) +{ + u8 taskId; + FreezeMapObjectsExceptOne(gSelectedMapObject); + taskId = CreateTask(sub_8064D38, 80); + if (!gMapObjects[gSelectedMapObject].mapobj_bit_1) + { + FreezeMapObject(&gMapObjects[gSelectedMapObject]); + gTasks[taskId].data[1] = 1; + } +} + +void sub_8064E2C(void) +{ + u8 objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); + sub_80A2178(); + UnfreezeMapObjects(); +} + +void unref_sub_8064E5C(void) +{ + u8 objectId; + + if (gMapObjects[gSelectedMapObject].active) + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]); + objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); + sub_80A2178(); + UnfreezeMapObjects(); +} + +void sub_8064EAC(void) +{ + FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], gScriptFacing); +} + +void sub_8064ED4(void) +{ + FieldObjectClearAnimIfSpecialAnimActive(&gMapObjects[gSelectedMapObject]); +} diff --git a/src/field/mauville_old_man.c b/src/field/mauville_old_man.c new file mode 100644 index 000000000..93684fc60 --- /dev/null +++ b/src/field/mauville_old_man.c @@ -0,0 +1,247 @@ +#include "global.h" +#include "mauville_old_man.h" +#include "easy_chat.h" +#include "menu.h" +#include "rng.h" +#include "script.h" +#include "string_util.h" +#include "strings.h" +#include "trader.h" + +extern u16 gScriptResult; +extern u16 gSpecialVar_0x8004; + +extern u32 gUnknown_083E5388[]; +extern u32 gUnknown_083E53A8[]; + +extern u16 gUnknown_083E537C[]; + +void sub_80F7A34(void) +{ + u16 i; + OldMan *oldMan = &gSaveBlock1.oldMan; + + oldMan->oldMan1.unk_2D94 = 0; + oldMan->oldMan1.unk_2DBD = 0; + + for(i = 0; i < 6; i++) + oldMan->oldMan1.mauvilleOldMan_ecArray[i] = gUnknown_083E537C[i]; +} + +void sub_80F7A6C(void) +{ + struct UnkMauvilleOldManStruct *bard = &gSaveBlock1.oldMan.oldMan1; + + bard->unk_2D94 = 1; + bard->unk_2D95 = 0; +} + +void sub_80F7A7C(void) +{ + sub_80F83F8(); +} + +void sub_80F7A88(void) +{ + OldMan *oldMan = &gSaveBlock1.oldMan; + + oldMan->oldMan1.unk_2D94 = 4; + oldMan->oldMan1.unk_2D95 = 0; +} + +void sub_80F7A98(void) +{ + sub_81099CC(); +} + +void SetMauvilleOldMan(void) +{ + u32 var = ((u16)((gSaveBlock2.playerTrainerId[1] << 8 | gSaveBlock2.playerTrainerId[0])) % 10) / 2; + + switch(var) + { + case 0: + sub_80F7A34(); + break; + case 1: + sub_80F7A6C(); + break; + case 2: + sub_80F7A98(); + break; + case 3: + sub_80F7A7C(); + break; + case 4: + sub_80F7A88(); + break; + } + sub_80F83D0(); +} + +u8 GetCurrentMauvilleOldMan(void) +{ + OldMan *oldMan = &gSaveBlock1.oldMan; + + return oldMan->oldMan1.unk_2D94; +} + +void sub_80F7B14(void) +{ + gScriptResult = GetCurrentMauvilleOldMan(); +} + +void sub_80F7B2C(void) +{ + u16 *scriptPtr = &gScriptResult; // why?? + OldMan *oldMan = &gSaveBlock1.oldMan; + + *scriptPtr = oldMan->oldMan1.unk_2DBD; +} + +void sub_80F7B40(void) +{ + u16 i; + OldMan *oldMan = &gSaveBlock1.oldMan; + //struct UnkMauvilleOldManStruct *oldManStruct = &gSaveBlock1.oldManStruct; + + StringCopy(oldMan->oldMan1.playerName, gSaveBlock2.playerName); + + for(i = 0; i < 4; i++) + oldMan->oldMan1.playerTrainerId[i] = gSaveBlock2.playerTrainerId[i]; + + for(i = 0; i < 6; i++) + oldMan->oldMan1.mauvilleOldMan_ecArray[i] = oldMan->oldMan1.mauvilleOldMan_ecArray2[i]; + + oldMan->oldMan1.unk_2DBD = 1; +} + +void sub_80F7BA0(void) +{ + struct UnkMauvilleOldManStruct *oldMan = &gSaveBlock1.oldMan.oldMan1; + u16 specialVar = gSpecialVar_0x8004; // It's a bit odd to use this temp variable, but it seems needed to match. + u16 *r5; + u16 i; + u8 *ptr; + u8 *r4; + + r5 = oldMan->mauvilleOldMan_ecArray2; + if (specialVar == 0) + r5 = oldMan->mauvilleOldMan_ecArray; + ptr = gStringVar4; + r4 = ptr; + for (i = 0; i < 2; i++) + { + ptr = sub_80EB3FC(ptr, *(r5++)); + while (ptr != r4) + { + if (*r4 == 0) + *r4 = 0x37; + r4++; + } + r4++; + *(ptr++) = 0; + ptr = sub_80EB3FC(ptr, *(r5++)); + while (ptr != r4) + { + if (*r4 == 0) + *r4 = 0x37; + r4++; + } + r4++; + *(ptr++) = 0xFE; + ptr = sub_80EB3FC(ptr, *(r5++)); + while (ptr != r4) + { + if (*r4 == 0) + *r4 = 0x37; + r4++; + } + //_080F7C2A + if (i == 0) + { + *(ptr++) = EXT_CTRL_CODE_BEGIN; + *(ptr++) = 0xF; + } + } +} + +void sub_80F7C54(void) +{ + sub_80F7F80(gSpecialVar_0x8004); + MenuDisplayMessageBox(); + ScriptContext1_Stop(); +} + +void sub_80F7C70(void) +{ + u16 *scriptPtr = &gScriptResult; // again?? + OldMan *oldMan = &gSaveBlock1.oldMan; + + *scriptPtr = oldMan->oldMan1.unk_2D95; +} + +void sub_80F7C84(void) +{ + OldMan *oldMan = &gSaveBlock1.oldMan; + + oldMan->oldMan1.unk_2D95 = 1; +} + +void sub_80F7C90(void) +{ + u16 var = sub_80EB8EC(); + + if(var == 0xFFFF) + { + gScriptResult = FALSE; + } + else + { + sub_80EB3FC(gStringVar1, var); + gScriptResult = TRUE; + } +} + +void sub_80F7CC8(void) +{ + OldMan *oldMan = &gSaveBlock1.oldMan; + + if(oldMan->oldMan1.unk_2D95 == 10) + { + gScriptResult = FALSE; + oldMan->oldMan1.unk_2D95 = 0; + } + else + gScriptResult = TRUE; +} + +void sub_80F7CF4(void) +{ + struct UnkMauvilleOldManStruct2 *oldMan = &gSaveBlock1.oldMan.oldMan2; + + if(oldMan->unk1 == 0) + sub_80F7DC0(); + + if(oldMan->mauvilleOldMan_ecArray[oldMan->unk1] != 0xFFFF) // is not the last element of the array? + { + u8 *stringPtr; + u32 random = Random(); + + random %= 8; + stringPtr = sub_80EB3FC(gStringVar4, oldMan->mauvilleOldMan_ecArray[oldMan->unk1]); + stringPtr = StringCopy(stringPtr, gOtherText_Is); + stringPtr = StringCopy(stringPtr, (u8 *)gUnknown_083E5388[random]); + StringCopy(stringPtr, gOtherText_DontYouAgree); + } + else + { + StringCopy(gStringVar4, (u8 *)gUnknown_083E53A8[oldMan->mauvilleOldMan_ecArray2[oldMan->unk2++]]); + } + if(!(Random() % 10)) + oldMan->unk1 = 10; + else + oldMan->unk1++; + + gScriptResult = TRUE; +} diff --git a/src/field/menu_helpers.c b/src/field/menu_helpers.c new file mode 100644 index 000000000..9915d67ac --- /dev/null +++ b/src/field/menu_helpers.c @@ -0,0 +1,572 @@ +#include "global.h" +#include "item_menu.h" +#include "items.h" +#include "link.h" +#include "mail_data.h" +#include "main.h" +#include "map_constants.h" +#include "menu.h" +#include "menu_helpers.h" +#include "rom4.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "text.h" + +#define SCROLL_INDICATOR_PAL_TAG 6 + +static void sub_80F9834(struct Sprite *sprite); + +static EWRAM_DATA u8 gUnknown_020388C0[4] = {0}; +static EWRAM_DATA struct YesNoFuncTable gUnknown_020388C4 = {0}; + +static TaskFunc gUnknown_0300074C; + +static const u8 gSpriteImage_83E5808[] = INCBIN_U8("graphics/unknown_sprites/83E59A0/0.4bpp"); + +static const u8 gSpriteImage_83E5848[] = INCBIN_U8("graphics/unknown_sprites/83E59A0/1.4bpp"); + +static const u8 gSpriteImage_83E5888[] = INCBIN_U8("graphics/unknown_sprites/83E59B0/0.4bpp"); + +static const u8 gSpriteImage_83E58C8[] = INCBIN_U8("graphics/unknown_sprites/83E59B0/1.4bpp"); + +static const u8 gSpriteImage_83E5908[] = INCBIN_U8("graphics/unknown_sprites/83E59C0/0.4bpp"); + +static const u8 gSpriteImage_83E5928[] = INCBIN_U8("graphics/unknown_sprites/83E59C0/1.4bpp"); + +static const u16 Palette_3E5948[] = INCBIN_U16("graphics/interface/83E5948.gbapal"); + +static const struct SpritePalette gUnknown_083E5968 = { Palette_3E5948, SCROLL_INDICATOR_PAL_TAG }; + +static const struct OamData gOamData_83E5970 = +{ + .tileNum = 1 +}; + +static const struct OamData gOamData_83E5978 = +{ + .shape = ST_OAM_H_RECTANGLE, + .tileNum = 1 +}; + +static const struct OamData gOamData_83E5980 = +{ + .shape = ST_OAM_V_RECTANGLE, + .tileNum = 1 +}; + +static const union AnimCmd gSpriteAnim_83E5988[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd gSpriteAnim_83E5990[] = +{ + ANIMCMD_FRAME(1, 0), + ANIMCMD_END, +}; + +static const union AnimCmd *const gSpriteAnimTable_83E5998[] = +{ + gSpriteAnim_83E5988, + gSpriteAnim_83E5990, +}; + +static const struct SpriteFrameImage gSpriteImageTable_83E59A0[] = +{ + { gSpriteImage_83E5808, 0x40 }, + { gSpriteImage_83E5848, 0x40 }, +}; + +static const struct SpriteFrameImage gSpriteImageTable_83E59B0[] = +{ + { gSpriteImage_83E5888, 0x40 }, + { gSpriteImage_83E58C8, 0x40 }, +}; + +static const struct SpriteFrameImage gSpriteImageTable_83E59C0[] = +{ + { gSpriteImage_83E5908, 0x20 }, + { gSpriteImage_83E5928, 0x20 }, +}; + +static const struct SpriteTemplate gSpriteTemplate_83E59D0 = +{ + .tileTag = 0xFFFF, + .paletteTag = SCROLL_INDICATOR_PAL_TAG, + .oam = &gOamData_83E5978, + .anims = gSpriteAnimTable_83E5998, + .images = gSpriteImageTable_83E59A0, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80F9834, +}; + +static const struct SpriteTemplate gSpriteTemplate_83E59E8 = +{ + .tileTag = 0xFFFF, + .paletteTag = SCROLL_INDICATOR_PAL_TAG, + .oam = &gOamData_83E5980, + .anims = gSpriteAnimTable_83E5998, + .images = gSpriteImageTable_83E59B0, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80F9834, +}; + +static const struct SpriteTemplate gSpriteTemplate_83E5A00 = +{ + .tileTag = 0xFFFF, + .paletteTag = SCROLL_INDICATOR_PAL_TAG, + .oam = &gOamData_83E5970, + .anims = gSpriteAnimTable_83E5998, + .images = gSpriteImageTable_83E59C0, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +void sub_80F9020(void) +{ + memset(&gBGTilemapBuffers[1], 0, 0x800); + memset(&gBGTilemapBuffers[2], 0, 0x800); + memset(&gBGTilemapBuffers[3], 0, 0x800); +} + +// display message box, fill box with tile if tile is not zero, print string +static void PrintMessage(const u8 *str, u16 tile) +{ + MenuDisplayMessageBox(); + if (tile) + { + sub_80A3FA0(&gBGTilemapBuffers[1][0], 2, 15, 26, 4, tile); + } + sub_8072044(str); +} + +static void sub_80F9090(u8 taskId) +{ + if (MenuUpdateWindowText() == TRUE) + { + gUnknown_0300074C(taskId); + } +} + +void DisplayItemMessageOnField(u8 taskId, const u8 *str, TaskFunc callback, u16 tile) +{ + PrintMessage(str, tile); + gUnknown_0300074C = callback; + gTasks[taskId].func = sub_80F9090; +} + +static void Task_CallYesOrNoCallback(u8 taskId) +{ + switch (ProcessMenuInputNoWrap_()) + { + case 0: + PlaySE(SE_SELECT); + gUnknown_020388C4.yesFunc(taskId); + break; + case 1: + case -1: + PlaySE(SE_SELECT); + gUnknown_020388C4.noFunc(taskId); + } +} + +void DoYesNoFuncWithChoice(u8 taskId, const struct YesNoFuncTable *funcTable) +{ + gUnknown_020388C4 = *funcTable; + gTasks[taskId].func = Task_CallYesOrNoCallback; +} + +static void PrintStringWithPalette(const u8 *str, u8 paletteNum, u8 left, u8 top) +{ + u8 paletteStr[] = _("{PALETTE 0}"); + + if (paletteNum != 0xFF) + { + paletteStr[2] = paletteNum; + StringCopy(gStringVar4, paletteStr); + StringAppend(gStringVar4, str); + paletteStr[2] = gMenuWindowPtr->paletteNum; + StringAppend(gStringVar4, paletteStr); + } + else + { + StringCopy(gStringVar4, str); + } + + MenuPrint(gStringVar4, left, top); +} + +// unused +void PrintNumberWithPalette(s32 value, u8 paletteNum, u8 n, u8 mode, u8 left, u8 top) +{ + ConvertIntToDecimalStringN(gStringVar1, value, mode, n); + if (paletteNum != 0xFF) + { + PrintStringWithPalette(gStringVar1, paletteNum, left, top); + } + else + { + MenuPrint(gStringVar1, left, top); + } +} + +// unused +void PrintTriangleCursorWithPalette(u8 left, u8 top, u8 paletteNum) +{ + u8 cursorStr[] = _("▶"); + PrintStringWithPalette(cursorStr, paletteNum, left, top); +} + +u8 sub_80F9284(void) +{ + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.newKeys & L_BUTTON) + { + return 1; + } + if (gMain.newKeys & R_BUTTON) + { + return 2; + } + } + + return 0; +} + +u8 sub_80F92BC(void) +{ + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.newAndRepeatedKeys & L_BUTTON) + { + return 1; + } + if (gMain.newAndRepeatedKeys & R_BUTTON) + { + return 2; + } + } + + return 0; +} + +bool8 sub_80F92F4(u16 itemId) +{ + if (itemId != ITEM_ENIGMA_BERRY) + { + return TRUE; + } + + if (!(gSaveBlock1.location.mapGroup == MAP_GROUP_TRADE_CENTER && gSaveBlock1.location.mapNum == MAP_ID_TRADE_CENTER)) + { + return TRUE; + } + + return FALSE; +} + +bool8 sub_80F931C(u16 itemId) +{ + if (is_c1_link_related_active() != TRUE) + { + return TRUE; + } + + if (ItemIsMail(itemId) != TRUE) + { + return TRUE; + } + + return FALSE; +} + +bool8 sub_80F9344(void) +{ + if (is_c1_link_related_active() == TRUE || gReceivedRemoteLinkPlayers == 1) + { + return TRUE; + } + + return FALSE; +} + +void sub_80F9368(void) +{ + u8 *addr; + u32 size; + + REG_DISPCNT = 0; + REG_BG3CNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + 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; + } + } + + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); +} + +void sub_80F9438(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); +} + +void sub_80F944C(void) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + gUnknown_020388C0[i] = 0xFF; + } + + FreeSpritePaletteByTag(SCROLL_INDICATOR_PAL_TAG); + LoadSpritePalette(&gUnknown_083E5968); +} + +void sub_80F9480(u8 *data, u8 n) +{ + u8 i; + + for (i = 0; i < n; i++) + { + data[i] = 0xFF; + } +} + +void sub_80F94A4(u8 animNum, u8 *spriteId, s16 x, s16 y) +{ + if (animNum <= 5) + { + if (*spriteId == 0xFF) + { + *spriteId = CreateSprite(&gSpriteTemplate_83E5A00, x, y, 0); + } + animNum -= 4; + StartSpriteAnim(&gSprites[*spriteId], animNum); + } +} + +void sub_80F94F8(u8 *spriteId) +{ + if (*spriteId != 0xFF) + { + DestroySprite(&gSprites[*spriteId]); + *spriteId = 0xFF; + } +} + +void sub_80F9520(u8 *data, u8 n) +{ + u8 i; + + for (i = 0; i < 8; i++) + { + sub_80F94F8(&data[i]); + } +} + +void CreateVerticalScrollIndicators(u8 id, u16 x, u16 y) +{ + if (id >= 4) + { + return; + } + + switch (id) + { + case 0: + if (gUnknown_020388C0[0] == 0xFF) + { + gUnknown_020388C0[0] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); + gSprites[gUnknown_020388C0[0]].data2 = -1; + if (gUnknown_020388C0[1] != 0xFF) + { + gSprites[gUnknown_020388C0[0]].pos2.y = gSprites[gUnknown_020388C0[1]].pos2.y * -1; + gSprites[gUnknown_020388C0[0]].data3 = gSprites[gUnknown_020388C0[1]].data3; + } + else + { + gSprites[gUnknown_020388C0[0]].data3 = 0; + } + } + break; + + case 1: + if (gUnknown_020388C0[1] == 0xFF) + { + gUnknown_020388C0[1] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); + gSprites[gUnknown_020388C0[1]].data2 = 1; + if (gUnknown_020388C0[0] != 0xFF) + { + gSprites[gUnknown_020388C0[1]].pos2.y = gSprites[gUnknown_020388C0[0]].pos2.y * -1; + gSprites[gUnknown_020388C0[1]].data3 = gSprites[gUnknown_020388C0[0]].data3; + } + else + { + gSprites[gUnknown_020388C0[1]].data3 = 0; + } + } + break; + + case 2: + if (gUnknown_020388C0[2] == 0xFF) + { + gUnknown_020388C0[2] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); + gSprites[gUnknown_020388C0[2]].data0 = -1; + if (gUnknown_020388C0[3] != 0xFF) + { + gSprites[gUnknown_020388C0[2]].pos2.x = gSprites[gUnknown_020388C0[3]].pos2.x * -1; + gSprites[gUnknown_020388C0[2]].data1 = gSprites[gUnknown_020388C0[3]].data1; + } + else + { + gSprites[gUnknown_020388C0[2]].data1 = 0; + } + } + break; + + case 3: + if (gUnknown_020388C0[3] == 0xFF) + { + gUnknown_020388C0[3] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); + gSprites[gUnknown_020388C0[3]].data0 = 1; + if (gUnknown_020388C0[2] != 0xFF) + { + gSprites[gUnknown_020388C0[3]].pos2.x = gSprites[gUnknown_020388C0[2]].pos2.x * -1; + gSprites[gUnknown_020388C0[3]].data1 = gSprites[gUnknown_020388C0[2]].data1; + } + else + { + gSprites[gUnknown_020388C0[3]].data1 = 0; + } + } + break; + } + + StartSpriteAnim(&gSprites[gUnknown_020388C0[id]], id & 1); +} + +void sub_80F979C(u8 id, bool8 invisible) +{ + if (id < 4 && gUnknown_020388C0[id] != 0xFF) + { + gSprites[gUnknown_020388C0[id]].invisible = invisible; + } +} + +void DestroyVerticalScrollIndicator(u8 id) +{ + if (id < 4 && gUnknown_020388C0[id] != 0xFF) + { + DestroySprite(&gSprites[gUnknown_020388C0[id]]); + gUnknown_020388C0[id] = 0xFF; + } +} + +void LoadScrollIndicatorPalette(void) +{ + LoadSpritePalette(&gUnknown_083E5968); +} + +void BuyMenuFreeMemory(void) +{ + FreeSpritePaletteByTag(SCROLL_INDICATOR_PAL_TAG); +} + +static void sub_80F9834(struct Sprite *sprite) +{ + if (sprite->data1 == 0) + { + sprite->pos2.x += sprite->data0; + } + if (sprite->data3 == 0) + { + sprite->pos2.y += sprite->data2; + } + sprite->data1++; + sprite->data3++; + if (sprite->data1 > 2) + { + sprite->data1 = 0; + } + if (sprite->data3 > 2) + { + sprite->data3 = 0; + } + if (sprite->pos2.x == 8 || sprite->pos2.x == -8) + { + sprite->pos2.x = 0; + } + if (sprite->pos2.y == 8 || sprite->pos2.y == -8) + { + sprite->pos2.y = 0; + } +} + +void sub_80F98A4(u8 id) +{ + if (gUnknown_020388C0[id] != 0xFF && id < 4) + { + gSprites[gUnknown_020388C0[id]].callback = SpriteCallbackDummy; + } +} + +void StartVerticalScrollIndicators(u8 id) +{ + if (gUnknown_020388C0[id] != 0xFF && id < 4) + { + gSprites[gUnknown_020388C0[id]].callback = sub_80F9834; + } +} + +static void sub_80F9914(u8 id) +{ + if (gUnknown_020388C0[id] != 0xFF && id < 4) + { + gSprites[gUnknown_020388C0[id]].pos2.x = 0; + gSprites[gUnknown_020388C0[id]].pos2.y = 0; + gSprites[gUnknown_020388C0[id]].data1 = 0; + gSprites[gUnknown_020388C0[id]].data3 = 0; + } +} + +void PauseVerticalScrollIndicator(u8 id) +{ + sub_80F98A4(id); + sub_80F9914(id); +} + +void sub_80F9988(u8 id, u8 priority) +{ + if (gUnknown_020388C0[id] != 0xFF && id < 4) + { + gSprites[gUnknown_020388C0[id]].oam.priority = priority; + } +} diff --git a/src/field/metatile_behavior.c b/src/field/metatile_behavior.c new file mode 100644 index 000000000..d05ba0b89 --- /dev/null +++ b/src/field/metatile_behavior.c @@ -0,0 +1,1308 @@ +#include "global.h" +#include "metatile_behavior.h" +#include "metatile_behaviors.h" + +#define TILE_ATTRIBUTES(three, two, one) (((one) ? 1 : 0) | ((two) ? 2 : 0) | ((three) ? 4 : 0)) + +static const u8 sTileBitAttributes[] = +{ + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, TRUE), + TILE_ATTRIBUTES(TRUE, TRUE, TRUE), + TILE_ATTRIBUTES(TRUE, TRUE, TRUE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE) +}; + +// only used as default case for checking jump landing in field_ground_effect. +bool8 MetatileBehavior_IsATile(u8 var) +{ + return TRUE; +} + +bool8 MetatileBehavior_IsEncounterTile(u8 var) +{ + if ((sTileBitAttributes[var] & 1) != 0) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsJumpEast(u8 var) +{ + if (var == MB_JUMP_EAST) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsJumpWest(u8 var) +{ + if (var == MB_JUMP_WEST) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsJumpNorth(u8 var) +{ + if (var == MB_JUMP_NORTH) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsJumpSouth(u8 var) +{ + if (var == MB_JUMP_SOUTH) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPokeGrass(u8 var) +{ + if (var == MB_TALL_GRASS || var == MB_LONG_GRASS) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSandOrDeepSand(u8 var) +{ + if (var == MB_SAND || var == MB_DEEP_SAND) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsDeepSand(u8 var) +{ + if (var == MB_DEEP_SAND) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsReflective(u8 var) +{ + if (var == MB_POND_WATER || var == MB_PUDDLE || var == MB_1A || var == MB_ICE || var == MB_SOOTOPOLIS_DEEP_WATER || var == MB_REFLECTION_UNDER_BRIDGE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsIce(u8 var) +{ + if (var == MB_ICE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWarpDoor(u8 var) +{ + if (var == MB_ANIMATED_DOOR) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsDoor(u8 var) +{ + if (var == MB_8D || var == MB_ANIMATED_DOOR) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsEscalator(u8 var) +{ + if (var == MB_UP_ESCALATOR || var == MB_DOWN_ESCALATOR) + return TRUE; + else + return FALSE; +} + +bool8 unref_sub_8056EE0(u8 var) +{ + if (var == MB_04) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsLadder(u8 var) +{ + if (var == MB_LADDER) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsNonAnimDoor(u8 var) +{ + if (var == MB_NON_ANIMATED_DOOR || var == MB_WATER_DOOR || var == MB_DEEP_SOUTH_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsDeepSouthWarp(u8 var) +{ + if (var == MB_DEEP_SOUTH_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSurfableWaterOrUnderwater(u8 var) +{ + if ((sTileBitAttributes[var] & 2) != 0) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsEastArrowWarp(u8 var) +{ + if (var == MB_EAST_ARROW_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWestArrowWarp(u8 var) +{ + if (var == MB_WEST_ARROW_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsNorthArrowWarp(u8 var) +{ + if (var == MB_NORTH_ARROW_WARP || var == MB_STAIRS_OUTSIDE_ABANDONED_SHIP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSouthArrowWarp(u8 var) +{ + if (var == MB_SOUTH_ARROW_WARP || var == MB_WATER_SOUTH_ARROW_WARP || var == MB_SHOAL_CAVE_ENTRANCE) + return TRUE; + else + return FALSE; +} + +// unused +bool8 MetatileBehavior_IsArrowWarp(u8 var) +{ + u8 var2 = 0; + + if (MetatileBehavior_IsEastArrowWarp(var) + || MetatileBehavior_IsWestArrowWarp(var) + || MetatileBehavior_IsNorthArrowWarp(var) + || MetatileBehavior_IsSouthArrowWarp(var)) + { + var2 = 1; + } + return var2; +} + +bool8 MetatileBehavior_IsMoveTile(u8 var) +{ + if ((var >= MB_WALK_EAST && var <= MB_TRICK_HOUSE_PUZZLE_8_FLOOR) || (var >= MB_EASTWARD_CURRENT && var <= MB_SOUTHWARD_CURRENT) + || var == MB_MUDDY_SLOPE || var == MB_CRACKED_FLOOR || var == MB_WATERFALL || var == MB_ICE || var == MB_BB || var == MB_BC) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsIce_2(u8 var) +{ + if (var == MB_ICE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsTrickHouseSlipperyFloor(u8 var) +{ + if (var == MB_TRICK_HOUSE_PUZZLE_8_FLOOR) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_0x05(u8 var) +{ + if (var == MB_05) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWalkNorth(u8 var) +{ + if (var == MB_WALK_NORTH) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWalkSouth(u8 var) +{ + if (var == MB_WALK_SOUTH) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWalkWest(u8 var) +{ + if (var == MB_WALK_WEST) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWalkEast(u8 var) +{ + if (var == MB_WALK_EAST) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsNorthwardCurrent(u8 var) +{ + if (var == MB_NORTHWARD_CURRENT) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSouthwardCurrent(u8 var) +{ + if (var == MB_SOUTHWARD_CURRENT) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWestwardCurrent(u8 var) +{ + if (var == MB_WESTWARD_CURRENT) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsEastwardCurrent(u8 var) +{ + if (var == MB_EASTWARD_CURRENT) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSlideNorth(u8 var) +{ + if (var == MB_SLIDE_NORTH) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSlideSouth(u8 var) +{ + if (var == MB_SLIDE_SOUTH) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSlideWest(u8 var) +{ + if (var == MB_SLIDE_WEST) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSlideEast(u8 var) +{ + if (var == MB_SLIDE_EAST) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsCounter(u8 var) +{ + if (var == MB_COUNTER) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPlayerFacingTVScreen(u8 tile, u8 playerDir) +{ + if (playerDir != CONNECTION_NORTH) // if the player isn't facing north, forget about it. + return FALSE; + else if (tile == MB_TELEVISION) // is the player's north tile a TV? + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPC(u8 var) +{ + if (var == MB_PC) + return TRUE; + else + return FALSE; +} + +bool8 is_tile_x84(u8 var) +{ + if (var == MB_84) + return TRUE; + else + return FALSE; +} + +bool8 sub_80571C0(u8 var) +{ + if (var == MB_91 || var == MB_93 || var == MB_95 || var == MB_97 + || var == MB_99 || var == MB_9B || var == MB_9D) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSecretBaseCave(u8 var) +{ + if (var == MB_SECRET_BASE_SPOT_RED_CAVE || var == MB_SECRET_BASE_SPOT_BROWN_CAVE || var == MB_SECRET_BASE_SPOT_YELLOW_CAVE || var == MB_SECRET_BASE_SPOT_BLUE_CAVE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSecretBaseTree(u8 var) +{ + if (var == MB_SECRET_BASE_SPOT_TREE_1 || var == MB_SECRET_BASE_SPOT_TREE_2) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSecretBaseShrub(u8 var) +{ + if (var == MB_SECRET_BASE_SPOT_SHRUB) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSecretBasePC(u8 var) +{ + if (var == MB_SECRET_BASE_PC) + return TRUE; + else + return FALSE; +} + +bool8 sub_805724C(u8 var) +{ + if (var == MB_B1) + return TRUE; + else + return FALSE; +} + +bool8 unref_sub_8057260(u8 var) +{ + if (var == MB_B2) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057274(u8 var) +{ + if (var == MB_B3) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057288(u8 var) +{ + if (var == MB_B9) + return TRUE; + else + return FALSE; +} + +bool8 sub_805729C(u8 var) +{ + if (var == MB_NORMAL) + return TRUE; + else + return FALSE; +} + +bool8 sub_80572B0(u8 var) +{ + if (var == MB_B7) + return TRUE; + else + return FALSE; +} + +bool8 unref_sub_80572C4(u8 var) +{ + if (var == MB_B2) + return TRUE; + else + return FALSE; +} + +bool8 sub_80572D8(u8 var) +{ + if (var == MB_B5) + return TRUE; + else + return FALSE; +} + +bool8 sub_80572EC(u8 var) +{ + if (var == MB_C3) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057300(u8 var) +{ + if (var == MB_C2) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057314(u8 var) +{ + if (var == MB_B8) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057328(u8 var) +{ + if (var == MB_BE) + return TRUE; + else + return FALSE; +} + +bool8 sub_805733C(u8 var) +{ + if (var == MB_BD) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057350(u8 var) +{ + if (var == MB_BA) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057364(u8 var) +{ + if (var == MB_BF) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057378(u8 var) +{ + if (var == MB_C4) + return TRUE; + else + return FALSE; +} + +bool8 sub_805738C(u8 var) +{ + if (var == MB_C5) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_HasRipples(u8 var) +{ + if (var == MB_POND_WATER || var == MB_PUDDLE || var == MB_SOOTOPOLIS_DEEP_WATER) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPuddle(u8 var) +{ + if (var == MB_PUDDLE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsTallGrass(u8 var) +{ + if (var == MB_TALL_GRASS) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsLongGrass(u8 var) +{ + if (var == MB_LONG_GRASS) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsBerryTreeSoil(u8 var) +{ + if (var == MB_BERRY_TREE_SOIL) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsAshGrass(u8 var) +{ + if (var == MB_ASHGRASS) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsUnusedFootprintMetatile(u8 var) +{ + if (var == MB_25) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsBridge(u8 var) +{ + if (var >= MB_WARP_OR_BRIDGE && var <= MB_ROUTE120_NORTH_BRIDGE_2) + return TRUE; + else + return FALSE; +} + +u8 sub_8057450(u8 var) +{ + u8 result = var - MB_WARP_OR_BRIDGE; + + if (result > 3) + result = 0; + + return result; +} + +bool8 MetatileBehavior_IsLandWildEncounter(u8 var) +{ + if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) == FALSE && MetatileBehavior_IsEncounterTile(var) == TRUE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWaterWildEncounter(u8 var) +{ + if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) == TRUE && MetatileBehavior_IsEncounterTile(var) == TRUE) + return TRUE; + else + return FALSE; +} + +bool8 sub_80574C4(u8 var) +{ + if (var == MB_0B) + return TRUE; + else + return FALSE; +} + +bool8 sub_80574D8(u8 var) +{ + if (var == MB_MOUNTAIN_TOP) + return TRUE; + else + return FALSE; +} + +bool8 sub_80574EC(u8 var) +{ + if (var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER || var == MB_SOOTOPOLIS_DEEP_WATER) + return TRUE; + else + return FALSE; +} + +bool8 sub_805750C(u8 var) +{ + if (var == MB_NO_SURFACING || var == MB_SEAWEED_NO_SURFACING) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsShallowFlowingWater(u8 var) +{ + if (var == MB_SHALLOW_WATER || var == MB_STAIRS_OUTSIDE_ABANDONED_SHIP || var == MB_SHOAL_CAVE_ENTRANCE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsThinIce(u8 var) +{ + if (var == MB_THIN_ICE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsCrackedIce(u8 var) +{ + if (var == MB_CRACKED_ICE) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057568(u8 var) +{ + if (var == MB_OCEAN_WATER || var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER) + return TRUE; + else + return FALSE; +} + +bool8 unref_sub_8057584(u8 var) +{ + if (var == MB_18 || var == MB_1A) + return TRUE; + else + return FALSE; +} + +bool8 sub_805759C(u8 var) +{ + if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) && MetatileBehavior_IsWaterfall(var) == FALSE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsEastBlocked(u8 var) +{ + if (var == MB_IMPASSABLE_EAST || var == MB_IMPASSABLE_NORTHEAST || var == MB_IMPASSABLE_SOUTHEAST || var == MB_C1 || var == MB_BE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWestBlocked(u8 var) +{ + if (var == MB_IMPASSABLE_WEST || var == MB_IMPASSABLE_NORTHWEST || var == MB_IMPASSABLE_SOUTHWEST || var == MB_C1 || var == MB_BE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsNorthBlocked(u8 var) +{ + if (var == MB_IMPASSABLE_NORTH || var == MB_IMPASSABLE_NORTHEAST || var == MB_IMPASSABLE_NORTHWEST || var == MB_BED) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSouthBlocked(u8 var) +{ + if (var == MB_IMPASSABLE_SOUTH || var == MB_IMPASSABLE_SOUTHEAST || var == MB_IMPASSABLE_SOUTHWEST || var == MB_BED) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsShortGrass(u8 var) +{ + if (var == MB_SHORT_GRASS) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsHotSprings(u8 var) +{ + if (var == MB_HOT_SPRINGS) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWaterfall(u8 var) +{ + if (var == MB_WATERFALL) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsFortreeBridge(u8 var) +{ + if (var == MB_FORTREE_BRIDGE) + return TRUE; + else + return FALSE; +} + +bool8 sub_80576A0(u8 var) +{ + if (var == MB_PACIFIDLOG_VERTICAL_LOG_1) + return TRUE; + else + return FALSE; +} + +bool8 sub_80576B4(u8 var) +{ + if (var == MB_PACIFIDLOG_VERTICAL_LOG_2) + return TRUE; + else + return FALSE; +} + +bool8 sub_80576C8(u8 var) +{ + if (var == MB_PACIFIDLOG_HORIZONTAL_LOG_1) + return TRUE; + else + return FALSE; +} + +bool8 sub_80576DC(u8 var) +{ + if (var == MB_PACIFIDLOG_HORIZONTAL_LOG_2) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPacifidlogLog(u8 var) +{ + if (var >= MB_PACIFIDLOG_VERTICAL_LOG_1 && var <= MB_PACIFIDLOG_HORIZONTAL_LOG_2) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsTrickHousePuzzleDoor(u8 var) +{ + if (var == MB_TRICK_HOUSE_PUZZLE_DOOR) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsRegionMap(u8 var) +{ + if (var == MB_REGION_MAP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsClosedSootopolisGymDoor(u8 var) +{ + if (var == MB_CLOSED_SOOTOPOLIS_GYM_DOOR) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsRoulette(u8 var) +{ + if (var == MB_ROULETTE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPokeblockFeeder(u8 var) +{ + if (var == MB_POKEBLOCK_FEEDER) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_0xBB(u8 var) +{ + if (var == MB_BB) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_0xBC(u8 var) +{ + if (var == MB_BC) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8 var) +{ + if (var == MB_LAVARIDGE_GYM_B1F_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsLavaridge1FWarp(u8 var) +{ + if (var == MB_LAVARIDGE_GYM_1F_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsAquaHideoutWarp(u8 var) +{ + if (var == MB_AQUA_HIDEOUT_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSurfableFishableWater(u8 var) +{ + if (var == MB_POND_WATER || var == MB_OCEAN_WATER || var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER || var == MB_SOOTOPOLIS_DEEP_WATER || (var >= MB_EASTWARD_CURRENT && var <= MB_SOUTHWARD_CURRENT)) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsMtPyreHole(u8 var) +{ + if (var == MB_MT_PYRE_HOLE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsCrackedFloorHole(u8 var) +{ + if (var == MB_CRACKED_FLOOR_HOLE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsCrackedFloor(u8 var) +{ + if (var == MB_CRACKED_FLOOR) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsMuddySlope(u8 var) +{ + if (var == MB_MUDDY_SLOPE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsBumpySlope(u8 var) +{ + if (var == MB_BUMPY_SLOPE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsIsolatedVerticalRail(u8 var) +{ + if (var == MB_ISOLATED_VERTICAL_RAIL) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsIsolatedHorizontalRail(u8 var) +{ + if (var == MB_ISOLATED_HORIZONTAL_RAIL) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsVerticalRail(u8 var) +{ + if (var == MB_VERTICAL_RAIL) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsHorizontalRail(u8 var) +{ + if (var == MB_HORIZONTAL_RAIL) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSeaweed(u8 var) +{ + if (var == MB_SEAWEED || var == MB_SEAWEED_NO_SURFACING) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsRunningDisallowed(u8 var) +{ + if (var == MB_NO_RUNNING || var == MB_LONG_GRASS || var == MB_HOT_SPRINGS || MetatileBehavior_IsPacifidlogLog(var) != FALSE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsCuttableGrass(u8 var) +{ + if (var == MB_TALL_GRASS || var == MB_LONG_GRASS || var == MB_ASHGRASS || var == MB_LONG_GRASS_SOUTH_EDGE) + return TRUE; + else + return FALSE; +} + +bool8 sub_805791C(u8 var) +{ + if (var == MB_8E) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPictureBookShelf(u8 var) +{ + if (var == MB_PICTURE_BOOK_SHELF) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsBookShelf(u8 var) +{ + if (var == MB_BOOKSHELF) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPokeCenterBookShelf(u8 var) +{ + if (var == MB_POKEMON_CENTER_BOOKSHELF) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsVase(u8 var) +{ + if (var == MB_VASE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsTrashCan(u8 var) +{ + if (var == MB_TRASH_CAN) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsShopShelf(u8 var) +{ + if (var == MB_SHOP_SHELF) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsBlueprint(u8 var) +{ + if (var == MB_BLUEPRINT) + return TRUE; + else + return FALSE; +} diff --git a/src/field/money.c b/src/field/money.c new file mode 100644 index 000000000..5d9d0b689 --- /dev/null +++ b/src/field/money.c @@ -0,0 +1,275 @@ +#include "global.h" +#include "money.h" +#include "decompress.h" +#include "menu.h" +#include "sprite.h" +#include "string_util.h" + +#define SPRITE_TAG_MONEY (0x2722) + +extern u16 gSpecialVar_0x8005; + +static EWRAM_DATA u8 gUnknown_02038734 = 0; + +extern const struct CompressedSpriteSheet gUnknown_083CF584; +extern const struct CompressedSpritePalette gUnknown_083CF58C; +extern const struct SpriteTemplate gSpriteTemplate_83CF56C; + +bool8 IsEnoughMoney(u32 budget, u32 cost) +{ + if (budget >= cost) + { + return TRUE; + } + + return FALSE; +} + +void sub_80B79B8(u32 *arg0, u32 arg1) +{ + if (*arg0 > *arg0 + arg1) + { + *arg0 = 999999; + return; + } + + *arg0 = *arg0 + arg1; + if (*arg0 > 999999) + { + *arg0 = 999999; + } +} + +void sub_80B79E0(u32 *arg0, u32 arg1) +{ + if (*arg0 < arg1) + { + *arg0 = 0; + } + else + { + *arg0 = *arg0 - arg1; + } +} + +void sub_80B79F8(u8 *buffer, u32 arg1, u8 arg2) +{ + u8 width; + u8 i; + + if (arg1 > 999999) + { + width = 7; + } + else if (arg1 > 99999) + { + width = 6; + } + else if (arg1 > 10000) + { + width = 5; + } + else if (arg1 > 999) + { + width = 4; + } + else if (arg1 > 99) + { + width = 3; + } + else if (arg1 > 9) + { + width = 2; + } + else + { + width = 1; + } + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x14; + buffer[2] = 0x06; + buffer += 3; + + for (i = 0; i < arg2 - width; i++) + { + buffer[0] = CHAR_SPACE; + buffer += 1; + } + + buffer[0] = CHAR_CURRENCY; + buffer += 1; + + buffer = ConvertIntToDecimalString(buffer, arg1); + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x14; + buffer[2] = 0x00; + buffer[3] = EOS; +} + +void sub_80B7A94(u32 arg0, u8 size, u8 x, u8 y) +{ + u8 buffer[16]; + u8 stringWidth; + + sub_80B79F8(buffer, arg0, size); + stringWidth = sub_8072CA4(buffer); + + if (stringWidth >= (size + 1) * 8) + MenuPrint(buffer, x, y); + else + { + int xPlusOne = x + 1; + MenuPrint_PixelCoords(buffer, (xPlusOne + size) * 8 - stringWidth, y * 8, 1); + } +} + +void sub_80B7AEC(u32 arg0, u8 left, u8 top) +{ + u8 buffer[32]; + u8 *ptr; + + ptr = &buffer[0]; + + ptr[0] = CHAR_CURRENCY; + ptr++; + + ptr = ConvertIntToDecimalString(ptr, arg0); + + MenuPrint_RightAligned(buffer, left, top); + +#ifdef ENGLISH + ptr[0] = 0xFC; + ptr[1] = 0x14; + ptr[2] = 0x00; + ptr[3] = 0xFF; +#endif +} + +__attribute__((naked)) +void sub_80B7B34(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + sub sp, 0x4\n\ + mov r8, r0\n\ + adds r5, r1, 0\n\ + mov r9, r2\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + mov r1, r9\n\ + lsls r1, 8\n\ + mov r9, r1\n\ + ldr r4, _080B7BD8 @ =gDecoration10000_Gfx\n\ + adds r0, r1, r4\n\ + lsls r6, r5, 4\n\ + subs r6, r5\n\ + lsls r1, r6, 6\n\ + mov r3, r8\n\ + adds r3, 0x1\n\ + lsls r3, 5\n\ + ldr r2, _080B7BDC @ =0x06008000\n\ + adds r3, r2\n\ + adds r1, r3\n\ + movs r2, 0x20\n\ + str r3, [sp]\n\ + bl CpuFastSet\n\ + adds r4, 0x80\n\ + add r9, r4\n\ + adds r0, r5, 0x1\n\ + lsls r4, r0, 4\n\ + subs r4, r0\n\ + lsls r1, r4, 6\n\ + ldr r3, [sp]\n\ + adds r1, r3\n\ + mov r0, r9\n\ + movs r2, 0x20\n\ + bl CpuFastSet\n\ + movs r3, 0\n\ + lsls r5, 5\n\ + mov r0, r8\n\ + adds r7, r5, r0\n\ + lsls r6, 1\n\ + adds r6, 0x1\n\ + add r6, r8\n\ + ldr r1, _080B7BE0 @ =0xfffff000\n\ + adds r5, r1, 0\n\ + ldr r0, _080B7BE4 @ =0x0600f800\n\ + mov r12, r0\n\ + ldr r1, _080B7BE8 @ =0x0600f840\n\ + mov r9, r1\n\ + lsls r4, 1\n\ + adds r4, 0x1\n\ + add r4, r8\n\ +_080B7BAA:\n\ + adds r1, r7, r3\n\ + lsls r1, 1\n\ + mov r0, r12\n\ + adds r2, r1, r0\n\ + adds r0, r3, r6\n\ + adds r0, r5\n\ + strh r0, [r2]\n\ + add r1, r9\n\ + adds r0, r3, r4\n\ + adds r0, r5\n\ + strh r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x3\n\ + bls _080B7BAA\n\ + add sp, 0x4\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B7BD8: .4byte gDecoration10000_Gfx\n\ +_080B7BDC: .4byte 0x06008000\n\ +_080B7BE0: .4byte 0xfffff000\n\ +_080B7BE4: .4byte 0x0600f800\n\ +_080B7BE8: .4byte 0x0600f840\n\ + .syntax divided\n"); +} + +void sub_80B7BEC(u32 arg0, u8 x, u8 y) +{ + sub_80B7A94(arg0, 6, x + 6, y + 1); +} + +void sub_80B7C14(u32 arg0, u8 x, u8 y) +{ + MenuDrawTextWindow(x, y, x + 13, y + 3); + sub_80B7BEC(arg0, x, y); + + LoadCompressedObjectPic(&gUnknown_083CF584); + LoadCompressedObjectPalette(&gUnknown_083CF58C); + + gUnknown_02038734 = CreateSprite(&gSpriteTemplate_83CF56C, x * 8 + 19, y * 8 + 11, 0); +} + +void RemoveMoneyLabelObject(u8 x, u8 y) +{ + DestroySpriteAndFreeResources(&gSprites[gUnknown_02038734]); + FreeSpritePaletteByTag(SPRITE_TAG_MONEY); + MenuZeroFillWindowRect(x, y, x + 13, y + 3); +} + +bool8 sub_80B7CE8(void) +{ + return IsEnoughMoney(gSaveBlock1.money, gSpecialVar_0x8005); +} + +void sub_80B7D0C(void) +{ + sub_80B79E0(&gSaveBlock1.money, gSpecialVar_0x8005); +} diff --git a/src/field/party_menu.c b/src/field/party_menu.c new file mode 100644 index 000000000..1fcd2cdda --- /dev/null +++ b/src/field/party_menu.c @@ -0,0 +1,1505 @@ +#include "global.h" +#include "party_menu.h" +#include "battle.h" +#include "battle_interface.h" +#include "battle_party_menu.h" +#include "data2.h" +#include "event_data.h" +#include "item.h" +#include "item_use.h" +#include "mail_data.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "pokemon.h" +#include "pokemon_item_effect.h" +#include "pokemon_menu.h" +#include "pokemon_summary_screen.h" +#include "rom_8077ABC.h" +#include "rom_8094928.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "sprite.h" +#include "palette.h" +#include "event_data.h" +#include "main.h" +#include "item.h" +#include "battle_interface.h" +#include "species.h" +#include "party_menu.h" + +#define DATA_COUNT (6) + +struct Unk2001000 +{ + u8 unk0; + u8 unk1; + u8 unk2; +}; + +struct Unk201C000 +{ + /*0x00*/ struct Pokemon *pokemon; + /*0x04*/ u8 unk4; + /*0x05*/ u8 unk5; + /*0x06*/ u16 unk6; + /*0x08*/ u16 unk8; + /*0x0A*/ u8 pad_0A[2]; + /*0x0C*/ s32 unkC; + /*0x10*/ TaskFunc unk10; + /*0x14*/ TaskFunc unk14; +}; + +struct Unk201F000 +{ + u8 filler0[0xE00]; + u8 unkE00[3]; // not sure if this is an array or struct, or how big it is +}; + +struct UnknownStruct5 +{ + u8 unk0; + u8 unk1; + u16 *unk4; +}; + +extern u8 ewram[]; +#define ewram01000 (*(struct Unk2001000 *)(ewram + 0x01000)) +#define ewram1C000 (*(struct Unk201C000 *)(ewram + 0x1C000)) +#define ewram1F000 (*(struct Unk201F000 *)(ewram + 0x1F000)) + +extern u8 gUnknown_0202E8F4; +extern u8 gUnknown_0202E8F6; +extern u16 gUnknown_0202E8F8; +extern u8 gUnknown_0202E8FA; +extern u8 gLastFieldPokeMenuOpened; +extern u8 gPlayerPartyCount; +extern s32 gBattleMoveDamage; + +//extern const u16 gUnknown_083769A8[][6]; +//extern const u8 gUnknown_083769A8[][12]; +extern void *const gUnknown_08376858[][6]; +extern const u8 gUnknown_083769A8[]; +extern const u8 gUnknown_08376D1C[DATA_COUNT]; +extern const u16 gUnknown_08376504[]; +extern void (*const gUnknown_08376B54[])(u8); +extern const u8 *const gUnknown_08376D04[DATA_COUNT]; +extern const struct UnknownStruct5 gUnknown_08376BB4[][6]; + +static void sub_806E884(u8 taskId); + +/* +void sub_806AEDC(void) +{ + const struct UnknownStruct5 *r5; + s32 i; + + AnimateSprites(); + BuildOamBuffer(); + r5 = gUnknown_08376BB4[gUnknown_0202E8FA]; + for (i = 0; i < 6; i++) + sub_800142C(r5[i].unk0 * 8, r5[i].unk1 * 8, r5[i].unk4, 0, (i << 5) | 0x200); + RunTasks(); + UpdatePaletteFade(); +} +*/ + +#if ENGLISH +#define WINDOW_LEFT (3) +#define WINDOW_RIGHT (26) +#elif GERMAN +#define WINDOW_LEFT (0) +#define WINDOW_RIGHT (29) +#endif + +u8 sub_806E834(const u8 *message, u8 arg1) +{ + u8 taskId; + + gUnknown_0202E8F6 = 1; + + MenuDrawTextWindow(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + MenuPrintMessage(message, WINDOW_LEFT + 1, 15); + + taskId = CreateTask(sub_806E884, 1); + gTasks[taskId].data[0] = arg1; + + return taskId; +} + +static void sub_806E884(u8 taskId) +{ + if (MenuUpdateWindowText()) + { + gUnknown_0202E8F6 = 0; + if (gTasks[taskId].data[0] == 0) + MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + DestroyTask(taskId); + } +} + +void sub_806E8D0(u8 taskId, u16 b, TaskFunc c) +{ + ewram1C000.unk10 = c; + ewram1C000.unk4 = taskId; + ewram1C000.unk5 = sub_806CA38(taskId); + ewram1C000.unk6 = b; + ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; +} + +bool8 PartyMenuUpdateMonHeldItem(struct Pokemon *pkmn, u16 item) +{ + u8 itemData[2]; + + if (ItemIsMail(item) == TRUE) + { + if (GiveMailToMon(pkmn, item) == 0xFF) + return TRUE; + gUnknown_0202E8F4 = 2; + } + else + { + gUnknown_0202E8F4 = 1; + } + + itemData[0] = item; + itemData[1] = item >> 8; + SetMonData(pkmn, MON_DATA_HELD_ITEM, itemData); + return FALSE; +} + +void PartyMenuTryGiveMonHeldItem(u8 taskId, u16 newItem, TaskFunc c) +{ + u16 currentItem; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, newItem, c); + currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + gUnknown_0202E8F4 = 0; + gUnknown_0202E8F8 = 0; + if (currentItem != 0) + { + if (ItemIsMail(currentItem) == TRUE) + { + sub_806E834(gOtherText_MailMustBeRemoved, 1); + CreateTask(party_menu_link_mon_held_item_object, 5); + } + else + { + GetMonNickname(ewram1C000.pokemon, gStringVar1); + CopyItemName(currentItem, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyHolding); + sub_806E834(gStringVar4, 1); + CreateTask(Task_ConfirmGiveHeldItem, 5); + if (ItemIsMail(newItem) == TRUE) + gUnknown_0202E8F8 = currentItem; + } + } + else + { + PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, newItem); + RemoveBagItem(newItem, 1); + if (ItemIsMail(newItem)) + { + gTasks[taskId].func = c; + } + else + { + DisplayGiveHeldItemMessage(ewram1C000.unk5, newItem, 1); + CreateTask(party_menu_link_mon_held_item_object, 5); + } + } +} + +void party_menu_link_mon_held_item_object(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); + } +} + +void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId) +{ + s8 selection = ProcessMenuInputNoWrap_(); + + if (selection == 0) + { + u16 currentItem; + + MenuZeroFillWindowRect(23, 8, 29, 13); + currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + RemoveBagItem(ewram1C000.unk6, 1); + if (AddBagItem(currentItem, 1) == TRUE) + { + PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, ewram1C000.unk6); + if (ItemIsMail(ewram1C000.unk6)) + { + DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 1); + } + else + { + CopyItemName(ewram1C000.unk6, gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_TakenAndReplaced); + sub_806E834(gStringVar4, 1); + } + } + else + { + sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); + AddBagItem(ewram1C000.unk6, 1); + } + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(23, 8, 29, 13); + } + gTasks[taskId].func = party_menu_link_mon_held_item_object; +} + +void Task_ConfirmGiveHeldItem(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = PartyMenuTryGiveMonHeldItem_806EACC; + } +} + +void DisplayGiveHeldItemMessage(u8 a, u16 b, u8 c) +{ + GetMonNickname(&gPlayerParty[a], gStringVar1); + CopyItemName(b, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasGivenToHold); + sub_806E834(gStringVar4, c); +} + + +// Not sure about this one for now. +/* +void PartyMenuTryGiveMonMail(u8 taskId, TaskFunc func) +{ + u16 currentItem; + struct MailStruct *r4; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, 0, func); + currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + gUnknown_0202E8F4 = 0; + r4 = &gSaveBlock1.mail[ewram1F000.unkE00[0] + ewram1F000.unkE00[2]]; + if (currentItem != 0) + { + sub_806E834(gOtherText_PokeHoldingItemCantMail, 1); + CreateTask(party_menu_link_mon_held_item_object, 5); + } + else + { + GiveMailToMon2(ewram1C000.pokemon, r4); + ClearMailStruct(r4); + sub_806E834(gOtherText_MailTransferredMailbox, 1); + CreateTask(party_menu_link_mon_held_item_object, 5); + } +} +*/ +__attribute__((naked)) +void PartyMenuTryGiveMonMail(u8 taskId, TaskFunc func) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + adds r2, r1, 0\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + ldr r3, _0806ECA0 @ =gTasks\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 3\n\ + adds r1, r3\n\ + ldr r3, _0806ECA4 @ =TaskDummy\n\ + str r3, [r1]\n\ + movs r1, 0\n\ + bl sub_806E8D0\n\ + ldr r5, _0806ECA8 @ =0x0201c000\n\ + ldr r0, [r5]\n\ + movs r1, 0xC\n\ + bl GetMonData\n\ + lsls r0, 16\n\ + ldr r2, _0806ECAC @ =gUnknown_0202E8F4\n\ + movs r1, 0\n\ + strb r1, [r2]\n\ + movs r1, 0xF8\n\ + lsls r1, 6\n\ + adds r2, r5, r1\n\ + ldrb r1, [r2]\n\ + adds r1, 0x6\n\ + ldrb r2, [r2, 0x2]\n\ + adds r1, r2\n\ + lsls r2, r1, 3\n\ + adds r2, r1\n\ + lsls r2, 2\n\ + ldr r1, _0806ECB0 @ =gSaveBlock1 + 0x2B4C\n\ + adds r4, r2, r1\n\ + cmp r0, 0\n\ + beq _0806ECBC\n\ + ldr r0, _0806ECB4 @ =gOtherText_PokeHoldingItemCantMail\n\ + movs r1, 0x1\n\ + bl sub_806E834\n\ + ldr r0, _0806ECB8 @ =party_menu_link_mon_held_item_object\n\ + movs r1, 0x5\n\ + bl CreateTask\n\ + b _0806ECDA\n\ + .align 2, 0\n\ +_0806ECA0: .4byte gTasks\n\ +_0806ECA4: .4byte TaskDummy\n\ +_0806ECA8: .4byte 0x0201c000\n\ +_0806ECAC: .4byte gUnknown_0202E8F4\n\ +_0806ECB0: .4byte gSaveBlock1 + 0x2B4C\n\ +_0806ECB4: .4byte gOtherText_PokeHoldingItemCantMail\n\ +_0806ECB8: .4byte party_menu_link_mon_held_item_object\n\ +_0806ECBC:\n\ + ldr r0, [r5]\n\ + adds r1, r4, 0\n\ + bl GiveMailToMon2\n\ + adds r0, r4, 0\n\ + bl ClearMailStruct\n\ + ldr r0, _0806ECE0 @ =gOtherText_MailTransferredMailbox\n\ + movs r1, 0x1\n\ + bl sub_806E834\n\ + ldr r0, _0806ECE4 @ =party_menu_link_mon_held_item_object\n\ + movs r1, 0x5\n\ + bl CreateTask\n\ +_0806ECDA:\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806ECE0: .4byte gOtherText_MailTransferredMailbox\n\ +_0806ECE4: .4byte party_menu_link_mon_held_item_object\n\ + .syntax divided\n"); +} + +void PartyMenuTryGiveMonHeldItem_806ECE8(u8 taskId, TaskFunc func) +{ + u16 currentItem; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, 0, func); + currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + if (currentItem == 0) + { + StringExpandPlaceholders(gStringVar4, gOtherText_NotHoldingAnything); + sub_806E834(gStringVar4, 0); + CreateTask(party_menu_link_mon_held_item_object, 5); + } + else + { + u8 itemData[2]; + + itemData[0] = 0; + itemData[1] = 0; + if (AddBagItem(currentItem, 1) == TRUE) + { + if (ItemIsMail(currentItem) == TRUE) + TakeMailFromMon(ewram1C000.pokemon); + DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 0); + SetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM, itemData); + } + else + { + sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); + } + CreateTask(party_menu_link_mon_held_item_object, 5); + } +} + +void DisplayTakeHeldItemMessage(u8 a, u16 b, u8 c) +{ + GetMonNickname(&gPlayerParty[a], gStringVar1); + CopyItemName(b, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_ReceivedTheThingFrom); + sub_806E834(gStringVar4, c); +} + +void DoTakeMail(u8 taskId, TaskFunc func) +{ + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, 0, func); + ewram1C000.unk6 = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + sub_806E834(gOtherText_SendRemovedMailPrompt, 1); + CreateTask(Task_ConfirmTakeHeldMail, 5); +} + +void Task_LoseMailMessage(u8 taskId) +{ + s8 selection = ProcessMenuInputNoWrap_(); + + if (selection == 0) + { + if (AddBagItem(ewram1C000.unk6, 1) == TRUE) + { + TakeMailFromMon(ewram1C000.pokemon); + sub_806E834(gOtherText_MailTaken, 0); + } + else + { + sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); + } + MenuZeroFillWindowRect(23, 8, 29, 13); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(23, 8, 29, 13); + MenuZeroFillWindowRect(0, 14, 29, 19); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } +} + +void Task_ConfirmLoseMailMessage(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = Task_LoseMailMessage; + } +} + +void Task_TakeHeldMail(u8 taskId) +{ + s8 selection = ProcessMenuInputNoWrap_(); + + if (selection == 0) + { + MenuZeroFillWindowRect(23, 8, 29, 13); + if (TakeMailFromMon2(ewram1C000.pokemon) != 0xFF) + sub_806E834(gOtherText_MailWasSent, 0); + else + sub_806E834(gOtherText_MailboxIsFull, 0); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(23, 8, 29, 13); + sub_806E834(gOtherText_MailRemovedMessageLost, 1); + gTasks[taskId].func = Task_ConfirmLoseMailMessage; + } +} + +void Task_ConfirmTakeHeldMail(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = Task_TakeHeldMail; + } +} + +u16 ItemIdToBattleMoveId(u16 item) +{ + u16 moveId = item - 289; + + return gUnknown_08376504[moveId]; +} + +bool8 pokemon_has_move(struct Pokemon *pkmn, u16 move) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (GetMonData(pkmn, MON_DATA_MOVE1 + i) == move) + return TRUE; + } + return FALSE; +} + +void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func) +{ + PlaySE(SE_SELECT); + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, move, func); + CreateTask(Task_TeamMonTMMove, 5); +} + +void Task_TeamMonTMMove(u8 taskId) +{ + GetMonNickname(ewram1C000.pokemon, gStringVar1); + ewram1C000.unk8 = ItemIdToBattleMoveId(ewram1C000.unk6); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + ewram1B000.unk282 = 0; + if (pokemon_has_move(ewram1C000.pokemon, ewram1C000.unk8)) + { + StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyKnows); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } + else + { + if (!CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) + { + StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } + else + { + if (GiveMoveToMon(ewram1C000.pokemon, ewram1C000.unk8) != 0xFFFF) + { + Task_TeamMonTMMove2(taskId); + } + else + { + StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = sub_806F358; + } + } + } +} + +void Task_TeamMonTMMove2(u8 taskId) +{ + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); + sub_806E834(gStringVar4, 1); + AdjustFriendship(ewram1C000.pokemon, 4); + if (ewram1B000.unk282 == 0 && ewram1C000.unk6 <= 0x152) + RemoveBagItem(ewram1C000.unk6, 1); + gTasks[taskId].func = Task_TeamMonTMMove3; +} + +void Task_TeamMonTMMove3(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + PlayFanfare(BGM_FANFA1); + gTasks[taskId].func = Task_TeamMonTMMove4; + } +} + +void Task_TeamMonTMMove4(u8 taskId) +{ + if (IsFanfareTaskInactive()) + { + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); + if (ewram1B000.unk282 == 1) + { + sub_8070C54(taskId); + } + else + { + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); + } + } + } +} + +void sub_806F2FC(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); + if (ewram1B000.unk282 == 1) + { + sub_8070C54(taskId); + } + else + { + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); + } + } +} + +void sub_806F358(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = sub_806F390; + } +} + +void sub_806F390(u8 taskId) +{ + s8 selection = ProcessMenuInputNoWrap_(); + + if (selection == 0) + { + MenuZeroFillWindowRect(23, 8, 29, 13); + sub_806E834(gOtherText_WhichMoveToForget2, 1); + gTasks[taskId].func = sub_806F44C; + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + StopTryingToTeachMove_806F614(taskId); + } +} + +void sub_806F3FC(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_809D9F0(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8); + DestroyTask(taskId); + } +} + +void sub_806F44C(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_806F3FC; + } +} + +void TaughtMove(u8 taskId) +{ + if (!gPaletteFade.active) + { + u8 moveIndex; + u16 r4; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, gScriptItemId, sub_808B508); + moveIndex = sub_809FA30(); + r4 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + moveIndex); + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[r4]); + StringExpandPlaceholders(gStringVar4, gOtherText_ForgetMove123_2); + sub_806E834(gStringVar4, 1); + CreateTask(TMMoveUpdateMoveSlot, 5); + } +} + +void TMMoveUpdateMoveSlot(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + RemoveMonPPBonus(ewram1C000.pokemon, sub_809FA30()); + SetMonMoveSlot(ewram1C000.pokemon, ewram1C000.unk8, sub_809FA30()); + Task_TeamMonTMMove2(taskId); + } +} + +void StopTryingToTeachMove_806F588(u8 taskId) +{ + if (!gPaletteFade.active) + { + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, gScriptItemId, sub_808B508); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); + sub_806E834(gStringVar4, 1); + CreateTask(StopTryingToTeachMove_806F67C, 5); + } +} + +void StopTryingToTeachMove_806F614(u8 taskId) +{ + MenuZeroFillWindowRect(23, 8, 29, 13); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = StopTryingToTeachMove_806F67C; +} + +void StopTryingToTeachMove_806F67C(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = StopTryingToTeachMove_806F6B4; + } +} + +void StopTryingToTeachMove_806F6B4(u8 taskId) +{ + s8 selection = ProcessMenuInputNoWrap_(); + + if (selection == 0) + { + MenuZeroFillWindowRect(23, 8, 29, 13); + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_DidNotLearnMove2); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = sub_806F2FC; + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(23, 8, 29, 13); + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = sub_806F358; + } +} + +bool8 IsHMMove(u16 move) +{ + u8 i; + + for (i = 0; i < 8; i++) + { + if (gUnknown_08376504[50 + i] == move) + return TRUE; + } + return FALSE; +} + +s16 sub_806F7E8(u8 taskId, struct BattleInterfaceStruct1 *b, s8 c) +{ + s16 *taskData; + u8 hpBarLevel; + void *vramPtr; + + taskData = gTasks[taskId].data; + + b->unk0 = taskData[10]; + b->unk4 = taskData[11]; + b->unk8 = taskData[12] * c; + b->unk10 = 0x100; + hpBarLevel = GetHPBarLevel(ewram1B000.unk282, b->unk0); + if (hpBarLevel > 2) + b->unkC_0 = 4; + if (hpBarLevel == 2) + b->unkC_0 = 5; + if (hpBarLevel < 2) + b->unkC_0 = 6; + vramPtr = gUnknown_08376858[IsDoubleBattle()][ewram1C000.unk5]; + return sub_80460C8(b, &ewram1C000.unkC, vramPtr, 0); +} + +void sub_806F8AC(u8 taskId) +{ + struct BattleInterfaceStruct1 sp0; + u16 sp14; + + ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, -1); + if (ewram1B000.unk282 == -1) + { + ewram1C000.unkC = 0; + if (-sp0.unk8 + sp0.unk4 > sp0.unk0) + sp14 = sp0.unk0 - sp0.unk4; + else + sp14 = -sp0.unk8; + gBattleMoveDamage = -sp14; + GetMonNickname(ewram1C000.pokemon, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, sp14, 0, 3); + if (gTasks[taskId].data[14] == 0) + StringExpandPlaceholders(gStringVar4, gOtherText_HPRestoredBy); + else + StringExpandPlaceholders(gStringVar4, gOtherText_RegainedHealth); + SetMonIconAnim(GetMonIconSpriteId_maybe(ewram1C000.unk4, ewram1C000.unk5), ewram1C000.pokemon); + task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 7); + ewram1B000.unk261 = 2; + sub_806E834(gStringVar4, 1); + sp14 += sp0.unk4; + SetMonData(ewram1C000.pokemon, MON_DATA_HP, (u8 *)&sp14); + RemoveBagItem(ewram1C000.unk6, 1); + sub_8032638(); + gTasks[taskId].func = sub_806FB44; + } + else + { + PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); + } +} + +void sub_806FA18(u8 taskId) +{ + struct BattleInterfaceStruct1 sp0; + + ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, 1); + if (ewram1B000.unk282 == -1) + { + PlaySE(SE_KAIFUKU); + ewram1C000.unkC = 0; + gTasks[taskId].data[11] -= gTasks[taskId].data[12]; + SetMonData(ewram1C000.pokemon, MON_DATA_HP, (u8 *)&gTasks[taskId].data[11]); + SetMonIconAnim(GetMonIconSpriteId_maybe(ewram1C000.unk4, ewram01000.unk1), ewram1C000.pokemon); + ewram1C000.unk5 = gSprites[ewram01000.unk2].data0; + ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; + gTasks[taskId].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); + gTasks[taskId].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); + ewram1C000.unkC = -32768; + ewram1C000.unk14 = ewram1C000.unk10; + gTasks[taskId].func = sub_806F8AC; + ewram1B000.unk282 = gTasks[taskId].data[11]; + } + else + { + PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); + } +} + +void sub_806FB0C(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); + } +} + +void sub_806FB44(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + gTasks[ewram1C000.unk4].func = ewram1C000.unk14; + DestroyTask(taskId); + } +} + +bool8 IsHPRecoveryItem(u16 item) +{ + const u8 *itemEffect; + + if (item == 0xAF) + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; + else + itemEffect = gItemEffectTable[item - 13]; + + if (itemEffect[4] & 4) + return TRUE; + else + return FALSE; +} + +void PartyMenuUpdateLevelOrStatus(struct Pokemon *pkmn, u8 b) +{ + PartyMenuClearLevelStatusTilemap(b); + PartyMenuPrintMonLevelOrStatus(b, pkmn); +} + +void GetMedicineItemEffectMessage(u16 item) +{ + switch (GetItemEffectType(item)) + { + case 3: + StringExpandPlaceholders(gStringVar4, gOtherText_CuredPoisoning); + break; + case 4: + StringExpandPlaceholders(gStringVar4, gOtherText_WokeUp); + break; + case 5: + StringExpandPlaceholders(gStringVar4, gOtherText_BurnHealed); + break; + case 6: + StringExpandPlaceholders(gStringVar4, gOtherText_ThawedOut); + break; + case 7: + StringExpandPlaceholders(gStringVar4, gOtherText_CuredParalysis); + break; + case 8: + StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); + break; + case 9: + StringExpandPlaceholders(gStringVar4, gOtherText_GotOverLove); + break; + case 11: + StringExpandPlaceholders(gStringVar4, gOtherText_BecameHealthy); + break; + case 13: + StringCopy(gStringVar2, gOtherText_Hp2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 12: + StringCopy(gStringVar2, gOtherText_Attack); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 17: + StringCopy(gStringVar2, gOtherText_Defense); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 16: + StringCopy(gStringVar2, gOtherText_Speed); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 14: + StringCopy(gStringVar2, gOtherText_SpAtk2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 15: + StringCopy(gStringVar2, gOtherText_SpDef2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 19: + case 20: + StringExpandPlaceholders(gStringVar4, gOtherText_PPIncreased); + break; + case 21: + StringExpandPlaceholders(gStringVar4, gOtherText_PPRestored); + break; + default: + StringExpandPlaceholders(gStringVar4, gOtherText_WontHaveAnyEffect); + break; + } +} + +bool8 IsMedicineIneffective(struct Pokemon *pkmn, u16 item) +{ + if (GetItemEffectType(item) == 13 + && GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA) + return TRUE; + else + return FALSE; +} + +bool8 ExecuteTableBasedItemEffect__(u8 a, u16 b, u8 c) +{ + if (gMain.inBattle) + return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, sub_8094C20(a), c); + else + return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, a, c); +} + +void UseMedicine(u8 taskId, u16 item, TaskFunc func) +{ + u8 r7; + bool8 r9 = FALSE; + bool8 r0; + + gTasks[taskId].func = TaskDummy; + r7 = CreateTask(TaskDummy, 5); + sub_806E8D0(taskId, item, func); + if (!IsMedicineIneffective(ewram1C000.pokemon, item)) + { + r9 = IsHPRecoveryItem(item); + if (r9 == TRUE) + { + gTasks[r7].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); + gTasks[r7].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); + if (gTasks[r7].data[10] == gTasks[r7].data[11]) + { + r9 = FALSE; + gTasks[r7].data[10] = 0; + gTasks[r7].data[11] = 0; + } + } + r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, item, 0); + } + else + { + r0 = TRUE; + } + + if (r0) + { + gUnknown_0202E8F4 = 0; + PlaySE(SE_SELECT); + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + gTasks[r7].func = sub_806FB0C; + } + else + { + u8 statusAndPkrs; + + gUnknown_0202E8F4 = 1; + if (!IsBlueYellowRedFlute(item)) + PlaySE(SE_KAIFUKU); + else + PlaySE(SE_BIDORO); + statusAndPkrs = GetMonStatusAndPokerus(ewram1C000.pokemon); + if (statusAndPkrs == 6 || statusAndPkrs == 0) + PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); + if (r9 == TRUE) + { + gTasks[r7].data[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - gTasks[r7].data[11]; + ewram1C000.unkC = -32768; + if (gTasks[r7].data[11] == 0) + gTasks[r7].data[14] = 1; + else + gTasks[r7].data[14] = 0; + ewram1C000.unk14 = ewram1C000.unk10; + gTasks[r7].func = sub_806F8AC; + ewram1B000.unk282 = gTasks[r7].data[11]; + } + else + { + GetMonNickname(ewram1C000.pokemon, gStringVar1); + if (!IsBlueYellowRedFlute(item)) + RemoveBagItem(item, 1); + GetMedicineItemEffectMessage(item); + TryPrintPartyMenuMonNickname(ewram1C000.unk5, ewram1C000.pokemon); + sub_806E834(gStringVar4, 1); + gTasks[r7].func = sub_806FB0C; + } + } +} + +bool8 IsBlueYellowRedFlute(u16 item) +{ + if (item == 0x27 + || item == 0x29 + || item == 0x28) + return TRUE; + else + return FALSE; +} + +void sub_8070048(u8 taskId, u16 item, TaskFunc func) +{ + ewram1C000.unk10 = func; + ewram1C000.unk4 = taskId; + ewram1C000.unk6 = item; + ewram1C000.unk5 = 0; + ewram1C000.unk14 = sub_80701DC; + ewram1B000.unk27E = 0; + ewram1B000.unk280 = 0; + sub_8070088(taskId); +} + +void sub_8070088(u8 taskId) +{ + u8 taskId2; + + gTasks[taskId].func = TaskDummy; + if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) == 0) + { + gTasks[taskId].func = sub_80701DC; + } + else + { + s16 *taskData; + + taskId2 = CreateTask(TaskDummy, 5); + taskData = gTasks[taskId2].data; + ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; + taskData[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); + taskData[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); + if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, 0)) + { + DestroyTask(taskId2); + gTasks[taskId].func = sub_80701DC; + } + else + { + gUnknown_0202E8F4 = 1; + MenuZeroFillWindowRect(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); + ewram1B000.unk261 = 2; + taskData[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - taskData[11]; + taskData[14] = 1; + ewram1B000.unk27E = 1; + ewram1B000.unk280 = 1; + ewram1B000.unk282 = taskData[11]; + ewram1C000.unkC = -32768; + gTasks[taskId2].func = sub_806F8AC; + } + } +} + +void sub_80701DC(u8 taskId) +{ + if (ewram1B000.unk27E == 1) + { + AddBagItem(ewram1C000.unk6, 1); + if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) != 0) + { + task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 3); + ewram1B000.unk261 = 2; + } + ewram1B000.unk27E = 0; + } + ewram1C000.unk5++; + if (ewram1C000.unk5 == 6) + { + gUnknown_0202E8F4 = 0; + if (ewram1B000.unk280 == 0) + { + gTasks[taskId].func = TaskDummy; + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + CreateTask(sub_806FB0C, 8); + } + else + { + RemoveBagItem(ewram1C000.unk6, 1); + gTasks[taskId].func = ewram1C000.unk10; + } + gLastFieldPokeMenuOpened = 0; + } + else + { + sub_8070088(taskId); + } +} + +void CreateItemUseMoveMenu(u8 partyMonIndex) +{ + u8 r6; + u8 i; + + r6 = 0; + MenuDrawTextWindow(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); + if (move != 0) + r6++; + } + InitMenu(0, 20, 11, r6, 0, 9); +} + +void Task_HandleItemUseMoveMenuInput(u8 taskId) +{ + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + } + else if (gMain.newKeys & A_BUTTON) + { + gUnknown_08376B54[0](taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_08376B54[1](taskId); + } +} + +void DoPPRecoveryItemEffect(u8 taskId, u16 b, TaskFunc c) +{ + const u8 *itemEffect; + u8 taskId2; + + if (b == 0xAF) + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; + else + itemEffect = gItemEffectTable[b - 13]; + gTasks[taskId].func = TaskDummy; + taskId2 = CreateTask(TaskDummy, 5); + sub_806E8D0(taskId, b, c); + if (!(itemEffect[4] & 0x10)) + { + gTasks[taskId2].data[11] = 0; + DoRecoverPP(taskId2); + } + else + { + PlaySE(SE_SELECT); + sub_806D538(10, 3); + CreateItemUseMoveMenu(ewram1C000.unk5); + gTasks[taskId2].func = Task_HandleItemUseMoveMenuInput; + gMain.newKeys = 0; + } +} + +void ItemUseMoveMenu_HandleMoveSelection(u8 taskId) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(19, 10, 29, 19); + sub_806D5A4(); + gTasks[taskId].data[11] = GetMenuCursorPos(); + DoRecoverPP(taskId); +} + +void ItemUseMoveMenu_HandleCancel(u8 taskId) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(19, 10, 29, 19); + if (gMain.inBattle) + gTasks[ewram1C000.unk4].func = SetUpBattlePokemonMenu; + else + gTasks[ewram1C000.unk4].func = sub_808B0C0; + sub_806D538(3, 0); + DestroyTask(taskId); +} + +void DoRecoverPP(u8 taskId) +{ + u16 r5 = 0; + + if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, gTasks[taskId].data[11])) + { + gUnknown_0202E8F4 = r5; + PlaySE(SE_SELECT); + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + } + else + { + gUnknown_0202E8F4 = 1; + PlaySE(SE_KAIFUKU); + RemoveBagItem(ewram1C000.unk6, 1); + r5 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + gTasks[taskId].data[11]); + StringCopy(gStringVar1, gMoveNames[r5]); + GetMedicineItemEffectMessage(ewram1C000.unk6); + sub_806E834(gStringVar4, 1); + } + gTasks[taskId].func = sub_806FB0C; +} + +void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c) +{ + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, b, c); + PlaySE(SE_SELECT); + sub_806D538(11, 3); + CreateItemUseMoveMenu(ewram1C000.unk5); + CreateTask(Task_HandleItemUseMoveMenuInput, 5); + gMain.newKeys = 0; +} + +void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c) +{ + u8 i; + bool8 r0; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, b, c); + + if (GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL) != 100) + { + for (i = 0; i < 6; i++) + ewram1B000.unk264[i] = GetMonData(ewram1C000.pokemon, gUnknown_08376D1C[i]); + r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, b, 0); + } + else + r0 = TRUE; + + if (r0) + { + gUnknown_0202E8F4 = 0; + PlaySE(SE_SELECT); + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + CreateTask(sub_806FB0C, 5); + } + else + { + u8 level; + + gUnknown_0202E8F4 = 1; + PlayFanfareByFanfareNum(0); + sub_8070A20(ewram1C000.unk5, ewram1C000.pokemon); + RemoveBagItem(b, 1); + GetMonNickname(ewram1C000.pokemon, gStringVar1); + level = GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL); + ConvertIntToDecimalStringN(gStringVar2, level, 0, 3); + StringExpandPlaceholders(gStringVar4, gOtherText_ElevatedTo); + sub_806E834(gStringVar4, 1); + CreateTask(Task_RareCandy1, 5); + } +} + +void Task_RareCandy1(u8 taskId) +{ + if (WaitFanfare(0) && gUnknown_0202E8F6 == 0) + { + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + PlaySE(SE_SELECT); + sub_8070848(taskId); + gTasks[taskId].func = Task_RareCandy2; + } + } +} + +void Task_RareCandy2(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + PlaySE(SE_SELECT); + sub_8070968(taskId); + gTasks[taskId].func = Task_RareCandy3; + } +} + +#if ENGLISH +void sub_8070848(u8 taskId) +{ + u8 i; + + MenuDrawTextWindow(11, 0, 29, 7); + + for (i = 0; i < DATA_COUNT; i++) + { + u8 x; + u8 y; + u32 stat; + + stat = GetMonData(ewram1C000.pokemon, gUnknown_08376D1C[i]); + + ewram1B000.unk264[i + DATA_COUNT] = stat; + ewram1B000.unk264[i] = stat - ewram1B000.unk264[i]; + + x = (i / 3) * 9 + 11; + y = ((i % 3) << 1) + 1; + + MenuPrint_PixelCoords(gUnknown_08376D04[i], (x + 1) * 8, y * 8, 1); + + if (i == 2) + MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); + else + MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); + + gStringVar1[0] = EXT_CTRL_CODE_BEGIN; + gStringVar1[1] = 0x14; + gStringVar1[2] = 0x06; + + ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.unk264[i], 1, 2); + + MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); + } +} +#elif GERMAN +__attribute__((naked)) +void sub_8070848(u8 taskId) { + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + movs r0, 0xB\n\ + movs r1, 0\n\ + movs r2, 0x1D\n\ + movs r3, 0x7\n\ + bl MenuDrawTextWindow\n\ + movs r7, 0\n\ + ldr r0, _0807092C @ =gStringVar1\n\ + mov r10, r0\n\ + movs r1, 0xFC\n\ + mov r9, r1\n\ + movs r2, 0x13\n\ + mov r8, r2\n\ +_0807086C:\n\ + ldr r1, _08070930 @ =0x0201c000\n\ + ldr r0, [r1]\n\ + ldr r1, _08070934 @ =gUnknown_08376D1C\n\ + adds r1, r7, r1\n\ + ldrb r1, [r1]\n\ + bl GetMonData\n\ + adds r1, r7, 0x6\n\ + lsls r1, 1\n\ + ldr r2, _08070938 @ =0x0201b264\n\ + adds r1, r2, r1\n\ + strh r0, [r1]\n\ + lsls r6, r7, 1\n\ + adds r6, r2, r6\n\ + ldrh r1, [r6]\n\ + subs r0, r1\n\ + strh r0, [r6]\n\ + adds r0, r7, 0\n\ + movs r1, 0x3\n\ + bl __udivsi3\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, r0, 3\n\ + adds r4, r0\n\ + adds r4, 0xB\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + adds r0, r7, 0\n\ + movs r1, 0x3\n\ + bl __umodsi3\n\ + adds r5, r0, 0\n\ + lsls r5, 1\n\ + adds r5, 0x1\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + ldr r1, _0807093C @ =gUnknown_08376D04\n\ + lsls r0, r7, 2\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ + mov r0, r10\n\ + bl StringCopy\n\ + adds r2, r0, 0\n\ + mov r0, r9\n\ + strb r0, [r2]\n\ + adds r2, 0x1\n\ + mov r1, r8\n\ + strb r1, [r2]\n\ + adds r2, 0x1\n\ + movs r0, 0x2E\n\ + strb r0, [r2]\n\ + adds r2, 0x1\n\ + adds r0, r2, 0\n\ + ldr r1, _08070940 @ =gOtherText_TallPlusAndRightArrow\n\ + bl StringCopy\n\ + adds r2, r0, 0\n\ + mov r0, r9\n\ + strb r0, [r2]\n\ + adds r2, 0x1\n\ + mov r1, r8\n\ + strb r1, [r2]\n\ + adds r2, 0x1\n\ + movs r0, 0x34\n\ + strb r0, [r2]\n\ + adds r2, 0x1\n\ + movs r0, 0\n\ + ldrsh r1, [r6, r0]\n\ + adds r0, r2, 0\n\ + movs r2, 0x1\n\ + movs r3, 0x2\n\ + bl ConvertIntToDecimalStringN\n\ + adds r4, 0x1\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + mov r0, r10\n\ + adds r1, r4, 0\n\ + adds r2, r5, 0\n\ + bl MenuPrint\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + cmp r7, 0x5\n\ + bls _0807086C\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0807092C: .4byte gStringVar1\n\ +_08070930: .4byte 0x0201c000\n\ +_08070934: .4byte gUnknown_08376D1C\n\ +_08070938: .4byte 0x0201b264\n\ +_0807093C: .4byte gUnknown_08376D04\n\ +_08070940: .4byte gOtherText_TallPlusAndRightArrow\n\ + .syntax divided\n"); +} +#endif diff --git a/src/field/player_pc.c b/src/field/player_pc.c new file mode 100644 index 000000000..6d52c560a --- /dev/null +++ b/src/field/player_pc.c @@ -0,0 +1,1368 @@ +#include "global.h" +#include "player_pc.h" +#include "decoration.h" +#include "field_fadetransition.h" +#include "field_weather.h" +#include "item.h" +#include "item_menu.h" +#include "items.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "palette.h" +#include "script.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "songs.h" +#include "name_string_util.h" +#include "mail.h" +#include "rom4.h" +#include "player_pc.h" + +extern void DisplayItemMessageOnField(u8, const u8*, TaskFunc, u16); +extern void DoPlayerPCDecoration(u8); +extern void BuyMenuFreeMemory(void); +extern void DestroyVerticalScrollIndicator(u8); +extern void PauseVerticalScrollIndicator(u8); +extern void LoadScrollIndicatorPalette(void); +extern void ClearMailStruct(struct MailStruct *); +extern u8 sub_807D770(void); +extern void sub_808B020(void); +extern void sub_80F944C(void); + +static EWRAM_DATA u8 *gPcItemMenuOptionOrder = NULL; + +static u8 gPcItemMenuOptionsNum; + +extern u8 gUnknown_02038561; + +// event scripts +extern u8 gBrendanHouse_TurnPCOff[]; +extern u8 gMayHouse_TurnPCOff[]; + +extern void (*gFieldCallback)(void); + +static void InitPlayerPCMenu(u8 taskId); +static void PlayerPCProcessMenuInput(u8 taskId); +static void InitItemStorageMenu(u8); +static void ItemStorageMenuPrint(const u8 *); +static void ItemStorageMenuProcessInput(u8); +static void ItemStorage_ProcessInput(u8); +static void ItemStorage_SetItemAndMailCount(u8); +static void ItemStorage_DoItemAction(u8); +static void ItemStorage_GoBackToPlayerPCMenu(u8); +static void ItemStorage_HandleQuantityRolling(u8); +static void ItemStorage_DoItemWithdraw(u8); +static void ItemStorage_DoItemToss(u8); +static void ItemStorage_HandleRemoveItem(u8); +static void ItemStorage_WaitPressHandleResumeProcessInput(u8); +static void ItemStorage_HandleResumeProcessInput(u8); +static void ItemStorage_DoItemSwap(u8, bool8); +static void ItemStorage_DrawItemList(u8); +static void ItemStorage_PrintItemPcResponse(u16); +static void ItemStorage_DrawBothListAndDescription(u8); +static void ItemStorage_GoBackToItemPCMenu(u8, u8); +static void ItemStorage_LoadPalette(void); +static u8 GetMailboxMailCount(void); +static void Mailbox_UpdateMailList(void); +static void Mailbox_DrawMailboxMenu(u8); +static void Mailbox_ProcessInput(u8); +static void Mailbox_CloseScrollIndicators(void); +static void Mailbox_PrintWhatToDoWithPlayerMailText(u8); +static void Mailbox_TurnOff(u8); +static void Mailbox_PrintMailOptions(u8); +static void Mailbox_MailOptionsProcessInput(u8); +static void Mailbox_FadeAndReadMail(u8); +static void Mailbox_ReturnToFieldFromReadMail(void); +static void Mailbox_DrawYesNoBeforeMove(u8); +static void Mailbox_DoGiveMailPokeMenu(u8); +static void Mailbox_NoPokemonForMail(u8); +static void Mailbox_Cancel(u8); +static void Mailbox_DrawMailMenuAndDoProcessInput(u8); +static void PlayerPC_ItemStorage(u8 taskId); +static void PlayerPC_Mailbox(u8 taskId); +static void PlayerPC_Decoration(u8 var); +static void PlayerPC_TurnOff(u8 taskId); +static void ItemStorage_Withdraw(u8); +static void ItemStorage_Deposit(u8); +static void ItemStorage_Toss(u8); +static void ItemStorage_Exit(u8); +static void ItemStorage_ResumeInputFromYesToss(u8); +static void ItemStorage_ResumeInputFromNoToss(u8); +static void Mailbox_DoMailMoveToBag(u8); +static void Mailbox_ReturnToInputAfterNo(u8); +static void Mailbox_DoMailRead(u8); +static void Mailbox_MoveToBag(u8); +static void Mailbox_Give(u8); +static void Mailbox_Cancel(u8); + +static const u8 *const gPCText_OptionDescList[] = +{ + PCText_TakeOutItems, + PCText_StoreItems, + PCText_ThrowAwayItems, + gMenuText_GoBackToPrev +}; + +static const struct MenuAction2 gPCText_PlayerPCOptionsText[] = +{ + { SecretBaseText_ItemStorage, PlayerPC_ItemStorage }, + { gPCText_Mailbox, PlayerPC_Mailbox }, + { SecretBaseText_Decoration, PlayerPC_Decoration }, + { SecretBaseText_TurnOff, PlayerPC_TurnOff } +}; + +static const u8 gBedroomPC_OptionOrder[] = +{ + PLAYERPC_MENU_ITEMSTORAGE, + PLAYERPC_MENU_MAILBOX, + PLAYERPC_MENU_DECORATION, + PLAYERPC_MENU_TURNOFF +}; + +static const u8 gPlayerPC_OptionOrder[] = +{ + PLAYERPC_MENU_ITEMSTORAGE, + PLAYERPC_MENU_MAILBOX, + PLAYERPC_MENU_TURNOFF +}; + +static const struct MenuAction2 gPCText_ItemPCOptionsText[] = +{ + { PCText_WithdrawItem, ItemStorage_Withdraw }, + { PCText_DepositItem, ItemStorage_Deposit }, + { PCText_TossItem, ItemStorage_Toss }, + { gUnknownText_Exit, ItemStorage_Exit } +}; + +static const struct YesNoFuncTable ResumeFromTossYesNoFuncList[] = // ResumeFromTossYesNoFuncList +{ + ItemStorage_ResumeInputFromYesToss, + ItemStorage_ResumeInputFromNoToss +}; + +static const struct YesNoFuncTable ResumeFromWithdrawYesNoFuncList[] = // ResumeFromWithdrawYesNoFuncList +{ + Mailbox_DoMailMoveToBag, + Mailbox_ReturnToInputAfterNo +}; + +// the use of this struct is meant to be an ItemSlot struct, but NewGameInitPCItems refuses to match without a weird pointer access. +static const struct ItemSlot gNewGamePCItems[] = +{ + { ITEM_POTION, 1 }, + { ITEM_NONE, 0 } +}; + +static const struct MenuAction2 gMailboxMailOptions[] = +{ + { OtherText_Read, Mailbox_DoMailRead }, + { gOtherText_MoveToBag, Mailbox_MoveToBag }, + { OtherText_Give, Mailbox_Give }, + { gOtherText_CancelNoTerminator, Mailbox_Cancel } +}; + +static const u8 gNonSelectedItemFormattedText[] = _("{STR_VAR_1}{CLEAR_TO 80}"); +static const u8 gSelectedItemFormattedText[] = _("{COLOR RED}{STR_VAR_1}{CLEAR_TO 80}"); +static const u8 gNonSelectedItemQuantityFormatText[] = _("{STR_VAR_1}"); +static const u8 gSelectedItemQuantityFormatText[] = _("{COLOR RED}{STR_VAR_1}"); +static const u8 gUnknown_08406330[] = _("{CLEAR_TO 32}"); + +static const u16 gUnknown_08406334[3] = +{ + 0x5294, + 0x6B5A, + 0x7FFF +}; + +static const u8 gHighlightedMoveToBagFormatText[] = _("{COLOR RED}{STR_VAR_1}"); + +extern u8 *gUnknown_02039314; +extern struct MenuAction gUnknown_08406298[]; + +extern u8 gUnknown_084062B8[]; +extern u8 gUnknown_084062BC[]; +extern u8 gUnknown_0840632A[]; +extern u8 gUnknown_08406327[]; +extern u8 gUnknown_0840631E[]; +extern u8 gUnknown_08406318[]; + +extern u8 gUnknown_030007B4; +extern u8 unk_201FE00[]; + +extern u8 gUnknown_08152850; +extern u8 gUnknown_08152C75; + +extern u32 gUnknown_08406288[]; +extern const struct MenuAction gUnknown_084062C0[]; +extern const struct YesNoFuncTable gUnknown_084062E0; + +void NewGameInitPCItems(void) +{ + u8 i; + + // because Game Freak don't know how to use a struct or a 2d array + for(i = 0, ClearItemSlots(gSaveBlock1.pcItems, ARRAY_COUNT(gSaveBlock1.pcItems)); NEW_GAME_PC_ITEMS(i, ITEM_ID) && NEW_GAME_PC_ITEMS(i, QUANTITY) && + AddPCItem(NEW_GAME_PC_ITEMS(i, ITEM_ID), NEW_GAME_PC_ITEMS(i, QUANTITY)) == TRUE; i++) + ; +} + +void BedroomPC(void) +{ + gPcItemMenuOptionOrder = (u8 *)gBedroomPC_OptionOrder; + gPcItemMenuOptionsNum = 4; + DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); +} + +void PlayerPC(void) +{ + gPcItemMenuOptionOrder = (u8 *)gPlayerPC_OptionOrder; + gPcItemMenuOptionsNum = 3; + DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); +} + +static void InitPlayerPCMenu(u8 taskId) +{ + MenuDrawTextWindow(0, 0, 10, gPcItemMenuOptionsNum * 2 + 1); + PrintMenuItemsReordered(1, 1, gPcItemMenuOptionsNum, (struct MenuAction *)gPCText_PlayerPCOptionsText, gPcItemMenuOptionOrder); + InitMenu(0, 1, 1, gPcItemMenuOptionsNum, 0, 9); + TASK.FUNC = PlayerPCProcessMenuInput; +} + +static void PlayerPCProcessMenuInput(u8 taskId) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + } + else if (gMain.newKeys & A_BUTTON) + { + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + gPCText_PlayerPCOptionsText[gPcItemMenuOptionOrder[GetMenuCursorPos()]].func(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + gPCText_PlayerPCOptionsText[gPcItemMenuOptionsNum[gPcItemMenuOptionOrder - 1]].func(taskId); // run EXIT. + } +} + +void ReshowPlayerPC(u8 var) +{ + DisplayItemMessageOnField(var, gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); +} + +static void PlayerPC_ItemStorage(u8 taskId) +{ + InitItemStorageMenu(ITEMPC_MENU_WITHDRAW); + TASK.FUNC = ItemStorageMenuProcessInput; +} + +static void PlayerPC_Mailbox(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0, 10, 9); + gMailboxInfo.count = GetMailboxMailCount(); + + if (gMailboxInfo.count == 0) + DisplayItemMessageOnField(taskId, gOtherText_NoMailHere, ReshowPlayerPC, 0); + else + { + gMailboxInfo.cursorPos = 0; + gMailboxInfo.itemsAbove = 0; + Mailbox_UpdateMailList(); + ItemStorage_SetItemAndMailCount(taskId); + Mailbox_DrawMailboxMenu(taskId); + TASK.FUNC = Mailbox_ProcessInput; + } +} + +static void PlayerPC_Decoration(u8 var) +{ + MenuZeroFillWindowRect(0, 0, 10, 9); + DoPlayerPCDecoration(var); +} + +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); + + if (gSaveBlock2.playerGender == MALE) + ScriptContext1_SetupScript(gBrendanHouse_TurnPCOff); + else + ScriptContext1_SetupScript(gMayHouse_TurnPCOff); + } + else + { + MenuZeroFillWindowRect(0, 0, 10, 9); + EnableBothScriptContexts(); + } + DestroyTask(taskId); +} + +static void InitItemStorageMenu(u8 var) +{ + MenuZeroFillWindowRect(0, 0, 10, 9); + MenuDrawTextWindow(0, 0, 11, 9); + PrintMenuItems(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); +} + +static void ItemStorageMenuProcessInput(u8 var) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + ItemStorageMenuPrint(gPCText_OptionDescList[GetMenuCursorPos()]); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + ItemStorageMenuPrint(gPCText_OptionDescList[GetMenuCursorPos()]); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gPCText_ItemPCOptionsText[GetMenuCursorPos()].func(var); + } + else if (gMain.newKeys & B_BUTTON) + { + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + gPCText_ItemPCOptionsText[ITEMPC_MENU_EXIT].func(var); + } +} + +static void Task_ItemStorage_Deposit(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_80A6A30(); + DestroyTask(taskId); + } +} + +static void ItemStorage_Deposit(u8 taskId) +{ + TASK.FUNC = Task_ItemStorage_Deposit; + fade_screen(1, 0); +} + +static void ItemStorage_HandleReturnToProcessInput(u8 taskId) +{ + if (sub_807D770() == TRUE) + TASK.FUNC = ItemStorageMenuProcessInput; +} + +void ItemStorage_ReturnToMenuAfterDeposit(void) +{ + MenuDisplayMessageBox(); + InitItemStorageMenu(ITEMPC_MENU_DEPOSIT); + CreateTask(ItemStorage_HandleReturnToProcessInput, 0); + pal_fill_black(); +} + +static void ItemStorage_Withdraw(u8 taskId) +{ + s16 *data = TASK.data; + + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 11, 9); + NUM_ITEMS = CountUsedPCItemSlots(); + + if (NUM_ITEMS != 0) + { + MenuZeroFillWindowRect(0, 14, 29, 19); + CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_WITHDRAW; + PAGE_INDEX = 0; + ITEMS_ABOVE_TOP = 0; + ItemStorage_SetItemAndMailCount(taskId); + ItemStorage_GoBackToItemPCMenu(taskId, 0); + TASK.FUNC = ItemStorage_ProcessInput; + } + else + DisplayItemMessageOnField(taskId, gOtherText_NoItems, PlayerPC_ItemStorage, 0); +} + +static void ItemStorage_Toss(u8 taskId) +{ + s16 *data = TASK.data; + + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 11, 9); + NUM_ITEMS = CountUsedPCItemSlots(); + + if (NUM_ITEMS) + { + MenuZeroFillWindowRect(0, 14, 29, 19); + CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_TOSS; + PAGE_INDEX = 0; + ITEMS_ABOVE_TOP = 0; + ItemStorage_SetItemAndMailCount(taskId); + ItemStorage_GoBackToItemPCMenu(taskId, 2); + TASK.FUNC = ItemStorage_ProcessInput; + } + else + DisplayItemMessageOnField(taskId, gOtherText_NoItems, PlayerPC_ItemStorage, 0); +} + +static void ItemStorage_Exit(u8 var) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 11, 9); + ReshowPlayerPC(var); +} + +static void ItemStorage_SetItemAndMailCount(u8 taskId) +{ + s16 *data = TASK.data; + + if (NUM_ITEMS > 7) // we have a full page, so set the num of page items appropriately. + NUM_PAGE_ITEMS = 8; + else + NUM_PAGE_ITEMS = NUM_ITEMS + 1; // there are not enough items to fill a full page; take the # of items and add 1 for the cancel button. + + if (gMailboxInfo.count > 7) + gMailboxInfo.pageItems = 8; + else + gMailboxInfo.pageItems = gMailboxInfo.count + 1; +} + +static void ItemStorage_ProcessInput(u8 taskId) +{ + s16 *data = TASK.data; + s16 trueIndex; + + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if(PAGE_INDEX != 0) // did the cursor move physically upwards? + { + PlaySE(SE_SELECT); + PAGE_INDEX = MoveMenuCursor(-1); + trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; + if (SWITCH_MODE_ACTIVE == FALSE) // are we not currently switching items? + { + if (trueIndex == NUM_ITEMS) // if the cursor is on top of cancel, print the go back to prev description. + { + ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); + } + else + { + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); + } + } + } + else // the page cursor is at the top. but we may not be at the top of the true index list, so do another check. + { + if (ITEMS_ABOVE_TOP == 0) // did the cursor not move due to being at the top of the list? + return; + + PlaySE(SE_SELECT); + ITEMS_ABOVE_TOP--; + 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. + } + } + else if(gMain.newAndRepeatedKeys & DPAD_DOWN) // _0813A306 + { + if(PAGE_INDEX != NUM_PAGE_ITEMS - 1) + { + PlaySE(SE_SELECT); + PAGE_INDEX = MoveMenuCursor(1); + trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; + + if(SWITCH_MODE_ACTIVE != FALSE) + return; + + if (trueIndex == NUM_ITEMS) + ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); // probably further down + else + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); + } + else if(ITEMS_ABOVE_TOP + PAGE_INDEX != NUM_ITEMS) + { + PlaySE(SE_SELECT); + ITEMS_ABOVE_TOP++; + ItemStorage_DrawBothListAndDescription(taskId); + + if (SWITCH_MODE_ACTIVE != FALSE) + MoveMenuCursor(0); + } + } + else if(gMain.newKeys & SELECT_BUTTON) // _0813A3A0 + { + if (SWITCH_MODE_ACTIVE == FALSE) + { + if (PAGE_INDEX + ITEMS_ABOVE_TOP != NUM_ITEMS) // you cannot swap the Cancel button. + { + PlaySE(SE_SELECT); + SWITCH_MODE_ACTIVE = TRUE; + SWAP_ITEM_INDEX = ITEMS_ABOVE_TOP + PAGE_INDEX; + ItemStorage_PrintItemPcResponse(ITEMPC_SWITCH_WHICH_ITEM); + } + // _0813A3DC + ItemStorage_DrawItemList(taskId); + } + else // _0813A3E8 + { + PlaySE(SE_SELECT); + ItemStorage_DoItemSwap(taskId, FALSE); + ItemStorage_DrawBothListAndDescription(taskId); + } + } + else if(gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if(SWITCH_MODE_ACTIVE == FALSE) + { + if(ITEMS_ABOVE_TOP + PAGE_INDEX != NUM_ITEMS) + { + ItemStorage_DoItemAction(taskId); + } + else + { + ItemStorage_GoBackToPlayerPCMenu(taskId); + } + } + else + { + ItemStorage_DoItemSwap(taskId, FALSE); + ItemStorage_DrawBothListAndDescription(taskId); + } + } + else if(gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + if(SWITCH_MODE_ACTIVE == FALSE) + { + HandleDestroyMenuCursors(); + ItemStorage_GoBackToPlayerPCMenu(taskId); + } + else + { + ItemStorage_DoItemSwap(taskId, TRUE); + ItemStorage_DrawBothListAndDescription(taskId); + } + } +} + +static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId) +{ + BuyMenuFreeMemory(); + DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(1); + MenuZeroFillWindowRect(0, 0, 29, 19); + MenuDisplayMessageBox(); + InitItemStorageMenu(TASK.CURRENT_ITEM_STORAGE_MENU); + TASK.FUNC = ItemStorageMenuProcessInput; +} + +static void ItemStorage_DoItemAction(u8 taskId) +{ + s16 *data = TASK.data; + u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; + + PauseVerticalScrollIndicator(0); + PauseVerticalScrollIndicator(1); // PauseVerticalScrollIndicator + + if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW) + { + if(gSaveBlock1.pcItems[trueIndex].quantity == 1) + { + NUM_QUANTITY_ROLLER = 1; + ItemStorage_DoItemWithdraw(taskId); + return; + } + else // _0813A50C + { + ItemStorage_PrintItemPcResponse(ITEMPC_HOW_MANY_TO_WITHDRAW); + } + } + else if(gSaveBlock1.pcItems[trueIndex].quantity == 1) // _0813A518 + { + NUM_QUANTITY_ROLLER = 1; + ItemStorage_DoItemToss(taskId); + return; + } + else + { + ItemStorage_PrintItemPcResponse(ITEMPC_HOW_MANY_TO_TOSS); + } + NUM_QUANTITY_ROLLER = 1; + MenuDrawTextWindow(6, 8, 13, 11); + sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); + TASK.FUNC = ItemStorage_HandleQuantityRolling; +} + +static void ItemStorage_HandleQuantityRolling(u8 taskId) +{ + s16 *data = TASK.data; + u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; + + if(gMain.newAndRepeatedKeys & DPAD_UP) + { + if(NUM_QUANTITY_ROLLER != gSaveBlock1.pcItems[trueIndex].quantity) + NUM_QUANTITY_ROLLER++; + else + NUM_QUANTITY_ROLLER = 1; // you are at the max amount of items you have when you press Up, set your quantity back to 1. + + sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? + } + else if(gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if(NUM_QUANTITY_ROLLER != 1) + NUM_QUANTITY_ROLLER--; + else + NUM_QUANTITY_ROLLER = gSaveBlock1.pcItems[trueIndex].quantity; // you are at 0 when you press down, set your quantity to the amount you have. + + sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? + } + else if(gMain.newAndRepeatedKeys & DPAD_LEFT) // reduce by 10. + { + NUM_QUANTITY_ROLLER -= 10; + + if(NUM_QUANTITY_ROLLER <= 0) + NUM_QUANTITY_ROLLER = 1; // dont underflow or allow 0! + + sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? + } + else if(gMain.newAndRepeatedKeys & DPAD_RIGHT) // add 10. + { + NUM_QUANTITY_ROLLER += 10; + + if(NUM_QUANTITY_ROLLER > gSaveBlock1.pcItems[trueIndex].quantity) + NUM_QUANTITY_ROLLER = gSaveBlock1.pcItems[trueIndex].quantity; // dont overflow! + + sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? + } + else if(gMain.newKeys & A_BUTTON) // confirm quantity. + { + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(6, 6, 0xD, 0xB); + + if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW) + ItemStorage_DoItemWithdraw(taskId); + else + ItemStorage_DoItemToss(taskId); + } + else if(gMain.newKeys & B_BUTTON) // cancel quantity. + { + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(6, 6, 0xD, 0xB); + StartVerticalScrollIndicators(0); + StartVerticalScrollIndicators(1); + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); // why not use trueIndex? + TASK.FUNC = ItemStorage_ProcessInput; + } +} + +static void ItemStorage_DoItemWithdraw(u8 taskId) +{ + s16 *data = TASK.data; + u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; + + if(AddBagItem(gSaveBlock1.pcItems[trueIndex].itemId, NUM_QUANTITY_ROLLER) == TRUE) // add item works. + { + CopyItemName(gSaveBlock1.pcItems[trueIndex].itemId, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, NUM_QUANTITY_ROLLER, 0, 3); + ItemStorage_PrintItemPcResponse(ITEMPC_WITHDREW_THING); + TASK.FUNC = ItemStorage_HandleRemoveItem; + } + else + { + NUM_QUANTITY_ROLLER = 0; + ItemStorage_PrintItemPcResponse(ITEMPC_NO_MORE_ROOM); + TASK.FUNC = ItemStorage_WaitPressHandleResumeProcessInput; + } +} + +static void ItemStorage_DoItemToss(u8 taskId) +{ + s16 *data = TASK.data; + u8 var = PAGE_INDEX + ITEMS_ABOVE_TOP; + + if(ItemId_GetImportance(gSaveBlock1.pcItems[var].itemId) == FALSE) + { + CopyItemName(gSaveBlock1.pcItems[var].itemId, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, NUM_QUANTITY_ROLLER, 0, 3); + ItemStorage_PrintItemPcResponse(ITEMPC_OKAY_TO_THROW_AWAY); + DisplayYesNoMenu(7, 6, 1); + DoYesNoFuncWithChoice(taskId, (struct YesNoFuncTable *)&ResumeFromTossYesNoFuncList); + } + else + { + NUM_QUANTITY_ROLLER = 0; + ItemStorage_PrintItemPcResponse(ITEMPC_TOO_IMPORTANT); + TASK.FUNC = ItemStorage_HandleRemoveItem; + } +} + +static void ItemStorage_ResumeInputFromYesToss(u8 taskId) +{ + MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB); + ItemStorage_PrintItemPcResponse(ITEMPC_THREW_AWAY_ITEM); + TASK.FUNC = ItemStorage_HandleRemoveItem; +} + +static void ItemStorage_ResumeInputFromNoToss(u8 taskId) +{ + s16 *data = TASK.data; + + MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB); + InitMenu(0, 16, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); + StartVerticalScrollIndicators(0); + StartVerticalScrollIndicators(1); + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); + TASK.FUNC = ItemStorage_ProcessInput; +} + +static void ItemStorage_HandleRemoveItem(u8 taskId) +{ + s16 *data = TASK.data; + s16 oldNumItems; + + if(gMain.newKeys & A_BUTTON || gMain.newKeys == B_BUTTON) + { + RemovePCItem(PAGE_INDEX + ITEMS_ABOVE_TOP, NUM_QUANTITY_ROLLER); + oldNumItems = NUM_ITEMS; + NUM_ITEMS = CountUsedPCItemSlots(); + + if(oldNumItems != NUM_ITEMS && oldNumItems < NUM_PAGE_ITEMS + ITEMS_ABOVE_TOP && ITEMS_ABOVE_TOP != 0) + ITEMS_ABOVE_TOP--; + + ItemStorage_SetItemAndMailCount(taskId); + ItemStorage_HandleResumeProcessInput(taskId); + InitMenu(0, 16, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); + } +} + +static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId) +{ + s16 *data = TASK.data; + + if(gMain.newKeys & A_BUTTON || gMain.newKeys == B_BUTTON) + { + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); + StartVerticalScrollIndicators(0); + StartVerticalScrollIndicators(1); + TASK.FUNC = ItemStorage_ProcessInput; + } +} + +static void ItemStorage_HandleResumeProcessInput(u8 taskId) +{ + MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB); + StartVerticalScrollIndicators(0); + StartVerticalScrollIndicators(1); + ItemStorage_DrawBothListAndDescription(taskId); + TASK.FUNC = ItemStorage_ProcessInput; +} + +static void ItemStorage_DoItemSwap(u8 taskId, bool8 switchModeDisabled) +{ + s16 *data = TASK.data; + u8 trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; + + SWITCH_MODE_ACTIVE = FALSE; + + if((u8)NUM_ITEMS > trueIndex && (u8)SWAP_ITEM_INDEX != trueIndex && switchModeDisabled == FALSE) + { + struct ItemSlot itemSlot = gSaveBlock1.pcItems[SWAP_ITEM_INDEX]; // backup the itemSlot before swapping the two. + + gSaveBlock1.pcItems[SWAP_ITEM_INDEX] = gSaveBlock1.pcItems[trueIndex]; + gSaveBlock1.pcItems[trueIndex] = itemSlot; + return; + } + else if(trueIndex == NUM_ITEMS) + { + ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); + } + else + { + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); + } + + /* + THEORY: This check produces essentially dead code, but it might have been working in an earlier build + in which case it allows a programmer to easily duplicate items without the use of a debug menu. + This gets the page index of the swap index for some reason. It is currently unknown what it would have been used + for, but perhaps it was used to increase the quantity of the item without a debug menu. + With the removal of a lot of the debug menus close to release, a programmer may have added this to + help test things with a low key (such as planting a lot of duplicated berries, which requires this lazy "cheat") + without bringing the relevent debug menus back. The commented out line is intentionally left in below to show + what it may have looked like. + */ + if(SWAP_ITEM_INDEX - ITEMS_ABOVE_TOP <= 0) { // this check is arbitrary and used to generate the correct assembly using the subtraction, which is what matters. the 0 check doesn't. + //gSaveBlock1.pcItems[SWAP_ITEM_INDEX].quantity += 100; + gSaveBlock1.pcItems[SWAP_ITEM_INDEX].quantity += 0; // do not enforce item cap. + } +} + +static void ItemStorage_DrawItemQuantity(u16 arg1, enum StringConvertMode arg2, u8 arg3, u8 arg4, int isSwapSelected) +{ + sub_80A4164(gStringVar1, arg1, arg2, arg4); + + if(isSwapSelected != FALSE) + MenuPrint(gSelectedItemQuantityFormatText, 0x1A, arg3); + else + MenuPrint(gNonSelectedItemQuantityFormatText, 0x1A, arg3); +} + +static void ItemStorage_DrawItemVoidQuantity(u8 var) +{ + MenuPrint(gUnknown_08406330, 0x19, var); +} + +static void ItemStorage_DrawItemName(struct ItemSlot *itemSlot, u8 var, int isSwapSelected) +{ + CopyItemName(itemSlot->itemId, gStringVar1); + + if(isSwapSelected != FALSE) + MenuPrint(gSelectedItemFormattedText, 16, var); + else + MenuPrint(gNonSelectedItemFormattedText, 16, var); +} + +static void ItemStorage_DrawNormalItemEntry(struct ItemSlot *itemSlot, u8 var, int var2) +{ + ItemStorage_DrawItemName(itemSlot, var, var2); + ItemStorage_DrawItemQuantity(itemSlot->quantity, STR_CONV_MODE_RIGHT_ALIGN, var, 3, var2); +} + +static void ItemStorage_DrawKeyItemEntry(struct ItemSlot *itemSlot, u8 var, int var2) +{ + ItemStorage_DrawItemName(itemSlot, var, var2); + ItemStorage_DrawItemVoidQuantity(var); +} + +static void ItemStorage_DrawTMHMEntry(struct ItemSlot *itemSlot, u8 var, int var2) +{ + ItemStorage_DrawItemName(itemSlot, var, var2); + + if(itemSlot->itemId < ITEM_HM01) + ItemStorage_DrawItemQuantity(itemSlot->quantity, STR_CONV_MODE_RIGHT_ALIGN, var, 3, var2); + else + ItemStorage_DrawItemVoidQuantity(var); // HMs do not have a quantity. +} + +static void ItemStorage_DrawItemList(u8 taskId) +{ + s16 *data = TASK.data; + int tempArg; + 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++) + { + yCoord = (i - ITEMS_ABOVE_TOP) * 2; + + if(i != NUM_ITEMS) + { + tempArg = 0; + + if(SWITCH_MODE_ACTIVE != FALSE && i == SWAP_ITEM_INDEX) + tempArg = 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; + } + } + else + { + goto weirdCase; // what??? + } + } + +beforeLabel: + if(i - ITEMS_ABOVE_TOP < 8) + MenuFillWindowRectWithBlankTile(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 + NUM_PAGE_ITEMS <= NUM_ITEMS) + CreateVerticalScrollIndicators(1, 0xB8, 0x98); + else + DestroyVerticalScrollIndicator(1); +} + +static void ItemStorage_PrintItemPcResponse(u16 itemId) +{ + const u8 *string; + + switch(itemId) + { + case ITEMPC_GO_BACK_TO_PREV: + string = gMenuText_GoBackToPrev; + break; + case ITEMPC_HOW_MANY_TO_WITHDRAW: + string = gOtherText_HowManyToWithdraw; + break; + case ITEMPC_WITHDREW_THING: + string = gOtherText_WithdrewThing; + break; + case ITEMPC_HOW_MANY_TO_TOSS: + string = gOtherText_HowManyToToss; + break; + case ITEMPC_THREW_AWAY_ITEM: + string = gOtherText_ThrewAwayItem; + break; + case ITEMPC_NO_MORE_ROOM: + string = gOtherText_NoMoreRoom; + break; + case ITEMPC_TOO_IMPORTANT: + string = gOtherText_TooImportant; + break; + case ITEMPC_OKAY_TO_THROW_AWAY: + string = gOtherText_OkayToThrowAwayPrompt; + break; + case ITEMPC_SWITCH_WHICH_ITEM: + string = gOtherText_SwitchWhichItem; + break; + default: + string = ItemId_GetDescription(itemId); + break; + } + + sub_8072AB0(string, 8, 0x68, 0x68, 0x30, 1); +} + +static void ItemStorage_DrawBothListAndDescription(u8 taskId) +{ + s16 *data = TASK.data; + s16 trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; + + ItemStorage_DrawItemList(taskId); + + if(SWITCH_MODE_ACTIVE == FALSE) + { + if(trueIndex == NUM_ITEMS) + ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); + else + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); + } +} + +static void ItemStorage_GoBackToItemPCMenu(u8 taskId, u8 var) +{ + s16 *data = TASK.data; + + sub_80F944C(); + LoadScrollIndicatorPalette(); + ItemStorage_LoadPalette(); + MenuDrawTextWindow(0xF, 0, 0x1D, 0x13); + MenuDrawTextWindow(0, 0xC, 0xE, 0x13); + MenuDrawTextWindow(0, 0, 0xB, 3); + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[0].itemId); + MenuPrint(gPCText_ItemPCOptionsText[var].text, 1, 1); + ItemStorage_DrawItemList(taskId); + InitMenu(0, 0x10, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); +} + +static void ItemStorage_LoadPalette(void) +{ + u16 arr[3]; + + memcpy(arr, gUnknown_08406334, sizeof(arr)); + LoadPalette(&arr[2], 0xDF, 2); + LoadPalette(&arr[1], 0xD1, 2); + LoadPalette(&arr[0], 0xD8, 2); +} + +static u8 GetMailboxMailCount(void) +{ + u8 i, j; + + for(i = 0, j = 6; j < 16; j++) + if(gSaveBlock1.mail[j].itemId != 0) + i++; + + return i; +} + +static void Mailbox_UpdateMailList(void) +{ + struct MailStruct mailBuffer; + u8 i, j; + + for (i=6; i<15; i++) + { + for (j=i+1; j<16; j++) + { + if (gSaveBlock1.mail[i].itemId == 0) + { + mailBuffer = gSaveBlock1.mail[i]; + gSaveBlock1.mail[i] = gSaveBlock1.mail[j]; + gSaveBlock1.mail[j] = mailBuffer; + } + } + } +} + +// WWHHHHHYYYYYYYY SOMEBODY PLEASE FIX THIS +static void Mailbox_DrawMailList(u8 taskId) // taskId is unused +{ + u16 yCoord = 0; + u16 i = gMailboxInfo.itemsAbove; + register struct MailboxStruct *tempMailbox asm("r1") = &gMailboxInfo; + register struct MailboxStruct *mailbox asm("r6"); + + if(i < i + tempMailbox->pageItems) + { + 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) + { + StringCopy(gStringVar1, (u8 *)gSaveBlock1.mail[i + 6].playerName); + SanitizeNameString(gStringVar1); + MenuPrint(gStringVar1, 0x15, yCoord + 2); + } + else + { + goto weirdCase; // again, what??? + } + } + } + +beforeLabel: + if(i - gMailboxInfo.itemsAbove != 8) + MenuFillWindowRectWithBlankTile(0x15, yCoord + 4, 0x1C, 0x12); + + switch(gMailboxInfo.itemsAbove) + { + default: + CreateVerticalScrollIndicators(0, 0xC8, 8); + break; +weirdCase: + MenuPrint(gOtherText_CancelNoTerminator, 0x15, yCoord + 2); + goto beforeLabel; + case 0: + DestroyVerticalScrollIndicator(0); + break; + } + + if(gMailboxInfo.itemsAbove + gMailboxInfo.pageItems <= gMailboxInfo.count) + CreateVerticalScrollIndicators(1, 0xC8, 0x98); + else + DestroyVerticalScrollIndicator(1); +} + +static void Mailbox_DrawMailboxMenu(u8 taskId) +{ + sub_80F944C(); + LoadScrollIndicatorPalette(); + MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); + MenuDrawTextWindow(0, 0, 0x8, 0x3); + MenuPrint(gPCText_Mailbox, 1, 1); + MenuDrawTextWindow(0x14, 0, 0x1D, 0x13); + Mailbox_DrawMailList(taskId); + InitMenu(0, 0x15, 2, gMailboxInfo.pageItems, gMailboxInfo.cursorPos, 8); +} + +// Mailbox_ProcessInput +static void Mailbox_ProcessInput(u8 taskId) +{ + if(!gPaletteFade.active) + { + if(gMain.newAndRepeatedKeys & DPAD_UP) + { + if(gMailboxInfo.cursorPos != 0) + { + PlaySE(SE_SELECT); + gMailboxInfo.cursorPos = MoveMenuCursor(-1); + } + else if(gMailboxInfo.itemsAbove != 0) + { + PlaySE(SE_SELECT); + gMailboxInfo.itemsAbove--; + Mailbox_DrawMailList(taskId); + } + } + else if(gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if(gMailboxInfo.cursorPos != gMailboxInfo.pageItems - 1) + { + PlaySE(SE_SELECT); + gMailboxInfo.cursorPos = MoveMenuCursor(1); + } + else if(gMailboxInfo.itemsAbove + gMailboxInfo.cursorPos != gMailboxInfo.count) + { + PlaySE(SE_SELECT); + gMailboxInfo.itemsAbove++; + Mailbox_DrawMailList(taskId); + } + } + else if(gMain.newKeys & A_BUTTON) + { + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + + if(gMailboxInfo.itemsAbove + gMailboxInfo.cursorPos == gMailboxInfo.count) + { + Mailbox_TurnOff(taskId); + } + else + { + Mailbox_CloseScrollIndicators(); + TASK.FUNC = Mailbox_PrintWhatToDoWithPlayerMailText; + } + } + else if(gMain.newKeys & B_BUTTON) + { + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + Mailbox_TurnOff(taskId); + } + } +} + +static void Mailbox_CloseScrollIndicators(void) +{ + BuyMenuFreeMemory(); + DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(1); +} + +static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); + StringCopy(gStringVar1, gSaveBlock1.mail[gMailboxInfo.itemsAbove + 6 + gMailboxInfo.cursorPos].playerName); + SanitizeNameString(gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_WhatWillYouDoMail); + DisplayItemMessageOnField(taskId, gStringVar4, Mailbox_PrintMailOptions, 0); +} + +static void Mailbox_ReturnToPlayerPC(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); + ReshowPlayerPC(taskId); +} + +static void Mailbox_TurnOff(u8 taskId) +{ + Mailbox_CloseScrollIndicators(); + TASK.FUNC = Mailbox_ReturnToPlayerPC; +} + +static void Mailbox_PrintMailOptions(u8 taskId) // Mailbox_PrintMailOptions +{ + MenuDrawTextWindow(0, 0, 0xC, 0x9); + PrintMenuItems(1, 1, 4, (struct MenuAction *)gMailboxMailOptions); + InitMenu(0, 1, 1, 4, 0, 0xB); + TASK.FUNC = Mailbox_MailOptionsProcessInput; +} + +static void Mailbox_MailOptionsProcessInput(u8 taskId) +{ + if(gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + } + else if(gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + } + else if(gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gMailboxMailOptions[GetMenuCursorPos()].func(taskId); + } + else if(gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + Mailbox_Cancel(taskId); + } +} + +static void Mailbox_DoMailRead(u8 taskId) +{ + fade_screen(1, 0); + TASK.FUNC = Mailbox_FadeAndReadMail; +} + +static void Mailbox_FadeAndReadMail(u8 taskId) +{ + if(!gPaletteFade.active) + { + HandleReadMail(&gSaveBlock1.mail[gMailboxInfo.itemsAbove + 6 + gMailboxInfo.cursorPos], Mailbox_ReturnToFieldFromReadMail, 1); + DestroyTask(taskId); + } +} + +static void Mailbox_HandleReturnToProcessInput(u8 taskId) // Mailbox_HandleReturnToProcessInput +{ + if(sub_807D770() == TRUE) // is black fade finished? why not gPaletteFade.active? + TASK.FUNC = Mailbox_ProcessInput; +} + +static void Mailbox_DoRedrawMailboxMenuAfterReturn(void) +{ + Mailbox_DrawMailboxMenu(CreateTask(Mailbox_HandleReturnToProcessInput, 0)); + pal_fill_black(); +} + +static void Mailbox_ReturnToFieldFromReadMail(void) +{ + gFieldCallback = Mailbox_DoRedrawMailboxMenuAfterReturn; + SetMainCallback2(c2_exit_to_overworld_2_switch); +} + +static void Mailbox_MoveToBag(u8 taskId) +{ + HandleDestroyMenuCursors(); + StringCopy(gStringVar1, gOtherText_MoveToBag); + MenuPrint(gHighlightedMoveToBagFormatText, 1, 3); // gHighlightedMoveToBagFormatText + DisplayItemMessageOnField(taskId, gOtherText_MessageWillBeLost, Mailbox_DrawYesNoBeforeMove, 0); +} + +static void Mailbox_DrawYesNoBeforeMove(u8 taskId) +{ + DisplayYesNoMenu(0x14, 0x8, 0x1); + DoYesNoFuncWithChoice(taskId, (struct YesNoFuncTable *)&ResumeFromWithdrawYesNoFuncList); +} + +static void Mailbox_DoMailMoveToBag(u8 taskId) +{ + struct MailStruct *mail = &gSaveBlock1.mail[gMailboxInfo.itemsAbove + 6 + gMailboxInfo.cursorPos]; + + MenuZeroFillWindowRect(0x14, 8, 0x1A, 0xD); + + if(AddBagItem(mail->itemId, 1) == FALSE) + { + DisplayItemMessageOnField(taskId, gOtherText_BagIsFull, Mailbox_DrawMailMenuAndDoProcessInput, 0); + } + else + { + DisplayItemMessageOnField(taskId, gOtherText_MailWasReturned, Mailbox_DrawMailMenuAndDoProcessInput, 0); + ClearMailStruct(mail); + Mailbox_UpdateMailList(); + + gMailboxInfo.count--; + + if(gMailboxInfo.count < gMailboxInfo.pageItems + gMailboxInfo.itemsAbove && gMailboxInfo.itemsAbove != 0) + gMailboxInfo.itemsAbove--; + + ItemStorage_SetItemAndMailCount(taskId); + } +} + +static void Mailbox_ReturnToInputAfterNo(u8 taskId) // Mailbox_ReturnToInputAfterNo +{ + MenuZeroFillWindowRect(0x14, 0x8, 0x1A, 0xD); + Mailbox_DrawMailMenuAndDoProcessInput(taskId); +} + +static void Mailbox_Give(u8 taskId) +{ + if(CalculatePlayerPartyCount() == 0) + Mailbox_NoPokemonForMail(taskId); // cannot be reached normally + else + { + fade_screen(1, 0); + TASK.FUNC = Mailbox_DoGiveMailPokeMenu; + } +} + +static void Mailbox_DoGiveMailPokeMenu(u8 taskId) // Mailbox_DoGiveMailPokeMenu +{ + if(!gPaletteFade.active) + { + SetMainCallback2(sub_808B020); + gUnknown_02038561 = 3; + DestroyTask(taskId); + } +} + +static void Mailbox_UpdateMailListAfterDeposit(void) +{ + u8 taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0); + u8 oldCount = gMailboxInfo.count; + + gMailboxInfo.count = GetMailboxMailCount(); + Mailbox_UpdateMailList(); + + if(oldCount != gMailboxInfo.count && gMailboxInfo.count < gMailboxInfo.pageItems + gMailboxInfo.itemsAbove && gMailboxInfo.itemsAbove != 0) // did the count update? + gMailboxInfo.itemsAbove--; + + ItemStorage_SetItemAndMailCount(taskId); + Mailbox_DrawMailboxMenu(taskId); + pal_fill_black(); +} + +void Mailbox_ReturnToMailListAfterDeposit(void) +{ + gFieldCallback = Mailbox_UpdateMailListAfterDeposit; + SetMainCallback2(c2_exit_to_overworld_2_switch); +} + +// you always have at least 1 POKeMON and you cannot receive mail before you leave Littleroot: therefore this function cannot be reached normally. +static void Mailbox_NoPokemonForMail(u8 taskId) +{ + DisplayItemMessageOnField(taskId, gOtherText_NoPokemon, Mailbox_DrawMailMenuAndDoProcessInput, 0); +} + +static void Mailbox_Cancel(u8 taskId) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 0xC, 0x9); + Mailbox_DrawMailMenuAndDoProcessInput(taskId); +} + +static void Mailbox_DrawMailMenuAndDoProcessInput(u8 taskId) +{ + Mailbox_DrawMailboxMenu(taskId); + TASK.FUNC = Mailbox_ProcessInput; +} diff --git a/src/field/pokeblock.c b/src/field/pokeblock.c new file mode 100644 index 000000000..775280f6e --- /dev/null +++ b/src/field/pokeblock.c @@ -0,0 +1,1134 @@ +// +// Created by scott on 6/27/2017. +// + +#include "global.h" +#include "rom4.h" +#include "sprite.h" +#include "script.h" +#include "strings.h" +#include "task.h" +#include "unknown_task.h" +#include "text.h" +#include "main.h" +#include "menu.h" +#include "field_fadetransition.h" +#include "palette.h" +#include "graphics.h" +#include "decompress.h" +#include "menu_helpers.h" +#include "battle.h" +#include "item_menu.h" +#include "item_use.h" +#include "item.h" +#include "items.h" +#include "sound.h" +#include "songs.h" +#include "safari_zone.h" +#include "use_pokeblock.h" +#include "event_data.h" +#include "pokeblock.h" + +struct UnkPokeblockStruct +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; +}; + +extern u8 ewram[]; + + +static EWRAM_DATA u8 gUnknown_02039244 = 0; +static EWRAM_DATA struct UnkPokeblockStruct gUnknown_02039248 = {0}; +static EWRAM_DATA u8 gUnknown_0203924C = 0; + +// function declarations + +// gUnknown_083F7EF4 +static void sub_810C508(u8); +static void sub_810C5C0(u8); +static void sub_810C748(u8); +static void sub_810C788(u8); +static void sub_810C854(u8); + +// gUnknown_083F7F24 +static void sub_810C610(u8); +static void sub_810C668(u8); + +// sub_810B6C0 +static bool8 sub_810B998(void); +static void sub_810BC98(void); +static void sub_810BD08(void); +static void sub_810BB0C(void); +static void sub_810BB30(void); +static void sub_810BC84(u8); + +// sub_810B96C +static void sub_810BF7C(u8); + +// sub_810BC84 +static void sub_810BDAC(bool8); + +// sub_810BF38 +static void sub_810C8D4(struct Sprite *); + +// sub_810BF7C +static void sub_810C0C8(u8); +static void sub_810C31C(u8); +static void sub_810C368(u8); + +// sub_810C0C8 +static void sub_810C1C8(u8, u8); +static void sub_810C23C(u8); + +// sub_810C368 +static void sub_810C40C(u8); + +// sub_810C540 +static void sub_810C5EC(u8); + +// sub_810C610 +static void sub_810C704(u8); + +static const u8 *gUnknown_03000758; + +// rodata + +#define GFX_TAG_POKEBLOCK_CASE 14800 + +const s8 gPokeblockFlavorCompatibilityTable[] = { + // Cool, Beauty, Cute, Smart, Tough + 0, 0, 0, 0, 0, // Hardy + 1, 0, 0, 0, -1, // Lonely + 1, 0, -1, 0, 0, // Brave + 1, -1, 0, 0, 0, // Adamant + 1, 0, 0, -1, 0, // Naughty + -1, 0, 0, 0, 1, // Bold + 0, 0, 0, 0, 0, // Docile + 0, 0, -1, 0, 1, // Relaxed + 0, -1, 0, 0, 1, // Impish + 0, 0, 0, -1, 1, // Lax + -1, 0, 1, 0, 0, // Timid + 0, 0, 1, 0, -1, // Hasty + 0, 0, 0, 0, 0, // Serious + 0, -1, 1, 0, 0, // Jolly + 0, 0, 1, -1, 0, // Naive + -1, 1, 0, 0, 0, // Modest + 0, 1, 0, 0, -1, // Mild + 0, 1, -1, 0, 0, // Quiet + 0, 0, 0, 0, 0, // Bashful + 0, 1, 0, -1, 0, // Rash + -1, 0, 0, 1, 0, // Calm + 0, 0, 0, 1, -1, // Gentle + 0, 0, -1, 1, 0, // Sassy + 0, -1, 0, 1, 0, // Careful + 0, 0, 0, 0, 0 // Quirky +}; + +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[] = { + NULL, + ContestStatsText_RedPokeBlock, + ContestStatsText_BluePokeBlock, + ContestStatsText_PinkPokeBlock, + ContestStatsText_GreenPokeBlock, + ContestStatsText_YellowPokeBlock, + ContestStatsText_PurplePokeBlock, + ContestStatsText_IndigoPokeBlock, + ContestStatsText_BrownPokeBlock, + ContestStatsText_LiteBluePokeBlock, + ContestStatsText_OlivePokeBlock, + ContestStatsText_GrayPokeBlock, + ContestStatsText_BlackPokeBlock, + ContestStatsText_WhitePokeBlock, + ContestStatsText_GoldPokeBlock +}; + +const struct MenuAction2 gUnknown_083F7EF4[] = { + {OtherText_Use, sub_810C508}, + {OtherText_Toss, sub_810C5C0}, + {gOtherText_CancelNoTerminator, sub_810C748}, + {OtherText_Use, sub_810C788}, + {OtherText_Use, sub_810C854}, +}; + +const u8 gUnknown_083F7F1C[] = {0, 1, 2}; +const u8 gUnknown_083F7F1F[] = {3, 2}; +const u8 gUnknown_083F7F21[] = {4, 2}; + +const struct YesNoFuncTable gUnknown_083F7F24 = {sub_810C610, sub_810C668}; + +const u8 UnreferencedData_083F7F2C[] = {0x16, 0x17, 0x18, 0x21, 0x2f}; + +const struct OamData gOamData_83F7F34 = { + .size = 3, + .priority = 2 +}; + +const union AnimCmd gSpriteAnim_83F7F3C[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 0), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83F7F44[] = { + gSpriteAnim_83F7F3C +}; + +const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = { + AFFINEANIMCMD_FRAME(0, 0, -2, 2), + AFFINEANIMCMD_FRAME(0, 0, 2, 4), + AFFINEANIMCMD_FRAME(0, 0, -2, 4), + AFFINEANIMCMD_FRAME(0, 0, 2, 2), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] = { + gSpriteAffineAnim_83F7F48 +}; + +const struct CompressedSpriteSheet gUnknown_083F7F74 = { + gMenuPokeblockDevice_Gfx, + 0x800, + GFX_TAG_POKEBLOCK_CASE +}; + +const struct CompressedSpritePalette gUnknown_083F7F7C = { + gMenuPokeblockDevice_Pal, + GFX_TAG_POKEBLOCK_CASE +}; + +const struct SpriteTemplate gSpriteTemplate_83F7F84 = { + GFX_TAG_POKEBLOCK_CASE, + GFX_TAG_POKEBLOCK_CASE, + &gOamData_83F7F34, + gSpriteAnimTable_83F7F44, + NULL, + gDummySpriteAffineAnimTable, + 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} +}; + +// text + +static void sub_810B674(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); +} + +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]); +} + +static bool8 sub_810B6C0(void) +{ + u16 ime; + switch (gMain.state) + { + case 0: + sub_80F9438(); + sub_80F9368(); + REG_BG2CNT = BGCNT_SCREENBASE(15) | BGCNT_CHARBASE(2) | BGCNT_PRIORITY(2); + REG_BLDCNT = 0; + gMain.state++; + break; + case 1: + remove_some_task(); + gMain.state++; + break; + case 2: + ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = TRUE; + gMain.state++; + break; + case 3: + ResetSpriteData(); + gMain.state++; + break; + case 4: + if (gUnknown_02039244 != 2) + { + ResetTasks(); + } + gMain.state++; + break; + case 5: + SetUpWindowConfig(&gWindowConfig_81E6E34); + gMain.state++; + break; + case 6: + SetUpWindowConfig(&gWindowConfig_81E6E50); + gMain.state++; + break; + case 7: + MultistepInitMenuWindowBegin(&gWindowConfig_81E6E34); + gMain.state++; + break; + case 8: + if (MultistepInitMenuWindowContinue()) + { + gMain.state++; + } + break; + case 9: + MultistepInitMenuWindowBegin(&gWindowConfig_81E6E50); + gMain.state++; + break; + case 10: + if (MultistepInitMenuWindowContinue()) + { + ewram[0x1ffff] = 0; + gMain.state++; + } + break; + case 11: + if (sub_810B998()) + { + gMain.state++; + } + break; + case 12: + sub_80F944C(); + LoadScrollIndicatorPalette(); + CreateVerticalScrollIndicators(0, 0xb0, 0x08); + CreateVerticalScrollIndicators(1, 0xb0, 0x98); + gMain.state++; + break; + case 13: + ewram[0x1fffe] = sub_810BA50(0x38, 0x40, 0); + gMain.state++; + break; + case 14: + sub_810BC98(); + sub_810BD08(); + gMain.state++; + break; + case 15: + sub_810BB0C(); + sub_810BB30(); + sub_810BC84(gUnknown_02039248.unk1); + gMain.state++; + break; + case 16: + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(sub_810B68C); + REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG2_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP; + gMain.state++; + break; + case 17: + if (sub_8055870() != TRUE) + { + gMain.state++; + } + break; + case 18: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + gPaletteFade.bufferTransferDisabled = FALSE; + SetMainCallback2(sub_810B674); + return TRUE; + } + return FALSE; +} + +void sub_810B96C(void) +{ + do { + if (sub_810B6C0() == TRUE) + { + CreateTask(sub_810BF7C, 0); + break; + } + } while (sub_80F9344() != TRUE); +} + +static bool8 sub_810B998(void) +{ + switch (ewram[0x1ffff]) + { + case 0: + LZDecompressVram(gMenuPokeblock_Gfx, (u8 *)BG_CHAR_ADDR(2)); + ewram[0x1ffff]++; + break; + case 1: + sub_800D238(gMenuPokeblock_Tilemap, gBGTilemapBuffers[2]); + ewram[0x1ffff]++; + break; + case 2: + LoadCompressedPalette(gMenuPokeblock_Pal, 0, 0xc0); + ewram[0x1ffff]++; + break; + case 3: + LoadCompressedObjectPic(&gUnknown_083F7F74); + ewram[0x1ffff]++; + break; + case 4: + LoadCompressedObjectPalette(&gUnknown_083F7F7C); + ewram[0x1ffff] = 0; + return TRUE; + } + return FALSE; +} + +u8 sub_810BA50(s16 x, s16 y, u8 subpriority) +{ + return CreateSprite(&gSpriteTemplate_83F7F84, x, y, subpriority); +} + +void sub_810BA7C(u8 a0) +{ + gUnknown_02039244 = a0; + switch (gUnknown_02039244) + { + default: + gUnknown_03000758 = gUnknown_083F7F1C; + gUnknown_0203924C = sizeof gUnknown_083F7F1C; + break; + case 2: + gUnknown_03000758 = gUnknown_083F7F1F; + gUnknown_0203924C = sizeof gUnknown_083F7F1F; + break; + case 3: + gUnknown_03000758 = gUnknown_083F7F21; + gUnknown_0203924C = sizeof gUnknown_083F7F21; + break; + } +} + +void sub_810BADC(void) +{ + sub_810BA7C(2); + SetMainCallback2(sub_810B96C); +} + +void sub_810BAF4(void) +{ + sub_810BA7C(3); + SetMainCallback2(sub_810B96C); +} + +#ifdef DEBUG +void debug_sub_8120F98(void) +{ + u8 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); + 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); +} + +static void sub_810BB88(u8 a0) +{ + u8 i; + u8 y; + u8 *buf; + BasicInitMenuWindow(&gWindowConfig_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); + if (i != a0 + 8) + { + MenuZeroFillWindowRect(15, y + 3, 29, 18); + } + break; + } + buf = sub_8072C74(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[i].color], 0x5e, 0); + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x14; + buf[2] = 0x06; + buf += 3; + ConvertIntToDecimalStringN(buf, sub_810C9B0(&gSaveBlock1.pokeblocks[i]), STR_CONV_MODE_RIGHT_ALIGN, 3); + MenuPrint(gStringVar1, 15, y + 1); + } +} + +static void sub_810BC84(u8 a0) +{ + sub_810BB88(a0); + sub_810BDAC(FALSE); +} + +static void sub_810BC98(void) +{ + u16 i, j; + struct Pokeblock buf; + for (i=0; i<39; i++) + { + for (j=i+1; j<40; j++) + { + if (gSaveBlock1.pokeblocks[i].color == 0) + { + buf = gSaveBlock1.pokeblocks[i]; + gSaveBlock1.pokeblocks[i] = gSaveBlock1.pokeblocks[j]; + gSaveBlock1.pokeblocks[j] = buf; + } + } + } +} + +static void sub_810BD08(void) +{ + u8 i; + gUnknown_02039248.unk2 = 0; + for (i=0; i<40; i++) + { + if (gSaveBlock1.pokeblocks[i].color != 0) + gUnknown_02039248.unk2++; + } + if (gUnknown_02039248.unk2 < 8) + { + gUnknown_02039248.unk3 = gUnknown_02039248.unk2; + } + else + { + gUnknown_02039248.unk3 = 8; + } + if (gUnknown_02039248.unk1 + 8 > gUnknown_02039248.unk2 && gUnknown_02039248.unk1 != 0) + { + gUnknown_02039248.unk1--; + } +} + +static void sub_810BD64(u16 a0, u16 a1) +{ + u8 i; + int y; + for (i=0; i<14; i++) + { + gBGTilemapBuffers[2][(2 * gUnknown_02039248.unk0 + 1) * 32 + (y = i + 15)] = a0; + gBGTilemapBuffers[2][(2 * gUnknown_02039248.unk0 + 2) * 32 + y] = a0; + } +} + +static void sub_810BDAC(bool8 flag) +{ + u8 i; + u16 v0; + if (!flag) + { + sub_810BD64(0x1005, 0x1014); + } + else + { + sub_810BD64(0x2005, 0x2014); + } + if (gUnknown_02039248.unk1) + { + sub_80F979C(0, 0); + } + else + { + sub_80F979C(0, 1); + } + if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2) + { + sub_80F979C(1, 0); + } + else + { + sub_80F979C(1, 1); + } + for (i=0; i<5; i++) + { + v0 = ((i % 3) << 6) + 0x1a1 + (i / 3) * 6; + if (gUnknown_02039248.unk0 + gUnknown_02039248.unk1 != gUnknown_02039248.unk2) + { + if (sub_810CA9C(&gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1], i + 1) > 0) + { + gBGTilemapBuffers[2][v0] = (i << 12) + 23; + gBGTilemapBuffers[2][v0 + 32] = (i << 12) + 24; + } + else + { + gBGTilemapBuffers[2][v0] = 15; + gBGTilemapBuffers[2][v0 + 32] = 15; + } + } + else + { + gBGTilemapBuffers[2][v0] = 15; + gBGTilemapBuffers[2][v0 + 32] = 15; + } + } + BasicInitMenuWindow(&gWindowConfig_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); + } + else + { + MenuZeroFillWindowRect(11, 17, 12, 18); + } +} + +static void sub_810BF38(bool8 flag) +{ + PlaySE(SE_SELECT); + gSprites[ewram[0x1fffe]].callback = sub_810C8D4; + sub_810BDAC(flag); +} + +static void sub_810BF7C(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (gUnknown_02039248.unk0 != 0) + { + sub_810BD64(5, 20); + gUnknown_02039248.unk0--; + sub_810BF38(FALSE); + } + else if (gUnknown_02039248.unk1 != 0) + { + gUnknown_02039248.unk1--; + sub_810BB88(gUnknown_02039248.unk1); + sub_810BF38(FALSE); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (gUnknown_02039248.unk0 != gUnknown_02039248.unk3) + { + sub_810BD64(5, 20); + gUnknown_02039248.unk0++; + sub_810BF38(FALSE); + } + else if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2) + { + gUnknown_02039248.unk1++; + sub_810BB88(gUnknown_02039248.unk1); + sub_810BF38(FALSE); + } + } + else if (gMain.newKeys & SELECT_BUTTON) + { + if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2) + { + PlaySE(SE_SELECT); + sub_810BDAC(TRUE); + gTasks[taskId].data[0] = gUnknown_02039248.unk1 + gUnknown_02039248.unk0; + gTasks[taskId].func = sub_810C0C8; + } + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 == gUnknown_02039248.unk2) + { + gScriptResult = 0xffff; + sub_810C31C(taskId); + } + else + { + sub_810C368(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gScriptResult = 0xffff; + sub_810C31C(taskId); + } + } +} + +static void sub_810C0C8(u8 taskId) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (gUnknown_02039248.unk0 != 0) + { + sub_810BD64(5, 20); + gUnknown_02039248.unk0--; + sub_810BF38(TRUE); + sub_810C1C8(taskId, 1); + } + else if (gUnknown_02039248.unk1 != 0) + { + sub_810C1C8(taskId, 0); + gUnknown_02039248.unk1--; + sub_810BB88(gUnknown_02039248.unk1); + sub_810BF38(TRUE); + sub_810C1C8(taskId, 1); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (gUnknown_02039248.unk0 != gUnknown_02039248.unk3) + { + sub_810BD64(5, 20); + gUnknown_02039248.unk0++; + sub_810BF38(TRUE); + sub_810C1C8(taskId, 1); + } + else if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2) + { + sub_810C1C8(taskId, 0); + gUnknown_02039248.unk1++; + sub_810BB88(gUnknown_02039248.unk1); + sub_810BF38(TRUE); + sub_810C1C8(taskId, 1); + } + } + else if (gMain.newKeys & A_BUTTON || gMain.newKeys & SELECT_BUTTON) + { + PlaySE(SE_SELECT); + sub_810C1C8(taskId, 0); + sub_810C23C(taskId); + gTasks[taskId].func = sub_810BF7C; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_810C1C8(taskId, 0); + sub_810BDAC(0); + gTasks[taskId].func = sub_810BF7C; + } +} + +static void sub_810C1C8(u8 taskId, u8 flag) +{ + u8 i; + u32 x; + s16 y; + u16 v0 = 0x1005; + if (!flag) + { + v0 = 0x0005; + } + y = gTasks[taskId].data[0] - gUnknown_02039248.unk1; + if ((u16)y <= 8 && y != gUnknown_02039248.unk0) + { + for (i=0; i<14; i++) + { + gBGTilemapBuffers[2][(2 * y + 1) * 32 + (x = i + 15)] = v0; + gBGTilemapBuffers[2][(2 * y + 2) * 32 + x] = v0; + } + } +} + +static void sub_810C23C(u8 taskId) +{ + struct Pokeblock buf; + u8 selidx = gUnknown_02039248.unk1 + gUnknown_02039248.unk0; + if (selidx == gUnknown_02039248.unk2) + { + sub_810BDAC(FALSE); + } + else + { + buf = gSaveBlock1.pokeblocks[selidx]; + gSaveBlock1.pokeblocks[selidx] = gSaveBlock1.pokeblocks[gTasks[taskId].data[0]]; + gSaveBlock1.pokeblocks[gTasks[taskId].data[0]] = buf; + sub_810BB88(gUnknown_02039248.unk1); + sub_810BDAC(FALSE); + } +} + +static void sub_810C2B0(void) +{ + DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(1); + BuyMenuFreeMemory(); +} + +static void sub_810C2C8(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gUnknown_02039244 == 3) + { + gFieldCallback = sub_8080990; + } + sub_810C2B0(); + SetMainCallback2(gUnknown_083F7EA8[gUnknown_02039244]); + DestroyTask(taskId); + } +} + +static void sub_810C31C(u8 taskId) +{ + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + if (gUnknown_02039244 > 1) + { + gScriptItemId = ITEM_NONE; + } + gTasks[taskId].func = sub_810C2C8; +} + +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, (const struct MenuAction *)gUnknown_083F7EF4, gUnknown_03000758); + InitMenu(0, 8, v0 + 5, gUnknown_0203924C, 0, 5); + gScriptItemId = gUnknown_02039248.unk0 + gUnknown_02039248.unk1; + gTasks[taskId].func = sub_810C40C; +} + +static void sub_810C40C(u8 taskId) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (GetMenuCursorPos()) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (GetMenuCursorPos() != gUnknown_0203924C - 1) + { + PlaySE(SE_SELECT); + MoveMenuCursor(+1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_083F7EF4[gUnknown_03000758[GetMenuCursorPos()]].func(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_810C748(taskId); + } +} + +static void sub_810C4C4(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_810C2B0(); + sub_8136130(&gSaveBlock1.pokeblocks[gScriptItemId], sub_810B96C); + DestroyTask(taskId); + } +} + +static void sub_810C508(u8 taskId) +{ + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_810C4C4; +} + +static void sub_810C540(u8 taskId) +{ + BasicInitMenuWindow(&gWindowConfig_81E6E50); + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(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); +} + +static void sub_810C5C0(u8 taskId) +{ + sub_80F979C(1, 1); + gTasks[taskId].func = sub_810C540; +} + +static void sub_810C5EC(u8 taskId) +{ + DisplayYesNoMenu(7, 6, 1); + DoYesNoFuncWithChoice(taskId, &gUnknown_083F7F24); +} + +static void sub_810C610(u8 taskId) +{ + MenuZeroFillWindowRect(7, 6, 13, 11); + sub_810CA6C((gUnknown_02039248.unk0 + gUnknown_02039248.unk1)); + StringExpandPlaceholders(gStringVar4, gContestStatsText_WasThrownAway); + DisplayItemMessageOnField(taskId, gStringVar4, sub_810C704, 0); + sub_810BC98(); + sub_810BD08(); +} + +static void sub_810C668(u8 taskId) +{ + StartVerticalScrollIndicators(0); + StartVerticalScrollIndicators(1); + if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2) + { + sub_80F979C(1, 0); + } + BasicInitMenuWindow(&gWindowConfig_81E6E50); + MenuZeroFillWindowRect(7, 6, 13, 11); + MenuZeroFillWindowRect(0, 14, 29, 19); + gTasks[taskId].func = sub_810BF7C; +} + +static void sub_810C6DC(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + sub_810C668(taskId); + } +} + +static void sub_810C704(u8 taskId) +{ + BasicInitMenuWindow(&gWindowConfig_81E6E34); + sub_810BC84(gUnknown_02039248.unk1); + sub_80F979C(1, 1); + gTasks[taskId].func = sub_810C6DC; +} + +static void sub_810C748(u8 taskId) +{ + StartVerticalScrollIndicators(0); + StartVerticalScrollIndicators(1); + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(7, 4, 13, 11); + gTasks[taskId].func = sub_810BF7C; +} + +static void sub_810C788(u8 taskId) +{ + s16 v0 = sub_810CAE4(GetNature(&gEnemyParty[0]), &gSaveBlock1.pokeblocks[gScriptItemId]); + StringCopy(gBattleTextBuff1, gPokeblockNames[gSaveBlock1.pokeblocks[gScriptItemId].color]); + sub_810CA6C(gScriptItemId); + gScriptItemId = gSaveBlock1.pokeblocks[gScriptItemId].color << 8; + if (v0 == 0) + { + gScriptItemId += 1; + } + if (v0 > 0) + { + gScriptItemId += 2; + } + if (v0 < 0) + { + gScriptItemId += 3; + } + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_810C2C8; +} + +static void sub_810C854(u8 taskId) +{ + SafariZoneActivatePokeblockFeeder(gScriptItemId); + StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gScriptItemId].color]); + gScriptResult = gScriptItemId; + sub_810CA6C(gScriptItemId); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_810C2C8; +} + +static void sub_810C8D4(struct Sprite *sprite) +{ + if (sprite->data0 > 1) + { + sprite->data0 = 0; + } + switch (sprite->data0) + { + case 0: + sprite->oam.affineMode = 1; + sprite->affineAnims = gSpriteAffineAnimTable_83F7F70; + InitSpriteAffineAnim(sprite); + sprite->data0 = 1; + sprite->data1 = 0; + break; + case 1: + if (++sprite->data1 > 11) + { + sprite->oam.affineMode = 0; + sprite->data0 = 0; + sprite->data1 = 0; + FreeOamMatrix(sprite->oam.matrixNum); + sprite->callback = SpriteCallbackDummy; + } + break; + } +} + +static void ClearPokeblock(u8 pokeblockIdx) +{ + gSaveBlock1.pokeblocks[pokeblockIdx].color = 0; + gSaveBlock1.pokeblocks[pokeblockIdx].spicy = 0; + gSaveBlock1.pokeblocks[pokeblockIdx].dry = 0; + gSaveBlock1.pokeblocks[pokeblockIdx].sweet = 0; + gSaveBlock1.pokeblocks[pokeblockIdx].bitter = 0; + gSaveBlock1.pokeblocks[pokeblockIdx].sour = 0; + gSaveBlock1.pokeblocks[pokeblockIdx].feel = 0; +} + +void ClearPokeblocks(void) +{ + u8 pokeblockIdx; + for (pokeblockIdx=0; pokeblockIdx 99) + feel = 99; + return feel; +} + +s8 sub_810CA00(void) +{ + u8 i; + for (i=0; icolor; + if (field == 1) + return pokeblock->spicy; + if (field == 2) + return pokeblock->dry; + if (field == 3) + return pokeblock->sweet; + if (field == 4) + return pokeblock->bitter; + if (field == 5) + return pokeblock->sour; + if (field == 6) + return pokeblock->feel; + return 0; +} + +s16 sub_810CAE4(u8 nature, const struct Pokeblock *pokeblock) +{ + u8 flavor; + s16 curGain; + s16 totalGain = 0; + for (flavor=0; flavor<5; flavor++) + { + curGain = sub_810CA9C(pokeblock, flavor + 1); + if (curGain > 0) + { + totalGain += curGain * gPokeblockFlavorCompatibilityTable[5 * nature + flavor]; + } + } + return totalGain; +} + +void sub_810CB44(struct Pokeblock *pokeblock, u8 *dest) +{ + u8 color = sub_810CA9C(pokeblock, 0); + StringCopy(dest, gPokeblockNames[color]); +} + +bool8 sub_810CB68(u8 nature, u8 *dest) +{ + u8 flavor; + for (flavor=0; flavor<5; flavor++) + { + if (sub_810CAE4(nature, &gUnknown_083F7F9C[flavor]) > 0) + { + StringCopy(dest, gPokeblockNames[flavor + 1]); + return TRUE; + } + } + return FALSE; +} diff --git a/src/field/pokenav.c b/src/field/pokenav.c new file mode 100644 index 000000000..84ed7b14b --- /dev/null +++ b/src/field/pokenav.c @@ -0,0 +1,40 @@ +#include "global.h" +#include "main.h" +#include "pokenav.h" +#include "battle.h" +#include "data2.h" +#include "de_rom_8040FE0.h" +#include "string_util.h" + +void sub_80F700C(u8 *arg0, u16 arg1) { + struct Trainer *trainer; + u8 *ptr; + +#if ENGLISH + trainer = (struct Trainer *) &gTrainers[gUnknown_083DFEC4->unkCEE8[arg1].unk0]; +#elif GERMAN + const u16 trainerIndex = gUnknown_083DFEC4->unkCEE8[arg1].unk0; + trainer = (struct Trainer *) &gTrainers[trainerIndex]; +#endif + + ptr = arg0; + if (arg1 < gUnknown_083DFEC4->unkD158) + { +#if ENGLISH + ptr = StringCopy(ptr, gTrainerClassNames[trainer->trainerClass]); +#elif GERMAN + ptr = StringCopy(ptr, de_sub_8041024(0, trainerIndex)); +#endif + + ptr[0] = 0xFC; + ptr[1] = 0x13; + ptr[2] = 0x4B; + ptr += 3; + ptr = StringCopy(ptr, trainer->trainerName); + } + + ptr[0] = 0xFC; + ptr[1] = 0x13; + ptr[2] = 0x80; + ptr[3] = 0xFF; +} diff --git a/src/field/region_map.c b/src/field/region_map.c new file mode 100644 index 000000000..7ca7e809f --- /dev/null +++ b/src/field/region_map.c @@ -0,0 +1,1847 @@ +#include "global.h" +#include "event_data.h" +#include "field_effect.h" +#include "field_specials.h" +#include "m4a.h" +#include "main.h" +#include "map_constants.h" +#include "menu.h" +#include "palette.h" +#include "pokemon_menu.h" +#include "region_map.h" +#include "rom4.h" +#include "secret_base.h" +#include "songs.h" +#include "sprite.h" +#include "strings.h" +#include "string_util.h" +#include "text.h" +#include "trig.h" + +// Map Section IDs +#define MAPSEC_LITTLEROOT_TOWN 0 +#define MAPSEC_OLDALE_TOWN 1 +#define MAPSEC_DEWFORD_TOWN 2 +#define MAPSEC_LAVARIDGE_TOWN 3 +#define MAPSEC_FALLARBOR_TOWN 4 +#define MAPSEC_VERDANTURF_TOWN 5 +#define MAPSEC_PACIFIDLOG_TOWN 6 +#define MAPSEC_PETALBURG_CITY 7 +#define MAPSEC_SLATEPORT_CITY 8 +#define MAPSEC_MAUVILLE_CITY 9 +#define MAPSEC_RUSTBORO_CITY 10 +#define MAPSEC_FORTREE_CITY 11 +#define MAPSEC_LILYCOVE_CITY 12 +#define MAPSEC_MOSSDEEP_CITY 13 +#define MAPSEC_SOOTOPOLIS_CITY 14 +#define MAPSEC_EVER_GRANDE_CITY 15 +#define MAPSEC_ROUTE_101 0x10 +#define MAPSEC_ROUTE_102 0x11 +#define MAPSEC_ROUTE_103 0x12 +#define MAPSEC_ROUTE_104 0x13 +#define MAPSEC_ROUTE_105 0x14 +#define MAPSEC_ROUTE_106 0x15 +#define MAPSEC_ROUTE_107 0x16 +#define MAPSEC_ROUTE_108 0x17 +#define MAPSEC_ROUTE_109 0x18 +#define MAPSEC_ROUTE_110 0x19 +#define MAPSEC_ROUTE_111 0x1A +#define MAPSEC_ROUTE_112 0x1B +#define MAPSEC_ROUTE_113 0x1C +#define MAPSEC_ROUTE_114 0x1D +#define MAPSEC_ROUTE_115 0x1E +#define MAPSEC_ROUTE_116 0x1F +#define MAPSEC_ROUTE_117 0x20 +#define MAPSEC_ROUTE_118 0x21 +#define MAPSEC_ROUTE_119 0x22 +#define MAPSEC_ROUTE_120 0x23 +#define MAPSEC_ROUTE_121 0x24 +#define MAPSEC_ROUTE_122 0x25 +#define MAPSEC_ROUTE_123 0x26 +#define MAPSEC_ROUTE_124 0x27 +#define MAPSEC_ROUTE_125 0x28 +#define MAPSEC_ROUTE_126 0x29 +#define MAPSEC_ROUTE_127 0x2A +#define MAPSEC_ROUTE_128 0x2B +#define MAPSEC_ROUTE_129 0x2C +#define MAPSEC_ROUTE_130 0x2D +#define MAPSEC_ROUTE_131 0x2E +#define MAPSEC_ROUTE_132 0x2F +#define MAPSEC_ROUTE_133 0x30 +#define MAPSEC_ROUTE_134 0x31 +#define MAPSEC_UNDERWATER1 0x32 +#define MAPSEC_UNDERWATER2 0x33 +#define MAPSEC_UNDERWATER3 0x34 +#define MAPSEC_UNDERWATER4 0x35 +#define MAPSEC_UNDERWATER5 0x36 +#define MAPSEC_GRANITE_CAVE 0x37 +#define MAPSEC_MT_CHIMNEY 0x38 +#define MAPSEC_SAFARI_ZONE 0x39 +#define MAPSEC_BATTLE_TOWER 0x3A +#define MAPSEC_PETALBURG_WOODS 0x3B +#define MAPSEC_RUSTURF_TUNNEL 0x3C +#define MAPSEC_ABANDONED_SHIP 0x3D +#define MAPSEC_NEW_MAUVILLE 0x3E +#define MAPSEC_METEOR_FALLS_1 0x3F +#define MAPSEC_METEOR_FALLS_2 0x40 +#define MAPSEC_MT_PYRE 0x41 +#define MAPSEC_EVIL_TEAM_HIDEOUT 0x42 +#define MAPSEC_SHOAL_CAVE 0x43 +#define MAPSEC_SEAFLOOR_CAVERN 0x44 +#define MAPSEC_UNDERWATER6 0x45 +#define MAPSEC_VICTORY_ROAD 0x46 +#define MAPSEC_MIRAGE_ISLAND 0x47 +#define MAPSEC_CAVE_OF_ORIGIN 0x48 +#define MAPSEC_SOUTHERN_ISLAND 0x49 +#define MAPSEC_FIERY_PATH_1 0x4A +#define MAPSEC_FIERY_PATH_2 0x4B +#define MAPSEC_JAGGED_PASS_1 0x4C +#define MAPSEC_JAGGED_PASS_2 0x4D +#define MAPSEC_SEALED_CHAMBER 0x4E +#define MAPSEC_UNDERWATER7 0x4F +#define MAPSEC_SCORCHED_SLAB 0x50 +#define MAPSEC_ISLAND_CAVE 0x51 +#define MAPSEC_DESERT_RUINS 0x52 +#define MAPSEC_ANCIENT_TOMB 0x53 +#define MAPSEC_INSIDE_OF_TRUCK 0x54 +#define MAPSEC_SKY_PILLAR 0x55 +#define MAPSEC_SECRET_BASE 0x56 +#define MAPSEC_UNK_0x57 0x57 +#define MAPSEC_NONE 0x58 + +#define MAP_WIDTH 28 +#define MAP_HEIGHT 15 +#define MAPCURSOR_X_MIN 1 +#define MAPCURSOR_Y_MIN 2 +#define MAPCURSOR_X_MAX (MAPCURSOR_X_MIN + MAP_WIDTH - 1) +#define MAPCURSOR_Y_MAX (MAPCURSOR_Y_MIN + MAP_HEIGHT - 1) + +// Input events +enum +{ + INPUT_EVENT_NONE, + INPUT_EVENT_DPAD, + INPUT_EVENT_2, + INPUT_EVENT_3, + INPUT_EVENT_A_BUTTON, + INPUT_EVENT_B_BUTTON, +}; + +static EWRAM_DATA struct RegionMap *gRegionMap = NULL; + +static const u16 sRegionMapCursor_Pal[] = INCBIN_U16("graphics/pokenav/cursor.gbapal"); +static const u8 sRegionMapCursorSmall_ImageLZ[] = INCBIN_U8("graphics/pokenav/cursor_small.4bpp.lz"); +static const u8 sRegionMapCursorLarge_ImageLZ[] = INCBIN_U8("graphics/pokenav/cursor_large.4bpp.lz"); +static const u16 sRegionMapBrendanIcon_Pal[] = INCBIN_U16("graphics/pokenav/brendan_icon.gbapal"); +static const u8 sRegionMapBrendanIcon_Image[] = INCBIN_U8("graphics/pokenav/brendan_icon.4bpp"); +static const u16 sRegionMapMayIcon_Pal[] = INCBIN_U16("graphics/pokenav/may_icon.gbapal"); +static const u8 sRegionMapMayIcon_Image[] = INCBIN_U8("graphics/pokenav/may_icon.4bpp"); +static const u16 sRegionMapBkgnd_Pal[] = INCBIN_U16("graphics/pokenav/region_map.gbapal"); +static const u8 sRegionMapBkgnd_ImageLZ[] = INCBIN_U8("graphics/pokenav/region_map.8bpp.lz"); +static const u8 sRegionMapBkgnd_TilemapLZ[] = INCBIN_U8("graphics/pokenav/region_map_map.bin.lz"); + +#include "../data/region_map_layout.h" + +#if ENGLISH +#include "../data/region_map_names_en.h" +#elif GERMAN +#include "../data/region_map_names_de.h" +#endif + +struct RegionMapLocation +{ + u8 x, y; + u8 width, height; + const u8 *regionMapSectionId; +}; + +const struct RegionMapLocation gRegionMapLocations[] = +{ + { 4, 11, 1, 1, gMapName_LittlerootTown}, + { 4, 9, 1, 1, gMapName_OldaleTown}, + { 2, 14, 1, 1, gMapName_DewfordTown}, + { 5, 3, 1, 1, gMapName_LavaridgeTown}, + { 3, 0, 1, 1, gMapName_FallarborTown}, + { 4, 6, 1, 1, gMapName_VerdanturfTown}, + {17, 10, 1, 1, gMapName_PacifidlogTown}, + { 1, 9, 1, 1, gMapName_PetalburgCity}, + { 8, 10, 1, 2, gMapName_SlateportCity}, + { 8, 6, 2, 1, gMapName_MauvilleCity}, + { 0, 5, 1, 2, gMapName_RustboroCity}, + {12, 0, 1, 1, gMapName_FortreeCity}, + {18, 3, 2, 1, gMapName_LilycoveCity}, + {24, 5, 2, 1, gMapName_MossdeepCity}, + {21, 7, 1, 1, gMapName_SootopolisCity}, + {27, 8, 1, 2, gMapName_EverGrandeCity}, + { 4, 10, 1, 1, gMapName_Route101}, + { 2, 9, 2, 1, gMapName_Route102}, + { 4, 8, 4, 1, gMapName_Route103}, + { 0, 7, 1, 3, gMapName_Route104}, + { 0, 10, 1, 3, gMapName_Route105}, + { 0, 13, 2, 1, gMapName_Route106}, + { 3, 14, 3, 1, gMapName_Route107}, + { 6, 14, 2, 1, gMapName_Route108}, + { 8, 12, 1, 3, gMapName_Route109}, + { 8, 7, 1, 3, gMapName_Route110}, + { 8, 0, 1, 6, gMapName_Route111}, + { 6, 3, 2, 1, gMapName_Route112}, + { 4, 0, 4, 1, gMapName_Route113}, + { 1, 0, 2, 3, gMapName_Route114}, + { 0, 2, 1, 3, gMapName_Route115}, + { 1, 5, 4, 1, gMapName_Route116}, + { 5, 6, 3, 1, gMapName_Route117}, + {10, 6, 2, 1, gMapName_Route118}, + {11, 0, 1, 6, gMapName_Route119}, + {13, 0, 1, 4, gMapName_Route120}, + {14, 3, 4, 1, gMapName_Route121}, + {16, 4, 1, 2, gMapName_Route122}, + {12, 6, 5, 1, gMapName_Route123}, + {20, 3, 4, 3, gMapName_Route124}, + {24, 3, 2, 2, gMapName_Route125}, + {20, 6, 3, 3, gMapName_Route126}, + {23, 6, 3, 3, gMapName_Route127}, + {23, 9, 4, 1, gMapName_Route128}, + {24, 10, 2, 1, gMapName_Route129}, + {21, 10, 3, 1, gMapName_Route130}, + {18, 10, 3, 1, gMapName_Route131}, + {15, 10, 2, 1, gMapName_Route132}, + {12, 10, 3, 1, gMapName_Route133}, + { 9, 10, 3, 1, gMapName_Route134}, + {20, 3, 4, 3, gMapName_Underwater}, + {20, 6, 3, 3, gMapName_Underwater}, + {23, 6, 3, 3, gMapName_Underwater}, + {23, 9, 4, 1, gMapName_Underwater}, + {21, 7, 1, 1, gMapName_Underwater}, + { 1, 13, 1, 1, gMapName_GraniteCave}, + { 6, 2, 1, 1, gMapName_MtChimney}, + {16, 2, 1, 1, gMapName_SafariZone}, + {22, 12, 1, 1, gMapName_BattleTower}, + { 0, 8, 1, 1, gMapName_PetalburgWoods}, + { 2, 5, 1, 1, gMapName_RusturfTunnel}, + { 6, 14, 1, 1, gMapName_AbandonedShip}, + { 8, 7, 1, 1, gMapName_NewMauville}, + { 0, 3, 1, 1, gMapName_MeteorFalls}, + { 1, 2, 1, 1, gMapName_MeteorFalls}, + {16, 4, 1, 1, gMapName_MtPyre}, + {19, 3, 1, 1, gMapName_EvilTeamHideout}, + {24, 4, 1, 1, gMapName_ShoalCave}, + {24, 9, 1, 1, gMapName_SeafloorCavern}, + {24, 9, 1, 1, gMapName_Underwater}, + {27, 9, 1, 1, gMapName_VictoryRoad}, + {17, 10, 1, 1, gMapName_MirageIsland}, + {21, 7, 1, 1, gMapName_CaveOfOrigin}, + {12, 14, 1, 1, gMapName_SouthernIsland}, + { 6, 3, 1, 1, gMapName_FieryPath}, + { 7, 3, 1, 1, gMapName_FieryPath}, + { 6, 3, 1, 1, gMapName_JaggedPass}, + { 7, 2, 1, 1, gMapName_JaggedPass}, + {11, 10, 1, 1, gMapName_SealedChamber}, + {11, 10, 1, 1, gMapName_Underwater}, + {13, 0, 1, 1, gMapName_ScorchedSlab}, + {0, 10, 1, 1, gMapName_IslandCave}, + { 8, 3, 1, 1, gMapName_DesertRuins}, + {13, 2, 1, 1, gMapName_AncientTomb}, + { 0, 0, 1, 1, gMapName_InsideOfTruck}, + {19, 10, 1, 1, gMapName_SkyPillar}, + { 0, 0, 1, 1, gMapName_SecretBase}, + { 0, 0, 1, 1, gMapName_None}, +}; + +static const u16 gUnknown_083E7684[][2] = +{ + {MAPSEC_UNDERWATER1, MAPSEC_ROUTE_124}, + {MAPSEC_UNDERWATER2, MAPSEC_ROUTE_126}, + {MAPSEC_UNDERWATER3, MAPSEC_ROUTE_127}, + {MAPSEC_UNDERWATER4, MAPSEC_ROUTE_128}, + {MAPSEC_UNDERWATER5, MAPSEC_SOOTOPOLIS_CITY}, + {MAPSEC_UNDERWATER6, MAPSEC_ROUTE_128}, + {MAPSEC_EVIL_TEAM_HIDEOUT, MAPSEC_LILYCOVE_CITY}, + {MAPSEC_UNDERWATER7, MAPSEC_ROUTE_134}, + {MAPSEC_PETALBURG_WOODS, MAPSEC_ROUTE_104}, + {MAPSEC_JAGGED_PASS_1, MAPSEC_ROUTE_112}, + {MAPSEC_MT_PYRE, MAPSEC_ROUTE_122}, + {MAPSEC_SKY_PILLAR, MAPSEC_ROUTE_131}, + {MAPSEC_NONE, MAPSEC_NONE}, +}; + +static u8 sub_80FAB78(void); +static u8 _swiopen(void); +static u8 sub_80FAD04(void); +static u8 sub_80FADE4(void); +static void CalcZoomScrollParams(s16, s16, s16, s16, u16, u16, u8); +static void sub_80FB238(s16, s16); +void UpdateRegionMapVideoRegs(void); +static u16 GetRegionMapSectionAt(u16, u16); +static void InitializeCursorPosition(void); +static void sub_80FB600(void); +static u16 sub_80FB758(u16); +static u16 sub_80FB9C0(u16); +static void sub_80FBA18(void); +static bool8 sub_80FBAA0(u16); +void CreateRegionMapCursor(u16, u16); +static void sub_80FBCA0(void); +static void sub_80FBDF8(void); +static void sub_80FBE24(void); +static void SpriteCB_PlayerIconZoomedOut(struct Sprite *); +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)); +static void PrintFlyTargetName(void); +static void CreateFlyTargetGraphics(void); +static void CreateCityTownFlyTargetIcons(void); +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 InitRegionMap(struct RegionMap *regionMap, bool8 zoomed) +{ + sub_80FA904(regionMap, zoomed); + while (sub_80FA940()) + ; +} + +void sub_80FA904(struct RegionMap *regionMap, bool8 zoomed) +{ + gRegionMap = regionMap; + gRegionMap->initStep = 0; + gRegionMap->zoomed = zoomed; + gRegionMap->inputCallback = (zoomed == 0) ? sub_80FAB78 : sub_80FAD04; +} + +bool8 sub_80FA940(void) +{ + switch (gRegionMap->initStep) + { + case 0: + LZ77UnCompVram(sRegionMapBkgnd_ImageLZ, (void *)(VRAM + 0x8000)); + break; + case 1: + LZ77UnCompVram(sRegionMapBkgnd_TilemapLZ, (void *)(VRAM + 0xE000)); + break; + case 2: + LoadPalette(sRegionMapBkgnd_Pal, 0x70, 0x60); // Why isn't this the right size? + break; + case 3: + LZ77UnCompWram(sRegionMapCursorSmall_ImageLZ, gRegionMap->cursorSmallImage); + break; + case 4: + LZ77UnCompWram(sRegionMapCursorLarge_ImageLZ, gRegionMap->cursorLargeImage); + break; + case 5: + InitializeCursorPosition(); + gRegionMap->unk74 = gRegionMap->cursorPosX; + gRegionMap->unk76 = gRegionMap->cursorPosY; + gRegionMap->unk16 = sub_80FB758(gRegionMap->mapSecId); + gRegionMap->mapSecId = sub_80FB9C0(gRegionMap->mapSecId); + GetMapSectionName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16); + break; + case 6: + if (gRegionMap->zoomed == FALSE) + { + CalcZoomScrollParams(0, 0, 0, 0, 0x100, 0x100, 0); + } + else + { + gRegionMap->scrollX = gRegionMap->cursorPosX * 8 - 52; + gRegionMap->scrollY = gRegionMap->cursorPosY * 8 - 68; + gRegionMap->unk64 = gRegionMap->cursorPosX; + gRegionMap->unk66 = gRegionMap->cursorPosY; + CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, 0x80, 0x80, 0); + } + break; + case 7: + sub_80FBA18(); + UpdateRegionMapVideoRegs(); + gRegionMap->cursorSprite = NULL; + gRegionMap->playerIconSprite = NULL; + gRegionMap->unk7A = 0; + gRegionMap->blinkPlayerIcon = FALSE; + REG_BG2CNT = 0xBC8A; + gRegionMap->initStep++; + default: + return FALSE; + } + gRegionMap->initStep++; + return TRUE; +} + +void FreeRegionMapIconResources(void) +{ + if (gRegionMap->cursorSprite != NULL) + { + DestroySprite(gRegionMap->cursorSprite); + FreeSpriteTilesByTag(gRegionMap->cursorTileTag); + FreeSpritePaletteByTag(gRegionMap->cursorPaletteTag); + } + if (gRegionMap->playerIconSprite != NULL) + { + DestroySprite(gRegionMap->playerIconSprite); + FreeSpriteTilesByTag(gRegionMap->playerIconTileTag); + FreeSpritePaletteByTag(gRegionMap->playerIconPaletteTag); + } +} + +u8 sub_80FAB60(void) +{ + return gRegionMap->inputCallback(); +} + +static u8 sub_80FAB78(void) +{ + u8 event = INPUT_EVENT_NONE; + + gRegionMap->cursorDeltaX = 0; + gRegionMap->cursorDeltaY = 0; + if ((gMain.heldKeys & DPAD_UP) && gRegionMap->cursorPosY > MAPCURSOR_Y_MIN) + { + gRegionMap->cursorDeltaY = -1; + event = INPUT_EVENT_DPAD; + } + if ((gMain.heldKeys & DPAD_DOWN) && gRegionMap->cursorPosY < MAPCURSOR_Y_MAX) + { + gRegionMap->cursorDeltaY = 1; + event = INPUT_EVENT_DPAD; + } + if ((gMain.heldKeys & DPAD_LEFT) && gRegionMap->cursorPosX > MAPCURSOR_X_MIN) + { + gRegionMap->cursorDeltaX = -1; + event = INPUT_EVENT_DPAD; + } + if ((gMain.heldKeys & DPAD_RIGHT) && gRegionMap->cursorPosX < MAPCURSOR_X_MAX) + { + gRegionMap->cursorDeltaX = 1; + event = INPUT_EVENT_DPAD; + } + + if (gMain.newKeys & A_BUTTON) + event = INPUT_EVENT_A_BUTTON; + else if (gMain.newKeys & B_BUTTON) + event = INPUT_EVENT_B_BUTTON; + + if (event == INPUT_EVENT_DPAD) + { + gRegionMap->unk7A = 4; + gRegionMap->inputCallback = _swiopen; + } + return event; +} + +static u8 _swiopen(void) +{ + u16 mapSecId; + + if (gRegionMap->unk7A != 0) + return INPUT_EVENT_2; + + if (gRegionMap->cursorDeltaX > 0) + gRegionMap->cursorPosX++; + + if (gRegionMap->cursorDeltaX < 0) + gRegionMap->cursorPosX--; + + if (gRegionMap->cursorDeltaY > 0) + gRegionMap->cursorPosY++; + + if (gRegionMap->cursorDeltaY < 0) + gRegionMap->cursorPosY--; + + mapSecId = GetRegionMapSectionAt(gRegionMap->cursorPosX, gRegionMap->cursorPosY); + gRegionMap->unk16 = sub_80FB758(mapSecId); + if (mapSecId != gRegionMap->mapSecId) + { + gRegionMap->mapSecId = mapSecId; + GetMapSectionName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16); + } + sub_80FBA18(); + gRegionMap->inputCallback = sub_80FAB78; + return INPUT_EVENT_3; +} + +static u8 sub_80FAD04(void) +{ + u8 event = INPUT_EVENT_NONE; + + gRegionMap->unk6A = 0; + gRegionMap->unk68 = 0; + if ((gMain.heldKeys & DPAD_UP) && gRegionMap->scrollY > -52) + { + gRegionMap->unk68 = -1; + event = INPUT_EVENT_DPAD; + } + if ((gMain.heldKeys & DPAD_DOWN) && gRegionMap->scrollY < 60) + { + gRegionMap->unk68 = 1; + event = INPUT_EVENT_DPAD; + } + if ((gMain.heldKeys & DPAD_LEFT) && gRegionMap->scrollX > -44) + { + gRegionMap->unk6A = -1; + event = INPUT_EVENT_DPAD; + } + if ((gMain.heldKeys & DPAD_RIGHT) && gRegionMap->scrollX < 172) + { + gRegionMap->unk6A = 1; + event = INPUT_EVENT_DPAD; + } + + if (gMain.newKeys & A_BUTTON) + event = INPUT_EVENT_A_BUTTON; + if (gMain.newKeys & B_BUTTON) + event = INPUT_EVENT_B_BUTTON; + + if (event == INPUT_EVENT_DPAD) + { + gRegionMap->inputCallback = sub_80FADE4; + gRegionMap->unk6C = 0; + } + return event; +} + +static u8 sub_80FADE4(void) +{ + gRegionMap->scrollY += gRegionMap->unk68; + gRegionMap->scrollX += gRegionMap->unk6A; + sub_80FB238(gRegionMap->scrollX, gRegionMap->scrollY); + gRegionMap->unk6C++; + if (gRegionMap->unk6C == 8) + { + u16 r3 = (gRegionMap->scrollX + 44) / 8 + 1; + u16 r1 = (gRegionMap->scrollY + 52) / 8 + 2; + + if (r3 != gRegionMap->unk64 || r1 != gRegionMap->unk66) + { + u16 mapSecId; + + gRegionMap->unk64 = r3; + gRegionMap->unk66 = r1; + mapSecId = GetRegionMapSectionAt(r3, r1); + gRegionMap->unk16 = sub_80FB758(mapSecId); + if (mapSecId != gRegionMap->mapSecId) + { + gRegionMap->mapSecId = mapSecId; + GetMapSectionName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16); + } + sub_80FBA18(); + } + gRegionMap->unk6C = 0; + gRegionMap->inputCallback = sub_80FAD04; + return INPUT_EVENT_3; + } + return INPUT_EVENT_2; +} + +void sub_80FAEC4(void) +{ + if (gRegionMap->zoomed == FALSE) + { + gRegionMap->scrollY = 0; + gRegionMap->scrollX = 0; + gRegionMap->unk40 = 0; + gRegionMap->unk3C = 0; + gRegionMap->unk60 = gRegionMap->cursorPosX * 8 - 52; + gRegionMap->unk62 = gRegionMap->cursorPosY * 8 - 68; + gRegionMap->unk44 = (gRegionMap->unk60 << 8) / 16; + gRegionMap->unk48 = (gRegionMap->unk62 << 8) / 16; + gRegionMap->unk64 = gRegionMap->cursorPosX; + gRegionMap->unk66 = gRegionMap->cursorPosY; + gRegionMap->unk4C = (256 << 8); + gRegionMap->unk50 = -0x800; + } + else + { + gRegionMap->unk3C = gRegionMap->scrollX * 256; + gRegionMap->unk40 = gRegionMap->scrollY * 256; + gRegionMap->unk60 = 0; + gRegionMap->unk62 = 0; + gRegionMap->unk44 = -(gRegionMap->unk3C / 16); + gRegionMap->unk48 = -(gRegionMap->unk40 / 16); + gRegionMap->cursorPosX = gRegionMap->unk64; + gRegionMap->cursorPosY = gRegionMap->unk66; + gRegionMap->unk4C = (128 << 8); + gRegionMap->unk50 = 0x800; + } + gRegionMap->unk6E = 0; + sub_80FBCA0(); + sub_80FBDF8(); +} + +u8 sub_80FAFC0(void) +{ + u8 r4; + + if (gRegionMap->unk6E >= 16) + return 0; + gRegionMap->unk6E++; + if (gRegionMap->unk6E == 16) + { + gRegionMap->unk44 = 0; + gRegionMap->unk48 = 0; + gRegionMap->scrollX = gRegionMap->unk60; + gRegionMap->scrollY = gRegionMap->unk62; + gRegionMap->unk4C = (gRegionMap->zoomed == FALSE) ? (128 << 8) : (256 << 8); + gRegionMap->zoomed = !gRegionMap->zoomed; + gRegionMap->inputCallback = (gRegionMap->zoomed == FALSE) ? sub_80FAB78 : sub_80FAD04; + CreateRegionMapCursor(gRegionMap->cursorTileTag, gRegionMap->cursorPaletteTag); + sub_80FBE24(); + r4 = 0; + } + else + { + gRegionMap->unk3C += gRegionMap->unk44; + gRegionMap->unk40 += gRegionMap->unk48; + gRegionMap->scrollX = gRegionMap->unk3C >> 8; + gRegionMap->scrollY = gRegionMap->unk40 >> 8; + gRegionMap->unk4C += gRegionMap->unk50; + if ((gRegionMap->unk44 < 0 && gRegionMap->scrollX < gRegionMap->unk60) + || (gRegionMap->unk44 > 0 && gRegionMap->scrollX > gRegionMap->unk60)) + { + gRegionMap->scrollX = gRegionMap->unk60; + gRegionMap->unk44 = 0; + } + if ((gRegionMap->unk48 < 0 && gRegionMap->scrollY < gRegionMap->unk62) + || (gRegionMap->unk48 > 0 && gRegionMap->scrollY > gRegionMap->unk62)) + { + gRegionMap->scrollY = gRegionMap->unk62; + gRegionMap->unk48 = 0; + } + if (gRegionMap->zoomed == FALSE) + { + if (gRegionMap->unk4C < (128 << 8)) + { + gRegionMap->unk4C = (128 << 8); + gRegionMap->unk50 = 0; + } + } + else + { + if (gRegionMap->unk4C > (256 << 8)) + { + gRegionMap->unk4C = (256 << 8); + gRegionMap->unk50 = 0; + } + } + r4 = 1; + } + CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, gRegionMap->unk4C >> 8, gRegionMap->unk4C >> 8, 0); + return r4; +} + +static void CalcZoomScrollParams(s16 a, s16 b, s16 c, s16 d, u16 e, u16 f, u8 rotation) +{ + s32 var1; + s32 var2; + s32 var3; + s32 var4; + + gRegionMap->unk2C = e * gSineTable[rotation + 64] >> 8; + gRegionMap->unk30 = e * -gSineTable[rotation] >> 8; + gRegionMap->unk34 = f * gSineTable[rotation] >> 8; + gRegionMap->unk38 = f * gSineTable[rotation + 64] >> 8; + + var1 = (a << 8) + (c << 8); + var2 = d * gRegionMap->unk34 + gRegionMap->unk2C * c; + gRegionMap->bg2x = var1 - var2; + + var3 = (b << 8) + (d << 8); + var4 = gRegionMap->unk38 * d + gRegionMap->unk30 * c; + gRegionMap->bg2y = var3 - var4; + + gRegionMap->needUpdateVideoRegs = TRUE; +} + +static void sub_80FB238(s16 x, s16 y) +{ + gRegionMap->bg2x = (0x1C << 8) + (x << 8); + gRegionMap->bg2y = (0x24 << 8) + (y << 8); + gRegionMap->needUpdateVideoRegs = TRUE; +} + +void UpdateRegionMapVideoRegs(void) +{ + if (gRegionMap->needUpdateVideoRegs) + { + REG_BG2PA = gRegionMap->unk2C; + REG_BG2PB = gRegionMap->unk34; + REG_BG2PC = gRegionMap->unk30; + REG_BG2PD = gRegionMap->unk38; + REG_BG2X = gRegionMap->bg2x; + REG_BG2Y = gRegionMap->bg2y; + gRegionMap->needUpdateVideoRegs = FALSE; + } +} + +void sub_80FB2A4(s16 a, s16 b) +{ + CalcZoomScrollParams(a, b, 0x38, 0x48, 0x100, 0x100, 0); + UpdateRegionMapVideoRegs(); + if (gRegionMap->playerIconSprite != NULL) + { + gRegionMap->playerIconSprite->pos2.x = -a; + gRegionMap->playerIconSprite->pos2.y = -b; + } +} + +static u16 GetRegionMapSectionAt(u16 x, u16 y) +{ + if (y < MAPCURSOR_Y_MIN || y > MAPCURSOR_Y_MAX || x < MAPCURSOR_X_MIN || x > MAPCURSOR_X_MAX) + return MAPSEC_NONE; + y -= MAPCURSOR_Y_MIN; + x -= MAPCURSOR_X_MIN; + return sRegionMapLayout[x + y * 28]; +} + +static void InitializeCursorPosition(void) +{ + struct MapHeader *mapHeader; + u16 mapWidth; + u16 mapHeight; + u16 x; + u16 y; + u16 r1; + u16 r9; + + if (gSaveBlock1.location.mapGroup == 25 + && (gSaveBlock1.location.mapNum == MAP_ID_SS_TIDAL_CORRIDOR + || gSaveBlock1.location.mapNum == MAP_ID_SS_TIDAL_LOWER_DECK + || gSaveBlock1.location.mapNum == MAP_ID_SS_TIDAL_ROOMS)) + { + sub_80FB600(); + return; + } + + switch (get_map_light_level_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) - 1) + { + default: + case 0: + case 1: + case 2: + case 4: + case 5: + gRegionMap->mapSecId = gMapHeader.regionMapSectionId; + gRegionMap->playerIsInCave = FALSE; + mapWidth = gMapHeader.mapData->width; + mapHeight = gMapHeader.mapData->height; + x = gSaveBlock1.pos.x; + y = gSaveBlock1.pos.y; + if (gRegionMap->mapSecId == MAPSEC_UNDERWATER6) + gRegionMap->playerIsInCave = TRUE; + break; + case 3: + case 6: + mapHeader = get_mapheader_by_bank_and_number(gSaveBlock1.warp4.mapGroup, gSaveBlock1.warp4.mapNum); + gRegionMap->mapSecId = mapHeader->regionMapSectionId; + gRegionMap->playerIsInCave = TRUE; + mapWidth = mapHeader->mapData->width; + mapHeight = mapHeader->mapData->height; + x = gSaveBlock1.warp4.x; + y = gSaveBlock1.warp4.y; + break; + case 8: + mapHeader = get_mapheader_by_bank_and_number(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum); + gRegionMap->mapSecId = mapHeader->regionMapSectionId; + gRegionMap->playerIsInCave = TRUE; + mapWidth = mapHeader->mapData->width; + mapHeight = mapHeader->mapData->height; + x = gSaveBlock1.warp2.x; + y = gSaveBlock1.warp2.y; + break; + case 7: + { + struct WarpData *r4; + + gRegionMap->mapSecId = gMapHeader.regionMapSectionId; + if (gRegionMap->mapSecId != MAPSEC_UNK_0x57) + { + r4 = &gSaveBlock1.warp4; + mapHeader = get_mapheader_by_bank_and_number(r4->mapGroup, r4->mapNum); + } + else + { + r4 = &gSaveBlock1.warp2; + mapHeader = get_mapheader_by_bank_and_number(r4->mapGroup, r4->mapNum); + gRegionMap->mapSecId = mapHeader->regionMapSectionId; + } + gRegionMap->playerIsInCave = FALSE; + mapWidth = mapHeader->mapData->width; + mapHeight = mapHeader->mapData->height; + x = r4->x; + y = r4->y; + } + break; + } + + r9 = x; + + r1 = mapWidth / gRegionMapLocations[gRegionMap->mapSecId].width; + if (r1 == 0) + r1 = 1; + x /= r1; + if (x >= gRegionMapLocations[gRegionMap->mapSecId].width) + x = gRegionMapLocations[gRegionMap->mapSecId].width - 1; + + r1 = mapHeight / gRegionMapLocations[gRegionMap->mapSecId].height; + if (r1 == 0) + r1 = 1; + y /= r1; + if (y >= gRegionMapLocations[gRegionMap->mapSecId].height) + y = gRegionMapLocations[gRegionMap->mapSecId].height - 1; + + switch (gRegionMap->mapSecId) + { + case MAPSEC_ROUTE_114: + if (y != 0) + x = 0; + break; + case MAPSEC_ROUTE_126: + case MAPSEC_UNDERWATER2: + x = 0; + if (gSaveBlock1.pos.x > 32) + x = 1; + if (gSaveBlock1.pos.x > 0x33) + x++; + y = 0; + if (gSaveBlock1.pos.y > 0x25) + y = 1; + if (gSaveBlock1.pos.y > 0x38) + y++; + break; + case MAPSEC_ROUTE_121: + x = 0; + if (r9 > 14) + x = 1; + if (r9 > 0x1C) + x++; + if (r9 > 0x36) + x++; + break; + } + gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSecId].x + x + MAPCURSOR_X_MIN; + gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSecId].y + y + MAPCURSOR_Y_MIN; +} + +static void sub_80FB600(void) +{ + u16 y = 0; + u16 x = 0; + u8 mapGroup; + u8 mapNum; + s16 sp2; + s16 sp4; + + switch (GetSSTidalLocation(&mapGroup, &mapNum, &sp2, &sp4)) + { + case 1: + gRegionMap->mapSecId = MAPSEC_SLATEPORT_CITY; + break; + case 2: + gRegionMap->mapSecId = MAPSEC_LILYCOVE_CITY; + break; + case 3: + gRegionMap->mapSecId = MAPSEC_ROUTE_124; + break; + case 4: + gRegionMap->mapSecId = MAPSEC_ROUTE_131; + break; + default: + case 0: + { + struct MapHeader *mapHeader = get_mapheader_by_bank_and_number(mapGroup, mapNum); + u16 r1; + + gRegionMap->mapSecId = mapHeader->regionMapSectionId; + r1 = mapHeader->mapData->width / gRegionMapLocations[gRegionMap->mapSecId].width; + if (r1 == 0) + r1 = 1; + x = sp2 / r1; + if (x >= gRegionMapLocations[gRegionMap->mapSecId].width) + x = gRegionMapLocations[gRegionMap->mapSecId].width - 1; + + r1 = mapHeader->mapData->height / gRegionMapLocations[gRegionMap->mapSecId].height; + if (r1 == 0) + r1 = 1; + y = sp4 / r1; + if (y >= gRegionMapLocations[gRegionMap->mapSecId].height) + y = gRegionMapLocations[gRegionMap->mapSecId].height - 1; + } + break; + } + gRegionMap->playerIsInCave = FALSE; + gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSecId].x + x + MAPCURSOR_X_MIN; + gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSecId].y + y + MAPCURSOR_Y_MIN; +} + +static u16 sub_80FB758(u16 mapSecId) +{ + switch (mapSecId) + { + case MAPSEC_NONE: + return 0; + case MAPSEC_LITTLEROOT_TOWN: + return FlagGet(FLAG_VISITED_LITTLEROOT_TOWN) ? 2 : 3; + case MAPSEC_OLDALE_TOWN: + return FlagGet(FLAG_VISITED_OLDALE_TOWN) ? 2 : 3; + case MAPSEC_DEWFORD_TOWN: + return FlagGet(FLAG_VISITED_DEWFORD_TOWN) ? 2 : 3; + case MAPSEC_LAVARIDGE_TOWN: + return FlagGet(FLAG_VISITED_LAVARIDGE_TOWN) ? 2 : 3; + case MAPSEC_FALLARBOR_TOWN: + return FlagGet(FLAG_VISITED_FALLARBOR_TOWN) ? 2 : 3; + case MAPSEC_VERDANTURF_TOWN: + return FlagGet(FLAG_VISITED_VERDANTURF_TOWN) ? 2 : 3; + case MAPSEC_PACIFIDLOG_TOWN: + return FlagGet(FLAG_VISITED_PACIFIDLOG_TOWN) ? 2 : 3; + case MAPSEC_PETALBURG_CITY: + return FlagGet(FLAG_VISITED_PETALBURG_CITY) ? 2 : 3; + case MAPSEC_SLATEPORT_CITY: + return FlagGet(FLAG_VISITED_SLATEPORT_CITY) ? 2 : 3; + case MAPSEC_MAUVILLE_CITY: + return FlagGet(FLAG_VISITED_MAUVILLE_CITY) ? 2 : 3; + case MAPSEC_RUSTBORO_CITY: + return FlagGet(FLAG_VISITED_RUSTBORO_CITY) ? 2 : 3; + case MAPSEC_FORTREE_CITY: + return FlagGet(FLAG_VISITED_FORTREE_CITY) ? 2 : 3; + case MAPSEC_LILYCOVE_CITY: + return FlagGet(FLAG_VISITED_LILYCOVE_CITY) ? 2 : 3; + case MAPSEC_MOSSDEEP_CITY: + return FlagGet(FLAG_VISITED_MOSSDEEP_CITY) ? 2 : 3; + case MAPSEC_SOOTOPOLIS_CITY: + return FlagGet(FLAG_VISITED_SOOTOPOLIS_CITY) ? 2 : 3; + case MAPSEC_EVER_GRANDE_CITY: + return FlagGet(FLAG_VISITED_EVER_GRANDE_CITY) ? 2 : 3; + + case MAPSEC_BATTLE_TOWER: + return FlagGet(FLAG_UNLOCK_BATTLE_TOWER) ? 4 : 0; + case MAPSEC_SOUTHERN_ISLAND: + return FlagGet(FLAG_UNLOCK_SOUTHERN_ISLAND) ? 1 : 0; + default: + return 1; + } +} + +u16 GetRegionMapSectionAt_(u16 x, u16 y) +{ + return GetRegionMapSectionAt(x, y); +} + +static u16 sub_80FB9C0(u16 mapSecId) +{ + u16 i; + + for (i = 0; gUnknown_083E7684[i][0] != MAPSEC_NONE; i++) + { + if (gUnknown_083E7684[i][0] == mapSecId) + return gUnknown_083E7684[i][1]; + } + return mapSecId; +} + +u16 sub_80FBA04(u16 mapSecId) +{ + return sub_80FB9C0(mapSecId); +} + +static void sub_80FBA18(void) +{ + u16 x; + u16 y; + u16 i; + + if (gRegionMap->mapSecId == MAPSEC_NONE) + { + gRegionMap->everGrandeCityArea = 0; + return; + } + + if (gRegionMap->zoomed == FALSE) + { + x = gRegionMap->cursorPosX; + y = gRegionMap->cursorPosY; + } + else + { + x = gRegionMap->unk64; + y = gRegionMap->unk66; + } + + i = 0; + while (1) + { + if (x <= 1) + { + if (sub_80FBAA0(y)) + { + y--; + x = 0x1D; + } + else + { + break; + } + } + else + { + x--; + if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSecId) + i++; + } + } + + gRegionMap->everGrandeCityArea = i; +} + +static bool8 sub_80FBAA0(u16 a) +{ + u16 x; + u16 y; + + y = a - 1; + if (y == 0xFFFF) + return FALSE; + + for (x = MAPCURSOR_X_MIN; x <= MAPCURSOR_X_MAX; x++) + { + if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSecId) + return TRUE; + } + return FALSE; +} + +static const struct OamData sCursorOamData = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sCursorAnimSeq0[] = +{ + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(4, 20), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sCursorAnimSeq1[] = +{ + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(16, 10), + ANIMCMD_FRAME(32, 10), + ANIMCMD_FRAME(16, 10), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd *const sCursorAnimTable[] = +{ + sCursorAnimSeq0, + sCursorAnimSeq1, +}; + +static void SpriteCB_Cursor(struct Sprite *sprite) +{ + if (gRegionMap->unk7A != 0) + { + sprite->pos1.x += gRegionMap->cursorDeltaX * 2; + sprite->pos1.y += gRegionMap->cursorDeltaY * 2; + gRegionMap->unk7A--; + } +} + +static void nullsub_66(struct Sprite *sprite) +{ +} + +void CreateRegionMapCursor(u16 tileTag, u16 paletteTag) +{ + u8 spriteId; + struct SpriteSheet spriteSheet; + struct SpritePalette spritePalette = + { + .data = sRegionMapCursor_Pal, + }; + struct SpriteTemplate spriteTemplate = + { + .oam = &sCursorOamData, + .anims = sCursorAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_Cursor, + }; + + spriteSheet.tag = tileTag; + spriteTemplate.tileTag = tileTag; + gRegionMap->cursorTileTag = tileTag; + + spritePalette.tag = paletteTag; + spriteTemplate.paletteTag = paletteTag; + gRegionMap->cursorPaletteTag = paletteTag; + + if (gRegionMap->zoomed == FALSE) + { + spriteSheet.data = gRegionMap->cursorSmallImage; + spriteSheet.size = 0x100; + spriteTemplate.callback = SpriteCB_Cursor; + } + else + { + spriteSheet.data = gRegionMap->cursorLargeImage; + spriteSheet.size = 0x600; + spriteTemplate.callback = nullsub_66; + } + LoadSpriteSheet(&spriteSheet); + LoadSpritePalette(&spritePalette); + spriteId = CreateSprite(&spriteTemplate, 0x38, 0x48, 0); + if (spriteId != 64) + { + gRegionMap->cursorSprite = &gSprites[spriteId]; + if (gRegionMap->zoomed == TRUE) + { + gRegionMap->cursorSprite->oam.size = 2; + gRegionMap->cursorSprite->pos1.x -= 8; + gRegionMap->cursorSprite->pos1.y -= 8; + StartSpriteAnim(gRegionMap->cursorSprite, 1); + } + else + { + gRegionMap->cursorSprite->oam.size = 1; + gRegionMap->cursorSprite->pos1.x = gRegionMap->cursorPosX * 8 + 4; + gRegionMap->cursorSprite->pos1.y = gRegionMap->cursorPosY * 8 + 4; + } + gRegionMap->cursorSprite->data1 = 2; + gRegionMap->cursorSprite->data2 = IndexOfSpritePaletteTag(paletteTag) * 16 + 0x0101; + gRegionMap->cursorSprite->data3 = 1; + } +} + +static void sub_80FBCA0(void) +{ + if (gRegionMap->cursorSprite != NULL) + { + DestroySprite(gRegionMap->cursorSprite); + FreeSpriteTilesByTag(gRegionMap->cursorTileTag); + FreeSpritePaletteByTag(gRegionMap->cursorPaletteTag); + } +} + +void unref_sub_80FBCD0(void) +{ + gRegionMap->cursorSprite->data3 = 1; +} + +void unref_sub_80FBCE0(void) +{ + gRegionMap->cursorSprite->data3 = 0; +} + +static const struct OamData sPlayerIconOamData = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sPlayerIconAnimSeq0[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +static const union AnimCmd *const sPlayerIconAnimTable[] = +{ + sPlayerIconAnimSeq0, +}; + +void CreateRegionMapPlayerIcon(u16 tileTag, u16 paletteTag) +{ + u8 spriteId; + struct SpriteSheet playerIconSpriteSheet = + { + .data = sRegionMapBrendanIcon_Image, + .size = 128, + .tag = tileTag, + }; + struct SpritePalette playerIconSpritePalette = + { + .data = sRegionMapBrendanIcon_Pal, + .tag = paletteTag, + }; + struct SpriteTemplate playerIconSpriteTemplate = + { + .tileTag = tileTag, + .paletteTag = paletteTag, + .oam = &sPlayerIconOamData, + .anims = sPlayerIconAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }; + + if (gSaveBlock2.playerGender == FEMALE) + { + playerIconSpriteSheet.data = sRegionMapMayIcon_Image; + playerIconSpritePalette.data = sRegionMapMayIcon_Pal; + } + LoadSpriteSheet(&playerIconSpriteSheet); + LoadSpritePalette(&playerIconSpritePalette); + spriteId = CreateSprite(&playerIconSpriteTemplate, 0, 0, 1); + gRegionMap->playerIconSprite = &gSprites[spriteId]; + if (gRegionMap->zoomed == FALSE) + { + gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 8 + 4; + gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 8 + 4; + gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedOut; + } + else + { + gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 16 - 48; + gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 16 - 66; + gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedIn; + } +} + +static void sub_80FBDF8(void) +{ + if (gRegionMap->playerIconSprite != NULL) + { + gRegionMap->playerIconSprite->invisible = TRUE; + gRegionMap->playerIconSprite->callback = SpriteCallbackDummy; + } +} + +static void sub_80FBE24(void) +{ + if (gRegionMap->playerIconSprite != NULL) + { + if (gRegionMap->zoomed == TRUE) + { + gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 16 - 48; + gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 16 - 66; + gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedIn; + gRegionMap->playerIconSprite->invisible = FALSE; + } + else + { + gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 8 + 4; + gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 8 + 4; + gRegionMap->playerIconSprite->pos2.x = 0; + gRegionMap->playerIconSprite->pos2.y = 0; + gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedOut; + gRegionMap->playerIconSprite->invisible = FALSE; + } + } +} + +static void SpriteCB_PlayerIconZoomedIn(struct Sprite *sprite) +{ + sprite->pos2.x = -(gRegionMap->scrollX * 2); + sprite->pos2.y = -(gRegionMap->scrollY * 2); + sprite->data0 = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + sprite->data1 = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + + // Determine if sprite is on screen + if (sprite->data0 < -8 || sprite->data0 > 0xA8 || sprite->data1 < -8 || sprite->data1 > 0xF8) + sprite->data2 = FALSE; + else + sprite->data2 = TRUE; + + if (sprite->data2 == TRUE) + UpdateIconBlink(sprite); + else + sprite->invisible = TRUE; +} + +static void SpriteCB_PlayerIconZoomedOut(struct Sprite *sprite) +{ + UpdateIconBlink(sprite); +} + +static void UpdateIconBlink(struct Sprite *sprite) +{ + if (gRegionMap->blinkPlayerIcon) + { + // Toggle visibility every 16 frames + sprite->data7++; + if (sprite->data7 > 16) + { + sprite->data7 = 0; + sprite->invisible = !sprite->invisible; + } + } + else + { + sprite->invisible = FALSE; + } +} + +void sub_80FBF94(void) +{ + if (gRegionMap->playerIsInCave) + gRegionMap->blinkPlayerIcon = TRUE; +} + +const u8 *GetMapSectionName(u8 *dest, u16 mapSecId, u16 length) +{ + if (mapSecId == MAPSEC_SECRET_BASE) + return GetSecretBaseMapName(dest); + if (mapSecId < MAPSEC_NONE) + return StringCopy(dest, gRegionMapLocations[mapSecId].regionMapSectionId); + if (length == 0) + length = 18; + return StringFill(dest, CHAR_SPACE, length); +} + +const u8 *CopyMapName(u8 *dest, u16 mapSecId) +{ + switch (mapSecId) + { + case MAPSEC_UNK_0x57: + return StringCopy(dest, gOtherText_Ferry); + case MAPSEC_SECRET_BASE: + return StringCopy(dest, gOtherText_SecretBase); + default: + return GetMapSectionName(dest, mapSecId, 0); + } +} + +const u8 *CopyLocationName(u8 *dest, u16 mapSecId) +{ + if (mapSecId == MAPSEC_EVIL_TEAM_HIDEOUT) + return StringCopy(dest, gOtherText_Hideout); + else + return CopyMapName(dest, mapSecId); +} + +static void GetRegionMapLocationPosition(u16 mapSecId, u16 *x, u16 *y, u16 *width, u16 *height) +{ + *x = gRegionMapLocations[mapSecId].x; + *y = gRegionMapLocations[mapSecId].y; + *width = gRegionMapLocations[mapSecId].width; + *height = gRegionMapLocations[mapSecId].height; +} + +struct UnknownStruct3 +{ + void (*unk0)(void); + u16 unk4; + u16 unk6; + struct RegionMap regionMap; +}; + +extern u8 ewram[]; +#define ewram0 (*(struct UnknownStruct3 *)(ewram + 0)) +#define ewram888 (ewram + 0x888) +#define ewramA6E (ewram[0xA6E]) +#define ewramBlankMapName (ewram + 0xA48) + +static const u16 sFlyRegionMapFrame_Pal[] = INCBIN_U16("graphics/pokenav/map_frame.gbapal"); +static const u8 sFlyRegionMapFrame_ImageLZ[] = INCBIN_U8("graphics/pokenav/map_frame.4bpp.lz"); +static const u8 sFlyRegionMapFrame_TilemapLZ[] = INCBIN_U8("graphics/pokenav/map_frame.bin.lz"); +static const u16 sFlyTargetIcons_Pal[] = INCBIN_U16("graphics/pokenav/fly_target_icons.gbapal"); +static const u8 sFlyTargetIcons_ImageLZ[] = INCBIN_U8("graphics/pokenav/fly_target_icons.4bpp.lz"); + +static const u8 sUnknown_083E7920[][3] = +{ + {0, 9, 1}, + {0, 10, 14}, + {0, 11, 15}, + {0, 12, 16}, + {0, 13, 17}, + {0, 14, 18}, + {0, 15, 19}, + {0, 0, 3}, + {0, 1, 4}, + {0, 2, 5}, + {0, 3, 6}, + {0, 4, 7}, + {0, 5, 8}, + {0, 6, 9}, + {0, 7, 10}, + {0, 8, 11}, + {0, 16, 0}, + {0, 17, 0}, + {0, 18, 0}, + {0, 19, 0}, + {0, 20, 0}, + {0, 21, 0}, + {0, 22, 0}, + {0, 23, 0}, + {0, 24, 0}, + {0, 25, 0}, + {0, 26, 0}, + {0, 27, 0}, + {0, 28, 0}, + {0, 29, 0}, + {0, 30, 0}, + {0, 31, 0}, + {0, 32, 0}, + {0, 33, 0}, + {0, 34, 0}, + {0, 35, 0}, + {0, 36, 0}, + {0, 37, 0}, + {0, 38, 0}, + {0, 39, 0}, + {0, 40, 0}, + {0, 41, 0}, + {0, 42, 0}, + {0, 43, 0}, + {0, 44, 0}, + {0, 45, 0}, + {0, 46, 0}, + {0, 47, 0}, + {0, 48, 0}, + {0, 49, 0}, +}; + +struct UnknownStruct4 +{ + const u8 *const *unk0; + u16 mapSecId; + u16 flag; +}; + +static const u8 *const sEverGrandeCityAreaNames[] = {OtherText_PokeLeague, OtherText_PokeCenter}; + +static const struct UnknownStruct4 sUnknown_083E79C0[1] = +{ + {sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, SYS_POKEMON_LEAGUE_FLY}, +}; + +// XXX: what is this? +static u8 *const ewram_ = ewram; + +static const struct SpritePalette sFlyTargetIconSpritePalette = {sFlyTargetIcons_Pal, 2}; + +// Fly targets that are not cities or towns +static const u16 sSpecialFlyAreas[][2] = +{ + // flag, mapSecId + {0x848, MAPSEC_BATTLE_TOWER}, + {0xFFFF, MAPSEC_NONE}, +}; + +static const struct OamData sFlyTargetOamData = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sFlyTargetAnimSeq0[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sFlyTargetAnimSeq1[] = +{ + ANIMCMD_FRAME(1, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sFlyTargetAnimSeq2[] = +{ + ANIMCMD_FRAME(3, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sFlyTargetAnimSeq3[] = +{ + ANIMCMD_FRAME(5, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sFlyTargetAnimSeq4[] = +{ + ANIMCMD_FRAME(6, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sFlyTargetAnimSeq5[] = +{ + ANIMCMD_FRAME(8, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sFlyTargetAnimSeq6[] = +{ + ANIMCMD_FRAME(10, 5), + ANIMCMD_END, +}; + +static const union AnimCmd *const sFlyTargetAnimTable[] = +{ + sFlyTargetAnimSeq0, + sFlyTargetAnimSeq1, + sFlyTargetAnimSeq2, + sFlyTargetAnimSeq3, + sFlyTargetAnimSeq4, + sFlyTargetAnimSeq5, + sFlyTargetAnimSeq6, +}; + +static const struct SpriteTemplate gFlyTargetSpriteTemplate = +{ + .tileTag = 2, + .paletteTag = 2, + .oam = &sFlyTargetOamData, + .anims = sFlyTargetAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +void CB2_InitFlyRegionMap(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + ResetPaletteFade(); + ResetSpriteData(); + FreeSpriteTileRanges(); + FreeAllSpritePalettes(); + break; + case 1: + SetUpWindowConfig(&gWindowConfig_81E7224); + break; + case 2: + InitMenuWindow(&gWindowConfig_81E7224); + MenuZeroFillScreen(); + break; + case 3: + InitRegionMap(&ewram0.regionMap, 0); + CreateRegionMapCursor(0, 0); + CreateRegionMapPlayerIcon(1, 1); + ewram0.unk6 = ewram0.regionMap.mapSecId; + StringFill(ewramBlankMapName, CHAR_SPACE, 12); + PrintFlyTargetName(); + break; + case 4: + LZ77UnCompVram(sFlyRegionMapFrame_ImageLZ, (void *)(VRAM + 0xC000)); + break; + case 5: + LZ77UnCompVram(sFlyRegionMapFrame_TilemapLZ, (void *)(VRAM + 0xF000)); + break; + case 6: + LoadPalette(sFlyRegionMapFrame_Pal, 16, 32); + MenuPrint_PixelCoords(gOtherText_FlyToWhere, 1, 0x90, 1); + break; + case 7: + CreateFlyTargetGraphics(); + break; + case 8: + BlendPalettes(0xFFFFFFFF, 16, 0); + SetVBlankCallback(VBlankCB_FlyRegionMap); + break; + case 9: + REG_BLDCNT = 0; + REG_BG1CNT = 0x1E0D; + REG_DISPCNT = 0x1741; + sub_80FC244(sub_80FC5B4); + SetMainCallback2(CB2_FlyRegionMap); + break; + default: + return; + } + gMain.state++; +} + +static void VBlankCB_FlyRegionMap(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void CB2_FlyRegionMap(void) +{ + ewram0.unk0(); + AnimateSprites(); + BuildOamBuffer(); +} + +static void sub_80FC244(void (*func)(void)) +{ + ewram0.unk0 = func; + ewram0.unk4 = 0; +} + +static void PrintFlyTargetName(void) +{ + if (ewram0.regionMap.unk16 == 2 || ewram0.regionMap.unk16 == 4) + { + u16 i = 0; + int zero; + + for (i = 0; i < ARRAY_COUNT(sUnknown_083E79C0); i++) + { + const struct UnknownStruct4 *r4 = &sUnknown_083E79C0[i]; + + if (ewram0.regionMap.mapSecId == r4->mapSecId) + { + if (FlagGet(r4->flag)) + { + MenuDrawTextWindow(16, 14, 29, 19); + MenuPrint(ewram0.regionMap.mapSecName, 17, 15); + MenuPrint_RightAligned(r4->unk0[ewram0.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) + { + MenuDrawTextWindow(16, 16, 29, 19); + MenuPrint(ewram0.regionMap.mapSecName, 17, 17); + MenuZeroFillWindowRect(16, 14, 29, 15); + } + } + else + { + MenuDrawTextWindow(16, 16, 29, 19); + MenuPrint(ewramBlankMapName, 17, 17); + MenuZeroFillWindowRect(16, 14, 29, 15); + } +} + +static void CreateFlyTargetGraphics(void) +{ + struct SpriteSheet spriteSheet; + + LZ77UnCompWram(sFlyTargetIcons_ImageLZ, ewram888); + spriteSheet.data = ewram888; + spriteSheet.size = 0x1C0; + spriteSheet.tag = 2; + LoadSpriteSheet(&spriteSheet); + LoadSpritePalette(&sFlyTargetIconSpritePalette); + CreateCityTownFlyTargetIcons(); + CreateSpecialAreaFlyTargetIcons(); +} + +// Draws a light overlay on cities and towns that the player can fly to +static void CreateCityTownFlyTargetIcons(void) +{ + u16 canFlyFlag = 0x80F; + u16 i; + + for (i = 0; i < 16; i++) + { + u16 x; + u16 y; + u16 width; + u16 height; + u16 r7; + u8 spriteId; + + GetRegionMapLocationPosition(i, &x, &y, &width, &height); + x = (x + 1) * 8 + 4; + y = (y + 2) * 8 + 4; + if (width == 2) + r7 = 1; + else if (height == 2) + r7 = 2; + else + r7 = 0; + spriteId = CreateSprite(&gFlyTargetSpriteTemplate, x, y, 10); + if (spriteId != 64) + { + gSprites[spriteId].oam.shape = r7; + if (FlagGet(canFlyFlag)) + gSprites[spriteId].callback = SpriteCB_FlyTargetIcons; + else + r7 += 3; + StartSpriteAnim(&gSprites[spriteId], r7); + gSprites[spriteId].data0 = i; + } + canFlyFlag++; + } +} + +// Draws a red box on other fly targets +// The Battle Tower is the only one of these +static void CreateSpecialAreaFlyTargetIcons(void) +{ + u16 i; + + for (i = 0; sSpecialFlyAreas[i][1] != MAPSEC_NONE; i++) + { + u16 x; + u16 y; + u16 width; + u16 height; + + if (FlagGet(sSpecialFlyAreas[i][0])) + { + u16 mapSecId = sSpecialFlyAreas[i][1]; + u8 spriteId; + + GetRegionMapLocationPosition(mapSecId, &x, &y, &width, &height); + x = (x + 1) * 8; + y = (y + 2) * 8; + spriteId = CreateSprite(&gFlyTargetSpriteTemplate, x, y, 10); + if (spriteId != 64) + { + gSprites[spriteId].oam.size = 1; + gSprites[spriteId].callback = SpriteCB_FlyTargetIcons; + StartSpriteAnim(&gSprites[spriteId], 6); + gSprites[spriteId].data0 = mapSecId; + } + } + } +} + +static void SpriteCB_FlyTargetIcons(struct Sprite *sprite) +{ + // Blink if our mapSecId is the one selected on the map + if (ewram0.regionMap.mapSecId == sprite->data0) + { + // Toggle visibility every 16 frames + sprite->data1++; + if (sprite->data1 > 16) + { + sprite->data1 = 0; + sprite->invisible = !sprite->invisible; + } + } + else + { + sprite->data1 = 16; + sprite->invisible = FALSE; + } +} + +static void sub_80FC5B4(void) +{ + switch (ewram0.unk4) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + ewram0.unk4++; + break; + case 1: + if (UpdatePaletteFade() != 0) + break; + sub_80FC244(sub_80FC600); + break; + } +} + +static void sub_80FC600(void) +{ + if (ewram0.unk4 == 0) + { + switch (sub_80FAB60()) + { + case INPUT_EVENT_NONE: + case INPUT_EVENT_DPAD: + case INPUT_EVENT_2: + break; + case INPUT_EVENT_3: + PrintFlyTargetName(); + break; + case INPUT_EVENT_A_BUTTON: + if (ewram0.regionMap.unk16 == 2 || ewram0.regionMap.unk16 == 4) + { + m4aSongNumStart(SE_SELECT); + ewramA6E = 1; + sub_80FC244(sub_80FC69C); + } + break; + case INPUT_EVENT_B_BUTTON: + m4aSongNumStart(SE_SELECT); + ewramA6E = 0; + sub_80FC244(sub_80FC69C); + break; + } + } +} + +static void sub_80FC69C(void) +{ + switch (ewram0.unk4) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + ewram0.unk4++; + break; + case 1: + if (UpdatePaletteFade() != 0) + break; + FreeRegionMapIconResources(); + if (ewramA6E != 0) + { + switch (ewram0.regionMap.mapSecId) + { + case MAPSEC_SOUTHERN_ISLAND: + sub_8053538(22); + break; + case MAPSEC_BATTLE_TOWER: + sub_8053538(21); + break; + case MAPSEC_LITTLEROOT_TOWN: + sub_8053538((gSaveBlock2.playerGender == MALE) ? 12 : 13); + break; + case MAPSEC_EVER_GRANDE_CITY: + sub_8053538((FlagGet(0x854) && ewram0.regionMap.everGrandeCityArea == 0) ? 20 : 11); + break; + default: + if (sUnknown_083E7920[ewram0.regionMap.mapSecId][2] != 0) + sub_8053538(sUnknown_083E7920[ewram0.regionMap.mapSecId][2]); + else + warp1_set_2(sUnknown_083E7920[ewram0.regionMap.mapSecId][0], sUnknown_083E7920[ewram0.regionMap.mapSecId][1], -1); + break; + } + sub_80865BC(); + } + else + { + SetMainCallback2(sub_808AD58); + } + break; + } +} diff --git a/src/field/roamer.c b/src/field/roamer.c new file mode 100644 index 000000000..948828d5e --- /dev/null +++ b/src/field/roamer.c @@ -0,0 +1,226 @@ +#include "global.h" +#include "roamer.h" +#include "pokemon.h" +#include "rng.h" +#include "species.h" + +#ifdef SAPPHIRE +#define ROAMER_SPECIES SPECIES_LATIAS +#else +#define ROAMER_SPECIES SPECIES_LATIOS +#endif + +enum +{ + MAP_GRP = 0, // map group + MAP_NUM = 1, // map number +}; + +EWRAM_DATA static u8 sLocationHistory[3][2] = {0}; +EWRAM_DATA static u8 sRoamerLocation[2] = {0}; + +static const u8 sRoamerLocations[][6] = +{ + { 0x19, 0x1A, 0x20, 0x21, 0x31, 0xFF }, + { 0x1A, 0x19, 0x20, 0x21, 0xFF, 0xFF }, + { 0x20, 0x1A, 0x19, 0x21, 0xFF, 0xFF }, + { 0x21, 0x20, 0x19, 0x1A, 0x22, 0x26 }, + { 0x22, 0x21, 0x23, 0xFF, 0xFF, 0xFF }, + { 0x23, 0x22, 0x24, 0xFF, 0xFF, 0xFF }, + { 0x24, 0x23, 0x25, 0x26, 0xFF, 0xFF }, + { 0x25, 0x24, 0x26, 0xFF, 0xFF, 0xFF }, + { 0x26, 0x25, 0x21, 0xFF, 0xFF, 0xFF }, + { 0x27, 0x24, 0x28, 0x29, 0xFF, 0xFF }, + { 0x28, 0x27, 0x2A, 0xFF, 0xFF, 0xFF }, + { 0x29, 0x27, 0x2A, 0xFF, 0xFF, 0xFF }, + { 0x2A, 0x28, 0x29, 0x2B, 0xFF, 0xFF }, + { 0x2B, 0x2A, 0x2C, 0xFF, 0xFF, 0xFF }, + { 0x2C, 0x2B, 0x2D, 0xFF, 0xFF, 0xFF }, + { 0x2D, 0x2C, 0x2E, 0xFF, 0xFF, 0xFF }, + { 0x2E, 0x2D, 0x2F, 0xFF, 0xFF, 0xFF }, + { 0x2F, 0x2E, 0x30, 0xFF, 0xFF, 0xFF }, + { 0x30, 0x2F, 0x31, 0xFF, 0xFF, 0xFF }, + { 0x31, 0x30, 0x19, 0xFF, 0xFF, 0xFF }, + { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, +}; + +void ClearRoamerData(void) +{ + memset(&gSaveBlock1.roamer, 0, sizeof(gSaveBlock1.roamer)); +} + +void ClearRoamerLocationData(void) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + sLocationHistory[i][MAP_GRP] = 0; + sLocationHistory[i][MAP_NUM] = 0; + } + + sRoamerLocation[MAP_GRP] = 0; + sRoamerLocation[MAP_NUM] = 0; +} + +void CreateInitialRoamerMon(void) +{ + struct Roamer *roamer; + CreateMon(&gEnemyParty[0], ROAMER_SPECIES, 40, 0x20, 0, 0, 0, 0); + roamer = &gSaveBlock1.roamer; + roamer->species = ROAMER_SPECIES; + roamer->level = 40; + roamer->status = 0; + roamer->active = TRUE; + roamer->ivs = GetMonData(&gEnemyParty[0], MON_DATA_IVS); + roamer->personality = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY); + roamer->hp = GetMonData(&gEnemyParty[0], MON_DATA_MAX_HP); + roamer->cool = GetMonData(&gEnemyParty[0], MON_DATA_COOL); + roamer->beauty = GetMonData(&gEnemyParty[0], MON_DATA_BEAUTY); + roamer->cute = GetMonData(&gEnemyParty[0], MON_DATA_CUTE); + roamer->smart = GetMonData(&gEnemyParty[0], MON_DATA_SMART); + roamer->tough = GetMonData(&gEnemyParty[0], MON_DATA_TOUGH); + sRoamerLocation[MAP_GRP] = 0; + sRoamerLocation[MAP_NUM] = sRoamerLocations[Random() % 20][0]; +} + +void InitRoamer(void) +{ + ClearRoamerData(); + ClearRoamerLocationData(); + CreateInitialRoamerMon(); +} + +void UpdateLocationHistoryForRoamer(void) +{ + sLocationHistory[2][MAP_GRP] = sLocationHistory[1][MAP_GRP]; + sLocationHistory[2][MAP_NUM] = sLocationHistory[1][MAP_NUM]; + + sLocationHistory[1][MAP_GRP] = sLocationHistory[0][MAP_GRP]; + sLocationHistory[1][MAP_NUM] = sLocationHistory[0][MAP_NUM]; + + sLocationHistory[0][MAP_GRP] = gSaveBlock1.location.mapGroup; + sLocationHistory[0][MAP_NUM] = gSaveBlock1.location.mapNum; +} + +void RoamerMoveToOtherLocationSet(void) +{ + u8 val = 0; + struct Roamer *roamer = &gSaveBlock1.roamer; + + if (!roamer->active) + return; + + sRoamerLocation[MAP_GRP] = val; + + while (1) + { + val = sRoamerLocations[Random() % 20][0]; + if (sRoamerLocation[MAP_NUM] != val) + { + sRoamerLocation[MAP_NUM] = val; + return; + } + } +} + +void RoamerMove(void) +{ + u8 locSet = 0; + + if ((Random() % 16) == 0) + { + RoamerMoveToOtherLocationSet(); + } + else + { + struct Roamer *roamer = &gSaveBlock1.roamer; + + if (!roamer->active) + return; + + while (locSet < 20) + { + if (sRoamerLocation[MAP_NUM] == sRoamerLocations[locSet][0]) + { + u8 mapNum; + while (1) + { + mapNum = sRoamerLocations[locSet][(Random() % 5) + 1]; + if (!(sLocationHistory[2][MAP_GRP] == 0 && sLocationHistory[2][MAP_NUM] == mapNum) && mapNum != 0xFF) + break; + } + sRoamerLocation[MAP_NUM] = mapNum; + return; + } + locSet++; + } + } +} + +bool8 IsRoamerAt(u8 mapGroup, u8 mapNum) +{ + struct Roamer *roamer = &gSaveBlock1.roamer; + + if (roamer->active && mapGroup == sRoamerLocation[MAP_GRP] && mapNum == sRoamerLocation[MAP_NUM]) + return TRUE; + else + return FALSE; +} + +void CreateRoamerMonInstance(void) +{ + struct Pokemon *mon = &gEnemyParty[0]; + struct Roamer *roamer = &gSaveBlock1.roamer; + CreateMonWithIVsPersonality(mon, roamer->species, roamer->level, roamer->ivs, roamer->personality); + SetMonData(mon, MON_DATA_STATUS, (u8 *)&roamer->status); + SetMonData(mon, MON_DATA_HP, (u8 *)&roamer->hp); + SetMonData(mon, MON_DATA_COOL, (u8 *)&roamer->cool); + SetMonData(mon, MON_DATA_BEAUTY, (u8 *)&roamer->beauty); + SetMonData(mon, MON_DATA_CUTE, (u8 *)&roamer->cute); + SetMonData(mon, MON_DATA_SMART, (u8 *)&roamer->smart); + SetMonData(mon, MON_DATA_TOUGH, (u8 *)&roamer->tough); +} + +bool8 TryStartRoamerEncounter(void) +{ + if (IsRoamerAt(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) == TRUE && (Random() % 4) == 0) + { + CreateRoamerMonInstance(); + return TRUE; + } + else + { + return FALSE; + } +} + +void UpdateRoamerHPStatus(struct Pokemon *mon) +{ + struct Roamer *roamer; + u16 hp; + u8 status; + + hp = GetMonData(mon, MON_DATA_HP); + + roamer = &gSaveBlock1.roamer; + roamer->hp = hp; + + status = GetMonData(mon, MON_DATA_STATUS); + + roamer->status = status; + + RoamerMoveToOtherLocationSet(); +} + +void SetRoamerInactive(void) +{ + struct Roamer *roamer = &gSaveBlock1.roamer; + roamer->active = FALSE; +} + +void GetRoamerLocation(u8 *mapGroup, u8 *mapNum) +{ + *mapGroup = sRoamerLocation[MAP_GRP]; + *mapNum = sRoamerLocation[MAP_NUM]; +} diff --git a/src/field/rotating_gate.c b/src/field/rotating_gate.c new file mode 100644 index 000000000..bb3c31dfc --- /dev/null +++ b/src/field/rotating_gate.c @@ -0,0 +1,1228 @@ +#include "global.h" +#include "bike.h" +#include "event_data.h" +#include "field_map_obj.h" +#include "fieldmap.h" +#include "map_constants.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" + +#define ROTATING_GATE_TILE_TAG 0x1300 +#define ROTATING_GATE_PUZZLE_MAX 14 +#define GATE_ARM_MAX_LENGTH 2 + +#define GATE_ROTATION(rotationDirection, arm, longArm) \ + ((rotationDirection & 15) << 4) | ((arm & 7) << 1) | (longArm & 1) +#define GATE_ROTATION_CLOCKWISE(arm, longArm) GATE_ROTATION(ROTATE_CLOCKWISE, arm, longArm) +#define GATE_ROTATION_ANTICLOCKWISE(arm, longArm) GATE_ROTATION(ROTATE_ANTICLOCKWISE, arm, longArm) +#define GATE_ROTATION_NONE 255 + +static void SpriteCallback_RotatingGate(struct Sprite *sprite); +static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY); +static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite); + +enum +{ + /* + * | + * +-- + */ + GATE_SHAPE_L1, + + /* + * | + * | + * +-- + */ + GATE_SHAPE_L2, + + /* + * | + * +---- + */ + GATE_SHAPE_L3, + + /* + * | + * | + * +---- + */ + GATE_SHAPE_L4, + + /* + * | + * +-- + * | + */ + GATE_SHAPE_T1, + + /* + * | + * | + * +-- + * | + */ + GATE_SHAPE_T2, + + /* + * | + * +---- + * | + */ + GATE_SHAPE_T3, + + /* + * An unused T-shape gate + * | + * +-- + * | + * | + */ + GATE_SHAPE_T4, + + /* + * An unused T-shape gate + * | + * | + * +---- + * | + */ + GATE_SHAPE_UNUSED_T1, + + /* + * An unused T-shape gate + * | + * | + * +-- + * | + * | + */ + GATE_SHAPE_UNUSED_T2, + + /* + * An unused T-shape gate + * | + * +---- + * | + * | + */ + GATE_SHAPE_UNUSED_T3, + + /* + * An unused T-shape gate + * | + * | + * +---- + * | + * | + */ + GATE_SHAPE_UNUSED_T4, +}; + +enum +{ + /* + * 0 degrees (clockwise) + * | + * +-- + * | + */ + GATE_ORIENTATION_0, + + /* + * 90 degress (clockwise) + * --+-- + * | + */ + GATE_ORIENTATION_90, + + /* + * 180 degrees (clockwise) + * | + * --+ + * | + */ + GATE_ORIENTATION_180, + + /* + * 270 degrees (clockwise) + * | + * --+-- + */ + GATE_ORIENTATION_270, + + GATE_ORIENTATION_MAX, +}; + +// Describes the location of the gates "arms" when the gate has not +// been rotated (i.e. rotated 0 degrees) +enum +{ + GATE_ARM_NORTH, + GATE_ARM_EAST, + GATE_ARM_SOUTH, + GATE_ARM_WEST, +}; + +enum +{ + ROTATE_NONE, + ROTATE_ANTICLOCKWISE, + ROTATE_CLOCKWISE, +}; + +enum +{ + PUZZLE_NONE, + PUZZLE_FORTREE_CITY_GYM, + PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6, +}; + +struct RotatingGatePuzzle +{ + struct Coords16 pos; + u8 shape; + u8 orientation; +}; + +struct Coords8 +{ + s8 deltaX; + s8 deltaY; +}; + +// Fortree +static const struct RotatingGatePuzzle sRotatingGate_FortreePuzzleConfig[] = { + { { 12, 5 }, GATE_SHAPE_L4, GATE_ORIENTATION_0 }, + { { 14, 7 }, GATE_SHAPE_L4, GATE_ORIENTATION_270 }, + { { 16, 4 }, GATE_SHAPE_T2, GATE_ORIENTATION_90 }, + { { 15, 14 }, GATE_SHAPE_L2, GATE_ORIENTATION_0 }, + { { 18, 13 }, GATE_SHAPE_T1, GATE_ORIENTATION_180 }, + { { 8, 20 }, GATE_SHAPE_T1, GATE_ORIENTATION_180 }, + { { 16, 20 }, GATE_SHAPE_T4, GATE_ORIENTATION_90 }, +}; + +// Trickhouse +static const struct RotatingGatePuzzle sRotatingGate_TrickHousePuzzleConfig[] = { + { { 13, 3 }, GATE_SHAPE_T1, GATE_ORIENTATION_270 }, + { { 12, 6 }, GATE_SHAPE_T1, GATE_ORIENTATION_180 }, + { { 3, 6 }, GATE_SHAPE_T1, GATE_ORIENTATION_180 }, + { { 3, 9 }, GATE_SHAPE_T2, GATE_ORIENTATION_270 }, + { { 8, 8 }, GATE_SHAPE_L1, GATE_ORIENTATION_90 }, + { { 2, 12 }, GATE_SHAPE_T3, GATE_ORIENTATION_180 }, + { { 9, 13 }, GATE_SHAPE_L2, GATE_ORIENTATION_0 }, + { { 3, 14 }, GATE_SHAPE_L3, GATE_ORIENTATION_90 }, + { { 9, 15 }, GATE_SHAPE_L4, GATE_ORIENTATION_180 }, + { { 3, 18 }, GATE_SHAPE_T2, GATE_ORIENTATION_180 }, + { { 2, 19 }, GATE_SHAPE_T1, GATE_ORIENTATION_0 }, + { { 5, 21 }, GATE_SHAPE_L1, GATE_ORIENTATION_0 }, + { { 9, 19 }, GATE_SHAPE_L4, GATE_ORIENTATION_270 }, + { { 12, 20 }, GATE_SHAPE_T1, GATE_ORIENTATION_90 }, +}; + +static const u8 sRotatingGateTiles_1[] = INCBIN_U8("graphics/rotating_gates/1.4bpp"); +static const u8 sRotatingGateTiles_2[] = INCBIN_U8("graphics/rotating_gates/2.4bpp"); +static const u8 sRotatingGateTiles_3[] = INCBIN_U8("graphics/rotating_gates/3.4bpp"); +static const u8 sRotatingGateTiles_5[] = INCBIN_U8("graphics/rotating_gates/5.4bpp"); +static const u8 sRotatingGateTiles_6[] = INCBIN_U8("graphics/rotating_gates/6.4bpp"); +static const u8 sRotatingGateTiles_7[] = INCBIN_U8("graphics/rotating_gates/7.4bpp"); +static const u8 sRotatingGateTiles_0[] = INCBIN_U8("graphics/rotating_gates/0.4bpp"); +static const u8 sRotatingGateTiles_4[] = INCBIN_U8("graphics/rotating_gates/4.4bpp"); + +static const struct OamData sOamData_RotatingGateLarge = { + .y = 0, + .affineMode = ST_OAM_AFFINE_NORMAL, + .objMode = 0, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 2, + .paletteNum = 5, + .affineParam = 0, +}; + +static const struct OamData sOamData_RotatingGateRegular = { + .y = 0, + .affineMode = ST_OAM_AFFINE_NORMAL, + .objMode = 0, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 2, + .paletteNum = 5, + .affineParam = 0, +}; + +static const struct SpriteSheet sRotatingGatesGraphicsTable[] = { + { sRotatingGateTiles_0, 0x200, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L1 }, + { sRotatingGateTiles_1, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L2 }, + { sRotatingGateTiles_2, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L3 }, + { sRotatingGateTiles_3, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L4 }, + { sRotatingGateTiles_4, 0x200, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T1 }, + { sRotatingGateTiles_5, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T2 }, + { sRotatingGateTiles_6, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T3 }, + { sRotatingGateTiles_7, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T4 }, + { NULL }, +}; + +static const union AnimCmd sSpriteAnim_RotatingGateLarge[] = { + ANIMCMD_FRAME(0, 0), ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_RotatingGateRegular[] = { + ANIMCMD_FRAME(0, 0), ANIMCMD_END, +}; + +static const union AnimCmd *const sSpriteAnimTable_RotatingGateLarge[] = { + sSpriteAnim_RotatingGateLarge, +}; + +static const union AnimCmd *const sSpriteAnimTable_RotatingGateRegular[] = { + sSpriteAnim_RotatingGateRegular, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Rotated0[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Rotated90[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Rotated180[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Rotated270[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise0to90[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise90to180[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise180to270[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise270to360[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise360to270[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise270to180[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise180to90[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise90to0[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise0to90Faster[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise90to180Faster[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise180to270Faster[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise270to360Faster[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise360to270Faster[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise270to180Faster[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise180to90Faster[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise90to0Faster[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable_RotatingGate[] = { + sSpriteAffineAnim_Rotated0, + sSpriteAffineAnim_Rotated90, + sSpriteAffineAnim_Rotated180, + sSpriteAffineAnim_Rotated270, + sSpriteAffineAnim_RotatingAnticlockwise360to270, + sSpriteAffineAnim_RotatingAnticlockwise90to0, + sSpriteAffineAnim_RotatingAnticlockwise180to90, + sSpriteAffineAnim_RotatingAnticlockwise270to180, + sSpriteAffineAnim_RotatingClockwise0to90, + sSpriteAffineAnim_RotatingClockwise90to180, + sSpriteAffineAnim_RotatingClockwise180to270, + sSpriteAffineAnim_RotatingClockwise270to360, + sSpriteAffineAnim_RotatingAnticlockwise360to270Faster, + sSpriteAffineAnim_RotatingAnticlockwise90to0Faster, + sSpriteAffineAnim_RotatingAnticlockwise180to90Faster, + sSpriteAffineAnim_RotatingAnticlockwise270to180Faster, + sSpriteAffineAnim_RotatingClockwise0to90Faster, + sSpriteAffineAnim_RotatingClockwise90to180Faster, + sSpriteAffineAnim_RotatingClockwise180to270Faster, + sSpriteAffineAnim_RotatingClockwise270to360Faster, +}; + +static const struct SpriteTemplate sSpriteTemplate_RotatingGateLarge = { + .tileTag = ROTATING_GATE_TILE_TAG, + .paletteTag = 0xFFFF, + .oam = &sOamData_RotatingGateLarge, + .anims = sSpriteAnimTable_RotatingGateLarge, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_RotatingGate, + .callback = SpriteCallback_RotatingGate, +}; + +static const struct SpriteTemplate sSpriteTemplate_RotatingGateRegular = { + .tileTag = ROTATING_GATE_TILE_TAG, + .paletteTag = 0xFFFF, + .oam = &sOamData_RotatingGateRegular, + .anims = sSpriteAnimTable_RotatingGateRegular, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_RotatingGate, + .callback = SpriteCallback_RotatingGate, +}; + +// These structures describe what happens to the gate if you hit it at +// a given coordinate in a 4x4 grid when walking in the specified +// direction. Either the gate does not rotate, or it rotates in the +// given direction. This information is compared against the gate +// "arm" layout to see if there is an arm at the position in order to +// produce the final rotation. +static const u8 sRotatingGate_RotationInfoNorth[4][4] = { + { GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE }, + { GATE_ROTATION_CLOCKWISE(GATE_ARM_WEST, 1), + GATE_ROTATION_CLOCKWISE(GATE_ARM_WEST, 0), + GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_EAST, 0), + GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_EAST, 1) }, + { GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE }, + { GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE }, +}; + +static const u8 sRotatingGate_RotationInfoSouth[4][4] = { + { GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE }, + { GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE }, + { GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_WEST, 1), + GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_WEST, 0), + GATE_ROTATION_CLOCKWISE(GATE_ARM_EAST, 0), + GATE_ROTATION_CLOCKWISE(GATE_ARM_EAST, 1) }, + { GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE }, +}; + +static const u8 sRotatingGate_RotationInfoWest[4][4] = { + { GATE_ROTATION_NONE, + GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_NORTH, 1), + GATE_ROTATION_NONE, + GATE_ROTATION_NONE }, + { GATE_ROTATION_NONE, + GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_NORTH, 0), + GATE_ROTATION_NONE, + GATE_ROTATION_NONE }, + { GATE_ROTATION_NONE, + GATE_ROTATION_CLOCKWISE(GATE_ARM_SOUTH, 0), + GATE_ROTATION_NONE, + GATE_ROTATION_NONE }, + { GATE_ROTATION_NONE, + GATE_ROTATION_CLOCKWISE(GATE_ARM_SOUTH, 1), + GATE_ROTATION_NONE, + GATE_ROTATION_NONE }, +}; + +static const u8 sRotatingGate_RotationInfoEast[4][4] = { + { GATE_ROTATION_NONE, + GATE_ROTATION_NONE, + GATE_ROTATION_CLOCKWISE(GATE_ARM_NORTH, 1), + GATE_ROTATION_NONE }, + { GATE_ROTATION_NONE, + GATE_ROTATION_NONE, + GATE_ROTATION_CLOCKWISE(GATE_ARM_NORTH, 0), + GATE_ROTATION_NONE }, + { GATE_ROTATION_NONE, + GATE_ROTATION_NONE, + GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_SOUTH, 0), + GATE_ROTATION_NONE }, + { GATE_ROTATION_NONE, + GATE_ROTATION_NONE, + GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_SOUTH, 1), + GATE_ROTATION_NONE }, +}; + +// These tables describe the relative coordinate positions the arms +// must move through in order to be rotated. +static const struct Coords8 sRotatingGate_ArmPositionsClockwiseRotation[] = { + { 0, -1 }, { 1, -2 }, { 0, 0 }, { 1, 0 }, { -1, 0 }, { -1, 1 }, { -1, -1 }, { -2, -1 }, +}; + +static const struct Coords8 sRotatingGate_ArmPositionsAntiClockwiseRotation[] = { + { -1, -1 }, { -1, -2 }, { 0, -1 }, { 1, -1 }, { 0, 0 }, { 0, 1 }, { -1, 0 }, { -2, 0 }, +}; + +// Describes where the gates "arms" are in the order north, east, south, west. +// These are adjusted using the current orientation to perform collision checking +static const u8 sRotatingGate_ArmLayout[][GATE_ARM_WEST + 1][GATE_ARM_MAX_LENGTH] = { + // L-shape gates + { + { 1, 0 }, { 1, 0 }, { 0, 0 }, { 0, 0 }, + }, + { + { 1, 1 }, { 1, 0 }, { 0, 0 }, { 0, 0 }, + }, + { + { 1, 0 }, { 1, 1 }, { 0, 0 }, { 0, 0 }, + }, + { + { 1, 1 }, { 1, 1 }, { 0, 0 }, { 0, 0 }, + }, + + // T-shape gates + { + { 1, 0 }, { 1, 0 }, { 1, 0 }, { 0, 0 }, + }, + { + { 1, 1 }, { 1, 0 }, { 1, 0 }, { 0, 0 }, + }, + { + { 1, 0 }, { 1, 1 }, { 1, 0 }, { 0, 0 }, + }, + { + { 1, 0 }, { 1, 0 }, { 1, 1 }, { 0, 0 }, + }, + + // Unused T-shape gates + // These have 2-3 long arms and cannot actually be used anywhere + // since configuration for them is missing from the other tables. + { + { 1, 1 }, { 1, 1 }, { 1, 0 }, { 0, 0 }, + }, + { + { 1, 1 }, { 1, 0 }, { 1, 1 }, { 0, 0 }, + }, + { + { 1, 0 }, { 1, 1 }, { 1, 1 }, { 0, 0 }, + }, + { + { 1, 1 }, { 1, 1 }, { 1, 1 }, { 0, 0 }, + }, +}; + +static EWRAM_DATA u8 gRotatingGate_GateSpriteIds[ROTATING_GATE_PUZZLE_MAX] = {0}; +static EWRAM_DATA const struct RotatingGatePuzzle *gRotatingGate_PuzzleConfig = NULL; +static EWRAM_DATA u8 gRotatingGate_PuzzleCount = 0; + +static int GetCurrentMapRotatingGatePuzzleType(void) +{ + if (gSaveBlock1.location.mapGroup == MAP_GROUP_FORTREE_CITY_GYM && + gSaveBlock1.location.mapNum == MAP_ID_FORTREE_CITY_GYM) + { + return PUZZLE_FORTREE_CITY_GYM; + } + + if (gSaveBlock1.location.mapGroup == MAP_GROUP_ROUTE110_TRICK_HOUSE_PUZZLE6 && + gSaveBlock1.location.mapNum == MAP_ID_ROUTE110_TRICK_HOUSE_PUZZLE6) + { + return PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6; + } + + return PUZZLE_NONE; +} + +static void RotatingGate_ResetAllGateOrientations(void) +{ + int i; + u8 *ptr; + + ptr = (u8 *)GetVarPointer(0x4000); + + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + ptr[i] = gRotatingGate_PuzzleConfig[i].orientation; + } +} + +static int RotatingGate_GetGateOrientation(u8 gateId) +{ + return ((u8 *)GetVarPointer(0x4000))[gateId]; +} + +static void RotatingGate_SetGateOrientation(u8 gateId, u8 orientation) +{ + ((u8 *)GetVarPointer(0x4000))[gateId] = orientation; +} + +static void RotatingGate_RotateInDirection(u8 gateId, u32 rotationDirection) +{ + u8 orientation = RotatingGate_GetGateOrientation(gateId); + + if (rotationDirection == ROTATE_ANTICLOCKWISE) + { + if (orientation) + { + orientation--; + } + else + { + orientation = GATE_ORIENTATION_270; + } + } + else + { + orientation = ++orientation % GATE_ORIENTATION_MAX; + } + + RotatingGate_SetGateOrientation(gateId, orientation); +} + +static void RotatingGate_LoadPuzzleConfig(void) +{ + int puzzleType = GetCurrentMapRotatingGatePuzzleType(); + u32 i; + + switch (puzzleType) + { + case PUZZLE_FORTREE_CITY_GYM: + gRotatingGate_PuzzleConfig = sRotatingGate_FortreePuzzleConfig; + gRotatingGate_PuzzleCount = + sizeof(sRotatingGate_FortreePuzzleConfig) / sizeof(struct RotatingGatePuzzle); + break; + case PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6: + gRotatingGate_PuzzleConfig = sRotatingGate_TrickHousePuzzleConfig; + gRotatingGate_PuzzleCount = + sizeof(sRotatingGate_TrickHousePuzzleConfig) / sizeof(struct RotatingGatePuzzle); + break; + case PUZZLE_NONE: + default: + return; + } + + for (i = 0; i < ROTATING_GATE_PUZZLE_MAX; i++) + { + gRotatingGate_GateSpriteIds[i] = MAX_SPRITES; + } +} + +static void RotatingGate_CreateGatesWithinViewport(s16 deltaX, s16 deltaY) +{ + u8 i; + + // Calculate the bounding box of the camera + // Same as RotatingGate_DestroyGatesOutsideViewport + s16 x = gSaveBlock1.pos.x - 2; + s16 x2 = gSaveBlock1.pos.x + 0x11; + s16 y = gSaveBlock1.pos.y - 2; + s16 y2 = gSaveBlock1.pos.y + 0xe; + + s16 x3, y3; + + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + x3 = gRotatingGate_PuzzleConfig[i].pos.x + 7; + y3 = gRotatingGate_PuzzleConfig[i].pos.y + 7; + + if (y <= y3 && y2 >= y3 && x <= x3 && x2 >= x3 && + gRotatingGate_GateSpriteIds[i] == MAX_SPRITES) + { + gRotatingGate_GateSpriteIds[i] = RotatingGate_CreateGate(i, deltaX, deltaY); + } + } +} + +static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY) +{ + struct Sprite *sprite; + struct SpriteTemplate template; + const struct RotatingGatePuzzle *gate; + u8 spriteId; + s16 x, y; + + gate = &gRotatingGate_PuzzleConfig[gateId]; + + if (gate->shape == GATE_SHAPE_L1 || gate->shape == GATE_SHAPE_T1) + { + template = sSpriteTemplate_RotatingGateRegular; + } + else + { + template = sSpriteTemplate_RotatingGateLarge; + } + + template.tileTag = gate->shape + ROTATING_GATE_TILE_TAG; + + spriteId = CreateSprite(&template, 0, 0, 0x94); + if (spriteId == MAX_SPRITES) + { + return MAX_SPRITES; + } + + x = gate->pos.x + 7; + y = gate->pos.y + 7; + + sprite = &gSprites[spriteId]; + sprite->data0 = gateId; + sprite->coordOffsetEnabled = 1; + + sub_8060388(x + deltaX, y + deltaY, &sprite->pos1.x, &sprite->pos1.y); + RotatingGate_HideGatesOutsideViewport(sprite); + StartSpriteAffineAnim(sprite, RotatingGate_GetGateOrientation(gateId)); + + return spriteId; +} + +static void SpriteCallback_RotatingGate(struct Sprite *sprite) +{ + u8 rotationDirection; + u8 orientation; + u8 affineAnimation; + + rotationDirection = sprite->data1; + orientation = sprite->data2; + + RotatingGate_HideGatesOutsideViewport(sprite); + + if (rotationDirection == ROTATE_ANTICLOCKWISE) + { + affineAnimation = orientation + 4; + + if (GetPlayerSpeed() != 1) + affineAnimation += 8; + + PlaySE(SE_HI_TURUN); + StartSpriteAffineAnim(sprite, affineAnimation); + } + else if (rotationDirection == ROTATE_CLOCKWISE) + { + affineAnimation = orientation + 8; + + if (GetPlayerSpeed() != 1) + affineAnimation += 8; + + PlaySE(SE_HI_TURUN); + StartSpriteAffineAnim(sprite, affineAnimation); + } + + sprite->data1 = ROTATE_NONE; +} + +static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite) +{ + u16 x; + s16 x2; + u16 y; + s16 y2; + + sprite->invisible = 0; + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + + x2 = x + 0x40; // Dimensions of the rotating gate + y2 = y + 0x40; + + if ((s16)x > DISPLAY_WIDTH + 0x10 - 1 || x2 < -0x10) + { + sprite->invisible = 1; + } + + if ((s16)y > DISPLAY_HEIGHT + 0x10 - 1 || y2 < -0x10) + { + sprite->invisible = 1; + } +} + +static void LoadRotatingGatePics(void) +{ + LoadSpriteSheets(sRotatingGatesGraphicsTable); +} + +static void RotatingGate_DestroyGatesOutsideViewport(void) +{ + s16 x; + s16 x2; + s16 y; + s16 y2; + s16 xGate; + s16 yGate; + int i; + struct Sprite *sprite; + + // Same as RotatingGate_CreateGatesWithinViewport + x = gSaveBlock1.pos.x - 2; + x2 = gSaveBlock1.pos.x + 0x11; + y = gSaveBlock1.pos.y - 2; + y2 = gSaveBlock1.pos.y + 0xe; + + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + xGate = gRotatingGate_PuzzleConfig[i].pos.x + 7; + yGate = gRotatingGate_PuzzleConfig[i].pos.y + 7; + + if (gRotatingGate_GateSpriteIds[i] == MAX_SPRITES) + continue; + + if (xGate < x || xGate > x2 || yGate < y || yGate > y2) + { + sprite = &gSprites[gRotatingGate_GateSpriteIds[i]]; + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + gRotatingGate_GateSpriteIds[i] = MAX_SPRITES; + } + } +} + +#ifdef NONMATCHING +static int RotatingGate_CanRotate(u8 gateId, int rotationDirection) +{ + const struct Coords8 *armPos; + u8 orientation; + s16 x; + s16 y; + int shape; + int i; + int j; + int armOrientation; + const u8 *gateArmCollisionData; + u8 armIndex; + + if (rotationDirection == ROTATE_ANTICLOCKWISE) + armPos = sRotatingGate_ArmPositionsAntiClockwiseRotation; + else if (rotationDirection == ROTATE_CLOCKWISE) + armPos = sRotatingGate_ArmPositionsClockwiseRotation; + else + return 0; + + orientation = RotatingGate_GetGateOrientation(gateId); + + shape = gRotatingGate_PuzzleConfig[gateId].shape; + x = gRotatingGate_PuzzleConfig[gateId].pos.x + 7; + y = gRotatingGate_PuzzleConfig[gateId].pos.y + 7; + + // Loop through the gate's "arms" clockwise (north, south, east, west) + for (i = GATE_ARM_NORTH; i <= GATE_ARM_WEST; i++) + { + armOrientation = orientation + i; + gateArmCollisionData = sRotatingGate_ArmLayout[shape][i]; + + // Ensure that no part of the arm collides with the map + for (j = 0; j < GATE_ARM_MAX_LENGTH; j++) + { + armIndex = 2 * (armOrientation % 4) + j; + + if (*gateArmCollisionData) + { + if (MapGridIsImpassableAt( + armPos[armIndex].deltaX + x, armPos[armIndex].deltaY + y) == 1) + return 0; + } + gateArmCollisionData++; + } + } + + return 1; +} +#else +__attribute__((naked)) static int RotatingGate_CanRotate(u8 a, int puzzleType) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0xC\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r1, 0x1\n\ + bne _080C7EAC\n\ + ldr r0, _080C7EA8 @ =sRotatingGate_ArmPositionsAntiClockwiseRotation\n\ + mov r10, r0\n\ + b _080C7EB8\n\ + .align 2, 0\n\ +_080C7EA8: .4byte sRotatingGate_ArmPositionsAntiClockwiseRotation\n\ +_080C7EAC:\n\ + cmp r1, 0x2\n\ + beq _080C7EB4\n\ +_080C7EB0:\n\ + movs r0, 0\n\ + b _080C7F48\n\ +_080C7EB4:\n\ + ldr r1, _080C7F58 @ =sRotatingGate_ArmPositionsClockwiseRotation\n\ + mov r10, r1\n\ +_080C7EB8:\n\ + adds r0, r4, 0\n\ + bl RotatingGate_GetGateOrientation\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp]\n\ + ldr r0, _080C7F5C @ =gRotatingGate_PuzzleConfig\n\ + ldr r1, [r0]\n\ + lsls r0, r4, 3\n\ + adds r0, r1\n\ + ldrb r2, [r0, 0x4]\n\ + ldrh r1, [r0]\n\ + adds r1, 0x7\n\ + ldrh r0, [r0, 0x2]\n\ + adds r0, 0x7\n\ + movs r3, 0\n\ + lsls r2, 3\n\ + str r2, [sp, 0x4]\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + mov r9, r1\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + mov r8, r0\n\ +_080C7EE8:\n\ + movs r6, 0\n\ + ldr r2, [sp]\n\ + adds r7, r2, r3\n\ + lsls r0, r3, 1\n\ + adds r5, r7, 0\n\ + ldr r1, [sp, 0x4]\n\ + adds r0, r1\n\ + ldr r2, _080C7F60 @ =sRotatingGate_ArmLayout\n\ + adds r4, r0, r2\n\ +_080C7EFA:\n\ + adds r0, r5, 0\n\ + cmp r5, 0\n\ + bge _080C7F02\n\ + adds r0, r7, 0x3\n\ +_080C7F02:\n\ + asrs r0, 2\n\ + lsls r0, 2\n\ + subs r0, r5, r0\n\ + lsls r0, 1\n\ + adds r0, r6\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + ldrb r0, [r4]\n\ + cmp r0, 0\n\ + beq _080C7F38\n\ + lsls r1, 2\n\ + add r1, r10\n\ + movs r0, 0\n\ + ldrsb r0, [r1, r0]\n\ + add r0, r9\n\ + ldrb r1, [r1, 0x1]\n\ + lsls r1, 24\n\ + asrs r1, 24\n\ + add r1, r8\n\ + str r3, [sp, 0x8]\n\ + bl MapGridIsImpassableAt\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + ldr r3, [sp, 0x8]\n\ + cmp r0, 0x1\n\ + beq _080C7EB0\n\ +_080C7F38:\n\ + adds r4, 0x1\n\ + adds r6, 0x1\n\ + cmp r6, 0x1\n\ + ble _080C7EFA\n\ + adds r3, 0x1\n\ + cmp r3, 0x3\n\ + ble _080C7EE8\n\ + movs r0, 0x1\n\ +_080C7F48:\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_080C7F58: .4byte sRotatingGate_ArmPositionsClockwiseRotation\n\ +_080C7F5C: .4byte gRotatingGate_PuzzleConfig\n\ +_080C7F60: .4byte sRotatingGate_ArmLayout\n\ +.syntax divided\n"); +} +#endif + +#ifdef NONMATCHING +static int RotatingGate_HasArm(u8 gateId, u8 armInfo) +{ + int isLongArm; + s8 armOrientation; + int arm; + int shape; + + arm = armInfo >> 1; + isLongArm = armInfo & 1; + + armOrientation = (arm - RotatingGate_GetGateOrientation(gateId) + 4) % 4; + shape = gRotatingGate_PuzzleConfig[gateId].shape; + return sRotatingGate_ArmLayout[shape][armOrientation][isLongArm]; +} +#else +__attribute__((naked)) static int RotatingGate_HasArm(u8 a, u8 b) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + adds r4, r1, 0\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + adds r6, r0, 0\n\ + lsls r4, 24\n\ + lsrs r5, r4, 24\n\ + lsrs r4, 25\n\ + movs r0, 0x1\n\ + ands r5, r0\n\ + adds r0, r6, 0\n\ + bl RotatingGate_GetGateOrientation\n\ + subs r4, r0\n\ + adds r1, r4, 0x4\n\ + adds r0, r1, 0\n\ + cmp r1, 0\n\ + bge _080C7F8A\n\ + adds r0, r4, 0x7\n\ +_080C7F8A:\n\ + asrs r0, 2\n\ + lsls r0, 2\n\ + subs r0, r1, r0\n\ + ldr r1, _080C7FB0 @ =gRotatingGate_PuzzleConfig\n\ + ldr r2, [r1]\n\ + lsls r1, r6, 3\n\ + adds r1, r2\n\ + ldrb r1, [r1, 0x4]\n\ + ldr r2, _080C7FB4 @ =sRotatingGate_ArmLayout\n\ + lsls r0, 24\n\ + asrs r0, 23\n\ + adds r0, r5\n\ + lsls r1, 3\n\ + adds r0, r1\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_080C7FB0: .4byte gRotatingGate_PuzzleConfig\n\ +_080C7FB4: .4byte sRotatingGate_ArmLayout\n\ +.syntax divided\n"); +} +#endif + +static void RotatingGate_TriggerRotationAnimation(u8 gateId, int rotationDirection) +{ + struct Sprite *sprite; + + if (gRotatingGate_GateSpriteIds[gateId] != MAX_SPRITES) + { + sprite = &gSprites[gRotatingGate_GateSpriteIds[gateId]]; + sprite->data1 = rotationDirection; + sprite->data2 = RotatingGate_GetGateOrientation(gateId); + } +} + +#ifdef NONMATCHING +static u8 RotatingGate_GetRotationInfo(u8 direction, s16 x, s16 y) +{ + register const u8(*ptr)[][4] asm("r3"); + + if (direction == DIR_NORTH) + ptr = &sRotatingGate_RotationInfoNorth; + else if (direction == DIR_SOUTH) + ptr = &sRotatingGate_RotationInfoSouth; + else if (direction == DIR_WEST) + ptr = &sRotatingGate_RotationInfoWest; + else if (direction == DIR_EAST) + ptr = &sRotatingGate_RotationInfoEast; + else + return GATE_ROTATION_NONE; + + return (*ptr)[y][x]; +} +#else +__attribute__((naked)) static u8 RotatingGate_GetRotationInfo(u8 a, s16 b, s16 c) +{ + asm(".syntax unified\n\ + push {lr}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + adds r3, r0, 0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + lsls r2, 16\n\ + lsrs r2, 16\n\ + cmp r0, 0x2\n\ + bne _080C8008\n\ + ldr r3, _080C8004 @ =sRotatingGate_RotationInfoNorth\n\ + b _080C802A\n\ + .align 2, 0\n\ +_080C8004: .4byte sRotatingGate_RotationInfoNorth\n\ +_080C8008:\n\ + cmp r0, 0x1\n\ + bne _080C8014\n\ + ldr r3, _080C8010 @ =sRotatingGate_RotationInfoSouth\n\ + b _080C802A\n\ + .align 2, 0\n\ +_080C8010: .4byte sRotatingGate_RotationInfoSouth\n\ +_080C8014:\n\ + cmp r0, 0x3\n\ + bne _080C8020\n\ + ldr r3, _080C801C @ =sRotatingGate_RotationInfoWest\n\ + b _080C802A\n\ + .align 2, 0\n\ +_080C801C: .4byte sRotatingGate_RotationInfoWest\n\ +_080C8020:\n\ + cmp r3, 0x4\n\ + beq _080C8028\n\ + movs r0, 0xFF\n\ + b _080C8038\n\ +_080C8028:\n\ + ldr r3, _080C803C @ =sRotatingGate_RotationInfoEast\n\ +_080C802A:\n\ + lsls r0, r2, 16\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + asrs r0, 14\n\ + adds r0, r1\n\ + adds r0, r3, r0\n\ + ldrb r0, [r0]\n\ +_080C8038:\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_080C803C: .4byte sRotatingGate_RotationInfoEast\n\ +.syntax divided\n"); +} +#endif + +void RotatingGate_InitPuzzle(void) +{ + if (GetCurrentMapRotatingGatePuzzleType()) + { + RotatingGate_LoadPuzzleConfig(); + RotatingGate_ResetAllGateOrientations(); + } +} + +void RotatingGatePuzzleCameraUpdate(u16 deltaX, u16 deltaY) +{ + if (GetCurrentMapRotatingGatePuzzleType()) + { + RotatingGate_CreateGatesWithinViewport(deltaX, deltaY); + RotatingGate_DestroyGatesOutsideViewport(); + } +} + +void RotatingGate_InitPuzzleAndGraphics(void) +{ + if (GetCurrentMapRotatingGatePuzzleType()) + { + LoadRotatingGatePics(); + RotatingGate_LoadPuzzleConfig(); + RotatingGate_CreateGatesWithinViewport(0, 0); + } +} + +bool8 CheckForRotatingGatePuzzleCollision(u8 direction, s16 x, s16 y) +{ + int i; + s16 gateX; + s16 gateY; + register u32 rotationInfo asm("r0"); + int rotationDirection; + int armInfo; + s16 centerX; + s16 centerY; + + if (!GetCurrentMapRotatingGatePuzzleType()) + { + return 0; + } + + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + gateX = gRotatingGate_PuzzleConfig[i].pos.x + 7; + gateY = gRotatingGate_PuzzleConfig[i].pos.y + 7; + + if (gateX - 2 <= x && x <= gateX + 1 && gateY - 2 <= y && y <= gateY + 1) + { + centerX = x - gateX + 2; + centerY = y - gateY + 2; + rotationInfo = RotatingGate_GetRotationInfo(direction, centerX, centerY); + + if (rotationInfo != GATE_ROTATION_NONE) + { + rotationDirection = rotationInfo >> 4; + armInfo = rotationInfo & 0xF; + + asm("" ::"r"(armInfo)); + + if (RotatingGate_HasArm(i, armInfo)) + { + if (RotatingGate_CanRotate(i, rotationDirection)) + { + RotatingGate_TriggerRotationAnimation(i, rotationDirection); + RotatingGate_RotateInDirection(i, rotationDirection); + return 0; + } + + return 1; + } + } + } + } + + return 0; +} diff --git a/src/field/safari_zone.c b/src/field/safari_zone.c new file mode 100644 index 000000000..a47c8e951 --- /dev/null +++ b/src/field/safari_zone.c @@ -0,0 +1,253 @@ +#include "global.h" +#include "safari_zone.h" +#include "event_data.h" +#include "field_fadetransition.h" +#include "field_player_avatar.h" +#include "main.h" +#include "rom4.h" +#include "script.h" +#include "string_util.h" +#include "text.h" + +struct PokeblockFeeder +{ + /*0x00*/ s16 x; + /*0x02*/ s16 y; + /*0x04*/ s8 mapNum; + /*0x05*/ u8 stepCounter; + /*0x08*/ struct Pokeblock pokeblock; +}; + +#define NUM_POKEBLOCK_FEEDERS 10 + +static void ClearAllPokeblockFeeders(void); +static void DecrementFeederStepCounters(void); + +extern u8 gBattleOutcome; + +EWRAM_DATA u8 gNumSafariBalls = 0; +EWRAM_DATA static u16 gSafariZoneStepCounter = 0; +EWRAM_DATA static struct PokeblockFeeder gPokeblockFeeders[NUM_POKEBLOCK_FEEDERS] = {0}; + +extern void (*gFieldCallback)(void); + +extern u8 gUnknown_081C340A; +extern u8 gUnknown_081C342D; +extern u8 gUnknown_081C3448; +extern u8 gUnknown_081C3459; +extern u8 *gPokeblockNames[]; + +extern u16 gScriptResult; + +bool32 GetSafariZoneFlag(void) +{ + return FlagGet(SYS_SAFARI_MODE); +} + +void SetSafariZoneFlag(void) +{ + FlagSet(SYS_SAFARI_MODE); +} + +void ResetSafariZoneFlag(void) +{ + FlagReset(SYS_SAFARI_MODE); +} + +void EnterSafariMode(void) +{ + IncrementGameStat(0x11); + SetSafariZoneFlag(); + ClearAllPokeblockFeeders(); + gNumSafariBalls = 30; + gSafariZoneStepCounter = 500; +} + +void ExitSafariMode(void) +{ + ResetSafariZoneFlag(); + ClearAllPokeblockFeeders(); + gNumSafariBalls = 0; + gSafariZoneStepCounter = 0; +} + +bool8 SafariZoneTakeStep(void) +{ + if (GetSafariZoneFlag() == FALSE) + { + return FALSE; + } + + DecrementFeederStepCounters(); + gSafariZoneStepCounter--; + if (gSafariZoneStepCounter == 0) + { + ScriptContext1_SetupScript(&gUnknown_081C3448); + return TRUE; + } + return FALSE; +} + +void SafariZoneRetirePrompt(void) +{ + ScriptContext1_SetupScript(&gUnknown_081C342D); +} + +void sub_80C824C(void) +{ + if (gNumSafariBalls != 0) + { + SetMainCallback2(c2_exit_to_overworld_2_switch); + } + else if (gBattleOutcome == 8) + { + ScriptContext2_RunNewScript(&gUnknown_081C340A); + warp_in(); + gFieldCallback = sub_8080E44; + SetMainCallback2(CB2_LoadMap); + } + else if (gBattleOutcome == 7) + { + ScriptContext1_SetupScript(&gUnknown_081C3459); + ScriptContext1_Stop(); + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + } +} + +static void ClearPokeblockFeeder(u8 index) +{ + memset(&gPokeblockFeeders[index], 0, sizeof(struct PokeblockFeeder)); +} + +static void ClearAllPokeblockFeeders(void) +{ + memset(gPokeblockFeeders, 0, sizeof(gPokeblockFeeders)); +} + +void SafariZoneGetPokeblockNameInFeeder(void) +{ + s16 x, y; + u16 i; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + + for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) + { + if (gSaveBlock1.location.mapNum == gPokeblockFeeders[i].mapNum + && gPokeblockFeeders[i].x == x + && gPokeblockFeeders[i].y == y) + { + gScriptResult = i; + StringCopy(gStringVar1, gPokeblockNames[gPokeblockFeeders[i].pokeblock.color]); + return; + } + } + + gScriptResult = -1; +} + +static void GetPokeblockFeederWithinRange(void) +{ + s16 x, y; + u16 i; + + PlayerGetDestCoords(&x, &y); + + for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) + { + if (gSaveBlock1.location.mapNum == gPokeblockFeeders[i].mapNum) + { + //Get absolute value of x and y distance from Pokeblock feeder on current map + x -= gPokeblockFeeders[i].x; + y -= gPokeblockFeeders[i].y; + if (x < 0) + x *= -1; + if (y < 0) + y *= -1; + if ((x + y) <= 5) + { + gScriptResult = i; + return; + } + } + } + + gScriptResult = -1; +} + +struct Pokeblock *unref_sub_80C8418(void) +{ + SafariZoneGetPokeblockNameInFeeder(); + + if (gScriptResult == 0xFFFF) + return NULL; + else + return &gPokeblockFeeders[gScriptResult].pokeblock; +} + + +struct Pokeblock *SafariZoneGetActivePokeblock(void) +{ + GetPokeblockFeederWithinRange(); + + if (gScriptResult == 0xFFFF) + return NULL; + else + return &gPokeblockFeeders[gScriptResult].pokeblock; +} + + +void SafariZoneActivatePokeblockFeeder(u8 pokeblock_index) +{ + s16 x, y; + u8 i; + + for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) + { + //Find free entry in gPokeblockFeeders + if (gPokeblockFeeders[i].mapNum == 0 + && gPokeblockFeeders[i].x == 0 + && gPokeblockFeeders[i].y == 0) + { + //Initialize Pokeblock feeder + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + gPokeblockFeeders[i].mapNum = gSaveBlock1.location.mapNum; + gPokeblockFeeders[i].pokeblock = gSaveBlock1.pokeblocks[pokeblock_index]; + gPokeblockFeeders[i].stepCounter = 100; + gPokeblockFeeders[i].x = x; + gPokeblockFeeders[i].y = y; + break; + } + } +} + +static void DecrementFeederStepCounters(void) +{ + u8 i; + + for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) + { + if (gPokeblockFeeders[i].stepCounter != 0) + { + gPokeblockFeeders[i].stepCounter--; + if (gPokeblockFeeders[i].stepCounter == 0) + ClearPokeblockFeeder(i); + } + } +} + +bool8 unref_sub_80C853C(void) +{ + SafariZoneGetPokeblockNameInFeeder(); + + if (gScriptResult == 0xFFFF) + { + return FALSE; + } + + ConvertIntToDecimalStringN(gStringVar2, + gPokeblockFeeders[gScriptResult].stepCounter, + STR_CONV_MODE_LEADING_ZEROS, 3); + + return TRUE; +} diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c new file mode 100644 index 000000000..66578f350 --- /dev/null +++ b/src/field/scrcmd.c @@ -0,0 +1,1887 @@ +#include "global.h" +#include "battle_setup.h" +#include "berry.h" +#include "clock.h" +#include "coins.h" +#include "contest_link_80C2020.h" +#include "contest_painting.h" +#include "data2.h" +#include "decoration.h" +#include "decoration_inventory.h" +#include "event_data.h" +#include "field_door.h" +#include "field_effect.h" +#include "field_fadetransition.h" +#include "field_map_obj.h" +#include "field_map_obj_helpers.h" +#include "field_message_box.h" +#include "field_player_avatar.h" +#include "field_screen_effect.h" +#include "field_specials.h" +#include "field_tasks.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "item.h" +#include "main.h" +#include "map_obj_lock.h" +#include "menu.h" +#include "money.h" +#include "mystery_event_script.h" +#include "palette.h" +#include "party_menu.h" +#include "pokemon.h" +#include "rng.h" +#include "rom4.h" +#include "rtc.h" +#include "script.h" +#include "script_menu.h" +#include "script_movement.h" +#include "script_pokemon_80C4.h" +#include "script_pokemon_80F9.h" +#include "shop.h" +#include "slot_machine.h" +#include "sound.h" +#include "string_util.h" +#include "tv.h" + +typedef u16 (*SpecialFunc)(void); +typedef void (*NativeFunc)(void); + +extern u32 gUnknown_0202E8AC; + +static EWRAM_DATA u32 gUnknown_0202E8B0 = 0; +static EWRAM_DATA u16 gUnknown_0202E8B4 = 0; +static EWRAM_DATA u16 gUnknown_0202E8B6 = 0; +static EWRAM_DATA u16 gUnknown_0202E8B8 = 0; +static EWRAM_DATA u16 gUnknown_0202E8BA = 0; +static EWRAM_DATA u16 gUnknown_0202E8BC = 0; + +extern u16 gSpecialVar_0x8000; +extern u16 gSpecialVar_0x8001; +extern u16 gSpecialVar_0x8002; +extern u16 gSpecialVar_0x8004; + +extern u16 gScriptResult; + +extern u16 gScriptContestCategory; + +extern SpecialFunc gSpecials[]; +extern u8 *gStdScripts[]; +extern u8 *gStdScripts_End[]; + +// This is defined in here so the optimizer can't see its value when compiling +// script.c. +void * const gNullScriptPtr = NULL; + +static const u8 sScriptConditionTable[6][3] = +{ +// < = > + 1, 0, 0, // < + 0, 1, 0, // = + 0, 0, 1, // > + 1, 1, 0, // <= + 0, 1, 1, // >= + 1, 0, 1, // != +}; + +static u8 * const sScriptStringVars[] = +{ + gStringVar1, + gStringVar2, + gStringVar3, +}; + +bool8 ScrCmd_snop(struct ScriptContext *ctx) +{ + return FALSE; +} + +bool8 ScrCmd_snop1(struct ScriptContext *ctx) +{ + return FALSE; +} + +bool8 ScrCmd_end(struct ScriptContext *ctx) +{ + StopScript(ctx); + return FALSE; +} + +bool8 ScrCmd_jumpasm(struct ScriptContext *ctx) +{ + u32 addr = ScriptReadWord(ctx); + SetupNativeScript(ctx, (void *)addr); + return TRUE; +} + +bool8 ScrCmd_special(struct ScriptContext *ctx) +{ + u16 index = ScriptReadHalfword(ctx); + gSpecials[index](); + return FALSE; +} + +bool8 ScrCmd_specialval(struct ScriptContext *ctx) +{ + u16 *var = GetVarPointer(ScriptReadHalfword(ctx)); + *var = gSpecials[ScriptReadHalfword(ctx)](); + return FALSE; +} + +bool8 ScrCmd_callasm(struct ScriptContext *ctx) +{ + NativeFunc func = (NativeFunc)ScriptReadWord(ctx); + func(); + return FALSE; +} + +bool8 ScrCmd_waitstate(struct ScriptContext *ctx) +{ + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_jump(struct ScriptContext *ctx) +{ + u8 *ptr = (u8 *)ScriptReadWord(ctx); + ScriptJump(ctx, ptr); + return FALSE; +} + +bool8 ScrCmd_return(struct ScriptContext *ctx) +{ + ScriptReturn(ctx); + return FALSE; +} + +bool8 ScrCmd_call(struct ScriptContext *ctx) +{ + + u8 *ptr = (u8 *)ScriptReadWord(ctx); + ScriptCall(ctx, ptr); + return FALSE; +} + +bool8 ScrCmd_jumpif(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + u8 *ptr = (u8 *)ScriptReadWord(ctx); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) + ScriptJump(ctx, ptr); + return FALSE; +} + +bool8 ScrCmd_callif(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + u8 *ptr = (u8 *)ScriptReadWord(ctx); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) + ScriptCall(ctx, ptr); + return FALSE; +} + +bool8 ScrCmd_setvaddress(struct ScriptContext *ctx) +{ + u32 addr1 = (u32)ctx->scriptPtr - 1; + u32 addr2 = ScriptReadWord(ctx); + gUnknown_0202E8B0 = addr2 - addr1; + return FALSE; +} + +bool8 ScrCmd_vjump(struct ScriptContext *ctx) +{ + u32 addr = ScriptReadWord(ctx); + ScriptJump(ctx, (u8 *)(addr - gUnknown_0202E8B0)); + return FALSE; +} + +bool8 ScrCmd_vcall(struct ScriptContext *ctx) +{ + u32 addr = ScriptReadWord(ctx); + ScriptCall(ctx, (u8 *)(addr - gUnknown_0202E8B0)); + return FALSE; +} + +bool8 ScrCmd_if5(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) + ScriptJump(ctx, ptr); + return FALSE; +} + +bool8 ScrCmd_if6(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) + ScriptCall(ctx, ptr); + return FALSE; +} + +bool8 ScrCmd_jumpstd(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + u8 **ptr = &gStdScripts[index]; + if (ptr < gStdScripts_End) + ScriptJump(ctx, *ptr); + return FALSE; +} + +bool8 ScrCmd_callstd(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + u8 **ptr = &gStdScripts[index]; + if (ptr < gStdScripts_End) + ScriptCall(ctx, *ptr); + return FALSE; +} + +bool8 ScrCmd_jumpstdif(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + u8 index = ScriptReadByte(ctx); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) + { + u8 **ptr = &gStdScripts[index]; + if (ptr < gStdScripts_End) + ScriptJump(ctx, *ptr); + } + return FALSE; +} + +bool8 ScrCmd_callstdif(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + u8 index = ScriptReadByte(ctx); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) + { + u8 **ptr = &gStdScripts[index]; + if (ptr < gStdScripts_End) + ScriptCall(ctx, *ptr); + } + return FALSE; +} + +bool8 ScrCmd_jumpram(struct ScriptContext *ctx) +{ + ScriptJump(ctx, (u8 *)gUnknown_0202E8AC); + return FALSE; +} + +bool8 ScrCmd_die(struct ScriptContext *ctx) +{ + ClearRamScript(); + StopScript(ctx); + return TRUE; +} + +bool8 ScrCmd_setbyte(struct ScriptContext *ctx) +{ + u8 value = ScriptReadByte(ctx); + SetMysteryEventScriptStatus(value); + return FALSE; +} + +bool8 ScrCmd_loadptr(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + ctx->data[index] = ScriptReadWord(ctx); + return FALSE; +} + +bool8 ScrCmd_loadbytefrompointer(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + ctx->data[index] = *(u8 *)ScriptReadWord(ctx); + return FALSE; +} + +bool8 ScrCmd_writebytetooffset(struct ScriptContext *ctx) +{ + u8 value = ScriptReadByte(ctx); + *(u8 *)ScriptReadWord(ctx) = value; + return FALSE; +} + +bool8 ScrCmd_setbufferbyte(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + ctx->data[index] = ScriptReadByte(ctx); + return FALSE; +} + +bool8 ScrCmd_setptrbyte(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + *(u8 *)ScriptReadWord(ctx) = ctx->data[index]; + return FALSE; +} + +bool8 ScrCmd_copybuffers(struct ScriptContext *ctx) +{ + u8 destIndex = ScriptReadByte(ctx); + u8 srcIndex = ScriptReadByte(ctx); + ctx->data[destIndex] = ctx->data[srcIndex]; + return FALSE; +} + +bool8 ScrCmd_copybyte(struct ScriptContext *ctx) +{ + u8 *ptr = (u8 *)ScriptReadWord(ctx); + *ptr = *(u8 *)ScriptReadWord(ctx); + return FALSE; +} + +bool8 ScrCmd_setvar(struct ScriptContext *ctx) +{ + u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr = ScriptReadHalfword(ctx); + return FALSE; +} + +bool8 ScrCmd_copyvar(struct ScriptContext *ctx) +{ + u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr = *GetVarPointer(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_setorcopyvar(struct ScriptContext *ctx) +{ + u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr = VarGet(ScriptReadHalfword(ctx)); + return FALSE; +} + +u8 compare_012(u16 a1, u16 a2) +{ + if (a1 < a2) + return 0; + + if (a1 == a2) + return 1; + + return 2; +} + +bool8 ScrCmd_comparebuffers(struct ScriptContext *ctx) +{ + u8 value1 = ctx->data[ScriptReadByte(ctx)]; + u8 value2 = ctx->data[ScriptReadByte(ctx)]; + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_comparebuffertobyte(struct ScriptContext *ctx) +{ + u8 value1 = ctx->data[ScriptReadByte(ctx)]; + u8 value2 = ScriptReadByte(ctx); + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_comparebuffertoptrbyte(struct ScriptContext *ctx) +{ + u8 value1 = ctx->data[ScriptReadByte(ctx)]; + u8 value2 = *(u8 *)ScriptReadWord(ctx); + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_compareptrbytetobuffer(struct ScriptContext *ctx) +{ + u8 value1 = *(u8 *)ScriptReadWord(ctx); + u8 value2 = ctx->data[ScriptReadByte(ctx)]; + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_compareptrbytetobyte(struct ScriptContext *ctx) +{ + u8 value1 = *(u8 *)ScriptReadWord(ctx); + u8 value2 = ScriptReadByte(ctx); + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_compareptrbytes(struct ScriptContext *ctx) +{ + u8 value1 = *(u8 *)ScriptReadWord(ctx); + u8 value2 = *(u8 *)ScriptReadWord(ctx); + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_compare(struct ScriptContext *ctx) +{ + u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx)); + u16 value2 = ScriptReadHalfword(ctx); + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_comparevars(struct ScriptContext *ctx) +{ + u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); + u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); + ctx->comparisonResult = compare_012(*ptr1, *ptr2); + return FALSE; +} + +bool8 ScrCmd_addvar(struct ScriptContext *ctx) +{ + u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr += ScriptReadHalfword(ctx); + return FALSE; +} + +bool8 ScrCmd_subvar(struct ScriptContext *ctx) +{ + u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr -= VarGet(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_random(struct ScriptContext *ctx) +{ + u16 max = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = Random() % max; + return FALSE; +} + +bool8 ScrCmd_additem(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + u32 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = AddBagItem(itemId, (u8)quantity); + return FALSE; +} + +bool8 ScrCmd_removeitem(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + u32 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = RemoveBagItem(itemId, (u8)quantity); + return FALSE; +} + +bool8 ScrCmd_checkitemspace(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + u32 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = CheckBagHasSpace(itemId, (u8)quantity); + return FALSE; +} + +bool8 ScrCmd_checkitem(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + u32 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = CheckBagHasItem(itemId, (u8)quantity); + return FALSE; +} + +bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = GetPocketByItemId(itemId); + return FALSE; +} + +bool8 ScrCmd_addpcitem(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + u16 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = AddPCItem(itemId, quantity); + return FALSE; +} + +bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + u16 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = CheckPCHasItem(itemId, quantity); + return FALSE; +} + +bool8 ScrCmd_adddecor(struct ScriptContext *ctx) +{ + u32 decorId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = IsThereStorageSpaceForDecoration(decorId); + return FALSE; +} + +bool8 ScrCmd_removedecor(struct ScriptContext *ctx) +{ + u32 decorId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = sub_81340A8(decorId); + return FALSE; +} + +bool8 ScrCmd_checkdecor(struct ScriptContext *ctx) +{ + u32 decorId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = sub_8134074(decorId); + return FALSE; +} + +bool8 ScrCmd_testdecor(struct ScriptContext *ctx) +{ + u32 decorId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = sub_8133FE4(decorId); + return FALSE; +} + +bool8 ScrCmd_setflag(struct ScriptContext *ctx) +{ + FlagSet(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_clearflag(struct ScriptContext *ctx) +{ + FlagReset(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_checkflag(struct ScriptContext *ctx) +{ + ctx->comparisonResult = FlagGet(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_inccounter(struct ScriptContext *ctx) +{ + IncrementGameStat(ScriptReadByte(ctx)); + return FALSE; +} + +bool8 ScrCmd_lighten(struct ScriptContext *ctx) +{ + sub_8081594(ScriptReadByte(ctx)); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_darken(struct ScriptContext *ctx) +{ + u16 value = VarGet(ScriptReadHalfword(ctx)); + sub_8053CE4(value); + return FALSE; +} + +bool8 IsPaletteNotActive(void) +{ + if (!gPaletteFade.active) + return TRUE; + else + return FALSE; +} + +bool8 ScrCmd_fadescreen(struct ScriptContext *ctx) +{ + fade_screen(ScriptReadByte(ctx), 0); + SetupNativeScript(ctx, IsPaletteNotActive); + return TRUE; +} + +bool8 ScrCmd_fadescreendelay(struct ScriptContext *ctx) +{ + u8 duration = ScriptReadByte(ctx); + u8 delay = ScriptReadByte(ctx); + fade_screen(duration, delay); + SetupNativeScript(ctx, IsPaletteNotActive); + return TRUE; +} + +bool8 s28_pause_asm() +{ + gUnknown_0202E8B4--; + + if (gUnknown_0202E8B4 == 0) + return TRUE; + else + return FALSE; +} + +bool8 ScrCmd_pause(struct ScriptContext *ctx) +{ + gUnknown_0202E8B4 = ScriptReadHalfword(ctx); + SetupNativeScript(ctx, s28_pause_asm); + return TRUE; +} + +bool8 ScrCmd_compareflags(struct ScriptContext *ctx) +{ + u8 hour = VarGet(ScriptReadHalfword(ctx)); + u8 minute = VarGet(ScriptReadHalfword(ctx)); + RtcInitLocalTimeOffset(hour, minute); + return FALSE; +} + +bool8 ScrCmd_checkdailyflags(struct ScriptContext *ctx) +{ + DoTimeBasedEvents(); + return FALSE; +} + +bool8 ScrCmd_resetvars(struct ScriptContext *ctx) +{ + RtcCalcLocalTime(); + gSpecialVar_0x8000 = gLocalTime.hours; + gSpecialVar_0x8001 = gLocalTime.minutes; + gSpecialVar_0x8002 = gLocalTime.seconds; + return FALSE; +} + +bool8 ScrCmd_setweather(struct ScriptContext *ctx) +{ + u16 value = VarGet(ScriptReadHalfword(ctx)); + SetSav1Weather(value); + return FALSE; +} + +bool8 ScrCmd_resetweather(struct ScriptContext *ctx) +{ + sub_80806E4(); + return FALSE; +} + +bool8 ScrCmd_doweather(struct ScriptContext *ctx) +{ + DoCurrentWeather(); + return FALSE; +} + +bool8 ScrCmd_tileeffect(struct ScriptContext *ctx) +{ + ActivatePerStepCallback(ScriptReadByte(ctx)); + return FALSE; +} + +bool8 ScrCmd_setmapfooter(struct ScriptContext *ctx) +{ + u16 value = VarGet(ScriptReadHalfword(ctx)); + sub_8053D14(value); + return FALSE; +} + +bool8 ScrCmd_warp(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u16 v4 = VarGet(ScriptReadHalfword(ctx)); + s8 v5 = VarGet(ScriptReadHalfword(ctx)); + warp1_set(v1, v2, v3, v4, v5); + sub_8080E88(); + player_avatar_init_params_reset(); + return TRUE; +} + +bool8 ScrCmd_warpmuted(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u16 v4 = VarGet(ScriptReadHalfword(ctx)); + s8 v5 = VarGet(ScriptReadHalfword(ctx)); + warp1_set(v1, v2, v3, v4, v5); + sp13E_warp_to_last_warp(); + player_avatar_init_params_reset(); + return TRUE; +} + +bool8 ScrCmd_warpwalk(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u16 v4 = VarGet(ScriptReadHalfword(ctx)); + s8 v5 = VarGet(ScriptReadHalfword(ctx)); + warp1_set(v1, v2, v3, v4, v5); + sub_8080EF0(); + player_avatar_init_params_reset(); + return TRUE; +} + +bool8 ScrCmd_warphole(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u16 x; + u16 y; + + PlayerGetDestCoords(&x, &y); + + if (v1 == 0xFF && v2 == 0xFF) + sub_8053720(x - 7, y - 7); + else + warp1_set(v1, v2, -1, x - 7, y - 7); + + sp13F_fall_to_last_warp(); + player_avatar_init_params_reset(); + return TRUE; +} + +bool8 ScrCmd_warpteleport(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u16 v4 = VarGet(ScriptReadHalfword(ctx)); + s8 v5 = VarGet(ScriptReadHalfword(ctx)); + warp1_set(v1, v2, v3, v4, v5); + sub_8080F68(); + player_avatar_init_params_reset(); + return TRUE; +} + +bool8 ScrCmd_warp3(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u16 v4 = VarGet(ScriptReadHalfword(ctx)); + s8 v5 = VarGet(ScriptReadHalfword(ctx)); + warp1_set(v1, v2, v3, v4, v5); + return FALSE; +} + +bool8 ScrCmd_warpplace(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u16 v4 = VarGet(ScriptReadHalfword(ctx)); + s8 v5 = VarGet(ScriptReadHalfword(ctx)); + saved_warp2_set_2(0, v1, v2, v3, v4, v5); + return FALSE; +} + +bool8 ScrCmd_warp4(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u16 v4 = VarGet(ScriptReadHalfword(ctx)); + s8 v5 = VarGet(ScriptReadHalfword(ctx)); + sub_8053690(v1, v2, v3, v4, v5); + return FALSE; +} + +bool8 ScrCmd_warp5(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u16 v4 = VarGet(ScriptReadHalfword(ctx)); + s8 v5 = VarGet(ScriptReadHalfword(ctx)); + sub_80536E4(v1, v2, v3, v4, v5); + return FALSE; +} + +bool8 ScrCmd_warp6(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u16 v4 = VarGet(ScriptReadHalfword(ctx)); + s8 v5 = VarGet(ScriptReadHalfword(ctx)); + sub_805363C(v1, v2, v3, v4, v5); + return FALSE; +} + +bool8 ScrCmd_getplayerxy(struct ScriptContext *ctx) +{ + u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); + u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr1 = gSaveBlock1.pos.x; + *ptr2 = gSaveBlock1.pos.y; + return FALSE; +} + +bool8 ScrCmd_countpokemon(struct ScriptContext *ctx) +{ + gScriptResult = CalculatePlayerPartyCount(); + return FALSE; +} + +bool8 ScrCmd_playsfx(struct ScriptContext *ctx) +{ + PlaySE(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 s30_music_check_asm() +{ + if (!IsSEPlaying()) + return TRUE; + else + return FALSE; +} + +bool8 ScrCmd_checksound(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, s30_music_check_asm); + return TRUE; +} + +bool8 ScrCmd_fanfare(struct ScriptContext *ctx) +{ + PlayFanfare(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 s32_fanfare_wait_asm() +{ + return IsFanfareTaskInactive(); +} + +bool8 ScrCmd_waitfanfare(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, s32_fanfare_wait_asm); + return TRUE; +} + +bool8 ScrCmd_playmusic(struct ScriptContext *ctx) +{ + u16 songId = ScriptReadHalfword(ctx); + bool8 val = ScriptReadByte(ctx); + if (val == TRUE) + sav1_set_battle_music_maybe(songId); + PlayNewMapMusic(songId); + return FALSE; +} + +bool8 ScrCmd_playmusicbattle(struct ScriptContext *ctx) +{ + sav1_set_battle_music_maybe(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_fadedefault(struct ScriptContext *ctx) +{ + sub_8053F84(); + return FALSE; +} + +bool8 ScrCmd_fademusic(struct ScriptContext *ctx) +{ + sub_8053FB0(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_fadeout(struct ScriptContext *ctx) +{ + u8 val = ScriptReadByte(ctx); + if (val) + FadeOutBGMTemporarily(4 * val); + else + FadeOutBGMTemporarily(4); + SetupNativeScript(ctx, IsBGMPausedOrStopped); + return TRUE; +} + +bool8 ScrCmd_fadein(struct ScriptContext *ctx) +{ + u8 val = ScriptReadByte(ctx); + if (val) + FadeInBGM(4 * val); + else + FadeInBGM(4); + return FALSE; +} + +bool8 ScrCmd_move(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + void *v2 = (void *)ScriptReadWord(ctx); + exec_movement(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, v2); + gUnknown_0202E8B6 = v1; + return FALSE; +} + +bool8 ScrCmd_movecoords(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + void *v2 = (void *)ScriptReadWord(ctx); + u8 v3 = ScriptReadByte(ctx); + u8 v4 = ScriptReadByte(ctx); + exec_movement(v1, v4, v3, v2); + gUnknown_0202E8B6 = v1; + return FALSE; +} + +bool8 s51a_0806B288(void) +{ + return sub_80A212C(gUnknown_0202E8B6, gUnknown_0202E8BA, gUnknown_0202E8B8); +} + +bool8 ScrCmd_waitmove(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + if (v1) + gUnknown_0202E8B6 = v1; + gUnknown_0202E8B8 = gSaveBlock1.location.mapGroup; + gUnknown_0202E8BA = gSaveBlock1.location.mapNum; + SetupNativeScript(ctx, s51a_0806B288); + return TRUE; +} + +bool8 ScrCmd_waitmovexy(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u8 v2; + u8 v3; + + if (v1) + gUnknown_0202E8B6 = v1; + + v2 = ScriptReadByte(ctx); + v3 = ScriptReadByte(ctx); + gUnknown_0202E8B8 = v2; + gUnknown_0202E8BA = v3; + SetupNativeScript(ctx, s51a_0806B288); + return TRUE; +} + +bool8 ScrCmd_disappear(struct ScriptContext *ctx) +{ + u16 objectId = VarGet(ScriptReadHalfword(ctx)); + RemoveFieldObjectByLocalIdAndMap(objectId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + return FALSE; +} + +bool8 ScrCmd_disappearxy(struct ScriptContext *ctx) +{ + u16 objectId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + RemoveFieldObjectByLocalIdAndMap(objectId, mapNum, mapGroup); + return FALSE; +} + +bool8 ScrCmd_reappear(struct ScriptContext *ctx) +{ + u16 objectId = VarGet(ScriptReadHalfword(ctx)); + show_sprite(objectId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + return FALSE; +} + +bool8 ScrCmd_reappearxy(struct ScriptContext *ctx) +{ + u16 objectId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + show_sprite(objectId, mapNum, mapGroup); + return FALSE; +} + +bool8 ScrCmd_movesprite(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u16 v2 = VarGet(ScriptReadHalfword(ctx)); + u32 v3 = VarGet(ScriptReadHalfword(ctx)); + sub_805C0F8(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, v2, v3); + return FALSE; +} + +bool8 ScrCmd_movespriteperm(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u16 v2 = VarGet(ScriptReadHalfword(ctx)); + u32 v3 = VarGet(ScriptReadHalfword(ctx)); + update_saveblock1_field_object_coords(v1, v2, v3); + return FALSE; +} + +bool8 ScrCmd_moveoffscreen(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + sub_805C78C(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + return FALSE; +} + +bool8 ScrCmd_spritevisible(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + npc_by_local_id_and_map_set_field_1_bit_x20(v1, v3, v2, 0); + return FALSE; +} + +bool8 ScrCmd_spriteinvisible(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + npc_by_local_id_and_map_set_field_1_bit_x20(v1, v3, v2, 1); + return FALSE; +} + +bool8 ScrCmd_spritelevelup(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u8 v4 = ScriptReadByte(ctx); + sub_805BCF0(v1, v3, v2, v4 + 83); + return FALSE; +} + +bool8 ScrCmd_restorespritelevel(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + sub_805BD48(v1, v3, v2); + return FALSE; +} + +bool8 ScrCmd_faceplayer(struct ScriptContext *ctx) +{ + if (gMapObjects[gSelectedMapObject].active) + { + FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], + player_get_direction_lower_nybble()); + } + return FALSE; +} + +bool8 ScrCmd_spriteface(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u8 v2 = ScriptReadByte(ctx); + FieldObjectTurnByLocalIdAndMap(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, v2); + return FALSE; +} + +bool8 ScrCmd_spritebehave(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u8 v2 = ScriptReadByte(ctx); + update_saveblock1_field_object_movement_behavior(v1, v2); + return FALSE; +} + +bool8 ScrCmd_createvsprite(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u16 v3 = VarGet(ScriptReadHalfword(ctx)); + u32 v4 = VarGet(ScriptReadHalfword(ctx)); + u8 v5 = ScriptReadByte(ctx); + u8 v6 = ScriptReadByte(ctx); + sub_805B410(v1, v2, v3, v4, v5, v6); + return FALSE; +} + +bool8 ScrCmd_vspriteface(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + sub_8064990(v1, v2); + return FALSE; +} + +bool8 ScrCmd_lockall(struct ScriptContext *ctx) +{ + if (is_c1_link_related_active()) + { + return FALSE; + } + else + { + ScriptFreezeMapObjects(); + SetupNativeScript(ctx, sub_8064CFC); + return TRUE; + } +} + +bool8 ScrCmd_lock(struct ScriptContext *ctx) +{ + if (is_c1_link_related_active()) + { + return FALSE; + } + else + { + if (gMapObjects[gSelectedMapObject].active) + { + sub_8064DD8(); + SetupNativeScript(ctx, sub_8064DB4); + } + else + { + ScriptFreezeMapObjects(); + SetupNativeScript(ctx, sub_8064CFC); + } + + return TRUE; + } +} + +bool8 ScrCmd_releaseall(struct ScriptContext *ctx) +{ + u8 objectId; + + HideFieldMessageBox(); + objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); + sub_80A2178(); + UnfreezeMapObjects(); + return FALSE; +} + +bool8 ScrCmd_release(struct ScriptContext *ctx) +{ + u8 objectId; + + HideFieldMessageBox(); + if (gMapObjects[gSelectedMapObject].active) + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]); + objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); + sub_80A2178(); + UnfreezeMapObjects(); + return FALSE; +} + +bool8 ScrCmd_message(struct ScriptContext *ctx) +{ + u8 *msg = (u8 *)ScriptReadWord(ctx); + if (!msg) + msg = (u8 *)ctx->data[0]; + ShowFieldMessage(msg); + return FALSE; +} + +bool8 ScrCmd_message2(struct ScriptContext *ctx) +{ + u8 *msg = (u8 *)ScriptReadWord(ctx); + if (!msg) + msg = (u8 *)ctx->data[0]; + ShowFieldAutoScrollMessage(msg); + return FALSE; +} + +bool8 ScrCmd_waittext(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, IsFieldMessageBoxHidden); + return TRUE; +} + +bool8 ScrCmd_closebutton(struct ScriptContext *ctx) +{ + HideFieldMessageBox(); + return FALSE; +} + +bool8 WaitForAorBPress(void) +{ + if (gMain.newKeys & A_BUTTON) + return TRUE; + if (gMain.newKeys & B_BUTTON) + return TRUE; + return FALSE; +} + +bool8 ScrCmd_waitbutton(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, WaitForAorBPress); + return TRUE; +} + +bool8 ScrCmd_yesnobox(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + if (yes_no_box(v1, v2) == 1) + { + ScriptContext1_Stop(); + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 ScrCmd_multichoice(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u8 v4 = ScriptReadByte(ctx); + if (sub_80B5054(v1, v2, v3, v4) == 1) + { + ScriptContext1_Stop(); + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 ScrCmd_multichoicedef(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u8 v4 = ScriptReadByte(ctx); + u8 v5 = ScriptReadByte(ctx); + if (sub_80B50B0(v1, v2, v3, v5, v4) == 1) + { + ScriptContext1_Stop(); + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 ScrCmd_showbox(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u8 v4 = ScriptReadByte(ctx); + MenuDrawTextWindow(v1, v2, v3, v4); + return FALSE; +} + +bool8 ScrCmd_multichoicerow(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u8 v4 = ScriptReadByte(ctx); + u8 v5 = ScriptReadByte(ctx); + if (sub_80B5578(v1, v2, v3, v5, v4) == 1) + { + ScriptContext1_Stop(); + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 ScrCmd_hidebox(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u8 v4 = ScriptReadByte(ctx); + MenuZeroFillWindowRect(v1, v2, v3, v4); + return FALSE; +} + +bool8 ScrCmd_clearbox(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u8 v4 = ScriptReadByte(ctx); + if (Multichoice(v1, v2, v3, v4) == 1) + { + ScriptContext1_Stop(); + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 ScrCmd_showpokepic(struct ScriptContext *ctx) +{ + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + sub_80B58C4(v1, v2, v3); + return FALSE; +} + +bool8 ScrCmd_hidepokepic(struct ScriptContext *ctx) +{ + void *func = picbox_close(); + if (!func) + return FALSE; + + SetupNativeScript(ctx, func); + return TRUE; +} + +bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + if (v1) + sub_8106630(v1); + ShowContestWinner(); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_braillemsg(struct ScriptContext *ctx) +{ + u8 *ptr = (u8 *)ScriptReadWord(ctx); + u8 v2 = ptr[0]; + u8 v3 = ptr[1]; + u8 v4 = ptr[2]; + u8 v5 = ptr[3]; + u8 v6 = ptr[4]; + u8 v7 = ptr[5]; + StringBraille(gStringVar4, ptr + 6); + MenuDrawTextWindow(v2, v3, v4, v5); + MenuPrint(gStringVar4, v6, v7); + return FALSE; +} + +bool8 ScrCmd_vtext(struct ScriptContext *ctx) +{ + u32 v1 = ScriptReadWord(ctx); + ShowFieldMessage((u8 *)(v1 - gUnknown_0202E8B0)); + return FALSE; +} + +bool8 ScrCmd_bufferpoke(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 species = VarGet(ScriptReadHalfword(ctx)); + StringCopy(sScriptStringVars[stringVarIndex], gSpeciesNames[species]); + return FALSE; +} + +bool8 ScrCmd_bufferfirstpoke(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u8 *dest = sScriptStringVars[stringVarIndex]; + u8 partyIndex = GetLeadMonIndex(); + u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); + StringCopy(dest, gSpeciesNames[species]); + return FALSE; +} + +bool8 ScrCmd_bufferpartypoke(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); + GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, sScriptStringVars[stringVarIndex]); + StringGetEnd10(sScriptStringVars[stringVarIndex]); + return FALSE; +} + +bool8 ScrCmd_bufferitem(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + CopyItemName(itemId, sScriptStringVars[stringVarIndex]); + return FALSE; +} + +bool8 ScrCmd_bufferdecor(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 decorId = VarGet(ScriptReadHalfword(ctx)); + StringCopy(sScriptStringVars[stringVarIndex], gDecorations[decorId].name); + return FALSE; +} + +bool8 ScrCmd_bufferattack(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 moveId = VarGet(ScriptReadHalfword(ctx)); + StringCopy(sScriptStringVars[stringVarIndex], gMoveNames[moveId]); + return FALSE; +} + +bool8 ScrCmd_buffernum(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u8 v2 = sub_80BF0B8(v1); + ConvertIntToDecimalStringN(sScriptStringVars[stringVarIndex], v1, 0, v2); + return FALSE; +} + +bool8 ScrCmd_bufferstd(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 index = VarGet(ScriptReadHalfword(ctx)); + StringCopy(sScriptStringVars[stringVarIndex], gUnknown_083CE048[index]); + return FALSE; +} + +bool8 ScrCmd_buffertext(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u8 *text = (u8 *)ScriptReadWord(ctx); + StringCopy(sScriptStringVars[stringVarIndex], text); + return FALSE; +} + +bool8 ScrCmd_vloadptr(struct ScriptContext *ctx) +{ + u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); + StringExpandPlaceholders(gStringVar4, ptr); + return FALSE; +} + +bool8 ScrCmd_vbuffer(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u32 addr = ScriptReadWord(ctx); + u8 *src = (u8 *)(addr - gUnknown_0202E8B0); + u8 *dest = sScriptStringVars[stringVarIndex]; + StringCopy(dest, src); + return FALSE; +} + +bool8 ScrCmd_givepokemon(struct ScriptContext *ctx) +{ + u16 v3 = VarGet(ScriptReadHalfword(ctx)); + u8 v5 = ScriptReadByte(ctx); + u16 v7 = VarGet(ScriptReadHalfword(ctx)); + u32 v8 = ScriptReadWord(ctx); + u32 v9 = ScriptReadWord(ctx); + u8 v10 = ScriptReadByte(ctx); + gScriptResult = ScriptGiveMon(v3, v5, v7, v8, v9, v10); + return FALSE; +} + +bool8 ScrCmd_giveegg(struct ScriptContext *ctx) +{ + u16 value = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = ScriptGiveEgg(value); + return FALSE; +} + +bool8 ScrCmd_setpokemove(struct ScriptContext *ctx) +{ + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u16 v4 = ScriptReadHalfword(ctx); + ScriptSetMonMoveSlot(v2, v4, v3); + return FALSE; +} + +bool8 ScrCmd_checkattack(struct ScriptContext *ctx) +{ + u8 i; + u16 moveId = ScriptReadHalfword(ctx); + gScriptResult = 6; + for (i = 0; i < 6; i++) + { + u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL); + if (!species) + break; + // UB: GetMonData() arguments don't match function definition + if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && pokemon_has_move(&gPlayerParty[i], moveId) == TRUE) + { + gScriptResult = i; + gSpecialVar_0x8004 = species; + break; + } + } + return FALSE; +} + +bool8 ScrCmd_givemoney(struct ScriptContext *ctx) +{ + u32 amount = ScriptReadWord(ctx); + u8 ignore = ScriptReadByte(ctx); + if (!ignore) + sub_80B79B8(&gSaveBlock1.money, amount); + return FALSE; +} + +bool8 ScrCmd_paymoney(struct ScriptContext *ctx) +{ + u32 amount = ScriptReadWord(ctx); + u8 ignore = ScriptReadByte(ctx); + if (!ignore) + sub_80B79E0(&gSaveBlock1.money, amount); + return FALSE; +} + +bool8 ScrCmd_checkmoney(struct ScriptContext *ctx) +{ + u32 amount = ScriptReadWord(ctx); + u8 ignore = ScriptReadByte(ctx); + if (!ignore) + gScriptResult = IsEnoughMoney(gSaveBlock1.money, amount); + return FALSE; +} + +bool8 ScrCmd_showmoney(struct ScriptContext *ctx) +{ + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u8 ignore = ScriptReadByte(ctx); + if (!ignore) + sub_80B7C14(gSaveBlock1.money, v2, v3); + return FALSE; +} + +bool8 ScrCmd_hidemoney(struct ScriptContext *ctx) +{ + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + RemoveMoneyLabelObject(v2, v3); + return FALSE; +} + +bool8 ScrCmd_updatemoney(struct ScriptContext *ctx) +{ + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u8 ignore = ScriptReadByte(ctx); + if (!ignore) + sub_80B7BEC(gSaveBlock1.money, v2, v3); + return FALSE; +} + +bool8 ScrCmd_showcoins(struct ScriptContext *ctx) +{ + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + ShowCoinsWindow(gSaveBlock1.coins, v2, v3); + return FALSE; +} + +bool8 ScrCmd_hidecoins(struct ScriptContext *ctx) +{ + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + HideCoinsWindow(v2, v3); + return FALSE; +} + +bool8 ScrCmd_updatecoins(struct ScriptContext *ctx) +{ + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + UpdateCoinsWindow(gSaveBlock1.coins, v2, v3); + return FALSE; +} + +bool8 ScrCmd_trainerbattle(struct ScriptContext *ctx) +{ + ctx->scriptPtr = TrainerBattleConfigure(ctx->scriptPtr); + return FALSE; +} + +bool8 ScrCmd_reptrainerbattle(struct ScriptContext *ctx) +{ + sub_80825E4(); + return TRUE; +} + +bool8 ScrCmd_endtrainerbattle(struct ScriptContext *ctx) +{ + ctx->scriptPtr = sub_80826E8(); + return FALSE; +} + +bool8 ScrCmd_endtrainerbattle2(struct ScriptContext *ctx) +{ + ctx->scriptPtr = sub_8082700(); + return FALSE; +} + +bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx) +{ + u16 index = VarGet(ScriptReadHalfword(ctx)); + ctx->comparisonResult = trainer_flag_check(index); + return FALSE; +} + +bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) +{ + u16 index = VarGet(ScriptReadHalfword(ctx)); + trainer_flag_set(index); + return FALSE; +} + +bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx) +{ + u16 index = VarGet(ScriptReadHalfword(ctx)); + trainer_flag_clear(index); + return FALSE; +} + +bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx) +{ + u16 v2 = ScriptReadHalfword(ctx); + u8 v4 = ScriptReadByte(ctx); + u16 v5 = ScriptReadHalfword(ctx); + ScriptWildBattle(v2, v4, v5); + return FALSE; +} + +bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx) +{ + StartBattle_ScriptedWild(); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_pokemart(struct ScriptContext *ctx) +{ + void *ptr = (void *)ScriptReadWord(ctx); + CreatePokemartMenu(ptr); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_pokemartdecor(struct ScriptContext *ctx) +{ + void *ptr = (void *)ScriptReadWord(ctx); + CreateDecorationShop1Menu(ptr); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_pokemartbp(struct ScriptContext *ctx) +{ + void *ptr = (void *)ScriptReadWord(ctx); + CreateDecorationShop2Menu(ptr); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_pokecasino(struct ScriptContext *ctx) +{ + u8 v2 = VarGet(ScriptReadHalfword(ctx)); + PlaySlotMachine(v2, c2_exit_to_overworld_1_continue_scripts_restart_music); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_event_8a(struct ScriptContext *ctx) +{ + u8 v2 = ScriptReadByte(ctx); + u8 v3 = ScriptReadByte(ctx); + u8 v4 = ScriptReadByte(ctx); + if (!v3) + PlantBerryTree(v2, 0, v4, FALSE); + else + PlantBerryTree(v2, v3, v4, FALSE); + return FALSE; +} + +bool8 ScrCmd_event_96(struct ScriptContext *ctx) +{ + u16 value = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = GetPriceReduction(value); + return FALSE; +} + +bool8 ScrCmd_choosecontestpkmn(struct ScriptContext *ctx) +{ + sub_80F99CC(); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_startcontest(struct ScriptContext *ctx) +{ + sub_80C48C8(); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_showcontestresults(struct ScriptContext *ctx) +{ + sub_80C4940(); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx) +{ + sub_80C4980(gScriptContestCategory); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_doanimation(struct ScriptContext *ctx) +{ + u16 effectId = VarGet(ScriptReadHalfword(ctx)); + gUnknown_0202E8BC = effectId; + FieldEffectStart(gUnknown_0202E8BC); + return FALSE; +} + +bool8 ScrCmd_setanimation(struct ScriptContext *ctx) +{ + u8 v2 = ScriptReadByte(ctx); + gUnknown_0202FF84[v2] = (s16)VarGet(ScriptReadHalfword(ctx)); + return FALSE; +} + +static bool8 sub_8067B48() +{ + if (!FieldEffectActiveListContains(gUnknown_0202E8BC)) + return TRUE; + else + return FALSE; +} + +bool8 ScrCmd_checkanimation(struct ScriptContext *ctx) +{ + gUnknown_0202E8BC = VarGet(ScriptReadHalfword(ctx)); + SetupNativeScript(ctx, sub_8067B48); + return TRUE; +} + +bool8 ScrCmd_sethealplace(struct ScriptContext *ctx) +{ + u16 v2 = VarGet(ScriptReadHalfword(ctx)); + sub_8053588(v2); + return FALSE; +} + +bool8 ScrCmd_checkgender(struct ScriptContext *ctx) +{ + gScriptResult = gSaveBlock2.playerGender; + return FALSE; +} + +bool8 ScrCmd_pokecry(struct ScriptContext *ctx) +{ + u16 v3 = VarGet(ScriptReadHalfword(ctx)); + u16 v5 = VarGet(ScriptReadHalfword(ctx)); + PlayCry5(v3, v5); + return FALSE; +} + +bool8 ScrCmd_waitpokecry(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, IsCryFinished); + return TRUE; +} + +bool8 ScrCmd_setmaptile(struct ScriptContext *ctx) +{ + u16 v3 = VarGet(ScriptReadHalfword(ctx)); + u16 v5 = VarGet(ScriptReadHalfword(ctx)); + u16 v7 = VarGet(ScriptReadHalfword(ctx)); + u16 v8 = VarGet(ScriptReadHalfword(ctx)); + v3 += 7; + v5 += 7; + if (!v8) + MapGridSetMetatileIdAt(v3, v5, v7); + else + MapGridSetMetatileIdAt(v3, v5, v7 | 0xC00); + return FALSE; +} + +bool8 ScrCmd_setdooropened(struct ScriptContext *ctx) +{ + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; + y += 7; + PlaySE(sub_8058790(x, y)); + FieldAnimateDoorOpen(x, y); + return FALSE; +} + +bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) +{ + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; + y += 7; + FieldAnimateDoorClose(x, y); + return FALSE; +} + +static bool8 IsDoorAnimationStopped() +{ + if (!FieldIsDoorAnimationRunning()) + return TRUE; + else + return FALSE; +} + +bool8 ScrCmd_doorchange(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, IsDoorAnimationStopped); + return TRUE; +} + +bool8 ScrCmd_setdooropened2(struct ScriptContext *ctx) +{ + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; + y += 7; + FieldSetDoorOpened(x, y); + return FALSE; +} + +bool8 ScrCmd_setdoorclosed2(struct ScriptContext *ctx) +{ + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; + y += 7; + FieldSetDoorClosed(x, y); + return FALSE; +} + +bool8 ScrCmd_event_b1(struct ScriptContext *ctx) +{ + u8 v3 = ScriptReadByte(ctx); + u16 v5 = VarGet(ScriptReadHalfword(ctx)); + u16 v7 = VarGet(ScriptReadHalfword(ctx)); + u16 v9 = VarGet(ScriptReadHalfword(ctx)); + ScriptAddElevatorMenuItem(v3, v5, v7, v9); + return FALSE; +} + +bool8 ScrCmd_event_b2(struct ScriptContext *ctx) +{ + ScriptShowElevatorMenu(); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_checkcoins(struct ScriptContext *ctx) +{ + u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr = GetCoins(); + return FALSE; +} + +bool8 ScrCmd_givecoins(struct ScriptContext *ctx) +{ + u16 coins = VarGet(ScriptReadHalfword(ctx)); + if (GiveCoins(coins) == TRUE) + gScriptResult = 0; + else + gScriptResult = 1; + + return FALSE; +} + +bool8 ScrCmd_removecoins(struct ScriptContext *ctx) +{ + u16 coins = VarGet(ScriptReadHalfword(ctx)); + if (TakeCoins(coins) == TRUE) + gScriptResult = 0; + else + gScriptResult = 1; + + return FALSE; +} diff --git a/src/field/script_menu.c b/src/field/script_menu.c new file mode 100644 index 000000000..f4ac55fb9 --- /dev/null +++ b/src/field/script_menu.c @@ -0,0 +1,1134 @@ +#include "global.h" +#include "script_menu.h" +#include "event_data.h" +#include "field_effect.h" +#include "menu.h" +#include "palette.h" +#include "script.h" +#include "sound.h" +#include "sprite.h" +#include "strings.h" +#include "task.h" + +// multichoice lists +const struct MenuAction MultichoiceList_00[] = +{ + {(u8 *)OtherText_Petalburg, 0}, + {(u8 *)OtherText_Slateport, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_02[] = +{ + {(u8 *)OtherText_Enter, 0}, + {(u8 *)OtherText_Info3, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_03[] = +{ + {(u8 *)OtherText_WhatsAContest, 0}, + {(u8 *)OtherText_TypesOfContest, 0}, + {(u8 *)OtherText_Ranks, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_04[] = +{ + {(u8 *)OtherText_CoolContest, 0}, + {(u8 *)OtherText_BeautyContest, 0}, + {(u8 *)OtherText_CuteContest, 0}, + {(u8 *)OtherText_SmartContest, 0}, + {(u8 *)OtherText_ToughContest, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_06[] = +{ + {(u8 *)OtherText_Decoration, 0}, + {(u8 *)OtherText_PackUp, 0}, + {(u8 *)OtherText_Registry, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_05[] = +{ + {(u8 *)OtherText_Decoration, 0}, + {(u8 *)OtherText_PackUp, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_07[] = +{ + {(u8 *)OtherText_Register, 0}, + {(u8 *)OtherText_Registry, 0}, + {(u8 *)OtherText_Information, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_12[] = +{ + {(u8 *)OtherText_Mach, 0}, + {(u8 *)OtherText_Acro, 0}, +}; + +const struct MenuAction MultichoiceList_13[] = +{ + {(u8 *)OtherText_Poison, 0}, + {(u8 *)OtherText_Paralysis, 0}, + {(u8 *)OtherText_Sleep, 0}, + {(u8 *)OtherText_Burn, 0}, + {(u8 *)OtherText_Frozen, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_14[] = +{ + {(u8 *)OtherText_Dewford, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_16[] = +{ + {(u8 *)OtherText_SawIt, 0}, + {(u8 *)OtherText_NotYet, 0}, +}; + +const struct MenuAction MultichoiceList_17[] = +{ + {(u8 *)OtherText_Yes, 0}, + {(u8 *)OtherText_No, 0}, + {(u8 *)OtherText_Info3, 0}, +}; + +const struct MenuAction MultichoiceList_18[] = +{ + {(u8 *)OtherText_SingleBattle, 0}, + {(u8 *)OtherText_DoubleBattle, 0}, + {(u8 *)OtherText_MultiBattle, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_19[] = +{ + {(u8 *)OtherText_Littleroot, 0}, + {(u8 *)OtherText_Slateport, 0}, + {(u8 *)OtherText_Lilycove, 0}, +}; + +const struct MenuAction MultichoiceList_20[] = +{ + {(u8 *)OtherText_Yes, 0}, + {(u8 *)OtherText_No, 0}, + {(u8 *)OtherText_Info3, 0}, +}; + +const struct MenuAction MultichoiceList_23[] = +{ + {(u8 *)OtherText_MakeAChallenge, 0}, + {(u8 *)OtherText_ObtainInformation, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_24[] = +{ + {(u8 *)OtherText_Lv50_2, 0}, + {(u8 *)OtherText_Lv100_2, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_25[] = +{ + {(u8 *)OtherText_Zigzagoon, 0}, + {(u8 *)OtherText_Nincada, 0}, + {(u8 *)OtherText_Poochyena, 0}, +}; + +const struct MenuAction MultichoiceList_26[] = +{ + {(u8 *)OtherText_Nincada2, 0}, + {(u8 *)OtherText_Lotad, 0}, + {(u8 *)OtherText_Roselia, 0}, +}; + +const struct MenuAction MultichoiceList_27[] = +{ + {(u8 *)OtherText_Shroomish, 0}, + {(u8 *)OtherText_Nincada3, 0}, + {(u8 *)OtherText_Surskit, 0}, +}; + +const struct MenuAction MultichoiceList_28[] = +{ + {(u8 *)OtherText_Treecko, 0}, + {(u8 *)OtherText_Torchic, 0}, + {(u8 *)OtherText_Mudkip, 0}, +}; + +const struct MenuAction MultichoiceList_29[] = +{ + {(u8 *)OtherText_Seedot, 0}, + {(u8 *)OtherText_Shroomish2, 0}, + {(u8 *)OtherText_Spinda, 0}, +}; + +const struct MenuAction MultichoiceList_30[] = +{ + {(u8 *)OtherText_Shroomish3, 0}, + {(u8 *)OtherText_Zigzagoon2, 0}, + {(u8 *)OtherText_Wurmple, 0}, +}; + +const struct MenuAction MultichoiceList_31[] = +{ + {(u8 *)OtherText_PokeBall, 0}, + {(u8 *)OtherText_SuperPotion, 0}, + {(u8 *)OtherText_SamePrice, 0}, +}; + +const struct MenuAction MultichoiceList_32[] = +{ + {(u8 *)OtherText_Yen135, 0}, + {(u8 *)OtherText_Yen155, 0}, + {(u8 *)OtherText_Yen175, 0}, +}; + +const struct MenuAction MultichoiceList_33[] = +{ + {(u8 *)OtherText_CostMore, 0}, + {(u8 *)OtherText_CostLess, 0}, + {(u8 *)OtherText_SamePrice2, 0}, +}; + +const struct MenuAction MultichoiceList_34[] = +{ + {(u8 *)OtherText_MaleSymbol, 0}, + {(u8 *)OtherText_FemaleSymbol, 0}, + {(u8 *)OtherText_Neither, 0}, +}; + +const struct MenuAction MultichoiceList_35[] = +{ + {(u8 *)OtherText_Males, 0}, + {(u8 *)OtherText_Females, 0}, + {(u8 *)OtherText_SameNumber, 0}, +}; + +const struct MenuAction MultichoiceList_36[] = +{ + {(u8 *)OtherText_Male, 0}, + {(u8 *)OtherText_Female, 0}, + {(u8 *)OtherText_ItDepends, 0}, +}; + +const struct MenuAction MultichoiceList_37[] = +{ + {(u8 *)OtherText_Six2, 0}, + {(u8 *)OtherText_Eight2, 0}, + {(u8 *)OtherText_Ten, 0}, +}; + +const struct MenuAction MultichoiceList_38[] = +{ + {(u8 *)OtherText_One, 0}, + {(u8 *)OtherText_Two, 0}, + {(u8 *)OtherText_Three, 0}, +}; + +const struct MenuAction MultichoiceList_39[] = +{ + {(u8 *)OtherText_Six, 0}, + {(u8 *)OtherText_Seven, 0}, + {(u8 *)OtherText_Eight, 0}, +}; + +const struct MenuAction MultichoiceList_42[] = +{ + {(u8 *)OtherText_FreshWater, 0}, + {(u8 *)OtherText_SodaPop, 0}, + {(u8 *)OtherText_Lemonade, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_43[] = +{ + {(u8 *)OtherText_HowToRide, 0}, + {(u8 *)OtherText_HowToTurn, 0}, + {(u8 *)OtherText_SandySlopes, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_44[] = +{ + {(u8 *)OtherText_Wheelies, 0}, + {(u8 *)OtherText_BunnyHops, 0}, + {(u8 *)OtherText_Jumping, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_45[] = +{ + {(u8 *)OtherText_Satisfied, 0}, + {(u8 *)OtherText_Dissatisfied, 0}, +}; + +const struct MenuAction MultichoiceList_46[] = +{ + {(u8 *)OtherText_Deepseatooth, 0}, + {(u8 *)OtherText_Deepseascale, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_47[] = +{ + {(u8 *)OtherText_BlueFlute2, 0}, + {(u8 *)OtherText_YellowFlute2, 0}, + {(u8 *)OtherText_RedFlute2, 0}, + {(u8 *)OtherText_WhiteFlute2, 0}, + {(u8 *)OtherText_BlackFlute2, 0}, + {(u8 *)OtherText_GlassChair, 0}, + {(u8 *)OtherText_GlassDesk, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_48[] = +{ + {(u8 *)OtherText_TreeckoDoll, 0}, + {(u8 *)OtherText_TorchicDoll, 0}, + {(u8 *)OtherText_MudkipDoll, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_55[] = +{ + {(u8 *)OtherText_TM32, 0}, + {(u8 *)OtherText_TM29, 0}, + {(u8 *)OtherText_TM35, 0}, + {(u8 *)OtherText_TM24, 0}, + {(u8 *)OtherText_TM13, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_49[] = +{ + {(u8 *)OtherText_50Coins, 0}, + {(u8 *)OtherText_500Coins, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_50[] = +{ + {(u8 *)OtherText_Excellent, 0}, + {(u8 *)OtherText_NotSoHot, 0}, +}; + +const struct MenuAction MultichoiceList_52[] = +{ + {(u8 *)OtherText_Lilycove, 0}, + {(u8 *)OtherText_BattleTower, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_53[] = +{ + {(u8 *)OtherText_Slateport, 0}, + {(u8 *)OtherText_Lilycove, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_54[] = +{ + {(u8 *)OtherText_Right, 0}, + {(u8 *)OtherText_Left, 0}, +}; + +const struct MenuAction MultichoiceList_56[] = +{ + {(u8 *)OtherText_Slateport, 0}, + {(u8 *)OtherText_BattleTower, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_57[] = +{ + {(u8 *)OtherText_1F_2, 0}, + {(u8 *)OtherText_2F_2, 0}, + {(u8 *)OtherText_3F_2, 0}, + {(u8 *)OtherText_4F_2, 0}, + {(u8 *)OtherText_5F_2, 0}, +}; + +const struct MenuAction MultichoiceList_58[] = +{ + {(u8 *)OtherText_RedShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_59[] = +{ + {(u8 *)OtherText_YellowShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_60[] = +{ + {(u8 *)OtherText_RedShard, 0}, + {(u8 *)OtherText_YellowShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_61[] = +{ + {(u8 *)OtherText_BlueShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_62[] = +{ + {(u8 *)OtherText_RedShard, 0}, + {(u8 *)OtherText_BlueShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_63[] = +{ + {(u8 *)OtherText_YellowShard, 0}, + {(u8 *)OtherText_BlueShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_64[] = +{ + {(u8 *)OtherText_RedShard, 0}, + {(u8 *)OtherText_YellowShard, 0}, + {(u8 *)OtherText_BlueShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_65[] = +{ + {(u8 *)OtherText_GreenShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_66[] = +{ + {(u8 *)OtherText_RedShard, 0}, + {(u8 *)OtherText_GreenShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_67[] = +{ + {(u8 *)OtherText_YellowShard, 0}, + {(u8 *)OtherText_GreenShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_68[] = +{ + {(u8 *)OtherText_RedShard, 0}, + {(u8 *)OtherText_YellowShard, 0}, + {(u8 *)OtherText_GreenShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_69[] = +{ + {(u8 *)OtherText_BlueShard, 0}, + {(u8 *)OtherText_GreenShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_70[] = +{ + {(u8 *)OtherText_RedShard, 0}, + {(u8 *)OtherText_BlueShard, 0}, + {(u8 *)OtherText_GreenShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_71[] = +{ + {(u8 *)OtherText_YellowShard, 0}, + {(u8 *)OtherText_BlueShard, 0}, + {(u8 *)OtherText_GreenShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_72[] = +{ + {(u8 *)OtherText_RedShard, 0}, + {(u8 *)OtherText_YellowShard, 0}, + {(u8 *)OtherText_BlueShard, 0}, + {(u8 *)OtherText_GreenShard, 0}, + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MenuAction MultichoiceList_01[] = +{ + {(u8 *)gOtherText_CancelNoTerminator, 0}, +}; + +const struct MultichoiceListStruct gMultichoiceLists[] = +{ + {(struct MenuAction *)MultichoiceList_00, 3}, + {(struct MenuAction *)MultichoiceList_01, 1}, + {(struct MenuAction *)MultichoiceList_02, 3}, + {(struct MenuAction *)MultichoiceList_03, 4}, + {(struct MenuAction *)MultichoiceList_04, 6}, + {(struct MenuAction *)MultichoiceList_05, 3}, + {(struct MenuAction *)MultichoiceList_06, 4}, + {(struct MenuAction *)MultichoiceList_07, 4}, + {(struct MenuAction *)MultichoiceList_01, 1}, + {(struct MenuAction *)MultichoiceList_01, 1}, + {(struct MenuAction *)MultichoiceList_01, 1}, + {(struct MenuAction *)MultichoiceList_01, 1}, + {(struct MenuAction *)MultichoiceList_12, 2}, + {(struct MenuAction *)MultichoiceList_13, 6}, + {(struct MenuAction *)MultichoiceList_14, 2}, + {(struct MenuAction *)MultichoiceList_01, 1}, + {(struct MenuAction *)MultichoiceList_16, 2}, + {(struct MenuAction *)MultichoiceList_17, 3}, + {(struct MenuAction *)MultichoiceList_18, 4}, + {(struct MenuAction *)MultichoiceList_19, 3}, + {(struct MenuAction *)MultichoiceList_20, 3}, + {(struct MenuAction *)MultichoiceList_01, 1}, + {(struct MenuAction *)MultichoiceList_01, 1}, + {(struct MenuAction *)MultichoiceList_23, 3}, + {(struct MenuAction *)MultichoiceList_24, 3}, + {(struct MenuAction *)MultichoiceList_25, 3}, + {(struct MenuAction *)MultichoiceList_26, 3}, + {(struct MenuAction *)MultichoiceList_27, 3}, + {(struct MenuAction *)MultichoiceList_28, 3}, + {(struct MenuAction *)MultichoiceList_29, 3}, + {(struct MenuAction *)MultichoiceList_30, 3}, + {(struct MenuAction *)MultichoiceList_31, 3}, + {(struct MenuAction *)MultichoiceList_32, 3}, + {(struct MenuAction *)MultichoiceList_33, 3}, + {(struct MenuAction *)MultichoiceList_34, 3}, + {(struct MenuAction *)MultichoiceList_35, 3}, + {(struct MenuAction *)MultichoiceList_36, 3}, + {(struct MenuAction *)MultichoiceList_37, 3}, + {(struct MenuAction *)MultichoiceList_38, 3}, + {(struct MenuAction *)MultichoiceList_39, 3}, + {(struct MenuAction *)MultichoiceList_01, 1}, + {(struct MenuAction *)MultichoiceList_01, 1}, + {(struct MenuAction *)MultichoiceList_42, 4}, + {(struct MenuAction *)MultichoiceList_43, 4}, + {(struct MenuAction *)MultichoiceList_44, 4}, + {(struct MenuAction *)MultichoiceList_45, 2}, + {(struct MenuAction *)MultichoiceList_46, 3}, + {(struct MenuAction *)MultichoiceList_47, 8}, + {(struct MenuAction *)MultichoiceList_48, 4}, + {(struct MenuAction *)MultichoiceList_49, 3}, + {(struct MenuAction *)MultichoiceList_50, 2}, + {(struct MenuAction *)MultichoiceList_01, 1}, + {(struct MenuAction *)MultichoiceList_52, 3}, + {(struct MenuAction *)MultichoiceList_53, 3}, + {(struct MenuAction *)MultichoiceList_54, 2}, + {(struct MenuAction *)MultichoiceList_55, 6}, + {(struct MenuAction *)MultichoiceList_56, 3}, + {(struct MenuAction *)MultichoiceList_57, 5}, + {(struct MenuAction *)MultichoiceList_58, 2}, + {(struct MenuAction *)MultichoiceList_59, 2}, + {(struct MenuAction *)MultichoiceList_60, 3}, + {(struct MenuAction *)MultichoiceList_61, 2}, + {(struct MenuAction *)MultichoiceList_62, 3}, + {(struct MenuAction *)MultichoiceList_63, 3}, + {(struct MenuAction *)MultichoiceList_64, 4}, + {(struct MenuAction *)MultichoiceList_65, 2}, + {(struct MenuAction *)MultichoiceList_66, 3}, + {(struct MenuAction *)MultichoiceList_67, 3}, + {(struct MenuAction *)MultichoiceList_68, 4}, + {(struct MenuAction *)MultichoiceList_69, 3}, + {(struct MenuAction *)MultichoiceList_70, 4}, + {(struct MenuAction *)MultichoiceList_71, 4}, + {(struct MenuAction *)MultichoiceList_72, 5} +}; + +const u8 *const gUnknown_083CE048[] = +{ + OtherText_Cool2, + OtherText_Beauty3, + OtherText_Cute2, + OtherText_Smart2, + OtherText_Tough2, + OtherText_Normal, + OtherText_Super, + OtherText_Hyper, + OtherText_Master, + OtherText_Cool3, + OtherText_Beauty4, + OtherText_Cute3, + OtherText_Smart3, + OtherText_Tough3, + OtherText_Items, + OtherText_KeyItems, + OtherText_Balls, + OtherText_TMsHMs, + OtherText_Berries, +}; + +extern u8 gPCText_WhichPCShouldBeAccessed[]; + +extern u16 gScriptResult; + +bool8 sub_80B5054(u8 left, u8 top, u8 var3, u8 var4) +{ + if (FuncIsActiveTask(sub_80B52B4) == 1) + return FALSE; + else + { + gScriptResult = 0xFF; + DrawMultichoiceMenu(left, top, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4, 0); + return TRUE; + } +} + +bool8 sub_80B50B0(u8 left, u8 top, u8 var3, u8 var4, u8 var5) +{ + if (FuncIsActiveTask(sub_80B52B4) == 1) + return FALSE; + else + { + gScriptResult = 0xFF; + DrawMultichoiceMenu(left, top, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4, var5); + return TRUE; + } +} + +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; +} + +void DrawMultichoiceMenu(u8 left, u8 top, u8 count, struct MenuAction *list, u8 var4, u8 cursorPos) +{ + u16 width = GetStringWidthInTilesForScriptMenu(list[0].text); + u16 newWidth; + u8 i; + u8 right; + u8 bottom; + + for (i = 1; i < count; i++) + { + newWidth = GetStringWidthInTilesForScriptMenu(list[i].text); + if (width < newWidth) + width = newWidth; + } + + right = width; + right = (right + left) + 1; + + if (right > 29) + { + left = left + (29 - right); + right = 29; + } + + bottom = top + (2 * count + 1); + + MenuDrawTextWindow(left, top, right, bottom); + PrintMenuItems(left + 1, top + 1, count, list); + InitMenu(0, left + 1, top + 1, count, cursorPos, right - left - 1); + sub_80B5230(left, top, right, bottom, var4, count); +} + +void sub_80B5230(u8 left, u8 top, u8 right, u8 bottom, u8 unkVar, u8 count) +{ + u8 taskId = CreateTask(sub_80B52B4, 80); + + gTasks[taskId].data[0] = left; + gTasks[taskId].data[1] = top; + gTasks[taskId].data[2] = right; + gTasks[taskId].data[3] = bottom; + gTasks[taskId].data[4] = unkVar; + + if (count > 3) + gTasks[taskId].data[5] = TRUE; + else + gTasks[taskId].data[5] = FALSE; +} + +void sub_80B52B4(u8 taskId) +{ + s8 var; + + if (!gPaletteFade.active) + { + if (!gTasks[taskId].data[5]) + var = ProcessMenuInputNoWrap(); + else + var = ProcessMenuInput(); + + if (var != -2) + { + if (var == -1) + { + if (!gTasks[taskId].data[4]) + { + PlaySE(5); + gScriptResult = 127; + } + else + { + return; + } + } + else + { + gScriptResult = var; + } + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(gTasks[taskId].data[0], gTasks[taskId].data[1], gTasks[taskId].data[2], gTasks[taskId].data[3]); + DestroyTask(taskId); + EnableBothScriptContexts(); + } + } +} + +bool8 Multichoice(u8 var1, u8 var2, u8 var3, u8 var4) +{ + if (FuncIsActiveTask(sub_80B52B4) == 1) + return FALSE; + else + { + gScriptResult = 0xFF; + sub_80B53B4(var1, var2, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4); + return TRUE; + } +} + +void sub_80B53B4(u8 left, u8 top, u8 count, struct MenuAction *list, u8 var4) +{ + u16 width = GetStringWidthInTilesForScriptMenu(list[0].text); + u16 newWidth; + u8 i; + u8 right; + u8 bottom; + + for (i = 1; i < count; i++) + { + newWidth = GetStringWidthInTilesForScriptMenu(list[i].text); + if (width < newWidth) + width = newWidth; + } + + right = width; + right = (right + left) + 2; + bottom = top + (2 * count + 1); + + PrintMenuItems(left, top, count, list); + InitMenu(0, left, top, count, 0, right - left - 1); + sub_80B5230(left, top, right, bottom, var4, count); +} + +bool8 yes_no_box(u8 var1, u8 var2) +{ + u8 taskId; + + if (FuncIsActiveTask(task_yes_no_maybe) == 1) + return FALSE; + else + { + gScriptResult = 0xFF; + DisplayYesNoMenu(var1, var2, 1); + taskId = CreateTask(task_yes_no_maybe, 0x50); + gTasks[taskId].data[0] = var1; + gTasks[taskId].data[1] = var2; + return TRUE; + } +} + +// unused +bool8 IsScriptActive(void) +{ + if (gScriptResult == 0xFF) + return FALSE; + else + return TRUE; +} + +void task_yes_no_maybe(u8 taskId) +{ + u8 left, top; + + if (gTasks[taskId].data[2] < 5) + { + gTasks[taskId].data[2]++; + return; + } + + switch (ProcessMenuInputNoWrap()) + { + case -2: + return; + case -1: + case 1: + PlaySE(5); + gScriptResult = 0; + break; + case 0: + gScriptResult = 1; + break; + } + + left = gTasks[taskId].data[0]; + top = gTasks[taskId].data[1]; + + MenuZeroFillWindowRect(left, top, left + 6, top + 5); + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +bool8 sub_80B5578(u8 left, u8 top, u8 multichoiceId, u8 a4, u8 columnCount) +{ + u8 bottom = 0; + + if (FuncIsActiveTask(sub_80B5684) == TRUE) + { + return FALSE; + } + else + { + u8 taskId; + u8 width; + + gScriptResult = 0xFF; + + sub_807274C(left, top, gMultichoiceLists[multichoiceId].count, 0, gMultichoiceLists[multichoiceId].list, columnCount, 0); + + taskId = CreateTask(sub_80B5684, 80); + + if (!((gMultichoiceLists[multichoiceId].count >> 1) < columnCount || (gMultichoiceLists[multichoiceId].count & 1)) + || columnCount == 1 || gMultichoiceLists[multichoiceId].count == columnCount) + { + bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 1 + top; + } + else + { + bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 3 + top; + } + + width = sub_807288C(columnCount); + gTasks[taskId].data[0] = left; + gTasks[taskId].data[1] = top; + gTasks[taskId].data[2] = width + left + 2; + gTasks[taskId].data[3] = bottom; + gTasks[taskId].data[4] = a4; + return TRUE; + } +} + +void sub_80B5684(u8 taskId) +{ + s8 var = sub_80727CC(); + + if (var != -2) + { + if (var == -1) + { + if (!gTasks[taskId].data[4]) + { + PlaySE(5); + gScriptResult = 127; + } + else + { + return; + } + } + else + { + gScriptResult = var; + } + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(gTasks[taskId].data[0], gTasks[taskId].data[1], gTasks[taskId].data[2], gTasks[taskId].data[3]); + DestroyTask(taskId); + EnableBothScriptContexts(); + } +} + +bool8 TryCreatePCMenu(void) +{ + if (FuncIsActiveTask(sub_80B52B4) == 1) + return FALSE; + else + { + gScriptResult = 0xFF; + CreatePCMenu(); + return TRUE; + } +} + +#if ENGLISH +void CreatePCMenu(void) +{ + u16 playersPCWidth = GetStringWidthInTilesForScriptMenu(gPCText_PlayersPC); + u8 width; + u8 numChoices; + + if (playersPCWidth > GetStringWidthInTilesForScriptMenu(gPCText_SomeonesPC)) + width = playersPCWidth; + else + width = 8; + + if (FlagGet(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); + } + else + { + numChoices = 3; + MenuDrawTextWindow(0, 0, width + 2, 7); + MenuPrint(gPCText_LogOff, 1, 5); + } + + if (FlagGet(SYS_PC_LANETTE)) // player met lanette? + MenuPrint(gPCText_LanettesPC, 1, 1); + else + MenuPrint(gPCText_SomeonesPC, 1, 1); + + MenuPrint(gPCText_PlayersPC, 1, 3); + InitMenu(0, 1, 1, numChoices, 0, width + 1); + sub_80B5230(0, 0, width + 2, 2 * numChoices + 1, 0, numChoices); +} +#elif GERMAN +__attribute__((naked)) +void CreatePCMenu(void) { + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x18\n\ + ldr r0, _080B5748 @ =0x0000084b\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080B5750\n\ + ldr r0, _080B574C @ =gPCText_LanettesPC\n\ + b _080B5752\n\ + .align 2, 0\n\ +_080B5748: .4byte 0x0000084b\n\ +_080B574C: .4byte gPCText_LanettesPC\n\ +_080B5750:\n\ + ldr r0, _080B57E8 @ =gPCText_SomeonesPC\n\ +_080B5752:\n\ + bl GetStringWidthInTilesForScriptMenu\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x8]\n\ + movs r4, 0x1\n\ + ldr r0, _080B57EC @ =gPCText_PlayersPC\n\ + bl GetStringWidthInTilesForScriptMenu\n\ + lsls r1, r4, 2\n\ + add r1, sp\n\ + adds r1, 0x8\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [r1]\n\ + ldr r0, _080B57F0 @ =gPCText_LogOff\n\ + bl GetStringWidthInTilesForScriptMenu\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x10]\n\ + movs r4, 0x3\n\ + ldr r0, _080B57F4 @ =0x00000804\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080B5798\n\ + ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\ + bl GetStringWidthInTilesForScriptMenu\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x14]\n\ + movs r4, 0x4\n\ +_080B5798:\n\ + movs r5, 0\n\ + cmp r5, r4\n\ + bge _080B57B4\n\ + add r2, sp, 0x8\n\ + adds r1, r4, 0\n\ +_080B57A2:\n\ + ldr r0, [r2]\n\ + cmp r5, r0\n\ + bge _080B57AC\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ +_080B57AC:\n\ + adds r2, 0x4\n\ + subs r1, 0x1\n\ + cmp r1, 0\n\ + bne _080B57A2\n\ +_080B57B4:\n\ + ldr r0, _080B57F4 @ =0x00000804\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080B57FC\n\ + movs r7, 0x4\n\ + adds r4, r5, 0x2\n\ + lsls r2, r4, 24\n\ + lsrs r2, 24\n\ + movs r0, 0\n\ + movs r1, 0\n\ + movs r3, 0x9\n\ + bl MenuDrawTextWindow\n\ + ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\ + movs r1, 0x1\n\ + movs r2, 0x5\n\ + bl MenuPrint\n\ + ldr r0, _080B57F0 @ =gPCText_LogOff\n\ + movs r1, 0x1\n\ + movs r2, 0x7\n\ + bl MenuPrint\n\ + b _080B5818\n\ + .align 2, 0\n\ +_080B57E8: .4byte gPCText_SomeonesPC\n\ +_080B57EC: .4byte gPCText_PlayersPC\n\ +_080B57F0: .4byte gPCText_LogOff\n\ +_080B57F4: .4byte 0x00000804\n\ +_080B57F8: .4byte gPCText_HallOfFame\n\ +_080B57FC:\n\ + movs r7, 0x3\n\ + adds r4, r5, 0x2\n\ + lsls r2, r4, 24\n\ + lsrs r2, 24\n\ + movs r0, 0\n\ + movs r1, 0\n\ + movs r3, 0x7\n\ + bl MenuDrawTextWindow\n\ + ldr r0, _080B5834 @ =gPCText_LogOff\n\ + movs r1, 0x1\n\ + movs r2, 0x5\n\ + bl MenuPrint\n\ +_080B5818:\n\ + adds r6, r4, 0\n\ + ldr r0, _080B5838 @ =0x0000084b\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080B5840\n\ + ldr r0, _080B583C @ =gPCText_LanettesPC\n\ + movs r1, 0x1\n\ + movs r2, 0x1\n\ + bl MenuPrint\n\ + b _080B584A\n\ + .align 2, 0\n\ +_080B5834: .4byte gPCText_LogOff\n\ +_080B5838: .4byte 0x0000084b\n\ +_080B583C: .4byte gPCText_LanettesPC\n\ +_080B5840:\n\ + ldr r0, _080B5888 @ =gPCText_SomeonesPC\n\ + movs r1, 0x1\n\ + movs r2, 0x1\n\ + bl MenuPrint\n\ +_080B584A:\n\ + ldr r0, _080B588C @ =gPCText_PlayersPC\n\ + movs r1, 0x1\n\ + movs r2, 0x3\n\ + bl MenuPrint\n\ + movs r4, 0\n\ + str r4, [sp]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x4]\n\ + movs r0, 0\n\ + movs r1, 0x1\n\ + movs r2, 0x1\n\ + adds r3, r7, 0\n\ + bl InitMenu\n\ + lsls r2, r6, 24\n\ + lsrs r2, 24\n\ + lsls r3, r7, 1\n\ + adds r3, 0x1\n\ + str r4, [sp]\n\ + str r7, [sp, 0x4]\n\ + movs r0, 0\n\ + movs r1, 0\n\ + bl sub_80B5230\n\ + add sp, 0x18\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B5888: .4byte gPCText_SomeonesPC\n\ +_080B588C: .4byte gPCText_PlayersPC\n\ + .syntax divided\n"); +} +#endif + +void sub_80B5838(void) +{ + MenuDisplayMessageBox(); + MenuPrint(gPCText_WhichPCShouldBeAccessed, 2, 15); +} + +void task_picbox(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[0]++; + break; + case 1: + break; + case 2: + FreeResourcesAndDestroySprite(&gSprites[task->data[2]]); + task->data[0]++; + break; + case 3: + MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10); + DestroyTask(taskId); + break; + } +} + +bool8 sub_80B58C4(u16 var1, u8 var2, u8 var3) +{ + u8 taskId; + u8 var; + + if (FindTaskIdByFunc(task_picbox) != 0xFF) + return FALSE; + else + { + MenuDrawTextWindow(var2, var3, var2 + 9, var3 + 10); + taskId = CreateTask(task_picbox, 0x50); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = var1; + var = CreateMonSprite_PicBox(var1, var2 * 8 + 40, var3 * 8 + 40, 0); + gTasks[taskId].data[2] = var; + gTasks[taskId].data[3] = var2; + gTasks[taskId].data[4] = var3; + gSprites[var].callback = SpriteCallbackDummy; + gSprites[var].oam.priority = 0; + return TRUE; + } +} + +void *picbox_close(void) +{ + u8 taskId = FindTaskIdByFunc(task_picbox); + + if (taskId == 0xFF) + return NULL; + + gTasks[taskId].data[0]++; + return (void *)sub_80B59AC; +} + +bool8 sub_80B59AC(void) +{ + if (FindTaskIdByFunc(task_picbox) == 0xFF) + return TRUE; + else + return FALSE; +} diff --git a/src/field/script_movement.c b/src/field/script_movement.c new file mode 100644 index 000000000..e25b60a3c --- /dev/null +++ b/src/field/script_movement.c @@ -0,0 +1,224 @@ +#include "global.h" +#include "script_movement.h" +#include "field_map_obj.h" +#include "field_map_obj_helpers.h" +#include "task.h" +#include "util.h" + +static EWRAM_DATA u8 *gUnknown_020384F8[16] = {0}; + +static void sub_80A2198(u8); +static u8 sub_80A21E0(void); +static bool8 sub_80A21F4(u8, u8, u8 *); +static u8 sub_80A2260(u8, u8); +static bool8 sub_80A2370(u8, u8); +static void sub_80A23C8(u8, u8, u8, u8 *); +static void sub_80A2408(u8); +static void Task_80A244C(u8); +static void sub_80A2490(u8, u8, u8, u8 *); + +bool8 exec_movement(u8 a, u8 b, u8 c, u8 *d) +{ + u8 mapObjId; + + if (TryGetFieldObjectIdByLocalIdAndMap(a, b, c, &mapObjId)) + return TRUE; + if (!FuncIsActiveTask(Task_80A244C)) + sub_80A2198(50); + return sub_80A21F4(sub_80A21E0(), mapObjId, d); +} + +bool8 sub_80A212C(u8 a, u8 b, u8 c) +{ + u8 mapObjId; + u8 r4; + u8 r1; + + if (TryGetFieldObjectIdByLocalIdAndMap(a, b, c, &mapObjId)) + return 1; + r4 = sub_80A21E0(); + r1 = sub_80A2260(r4, mapObjId); + if (r1 == 16) + return 1; + return sub_80A2370(r4, r1); +} + +void sub_80A2178(void) +{ + u8 taskId; + + taskId = sub_80A21E0(); + if (taskId != 0xFF) + { + sub_80A2408(taskId); + DestroyTask(taskId); + } +} + +static void sub_80A2198(u8 priority) +{ + u8 taskId; + u8 i; + + taskId = CreateTask(Task_80A244C, priority); + for (i = 1; i < 16; i++) + gTasks[taskId].data[i] = 0xFFFF; +} + +static u8 sub_80A21E0(void) +{ + return FindTaskIdByFunc(Task_80A244C); +} + +static bool8 sub_80A21F4(u8 taskId, u8 b, u8 *c) +{ + u8 r4; + + r4 = sub_80A2260(taskId, b); + if (r4 != 16) + { + if (sub_80A2370(taskId, r4) == 0) + return TRUE; + else + { + sub_80A23C8(taskId, r4, b, c); + return FALSE; + } + } + r4 = sub_80A2260(taskId, 0xFF); + if (r4 == 16) + return TRUE; + else + { + sub_80A23C8(taskId, r4, b, c); + return FALSE; + } +} + +static u8 sub_80A2260(u8 taskId, u8 b) +{ + u8 *ptr; + u8 i; + + ptr = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < 16; i++, ptr++) + { + if (*ptr == b) + return i; + } + return 16; +} + +static void sub_80A229C(u8 taskId, u8 b, u8 **c) +{ + u8 i; + + *c = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < b; i++, (*c)++) + ; +} + +static void sub_80A22D0(u8 taskId, u8 b, u8 c) +{ + u8 *ptr; + + sub_80A229C(taskId, b, &ptr); + *ptr = c; //what is this supposed to do? +} + +static void sub_80A22F4(u8 taskId, u8 b, u8 *c) +{ + u8 *ptr; + + sub_80A229C(taskId, b, &ptr); + *c = *ptr; +} + +static void sub_80A2318(u8 a, u8 b) +{ + u16 var = ~gBitTable[b]; + + gTasks[a].data[0] &= var; +} + +static void sub_80A2348(u8 taskId, u8 b) +{ + gTasks[taskId].data[0] |= gBitTable[b]; +} + +static bool8 sub_80A2370(u8 taskId, u8 b) +{ + u16 var = (u16)gTasks[taskId].data[0] & gBitTable[b]; + + if (var != 0) + return TRUE; + else + return FALSE; +} + +static void npc_obj_offscreen_culling_and_flag_update(u8 a, u8 *b) +{ + gUnknown_020384F8[a] = b; +} + +static u8 *sub_80A23B8(u8 a) +{ + return gUnknown_020384F8[a]; +} + +static void sub_80A23C8(u8 taskId, u8 b, u8 c, u8 *d) +{ + sub_80A2318(taskId, b); + npc_obj_offscreen_culling_and_flag_update(b, d); + sub_80A22D0(taskId, b, c); +} + +static void sub_80A2408(u8 a) +{ + u8 *ptr; + u8 i; + + ptr = (u8 *)&gTasks[a].data[1]; + for (i = 0; i < 16; i++, ptr++) + { + if (*ptr != 0xFF) + UnfreezeMapObject(&gMapObjects[*ptr]); + } +} + +static void Task_80A244C(u8 taskId) +{ + u8 i; + u8 var; + + for (i = 0; i < 16; i++) + { + sub_80A22F4(taskId, i, &var); + if (var != 0xFF) + sub_80A2490(taskId, i, var, sub_80A23B8(i)); + } +} + +static void sub_80A2490(u8 taskId, u8 b, u8 c, u8 *d) +{ + u8 var; + + if (FieldObjectIsSpecialAnimActive(&gMapObjects[c]) + && !FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[c])) + return; + + var = *d; + if (var == 0xFE) + { + sub_80A2348(taskId, b); + FreezeMapObject(&gMapObjects[c]); + } + else + { + if (!FieldObjectSetSpecialAnim(&gMapObjects[c], var)) + { + d++; + npc_obj_offscreen_culling_and_flag_update(b, d); + } + } +} diff --git a/src/field/secret_base.c b/src/field/secret_base.c new file mode 100644 index 000000000..4e8331f5c --- /dev/null +++ b/src/field/secret_base.c @@ -0,0 +1,1075 @@ +#include "global.h" +#include "secret_base.h" +#include "decoration.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_fadetransition.h" +#include "field_player_avatar.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "main.h" +#include "map_constants.h" +#include "map_name_popup.h" +#include "menu.h" +#include "metatile_behavior.h" +#include "palette.h" +#include "pokemon.h" +#include "rom4.h" +#include "script.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "vars.h" + +extern u8 gUnknown_020387DC; +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; +extern u16 gSpecialVar_0x8007; +extern u16 gScriptResult; +extern const struct +{ + u16 unk_083D1358_0; + u16 unk_083D1358_1; +} gUnknown_083D1358[7]; +extern const u8 gUnknown_083D1374[4 * 16]; +extern void *gUnknown_0300485C; +extern const u8 gUnknown_083D13EC[12]; +extern u8 gUnknown_081A2E14[]; + + +void sub_80BB4AC(struct SecretBaseRecord *record) // 080bb4ac +{ + u16 i; + u16 j; + record->sbr_field_0 = 0; + for (i=0; i<7; i++) + record->sbr_field_2[i] = 0xff; + for (i=0; i<4; i++) + record->trainerId[i] = 0x00; + record->sbr_field_e = 0; + record->sbr_field_10 = 0; + record->sbr_field_11 = 0; + record->sbr_field_1_0 = 0; + record->gender = 0; + record->sbr_field_1_5 = 0; + record->sbr_field_1_6 = 0; + for (i=0; i<16; i++) { + record->decorations[i] = 0; + record->decorationPos[i] = 0; + } + for (i=0; i<6; i++) { + for (j=0; j<4; j++) { + record->partyMoves[i * 4 + j] = 0; + } + record->partyPersonality[i] = 0; + record->partyEVs[i] = 0; + record->partySpecies[i] = 0; + record->partyHeldItems[i] = 0; + record->partyLevels[i] = 0; + } +} + +void ResetSecretBase(u8 idx) // 80bb594 +{ + sub_80BB4AC(&(gSaveBlock1.secretBases[idx])); +} + +void ResetSecretBases(void) // 080bb5b4 +{ + u16 i; + for (i=0; i<20; i++) + ResetSecretBase(i); +} + +void sub_80BB5D0(void) // 080bb5d0 +{ + gUnknown_020387DC = gSpecialVar_0x8004; +} + +void sub_80BB5E4(void) // 80bb5e4 +{ + u16 idx; + gScriptResult = 0; + for (idx=0; idx<20; idx++) { + if (gUnknown_020387DC != gSaveBlock1.secretBases[idx].sbr_field_0) + continue; + gScriptResult = 1; + VarSet(VAR_0x4054, idx); + break; + } +} + +void sub_80BB63C(void) // 80bb63c +{ + if (gSaveBlock1.secretBases[0].sbr_field_0) + gScriptResult = 1; + else + gScriptResult = 0; +} + +u8 sub_80BB66C(void) // 80bb66c +{ + s16 x, y; + s16 v0; + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + v0 = MapGridGetMetatileBehaviorAt(x, y) & 0xFFF; + if (v0 == 0x90 || v0 == 0x91) + return 1; + else if (v0 == 0x92 || v0 == 0x93) + return 2; + else if (v0 == 0x9a || v0 == 0x9b) + return 3; + else if (v0 == 0x94 || v0 == 0x95) + return 4; + else if (v0 == 0x96 || v0 == 0x97 || v0 == 0x9c || v0 == 0x9d) + return 5; + else if (v0 == 0x98 || v0 == 0x99) + return 6; + return 0; +} + +void sub_80BB70C(void) // 80bb70c +{ + gSpecialVar_0x8007 = sub_80BB66C(); +} + +s16 unref_sub_80BB724(u16 *a0, u8 a1) +{ + u16 v2; + for (v2=0; v2<0x200; v2++) { + if ((a0[v2] & 0xFFF) == a1) + return (s16)v2; + } + return -1; +} + +void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3) +{ + s16 x, y; + for (y=0; yheight; y++) { + for (x=0; xwidth; x++) { + if ((gMapHeader.mapData->map[y * gMapHeader.mapData->width + x] & 0x3ff) == arg3) { + *arg1 = x; + *arg2 = y; + return; + } + } + } +} + +void sub_80BB800(void) +{ + s16 x, y; + s16 tile_id; + u16 idx; + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + tile_id = MapGridGetMetatileIdAt(x, y); + for (idx=0; idx<7; idx++) { + if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { + MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); + CurrentMapDrawMetatileAt(x, y); + return; + } + } + for (idx=0; idx<7; idx++) { + if (gUnknown_083D1358[idx].unk_083D1358_1 == tile_id) { + MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_0 | 0xc00); + CurrentMapDrawMetatileAt(x, y); + return; + } + } +} + +u8 sub_80BB8A8(u8 *arg1) +{ + u8 idx; + for (idx=0; idx<7; idx++) { + if (arg1[idx] == EOS) + return idx; + } + return 7; +} + +void sub_80BB8CC(void) +{ + u8 nameLength; + u16 idx; + gSaveBlock1.secretBases[0].sbr_field_0 = gUnknown_020387DC; + for (idx=0; idx<4; idx++) { + gSaveBlock1.secretBases[0].trainerId[idx] = gSaveBlock2.playerTrainerId[idx]; + } + VarSet(VAR_0x4054, 0); + nameLength = sub_80BB8A8(gSaveBlock2.playerName); + memset(gSaveBlock1.secretBases[0].sbr_field_2, 0xFF, 7); + StringCopyN(gSaveBlock1.secretBases[0].sbr_field_2, gSaveBlock2.playerName, nameLength); + gSaveBlock1.secretBases[0].gender = gSaveBlock2.playerGender; + VarSet(VAR_SECRET_BASE_MAP, gMapHeader.regionMapSectionId); +} + +void sub_80BB970(struct MapEvents *events) +{ + u16 bgevidx, idx, jdx; + s16 tile_id; + for (bgevidx=0; bgevidxbgEventCount; bgevidx++) { + if (events->bgEvents[bgevidx].kind == 8) { + for (jdx=0; jdx<20; jdx++) { + if (gSaveBlock1.secretBases[jdx].sbr_field_0 == events->bgEvents[bgevidx].bgUnion.secretBaseId) { + tile_id = MapGridGetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7); + for (idx=0; idx<7; idx++) { + if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { + MapGridSetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); + break; + } + } + break; + } + } + } + } +} + +void sub_80BBA14(void) +{ + s8 idx = 4 * (gUnknown_020387DC / 10); + warp1_set_2(MAP_GROUP_SECRET_BASE_RED_CAVE1, gUnknown_083D1374[idx], gUnknown_083D1374[idx + 1]); +} + +void sub_80BBA48(u8 taskid) +{ + u16 curbaseid; + switch (gTasks[taskid].data[0]) { + case 0: + gTasks[taskid].data[0] = 1; + break; + case 1: + if (!gPaletteFade.active) { + gTasks[taskid].data[0] = 2; + } + break; + case 2: + curbaseid = VarGet(VAR_0x4054); + if (gSaveBlock1.secretBases[curbaseid].sbr_field_10 < 0xff) + gSaveBlock1.secretBases[curbaseid].sbr_field_10 ++; + sub_80BBA14(); + warp_in(); + gFieldCallback = sub_8080990; + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskid); + break; + } +} + +void sub_80BBAF0(void) +{ + CreateTask(sub_80BBA48, 0); + fade_screen(1, 0); + saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); +} + +bool8 sub_80BBB24(void) +{ + if (gMapHeader.mapType == 9 && VarGet(VAR_0x4097) == 0) + return FALSE; + return TRUE; +} + +void sub_80BBB50(u8 taskid) +{ + FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); + if (sub_807D770() == 1) { + EnableBothScriptContexts(); + DestroyTask(taskid); + } +} + +void sub_80BBB90(void) +{ + s16 x, y; + ScriptContext2_Enable(); + HideMapNamePopup(); + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe20); + CurrentMapDrawMetatileAt(x + 7, y + 7); + pal_fill_black(); + CreateTask(sub_80BBB50, 0); +} + +void sub_80BBBEC(u8 taskid) +{ + s8 idx; + if (!gPaletteFade.active) { + idx = 4 * (gUnknown_020387DC / 10); + warp1_set(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gUnknown_083D1374[idx + 2], gUnknown_083D1374[idx + 3]); + warp_in(); + gFieldCallback = sub_80BBB90; + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskid); + } +} + +void sub_80BBC78(void) +{ + u8 taskid = CreateTask(sub_80BBBEC, 0); + gTasks[taskid].data[0] = 0; + fade_screen(1, 0); +} + +bool8 CurrentMapIsSecretBase(void) +{ + if (gSaveBlock1.location.mapGroup == MAP_GROUP_SECRET_BASE_SHRUB4 && (u8)(gSaveBlock1.location.mapNum) <= MAP_ID_SECRET_BASE_SHRUB4) + return TRUE; + return FALSE; +} + +#ifdef NONMATCHING +void sub_80BBCCC(u8 flagIn) +{ + u16 curBaseId; + u16 x, y; + if (CurrentMapIsSecretBase()) { + curBaseId = VarGet(VAR_0x4054); + for (x=0; x<16; x++) { + if ((u8)(gSaveBlock1.secretBases[curBaseId].decorations[x] - 1) <= 0x77 && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].decor_field_11 != 4) { + sub_80FF394((gSaveBlock1.secretBases[0].decorationPos[x] >> 4) + 7, (gSaveBlock1.secretBases[0].decorationPos[x] & 0xF) + 7, gSaveBlock1.secretBases[curBaseId].decorations[x]); + } + } + if (curBaseId != 0) { + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe21); + } else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) { + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe0a); + } + } +} + +void sub_80BBDD0(void) +{ + u8 *roomdecor; + u8 *roomdecorpos; + u8 ndecor; + u8 decidx; + u8 objid = 0; + u8 metatile; + u16 curBase = VarGet(VAR_0x4054); + if (!CurrentMapIsSecretBase()) { + roomdecor = gSaveBlock1.playerRoomDecor; + roomdecorpos = gSaveBlock1.playerRoomDecorPos; + ndecor = 12; + } else { + roomdecor = gSaveBlock1.secretBases[curBase].decorations; + roomdecorpos = gSaveBlock1.secretBases[curBase].decorationPos; + ndecor = 16; + } + for (decidx=0; decidxmapObjectCount; objid++) { + if (gMapHeader.events->mapObjects[objid].flagId == gSpecialVar_0x8004 + 0xAE) + break; + } + if (objid != gMapHeader.events->mapObjectCount) { + gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4; + gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF; + metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7); + if (sub_80572D8(metatile) == 1 || sub_80572EC(metatile) == 1) { + gScriptResult = gMapHeader.events->mapObjects[objid].graphicsId + 0x3f20; + VarSet(gScriptResult, gDecorations[roomdecor[decidx]].tiles[0]); + gScriptResult = gMapHeader.events->mapObjects[objid].localId; + FlagReset(gSpecialVar_0x8004 + 0xAE); + show_sprite(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + sub_805C0F8(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); + sub_805C78C(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + gSpecialVar_0x8004 ++; + } + } + } +} + +#else +__attribute__((naked)) +void sub_80BBCCC(u8 flagIn) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + bl CurrentMapIsSecretBase\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080BBDBC\n\ + ldr r0, _080BBD70 @ =0x00004054\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + movs r1, 0\n\ + mov r0, sp\n\ + strh r1, [r0]\n\ + ldr r6, _080BBD74 @ =gSaveBlock1\n\ + mov r4, sp\n\ + ldr r0, _080BBD78 @ =0x00001a2a\n\ + adds r7, r6, r0\n\ +_080BBCFC:\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 5\n\ + ldrh r1, [r4]\n\ + adds r2, r0, r1\n\ + ldr r1, _080BBD7C @ =0x00001a1a\n\ + adds r0, r6, r1\n\ + adds r1, r2, r0\n\ + ldrb r0, [r1]\n\ + subs r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x77\n\ + bhi _080BBD3A\n\ + ldr r0, _080BBD80 @ =gDecorations\n\ + ldrb r3, [r1]\n\ + lsls r1, r3, 5\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x11]\n\ + cmp r0, 0x4\n\ + beq _080BBD3A\n\ + adds r0, r2, r7\n\ + ldrb r2, [r0]\n\ + lsrs r0, r2, 4\n\ + adds r0, 0x7\n\ + movs r1, 0xF\n\ + ands r1, r2\n\ + adds r1, 0x7\n\ + adds r2, r3, 0\n\ + bl sub_80FF394\n\ +_080BBD3A:\n\ + ldrh r0, [r4]\n\ + adds r0, 0x1\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + strh r0, [r4]\n\ + cmp r0, 0xF\n\ + bls _080BBCFC\n\ + cmp r5, 0\n\ + beq _080BBD88\n\ + mov r4, sp\n\ + adds r4, 0x2\n\ + movs r2, 0x88\n\ + lsls r2, 2\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl sub_80BB764\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + adds r0, 0x7\n\ + ldrh r1, [r4]\n\ + adds r1, 0x7\n\ + ldr r2, _080BBD84 @ =0x00000e21\n\ + bl MapGridSetMetatileIdAt\n\ + b _080BBDBC\n\ + .align 2, 0\n\ +_080BBD70: .4byte 0x00004054\n\ +_080BBD74: .4byte gSaveBlock1\n\ +_080BBD78: .4byte 0x00001a2a\n\ +_080BBD7C: .4byte 0x00001a1a\n\ +_080BBD80: .4byte gDecorations\n\ +_080BBD84: .4byte 0x00000e21\n\ +_080BBD88:\n\ + mov r0, r8\n\ + cmp r0, 0x1\n\ + bne _080BBDBC\n\ + ldr r0, _080BBDC8 @ =0x00004089\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bne _080BBDBC\n\ + mov r4, sp\n\ + adds r4, 0x2\n\ + movs r2, 0x88\n\ + lsls r2, 2\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl sub_80BB764\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + adds r0, 0x7\n\ + ldrh r1, [r4]\n\ + adds r1, 0x7\n\ + ldr r2, _080BBDCC @ =0x00000e0a\n\ + bl MapGridSetMetatileIdAt\n\ +_080BBDBC:\n\ + add sp, 0x4\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080BBDC8: .4byte 0x00004089\n\ +_080BBDCC: .4byte 0x00000e0a\n\ +.syntax divided\n"); +} + +__attribute__((naked)) +void sub_80BBDD0(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + ldr r0, _080BBE00 @ =0x00004054\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + bl CurrentMapIsSecretBase\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _080BBE08\n\ + ldr r0, _080BBE04 @ =gSaveBlock1 + 0x2688\n\ + str r0, [sp, 0x4]\n\ + adds r0, 0xC\n\ + str r0, [sp, 0x8]\n\ + movs r1, 0xC\n\ + str r1, [sp, 0xC]\n\ + b _080BBE1E\n\ + .align 2, 0\n\ +_080BBE00: .4byte 0x00004054\n\ +_080BBE04: .4byte gSaveBlock1 + 0x2688\n\ +_080BBE08:\n\ + lsls r1, r4, 2\n\ + adds r1, r4\n\ + lsls r1, 5\n\ + ldr r0, _080BBF7C @ =gSaveBlock1 + 0x1A1A\n\ + adds r2, r1, r0\n\ + str r2, [sp, 0x4]\n\ + adds r0, 0x10\n\ + adds r1, r0\n\ + str r1, [sp, 0x8]\n\ + movs r3, 0x10\n\ + str r3, [sp, 0xC]\n\ +_080BBE1E:\n\ + movs r6, 0\n\ + ldr r4, [sp, 0xC]\n\ + cmp r6, r4\n\ + bcc _080BBE28\n\ + b _080BBF6C\n\ +_080BBE28:\n\ + ldr r5, _080BBF80 @ =gSaveBlock1\n\ + mov r10, r5\n\ +_080BBE2C:\n\ + ldr r1, [sp, 0x4]\n\ + adds r0, r1, r6\n\ + ldrb r1, [r0]\n\ + mov r9, r0\n\ + adds r2, r6, 0x1\n\ + str r2, [sp, 0x10]\n\ + cmp r1, 0\n\ + bne _080BBE3E\n\ + b _080BBF5E\n\ +_080BBE3E:\n\ + ldrb r0, [r0]\n\ + lsls r0, 5\n\ + ldr r3, _080BBF84 @ =gDecorations\n\ + adds r0, r3\n\ + ldrb r0, [r0, 0x11]\n\ + cmp r0, 0x4\n\ + beq _080BBE4E\n\ + b _080BBF5E\n\ +_080BBE4E:\n\ + movs r5, 0\n\ + ldr r0, _080BBF88 @ =gMapHeader\n\ + ldr r2, [r0, 0x4]\n\ + ldrb r3, [r2]\n\ + mov r8, r0\n\ + cmp r5, r3\n\ + bcs _080BBE8E\n\ + ldr r0, [r2, 0x4]\n\ + ldrh r1, [r0, 0x14]\n\ + ldr r4, _080BBF8C @ =gSpecialVar_0x8004\n\ + ldrh r0, [r4]\n\ + adds r0, 0xAE\n\ + adds r7, r4, 0\n\ + cmp r1, r0\n\ + beq _080BBE8E\n\ + adds r4, r2, 0\n\ + adds r2, r3, 0\n\ +_080BBE70:\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, r2\n\ + bcs _080BBE8E\n\ + ldr r1, [r4, 0x4]\n\ + lsls r0, r5, 1\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldrh r1, [r0, 0x14]\n\ + ldrh r0, [r7]\n\ + adds r0, 0xAE\n\ + cmp r1, r0\n\ + bne _080BBE70\n\ +_080BBE8E:\n\ + mov r1, r8\n\ + ldr r0, [r1, 0x4]\n\ + ldrb r0, [r0]\n\ + cmp r5, r0\n\ + beq _080BBF5E\n\ + ldr r7, _080BBF90 @ =gSpecialVar_0x8006\n\ + ldr r2, [sp, 0x8]\n\ + adds r1, r2, r6\n\ + ldrb r0, [r1]\n\ + lsrs r0, 4\n\ + strh r0, [r7]\n\ + ldr r6, _080BBF94 @ =gSpecialVar_0x8007\n\ + ldrb r1, [r1]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + strh r0, [r6]\n\ + ldrh r0, [r7]\n\ + adds r0, 0x7\n\ + ldrh r1, [r6]\n\ + adds r1, 0x7\n\ + bl MapGridGetMetatileBehaviorAt\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + adds r0, r4, 0\n\ + bl sub_80572D8\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _080BBEDA\n\ + adds r0, r4, 0\n\ + bl sub_80572EC\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _080BBF5E\n\ +_080BBEDA:\n\ + mov r3, r8\n\ + ldr r0, [r3, 0x4]\n\ + ldr r1, [r0, 0x4]\n\ + lsls r4, r5, 1\n\ + adds r4, r5\n\ + lsls r4, 3\n\ + adds r1, r4, r1\n\ + ldr r5, _080BBF98 @ =0x00003f20\n\ + adds r0, r5, 0\n\ + ldrb r1, [r1, 0x1]\n\ + adds r0, r1\n\ + ldr r1, _080BBF9C @ =gScriptResult\n\ + strh r0, [r1]\n\ + ldrh r0, [r1]\n\ + mov r2, r9\n\ + ldrb r1, [r2]\n\ + lsls r1, 5\n\ + ldr r3, _080BBFA0 @ =gDecorations + 0x1C\n\ + adds r1, r3\n\ + ldr r1, [r1]\n\ + ldrh r1, [r1]\n\ + bl VarSet\n\ + mov r5, r8\n\ + ldr r0, [r5, 0x4]\n\ + ldr r0, [r0, 0x4]\n\ + adds r4, r0\n\ + ldrb r0, [r4]\n\ + ldr r1, _080BBF9C @ =gScriptResult\n\ + strh r0, [r1]\n\ + ldr r2, _080BBF8C @ =gSpecialVar_0x8004\n\ + ldrh r0, [r2]\n\ + adds r0, 0xAE\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + bl FlagReset\n\ + ldr r3, _080BBF9C @ =gScriptResult\n\ + ldrb r0, [r3]\n\ + mov r4, r10\n\ + ldrb r1, [r4, 0x5]\n\ + ldrb r2, [r4, 0x4]\n\ + bl show_sprite\n\ + ldr r5, _080BBF9C @ =gScriptResult\n\ + ldrb r0, [r5]\n\ + ldrb r1, [r4, 0x5]\n\ + ldrb r2, [r4, 0x4]\n\ + movs r4, 0\n\ + ldrsh r3, [r7, r4]\n\ + movs r5, 0\n\ + ldrsh r4, [r6, r5]\n\ + str r4, [sp]\n\ + bl sub_805C0F8\n\ + ldr r1, _080BBF9C @ =gScriptResult\n\ + ldrb r0, [r1]\n\ + mov r2, r10\n\ + ldrb r1, [r2, 0x5]\n\ + ldrb r2, [r2, 0x4]\n\ + bl sub_805C78C\n\ + ldr r3, _080BBF8C @ =gSpecialVar_0x8004\n\ + ldrh r0, [r3]\n\ + adds r0, 0x1\n\ + strh r0, [r3]\n\ +_080BBF5E:\n\ + ldr r4, [sp, 0x10]\n\ + lsls r0, r4, 24\n\ + lsrs r6, r0, 24\n\ + ldr r5, [sp, 0xC]\n\ + cmp r6, r5\n\ + bcs _080BBF6C\n\ + b _080BBE2C\n\ +_080BBF6C:\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080BBF7C: .4byte gSaveBlock1 + 0x1A1A\n\ +_080BBF80: .4byte gSaveBlock1\n\ +_080BBF84: .4byte gDecorations\n\ +_080BBF88: .4byte gMapHeader\n\ +_080BBF8C: .4byte gSpecialVar_0x8004\n\ +_080BBF90: .4byte gSpecialVar_0x8006\n\ +_080BBF94: .4byte gSpecialVar_0x8007\n\ +_080BBF98: .4byte 0x00003f20\n\ +_080BBF9C: .4byte gScriptResult\n\ +_080BBFA0: .4byte gDecorations + 0x1C\n\ +.syntax divided\n"); +} +#endif + +void sub_80BBFA4(void) +{ + int curBase = VarGet(VAR_0x4054); + VarSet(VAR_0x401F, gUnknown_083D13EC[sub_80BCCA4(curBase)]); +} + +void sub_80BBFD8(s16 *position, struct MapEvents *events) +{ + s16 bgevtidx; + for (bgevtidx=0; bgevtidxbgEventCount; bgevtidx++) { + if (events->bgEvents[bgevtidx].kind == 8 && position[0] == events->bgEvents[bgevtidx].x + 7 && position[1] == events->bgEvents[bgevtidx].y + 7) { + gUnknown_020387DC = events->bgEvents[bgevtidx].bgUnion.secretBaseId; + break; + } + } +} + +void sub_80BC038(s16 *position, struct MapEvents *events) +{ + sub_80BBFD8(position, events); + sub_80BB5E4(); + ScriptContext1_SetupScript(gUnknown_081A2E14); +} + +bool8 sub_80BC050(void) +{ + sub_80BB5D0(); + sub_80BB5E4(); + if (gScriptResult == 1) + return FALSE; + return TRUE; +} + +void sub_80BC074(u8 taskid) +{ + switch (gTasks[taskid].data[0]) { + case 0: + ScriptContext2_Enable(); + gTasks[taskid].data[0] = 1; + break; + case 1: + if (!gPaletteFade.active) { + gTasks[taskid].data[0] = 2; + } + break; + case 2: + copy_saved_warp2_bank_and_enter_x_to_warp1(0x7E); + warp_in(); + gFieldCallback = mapldr_default; + SetMainCallback2(CB2_LoadMap); + ScriptContext2_Disable(); + DestroyTask(taskid); + break; + } +} + +void sub_80BC0F8(void) { + CreateTask(sub_80BC074, 0); + fade_screen(1, 0); +} + +void sub_80BC114(void) { + if (gSaveBlock1.secretBases[0].sbr_field_0 != gUnknown_020387DC) + gScriptResult = 1; + else + gScriptResult = 0; +} + +u8 sub_80BC14C(u8 sbid) +{ + s16 idx; + for (idx=0; idx<20; idx++) { + if (gSaveBlock1.secretBases[idx].sbr_field_0 == sbid) + return idx; + } + return 0; +} + +u8 *sub_80BC190(u8 *dest, u8 arg1) { // 80bc190 + u8 local1; + u8 *str; + + local1 = sub_80BB8A8(gSaveBlock1.secretBases[arg1].sbr_field_2); + + str = StringCopyN(dest, gSaveBlock1.secretBases[arg1].sbr_field_2, local1); + str[0] = EOS; + +#if ENGLISH + return StringAppend(dest, gOtherText_PlayersBase); +#elif GERMAN + return de_sub_8073174(dest, gOtherText_PlayersBase); +#endif +} + +u8 *GetSecretBaseMapName(u8 *dest) { + gUnknown_020387DC = gSaveBlock1.secretBases[VarGet(VAR_0x4054)].sbr_field_0; + return sub_80BC190(dest, VarGet(VAR_0x4054)); +} + +void sub_80BC224(void) { + u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_0x4054)].sbr_field_2; + u8 *var1 = gStringVar1; + u8 var2 = sub_80BB8A8(var0); + u8 *var3 = StringCopyN(var1, var0, var2); + *var3 = EOS; +} + +u8 sub_80BC268(u8 foo) { // 80bc268 + if (gSaveBlock1.secretBases[foo].sbr_field_1_6) + return 1; + return 0; +} + +u8 sub_80BC298(struct Pokemon *mon) { // 80bc298 + u16 evsum = GetMonData(mon, MON_DATA_HP_EV); + evsum += GetMonData(mon, MON_DATA_ATK_EV); + evsum += GetMonData(mon, MON_DATA_DEF_EV); + evsum += GetMonData(mon, MON_DATA_SPD_EV); + evsum += GetMonData(mon, MON_DATA_SPATK_EV); + evsum += GetMonData(mon, MON_DATA_SPDEF_EV); + return (u8)(evsum / 6); +} + +#ifdef NONMATCHING +void sub_80BC300(void) +{ + u16 moveidx; + u16 sbpartyidx = 0; + int resetVal = 0; + u16 partyidx = 0; + while (partyidx < 6) { + partyidx ++; + for (moveidx=0; moveidx<4; moveidx++) { + gSaveBlock1.secretBases[0].partyMoves[(partyidx - 1) * 6 + moveidx] = resetVal; + } + gSaveBlock1.secretBases[0].partySpecies[partyidx - 1] = resetVal; + gSaveBlock1.secretBases[0].partyHeldItems[partyidx - 1] = resetVal; + gSaveBlock1.secretBases[0].partyLevels[partyidx - 1] = resetVal; + gSaveBlock1.secretBases[0].partyPersonality[partyidx - 1] = resetVal; + gSaveBlock1.secretBases[0].partyEVs[partyidx - 1] = resetVal; + if (GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_SPECIES) != 0 && !GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_IS_EGG)) { + sbpartyidx ++; + for (moveidx=0; moveidx<4; moveidx++) { + gSaveBlock1.secretBases[0].partyMoves[(sbpartyidx - 1) * 6 + moveidx] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_MOVE1 + moveidx); + } + gSaveBlock1.secretBases[0].partySpecies[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_SPECIES); + gSaveBlock1.secretBases[0].partyHeldItems[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_HELD_ITEM); + gSaveBlock1.secretBases[0].partyLevels[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_LEVEL); + gSaveBlock1.secretBases[0].partyPersonality[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_PERSONALITY); + gSaveBlock1.secretBases[0].partyEVs[sbpartyidx - 1] = sub_80BC298(&(gPlayerParty[partyidx - 1])); + } + } +} +#else +__attribute__((naked)) +void sub_80BC300(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0xC\n\ + movs r0, 0\n\ + mov r10, r0\n\ + movs r6, 0\n\ + mov r9, r6\n\ +_080BC314:\n\ + movs r4, 0\n\ + lsls r3, r6, 2\n\ + lsls r2, r6, 1\n\ + ldr r7, _080BC424 @ =gPlayerParty\n\ + adds r1, r6, 0x1\n\ + str r1, [sp]\n\ + adds r1, r3, 0\n\ +_080BC322:\n\ + adds r0, r1, r4\n\ + lsls r0, 1\n\ + ldr r5, _080BC428 @ =gSaveBlock1 + 0x1A54\n\ + adds r0, r5, r0\n\ + mov r5, r9\n\ + strh r5, [r0]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + cmp r4, 0x3\n\ + bls _080BC322\n\ + ldr r1, _080BC42C @ =gSaveBlock1 + 0x1A84\n\ + adds r0, r1, r2\n\ + strh r5, [r0]\n\ + ldr r5, _080BC430 @ =gSaveBlock1 + 0x1A90\n\ + adds r0, r5, r2\n\ + mov r1, r9\n\ + strh r1, [r0]\n\ + ldr r2, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\ + adds r0, r2, r6\n\ + mov r5, r9\n\ + strb r5, [r0]\n\ + ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\ + adds r0, r1, r3\n\ + mov r2, r9\n\ + str r2, [r0]\n\ + ldr r3, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\ + adds r0, r3, r6\n\ + strb r2, [r0]\n\ + movs r0, 0x64\n\ + adds r5, r6, 0\n\ + muls r5, r0\n\ + adds r4, r5, r7\n\ + adds r0, r4, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _080BC408\n\ + adds r0, r4, 0\n\ + movs r1, 0x2D\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _080BC408\n\ + movs r4, 0\n\ + mov r0, r10\n\ + lsls r0, 2\n\ + mov r8, r0\n\ + mov r1, r10\n\ + lsls r7, r1, 1\n\ + adds r1, 0x1\n\ + str r1, [sp, 0x4]\n\ + ldr r2, _080BC424 @ =gPlayerParty\n\ +_080BC38E:\n\ + adds r1, r4, 0\n\ + adds r1, 0xD\n\ + adds r0, r5, r2\n\ + str r2, [sp, 0x8]\n\ + bl GetMonData\n\ + mov r3, r8\n\ + adds r1, r3, r4\n\ + lsls r1, 1\n\ + ldr r3, _080BC428 @ =gSaveBlock1 + 0x1A54\n\ + adds r1, r3, r1\n\ + strh r0, [r1]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + ldr r2, [sp, 0x8]\n\ + cmp r4, 0x3\n\ + bls _080BC38E\n\ + movs r0, 0x64\n\ + adds r4, r6, 0\n\ + muls r4, r0\n\ + ldr r0, _080BC424 @ =gPlayerParty\n\ + adds r4, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + ldr r5, _080BC42C @ =gSaveBlock1 + 0x1A84\n\ + adds r1, r5, r7\n\ + strh r0, [r1]\n\ + adds r0, r4, 0\n\ + movs r1, 0xC\n\ + bl GetMonData\n\ + ldr r2, _080BC430 @ =gSaveBlock1 + 0x1A90\n\ + adds r1, r2, r7\n\ + strh r0, [r1]\n\ + adds r0, r4, 0\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + ldr r1, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\ + add r1, r10\n\ + strb r0, [r1]\n\ + adds r0, r4, 0\n\ + movs r1, 0\n\ + bl GetMonData\n\ + ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\ + add r1, r8\n\ + str r0, [r1]\n\ + adds r0, r4, 0\n\ + bl sub_80BC298\n\ + ldr r1, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\ + add r1, r10\n\ + strb r0, [r1]\n\ + ldr r3, [sp, 0x4]\n\ + lsls r0, r3, 16\n\ + lsrs r0, 16\n\ + mov r10, r0\n\ +_080BC408:\n\ + ldr r5, [sp]\n\ + lsls r0, r5, 16\n\ + lsrs r6, r0, 16\n\ + cmp r6, 0x5\n\ + bls _080BC314\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080BC424: .4byte gPlayerParty\n\ +_080BC428: .4byte gSaveBlock1 + 0x1A54\n\ +_080BC42C: .4byte gSaveBlock1 + 0x1A84\n\ +_080BC430: .4byte gSaveBlock1 + 0x1A90\n\ +_080BC434: .4byte gSaveBlock1 + 0x1A9C\n\ +_080BC438: .4byte gSaveBlock1 + 0x1A3C\n\ +_080BC43C: .4byte gSaveBlock1 + 0x1AA2\n\ +.syntax divided\n"); +} +#endif + +void sub_80BC440(void) +{ + u16 backupValue = gSaveBlock1.secretBases[0].sbr_field_e; + ResetSecretBase(0); + gSaveBlock1.secretBases[0].sbr_field_e = backupValue; + sub_80BC0F8(); +} + +void SecretBasePC_PackUp(void) +{ + IncrementGameStat(20); + sub_80BC440(); +} diff --git a/src/field/shop.c b/src/field/shop.c new file mode 100644 index 000000000..d53646a88 --- /dev/null +++ b/src/field/shop.c @@ -0,0 +1,342 @@ +#include "global.h" +#include "shop.h" +#include "decompress.h" +#include "field_fadetransition.h" +#include "field_weather.h" +#include "item_menu.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "money.h" +#include "palette.h" +#include "script.h" +#include "sound.h" +#include "sprite.h" +#include "strings.h" +#include "task.h" +#include "tv.h" +#include "unknown_task.h" + +struct UnknownShopStruct +{ + /* 0x0 */ void (* callback) (void); + /* 0x4 */ u16 *itemList; + /* 0x8 */ u8 itemCount; + /* 0x9 */ u8 unk9; + /* 0xA */ u8 unkA; + /* 0xB */ u8 unkB; + /* 0xC */ bool8 unkC; + // unknown size +}; + +extern struct UnknownShopStruct gUnknown_03000708; +extern struct MenuAction gUnknown_083CC6D0[]; + +extern u8 gUnknown_083CC6E8[]; +extern u8 gUnknown_083CC6EB[]; +extern u8 gBuyMenuFrame_Gfx[]; + +extern u16 gBuyMenuFrame_Tilemap[]; +extern u16 gMenuMoneyPal[16]; +extern u16 gUnknown_083CC710[2]; + +u8 CreateShopMenu(bool8 var) +{ + ScriptContext2_Enable(); + gUnknown_03000708.unkC = var; + gUnknown_03000708.unk9 = 0; + + if(var == FALSE) + { + gUnknown_03000708.unkA = 2; + MenuDrawTextWindow(0, 0, 10, 7); + PrintMenuItemsReordered(1, 1, 3, gUnknown_083CC6D0, (u8 *)gUnknown_083CC6E8); + } + else + { + gUnknown_03000708.unkA = 1; + MenuDrawTextWindow(0, 0, 10, 5); + PrintMenuItemsReordered(1, 1, 2, gUnknown_083CC6D0, (u8 *)gUnknown_083CC6EB); + } + InitMenu(0, 1, 1, gUnknown_03000708.unkA + 1, 0, 9); + + return CreateTask(sub_80B2E38, 8); +} + +void SetShopMenuCallback(void *callbackPtr) +{ + gUnknown_03000708.callback = callbackPtr; +} + +void SetShopItemsForSale(u16 *items) +{ + u16 i = 0; + + gUnknown_03000708.itemList = items; + gUnknown_03000708.itemCount = 0; + + while (gUnknown_03000708.itemList[i]) + { + gUnknown_03000708.itemCount++; + i++; + } +} + +void sub_80B2E38(u8 var) +{ + const u8 local = var; + + if(gMain.newAndRepeatedKeys & 0x40) + { + if(gUnknown_03000708.unk9) + { + PlaySE(0x5); + gUnknown_03000708.unk9 = MoveMenuCursor(-1); + } + } + else if(gMain.newAndRepeatedKeys & 0x80) + { + if(gUnknown_03000708.unk9 != gUnknown_03000708.unkA) + { + PlaySE(0x5); + gUnknown_03000708.unk9 = MoveMenuCursor(1); + } + } + else if (gMain.newKeys & 1) + { + PlaySE(0x5); + if(!gUnknown_03000708.unkC) + { + gUnknown_083CC6D0[gUnknown_083CC6E8[gUnknown_03000708.unk9]].func(local); + } + else + { + gUnknown_083CC6D0[gUnknown_083CC6EB[gUnknown_03000708.unk9]].func(local); + } + } + else if(gMain.newKeys & 2) + { + PlaySE(0x5); + HandleShopMenuQuit(local); + } +} + +void sub_80B2EFC(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)BuyMenuDrawGraphics >> 16; + gTasks[taskId].data[9] = (u32)BuyMenuDrawGraphics; + gTasks[taskId].func = sub_80B2FA0; + fade_screen(1, 0); +} + +void sub_80B2F30(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); +} + +void HandleShopMenuQuit(u8 taskId) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 11, 8); + sub_80BE3BC(); // in tv.s? + ScriptContext2_Disable(); + DestroyTask(taskId); + + if(gUnknown_03000708.callback) + gUnknown_03000708.callback(); // run the callback if it exists. +} + +void sub_80B2FA0(u8 taskId) +{ + if(!gPaletteFade.active) + { + SetMainCallback2((void *)((u16)gTasks[taskId].data[8] << 16 | (u16)gTasks[taskId].data[9])); + DestroyTask(taskId); + } +} + +void ReturnToShopMenuAfterExitingSellMenu(u8 taskId) +{ + CreateShopMenu(gUnknown_03000708.unkC); + DestroyTask(taskId); +} + +void Task_ExitSellMenu(u8 taskId) +{ + if(sub_807D770() == 1) + { + if(gUnknown_03000708.unkC == 2) + DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0); + else + DisplayItemMessageOnField(taskId, gOtherText_AnythingElse, ReturnToShopMenuAfterExitingSellMenu, 0); + } +} + +void sub_80B3050(void) +{ + pal_fill_black(); + CreateTask(Task_ExitSellMenu, 0x8); +} + +void sub_80B3068(u8 taskId) +{ + Task_ExitSellMenu(taskId); +} + +void unref_sub_80B3078(u8 taskId) +{ + gTasks[taskId].func = Task_ExitSellMenu; +} + +void sub_80B3094(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); +} + +void sub_80B30AC(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); +} + +// this function is fugly. pls fix +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; + gPaletteFade.bufferTransferDisabled = 1; + addr = (void*)OAM; + { + register const u32 zero asm("r6") = 0; + DmaFill32(3, zero, addr, OAM_SIZE); + LZDecompressVram(gBuyMenuFrame_Gfx, (void*)(VRAM + 0x7C00)); + sub_800D238(gBuyMenuFrame_Tilemap, (void *)0x02018000); + LoadCompressedPalette(gMenuMoneyPal, 0xC0, sizeof(gMenuMoneyPal)); + FreeAllSpritePalettes(); + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + SetUpWindowConfig(&gWindowConfig_81E6DFC); + InitMenuWindow(&gWindowConfig_81E6DFC); + BuyMenuDrawMapGraphics(); + gUnknown_03000708.unk9 = zero; + gUnknown_03000708.unkB = zero2; + MenuZeroFillWindowRect(0, 0, 0x20, 0x20); + sub_80B7C14(gSaveBlock1.money, 0, 0); + sub_80B3764(0, 7); + sub_80B37EC(); + sub_80B3270(); + CreateTask(sub_80B40E8, 0x8); + sub_80B3240(); + asm("":::"r4"); // what?? + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, zero); + gPaletteFade.bufferTransferDisabled = 0; + SetVBlankCallback(sub_80B30AC); + SetMainCallback2(sub_80B3094); + } +} + +void sub_80B3240(void) +{ + u16 tempArr[2]; + + memcpy(tempArr, gUnknown_083CC710, sizeof(tempArr)); + LoadPalette(&tempArr[1], 0xD1, 2); + LoadPalette(&tempArr[0], 0xD8, 2); +} + +void sub_80B3270(void) +{ + sub_80F944C(); + + if(gUnknown_03000708.itemCount > 7) + { + CreateVerticalScrollIndicators(0, 172, 12); + CreateVerticalScrollIndicators(1, 172, 148); + sub_80F979C(0, 1); + } +} + +void sub_80B32A4(void) +{ + if(gUnknown_03000708.unkB == 0) + sub_80F979C(0, 1); + else + sub_80F979C(0, 0); + + if(gUnknown_03000708.unkB + 7 >= gUnknown_03000708.itemCount) + sub_80F979C(1, 1); + else + sub_80F979C(1, 0); +} + +void sub_80B32EC(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) +{ + array[offset1 + offset2] = array2[0]; + array[offset1 + offset2 + 1] = array2[1]; + array[offset1 + offset2 + 32] = array2[2]; + array[offset1 + offset2 + 33] = array2[3]; +} + +void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s8 var4) +{ + u8 tempVar4 = var4; + s16 offset1 = var1 * 2; + s16 offset2 = (var2 * 0x40) + 0x40; + + switch(tempVar4) + { + case 0: // _080B335C + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3); + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4); + break; + case 1: // _080B3364 + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4); + break; + case 2: // _080B3398 + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4); + break; + } +} diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c new file mode 100644 index 000000000..c9a06a758 --- /dev/null +++ b/src/field/slot_machine.c @@ -0,0 +1,150 @@ +#include "global.h" +#include "slot_machine.h" +#include "decompress.h" +#include "palette.h" +#include "task.h" + +struct UnkStruct2000000 { + /*0x00*/ u8 filler00[61]; + /*0x3D*/ u8 unk3D; +}; + +struct UnkStruct1 { + /*0x00*/ u8 unk00; + /*0x01*/ u8 unk01; + /*0x02*/ s16 unk02; +}; + +extern struct UnkStruct2000000 unk_2000000; + +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[]; + +extern u16 gUnknown_08E95AB8[]; +extern u16 gUnknown_08E95FB8[]; + +static void LoadSlotMachineWheelOverlay(void); + +void sub_8104CAC(u8 arg0) { + u8 i; + struct Task *task; + + sub_8104DA4(); + + task = &gTasks[unk_2000000.unk3D]; + task->data[1] = arg0; + + i = 0; + while (gUnknown_083ED048[arg0][i].unk00 != 0xFF) + { + u8 spriteId; + spriteId = sub_8105BB4( + gUnknown_083ED048[arg0][i].unk00, + gUnknown_083ED048[arg0][i].unk01, + gUnknown_083ED048[arg0][i].unk02 + ); + task->data[4 + i] = spriteId; + +#ifdef GERMAN + if (arg0 == 5 && i <= 2) + { + gSprites[spriteId].invisible = TRUE; + } +#endif + + i += 1; + } +} + +asm(".section .text_b"); + +void sub_8106448(void) { + u32 offsetRead, offsetWrite; + u32 size; + + sub_800D238(gSlotMachine_Gfx, (void *) 0x02010000); + + offsetRead = 0x02010000; + offsetWrite = BG_VRAM; + size = SLOTMACHINE_GFX_TILES * 32; + while (TRUE) + { + DmaCopy16(3, offsetRead, (void *) (offsetWrite), 0x1000); + offsetRead += 0x1000; + offsetWrite += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaCopy16(3, offsetRead, (void *) (offsetWrite), size); + break; + } + } + + LoadPalette(gUnknown_08E95A18, 0, 160); + LoadPalette(gPalette_83EDE24, 208, 32); +} + +void sub_81064B8(void) { + CpuCopy16(gUnknown_08E95AB8, (void *) BG_SCREEN_ADDR(29), 20 * 32 * 2); + LoadSlotMachineWheelOverlay(); +} + +static void LoadSlotMachineWheelOverlay(void) { + s16 x, y, dx; + u16 *screen; + + screen = (u16 *) BG_SCREEN_ADDR(30); + + for (x = 4; x < 18; x += 5) + { + for (dx = 0; dx < 4; dx++) + { + screen[5 * 32 + dx + x] = 0x2051; + screen[13 * 32 + dx + x] = 0x2851; + screen[6 * 32 + dx + x] = 0x2061; + screen[12 * 32 + dx + x] = 0x2861; + } + + screen[6 * 32 + x] = 0x20BE; + screen[12 * 32 + x] = 0x28BE; + + for (y = 7; y <= 11; y++) + { + screen[y * 32 + x] = 0x20BF; + } + } +} + +void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) { + u16 *vram = (u16 *) BG_SCREEN_ADDR(29); + + vram[15 * 32 + arg0] = arg1; + vram[15 * 32 + 1 + arg0] = arg2; + vram[16 * 32 + arg0] = arg3; + vram[16 * 32 + 1 + arg0] = arg4; +} + +void sub_81065DC(void) { + s16 y, x; + u16 *screen; + + CpuCopy16(gUnknown_08E95FB8, (void *) BG_SCREEN_ADDR(29), 20 * 32 * 2); + + screen = (u16 *) BG_SCREEN_ADDR(30); + for (y = 0; y < 20; y++) + { + for (x = 0; x < 30; x++) + { + screen[x + y * 32] = 0; + } + } +} diff --git a/src/field/start_menu.c b/src/field/start_menu.c new file mode 100644 index 000000000..411690aff --- /dev/null +++ b/src/field/start_menu.c @@ -0,0 +1,850 @@ +#include "global.h" +#include "start_menu.h" +#include "event_data.h" +#include "field_map_obj_helpers.h" +#include "field_player_avatar.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "item_menu.h" +#include "load_save.h" +#include "main.h" +#include "map_obj_lock.h" +#include "menu.h" +#include "option_menu.h" +#include "palette.h" +#include "pokedex.h" +#include "pokemon_menu.h" +#include "pokenav.h" +#include "rom4.h" +#include "safari_zone.h" +#include "save.h" +#include "save_menu_util.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "strings2.h" +#include "task.h" +#include "trainer_card.h" +#include "unknown_task.h" + +//Menu actions +enum { + MENU_ACTION_POKEDEX, + MENU_ACTION_POKEMON, + MENU_ACTION_BAG, + MENU_ACTION_POKENAV, + MENU_ACTION_PLAYER, + MENU_ACTION_SAVE, + MENU_ACTION_OPTION, + MENU_ACTION_EXIT, + MENU_ACTION_RETIRE, + MENU_ACTION_PLAYER_LINK +}; + +static u8 (*saveDialogCallback)(void); +static u8 saveDialogTimer; //Number of frames to keep the window on screen after save was completed +static bool8 savingComplete; + +extern bool8 gDifferentSaveFile; +extern u16 gSaveFileStatus; +extern u16 gScriptResult; + +extern u8 gUnknown_03004860; + +u8 (*gCallback_03004AE8)(void); + +EWRAM_DATA static u8 sStartMenuCursorPos = 0; +EWRAM_DATA static u8 sNumStartMenuActions = 0; +EWRAM_DATA static u8 sCurrentStartMenuActions[10] = {0}; + +//Text strings +extern u8 gSaveText_PlayerSavedTheGame[]; +extern u8 gSaveText_DontTurnOff[]; +extern u8 gSaveText_ThereIsAlreadyAFile[]; +extern u8 gSaveText_ThereIsADifferentFile[]; +extern u8 gSaveText_WouldYouLikeToSave[]; + +static u8 StartMenu_PokedexCallback(void); +static u8 StartMenu_PokemonCallback(void); +static u8 StartMenu_BagCallback(void); +static u8 StartMenu_PokenavCallback(void); +static u8 StartMenu_PlayerCallback(void); +static u8 StartMenu_SaveCallback(void); +static u8 StartMenu_OptionCallback(void); +static u8 StartMenu_ExitCallback(void); +static u8 StartMenu_RetireCallback(void); +static u8 StartMenu_PlayerLinkCallback(void); + +static const struct MenuAction sStartMenuItems[] = +{ + { SystemText_Pokedex, StartMenu_PokedexCallback }, + { SystemText_Pokemon, StartMenu_PokemonCallback }, + { SystemText_BAG, StartMenu_BagCallback }, + { SystemText_Pokenav, StartMenu_PokenavCallback }, + { SystemText_Player, StartMenu_PlayerCallback }, + { SystemText_Save, StartMenu_SaveCallback }, + { SystemText_Option, StartMenu_OptionCallback }, + { SystemText_Exit, StartMenu_ExitCallback }, + { SystemText_Retire, StartMenu_RetireCallback }, + { SystemText_Player, StartMenu_PlayerLinkCallback }, +}; + +//Private functions +static void BuildStartMenuActions(void); +static void AddStartMenuAction(u8 action); +static void BuildStartMenuActions_Normal(void); +static void BuildStartMenuActions_SafariZone(void); +static void BuildStartMenuActions_Link(void); +static void DisplaySafariBallsWindow(void); +static bool32 PrintStartMenuItemsMultistep(s16 *a, u32 b); +static bool32 InitStartMenuMultistep(s16 *a, s16 *b); +static void Task_StartMenu(u8 taskId); +static u8 StartMenu_InputProcessCallback(void); +static u8 SaveCallback1(void); +static u8 SaveCallback2(void); +static void sub_807160C(void); +static u8 RunSaveDialogCallback(void); +static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void)); +static void Task_SaveDialog(u8 taskId); +static void sub_8071700(void); +static void HideSaveDialog(void); +static void SaveDialogStartTimeout(void); +static u8 SaveDialogCheckForTimeoutOrKeypress(void); +static u8 SaveDialogCheckForTimeoutAndKeypress(void); +static u8 SaveDialogCheckForTimeoutAndKeypress(void); +static u8 SaveDialogCB_DisplayConfirmMessage(void); +static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void); +static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void); +static u8 SaveDialogCB_SaveFileExists(void); +static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void); +static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void); +static u8 SaveDialogCB_DisplaySavingMessage(void); +static u8 SaveDialogCB_DoSave(void); +static u8 SaveDialogCB_SaveSuccess(void); +static u8 SaveDialogCB_ReturnSuccess(void); +static u8 SaveDialogCB_SaveError(void); +static u8 SaveDialogCB_ReturnError(void); +static void sub_80719F0(void); +static bool32 sub_80719FC(u8 *ptr); +static void sub_8071B54(void); +static void Task_8071B64(u8 taskId); + + +static void BuildStartMenuActions(void) +{ + sNumStartMenuActions = 0; + if (is_c1_link_related_active() == TRUE) + BuildStartMenuActions_Link(); + else + { + if (GetSafariZoneFlag() == TRUE) + BuildStartMenuActions_SafariZone(); + else + BuildStartMenuActions_Normal(); + } +} + +static void AddStartMenuAction(u8 action) +{ + AppendToList(sCurrentStartMenuActions, &sNumStartMenuActions, action); +} + +static void BuildStartMenuActions_Normal(void) +{ + if (FlagGet(SYS_POKEDEX_GET) == TRUE) + AddStartMenuAction(MENU_ACTION_POKEDEX); + if (FlagGet(SYS_POKEMON_GET) == TRUE) + AddStartMenuAction(MENU_ACTION_POKEMON); + AddStartMenuAction(MENU_ACTION_BAG); + if (FlagGet(SYS_POKENAV_GET) == TRUE) + AddStartMenuAction(MENU_ACTION_POKENAV); + AddStartMenuAction(MENU_ACTION_PLAYER); + AddStartMenuAction(MENU_ACTION_SAVE); + AddStartMenuAction(MENU_ACTION_OPTION); + AddStartMenuAction(MENU_ACTION_EXIT); +} + +static void BuildStartMenuActions_SafariZone(void) +{ + AddStartMenuAction(MENU_ACTION_RETIRE); + AddStartMenuAction(MENU_ACTION_POKEDEX); + AddStartMenuAction(MENU_ACTION_POKEMON); + AddStartMenuAction(MENU_ACTION_BAG); + AddStartMenuAction(MENU_ACTION_PLAYER); + AddStartMenuAction(MENU_ACTION_OPTION); + AddStartMenuAction(MENU_ACTION_EXIT); +} + +static void BuildStartMenuActions_Link(void) +{ + AddStartMenuAction(MENU_ACTION_POKEMON); + AddStartMenuAction(MENU_ACTION_BAG); + if (FlagGet(SYS_POKENAV_GET) == TRUE) + AddStartMenuAction(MENU_ACTION_POKENAV); + AddStartMenuAction(MENU_ACTION_PLAYER_LINK); + AddStartMenuAction(MENU_ACTION_OPTION); + AddStartMenuAction(MENU_ACTION_EXIT); +} + +//Show number of safari balls left +static void DisplaySafariBallsWindow(void) +{ + sub_8072C44(gStringVar1, gNumSafariBalls, 12, 1); + MenuDrawTextWindow(0, 0, 10, 5); + MenuPrint(gOtherText_SafariStock, 1, 1); +} + +//Prints n menu items starting at *index +static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n) +{ + int _index = *index; + + do + { + MenuPrint(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2); + _index++; + if (_index >= sNumStartMenuActions) + { + *index = _index; + return TRUE; + } + } + while (--n != 0); + *index = _index; + return FALSE; +} + +static bool32 InitStartMenuMultistep(s16 *step, s16 *index) +{ + switch (*step) + { + case 1: + BuildStartMenuActions(); + (*step)++; + break; + case 2: + MenuDrawTextWindow(22, 0, 29, sNumStartMenuActions * 2 + 3); + *index = 0; + (*step)++; + break; + case 3: + if (GetSafariZoneFlag()) + DisplaySafariBallsWindow(); + (*step)++; + break; + case 4: + if (PrintStartMenuItemsMultistep(index, 2)) + (*step)++; + break; + case 0: + (*step)++; + break; + case 5: + sStartMenuCursorPos = InitMenu(0, 0x17, 2, sNumStartMenuActions, sStartMenuCursorPos, 6); + return TRUE; + } + return FALSE; +} + +static void InitStartMenu(void) +{ + s16 step = 0; + s16 index = 0; + + while (InitStartMenuMultistep(&step, &index) == FALSE) + ; +} + +static void Task_StartMenu(u8 taskId) +{ + if (InitStartMenuMultistep(gTasks[taskId].data, gTasks[taskId].data + 1) == TRUE) + { + *gTasks[taskId].data = 0; + SwitchTaskToFollowupFunc(taskId); + } +} + +void CreateStartMenuTask(void (*func)(u8)) +{ + u8 taskId; + + InitMenuWindow(&gWindowConfig_81E6CE4); + taskId = CreateTask(Task_StartMenu, 0x50); + SetTaskFuncWithFollowupFunc(taskId, Task_StartMenu, func); +} + +void sub_80712B4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + gCallback_03004AE8 = StartMenu_InputProcessCallback; + task->data[0]++; + break; + case 1: + if (gCallback_03004AE8() == 1) + DestroyTask(taskId); + break; + } +} + +void sub_8071310(void) +{ + if (!is_c1_link_related_active()) + { + FreezeMapObjects(); + sub_80594C0(); + sub_80597F4(); + } + CreateStartMenuTask(sub_80712B4); + ScriptContext2_Enable(); +} + +static u8 StartMenu_InputProcessCallback(void) +{ + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + sStartMenuCursorPos = MoveMenuCursor(-1); + } + if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + sStartMenuCursorPos = MoveMenuCursor(1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func == StartMenu_PokedexCallback) + { + 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); + return 0; + } + if (gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + CloseMenu(); + return 1; + } + return 0; +} + +//When player selects POKEDEX +static u8 StartMenu_PokedexCallback(void) +{ + if (!gPaletteFade.active) + { + IncrementGameStat(0x29); + PlayRainSoundEffect(); + SetMainCallback2(CB2_InitPokedex); + return 1; + } + return 0; +} + +//When player selects POKEMON +static u8 StartMenu_PokemonCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainSoundEffect(); + SetMainCallback2(sub_8089A70); + return 1; + } + return 0; +} + +//When player selects BAG +static u8 StartMenu_BagCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainSoundEffect(); + SetMainCallback2(sub_80A53F8); + return 1; + } + return 0; +} + +//When player selects POKENAV +static u8 StartMenu_PokenavCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainSoundEffect(); + SetMainCallback2(sub_80EBA5C); + return 1; + } + return 0; +} + +//When player selects his/her name +static u8 StartMenu_PlayerCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainSoundEffect(); + sub_8093110(sub_805469C); + return 1; + } + return 0; +} + +//When player selects SAVE +static u8 StartMenu_SaveCallback(void) +{ + HandleDestroyMenuCursors(); + gCallback_03004AE8 = SaveCallback1; + return 0; +} + +//When player selects OPTION +static u8 StartMenu_OptionCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainSoundEffect(); + SetMainCallback2(CB2_InitOptionMenu); + gMain.savedCallback = sub_805469C; + return 1; + } + return 0; +} + +//When player selects EXIT +static u8 StartMenu_ExitCallback(void) +{ + CloseMenu(); + return 1; +} + +//When player selects RETIRE +static u8 StartMenu_RetireCallback(void) +{ + CloseMenu(); + SafariZoneRetirePrompt(); + return 1; +} + +//When player selects their name in multiplayer mode +static u8 StartMenu_PlayerLinkCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainSoundEffect(); + sub_8093130(gUnknown_03004860, sub_805469C); + return 1; + } + return 0; +} + +//Save dialog status +enum +{ + SAVE_IN_PROGRESS, + SAVE_SUCCESS, + SAVE_CANCELED, + SAVE_ERROR, +}; + +static u8 SaveCallback1(void) +{ + sub_807160C(); + gCallback_03004AE8 = SaveCallback2; + return FALSE; +} + +static u8 SaveCallback2(void) +{ + switch (RunSaveDialogCallback()) + { + case SAVE_IN_PROGRESS: + return FALSE; + case SAVE_CANCELED: + //Go back to start menu + MenuZeroFillScreen(); + InitStartMenu(); + gCallback_03004AE8 = StartMenu_InputProcessCallback; + return FALSE; + case SAVE_SUCCESS: + case SAVE_ERROR: + MenuZeroFillScreen(); + sub_8064E2C(); + ScriptContext2_Disable(); + return TRUE; + } + return FALSE; +} + +static void sub_807160C(void) +{ + save_serialize_map(); + saveDialogCallback = SaveDialogCB_DisplayConfirmMessage; + savingComplete = FALSE; +} + +static u8 RunSaveDialogCallback(void) +{ + if (savingComplete) + { + if (!MenuUpdateWindowText()) + return 0; + } + savingComplete = FALSE; + return saveDialogCallback(); +} + +void InitSaveDialog(void) +{ + sub_807160C(); + CreateTask(Task_SaveDialog, 0x50); +} + +static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void)) +{ + StringExpandPlaceholders(gStringVar4, ptr); + MenuDisplayMessageBox(); + sub_8072044(gStringVar4); + savingComplete = TRUE; + saveDialogCallback = func; +} + +static void Task_SaveDialog(u8 taskId) +{ + u8 status = RunSaveDialogCallback(); + + switch (status) + { + case SAVE_CANCELED: + case SAVE_ERROR: + gScriptResult = 0; + break; + case SAVE_SUCCESS: + gScriptResult = status; + break; + case SAVE_IN_PROGRESS: + return; + } + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +static void sub_8071700(void) +{ + HandleCloseSaveWindow(0, 0); +} + +static void HideSaveDialog(void) +{ + MenuZeroFillWindowRect(20, 8, 26, 13); +} + +static void SaveDialogStartTimeout(void) +{ + saveDialogTimer = 60; +} + +static bool8 SaveDialogCheckForTimeoutOrKeypress(void) +{ + saveDialogTimer--; + if (gMain.heldKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + return TRUE; + } + else if (saveDialogTimer == 0) + return TRUE; + return FALSE; +} + +static bool8 SaveDialogCheckForTimeoutAndKeypress(void) +{ + if (saveDialogTimer != 0) + saveDialogTimer--; + else if (gMain.heldKeys & A_BUTTON) + return TRUE; + return FALSE; +} + +static u8 SaveDialogCB_DisplayConfirmMessage(void) +{ + MenuZeroFillScreen(); + HandleDrawSaveWindowInfo(0, 0); + DisplaySaveMessageWithCallback(gSaveText_WouldYouLikeToSave, SaveDialogCB_DisplayConfirmYesNoMenu); + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void) +{ + DisplayYesNoMenu(20, 8, 1); + saveDialogCallback = SaveDialogCB_ProcessConfirmYesNoMenu; + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void) +{ + switch (ProcessMenuInputNoWrap_()) + { + case 0: //YES + HideSaveDialog(); + switch (gSaveFileStatus) + { + case 0: + case 2: + if (gDifferentSaveFile == FALSE) + { + saveDialogCallback = SaveDialogCB_SaveFileExists; + return SAVE_IN_PROGRESS; + } + saveDialogCallback = SaveDialogCB_DisplaySavingMessage; + return SAVE_IN_PROGRESS; + default: + saveDialogCallback = SaveDialogCB_SaveFileExists; + return SAVE_IN_PROGRESS; + } + break; + case -1: //B button + case 1: //NO + HideSaveDialog(); + sub_8071700(); + return SAVE_CANCELED; + } + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_SaveFileExists(void) +{ + DisplaySaveMessageWithCallback( + gDifferentSaveFile == TRUE ? gSaveText_ThereIsADifferentFile : gSaveText_ThereIsAlreadyAFile, + SaveDialogCB_DisplayOverwriteYesNoMenu); + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void) +{ + DisplayYesNoMenu(20, 8, 1); + saveDialogCallback = SaveDialogCB_ProcessOverwriteYesNoMenu; + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void) +{ + switch (ProcessMenuInputNoWrap_()) + { + case 0: //YES + HideSaveDialog(); + saveDialogCallback = SaveDialogCB_DisplaySavingMessage; + break; + case -1: //B button + case 1: //NO + HideSaveDialog(); + sub_8071700(); + return SAVE_CANCELED; + } + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_DisplaySavingMessage(void) +{ + //"SAVING... DON'T TURN OFF THE POWER." + DisplaySaveMessageWithCallback(gSaveText_DontTurnOff, SaveDialogCB_DoSave); + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_DoSave(void) +{ + bool8 saveSucceeded; + + IncrementGameStat(0); + if (gDifferentSaveFile == TRUE) + { + saveSucceeded = TrySavingData(DIFFERENT_FILE_SAVE); + gDifferentSaveFile = FALSE; + } + else + { + saveSucceeded = TrySavingData(NORMAL_SAVE); + } + + if (saveSucceeded == TRUE) + { + //"(Player) saved the game." + DisplaySaveMessageWithCallback(gSaveText_PlayerSavedTheGame, SaveDialogCB_SaveSuccess); + } + else + { + //"Save error. Please exchange the backup memory." + DisplaySaveMessageWithCallback(gSystemText_SaveErrorExchangeBackup, SaveDialogCB_SaveError); + } + + SaveDialogStartTimeout(); + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_SaveSuccess(void) +{ + if (MenuUpdateWindowText()) + { + PlaySE(SE_SAVE); + saveDialogCallback = SaveDialogCB_ReturnSuccess; + } + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_ReturnSuccess(void) +{ + if (!IsSEPlaying() && SaveDialogCheckForTimeoutOrKeypress()) + { + sub_8071700(); + return SAVE_SUCCESS; + } + else + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_SaveError(void) +{ + if (MenuUpdateWindowText()) + { + PlaySE(SE_BOO); + saveDialogCallback = SaveDialogCB_ReturnError; + } + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_ReturnError(void) +{ + if (!SaveDialogCheckForTimeoutAndKeypress()) + return SAVE_IN_PROGRESS; + else + { + sub_8071700(); + return SAVE_ERROR; + } +} + +static void sub_80719F0(void) +{ + TransferPlttBuffer(); +} + +static bool32 sub_80719FC(u8 *step) +{ + switch (*step) + { + case 0: + { + u8 *addr; + u32 size; + + REG_DISPCNT = 0; + SetVBlankCallback(NULL); + remove_some_task(); + 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; + } + } + break; + } + case 1: + ResetSpriteData(); + ResetTasks(); + ResetPaletteFade(); + dp12_8087EA4(); + break; + case 2: + SetUpWindowConfig(&gWindowConfig_81E6CE4); + InitMenuWindow(&gWindowConfig_81E6CE4); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON; + break; + case 3: + { + u32 savedIme; + + BlendPalettes(-1, 0x10, 0); + SetVBlankCallback(sub_80719F0); + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= 1; + REG_IME = savedIme; + break; + } + case 4: + return TRUE; + } + (*step)++; + return FALSE; +} + +void sub_8071B28(void) +{ + if (sub_80719FC(&gMain.state)) + { + CreateTask(Task_8071B64, 0x50); + SetMainCallback2(sub_8071B54); + } +} + +static void sub_8071B54(void) +{ + RunTasks(); + UpdatePaletteFade(); +} + +static void Task_8071B64(u8 taskId) +{ + s16 *step = gTasks[taskId].data; + + if (!gPaletteFade.active) + { + switch (*step) + { + case 0: + MenuDisplayMessageBox(); + MenuPrint(gSystemText_Saving, 2, 15); + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + (*step)++; + break; + case 1: + SetSecretBase2Field_9_AndHideBG(); + sub_8125E2C(); + (*step)++; + break; + case 2: + if (!sub_8125E6C()) + break; + ClearSecretBase2Field_9_2(); + (*step)++; + break; + case 3: + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + (*step)++; + break; + case 4: + SetMainCallback2(gMain.savedCallback); + DestroyTask(taskId); + break; + } + } +} diff --git a/src/field/starter_choose.c b/src/field/starter_choose.c new file mode 100644 index 000000000..2b28df4f0 --- /dev/null +++ b/src/field/starter_choose.c @@ -0,0 +1,757 @@ +#include "global.h" +#include "starter_choose.h" +#include "data2.h" +#include "decompress.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "pokedex.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "trig.h" +#include "unknown_task.h" + +extern u16 gScriptResult; +extern struct SpriteTemplate gUnknown_02024E8C; + +//-------------------------------------------------- +// Graphics Data +//-------------------------------------------------- + +const u16 gBirchBagGrassPal[2][16] = +{ + INCBIN_U16("graphics/misc/birch_bag.gbapal"), + INCBIN_U16("graphics/misc/birch_grass.gbapal"), +}; +static const u16 gBirchBallarrow_Pal[] = INCBIN_U16("graphics/misc/birch_ballarrow.gbapal"); +static const u16 gBirchCircle_Pal[] = INCBIN_U16("graphics/misc/birch_circle.gbapal"); +const u8 gBirchBagTilemap[] = INCBIN_U8("graphics/misc/birch_bag_map.bin.lz"); +const u8 gBirchGrassTilemap[] = INCBIN_U8("graphics/misc/birch_grass_map.bin.lz"); +const u8 gBirchHelpGfx[] = INCBIN_U8("graphics/misc/birch_help.4bpp.lz"); +static const u8 gBirchBallarrow_Gfx[] = INCBIN_U8("graphics/misc/birch_ballarrow.4bpp.lz"); +static const u8 gBirchCircle_Gfx[] = INCBIN_U8("graphics/misc/birch_circle.4bpp.lz"); +static const u8 gStarterChoose_PokeballCoords[][2] = +{ + {60, 64}, + {120, 88}, + {180, 64}, +}; +static const u8 gStarterChoose_LabelCoords[][2] = +{ + {0, 9}, + {16, 10}, + {8, 4}, +}; +static const u16 sStarterMons[] = {SPECIES_TREECKO, SPECIES_TORCHIC, SPECIES_MUDKIP}; +static const struct OamData gOamData_83F76CC = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83F76D4 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83F76DC = +{ + .y = 160, + .affineMode = 3, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const u8 gUnknown_083F76E4[][2] = +{ + {60, 32}, + {120, 56}, + {180, 32}, + {0, 0}, +}; +static const union AnimCmd gSpriteAnim_83F76EC[] = +{ + ANIMCMD_FRAME(48, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83F76F4[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83F76FC[] = +{ + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(0, 32), + ANIMCMD_FRAME(16, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(32, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(16, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(32, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd gSpriteAnim_83F7744[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_83F774C[] = +{ + gSpriteAnim_83F76EC, +}; +static const union AnimCmd *const gSpriteAnimTable_83F7750[] = +{ + gSpriteAnim_83F76F4, + gSpriteAnim_83F76FC, +}; +static const union AnimCmd *const gSpriteAnimTable_83F7758[] = +{ + gSpriteAnim_83F7744, +}; +static const union AffineAnimCmd gSpriteAffineAnim_83F775C[] = +{ + AFFINEANIMCMD_FRAME(16, 16, 0, 0), + AFFINEANIMCMD_FRAME(16, 16, 0, 15), + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd gSpriteAffineAnim_83F7774[] = +{ + AFFINEANIMCMD_FRAME(20, 20, 0, 0), + AFFINEANIMCMD_FRAME(20, 20, 0, 15), + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83F778C[] = +{ + gSpriteAffineAnim_83F775C, +}; +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7790[] = +{ + gSpriteAffineAnim_83F7774, +}; +static const struct CompressedSpriteSheet gUnknown_083F7794[] = +{ + {gBirchBallarrow_Gfx, 0x0800, 0x1000}, + {NULL}, +}; +static const struct CompressedSpriteSheet gUnknown_083F77A4[] = +{ + {gBirchCircle_Gfx, 0x0800, 0x1001}, + {NULL}, +}; +const struct SpritePalette gUnknown_083F77B4[] = +{ + {gBirchBallarrow_Pal, 0x1000}, + {gBirchCircle_Pal, 0x1001}, + {NULL}, +}; +static void sub_810A62C(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F77CC = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83F76CC, + .anims = gSpriteAnimTable_83F774C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810A62C, +}; +static void sub_810A68C(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F77E4 = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83F76D4, + .anims = gSpriteAnimTable_83F7750, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810A68C, +}; +static void StarterPokemonSpriteAnimCallback(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F77FC = +{ + .tileTag = 4097, + .paletteTag = 4097, + .oam = &gOamData_83F76DC, + .anims = gSpriteAnimTable_83F7758, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83F7790, + .callback = StarterPokemonSpriteAnimCallback, +}; + +static void MainCallback2(void); +static void Task_StarterChoose1(u8 taskId); +static void Task_StarterChoose2(u8 taskId); +static void Task_StarterChoose3(u8 taskId); +static void Task_StarterChoose4(u8 taskId); +static void Task_StarterChoose5(u8 taskId); +static void Task_StarterChoose6(u8 taskId); + +static void CreateStarterPokemonLabel(u8, u8); +static u8 CreatePokemonFrontSprite(u16, u8, u8); + +//Position of the sprite of the selected starter Pokemon +#define STARTER_PKMN_POS_X 120 +#define STARTER_PKMN_POS_Y 64 + +//Retrieves one of the available starter Pokemon +u16 GetStarterPokemon(u16 n) +{ + if (n > 3) + n = 0; + return sStarterMons[n]; +} + +static void VblankCallback(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +#define tStarterSelection data[0] +#define tPkmnSpriteId data[1] +#define tCircleSpriteId data[2] + +void CB2_ChooseStarter(void) +{ + u16 savedIme; + u8 taskId; + u8 spriteId; + + SetVBlankCallback(NULL); + + REG_DISPCNT = 0; + REG_BG3CNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + DmaFill16(3, 0, VRAM, VRAM_SIZE); + DmaFill32(3, 0, OAM, OAM_SIZE); + DmaFill16(3, 0, PLTT, PLTT_SIZE); + + LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); + LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000)); + LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); + remove_some_task(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + LoadPalette(gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal)); + LoadCompressedObjectPic(&gUnknown_083F7794[0]); + LoadCompressedObjectPic(&gUnknown_083F77A4[0]); + LoadSpritePalettes(gUnknown_083F77B4); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + + SetVBlankCallback(VblankCallback); + SetMainCallback2(MainCallback2); + + REG_WININ = 0x3F; + REG_WINOUT = 0x1F; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_BLDCNT = 0xFE; + REG_BLDALPHA = 0; + REG_BLDY = 0x7; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; + + taskId = CreateTask(Task_StarterChoose1, 0); + gTasks[taskId].tStarterSelection = 1; + + //Create hand sprite + spriteId = CreateSprite(&gSpriteTemplate_83F77CC, 120, 56, 2); + gSprites[spriteId].data0 = taskId; + + //Create three Pokeball sprites + spriteId = CreateSprite( + &gSpriteTemplate_83F77E4, + gStarterChoose_PokeballCoords[0][0], gStarterChoose_PokeballCoords[0][1], 2); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].data1 = 0; + spriteId = CreateSprite( + &gSpriteTemplate_83F77E4, + gStarterChoose_PokeballCoords[1][0], gStarterChoose_PokeballCoords[1][1], 2); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].data1 = 1; + spriteId = CreateSprite( + &gSpriteTemplate_83F77E4, + gStarterChoose_PokeballCoords[2][0], gStarterChoose_PokeballCoords[2][1], 2); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].data1 = 2; +} + +static void MainCallback2(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void Task_StarterChoose1(u8 taskId) +{ + CreateStarterPokemonLabel(0xFF, gTasks[taskId].tStarterSelection); + MenuDrawTextWindow(2, 14, 27, 19); + MenuPrint(gOtherText_BirchInTrouble, 3, 15); + gTasks[taskId].func = Task_StarterChoose2; +} + +static void Task_StarterChoose2(u8 taskId) +{ + u8 selection = gTasks[taskId].tStarterSelection; + + if (gMain.newKeys & A_BUTTON) + { + u8 spriteId; + + MenuZeroFillWindowRect( + gStarterChoose_LabelCoords[selection][0], + gStarterChoose_LabelCoords[selection][1], + gStarterChoose_LabelCoords[selection][0] + 13, + gStarterChoose_LabelCoords[selection][1] + 3); + + REG_WIN0H = 0; + REG_WIN0V = 0; + + //Create white circle background + spriteId = CreateSprite( + &gSpriteTemplate_83F77FC, + gStarterChoose_PokeballCoords[selection][0], + gStarterChoose_PokeballCoords[selection][1], + 1); + gTasks[taskId].tCircleSpriteId = spriteId; + + //Create Pokemon sprite + spriteId = CreatePokemonFrontSprite( + GetStarterPokemon(gTasks[taskId].tStarterSelection), + gStarterChoose_PokeballCoords[selection][0], + gStarterChoose_PokeballCoords[selection][1]); + gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_83F778C; + gSprites[spriteId].callback = StarterPokemonSpriteAnimCallback; + gTasks[taskId].tPkmnSpriteId = spriteId; + + gTasks[taskId].func = Task_StarterChoose3; + } + else + { + if ((gMain.newKeys & DPAD_LEFT) && selection > 0) + { + gTasks[taskId].tStarterSelection--; + CreateStarterPokemonLabel(selection, gTasks[taskId].tStarterSelection); + } + else if ((gMain.newKeys & DPAD_RIGHT) && selection < 2) + { + gTasks[taskId].tStarterSelection++; + CreateStarterPokemonLabel(selection, gTasks[taskId].tStarterSelection); + } + } +} + +static void Task_StarterChoose3(u8 taskId) +{ + if (gSprites[gTasks[taskId].tCircleSpriteId].affineAnimEnded && + gSprites[gTasks[taskId].tCircleSpriteId].pos1.x == STARTER_PKMN_POS_X && + gSprites[gTasks[taskId].tCircleSpriteId].pos1.y == STARTER_PKMN_POS_Y) + { + gTasks[taskId].func = Task_StarterChoose4; + } +} + +static void Task_StarterChoose4(u8 taskId) +{ + PlayCry1(GetStarterPokemon(gTasks[taskId].tStarterSelection), 0); + MenuDrawTextWindow(2, 14, 27, 19); + //"Do you choose this POKEMON?" + MenuPrint(gOtherText_DoYouChoosePoke, 3, 15); + DisplayYesNoMenu(21, 7, 1); + gTasks[taskId].func = Task_StarterChoose5; +} + +static void Task_StarterChoose5(u8 taskId) +{ + u8 spriteId; + + switch (ProcessMenuInputNoWrap_()) + { + case 0: // YES + //Return the starter choice and exit. + gScriptResult = gTasks[taskId].tStarterSelection; + SetMainCallback2(gMain.savedCallback); + break; + case 1: // NO + case -1: // B button + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(21, 7, 27, 12); + + spriteId = gTasks[taskId].tPkmnSpriteId; + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum)); + FreeOamMatrix(gSprites[spriteId].oam.matrixNum); + DestroySprite(&gSprites[spriteId]); + + spriteId = gTasks[taskId].tCircleSpriteId; + FreeOamMatrix(gSprites[spriteId].oam.matrixNum); + DestroySprite(&gSprites[spriteId]); + gTasks[taskId].func = Task_StarterChoose6; + break; + } +} + +static void Task_StarterChoose6(u8 taskId) +{ + gTasks[taskId].func = Task_StarterChoose1; +} + +void AddTextColorCtrlCode(u8 *string, u8 bgColor, u8 textColor, u8 shadowColor) +{ + *(string++) = EXT_CTRL_CODE_BEGIN; + *(string++) = 4; + *(string++) = textColor; + *(string++) = bgColor; + *(string++) = shadowColor; +} + +#define SET_CHAR(str, index, c) \ +{ \ + u8 *p = str + index; \ + *p = c; \ +} + + +#if ENGLISH +static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) +{ + u8 labelText[72]; + const u8 *category; + u8 srcIndex; + u8 dstIndex; + u16 species; + + u8 labelLeft; + u8 labelRight; + u8 labelTop; + u8 labelBottom; + + if (prevSelection != 0xFF) + { + //Remove the old Pokemon label + MenuZeroFillWindowRect( + gStarterChoose_LabelCoords[prevSelection][0], + gStarterChoose_LabelCoords[prevSelection][1], + gStarterChoose_LabelCoords[prevSelection][0] + 13, + gStarterChoose_LabelCoords[prevSelection][1] + 3); + REG_WIN0H = 0; + REG_WIN0V = 0; + } + species = GetStarterPokemon(selection); + category = GetPokemonCategory(SpeciesToNationalPokedexNum(species)); + AddTextColorCtrlCode(labelText, 0, 15, 8); + dstIndex = 5; + SET_CHAR(labelText, 5, EXT_CTRL_CODE_BEGIN); + SET_CHAR(labelText, 6, 0x11); + SET_CHAR(labelText, 7, dstIndex); + + //Copy category string to label + dstIndex = 8; + srcIndex = 0; + while (category[srcIndex] != EOS && srcIndex <= 10) + { + labelText[dstIndex] = category[srcIndex]; + srcIndex++; + dstIndex++; + } + labelText[dstIndex++] = CHAR_SPACE; + + //Copy POKEMON string to label + StringCopy(labelText + dstIndex, gOtherText_Poke); + MenuPrint( + labelText, + gStarterChoose_LabelCoords[selection][0], + gStarterChoose_LabelCoords[selection][1]); + AddTextColorCtrlCode(labelText, 0, 15, 8); + + //Copy Pokemon name to label + sub_8072C74(labelText + 5, gSpeciesNames[species], 0x6B, 1); + MenuPrint( + labelText, + gStarterChoose_LabelCoords[selection][0], + gStarterChoose_LabelCoords[selection][1] + 2); + + labelLeft = gStarterChoose_LabelCoords[selection][0] * 8 + 4; + labelRight = (gStarterChoose_LabelCoords[selection][0] + 13) * 8 + 4; + labelTop = gStarterChoose_LabelCoords[selection][1] * 8; + labelBottom = (gStarterChoose_LabelCoords[selection][1] + 4) * 8; + REG_WIN0H = WIN_RANGE(labelLeft, labelRight); + REG_WIN0V = WIN_RANGE(labelTop, labelBottom); +} +#elif GERMAN +__attribute__((naked)) +static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x48\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, 24\n\ + lsrs r5, r1, 24\n\ + cmp r0, 0xFF\n\ + beq _0810A872\n\ + ldr r1, _0810A960 @ =gStarterChoose_LabelCoords\n\ + lsls r2, r0, 1\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + adds r1, 0x1\n\ + adds r2, r1\n\ + ldrb r1, [r2]\n\ + adds r2, r0, 0\n\ + adds r2, 0xD\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r3, r1, 0x3\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + bl MenuZeroFillWindowRect\n\ + ldr r0, _0810A964 @ =0x04000040\n\ + movs r1, 0\n\ + strh r1, [r0]\n\ + adds r0, 0x4\n\ + strh r1, [r0]\n\ +_0810A872:\n\ + adds r0, r5, 0\n\ + bl GetStarterPokemon\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + adds r0, r6, 0\n\ + bl SpeciesToNationalPokedexNum\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + bl GetPokemonCategory\n\ + adds r4, r0, 0\n\ + mov r0, sp\n\ + movs r1, 0\n\ + movs r2, 0xF\n\ + movs r3, 0x8\n\ + bl AddTextColorCtrlCode\n\ + movs r2, 0x8\n\ + movs r3, 0\n\ + ldrb r0, [r4]\n\ + lsls r5, 1\n\ + mov r7, sp\n\ + adds r7, 0x5\n\ + cmp r0, 0xFF\n\ + beq _0810A8CA\n\ +_0810A8A8:\n\ + mov r0, sp\n\ + adds r1, r0, r2\n\ + adds r0, r4, r3\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + adds r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + adds r0, r4, r3\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xFF\n\ + beq _0810A8CA\n\ + cmp r3, 0xA\n\ + bls _0810A8A8\n\ +_0810A8CA:\n\ + mov r0, sp\n\ + adds r1, r0, r2\n\ + movs r0, 0xFF\n\ + strb r0, [r1]\n\ + mov r1, sp\n\ + movs r0, 0xFC\n\ + strb r0, [r1, 0x5]\n\ + movs r0, 0x11\n\ + strb r0, [r1, 0x6]\n\ + mov r2, sp\n\ + lsls r1, r3, 1\n\ + adds r1, r3\n\ + lsls r1, 1\n\ + movs r0, 0x70\n\ + subs r0, r1\n\ + asrs r0, 1\n\ + strb r0, [r2, 0x7]\n\ + ldr r0, _0810A960 @ =gStarterChoose_LabelCoords\n\ + adds r1, r5, r0\n\ + ldrb r4, [r1]\n\ + adds r0, 0x1\n\ + adds r0, r5, r0\n\ + ldrb r5, [r0]\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + adds r2, r5, 0\n\ + bl MenuPrint\n\ + mov r0, sp\n\ + movs r1, 0\n\ + movs r2, 0xF\n\ + movs r3, 0x8\n\ + bl AddTextColorCtrlCode\n\ + movs r0, 0xB\n\ + adds r1, r6, 0\n\ + muls r1, r0\n\ + ldr r0, _0810A968 @ =gSpeciesNames\n\ + adds r1, r0\n\ + adds r0, r7, 0\n\ + movs r2, 0x70\n\ + movs r3, 0x2\n\ + bl sub_8072C74\n\ + adds r2, r5, 0x2\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl MenuPrint\n\ + lsls r0, r4, 3\n\ + adds r0, 0x4\n\ + lsls r0, 24\n\ + adds r4, 0xD\n\ + lsls r4, 3\n\ + adds r4, 0x4\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + lsls r1, r5, 27\n\ + adds r5, 0x4\n\ + lsls r5, 27\n\ + lsrs r5, 24\n\ + ldr r2, _0810A964 @ =0x04000040\n\ + lsrs r0, 16\n\ + orrs r0, r4\n\ + strh r0, [r2]\n\ + ldr r0, _0810A96C @ =0x04000044\n\ + lsrs r1, 16\n\ + orrs r1, r5\n\ + strh r1, [r0]\n\ + add sp, 0x48\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0810A960: .4byte gStarterChoose_LabelCoords\n\ +_0810A964: .4byte 0x04000040\n\ +_0810A968: .4byte gSpeciesNames\n\ +_0810A96C: .4byte 0x04000044\n\ + .syntax divided\n"); +} +#endif + +static void nullsub_72(struct Sprite *sprite) +{ +} + +static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y) +{ + u8 spriteId; + + DecompressPicFromTable_2( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, + gUnknown_081FAF4C[0], gUnknown_081FAF4C[1], + species); + LoadCompressedObjectPalette(&gMonPaletteTable[species]); + GetMonSpriteTemplate_803C56C(species, 1); + spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); + gSprites[spriteId].callback = nullsub_72; + gSprites[spriteId].oam.priority = 0; + return spriteId; +} + +//Sprite callback +static void sub_810A62C(struct Sprite *sprite) +{ + sprite->pos1.x = gUnknown_083F76E4[gTasks[sprite->data0].tStarterSelection][0]; + sprite->pos1.y = gUnknown_083F76E4[gTasks[sprite->data0].tStarterSelection][1]; + sprite->pos2.y = Sin(sprite->data1, 8); + sprite->data1 = (u8)sprite->data1 + 4; +} + +//Sprite callback +static void sub_810A68C(struct Sprite *sprite) +{ + if (gTasks[sprite->data0].tStarterSelection == sprite->data1) + StartSpriteAnimIfDifferent(sprite, 1); + else + StartSpriteAnimIfDifferent(sprite, 0); +} + +//Sprite callback +static void StarterPokemonSpriteAnimCallback(struct Sprite *sprite) +{ + //Move sprite to upper center of screen + if (sprite->pos1.x > STARTER_PKMN_POS_X) + sprite->pos1.x -= 4; + if (sprite->pos1.x < STARTER_PKMN_POS_X) + sprite->pos1.x += 4; + if (sprite->pos1.y > STARTER_PKMN_POS_Y) + sprite->pos1.y -= 2; + if (sprite->pos1.y < STARTER_PKMN_POS_Y) + sprite->pos1.y += 2; +} diff --git a/src/field/trader.c b/src/field/trader.c new file mode 100644 index 000000000..ea06058e9 --- /dev/null +++ b/src/field/trader.c @@ -0,0 +1,261 @@ +#include "global.h" +#include "decoration.h" +#include "decoration_inventory.h" +#include "event_data.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" + +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; + +static const u8 * const gUnknown_083F62D8[] = +{ + SecretBaseText_Tristan, + SecretBaseText_Philip, + SecretBaseText_Dennis, + SecretBaseText_Roberto, +}; + +static const u8 gTraderDecorations[] = +{ + DECOR_DUSKULL_DOLL, + DECOR_BALL_CUSHION, + DECOR_TIRE, + DECOR_PRETTY_FLOWERS, +}; + +void sub_810993C(void) +{ + u8 i, j; + u8 buffer[12]; + struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; + + for (i = 0; i < 3; i++) + { + for (j = i + 1; j < 4; j++) + { + if (trader->unk1[i] == 0) + { + u8 temp = trader->unk1[i]; + trader->unk1[i] = trader->unk1[j]; + trader->unk1[j] = temp; + StringCopy(buffer, trader->unk5[i]); + StringCopy(trader->unk5[i], trader->unk5[j]); + StringCopy(trader->unk5[j], buffer); + } + } + } +} + +void sub_81099CC(void) +{ + u8 i; + struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; + + trader->unk0 = 2; + trader->unk31 = 0; + + for (i = 0; i < 4; i++) + { + StringCopy(trader->unk5[i], gUnknown_083F62D8[i]); + trader->unk1[i] = gTraderDecorations[i]; + } + + sub_810993C(); +} + +void sub_8109A20(void) +{ + struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; + trader->unk31 = 0; +} + +void sub_8109A30(u8 value) +{ + VarSet(VAR_RECYCLE_GOODS, value); +} + +void sub_8109A48(u8 taskId) +{ + u8 i; + u8 numChoices = 1; + u8 numDecorations = 0; + struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; + + for (i = 0; i < 4; i++) + { + if (trader->unk1[i]) + { + numChoices++; + } + } + + MenuDrawTextWindow(0, 1, 12, numChoices * 2 + 2); + + for (i = 0; i < 4; i++) + { + if (trader->unk1[i]) + { + if (trader->unk1[i] > DECOR_REGISTEEL_DOLL) + { + MenuPrint(gOtherText_FiveQuestionsAndSlash, 1, numDecorations * 2 + 2); + } + else + { + MenuPrint(gDecorations[trader->unk1[i]].name, 1, numDecorations * 2 + 2); + } + + numDecorations++; + } + } + + MenuPrint(gOtherText_CancelNoTerminator, 1, numDecorations * 2 + 2); + InitMenu(0, 1, 2, numChoices, 0, 11); + gTasks[taskId].data[1] = numDecorations; +} + +void sub_8109B34(u8 taskId, u8 decorationId) +{ + if (decorationId > DECOR_REGISTEEL_DOLL) + { + gSpecialVar_0x8004 = 0xFFFF; + } + else + { + gSpecialVar_0x8004 = decorationId; + } + + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 1, 12, 12); + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void sub_8109B7C(u8 taskId) +{ + struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; + + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gSpecialVar_0x8005 = GetMenuCursorPos(); + if (gTasks[taskId].data[1] == gSpecialVar_0x8005) + { + sub_8109B34(taskId, 0); + } + else + { + StringCopy(gStringVar1, trader->unk5[gSpecialVar_0x8005]); + sub_8109B34(taskId, trader->unk1[gSpecialVar_0x8005]); + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_8109B34(taskId, 0); + } +} + +void sub_8109C44(void) +{ + struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; + gScriptResult = trader->unk31; +} + +void sub_8109C58(void) +{ + u8 i; + + for (i = 0; i < 8; i++) + { + if (sub_8134194(i)) + { + gScriptResult = FALSE; + return; + } + } + gScriptResult = TRUE; +} + +void sub_8109C90(void) +{ + gScriptResult = FALSE; + if (gDecorations[gSpecialVar_0x8004].category != gDecorations[gSpecialVar_0x8006].category + && sub_8133F9C(gDecorations[gSpecialVar_0x8004].category) == -1) + { + sub_80FE7D4(gStringVar2, gDecorations[gSpecialVar_0x8004].category); + gScriptResult = TRUE; + } +} + +void sub_8109CF0(void) +{ + CreateTask(sub_80FE7A8, 0); +} + +void sub_8109D04(u8 taskId) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 29, 19); + DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(1); + sub_80F9520(gUnknown_020388F7, 8); + BuyMenuFreeMemory(); + if (sub_80FEFA4() == TRUE) + { + gSpecialVar_0x8006 = gUnknown_020388D0[gUnknown_020388F5]; + StringCopy(gStringVar3, gDecorations[gSpecialVar_0x8004].name); + StringCopy(gStringVar2, gDecorations[gSpecialVar_0x8006].name); + } + else + { + gSpecialVar_0x8006 = 0xFFFF; + } + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void sub_8109DAC(u8 taskId) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 29, 19); + gSpecialVar_0x8006 = 0; + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void sub_8109DE0(void) +{ + struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; + + sub_81340A8(gSpecialVar_0x8006); + IsThereStorageSpaceForDecoration(gSpecialVar_0x8004); + StringCopy(trader->unk5[gSpecialVar_0x8005], gSaveBlock2.playerName); + trader->unk1[gSpecialVar_0x8005] = gSpecialVar_0x8006; + sub_810993C(); + trader->unk31 = 1; +} + +void sub_8109E34(void) +{ + u8 taskId = CreateTask(sub_8109B7C, 0); + sub_8109A48(taskId); +} diff --git a/src/field/trainer_see.c b/src/field/trainer_see.c new file mode 100644 index 000000000..feb35c67c --- /dev/null +++ b/src/field/trainer_see.c @@ -0,0 +1,455 @@ +#include "global.h" +#include "trainer_see.h" +#include "battle_setup.h" +#include "field_effect.h" +#include "field_map_obj.h" +#include "field_player_avatar.h" +#include "script.h" +#include "sprite.h" +#include "task.h" +#include "util.h" + +extern bool8 (*gIsTrainerInRange[])(struct MapObject *, u16, s16, s16); +extern bool8 (*gTrainerSeeFuncList[])(u8, struct Task *, struct MapObject *); +extern bool8 (*gTrainerSeeFuncList2[])(u8, struct Task *, struct MapObject *); + +extern struct SpriteTemplate gSpriteTemplate_839B510; +extern struct SpriteTemplate gSpriteTemplate_839B528; + +bool8 CheckTrainers(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if ( gMapObjects[i].active ) + if ( gMapObjects[i].trainerType == 1 || gMapObjects[i].trainerType == 3 ) + if ( CheckTrainer(i) ) + return TRUE; + } + return FALSE; +} + +bool8 CheckTrainer(u8 trainer) +{ + u8 *scriptPtr = GetFieldObjectScriptPointerByFieldObjectId(trainer); + + if (GetTrainerFlagFromScriptPointer(scriptPtr)) + return FALSE; + else + { + struct MapObject *trainerObj = &gMapObjects[trainer]; + u8 canApproach = TrainerCanApproachPlayer(trainerObj); + + if (canApproach != 0) + { + TrainerWantsBattle(trainer, scriptPtr); + sub_80842C8(trainerObj, (canApproach - 1)); + return TRUE; + } + else + { + return FALSE; + } + } +} + +bool8 TrainerCanApproachPlayer(struct MapObject *trainerObj) +{ + s16 x, y; + u8 i; + u8 playerCoord; + + PlayerGetDestCoords(&x, &y); + if ( trainerObj->trainerType == 1 ) // trainers that don't spin + { + playerCoord = gIsTrainerInRange[trainerObj->mapobj_unk_18 - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); + return CheckPathBetweenTrainerAndPlayer((struct MapObject2 *)trainerObj, playerCoord, trainerObj->mapobj_unk_18); + } + else // spinners + { + for (i = 0; i < 4; i++) + { + playerCoord = gIsTrainerInRange[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); + if ( CheckPathBetweenTrainerAndPlayer((struct MapObject2 *)trainerObj, playerCoord, i + 1) ) // directions are 1-4 instead of 0-3. south north west east + return playerCoord; + } + return FALSE; + } +} + +bool8 IsTrainerInRangeSouth(struct MapObject *trainerObj, s16 vision, s16 x, s16 y) +{ + if ( trainerObj->coords2.x == x + && y > trainerObj->coords2.y + && y <= trainerObj->coords2.y + vision ) + return (y - trainerObj->coords2.y); + else + return FALSE; +} + +bool8 IsTrainerInRangeNorth(struct MapObject *trainerObj, s16 vision, s16 x, s16 y) +{ + if ( trainerObj->coords2.x == x + && y < trainerObj->coords2.y + && y >= trainerObj->coords2.y - vision ) + return (trainerObj->coords2.y - y); + else + return FALSE; +} + +bool8 IsTrainerInRangeWest(struct MapObject *trainerObj, s16 vision, s16 x, s16 y) +{ + if ( trainerObj->coords2.y == y + && x < trainerObj->coords2.x + && x >= trainerObj->coords2.x - vision ) + return (trainerObj->coords2.x - x); + else + return FALSE; +} + +bool8 IsTrainerInRangeEast(struct MapObject *trainerObj, s16 vision, s16 x, s16 y) +{ + if ( trainerObj->coords2.y == y + && x > trainerObj->coords2.x + && x <= trainerObj->coords2.x + vision ) + return (x - trainerObj->coords2.x); + else + return FALSE; +} + +#ifdef BUGFIX_TRAINERAPPROACH +#define COLLISION_MASK ~1 +#else +#define COLLISION_MASK 1 +#endif + +bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject2 *trainerObj, u8 playerCoord, u8 direction) +{ + s16 x, y; + u8 unk19_temp; + u8 unk19b_temp; + u8 i; + u8 var; + + if (!playerCoord) + return FALSE; + + x = trainerObj->coords2.x; + y = trainerObj->coords2.y; + + for (i = 0; i <= playerCoord - 1; i++, MoveCoords(direction, &x, &y)) + { + var = sub_8060024((struct MapObject *)trainerObj, x, y, direction); + + if (var && (var & COLLISION_MASK)) + return FALSE; + } + + // preserve mapobj_unk_19 before clearing. + unk19_temp = trainerObj->mapobj_unk_19; + unk19b_temp = trainerObj->mapobj_unk_19b; + trainerObj->mapobj_unk_19 = 0; + trainerObj->mapobj_unk_19b = 0; + + var = npc_block_way((struct MapObject *)trainerObj, x, y, direction); + + trainerObj->mapobj_unk_19 = unk19_temp; + trainerObj->mapobj_unk_19b = unk19b_temp; + if (var == 4) + return playerCoord; + + return FALSE; +} + +void sub_80842C8(struct MapObject *trainerObj, u8 taskId) +{ + struct Task *task = &gTasks[CreateTask(RunTrainerSeeFuncList, 0x50)]; + + task->data[1] = (u32)(trainerObj) >> 16; + task->data[2] = (u32)(trainerObj); + task->data[3] = taskId; +} + +void sub_80842FC(TaskFunc func) +{ + TaskFunc func2 = RunTrainerSeeFuncList; + u8 taskId = FindTaskIdByFunc(func2); + + SetTaskFuncWithFollowupFunc(taskId, RunTrainerSeeFuncList, func); + gTasks[taskId].data[0] = 1; + func2(taskId); +} + +void RunTrainerSeeFuncList(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + struct MapObject *trainerObj = (struct MapObject *)((task->data[1] << 16) | (task->data[2])); + + if (!trainerObj->active) + SwitchTaskToFollowupFunc(taskId); + else + while (gTrainerSeeFuncList[task->data[0]](taskId, task, trainerObj)); +} + +u8 sub_8084394() // cant be void because it is called with RunTrainerSeeFuncList with arguments. +{ + return 0; +} + +s8 sub_8084398(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + u8 direction; + + FieldObjectGetLocalIdAndMap(trainerObj, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); + FieldEffectStart(0); + + direction = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18); + + FieldObjectSetSpecialAnim(trainerObj, direction); + task->data[0]++; + return 1; +} + +s8 sub_80843DC(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (FieldEffectActiveListContains(0)) + return 0; + else + { + task->data[0]++; + if ((u8)(trainerObj->animPattern - 57) <= 1) + task->data[0] = 6; + if (trainerObj->animPattern == 63) + task->data[0] = 8; + return 1; + } +} + +s8 sub_808441C(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + { + if (task->data[3]) + { + FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18)); + task->data[3]--; + } + else + { + FieldObjectSetSpecialAnim(trainerObj, 0x3E); + task->data[0]++; + } + } + return 0; +} + +s8 sub_8084478(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + struct MapObject *playerObj; + + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + return 0; + + npc_set_running_behaviour_etc(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18)); + sub_805C774(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18)); + sub_805C754(trainerObj); + + playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) + && !FieldObjectClearAnimIfSpecialAnimFinished(playerObj)) + return 0; + + sub_80597E8(); + FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18))); + task->data[0]++; + return 0; +} + +s8 sub_8084534(u8 taskId, struct Task *task, struct MapObject *trainerObj) // technically only 1 parameter, but needs all 3 for TrainerSeeFuncList call. +{ + struct MapObject *playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if ( !FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) + || FieldObjectClearAnimIfSpecialAnimFinished(playerObj) ) + SwitchTaskToFollowupFunc(taskId); + + return 0; +} + +s8 sub_8084578(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) + || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + { + FieldObjectSetSpecialAnim(trainerObj, 0x59); + task->data[0]++; + } + return 0; +} + +s8 sub_80845AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if ( FieldObjectClearAnimIfSpecialAnimFinished(trainerObj) ) + task->data[0] = 3; + + return 0; +} + +s8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) + || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + { + FieldObjectSetSpecialAnim(trainerObj, 0x3E); + task->data[0]++; + } + return 0; +} + +s8 sub_80845FC(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj)) + { + gUnknown_0202FF84[0] = trainerObj->coords2.x; + gUnknown_0202FF84[1] = trainerObj->coords2.y; + gUnknown_0202FF84[2] = gSprites[trainerObj->spriteId].subpriority - 1; + gUnknown_0202FF84[3] = 2; + task->data[4] = FieldEffectStart(49); + task->data[0]++; + } + return 0; +} + +s8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + struct Sprite *sprite; + + if (gSprites[task->data[4]].animCmdIndex == 2) + { + trainerObj->mapobj_bit_26 = 0; + trainerObj->mapobj_bit_2 = 1; + + sprite = &gSprites[trainerObj->spriteId]; + sprite->oam.priority = 2; + FieldObjectClearAnimIfSpecialAnimFinished(trainerObj); + FieldObjectSetSpecialAnim(trainerObj, sub_806084C(trainerObj->mapobj_unk_18)); + task->data[0]++; + } + return 0; +} + +s8 sub_80846C8(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (!FieldEffectActiveListContains(49)) + task->data[0] = 3; + + return 0; +} + +void sub_80846E4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + struct MapObject *mapObj; + + // another mapObj loaded into by loadword? + LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&mapObj); + if (!task->data[7]) + { + FieldObjectClearAnim(mapObj); + task->data[7]++; + } + gTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj); + if (task->data[0] == 3 && !FieldEffectActiveListContains(49)) + { + npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); + sub_805C774(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); + DestroyTask(taskId); + } + else + mapObj->mapobj_bit_7 = 0; +} + +void sub_8084794(struct MapObject *var) +{ + StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80846E4, 0)].data[1], (u32)var); +} + +void sub_80847C8(void) +{ + sub_80842FC(sub_80847D8); +} + +void sub_80847D8(u8 taskId) +{ + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +u8 FldEff_ExclamationMarkIcon1(void) +{ + u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x53); + + if (spriteId != 64) + sub_8084894(&gSprites[spriteId], 0, 0); + + return 0; +} + +u8 FldEff_ExclamationMarkIcon2(void) +{ + u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x52); + + if (spriteId != 64) + sub_8084894(&gSprites[spriteId], 33, 1); + + return 0; +} + +u8 FldEff_HeartIcon(void) +{ + u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B528, 0, 0, 0x52); + + if (spriteId != 64) + sub_8084894(&gSprites[spriteId], 46, 0); + + return 0; +} + +void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3) +{ + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = 1; + + sprite->data0 = gUnknown_0202FF84[0]; + sprite->data1 = gUnknown_0202FF84[1]; + sprite->data2 = gUnknown_0202FF84[2]; + sprite->data3 = -5; + sprite->data7 = a2; + + StartSpriteAnim(sprite, a3); +} + +void objc_exclamation_mark_probably(struct Sprite *sprite) +{ + u8 mapObjId; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjId) + || sprite->animEnded) + { + FieldEffectStop(sprite, (u8)sprite->data7); + } + else + { + struct Sprite *mapObjSprite = &gSprites[gMapObjects[mapObjId].spriteId]; + sprite->data4 += sprite->data3; + sprite->pos1.x = mapObjSprite->pos1.x; + sprite->pos1.y = mapObjSprite->pos1.y - 16; + sprite->pos2.x = mapObjSprite->pos2.x; + sprite->pos2.y = mapObjSprite->pos2.y + sprite->data4; + if (sprite->data4) + sprite->data3++; + else + sprite->data3 = 0; + } +} diff --git a/src/field/tv.c b/src/field/tv.c new file mode 100644 index 000000000..a254bcd5f --- /dev/null +++ b/src/field/tv.c @@ -0,0 +1,3260 @@ +#include "global.h" +#include "tv.h" +#include "battle_tower.h" +#include "contest_painting.h" +#include "data2.h" +#include "easy_chat.h" +#include "event_data.h" +#include "fieldmap.h" +#include "field_message_box.h" +#include "field_camera.h" +#include "flags.h" +#include "rng.h" +#include "string_util.h" +#include "text.h" +#include "species.h" +#include "pokedex.h" +#include "naming_screen.h" +#include "rom4.h" +#include "map_constants.h" +#include "strings.h" +#include "battle.h" +#include "link.h" +#include "easy_chat.h" +#include "field_map_obj.h" +#include "field_specials.h" +#include "item.h" +#include "items.h" +#include "link.h" +#include "map_constants.h" +#include "naming_screen.h" +#include "pokedex.h" +#include "region_map.h" +#include "rng.h" +#include "rom4.h" +#include "rtc.h" +#include "script_menu.h" +#include "species.h" +#include "string_util.h" +#include "strings.h" +#include "text.h" + +struct UnkTvStruct +{ + s8 var0; +}; + +extern u8 gUnknown_0300430A[11]; + +struct OutbreakPokemon +{ + /*0x00*/ u16 species; + /*0x02*/ u16 moves[4]; + /*0x0A*/ u8 level; + /*0x0B*/ u8 location; +}; + +struct TVSaleItem { + u16 item_id; + u16 item_amount; +}; + +extern u8 gUnknown_02038694; + +extern struct TVSaleItem gUnknown_02038724[3]; + +struct UnkTvStruct gUnknown_03005D38; + +extern u8 *gTVBravoTrainerTextGroup[]; +extern u8 *gTVBravoTrainerBattleTowerTextGroup[]; +extern u8 *gTVSmartShopperTextGroup[]; +extern u8 *gTVNameRaterTextGroup[]; +extern u8 *gTVPokemonTodayTextGroup[]; +extern u8 *gTVPokemonTodayFailedCaptureTextGroup[]; +extern u8 *gTVFanClubTextGroup[]; +extern u8 *gTVRecentHappeningsTextGroup[]; +extern u8 *gTVFanClubOpinionsTextGroup[]; +extern u8 *gTVPokemonOutbreakTextGroup[]; +extern u8 *gTVGabbyAndTyTextGroup[]; +extern u8 *gTVFishingGuruAdviceTextGroup[]; +extern u8 *gTVWorldOfMastersTextGroup[]; +extern struct OutbreakPokemon gPokeOutbreakSpeciesList[5]; + + + +extern const u8 *gTVNewsTextGroup1[]; +extern const u8 *gTVNewsTextGroup2[]; +extern const u8 *gTVNewsTextGroup3[]; + +extern u16 gScriptLastTalked; + +extern u8 gScriptContestCategory; +extern u8 gScriptContestRank; +extern u8 gUnknown_03004316[11]; +extern u8 gBattleOutcome; + +extern u16 gLastUsedItem; + +extern u8 ewram[]; +#define gUnknown_02007000 (*(ewramStruct_02007000 *)(ewram + 0x7000)) + +static EWRAM_DATA u16 gUnknown_020387E0 = 0; +static EWRAM_DATA u16 gUnknown_020387E2 = 0; +static EWRAM_DATA u8 gUnknown_020387E4 = 0; +static EWRAM_DATA ALIGNED(4) u8 gUnknown_020387E8 = 0; // why is this aligned to a 4-byte boundary? + +static u8 gUnknown_03000720; +static u8 gUnknown_03000721; +static s8 gUnknown_03000722; + +void ClearTVShowData(void) +{ + u8 showidx; + u8 extradataidx; + for (showidx=0; showidx<25; showidx++) { + gSaveBlock1.tvShows[showidx].common.var00 = 0; + gSaveBlock1.tvShows[showidx].common.var01 = 0; + for (extradataidx=0; extradataidx<34; extradataidx++) { + gSaveBlock1.tvShows[showidx].common.pad02[extradataidx] = 0; + } + } + sub_80BEBF4(); +} + +bool8 sub_80BF1B4(u8); +void sub_80BF20C(void); +extern u16 sub_8135D3C(u8); +extern u8 gScriptContestCategory; +extern u8 gScriptContestRank; +extern u8 gUnknown_03004316[11]; +extern u8 gBattleOutcome; + +void sub_80BF334(void); +void sub_80BF3A4(void); +void sub_80BF3DC(void); +void sub_80BF46C(void); +void sub_80BF478(void); +void sub_80BF484(void); +void sub_80BF4BC(void); + +void sub_80BE028(void); +void sub_80BE074(void); +void sub_80BE778(void); +void sub_80BEB20(void); + +u8 sub_80BFB54(u8); + +s8 sub_80BF74C(TVShow tvShow[]); + +void sub_80BF55C(TVShow tvShow[], u8 showidx); +void sub_80BEA88(void); + +void sub_80BE138(TVShow *show); +void sub_80BE160(TVShow *show); +extern u16 gLastUsedItem; + +void sub_80BE5FC(void); +void sub_80BE65C(void); +void sub_80BE6A0(void); +void nullsub_21(void); +void sub_80BE188(void); +void sub_80BE320(void); + +u8 special_0x44(void) +{ + u8 i; + u8 j; + +#ifndef NONMATCHING + asm("":::"r5"); +#endif + + for (i = 5; i < 24; i++) + { + if (gSaveBlock1.tvShows[i].common.var00 == 0) + break; + } + i = Random() % i; + j = i; + do + { + if (sub_80BFB54(gSaveBlock1.tvShows[i].common.var00) != 4) + { + if (gSaveBlock1.tvShows[i].common.var01 == 1) + return i; + } + else + { + struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[i].massOutbreak; + + if (massOutbreak->var16 == 0 && massOutbreak->var01 == 1) + return i; + } + + if (i == 0) + i = 23; + else + i--; + } while (i != j); + return 0xFF; +} + +u8 sub_80BDA30(void); + +u8 sub_80BD8B8(void) +{ + u8 retval = special_0x44(); + + if (retval == 0xff) + return 0xff; + if (gSaveBlock1.outbreakPokemonSpecies != 0 && gSaveBlock1.tvShows[retval].common.var00 == TVSHOW_MASS_OUTBREAK) + return sub_80BDA30(); + return retval; +} + +u8 CheckForBigMovieOrEmergencyNewsOnTV(void); +void SetTVMetatilesOnMap(int, int, u16); +bool8 sub_80BECA0(void); +bool8 IsTVShowInSearchOfTrainersAiring(void); + +void UpdateTVScreensOnMap(int width, int height) +{ + FlagSet(SYS_TV_WATCH); + switch (CheckForBigMovieOrEmergencyNewsOnTV()) + { + case 1: + SetTVMetatilesOnMap(width, height, 0x3); + break; + case 2: + break; + default: + if (gSaveBlock1.location.mapGroup == MAP_GROUP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F + && gSaveBlock1.location.mapNum == MAP_ID_LILYCOVE_CITY_COVE_LILY_MOTEL_1F) + { + SetTVMetatilesOnMap(width, height, 0x3); + } + else if (FlagGet(SYS_TV_START) && (sub_80BD8B8() != 0xff || sub_80BECA0() != 0xff || IsTVShowInSearchOfTrainersAiring())) + { + FlagReset(SYS_TV_WATCH); + SetTVMetatilesOnMap(width, height, 0x3); + } + break; + } +} + +void SetTVMetatilesOnMap(int width, int height, u16 tileId) +{ + int x; + int y; + + for (y=0; ycommon.var00 == TVSHOW_MASS_OUTBREAK && gSaveBlock1.outbreakPokemonSpecies) + return sub_80BDA30(); + return gSpecialVar_0x8004; +} + +void ResetGabbyAndTy(void) +{ + gSaveBlock1.gabbyAndTyData.mon1 = 0; + gSaveBlock1.gabbyAndTyData.mon2 = 0; + gSaveBlock1.gabbyAndTyData.lastMove = 0; + gSaveBlock1.gabbyAndTyData.quote = 0xffff; + gSaveBlock1.gabbyAndTyData.valA_0 = 0; + gSaveBlock1.gabbyAndTyData.valA_1 = 0; + gSaveBlock1.gabbyAndTyData.valA_2 = 0; + gSaveBlock1.gabbyAndTyData.valA_3 = 0; + gSaveBlock1.gabbyAndTyData.valA_4 = 0; + gSaveBlock1.gabbyAndTyData.valA_5 = 0; + gSaveBlock1.gabbyAndTyData.valB_0 = 0; + gSaveBlock1.gabbyAndTyData.valB_1 = 0; + gSaveBlock1.gabbyAndTyData.valB_2 = 0; + gSaveBlock1.gabbyAndTyData.valB_3 = 0; + gSaveBlock1.gabbyAndTyData.valB_4 = 0; + gSaveBlock1.gabbyAndTyData.valB_5 = 0; + gSaveBlock1.gabbyAndTyData.mapnum = 0; + gSaveBlock1.gabbyAndTyData.battleNum = 0; +} + +void TakeTVShowInSearchOfTrainersOffTheAir(void); + +void GabbyAndTyBeforeInterview(void) +{ + u8 i; + + gSaveBlock1.gabbyAndTyData.mon1 = gBattleResults.poke1Species; + gSaveBlock1.gabbyAndTyData.mon2 = gBattleResults.opponentSpecies; + gSaveBlock1.gabbyAndTyData.lastMove = gBattleResults.lastUsedMove; + if (gSaveBlock1.gabbyAndTyData.battleNum != 0xff) + gSaveBlock1.gabbyAndTyData.battleNum ++; + gSaveBlock1.gabbyAndTyData.valA_0 = gBattleResults.unk5_0; + + if (gBattleResults.playerFaintCounter) + gSaveBlock1.gabbyAndTyData.valA_1 = 1; + else + gSaveBlock1.gabbyAndTyData.valA_1 = 0; + + if (gBattleResults.unk3) + gSaveBlock1.gabbyAndTyData.valA_2 = 1; + else + gSaveBlock1.gabbyAndTyData.valA_2 = 0; + + if (!gBattleResults.unk5_1) + { + for (i=0; i<11; i++) + { + if (gBattleResults.unk36[i] != 0) + { + gSaveBlock1.gabbyAndTyData.valA_3 = 1; + break; + } + } + } + else + { + gSaveBlock1.gabbyAndTyData.valA_3 = 1; + } + + TakeTVShowInSearchOfTrainersOffTheAir(); + if (gSaveBlock1.gabbyAndTyData.lastMove == 0) + FlagSet(1); +} + +void sub_80BDC14(void) +{ + gSaveBlock1.gabbyAndTyData.valB_0 = gSaveBlock1.gabbyAndTyData.valA_0; + gSaveBlock1.gabbyAndTyData.valB_1 = gSaveBlock1.gabbyAndTyData.valA_1; + gSaveBlock1.gabbyAndTyData.valB_2 = gSaveBlock1.gabbyAndTyData.valA_2; + gSaveBlock1.gabbyAndTyData.valB_3 = gSaveBlock1.gabbyAndTyData.valA_3; + gSaveBlock1.gabbyAndTyData.valA_4 = 1; + gSaveBlock1.gabbyAndTyData.mapnum = gMapHeader.regionMapSectionId; + IncrementGameStat(GAME_STAT_GOT_INTERVIEWED); +} + +void TakeTVShowInSearchOfTrainersOffTheAir(void) +{ + gSaveBlock1.gabbyAndTyData.valA_4 = 0; +} + +u8 GabbyAndTyGetBattleNum(void) +{ + if (gSaveBlock1.gabbyAndTyData.battleNum >= 6) + return (gSaveBlock1.gabbyAndTyData.battleNum % 3) + 6; + else + return gSaveBlock1.gabbyAndTyData.battleNum; +} + +bool8 IsTVShowInSearchOfTrainersAiring(void) +{ + return gSaveBlock1.gabbyAndTyData.valA_4; +} + +bool8 GabbyAndTyGetLastQuote(void) +{ + if (gSaveBlock1.gabbyAndTyData.quote == 0xffff) + return FALSE; + + sub_80EB3FC(gStringVar1, gSaveBlock1.gabbyAndTyData.quote); + gSaveBlock1.gabbyAndTyData.quote |= 0xffff; + return TRUE; +} + +u8 sub_80BDD18(void) +{ + if (!gSaveBlock1.gabbyAndTyData.valB_0) + return 1; + if (gSaveBlock1.gabbyAndTyData.valB_3) + return 2; + if (gSaveBlock1.gabbyAndTyData.valB_2) + return 3; + if (gSaveBlock1.gabbyAndTyData.valB_1) + return 4; + return 0; +} + +void GabbyAndTySetScriptVarsToFieldObjectLocalIds(void) +{ + switch (GabbyAndTyGetBattleNum()) + { + case 1: + gSpecialVar_0x8004 = 0xE; + gSpecialVar_0x8005 = 0xD; + break; + case 2: + gSpecialVar_0x8004 = 0x5; + gSpecialVar_0x8005 = 0x6; + break; + case 3: + gSpecialVar_0x8004 = 0x12; + gSpecialVar_0x8005 = 0x11; + break; + case 4: + gSpecialVar_0x8004 = 0x15; + gSpecialVar_0x8005 = 0x16; + break; + case 5: + gSpecialVar_0x8004 = 0x8; + gSpecialVar_0x8005 = 0x9; + break; + case 6: + gSpecialVar_0x8004 = 0x13; + gSpecialVar_0x8005 = 0x14; + break; + case 7: + gSpecialVar_0x8004 = 0x17; + gSpecialVar_0x8005 = 0x18; + break; + case 8: + gSpecialVar_0x8004 = 0xA; + gSpecialVar_0x8005 = 0xB; + break; + } +} + +void sub_80BDE48(void) +{ + switch (gSpecialVar_0x8005) + { + case TVSHOW_FAN_CLUB_LETTER: + sub_80BE5FC(); + break; + case TVSHOW_RECENT_HAPPENINGS: + sub_80BE65C(); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + sub_80BE6A0(); + break; + case TVSHOW_UNKN_SHOWTYPE_04: + nullsub_21(); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + sub_80BE188(); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + sub_80BE320(); + break; + } +} + +u8 sub_80BDEAC(u8 *a0) +{ + u8 lang = GAME_LANGUAGE; + + if (a0[0] == EXT_CTRL_CODE_BEGIN && a0[1] == 0x15) + lang = LANGUAGE_JAPANESE; + return lang; +} + +void sub_80BDEC8(void) +{ + u8 i; + u16 total; + u16 item; + + total = 0; + sub_80BEB20(); + sub_80BE778(); + + if (gBattleResults.caughtPoke == 0) + { + sub_80BE074(); + } + else + { + sub_80BE028(); + if (sub_80BF77C(0xffff) == 0 && StringCompareWithoutExtCtrlCodes(gSpeciesNames[gBattleResults.caughtPoke], gBattleResults.caughtNick) != 0) + { + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_POKEMON_TODAY_CAUGHT) != 1) + { + for (i = 0; i < 11; i++) + total += gBattleResults.unk36[i]; + if (total != 0 || gBattleResults.unk5_1 != 0) + { + struct TVShowPokemonToday *pokemonToday; + + total = 0; + pokemonToday = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonToday; + pokemonToday->var00 = TVSHOW_POKEMON_TODAY_CAUGHT; + pokemonToday->var01 = total; + if (gBattleResults.unk5_1 != 0) + { + total = 1; + item = ITEM_MASTER_BALL; + } + else + { + for (i = 0; i < 11; i++) + total += gBattleResults.unk36[i]; + if (total > 0xff) + total = 0xff; + item = gLastUsedItem; + } + pokemonToday->var12 = total; + pokemonToday->ball = item; + StringCopy(pokemonToday->playerName, gSaveBlock2.playerName); + StringCopy(pokemonToday->nickname, gBattleResults.caughtNick); + pokemonToday->species = gBattleResults.caughtPoke; + sub_80BE138((TVShow *)pokemonToday); + pokemonToday->language = GAME_LANGUAGE; + pokemonToday->language2 = sub_80BDEAC(pokemonToday->nickname); + StripExtCtrlCodes(pokemonToday->nickname); + } + } + } + } +} + +void sub_80BE028(void) +{ + struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[24].worldOfMasters; + + if (worldOfMasters->var00 != TVSHOW_WORLD_OF_MASTERS) + { + sub_80BF55C(gSaveBlock1.tvShows, 24); + worldOfMasters->var06 = GetGameStat(GAME_STAT_STEPS); + worldOfMasters->var00 = TVSHOW_WORLD_OF_MASTERS; + } + worldOfMasters->var02++; + worldOfMasters->var04 = gBattleResults.caughtPoke; + worldOfMasters->var08 = gBattleResults.poke1Species; + worldOfMasters->var0a = gMapHeader.regionMapSectionId; +} + +void sub_80BE074(void) +{ + u8 i; + u16 total; + u8 zero = 0; + + if (sub_80BF77C(0xffff) == 0) + { + for (i = 0, total = 0; i < ARRAY_COUNT(gUnknown_03004316); i++) + total += gUnknown_03004316[i]; + if (total > 0xff) + total = 0xff; + if (total > 2 && gBattleOutcome == 1) + { + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_POKEMON_TODAY_FAILED) != 1) + { + struct TVShowPokemonTodayFailed *pokemonTodayFailed = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonTodayFailed; + + zero = 0; + pokemonTodayFailed->var00 = TVSHOW_POKEMON_TODAY_FAILED; + pokemonTodayFailed->var01 = zero; + pokemonTodayFailed->species = gBattleResults.poke1Species; + pokemonTodayFailed->species2 = gBattleResults.lastOpponentSpecies; + pokemonTodayFailed->var10 = total; + pokemonTodayFailed->var11 = gBattleOutcome; + pokemonTodayFailed->var12 = gMapHeader.regionMapSectionId; + StringCopy(pokemonTodayFailed->playerName, gSaveBlock2.playerName); + sub_80BE138((TVShow *)pokemonTodayFailed); + pokemonTodayFailed->language = GAME_LANGUAGE; + } + } + } +} + + +void sub_80BE138(TVShow *show) +{ + u32 playerId = GetPlayerTrainerId(); + + show->common.srcTrainerId2Lo = playerId & 0xFF; + show->common.srcTrainerId2Hi = playerId >> 8; + show->common.srcTrainerIdLo = playerId & 0xFF; + show->common.srcTrainerIdHi = playerId >> 8; + show->common.trainerIdLo = playerId & 0xFF; + show->common.trainerIdHi = playerId >> 8; +} + +void sub_80BE160(TVShow *show) +{ + u32 playerId = GetPlayerTrainerId(); + + show->common.srcTrainerIdLo = playerId & 0xFF; + show->common.srcTrainerIdHi = playerId >> 8; + show->common.trainerIdLo = playerId & 0xFF; + show->common.trainerIdHi = playerId >> 8; +} + +void sub_80BE188(void) +{ + struct TVShowBravoTrainerPokemonProfiles *bravoTrainerSrc = &gSaveBlock1.tvShows[24].bravoTrainer; + + if (bravoTrainerSrc->var00 == TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE) + { + struct TVShowBravoTrainerPokemonProfiles *bravoTrainerNew = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainer; + + bravoTrainerNew->var00 = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE; + bravoTrainerNew->var01 = 1; + bravoTrainerNew->species = bravoTrainerSrc->species; + StringCopy(bravoTrainerNew->playerName, gSaveBlock2.playerName); + StringCopy(bravoTrainerNew->pokemonNickname, bravoTrainerSrc->pokemonNickname); + bravoTrainerNew->contestCategory = bravoTrainerSrc->contestCategory; + bravoTrainerNew->contestRank = bravoTrainerSrc->contestRank; + bravoTrainerNew->var14 = bravoTrainerSrc->var14; + bravoTrainerNew->contestResult = bravoTrainerSrc->contestResult; + bravoTrainerNew->contestCategory = bravoTrainerSrc->contestCategory; + sub_80BE160((TVShow *)bravoTrainerNew); + bravoTrainerNew->language = GAME_LANGUAGE; + bravoTrainerNew->var1f = sub_80BDEAC(bravoTrainerNew->pokemonNickname); + StripExtCtrlCodes(bravoTrainerNew->pokemonNickname); + } +} + +void sub_80BE23C(u16 a0) +{ + struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[24].bravoTrainer; + + sub_80BF484(); + gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1) + { + sub_80BF55C(gSaveBlock1.tvShows, 24); + bravoTrainer->var14 = a0; + bravoTrainer->var00 = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE; + } +} + +void sub_80BE284(u8 a0) +{ + struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[24].bravoTrainer; + + gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1) + { + bravoTrainer->contestResult = a0; + bravoTrainer->contestCategory = gScriptContestCategory; + bravoTrainer->contestRank = gScriptContestRank; + bravoTrainer->species = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_SPECIES, NULL); + GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_NICKNAME, bravoTrainer->pokemonNickname); + } +} + +void sub_80BE320(void) +{ + struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainerTower; + + bravoTrainerTower->var00 = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE; + bravoTrainerTower->var01 = 1; + StringCopy(bravoTrainerTower->trainerName, gSaveBlock2.playerName); + StringCopy(bravoTrainerTower->pokemonName, gSaveBlock2.filler_A8.filler_3DC); + bravoTrainerTower->species = gSaveBlock2.filler_A8.var_480; + bravoTrainerTower->defeatedSpecies = gSaveBlock2.filler_A8.var_482; + bravoTrainerTower->var16 = sub_8135D3C(gSaveBlock2.filler_A8.var_4D0); + bravoTrainerTower->var1c = gSaveBlock2.filler_A8.var_4AD; + if (gSaveBlock2.filler_A8.var_4D0 == 0) + bravoTrainerTower->btLevel = 50; + else + bravoTrainerTower->btLevel = 100; + bravoTrainerTower->var1b = gSpecialVar_0x8004; + sub_80BE160((TVShow *)bravoTrainerTower); + bravoTrainerTower->language = GAME_LANGUAGE; +} + +void sub_80BE3BC(void) +{ + u8 rval; + u8 i; + + rval = sub_80BF77C(0x5555); + if (rval == 0) + { + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_SMART_SHOPPER) != 1) + { + sub_80BF20C(); + if (gUnknown_02038724[0].item_amount >= 20) + { + struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].smartshopperShow; + + smartShopper->var00 = TVSHOW_SMART_SHOPPER; + smartShopper->var01 = rval; + 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->priceReduced = GetPriceReduction(1); + StringCopy(smartShopper->playerName, gSaveBlock2.playerName); + sub_80BE138((TVShow *)smartShopper); + smartShopper->language = GAME_LANGUAGE; + } + } + } +} + +void sub_80BE478(void) +{ + sub_80BF478(); + if (gScriptResult == 1) + return; + + GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1); + if (StringLength(gSaveBlock2.playerName) > 1 && StringLength(gStringVar1) > 1) + { + struct TVShowNameRaterShow *nameRaterShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].nameRaterShow; + + nameRaterShow->var00 = TVSHOW_NAME_RATER_SHOW; + nameRaterShow->var01 = 1; + nameRaterShow->species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL); + nameRaterShow->random = Random() % 3; + nameRaterShow->random2 = Random() % 2; + nameRaterShow->var1C = sub_80BF674(nameRaterShow->species); + StringCopy(nameRaterShow->trainerName, gSaveBlock2.playerName); + GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, nameRaterShow->pokemonName); + sub_80BE160((TVShow *)nameRaterShow); + nameRaterShow->language = GAME_LANGUAGE; + nameRaterShow->pokemonNameLanguage = sub_80BDEAC(nameRaterShow->pokemonName); + StripExtCtrlCodes(nameRaterShow->pokemonName); + } +} + +void StartMassOutbreak(void) +{ + struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[gSpecialVar_0x8004].massOutbreak; + + gSaveBlock1.outbreakPokemonSpecies = massOutbreak->species; + gSaveBlock1.outbreakLocationMapNum = massOutbreak->locationMapNum; + gSaveBlock1.outbreakLocationMapGroup = massOutbreak->locationMapGroup; + gSaveBlock1.outbreakPokemonLevel = massOutbreak->level; + gSaveBlock1.outbreakUnk1 = massOutbreak->var02; + gSaveBlock1.outbreakUnk2 = massOutbreak->var0E; + gSaveBlock1.outbreakPokemonMoves[0] = massOutbreak->moves[0]; + gSaveBlock1.outbreakPokemonMoves[1] = massOutbreak->moves[1]; + gSaveBlock1.outbreakPokemonMoves[2] = massOutbreak->moves[2]; + gSaveBlock1.outbreakPokemonMoves[3] = massOutbreak->moves[3]; + gSaveBlock1.outbreakUnk4 = massOutbreak->var03; + gSaveBlock1.outbreakPokemonProbability = massOutbreak->probability; + gSaveBlock1.outbreakUnk5 = 2; +} + +void sub_80BE5FC(void) +{ + struct TVShowFanClubLetter *fanclubLetter = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubLetter; + + fanclubLetter->var00 = TVSHOW_FAN_CLUB_LETTER; + fanclubLetter->var01 = 1; + StringCopy(fanclubLetter->playerName, gSaveBlock2.playerName); + fanclubLetter->species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL); + sub_80BE160((TVShow *)fanclubLetter); + fanclubLetter->language = GAME_LANGUAGE; +} + +void sub_80BE65C(void) +{ + struct TVShowRecentHappenings *recentHappenings = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].recentHappenings; + + recentHappenings->var00 = TVSHOW_RECENT_HAPPENINGS; + recentHappenings->var01 = 1; + StringCopy(recentHappenings->playerName, gSaveBlock2.playerName); + recentHappenings->var02 = 0; + sub_80BE160((TVShow *)recentHappenings); + recentHappenings->language = GAME_LANGUAGE; +} + +void sub_80BE6A0(void) +{ + u8 monIndex; + struct TVShowFanclubOpinions *fanclubOpinions = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubOpinions; + + fanclubOpinions->var00 = TVSHOW_PKMN_FAN_CLUB_OPINIONS; + fanclubOpinions->var01 = 1; + monIndex = GetLeadMonIndex(); + fanclubOpinions->var04A = GetMonData(&gPlayerParty[monIndex], MON_DATA_FRIENDSHIP, NULL) / 16; + fanclubOpinions->var04B = gSpecialVar_0x8007; + StringCopy(fanclubOpinions->playerName, gSaveBlock2.playerName); + GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, fanclubOpinions->var10); + fanclubOpinions->var02 = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL); + sub_80BE160((TVShow *)fanclubOpinions); + fanclubOpinions->language = GAME_LANGUAGE; + fanclubOpinions->var0E = sub_80BDEAC(fanclubOpinions->var10); + StripExtCtrlCodes(fanclubOpinions->var10); +} + +void nullsub_21(void) +{ +} + +void sub_80BE778(void) +{ + if (FlagGet(SYS_GAME_CLEAR)) + { + u8 i; + + for (i = 0; i < 24; i++) + { + if (gSaveBlock1.tvShows[i].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK) + return; + } + if (sub_80BF77C(0x147)) + return; + + gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1) + { + u16 rand = Random(); + u16 val = rand % 5; + s32 val2 = gUnknown_03005D38.var0; + struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[val2].massOutbreak; + + massOutbreak->var00 = TVSHOW_MASS_OUTBREAK; + massOutbreak->var01 = 1; + massOutbreak->level = gPokeOutbreakSpeciesList[val].level; + massOutbreak->var02 = 0; + massOutbreak->var03 = 0; + massOutbreak->species = gPokeOutbreakSpeciesList[val].species; + massOutbreak->var0E = 0; + massOutbreak->moves[0] = gPokeOutbreakSpeciesList[val].moves[0]; + massOutbreak->moves[1] = gPokeOutbreakSpeciesList[val].moves[1]; + massOutbreak->moves[2] = gPokeOutbreakSpeciesList[val].moves[2]; + massOutbreak->moves[3] = gPokeOutbreakSpeciesList[val].moves[3]; + massOutbreak->locationMapNum = gPokeOutbreakSpeciesList[val].location; + massOutbreak->locationMapGroup = 0; + massOutbreak->var12 = 0; + massOutbreak->probability = 0x32; + massOutbreak->var15 = 0; + massOutbreak->var16 = 0x01; + sub_80BE160((TVShow *)massOutbreak); + massOutbreak->language = GAME_LANGUAGE; + } + } +} + +void EndMassOutbreak(void) +{ + gSaveBlock1.outbreakPokemonSpecies = 0; + gSaveBlock1.outbreakLocationMapNum = 0; + gSaveBlock1.outbreakLocationMapGroup = 0; + gSaveBlock1.outbreakPokemonLevel = 0; + gSaveBlock1.outbreakUnk1 = 0; + gSaveBlock1.outbreakUnk2 = 0; + gSaveBlock1.outbreakPokemonMoves[0] = 0; + gSaveBlock1.outbreakPokemonMoves[1] = 0; + gSaveBlock1.outbreakPokemonMoves[2] = 0; + gSaveBlock1.outbreakPokemonMoves[3] = 0; + gSaveBlock1.outbreakUnk4 = 0; + gSaveBlock1.outbreakPokemonProbability = 0; + gSaveBlock1.outbreakUnk5 = 0; +} + +void UpdateTVShowsPerDay(u16 arg0) +{ + sub_80BE8EC(arg0); + UpdateMassOutbreakTimeLeft(arg0); + sub_80BEE84(arg0); + sub_80BEA5C(arg0); +} + +void sub_80BE8EC(u16 arg0) +{ + u8 showidx; + + if (gSaveBlock1.outbreakPokemonSpecies == 0) + { + for (showidx=0; showidx<24; showidx++) + { + if (gSaveBlock1.tvShows[showidx].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK + && gSaveBlock1.tvShows[showidx].massOutbreak.var01 == 0x01) + { + struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[showidx].massOutbreak; + + if (massOutbreak->var16 < arg0) + massOutbreak->var16 = 0; + else + massOutbreak->var16 -= arg0; + break; + } + } + } +} + +void UpdateMassOutbreakTimeLeft(u16 arg0) +{ + if (gSaveBlock1.outbreakUnk5 <= arg0) + EndMassOutbreak(); + else + gSaveBlock1.outbreakUnk5 -= arg0; +} + +void sub_80BE97C(bool8 flag) +{ + u8 var0, var1; + + if (flag) + { + var0 = gUnknown_020387E2 >> 8; + if (var0 > 4) + sub_80BE9D4(); + gUnknown_020387E2 &= 0xFF; + var1 = gUnknown_020387E2 & 0xFF; + if (var1 != 0xFF) + gUnknown_020387E2++; + } + else + { + var0 = gUnknown_020387E2 & 0xFF; + if (var0 > 4) + sub_80BE9D4(); + gUnknown_020387E2 &= 0xFF00; + var1 = gUnknown_020387E2 >> 8; + if (var1 != 0xFF) + gUnknown_020387E2 += 0x100; + } +} + +void sub_80BE9D4(void) +{ + //TVShow *show; + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_FISHING_ADVICE) != 1) + { + struct TVShowPokemonAngler *pokemonAngler = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonAngler; + register u8 zero asm("r1") = 0; + + asm(""::"r"(zero)); + pokemonAngler->var00 = TVSHOW_FISHING_ADVICE; + pokemonAngler->var01 = zero; + pokemonAngler->var02 = gUnknown_020387E2 & 0xFF; + pokemonAngler->var03 = gUnknown_020387E2 >> 8; + pokemonAngler->var04 = gUnknown_020387E0; + StringCopy(pokemonAngler->playerName, gSaveBlock2.playerName); + sub_80BE138((TVShow *)pokemonAngler); + pokemonAngler->language = GAME_LANGUAGE; + } +} + +void sub_80BEA50(u16 var) +{ + gUnknown_020387E0 = var; +} + +void sub_80BEA88(void); + +void sub_80BEA5C(u16 arg0) +{ + struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[24].worldOfMasters; + + if (worldOfMasters->var00 == TVSHOW_WORLD_OF_MASTERS) + { + if (worldOfMasters->var02 < 20) + sub_80BF55C(gSaveBlock1.tvShows, 0x18); + else + sub_80BEA88(); + } +} +void sub_80BEA88(void) +{ + struct TVShowWorldOfMasters *worldOfMastersSrc = &gSaveBlock1.tvShows[24].worldOfMasters; + + if (sub_80BF77C(0xFFFF) == 0) + { + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_WORLD_OF_MASTERS) != 1) + { + struct TVShowWorldOfMasters *worldOfMastersDst = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].worldOfMasters; + + worldOfMastersDst->var00 = TVSHOW_WORLD_OF_MASTERS; + worldOfMastersDst->var01 = 0; + worldOfMastersDst->var02 = worldOfMastersSrc->var02; + worldOfMastersDst->var06 = GetGameStat(GAME_STAT_STEPS) - worldOfMastersSrc->var06; + worldOfMastersDst->var04 = worldOfMastersSrc->var04; + worldOfMastersDst->var08 = worldOfMastersSrc->var08; + worldOfMastersDst->var0a = worldOfMastersSrc->var0a; + StringCopy(worldOfMastersDst->playerName, gSaveBlock2.playerName); + sub_80BE138((TVShow *)worldOfMastersDst); + worldOfMastersDst->language = GAME_LANGUAGE; + } + } +} + +void sub_80BEB20(void) +{ + u16 rval; + + if (FlagGet(SYS_GAME_CLEAR) != 0) + { + gUnknown_03005D38.var0 = sub_80BEBC8(gSaveBlock1.unknown_2ABC); + if (gUnknown_03005D38.var0 != -1 && sub_80BF77C(0x28f) != 1) + { + rval = (Random() % 3) + 1; + if (sub_80BEE48(rval) != 1) + { + gSaveBlock1.unknown_2ABC[gUnknown_03005D38.var0].val0 = rval; + gSaveBlock1.unknown_2ABC[gUnknown_03005D38.var0].val2 = 4; + gSaveBlock1.unknown_2ABC[gUnknown_03005D38.var0].val1 = 1; + } + } + } +} + +int sub_80BEBC8(struct UnknownSaveStruct2ABC *arg0) +{ + s8 i; + + for (i = 0; i < 16; i++) + { + if (arg0[i].val0 == 0) + return i; + } + return -1; +} + +void sub_80BEBF4(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + sub_80BEC10(i); +} + +void sub_80BEC10(u8 arg0) +{ + gSaveBlock1.unknown_2ABC[arg0].val0 = 0; + gSaveBlock1.unknown_2ABC[arg0].val1 = 0; + gSaveBlock1.unknown_2ABC[arg0].val2 = 0; +} + +void sub_80BEC40(void) +{ + u8 i, j; + + for (i = 0; i < 15; i++) + { + if (gSaveBlock1.unknown_2ABC[i].val0 == 0) + { + for (j = i + 1; j < 16; j++) + { + if (gSaveBlock1.unknown_2ABC[j].val0 != 0) + { + gSaveBlock1.unknown_2ABC[i] = gSaveBlock1.unknown_2ABC[j]; + sub_80BEC10(j); + break; + } + } + } + } +} + +u8 sub_80BECA0(void) +{ + u8 i; + for (i = 0; i < 16; i++) + { + if (gSaveBlock1.unknown_2ABC[i].val0 != 0 + && gSaveBlock1.unknown_2ABC[i].val1 == 1 + && gSaveBlock1.unknown_2ABC[i].val2 < 3) + return i; + } + return 0xFF; +} + +void sub_80BECE8(void) +{ + u8 arg0; + arg0 = sub_80BECA0(); + if (arg0 == 0xff) + { + gScriptResult = 0; + return; + } + if (gSaveBlock1.unknown_2ABC[arg0].val2 == 0) + { + gSaveBlock1.unknown_2ABC[arg0].val1 = 2; + if (gLocalTime.hours < 20) + ShowFieldMessage(gTVNewsTextGroup2[gSaveBlock1.unknown_2ABC[arg0].val0]); + else + ShowFieldMessage(gTVNewsTextGroup3[gSaveBlock1.unknown_2ABC[arg0].val0]); + } + else + { + u16 value = gSaveBlock1.unknown_2ABC[arg0].val2; + + ConvertIntToDecimalStringN(gStringVar1, value, 0, 1); + gSaveBlock1.unknown_2ABC[arg0].val1 = 0; + ShowFieldMessage(gTVNewsTextGroup1[gSaveBlock1.unknown_2ABC[arg0].val0]); + } + gScriptResult = 1; +} + +bool8 GetPriceReduction(u8 arg0) +{ + u8 i; + + if (arg0 == 0) + return FALSE; + for (i=0; i<16; i++) + { + if (gSaveBlock1.unknown_2ABC[i].val0 == arg0) + { + if (gSaveBlock1.unknown_2ABC[i].val1 == 2 && IsPriceDiscounted(arg0) != 0) + return TRUE; + else + return FALSE; + } + } + return FALSE; +} + +bool8 IsPriceDiscounted(u8 arg0) +{ + switch (arg0) + { + case 1: + if (gSaveBlock1.location.mapGroup == MAP_GROUP_SLATEPORT_CITY + && gSaveBlock1.location.mapNum == MAP_ID_SLATEPORT_CITY + && gScriptLastTalked == 0x1a) + return TRUE; + else + return FALSE; + break; + case 3: + if (gSaveBlock1.location.mapGroup == MAP_GROUP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP + && gSaveBlock1.location.mapNum == MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) + return TRUE; + else + return FALSE; + break; + default: + return TRUE; + } +} + +bool8 sub_80BEE48(u8 arg0) +{ + u8 i; + + if (arg0 == 0) + return TRUE; + for (i=0; i<16; i++) + { + if (gSaveBlock1.unknown_2ABC[i].val0 == arg0) + return TRUE; + } + return FALSE; +} + +void sub_80BEE84(u16 var0) +{ + u8 i; + + for (i=0; i<16; i++) + { + if (gSaveBlock1.unknown_2ABC[i].val0) + { + if (gSaveBlock1.unknown_2ABC[i].val2 < var0) + { + sub_80BEC10(i); + } + else + { + if (!gSaveBlock1.unknown_2ABC[i].val1 && FlagGet(SYS_GAME_CLEAR) == 1) + gSaveBlock1.unknown_2ABC[i].val1 = 1; + gSaveBlock1.unknown_2ABC[i].val2 -= var0; + } + } + } + sub_80BEC40(); +} + +void sub_80BEF10(u8 strvaridx, u8 rank) +{ + switch (rank) + { + case NORMAL_RANK: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[NORMAL_RANK + 5]); + break; + case SUPER_RANK: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[SUPER_RANK + 5]); + break; + case HYPER_RANK: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[HYPER_RANK + 5]); + break; + case MASTER_RANK: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[MASTER_RANK + 5]); + break; + } +} + +void CopyContestCategoryToStringVar(u8 strvaridx, u8 category) +{ + switch (category) + { + case CONTEST_COOL: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_COOL]); + break; + case CONTEST_BEAUTY: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_BEAUTY]); + break; + case CONTEST_CUTE: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_CUTE]); + break; + case CONTEST_SMART: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_SMART]); + break; + case CONTEST_TOUGH: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_TOUGH]); + break; + } +} + +void SetContestCategoryStringVarForInterview(void) +{ + struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainer; + + CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory); +} + +void sub_80BF088(u8 arg0, s32 price) +{ + size_t log10val = sub_80BF0B8(price); + + ConvertIntToDecimalStringN(gUnknown_083D1464[arg0], price, 0, log10val); +} + +size_t sub_80BF0B8(int value) +{ + if (value / 10 == 0) + return 1; + else if (value / 100 == 0) + return 2; + else if (value / 1000 == 0) + return 3; + else if (value / 10000 == 0) + return 4; + else if (value / 100000 == 0) + return 5; + else if (value / 1000000 == 0) + return 6; + else if (value / 10000000 == 0) + return 7; + else if (value / 100000000 == 0) + return 8; + else + return 1; +} + +void sub_80BF154(u8 arg0, struct TVShowSmartShopper *arg1) +{ + u8 i; + s32 price; + price = 0; + + for (i = 0; i < 3; i++) + { + if (arg1->itemIds[i]) + price += ItemId_GetPrice(arg1->itemIds[i]) * arg1->itemAmounts[i]; + } + if (arg1->priceReduced == 1) + sub_80BF088(arg0, price >> 1); + else + sub_80BF088(arg0, price); +} + +bool8 sub_80BF1B4(u8 showIdx) +{ + u8 i; + //TVShow *tvShows; + TVShow *tvShows = gSaveBlock1.tvShows; + u32 trainerId = GetPlayerTrainerId(); + + for (i = 5; i < 24; i++) + { + if (tvShows[i].common.var00 == showIdx) + { + if ((trainerId & 0xFF) == tvShows[i].common.trainerIdLo && ((trainerId >> 8) & 0xFF) == tvShows[i].common.trainerIdHi) + return TRUE; + } + } + return FALSE; +} + +void sub_80BF20C(void) +{ + u8 i, j; + u16 tmpId, tmpAmount; + + for (i = 0; i < 2; i++) + { + for (j = i + 1; j < 3; j++) + { + if (gUnknown_02038724[i].item_amount < gUnknown_02038724[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; + } + } + } +} + +void sub_80BF25C(u8 showType) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (gSaveBlock1.tvShows[i].common.var00 == showType) + { + if(gSaveBlock1.tvShows[i].common.var01 == 1) + { + gScriptResult = 1; + } + else + { + sub_80BF55C(gSaveBlock1.tvShows, i); + sub_80BF588(gSaveBlock1.tvShows); + sub_80BF6D8(); + } + return; + } + } + sub_80BF6D8(); +} + +void sub_80BF2C4(void) +{ + gScriptResult = 0; + switch (gSpecialVar_0x8005) + { + case TVSHOW_FAN_CLUB_LETTER: + sub_80BF334(); + break; + case TVSHOW_RECENT_HAPPENINGS: + sub_80BF3A4(); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + sub_80BF3DC(); + break; + case TVSHOW_UNKN_SHOWTYPE_04: + sub_80BF46C(); + break; + case TVSHOW_NAME_RATER_SHOW: + sub_80BF478(); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + sub_80BF484(); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + sub_80BF4BC(); + break; + } +} + +void sub_80BF334(void) +{ + struct TVShowFanClubLetter *fanclubLetter; + + sub_80BF25C(TVSHOW_FAN_CLUB_LETTER); + if (gScriptResult == 0) + { + StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]); + fanclubLetter = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubLetter; + sub_80EB6FC(fanclubLetter->pad04, 6); + } +} + +void sub_80BF3A4(void) +{ + struct TVShowRecentHappenings *recentHappenings; + + sub_80BF25C(TVSHOW_RECENT_HAPPENINGS); + if (gScriptResult == 0) + { + recentHappenings = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].recentHappenings; + sub_80EB6FC(recentHappenings->var04, 6); + } +} + +void sub_80BF3DC(void) +{ + struct TVShowFanclubOpinions *fanclubOpinions; + + sub_80BF25C(TVSHOW_PKMN_FAN_CLUB_OPINIONS); + if (gScriptResult == 0) + { + StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]); + GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, gStringVar2); + StringGetEnd10(gStringVar2); + fanclubOpinions = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubOpinions; + sub_80EB6FC(fanclubOpinions->var1C, 2); + } +} + +void sub_80BF46C(void) +{ + gScriptResult = 1; +} + +void sub_80BF478(void) +{ + sub_80BF25C(TVSHOW_NAME_RATER_SHOW); +} + +void sub_80BF484(void) +{ + struct TVShowBravoTrainerPokemonProfiles *bravoTrainer; + + sub_80BF25C(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE); + if (gScriptResult == 0) + { + bravoTrainer = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainer; + sub_80EB6FC(bravoTrainer->var04, 2); + } +} + +void sub_80BF4BC(void) +{ + struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower; + + sub_80BF25C(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE); + if (gScriptResult == 0) + { + bravoTrainerTower = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainerTower; + sub_80EB6FC(bravoTrainerTower->var18, 1); // wrong struct ident, fix later + } +} + +#if ENGLISH +u8 sub_80BF4F4(u8 arg0) +{ + u32 species; + + GetMonData(&gPlayerParty[arg0], MON_DATA_NICKNAME, &gStringVar1); + species = GetMonData(&gPlayerParty[arg0], MON_DATA_SPECIES, NULL); + if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1) == FALSE) + return FALSE; + + return TRUE; +} +#elif GERMAN +u8 sub_80BF4F4(u8 arg0) +{ + u8 langData[4]; + u32 species; + u8 *tmp; + + GetMonData(&gPlayerParty[arg0], MON_DATA_NICKNAME, &gStringVar1); + + tmp = langData; + tmp[0] = GetMonData(&gPlayerParty[arg0], MON_DATA_LANGUAGE, &langData); + if (tmp[0] != GAME_LANGUAGE) + return TRUE; + + species = GetMonData(&gPlayerParty[arg0], MON_DATA_SPECIES, NULL); + if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1)) + return TRUE; + + return FALSE; +} +#endif + +u8 sub_80BF544(void) +{ + return sub_80BF4F4(GetLeadMonIndex()); +} + +void sub_80BF55C(TVShow tvShow[], u8 showidx) +{ + u8 idx; + + tvShow[showidx].common.var00 = 0; + tvShow[showidx].common.var01 = 0; + for (idx = 0; idx < 34; idx++) + tvShow[showidx].common.pad02[idx] = 0; +} + +void sub_80BF588(TVShow tvShow[]) +{ + u8 showidx; + u8 showidx2; + + for (showidx = 0; showidx < 4; showidx++) + { + if (tvShow[showidx].common.var00 == 0) + { + for (showidx2 = showidx + 1; showidx2 < 5; showidx2++) + { + if (tvShow[showidx2].common.var00 != 0) + { + tvShow[showidx] = tvShow[showidx2]; + sub_80BF55C(tvShow, showidx2); + break; + } + } + } + } + for (showidx = 5; showidx < 24; showidx++) + { + if (tvShow[showidx].common.var00 == 0) + { + for (showidx2 = showidx + 1; showidx2 < 24; showidx2++) + { + if (tvShow[showidx2].common.var00 != 0) + { + tvShow[showidx] = tvShow[showidx2]; + sub_80BF55C(gSaveBlock1.tvShows, showidx2); + break; + } + } + } + } +} + +u16 sub_80BF638(u8 arg0, u16 arg1) +{ + u16 retval = sub_80BF674(arg1); + + StringCopy(gUnknown_083D1464[arg0], gSpeciesNames[retval]); + return retval; +} + +u16 sub_80BF674(u16 species) +{ + u16 rspecies; + u16 cspecies; + + rspecies = (Random() % (NUM_SPECIES - 1)) + 1; + cspecies = rspecies; + while (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(cspecies), 0) != 1 || cspecies == species) + { + if (cspecies == SPECIES_BULBASAUR) + cspecies = NUM_SPECIES - 1; + else + cspecies --; + if (cspecies == rspecies) + { + cspecies = species; + return cspecies; + } + } + return cspecies; +} + +void sub_80BF6D8(void) +{ + gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); + gSpecialVar_0x8006 = gUnknown_03005D38.var0; + if (gUnknown_03005D38.var0 == -1) + gScriptResult = 1; + else + gScriptResult = 0; +} + +s8 sub_80BF720(TVShow tvShow[]) +{ + u8 idx; + + for (idx = 0; idx < 5; idx++) + { + if (tvShow[idx].common.var00 == 0) + return idx; + } + return -1; +} + +s8 sub_80BF74C(TVShow tvShow[]) +{ + s8 idx; + + for (idx = 5; idx < 24; idx++) + { + if (tvShow[idx].common.var00 == 0) + return idx; + } + return -1; +} + +bool8 sub_80BF77C(u16 value) +{ + if (Random() <= value) + return FALSE; + return TRUE; +} + +void sub_80BF79C(TVShow *arg0) +{ + u8 i = Random() % 6; + + while (1) + { + if (i == 6) + i = 0; + if (arg0->recentHappenings.var04[i] != 0xFFFF) + break; + i++; + } + sub_80EB3FC(gStringVar3, arg0->recentHappenings.var04[i]); +} + +u8 sub_80BF7E8(struct TVShowNameRaterShow *arg0) +{ + u16 flagsum = 0; + u8 i = 0; + + if (arg0->pokemonName[0] != 0xFF) + { + while (i < 11 && arg0->pokemonName[i] != 0xFF) + { + flagsum += arg0->pokemonName[i]; + i++; + } + } + return flagsum & 0x7; +} + + +void sub_80BF820(u8 arg0, u8 arg1, u8 arg2, u16 arg3, u16 arg4, struct TVShowNameRaterShow *tvShow) +{ + u8 flags[3]; + u16 nameLength; + u8 i; + + for (i = 0; i < 3; i++) + flags[i] = EOS; + + if (arg3 == 0) + { + nameLength = StringLength(tvShow->trainerName); + if (arg2 == 0) + { + flags[0] = tvShow->trainerName[arg1]; + } + else if (arg2 == 1) + { + flags[0] = tvShow->trainerName[nameLength - arg1]; + } + else if (arg2 == 2) { + flags[0] = tvShow->trainerName[arg1]; + flags[1] = tvShow->trainerName[arg1 + 1]; + } + else + { + flags[0] = tvShow->trainerName[nameLength - (arg1 + 2)]; + flags[1] = tvShow->trainerName[nameLength - (arg1 + 1)]; + } + } + else if (arg3 == 1) + { + nameLength = StringLength(tvShow->pokemonName); + if (arg2 == 0) + { + flags[0] = tvShow->pokemonName[arg1]; + } + else if (arg2 == 1) + { + flags[0] = tvShow->pokemonName[nameLength - arg1]; + } + else if (arg2 == 2) + { + flags[0] = tvShow->pokemonName[arg1]; + flags[1] = tvShow->pokemonName[arg1 + 1]; + } + else + { + flags[0] = tvShow->pokemonName[nameLength - (arg1 + 2)]; + flags[1] = tvShow->pokemonName[nameLength - (arg1 + 1)]; + } + } + else + { + nameLength = StringLength(gSpeciesNames[arg4]); + if (arg2 == 0) + { + flags[0] = gSpeciesNames[arg4][arg1]; + } + else if (arg2 == 1) + { + flags[0] = gSpeciesNames[arg4][nameLength - arg1]; + } + else if (arg2 == 2) + { + flags[0] = gSpeciesNames[arg4][arg1]; + flags[1] = gSpeciesNames[arg4][arg1 + 1]; + } + else + { + flags[0] = gSpeciesNames[arg4][nameLength - (arg1 + 2)]; + flags[1] = gSpeciesNames[arg4][nameLength - (arg1 + 1)]; + } + } + StringCopy(gUnknown_083D1464[arg0], flags); +} + +bool8 sub_80BF974(void) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (gSaveBlock1.tvShows[i].common.var00 == gSpecialVar_0x8004) + return TRUE; + } + return FALSE; +} + +bool8 sub_80BF9B4(void) +{ + GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1); + if (!StringCompareWithoutExtCtrlCodes(gStringVar3, gStringVar1)) + return FALSE; + sub_80BE478(); + return TRUE; +} + +void c2_080CC144(void); + +void sub_80BF9F8(void) +{ + u16 spec; + u16 gender; + u32 pval; + + GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar3); + GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar2); + spec = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_SPECIES, 0); + gender = GetMonGender(&(gPlayerParty[gSpecialVar_0x8004])); + pval = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_PERSONALITY, 0); + DoNamingScreen(3, gStringVar2, spec, gender, pval, c2_080CC144); +} + +void c2_080CC144(void) +{ + SetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, gStringVar2); + c2_exit_to_overworld_1_continue_scripts_restart_music(); +} + +void sub_80BFAE0(void) +{ + GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1); + StringGetEnd10(gStringVar1); +} + +void sub_80BFB10(void) +{ + if (GetPlayerTrainerId() == GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_OT_ID, 0)) + gScriptResult = 0; + else + gScriptResult = 1; +} + +u8 sub_80BFB54(u8 arg0) +{ + if (arg0 == 0) + return 0; + else if (arg0 > 0 && arg0 <= 20) + return 2; + else if (arg0 > 20 && arg0 <= 40) + return 3; + else if (arg0 > 40 && arg0 <= 60) + return 4; + else + return 0; +} + +u32 GetPlayerTrainerId(void) +{ + return (gSaveBlock2.playerTrainerId[3] << 24) | (gSaveBlock2.playerTrainerId[2] << 16) | (gSaveBlock2.playerTrainerId[1] << 8) | (gSaveBlock2.playerTrainerId[0]); +} + +u8 CheckForBigMovieOrEmergencyNewsOnTV(void) +{ + if (gSaveBlock1.location.mapGroup != MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) + return 0; + if (gSaveBlock2.playerGender == MALE) + { + if (gSaveBlock1.location.mapNum != MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) + return 0; + } + else + { + if (gSaveBlock1.location.mapNum != MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F) + return 0; + } + if (FlagGet(SYS_TV_LATI) == 1) + return 1; + if (FlagGet(SYS_TV_HOME) == 1) + return 2; + return 1; +} + +void GetMomOrDadStringForTVMessage(void) +{ + if (gSaveBlock1.location.mapGroup == MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) + { + if (gSaveBlock2.playerGender == MALE) + { + if (gSaveBlock1.location.mapNum == MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) + { + StringCopy(gStringVar1, gOtherText_Mom); + VarSet(VAR_0x4003, 1); + } + } + else + { + if (gSaveBlock1.location.mapNum == MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F) + { + StringCopy(gStringVar1, gOtherText_Mom); + VarSet(VAR_0x4003, 1); + } + } + } + if (VarGet(VAR_0x4003) == 1) + { + StringCopy(gStringVar1, gOtherText_Mom); + } + else if (VarGet(VAR_0x4003) == 2) + { + StringCopy(gStringVar1, gOtherText_Dad); + } + else if (VarGet(VAR_0x4003) > 2) + { + if (VarGet(VAR_0x4003) % 2 == 0) + StringCopy(gStringVar1, gOtherText_Mom); + else + StringCopy(gStringVar1, gOtherText_Dad); + } + else + { + if (Random() % 2 != 0) + { + StringCopy(gStringVar1, gOtherText_Mom); + VarSet(VAR_0x4003, 1); + } + else + { + StringCopy(gStringVar1, gOtherText_Dad); + VarSet(VAR_0x4003, 2); + } + } +} + +void sub_80BFD20(void) +{ + VarSet(VAR_0x40BC, 0); + RemoveFieldObjectByLocalIdAndMap(5, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); +} + +typedef union ewramStruct_02007000 +{ + TVShow tvshows[4][25]; + struct UnknownSaveStruct2ABC unknown_2abc[4][16]; +} ewramStruct_02007000; + +void sub_80BFE24(TVShow arg0[25], TVShow arg1[25], TVShow arg2[25], TVShow arg3[25]); + +void sub_80C04A0(void); +void sub_80C01D4(void); +void sub_80C0408(void); + +void sub_80BFD44(u8 *arg0, u32 arg1, u8 arg2) +{ + u8 i; + ewramStruct_02007000 *ewramTVShows; + + for (i = 0; i < 4; i++) + memcpy(&gUnknown_02007000.tvshows[i], &arg0[i * arg1], 25 * sizeof(TVShow)); + ewramTVShows = &gUnknown_02007000; + switch (arg2) + { + case 0: + sub_80BFE24(gSaveBlock1.tvShows, ewramTVShows->tvshows[1], ewramTVShows->tvshows[2], ewramTVShows->tvshows[3]); + break; + case 1: + sub_80BFE24(ewramTVShows->tvshows[0], gSaveBlock1.tvShows, ewramTVShows->tvshows[2], ewramTVShows->tvshows[3]); + break; + case 2: + sub_80BFE24(ewramTVShows->tvshows[0], ewramTVShows->tvshows[1], gSaveBlock1.tvShows, ewramTVShows->tvshows[3]); + break; + case 3: + sub_80BFE24(ewramTVShows->tvshows[0], ewramTVShows->tvshows[1], ewramTVShows->tvshows[2], gSaveBlock1.tvShows); + break; + } + sub_80BF588(gSaveBlock1.tvShows); + sub_80C04A0(); + sub_80BF588(gSaveBlock1.tvShows); + sub_80C01D4(); + sub_80C0408(); +} + +s8 sub_80C019C(TVShow tvShows[]); +bool8 sub_80BFF68(TVShow * tv1[25], TVShow * tv2[25], u8 idx); +u8 sub_80C004C(TVShow *tv1, TVShow *tv2, u8 idx); +u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx); +u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx); + +void sub_80BFE24(TVShow arg0[25], TVShow arg1[25], TVShow arg2[25], TVShow arg3[25]) +{ + u8 i, j; + TVShow **argslist[4]; + + argslist[0] = &arg0; + argslist[1] = &arg1; + argslist[2] = &arg2; + argslist[3] = &arg3; + gUnknown_03000720 = GetLinkPlayerCount(); + while (1) + { + for (i=0; icommon.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) + return FALSE; + tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo; + tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi; + tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF; + tv2->common.srcTrainerIdHi = linkTrainerId >> 8; + *tv1 = *tv2; + tv1->common.var01 = 1; + return TRUE; +} + +u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx) +{ + u32 linkTrainerId = GetLinkPlayerTrainerId(idx); + if ((linkTrainerId & 0xFF) == tv2->common.srcTrainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.srcTrainerIdHi) + return FALSE; + if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) + return FALSE; + tv2->common.srcTrainerIdLo = tv2->common.srcTrainerId2Lo; + tv2->common.srcTrainerIdHi = tv2->common.srcTrainerId2Hi; + tv2->common.srcTrainerId2Lo = linkTrainerId & 0xFF; + tv2->common.srcTrainerId2Hi = linkTrainerId >> 8; + *tv1 = *tv2; + tv1->common.var01 = 1; + return TRUE; +} + +u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx) +{ + u32 linkTrainerId = GetLinkPlayerTrainerId(idx); + if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) + return FALSE; + tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo; + tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi; + tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF; + tv2->common.srcTrainerIdHi = linkTrainerId >> 8; + *tv1 = *tv2; + tv1->common.var01 = 1; + tv1->common.var16[0] = 1; + return TRUE; +} + +s8 sub_80C019C(TVShow tvShows[]) +{ + u8 i; + for (i = 0; i < 24; i++) + { + if (tvShows[i].common.var01 == 0 && (u8)(tvShows[i].common.var00 - 1) < 60) + return i; + } + return -1; +} + +#ifdef NONMATCHING +void sub_80C01D4(void) +{ + u16 i; + for (i=0; i<24; i++) + { + switch (gSaveBlock1.tvShows[i].common.var00) + { + case 0: + case TVSHOW_RECENT_HAPPENINGS: + case TVSHOW_SMART_SHOPPER: + case TVSHOW_MASS_OUTBREAK: + break; + case TVSHOW_FAN_CLUB_LETTER: + sub_80C03C8((&gSaveBlock1.tvShows[i])->fanclubLetter.species, i); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + sub_80C03C8((&gSaveBlock1.tvShows[i])->fanclubOpinions.var02, i); + break; + case TVSHOW_UNKN_SHOWTYPE_04: + sub_80C03C8((&gSaveBlock1.tvShows[i])->unkShow04.var06, i); + break; + case TVSHOW_NAME_RATER_SHOW: + sub_80C03C8((&gSaveBlock1.tvShows[i])->nameRaterShow.species, i); + sub_80C03C8((&gSaveBlock1.tvShows[i])->nameRaterShow.var1C, i); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + sub_80C03C8((&gSaveBlock1.tvShows[i])->bravoTrainer.species, i); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + sub_80C03C8((&gSaveBlock1.tvShows[i])->bravoTrainerTower.species, i); + sub_80C03C8((&gSaveBlock1.tvShows[i])->bravoTrainerTower.defeatedSpecies, i); + break; + case TVSHOW_POKEMON_TODAY_CAUGHT: + sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonToday.species, i); + break; + case TVSHOW_POKEMON_TODAY_FAILED: + sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonTodayFailed.species, i); + sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonTodayFailed.species2, i); + break; + case TVSHOW_FISHING_ADVICE: + sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonAngler.var04, i); + break; + case TVSHOW_WORLD_OF_MASTERS: + sub_80C03C8((&gSaveBlock1.tvShows[i])->worldOfMasters.var08, i); + sub_80C03C8((&gSaveBlock1.tvShows[i])->worldOfMasters.var04, i); + break; + default: + sub_80C03A8(i); + } + } +} +#else +__attribute__((naked)) +void sub_80C01D4(void) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + movs r6, 0\n\ +_080C01D8:\n\ + ldr r0, _080C01F8 @ =gSaveBlock1\n\ + lsls r2, r6, 3\n\ + adds r1, r2, r6\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldr r0, _080C01FC @ =0x00002738\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x29\n\ + bls _080C01EE\n\ + b _default\n\ +_080C01EE:\n\ + lsls r0, 2\n\ + ldr r1, _080C0200 @ =_080C0204\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_080C01F8: .4byte gSaveBlock1\n\ +_080C01FC: .4byte 0x00002738\n\ +_080C0200: .4byte _080C0204\n\ + .align 2, 0\n\ +_080C0204:\n\ + .4byte _break\n\ + .4byte _fanclubLetter @ TVSHOW_FAN_CLUB_LETTER\n\ + .4byte _break @ TVSHOW_RECENT_HAPPENINGS\n\ + .4byte _fanclubOpinions @ TVSHOW_PKMN_FAN_CLUB_OPINIONS\n\ + .4byte _showtype4 @ TVSHOW_UNKN_SHOWTYPE_04\n\ + .4byte _nameRater @ TVSHOW_NAME_RATER_SHOW\n\ + .4byte _bravoTrainerContest @ TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE\n\ + .4byte _bravoTrainerTower @ TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _pokemonTodayS @ TVSHOW_POKEMON_TODAY_CAUGHT\n\ + .4byte _break @ TVSHOW_SMART_SHOPPER\n\ + .4byte _pokemonTodayF @ TVSHOW_POKEMON_TODAY_FAILED\n\ + .4byte _fishing @ TVSHOW_FISHING_ADVICE\n\ + .4byte _worldOfMasters @ TVSHOW_WORLD_OF_MASTERS\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _break @ TVSHOW_MASS_OUTBREAK\n\ +_fanclubLetter:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C02B8 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x2]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C02B8: .4byte gSaveBlock1 + 0x2738\n\ +_fanclubOpinions:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C02C8 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x2]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C02C8: .4byte gSaveBlock1 + 0x2738\n\ +_showtype4:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C02D8 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x6]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C02D8: .4byte gSaveBlock1 + 0x2738\n\ +_nameRater:\n\ + adds r4, r2, r6\n\ + lsls r4, 2\n\ + ldr r0, _080C02F4 @ =gSaveBlock1 + 0x2738\n\ + adds r4, r0\n\ + ldrh r0, [r4, 0x2]\n\ + lsls r5, r6, 24\n\ + lsrs r5, 24\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + ldrh r0, [r4, 0x1C]\n\ + b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C02F4: .4byte gSaveBlock1 + 0x2738\n\ +_bravoTrainerContest:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C0304 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x2]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C0304: .4byte gSaveBlock1 + 0x2738\n\ +_bravoTrainerTower:\n\ + adds r4, r2, r6\n\ + lsls r4, 2\n\ + ldr r0, _080C0320 @ =gSaveBlock1 + 0x2738\n\ + adds r4, r0\n\ + ldrh r0, [r4, 0xA]\n\ + lsls r5, r6, 24\n\ + lsrs r5, 24\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + ldrh r0, [r4, 0x14]\n\ + b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C0320: .4byte gSaveBlock1 + 0x2738\n\ +_pokemonTodayS:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C0330 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x10]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C0330: .4byte gSaveBlock1 + 0x2738\n\ +_pokemonTodayF:\n\ + adds r4, r2, r6\n\ + lsls r4, 2\n\ + ldr r0, _080C034C @ =gSaveBlock1 + 0x2738\n\ + adds r4, r0\n\ + ldrh r0, [r4, 0xC]\n\ + lsls r5, r6, 24\n\ + lsrs r5, 24\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + ldrh r0, [r4, 0xE]\n\ + b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C034C: .4byte gSaveBlock1 + 0x2738\n\ +_fishing:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C0364 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x4]\n\ +_checkSpecies1:\n\ + lsls r1, r6, 24\n\ + lsrs r1, 24\n\ + bl sub_80C03C8\n\ + b _break\n\ + .align 2, 0\n\ +_080C0364: .4byte gSaveBlock1 + 0x2738\n\ +_worldOfMasters:\n\ + adds r4, r2, r6\n\ + lsls r4, 2\n\ + ldr r0, _080C0388 @ =gSaveBlock1 + 0x2738\n\ + adds r4, r0\n\ + ldrh r0, [r4, 0x8]\n\ + lsls r5, r6, 24\n\ + lsrs r5, 24\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + ldrh r0, [r4, 0x4]\n\ +_checkSpecies2:\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + b _break\n\ + .align 2, 0\n\ +_080C0388: .4byte gSaveBlock1 + 0x2738\n\ +_default:\n\ + lsls r0, r6, 24\n\ + lsrs r0, 24\n\ + bl sub_80C03A8\n\ +_break:\n\ + adds r0, r6, 0x1\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + cmp r6, 0x17\n\ + bhi _080C03A0\n\ + b _080C01D8\n\ +_080C03A0:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ +.syntax divided\n"); +} +#endif + +void sub_80C03A8(u8 showidx) +{ + gSaveBlock1.tvShows[showidx].common.var01 = 0; +} + +void sub_80C03C8(u16 species, u8 showidx) +{ + if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0) + gSaveBlock1.tvShows[showidx].common.var01 = 0; +} + +void sub_80C0408(void) +{ + u16 i; + + if (FlagGet(SYS_GAME_CLEAR) == TRUE) + return; + for (i = 0; i < 24; i++) + { + if (gSaveBlock1.tvShows[i].common.var00 == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE) + gSaveBlock1.tvShows[i].common.var01 = 0; + else if (gSaveBlock1.tvShows[i].common.var00 == TVSHOW_MASS_OUTBREAK) + gSaveBlock1.tvShows[i].common.var01 = 0; + } +} + +void sub_80C045C(void) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (sub_80BFB54(gSaveBlock1.tvShows[i].common.var00) == 2) + gSaveBlock1.tvShows[i].common.var01 = 0; + } +} + +void sub_80C04A0(void) +{ + s8 showIdx; + s8 count; + count = 0; + + for (showIdx = 5; showIdx < 24; showIdx++) + { + if (gSaveBlock1.tvShows[showIdx].common.var00 == 0) + count++; + } + for (showIdx = 0; showIdx < 5 - count; showIdx++) + sub_80BF55C(gSaveBlock1.tvShows, showIdx+5); +} + +void sub_80C05C4(struct UnknownSaveStruct2ABC[16], struct UnknownSaveStruct2ABC[16], struct UnknownSaveStruct2ABC[16], struct UnknownSaveStruct2ABC[16]); +void sub_80C0750(void); +void sub_80C0788(void); +s8 sub_80C0730(struct UnknownSaveStruct2ABC[16], u8); +void sub_80C06BC(struct UnknownSaveStruct2ABC *[16], struct UnknownSaveStruct2ABC *[16]); + +void sub_80C0514(void *a0, u32 a1, u8 a2) +{ + ewramStruct_02007000 *struct02007000; + u8 i; + + for (i = 0; i < 4; i++) + memcpy(gUnknown_02007000.unknown_2abc[i], a0 + i * a1, 64); + struct02007000 = &gUnknown_02007000; + switch (a2) + { + case 0: + sub_80C05C4(gSaveBlock1.unknown_2ABC, struct02007000->unknown_2abc[1], struct02007000->unknown_2abc[2], struct02007000->unknown_2abc[3]); + break; + case 1: + sub_80C05C4(struct02007000->unknown_2abc[0], gSaveBlock1.unknown_2ABC, struct02007000->unknown_2abc[2], struct02007000->unknown_2abc[3]); + break; + case 2: + sub_80C05C4(struct02007000->unknown_2abc[0], struct02007000->unknown_2abc[1], gSaveBlock1.unknown_2ABC, struct02007000->unknown_2abc[3]); + break; + case 3: + sub_80C05C4(struct02007000->unknown_2abc[0], struct02007000->unknown_2abc[1], struct02007000->unknown_2abc[2], gSaveBlock1.unknown_2ABC); + break; + } + sub_80C0750(); + sub_80C0788(); +} + +void sub_80C05C4(struct UnknownSaveStruct2ABC a0[16], struct UnknownSaveStruct2ABC a1[16], struct UnknownSaveStruct2ABC a2[16], struct UnknownSaveStruct2ABC a3[16]) +{ + u8 i; + u8 j; + u8 k; + struct UnknownSaveStruct2ABC ** arglist[4]; + + arglist[0] = &a0; + arglist[1] = &a1; + arglist[2] = &a2; + arglist[3] = &a3; + gUnknown_03000721 = GetLinkPlayerCount(); + for (i = 0; i < 16; i++) + { + for (j = 0; j < gUnknown_03000721; j++) + { + gUnknown_03000722 = sub_80C0730(*arglist[j], i); + if (gUnknown_03000722 != -1) + { + for (k = 0; k < gUnknown_03000721-1; k++) + { + gUnknown_03005D38.var0 = sub_80BEBC8(*arglist[(j + k + 1) % gUnknown_03000721]); + if (gUnknown_03005D38.var0 != -1) + sub_80C06BC(arglist[(j + k + 1) % gUnknown_03000721], arglist[j]); + } + } + } + } +} + +void sub_80C06BC(struct UnknownSaveStruct2ABC *arg0[16], struct UnknownSaveStruct2ABC *arg1[16]) +{ + struct UnknownSaveStruct2ABC *str0; + struct UnknownSaveStruct2ABC *str1; + + str0 = arg0[0]; + str1 = arg1[0]; + str1 += gUnknown_03000722; + sub_80C06E8(str0, str1, gUnknown_03005D38.var0); +} + +bool8 sub_80C06E8(struct UnknownSaveStruct2ABC *arg0, struct UnknownSaveStruct2ABC *arg1, s8 arg2) +{ + u8 i; + + if (arg1->val0 == 0) + return FALSE; + for (i = 0; i < 16; i++) + { + if (arg0[i].val0 == arg1->val0) + return FALSE; + } + arg0[arg2].val0 = arg1->val0; + arg0[arg2].val1 = 1; + arg0[arg2].val2 = arg1->val2; + return TRUE; +} + +s8 sub_80C0730(struct UnknownSaveStruct2ABC *arg0, u8 arg1) +{ + if (arg0[arg1].val0 == 0) + return -1; + return arg1; +} + +void sub_80C0750(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gSaveBlock1.unknown_2ABC[i].val0 > 3) + sub_80BEC10(i); + } + sub_80BEC40(); +} + +void sub_80C0788(void) +{ + u8 i; + + if (FlagGet(SYS_GAME_CLEAR) != 1) + { + for (i = 0; i < 16; i++) + gSaveBlock1.unknown_2ABC[i].val1 = 0; + } +} + +void DoTVShow(void) +{ + if (gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var01 != 0) + { + switch (gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var00) + { + case TVSHOW_FAN_CLUB_LETTER: + DoTVShowPokemonFanClubLetter(); + break; + case TVSHOW_RECENT_HAPPENINGS: + DoTVShowRecentHappenings(); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + DoTVShowPokemonFanClubOpinions(); + break; + case TVSHOW_UNKN_SHOWTYPE_04: + nullsub_22(); + break; + case TVSHOW_MASS_OUTBREAK: + DoTVShowPokemonNewsMassOutbreak(); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + DoTVShowBravoTrainerPokemonProfile(); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + DoTVShowBravoTrainerBattleTowerProfile(); + break; + case TVSHOW_POKEMON_TODAY_CAUGHT: + DoTVShowPokemonTodaySuccessfulCapture(); + break; + case TVSHOW_SMART_SHOPPER: + DoTVShowTodaysSmartShopper(); + break; + case TVSHOW_NAME_RATER_SHOW: + DoTVShowTheNameRaterShow(); + break; + case TVSHOW_POKEMON_TODAY_FAILED: + DoTVShowPokemonTodayFailedCapture(); + break; + case TVSHOW_FISHING_ADVICE: + DoTVShowPokemonAngler(); + break; + case TVSHOW_WORLD_OF_MASTERS: + DoTVShowTheWorldOfMasters(); + break; + } + } +} + +void TVShowConvertInternationalString(u8 *dest, u8 *src, u8 language) +{ + StringCopy(dest, src); + if (language < LANGUAGE_ENGLISH) + ConvertInternationalString(dest, LANGUAGE_JAPANESE); +} + +void DoTVShowBravoTrainerPokemonProfile(void) +{ + struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainer; + u8 state; + + gScriptResult = 0; + state = gUnknown_020387E8; + switch(state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); + CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory); + sub_80BEF10(2, bravoTrainer->contestRank); + if (!StringCompareWithoutExtCtrlCodes(gSpeciesNames[bravoTrainer->species], bravoTrainer->pokemonNickname)) + gUnknown_020387E8 = 8; + else + gUnknown_020387E8 = 1; + break; + case 1: + StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]); + TVShowConvertInternationalString(gStringVar2, bravoTrainer->pokemonNickname, bravoTrainer->var1f); + CopyContestCategoryToStringVar(2, bravoTrainer->contestCategory); + gUnknown_020387E8 = 2; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); + if (bravoTrainer->contestResult == 0) // placed first + gUnknown_020387E8 = 3; + else + gUnknown_020387E8 = 4; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); + sub_80EB3FC(gStringVar2, bravoTrainer->var04[0]); + sub_80BF088(2, bravoTrainer->contestResult + 1); + gUnknown_020387E8 = 5; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); + sub_80EB3FC(gStringVar2, bravoTrainer->var04[0]); + sub_80BF088(2, bravoTrainer->contestResult + 1); + gUnknown_020387E8 = 5; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); + CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory); + sub_80EB3FC(gStringVar3, bravoTrainer->var04[1]); + if (bravoTrainer->var14) + gUnknown_020387E8 = 6; + else + gUnknown_020387E8 = 7; + break; + case 6: + StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]); + StringCopy(gStringVar2, gMoveNames[bravoTrainer->var14]); + sub_80EB3FC(gStringVar3, bravoTrainer->var04[1]); + gUnknown_020387E8 = 7; + break; + case 7: + TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); + StringCopy(gStringVar2, gSpeciesNames[bravoTrainer->species]); + TVShowDone(); + break; + case 8: + StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]); + gUnknown_020387E8 = 2; + break; + } + ShowFieldMessage(gTVBravoTrainerTextGroup[state]); +} + +void DoTVShowBravoTrainerBattleTowerProfile(void) +{ + struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainerTower; + u8 state; + + gScriptResult = 0; + state = gUnknown_020387E8; + switch(state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language); + StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->species]); + if (bravoTrainerTower->var16 >= 7) + gUnknown_020387E8 = 1; + else + gUnknown_020387E8 = 2; + break; + case 1: + sub_80BF088(0, bravoTrainerTower->btLevel); + sub_80BF088(1, bravoTrainerTower->var16); + if (bravoTrainerTower->var1c == 1) + gUnknown_020387E8 = 3; + else + gUnknown_020387E8 = 4; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); + sub_80BF088(1, bravoTrainerTower->var16 + 1); + if (bravoTrainerTower->var1b == 0) + gUnknown_020387E8 = 5; + else + gUnknown_020387E8 = 6; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); + StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->defeatedSpecies]); + if (bravoTrainerTower->var1b == 0) + gUnknown_020387E8 = 5; + else + gUnknown_020387E8 = 6; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); + StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->defeatedSpecies]); + if (bravoTrainerTower->var1b == 0) + gUnknown_020387E8 = 5; + else + gUnknown_020387E8 = 6; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); + gUnknown_020387E8 = 11; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); + gUnknown_020387E8 = 11; + break; + case 7: + gUnknown_020387E8 = 11; + break; + case 8: + case 9: + case 10: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language); + gUnknown_020387E8 = 11; + break; + case 11: + sub_80EB3FC(gStringVar1, bravoTrainerTower->var18[0]); + if (bravoTrainerTower->var1b == 0) + gUnknown_020387E8 = 12; + else + gUnknown_020387E8 = 13; + break; + case 12: + case 13: + sub_80EB3FC(gStringVar1, bravoTrainerTower->var18[0]); + TVShowConvertInternationalString(gStringVar2, bravoTrainerTower->trainerName, bravoTrainerTower->language); + TVShowConvertInternationalString(gStringVar3, bravoTrainerTower->pokemonName, bravoTrainerTower->language); + gUnknown_020387E8 = 14; + break; + case 14: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language); + StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->species]); + TVShowDone(); + break; + } + ShowFieldMessage(gTVBravoTrainerBattleTowerTextGroup[state]); +} + +void DoTVShowTodaysSmartShopper(void) +{ + struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gSpecialVar_0x8004].smartshopperShow; + u8 state; + + gScriptResult = 0; + state = gUnknown_020387E8; + switch(state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); + GetMapSectionName(gStringVar2, smartShopper->shopLocation, 0); + if (smartShopper->itemAmounts[0] >= 0xff) + gUnknown_020387E8 = 11; + else + gUnknown_020387E8 = 1; + break; + case 1: + TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); + StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[0])->name); + sub_80BF088(2, smartShopper->itemAmounts[0]); + gUnknown_020387E8 += (Random() % 4) + 1; + break; + case 2: + case 4: + case 5: + if (smartShopper->itemIds[1] != 0) + gUnknown_020387E8 = 6; + else + gUnknown_020387E8 = 10; + break; + case 3: + sub_80BF088(2, smartShopper->itemAmounts[0] + 1); + if (smartShopper->itemIds[1] != 0) + gUnknown_020387E8 = 6; + else + gUnknown_020387E8 = 10; + break; + case 6: + StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[1])->name); + sub_80BF088(2, smartShopper->itemAmounts[1]); + if (smartShopper->itemIds[2] != 0) + gUnknown_020387E8 = 7; + else if (smartShopper->priceReduced == 1) + gUnknown_020387E8 = 8; + else + gUnknown_020387E8 = 9; + break; + case 7: + StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[2])->name); + sub_80BF088(2, smartShopper->itemAmounts[2]); + if (smartShopper->priceReduced == 1) + gUnknown_020387E8 = 8; + else + gUnknown_020387E8 = 9; + break; + case 8: + if (smartShopper->itemAmounts[0] < 0xff) + gUnknown_020387E8 = 9; + else + gUnknown_020387E8 = 12; + break; + case 9: + sub_80BF154(1, smartShopper); + TVShowDone(); + break; + case 10: + if (smartShopper->priceReduced == 1) + gUnknown_020387E8 = 8; + else + gUnknown_020387E8 = 9; + break; + case 11: + TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); + StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[0])->name); + if (smartShopper->priceReduced == 1) + gUnknown_020387E8 = 8; + else + gUnknown_020387E8 = 12; + break; + case 12: + TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); + TVShowDone(); + break; + } + ShowFieldMessage(gTVSmartShopperTextGroup[state]); +} + +void DoTVShowTheNameRaterShow(void) +{ + struct TVShowNameRaterShow *nameRaterShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004].nameRaterShow; + u8 state; + + gScriptResult = 0; + state = gUnknown_020387E8; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); + StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->species]); + TVShowConvertInternationalString(gStringVar3, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage); + gUnknown_020387E8 = sub_80BF7E8(nameRaterShow) + 1; + break; + case 1: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + if (nameRaterShow->random == 0) + gUnknown_020387E8 = 9; + else if (nameRaterShow->random == 1) + gUnknown_020387E8 = 10; + else if (nameRaterShow->random == 2) + gUnknown_020387E8 = 11; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); + if (nameRaterShow->random == 0) + gUnknown_020387E8 = 9; + else if (nameRaterShow->random == 1) + gUnknown_020387E8 = 10; + else if (nameRaterShow->random == 2) + gUnknown_020387E8 = 11; + break; + case 9: + case 10: + case 11: + sub_80BF820(0, 1, 0, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage); + sub_80BF820(0, 0, 0, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar1, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage); + gUnknown_020387E8 = 12; + break; + case 13: + sub_80BF820(0, 0, 3, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage); + sub_80BF820(0, 0, 2, 0, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->language); + TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); + gUnknown_020387E8 = 14; + break; + case 14: + sub_80BF820(0, 0, 3, 0, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->language); + sub_80BF820(0, 0, 2, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); + gUnknown_020387E8 = 18; + break; + case 15: + sub_80BF820(1, 0, 2, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar1, gStringVar2, nameRaterShow->pokemonNameLanguage); + StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->species]); + sub_80BF820(2, 0, 3, 2, nameRaterShow->species, nameRaterShow); + gUnknown_020387E8 = 16; + break; + case 16: + sub_80BF820(0, 0, 3, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage); + sub_80BF820(0, 0, 2, 2, nameRaterShow->species, nameRaterShow); + gUnknown_020387E8 = 17; + break; + case 17: + sub_80BF820(1, 0, 2, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar1, gStringVar2, nameRaterShow->pokemonNameLanguage); + sub_80BF820(2, 0, 3, 2, nameRaterShow->var1C, nameRaterShow); + StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->var1C]); + gUnknown_020387E8 = 18; + break; + case 12: + state = 18; + gUnknown_020387E8 = 18; + case 18: + TVShowConvertInternationalString(gStringVar1, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar2, nameRaterShow->trainerName, nameRaterShow->language); + TVShowDone(); + break; + } + ShowFieldMessage(gTVNameRaterTextGroup[state]); +} + +void DoTVShowPokemonTodaySuccessfulCapture(void) +{ + struct TVShowPokemonToday *pokemonToday = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonToday; + u8 state; + + gScriptResult = 0; + state = gUnknown_020387E8; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); + TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2); + if (pokemonToday->ball == ITEM_MASTER_BALL) + gUnknown_020387E8 = 5; + else + gUnknown_020387E8 = 1; + break; + case 1: + gUnknown_020387E8 = 2; + break; + case 2: + StringCopy(gStringVar2, ItemId_GetItem(pokemonToday->ball)->name); + sub_80BF088(2, pokemonToday->var12); + if (pokemonToday->var12 < 4) + gUnknown_020387E8 = 3; + else + gUnknown_020387E8 = 4; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); + TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2); + gUnknown_020387E8 = 6; + break; + case 4: + gUnknown_020387E8 = 6; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); + gUnknown_020387E8 = 6; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); + TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2); + gUnknown_020387E8 += (Random() % 4) + 1; + break; + case 7: + case 8: + StringCopy(gStringVar1, gSpeciesNames[pokemonToday->species]); + TVShowConvertInternationalString(gStringVar2, pokemonToday->nickname, pokemonToday->language2); + sub_80BF638(2, pokemonToday->species); + gUnknown_020387E8 = 11; + break; + case 9: + case 10: + StringCopy(gStringVar1, gSpeciesNames[pokemonToday->species]); + TVShowConvertInternationalString(gStringVar2, pokemonToday->nickname, pokemonToday->language2); + gUnknown_020387E8 = 11; + break; + case 11: + TVShowDone(); + break; + } + ShowFieldMessage(gTVPokemonTodayTextGroup[state]); +} + +void DoTVShowPokemonTodayFailedCapture(void) +{ + struct TVShowPokemonTodayFailed *pokemonTodayFailed = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonTodayFailed; + u8 state; + + gScriptResult = 0; + state = gUnknown_020387E8; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonTodayFailed->species]); + gUnknown_020387E8 = 1; + break; + case 1: + TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); + GetMapSectionName(gStringVar2, pokemonTodayFailed->var12, 0); + StringCopy(gStringVar3, gSpeciesNames[pokemonTodayFailed->species2]); + if (pokemonTodayFailed->var11 == 1) + gUnknown_020387E8 = 3; + else + gUnknown_020387E8 = 2; + break; + case 2: + case 3: + TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); + sub_80BF088(1, pokemonTodayFailed->var10); + if ((Random() % 3) == 0) + gUnknown_020387E8 = 5; + else + gUnknown_020387E8 = 4; + break; + case 4: + case 5: + TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); + gUnknown_020387E8 = 6; + break; + case 6: + TVShowDone(); + break; + } + ShowFieldMessage(gTVPokemonTodayFailedCaptureTextGroup[state]); +} + +void DoTVShowPokemonFanClubLetter(void) +{ + struct TVShowFanClubLetter *fanclubLetter = &gSaveBlock1.tvShows[gSpecialVar_0x8004].fanclubLetter; + u8 state; + u16 rval; + + gScriptResult = 0; + state = gUnknown_020387E8; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, fanclubLetter->playerName, fanclubLetter->language); + StringCopy(gStringVar2, gSpeciesNames[fanclubLetter->species]); + gUnknown_020387E8 = 50; + break; + case 1: + rval = (Random() % 4) + 1; + if (rval == 1) + gUnknown_020387E8 = 2; + else + gUnknown_020387E8 = rval + 2; + break; + case 2: + gUnknown_020387E8 = 51; + break; + case 3: + gUnknown_020387E8 += (Random() % 3) + 1; + break; + case 4: + case 5: + case 6: + sub_80BF79C((TVShow *)fanclubLetter); + gUnknown_020387E8 = 7; + break; + case 7: + rval = (Random() % 0x1f) + 0x46; + sub_80BF088(2, rval); + TVShowDone(); + break; + case 50: + ConvertEasyChatWordsToString(gStringVar4, fanclubLetter->pad04, 2, 2); + ShowFieldMessage(gStringVar4); + gUnknown_020387E8 = 1; + return; + case 51: + ConvertEasyChatWordsToString(gStringVar4, fanclubLetter->pad04, 2, 2); + ShowFieldMessage(gStringVar4); + gUnknown_020387E8 = 3; + return; + } + ShowFieldMessage(gTVFanClubTextGroup[state]); +} + +void DoTVShowRecentHappenings(void) +{ + struct TVShowRecentHappenings *recentHappenings = &gSaveBlock1.tvShows[gSpecialVar_0x8004].recentHappenings; + u8 state; + + gScriptResult = 0; + state = gUnknown_020387E8; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, recentHappenings->playerName, recentHappenings->language); + sub_80BF79C((TVShow *)recentHappenings); + gUnknown_020387E8 = 50; + break; + case 1: + gUnknown_020387E8 += 1 + (Random() % 3); + break; + case 2: + case 3: + case 4: + gUnknown_020387E8 = 5; + break; + case 5: + TVShowDone(); + break; + case 50: + ConvertEasyChatWordsToString(gStringVar4, recentHappenings->var04, 2, 2); + ShowFieldMessage(gStringVar4); + gUnknown_020387E8 = 1; + return; + } + ShowFieldMessage(gTVRecentHappeningsTextGroup[state]); +} + +void DoTVShowPokemonFanClubOpinions(void) +{ + struct TVShowFanclubOpinions *fanclubOpinions = &gSaveBlock1.tvShows[gSpecialVar_0x8004].fanclubOpinions; + u8 state; + + gScriptResult = 0; + state = gUnknown_020387E8; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language); + StringCopy(gStringVar2, gSpeciesNames[fanclubOpinions->var02]); + TVShowConvertInternationalString(gStringVar3, fanclubOpinions->var10, fanclubOpinions->var0E); + gUnknown_020387E8 = fanclubOpinions->var04B + 1; + break; + case 1: + case 2: + case 3: + TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language); + StringCopy(gStringVar2, gSpeciesNames[fanclubOpinions->var02]); + sub_80EB3FC(gStringVar3, fanclubOpinions->var1C[0]); + gUnknown_020387E8 = 4; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language); + sub_80EB3FC(gStringVar3, fanclubOpinions->var1C[1]); + TVShowDone(); + break; + } + ShowFieldMessage(gTVFanClubOpinionsTextGroup[state]); +} + +void nullsub_22(void) +{ +} + +void DoTVShowPokemonNewsMassOutbreak(void) +{ + struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[gSpecialVar_0x8004].massOutbreak; + + GetMapSectionName(gStringVar1, massOutbreak->locationMapNum, 0); + StringCopy(gStringVar2, gSpeciesNames[massOutbreak->species]); + TVShowDone(); + StartMassOutbreak(); + ShowFieldMessage(gTVPokemonOutbreakTextGroup[gUnknown_020387E8]); +} + +void DoTVShowInSearchOfTrainers(void) +{ + u8 state; + + gScriptResult = 0; + state = gUnknown_020387E8; + switch (state) + { + case 0: + GetMapSectionName(gStringVar1, gSaveBlock1.gabbyAndTyData.mapnum, 0); + if (gSaveBlock1.gabbyAndTyData.battleNum > 1) + gUnknown_020387E8 = 1; + else + gUnknown_020387E8 = 2; + break; + case 1: + gUnknown_020387E8 = 2; + break; + case 2: + if (gSaveBlock1.gabbyAndTyData.valA_0 == 0) + gUnknown_020387E8 = 4; + else if (gSaveBlock1.gabbyAndTyData.valA_3 != 0) + gUnknown_020387E8 = 5; + else if (gSaveBlock1.gabbyAndTyData.valA_2 != 0) + gUnknown_020387E8 = 6; + else if (gSaveBlock1.gabbyAndTyData.valA_1 != 0) + gUnknown_020387E8 = 7; + else + gUnknown_020387E8 = 3; + break; + case 3: + StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]); + StringCopy(gStringVar2, gMoveNames[gSaveBlock1.gabbyAndTyData.lastMove]); + StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]); + gUnknown_020387E8 = 8; + break; + case 4: + case 5: + case 6: + case 7: + gUnknown_020387E8 = 8; + break; + case 8: + sub_80EB3FC(gStringVar1, gSaveBlock1.gabbyAndTyData.quote); + StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]); + StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]); + gScriptResult = 1; + gUnknown_020387E8 = 0;; + TakeTVShowInSearchOfTrainersOffTheAir(); + break; + } + ShowFieldMessage(gTVGabbyAndTyTextGroup[state]); +} + +void DoTVShowPokemonAngler(void) +{ + struct TVShowPokemonAngler *pokemonAngler = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonAngler; + u8 state; + + gScriptResult = 0; + if (pokemonAngler->var02 < pokemonAngler->var03) + gUnknown_020387E8 = 0; + else + gUnknown_020387E8 = 1; + state = gUnknown_020387E8; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, pokemonAngler->playerName, pokemonAngler->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonAngler->var04]); + sub_80BF088(2, pokemonAngler->var03); + TVShowDone(); + break; + case 1: + TVShowConvertInternationalString(gStringVar1, pokemonAngler->playerName, pokemonAngler->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonAngler->var04]); + sub_80BF088(2, pokemonAngler->var02); + TVShowDone(); + break; + } + ShowFieldMessage(gTVFishingGuruAdviceTextGroup[state]); +} + +void DoTVShowTheWorldOfMasters(void) +{ + struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[gSpecialVar_0x8004].worldOfMasters; + u8 state; + + gScriptResult = 0; + state = gUnknown_020387E8; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, worldOfMasters->playerName, + worldOfMasters->language); + sub_80BF088(1, worldOfMasters->var06); + sub_80BF088(2, worldOfMasters->var02); + gUnknown_020387E8 = 1; + break; + case 1: + StringCopy(gStringVar1, gSpeciesNames[worldOfMasters->var08]); + gUnknown_020387E8 = 2; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, worldOfMasters->playerName, + worldOfMasters->language); + GetMapSectionName(gStringVar2, worldOfMasters->var0a, 0); + StringCopy(gStringVar3, gSpeciesNames[worldOfMasters->var04]); + TVShowDone(); + break; + } + ShowFieldMessage(gTVWorldOfMastersTextGroup[state]); +} + +void TVShowDone(void) +{ + gScriptResult = 1; + gUnknown_020387E8 = 0; + gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var01 = 0; +} + +void sub_80C2014(void) +{ + gUnknown_020387E8 = 0; +} diff --git a/src/field/use_pokeblock.c b/src/field/use_pokeblock.c new file mode 100644 index 000000000..3aa2f1fa5 --- /dev/null +++ b/src/field/use_pokeblock.c @@ -0,0 +1,965 @@ +// +// Created by Scott Norton on 5/31/17. +// + +#include "global.h" +#include "main.h" +#include "rom4.h" +#include "string_util.h" +#include "strings.h" +#include "sprite.h" +#include "pokemon.h" +#include "pokenav.h" +#include "palette.h" +#include "text.h" +#include "menu.h" +#include "sound.h" +#include "songs.h" +#include "pokeblock.h" +#include "pokeblock_feed.h" +#include "use_pokeblock.h" + +#define GFX_TAG_CONDITIONUPDOWN 0 + +#ifdef GERMAN +extern const u16 ConditionUpDownPalette[16]; +extern const u32 ConditionUpDownTiles[0x80]; +#else +const u16 ConditionUpDownPalette[] = INCBIN_U16("graphics/misc/condition_up_down.gbapal"); +const u32 ConditionUpDownTiles[] = INCBIN_U32("graphics/misc/condition_up_down.4bpp"); +#endif + +const u32 gUnknown_08406118[] = { + MON_DATA_COOL, + MON_DATA_TOUGH, + MON_DATA_SMART, + MON_DATA_CUTE, + MON_DATA_BEAUTY +}; + +const u8 gUnknown_0840612C[] = { + 0, 4, 3, 2, 1 +}; + +const u8 *const gUnknown_08406134[] = { + OtherText_Coolness, + OtherText_Toughness, + OtherText_Smartness, + OtherText_Cuteness, + OtherText_Beauty +}; + +const struct SpriteSheet gSpriteSheet_ConditionUpDown = { + (u8 *)ConditionUpDownTiles, + sizeof ConditionUpDownTiles, + GFX_TAG_CONDITIONUPDOWN +}; + +const struct SpritePalette gSpritePalette_ConditionUpDown = { + ConditionUpDownPalette, + GFX_TAG_CONDITIONUPDOWN +}; + +const s16 gUnknown_08406158[][2] = { + {0x9c, 0x1e}, + {0x75, 0x35}, + {0x75, 0x70}, + {0xc5, 0x70}, + {0xc5, 0x35} +}; + +const struct OamData gOamData_840616C = { + .shape = 1, + .size = 2, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_8406174[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_840617C[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8406184[] = { + gSpriteAnim_8406174, + gSpriteAnim_840617C +}; + +const struct SpriteTemplate gSpriteTemplate_840618C = { + GFX_TAG_CONDITIONUPDOWN, + GFX_TAG_CONDITIONUPDOWN, + &gOamData_840616C, + gSpriteAnimTable_8406184, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +asm(".text\n" + ".include \"constants/gba_constants.inc\""); + +static EWRAM_DATA struct UnkPokenavStruct_Sub1 *gUnknown_02039304 = NULL; +static EWRAM_DATA MainCallback gUnknown_02039308 = NULL; +static EWRAM_DATA struct Pokeblock *gUnknown_0203930C = NULL; +EWRAM_DATA u8 gUnknown_02039310 = 0; +EWRAM_DATA s16 gUnknown_02039312 = 0; + +extern u16 gKeyRepeatStartDelay; +extern u16 gScriptItemId; // FIXME: remove after merge of #349 Pokeblock + +void launch_c3_walk_stairs_and_run_once(void (*const)(void)); +void sub_81361E4(void); +void sub_813622C(void); +void sub_8136244(void); +void sub_8136264(void); +void sub_8136294(void); +void sub_81365A0(void); +void sub_81365C8(void); +void sub_8136638(void); +void sub_81368A4(void); +void sub_8089668(void); +void sub_8136B44(void); +u8 sub_81370E4(u8); +void sub_8136BB8(void); +s8 sub_8136C40(void); +bool8 sub_8137058(void); +void sub_8136D60(void); +void sub_8136808(void); +void sub_8136D8C(void); +u8 sub_81370A4(u8); +void sub_81369CC(void); +void sub_8136EF0(void); +void sub_8137138(void); +void sub_8136C6C(void); +bool8 sub_8136D00(void); +void sub_8136DC0(u8 *, u8, s16); +void sub_8136DA0(const u8 *); +void sub_8136F74(struct Pokeblock *, struct Pokemon *); +void sub_81371DC(struct Sprite *); + +void sub_8136130(struct Pokeblock *pokeblock, MainCallback callback) +{ + gUnknown_02039304 = &gUnknown_083DFEC4->unkD164; + gUnknown_02039304->pokeblock = pokeblock; + gUnknown_02039304->callback = callback; + gUnknown_083DFEC4->unkD162[0] = 2; + launch_c3_walk_stairs_and_run_once(sub_8136294); + SetMainCallback2(sub_8136244); +} + +void sub_8136174(void) +{ + gUnknown_02039304->pokeblock = gUnknown_0203930C; + gUnknown_02039304->callback = gUnknown_02039308; + gUnknown_02039310 = sub_81370E4(gUnknown_02039310); + gUnknown_02039304->unk56 = gUnknown_02039310 < 4 ? 0 : 1; + gUnknown_083DFEC4->unkD162[0] = 2; + launch_c3_walk_stairs_and_run_once(sub_8136294); + SetMainCallback2(sub_81361E4); +} + +void sub_81361E4(void) +{ + gUnknown_02039304->unk0(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + if (gUnknown_02039304->unk0 == sub_81365C8) + { + REG_DISPCNT = 0; + gUnknown_02039304->unk50 = 0; + SetMainCallback2(sub_813622C); + } +} + +void sub_813622C(void) +{ + sub_81368A4(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_8136244(void) +{ + gUnknown_02039304->unk0(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_8136264(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_80F5CDC(6); + sub_8089668(); +} + +void launch_c3_walk_stairs_and_run_once(void (*const func)(void)) +{ + gUnknown_02039304->unk0 = func; + gUnknown_02039304->unk50 = 0; +} + +void sub_8136294(void) +{ + bool32 c1LinkRelatedActive; + switch (gUnknown_02039304->unk50) + { + case 0: + c1LinkRelatedActive = is_c1_link_related_active(); + gUnknown_083DFEC4->unk6DAC = c1LinkRelatedActive; + if ((bool8)c1LinkRelatedActive == FALSE) + { + gUnknown_02039304->unk55 = 0; + launch_c3_walk_stairs_and_run_once(sub_81365A0); + gUnknown_02039304->unk50++; + } + break; + case 1: + ResetSpriteData(); + FreeAllSpritePalettes(); + gUnknown_02039304->unk50++; + break; + case 2: + SetVBlankCallback(NULL); + gUnknown_02039304->unk50++; + break; + case 3: + SetUpWindowConfig(&gWindowConfig_81E7080); + gUnknown_02039304->unk50++; + break; + case 4: + MultistepInitMenuWindowBegin(&gWindowConfig_81E7080); + gUnknown_02039304->unk50++; + break; + case 5: + if (MultistepInitMenuWindowContinue()) + { + gUnknown_02039304->unk50++; + } + break; + case 6: + gUnknown_083DFEC4->unk76AA = 0; + gUnknown_083DFEC4->unk87E0 = NULL; + gUnknown_083DFEC4->unk030C = 0x20; + gUnknown_02039304->unk50++; + break; + case 7: + sub_80F2688(); + gUnknown_02039304->unk50++; + // fallthrough + case 8: + if (!sub_80F26BC()) + { + gUnknown_02039304->unk50++; + } + break; + case 9: + sub_80F2C80(1); + gUnknown_02039304->unk50++; + // fallthrough + case 10: + if (!sub_80F2CBC(1)) + { + gUnknown_02039304->unk50++; + } + break; + case 11: + gKeyRepeatStartDelay = 20; + gUnknown_083DFEC4->unk8828 = CalculatePlayerPartyCount(); + gUnknown_083DFEC4->unk9344 = 0; + gUnknown_083DFEC4->unk8768 = NULL; + sub_80F4BD0(); + gUnknown_083DFEC4->unkD160 = 0; + gUnknown_02039304->unk50++; + break; + case 12: + if (!sub_80F1778()) + { + REG_BG2VOFS = 6; + REG_BG3VOFS = 6; + gUnknown_02039304->unk50++; + } + break; + case 13: + sub_80F2E18(0); + gUnknown_083DFEC4->unk8768->unk26 = 0xffd8; + gUnknown_02039304->unk50++; + break; + case 14: + if (!sub_80F170C()) + { + gUnknown_02039304->unk50++; + } + break; + case 15: + sub_80F33A8(); + gUnknown_02039304->unk50++; + break; + case 16: + DmaClear32(3, BG_SCREEN_ADDR(31), 0x800); + REG_BG1VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1CNT = BGCNT_SCREENBASE(31); + gUnknown_02039304->unk50++; + break; + case 17: + sub_80F567C(&gUnknown_083DFEC4->unk8ff0, gUnknown_083DFEC4->unk9004); + sub_80F5B38(); + gUnknown_02039304->unk50++; + break; + case 18: + if (!sub_80F5B50()) + { + gUnknown_02039304->unk50++; + } + break; + case 19: + sub_80F556C(gUnknown_083DFEC4->unk9004); + gUnknown_02039304->unk50++; + break; + case 20: + sub_80F1934(); + gUnknown_02039304->unk50++; + break; + case 21: + REG_WIN0H = 0xf0; + REG_WIN1H = 0x9b; + REG_WIN0V = 0x3273; + REG_WIN1V = 0x3273; + REG_WININ = 0x3f3f; + REG_WINOUT = 0x1b; + REG_BG0VOFS = 0x28; + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; + // fallthrough + case 22: + gUnknown_02039304->unk55 = 1; + launch_c3_walk_stairs_and_run_once(sub_81365C8); + break; + } +} + +void sub_81365A0(void) +{ + while (!gUnknown_02039304->unk55) + { + sub_8136294(); + } +} + +void sub_81365C8(void) +{ + switch (gUnknown_02039304->unk50) + { + case 0: + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + SetVBlankCallback(sub_8136264); + gUnknown_02039304->unk50++; + break; + case 1: + if (!gPaletteFade.active) + { + sub_80F3C94(); + sub_80F3D00(); + launch_c3_walk_stairs_and_run_once(sub_8136638); + } + break; + } +} + +void sub_8136638(void) +{ + switch (gUnknown_02039304->unk50) + { + case 0: + if (gMain.heldKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + sub_80F5060(TRUE); + move_anim_execute(); + gUnknown_02039304->unk50 = 1; + } + else if (gMain.heldKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + sub_80F5060(FALSE); + move_anim_execute(); + gUnknown_02039304->unk50 = 1; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_02039304->unk50 = 3; + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gUnknown_083DFEC4->unk87DC == gUnknown_083DFEC4->unk87DA - 1) + { + gUnknown_02039304->unk50 = 3; + } + else + { + gUnknown_02039304->unk50 = 5; + } + } + break; + case 1: + if (!gpu_sync_bg_show()) + { + gUnknown_02039304->unk50++; + } + break; + case 2: + if (!sub_8055870()) + { + sub_80F1934(); + sub_80F3D00(); + gUnknown_02039304->unk50 = 0; + } + break; + case 3: + launch_c3_walk_stairs_and_run_once(sub_8136B44); + break; + case 4: + break; + case 5: + sub_8136BB8(); + gUnknown_02039304->unk50++; + break; + case 6: + switch (sub_8136C40()) + { + case 1: + case -1: + gUnknown_02039304->unk50 = 0; + break; + case 0: + if (sub_8137058()) + { + sub_8136D60(); + gUnknown_02039304->unk50 = 7; + } + else + { + launch_c3_walk_stairs_and_run_once(sub_8136808); + } + break; + } + break; + case 7: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8136D8C(); + gUnknown_02039304->unk50 = 0; + } + break; + } +} + +void sub_8136808(void) +{ + switch (gUnknown_02039304->unk50) + { + case 0: + gUnknown_02039310 = sub_81370A4(gUnknown_083DFEC4->unk87DC); + gUnknown_02039308 = gUnknown_02039304->callback; + gUnknown_0203930C = gUnknown_02039304->pokeblock; + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_02039304->unk50++; + break; + case 1: + if (!gPaletteFade.active) + { + gMain.savedCallback = sub_8136174; + SetMainCallback2(sub_8147ADC); + } + break; + } +} + +void sub_81368A4(void) +{ + switch (gUnknown_02039304->unk50) + { + case 0: + if (gUnknown_083DFEC4->unk87DC != gUnknown_02039310) + { + sub_80F5060(gUnknown_02039304->unk56); + gUnknown_02039304->unk50++; + } + else + { + gUnknown_02039304->unk50 = 3; + } + break; + case 1: + if (!gpu_sync_bg_show()) + { + gUnknown_02039304->unk50++; + } + break; + case 2: + if (!sub_8055870()) + { + sub_80F1934(); + gUnknown_02039304->unk50 = 0; + } + break; + case 3: + BlendPalettes(-1, 16, 0); + gUnknown_02039304->unk50++; + break; + case 4: + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; + gUnknown_02039304->unk50++; + break; + case 5: + SetVBlankCallback(sub_8136264); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gUnknown_02039304->unk50++; + break; + case 6: + if (!gPaletteFade.active) + { + sub_80F3C94(); + sub_80F3D00(); + launch_c3_walk_stairs_and_run_once(sub_81369CC); + SetMainCallback2(sub_8136244); + } + break; + } +} + +void sub_81369CC(void) +{ + switch (gUnknown_02039304->unk50) + { + case 0: + gUnknown_02039304->pokemon = &gPlayerParty[0]; + gUnknown_02039304->pokemon = &gPlayerParty[gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].partyIdx]; + move_anim_execute(); + gUnknown_02039304->unk50++; + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + gUnknown_02039304->unk50++; + break; + case 2: + sub_8136EF0(); + sub_80F567C(gUnknown_02039304->unk5c, gUnknown_083DFEC4->unk9040); + sub_80F5550(gUnknown_083DFEC4->unk9004[gUnknown_083DFEC4->unk8fe9], gUnknown_083DFEC4->unk9040); + sub_8137138(); + gUnknown_02039304->unk50++; + break; + case 3: + if (!sub_80F555C()) + { + sub_80F7224(sub_81370A4(gUnknown_083DFEC4->unk87DC)); + sub_80F3D00(); + gUnknown_02039304->unk52 = 0; + gUnknown_02039304->unk50++; + } + break; + case 4: + if ((++gUnknown_02039304->unk52) > 16) + { + sub_8136C6C(); + gUnknown_02039304->unk50++; + } + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON) && !sub_8136D00()) + { + sub_810CA6C((u8)gScriptItemId); + launch_c3_walk_stairs_and_run_once(sub_8136B44); + } + break; + } +} + +void sub_8136B44(void) +{ + switch (gUnknown_02039304->unk50) + { + case 0: + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_02039304->unk50++; + break; + case 1: + if (!gPaletteFade.active) + { + gUnknown_02039304->unk50 = 2; + } + break; + case 2: + sub_80F5BDC(); + gUnknown_02039304->unk50++; + break; + case 3: + SetMainCallback2(gUnknown_02039304->callback); + break; + } +} + +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); + DisplayYesNoMenu(23, 10, 1); + MoveMenuCursor(0); +} + +s8 sub_8136C40(void) +{ + s8 retval = ProcessMenuInputNoWrap(); + if ((u8)(retval + 1) < 3) + { + MenuZeroFillScreen(); + BasicInitMenuWindow(&gWindowConfig_81E7080); + } + return retval; +} + +void sub_8136C6C(void) +{ + BasicInitMenuWindow(&gWindowConfig_81E709C); + MenuDrawTextWindow(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) + { + sub_8136DC0(gUnknown_02039304->stringBuffer, gUnknown_02039304->unk53, gUnknown_02039304->unk61[gUnknown_02039304->unk53]); + } + else + { + sub_8136DC0(gUnknown_02039304->stringBuffer, gUnknown_02039304->unk53, 0); + } + sub_8136DA0(gUnknown_02039304->stringBuffer); +} + +#ifdef NONMATCHING +bool8 sub_8136D00(void) +{ + while (1) + { + if (++gUnknown_02039304->unk53 >= 5) + { + break; + } + if (gUnknown_02039304->unk61[gUnknown_02039304->unk53] != 0) + { + sub_8136DC0(gUnknown_02039304->stringBuffer, gUnknown_02039304->unk53, gUnknown_02039304->unk61[gUnknown_02039304->unk53]); + sub_8136DA0(gUnknown_02039304->stringBuffer); + return TRUE; + } + } + gUnknown_02039304->unk53 = 5; + return FALSE; +} +#else +__attribute__((naked)) +bool8 sub_8136D00(void) +{ + asm_unified("\tpush {r4,r5,lr}\n" + "\tldr r4, _08136D30 @ =gUnknown_02039304\n" + "\tadds r3, r4, 0\n" + "\tmovs r5, 0x5\n" + "_08136D08:\n" + "\tldr r0, [r3]\n" + "\tadds r0, 0x53\n" + "\tldrb r1, [r0]\n" + "\tadds r1, 0x1\n" + "\tstrb r1, [r0]\n" + "\tldr r2, [r3]\n" + "\tadds r1, r2, 0\n" + "\tadds r1, 0x53\n" + "\tldrb r0, [r1]\n" + "\tcmp r0, 0x4\n" + "\tbhi _08136D34\n" + "\tadds r0, r2, 0\n" + "\tadds r0, 0x61\n" + "\tldrb r1, [r1]\n" + "\tadds r0, r1\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _08136D3A\n" + "\tb _08136D08\n" + "\t.align 2, 0\n" + "_08136D30: .4byte gUnknown_02039304\n" + "_08136D34:\n" + "\tstrb r5, [r1]\n" + "\tmovs r0, 0\n" + "\tb _08136D5A\n" + "_08136D3A:\n" + "\tldr r2, [r4]\n" + "\tadds r0, r2, 0\n" + "\tadds r0, 0x10\n" + "\tadds r1, r2, 0\n" + "\tadds r1, 0x53\n" + "\tldrb r1, [r1]\n" + "\tadds r2, 0x61\n" + "\tadds r2, r1\n" + "\tldrb r2, [r2]\n" + "\tbl sub_8136DC0\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x10\n" + "\tbl sub_8136DA0\n" + "\tmovs r0, 0x1\n" + "_08136D5A:\n" + "\tpop {r4,r5}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +void sub_8136D60(void) +{ + BasicInitMenuWindow(&gWindowConfig_81E709C); + MenuDrawTextWindow(0, 16, 29, 19); + MenuPrint(gOtherText_WontEat, 1, 17); +} + +void sub_8136D8C(void) +{ + MenuZeroFillScreen(); + BasicInitMenuWindow(&gWindowConfig_81E7080); +} + +void sub_8136DA0(const u8 *message) +{ + MenuDrawTextWindow(0, 16, 29, 19); + MenuPrint(message, 1, 17); +} + +#ifdef NONMATCHING +void sub_8136DC0(u8 *dest, u8 a1, s16 a2) +{ + u16 v0 = a2; + if (a2 != 0) + { + if ((v0 = max(a2, 0)) == 0); + StringCopy(dest, gUnknown_08406134[a1]); + StringAppend(dest, gOtherText_WasEnhanced); + } + else + { + StringCopy(dest, gOtherText_NothingChanged); + } +} +#else +__attribute__((naked)) +void sub_8136DC0(u8 *dest, u8 a1, s16 a2) +{ + asm_unified("\tpush {r4,lr}\n" + "\tadds r4, r0, 0\n" + "\tlsls r1, 24\n" + "\tlsrs r3, r1, 24\n" + "\tlsls r2, 16\n" + "\tlsrs r0, r2, 16\n" + "\tasrs r2, 16\n" + "\tcmp r2, 0\n" + "\tbeq _08136DFC\n" + "\tcmp r2, 0\n" + "\tble _08136DD8\n" + "\tmovs r0, 0\n" + "_08136DD8:\n" + "\tlsls r0, 16\n" + "\tldr r1, _08136DF4 @ =gUnknown_08406134\n" + "\tlsls r0, r3, 2\n" + "\tadds r0, r1\n" + "\tldr r1, [r0]\n" + "\tadds r0, r4, 0\n" + "\tbl StringCopy\n" + "\tldr r1, _08136DF8 @ =gOtherText_WasEnhanced\n" + "\tadds r0, r4, 0\n" + "\tbl StringAppend\n" + "\tb _08136E04\n" + "\t.align 2, 0\n" + "_08136DF4: .4byte gUnknown_08406134\n" + "_08136DF8: .4byte gOtherText_WasEnhanced\n" + "_08136DFC:\n" + "\tldr r1, _08136E0C @ =gOtherText_NothingChanged\n" + "\tadds r0, r4, 0\n" + "\tbl StringCopy\n" + "_08136E04:\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08136E0C: .4byte gOtherText_NothingChanged"); +} +#endif + +void sub_8136E10(struct Pokemon *pokemon, u8 *data) +{ + u16 i; + for (i=0; i<5; i++) + { + data[i] = GetMonData(pokemon, gUnknown_08406118[i]); + } +} + +void sub_8136E40(struct Pokeblock *pokeblock, struct Pokemon *pokemon) +{ + u16 i; + s16 cstat; + u8 data; + if (GetMonData(pokemon, MON_DATA_SHEEN) != 255) + { + sub_8136F74(pokeblock, pokemon); + for (i=0; i<5; i++) + { + data = GetMonData(pokemon, gUnknown_08406118[i]); + cstat = data + gUnknown_02039304->unk66[i]; + if (cstat < 0) + cstat = 0; + if (cstat > 255) + cstat = 255; + data = cstat; + SetMonData(pokemon, gUnknown_08406118[i], &data); + } + cstat = (u8)GetMonData(pokemon, MON_DATA_SHEEN); + cstat = cstat + pokeblock->feel; + if (cstat > 255) + cstat = 255; + data = cstat; + SetMonData(pokemon, MON_DATA_SHEEN, &data); + } +} + +void sub_8136EF0(void) +{ + u16 i; + struct Pokemon *pokemon = gPlayerParty; + pokemon += gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].partyIdx; + sub_8136E10(pokemon, gUnknown_02039304->unk57); + sub_8136E40(gUnknown_02039304->pokeblock, pokemon); + sub_8136E10(pokemon, gUnknown_02039304->unk5c); + for (i=0; i<5; i++) + { + gUnknown_02039304->unk61[i] = gUnknown_02039304->unk5c[i] - gUnknown_02039304->unk57[i]; + } +} + +void sub_8136F74(struct Pokeblock *pokeblock, struct Pokemon *pokemon) +{ + s8 direction; + s8 i; + s16 amount; + s8 boost; + s8 taste; + gUnknown_02039304->unk66[0] = pokeblock->spicy; + gUnknown_02039304->unk66[1] = pokeblock->sour; + gUnknown_02039304->unk66[2] = pokeblock->bitter; + gUnknown_02039304->unk66[3] = pokeblock->sweet; + gUnknown_02039304->unk66[4] = pokeblock->dry; + if (gUnknown_02039312 > 0) + direction = 1; + else if (gUnknown_02039312 < 0) + direction = -1; + else + return; + for (i=0; i<5; i++) + { + amount = gUnknown_02039304->unk66[i]; + boost = amount / 10; + if (amount % 10 >= 5) // round to the nearest + boost++; + taste = sub_8040A54(pokemon, gUnknown_0840612C[i]); + if (taste == direction) + { + gUnknown_02039304->unk66[i] += boost * taste; + } + } +} + +bool8 sub_8137058(void) +{ + struct Pokemon *pokemon = gPlayerParty; + pokemon += gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].partyIdx; + if (GetMonData(pokemon, MON_DATA_SHEEN) == 255) + return TRUE; + return FALSE; +} + +u8 sub_81370A4(u8 a0) +{ + u8 i; + for (i=0; iunk54 = 0; + for (flavor=0; flavor<5; flavor++) + { + if (gUnknown_02039304->unk61[flavor] != 0) + { + spriteidx = CreateSprite(&gSpriteTemplate_840618C, gUnknown_08406158[flavor][0], gUnknown_08406158[flavor][1], 0); + if (spriteidx != MAX_SPRITES) + { + if (gUnknown_02039304->unk61[flavor] != 0) + { + gSprites[spriteidx].callback = sub_81371DC; + } + gUnknown_02039304->unk54++; + } + } + } +} + +void sub_81371DC(struct Sprite *sprite) +{ + if (sprite->data0 <= 5) + sprite->pos2.y -= 2; + else if (sprite->data0 <= 11) + sprite->pos2.y += 2; + if ((++sprite->data0) > 60) + { + DestroySprite(sprite); + gUnknown_02039304->unk54--; + } +} diff --git a/src/field/wallclock.c b/src/field/wallclock.c new file mode 100644 index 000000000..8db13dc2d --- /dev/null +++ b/src/field/wallclock.c @@ -0,0 +1,1061 @@ +#include "global.h" +#include "wallclock.h" +#include "decompress.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "rtc.h" +#include "songs.h" +#include "sound.h" +#include "strings2.h" +#include "task.h" +#include "trig.h" +#include "unknown_task.h" + +extern u16 gSpecialVar_0x8004; +extern u8 gMiscClock_Gfx[]; +extern u8 gUnknown_08E95774[]; +extern u8 gUnknown_08E954B0[]; +extern u16 gMiscClockMale_Pal[]; +extern u16 gMiscClockFemale_Pal[]; + +//-------------------------------------------------- +// Graphics Data +//-------------------------------------------------- + +static const u8 ClockGfx_Misc[] = INCBIN_U8("graphics/misc/clock_misc.4bpp.lz"); +static const struct CompressedSpriteSheet gUnknown_083F7A90[] = +{ + {ClockGfx_Misc, 0x2000, 0x1000}, + {NULL}, +}; +static const struct SpritePalette gUnknown_083F7AA0[] = +{ + {gMiscClockMale_Pal, 0x1000}, + {gMiscClockFemale_Pal, 0x1001}, + {NULL}, +}; +static const struct OamData gOamData_83F7AB8 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_83F7AC0[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83F7AC8[] = +{ + ANIMCMD_FRAME(64, 30), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_83F7AD0[] = +{ + gSpriteAnim_83F7AC0, +}; +static const union AnimCmd *const gSpriteAnimTable_83F7AD4[] = +{ + gSpriteAnim_83F7AC8, +}; +static void sub_810B05C(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F7AD8 = +{ + .tileTag = 0x1000, + .paletteTag = 0x1000, + .oam = &gOamData_83F7AB8, + .anims = gSpriteAnimTable_83F7AD0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810B05C, +}; +static void sub_810B0F4(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F7AF0 = +{ + .tileTag = 0x1000, + .paletteTag = 0x1000, + .oam = &gOamData_83F7AB8, + .anims = gSpriteAnimTable_83F7AD4, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810B0F4, +}; +static const struct OamData gOamData_83F7B08 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_83F7B10[] = +{ + ANIMCMD_FRAME(132, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83F7B18[] = +{ + ANIMCMD_FRAME(128, 30), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_83F7B20[] = +{ + gSpriteAnim_83F7B10, +}; +static const union AnimCmd *const gSpriteAnimTable_83F7B24[] = +{ + gSpriteAnim_83F7B18, +}; +static void sub_810B18C(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F7B28 = +{ + .tileTag = 0x1000, + .paletteTag = 0x1000, + .oam = &gOamData_83F7B08, + .anims = gSpriteAnimTable_83F7B20, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810B18C, +}; +static void sub_810B230(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F7B40 = +{ + .tileTag = 0x1000, + .paletteTag = 0x1000, + .oam = &gOamData_83F7B08, + .anims = gSpriteAnimTable_83F7B24, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810B230, +}; + +static void WallClockVblankCallback(void); +static void LoadWallClockGraphics(void); +static void WallClockMainCallback(void); +static void WallClockInit(void); +static void Task_SetClock1(u8 taskId); +static void Task_SetClock2(u8 taskId); +static void Task_SetClock3(u8 taskId); +static void Task_SetClock4(u8 taskId); +static void Task_SetClock5(u8 taskId); +static void Task_SetClock6(u8 taskId); +static void Task_ViewClock1(u8 taskId); +static void Task_ViewClock2(u8 taskId); +static void Task_ViewClock3(u8 taskId); +static void Task_ViewClock4(u8 taskId); +static u8 CalcMinHandDelta(u16 speed); +static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed); +static u8 AdvanceClock(u8 taskId, u8 direction); +static void UpdateClockPeriod(u8 taskId, u8 direction); +static void InitClockWithRtc(u8 taskId); + +enum +{ + PERIOD_AM, + PERIOD_PM, +}; + +enum +{ + MVMT_NONE, + MVMT_BACKWARD, + MVMT_FORWARD, +}; + +static void WallClockVblankCallback(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void LoadWallClockGraphics(void) +{ + u8 *addr; + u32 size; + + SetVBlankCallback(0); + REG_DISPCNT = 0; + REG_BG3CNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + 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; + } + } + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + + LZ77UnCompVram(gMiscClock_Gfx, (void *)VRAM); + if (gSpecialVar_0x8004 == MALE) + LoadPalette(gMiscClockMale_Pal, 0, 32); + else + LoadPalette(gMiscClockFemale_Pal, 0, 32); + remove_some_task(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + LoadCompressedObjectPic(&gUnknown_083F7A90[0]); + LoadSpritePalettes(gUnknown_083F7AA0); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); +} + +static void WallClockInit(void) +{ + u16 ime; + + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(WallClockVblankCallback); + SetMainCallback2(WallClockMainCallback); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG3CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | + DISPCNT_BG3_ON | DISPCNT_OBJ_ON; +} + +#define tMinuteHandAngle data[0] +#define tHourHandAngle data[1] +#define tHours data[2] +#define tMinutes data[3] +#define tMvmtDir data[4] +#define tPeriod data[5] +#define tMvmtSpeed data[6] + +//Allow player to set the clock +void CB2_StartWallClock(void) +{ + u8 taskId; + u8 spriteId; + + LoadWallClockGraphics(); + LZ77UnCompVram(&gUnknown_08E954B0, (void *)(VRAM + 0x3800)); + + taskId = CreateTask(Task_SetClock1, 0); + gTasks[taskId].tHours = 10; + gTasks[taskId].tMinutes = 0; + gTasks[taskId].tMvmtDir = MVMT_NONE; + gTasks[taskId].tPeriod = PERIOD_AM; + gTasks[taskId].tMvmtSpeed = 0; + gTasks[taskId].tMinuteHandAngle = 0; + gTasks[taskId].tHourHandAngle = 300; + + spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 1); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 0; + + spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 1; + + spriteId = CreateSprite(&gSpriteTemplate_83F7B28, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 2); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].data1 = 45; + + spriteId = CreateSprite(&gSpriteTemplate_83F7B40, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 2); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].data1 = 90; + + WallClockInit(); +} + +//View, but don't set, the clock +void CB2_ViewWallClock(void) +{ + u8 taskId; + s16 angle1; + s16 angle2; + u8 spriteId; + + LoadWallClockGraphics(); + LZ77UnCompVram(gUnknown_08E95774, (void *)(VRAM + 0x3800)); + + taskId = CreateTask(Task_ViewClock1, 0); + InitClockWithRtc(taskId); + if (gTasks[taskId].tPeriod == PERIOD_AM) + { + angle1 = 45; + angle2 = 90; + } + else + { + angle1 = 90; + angle2 = 135; + } + + spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, 120, 80, 1); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 0; + + spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, 120, 80, 0); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 1; + + spriteId = CreateSprite(&gSpriteTemplate_83F7B28, 120, 80, 2); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].data1 = angle1; + + spriteId = CreateSprite(&gSpriteTemplate_83F7B40, 120, 80, 2); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].data1 = angle2; + + WallClockInit(); +} + +static void WallClockMainCallback(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void Task_SetClock1(u8 taskId) +{ + if (!gPaletteFade.active) + gTasks[taskId].func = Task_SetClock2; +} + +//Handle keypresses when setting clock +static void Task_SetClock2(u8 taskId) +{ + if (gTasks[taskId].tMinuteHandAngle % 6) + { + gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle( + gTasks[taskId].tMinuteHandAngle, + gTasks[taskId].tMvmtDir, + gTasks[taskId].tMvmtSpeed); + } + else + { + gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6; + gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5; + if (gMain.newKeys & A_BUTTON) + { + gTasks[taskId].func = Task_SetClock3; + return; + } + else + { + gTasks[taskId].tMvmtDir = gMain.newKeys & A_BUTTON; + if (gMain.heldKeys & DPAD_LEFT) + gTasks[taskId].tMvmtDir = MVMT_BACKWARD; + if (gMain.heldKeys & DPAD_RIGHT) + gTasks[taskId].tMvmtDir = MVMT_FORWARD; + if (gTasks[taskId].tMvmtDir) + { + if (gTasks[taskId].tMvmtSpeed < 0xFF) + gTasks[taskId].tMvmtSpeed++; + gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle( + gTasks[taskId].tMinuteHandAngle, + gTasks[taskId].tMvmtDir, + gTasks[taskId].tMvmtSpeed); + AdvanceClock(taskId, gTasks[taskId].tMvmtDir); + } + else + { + gTasks[taskId].tMvmtSpeed = 0; + } + } + } +} + +//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); + InitMenu(0, 24, 9, 2, 1, 5); + gTasks[taskId].func = Task_SetClock4; +} + +//Get menu selection +static void Task_SetClock4(u8 taskId) +{ + switch (ProcessMenuInputNoWrap_()) + { + case 0: //YES + PlaySE(SE_SELECT); + gTasks[taskId].func = Task_SetClock5; //Move on + return; + case -1: //B button + case 1: //NO + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(23, 8, 29, 13); + MenuZeroFillWindowRect(2, 16, 27, 19); + gTasks[taskId].func = Task_SetClock2; //Go back and let player adjust clock + } +} + +//Set the time offset based on the wall clock's time +static void Task_SetClock5(u8 taskId) +{ + RtcInitLocalTimeOffset(gTasks[taskId].tHours, gTasks[taskId].tMinutes); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = Task_SetClock6; +} + +static void Task_SetClock6(u8 taskId) +{ + if (!gPaletteFade.active) + SetMainCallback2((MainCallback)gMain.savedCallback); +} + +static void Task_ViewClock1(u8 taskId) +{ + if (!gPaletteFade.active) + gTasks[taskId].func = Task_ViewClock2; +} + +//Wait for A or B press +static void Task_ViewClock2(u8 taskId) +{ + InitClockWithRtc(taskId); + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + gTasks[taskId].func = Task_ViewClock3; +} + +static void Task_ViewClock3(u8 taskId) +{ + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = Task_ViewClock4; +} + +static void Task_ViewClock4(u8 taskId) +{ + if (!gPaletteFade.active) + SetMainCallback2((MainCallback)gMain.savedCallback); +} + +static u8 CalcMinHandDelta(u16 speed) +{ + if (speed > 60) + return 6; + else if (speed > 30) + return 3; + else if (speed > 10) + return 2; + else + return 1; +} + +//Calculates the new angle of the minute hand when setting the clock +static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed) +{ + u8 delta = CalcMinHandDelta(speed); + + switch (direction) + { + case MVMT_BACKWARD: + if (angle) + angle = angle - delta; + else + angle = 360 - delta; + break; + case MVMT_FORWARD: + if (angle < 360 - delta) + angle = angle + delta; + else + angle = 0; + break; + } + return angle; +} + +//Advances clock forward or backward by 1 minute +static u8 AdvanceClock(u8 taskId, u8 direction) +{ + switch (direction) + { + case MVMT_BACKWARD: + if (gTasks[taskId].tMinutes > 0) + gTasks[taskId].tMinutes--; + else + { + gTasks[taskId].tMinutes = 59; + if (gTasks[taskId].tHours > 0) + gTasks[taskId].tHours--; + else + gTasks[taskId].tHours = 23; + UpdateClockPeriod(taskId, direction); + } + break; + case MVMT_FORWARD: + if (gTasks[taskId].tMinutes < 59) + gTasks[taskId].tMinutes++; + else + { + gTasks[taskId].tMinutes = 0; + if (gTasks[taskId].tHours < 23) + gTasks[taskId].tHours++; + else + gTasks[taskId].tHours = 0; + UpdateClockPeriod(taskId, direction); + } + break; + } + return 0; +} + +//Updates the clock period (AM/PM) if it needs to change +static void UpdateClockPeriod(u8 taskId, u8 direction) +{ + u8 hours = gTasks[taskId].tHours; + + switch (direction) + { + case MVMT_BACKWARD: + switch (hours) + { + case 11: + gTasks[taskId].tPeriod = PERIOD_AM; + break; + case 23: + gTasks[taskId].tPeriod = PERIOD_PM; + break; + } + break; + case MVMT_FORWARD: + switch (hours) + { + case 0: + gTasks[taskId].tPeriod = PERIOD_AM; + break; + case 12: + gTasks[taskId].tPeriod = PERIOD_PM; + break; + } + break; + } +} + +static void InitClockWithRtc(u8 taskId) +{ + RtcCalcLocalTime(); + gTasks[taskId].tHours = gLocalTime.hours; + gTasks[taskId].tMinutes = gLocalTime.minutes; + gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6; + gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5; + if (gLocalTime.hours <= 11) + gTasks[taskId].tPeriod = PERIOD_AM; + else + gTasks[taskId].tPeriod = PERIOD_PM; +} + +static const s8 gClockHandCoords[][2] = +{ + { 0, -24}, + { 1, -25}, + { 1, -25}, + { 2, -25}, + { 2, -25}, + { 2, -25}, + { 3, -24}, + { 3, -25}, + { 4, -25}, + { 4, -25}, + { 4, -25}, + { 5, -25}, + { 5, -25}, + { 6, -24}, + { 6, -24}, + { 6, -24}, + { 7, -24}, + { 7, -24}, + { 7, -24}, + { 8, -24}, + { 8, -24}, + { 9, -24}, + { 9, -24}, + { 10, -23}, + { 10, -23}, + { 11, -22}, + { 11, -22}, + { 11, -22}, + { 12, -22}, + { 12, -21}, + { 13, -21}, + { 13, -21}, + { 13, -21}, + { 14, -21}, + { 14, -21}, + { 14, -20}, + { 14, -20}, + { 15, -20}, + { 15, -19}, + { 16, -19}, + { 16, -19}, + { 16, -19}, + { 16, -18}, + { 16, -18}, + { 17, -18}, + { 17, -17}, + { 17, -17}, + { 18, -17}, + { 18, -17}, + { 18, -16}, + { 18, -16}, + { 19, -16}, + { 19, -15}, + { 19, -15}, + { 20, -15}, + { 20, -14}, + { 20, -14}, + { 20, -13}, + { 20, -13}, + { 21, -13}, + { 21, -13}, + { 21, -12}, + { 22, -12}, + { 22, -12}, + { 22, -11}, + { 22, -11}, + { 22, -10}, + { 23, -10}, + { 23, -9}, + { 23, -9}, + { 23, -9}, + { 23, -9}, + { 23, -8}, + { 23, -8}, + { 23, -7}, + { 23, -7}, + { 23, -6}, + { 24, -6}, + { 24, -6}, + { 25, -5}, + { 25, -5}, + { 24, -4}, + { 25, -4}, + { 24, -3}, + { 25, -3}, + { 25, -3}, + { 25, -2}, + { 25, -2}, + { 24, -1}, + { 25, -1}, + { 24, 0}, + { 24, 0}, + { 24, 0}, + { 24, 1}, + { 24, 1}, + { 25, 2}, + { 24, 2}, + { 25, 2}, + { 24, 3}, + { 24, 3}, + { 25, 4}, + { 24, 4}, + { 24, 5}, + { 24, 5}, + { 24, 5}, + { 24, 6}, + { 23, 6}, + { 23, 6}, + { 23, 7}, + { 23, 8}, + { 23, 8}, + { 23, 8}, + { 23, 9}, + { 23, 9}, + { 23, 10}, + { 22, 10}, + { 22, 10}, + { 22, 11}, + { 22, 11}, + { 22, 11}, + { 22, 12}, + { 21, 12}, + { 21, 12}, + { 21, 13}, + { 20, 13}, + { 20, 13}, + { 19, 13}, + { 19, 13}, + { 19, 14}, + { 19, 14}, + { 19, 15}, + { 19, 15}, + { 18, 15}, + { 18, 16}, + { 17, 16}, + { 17, 16}, + { 17, 17}, + { 17, 17}, + { 16, 17}, + { 16, 18}, + { 16, 18}, + { 15, 18}, + { 14, 18}, + { 15, 19}, + { 14, 19}, + { 14, 19}, + { 13, 19}, + { 13, 20}, + { 13, 20}, + { 13, 20}, + { 12, 20}, + { 12, 20}, + { 12, 21}, + { 11, 21}, + { 11, 21}, + { 11, 21}, + { 10, 21}, + { 10, 22}, + { 10, 22}, + { 9, 22}, + { 9, 22}, + { 8, 22}, + { 7, 22}, + { 7, 23}, + { 7, 23}, + { 6, 23}, + { 6, 23}, + { 5, 23}, + { 5, 23}, + { 5, 24}, + { 4, 24}, + { 4, 24}, + { 4, 24}, + { 3, 24}, + { 2, 24}, + { 2, 24}, + { 1, 24}, + { 1, 24}, + { 0, 24}, + { 0, 24}, + { -1, 23}, + { 0, 24}, + { 0, 24}, + { -1, 24}, + { -1, 24}, + { -2, 24}, + { -2, 24}, + { -3, 24}, + { -3, 24}, + { -4, 24}, + { -4, 24}, + { -5, 24}, + { -5, 23}, + { -5, 23}, + { -6, 23}, + { -6, 23}, + { -7, 23}, + { -7, 23}, + { -7, 23}, + { -8, 23}, + { -8, 22}, + { -9, 22}, + { -9, 22}, + {-10, 22}, + {-10, 22}, + {-10, 21}, + {-11, 21}, + {-11, 21}, + {-11, 21}, + {-11, 20}, + {-12, 20}, + {-12, 20}, + {-13, 20}, + {-13, 20}, + {-13, 19}, + {-14, 19}, + {-14, 19}, + {-14, 19}, + {-14, 18}, + {-15, 18}, + {-15, 18}, + {-15, 17}, + {-16, 17}, + {-16, 17}, + {-17, 17}, + {-17, 16}, + {-17, 16}, + {-18, 16}, + {-17, 15}, + {-18, 15}, + {-18, 15}, + {-19, 15}, + {-19, 14}, + {-19, 14}, + {-19, 13}, + {-19, 13}, + {-20, 13}, + {-20, 12}, + {-20, 12}, + {-21, 12}, + {-21, 12}, + {-21, 11}, + {-21, 11}, + {-21, 10}, + {-21, 10}, + {-21, 9}, + {-22, 9}, + {-22, 9}, + {-22, 8}, + {-22, 8}, + {-22, 7}, + {-23, 7}, + {-23, 7}, + {-23, 6}, + {-23, 6}, + {-23, 5}, + {-24, 5}, + {-23, 4}, + {-23, 4}, + {-24, 4}, + {-24, 4}, + {-24, 3}, + {-24, 3}, + {-24, 2}, + {-24, 2}, + {-24, 1}, + {-24, 1}, + {-24, 1}, + {-24, 0}, + {-25, 0}, + {-24, -1}, + {-25, -1}, + {-24, -1}, + {-24, -2}, + {-24, -2}, + {-24, -3}, + {-24, -3}, + {-24, -4}, + {-24, -4}, + {-24, -4}, + {-24, -5}, + {-24, -5}, + {-24, -6}, + {-24, -6}, + {-23, -6}, + {-23, -7}, + {-23, -7}, + {-23, -8}, + {-23, -8}, + {-23, -9}, + {-23, -9}, + {-22, -9}, + {-22, -9}, + {-22, -10}, + {-22, -10}, + {-21, -10}, + {-21, -11}, + {-22, -11}, + {-22, -12}, + {-21, -12}, + {-21, -13}, + {-21, -13}, + {-20, -13}, + {-21, -14}, + {-20, -14}, + {-20, -14}, + {-19, -14}, + {-19, -15}, + {-19, -15}, + {-18, -16}, + {-18, -16}, + {-18, -16}, + {-18, -17}, + {-18, -17}, + {-17, -17}, + {-17, -18}, + {-17, -18}, + {-16, -18}, + {-16, -18}, + {-16, -19}, + {-16, -19}, + {-15, -19}, + {-15, -19}, + {-15, -20}, + {-14, -20}, + {-14, -20}, + {-14, -21}, + {-13, -21}, + {-13, -21}, + {-13, -21}, + {-12, -21}, + {-12, -22}, + {-11, -22}, + {-11, -22}, + {-11, -22}, + {-10, -22}, + {-10, -22}, + { -9, -22}, + { -9, -23}, + { -9, -23}, + { -8, -23}, + { -8, -23}, + { -7, -23}, + { -7, -23}, + { -7, -24}, + { -6, -24}, + { -6, -24}, + { -5, -24}, + { -5, -24}, + { -4, -24}, + { -4, -24}, + { -4, -24}, + { -4, -25}, + { -3, -25}, + { -2, -25}, + { -2, -24}, + { -2, -24}, + { -1, -25}, + { -1, -25}, + { 0, -25}, +}; + +static void sub_810B05C(struct Sprite *sprite) +{ + u16 angle; + s16 sin; + s16 cos; + u16 x; + u16 y; + + angle = gTasks[sprite->data0].tMinuteHandAngle; + sin = Sin2(angle) / 16; + cos = Cos2(angle) / 16; + SetOamMatrix(0, cos, sin, -sin, cos); + x = gClockHandCoords[angle][0]; + y = gClockHandCoords[angle][1]; + + //Manual sign extension + if (x > 0x80) + x |= 0xFF00; + if (y > 0x80) + y |= 0xFF00; + + sprite->pos2.x = x; + sprite->pos2.y = y; +} + +static void sub_810B0F4(struct Sprite *sprite) +{ + u16 angle; + s16 sin; + s16 cos; + u16 x; + u16 y; + + angle = gTasks[sprite->data0].tHourHandAngle; + sin = Sin2(angle) / 16; + cos = Cos2(angle) / 16; + SetOamMatrix(1, cos, sin, -sin, cos); + x = gClockHandCoords[angle][0]; + y = gClockHandCoords[angle][1]; + + //Manual sign extension + if (x > 0x80) + x |= 0xFF00; + if (y > 0x80) + y |= 0xFF00; + + sprite->pos2.x = x; + sprite->pos2.y = y; +} + +static void sub_810B18C(struct Sprite *sprite) +{ + s16 sin; + s16 cos; + + if (gTasks[sprite->data0].tPeriod != PERIOD_AM) + { + if (sprite->data1 >= 60 && sprite->data1 < 90) + sprite->data1 += 5; + if (sprite->data1 < 60) + sprite->data1++; + } + else + { + if (sprite->data1 > 45 && sprite->data1 <= 75) + sprite->data1 -= 5; + if (sprite->data1 > 75) + sprite->data1--; + } + cos = Cos2((u16)sprite->data1); + sprite->pos2.x = cos * 30 / 4096; + sin = Sin2((u16)sprite->data1); + sprite->pos2.y = sin * 30 / 4096; +} + +static void sub_810B230(struct Sprite *sprite) +{ + s16 sin; + s16 cos; + + if (gTasks[sprite->data0].tPeriod != PERIOD_AM) + { + if (sprite->data1 >= 105 && sprite->data1 < 135) + sprite->data1 += 5; + if (sprite->data1 < 105) + sprite->data1++; + } + else + { + if (sprite->data1 > 90 && sprite->data1 <= 120) + sprite->data1 -= 5; + if (sprite->data1 > 120) + sprite->data1--; + } + cos = Cos2((u16)sprite->data1); + sprite->pos2.x = cos * 30 / 4096; + sin = Sin2((u16)sprite->data1); + sprite->pos2.y = sin * 30 / 4096; +} diff --git a/src/field/wild_encounter.c b/src/field/wild_encounter.c new file mode 100644 index 000000000..96f47c067 --- /dev/null +++ b/src/field/wild_encounter.c @@ -0,0 +1,3568 @@ +#include "global.h" +#include "wild_encounter.h" +#include "abilities.h" +#include "battle_setup.h" +#include "event_data.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "metatile_behavior.h" +#include "pokeblock.h" +#include "rng.h" +#include "roamer.h" +#include "rom4.h" +#include "safari_zone.h" +#include "script.h" +#include "species.h" +#include "tv.h" + +const struct WildPokemon PetalburgCity_WaterMons [] = +{ + {20, 30, SPECIES_MARILL}, + {10, 20, SPECIES_MARILL}, + {30, 35, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, +}; +const struct WildPokemonInfo PetalburgCity_WaterMonsInfo = {1, PetalburgCity_WaterMons}; + +const struct WildPokemon PetalburgCity_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_CORPHISH}, + {25, 30, SPECIES_CORPHISH}, + {30, 35, SPECIES_CORPHISH}, + {20, 25, SPECIES_CORPHISH}, + {35, 40, SPECIES_CORPHISH}, + {40, 45, SPECIES_CORPHISH}, +}; +const struct WildPokemonInfo PetalburgCity_FishingMonsInfo = {10, PetalburgCity_FishingMons}; + +const struct WildPokemon SlateportCity_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo SlateportCity_WaterMonsInfo = {4, SlateportCity_WaterMons}; + +const struct WildPokemon SlateportCity_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo SlateportCity_FishingMonsInfo = {10, SlateportCity_FishingMons}; + +const struct WildPokemon LilycoveCity_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo LilycoveCity_WaterMonsInfo = {4, LilycoveCity_WaterMons}; + +const struct WildPokemon LilycoveCity_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_STARYU}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo LilycoveCity_FishingMonsInfo = {10, LilycoveCity_FishingMons}; + +const struct WildPokemon MossdeepCity_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo MossdeepCity_WaterMonsInfo = {4, MossdeepCity_WaterMons}; + +const struct WildPokemon MossdeepCity_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo MossdeepCity_FishingMonsInfo = {10, MossdeepCity_FishingMons}; + +const struct WildPokemon SootopolisCity_WaterMons [] = +{ + {5, 35, SPECIES_MAGIKARP}, + {10, 30, SPECIES_MAGIKARP}, + {15, 25, SPECIES_MAGIKARP}, + {25, 30, SPECIES_MAGIKARP}, + {25, 30, SPECIES_MAGIKARP}, +}; +const struct WildPokemonInfo SootopolisCity_WaterMonsInfo = {1, SootopolisCity_WaterMons}; + +const struct WildPokemon SootopolisCity_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, +#ifdef SAPPHIRE + {5, 10, SPECIES_TENTACOOL}, +#else + {10, 15, SPECIES_MAGIKARP}, +#endif + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_MAGIKARP}, + {30, 35, SPECIES_MAGIKARP}, + {30, 35, SPECIES_MAGIKARP}, + {35, 40, SPECIES_GYARADOS}, + {35, 45, SPECIES_GYARADOS}, + {5, 45, SPECIES_GYARADOS}, +}; +const struct WildPokemonInfo SootopolisCity_FishingMonsInfo = {10, SootopolisCity_FishingMons}; + +const struct WildPokemon EverGrandeCity_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo EverGrandeCity_WaterMonsInfo = {4, EverGrandeCity_WaterMons}; + +const struct WildPokemon EverGrandeCity_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_LUVDISC}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_LUVDISC}, + {30, 35, SPECIES_WAILMER}, + {30, 35, SPECIES_CORSOLA}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo EverGrandeCity_FishingMonsInfo = {10, EverGrandeCity_FishingMons}; + +const struct WildPokemon MeteorFalls_1F_1R_LandMons [] = +{ + {16, 16, SPECIES_ZUBAT}, + {17, 17, SPECIES_ZUBAT}, + {18, 18, SPECIES_ZUBAT}, + {15, 15, SPECIES_ZUBAT}, + {14, 14, SPECIES_ZUBAT}, +#ifdef SAPPHIRE + {16, 16, SPECIES_LUNATONE}, + {18, 18, SPECIES_LUNATONE}, + {14, 14, SPECIES_LUNATONE}, +#else + {16, 16, SPECIES_SOLROCK}, + {18, 18, SPECIES_SOLROCK}, + {14, 14, SPECIES_SOLROCK}, +#endif + {19, 19, SPECIES_ZUBAT}, + {20, 20, SPECIES_ZUBAT}, + {19, 19, SPECIES_ZUBAT}, + {20, 20, SPECIES_ZUBAT}, +}; +const struct WildPokemonInfo MeteorFalls_1F_1R_LandMonsInfo = {10, MeteorFalls_1F_1R_LandMons}; + +const struct WildPokemon MeteorFalls_1F_1R_WaterMons [] = +{ + {5, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_ZUBAT}, +#ifdef SAPPHIRE + {25, 35, SPECIES_LUNATONE}, + {15, 25, SPECIES_LUNATONE}, + {5, 15, SPECIES_LUNATONE}, +#else + {25, 35, SPECIES_SOLROCK}, + {15, 25, SPECIES_SOLROCK}, + {5, 15, SPECIES_SOLROCK}, +#endif +}; +const struct WildPokemonInfo MeteorFalls_1F_1R_WaterMonsInfo = {4, MeteorFalls_1F_1R_WaterMons}; + +const struct WildPokemon MeteorFalls_1F_1R_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {20, 25, SPECIES_BARBOACH}, + {35, 40, SPECIES_BARBOACH}, + {40, 45, SPECIES_BARBOACH}, +}; +const struct WildPokemonInfo MeteorFalls_1F_1R_FishingMonsInfo = {30, MeteorFalls_1F_1R_FishingMons}; + +const struct WildPokemon MeteorFalls_1F_2R_LandMons [] = +{ + {33, 33, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {35, 35, SPECIES_LUNATONE}, + {33, 33, SPECIES_LUNATONE}, + {37, 37, SPECIES_LUNATONE}, +#else + {35, 35, SPECIES_SOLROCK}, + {33, 33, SPECIES_SOLROCK}, + {37, 37, SPECIES_SOLROCK}, +#endif + {35, 35, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {39, 39, SPECIES_LUNATONE}, +#else + {39, 39, SPECIES_SOLROCK}, +#endif + {38, 38, SPECIES_GOLBAT}, + {40, 40, SPECIES_GOLBAT}, + {38, 38, SPECIES_GOLBAT}, + {40, 40, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo MeteorFalls_1F_2R_LandMonsInfo = {10, MeteorFalls_1F_2R_LandMons}; + +const struct WildPokemon MeteorFalls_1F_2R_WaterMons [] = +{ + {30, 35, SPECIES_GOLBAT}, + {30, 35, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {25, 35, SPECIES_LUNATONE}, + {15, 25, SPECIES_LUNATONE}, + {5, 15, SPECIES_LUNATONE}, +#else + {25, 35, SPECIES_SOLROCK}, + {15, 25, SPECIES_SOLROCK}, + {5, 15, SPECIES_SOLROCK}, +#endif +}; +const struct WildPokemonInfo MeteorFalls_1F_2R_WaterMonsInfo = {4, MeteorFalls_1F_2R_WaterMons}; + +const struct WildPokemon MeteorFalls_1F_2R_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {30, 35, SPECIES_WHISCASH}, + {35, 40, SPECIES_WHISCASH}, + {40, 45, SPECIES_WHISCASH}, +}; +const struct WildPokemonInfo MeteorFalls_1F_2R_FishingMonsInfo = {30, MeteorFalls_1F_2R_FishingMons}; + +const struct WildPokemon MeteorFalls_B1F_1R_LandMons [] = +{ + {33, 33, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {35, 35, SPECIES_LUNATONE}, + {33, 33, SPECIES_LUNATONE}, + {37, 37, SPECIES_LUNATONE}, +#else + {35, 35, SPECIES_SOLROCK}, + {33, 33, SPECIES_SOLROCK}, + {37, 37, SPECIES_SOLROCK}, +#endif + {35, 35, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {39, 39, SPECIES_LUNATONE}, +#else + {39, 39, SPECIES_SOLROCK}, +#endif + {38, 38, SPECIES_GOLBAT}, + {40, 40, SPECIES_GOLBAT}, + {38, 38, SPECIES_GOLBAT}, + {40, 40, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo MeteorFalls_B1F_1R_LandMonsInfo = {10, MeteorFalls_B1F_1R_LandMons}; + +const struct WildPokemon MeteorFalls_B1F_1R_WaterMons [] = +{ + {30, 35, SPECIES_GOLBAT}, + {30, 35, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {25, 35, SPECIES_LUNATONE}, + {15, 25, SPECIES_LUNATONE}, + {5, 15, SPECIES_LUNATONE}, +#else + {25, 35, SPECIES_SOLROCK}, + {15, 25, SPECIES_SOLROCK}, + {5, 15, SPECIES_SOLROCK}, +#endif +}; +const struct WildPokemonInfo MeteorFalls_B1F_1R_WaterMonsInfo = {4, MeteorFalls_B1F_1R_WaterMons}; + +const struct WildPokemon MeteorFalls_B1F_1R_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {30, 35, SPECIES_WHISCASH}, + {35, 40, SPECIES_WHISCASH}, + {40, 45, SPECIES_WHISCASH}, +}; +const struct WildPokemonInfo MeteorFalls_B1F_1R_FishingMonsInfo = {30, MeteorFalls_B1F_1R_FishingMons}; + +const struct WildPokemon MeteorFalls_B1F_2R_LandMons [] = +{ + {33, 33, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {30, 30, SPECIES_BAGON}, +#ifdef SAPPHIRE + {35, 35, SPECIES_LUNATONE}, +#else + {35, 35, SPECIES_SOLROCK}, +#endif + {35, 35, SPECIES_BAGON}, +#ifdef SAPPHIRE + {37, 37, SPECIES_LUNATONE}, +#else + {37, 37, SPECIES_SOLROCK}, +#endif + {25, 25, SPECIES_BAGON}, +#ifdef SAPPHIRE + {39, 39, SPECIES_LUNATONE}, +#else + {39, 39, SPECIES_SOLROCK}, +#endif + {38, 38, SPECIES_GOLBAT}, + {40, 40, SPECIES_GOLBAT}, + {38, 38, SPECIES_GOLBAT}, + {40, 40, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo MeteorFalls_B1F_2R_LandMonsInfo = {10, MeteorFalls_B1F_2R_LandMons}; + +const struct WildPokemon MeteorFalls_B1F_2R_WaterMons [] = +{ + {30, 35, SPECIES_GOLBAT}, + {30, 35, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {25, 35, SPECIES_LUNATONE}, + {15, 25, SPECIES_LUNATONE}, + {5, 15, SPECIES_LUNATONE}, +#else + {25, 35, SPECIES_SOLROCK}, + {15, 25, SPECIES_SOLROCK}, + {5, 15, SPECIES_SOLROCK}, +#endif +}; +const struct WildPokemonInfo MeteorFalls_B1F_2R_WaterMonsInfo = {4, MeteorFalls_B1F_2R_WaterMons}; + +const struct WildPokemon MeteorFalls_B1F_2R_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {30, 35, SPECIES_WHISCASH}, + {35, 40, SPECIES_WHISCASH}, + {40, 45, SPECIES_WHISCASH}, +}; +const struct WildPokemonInfo MeteorFalls_B1F_2R_FishingMonsInfo = {30, MeteorFalls_B1F_2R_FishingMons}; + +const struct WildPokemon RusturfTunnel_LandMons [] = +{ + {6, 6, SPECIES_WHISMUR}, + {7, 7, SPECIES_WHISMUR}, + {6, 6, SPECIES_WHISMUR}, + {6, 6, SPECIES_WHISMUR}, + {7, 7, SPECIES_WHISMUR}, + {7, 7, SPECIES_WHISMUR}, + {5, 5, SPECIES_WHISMUR}, + {8, 8, SPECIES_WHISMUR}, + {5, 5, SPECIES_WHISMUR}, + {8, 8, SPECIES_WHISMUR}, + {5, 5, SPECIES_WHISMUR}, + {8, 8, SPECIES_WHISMUR}, +}; +const struct WildPokemonInfo RusturfTunnel_LandMonsInfo = {10, RusturfTunnel_LandMons}; + +const struct WildPokemon GraniteCave_1F_LandMons [] = +{ + {7, 7, SPECIES_ZUBAT}, + {8, 8, SPECIES_MAKUHITA}, + {7, 7, SPECIES_MAKUHITA}, + {8, 8, SPECIES_ZUBAT}, + {9, 9, SPECIES_MAKUHITA}, + {8, 8, SPECIES_ABRA}, + {10, 10, SPECIES_MAKUHITA}, + {6, 6, SPECIES_MAKUHITA}, + {7, 7, SPECIES_GEODUDE}, + {8, 8, SPECIES_GEODUDE}, + {6, 6, SPECIES_GEODUDE}, + {9, 9, SPECIES_GEODUDE}, +}; +const struct WildPokemonInfo GraniteCave_1F_LandMonsInfo = {10, GraniteCave_1F_LandMons}; + +const struct WildPokemon GraniteCave_B1F_LandMons [] = +{ + {9, 9, SPECIES_ZUBAT}, + {10, 10, SPECIES_ARON}, + {9, 9, SPECIES_ARON}, + {11, 11, SPECIES_ARON}, + {10, 10, SPECIES_ZUBAT}, + {9, 9, SPECIES_ABRA}, + {10, 10, SPECIES_MAKUHITA}, + {11, 11, SPECIES_MAKUHITA}, +#ifdef SAPPHIRE + {10, 10, SPECIES_SABLEYE}, + {10, 10, SPECIES_SABLEYE}, + {9, 9, SPECIES_SABLEYE}, + {11, 11, SPECIES_SABLEYE}, +#else + {10, 10, SPECIES_MAWILE}, + {10, 10, SPECIES_MAWILE}, + {9, 9, SPECIES_MAWILE}, + {11, 11, SPECIES_MAWILE}, +#endif +}; +const struct WildPokemonInfo GraniteCave_B1F_LandMonsInfo = {10, GraniteCave_B1F_LandMons}; + +const struct WildPokemon GraniteCave_B2F_LandMons [] = +{ + {10, 10, SPECIES_ZUBAT}, + {11, 11, SPECIES_ARON}, + {10, 10, SPECIES_ARON}, + {11, 11, SPECIES_ZUBAT}, + {12, 12, SPECIES_ARON}, + {10, 10, SPECIES_ABRA}, +#ifdef SAPPHIRE + {10, 10, SPECIES_SABLEYE}, + {11, 11, SPECIES_SABLEYE}, + {12, 12, SPECIES_SABLEYE}, + {10, 10, SPECIES_SABLEYE}, + {12, 12, SPECIES_SABLEYE}, + {10, 10, SPECIES_SABLEYE}, +#else + {10, 10, SPECIES_MAWILE}, + {11, 11, SPECIES_MAWILE}, + {12, 12, SPECIES_MAWILE}, + {10, 10, SPECIES_MAWILE}, + {12, 12, SPECIES_MAWILE}, + {10, 10, SPECIES_MAWILE}, +#endif +}; +const struct WildPokemonInfo GraniteCave_B2F_LandMonsInfo = {10, GraniteCave_B2F_LandMons}; + +const struct WildPokemon GraniteCave_B2F_RockSmashMons [] = +{ + {10, 15, SPECIES_GEODUDE}, + {10, 20, SPECIES_NOSEPASS}, + {5, 10, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, +}; +const struct WildPokemonInfo GraniteCave_B2F_RockSmashMonsInfo = {20, GraniteCave_B2F_RockSmashMons}; + +const struct WildPokemon GraniteCave_StevensRoom_LandMons [] = +{ + {7, 7, SPECIES_ZUBAT}, + {8, 8, SPECIES_MAKUHITA}, + {7, 7, SPECIES_MAKUHITA}, + {8, 8, SPECIES_ZUBAT}, + {9, 9, SPECIES_MAKUHITA}, + {8, 8, SPECIES_ABRA}, + {10, 10, SPECIES_MAKUHITA}, + {6, 6, SPECIES_MAKUHITA}, + {7, 7, SPECIES_ARON}, + {8, 8, SPECIES_ARON}, + {7, 7, SPECIES_ARON}, + {8, 8, SPECIES_ARON}, +}; +const struct WildPokemonInfo GraniteCave_StevensRoom_LandMonsInfo = {10, GraniteCave_StevensRoom_LandMons}; + +const struct WildPokemon PetalburgWoods_LandMons [] = +{ + {5, 5, SPECIES_ZIGZAGOON}, + {5, 5, SPECIES_WURMPLE}, + {5, 5, SPECIES_SHROOMISH}, + {6, 6, SPECIES_ZIGZAGOON}, + {5, 5, SPECIES_SILCOON}, + {5, 5, SPECIES_CASCOON}, + {6, 6, SPECIES_WURMPLE}, + {6, 6, SPECIES_SHROOMISH}, + {5, 5, SPECIES_TAILLOW}, + {5, 5, SPECIES_SLAKOTH}, + {6, 6, SPECIES_TAILLOW}, + {6, 6, SPECIES_SLAKOTH}, +}; +const struct WildPokemonInfo PetalburgWoods_LandMonsInfo = {20, PetalburgWoods_LandMons}; + +//Jagged Pass Pokemon are 2 levels higher on Sapphire +#ifdef SAPPHIRE +#define JAGGED_PASS_LEVEL_DIFF 2 +#else +#define JAGGED_PASS_LEVEL_DIFF 0 +#endif + +const struct WildPokemon JaggedPass_LandMons [] = +{ + {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, + {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, + {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP}, + {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, + {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, + {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP}, + {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, + {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP}, + {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, + {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, + {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, + {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, +}; +const struct WildPokemonInfo JaggedPass_LandMonsInfo = {20, JaggedPass_LandMons}; + +const struct WildPokemon FieryPath_LandMons [] = +{ + {15, 15, SPECIES_NUMEL}, +#ifdef SAPPHIRE + {15, 15, SPECIES_GRIMER}, +#else + {15, 15, SPECIES_KOFFING}, +#endif + {16, 16, SPECIES_NUMEL}, + {15, 15, SPECIES_MACHOP}, + {15, 15, SPECIES_TORKOAL}, + {15, 15, SPECIES_SLUGMA}, +#ifdef SAPPHIRE + {16, 16, SPECIES_GRIMER}, +#else + {16, 16, SPECIES_KOFFING}, +#endif + {16, 16, SPECIES_MACHOP}, + {14, 14, SPECIES_TORKOAL}, + {16, 16, SPECIES_TORKOAL}, +#ifdef SAPPHIRE + {14, 14, SPECIES_KOFFING}, + {14, 14, SPECIES_KOFFING}, +#else + {14, 14, SPECIES_GRIMER}, + {14, 14, SPECIES_GRIMER}, +#endif +}; +const struct WildPokemonInfo FieryPath_LandMonsInfo = {10, FieryPath_LandMons}; + +const struct WildPokemon MtPyre_1F_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {23, 23, SPECIES_SHUPPET}, + {22, 22, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, +#else + {27, 27, SPECIES_DUSKULL}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {23, 23, SPECIES_DUSKULL}, + {22, 22, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, +#endif +}; +const struct WildPokemonInfo MtPyre_1F_LandMonsInfo = {10, MtPyre_1F_LandMons}; + +const struct WildPokemon MtPyre_2F_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {23, 23, SPECIES_SHUPPET}, + {22, 22, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, +#else + {27, 27, SPECIES_DUSKULL}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {23, 23, SPECIES_DUSKULL}, + {22, 22, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, +#endif +}; +const struct WildPokemonInfo MtPyre_2F_LandMonsInfo = {10, MtPyre_2F_LandMons}; + +const struct WildPokemon MtPyre_3F_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {23, 23, SPECIES_SHUPPET}, + {22, 22, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, +#else + {27, 27, SPECIES_DUSKULL}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {23, 23, SPECIES_DUSKULL}, + {22, 22, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, +#endif +}; +const struct WildPokemonInfo MtPyre_3F_LandMonsInfo = {10, MtPyre_3F_LandMons}; + +const struct WildPokemon MtPyre_4F_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {23, 23, SPECIES_SHUPPET}, + {22, 22, SPECIES_SHUPPET}, + {27, 27, SPECIES_DUSKULL}, + {27, 27, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, +#else + {27, 27, SPECIES_DUSKULL}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {23, 23, SPECIES_DUSKULL}, + {22, 22, SPECIES_DUSKULL}, + {27, 27, SPECIES_SHUPPET}, + {27, 27, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, +#endif +}; +const struct WildPokemonInfo MtPyre_4F_LandMonsInfo = {10, MtPyre_4F_LandMons}; + +const struct WildPokemon MtPyre_5F_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {23, 23, SPECIES_SHUPPET}, + {22, 22, SPECIES_SHUPPET}, + {27, 27, SPECIES_DUSKULL}, + {27, 27, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, +#else + {27, 27, SPECIES_DUSKULL}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {23, 23, SPECIES_DUSKULL}, + {22, 22, SPECIES_DUSKULL}, + {27, 27, SPECIES_SHUPPET}, + {27, 27, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, +#endif +}; +const struct WildPokemonInfo MtPyre_5F_LandMonsInfo = {10, MtPyre_5F_LandMons}; + +const struct WildPokemon MtPyre_6F_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {23, 23, SPECIES_SHUPPET}, + {22, 22, SPECIES_SHUPPET}, + {27, 27, SPECIES_DUSKULL}, + {27, 27, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, +#else + {27, 27, SPECIES_DUSKULL}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {23, 23, SPECIES_DUSKULL}, + {22, 22, SPECIES_DUSKULL}, + {27, 27, SPECIES_SHUPPET}, + {27, 27, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, +#endif +}; +const struct WildPokemonInfo MtPyre_6F_LandMonsInfo = {10, MtPyre_6F_LandMons}; + +const struct WildPokemon MtPyre_Exterior_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, +#else + {27, 27, SPECIES_DUSKULL}, +#endif + {27, 27, SPECIES_MEDITITE}, +#ifdef SAPPHIRE + {28, 28, SPECIES_SHUPPET}, +#else + {28, 28, SPECIES_DUSKULL}, +#endif + {29, 29, SPECIES_MEDITITE}, +#ifdef SAPPHIRE + {29, 29, SPECIES_SHUPPET}, +#else + {29, 29, SPECIES_DUSKULL}, +#endif + {27, 27, SPECIES_VULPIX}, + {29, 29, SPECIES_VULPIX}, + {25, 25, SPECIES_VULPIX}, + {27, 27, SPECIES_WINGULL}, + {27, 27, SPECIES_WINGULL}, + {26, 26, SPECIES_WINGULL}, + {28, 28, SPECIES_WINGULL}, +}; +const struct WildPokemonInfo MtPyre_Exterior_LandMonsInfo = {10, MtPyre_Exterior_LandMons}; + +const struct WildPokemon MtPyre_Summit_LandMons [] = +{ +#ifdef SAPPHIRE + {28, 28, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {27, 27, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {30, 30, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {30, 30, SPECIES_DUSKULL}, +#else + {28, 28, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {27, 27, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {30, 30, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {30, 30, SPECIES_SHUPPET}, +#endif + {28, 28, SPECIES_CHIMECHO}, + {28, 28, SPECIES_CHIMECHO}, +}; +const struct WildPokemonInfo MtPyre_Summit_LandMonsInfo = {10, MtPyre_Summit_LandMons}; + +const struct WildPokemon SeafloorCavern_Entrance_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_GOLBAT}, + {30, 35, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Entrance_WaterMonsInfo = {4, SeafloorCavern_Entrance_WaterMons}; + +const struct WildPokemon SeafloorCavern_Entrance_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo SeafloorCavern_Entrance_FishingMonsInfo = {10, SeafloorCavern_Entrance_FishingMons}; + +const struct WildPokemon SeafloorCavern_Room1_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room1_LandMonsInfo = {4, SeafloorCavern_Room1_LandMons}; + +const struct WildPokemon SeafloorCavern_Room2_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room2_LandMonsInfo = {4, SeafloorCavern_Room2_LandMons}; + +const struct WildPokemon SeafloorCavern_Room3_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room3_LandMonsInfo = {4, SeafloorCavern_Room3_LandMons}; + +const struct WildPokemon SeafloorCavern_Room4_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room4_LandMonsInfo = {4, SeafloorCavern_Room4_LandMons}; + +const struct WildPokemon SeafloorCavern_Room5_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room5_LandMonsInfo = {4, SeafloorCavern_Room5_LandMons}; + +const struct WildPokemon SeafloorCavern_Room6_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room6_LandMonsInfo = {4, SeafloorCavern_Room6_LandMons}; + +const struct WildPokemon SeafloorCavern_Room6_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_GOLBAT}, + {30, 35, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room6_WaterMonsInfo = {4, SeafloorCavern_Room6_WaterMons}; + +const struct WildPokemon SeafloorCavern_Room6_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo SeafloorCavern_Room6_FishingMonsInfo = {10, SeafloorCavern_Room6_FishingMons}; + +const struct WildPokemon SeafloorCavern_Room7_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room7_LandMonsInfo = {4, SeafloorCavern_Room7_LandMons}; + +const struct WildPokemon SeafloorCavern_Room7_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_GOLBAT}, + {30, 35, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room7_WaterMonsInfo = {4, SeafloorCavern_Room7_WaterMons}; + +const struct WildPokemon SeafloorCavern_Room7_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo SeafloorCavern_Room7_FishingMonsInfo = {10, SeafloorCavern_Room7_FishingMons}; + +const struct WildPokemon SeafloorCavern_Room8_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room8_LandMonsInfo = {4, SeafloorCavern_Room8_LandMons}; + +const struct WildPokemon CaveOfOrigin_Entrance_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo CaveOfOrigin_Entrance_LandMonsInfo = {4, CaveOfOrigin_Entrance_LandMons}; + +const struct WildPokemon CaveOfOrigin_1F_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, +#ifdef SAPPHIRE + {30, 30, SPECIES_SABLEYE}, + {32, 32, SPECIES_SABLEYE}, + {34, 34, SPECIES_SABLEYE}, +#else + {30, 30, SPECIES_MAWILE}, + {32, 32, SPECIES_MAWILE}, + {34, 34, SPECIES_MAWILE}, +#endif + {33, 33, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo CaveOfOrigin_1F_LandMonsInfo = {4, CaveOfOrigin_1F_LandMons}; + +const struct WildPokemon CaveOfOrigin_B1F_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, +#ifdef SAPPHIRE + {30, 30, SPECIES_SABLEYE}, + {32, 32, SPECIES_SABLEYE}, + {34, 34, SPECIES_SABLEYE}, +#else + {30, 30, SPECIES_MAWILE}, + {32, 32, SPECIES_MAWILE}, + {34, 34, SPECIES_MAWILE}, +#endif + {33, 33, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo CaveOfOrigin_B1F_LandMonsInfo = {4, CaveOfOrigin_B1F_LandMons}; + +const struct WildPokemon CaveOfOrigin_B2F_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, +#ifdef SAPPHIRE + {30, 30, SPECIES_SABLEYE}, + {32, 32, SPECIES_SABLEYE}, + {34, 34, SPECIES_SABLEYE}, +#else + {30, 30, SPECIES_MAWILE}, + {32, 32, SPECIES_MAWILE}, + {34, 34, SPECIES_MAWILE}, +#endif + {33, 33, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo CaveOfOrigin_B2F_LandMonsInfo = {4, CaveOfOrigin_B2F_LandMons}; + +const struct WildPokemon CaveOfOrigin_B3F_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, +#ifdef SAPPHIRE + {30, 30, SPECIES_SABLEYE}, + {32, 32, SPECIES_SABLEYE}, + {34, 34, SPECIES_SABLEYE}, +#else + {30, 30, SPECIES_MAWILE}, + {32, 32, SPECIES_MAWILE}, + {34, 34, SPECIES_MAWILE}, +#endif + {33, 33, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo CaveOfOrigin_B3F_LandMonsInfo = {4, CaveOfOrigin_B3F_LandMons}; + +const struct WildPokemon VictoryRoad_1F_LandMons [] = +{ + {40, 40, SPECIES_GOLBAT}, + {40, 40, SPECIES_HARIYAMA}, + {40, 40, SPECIES_LAIRON}, + {40, 40, SPECIES_LOUDRED}, + {36, 36, SPECIES_ZUBAT}, + {36, 36, SPECIES_MAKUHITA}, + {38, 38, SPECIES_GOLBAT}, + {38, 38, SPECIES_HARIYAMA}, + {36, 36, SPECIES_ARON}, + {36, 36, SPECIES_WHISMUR}, + {36, 36, SPECIES_ARON}, + {36, 36, SPECIES_WHISMUR}, +}; +const struct WildPokemonInfo VictoryRoad_1F_LandMonsInfo = {10, VictoryRoad_1F_LandMons}; + +const struct WildPokemon VictoryRoad_B1F_LandMons [] = +{ + {40, 40, SPECIES_GOLBAT}, + {40, 40, SPECIES_HARIYAMA}, + {40, 40, SPECIES_LAIRON}, + {40, 40, SPECIES_MEDICHAM}, + {38, 38, SPECIES_GOLBAT}, + {38, 38, SPECIES_HARIYAMA}, + {42, 42, SPECIES_GOLBAT}, + {42, 42, SPECIES_HARIYAMA}, + {42, 42, SPECIES_LAIRON}, + {38, 38, SPECIES_MEDITITE}, + {42, 42, SPECIES_LAIRON}, + {38, 38, SPECIES_MEDITITE}, +}; +const struct WildPokemonInfo VictoryRoad_B1F_LandMonsInfo = {10, VictoryRoad_B1F_LandMons}; + +const struct WildPokemon VictoryRoad_B1F_RockSmashMons [] = +{ + {30, 40, SPECIES_GRAVELER}, + {30, 40, SPECIES_GEODUDE}, + {35, 40, SPECIES_GRAVELER}, + {35, 40, SPECIES_GRAVELER}, + {35, 40, SPECIES_GRAVELER}, +}; +const struct WildPokemonInfo VictoryRoad_B1F_RockSmashMonsInfo = {20, VictoryRoad_B1F_RockSmashMons}; + +const struct WildPokemon VictoryRoad_B2F_LandMons [] = +{ + {40, 40, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {40, 40, SPECIES_SABLEYE}, +#else + {40, 40, SPECIES_MAWILE}, +#endif + {40, 40, SPECIES_LAIRON}, + {40, 40, SPECIES_MEDICHAM}, + {42, 42, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {42, 42, SPECIES_SABLEYE}, +#else + {42, 42, SPECIES_MAWILE}, +#endif + {44, 44, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {44, 44, SPECIES_SABLEYE}, +#else + {44, 44, SPECIES_MAWILE}, +#endif + {42, 42, SPECIES_LAIRON}, + {42, 42, SPECIES_MEDICHAM}, + {44, 44, SPECIES_LAIRON}, + {44, 44, SPECIES_MEDICHAM}, +}; +const struct WildPokemonInfo VictoryRoad_B2F_LandMonsInfo = {10, VictoryRoad_B2F_LandMons}; + +const struct WildPokemon VictoryRoad_B2F_WaterMons [] = +{ + {30, 35, SPECIES_GOLBAT}, + {25, 30, SPECIES_GOLBAT}, + {35, 40, SPECIES_GOLBAT}, + {35, 40, SPECIES_GOLBAT}, + {35, 40, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo VictoryRoad_B2F_WaterMonsInfo = {4, VictoryRoad_B2F_WaterMons}; + +const struct WildPokemon VictoryRoad_B2F_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {30, 35, SPECIES_WHISCASH}, + {35, 40, SPECIES_WHISCASH}, + {40, 45, SPECIES_WHISCASH}, +}; +const struct WildPokemonInfo VictoryRoad_B2F_FishingMonsInfo = {30, VictoryRoad_B2F_FishingMons}; + +const struct WildPokemon ShoalCave_LowTideEntranceRoom_LandMons [] = +{ + {26, 26, SPECIES_ZUBAT}, + {26, 26, SPECIES_SPHEAL}, + {28, 28, SPECIES_ZUBAT}, + {28, 28, SPECIES_SPHEAL}, + {30, 30, SPECIES_ZUBAT}, + {30, 30, SPECIES_SPHEAL}, + {32, 32, SPECIES_ZUBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, +}; +const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_LandMonsInfo = {10, ShoalCave_LowTideEntranceRoom_LandMons}; + +const struct WildPokemon ShoalCave_LowTideEntranceRoom_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_ZUBAT}, + {25, 30, SPECIES_SPHEAL}, + {25, 30, SPECIES_SPHEAL}, + {25, 35, SPECIES_SPHEAL}, +}; +const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_WaterMonsInfo = {4, ShoalCave_LowTideEntranceRoom_WaterMons}; + +const struct WildPokemon ShoalCave_LowTideEntranceRoom_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_FishingMonsInfo = {10, ShoalCave_LowTideEntranceRoom_FishingMons}; + +const struct WildPokemon ShoalCave_LowTideInnerRoom_LandMons [] = +{ + {26, 26, SPECIES_ZUBAT}, + {26, 26, SPECIES_SPHEAL}, + {28, 28, SPECIES_ZUBAT}, + {28, 28, SPECIES_SPHEAL}, + {30, 30, SPECIES_ZUBAT}, + {30, 30, SPECIES_SPHEAL}, + {32, 32, SPECIES_ZUBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, +}; +const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_LandMonsInfo = {10, ShoalCave_LowTideInnerRoom_LandMons}; + +const struct WildPokemon ShoalCave_LowTideInnerRoom_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_ZUBAT}, + {25, 30, SPECIES_SPHEAL}, + {25, 30, SPECIES_SPHEAL}, + {25, 35, SPECIES_SPHEAL}, +}; +const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_WaterMonsInfo = {4, ShoalCave_LowTideInnerRoom_WaterMons}; + +const struct WildPokemon ShoalCave_LowTideInnerRoom_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_FishingMonsInfo = {10, ShoalCave_LowTideInnerRoom_FishingMons}; + +const struct WildPokemon ShoalCave_LowTideStairsRoom_LandMons [] = +{ + {26, 26, SPECIES_ZUBAT}, + {26, 26, SPECIES_SPHEAL}, + {28, 28, SPECIES_ZUBAT}, + {28, 28, SPECIES_SPHEAL}, + {30, 30, SPECIES_ZUBAT}, + {30, 30, SPECIES_SPHEAL}, + {32, 32, SPECIES_ZUBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, +}; +const struct WildPokemonInfo ShoalCave_LowTideStairsRoom_LandMonsInfo = {10, ShoalCave_LowTideStairsRoom_LandMons}; + +const struct WildPokemon ShoalCave_LowTideLowerRoom_LandMons [] = +{ + {26, 26, SPECIES_ZUBAT}, + {26, 26, SPECIES_SPHEAL}, + {28, 28, SPECIES_ZUBAT}, + {28, 28, SPECIES_SPHEAL}, + {30, 30, SPECIES_ZUBAT}, + {30, 30, SPECIES_SPHEAL}, + {32, 32, SPECIES_ZUBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, +}; +const struct WildPokemonInfo ShoalCave_LowTideLowerRoom_LandMonsInfo = {10, ShoalCave_LowTideLowerRoom_LandMons}; + +const struct WildPokemon ShoalCave_LowTideIceRoom_LandMons [] = +{ + {26, 26, SPECIES_ZUBAT}, + {26, 26, SPECIES_SPHEAL}, + {28, 28, SPECIES_ZUBAT}, + {28, 28, SPECIES_SPHEAL}, + {30, 30, SPECIES_ZUBAT}, + {30, 30, SPECIES_SPHEAL}, + {26, 26, SPECIES_SNORUNT}, + {32, 32, SPECIES_SPHEAL}, + {30, 30, SPECIES_GOLBAT}, + {28, 28, SPECIES_SNORUNT}, + {32, 32, SPECIES_GOLBAT}, + {30, 30, SPECIES_SNORUNT}, +}; +const struct WildPokemonInfo ShoalCave_LowTideIceRoom_LandMonsInfo = {10, ShoalCave_LowTideIceRoom_LandMons}; + +const struct WildPokemon NewMauville_Entrance_LandMons [] = +{ + {24, 24, SPECIES_VOLTORB}, + {24, 24, SPECIES_MAGNEMITE}, + {25, 25, SPECIES_VOLTORB}, + {25, 25, SPECIES_MAGNEMITE}, + {23, 23, SPECIES_VOLTORB}, + {23, 23, SPECIES_MAGNEMITE}, + {26, 26, SPECIES_VOLTORB}, + {26, 26, SPECIES_MAGNEMITE}, + {22, 22, SPECIES_VOLTORB}, + {22, 22, SPECIES_MAGNEMITE}, + {22, 22, SPECIES_VOLTORB}, + {22, 22, SPECIES_MAGNEMITE}, +}; +const struct WildPokemonInfo NewMauville_Entrance_LandMonsInfo = {10, NewMauville_Entrance_LandMons}; + +const struct WildPokemon NewMauville_Inside_LandMons [] = +{ + {24, 24, SPECIES_VOLTORB}, + {24, 24, SPECIES_MAGNEMITE}, + {25, 25, SPECIES_VOLTORB}, + {25, 25, SPECIES_MAGNEMITE}, + {23, 23, SPECIES_VOLTORB}, + {23, 23, SPECIES_MAGNEMITE}, + {26, 26, SPECIES_VOLTORB}, + {26, 26, SPECIES_MAGNEMITE}, + {22, 22, SPECIES_VOLTORB}, + {22, 22, SPECIES_MAGNEMITE}, + {26, 26, SPECIES_ELECTRODE}, + {26, 26, SPECIES_MAGNETON}, +}; +const struct WildPokemonInfo NewMauville_Inside_LandMonsInfo = {10, NewMauville_Inside_LandMons}; + +const struct WildPokemon AbandonedShip_Rooms_B1F_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_TENTACOOL}, + {30, 35, SPECIES_TENTACRUEL}, +}; +const struct WildPokemonInfo AbandonedShip_Rooms_B1F_WaterMonsInfo = {4, AbandonedShip_Rooms_B1F_WaterMons}; + +const struct WildPokemon AbandonedShip_Rooms_B1F_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_TENTACOOL}, + {25, 30, SPECIES_TENTACOOL}, + {30, 35, SPECIES_TENTACOOL}, + {30, 35, SPECIES_TENTACRUEL}, + {25, 30, SPECIES_TENTACRUEL}, + {20, 25, SPECIES_TENTACRUEL}, +}; +const struct WildPokemonInfo AbandonedShip_Rooms_B1F_FishingMonsInfo = {20, AbandonedShip_Rooms_B1F_FishingMons}; + +const struct WildPokemon AbandonedShip_HiddenFloorCorridors_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_TENTACOOL}, + {30, 35, SPECIES_TENTACRUEL}, +}; +const struct WildPokemonInfo AbandonedShip_HiddenFloorCorridors_WaterMonsInfo = {4, AbandonedShip_HiddenFloorCorridors_WaterMons}; + +const struct WildPokemon AbandonedShip_HiddenFloorCorridors_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_TENTACOOL}, + {25, 30, SPECIES_TENTACOOL}, + {30, 35, SPECIES_TENTACOOL}, + {30, 35, SPECIES_TENTACRUEL}, + {25, 30, SPECIES_TENTACRUEL}, + {20, 25, SPECIES_TENTACRUEL}, +}; +const struct WildPokemonInfo AbandonedShip_HiddenFloorCorridors_FishingMonsInfo = {20, AbandonedShip_HiddenFloorCorridors_FishingMons}; + +const struct WildPokemon SkyPillar_1F_LandMons [] = +{ +#ifdef SAPPHIRE + {48, 48, SPECIES_SABLEYE}, +#else + {48, 48, SPECIES_MAWILE}, +#endif + {48, 48, SPECIES_GOLBAT}, + {50, 50, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {50, 50, SPECIES_SABLEYE}, +#else + {50, 50, SPECIES_MAWILE}, +#endif + {48, 48, SPECIES_CLAYDOL}, +#ifdef SAPPHIRE + {48, 48, SPECIES_BANETTE}, + {50, 50, SPECIES_BANETTE}, +#else + {48, 48, SPECIES_DUSCLOPS}, + {50, 50, SPECIES_DUSCLOPS}, +#endif + {49, 49, SPECIES_CLAYDOL}, + {47, 47, SPECIES_CLAYDOL}, + {50, 50, SPECIES_CLAYDOL}, + {47, 47, SPECIES_CLAYDOL}, + {50, 50, SPECIES_CLAYDOL}, +}; +const struct WildPokemonInfo SkyPillar_1F_LandMonsInfo = {10, SkyPillar_1F_LandMons}; + +const struct WildPokemon SkyPillar_3F_LandMons [] = +{ +#ifdef SAPPHIRE + {51, 51, SPECIES_SABLEYE}, +#else + {51, 51, SPECIES_MAWILE}, +#endif + {51, 51, SPECIES_GOLBAT}, + {53, 53, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {53, 53, SPECIES_SABLEYE}, +#else + {53, 53, SPECIES_MAWILE}, +#endif + {51, 51, SPECIES_CLAYDOL}, +#ifdef SAPPHIRE + {51, 51, SPECIES_BANETTE}, + {53, 53, SPECIES_BANETTE}, +#else + {51, 51, SPECIES_DUSCLOPS}, + {53, 53, SPECIES_DUSCLOPS}, +#endif + {52, 52, SPECIES_CLAYDOL}, + {50, 50, SPECIES_CLAYDOL}, + {53, 53, SPECIES_CLAYDOL}, + {50, 50, SPECIES_CLAYDOL}, + {53, 53, SPECIES_CLAYDOL}, +}; +const struct WildPokemonInfo SkyPillar_3F_LandMonsInfo = {10, SkyPillar_3F_LandMons}; + +const struct WildPokemon SkyPillar_5F_LandMons [] = +{ +#ifdef SAPPHIRE + {54, 54, SPECIES_SABLEYE}, +#else + {54, 54, SPECIES_MAWILE}, +#endif + {54, 54, SPECIES_GOLBAT}, + {56, 56, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {56, 56, SPECIES_SABLEYE}, +#else + {56, 56, SPECIES_MAWILE}, +#endif + {54, 54, SPECIES_CLAYDOL}, +#ifdef SAPPHIRE + {54, 54, SPECIES_BANETTE}, + {56, 56, SPECIES_BANETTE}, +#else + {54, 54, SPECIES_DUSCLOPS}, + {56, 56, SPECIES_DUSCLOPS}, +#endif + {55, 55, SPECIES_CLAYDOL}, + {56, 56, SPECIES_CLAYDOL}, + {57, 57, SPECIES_ALTARIA}, + {54, 54, SPECIES_ALTARIA}, + {60, 60, SPECIES_ALTARIA}, +}; +const struct WildPokemonInfo SkyPillar_5F_LandMonsInfo = {10, SkyPillar_5F_LandMons}; + +const struct WildPokemon Route101_LandMons [] = +{ + {2, 2, SPECIES_WURMPLE}, + {2, 2, SPECIES_ZIGZAGOON}, + {2, 2, SPECIES_WURMPLE}, + {3, 3, SPECIES_WURMPLE}, + {3, 3, SPECIES_ZIGZAGOON}, + {3, 3, SPECIES_ZIGZAGOON}, + {3, 3, SPECIES_WURMPLE}, + {3, 3, SPECIES_ZIGZAGOON}, + {2, 2, SPECIES_POOCHYENA}, + {2, 2, SPECIES_POOCHYENA}, + {3, 3, SPECIES_POOCHYENA}, + {3, 3, SPECIES_POOCHYENA}, +}; +const struct WildPokemonInfo Route101_LandMonsInfo = {20, Route101_LandMons}; + +const struct WildPokemon Route102_LandMons [] = +{ + {3, 3, SPECIES_ZIGZAGOON}, + {3, 3, SPECIES_WURMPLE}, + {4, 4, SPECIES_ZIGZAGOON}, + {4, 4, SPECIES_WURMPLE}, +#ifdef SAPPHIRE + {3, 3, SPECIES_LOTAD}, + {4, 4, SPECIES_LOTAD}, +#else + {3, 3, SPECIES_SEEDOT}, + {4, 4, SPECIES_SEEDOT}, +#endif + {3, 3, SPECIES_POOCHYENA}, + {3, 3, SPECIES_POOCHYENA}, + {4, 4, SPECIES_POOCHYENA}, + {4, 4, SPECIES_RALTS}, + {4, 4, SPECIES_POOCHYENA}, + {3, 3, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route102_LandMonsInfo = {20, Route102_LandMons}; + +const struct WildPokemon Route102_WaterMons [] = +{ + {20, 30, SPECIES_MARILL}, + {10, 20, SPECIES_MARILL}, + {30, 35, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, + {20, 30, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route102_WaterMonsInfo = {4, Route102_WaterMons}; + +const struct WildPokemon Route102_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_CORPHISH}, + {25, 30, SPECIES_CORPHISH}, + {30, 35, SPECIES_CORPHISH}, + {20, 25, SPECIES_CORPHISH}, + {35, 40, SPECIES_CORPHISH}, + {40, 45, SPECIES_CORPHISH}, +}; +const struct WildPokemonInfo Route102_FishingMonsInfo = {30, Route102_FishingMons}; + +const struct WildPokemon Route103_LandMons [] = +{ + {2, 2, SPECIES_ZIGZAGOON}, + {3, 3, SPECIES_ZIGZAGOON}, + {3, 3, SPECIES_ZIGZAGOON}, + {4, 4, SPECIES_ZIGZAGOON}, + {2, 2, SPECIES_POOCHYENA}, + {3, 3, SPECIES_POOCHYENA}, + {3, 3, SPECIES_POOCHYENA}, + {4, 4, SPECIES_POOCHYENA}, + {3, 3, SPECIES_WINGULL}, + {3, 3, SPECIES_WINGULL}, + {2, 2, SPECIES_WINGULL}, + {4, 4, SPECIES_WINGULL}, +}; +const struct WildPokemonInfo Route103_LandMonsInfo = {20, Route103_LandMons}; + +const struct WildPokemon Route103_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route103_WaterMonsInfo = {4, Route103_WaterMons}; + +const struct WildPokemon Route103_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route103_FishingMonsInfo = {30, Route103_FishingMons}; + +const struct WildPokemon Route104_LandMons [] = +{ + {4, 4, SPECIES_ZIGZAGOON}, + {4, 4, SPECIES_WURMPLE}, + {5, 5, SPECIES_ZIGZAGOON}, + {5, 5, SPECIES_WURMPLE}, + {4, 4, SPECIES_ZIGZAGOON}, + {5, 5, SPECIES_ZIGZAGOON}, + {4, 4, SPECIES_TAILLOW}, + {5, 5, SPECIES_TAILLOW}, + {4, 4, SPECIES_WINGULL}, + {4, 4, SPECIES_WINGULL}, + {3, 3, SPECIES_WINGULL}, + {5, 5, SPECIES_WINGULL}, +}; +const struct WildPokemonInfo Route104_LandMonsInfo = {20, Route104_LandMons}; + +const struct WildPokemon Route104_WaterMons [] = +{ + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route104_WaterMonsInfo = {4, Route104_WaterMons}; + +const struct WildPokemon Route104_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_MAGIKARP}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_MAGIKARP}, + {25, 30, SPECIES_MAGIKARP}, + {30, 35, SPECIES_MAGIKARP}, + {20, 25, SPECIES_MAGIKARP}, + {35, 40, SPECIES_MAGIKARP}, + {40, 45, SPECIES_MAGIKARP}, +}; +const struct WildPokemonInfo Route104_FishingMonsInfo = {30, Route104_FishingMons}; + +const struct WildPokemon Route105_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route105_WaterMonsInfo = {4, Route105_WaterMons}; + +const struct WildPokemon Route105_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route105_FishingMonsInfo = {30, Route105_FishingMons}; + +const struct WildPokemon Route106_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route106_WaterMonsInfo = {4, Route106_WaterMons}; + +const struct WildPokemon Route106_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route106_FishingMonsInfo = {30, Route106_FishingMons}; + +const struct WildPokemon Route107_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route107_WaterMonsInfo = {4, Route107_WaterMons}; + +const struct WildPokemon Route107_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route107_FishingMonsInfo = {30, Route107_FishingMons}; + +const struct WildPokemon Route108_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route108_WaterMonsInfo = {4, Route108_WaterMons}; + +const struct WildPokemon Route108_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route108_FishingMonsInfo = {30, Route108_FishingMons}; + +const struct WildPokemon Route109_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route109_WaterMonsInfo = {4, Route109_WaterMons}; + +const struct WildPokemon Route109_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route109_FishingMonsInfo = {30, Route109_FishingMons}; + +const struct WildPokemon Route110_LandMons [] = +{ + {12, 12, SPECIES_ZIGZAGOON}, + {12, 12, SPECIES_ELECTRIKE}, + {12, 12, SPECIES_GULPIN}, + {13, 13, SPECIES_ELECTRIKE}, +#ifdef SAPPHIRE + {13, 13, SPECIES_PLUSLE}, +#else + {13, 13, SPECIES_MINUN}, +#endif + {13, 13, SPECIES_ODDISH}, +#ifdef SAPPHIRE + {13, 13, SPECIES_PLUSLE}, +#else + {13, 13, SPECIES_MINUN}, +#endif + {13, 13, SPECIES_GULPIN}, + {12, 12, SPECIES_WINGULL}, + {12, 12, SPECIES_WINGULL}, +#ifdef SAPPHIRE + {12, 12, SPECIES_MINUN}, + {13, 13, SPECIES_MINUN}, +#else + {12, 12, SPECIES_PLUSLE}, + {13, 13, SPECIES_PLUSLE}, +#endif +}; +const struct WildPokemonInfo Route110_LandMonsInfo = {20, Route110_LandMons}; + +const struct WildPokemon Route110_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route110_WaterMonsInfo = {4, Route110_WaterMons}; + +const struct WildPokemon Route110_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route110_FishingMonsInfo = {30, Route110_FishingMons}; + +const struct WildPokemon Route111_LandMons [] = +{ + {20, 20, SPECIES_SANDSHREW}, + {20, 20, SPECIES_TRAPINCH}, + {21, 21, SPECIES_SANDSHREW}, + {21, 21, SPECIES_TRAPINCH}, + {19, 19, SPECIES_CACNEA}, + {21, 21, SPECIES_CACNEA}, + {19, 19, SPECIES_SANDSHREW}, + {19, 19, SPECIES_TRAPINCH}, + {20, 20, SPECIES_BALTOY}, + {20, 20, SPECIES_BALTOY}, + {22, 22, SPECIES_BALTOY}, + {22, 22, SPECIES_BALTOY}, +}; +const struct WildPokemonInfo Route111_LandMonsInfo = {10, Route111_LandMons}; + +const struct WildPokemon Route111_WaterMons [] = +{ + {20, 30, SPECIES_MARILL}, + {10, 20, SPECIES_MARILL}, + {30, 35, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, + {20, 30, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route111_WaterMonsInfo = {4, Route111_WaterMons}; + +const struct WildPokemon Route111_RockSmashMons [] = +{ + {10, 15, SPECIES_GEODUDE}, + {5, 10, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, +}; +const struct WildPokemonInfo Route111_RockSmashMonsInfo = {20, Route111_RockSmashMons}; + +const struct WildPokemon Route111_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {20, 25, SPECIES_BARBOACH}, + {35, 40, SPECIES_BARBOACH}, + {40, 45, SPECIES_BARBOACH}, +}; +const struct WildPokemonInfo Route111_FishingMonsInfo = {30, Route111_FishingMons}; + +const struct WildPokemon Route112_LandMons [] = +{ + {15, 15, SPECIES_NUMEL}, + {15, 15, SPECIES_NUMEL}, + {15, 15, SPECIES_MACHOP}, + {14, 14, SPECIES_NUMEL}, + {14, 14, SPECIES_NUMEL}, + {14, 14, SPECIES_MACHOP}, + {16, 16, SPECIES_NUMEL}, + {16, 16, SPECIES_MACHOP}, + {16, 16, SPECIES_NUMEL}, + {16, 16, SPECIES_NUMEL}, + {16, 16, SPECIES_NUMEL}, + {16, 16, SPECIES_NUMEL}, +}; +const struct WildPokemonInfo Route112_LandMonsInfo = {20, Route112_LandMons}; + +const struct WildPokemon Route113_LandMons [] = +{ + {15, 15, SPECIES_SPINDA}, + {15, 15, SPECIES_SPINDA}, + {15, 15, SPECIES_SANDSHREW}, + {14, 14, SPECIES_SPINDA}, + {14, 14, SPECIES_SPINDA}, + {14, 14, SPECIES_SANDSHREW}, + {16, 16, SPECIES_SPINDA}, + {16, 16, SPECIES_SANDSHREW}, + {16, 16, SPECIES_SPINDA}, + {16, 16, SPECIES_SKARMORY}, + {16, 16, SPECIES_SPINDA}, + {16, 16, SPECIES_SKARMORY}, +}; +const struct WildPokemonInfo Route113_LandMonsInfo = {20, Route113_LandMons}; + +const struct WildPokemon Route114_LandMons [] = +{ + {16, 16, SPECIES_SWABLU}, +#ifdef SAPPHIRE + {16, 16, SPECIES_LOTAD}, +#else + {16, 16, SPECIES_SEEDOT}, +#endif + {17, 17, SPECIES_SWABLU}, + {15, 15, SPECIES_SWABLU}, +#ifdef SAPPHIRE + {15, 15, SPECIES_LOTAD}, + {16, 16, SPECIES_SEVIPER}, + {16, 16, SPECIES_LOMBRE}, + {18, 18, SPECIES_LOMBRE}, + {17, 17, SPECIES_SEVIPER}, + {15, 15, SPECIES_SEVIPER}, + {17, 17, SPECIES_SEVIPER}, +#else + {15, 15, SPECIES_SEEDOT}, + {16, 16, SPECIES_ZANGOOSE}, + {16, 16, SPECIES_NUZLEAF}, + {18, 18, SPECIES_NUZLEAF}, + {17, 17, SPECIES_ZANGOOSE}, + {15, 15, SPECIES_ZANGOOSE}, + {17, 17, SPECIES_ZANGOOSE}, +#endif + {15, 15, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route114_LandMonsInfo = {20, Route114_LandMons}; + +const struct WildPokemon Route114_WaterMons [] = +{ + {20, 30, SPECIES_MARILL}, + {10, 20, SPECIES_MARILL}, + {30, 35, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, + {20, 30, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route114_WaterMonsInfo = {4, Route114_WaterMons}; + +const struct WildPokemon Route114_RockSmashMons [] = +{ + {10, 15, SPECIES_GEODUDE}, + {5, 10, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, +}; +const struct WildPokemonInfo Route114_RockSmashMonsInfo = {20, Route114_RockSmashMons}; + +const struct WildPokemon Route114_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {20, 25, SPECIES_BARBOACH}, + {35, 40, SPECIES_BARBOACH}, + {40, 45, SPECIES_BARBOACH}, +}; +const struct WildPokemonInfo Route114_FishingMonsInfo = {30, Route114_FishingMons}; + +const struct WildPokemon Route115_LandMons [] = +{ + {23, 23, SPECIES_SWABLU}, + {23, 23, SPECIES_TAILLOW}, + {25, 25, SPECIES_SWABLU}, + {24, 24, SPECIES_TAILLOW}, + {25, 25, SPECIES_TAILLOW}, + {25, 25, SPECIES_SWELLOW}, + {24, 24, SPECIES_JIGGLYPUFF}, + {25, 25, SPECIES_JIGGLYPUFF}, + {24, 24, SPECIES_WINGULL}, + {24, 24, SPECIES_WINGULL}, + {26, 26, SPECIES_WINGULL}, + {25, 25, SPECIES_WINGULL}, +}; +const struct WildPokemonInfo Route115_LandMonsInfo = {20, Route115_LandMons}; + +const struct WildPokemon Route115_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route115_WaterMonsInfo = {4, Route115_WaterMons}; + +const struct WildPokemon Route115_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route115_FishingMonsInfo = {30, Route115_FishingMons}; + +const struct WildPokemon Route116_LandMons [] = +{ + {6, 6, SPECIES_ZIGZAGOON}, + {6, 6, SPECIES_WHISMUR}, + {6, 6, SPECIES_NINCADA}, + {7, 7, SPECIES_WHISMUR}, + {7, 7, SPECIES_NINCADA}, + {6, 6, SPECIES_TAILLOW}, + {7, 7, SPECIES_TAILLOW}, + {8, 8, SPECIES_TAILLOW}, + {7, 7, SPECIES_ZIGZAGOON}, + {8, 8, SPECIES_ZIGZAGOON}, + {7, 7, SPECIES_SKITTY}, + {8, 8, SPECIES_SKITTY}, +}; +const struct WildPokemonInfo Route116_LandMonsInfo = {20, Route116_LandMons}; + +const struct WildPokemon Route117_LandMons [] = +{ + {13, 13, SPECIES_ZIGZAGOON}, + {13, 13, SPECIES_ROSELIA}, + {14, 14, SPECIES_ZIGZAGOON}, + {14, 14, SPECIES_ROSELIA}, + {13, 13, SPECIES_MARILL}, + {13, 13, SPECIES_ODDISH}, +#ifdef SAPPHIRE + {13, 13, SPECIES_VOLBEAT}, + {13, 13, SPECIES_VOLBEAT}, + {14, 14, SPECIES_VOLBEAT}, + {14, 14, SPECIES_VOLBEAT}, + {13, 13, SPECIES_ILLUMISE}, +#else + {13, 13, SPECIES_ILLUMISE}, + {13, 13, SPECIES_ILLUMISE}, + {14, 14, SPECIES_ILLUMISE}, + {14, 14, SPECIES_ILLUMISE}, + {13, 13, SPECIES_VOLBEAT}, +#endif + {13, 13, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route117_LandMonsInfo = {20, Route117_LandMons}; + +const struct WildPokemon Route117_WaterMons [] = +{ + {20, 30, SPECIES_MARILL}, + {10, 20, SPECIES_MARILL}, + {30, 35, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, + {20, 30, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route117_WaterMonsInfo = {4, Route117_WaterMons}; + +const struct WildPokemon Route117_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_CORPHISH}, + {25, 30, SPECIES_CORPHISH}, + {30, 35, SPECIES_CORPHISH}, + {20, 25, SPECIES_CORPHISH}, + {35, 40, SPECIES_CORPHISH}, + {40, 45, SPECIES_CORPHISH}, +}; +const struct WildPokemonInfo Route117_FishingMonsInfo = {30, Route117_FishingMons}; + +const struct WildPokemon Route118_LandMons [] = +{ + {24, 24, SPECIES_ZIGZAGOON}, + {24, 24, SPECIES_ELECTRIKE}, + {26, 26, SPECIES_ZIGZAGOON}, + {26, 26, SPECIES_ELECTRIKE}, + {26, 26, SPECIES_LINOONE}, + {26, 26, SPECIES_MANECTRIC}, + {25, 25, SPECIES_WINGULL}, + {25, 25, SPECIES_WINGULL}, + {26, 26, SPECIES_WINGULL}, + {26, 26, SPECIES_WINGULL}, + {27, 27, SPECIES_WINGULL}, + {25, 25, SPECIES_KECLEON}, +}; +const struct WildPokemonInfo Route118_LandMonsInfo = {20, Route118_LandMons}; + +const struct WildPokemon Route118_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route118_WaterMonsInfo = {4, Route118_WaterMons}; + +const struct WildPokemon Route118_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_CARVANHA}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_CARVANHA}, + {20, 25, SPECIES_CARVANHA}, + {35, 40, SPECIES_CARVANHA}, + {40, 45, SPECIES_CARVANHA}, +}; +const struct WildPokemonInfo Route118_FishingMonsInfo = {30, Route118_FishingMons}; + +const struct WildPokemon Route119_LandMons [] = +{ + {25, 25, SPECIES_ZIGZAGOON}, + {25, 25, SPECIES_LINOONE}, + {27, 27, SPECIES_ZIGZAGOON}, + {25, 25, SPECIES_ODDISH}, + {27, 27, SPECIES_LINOONE}, + {26, 26, SPECIES_ODDISH}, + {27, 27, SPECIES_ODDISH}, + {24, 24, SPECIES_ODDISH}, + {25, 25, SPECIES_TROPIUS}, + {26, 26, SPECIES_TROPIUS}, + {27, 27, SPECIES_TROPIUS}, + {25, 25, SPECIES_KECLEON}, +}; +const struct WildPokemonInfo Route119_LandMonsInfo = {15, Route119_LandMons}; + +const struct WildPokemon Route119_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route119_WaterMonsInfo = {4, Route119_WaterMons}; + +const struct WildPokemon Route119_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_CARVANHA}, + {25, 30, SPECIES_CARVANHA}, + {30, 35, SPECIES_CARVANHA}, + {20, 25, SPECIES_CARVANHA}, + {35, 40, SPECIES_CARVANHA}, + {40, 45, SPECIES_CARVANHA}, +}; +const struct WildPokemonInfo Route119_FishingMonsInfo = {30, Route119_FishingMons}; + +const struct WildPokemon Route120_LandMons [] = +{ + {25, 25, SPECIES_ZIGZAGOON}, + {25, 25, SPECIES_LINOONE}, + {27, 27, SPECIES_LINOONE}, + {25, 25, SPECIES_ODDISH}, + {25, 25, SPECIES_MARILL}, + {26, 26, SPECIES_ODDISH}, + {27, 27, SPECIES_ODDISH}, + {27, 27, SPECIES_MARILL}, + {25, 25, SPECIES_ABSOL}, + {27, 27, SPECIES_ABSOL}, + {25, 25, SPECIES_KECLEON}, + {25, 25, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route120_LandMonsInfo = {20, Route120_LandMons}; + +const struct WildPokemon Route120_WaterMons [] = +{ + {20, 30, SPECIES_MARILL}, + {10, 20, SPECIES_MARILL}, + {30, 35, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, + {20, 30, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route120_WaterMonsInfo = {4, Route120_WaterMons}; + +const struct WildPokemon Route120_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {20, 25, SPECIES_BARBOACH}, + {35, 40, SPECIES_BARBOACH}, + {40, 45, SPECIES_BARBOACH}, +}; +const struct WildPokemonInfo Route120_FishingMonsInfo = {30, Route120_FishingMons}; + +const struct WildPokemon Route121_LandMons [] = +{ + {26, 26, SPECIES_ZIGZAGOON}, +#ifdef SAPPHIRE + {26, 26, SPECIES_SHUPPET}, +#else + {26, 26, SPECIES_DUSKULL}, +#endif + {26, 26, SPECIES_LINOONE}, +#ifdef SAPPHIRE + {28, 28, SPECIES_SHUPPET}, +#else + {28, 28, SPECIES_DUSKULL}, +#endif + {28, 28, SPECIES_LINOONE}, + {26, 26, SPECIES_ODDISH}, + {28, 28, SPECIES_ODDISH}, + {28, 28, SPECIES_GLOOM}, + {26, 26, SPECIES_WINGULL}, + {27, 27, SPECIES_WINGULL}, + {28, 28, SPECIES_WINGULL}, + {25, 25, SPECIES_KECLEON}, +}; +const struct WildPokemonInfo Route121_LandMonsInfo = {20, Route121_LandMons}; + +const struct WildPokemon Route121_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route121_WaterMonsInfo = {4, Route121_WaterMons}; + +const struct WildPokemon Route121_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route121_FishingMonsInfo = {30, Route121_FishingMons}; + +const struct WildPokemon Route122_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route122_WaterMonsInfo = {4, Route122_WaterMons}; + +const struct WildPokemon Route122_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route122_FishingMonsInfo = {30, Route122_FishingMons}; + +const struct WildPokemon Route123_LandMons [] = +{ + {26, 26, SPECIES_ZIGZAGOON}, +#ifdef SAPPHIRE + {26, 26, SPECIES_SHUPPET}, +#else + {26, 26, SPECIES_DUSKULL}, +#endif + {26, 26, SPECIES_LINOONE}, +#ifdef SAPPHIRE + {28, 28, SPECIES_SHUPPET}, +#else + {28, 28, SPECIES_DUSKULL}, +#endif + {28, 28, SPECIES_LINOONE}, + {26, 26, SPECIES_ODDISH}, + {28, 28, SPECIES_ODDISH}, + {28, 28, SPECIES_GLOOM}, + {26, 26, SPECIES_WINGULL}, + {27, 27, SPECIES_WINGULL}, + {28, 28, SPECIES_WINGULL}, + {25, 25, SPECIES_KECLEON}, +}; +const struct WildPokemonInfo Route123_LandMonsInfo = {20, Route123_LandMons}; + +const struct WildPokemon Route123_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route123_WaterMonsInfo = {4, Route123_WaterMons}; + +const struct WildPokemon Route123_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route123_FishingMonsInfo = {30, Route123_FishingMons}; + +const struct WildPokemon Route124_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route124_WaterMonsInfo = {4, Route124_WaterMons}; + +const struct WildPokemon Route124_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route124_FishingMonsInfo = {30, Route124_FishingMons}; + +const struct WildPokemon Route125_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route125_WaterMonsInfo = {4, Route125_WaterMons}; + +const struct WildPokemon Route125_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route125_FishingMonsInfo = {30, Route125_FishingMons}; + +const struct WildPokemon Route126_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route126_WaterMonsInfo = {4, Route126_WaterMons}; + +const struct WildPokemon Route126_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route126_FishingMonsInfo = {30, Route126_FishingMons}; + +const struct WildPokemon Route127_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route127_WaterMonsInfo = {4, Route127_WaterMons}; + +const struct WildPokemon Route127_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route127_FishingMonsInfo = {30, Route127_FishingMons}; + +const struct WildPokemon Route128_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route128_WaterMonsInfo = {4, Route128_WaterMons}; + +const struct WildPokemon Route128_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_LUVDISC}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_LUVDISC}, + {30, 35, SPECIES_WAILMER}, + {30, 35, SPECIES_CORSOLA}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route128_FishingMonsInfo = {30, Route128_FishingMons}; + +const struct WildPokemon Route129_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, +#ifdef SAPPHIRE + {25, 30, SPECIES_WAILORD}, +#else + {35, 40, SPECIES_WAILORD}, +#endif +}; +const struct WildPokemonInfo Route129_WaterMonsInfo = {4, Route129_WaterMons}; + +const struct WildPokemon Route129_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route129_FishingMonsInfo = {30, Route129_FishingMons}; + +const struct WildPokemon Route130_LandMons [] = +{ + {30, 30, SPECIES_WYNAUT}, + {35, 35, SPECIES_WYNAUT}, + {25, 25, SPECIES_WYNAUT}, + {40, 40, SPECIES_WYNAUT}, + {20, 20, SPECIES_WYNAUT}, + {45, 45, SPECIES_WYNAUT}, + {15, 15, SPECIES_WYNAUT}, + {50, 50, SPECIES_WYNAUT}, + {10, 10, SPECIES_WYNAUT}, + {5, 5, SPECIES_WYNAUT}, + {10, 10, SPECIES_WYNAUT}, + {5, 5, SPECIES_WYNAUT}, +}; +const struct WildPokemonInfo Route130_LandMonsInfo = {20, Route130_LandMons}; + +const struct WildPokemon Route130_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route130_WaterMonsInfo = {4, Route130_WaterMons}; + +const struct WildPokemon Route130_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route130_FishingMonsInfo = {30, Route130_FishingMons}; + +const struct WildPokemon Route131_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route131_WaterMonsInfo = {4, Route131_WaterMons}; + +const struct WildPokemon Route131_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route131_FishingMonsInfo = {30, Route131_FishingMons}; + +const struct WildPokemon Route132_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route132_WaterMonsInfo = {4, Route132_WaterMons}; + +const struct WildPokemon Route132_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_HORSEA}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route132_FishingMonsInfo = {30, Route132_FishingMons}; + +const struct WildPokemon Route133_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route133_WaterMonsInfo = {4, Route133_WaterMons}; + +const struct WildPokemon Route133_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_HORSEA}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route133_FishingMonsInfo = {30, Route133_FishingMons}; + +const struct WildPokemon Route134_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route134_WaterMonsInfo = {4, Route134_WaterMons}; + +const struct WildPokemon Route134_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_HORSEA}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route134_FishingMonsInfo = {30, Route134_FishingMons}; + +const struct WildPokemon SafariZone_Northwest_LandMons [] = +{ + {27, 27, SPECIES_RHYHORN}, + {27, 27, SPECIES_ODDISH}, + {29, 29, SPECIES_RHYHORN}, + {29, 29, SPECIES_ODDISH}, + {27, 27, SPECIES_DODUO}, + {29, 29, SPECIES_GLOOM}, + {31, 31, SPECIES_GLOOM}, + {29, 29, SPECIES_DODUO}, + {29, 29, SPECIES_DODRIO}, + {27, 27, SPECIES_PINSIR}, + {31, 31, SPECIES_DODRIO}, + {29, 29, SPECIES_PINSIR}, +}; +const struct WildPokemonInfo SafariZone_Northwest_LandMonsInfo = {25, SafariZone_Northwest_LandMons}; + +const struct WildPokemon SafariZone_Northwest_WaterMons [] = +{ + {20, 30, SPECIES_PSYDUCK}, + {20, 30, SPECIES_PSYDUCK}, + {30, 35, SPECIES_PSYDUCK}, + {30, 35, SPECIES_GOLDUCK}, + {25, 40, SPECIES_GOLDUCK}, +}; +const struct WildPokemonInfo SafariZone_Northwest_WaterMonsInfo = {9, SafariZone_Northwest_WaterMons}; + +const struct WildPokemon SafariZone_Northwest_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 25, SPECIES_GOLDEEN}, + {10, 30, SPECIES_GOLDEEN}, + {25, 30, SPECIES_GOLDEEN}, + {30, 35, SPECIES_GOLDEEN}, + {30, 35, SPECIES_SEAKING}, + {35, 40, SPECIES_SEAKING}, + {25, 30, SPECIES_SEAKING}, +}; +const struct WildPokemonInfo SafariZone_Northwest_FishingMonsInfo = {35, SafariZone_Northwest_FishingMons}; + +const struct WildPokemon SafariZone_Northeast_LandMons [] = +{ + {27, 27, SPECIES_PHANPY}, + {27, 27, SPECIES_ODDISH}, + {29, 29, SPECIES_PHANPY}, + {29, 29, SPECIES_ODDISH}, + {27, 27, SPECIES_NATU}, + {29, 29, SPECIES_GLOOM}, + {31, 31, SPECIES_GLOOM}, + {29, 29, SPECIES_NATU}, + {29, 29, SPECIES_XATU}, + {27, 27, SPECIES_HERACROSS}, + {31, 31, SPECIES_XATU}, + {29, 29, SPECIES_HERACROSS}, +}; +const struct WildPokemonInfo SafariZone_Northeast_LandMonsInfo = {25, SafariZone_Northeast_LandMons}; + +const struct WildPokemon SafariZone_Northeast_RockSmashMons [] = +{ + {10, 15, SPECIES_GEODUDE}, + {5, 10, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, + {20, 25, SPECIES_GEODUDE}, + {25, 30, SPECIES_GEODUDE}, +}; +const struct WildPokemonInfo SafariZone_Northeast_RockSmashMonsInfo = {25, SafariZone_Northeast_RockSmashMons}; + +const struct WildPokemon SafariZone_Southwest_LandMons [] = +{ + {25, 25, SPECIES_ODDISH}, + {27, 27, SPECIES_ODDISH}, + {25, 25, SPECIES_GIRAFARIG}, + {27, 27, SPECIES_GIRAFARIG}, + {25, 25, SPECIES_NATU}, +#ifdef SAPPHIRE + {27, 27, SPECIES_DODUO}, +#else + {25, 25, SPECIES_DODUO}, +#endif + {25, 25, SPECIES_GLOOM}, + {27, 27, SPECIES_WOBBUFFET}, + {25, 25, SPECIES_PIKACHU}, + {27, 27, SPECIES_WOBBUFFET}, + {27, 27, SPECIES_PIKACHU}, + {29, 29, SPECIES_WOBBUFFET}, +}; +const struct WildPokemonInfo SafariZone_Southwest_LandMonsInfo = {25, SafariZone_Southwest_LandMons}; + +const struct WildPokemon SafariZone_Southwest_WaterMons [] = +{ + {20, 30, SPECIES_PSYDUCK}, + {20, 30, SPECIES_PSYDUCK}, + {30, 35, SPECIES_PSYDUCK}, + {30, 35, SPECIES_PSYDUCK}, + {30, 35, SPECIES_PSYDUCK}, +}; +const struct WildPokemonInfo SafariZone_Southwest_WaterMonsInfo = {9, SafariZone_Southwest_WaterMons}; + +const struct WildPokemon SafariZone_Southwest_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 25, SPECIES_GOLDEEN}, + {10, 30, SPECIES_GOLDEEN}, + {25, 30, SPECIES_GOLDEEN}, + {30, 35, SPECIES_GOLDEEN}, + {30, 35, SPECIES_SEAKING}, + {35, 40, SPECIES_SEAKING}, + {25, 30, SPECIES_SEAKING}, +}; +const struct WildPokemonInfo SafariZone_Southwest_FishingMonsInfo = {35, SafariZone_Southwest_FishingMons}; + +const struct WildPokemon SafariZone_Southeast_LandMons [] = +{ + {25, 25, SPECIES_ODDISH}, + {27, 27, SPECIES_ODDISH}, + {25, 25, SPECIES_GIRAFARIG}, + {27, 27, SPECIES_GIRAFARIG}, + {25, 25, SPECIES_NATU}, + {25, 25, SPECIES_DODUO}, + {25, 25, SPECIES_GLOOM}, + {27, 27, SPECIES_WOBBUFFET}, + {25, 25, SPECIES_PIKACHU}, + {27, 27, SPECIES_WOBBUFFET}, + {27, 27, SPECIES_PIKACHU}, + {29, 29, SPECIES_WOBBUFFET}, +}; +const struct WildPokemonInfo SafariZone_Southeast_LandMonsInfo = {25, SafariZone_Southeast_LandMons}; + +const struct WildPokemon DewfordTown_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo DewfordTown_WaterMonsInfo = {4, DewfordTown_WaterMons}; + +const struct WildPokemon DewfordTown_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo DewfordTown_FishingMonsInfo = {10, DewfordTown_FishingMons}; + +const struct WildPokemon PacifidlogTown_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo PacifidlogTown_WaterMonsInfo = {4, PacifidlogTown_WaterMons}; + +const struct WildPokemon PacifidlogTown_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo PacifidlogTown_FishingMonsInfo = {10, PacifidlogTown_FishingMons}; + +const struct WildPokemon Underwater1_WaterMons [] = +{ + {20, 30, SPECIES_CLAMPERL}, + {20, 30, SPECIES_CHINCHOU}, + {30, 35, SPECIES_CLAMPERL}, + {30, 35, SPECIES_RELICANTH}, + {30, 35, SPECIES_RELICANTH}, +}; +const struct WildPokemonInfo Underwater1_WaterMonsInfo = {4, Underwater1_WaterMons}; + +const struct WildPokemon Underwater2_WaterMons [] = +{ + {20, 30, SPECIES_CLAMPERL}, + {20, 30, SPECIES_CHINCHOU}, + {30, 35, SPECIES_CLAMPERL}, + {30, 35, SPECIES_RELICANTH}, + {30, 35, SPECIES_RELICANTH}, +}; +const struct WildPokemonInfo Underwater2_WaterMonsInfo = {4, Underwater2_WaterMons}; + + +extern u16 gRoute119WaterTileData[]; +extern u16 gScriptResult; +extern struct WildPokemon gWildFeebasRoute119Data; +extern u8 Event_RepelWoreOff[]; + +EWRAM_DATA static u8 sWildEncountersDisabled = 0; +EWRAM_DATA static u32 sFeebasRngValue = 0; + +#define NUM_FEEBAS_SPOTS 6 + +static u16 FeebasRandom(void); +static void FeebasSeedRng(u16 seed); + +static bool8 RepelCheck(u8 level); +static void ApplyFluteEncounterRateMod(u32 *encRate); +static void ApplyCleanseTagEncounterRateMod(u32 *encRate); + +void DisableWildEncounters(bool8 disabled) +{ + sWildEncountersDisabled = disabled; +} + +static u16 GetRoute119WaterTileNum(s16 x, s16 y, u8 section) +{ + u16 xCur; + u16 yCur; + u16 yMin = gRoute119WaterTileData[section * 3 + 0]; + u16 yMax = gRoute119WaterTileData[section * 3 + 1]; + u16 tileNum = gRoute119WaterTileData[section * 3 + 2]; + + for (yCur = yMin; yCur <= yMax; yCur++) + { + for (xCur = 0; xCur < gMapHeader.mapData->width; xCur++) + { + if (sub_805759C(MapGridGetMetatileBehaviorAt(xCur + 7, yCur + 7)) == TRUE) + { + tileNum++; + if (x == xCur && y == yCur) + return tileNum; + } + } + } + return tileNum + 1; +} + +static bool8 CheckFeebas(void) +{ + u8 i; + u16 feebasSpots[6]; + s16 x; + s16 y; + u8 route119section = 0; + u16 waterTileNum; + + if (gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 0x22) + { + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + x -= 7; + y -= 7; + +#ifdef NONMATCHING + if (y >= gRoute119WaterTileData[3 * 1 + 0] && y <= gRoute119WaterTileData[3 * 1 + 1]) + route119section = 1; + if (y >= gRoute119WaterTileData[3 * 2 + 0] && y <= gRoute119WaterTileData[3 * 2 + 1]) + route119section = 2; +#else + { + register u16 *arr asm("r0"); + if (y >= (arr = gRoute119WaterTileData)[3 * 1 + 0] && y <= arr[3 * 1 + 1]) + route119section = 1; + if (y >= arr[3 * 2 + 0] && y <= arr[3 * 2 + 1]) + route119section = 2; + } +#endif + + if (Random() % 100 > 49) //50% chance of encountering Feebas + return FALSE; + + FeebasSeedRng(gSaveBlock1.easyChatPairs[0].unk2); + for (i = 0; i != NUM_FEEBAS_SPOTS;) + { + feebasSpots[i] = FeebasRandom() % 447; + if (feebasSpots[i] == 0) + feebasSpots[i] = 447; + if (feebasSpots[i] < 1 || feebasSpots[i] >= 4) + i++; + } + waterTileNum = GetRoute119WaterTileNum(x, y, route119section); + for (i = 0; i < NUM_FEEBAS_SPOTS; i++) + { + if (waterTileNum == feebasSpots[i]) + return TRUE; + } + } + return FALSE; +} + +static u16 FeebasRandom(void) +{ + sFeebasRngValue = 12345 + 0x41C64E6D * sFeebasRngValue; + return sFeebasRngValue >> 16; +} + +static void FeebasSeedRng(u16 seed) +{ + sFeebasRngValue = seed; +} + +static u8 ChooseWildMonIndex_Land(void) +{ + u8 rand = Random() % 100; + + if (rand < 20) //20% chance + return 0; + if (rand >= 20 && rand < 40) //20% chance + return 1; + if (rand >= 40 && rand < 50) //10% chance + return 2; + if (rand >= 50 && rand < 60) //10% chance + return 3; + if (rand >= 60 && rand < 70) //10% chance + return 4; + if (rand >= 70 && rand < 80) //10% chance + return 5; + if (rand >= 80 && rand < 85) //5% chance + return 6; + if (rand >= 85 && rand < 90) //5% chance + return 7; + if (rand >= 90 && rand < 94) //4% chance + return 8; + if (rand >= 94 && rand < 98) //4% chance + return 9; + if (rand == 98) //1% chance + return 10; + else //1% chance + return 11; +} + +static u8 ChooseWildMonIndex_Water(void) +{ + u8 rand = Random() % 100; + + if (rand < 60) //60% chance + return 0; + if (rand >= 60 && rand < 90) //30% chance + return 1; + if (rand >= 90 && rand < 95) //5% chance + return 2; + if (rand >= 95 && rand < 99) //4% chance + return 3; + else //1% chance + return 4; +} + +enum +{ + OLD_ROD, + GOOD_ROD, + SUPER_ROD +}; + +static u8 ChooseWildMonIndex_Fishing(u8 rod) +{ + u8 wildMonIndex = 0; + u8 rand = Random() % 100; + + switch (rod) + { + case OLD_ROD: + if (rand < 70) //70% chance + wildMonIndex = 0; + else //30% chance + wildMonIndex = 1; + break; + case GOOD_ROD: + if (rand < 60) //60% chance + wildMonIndex = 2; + if (rand >= 60 && rand < 80) //20% chance + wildMonIndex = 3; + if (rand >= 80 && rand < 100) //20% chance + wildMonIndex = 4; + break; + case SUPER_ROD: + if (rand < 40) //40% chance + wildMonIndex = 5; + if (rand >= 40 && rand < 80) //40% chance + wildMonIndex = 6; + if (rand >= 80 && rand < 95) //15% chance + wildMonIndex = 7; + if (rand >= 95 && rand < 99) //4% chance + wildMonIndex = 8; + if (rand == 99) //1% chance + wildMonIndex = 9; + break; + } + return wildMonIndex; +} + +static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon) +{ + u8 min; + u8 max; + u8 range; + u8 rand; + + //Make sure minimum level is less than maximum level + if (wildPokemon->maxLevel >= wildPokemon->minLevel) + { + min = wildPokemon->minLevel; + max = wildPokemon->maxLevel; + } + else + { + min = wildPokemon->maxLevel; + max = wildPokemon->minLevel; + } + range = max - min + 1; + rand = Random() % range; + return min + rand; +} + +static u16 GetCurrentMapWildMonHeader(void) +{ + u16 i; + + for (i = 0; gWildMonHeaders[i].mapGroup != 0xFF; i++) + { + if (gWildMonHeaders[i].mapGroup == gSaveBlock1.location.mapGroup && + gWildMonHeaders[i].mapNum == gSaveBlock1.location.mapNum) + return i; + } + return -1; +} + +static u8 PickWildMonNature(void) +{ + u8 i; + u8 j; + struct Pokeblock *safariPokeblock; + u8 natures[25]; + + if (GetSafariZoneFlag() == TRUE && Random() % 100 < 80) + { + safariPokeblock = SafariZoneGetActivePokeblock(); + if (safariPokeblock != NULL) + { + for (i = 0; i < 25; i++) + natures[i] = i; + for (i = 0; i < 24; i++) + { + for (j = i + 1; j < 25; j++) + { + if (Random() & 1) + { + u8 temp = natures[i]; + + natures[i] = natures[j]; + natures[j] = temp; + } + } + } + for (i = 0; i < 25; i++) + { + if (sub_810CAE4(natures[i], safariPokeblock) > 0) + return natures[i]; + } + } + } + return Random() % 25; +} + +static void CreateWildMon(u16 species, u8 b) +{ + ZeroEnemyPartyMons(); + CreateMonWithNature(&gEnemyParty[0], species, b, 0x20, PickWildMonNature()); +} + +static bool8 GenerateWildMon(struct WildPokemonInfo *wildMonInfo, u8 area, bool8 checkRepel) +{ + u8 wildMonIndex = 0; + u8 level; + + switch (area) + { + case 0: + wildMonIndex = ChooseWildMonIndex_Land(); + break; + case 1: + wildMonIndex = ChooseWildMonIndex_Water(); + break; + case 2: + wildMonIndex = ChooseWildMonIndex_Water(); + break; + } + level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]); + if (checkRepel == TRUE && RepelCheck(level) == FALSE) + return FALSE; + else + { + CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level); + return TRUE; + } +} + +static u16 GenerateFishingWildMon(struct WildPokemonInfo *wildMonInfo, u8 rod) +{ + u8 wildMonIndex = ChooseWildMonIndex_Fishing(rod); + u8 level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]); + + CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level); + return wildMonInfo->wildPokemon[wildMonIndex].species; +} + +static bool8 SetUpMassOutbreakEncounter(bool8 checkRepel) +{ + u16 i; + + if (checkRepel == TRUE && RepelCheck(gSaveBlock1.outbreakPokemonLevel) == 0) + return FALSE; + else + { + CreateWildMon(gSaveBlock1.outbreakPokemonSpecies, gSaveBlock1.outbreakPokemonLevel); + for (i = 0; i < 4; i++) + SetMonMoveSlot(&gEnemyParty[0], gSaveBlock1.outbreakPokemonMoves[i], i); + return TRUE; + } +} + +static bool8 DoMassOutbreakEncounterTest(void) +{ + if (gSaveBlock1.outbreakPokemonSpecies != 0 + && gSaveBlock1.location.mapNum == gSaveBlock1.outbreakLocationMapNum + && gSaveBlock1.location.mapGroup == gSaveBlock1.outbreakLocationMapGroup) + { + if (Random() % 100 < gSaveBlock1.outbreakPokemonProbability) + return TRUE; + } + return FALSE; +} + +static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate) +{ + if (Random() % 2880 < encounterRate) + return TRUE; + else + return FALSE; +} + +static bool8 DoWildEncounterTest(u32 encounterRate, bool8 ignoreAbility) +{ + encounterRate *= 16; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) + encounterRate = encounterRate * 80 / 100; + ApplyFluteEncounterRateMod(&encounterRate); + ApplyCleanseTagEncounterRateMod(&encounterRate); + if (!ignoreAbility) + { + // UB: Too few arguments for function 'GetMonData' + if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)) + { + u32 ability = GetMonAbility(&gPlayerParty[0]); + if (ability == ABILITY_STENCH) + encounterRate /= 2; + if (ability == ABILITY_ILLUMINATE) + encounterRate *= 2; + } + } + if (encounterRate > 2880) + encounterRate = 2880; + return DoWildEncounterRateDiceRoll(encounterRate); +} + +static bool8 DoGlobalWildEncounterDiceRoll(void) +{ + if (Random() % 100 >= 60) + return FALSE; + else + return TRUE; +} + +bool8 StandardWildEncounter(u16 a, u16 b) +{ + u16 headerNum; + struct Roamer *roamer; + + if (sWildEncountersDisabled == TRUE) + return 0; + else + { + headerNum = GetCurrentMapWildMonHeader(); + if (headerNum != 0xFFFF) + { + if (MetatileBehavior_IsLandWildEncounter(a) == TRUE) + { + if (gWildMonHeaders[headerNum].landMonsInfo) + { + if (b != a && !DoGlobalWildEncounterDiceRoll()) + return 0; + + if (DoWildEncounterTest(gWildMonHeaders[headerNum].landMonsInfo->encounterRate, 0) == TRUE) + { + if (TryStartRoamerEncounter() == TRUE) + { + roamer = &gSaveBlock1.roamer; + if (RepelCheck(roamer->level)) + { + StartBattle_Roamer(); + return 1; + } + } + else + { + if (DoMassOutbreakEncounterTest() == TRUE && SetUpMassOutbreakEncounter(1) == TRUE) + { + CheckForSafariZoneAndProceed(); + return 1; + } + if (GenerateWildMon(gWildMonHeaders[headerNum].landMonsInfo, 0, TRUE) == TRUE) + { + goto label; + } + } + } + } + } + else if (MetatileBehavior_IsWaterWildEncounter(a) == TRUE + || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(a) == TRUE)) + { + if (gWildMonHeaders[headerNum].waterMonsInfo) + { + if (b != a && !DoGlobalWildEncounterDiceRoll()) + return 0; + + if (DoWildEncounterTest(gWildMonHeaders[headerNum].waterMonsInfo->encounterRate, 0) == TRUE) + { + if (TryStartRoamerEncounter() == TRUE) + { + roamer = &gSaveBlock1.roamer; + if (RepelCheck(roamer->level)) + { + StartBattle_Roamer(); + return 1; + } + } + else + { + //_08085268 + if (GenerateWildMon(gWildMonHeaders[headerNum].waterMonsInfo, 1, TRUE) == TRUE) + { + label: + //_0808527A + CheckForSafariZoneAndProceed(); + return 1; + } + } + } + } + } + } + } + return 0; +} + +void RockSmashWildEncounter(void) +{ + u16 headerNum = GetCurrentMapWildMonHeader(); + + if (headerNum != 0xFFFF) + { + struct WildPokemonInfo *wildPokemonInfo = gWildMonHeaders[headerNum].rockSmashMonsInfo; + + if (wildPokemonInfo == NULL) + { + gScriptResult = 0; + return; + } + else if (DoWildEncounterTest(wildPokemonInfo->encounterRate, 1) == TRUE + && GenerateWildMon(wildPokemonInfo, 2, TRUE) == TRUE) + { + CheckForSafariZoneAndProceed(); + gScriptResult = 1; + return; + } + } + gScriptResult = 0; + return; +} + +bool8 SweetScentWildEncounter(void) +{ + s16 x; + s16 y; + u16 headerNum; + struct WildPokemonInfo *wildPokemonInfo; + + PlayerGetDestCoords(&x, &y); + if ((headerNum = GetCurrentMapWildMonHeader()) != 0xFFFF) + { + if (MetatileBehavior_IsLandWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == 1) + { + wildPokemonInfo = gWildMonHeaders[headerNum].landMonsInfo; + if (wildPokemonInfo == NULL) + return FALSE; + if (TryStartRoamerEncounter() == TRUE) + { + StartBattle_Roamer(); + return TRUE; + } + if (DoMassOutbreakEncounterTest() == TRUE) + SetUpMassOutbreakEncounter(0); + else + GenerateWildMon(wildPokemonInfo, 0, FALSE); + CheckForSafariZoneAndProceed(); + return TRUE; + } + else if (MetatileBehavior_IsWaterWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == 1) + { + wildPokemonInfo = gWildMonHeaders[headerNum].waterMonsInfo; + if (wildPokemonInfo == NULL) + return FALSE; + if (TryStartRoamerEncounter() == TRUE) + { + StartBattle_Roamer(); + return TRUE; + } + GenerateWildMon(wildPokemonInfo, 1, FALSE); + CheckForSafariZoneAndProceed(); + return TRUE; + } + } + return FALSE; +} + +bool8 GetFishingWildMonListHeader(void) +{ + u16 headerNum = GetCurrentMapWildMonHeader(); + + if (headerNum != 0xFFFF && gWildMonHeaders[headerNum].fishingMonsInfo != NULL) + return TRUE; + else + return FALSE; +} + +void FishingWildEncounter(u8 rod) +{ + u16 species; + + if (CheckFeebas() == TRUE) + { + u8 level = ChooseWildMonLevel(&gWildFeebasRoute119Data); + + species = gWildFeebasRoute119Data.species; + CreateWildMon(species, level); + } + else + { + species = GenerateFishingWildMon( + gWildMonHeaders[GetCurrentMapWildMonHeader()].fishingMonsInfo, + rod); + } + IncrementGameStat(12); + sub_80BEA50(species); + CheckForSafariZoneAndProceed(); +} + +u16 GetLocalWildMon(bool8 *isWaterMon) +{ + u16 headerNum; + struct WildPokemonInfo *landMonsInfo; + struct WildPokemonInfo *waterMonsInfo; + + *isWaterMon = FALSE; + headerNum = GetCurrentMapWildMonHeader(); + if (headerNum == 0xFFFF) + return 0; + landMonsInfo = gWildMonHeaders[headerNum].landMonsInfo; + waterMonsInfo = gWildMonHeaders[headerNum].waterMonsInfo; + //Neither + if (landMonsInfo == NULL && waterMonsInfo == NULL) + return 0; + //Land Pokemon + if (landMonsInfo != NULL && waterMonsInfo == NULL) + return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; + //Water Pokemon + if (landMonsInfo == NULL && waterMonsInfo != NULL) + { + *isWaterMon = TRUE; + return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; + } + //Either land or water Pokemon + if ((Random() % 100) < 80) + return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; + else + { + *isWaterMon = TRUE; + return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; + } +} + +u16 GetMirageIslandMon(void) +{ + u16 headerNum = GetCurrentMapWildMonHeader(); + + if (headerNum != 0xFFFF) + { + struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerNum].waterMonsInfo; + + if (waterMonsInfo) + return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; + } + return 0; +} + +bool8 UpdateRepelCounter(void) +{ + u16 steps = VarGet(VAR_REPEL_STEP_COUNT); + + if (steps != 0) + { + steps--; + VarSet(VAR_REPEL_STEP_COUNT, steps); + if (steps == 0) + { + ScriptContext1_SetupScript(Event_RepelWoreOff); + return TRUE; + } + } + return FALSE; +} + +//Returns FALSE if Repel prevents wild Pokemon at the specified level from appearing +static bool8 RepelCheck(u8 level) +{ + u8 i; + + if (!VarGet(VAR_REPEL_STEP_COUNT)) + return TRUE; + else + { + for (i = 0; i < 6; i++) + { + // UB: Too few arguments for function 'GetMonData' + if (GetMonData(&gPlayerParty[i], MON_DATA_HP) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + { + if (level < (u8)GetMonData(&gPlayerParty[i], MON_DATA_LEVEL)) + return FALSE; + else + return TRUE; + } + } + return FALSE; + } +} + +static void ApplyFluteEncounterRateMod(u32 *encRate) +{ + if (FlagGet(SYS_ENC_UP_ITEM) == TRUE) + *encRate += *encRate / 2; + else if (FlagGet(SYS_ENC_DOWN_ITEM) == TRUE) + *encRate = *encRate / 2; +} + +static void ApplyCleanseTagEncounterRateMod(u32 *encRate) +{ + // UB: Too few arguments for function 'GetMonData' + if (GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM) == 0xBE) + *encRate = *encRate * 2 / 3; +} diff --git a/src/field_camera.c b/src/field_camera.c deleted file mode 100644 index db51cf054..000000000 --- a/src/field_camera.c +++ /dev/null @@ -1,495 +0,0 @@ -#include "global.h" -#include "field_camera.h" -#include "berry.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "rotating_gate.h" -#include "sprite.h" -#include "text.h" - -EWRAM_DATA u8 gUnknown_0202E854 = 0; - -struct UnknownStruct -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; - bool8 unk4; -}; - -static struct UnknownStruct gUnknown_03000590; -static u16 gUnknown_03000598; -static s16 gUnknown_0300059A; -static u8 gUnknown_0300059C; -static void (*gUnknown_030005A0)(void); - -struct CameraSomething gUnknown_03004880; -u16 gUnknown_03004898; -u16 gUnknown_0300489C; - -static void RedrawMapSliceNorth(struct UnknownStruct *a, struct MapData *mapData); -static void RedrawMapSliceSouth(struct UnknownStruct *a, struct MapData *mapData); -static void RedrawMapSliceEast(struct UnknownStruct *a, struct MapData *mapData); -static void RedrawMapSliceWest(struct UnknownStruct *a, struct MapData *mapData); -static s32 MapPosToBgTilemapOffset(struct UnknownStruct *a, s32 x, s32 y); - -static void DrawWholeMapViewInternal(int x, int y, struct MapData *mapData); -static void DrawMetatileAt(struct MapData *mapData, u16, int, int); -static void DrawMetatile(s32 a, u16 *b, u16 c); -static void CameraPanningCB_PanAhead(void); - -static void move_tilemap_camera_to_upper_left_corner_(struct UnknownStruct *a) -{ - a->unk2 = 0; - a->unk3 = 0; - a->unk0 = 0; - a->unk1 = 0; - a->unk4 = TRUE; -} - -static void tilemap_move_something(struct UnknownStruct *a, u32 b, u32 c) -{ - a->unk2 += b; - a->unk2 %= 32; - a->unk3 += c; - a->unk3 %= 32; -} - -static void coords8_add(struct UnknownStruct *a, u32 b, u32 c) -{ - a->unk0 += b; - a->unk1 += c; -} - -void move_tilemap_camera_to_upper_left_corner(void) -{ - move_tilemap_camera_to_upper_left_corner_(&gUnknown_03000590); - CpuFill16(0, gBGTilemapBuffers[2], 0x800); - CpuFill16(0, gBGTilemapBuffers[1], 0x800); - CpuFill16(0x3014, gBGTilemapBuffers[3], 0x800); -} - -void sub_8057A58(void) -{ - *gBGHOffsetRegs[1] = gUnknown_03000590.unk0 + gUnknown_03000598; - *gBGVOffsetRegs[1] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; - *gBGHOffsetRegs[2] = gUnknown_03000590.unk0 + gUnknown_03000598; - *gBGVOffsetRegs[2] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; - *gBGHOffsetRegs[3] = gUnknown_03000590.unk0 + gUnknown_03000598; - *gBGVOffsetRegs[3] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; - - if (gUnknown_03000590.unk4) - { - DmaCopy16(3, gBGTilemapBuffers[1], (void *)(VRAM + 0xE800), 0x800); - DmaCopy16(3, gBGTilemapBuffers[2], (void *)(VRAM + 0xE000), 0x800); - DmaCopy16(3, gBGTilemapBuffers[3], (void *)(VRAM + 0xF000), 0x800); - gUnknown_03000590.unk4 = FALSE; - } -} - -void sub_8057B14(u16 *a, u16 *b) -{ - *a = gUnknown_03000590.unk0 + gUnknown_03000598; - *b = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; -} - -void DrawWholeMapView(void) -{ - DrawWholeMapViewInternal(gSaveBlock1.pos.x, gSaveBlock1.pos.y, gMapHeader.mapData); - gUnknown_03000590.unk4 = TRUE; -} - -static void DrawWholeMapViewInternal(int x, int y, struct MapData *mapData) -{ - u8 i; - u8 j; - u32 r6; - u8 temp; - - for (i = 0; i < 32; i += 2) - { - temp = gUnknown_03000590.unk3 + i; - if (temp >= 32) - temp -= 32; - r6 = temp * 32; - for (j = 0; j < 32; j += 2) - { - temp = gUnknown_03000590.unk2 + j; - if (temp >= 32) - temp -= 32; - DrawMetatileAt(mapData, r6 + temp, x + j / 2, y + i / 2); - } - } -} - -static void RedrawMapSlicesForCameraUpdate(struct UnknownStruct *a, int x, int y) -{ - struct MapData *mapData = gMapHeader.mapData; - - if (x > 0) - RedrawMapSliceWest(a, mapData); - if (x < 0) - RedrawMapSliceEast(a, mapData); - if (y > 0) - RedrawMapSliceNorth(a, mapData); - if (y < 0) - RedrawMapSliceSouth(a, mapData); - a->unk4 = TRUE; -} - -static void RedrawMapSliceNorth(struct UnknownStruct *a, struct MapData *mapData) -{ - u8 i; - u8 temp; - u32 r7; - - temp = a->unk3 + 28; - if (temp >= 32) - temp -= 32; - r7 = temp * 32; - for (i = 0; i < 32; i += 2) - { - temp = a->unk2 + i; - if (temp >= 32) - temp -= 32; - DrawMetatileAt(mapData, r7 + temp, gSaveBlock1.pos.x + i / 2, gSaveBlock1.pos.y + 14); - } -} - -static void RedrawMapSliceSouth(struct UnknownStruct *a, struct MapData *mapData) -{ - u8 i; - u8 temp; - u32 r7 = a->unk3 * 32; - - for (i = 0; i < 32; i += 2) - { - temp = a->unk2 + i; - if (temp >= 32) - temp -= 32; - DrawMetatileAt(mapData, r7 + temp, gSaveBlock1.pos.x + i / 2, gSaveBlock1.pos.y); - } -} - -static void RedrawMapSliceEast(struct UnknownStruct *a, struct MapData *mapData) -{ - u8 i; - u8 temp; - u32 r6 = a->unk2; - - for (i = 0; i < 32; i += 2) - { - temp = a->unk3 + i; - if (temp >= 32) - temp -= 32; - DrawMetatileAt(mapData, temp * 32 + r6, gSaveBlock1.pos.x, gSaveBlock1.pos.y + i / 2); - } -} - -static void RedrawMapSliceWest(struct UnknownStruct *a, struct MapData *mapData) -{ - u8 i; - u8 temp; - u8 r5 = a->unk2 + 28; - - if (r5 >= 32) - r5 -= 32; - for (i = 0; i < 32; i += 2) - { - temp = a->unk3 + i; - if (temp >= 32) - temp -= 32; - DrawMetatileAt(mapData, temp * 32 + r5, gSaveBlock1.pos.x + 14, gSaveBlock1.pos.y + i / 2); - } -} - -void CurrentMapDrawMetatileAt(int a, int b) -{ - int offset = MapPosToBgTilemapOffset(&gUnknown_03000590, a, b); - - if (offset >= 0) - { - DrawMetatileAt(gMapHeader.mapData, offset, a, b); - gUnknown_03000590.unk4 = TRUE; - } -} - -void DrawDoorMetatileAt(int x, int y, u16 *arr) -{ - int offset = MapPosToBgTilemapOffset(&gUnknown_03000590, x, y); - - if (offset >= 0) - { - DrawMetatile(1, arr, offset); - gUnknown_03000590.unk4 = TRUE; - } -} - -static void DrawMetatileAt(struct MapData *mapData, u16 b, int c, int d) -{ - u16 metatileId = MapGridGetMetatileIdAt(c, d); - u16 *metatiles; - - if (metatileId > 1024) - metatileId = 0; - if (metatileId < 512) - metatiles = mapData->primaryTileset->metatiles; - else - { - metatiles = mapData->secondaryTileset->metatiles; - metatileId -= 512; - } - DrawMetatile(MapGridGetMetatileLayerTypeAt(c, d), metatiles + metatileId * 8, b); -} - -static void DrawMetatile(s32 a, u16 *b, u16 c) -{ - switch (a) - { - case 2: - gBGTilemapBuffers[3][c] = b[0]; - gBGTilemapBuffers[3][c + 1] = b[1]; - gBGTilemapBuffers[3][c + 0x20] = b[2]; - gBGTilemapBuffers[3][c + 0x21] = b[3]; - - gBGTilemapBuffers[2][c] = 0; - gBGTilemapBuffers[2][c + 1] = 0; - gBGTilemapBuffers[2][c + 0x20] = 0; - gBGTilemapBuffers[2][c + 0x21] = 0; - - gBGTilemapBuffers[1][c] = b[4]; - gBGTilemapBuffers[1][c + 1] = b[5]; - gBGTilemapBuffers[1][c + 0x20] = b[6]; - gBGTilemapBuffers[1][c + 0x21] = b[7]; - break; - case 1: - gBGTilemapBuffers[3][c] = b[0]; - gBGTilemapBuffers[3][c + 1] = b[1]; - gBGTilemapBuffers[3][c + 0x20] = b[2]; - gBGTilemapBuffers[3][c + 0x21] = b[3]; - - gBGTilemapBuffers[2][c] = b[4]; - gBGTilemapBuffers[2][c + 1] = b[5]; - gBGTilemapBuffers[2][c + 0x20] = b[6]; - gBGTilemapBuffers[2][c + 0x21] = b[7]; - - gBGTilemapBuffers[1][c] = 0; - gBGTilemapBuffers[1][c + 1] = 0; - gBGTilemapBuffers[1][c + 0x20] = 0; - gBGTilemapBuffers[1][c + 0x21] = 0; - break; - case 0: - gBGTilemapBuffers[3][c] = 0x3014; - gBGTilemapBuffers[3][c + 1] = 0x3014; - gBGTilemapBuffers[3][c + 0x20] = 0x3014; - gBGTilemapBuffers[3][c + 0x21] = 0x3014; - - gBGTilemapBuffers[2][c] = b[0]; - gBGTilemapBuffers[2][c + 1] = b[1]; - gBGTilemapBuffers[2][c + 0x20] = b[2]; - gBGTilemapBuffers[2][c + 0x21] = b[3]; - - gBGTilemapBuffers[1][c] = b[4]; - gBGTilemapBuffers[1][c + 1] = b[5]; - gBGTilemapBuffers[1][c + 0x20] = b[6]; - gBGTilemapBuffers[1][c + 0x21] = b[7]; - break; - } -} - -static s32 MapPosToBgTilemapOffset(struct UnknownStruct *a, s32 x, s32 y) -{ - x -= gSaveBlock1.pos.x; - x *= 2; - if (x >= 32 || x < 0) - return -1; - x = x + a->unk2; - if (x >= 32) - x -= 32; - - y = (y - gSaveBlock1.pos.y) * 2; - if (y >= 32 || y < 0) - return -1; - y = y + a->unk3; - if (y >= 32) - y -= 32; - - return y * 32 + x; -} - -static void CameraUpdateCallback(struct CameraSomething *a) -{ - if (a->unk4 != 0) - { - a->unk8 = gSprites[a->unk4].data2; - a->unkC = gSprites[a->unk4].data3; - } -} - -void ResetCameraUpdateInfo(void) -{ - gUnknown_03004880.unk8 = 0; - gUnknown_03004880.unkC = 0; - gUnknown_03004880.unk10 = 0; - gUnknown_03004880.unk14 = 0; - gUnknown_03004880.unk4 = 0; - gUnknown_03004880.callback = NULL; -} - -u32 InitCameraUpdateCallback(u8 a) -{ - if (gUnknown_03004880.unk4 != 0) - DestroySprite(&gSprites[gUnknown_03004880.unk4]); - gUnknown_03004880.unk4 = AddCameraObject(a); - gUnknown_03004880.callback = CameraUpdateCallback; - return 0; -} - -void CameraUpdate(void) -{ - int deltaX; - int deltaY; - int r0; - int r1; - int r7; - int r8; - - if (gUnknown_03004880.callback != NULL) - gUnknown_03004880.callback(&gUnknown_03004880); - r7 = gUnknown_03004880.unk8; - r8 = gUnknown_03004880.unkC; - deltaX = 0; - deltaY = 0; - r1 = gUnknown_03004880.unk10; - r0 = gUnknown_03004880.unk14; - - - if (r1 == 0 && r7 != 0) - { - if (r7 > 0) - deltaX = 1; - else - deltaX = -1; - } - if (r0 == 0 && r8 != 0) - { - if (r8 > 0) - deltaY = 1; - else - deltaY = -1; - } - if (r1 != 0 && r1 == -r7) - { - if (r7 > 0) - deltaX = 1; - else - deltaX = -1; - } - if (r0 != 0 && r0 == -r8) - { - if (r8 > 0) - deltaX = 1; - else - deltaX = -1; - } - - gUnknown_03004880.unk10 += r7; - gUnknown_03004880.unk10 = gUnknown_03004880.unk10 - 16 * (gUnknown_03004880.unk10 / 16); - gUnknown_03004880.unk14 += r8; - gUnknown_03004880.unk14 = gUnknown_03004880.unk14 - 16 * (gUnknown_03004880.unk14 / 16); - - if (deltaX != 0 || deltaY != 0) - { - CameraMove(deltaX, deltaY); - UpdateFieldObjectsForCameraUpdate(deltaX, deltaY); - RotatingGatePuzzleCameraUpdate(deltaX, deltaY); - ResetBerryTreeSparkleFlags(); - tilemap_move_something(&gUnknown_03000590, deltaX * 2, deltaY * 2); - RedrawMapSlicesForCameraUpdate(&gUnknown_03000590, deltaX * 2, deltaY * 2); - } - - coords8_add(&gUnknown_03000590, r7, r8); - gUnknown_0300489C -= r7; - gUnknown_03004898 -= r8; -} - -void camera_move_and_redraw(int a, int b) -{ - CameraMove(a, b); - UpdateFieldObjectsForCameraUpdate(a, b); - DrawWholeMapView(); - gUnknown_0300489C -= a * 16; - gUnknown_03004898 -= b * 16; -} - -void SetCameraPanningCallback(void (*a)(void)) -{ - gUnknown_030005A0 = a; -} - -void SetCameraPanning(s16 a, s16 b) -{ - gUnknown_03000598 = a; - gUnknown_0300059A = b + 32; -} - -void InstallCameraPanAheadCallback(void) -{ - gUnknown_030005A0 = CameraPanningCB_PanAhead; - gUnknown_0300059C = 0; - gUnknown_03000598 = 0; - gUnknown_0300059A = 32; -} - -void UpdateCameraPanning(void) -{ - if (gUnknown_030005A0 != NULL) - gUnknown_030005A0(); - //Update sprite offset of overworld objects - gSpriteCoordOffsetX = gUnknown_0300489C - gUnknown_03000598; - gSpriteCoordOffsetY = gUnknown_03004898 - gUnknown_0300059A - 8; -} - -static void CameraPanningCB_PanAhead(void) -{ - u8 var; - - if (gUnknown_0202E854 == 0) - { - InstallCameraPanAheadCallback(); - } - else - { - if (gPlayerAvatar.running1 == 1) - { - gUnknown_0300059C ^= 1; - if (gUnknown_0300059C == 0) - return; - } - else - { - gUnknown_0300059C = 0; - } - - var = player_get_direction_upper_nybble(); - if (var == 2) - { - if (gUnknown_0300059A > -8) - gUnknown_0300059A -= 2; - } - else if (var == 1) - { - if (gUnknown_0300059A < 72) - gUnknown_0300059A += 2; - } - else if (gUnknown_0300059A < 32) - { - gUnknown_0300059A += 2; - } - else if (gUnknown_0300059A > 32) - { - gUnknown_0300059A -= 2; - } - } -} diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c deleted file mode 100644 index a8f6b6b9b..000000000 --- a/src/field_control_avatar.c +++ /dev/null @@ -1,878 +0,0 @@ -#include "global.h" -#include "field_control_avatar.h" -#include "battle_setup.h" -#include "bike.h" -#include "coord_event_weather.h" -#include "daycare.h" -#include "event_data.h" -#include "field_fadetransition.h" -#include "field_player_avatar.h" -#include "field_poison.h" -#include "field_specials.h" -#include "fieldmap.h" -#include "flags.h" -#include "item_menu.h" -#include "metatile_behavior.h" -#include "rom4.h" -#include "safari_zone.h" -#include "script.h" -#include "secret_base.h" -#include "songs.h" -#include "sound.h" -#include "start_menu.h" -#include "trainer_see.h" -#include "vars.h" -#include "wild_encounter.h" - -struct Coords32 -{ - s32 x; - s32 y; -}; - -extern u16 gScriptLastTalked; -extern u16 gScriptFacing; -extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; - -static EWRAM_DATA u8 gUnknown_0202E8C0 = 0; -static EWRAM_DATA u16 gUnknown_0202E8C2 = 0; - -u8 gSelectedMapObject; - -//scripts -extern u8 gUnknown_081A2C51[]; -extern u8 gUnknown_0815281E[]; -extern u8 gUnknown_08152C39[]; -extern u8 gUnknown_0815F36C[]; -extern u8 gUnknown_0815F43A[]; -extern u8 gUnknown_081A0009[]; -extern u8 gUnknown_081C6C02[]; -extern u8 HiddenItemScript[]; -extern u8 Event_TV[]; -extern u8 gUnknown_081A0009[]; -extern u8 ClosedSootopolisGymDoorScript[]; -extern u8 gUnknown_081A4363[]; -extern u8 gUnknown_081C346A[]; -extern u8 gUnknown_081616E1[]; -extern u8 Event_WorldMap[]; -extern u8 Event_RunningShoesManual[]; -extern u8 PictureBookShelfScript[]; -extern u8 BookshelfScript[]; -extern u8 PokemonCenterBookshelfScript[]; -extern u8 VaseScript[]; -extern u8 TrashCanScript[]; -extern u8 ShopShelfScript[]; -extern u8 BlueprintScript[]; -extern u8 gUnknown_0815F36C[]; -extern u8 gUnknown_0815F43A[]; -extern u8 gUnknown_0815F523[]; -extern u8 gUnknown_0815F528[]; -extern u8 UseSurfScript[]; -extern u8 UseWaterfallScript[]; -extern u8 CannotUseWaterfallScript[]; -extern u8 UseDiveScript[]; -extern u8 UnderwaterUseDiveScript[]; -extern u8 GraniteCave_B1F_EventScript_1C6BC5[]; -extern u8 gUnknown_081A14B8[]; -extern u8 Event_EggHatch[]; -extern u8 gUnknown_0815FD0D[]; -extern u8 gUnknown_081C6BDE[]; - -static void player_get_pos_to_and_height(struct MapPosition *); -static void player_get_next_pos_and_height(struct MapPosition *); -static u16 cur_mapdata_block_role_at_player_pos(int); -static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c); -static u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c); -static u8 *sub_8068364(struct MapPosition *, u8, u8); -static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *, u8, u8 c); -static u8 *sub_8068500(struct MapPosition *, u8, u8); -static u8 *TryGetFieldMoveScript(struct MapPosition *, u8, u8); -static bool32 sub_8068770(void); -static bool32 sub_80687A4(void); -static bool8 sub_80687E4(struct MapPosition *, u16, u16); -static void happiness_algorithm_step(void); -static bool8 overworld_poison_step(void); -static bool8 is_it_battle_time_3(u16); -static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *, u16, u8); -static bool8 sub_8068B30(u16); -static bool8 is_non_stair_warp_tile(u16, u8); -static s8 map_warp_check_packed(struct MapHeader *, struct MapPosition *); -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); - -void FieldClearPlayerInput(struct FieldInput *input) -{ - input->pressedAButton = 0; - input->input_field_0_1 = 0; - input->pressedStartButton = 0; - input->pressedSelectButton = 0; - input->input_field_0_4 = 0; - input->input_field_0_5 = 0; - input->input_field_0_6 = 0; - input->pressedBButton = 0; - input->input_field_1_0 = 0; - input->input_field_1_1 = 0; - input->input_field_1_2 = 0; - input->input_field_1_3 = 0; - input->dpadDirection = 0; -} - -void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) -{ - u8 r6 = gPlayerAvatar.running1; - u8 r9 = gPlayerAvatar.running2; - bool8 forcedMove = MetatileBehavior_IsMoveTile(cur_mapdata_block_role_at_player_pos(r9)); - - if ((r6 == 2 && forcedMove == FALSE) || r6 == 0) - { - if (GetPlayerSpeed() != 4) - { - if (newKeys & START_BUTTON) - input->pressedStartButton = TRUE; - if (newKeys & SELECT_BUTTON) - input->pressedSelectButton = TRUE; - if (newKeys & A_BUTTON) - input->pressedAButton = TRUE; - if (newKeys & B_BUTTON) - input->pressedBButton = TRUE; - } - if (heldKeys & (DPAD_UP | DPAD_DOWN | DPAD_LEFT | DPAD_RIGHT)) - { - input->input_field_0_4 = TRUE; - input->input_field_0_5 = TRUE; - } - } - if (forcedMove == FALSE) - { - if (r6 == 2 && r9 == 2) - input->input_field_0_6 = TRUE; - if (forcedMove == FALSE && r6 == 2) - input->input_field_0_1 = TRUE; - } - if (heldKeys & DPAD_UP) - input->dpadDirection = DIR_NORTH; - else if (heldKeys & DPAD_DOWN) - input->dpadDirection = DIR_SOUTH; - else if (heldKeys & DPAD_LEFT) - input->dpadDirection = DIR_WEST; - else if (heldKeys & DPAD_RIGHT) - input->dpadDirection = DIR_EAST; -} - -int sub_8068024(struct FieldInput *input) -{ - struct MapPosition position; - u8 r6; - u16 r4; - - r6 = player_get_direction_lower_nybble(); - player_get_pos_to_and_height(&position); - r4 = MapGridGetMetatileBehaviorAt(position.x, position.y); - if (CheckTrainers() == TRUE) - return TRUE; - if (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); - if (sub_80687E4(&position, r4, r6) == 1) - return TRUE; - } - if (input->input_field_0_1 && is_it_battle_time_3(r4) == 1) - return TRUE; - if (input->input_field_0_4 && input->dpadDirection == r6) - { - if (mapheader_run_first_tag2_script_list_match_conditionally(&position, r4, r6) == 1) - return TRUE; - } - player_get_next_pos_and_height(&position); - r4 = MapGridGetMetatileBehaviorAt(position.x, position.y); - if (input->pressedAButton && sub_80681F0(&position, r4, r6) == 1) - return TRUE; - if (input->input_field_0_5 && input->dpadDirection == r6) - { - if (map_warp_consider_2_to_inside(&position, r4, r6) == 1) - return TRUE; - } - if (input->pressedAButton && sub_8068770() == 1) - return TRUE; - if (input->pressedStartButton) - { - PlaySE(SE_WIN_OPEN); - sub_8071310(); - return TRUE; - } - if (input->pressedSelectButton && sub_80A6D1C() == TRUE) - return TRUE; - return FALSE; -} - -static void player_get_pos_to_and_height(struct MapPosition *position) -{ - PlayerGetDestCoords(&position->x, &position->y); - position->height = PlayerGetZCoord(); -} - -static void player_get_next_pos_and_height(struct MapPosition *position) -{ - s16 x, y; - - GetXYCoordsOneStepInFrontOfPlayer(&position->x, &position->y); - PlayerGetDestCoords(&x, &y); - if (MapGridGetZCoordAt(x, y) != 0) - position->height = PlayerGetZCoord(); - else - position->height = 0; -} - -static u16 cur_mapdata_block_role_at_player_pos(int unused) -{ - s16 x, y; - - PlayerGetDestCoords(&x, &y); - return MapGridGetMetatileBehaviorAt(x, y); -} - -static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c) -{ - u8 *script = TryGetScriptOnPressingA(position, b, c); - - if (script == NULL) - return FALSE; - - if (script != gUnknown_0815281E - && script != gUnknown_08152C39 - && script != gUnknown_0815F36C - && script != gUnknown_0815F43A - && script != gUnknown_081A0009) - PlaySE(5); - - ScriptContext1_SetupScript(script); - return TRUE; -} - -static u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c) -{ - u8 *script; - - script = sub_8068364(position, b, c); - if (script != NULL) - return script; - script = TryGetInvisibleMapObjectScript(position, b, c); - if (script != NULL) - return script; - script = sub_8068500(position, b, c); - if (script != NULL) - return script; - script = TryGetFieldMoveScript(position, b, c); - if (script != NULL) - return script; - - return NULL; -} - -u8 *sub_80682A8(struct MapPosition *position, u8 unused, u8 c) -{ - u8 r3; - s32 i; - - if (!MetatileBehavior_IsCounter(MapGridGetMetatileBehaviorAt(position->x, position->y))) - r3 = GetFieldObjectIdByXYZ(position->x, position->y, position->height); - else - r3 = GetFieldObjectIdByXYZ(position->x + gUnknown_0821664C[c].x, position->y + gUnknown_0821664C[c].y, position->height); - if (r3 == 16 || gMapObjects[r3].localId == 0xFF) - return NULL; - for (i = 0; i < 4; i++) - { - if (gLinkPlayerMapObjects[i].active == TRUE && gLinkPlayerMapObjects[i].mapObjId == r3) - return NULL; - } - gSelectedMapObject = r3; - gScriptLastTalked = gMapObjects[r3].localId; - gScriptFacing = c; - return GetFieldObjectScriptPointerByFieldObjectId(r3); -} - -static u8 *sub_8068364(struct MapPosition *position, u8 b, u8 c) -{ - u8 r3; - u8 *script; - - r3 = GetFieldObjectIdByXYZ(position->x, position->y, position->height); - if (r3 == 16 || gMapObjects[r3].localId == 0xFF) - { - if (MetatileBehavior_IsCounter(b) != TRUE) - return NULL; - r3 = GetFieldObjectIdByXYZ(position->x + gUnknown_0821664C[c].x, position->y + gUnknown_0821664C[c].y, position->height); - if (r3 == 16 || gMapObjects[r3].localId == 0xFF) - return NULL; - } - //_080683E8 - gSelectedMapObject = r3; - gScriptLastTalked = gMapObjects[r3].localId; - gScriptFacing = c; - script = GetFieldObjectScriptPointerByFieldObjectId(r3); - script = GetRamScript(gScriptLastTalked, script); - return script; -} - -static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *position, u8 unused, u8 c) -{ - struct BgEvent *bgEvent = FindInvisibleMapObjectByPosition(&gMapHeader, position->x - 7, position->y - 7, position->height); - - if (bgEvent == NULL) - return NULL; - if (bgEvent->bgUnion.script == NULL) - return gUnknown_081C6C02; - switch (bgEvent->kind) - { - case 0: - default: - return bgEvent->bgUnion.script; - case 1: - if (c != 2) - return NULL; - break; - case 2: - if (c != 1) - return NULL; - break; - case 3: - if (c != 4) - return NULL; - break; - case 4: - if (c != 3) - return NULL; - break; - case 5: - case 6: - case 7: - gSpecialVar_0x8004 = ((u32)bgEvent->bgUnion.script >> 16) + 0x258; - gSpecialVar_0x8005 = (u32)bgEvent->bgUnion.script; - if (FlagGet(gSpecialVar_0x8004) == TRUE) - return NULL; - return HiddenItemScript; - case 8: - if (c == 2) - { - gSpecialVar_0x8004 = (u32)bgEvent->bgUnion.script; - if (sub_80BC050()) - return gUnknown_081A2C51; - } - return NULL; - } - return bgEvent->bgUnion.script; -} - -static u8 *sub_8068500(struct MapPosition *position, u8 b, u8 c) -{ - s8 height; - - if (MetatileBehavior_IsPlayerFacingTVScreen(b, c) == TRUE) - return Event_TV; - if (MetatileBehavior_IsPC(b) == TRUE) - return gUnknown_081A0009; - if (MetatileBehavior_IsClosedSootopolisGymDoor(b) == TRUE) - return ClosedSootopolisGymDoorScript; - if (is_tile_x84(b) == TRUE) - return gUnknown_081A4363; - if (MetatileBehavior_IsPokeblockFeeder(b) == TRUE) - return gUnknown_081C346A; - if (MetatileBehavior_IsTrickHousePuzzleDoor(b) == TRUE) - return gUnknown_081616E1; - if (MetatileBehavior_IsRegionMap(b) == TRUE) - return Event_WorldMap; - if (sub_805791C(b) == TRUE) - return Event_RunningShoesManual; - if (MetatileBehavior_IsPictureBookShelf(b) == TRUE) - return PictureBookShelfScript; - if (MetatileBehavior_IsBookShelf(b) == TRUE) - return BookshelfScript; - if (MetatileBehavior_IsPokeCenterBookShelf(b) == TRUE) - return PokemonCenterBookshelfScript; - if (MetatileBehavior_IsVase(b) == TRUE) - return VaseScript; - if (MetatileBehavior_IsTrashCan(b) == TRUE) - return TrashCanScript; - if (MetatileBehavior_IsShopShelf(b) == TRUE) - return ShopShelfScript; - if (MetatileBehavior_IsBlueprint(b) == TRUE) - return BlueprintScript; - height = position->height; - if (height == MapGridGetZCoordAt(position->x, position->y)) - { - if (MetatileBehavior_IsSecretBasePC(b) == TRUE) - return gUnknown_0815F36C; - if (sub_805724C(b) == TRUE) - return gUnknown_0815F43A; - if (sub_8057364(b) == TRUE) - return gUnknown_0815F523; - if (sub_8057378(b) == TRUE) - return gUnknown_0815F528; - } - return NULL; -} - -static u8 *TryGetFieldMoveScript(struct MapPosition *unused1, u8 b, u8 unused2) -{ - if (FlagGet(BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) - return UseSurfScript; - if (MetatileBehavior_IsWaterfall(b) == TRUE) - { - if (FlagGet(BADGE08_GET) == TRUE && IsPlayerSurfingNorth() == TRUE) - return UseWaterfallScript; - else - return CannotUseWaterfallScript; - } - return NULL; -} - -static bool32 sub_8068770(void) -{ - if (FlagGet(BADGE07_GET) && sub_8068F18() == 2) - { - ScriptContext1_SetupScript(UseDiveScript); - return TRUE; - } - return FALSE; -} - -static bool32 sub_80687A4(void) -{ - if (FlagGet(BADGE07_GET) && gMapHeader.mapType == 5 && sub_8068F18() == 1) - { - ScriptContext1_SetupScript(UnderwaterUseDiveScript); - return TRUE; - } - return FALSE; -} - -static bool8 sub_80687E4(struct MapPosition *position, u16 b, u16 unused) -{ - if (mapheader_trigger_activate_at__run_now(position) == TRUE) - return TRUE; - if (sub_8068A64(position, b) == TRUE) - return TRUE; - if (sub_8068870(b) == TRUE) - return TRUE; - if (sub_8068894() == TRUE) - return TRUE; - if (UpdateRepelCounter() == TRUE) - return TRUE; - return FALSE; -} - -bool8 mapheader_trigger_activate_at__run_now(struct MapPosition *position) -{ - u8 *script = mapheader_trigger_activate_at(&gMapHeader, position->x - 7, position->y - 7, position->height); - - if (script == NULL) - return FALSE; - ScriptContext1_SetupScript(script); - return TRUE; -} - -//can be u8, u16, or u32 -bool8 sub_8068870(u16 a) -{ - if (MetatileBehavior_IsCrackedFloorHole(a)) - { - ScriptContext1_SetupScript(GraniteCave_B1F_EventScript_1C6BC5); - return TRUE; - } - return FALSE; -} - -bool8 sub_8068894(void) -{ - sub_8082B78(); - happiness_algorithm_step(); - if (overworld_poison_step() == TRUE) - { - ScriptContext1_SetupScript(gUnknown_081A14B8); - return TRUE; - } - if (sub_80422A0()) - { - IncrementGameStat(13); - ScriptContext1_SetupScript(Event_EggHatch); - return TRUE; - } - if (SafariZoneTakeStep() == TRUE) - return TRUE; - if (CountSSTidalStep(1) == TRUE) - { - ScriptContext1_SetupScript(gUnknown_0815FD0D); - return TRUE; - } - return FALSE; -} - -void unref_sub_80688F8(void) -{ - VarSet(VAR_HAPPINESS_STEP_COUNTER, 0); -} - -static void happiness_algorithm_step(void) -{ - u16 *ptr = GetVarPointer(VAR_HAPPINESS_STEP_COUNTER); - int i; - - (*ptr)++; - (*ptr) %= 128; - if (*ptr == 0) - { - struct Pokemon *pkmn = gPlayerParty; - - for (i = 5; i >= 0; i--) - { - AdjustFriendship(pkmn, 5); - pkmn++; - } - } -} - -void overworld_poison_timer_set(void) -{ - VarSet(VAR_POISON_STEP_COUNTER, 0); -} - -static bool8 overworld_poison_step(void) -{ - u16 *ptr; - - if (gMapHeader.mapType != 9) - { - ptr = GetVarPointer(VAR_POISON_STEP_COUNTER); - (*ptr)++; - (*ptr) %= 4; - if (*ptr == 0) - { - switch (overworld_poison()) - { - case 0: - return FALSE; - case 1: - return FALSE; - case 2: - return TRUE; - } - } - } - return FALSE; -} - -void prev_quest_postbuffer_cursor_backup_reset(void) -{ - gUnknown_0202E8C0 = 0; -} - -static bool8 is_it_battle_time_3(u16 a) -{ - if (gUnknown_0202E8C0 < 4) - { - gUnknown_0202E8C0++; - gUnknown_0202E8C2 = a; - return FALSE; - } - if (StandardWildEncounter(a, gUnknown_0202E8C2) == TRUE) - { - gUnknown_0202E8C0 = 0; - gUnknown_0202E8C2 = a; - return TRUE; - } - else - { - gUnknown_0202E8C2 = a; - return FALSE; - } -} - -static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *position, u16 b, u8 c) -{ - s8 r6 = map_warp_check_packed(&gMapHeader, position); - - if (is_non_stair_warp_tile(b, c) == TRUE && r6 != -1) - { - walkrun_find_lowest_active_bit_in_bitfield(); - sub_8068C30(&gMapHeader, r6, position); - sub_8080E88(); - return TRUE; - } - return FALSE; -} - -bool8 sub_8068A64(struct MapPosition *position, u16 b) -{ - s8 r4 = map_warp_check_packed(&gMapHeader, position); - - if (r4 != -1 && sub_8068B30(b) == TRUE) - { - walkrun_find_lowest_active_bit_in_bitfield(); - sub_8068C30(&gMapHeader, r4, position); - if (MetatileBehavior_IsEscalator(b) == TRUE) - { - sub_8080F2C(b); - return TRUE; - } - if (MetatileBehavior_IsLavaridgeB1FWarp(b) == TRUE) - { - sub_8080F48(); - return TRUE; - } - if (MetatileBehavior_IsLavaridge1FWarp(b) == TRUE) - { - sub_8080F58(); - return TRUE; - } - if (MetatileBehavior_IsAquaHideoutWarp(b) == TRUE) - { - sub_8080F68(); - return TRUE; - } - if (MetatileBehavior_IsMtPyreHole(b) == TRUE) - { - ScriptContext1_SetupScript(gUnknown_081C6BDE); - return TRUE; - } - sub_8080E88(); - return TRUE; - } - return FALSE; -} - -static bool8 sub_8068B30(u16 a) -{ - if (MetatileBehavior_IsWarpDoor(a) != TRUE - && MetatileBehavior_IsLadder(a) != TRUE - && MetatileBehavior_IsEscalator(a) != TRUE - && MetatileBehavior_IsNonAnimDoor(a) != TRUE - && MetatileBehavior_IsLavaridgeB1FWarp(a) != TRUE - && MetatileBehavior_IsLavaridge1FWarp(a) != TRUE - && MetatileBehavior_IsAquaHideoutWarp(a) != TRUE - && MetatileBehavior_IsMtPyreHole(a) != TRUE) - return FALSE; - return TRUE; -} - -static bool8 is_non_stair_warp_tile(u16 a, u8 b) -{ - switch (b) - { - case 2: - return MetatileBehavior_IsNorthArrowWarp(a); - case 1: - return MetatileBehavior_IsSouthArrowWarp(a); - case 3: - return MetatileBehavior_IsWestArrowWarp(a); - case 4: - return MetatileBehavior_IsEastArrowWarp(a); - } - return FALSE; -} - -static s8 map_warp_check_packed(struct MapHeader *mapHeader, struct MapPosition *position) -{ - return map_warp_check(mapHeader, position->x - 7, position->y - 7, position->height); -} - -static void sub_8068C30(struct MapHeader *unused, s8 b, struct MapPosition *position) -{ - struct WarpEvent *warpEvent = &gMapHeader.events->warps[b]; - - if (warpEvent->mapNum == 0x7F) - { - copy_saved_warp2_bank_and_enter_x_to_warp1(warpEvent->mapGroup); - } - else - { - struct MapHeader *mapHeader; - - warp1_set_2(warpEvent->unk7, warpEvent->mapNum, warpEvent->mapGroup); - sub_80535C4(position->x, position->y); - mapHeader = get_mapheader_by_bank_and_number(warpEvent->unk7, warpEvent->mapNum); - if (mapHeader->events->warps[warpEvent->mapGroup].mapNum == 0x7F) - saved_warp2_set(mapHeader->events->warps[b].mapGroup, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, b); - } -} - -static bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 b, u8 c) -{ - s8 r4; - - if (c == 2) - { - if (sub_80571C0(b) == TRUE) - { - sub_80BC038(position, gMapHeader.events); - return TRUE; - } - if (MetatileBehavior_IsWarpDoor(b) == TRUE) - { - r4 = map_warp_check_packed(&gMapHeader, position); - if (r4 != -1 && sub_8068B30(b) == TRUE) - { - walkrun_find_lowest_active_bit_in_bitfield(); - sub_8068C30(&gMapHeader, r4, position); - sub_8080EF0(); - return TRUE; - } - } - } - return FALSE; -} - -static s8 map_warp_check(struct MapHeader *mapHeader, u16 b, u16 c, u8 d) -{ - s32 i; - struct WarpEvent *warpEvent = mapHeader->events->warps; - u8 warpCount = mapHeader->events->warpCount; - - for (i = 0; i < warpCount; i++, warpEvent++) - { - if ((u16)warpEvent->x == b && (u16)warpEvent->y == c) - { - if ((u8)warpEvent->warpId == d || (u8)warpEvent->warpId == 0) - return i; - } - } - return -1; -} - -static u8 *trigger_activate(struct CoordEvent *coordEvent) -{ - if (coordEvent != NULL) - { - if (coordEvent->script == NULL) - { - DoCoordEventWeather(coordEvent->trigger); - return NULL; - } - if (coordEvent->trigger == 0) - { - ScriptContext2_RunNewScript(coordEvent->script); - return NULL; - } - if (VarGet(coordEvent->trigger) == (u8)coordEvent->index) - return coordEvent->script; - } - return NULL; -} - -static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 b, u16 c, u8 d) -{ - 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 == b && (u16)coordEvents[i].y == c) - { - if (coordEvents[i].unk4 == d || coordEvents[i].unk4 == 0) - { - script = trigger_activate(&coordEvents[i]); - if (script != NULL) - return script; - } - } - } - return NULL; -} - -u8 *sub_8068E24(struct MapPosition *position) -{ - return mapheader_trigger_activate_at(&gMapHeader, position->x - 7, position->y - 7, position->height); -} - -static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *mapHeader, u16 b, u16 c, u8 d) -{ - u8 i; - struct BgEvent *bgEvents = mapHeader->events->bgEvents; - u8 bgEventCount = mapHeader->events->bgEventCount; - - for (i = 0; i < bgEventCount; i++) - { - if ((u16)bgEvents[i].x == b && (u16)bgEvents[i].y == c) - { - if (bgEvents[i].unk4 == d || bgEvents[i].unk4 == 0) - return &bgEvents[i]; - } - } - return NULL; -} - -int dive_warp(struct MapPosition *position, u16 b) -{ - if (gMapHeader.mapType == 5 && sub_805750C(b) == 0) - { - if (sub_80538B0(position->x - 7, position->y - 7)) - { - walkrun_find_lowest_active_bit_in_bitfield(); - sp13E_warp_to_last_warp(); - PlaySE(SE_W291); - return TRUE; - } - } - else if (sub_80574EC(b) == TRUE) - { - if (sub_80538D0(position->x - 7, position->y - 7)) - { - walkrun_find_lowest_active_bit_in_bitfield(); - sp13E_warp_to_last_warp(); - PlaySE(SE_W291); - return TRUE; - } - } - return FALSE; -} - -u8 sub_8068F18(void) -{ - s16 x, y; - u8 r5; - - PlayerGetDestCoords(&x, &y); - r5 = MapGridGetMetatileBehaviorAt(x, y); - if (gMapHeader.mapType == 5 && sub_805750C(r5) == 0) - { - if (sub_80538B0(x - 7, y - 7) == TRUE) - return 1; - } - else if (sub_80574EC(r5) == TRUE) - { - if (sub_80538D0(x - 7, y - 7) == TRUE) - return 2; - } - return 0; -} - -u8 *GetFieldObjectScriptPointerForComparison(void) -{ - u8 r4; - struct MapPosition position; - - r4 = player_get_direction_upper_nybble(); - player_get_next_pos_and_height(&position); - return sub_8068364(&position, MapGridGetMetatileBehaviorAt(position.x, position.y), r4); -} - -int SetCableClubWarp(void) -{ - struct MapPosition position; - - player_get_direction_upper_nybble(); //unnecessary - player_get_pos_to_and_height(&position); - MapGridGetMetatileBehaviorAt(position.x, position.y); //unnecessary - sub_8068C30(&gMapHeader, map_warp_check_packed(&gMapHeader, &position), &position); - return 0; -} diff --git a/src/field_door.c b/src/field_door.c deleted file mode 100644 index 791ed4c94..000000000 --- a/src/field_door.c +++ /dev/null @@ -1,221 +0,0 @@ -#include "global.h" -#include "field_door.h" -#include "field_camera.h" -#include "fieldmap.h" -#include "metatile_behavior.h" -#include "task.h" - -extern struct DoorAnimFrame gDoorOpenAnimFrames[]; -extern struct DoorAnimFrame gDoorCloseAnimFrames[]; -extern struct DoorGraphics gDoorAnimGraphicsTable[]; - -static void CopyDoorTilesToVram(void *src) -{ - CpuFastSet(src, (void *)(VRAM + 0x7F00), 0x40); -} - -static void door_build_blockdef(u16 *a, u16 b, u8 *c) -{ - int i; - u16 unk; - - for (i = 0; i < 4; i++) - { - unk = *(c++) << 12; - a[i] = unk | (b + i); - } - for (; i < 8; i++) - { - unk = *(c++) << 12; - a[i] = unk; - } -} - -static void DrawCurrentDoorAnimFrame(u32 x, u32 y, u8 *c) -{ - u16 arr[8]; - - door_build_blockdef(arr, 0x3F8, c); - DrawDoorMetatileAt(x, y - 1, arr); - door_build_blockdef(arr, 0x3FC, c + 4); - DrawDoorMetatileAt(x, y, arr); -} - -static void DrawClosedDoorTiles(u32 x, u32 y) -{ - CurrentMapDrawMetatileAt(x, y - 1); - CurrentMapDrawMetatileAt(x, y); -} - -static void DrawDoor(struct DoorGraphics *gfx, struct DoorAnimFrame *frame, u32 x, u32 y) -{ - if (frame->offset == 0xFFFF) - DrawClosedDoorTiles(x, y); - else - { - CopyDoorTilesToVram(gfx->tiles + frame->offset); - DrawCurrentDoorAnimFrame(x, y, gfx->palette); - } -} - -enum -{ - TD_FRAMELIST = 0, - TD_GFX = 2, - TD_FRAME = 4, - TD_COUNTER, - TD_X, - TD_Y -}; - -static bool32 sub_8058464(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *taskData) -{ - if (taskData[TD_COUNTER] == 0) - DrawDoor(gfx, &frames[taskData[TD_FRAME]], taskData[TD_X], taskData[TD_Y]); - if (taskData[TD_COUNTER] == frames[taskData[TD_FRAME]].time) - { - taskData[TD_COUNTER] = 0; - taskData[TD_FRAME]++; - if (frames[taskData[TD_FRAME]].time == 0) - return FALSE; - else - return TRUE; - } - taskData[TD_COUNTER]++; - return TRUE; -} - -static void Task_AnimateDoor(u8 taskId) -{ - u16 *taskData = gTasks[taskId].data; - struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(taskData[TD_FRAMELIST] << 16 | taskData[TD_FRAMELIST + 1]); - struct DoorGraphics *gfx = (struct DoorGraphics *)(taskData[TD_GFX] << 16 | taskData[TD_GFX + 1]); - - if (sub_8058464(gfx, frames, taskData) == FALSE) - DestroyTask(taskId); -} - -static struct DoorAnimFrame *GetLastDoorFrame(struct DoorAnimFrame *frame, void *unused) -{ - while (frame->time != 0) - frame++; - return frame - 1; -} - -static struct DoorGraphics *GetDoorGraphics(struct DoorGraphics *gfx, u16 metatileNum) -{ - while (gfx->tiles != NULL) - { - if (gfx->metatileNum == metatileNum) - return gfx; - gfx++; - } - return NULL; -} - -static s8 StartDoorAnimationTask(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, u32 x, u32 y) -{ - if (FuncIsActiveTask(Task_AnimateDoor) == TRUE) - return -1; - else - { - u8 taskId = CreateTask(Task_AnimateDoor, 0x50); - s16 *taskData = gTasks[taskId].data; - - taskData[TD_X] = x; - taskData[TD_Y] = y; - - taskData[TD_FRAMELIST + 1] = (u32)frames; - taskData[TD_FRAMELIST] = (u32)frames >> 16; - - taskData[TD_GFX + 1] = (u32)gfx; - taskData[TD_GFX] = (u32)gfx >> 16; - - return taskId; - } -} - -static void DrawClosedDoor(struct DoorGraphics *unused, u32 x, u32 y) -{ - DrawClosedDoorTiles(x, y); -} - -static void DrawOpenedDoor(struct DoorGraphics *gfx, u32 x, u32 y) -{ - gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); - if (gfx != NULL) - DrawDoor(gfx, GetLastDoorFrame(gDoorOpenAnimFrames, gDoorOpenAnimFrames), x, y); -} - -static s8 StartDoorOpenAnimation(struct DoorGraphics *gfx, u32 x, u32 y) -{ - gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); - if (gfx == NULL) - return -1; - else - return StartDoorAnimationTask(gfx, gDoorOpenAnimFrames, x, y); -} - -static s8 StartDoorCloseAnimation(struct DoorGraphics *gfx, u32 x, u32 y) -{ - gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); - if (gfx == NULL) - return -1; - else - return StartDoorAnimationTask(gfx, gDoorCloseAnimFrames, x, y); -} - -static s8 cur_mapdata_get_door_x2_at(struct DoorGraphics *gfx, u32 x, u32 y) -{ - gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); - if (gfx == NULL) - return -1; - else - return gfx->unk2; -} - -void unref_sub_805869C(u32 x, u32 y) -{ - StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y); -} - -void FieldSetDoorOpened(u32 x, u32 y) -{ - if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) - DrawOpenedDoor(gDoorAnimGraphicsTable, x, y); -} - -void FieldSetDoorClosed(u32 x, u32 y) -{ - if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) - DrawClosedDoor(gDoorAnimGraphicsTable, x, y); -} - -s8 FieldAnimateDoorClose(u32 x, u32 y) -{ - if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) - return -1; - else - return StartDoorCloseAnimation(gDoorAnimGraphicsTable, x, y); -} - -s8 FieldAnimateDoorOpen(u32 x, u32 y) -{ - if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) - return -1; - else - return StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y); -} - -bool8 FieldIsDoorAnimationRunning(void) -{ - return FuncIsActiveTask(Task_AnimateDoor); -} - -u32 sub_8058790(u32 x, u32 y) -{ - if (cur_mapdata_get_door_x2_at(gDoorAnimGraphicsTable, x, y) == 0) - return 8; - else - return 18; -} diff --git a/src/field_effect.c b/src/field_effect.c deleted file mode 100644 index 3632d7053..000000000 --- a/src/field_effect.c +++ /dev/null @@ -1,3406 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "script.h" -#include "trig.h" -#include "main.h" -#include "field_weather.h" -#include "decompress.h" -#include "sprite.h" -#include "menu.h" -#include "palette.h" -#include "text.h" -#include "rom4.h" -#include "task.h" -#include "sound.h" -#include "songs.h" -#include "decoration.h" -#include "field_player_avatar.h" -#include "field_map_obj_helpers.h" -#include "field_map_obj.h" -#include "metatile_behavior.h" -#include "field_camera.h" -#include "field_effect.h" -#include "field_fadetransition.h" -#include "fieldmap.h" -#include "field_map_obj.h" -#include "util.h" -#include "field_effect_helpers.h" - -#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} - -EWRAM_DATA u32 gUnknown_0202FF84[8] = {0}; - -const u32 gSpriteImage_839DC14[] = INCBIN_U32("graphics/birch_speech/birch.4bpp"); -const u16 gBirchPalette[16] = INCBIN_U16("graphics/birch_speech/birch.gbapal"); -const u32 gSpriteImage_839E434[] = INCBIN_U32("graphics/misc/pokeball_glow.4bpp"); -const u16 gFieldEffectObjectPalette4[16] = INCBIN_U16("graphics/field_effect_objects/palettes/04.gbapal"); -const u32 gSpriteImage_839E474[] = INCBIN_U32("graphics/misc/pokecenter_monitor/0.4bpp"); -const u32 gSpriteImage_839E534[] = INCBIN_U32("graphics/misc/pokecenter_monitor/1.4bpp"); -const u32 gSpriteImage_839E5F4[] = INCBIN_U32("graphics/misc/big_hof_monitor.4bpp"); -const u32 gSpriteImage_839E7F4[] = INCBIN_U32("graphics/misc/small_hof_monitor.4bpp"); -const u16 gFieldEffectObjectPalette5[16] = INCBIN_U16("graphics/field_effect_objects/palettes/05.gbapal"); - -// Graphics for the lights streaking past your Pokemon when it uses a field move. -const u32 gFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/field_move_streaks.4bpp"); -const u16 gFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/field_move_streaks.gbapal"); -const u16 gFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/field_move_streaks_map.bin"); - -// The following light streaks effect is used when the map is dark (e.g. a cave). -const u32 gDarknessFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/darkness_field_move_streaks.4bpp"); -const u16 gDarknessFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/darkness_field_move_streaks.gbapal"); -const u16 gDarknessFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/darkness_field_move_streaks_map.bin"); - -bool8 (*const gFieldEffectScriptFuncs[])(u8 **, u32 *) = { - FieldEffectCmd_loadtiles, - FieldEffectCmd_loadfadedpal, - FieldEffectCmd_loadpal, - FieldEffectCmd_callnative, - FieldEffectCmd_end, - FieldEffectCmd_loadgfx_callnative, - FieldEffectCmd_loadtiles_callnative, - FieldEffectCmd_loadfadedpal_callnative, -}; - -const struct OamData gOamData_839F0F4 = {.size = 3}; -const struct OamData gOamData_839F0FC = {.size = 0}; -const struct OamData gOamData_839F104 = {.size = 1}; - -const struct SpriteFrameImage gSpriteImageTable_839F10C[] = { - obj_frame_tiles(gSpriteImage_839DC14) -}; -const struct SpritePalette gUnknown_0839F114 = {.data = gBirchPalette, .tag = 0x1006}; - -const union AnimCmd gSpriteAnim_839F11C[] = { - ANIMCMD_FRAME(.imageValue = 0, .duration = 1), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_839F124[] = { - gSpriteAnim_839F11C -}; - -const struct SpriteTemplate gSpriteTemplate_839F128 = { - .tileTag = 0xffff, - .paletteTag = 4102, - .oam = &gOamData_839F0F4, - .anims = (const union AnimCmd *const *)&gSpriteAnimTable_839F124, - .images = gSpriteImageTable_839F10C, - .affineAnims = (const union AffineAnimCmd *const *)&gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -const struct SpritePalette gFieldEffectObjectPaletteInfo4 = {.data = gFieldEffectObjectPalette4, .tag = 0x1007}; -const struct SpritePalette gFieldEffectObjectPaletteInfo5 = {.data = gFieldEffectObjectPalette5, .tag = 0x1010}; -const struct OamData gOamData_839F150 = { - .shape = 1, - .size = 2 -}; - -const struct SpriteFrameImage gSpriteImageTable_839F158[] = { - obj_frame_tiles(gSpriteImage_839E434) -}; - -const struct SpriteFrameImage gSpriteImageTable_839F160[] = { - obj_frame_tiles(gSpriteImage_839E474), - obj_frame_tiles(gSpriteImage_839E534) -}; - -const struct SpriteFrameImage gSpriteImageTable_839F170[] = { - obj_frame_tiles(gSpriteImage_839E5F4) -}; - -const struct SpriteFrameImage gSpriteImageTable_839F178[] = { - {.data = (u8 *)gSpriteImage_839E7F4, .size = 0x200} // the macro breaks down here -}; - -const struct Subsprite Unknown_39F180[] = { - {.x = -12, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 0}, - {.x = 4, .y = -8, .priority = 2, .tileOffset = 2, .shape = 0, .size = 0}, - {.x = -12, .y = 0, .priority = 2, .tileOffset = 3, .shape = 1, .size = 0}, - {.x = 4, .y = 0, .priority = 2, .tileOffset = 5, .shape = 0, .size = 0} -}; - -const struct SubspriteTable gUnknown_0839F1A0 = subsprite_table(Unknown_39F180); - -const struct Subsprite Unknown_39F1A8[] = { - {.x = -32, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 1}, - {.x = 0, .y = -8, .priority = 2, .tileOffset = 4, .shape = 1, .size = 1}, - {.x = -32, .y = 0, .priority = 2, .tileOffset = 8, .shape = 1, .size = 1}, - {.x = 0, .y = 0, .priority = 2, .tileOffset = 12, .shape = 1, .size = 1} -}; - -const struct SubspriteTable gUnknown_0839F1C8 = subsprite_table(Unknown_39F1A8); - -const union AnimCmd gSpriteAnim_839F1D0[] = { - ANIMCMD_FRAME(.imageValue = 0, .duration = 1), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd gSpriteAnim_839F1D8[] = { - ANIMCMD_FRAME(.imageValue = 0, .duration = 16), - ANIMCMD_FRAME(.imageValue = 1, .duration = 16), - ANIMCMD_FRAME(.imageValue = 0, .duration = 16), - ANIMCMD_FRAME(.imageValue = 1, .duration = 16), - ANIMCMD_FRAME(.imageValue = 0, .duration = 16), - ANIMCMD_FRAME(.imageValue = 1, .duration = 16), - ANIMCMD_FRAME(.imageValue = 0, .duration = 16), - ANIMCMD_FRAME(.imageValue = 1, .duration = 16), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_839F1FC[] = { - gSpriteAnim_839F1D0, - gSpriteAnim_839F1D8 -}; - -const union AnimCmd *const gSpriteAnimTable_839F204[] = { - gSpriteAnim_839F1D0 -}; - -const struct SpriteTemplate gSpriteTemplate_839F208 = { - .tileTag = 0xffff, - .paletteTag = 4103, - .oam = &gOamData_839F0FC, - .anims = gSpriteAnimTable_839F1FC, - .images = gSpriteImageTable_839F158, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_PokeballGlow -}; - - -const struct SpriteTemplate gSpriteTemplate_839F220 = { - .tileTag = 0xffff, - .paletteTag = 4100, - .oam = &gOamData_839F104, - .anims = gSpriteAnimTable_839F1FC, - .images = gSpriteImageTable_839F160, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_PokecenterMonitor -}; - - -const struct SpriteTemplate gSpriteTemplate_839F238 = { - .tileTag = 0xffff, - .paletteTag = 4112, - .oam = &gOamData_839F104, - .anims = gSpriteAnimTable_839F204, - .images = gSpriteImageTable_839F170, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_HallOfFameMonitor -}; - - -const struct SpriteTemplate gSpriteTemplate_839F250 = { - .tileTag = 0xffff, - .paletteTag = 4112, - .oam = &gOamData_839F150, - .anims = gSpriteAnimTable_839F204, - .images = gSpriteImageTable_839F178, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_HallOfFameMonitor -}; - -void (*const gUnknown_0839F268[])(struct Task *) = { - PokecenterHealEffect_0, - PokecenterHealEffect_1, - PokecenterHealEffect_2, - PokecenterHealEffect_3 -}; - -void (*const gUnknown_0839F278[])(struct Task *) = { - HallOfFameRecordEffect_0, - HallOfFameRecordEffect_1, - HallOfFameRecordEffect_2, - HallOfFameRecordEffect_3 -}; - -void (*const gUnknown_0839F288[])(struct Sprite *) = { - PokeballGlowEffect_0, - PokeballGlowEffect_1, - PokeballGlowEffect_2, - PokeballGlowEffect_3, - PokeballGlowEffect_4, - PokeballGlowEffect_5, - PokeballGlowEffect_6, - PokeballGlowEffect_7 -}; - -const struct Coords16 gUnknown_0839F2A8[] = { - {.x = 0, .y = 0}, - {.x = 6, .y = 0}, - {.x = 0, .y = 4}, - {.x = 6, .y = 4}, - {.x = 0, .y = 8}, - {.x = 6, .y = 8} -}; - -const u8 gUnknown_0839F2C0[] = {16, 12, 8, 0}; -const u8 gUnknown_0839F2C4[] = {16, 12, 8, 0}; -const u8 gUnknown_0839F2C8[] = { 0, 0, 0, 0}; - -bool8 (*const gUnknown_0839F2CC[])(struct Task *) = { - sub_80867AC, - sub_8086854, - sub_8086870, - sub_80868E4, - sub_808699C, - sub_80869B8, - sub_80869F8 -}; - -bool8 (*const gUnknown_0839F2E8[])(struct Task *) = { - sub_8086AA0, - sub_8086AC0, - sub_8086B30, - sub_8086B54, - sub_8086B64, - sub_8086B88 -}; - -bool8 (*const gUnknown_0839F300[])(struct Task *) = { - sub_8086CF4, - sub_8086D70, - sub_8086DB0, - sub_8086E10, - sub_8086E50, - sub_8086EB0, - sub_8086ED4 -}; - -bool8 (*const gUnknown_0839F31C[])(struct Task *, struct MapObject *) = { - sub_8086FB0, - waterfall_1_do_anim_probably, - waterfall_2_wait_anim_finish_probably, - sub_8087030, - sub_8087058 -}; - -bool8 (*const gUnknown_0839F330[])(struct Task *) = { - sub_8087124, - dive_2_unknown, - dive_3_unknown -}; - -bool8 (*const gUnknown_0839F33C[])(struct Task *, struct MapObject *, struct Sprite *) = { - sub_808722C, - sub_8087264, - sub_8087298, - sub_80872E4, - sub_80873D8, - sub_80873F4 -}; - -bool8 (*const gUnknown_0839F354[])(struct Task *, struct MapObject *, struct Sprite *) = { - sub_80874CC, - sub_80874FC, - sub_8087548, - sub_808759C -}; - -bool8 (*const gUnknown_0839F364[])(struct Task *, struct MapObject *, struct Sprite *) = { - sub_80876C8, - sub_80876F8, - sub_8087774, - sub_80877AC, - sub_80877D4 -}; - -void (*const gUnknown_0839F378[])(struct Task *) = { - sub_80878F4, - sub_8087914 -}; - -const u8 gUnknown_0839F380[] = {1, 3, 4, 2, 1}; - -void (*const gUnknown_0839F388[])(struct Task *) = { - sub_8087AA4, - sub_8087AC8 -}; - -void (*const gUnknown_0839F390[])(struct Task *) = { - sub_8087BEC, - sub_8087C14, - sub_8087CA4, - sub_8087D78 -}; - -void (*const gUnknown_0839F3A0[])(struct Task *) = { - sub_8087E4C, - sub_8087ED8, - sub_8087FDC -}; - -void (*const gUnknown_0839F3AC[])(struct Task *) = { - sub_8088150, - sub_80881C0, - sub_8088228, - sub_80882B4, - sub_80882E4, - sub_8088338, - sub_8088380 -}; - -void (*const gUnknown_0839F3C8[])(struct Task *) = { - sub_80884AC, - sub_80884E8, - sub_8088554, - sub_80885A8, - sub_80885D8, - sub_808860C, - sub_808862C -}; - -void (*const gUnknown_0839F3E4[])(struct Task *) = { - sub_8088984, - sub_80889E4, - sub_8088A30, - sub_8088A78, - sub_8088AF4 -}; - -void (*const gUnknown_0839F3F8[])(struct Task *) = { - sub_8088CA0, - sub_8088CF8, - sub_8088D3C, - sub_8088D94, - sub_8088DD8, - sub_8088E2C, - sub_8088EB4, - sub_8088F10, - sub_8088F30 -}; - -const union AffineAnimCmd SpriteAffineAnim_839F41C[] = { - AFFINEANIMCMD_FRAME(8, 8, -30, 0), - AFFINEANIMCMD_FRAME(28, 28, 0, 30), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd SpriteAffineAnim_839F434[] = { - AFFINEANIMCMD_FRAME(256, 256, 64, 0), - AFFINEANIMCMD_FRAME(-10, -10, 0, 22), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_0839F44C[] = { - SpriteAffineAnim_839F41C, - SpriteAffineAnim_839F434 -}; - -void (*const gUnknown_0839F454[])(struct Task *) = { - sub_80892A0, - sub_8089354, - sub_80893C0, - sub_8089414, - sub_808948C, - sub_80894C4, - fishE -}; - -const s16 gUnknown_0839F470[] = { - -2, - -4, - -5, - -6, - -7, - -8, - -8, - -8, - -7, - -7, - -6, - -5, - -3, - -2, - 0, - 2, - 4, - 8 -}; - -static u8 sActiveList[32]; - -extern u8 *gFieldEffectScriptPointers[]; - -u32 FieldEffectStart(u8 id) -{ - u8 *script; - u32 val; - - FieldEffectActiveListAdd(id); - - script = gFieldEffectScriptPointers[id]; - - while (gFieldEffectScriptFuncs[*script](&script, &val)) - ; - - return val; -} - -bool8 FieldEffectCmd_loadtiles(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_LoadTiles(script); - return TRUE; -} - -bool8 FieldEffectCmd_loadfadedpal(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_LoadFadedPalette(script); - return TRUE; -} - -bool8 FieldEffectCmd_loadpal(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_LoadPalette(script); - return TRUE; -} - -bool8 FieldEffectCmd_callnative(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_CallNative(script, val); - return TRUE; -} - -bool8 FieldEffectCmd_end(u8 **script, u32 *val) -{ - return FALSE; -} - -bool8 FieldEffectCmd_loadgfx_callnative(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_LoadTiles(script); - FieldEffectScript_LoadFadedPalette(script); - FieldEffectScript_CallNative(script, val); - return TRUE; -} - -bool8 FieldEffectCmd_loadtiles_callnative(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_LoadTiles(script); - FieldEffectScript_CallNative(script, val); - return TRUE; -} - -bool8 FieldEffectCmd_loadfadedpal_callnative(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_LoadFadedPalette(script); - FieldEffectScript_CallNative(script, val); - return TRUE; -} - -u32 FieldEffectScript_ReadWord(u8 **script) -{ - return (*script)[0] - + ((*script)[1] << 8) - + ((*script)[2] << 16) - + ((*script)[3] << 24); -} - -void FieldEffectScript_LoadTiles(u8 **script) -{ - struct SpriteSheet *sheet = (struct SpriteSheet *)FieldEffectScript_ReadWord(script); - if (GetSpriteTileStartByTag(sheet->tag) == 0xFFFF) - LoadSpriteSheet(sheet); - (*script) += 4; -} - -void FieldEffectScript_LoadFadedPalette(u8 **script) -{ - struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); - LoadSpritePalette(palette); - sub_807D78C(IndexOfSpritePaletteTag(palette->tag)); - (*script) += 4; -} - -void FieldEffectScript_LoadPalette(u8 **script) -{ - struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); - LoadSpritePalette(palette); - (*script) += 4; -} - -void FieldEffectScript_CallNative(u8 **script, u32 *val) -{ - u32 (*func)(void) = (u32 (*)(void))FieldEffectScript_ReadWord(script); - *val = func(); - (*script) += 4; -} - -void FieldEffectFreeGraphicsResources(struct Sprite *sprite) -{ - u16 sheetTileStart = sprite->sheetTileStart; - u32 paletteNum = sprite->oam.paletteNum; - DestroySprite(sprite); - FieldEffectFreeTilesIfUnused(sheetTileStart); - FieldEffectFreePaletteIfUnused(paletteNum); -} - -void FieldEffectStop(struct Sprite *sprite, u8 id) -{ - FieldEffectFreeGraphicsResources(sprite); - FieldEffectActiveListRemove(id); -} - -void FieldEffectFreeTilesIfUnused(u16 tileStart) -{ - u8 i; - u16 tag = GetSpriteTileTagByTileStart(tileStart); - - if (tag != 0xFFFF) - { - for (i = 0; i < MAX_SPRITES; i++) - if (gSprites[i].inUse && gSprites[i].usingSheet && tileStart == gSprites[i].sheetTileStart) - return; - FreeSpriteTilesByTag(tag); - } -} - -void FieldEffectFreePaletteIfUnused(u8 paletteNum) -{ - u8 i; - u16 tag = GetSpritePaletteTagByPaletteNum(paletteNum); - - if (tag != 0xFFFF) - { - for (i = 0; i < MAX_SPRITES; i++) - if (gSprites[i].inUse && gSprites[i].oam.paletteNum == paletteNum) - return; - FreeSpritePaletteByTag(tag); - } -} - -void FieldEffectActiveListClear(void) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(sActiveList); i++) - sActiveList[i] = 0xFF; -} - -void FieldEffectActiveListAdd(u8 id) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(sActiveList); i++) - { - if (sActiveList[i] == 0xFF) - { - sActiveList[i] = id; - return; - } - } -} - -void FieldEffectActiveListRemove(u8 id) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(sActiveList); i++) - { - if (sActiveList[i] == id) - { - sActiveList[i] = 0xFF; - return; - } - } -} - -bool8 FieldEffectActiveListContains(u8 id) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(sActiveList); i++) - if (sActiveList[i] == id) - return TRUE; - return FALSE; -} - -u8 CreateTrainerSprite_BirchSpeech(u8 gender, s16 x, s16 y, u8 subpriority, u8 *buffer) -{ - struct SpriteTemplate spriteTemplate; - LoadCompressedObjectPaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[gender], buffer); - LoadCompressedObjectPicOverrideBuffer(&gTrainerFrontPicTable[gender], buffer); - spriteTemplate.tileTag = gTrainerFrontPicTable[gender].tag; - spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[gender].tag; - spriteTemplate.oam = &gOamData_839F0F4; - spriteTemplate.anims = gDummySpriteAnimTable; - spriteTemplate.images = NULL; - spriteTemplate.affineAnims = gDummySpriteAffineAnimTable; - spriteTemplate.callback = SpriteCallbackDummy; - return CreateSprite(&spriteTemplate, x, y, subpriority); -} - -void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) -{ - LZDecompressVram(gTrainerFrontPicTable[gender].data, dest); - LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, 0x20); -} - -u8 CreateBirchSprite(s16 x, s16 y, u8 subpriority) -{ - LoadSpritePalette(&gUnknown_0839F114); - return CreateSprite(&gSpriteTemplate_839F128, x, y, subpriority); -} - -u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) -{ - DecompressPicFromTable_2(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, gUnknown_081FAF4C[3], gUnknown_081FAF4C[3], species); - LoadCompressedObjectPalette(&gMonPaletteTable[species]); - GetMonSpriteTemplate_803C56C(species, 3); - gUnknown_02024E8C.paletteTag = gMonPaletteTable[0].tag; - sub_807DE38(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10); - return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); -} - -u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subpriority) -{ - const struct CompressedSpritePalette *spritePalette; - - HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gUnknown_081FAF4C[3] /* this is actually u8* or something, pointing to ewram */, gUnknown_081FAF4C[3], species, g); - spritePalette = sub_80409C8(species, d, g); - LoadCompressedObjectPalette(spritePalette); - GetMonSpriteTemplate_803C56C(species, 3); - gUnknown_02024E8C.paletteTag = spritePalette->tag; - sub_807DE38(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); - return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); -} - -void FreeResourcesAndDestroySprite(struct Sprite *sprite) -{ - sub_807DE68(); - FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); - if (sprite->oam.affineMode != 0) - { - FreeOamMatrix(sprite->oam.matrixNum); - } - DestroySprite(sprite); -} - -#ifdef NONMATCHING -void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) -{ - int curRed; - int curGreen; - int curBlue; - - curRed = gPlttBufferUnfaded[i] & 0x1f; - curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; - curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; - curRed += (((0x1f - curRed) * r) >> 4); - curGreen += (((0x1f - curGreen) * g) >> 4); - curBlue += (((0x1f - curBlue) * b) >> 4); - gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); -} - -void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) -{ - int curRed; - int curGreen; - int curBlue; - - curRed = gPlttBufferUnfaded[i] & 0x1f; - curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; - curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; - curRed -= ((curRed * r) >> 4); - curGreen -= ((curGreen * g) >> 4); - curBlue -= ((curBlue * b) >> 4); - gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); -} -#else -__attribute__((naked)) -void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) -{ - asm(".syntax unified\n" - "\tpush {r4-r7,lr}\n" - "\tmov r7, r9\n" - "\tmov r6, r8\n" - "\tpush {r6,r7}\n" - "\tlsls r0, 16\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tlsls r3, 24\n" - "\tlsrs r3, 24\n" - "\tldr r4, _08085D00 @ =gPlttBufferUnfaded\n" - "\tlsrs r0, 15\n" - "\tadds r4, r0, r4\n" - "\tldrh r4, [r4]\n" - "\tmovs r5, 0x1F\n" - "\tmov r9, r5\n" - "\tmov r8, r4\n" - "\tmov r6, r8\n" - "\tands r6, r5\n" - "\tmov r8, r6\n" - "\tmovs r6, 0xF8\n" - "\tlsls r6, 2\n" - "\tands r6, r4\n" - "\tlsrs r6, 5\n" - "\tmovs r5, 0xF8\n" - "\tlsls r5, 7\n" - "\tands r4, r5\n" - "\tlsrs r4, 10\n" - "\tmov r7, r9\n" - "\tmov r5, r8\n" - "\tsubs r7, r5\n" - "\tmov r12, r7\n" - "\tmov r7, r12\n" - "\tmuls r7, r1\n" - "\tadds r1, r7, 0\n" - "\tasrs r1, 4\n" - "\tadd r8, r1\n" - "\tmov r5, r9\n" - "\tsubs r1, r5, r6\n" - "\tmuls r1, r2\n" - "\tasrs r1, 4\n" - "\tadds r6, r1\n" - "\tsubs r5, r4\n" - "\tmov r9, r5\n" - "\tmov r1, r9\n" - "\tmuls r1, r3\n" - "\tasrs r1, 4\n" - "\tadds r4, r1\n" - "\tmov r7, r8\n" - "\tlsls r7, 16\n" - "\tlsls r6, 21\n" - "\torrs r6, r7\n" - "\tlsls r4, 26\n" - "\torrs r4, r6\n" - "\tlsrs r4, 16\n" - "\tldr r1, _08085D04 @ =gPlttBufferFaded\n" - "\tadds r0, r1\n" - "\tstrh r4, [r0]\n" - "\tpop {r3,r4}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08085D00: .4byte gPlttBufferUnfaded\n" - "_08085D04: .4byte gPlttBufferFaded\n" - ".syntax divided"); -} - -__attribute__((naked)) -void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) -{ - asm(".syntax unified\n" - "\tpush {r4-r6,lr}\n" - "\tmov r6, r8\n" - "\tpush {r6}\n" - "\tlsls r0, 16\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tlsls r3, 24\n" - "\tlsrs r3, 24\n" - "\tldr r4, _08085D78 @ =gPlttBufferUnfaded\n" - "\tlsrs r0, 15\n" - "\tadds r4, r0, r4\n" - "\tldrh r4, [r4]\n" - "\tmovs r5, 0x1F\n" - "\tmov r8, r5\n" - "\tmov r6, r8\n" - "\tands r6, r4\n" - "\tmov r8, r6\n" - "\tmovs r5, 0xF8\n" - "\tlsls r5, 2\n" - "\tands r5, r4\n" - "\tlsrs r5, 5\n" - "\tmovs r6, 0xF8\n" - "\tlsls r6, 7\n" - "\tands r4, r6\n" - "\tlsrs r4, 10\n" - "\tmov r6, r8\n" - "\tmuls r6, r1\n" - "\tadds r1, r6, 0\n" - "\tasrs r1, 4\n" - "\tmov r6, r8\n" - "\tsubs r6, r1\n" - "\tadds r1, r5, 0\n" - "\tmuls r1, r2\n" - "\tasrs r1, 4\n" - "\tsubs r5, r1\n" - "\tadds r1, r4, 0\n" - "\tmuls r1, r3\n" - "\tasrs r1, 4\n" - "\tsubs r4, r1\n" - "\tlsls r6, 16\n" - "\tlsls r5, 21\n" - "\torrs r5, r6\n" - "\tlsls r4, 26\n" - "\torrs r4, r5\n" - "\tlsrs r4, 16\n" - "\tldr r1, _08085D7C @ =gPlttBufferFaded\n" - "\tadds r0, r1\n" - "\tstrh r4, [r0]\n" - "\tpop {r3}\n" - "\tmov r8, r3\n" - "\tpop {r4-r6}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08085D78: .4byte gPlttBufferUnfaded\n" - "_08085D7C: .4byte gPlttBufferFaded\n" - ".syntax divided"); -} -#endif - -void Task_PokecenterHeal(u8 taskId); -u8 CreatePokeballGlowSprite(s16, s16, s16, u16); -u8 PokecenterHealEffectHelper(s16, s16); - -bool8 FldEff_PokecenterHeal(void) -{ - u8 nPokemon; - struct Task *task; - - nPokemon = CalculatePlayerPartyCount(); - task = &gTasks[CreateTask(Task_PokecenterHeal, 0xff)]; - task->data[1] = nPokemon; - task->data[2] = 0x5d; - task->data[3] = 0x24; - task->data[4] = 0x7c; - task->data[5] = 0x18; - return FALSE; -} - -void Task_PokecenterHeal(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - gUnknown_0839F268[task->data[0]](task); -} - -void PokecenterHealEffect_0(struct Task *task) -{ - task->data[0]++; - task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 1); - task->data[7] = PokecenterHealEffectHelper(task->data[4], task->data[5]); -} - -void PokecenterHealEffect_1(struct Task *task) -{ - if (gSprites[task->data[6]].data0 > 1) - { - gSprites[task->data[7]].data0++; - task->data[0]++; - } -} - -void PokecenterHealEffect_2(struct Task *task) -{ - if (gSprites[task->data[6]].data0 > 4) - { - task->data[0]++; - } -} - -void PokecenterHealEffect_3(struct Task *task) -{ - if (gSprites[task->data[6]].data0 > 6) - { - DestroySprite(&gSprites[task->data[6]]); - FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL); - DestroyTask(FindTaskIdByFunc(Task_PokecenterHeal)); - } -} - -void Task_HallOfFameRecord(u8 taskId); -void HallOfFameRecordEffectHelper(s16, s16, s16, u8); - -bool8 FldEff_HallOfFameRecord(void) -{ - u8 nPokemon; - struct Task *task; - - nPokemon = CalculatePlayerPartyCount(); - task = &gTasks[CreateTask(Task_HallOfFameRecord, 0xff)]; - task->data[1] = nPokemon; - task->data[2] = 0x75; - task->data[3] = 0x34; - return FALSE; -} - -void Task_HallOfFameRecord(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - gUnknown_0839F278[task->data[0]](task); -} - -void HallOfFameRecordEffect_0(struct Task *task) -{ - u8 taskId; - task->data[0]++; - task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 0); - taskId = FindTaskIdByFunc(Task_HallOfFameRecord); - HallOfFameRecordEffectHelper(taskId, 0x78, 0x18, 0); - HallOfFameRecordEffectHelper(taskId, 0x28, 0x08, 1); - HallOfFameRecordEffectHelper(taskId, 0x48, 0x08, 1); - HallOfFameRecordEffectHelper(taskId, 0xa8, 0x08, 1); - HallOfFameRecordEffectHelper(taskId, 0xc8, 0x08, 1); -} - -void HallOfFameRecordEffect_1(struct Task *task) -{ - if (gSprites[task->data[6]].data0 > 1) - { - task->data[15]++; // was this ever initialized? is this ever used? - task->data[0]++; - } -} - -void HallOfFameRecordEffect_2(struct Task *task) -{ - if (gSprites[task->data[6]].data0 > 4) - { - task->data[0]++; - } -} - -void HallOfFameRecordEffect_3(struct Task *task) -{ - if (gSprites[task->data[6]].data0 > 6) - { - DestroySprite(&gSprites[task->data[6]]); - FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD); - DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord)); - } -} - -void SpriteCB_PokeballGlowEffect(struct Sprite *); - -u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5) -{ - u8 spriteId; - struct Sprite *sprite; - spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect); - sprite = &gSprites[spriteId]; - sprite->pos2.x = x; - sprite->pos2.y = y; - sprite->data5 = data5; - sprite->data6 = data6; - sprite->data7 = spriteId; - return spriteId; -} - -void SpriteCB_PokeballGlowEffect(struct Sprite *sprite) -{ - gUnknown_0839F288[sprite->data0](sprite); -} - -void PokeballGlowEffect_0(struct Sprite *sprite) -{ - u8 endSpriteId; - if (sprite->data1 == 0 || (--sprite->data1) == 0) - { - sprite->data1 = 25; - endSpriteId = CreateSpriteAtEnd(&gSpriteTemplate_839F208, gUnknown_0839F2A8[sprite->data2].x + sprite->pos2.x, gUnknown_0839F2A8[sprite->data2].y + sprite->pos2.y, 0); - gSprites[endSpriteId].oam.priority = 2; - gSprites[endSpriteId].data0 = sprite->data7; - sprite->data2++; - sprite->data6--; - PlaySE(SE_BOWA); - } - if (sprite->data6 == 0) - { - sprite->data1 = 32; - sprite->data0++; - } -} - -void PokeballGlowEffect_1(struct Sprite *sprite) -{ - if ((--sprite->data1) == 0) - { - sprite->data0++; - sprite->data1 = 8; - sprite->data2 = 0; - sprite->data3 = 0; - if (sprite->data5) - { - PlayFanfare(BGM_ME_ASA); - } - } -} - -void PokeballGlowEffect_2(struct Sprite *sprite) -{ - u8 phase; - if ((--sprite->data1) == 0) - { - sprite->data1 = 8; - sprite->data2++; - sprite->data2 &= 3; - if (sprite->data2 == 0) - { - sprite->data3++; - } - } - phase = (sprite->data2 + 3) & 3; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - phase = (sprite->data2 + 2) & 3; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - phase = (sprite->data2 + 1) & 3; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - phase = sprite->data2; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - if (sprite->data3 > 2) - { - sprite->data0++; - sprite->data1 = 8; - sprite->data2 = 0; - } -} - -void PokeballGlowEffect_3(struct Sprite *sprite) -{ - u8 phase; - if ((--sprite->data1) == 0) - { - sprite->data1 = 8; - sprite->data2++; - sprite->data2 &= 3; - if (sprite->data2 == 3) - { - sprite->data0++; - sprite->data1 = 30; - } - } - phase = sprite->data2; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); -} - -void PokeballGlowEffect_4(struct Sprite *sprite) -{ - if ((--sprite->data1) == 0) - { - sprite->data0++; - } -} - -void PokeballGlowEffect_5(struct Sprite *sprite) -{ - sprite->data0++; -} - -void PokeballGlowEffect_6(struct Sprite *sprite) -{ - if (sprite->data5 == 0 || IsFanfareTaskInactive()) - { - sprite->data0++; - } -} - -void PokeballGlowEffect_7(struct Sprite *sprite) -{ -} - -void SpriteCB_PokeballGlow(struct Sprite *sprite) -{ - if (gSprites[sprite->data0].data0 > 4) - { - FieldEffectFreeGraphicsResources(sprite); - } -} - -u8 PokecenterHealEffectHelper(s16 x, s16 y) -{ - u8 spriteIdAtEnd; - struct Sprite *sprite; - spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F220, x, y, 0); - sprite = &gSprites[spriteIdAtEnd]; - sprite->oam.priority = 2; - sprite->invisible = 1; - SetSubspriteTables(sprite, &gUnknown_0839F1A0); - return spriteIdAtEnd; -} - -void SpriteCB_PokecenterMonitor(struct Sprite *sprite) -{ - if (sprite->data0 != 0) - { - sprite->data0 = 0; - sprite->invisible = 0; - StartSpriteAnim(sprite, 1); - } - if (sprite->animEnded) - { - FieldEffectFreeGraphicsResources(sprite); - } -} - -void HallOfFameRecordEffectHelper(s16 a0, s16 a1, s16 a2, u8 a3) -{ - u8 spriteIdAtEnd; - if (!a3) - { - spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F238, a1, a2, 0); - SetSubspriteTables(&gSprites[spriteIdAtEnd], &gUnknown_0839F1C8); - } else - { - spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F250, a1, a2, 0); - } - gSprites[spriteIdAtEnd].invisible = 1; - gSprites[spriteIdAtEnd].data0 = a0; -} - -void SpriteCB_HallOfFameMonitor(struct Sprite *sprite) -{ - if (gTasks[sprite->data0].data[15]) - { - if (sprite->data1 == 0 || (--sprite->data1) == 0) - { - sprite->data1 = 16; - sprite->invisible ^= 1; - } - sprite->data2++; - } - if (sprite->data2 > 127) - { - FieldEffectFreeGraphicsResources(sprite); - } -} - -void mapldr_080842E8(void); -void mapldr_08084390(void); -void task00_8084310(u8); -void c3_080843F8(u8); - -void sub_80865BC(void) -{ - SetMainCallback2(c2_exit_to_overworld_2_switch); - gFieldCallback = mapldr_080842E8; -} - -void mapldr_080842E8(void) -{ - pal_fill_black(); - CreateTask(task00_8084310, 0); - ScriptContext2_Enable(); - FreezeMapObjects(); - gFieldCallback = NULL; -} - -void task00_8084310(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - if (!task->data[0]) - { - if (!sub_807D770()) - { - return; - } - gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; - if ((int)gUnknown_0202FF84[0] > 5) - { - gUnknown_0202FF84[0] = 0; - } - FieldEffectStart(FLDEFF_USE_FLY); - task->data[0]++; - } - if (!FieldEffectActiveListContains(FLDEFF_USE_FLY)) - { - flag_var_implications_of_teleport_(); - warp_in(); - SetMainCallback2(CB2_LoadMap); - gFieldCallback = mapldr_08084390; - DestroyTask(taskId); - } -} - -void mapldr_08084390(void) -{ - sub_8053E90(); - pal_fill_black(); - CreateTask(c3_080843F8, 0); - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; - if (gPlayerAvatar.flags & 0x08) - { - FieldObjectTurn(&gMapObjects[gPlayerAvatar.mapObjectId], DIR_WEST); - } - ScriptContext2_Enable(); - FreezeMapObjects(); - gFieldCallback = NULL; -} - -void c3_080843F8(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - if (task->data[0] == 0) - { - if (gPaletteFade.active) - { - return; - } - FieldEffectStart(FLDEFF_FLY_IN); - task->data[0]++; - } - if (!FieldEffectActiveListContains(FLDEFF_FLY_IN)) - { - ScriptContext2_Disable(); - UnfreezeMapObjects(); - DestroyTask(taskId); - } -} - -extern void pal_fill_for_map_transition(void); -void sub_8086774(u8); -extern void CameraObjectReset2(void); -extern void CameraObjectReset1(void); - -void sub_8086748(void) -{ - sub_8053E90(); - pal_fill_for_map_transition(); - ScriptContext2_Enable(); - FreezeMapObjects(); - CreateTask(sub_8086774, 0); - gFieldCallback = NULL; -} - -void sub_8086774(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - while (gUnknown_0839F2CC[task->data[0]](task)); // return code signifies whether to continue blocking here -} - -bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0] -{ - struct MapObject *playerObject; - struct Sprite *playerSprite; - playerObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - playerSprite = &gSprites[gPlayerAvatar.spriteId]; - CameraObjectReset2(); - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; - gPlayerAvatar.unk6 = 1; - FieldObjectSetSpecialAnim(playerObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); - task->data[4] = playerSprite->subspriteMode; - playerObject->mapobj_bit_26 = 1; - playerSprite->oam.priority = 1; - playerSprite->subspriteMode = 2; - task->data[0]++; - return TRUE; -} - -bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1] -{ - if (sub_807D770()) - { - task->data[0]++; - } - return FALSE; -} - -bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] -{ - struct Sprite *sprite; - s16 centerToCornerVecY; - sprite = &gSprites[gPlayerAvatar.spriteId]; - centerToCornerVecY = -(sprite->centerToCornerVecY << 1); - sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); - task->data[1] = 1; - task->data[2] = 0; - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; - PlaySE(SE_RU_HYUU); - task->data[0]++; - return FALSE; -} - -bool8 sub_80868E4(struct Task *task) -{ - struct MapObject *mapObject; - struct Sprite *sprite; - - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.y += task->data[1]; - if (task->data[1] < 8) - { - task->data[2] += task->data[1]; - if (task->data[2] & 0xf) - { - task->data[1] <<= 1; - } - } - if (task->data[3] == 0 && sprite->pos2.y >= -16) - { - task->data[3]++; - mapObject->mapobj_bit_26 = 0; - sprite->subspriteMode = task->data[4]; - mapObject->mapobj_bit_2 = 1; - } - if (sprite->pos2.y >= 0) - { - PlaySE(SE_W070); - mapObject->mapobj_bit_3 = 1; - mapObject->mapobj_bit_5 = 1; - sprite->pos2.y = 0; - task->data[0]++; - } - return FALSE; -} - -bool8 sub_808699C(struct Task *task) -{ - task->data[0]++; - task->data[1] = 4; - task->data[2] = 0; - SetCameraPanningCallback(NULL); - return TRUE; -} - -bool8 sub_80869B8(struct Task *task) -{ - SetCameraPanning(0, task->data[1]); - task->data[1] = -task->data[1]; - task->data[2]++; - if ((task->data[2] & 3) == 0) - { - task->data[1] >>= 1; - } - if (task->data[1] == 0) - { - task->data[0]++; - } - return FALSE; -} - -bool8 sub_80869F8(struct Task *task) -{ - gPlayerAvatar.unk6 = 0; - ScriptContext2_Disable(); - CameraObjectReset1(); - UnfreezeMapObjects(); - InstallCameraPanAheadCallback(); - DestroyTask(FindTaskIdByFunc(sub_8086774)); - return FALSE; -} - -void sub_8086A68(u8); -extern void sub_80B4824(u8); -extern void sub_8053FF8(void); -extern void fade_8080918(void); - -void sub_8086B98(struct Task *); -void sub_8086BE4(struct Task *); -void sub_8086C30(void); -void sub_8086C40(void); -bool8 sub_8054034(void); -void sub_8086C94(void); -void sub_80B483C(void); -void sub_8086CBC(u8); - -void sub_8086A2C(u8 a0, u8 priority) -{ - u8 taskId; - taskId = CreateTask(sub_8086A68, priority); - gTasks[taskId].data[1] = 0; - if (a0 == 0x6a) - { - gTasks[taskId].data[1] = 1; - } -} - -void sub_8086A68(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - while (gUnknown_0839F2E8[task->data[0]](task)); -} - -bool8 sub_8086AA0(struct Task *task) -{ - FreezeMapObjects(); - CameraObjectReset2(); - sub_80B4824(task->data[1]); - task->data[0]++; - return FALSE; -} - -bool8 sub_8086AC0(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); - task->data[0]++; - task->data[2] = 0; - task->data[3] = 0; - if ((u8)task->data[1] == 0) - { - task->data[0] = 4; - } - PlaySE(SE_ESUKA); - } - return FALSE; -} - -bool8 sub_8086B30(struct Task *task) -{ - sub_8086B98(task); - if (task->data[2] > 3) - { - sub_8086C30(); - task->data[0]++; - } - return FALSE; -} - -bool8 sub_8086B54(struct Task *task) -{ - sub_8086B98(task); - sub_8086C40(); - return FALSE; -} - -bool8 sub_8086B64(struct Task *task) -{ - sub_8086BE4(task); - if (task->data[2] > 3) - { - sub_8086C30(); - task->data[0]++; - } - return FALSE; -} - -bool8 sub_8086B88(struct Task *task) -{ - sub_8086BE4(task); - sub_8086C40(); - return FALSE; -} - -void sub_8086B98(struct Task *task) -{ - struct Sprite *sprite; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.x = Cos(0x84, task->data[2]); - sprite->pos2.y = Sin(0x94, task->data[2]); - task->data[3]++; - if (task->data[3] & 1) - { - task->data[2]++; - } -} - -void sub_8086BE4(struct Task *task) -{ - struct Sprite *sprite; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.x = Cos(0x7c, task->data[2]); - sprite->pos2.y = Sin(0x76, task->data[2]); - task->data[3]++; - if (task->data[3] & 1) - { - task->data[2]++; - } -} - -void sub_8086C30(void) -{ - sub_8053FF8(); - fade_8080918(); -} - -void sub_8086C40(void) -{ - if (!gPaletteFade.active && sub_8054034() == TRUE) - { - sub_80B483C(); - warp_in(); - gFieldCallback = sub_8086C94; - SetMainCallback2(CB2_LoadMap); - DestroyTask(FindTaskIdByFunc(sub_8086A68)); - } -} - -void sub_8086C94(void) -{ - sub_8053E90(); - pal_fill_for_map_transition(); - ScriptContext2_Enable(); - CreateTask(sub_8086CBC, 0); - gFieldCallback = NULL; -} - -void sub_8086CBC(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - while (gUnknown_0839F300[task->data[0]](task)); -} - -bool8 sub_8086CF4(struct Task *task) -{ - struct MapObject *mapObject; - s16 x; - s16 y; - u8 behavior; - CameraObjectReset2(); - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(DIR_EAST)); - PlayerGetDestCoords(&x, &y); - behavior = MapGridGetMetatileBehaviorAt(x, y); - task->data[0]++; - task->data[1] = 16; - if (behavior == 0x6b) - { - behavior = 1; - task->data[0] = 3; - } else - { - behavior = 0; - } - sub_80B4824(behavior); - return TRUE; -} - -bool8 sub_8086D70(struct Task *task) -{ - struct Sprite *sprite; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.x = Cos(0x84, task->data[1]); - sprite->pos2.y = Sin(0x94, task->data[1]); - task->data[0]++; - return FALSE; -} - -bool8 sub_8086DB0(struct Task *task) -{ - struct Sprite *sprite; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.x = Cos(0x84, task->data[1]); - sprite->pos2.y = Sin(0x94, task->data[1]); - task->data[2]++; - if (task->data[2] & 1) - { - task->data[1]--; - } - if (task->data[1] == 0) - { - sprite->pos2.x = 0; - sprite->pos2.y = 0; - task->data[0] = 5; - } - return FALSE; -} - -bool8 sub_8086E10(struct Task *task) -{ - struct Sprite *sprite; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.x = Cos(0x7c, task->data[1]); - sprite->pos2.y = Sin(0x76, task->data[1]); - task->data[0]++; - return FALSE; -} - -bool8 sub_8086E50(struct Task *task) -{ - struct Sprite *sprite; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.x = Cos(0x7c, task->data[1]); - sprite->pos2.y = Sin(0x76, task->data[1]); - task->data[2]++; - if (task->data[2] & 1) - { - task->data[1]--; - } - if (task->data[1] == 0) - { - sprite->pos2.x = 0; - sprite->pos2.y = 0; - task->data[0]++; - } - return FALSE; -} - -extern bool8 sub_80B4850(void); - -bool8 sub_8086EB0(struct Task *task) -{ - if (sub_80B4850()) - { - return FALSE; - } - sub_80B483C(); - task->data[0]++; - return TRUE; -} - -bool8 sub_8086ED4(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - CameraObjectReset1(); - ScriptContext2_Disable(); - FieldObjectSetSpecialAnim(mapObject, GetGoSpeed0AnimId(DIR_EAST)); - DestroyTask(FindTaskIdByFunc(sub_8086CBC)); - } - return FALSE; -} - -void sub_8086F64(u8); - -bool8 FldEff_UseWaterfall(void) -{ - u8 taskId; - taskId = CreateTask(sub_8086F64, 0xff); - gTasks[taskId].data[1] = gUnknown_0202FF84[0]; - sub_8086F64(taskId); - return FALSE; -} - -void sub_8086F64(u8 taskId) -{ - while (gUnknown_0839F31C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])); -} - -bool8 sub_8086FB0(struct Task *task, struct MapObject *mapObject) -{ - ScriptContext2_Enable(); - gPlayerAvatar.unk6 = 1; - task->data[0]++; - return FALSE; -} - -bool8 waterfall_1_do_anim_probably(struct Task *task, struct MapObject *mapObject) -{ - ScriptContext2_Enable(); - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) - { - FieldObjectClearAnimIfSpecialAnimFinished(mapObject); - gUnknown_0202FF84[0] = task->data[1]; - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - task->data[0]++; - } - return FALSE; -} - -bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct MapObject *mapObject) -{ - if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) - { - return FALSE; - } - task->data[0]++; - return TRUE; -} - -bool8 sub_8087030(struct Task *task, struct MapObject *mapObject) -{ - FieldObjectSetSpecialAnim(mapObject, GetSimpleGoAnimId(DIR_NORTH)); - task->data[0]++; - return FALSE; -} - -bool8 sub_8087058(struct Task *task, struct MapObject *mapObject) -{ - if (!FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - return FALSE; - } - if (MetatileBehavior_IsWaterfall(mapObject->mapobj_unk_1E)) - { - task->data[0] = 3; - return TRUE; - } - ScriptContext2_Disable(); - gPlayerAvatar.unk6 = 0; - DestroyTask(FindTaskIdByFunc(sub_8086F64)); - FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL); - return FALSE; -} - -void Task_Dive(u8); -extern int dive_warp(struct MapPosition *, u16); - -bool8 FldEff_UseDive(void) -{ - u8 taskId; - taskId = CreateTask(Task_Dive, 0xff); - gTasks[taskId].data[15] = gUnknown_0202FF84[0]; - gTasks[taskId].data[14] = gUnknown_0202FF84[1]; - Task_Dive(taskId); - return FALSE; -} - -void Task_Dive(u8 taskId) -{ - while (gUnknown_0839F330[gTasks[taskId].data[0]](&gTasks[taskId])); -} - -bool8 sub_8087124(struct Task *task) -{ - gPlayerAvatar.unk6 = 1; - task->data[0]++; - return FALSE; -} - -bool8 dive_2_unknown(struct Task *task) -{ - ScriptContext2_Enable(); - gUnknown_0202FF84[0] = task->data[15]; - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - task->data[0]++; - return FALSE; -} - -bool8 dive_3_unknown(struct Task *task) -{ - struct MapPosition mapPosition; - PlayerGetDestCoords(&mapPosition.x, &mapPosition.y); - if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) - { - dive_warp(&mapPosition, gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E); - DestroyTask(FindTaskIdByFunc(Task_Dive)); - FieldEffectActiveListRemove(FLDEFF_USE_DIVE); - } - return FALSE; -} - -void sub_80871D0(u8); -void mapldr_080851BC(void); - -void sub_80871B8(u8 priority) -{ - CreateTask(sub_80871D0, priority); -} - -void sub_80871D0(u8 taskId) -{ - while (gUnknown_0839F33C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); -} - -bool8 sub_808722C(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - FreezeMapObjects(); - CameraObjectReset2(); - SetCameraPanningCallback(NULL); - gPlayerAvatar.unk6 = 1; - mapObject->mapobj_bit_26 = 1; - task->data[1] = 1; - task->data[0]++; - return TRUE; -} - -bool8 sub_8087264(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - SetCameraPanning(0, task->data[1]); - task->data[1] = -task->data[1]; - task->data[2]++; - if (task->data[2] > 7) - { - task->data[2] = 0; - task->data[0]++; - } - return FALSE; -} - -bool8 sub_8087298(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->pos2.y = 0; - task->data[3] = 1; - gUnknown_0202FF84[0] = mapObject->coords2.x; - gUnknown_0202FF84[1] = mapObject->coords2.y; - gUnknown_0202FF84[2] = sprite->subpriority - 1; - gUnknown_0202FF84[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_LAVARIDGE_GYM_WARP); - PlaySE(SE_W153); - task->data[0]++; - return TRUE; -} - -bool8 sub_80872E4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - s16 centerToCornerVecY; - SetCameraPanning(0, task->data[1]); - if (task->data[1] = -task->data[1], ++task->data[2] <= 17) - { - if (!(task->data[2] & 1) && (task->data[1] <= 3)) - { - task->data[1] <<= 1; - } - } else if (!(task->data[2] & 4) && (task->data[1] > 0)) - { - task->data[1] >>= 1; - } - if (task->data[2] > 6) - { - centerToCornerVecY = -(sprite->centerToCornerVecY << 1); - if (sprite->pos2.y > -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY)) - { - sprite->pos2.y -= task->data[3]; - if (task->data[3] <= 7) - { - task->data[3]++; - } - } else - { - task->data[4] = 1; - } - } - if (task->data[5] == 0 && sprite->pos2.y < -0x10) - { - task->data[5]++; - mapObject->mapobj_bit_26 = 1; - sprite->oam.priority = 1; - sprite->subspriteMode = 2; - } - if (task->data[1] == 0 && task->data[4] != 0) - { - task->data[0]++; - } - return FALSE; -} - -bool8 sub_80873D8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8053FF8(); - fade_8080918(); - task->data[0]++; - return FALSE; -} - -bool8 sub_80873F4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (!gPaletteFade.active && sub_8054034() == TRUE) - { - warp_in(); - gFieldCallback = mapldr_080851BC; - SetMainCallback2(CB2_LoadMap); - DestroyTask(FindTaskIdByFunc(sub_80871D0)); - } - return FALSE; -} - -void sub_8087470(u8); -extern u8 sub_80608A4(u8); - -void mapldr_080851BC(void) -{ - sub_8053E90(); - pal_fill_for_map_transition(); - ScriptContext2_Enable(); - gFieldCallback = NULL; - CreateTask(sub_8087470, 0); -} - -void sub_8087470(u8 taskId) -{ - while (gUnknown_0839F354[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); -} - -bool8 sub_80874CC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - CameraObjectReset2(); - FreezeMapObjects(); - gPlayerAvatar.unk6 = 1; - mapObject->mapobj_bit_13 = 1; - task->data[0]++; - return FALSE; -} - -bool8 sub_80874FC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_807D770()) - { - gUnknown_0202FF84[0] = mapObject->coords2.x; - gUnknown_0202FF84[1] = mapObject->coords2.y; - gUnknown_0202FF84[2] = sprite->subpriority - 1; - gUnknown_0202FF84[3] = sprite->oam.priority; - task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); - task->data[0]++; - } - return FALSE; -} - -bool8 sub_8087548(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite = &gSprites[task->data[1]]; - if (sprite->animCmdIndex > 1) - { - task->data[0]++; - mapObject->mapobj_bit_13 = 0; - CameraObjectReset1(); - PlaySE(SE_W091); - FieldObjectSetSpecialAnim(mapObject, sub_80608A4(DIR_EAST)); - } - return FALSE; -} - -bool8 sub_808759C(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - gPlayerAvatar.unk6 = 0; - ScriptContext2_Disable(); - UnfreezeMapObjects(); - DestroyTask(FindTaskIdByFunc(sub_8087470)); - } - return FALSE; -} - -extern void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy); -extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36]; - -u8 FldEff_LavaridgeGymWarp(void) -{ - u8 spriteId; - sub_8060470((s16 *)&gUnknown_0202FF84[0], (s16 *)&gUnknown_0202FF84[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]); - gSprites[spriteId].oam.priority = gUnknown_0202FF84[3]; - gSprites[spriteId].coordOffsetEnabled = 1; - return spriteId; -} - -void sub_8087638(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - FieldEffectStop(sprite, FLDEFF_LAVARIDGE_GYM_WARP); - } -} - -void sub_808766C(u8); - -void sub_8087654(u8 priority) -{ - CreateTask(sub_808766C, priority); -} - -void sub_808766C(u8 taskId) -{ - while(gUnknown_0839F364[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); -} - -bool8 sub_80876C8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - FreezeMapObjects(); - CameraObjectReset2(); - gPlayerAvatar.unk6 = 1; - mapObject->mapobj_bit_26 = 1; - task->data[0]++; - return FALSE; -} - -bool8 sub_80876F8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - if (task->data[1] > 3) - { - gUnknown_0202FF84[0] = mapObject->coords2.x; - gUnknown_0202FF84[1] = mapObject->coords2.y; - gUnknown_0202FF84[2] = sprite->subpriority - 1; - gUnknown_0202FF84[3] = sprite->oam.priority; - task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); - task->data[0]++; - } else - { - task->data[1]++; - FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); - PlaySE(SE_FU_ZUZUZU); - } - } - return FALSE; -} - -bool8 sub_8087774(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gSprites[task->data[1]].animCmdIndex == 2) - { - mapObject->mapobj_bit_13 = 1; - task->data[0]++; - } - return FALSE; -} - -bool8 sub_80877AC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) - { - sub_8053FF8(); - fade_8080918(); - task->data[0]++; - } - return FALSE; -} - -void sub_80878C4(u8); -void mapldr_080859D4(void); - -bool8 sub_80877D4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (!gPaletteFade.active && sub_8054034() == TRUE) - { - warp_in(); - gFieldCallback = sub_8086748; - SetMainCallback2(CB2_LoadMap); - DestroyTask(FindTaskIdByFunc(sub_808766C)); - } - return FALSE; -} - -u8 FldEff_PopOutOfAsh(void) -{ - u8 spriteId; - sub_8060470((s16 *)&gUnknown_0202FF84[0], (s16 *)&gUnknown_0202FF84[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]); - gSprites[spriteId].oam.priority = gUnknown_0202FF84[3]; - gSprites[spriteId].coordOffsetEnabled = 1; - return spriteId; -} - -void sub_808788C(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - FieldEffectStop(sprite, FLDEFF_POP_OUT_OF_ASH); - } -} - -void sub_80878A8(void) -{ - ScriptContext2_Enable(); - FreezeMapObjects(); - CreateTask(sub_80878C4, 0x50); -} - -void sub_80878C4(u8 taskId) -{ - gUnknown_0839F378[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_80878F4(struct Task *task) -{ - task->data[0]++; - task->data[14] = 64; - task->data[15] = player_get_direction_lower_nybble(); -} - -void sub_8087914(struct Task *task) -{ - struct MapObject *mapObject; - u8 unknown_0839F380[5]; - memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); - if (task->data[14] != 0 && (--task->data[14]) == 0) - { - sub_8053FF8(); - fade_8080918(); - } - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - if (task->data[14] == 0 && !gPaletteFade.active && sub_8054034() == TRUE) - { - FieldObjectSetDirection(mapObject, task->data[15]); - sub_8053678(); - warp_in(); - gFieldCallback = mapldr_080859D4; - SetMainCallback2(CB2_LoadMap); - DestroyTask(FindTaskIdByFunc(sub_80878C4)); - } else if (task->data[1] == 0 || (--task->data[1]) == 0) - { - FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(unknown_0839F380[mapObject->mapobj_unk_18])); - if (task->data[2] < 12) - { - task->data[2]++; - } - task->data[1] = 8 >> (task->data[2] >> 2); - } - } -} - -void sub_8087A74(u8); - -void mapldr_080859D4(void) -{ - sub_8053E90(); - pal_fill_for_map_transition(); - ScriptContext2_Enable(); - FreezeMapObjects(); - gFieldCallback = NULL; - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; - CreateTask(sub_8087A74, 0); -} - -void sub_8087A74(u8 taskId) -{ - gUnknown_0839F388[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_8087AA4(struct Task *task) -{ - if (sub_807D770()) - { - task->data[0]++; - task->data[15] = player_get_direction_lower_nybble(); - } -} - -void sub_8087AC8(struct Task *task) -{ - struct MapObject *mapObject; - u8 unknown_0839F380[5]; - memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (task->data[1] == 0 || (--task->data[1]) == 0) - { - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) && !FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - return; - } - if (task->data[2] >= 32 && task->data[15] == player_get_direction_lower_nybble()) - { - mapObject->mapobj_bit_13 = 0; - ScriptContext2_Disable(); - UnfreezeMapObjects(); - DestroyTask(FindTaskIdByFunc(sub_8087A74)); - return; - } - FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(unknown_0839F380[mapObject->mapobj_unk_18])); - if (task->data[2] < 32) - { - task->data[2]++; - } - task->data[1] = task->data[2] >> 2; - } - mapObject->mapobj_bit_13 ^= 1; -} - -void sub_8087BBC(u8); -void mapldr_08085D88(void); - -void sub_8087BA8(void) -{ - CreateTask(sub_8087BBC, 0); -} - -void sub_8087BBC(u8 taskId) -{ - gUnknown_0839F390[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_8087BEC(struct Task *task) -{ - ScriptContext2_Enable(); - FreezeMapObjects(); - CameraObjectReset2(); - task->data[15] = player_get_direction_lower_nybble(); - task->data[0]++; -} - -void sub_8087C14(struct Task *task) -{ - struct MapObject *mapObject; - u8 unknown_0839F380[5]; - memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (task->data[1] == 0 || (--task->data[1]) == 0) - { - FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); - task->data[1] = 8; - task->data[2]++; - } - if (task->data[2] > 7 && task->data[15] == mapObject->mapobj_unk_18) - { - task->data[0]++; - task->data[1] = 4; - task->data[2] = 8; - task->data[3] = 1; - PlaySE(SE_TK_WARPIN); - } -} - -void sub_8087CA4(struct Task *task) -{ - struct MapObject *mapObject; - struct Sprite *sprite; - u8 unknown_0839F380[5]; - memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - sprite = &gSprites[gPlayerAvatar.spriteId]; - if ((--task->data[1]) <= 0) - { - task->data[1] = 4; - FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); - } - sprite->pos1.y -= task->data[3]; - task->data[4] += task->data[3]; - if ((--task->data[2]) <= 0 && (task->data[2] = 4, task->data[3] < 8)) - { - task->data[3] <<= 1; - } - if (task->data[4] > 8 && (sprite->oam.priority = 1, sprite->subspriteMode != 0)) - { - sprite->subspriteMode = 2; - } - if (task->data[4] >= 0xa8) - { - task->data[0]++; - sub_8053FF8(); - fade_8080918(); - } -} - -void sub_8087D78(struct Task *task) -{ - if (!gPaletteFade.active && sub_8054034() == TRUE) - { - sub_8053570(); - warp_in(); - SetMainCallback2(CB2_LoadMap); - gFieldCallback = mapldr_08085D88; - DestroyTask(FindTaskIdByFunc(sub_8087BBC)); - } -} - -void sub_8087E1C(u8); - -void mapldr_08085D88(void) -{ - sub_8053E90(); - pal_fill_for_map_transition(); - ScriptContext2_Enable(); - FreezeMapObjects(); - gFieldCallback = NULL; - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; - CameraObjectReset2(); - CreateTask(sub_8087E1C, 0); -} - -void sub_8087E1C(u8 taskId) -{ - gUnknown_0839F3A0[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_8087E4C(struct Task *task) -{ - struct Sprite *sprite; - s16 centerToCornerVecY; - if (sub_807D770()) - { - sprite = &gSprites[gPlayerAvatar.spriteId]; - centerToCornerVecY = -(sprite->centerToCornerVecY << 1); - sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; - task->data[0]++; - task->data[1] = 8; - task->data[2] = 1; - task->data[14] = sprite->subspriteMode; - task->data[15] = player_get_direction_lower_nybble(); - PlaySE(SE_TK_WARPIN); - } -} - -void sub_8087ED8(struct Task *task) -{ - u8 unknown_0839F380[5]; - struct MapObject *mapObject; - struct Sprite *sprite; - memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - sprite = &gSprites[gPlayerAvatar.spriteId]; - if ((sprite->pos2.y += task->data[1]) >= -8) - { - if (task->data[13] == 0) - { - task->data[13]++; - mapObject->mapobj_bit_2 = 1; - sprite->subspriteMode = task->data[14]; - } - } else - { - sprite->oam.priority = 1; - if (sprite->subspriteMode != 0) - { - sprite->subspriteMode = 2; - } - } - if (sprite->pos2.y >= -0x30 && task->data[1] > 1 && !(sprite->pos2.y & 1)) - { - task->data[1]--; - } - if ((--task->data[2]) == 0) - { - task->data[2] = 4; - FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); - } - if (sprite->pos2.y >= 0) - { - sprite->pos2.y = 0; - task->data[0]++; - task->data[1] = 1; - task->data[2] = 0; - } -} - -void sub_8087FDC(struct Task *task) -{ - u8 unknown_0839F380[5]; - struct MapObject *mapObject; - memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if ((--task->data[1]) == 0) - { - FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); - task->data[1] = 8; - if ((++task->data[2]) > 4 && task->data[14] == mapObject->mapobj_unk_18) - { - ScriptContext2_Disable(); - CameraObjectReset1(); - UnfreezeMapObjects(); - DestroyTask(FindTaskIdByFunc(sub_8087E1C)); - } - } -} - -void sub_8088120(u8); -void sub_808847C(u8); -u8 sub_8088830(u32, u32, u32); -void sub_80883DC(void); -void sub_808843C(u16); -void sub_8088890(struct Sprite *); - -bool8 FldEff_FieldMoveShowMon(void) -{ - u8 taskId; - if (is_light_level_1_2_3_5_or_6(sav1_map_get_light_level()) == TRUE) - { - taskId = CreateTask(sub_8088120, 0xff); - } else - { - taskId = CreateTask(sub_808847C, 0xff); - } - gTasks[taskId].data[15] = sub_8088830(gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]); - return FALSE; -} - -bool8 FldEff_FieldMoveShowMonInit(void) -{ - struct Pokemon *pokemon; - u32 flag = gUnknown_0202FF84[0] & 0x80000000; - pokemon = &gPlayerParty[(u8)gUnknown_0202FF84[0]]; - gUnknown_0202FF84[0] = GetMonData(pokemon, MON_DATA_SPECIES); - gUnknown_0202FF84[1] = GetMonData(pokemon, MON_DATA_OT_ID); - gUnknown_0202FF84[2] = GetMonData(pokemon, MON_DATA_PERSONALITY); - gUnknown_0202FF84[0] |= flag; - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON); - FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - return FALSE; -} - -void sub_8088120(u8 taskId) -{ - gUnknown_0839F3AC[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_8088150(struct Task *task) -{ - task->data[11] = REG_WININ; - task->data[12] = REG_WINOUT; - StoreWordInTwoHalfwords(&task->data[13], (u32)gMain.vblankCallback); - task->data[1] = 0xf0f1; - task->data[2] = 0x5051; - task->data[3] = 0x3f; - task->data[4] = 0x3e; - REG_WIN0H = task->data[1]; - REG_WIN0V = task->data[2]; - REG_WININ = task->data[3]; - REG_WINOUT = task->data[4]; - SetVBlankCallback(sub_80883DC); - task->data[0]++; -} - -void sub_80881C0(struct Task *task) -{ - u16 offset; - u16 delta; - offset = ((REG_BG0CNT >> 2) << 14); - delta = ((REG_BG0CNT >> 8) << 11); - CpuCopy16(gFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x200); - CpuFill32(0, (void *)(VRAM + delta), 0x800); - LoadPalette(gFieldMoveStreaksPalette, 0xf0, 0x20); - sub_808843C(delta); - task->data[0]++; -} - -void sub_8088228(struct Task *task) -{ - s16 v0; - s16 v2; - s16 v3; - task->data[5] -= 16; - v0 = ((u16)task->data[1] >> 8); - v2 = ((u16)task->data[2] >> 8); - v3 = ((u16)task->data[2] & 0xff); - v0 -= 16; - v2 -= 2; - v3 += 2; - if (v0 < 0) - { - v0 = 0; - } - if (v2 < 0x28) - { - v2 = 0x28; - } - if (v3 > 0x78) - { - v3 = 0x78; - } - task->data[1] = (v0 << 8) | (task->data[1] & 0xff); - task->data[2] = (v2 << 8) | v3; - if (v0 == 0 && v2 == 0x28 && v3 == 0x78) - { - gSprites[task->data[15]].callback = sub_8088890; - task->data[0]++; - } -} - -void sub_80882B4(struct Task *task) -{ - task->data[5] -= 16; - if (gSprites[task->data[15]].data7) - { - task->data[0]++; - } -} - -void sub_80882E4(struct Task *task) -{ - s16 v2; - s16 v3; - task->data[5] -= 16; - v2 = (task->data[2] >> 8); - v3 = (task->data[2] & 0xff); - v2 += 6; - v3 -= 6; - if (v2 > 0x50) - { - v2 = 0x50; - } - if (v3 < 0x51) - { - v3 = 0x51; - } - task->data[2] = (v2 << 8) | v3; - if (v2 == 0x50 && v3 == 0x51) - { - task->data[0]++; - } -} - -void sub_8088338(struct Task *task) -{ - u16 bg0cnt; - bg0cnt = (REG_BG0CNT >> 8) << 11; - CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); - task->data[1] = 0xf1; - task->data[2] = 0xa1; - task->data[3] = task->data[11]; - task->data[4] = task->data[12]; - task->data[0]++; -} - -void sub_8088380(struct Task *task) -{ - IntrCallback callback; - LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); - SetVBlankCallback(callback); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); - FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); - FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); - DestroyTask(FindTaskIdByFunc(sub_8088120)); -} - -void sub_80883DC(void) -{ - struct Task *task; - IntrCallback callback; - task = &gTasks[FindTaskIdByFunc(sub_8088120)]; - LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); - callback(); - REG_WIN0H = task->data[1]; - REG_WIN0V = task->data[2]; - REG_WININ = task->data[3]; - REG_WINOUT = task->data[4]; - REG_BG0HOFS = task->data[5]; - REG_BG0VOFS = task->data[6]; -} - -void sub_808843C(u16 offs) -{ - u16 i; - u16 *dest; - dest = (u16 *)(VRAM + 0x140 + offs); - for (i=0; i<0x140; i++, dest++) - { - *dest = gFieldMoveStreaksTilemap[i] | 0xf000; - } -} - -void sub_80886B0(void); -bool8 sub_8088708(struct Task *); -void sub_80886F8(struct Task *); -bool8 sub_80887C0(struct Task *); - -void sub_808847C(u8 taskId) -{ - gUnknown_0839F3C8[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_80884AC(struct Task *task) -{ - REG_BG0HOFS = task->data[1]; - REG_BG0VOFS = task->data[2]; - StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback); - SetVBlankCallback(sub_80886B0); - task->data[0]++; -} - -void sub_80884E8(struct Task *task) -{ - u16 offset; - u16 delta; - offset = ((REG_BG0CNT >> 2) << 14); - delta = ((REG_BG0CNT >> 8) << 11); - task->data[12] = delta; - CpuCopy16(gDarknessFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x80); - CpuFill32(0, (void *)(VRAM + delta), 0x800); - LoadPalette(gDarknessFieldMoveStreaksPalette, 0xf0, 0x20); - task->data[0]++; -} - -void sub_8088554(struct Task *task) -{ - if (sub_8088708(task)) - { - REG_WIN1H = 0x00f0; - REG_WIN1V = 0x2878; - gSprites[task->data[15]].callback = sub_8088890; - task->data[0]++; - } - sub_80886F8(task); -} - -void sub_80885A8(struct Task *task) -{ - sub_80886F8(task); - if (gSprites[task->data[15]].data7) - { - task->data[0]++; - } -} - -void sub_80885D8(struct Task *task) -{ - sub_80886F8(task); - task->data[3] = task->data[1] & 7; - task->data[4] = 0; - REG_WIN1H = 0xffff; - REG_WIN1V = 0xffff; - task->data[0]++; -} - -void sub_808860C(struct Task *task) -{ - sub_80886F8(task); - if (sub_80887C0(task)) - { - task->data[0]++; - } -} - -void sub_808862C(struct Task *task) -{ - IntrCallback intrCallback; - u16 bg0cnt; - bg0cnt = (REG_BG0CNT >> 8) << 11; - CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); - LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); - SetVBlankCallback(intrCallback); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); - FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); - FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); - DestroyTask(FindTaskIdByFunc(sub_808847C)); -} - -void sub_80886B0(void) -{ - IntrCallback intrCallback; - struct Task *task; - task = &gTasks[FindTaskIdByFunc(sub_808847C)]; - LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); - intrCallback(); - REG_BG0HOFS = task->data[1]; - REG_BG0VOFS = task->data[2]; -} - -void sub_80886F8(struct Task *task) -{ - task->data[1] -= 16; - task->data[3] += 16; -} - -#ifdef NONMATCHING -bool8 sub_8088708(struct Task *task) -{ - u16 i; - u16 srcOffs; - u16 dstOffs; - u16 *dest; - if (task->data[4] >= 32) - { - return TRUE; - } - dstOffs = (task->data[3] >> 3) & 0x1f; - if (dstOffs >= task->data[4]) - { - dstOffs = (32 - dstOffs) & 0x1f; - srcOffs = (32 - task->data[4]) & 0x1f; - dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); - for (i=0; i<10; i++) - { - dest[dstOffs + i * 32] = gDarknessFieldMoveStreaksTilemap[srcOffs + i * 32] | 0xf000; - dest[((dstOffs + 1) & 0x1f) + i * 32] = gDarknessFieldMoveStreaksTilemap[((srcOffs + 1) & 0x1f) + i * 32] | 0xf000; - } - task->data[4] += 2; - } - return FALSE; -} -#else -__attribute__((naked)) -bool8 sub_8088708(struct Task *task) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x4\n" - "\tadds r5, r0, 0\n" - "\tldrh r2, [r5, 0x10]\n" - "\tmovs r1, 0x10\n" - "\tldrsh r0, [r5, r1]\n" - "\tcmp r0, 0x1F\n" - "\tble _08088724\n" - "\tmovs r0, 0x1\n" - "\tb _080887A8\n" - "_08088724:\n" - "\tldrh r0, [r5, 0xE]\n" - "\tlsls r0, 16\n" - "\tasrs r3, r0, 19\n" - "\tmovs r1, 0x1F\n" - "\tands r3, r1\n" - "\tmovs r4, 0x10\n" - "\tldrsh r0, [r5, r4]\n" - "\tcmp r3, r0\n" - "\tblt _080887A6\n" - "\tmovs r0, 0x20\n" - "\tsubs r3, r0, r3\n" - "\tands r3, r1\n" - "\tsubs r0, r2\n" - "\tmov r12, r0\n" - "\tmov r7, r12\n" - "\tands r7, r1\n" - "\tmov r12, r7\n" - "\tldrh r0, [r5, 0x20]\n" - "\tldr r1, _080887B8 @ =0x06000140\n" - "\tadds r1, r0\n" - "\tmov r8, r1\n" - "\tmovs r4, 0\n" - "\tldr r7, _080887BC @ =gDarknessFieldMoveStreaksTilemap\n" - "\tmov r10, r7\n" - "\tmovs r0, 0xF0\n" - "\tlsls r0, 8\n" - "\tmov r9, r0\n" - "\tadds r1, r3, 0x1\n" - "\tmovs r0, 0x1F\n" - "\tands r1, r0\n" - "\tstr r1, [sp]\n" - "\tmov r6, r12\n" - "\tadds r6, 0x1\n" - "\tands r6, r0\n" - "_08088768:\n" - "\tlsls r1, r4, 5\n" - "\tadds r2, r1, r3\n" - "\tlsls r2, 1\n" - "\tadd r2, r8\n" - "\tmov r7, r12\n" - "\tadds r0, r7, r1\n" - "\tlsls r0, 1\n" - "\tadd r0, r10\n" - "\tldrh r0, [r0]\n" - "\tmov r7, r9\n" - "\torrs r0, r7\n" - "\tstrh r0, [r2]\n" - "\tldr r0, [sp]\n" - "\tadds r2, r1, r0\n" - "\tlsls r2, 1\n" - "\tadd r2, r8\n" - "\tadds r1, r6, r1\n" - "\tlsls r1, 1\n" - "\tadd r1, r10\n" - "\tldrh r0, [r1]\n" - "\tmov r1, r9\n" - "\torrs r0, r1\n" - "\tstrh r0, [r2]\n" - "\tadds r0, r4, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r4, r0, 16\n" - "\tcmp r4, 0x9\n" - "\tbls _08088768\n" - "\tldrh r0, [r5, 0x10]\n" - "\tadds r0, 0x2\n" - "\tstrh r0, [r5, 0x10]\n" - "_080887A6:\n" - "\tmovs r0, 0\n" - "_080887A8:\n" - "\tadd sp, 0x4\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1\n" - "\t.align 2, 0\n" - "_080887B8: .4byte 0x06000140\n" - "_080887BC: .4byte gDarknessFieldMoveStreaksTilemap"); -} -#endif - -bool8 sub_80887C0(struct Task *task) -{ - u16 i; - u16 dstOffs; - u16 *dest; - if (task->data[4] >= 32) - { - return TRUE; - } - dstOffs = task->data[3] >> 3; - if (dstOffs >= task->data[4]) - { - dstOffs = (task->data[1] >> 3) & 0x1f; - dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); - for (i=0; i<10; i++) - { - dest[dstOffs + i * 32] = 0xf000; - dest[((dstOffs + 1) & 0x1f) + i * 32] = 0xf000; - } - task->data[4] += 2; - } - return FALSE; -} - -u8 sub_8088830(u32 a0, u32 a1, u32 a2) -{ - u16 v0; - u8 monSprite; - struct Sprite *sprite; - v0 = (a0 & 0x80000000) >> 16; - a0 &= 0x7fffffff; - monSprite = CreateMonSprite_FieldMove(a0, a1, a2, 0x140, 0x50, 0); - sprite = &gSprites[monSprite]; - sprite->callback = SpriteCallbackDummy; - sprite->oam.priority = 0; - sprite->data0 = a0; - sprite->data6 = v0; - return monSprite; -} - -void sub_80888D4(struct Sprite *); - -void sub_8088890(struct Sprite *sprite) -{ - if ((sprite->pos1.x -= 20) <= 0x78) - { - sprite->pos1.x = 0x78; - sprite->data1 = 30; - sprite->callback = sub_80888D4; - if (sprite->data6) - { - PlayCry2(sprite->data0, 0, 0x7d, 0xa); - } else - { - PlayCry1(sprite->data0, 0); - } - } -} - -void sub_80888F0(struct Sprite *); - -void sub_80888D4(struct Sprite *sprite) -{ - if ((--sprite->data1) == 0) - { - sprite->callback = sub_80888F0; - } -} - -void sub_80888F0(struct Sprite *sprite) -{ - if (sprite->pos1.x < -0x40) - { - sprite->data7 = 1; - } else - { - sprite->pos1.x -= 20; - } -} - -void sub_8088954(u8); - -u8 FldEff_UseSurf(void) -{ - u8 taskId; - taskId = CreateTask(sub_8088954, 0xff); - gTasks[taskId].data[15] = gUnknown_0202FF84[0]; - sav1_reset_battle_music_maybe(); - sub_8053FB0(0x016d); - return FALSE; -} - -void sub_8088954(u8 taskId) -{ - gUnknown_0839F3E4[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_8088984(struct Task *task) -{ - ScriptContext2_Enable(); - FreezeMapObjects(); - gPlayerAvatar.unk6 = 1; - SetPlayerAvatarStateMask(8); - PlayerGetDestCoords(&task->data[1], &task->data[2]); - MoveCoords(gMapObjects[gPlayerAvatar.mapObjectId].placeholder18, &task->data[1], &task->data[2]); - task->data[0]++; -} - -void sub_80889E4(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - sub_8059BF4(); - FieldObjectSetSpecialAnim(mapObject, 0x39); - task->data[0]++; - } -} - -void sub_8088A30(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject)) - { - gUnknown_0202FF84[0] = task->data[15] | 0x80000000; - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - task->data[0]++; - } -} - -void sub_8088A78(struct Task *task) -{ - struct MapObject *mapObject; - if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(3)); - FieldObjectClearAnimIfSpecialAnimFinished(mapObject); - FieldObjectSetSpecialAnim(mapObject, sub_80608D0(mapObject->placeholder18)); - gUnknown_0202FF84[0] = task->data[1]; - gUnknown_0202FF84[1] = task->data[2]; - gUnknown_0202FF84[2] = gPlayerAvatar.mapObjectId; - mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_SURF_BLOB); - task->data[0]++; - } -} - -void sub_8088AF4(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - gPlayerAvatar.unk6 = 0; - gPlayerAvatar.flags &= 0xdf; - FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(mapObject->placeholder18)); - sub_8127ED0(mapObject->mapobj_unk_1A, 1); - UnfreezeMapObjects(); - ScriptContext2_Disable(); - FieldEffectActiveListRemove(FLDEFF_USE_SURF); - DestroyTask(FindTaskIdByFunc(sub_8088954)); - } -} - -void sub_8088BC4(struct Sprite *); - -u8 FldEff_NPCFlyOut(void) -{ - u8 spriteId; - struct Sprite *sprite; - spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0x78, 0, 1); - sprite = &gSprites[spriteId]; - sprite->oam.paletteNum = 0; - sprite->oam.priority = 1; - sprite->callback = sub_8088BC4; - sprite->data1 = gUnknown_0202FF84[0]; - PlaySE(SE_W019); - return spriteId; -} - -void sub_8088BC4(struct Sprite *sprite) -{ - struct Sprite *npcSprite; - sprite->pos2.x = Cos(sprite->data2, 0x8c); - sprite->pos2.y = Sin(sprite->data2, 0x48); - sprite->data2 = (sprite->data2 + 4) & 0xff; - if (sprite->data0) - { - npcSprite = &gSprites[sprite->data1]; - npcSprite->coordOffsetEnabled = 0; - npcSprite->pos1.x = sprite->pos1.x + sprite->pos2.x; - npcSprite->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; - npcSprite->pos2.x = 0; - npcSprite->pos2.y = 0; - } - if (sprite->data2 >= 0x80) - { - FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT); - } -} - -void sub_8088C70(u8); -extern void sub_8127EFC(u8, u8); -u8 sub_8088F60(void); -bool8 sub_8088FA4(u8); -void sub_8088FC0(u8); -void sub_8088FFC(u8, u8); -void sub_8089018(struct Sprite *); -void sub_80890D8(struct Sprite *); - -u8 FldEff_UseFly(void) -{ - u8 taskId; - taskId = CreateTask(sub_8088C70, 0xfe); - gTasks[taskId].data[1] = gUnknown_0202FF84[0]; - return 0; -} - -void sub_8088C70(u8 taskId) -{ - gUnknown_0839F3F8[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_8088CA0(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - task->data[15] = gPlayerAvatar.flags; - gPlayerAvatar.unk6 = 0x01; - SetPlayerAvatarStateMask(1); - sub_8059BF4(); - FieldObjectSetSpecialAnim(mapObject, 0x39); - task->data[0]++; - } -} - -void sub_8088CF8(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - task->data[0]++; - gUnknown_0202FF84[0] = task->data[1]; - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - } -} - -void sub_8088D3C(struct Task *task) -{ - struct MapObject *mapObject; - if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (task->data[15] & 0x08) - { - sub_8127ED0(mapObject->mapobj_unk_1A, 2); - sub_8127EFC(mapObject->mapobj_unk_1A, 0); - } - task->data[1] = sub_8088F60(); - task->data[0]++; - } -} - -void sub_8088D94(struct Task *task) -{ - if (sub_8088FA4(task->data[1])) - { - task->data[0]++; - task->data[2] = 16; - SetPlayerAvatarTransitionFlags(0x01); - FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], 0x02); - } -} - -void sub_8088DD8(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if ((task->data[2] == 0 || (--task->data[2]) == 0) && FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - task->data[0]++; - PlaySE(SE_W019); - sub_8088FC0(task->data[1]); - } -} - -void sub_8088E2C(struct Task *task) -{ - struct MapObject *mapObject; - if ((++task->data[2]) >= 8) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(0x03)); - StartSpriteAnim(&gSprites[mapObject->spriteId], 0x16); - mapObject->mapobj_bit_12 = 1; - FieldObjectSetSpecialAnim(mapObject, 0x48); - if (task->data[15] & 0x08) - { - DestroySprite(&gSprites[mapObject->mapobj_unk_1A]); - } - task->data[0]++; - task->data[2] = 0; - } -} - -void sub_8088EB4(struct Task *task) -{ - struct MapObject *mapObject; - if ((++task->data[2]) >= 10) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - FieldObjectClearAnimIfSpecialAnimActive(mapObject); - mapObject->mapobj_bit_12 = 0; - mapObject->mapobj_bit_22 = 0; - sub_8088FFC(task->data[1], mapObject->spriteId); - CameraObjectReset2(); - task->data[0]++; - } -} - -void sub_8088F10(struct Task *task) -{ - if (sub_8088FA4(task->data[1])) - { - fade_8080918(); - task->data[0]++; - } -} - -void sub_8088F30(struct Task *task) -{ - if (!gPaletteFade.active) - { - FieldEffectActiveListRemove(FLDEFF_USE_FLY); - DestroyTask(FindTaskIdByFunc(sub_8088C70)); - } -} - -u8 sub_8088F60(void) -{ - u8 spriteId; - struct Sprite *sprite; - spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0xff, 0xb4, 0x1); - sprite = &gSprites[spriteId]; - sprite->oam.paletteNum = 0; - sprite->oam.priority = 1; - sprite->callback = sub_8089018; - return spriteId; -} - -u8 sub_8088FA4(u8 spriteId) -{ - return gSprites[spriteId].data7; -} - -void sub_8088FC0(u8 spriteId) -{ - struct Sprite *sprite; - sprite = &gSprites[spriteId]; - sprite->callback = sub_80890D8; - sprite->pos1.x = 0x78; - sprite->pos1.y = 0x00; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - memset(&sprite->data0, 0, 8 * sizeof(u16) /* zero all data cells */); - sprite->data6 = 0x40; -} - -void sub_8088FFC(u8 a0, u8 a1) -{ - gSprites[a0].data6 = a1; -} - -void sub_8089018(struct Sprite *sprite) -{ - if (sprite->data7 == 0) - { - if (sprite->data0 == 0) - { - sprite->oam.affineMode = 3; - sprite->affineAnims = gSpriteAffineAnimTable_0839F44C; - InitSpriteAffineAnim(sprite); - StartSpriteAffineAnim(sprite, 0); - sprite->pos1.x = 0x76; - sprite->pos1.y = -0x30; - sprite->data0++; - sprite->data1 = 0x40; - sprite->data2 = 0x100; - } - sprite->data1 += (sprite->data2 >> 8); - sprite->pos2.x = Cos(sprite->data1, 0x78); - sprite->pos2.y = Sin(sprite->data1, 0x78); - if (sprite->data2 < 0x800) - { - sprite->data2 += 0x60; - } - if (sprite->data1 > 0x81) - { - sprite->data7++; - sprite->oam.affineMode = 0; - FreeOamMatrix(sprite->oam.matrixNum); - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, 0); - } - } -} - -void sub_80890D8(struct Sprite *sprite) -{ - struct Sprite *sprite1; - sprite->pos2.x = Cos(sprite->data2, 0x8c); - sprite->pos2.y = Sin(sprite->data2, 0x48); - sprite->data2 = (sprite->data2 + 4) & 0xff; - if (sprite->data6 != 0x40) - { - sprite1 = &gSprites[sprite->data6]; - sprite1->coordOffsetEnabled = 0; - sprite1->pos1.x = sprite->pos1.x + sprite->pos2.x; - sprite1->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; - sprite1->pos2.x = 0; - sprite1->pos2.y = 0; - } - if (sprite->data2 >= 0x80) - { - sprite->data7 = 1; - } -} - -void sub_808914C(struct Sprite *sprite) -{ - if (sprite->data7 == 0) - { - if (sprite->data0 == 0) - { - sprite->oam.affineMode = 3; - sprite->affineAnims = gSpriteAffineAnimTable_0839F44C; - InitSpriteAffineAnim(sprite); - StartSpriteAffineAnim(sprite, 1); - sprite->pos1.x = 0x5e; - sprite->pos1.y = -0x20; - sprite->data0++; - sprite->data1 = 0xf0; - sprite->data2 = 0x800; - sprite->data4 = 0x80; - } - sprite->data1 += sprite->data2 >> 8; - sprite->data3 += sprite->data2 >> 8; - sprite->data1 &= 0xff; - sprite->pos2.x = Cos(sprite->data1, 0x20); - sprite->pos2.y = Sin(sprite->data1, 0x78); - if (sprite->data2 > 0x100) - { - sprite->data2 -= sprite->data4; - } - if (sprite->data4 < 0x100) - { - sprite->data4 += 24; - } - if (sprite->data2 < 0x100) - { - sprite->data2 = 0x100; - } - if (sprite->data3 >= 60) - { - sprite->data7++; - sprite->oam.affineMode = 0; - FreeOamMatrix(sprite->oam.matrixNum); - sprite->invisible = 1; - } - } -} - -void sub_8089230(u8 spriteId) -{ - sub_8088FC0(spriteId); - gSprites[spriteId].callback = sub_808914C; -} - -void sub_8089270(u8); - -u8 FldEff_FlyIn(void) -{ - CreateTask(sub_8089270, 0xfe); - return 0; -} - -void sub_8089270(u8 taskId) -{ - gUnknown_0839F454[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_80892A0(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - task->data[0]++; - task->data[2] = 17; - task->data[15] = gPlayerAvatar.flags; - gPlayerAvatar.unk6 = 1; - SetPlayerAvatarStateMask(0x01); - if (task->data[15] & 0x08) - { - sub_8127ED0(mapObject->mapobj_unk_1A, 0); - } - sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(0x3)); - CameraObjectReset2(); - FieldObjectTurn(mapObject, DIR_WEST); - StartSpriteAnim(&gSprites[mapObject->spriteId], 0x16); - mapObject->mapobj_bit_13 = 0; - task->data[1] = sub_8088F60(); - sub_8088FC0(task->data[1]); - sub_8088FFC(task->data[1], mapObject->spriteId); - } -} - -void sub_8089354(struct Task *task) -{ - struct MapObject *mapObject; - struct Sprite *sprite; - if (task->data[2] == 0 || (--task->data[2]) == 0) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - sprite = &gSprites[mapObject->spriteId]; - sub_8088FFC(task->data[1], 0x40); - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - task->data[0]++; - task->data[2] = 0; - } -} - -void sub_80893C0(struct Task *task) -{ - s16 unknown_0839F470[18]; - struct Sprite *sprite; - memcpy(unknown_0839F470, gUnknown_0839F470, sizeof gUnknown_0839F470); - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.y = unknown_0839F470[task->data[2]]; - if ((++task->data[2]) >= 18) - { - task->data[0]++; - } -} - -void sub_8089414(struct Task *task) -{ - struct MapObject *mapObject; - struct Sprite *sprite; - if (sub_8088FA4(task->data[1])) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - sprite = &gSprites[mapObject->spriteId]; - mapObject->mapobj_bit_12 = 0; - sub_805C058(mapObject, mapObject->coords2.x, mapObject->coords2.y); - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->coordOffsetEnabled = 1; - sub_8059BF4(); - FieldObjectSetSpecialAnim(mapObject, 0x39); - task->data[0]++; - } -} - -void sub_808948C(struct Task *task) -{ - if (FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gPlayerAvatar.mapObjectId])) - { - task->data[0]++; - sub_8089230(task->data[1]); - } -} - -void sub_80894C4(struct Task *task) -{ - if (sub_8088FA4(task->data[1])) - { - DestroySprite(&gSprites[task->data[1]]); - task->data[0]++; - task->data[1] = 0x10; - } -} - -void fishE(struct Task *task) -{ - u8 state; - struct MapObject *mapObject; - if ((--task->data[1]) == 0) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - state = 0; - if (task->data[15] & 0x08) - { - state = 3; - sub_8127ED0(mapObject->mapobj_unk_1A, 1); - } - sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(state)); - FieldObjectTurn(mapObject, DIR_SOUTH); - gPlayerAvatar.flags = task->data[15]; - gPlayerAvatar.unk6 = 0; - FieldEffectActiveListRemove(FLDEFF_FLY_IN); - DestroyTask(FindTaskIdByFunc(sub_8089270)); - } -} diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c deleted file mode 100644 index e614d899a..000000000 --- a/src/field_fadetransition.c +++ /dev/null @@ -1,626 +0,0 @@ -#include "global.h" -#include "cable_club.h" -#include "fieldmap.h" -#include "field_door.h" -#include "field_effect.h" -#include "field_fadetransition.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" -#include "field_player_avatar.h" -#include "field_special_scene.h" -#include "field_weather.h" -#include "fldeff_flash.h" -#include "link.h" -#include "main.h" -#include "map_obj_lock.h" -#include "metatile_behavior.h" -#include "palette.h" -#include "rom4.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "start_menu.h" -#include "task.h" - -void sub_8080B9C(u8); -void task_map_chg_seq_0807E20C(u8); -void task_map_chg_seq_0807E2CC(u8); -void task0A_fade_n_map_maybe(u8); -void sub_808115C(u8); - -void palette_bg_fill_white(void) -{ - CpuFastFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE); -} - -void palette_bg_fill_black(void) -{ - CpuFastFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE); -} - -void pal_fill_for_map_transition(void) -{ - u8 map_light = get_map_light_from_warp0(); - switch (fade_type_for_given_maplight_pair(map_light, sav1_map_get_light_level())) - { - case 0: - fade_screen(0, 0); - palette_bg_fill_black(); - break; - case 1: - fade_screen(2, 0); - palette_bg_fill_white(); - } -} - -void pal_fill_black(void) -{ - fade_screen(0, 0); - palette_bg_fill_black(); -} - -void fade_8080918(void) -{ - u8 light_level = sav1_map_get_light_level(); - switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType)) - { - case 0: - fade_screen(1, 0); - break; - case 1: - fade_screen(3, 0); - } -} - -void sub_8080958(u8 arg) -{ - sub_8059B88(!arg); -} - -void task0A_asap_script_env_2_enable_and_set_ctx_running(u8 taskID) -{ - if (sub_8080E70() == TRUE) - { - DestroyTask(taskID); - EnableBothScriptContexts(); - } -} - -void sub_8080990(void) -{ - ScriptContext2_Enable(); - sub_8053E90(); - pal_fill_black(); - CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10); -} - -void sub_80809B0(void) -{ - ScriptContext2_Enable(); - pal_fill_black(); - CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10); -} - -void task_mpl_807DD60(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - task->data[1] = sub_8083664(); - task->data[0]++; - break; - case 1: - if (gTasks[task->data[1]].isActive != TRUE) - { - pal_fill_for_map_transition(); - task->data[0]++; - } - break; - case 2: - if (sub_8080E70() == TRUE) - { - ScriptContext2_Disable(); - DestroyTask(taskId); - } - } -} - -void sub_8080A3C(void) -{ - ScriptContext2_Enable(); - sub_8053E90(); - palette_bg_fill_black(); - CreateTask(task_mpl_807DD60, 10); -} - -void sub_8080A5C(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - sub_80084A4(); - task->data[0]++; - break; - case 1: - if (sub_8007ECC()) - { - pal_fill_for_map_transition(); - task->data[0]++; - } - break; - case 2: - if (sub_8080E70() == TRUE) - { - sub_8007B14(); - ScriptContext2_Disable(); - DestroyTask(taskId); - } - } -} - -void sub_8080AC4(void) -{ - ScriptContext2_Enable(); - sub_8053E90(); - palette_bg_fill_black(); - CreateTask(sub_8080A5C, 10); -} - -void sub_8080AE4(void) -{ - s16 x, y; - u8 behavior; - TaskFunc func; - PlayerGetDestCoords(&x, &y); - behavior = MapGridGetMetatileBehaviorAt(x, y); - if (MetatileBehavior_IsDoor(behavior) == TRUE) - func = sub_8080B9C; - else if (MetatileBehavior_IsNonAnimDoor(behavior) == TRUE) - func = task_map_chg_seq_0807E20C; - else - func = task_map_chg_seq_0807E2CC; - CreateTask(func, 10); -} - -void mapldr_default(void) -{ - sub_8053E90(); - pal_fill_for_map_transition(); - sub_8080AE4(); - ScriptContext2_Enable(); -} - -void sub_8080B60(void) -{ - sub_8053E90(); - pal_fill_black(); - sub_8080AE4(); - ScriptContext2_Enable(); -} - -void sub_8080B78(void) -{ - sub_8053E90(); - pal_fill_for_map_transition(); - PlaySE(SE_TK_WARPOUT); - CreateTask(task_map_chg_seq_0807E2CC, 10); - ScriptContext2_Enable(); -} - -void sub_8080B9C(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - s16 *x = &task->data[2]; - s16 *y = &task->data[3]; - - switch (task->data[0]) - { - case 0: - sub_8080958(0); - FreezeMapObjects(); - PlayerGetDestCoords(x, y); - FieldSetDoorOpened(*x, *y); - task->data[0] = 1; - break; - case 1: - if (sub_8080E70()) - { - u8 mapObjId; - sub_8080958(1); - mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 8); - task->data[0] = 2; - } - break; - case 2: - if (walkrun_is_standing_still()) - { - u8 mapObjId; - task->data[1] = FieldAnimateDoorClose(*x, *y); - mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]); - task->data[0] = 3; - } - break; - case 3: - if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) - { - UnfreezeMapObjects(); - task->data[0] = 4; - } - break; - case 4: - ScriptContext2_Disable(); - DestroyTask(taskId); - break; - } -} - -void task_map_chg_seq_0807E20C(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - s16 *x = &task->data[2]; - s16 *y = &task->data[3]; - - switch (task->data[0]) - { - case 0: - sub_8080958(0); - FreezeMapObjects(); - PlayerGetDestCoords(x, y); - task->data[0] = 1; - break; - case 1: - if (sub_8080E70()) - { - u8 mapObjId; - sub_8080958(1); - mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], GetGoSpeed0AnimId(player_get_direction_lower_nybble())); - task->data[0] = 2; - } - break; - case 2: - if (walkrun_is_standing_still()) - { - UnfreezeMapObjects(); - task->data[0] = 3; - } - break; - case 3: - ScriptContext2_Disable(); - DestroyTask(taskId); - break; - } -} - -void task_map_chg_seq_0807E2CC(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - FreezeMapObjects(); - ScriptContext2_Enable(); - gTasks[taskId].data[0]++; - break; - case 1: - if (sub_8080E70()) - { - UnfreezeMapObjects(); - ScriptContext2_Disable(); - DestroyTask(taskId); - } - break; - } -} - -void sub_8080DC4(u8 taskId) -{ - if (sub_8080E70() == TRUE) - { - DestroyTask(taskId); - CreateTask(sub_80712B4, 80); - } -} - -void atk17_seteffectuser(void) -{ - pal_fill_black(); - CreateStartMenuTask(sub_8080DC4); - ScriptContext2_Enable(); -} - -void task_mpl_807E3C8(u8 taskId) -{ - if (sub_8080E70() == 1) - { - ScriptContext2_Disable(); - DestroyTask(taskId); - sub_8064E2C(); - } -} - -void sub_8080E28(void) -{ - ScriptContext2_Enable(); - pal_fill_black(); - CreateTask(task_mpl_807E3C8, 10); -} - -void sub_8080E44(void) -{ - ScriptContext2_Enable(); - sub_8053E90(); - pal_fill_black(); - CreateTask(task_mpl_807E3C8, 10); -} - -bool32 sub_8080E64(void) -{ - return gPaletteFade.active; -} - -bool32 sub_8080E70(void) -{ - if (sub_807D770() == TRUE) - return TRUE; - else - return FALSE; -} - -void sub_8080E88(void) -{ - ScriptContext2_Enable(); - sub_8053FF8(); - fade_8080918(); - PlayRainSoundEffect(); - PlaySE(SE_KAIDAN); - gFieldCallback = mapldr_default; - CreateTask(task0A_fade_n_map_maybe, 10); -} - -void sp13E_warp_to_last_warp(void) -{ - ScriptContext2_Enable(); - sub_8053FF8(); - fade_8080918(); - PlayRainSoundEffect(); - gFieldCallback = mapldr_default; - CreateTask(task0A_fade_n_map_maybe, 10); -} - -void sub_8080EF0(void) -{ - ScriptContext2_Enable(); - gFieldCallback = mapldr_default; - CreateTask(sub_808115C, 10); -} - -void sp13F_fall_to_last_warp(void) -{ - sp13E_warp_to_last_warp(); - gFieldCallback = sub_8086748; -} - -void sub_8080F2C(u8 metatileBehavior) -{ - ScriptContext2_Enable(); - sub_8086A2C(metatileBehavior, 10); -} - -void sub_8080F48(void) -{ - ScriptContext2_Enable(); - sub_80871B8(10); -} - -void sub_8080F58(void) -{ - ScriptContext2_Enable(); - sub_8087654(10); -} - -void sub_8080F68(void) -{ - ScriptContext2_Enable(); - sub_8053FF8(); - fade_8080918(); - PlaySE(SE_TK_WARPIN); - CreateTask(task0A_fade_n_map_maybe, 10); - gFieldCallback = sub_8080B78; -} - -void sub_8080F9C(void) -{ - ScriptContext2_Enable(); - fade_8080918(); - CreateTask(task0A_fade_n_map_maybe, 10); - gFieldCallback = sub_80C791C; -} - -void sub_8080FC4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - ScriptContext2_Enable(); - task->data[0]++; - break; - case 1: - if (!sub_8080E64() && sub_8054034()) - { - task->data[0]++; - } - break; - case 2: - warp_in(); - SetMainCallback2(sub_8054588); - DestroyTask(taskId); - break; - } -} - -void DoCableClubWarp(void) -{ - ScriptContext2_Enable(); - sub_8053FF8(); - fade_8080918(); - PlaySE(SE_KAIDAN); - CreateTask(sub_8080FC4, 10); -} - -void sub_8081050(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - ClearLinkCallback_2(); - fade_screen(1, 0); - sub_8053FF8(); - PlaySE(SE_KAIDAN); - data[0]++; - break; - case 1: - if (!sub_8080E64() && sub_8054034()) - { - sub_800832C(); - data[0]++; - } - break; - case 2: - if (!gReceivedRemoteLinkPlayers) - { - warp_in(); - SetMainCallback2(CB2_LoadMap); - DestroyTask(taskId); - } - break; - } -} - -void sub_80810DC(void) -{ - CreateTask(sub_8081050, 10); -} - -void task0A_fade_n_map_maybe(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - FreezeMapObjects(); - ScriptContext2_Enable(); - task->data[0]++; - break; - case 1: - if (!sub_8080E64() && sub_8054034()) - { - task->data[0]++; - } - break; - case 2: - warp_in(); - SetMainCallback2(CB2_LoadMap); - DestroyTask(taskId); - break; - } -} - -void sub_808115C(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - s16 *x = &task->data[2]; - s16 *y = &task->data[3]; - - switch (task->data[0]) - { - case 0: - FreezeMapObjects(); - PlayerGetDestCoords(x, y); - PlaySE(sub_8058790(*x, *y - 1)); - task->data[1] = FieldAnimateDoorOpen(*x, *y - 1); - task->data[0] = 1; - break; - case 1: - if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) - { - u8 mapObjId; - mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimActive(&gMapObjects[mapObjId]); - mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 9); - task->data[0] = 2; - } - break; - case 2: - if (walkrun_is_standing_still()) - { - u8 mapObjId; - task->data[1] = FieldAnimateDoorClose(*x, *y - 1); - mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]); - sub_8080958(0); - task->data[0] = 3; - } - break; - case 3: - if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) - { - task->data[0] = 4; - } - break; - case 4: - sub_8053FF8(); - fade_8080918(); - PlayRainSoundEffect(); - task->data[0] = 0; - task->func = task0A_fade_n_map_maybe; - break; - } -} - -void sub_80812C8(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - FreezeMapObjects(); - ScriptContext2_Enable(); - task->data[0]++; - break; - case 1: - if (!sub_8080E64() && sub_8054034()) - { - task->data[0]++; - } - break; - case 2: - warp_in(); - SetMainCallback2(sub_8054534); - DestroyTask(taskId); - break; - } -} - -void sub_8081334(void) -{ - ScriptContext2_Enable(); - sub_8053FF8(); - fade_8080918(); - PlayRainSoundEffect(); - PlaySE(SE_KAIDAN); - gFieldCallback = sub_8080B60; - CreateTask(sub_80812C8, 10); -} diff --git a/src/field_ground_effect.c b/src/field_ground_effect.c deleted file mode 100644 index 42862d0ff..000000000 --- a/src/field_ground_effect.c +++ /dev/null @@ -1,240 +0,0 @@ -#include "global.h" -#include "field_ground_effect.h" -#include "fieldmap.h" -#include "metatile_behavior.h" - -extern u32 gUnknown_08376008[]; - -void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) -{ - FieldObjectUpdateMetatileBehaviors(mapObj); - GetGroundEffectFlags_Reflection(mapObj, flags); - GetGroundEffectFlags_TallGrassOnSpawn(mapObj, flags); - GetGroundEffectFlags_LongGrassOnSpawn(mapObj, flags); - GetGroundEffectFlags_SandPile(mapObj, flags); - GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); - GetGroundEffectFlags_ShortGrass(mapObj, flags); - GetGroundEffectFlags_HotSprings(mapObj, flags); -} - -void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags) -{ - FieldObjectUpdateMetatileBehaviors(mapObj); - GetGroundEffectFlags_Reflection(mapObj, flags); - GetGroundEffectFlags_TallGrassOnBeginStep(mapObj, flags); - GetGroundEffectFlags_LongGrassOnBeginStep(mapObj, flags); - GetGroundEffectFlags_Tracks(mapObj, flags); - GetGroundEffectFlags_SandPile(mapObj, flags); - GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); - GetGroundEffectFlags_Puddle(mapObj, flags); - GetGroundEffectFlags_ShortGrass(mapObj, flags); - GetGroundEffectFlags_HotSprings(mapObj, flags); -} - -void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags) -{ - FieldObjectUpdateMetatileBehaviors(mapObj); - GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); - GetGroundEffectFlags_SandPile(mapObj, flags); - GetGroundEffectFlags_Puddle(mapObj, flags); - GetGroundEffectFlags_Ripple(mapObj, flags); - GetGroundEffectFlags_ShortGrass(mapObj, flags); - GetGroundEffectFlags_HotSprings(mapObj, flags); - GetGroundEffectFlags_Seaweed(mapObj, flags); - GetGroundEffectFlags_JumpLanding(mapObj, flags); -} - -void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj) -{ - mapObj->mapobj_unk_1F = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y); - mapObj->mapobj_unk_1E = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y); -} - -void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags) -{ - u32 reflectionFlags[2] = { 0x00000020, 0x00000010 }; - u8 type = FieldObjectCheckForReflectiveSurface(mapObj); - - if (type) - { - if (!mapObj->mapobj_bit_17) - { - mapObj->mapobj_bit_17 = 0; - mapObj->mapobj_bit_17 = 1; - *flags |= reflectionFlags[type - 1]; - } - } - else - { - mapObj->mapobj_bit_17 = 0; - } -} - -void GetGroundEffectFlags_TallGrassOnSpawn(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x1; -} - -void GetGroundEffectFlags_TallGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x2; -} - -void GetGroundEffectFlags_LongGrassOnSpawn(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x4; -} - -void GetGroundEffectFlags_LongGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x8; -} - -void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) - { - *flags |= 0x100; - } - else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F) - || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F)) - { - *flags |= 0x80; - } -} - -void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) - { - if (!mapObj->mapobj_bit_20) - { - mapObj->mapobj_bit_20 = 0; - mapObj->mapobj_bit_20 = 1; - *flags |= 0x800; - } - } - else - { - mapObj->mapobj_bit_20 = 0; - } -} - -void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags) -{ - if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F)) - || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F))) - { - if (!mapObj->mapobj_bit_19) - { - mapObj->mapobj_bit_19 = 0; - mapObj->mapobj_bit_19 = 1; - *flags |= 0x40; - } - } - else - { - mapObj->mapobj_bit_19 = 0; - } -} - -void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F)) - { - *flags |= 0x400; - } -} - -void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_HasRipples(mapObj->mapobj_unk_1E)) - *flags |= 0x200; -} - -void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F)) - { - if (!mapObj->mapobj_bit_18) - { - mapObj->mapobj_bit_18 = 0; - mapObj->mapobj_bit_18 = 1; - *flags |= 0x20000; - } - } - else - { - mapObj->mapobj_bit_18 = 0; - } -} - -void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F)) - { - if (!mapObj->mapobj_bit_21) - { - mapObj->mapobj_bit_21 = 0; - mapObj->mapobj_bit_21 = 1; - *flags |= 0x40000; - } - } - else - { - mapObj->mapobj_bit_21 = 0; - } -} - -void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsSeaweed(mapObj->mapobj_unk_1E)) - *flags |= 0x80000; -} - -void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) -{ - typedef bool8 (*MetatileFunc)(u8); - - static const MetatileFunc metatileFuncs[] = - { - MetatileBehavior_IsTallGrass, - MetatileBehavior_IsLongGrass, - MetatileBehavior_IsPuddle, - MetatileBehavior_IsSurfableWaterOrUnderwater, - MetatileBehavior_IsShallowFlowingWater, - MetatileBehavior_IsATile, - }; - - static const u32 jumpLandingFlags[] = - { - 0x00001000, // Landing in tall grass - 0x00002000, // Landing in long grass - 0x00004000, // Landing on puddle - 0x00008000, // Landing on surfable water or underwater - 0x00004000, // Landing on shallow flowing water - 0x00010000, // Landing on any other type of ground - }; - - if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25) - { - u8 i; - - for (i = 0; i < 6; i++) - { - if (metatileFuncs[i](mapObj->mapobj_unk_1E)) - { - *flags |= jumpLandingFlags[i]; - return; - } - } - } -} diff --git a/src/field_map_obj.c b/src/field_map_obj.c deleted file mode 100644 index f60b1b233..000000000 --- a/src/field_map_obj.c +++ /dev/null @@ -1,8474 +0,0 @@ -#include "global.h" -#include "field_map_obj.h" -#include "berry.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_effect.h" -#include "field_effect_helpers.h" -#include "field_ground_effect.h" -#include "field_map_obj_helpers.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "palette.h" -#include "rng.h" -#include "rom4.h" -#include "sprite.h" -#include "metatile_behavior.h" -#include "map_constants.h" -#include "map_object_constants.h" -#include "trainer_see.h" - -// rodata - -const u8 gUnknown_0830FD14[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0}; - -void ObjectCB_CameraObject(struct Sprite *sprite); -const struct SpriteTemplate gSpriteTemplate_830FD24 = {0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, ObjectCB_CameraObject}; - -void CameraObject_0(struct Sprite *); -void CameraObject_1(struct Sprite *); -void CameraObject_2(struct Sprite *); -void (*const gCameraObjectFuncs[])(struct Sprite *) = { - CameraObject_0, - CameraObject_1, - CameraObject_2, -}; - -const u32 gMapObjectPic_BrendanNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/00.4bpp"); -const u32 gMapObjectPic_BrendanNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/01.4bpp"); -const u32 gMapObjectPic_BrendanNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/02.4bpp"); -const u32 gMapObjectPic_BrendanNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/03.4bpp"); -const u32 gMapObjectPic_BrendanNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/04.4bpp"); -const u32 gMapObjectPic_BrendanNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/05.4bpp"); -const u32 gMapObjectPic_BrendanNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/06.4bpp"); -const u32 gMapObjectPic_BrendanNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/07.4bpp"); -const u32 gMapObjectPic_BrendanNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/08.4bpp"); -const u32 gMapObjectPic_BrendanNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/09.4bpp"); -const u32 gMapObjectPic_BrendanNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/10.4bpp"); -const u32 gMapObjectPic_BrendanNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/11.4bpp"); -const u32 gMapObjectPic_BrendanNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/12.4bpp"); -const u32 gMapObjectPic_BrendanNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/13.4bpp"); -const u32 gMapObjectPic_BrendanNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/14.4bpp"); -const u32 gMapObjectPic_BrendanNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/15.4bpp"); -const u32 gMapObjectPic_BrendanNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/16.4bpp"); -const u32 gMapObjectPic_BrendanNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/17.4bpp"); -const u16 gMapObjectPalette8[] = INCBIN_U16("graphics/map_objects/palettes/08.gbapal"); -const u16 NullPalette_8310F68[16] = {}; -const u16 NullPalette_8310F88[16] = {}; -const u16 NullPalette_8310FA8[16] = {}; -const u16 NullPalette_8310FC8[16] = {}; -const u16 NullPalette_8310FE8[16] = {}; -const u16 NullPalette_8311008[16] = {}; -const u16 NullPalette_8311028[16] = {}; -const u16 NullPalette_8311048[16] = {}; -const u16 NullPalette_8311068[16] = {}; -const u16 NullPalette_8311088[16] = {}; -const u16 NullPalette_83110A8[16] = {}; -const u16 NullPalette_83110C8[16] = {}; -const u16 NullPalette_83110E8[16] = {}; -const u16 NullPalette_8311108[16] = {}; -const u16 NullPalette_8311128[16] = {}; -const u16 gMapObjectPalette9[] = INCBIN_U16("graphics/map_objects/palettes/09.gbapal"); -const u16 gMapObjectPalette10[] = INCBIN_U16("graphics/map_objects/palettes/10.gbapal"); -const u32 gMapObjectPic_BrendanFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/0.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/1.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/2.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/3.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/4.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/0.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/3.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/1.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/4.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/2.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/5.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/0.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/1.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/2.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/3.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/4.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/5.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/6.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/7.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/8.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/00.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/01.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/02.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/03.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/04.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/05.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/06.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/07.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/08.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/09.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/10.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/11.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/12.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/13.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/14.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/15.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/16.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/17.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/18.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/19.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/20.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/21.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/22.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/23.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/24.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/25.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/26.4bpp"); -const u32 gMapObjectPic_BrendanFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/00.4bpp"); -const u32 gMapObjectPic_BrendanFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/01.4bpp"); -const u32 gMapObjectPic_BrendanFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/02.4bpp"); -const u32 gMapObjectPic_BrendanFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/03.4bpp"); -const u32 gMapObjectPic_BrendanFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/04.4bpp"); -const u32 gMapObjectPic_BrendanFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/05.4bpp"); -const u32 gMapObjectPic_BrendanFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/06.4bpp"); -const u32 gMapObjectPic_BrendanFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/07.4bpp"); -const u32 gMapObjectPic_BrendanFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/08.4bpp"); -const u32 gMapObjectPic_BrendanFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/09.4bpp"); -const u32 gMapObjectPic_BrendanFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/10.4bpp"); -const u32 gMapObjectPic_BrendanFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/11.4bpp"); -const u32 gMapObjectPic_BrendanWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/0.4bpp"); -const u32 gMapObjectPic_BrendanWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/3.4bpp"); -const u32 gMapObjectPic_BrendanWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/1.4bpp"); -const u32 gMapObjectPic_BrendanWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/4.4bpp"); -const u32 gMapObjectPic_BrendanWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/2.4bpp"); -const u32 gMapObjectPic_BrendanWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/5.4bpp"); -const u32 gMapObjectPic_BrendanDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/decorating.4bpp"); -const u32 gMapObjectPic_MayDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/may/decorating.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/0.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/1.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/2.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/3.4bpp"); -const u32 gMapObjectPic_MayUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/0.4bpp"); -const u32 gMapObjectPic_MayUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/1.4bpp"); -const u32 gMapObjectPic_MayUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/2.4bpp"); -const u32 gMapObjectPic_MayUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/3.4bpp"); -const u16 gMapObjectPalette11[] = INCBIN_U16("graphics/map_objects/palettes/11.gbapal"); -const u32 gMapObjectPic_MayNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/00.4bpp"); -const u32 gMapObjectPic_MayNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/01.4bpp"); -const u32 gMapObjectPic_MayNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/02.4bpp"); -const u32 gMapObjectPic_MayNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/03.4bpp"); -const u32 gMapObjectPic_MayNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/04.4bpp"); -const u32 gMapObjectPic_MayNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/05.4bpp"); -const u32 gMapObjectPic_MayNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/06.4bpp"); -const u32 gMapObjectPic_MayNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/07.4bpp"); -const u32 gMapObjectPic_MayNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/08.4bpp"); -const u32 gMapObjectPic_MayNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/09.4bpp"); -const u32 gMapObjectPic_MayNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/10.4bpp"); -const u32 gMapObjectPic_MayNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/11.4bpp"); -const u32 gMapObjectPic_MayNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/12.4bpp"); -const u32 gMapObjectPic_MayNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/13.4bpp"); -const u32 gMapObjectPic_MayNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/14.4bpp"); -const u32 gMapObjectPic_MayNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/15.4bpp"); -const u32 gMapObjectPic_MayNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/16.4bpp"); -const u32 gMapObjectPic_MayNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/17.4bpp"); -const u16 gMapObjectPalette17[] = INCBIN_U16("graphics/map_objects/palettes/17.gbapal"); -const u16 gMapObjectPalette18[] = INCBIN_U16("graphics/map_objects/palettes/18.gbapal"); -const u16 NullPalette_831B7E8[16] = {}; -const u16 NullPalette_831B808[16] = {}; -const u16 NullPalette_831B828[16] = {}; -const u16 NullPalette_831B848[16] = {}; -const u16 NullPalette_831B868[16] = {}; -const u16 NullPalette_831B888[16] = {}; -const u16 NullPalette_831B8A8[16] = {}; -const u16 NullPalette_831B8C8[16] = {}; -const u16 NullPalette_831B8E8[16] = {}; -const u16 NullPalette_831B908[16] = {}; -const u16 NullPalette_831B928[16] = {}; -const u16 NullPalette_831B948[16] = {}; -const u16 NullPalette_831B968[16] = {}; -const u16 NullPalette_831B988[16] = {}; -const u32 gMapObjectPic_MayMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/0.4bpp"); -const u32 gMapObjectPic_MayMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/1.4bpp"); -const u32 gMapObjectPic_MayMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/2.4bpp"); -const u32 gMapObjectPic_MayMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/3.4bpp"); -const u32 gMapObjectPic_MayMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/4.4bpp"); -const u32 gMapObjectPic_MayMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/5.4bpp"); -const u32 gMapObjectPic_MayMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/6.4bpp"); -const u32 gMapObjectPic_MayMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/7.4bpp"); -const u32 gMapObjectPic_MayMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/8.4bpp"); -const u32 gMapObjectPic_MayAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/00.4bpp"); -const u32 gMapObjectPic_MayAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/01.4bpp"); -const u32 gMapObjectPic_MayAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/02.4bpp"); -const u32 gMapObjectPic_MayAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/03.4bpp"); -const u32 gMapObjectPic_MayAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/04.4bpp"); -const u32 gMapObjectPic_MayAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/05.4bpp"); -const u32 gMapObjectPic_MayAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/06.4bpp"); -const u32 gMapObjectPic_MayAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/07.4bpp"); -const u32 gMapObjectPic_MayAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/08.4bpp"); -const u32 gMapObjectPic_MayAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/09.4bpp"); -const u32 gMapObjectPic_MayAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/10.4bpp"); -const u32 gMapObjectPic_MayAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/11.4bpp"); -const u32 gMapObjectPic_MayAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/12.4bpp"); -const u32 gMapObjectPic_MayAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/13.4bpp"); -const u32 gMapObjectPic_MayAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/14.4bpp"); -const u32 gMapObjectPic_MayAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/15.4bpp"); -const u32 gMapObjectPic_MayAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/16.4bpp"); -const u32 gMapObjectPic_MayAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/17.4bpp"); -const u32 gMapObjectPic_MayAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/18.4bpp"); -const u32 gMapObjectPic_MayAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/19.4bpp"); -const u32 gMapObjectPic_MayAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/20.4bpp"); -const u32 gMapObjectPic_MayAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/21.4bpp"); -const u32 gMapObjectPic_MayAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/22.4bpp"); -const u32 gMapObjectPic_MayAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/23.4bpp"); -const u32 gMapObjectPic_MayAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/24.4bpp"); -const u32 gMapObjectPic_MayAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/25.4bpp"); -const u32 gMapObjectPic_MayAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/26.4bpp"); -const u32 gMapObjectPic_MaySurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/0.4bpp"); -const u32 gMapObjectPic_MaySurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/3.4bpp"); -const u32 gMapObjectPic_MaySurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/1.4bpp"); -const u32 gMapObjectPic_MaySurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/4.4bpp"); -const u32 gMapObjectPic_MaySurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/2.4bpp"); -const u32 gMapObjectPic_MaySurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/5.4bpp"); -const u32 gMapObjectPic_MayFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/0.4bpp"); -const u32 gMapObjectPic_MayFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/1.4bpp"); -const u32 gMapObjectPic_MayFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/2.4bpp"); -const u32 gMapObjectPic_MayFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/3.4bpp"); -const u32 gMapObjectPic_MayFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/4.4bpp"); -const u32 gMapObjectPic_MayFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/00.4bpp"); -const u32 gMapObjectPic_MayFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/01.4bpp"); -const u32 gMapObjectPic_MayFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/02.4bpp"); -const u32 gMapObjectPic_MayFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/03.4bpp"); -const u32 gMapObjectPic_MayFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/04.4bpp"); -const u32 gMapObjectPic_MayFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/05.4bpp"); -const u32 gMapObjectPic_MayFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/06.4bpp"); -const u32 gMapObjectPic_MayFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/07.4bpp"); -const u32 gMapObjectPic_MayFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/08.4bpp"); -const u32 gMapObjectPic_MayFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/09.4bpp"); -const u32 gMapObjectPic_MayFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/10.4bpp"); -const u32 gMapObjectPic_MayFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/11.4bpp"); -const u32 gMapObjectPic_MayWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/0.4bpp"); -const u32 gMapObjectPic_MayWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/3.4bpp"); -const u32 gMapObjectPic_MayWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/1.4bpp"); -const u32 gMapObjectPic_MayWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/4.4bpp"); -const u32 gMapObjectPic_MayWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/2.4bpp"); -const u32 gMapObjectPic_MayWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/5.4bpp"); -const u16 gMapObjectPalette0[] = INCBIN_U16("graphics/map_objects/palettes/00.gbapal"); -const u16 gMapObjectPalette1[] = INCBIN_U16("graphics/map_objects/palettes/01.gbapal"); -const u16 gMapObjectPalette2[] = INCBIN_U16("graphics/map_objects/palettes/02.gbapal"); -const u16 gMapObjectPalette3[] = INCBIN_U16("graphics/map_objects/palettes/03.gbapal"); -const u16 gMapObjectPalette4[] = INCBIN_U16("graphics/map_objects/palettes/04.gbapal"); -const u16 gMapObjectPalette5[] = INCBIN_U16("graphics/map_objects/palettes/05.gbapal"); -const u16 gMapObjectPalette6[] = INCBIN_U16("graphics/map_objects/palettes/06.gbapal"); -const u16 gMapObjectPalette7[] = INCBIN_U16("graphics/map_objects/palettes/07.gbapal"); -const u32 gMapObjectPic_LittleBoy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/0.4bpp"); -const u32 gMapObjectPic_LittleBoy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/1.4bpp"); -const u32 gMapObjectPic_LittleBoy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/2.4bpp"); -const u32 gMapObjectPic_LittleBoy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/3.4bpp"); -const u32 gMapObjectPic_LittleBoy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/4.4bpp"); -const u32 gMapObjectPic_LittleBoy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/5.4bpp"); -const u32 gMapObjectPic_LittleBoy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/6.4bpp"); -const u32 gMapObjectPic_LittleBoy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/7.4bpp"); -const u32 gMapObjectPic_LittleBoy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/8.4bpp"); -const u32 gMapObjectPic_LittleGirl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/0.4bpp"); -const u32 gMapObjectPic_LittleGirl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/1.4bpp"); -const u32 gMapObjectPic_LittleGirl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/2.4bpp"); -const u32 gMapObjectPic_LittleGirl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/3.4bpp"); -const u32 gMapObjectPic_LittleGirl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/4.4bpp"); -const u32 gMapObjectPic_LittleGirl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/5.4bpp"); -const u32 gMapObjectPic_LittleGirl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/6.4bpp"); -const u32 gMapObjectPic_LittleGirl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/7.4bpp"); -const u32 gMapObjectPic_LittleGirl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/8.4bpp"); -const u32 gMapObjectPic_Boy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/0.4bpp"); -const u32 gMapObjectPic_Boy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/1.4bpp"); -const u32 gMapObjectPic_Boy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/2.4bpp"); -const u32 gMapObjectPic_Boy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/3.4bpp"); -const u32 gMapObjectPic_Boy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/4.4bpp"); -const u32 gMapObjectPic_Boy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/5.4bpp"); -const u32 gMapObjectPic_Boy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/6.4bpp"); -const u32 gMapObjectPic_Boy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/7.4bpp"); -const u32 gMapObjectPic_Boy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/8.4bpp"); -const u32 gMapObjectPic_Girl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/0.4bpp"); -const u32 gMapObjectPic_Girl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/1.4bpp"); -const u32 gMapObjectPic_Girl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/2.4bpp"); -const u32 gMapObjectPic_Girl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/3.4bpp"); -const u32 gMapObjectPic_Girl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/4.4bpp"); -const u32 gMapObjectPic_Girl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/5.4bpp"); -const u32 gMapObjectPic_Girl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/6.4bpp"); -const u32 gMapObjectPic_Girl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/7.4bpp"); -const u32 gMapObjectPic_Girl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/8.4bpp"); -const u32 gMapObjectPic_Boy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/0.4bpp"); -const u32 gMapObjectPic_Boy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/1.4bpp"); -const u32 gMapObjectPic_Boy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/2.4bpp"); -const u32 gMapObjectPic_Boy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/3.4bpp"); -const u32 gMapObjectPic_Boy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/4.4bpp"); -const u32 gMapObjectPic_Boy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/5.4bpp"); -const u32 gMapObjectPic_Boy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/6.4bpp"); -const u32 gMapObjectPic_Boy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/7.4bpp"); -const u32 gMapObjectPic_Boy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/8.4bpp"); -const u32 gMapObjectPic_Girl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/0.4bpp"); -const u32 gMapObjectPic_Girl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/1.4bpp"); -const u32 gMapObjectPic_Girl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/2.4bpp"); -const u32 gMapObjectPic_Girl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/3.4bpp"); -const u32 gMapObjectPic_Girl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/4.4bpp"); -const u32 gMapObjectPic_Girl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/5.4bpp"); -const u32 gMapObjectPic_Girl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/6.4bpp"); -const u32 gMapObjectPic_Girl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/7.4bpp"); -const u32 gMapObjectPic_Girl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/8.4bpp"); -const u32 gMapObjectPic_LittleBoy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/0.4bpp"); -const u32 gMapObjectPic_LittleBoy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/1.4bpp"); -const u32 gMapObjectPic_LittleBoy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/2.4bpp"); -const u32 gMapObjectPic_LittleBoy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/3.4bpp"); -const u32 gMapObjectPic_LittleBoy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/4.4bpp"); -const u32 gMapObjectPic_LittleBoy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/5.4bpp"); -const u32 gMapObjectPic_LittleBoy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/6.4bpp"); -const u32 gMapObjectPic_LittleBoy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/7.4bpp"); -const u32 gMapObjectPic_LittleBoy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/8.4bpp"); -const u32 gMapObjectPic_LittleGirl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/0.4bpp"); -const u32 gMapObjectPic_LittleGirl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/1.4bpp"); -const u32 gMapObjectPic_LittleGirl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/2.4bpp"); -const u32 gMapObjectPic_LittleGirl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/3.4bpp"); -const u32 gMapObjectPic_LittleGirl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/4.4bpp"); -const u32 gMapObjectPic_LittleGirl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/5.4bpp"); -const u32 gMapObjectPic_LittleGirl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/6.4bpp"); -const u32 gMapObjectPic_LittleGirl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/7.4bpp"); -const u32 gMapObjectPic_LittleGirl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/8.4bpp"); -const u32 gMapObjectPic_Boy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/0.4bpp"); -const u32 gMapObjectPic_Boy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/1.4bpp"); -const u32 gMapObjectPic_Boy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/2.4bpp"); -const u32 gMapObjectPic_Boy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/3.4bpp"); -const u32 gMapObjectPic_Boy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/4.4bpp"); -const u32 gMapObjectPic_Boy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/5.4bpp"); -const u32 gMapObjectPic_Boy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/6.4bpp"); -const u32 gMapObjectPic_Boy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/7.4bpp"); -const u32 gMapObjectPic_Boy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/8.4bpp"); -const u32 gMapObjectPic_Girl3_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/0.4bpp"); -const u32 gMapObjectPic_Girl3_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/1.4bpp"); -const u32 gMapObjectPic_Girl3_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/2.4bpp"); -const u32 gMapObjectPic_Girl3_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/3.4bpp"); -const u32 gMapObjectPic_Girl3_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/4.4bpp"); -const u32 gMapObjectPic_Girl3_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/5.4bpp"); -const u32 gMapObjectPic_Girl3_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/6.4bpp"); -const u32 gMapObjectPic_Girl3_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/7.4bpp"); -const u32 gMapObjectPic_Girl3_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/8.4bpp"); -const u32 gMapObjectPic_Boy4_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/0.4bpp"); -const u32 gMapObjectPic_Boy4_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/1.4bpp"); -const u32 gMapObjectPic_Boy4_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/2.4bpp"); -const u32 gMapObjectPic_Boy4_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/3.4bpp"); -const u32 gMapObjectPic_Boy4_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/4.4bpp"); -const u32 gMapObjectPic_Boy4_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/5.4bpp"); -const u32 gMapObjectPic_Boy4_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/6.4bpp"); -const u32 gMapObjectPic_Boy4_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/7.4bpp"); -const u32 gMapObjectPic_Boy4_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/8.4bpp"); -const u32 gMapObjectPic_Woman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/0.4bpp"); -const u32 gMapObjectPic_Woman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/1.4bpp"); -const u32 gMapObjectPic_Woman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/2.4bpp"); -const u32 gMapObjectPic_Woman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/3.4bpp"); -const u32 gMapObjectPic_Woman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/4.4bpp"); -const u32 gMapObjectPic_Woman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/5.4bpp"); -const u32 gMapObjectPic_Woman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/6.4bpp"); -const u32 gMapObjectPic_Woman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/7.4bpp"); -const u32 gMapObjectPic_Woman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/8.4bpp"); -const u32 gMapObjectPic_FatMan_0[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/0.4bpp"); -const u32 gMapObjectPic_FatMan_1[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/1.4bpp"); -const u32 gMapObjectPic_FatMan_2[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/2.4bpp"); -const u32 gMapObjectPic_FatMan_3[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/3.4bpp"); -const u32 gMapObjectPic_FatMan_4[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/4.4bpp"); -const u32 gMapObjectPic_FatMan_5[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/5.4bpp"); -const u32 gMapObjectPic_FatMan_6[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/6.4bpp"); -const u32 gMapObjectPic_FatMan_7[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/7.4bpp"); -const u32 gMapObjectPic_FatMan_8[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/8.4bpp"); -const u32 gMapObjectPic_Woman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/0.4bpp"); -const u32 gMapObjectPic_Woman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/1.4bpp"); -const u32 gMapObjectPic_Woman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/2.4bpp"); -const u32 gMapObjectPic_Woman2_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/3.4bpp"); -const u32 gMapObjectPic_Woman2_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/4.4bpp"); -const u32 gMapObjectPic_Woman2_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/5.4bpp"); -const u32 gMapObjectPic_Woman2_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/6.4bpp"); -const u32 gMapObjectPic_Woman2_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/7.4bpp"); -const u32 gMapObjectPic_Woman2_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/8.4bpp"); -const u32 gMapObjectPic_Man1_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/0.4bpp"); -const u32 gMapObjectPic_Man1_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/1.4bpp"); -const u32 gMapObjectPic_Man1_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/2.4bpp"); -const u32 gMapObjectPic_Man1_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/3.4bpp"); -const u32 gMapObjectPic_Man1_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/4.4bpp"); -const u32 gMapObjectPic_Man1_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/5.4bpp"); -const u32 gMapObjectPic_Man1_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/6.4bpp"); -const u32 gMapObjectPic_Man1_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/7.4bpp"); -const u32 gMapObjectPic_Man1_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/8.4bpp"); -const u32 gMapObjectPic_Woman3_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/0.4bpp"); -const u32 gMapObjectPic_Woman3_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/1.4bpp"); -const u32 gMapObjectPic_Woman3_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/2.4bpp"); -const u32 gMapObjectPic_Woman3_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/3.4bpp"); -const u32 gMapObjectPic_Woman3_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/4.4bpp"); -const u32 gMapObjectPic_Woman3_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/5.4bpp"); -const u32 gMapObjectPic_Woman3_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/6.4bpp"); -const u32 gMapObjectPic_Woman3_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/7.4bpp"); -const u32 gMapObjectPic_Woman3_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/8.4bpp"); -const u32 gMapObjectPic_OldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/0.4bpp"); -const u32 gMapObjectPic_OldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/1.4bpp"); -const u32 gMapObjectPic_OldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/2.4bpp"); -const u32 gMapObjectPic_OldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/3.4bpp"); -const u32 gMapObjectPic_OldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/4.4bpp"); -const u32 gMapObjectPic_OldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/5.4bpp"); -const u32 gMapObjectPic_OldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/6.4bpp"); -const u32 gMapObjectPic_OldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/7.4bpp"); -const u32 gMapObjectPic_OldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/8.4bpp"); -const u32 gMapObjectPic_OldWoman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/0.4bpp"); -const u32 gMapObjectPic_OldWoman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/1.4bpp"); -const u32 gMapObjectPic_OldWoman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/2.4bpp"); -const u32 gMapObjectPic_OldWoman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/3.4bpp"); -const u32 gMapObjectPic_OldWoman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/4.4bpp"); -const u32 gMapObjectPic_OldWoman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/5.4bpp"); -const u32 gMapObjectPic_OldWoman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/6.4bpp"); -const u32 gMapObjectPic_OldWoman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/7.4bpp"); -const u32 gMapObjectPic_OldWoman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/8.4bpp"); -const u32 gMapObjectPic_Man2_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/0.4bpp"); -const u32 gMapObjectPic_Man2_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/1.4bpp"); -const u32 gMapObjectPic_Man2_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/2.4bpp"); -const u32 gMapObjectPic_Man2_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/3.4bpp"); -const u32 gMapObjectPic_Man2_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/4.4bpp"); -const u32 gMapObjectPic_Man2_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/5.4bpp"); -const u32 gMapObjectPic_Man2_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/6.4bpp"); -const u32 gMapObjectPic_Man2_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/7.4bpp"); -const u32 gMapObjectPic_Man2_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/8.4bpp"); -const u32 gMapObjectPic_Woman4_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/0.4bpp"); -const u32 gMapObjectPic_Woman4_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/1.4bpp"); -const u32 gMapObjectPic_Woman4_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/2.4bpp"); -const u32 gMapObjectPic_Woman4_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/3.4bpp"); -const u32 gMapObjectPic_Woman4_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/4.4bpp"); -const u32 gMapObjectPic_Woman4_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/5.4bpp"); -const u32 gMapObjectPic_Woman4_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/6.4bpp"); -const u32 gMapObjectPic_Woman4_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/7.4bpp"); -const u32 gMapObjectPic_Woman4_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/8.4bpp"); -const u32 gMapObjectPic_Man3_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/0.4bpp"); -const u32 gMapObjectPic_Man3_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/1.4bpp"); -const u32 gMapObjectPic_Man3_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/2.4bpp"); -const u32 gMapObjectPic_Man3_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/3.4bpp"); -const u32 gMapObjectPic_Man3_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/4.4bpp"); -const u32 gMapObjectPic_Man3_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/5.4bpp"); -const u32 gMapObjectPic_Man3_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/6.4bpp"); -const u32 gMapObjectPic_Man3_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/7.4bpp"); -const u32 gMapObjectPic_Man3_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/8.4bpp"); -const u32 gMapObjectPic_Woman5_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/0.4bpp"); -const u32 gMapObjectPic_Woman5_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/1.4bpp"); -const u32 gMapObjectPic_Woman5_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/2.4bpp"); -const u32 gMapObjectPic_Woman5_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/3.4bpp"); -const u32 gMapObjectPic_Woman5_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/4.4bpp"); -const u32 gMapObjectPic_Woman5_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/5.4bpp"); -const u32 gMapObjectPic_Woman5_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/6.4bpp"); -const u32 gMapObjectPic_Woman5_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/7.4bpp"); -const u32 gMapObjectPic_Woman5_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/8.4bpp"); -const u32 gMapObjectPic_Cook_0[] = INCBIN_U32("graphics/map_objects/pics/people/cook/0.4bpp"); -const u32 gMapObjectPic_Cook_1[] = INCBIN_U32("graphics/map_objects/pics/people/cook/1.4bpp"); -const u32 gMapObjectPic_Cook_2[] = INCBIN_U32("graphics/map_objects/pics/people/cook/2.4bpp"); -const u32 gMapObjectPic_Woman6_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/0.4bpp"); -const u32 gMapObjectPic_Woman6_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/1.4bpp"); -const u32 gMapObjectPic_Woman6_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/2.4bpp"); -const u32 gMapObjectPic_Woman6_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/3.4bpp"); -const u32 gMapObjectPic_Woman6_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/4.4bpp"); -const u32 gMapObjectPic_Woman6_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/5.4bpp"); -const u32 gMapObjectPic_Woman6_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/6.4bpp"); -const u32 gMapObjectPic_Woman6_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/7.4bpp"); -const u32 gMapObjectPic_Woman6_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/8.4bpp"); -const u32 gMapObjectPic_OldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/0.4bpp"); -const u32 gMapObjectPic_OldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/1.4bpp"); -const u32 gMapObjectPic_OldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/2.4bpp"); -const u32 gMapObjectPic_OldWoman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/0.4bpp"); -const u32 gMapObjectPic_OldWoman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/1.4bpp"); -const u32 gMapObjectPic_OldWoman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/2.4bpp"); -const u32 gMapObjectPic_Camper_0[] = INCBIN_U32("graphics/map_objects/pics/people/camper/0.4bpp"); -const u32 gMapObjectPic_Camper_1[] = INCBIN_U32("graphics/map_objects/pics/people/camper/1.4bpp"); -const u32 gMapObjectPic_Camper_2[] = INCBIN_U32("graphics/map_objects/pics/people/camper/2.4bpp"); -const u32 gMapObjectPic_Camper_3[] = INCBIN_U32("graphics/map_objects/pics/people/camper/3.4bpp"); -const u32 gMapObjectPic_Camper_4[] = INCBIN_U32("graphics/map_objects/pics/people/camper/4.4bpp"); -const u32 gMapObjectPic_Camper_5[] = INCBIN_U32("graphics/map_objects/pics/people/camper/5.4bpp"); -const u32 gMapObjectPic_Camper_6[] = INCBIN_U32("graphics/map_objects/pics/people/camper/6.4bpp"); -const u32 gMapObjectPic_Camper_7[] = INCBIN_U32("graphics/map_objects/pics/people/camper/7.4bpp"); -const u32 gMapObjectPic_Camper_8[] = INCBIN_U32("graphics/map_objects/pics/people/camper/8.4bpp"); -const u32 gMapObjectPic_Picnicker_0[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/0.4bpp"); -const u32 gMapObjectPic_Picnicker_1[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/1.4bpp"); -const u32 gMapObjectPic_Picnicker_2[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/2.4bpp"); -const u32 gMapObjectPic_Picnicker_3[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/3.4bpp"); -const u32 gMapObjectPic_Picnicker_4[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/4.4bpp"); -const u32 gMapObjectPic_Picnicker_5[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/5.4bpp"); -const u32 gMapObjectPic_Picnicker_6[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/6.4bpp"); -const u32 gMapObjectPic_Picnicker_7[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/7.4bpp"); -const u32 gMapObjectPic_Picnicker_8[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/8.4bpp"); -const u32 gMapObjectPic_Man4_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/0.4bpp"); -const u32 gMapObjectPic_Man4_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/1.4bpp"); -const u32 gMapObjectPic_Man4_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/2.4bpp"); -const u32 gMapObjectPic_Man4_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/3.4bpp"); -const u32 gMapObjectPic_Man4_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/4.4bpp"); -const u32 gMapObjectPic_Man4_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/5.4bpp"); -const u32 gMapObjectPic_Man4_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/6.4bpp"); -const u32 gMapObjectPic_Man4_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/7.4bpp"); -const u32 gMapObjectPic_Man4_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/8.4bpp"); -const u32 gMapObjectPic_Woman7_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/0.4bpp"); -const u32 gMapObjectPic_Woman7_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/1.4bpp"); -const u32 gMapObjectPic_Woman7_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/2.4bpp"); -const u32 gMapObjectPic_Woman7_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/3.4bpp"); -const u32 gMapObjectPic_Woman7_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/4.4bpp"); -const u32 gMapObjectPic_Woman7_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/5.4bpp"); -const u32 gMapObjectPic_Woman7_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/6.4bpp"); -const u32 gMapObjectPic_Woman7_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/7.4bpp"); -const u32 gMapObjectPic_Woman7_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/8.4bpp"); -const u32 gMapObjectPic_Youngster_0[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/0.4bpp"); -const u32 gMapObjectPic_Youngster_1[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/1.4bpp"); -const u32 gMapObjectPic_Youngster_2[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/2.4bpp"); -const u32 gMapObjectPic_Youngster_3[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/3.4bpp"); -const u32 gMapObjectPic_Youngster_4[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/4.4bpp"); -const u32 gMapObjectPic_Youngster_5[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/5.4bpp"); -const u32 gMapObjectPic_Youngster_6[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/6.4bpp"); -const u32 gMapObjectPic_Youngster_7[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/7.4bpp"); -const u32 gMapObjectPic_Youngster_8[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/8.4bpp"); -const u32 gMapObjectPic_BugCatcher_0[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/0.4bpp"); -const u32 gMapObjectPic_BugCatcher_1[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/1.4bpp"); -const u32 gMapObjectPic_BugCatcher_2[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/2.4bpp"); -const u32 gMapObjectPic_BugCatcher_3[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/3.4bpp"); -const u32 gMapObjectPic_BugCatcher_4[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/4.4bpp"); -const u32 gMapObjectPic_BugCatcher_5[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/5.4bpp"); -const u32 gMapObjectPic_BugCatcher_6[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/6.4bpp"); -const u32 gMapObjectPic_BugCatcher_7[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/7.4bpp"); -const u32 gMapObjectPic_BugCatcher_8[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/8.4bpp"); -const u32 gMapObjectPic_PsychicM_0[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/0.4bpp"); -const u32 gMapObjectPic_PsychicM_1[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/1.4bpp"); -const u32 gMapObjectPic_PsychicM_2[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/2.4bpp"); -const u32 gMapObjectPic_PsychicM_3[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/3.4bpp"); -const u32 gMapObjectPic_PsychicM_4[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/4.4bpp"); -const u32 gMapObjectPic_PsychicM_5[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/5.4bpp"); -const u32 gMapObjectPic_PsychicM_6[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/6.4bpp"); -const u32 gMapObjectPic_PsychicM_7[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/7.4bpp"); -const u32 gMapObjectPic_PsychicM_8[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/8.4bpp"); -const u32 gMapObjectPic_SchoolKidM_0[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/0.4bpp"); -const u32 gMapObjectPic_SchoolKidM_1[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/1.4bpp"); -const u32 gMapObjectPic_SchoolKidM_2[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/2.4bpp"); -const u32 gMapObjectPic_SchoolKidM_3[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/3.4bpp"); -const u32 gMapObjectPic_SchoolKidM_4[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/4.4bpp"); -const u32 gMapObjectPic_SchoolKidM_5[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/5.4bpp"); -const u32 gMapObjectPic_SchoolKidM_6[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/6.4bpp"); -const u32 gMapObjectPic_SchoolKidM_7[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/7.4bpp"); -const u32 gMapObjectPic_SchoolKidM_8[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/8.4bpp"); -const u32 gMapObjectPic_Maniac_0[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/0.4bpp"); -const u32 gMapObjectPic_Maniac_1[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/1.4bpp"); -const u32 gMapObjectPic_Maniac_2[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/2.4bpp"); -const u32 gMapObjectPic_Maniac_3[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/3.4bpp"); -const u32 gMapObjectPic_Maniac_4[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/4.4bpp"); -const u32 gMapObjectPic_Maniac_5[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/5.4bpp"); -const u32 gMapObjectPic_Maniac_6[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/6.4bpp"); -const u32 gMapObjectPic_Maniac_7[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/7.4bpp"); -const u32 gMapObjectPic_Maniac_8[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/8.4bpp"); -const u32 gMapObjectPic_HexManiac_0[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/0.4bpp"); -const u32 gMapObjectPic_HexManiac_1[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/1.4bpp"); -const u32 gMapObjectPic_HexManiac_2[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/2.4bpp"); -const u32 gMapObjectPic_HexManiac_3[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/3.4bpp"); -const u32 gMapObjectPic_HexManiac_4[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/4.4bpp"); -const u32 gMapObjectPic_HexManiac_5[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/5.4bpp"); -const u32 gMapObjectPic_HexManiac_6[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/6.4bpp"); -const u32 gMapObjectPic_HexManiac_7[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/7.4bpp"); -const u32 gMapObjectPic_HexManiac_8[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/8.4bpp"); -const u32 gMapObjectPic_Woman8_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/0.4bpp"); -const u32 gMapObjectPic_Woman8_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/1.4bpp"); -const u32 gMapObjectPic_Woman8_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/2.4bpp"); -const u32 gMapObjectPic_Woman8_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/3.4bpp"); -const u32 gMapObjectPic_Woman8_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/4.4bpp"); -const u32 gMapObjectPic_Woman8_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/5.4bpp"); -const u32 gMapObjectPic_Woman8_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/6.4bpp"); -const u32 gMapObjectPic_Woman8_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/7.4bpp"); -const u32 gMapObjectPic_Woman8_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/8.4bpp"); -const u32 gMapObjectPic_SwimmerM_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/0.4bpp"); -const u32 gMapObjectPic_SwimmerM_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/1.4bpp"); -const u32 gMapObjectPic_SwimmerM_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/2.4bpp"); -const u32 gMapObjectPic_SwimmerM_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/3.4bpp"); -const u32 gMapObjectPic_SwimmerM_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/4.4bpp"); -const u32 gMapObjectPic_SwimmerM_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/5.4bpp"); -const u32 gMapObjectPic_SwimmerM_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/6.4bpp"); -const u32 gMapObjectPic_SwimmerM_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/7.4bpp"); -const u32 gMapObjectPic_SwimmerM_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/8.4bpp"); -const u32 gMapObjectPic_SwimmerF_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/0.4bpp"); -const u32 gMapObjectPic_SwimmerF_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/1.4bpp"); -const u32 gMapObjectPic_SwimmerF_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/2.4bpp"); -const u32 gMapObjectPic_SwimmerF_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/3.4bpp"); -const u32 gMapObjectPic_SwimmerF_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/4.4bpp"); -const u32 gMapObjectPic_SwimmerF_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/5.4bpp"); -const u32 gMapObjectPic_SwimmerF_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/6.4bpp"); -const u32 gMapObjectPic_SwimmerF_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/7.4bpp"); -const u32 gMapObjectPic_SwimmerF_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/8.4bpp"); -const u32 gMapObjectPic_BlackBelt_0[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/0.4bpp"); -const u32 gMapObjectPic_BlackBelt_1[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/1.4bpp"); -const u32 gMapObjectPic_BlackBelt_2[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/2.4bpp"); -const u32 gMapObjectPic_BlackBelt_3[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/3.4bpp"); -const u32 gMapObjectPic_BlackBelt_4[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/4.4bpp"); -const u32 gMapObjectPic_BlackBelt_5[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/5.4bpp"); -const u32 gMapObjectPic_BlackBelt_6[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/6.4bpp"); -const u32 gMapObjectPic_BlackBelt_7[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/7.4bpp"); -const u32 gMapObjectPic_BlackBelt_8[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/8.4bpp"); -const u32 gMapObjectPic_Beauty_0[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/0.4bpp"); -const u32 gMapObjectPic_Beauty_1[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/1.4bpp"); -const u32 gMapObjectPic_Beauty_2[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/2.4bpp"); -const u32 gMapObjectPic_Beauty_3[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/3.4bpp"); -const u32 gMapObjectPic_Beauty_4[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/4.4bpp"); -const u32 gMapObjectPic_Beauty_5[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/5.4bpp"); -const u32 gMapObjectPic_Beauty_6[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/6.4bpp"); -const u32 gMapObjectPic_Beauty_7[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/7.4bpp"); -const u32 gMapObjectPic_Beauty_8[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/8.4bpp"); -const u32 gMapObjectPic_Scientist1_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/0.4bpp"); -const u32 gMapObjectPic_Scientist1_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/1.4bpp"); -const u32 gMapObjectPic_Scientist1_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/2.4bpp"); -const u32 gMapObjectPic_Scientist1_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/3.4bpp"); -const u32 gMapObjectPic_Scientist1_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/4.4bpp"); -const u32 gMapObjectPic_Scientist1_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/5.4bpp"); -const u32 gMapObjectPic_Scientist1_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/6.4bpp"); -const u32 gMapObjectPic_Scientist1_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/7.4bpp"); -const u32 gMapObjectPic_Scientist1_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/8.4bpp"); -const u32 gMapObjectPic_Lass_0[] = INCBIN_U32("graphics/map_objects/pics/people/lass/0.4bpp"); -const u32 gMapObjectPic_Lass_1[] = INCBIN_U32("graphics/map_objects/pics/people/lass/1.4bpp"); -const u32 gMapObjectPic_Lass_2[] = INCBIN_U32("graphics/map_objects/pics/people/lass/2.4bpp"); -const u32 gMapObjectPic_Lass_3[] = INCBIN_U32("graphics/map_objects/pics/people/lass/3.4bpp"); -const u32 gMapObjectPic_Lass_4[] = INCBIN_U32("graphics/map_objects/pics/people/lass/4.4bpp"); -const u32 gMapObjectPic_Lass_5[] = INCBIN_U32("graphics/map_objects/pics/people/lass/5.4bpp"); -const u32 gMapObjectPic_Lass_6[] = INCBIN_U32("graphics/map_objects/pics/people/lass/6.4bpp"); -const u32 gMapObjectPic_Lass_7[] = INCBIN_U32("graphics/map_objects/pics/people/lass/7.4bpp"); -const u32 gMapObjectPic_Lass_8[] = INCBIN_U32("graphics/map_objects/pics/people/lass/8.4bpp"); -const u32 gMapObjectPic_Gentleman_0[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/0.4bpp"); -const u32 gMapObjectPic_Gentleman_1[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/1.4bpp"); -const u32 gMapObjectPic_Gentleman_2[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/2.4bpp"); -const u32 gMapObjectPic_Gentleman_3[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/3.4bpp"); -const u32 gMapObjectPic_Gentleman_4[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/4.4bpp"); -const u32 gMapObjectPic_Gentleman_5[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/5.4bpp"); -const u32 gMapObjectPic_Gentleman_6[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/6.4bpp"); -const u32 gMapObjectPic_Gentleman_7[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/7.4bpp"); -const u32 gMapObjectPic_Gentleman_8[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/8.4bpp"); -const u32 gMapObjectPic_Sailor_0[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/0.4bpp"); -const u32 gMapObjectPic_Sailor_1[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/1.4bpp"); -const u32 gMapObjectPic_Sailor_2[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/2.4bpp"); -const u32 gMapObjectPic_Sailor_3[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/3.4bpp"); -const u32 gMapObjectPic_Sailor_4[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/4.4bpp"); -const u32 gMapObjectPic_Sailor_5[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/5.4bpp"); -const u32 gMapObjectPic_Sailor_6[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/6.4bpp"); -const u32 gMapObjectPic_Sailor_7[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/7.4bpp"); -const u32 gMapObjectPic_Sailor_8[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/8.4bpp"); -const u32 gMapObjectPic_Fisherman_0[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/0.4bpp"); -const u32 gMapObjectPic_Fisherman_1[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/1.4bpp"); -const u32 gMapObjectPic_Fisherman_2[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/2.4bpp"); -const u32 gMapObjectPic_Fisherman_3[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/3.4bpp"); -const u32 gMapObjectPic_Fisherman_4[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/4.4bpp"); -const u32 gMapObjectPic_Fisherman_5[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/5.4bpp"); -const u32 gMapObjectPic_Fisherman_6[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/6.4bpp"); -const u32 gMapObjectPic_Fisherman_7[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/7.4bpp"); -const u32 gMapObjectPic_Fisherman_8[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/8.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/0.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/1.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/2.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/3.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/4.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/5.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/6.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/7.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/8.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/0.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/1.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/2.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/3.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/4.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/5.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/6.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/7.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/8.4bpp"); -const u32 gMapObjectPic_TuberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/0.4bpp"); -const u32 gMapObjectPic_TuberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/1.4bpp"); -const u32 gMapObjectPic_TuberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/2.4bpp"); -const u32 gMapObjectPic_TuberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/3.4bpp"); -const u32 gMapObjectPic_TuberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/4.4bpp"); -const u32 gMapObjectPic_TuberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/5.4bpp"); -const u32 gMapObjectPic_TuberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/6.4bpp"); -const u32 gMapObjectPic_TuberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/7.4bpp"); -const u32 gMapObjectPic_TuberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/8.4bpp"); -const u32 gMapObjectPic_TuberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/0.4bpp"); -const u32 gMapObjectPic_TuberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/1.4bpp"); -const u32 gMapObjectPic_TuberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/2.4bpp"); -const u32 gMapObjectPic_TuberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/3.4bpp"); -const u32 gMapObjectPic_TuberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/4.4bpp"); -const u32 gMapObjectPic_TuberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/5.4bpp"); -const u32 gMapObjectPic_TuberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/6.4bpp"); -const u32 gMapObjectPic_TuberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/7.4bpp"); -const u32 gMapObjectPic_TuberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/8.4bpp"); -const u32 gMapObjectPic_Hiker_0[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/0.4bpp"); -const u32 gMapObjectPic_Hiker_1[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/1.4bpp"); -const u32 gMapObjectPic_Hiker_2[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/2.4bpp"); -const u32 gMapObjectPic_Hiker_3[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/3.4bpp"); -const u32 gMapObjectPic_Hiker_4[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/4.4bpp"); -const u32 gMapObjectPic_Hiker_5[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/5.4bpp"); -const u32 gMapObjectPic_Hiker_6[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/6.4bpp"); -const u32 gMapObjectPic_Hiker_7[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/7.4bpp"); -const u32 gMapObjectPic_Hiker_8[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/8.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/0.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/1.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/2.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/3.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/4.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/5.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/6.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/7.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/8.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/0.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/1.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/2.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/3.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/4.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/5.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/6.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/7.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/8.4bpp"); -const u32 gMapObjectPic_Man5_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/0.4bpp"); -const u32 gMapObjectPic_Man5_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/1.4bpp"); -const u32 gMapObjectPic_Man5_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/2.4bpp"); -const u32 gMapObjectPic_Man5_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/3.4bpp"); -const u32 gMapObjectPic_Man5_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/4.4bpp"); -const u32 gMapObjectPic_Man5_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/5.4bpp"); -const u32 gMapObjectPic_Man5_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/6.4bpp"); -const u32 gMapObjectPic_Man5_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/7.4bpp"); -const u32 gMapObjectPic_Man5_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/8.4bpp"); -const u32 gMapObjectPic_Man6_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/0.4bpp"); -const u32 gMapObjectPic_Man6_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/1.4bpp"); -const u32 gMapObjectPic_Man6_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/2.4bpp"); -const u32 gMapObjectPic_Man6_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/3.4bpp"); -const u32 gMapObjectPic_Man6_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/4.4bpp"); -const u32 gMapObjectPic_Man6_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/5.4bpp"); -const u32 gMapObjectPic_Man6_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/6.4bpp"); -const u32 gMapObjectPic_Man6_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/7.4bpp"); -const u32 gMapObjectPic_Man6_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/8.4bpp"); -const u32 gMapObjectPic_Nurse_0[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/0.4bpp"); -const u32 gMapObjectPic_Nurse_1[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/1.4bpp"); -const u32 gMapObjectPic_Nurse_2[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/2.4bpp"); -const u32 gMapObjectPic_Nurse_3[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/3.4bpp"); -const u32 gMapObjectPic_Nurse_4[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/4.4bpp"); -const u32 gMapObjectPic_Nurse_5[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/5.4bpp"); -const u32 gMapObjectPic_Nurse_6[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/6.4bpp"); -const u32 gMapObjectPic_Nurse_7[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/7.4bpp"); -const u32 gMapObjectPic_Nurse_8[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/8.4bpp"); -const u32 gMapObjectPic_Nurse_9[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/9.4bpp"); -const u32 gMapObjectPic_ItemBall[] = INCBIN_U32("graphics/map_objects/pics/misc/item_ball.4bpp"); -const u32 gMapObjectPic_ProfBirch_0[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/0.4bpp"); -const u32 gMapObjectPic_ProfBirch_1[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/1.4bpp"); -const u32 gMapObjectPic_ProfBirch_2[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/2.4bpp"); -const u32 gMapObjectPic_ProfBirch_3[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/3.4bpp"); -const u32 gMapObjectPic_ProfBirch_4[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/4.4bpp"); -const u32 gMapObjectPic_ProfBirch_5[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/5.4bpp"); -const u32 gMapObjectPic_ProfBirch_6[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/6.4bpp"); -const u32 gMapObjectPic_ProfBirch_7[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/7.4bpp"); -const u32 gMapObjectPic_ProfBirch_8[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/8.4bpp"); -const u32 gMapObjectPic_ReporterM_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/0.4bpp"); -const u32 gMapObjectPic_ReporterM_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/1.4bpp"); -const u32 gMapObjectPic_ReporterM_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/2.4bpp"); -const u32 gMapObjectPic_ReporterM_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/3.4bpp"); -const u32 gMapObjectPic_ReporterM_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/4.4bpp"); -const u32 gMapObjectPic_ReporterM_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/5.4bpp"); -const u32 gMapObjectPic_ReporterM_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/6.4bpp"); -const u32 gMapObjectPic_ReporterM_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/7.4bpp"); -const u32 gMapObjectPic_ReporterM_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/8.4bpp"); -const u32 gMapObjectPic_ReporterF_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/0.4bpp"); -const u32 gMapObjectPic_ReporterF_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/1.4bpp"); -const u32 gMapObjectPic_ReporterF_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/2.4bpp"); -const u32 gMapObjectPic_ReporterF_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/3.4bpp"); -const u32 gMapObjectPic_ReporterF_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/4.4bpp"); -const u32 gMapObjectPic_ReporterF_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/5.4bpp"); -const u32 gMapObjectPic_ReporterF_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/6.4bpp"); -const u32 gMapObjectPic_ReporterF_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/7.4bpp"); -const u32 gMapObjectPic_ReporterF_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/8.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/0.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/1.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/2.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/3.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/4.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/5.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/6.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/7.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/8.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/0.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/1.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/2.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/3.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/4.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/5.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/6.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/7.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/8.4bpp"); -const u32 gMapObjectPic_MartEmployee_0[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/0.4bpp"); -const u32 gMapObjectPic_MartEmployee_1[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/1.4bpp"); -const u32 gMapObjectPic_MartEmployee_2[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/2.4bpp"); -const u32 gMapObjectPic_MartEmployee_3[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/3.4bpp"); -const u32 gMapObjectPic_MartEmployee_4[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/4.4bpp"); -const u32 gMapObjectPic_MartEmployee_5[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/5.4bpp"); -const u32 gMapObjectPic_MartEmployee_6[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/6.4bpp"); -const u32 gMapObjectPic_MartEmployee_7[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/7.4bpp"); -const u32 gMapObjectPic_MartEmployee_8[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/8.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/0.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/1.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/2.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/3.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/4.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/5.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/6.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/7.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/8.4bpp"); -const u32 gMapObjectPic_Teala_0[] = INCBIN_U32("graphics/map_objects/pics/people/teala/0.4bpp"); -const u32 gMapObjectPic_Teala_1[] = INCBIN_U32("graphics/map_objects/pics/people/teala/1.4bpp"); -const u32 gMapObjectPic_Teala_2[] = INCBIN_U32("graphics/map_objects/pics/people/teala/2.4bpp"); -const u32 gMapObjectPic_Teala_3[] = INCBIN_U32("graphics/map_objects/pics/people/teala/3.4bpp"); -const u32 gMapObjectPic_Teala_4[] = INCBIN_U32("graphics/map_objects/pics/people/teala/4.4bpp"); -const u32 gMapObjectPic_Teala_5[] = INCBIN_U32("graphics/map_objects/pics/people/teala/5.4bpp"); -const u32 gMapObjectPic_Teala_6[] = INCBIN_U32("graphics/map_objects/pics/people/teala/6.4bpp"); -const u32 gMapObjectPic_Teala_7[] = INCBIN_U32("graphics/map_objects/pics/people/teala/7.4bpp"); -const u32 gMapObjectPic_Teala_8[] = INCBIN_U32("graphics/map_objects/pics/people/teala/8.4bpp"); -const u32 gMapObjectPic_Artist_0[] = INCBIN_U32("graphics/map_objects/pics/people/artist/0.4bpp"); -const u32 gMapObjectPic_Artist_1[] = INCBIN_U32("graphics/map_objects/pics/people/artist/1.4bpp"); -const u32 gMapObjectPic_Artist_2[] = INCBIN_U32("graphics/map_objects/pics/people/artist/2.4bpp"); -const u32 gMapObjectPic_Artist_3[] = INCBIN_U32("graphics/map_objects/pics/people/artist/3.4bpp"); -const u32 gMapObjectPic_Artist_4[] = INCBIN_U32("graphics/map_objects/pics/people/artist/4.4bpp"); -const u32 gMapObjectPic_Artist_5[] = INCBIN_U32("graphics/map_objects/pics/people/artist/5.4bpp"); -const u32 gMapObjectPic_Artist_6[] = INCBIN_U32("graphics/map_objects/pics/people/artist/6.4bpp"); -const u32 gMapObjectPic_Artist_7[] = INCBIN_U32("graphics/map_objects/pics/people/artist/7.4bpp"); -const u32 gMapObjectPic_Artist_8[] = INCBIN_U32("graphics/map_objects/pics/people/artist/8.4bpp"); -const u32 gMapObjectPic_Cameraman_0[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/0.4bpp"); -const u32 gMapObjectPic_Cameraman_1[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/1.4bpp"); -const u32 gMapObjectPic_Cameraman_2[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/2.4bpp"); -const u32 gMapObjectPic_Cameraman_3[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/3.4bpp"); -const u32 gMapObjectPic_Cameraman_4[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/4.4bpp"); -const u32 gMapObjectPic_Cameraman_5[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/5.4bpp"); -const u32 gMapObjectPic_Cameraman_6[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/6.4bpp"); -const u32 gMapObjectPic_Cameraman_7[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/7.4bpp"); -const u32 gMapObjectPic_Cameraman_8[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/8.4bpp"); -const u32 gMapObjectPic_Scientist2_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/0.4bpp"); -const u32 gMapObjectPic_Scientist2_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/1.4bpp"); -const u32 gMapObjectPic_Scientist2_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/2.4bpp"); -const u32 gMapObjectPic_Scientist2_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/3.4bpp"); -const u32 gMapObjectPic_Scientist2_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/4.4bpp"); -const u32 gMapObjectPic_Scientist2_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/5.4bpp"); -const u32 gMapObjectPic_Scientist2_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/6.4bpp"); -const u32 gMapObjectPic_Scientist2_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/7.4bpp"); -const u32 gMapObjectPic_Scientist2_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/8.4bpp"); -const u32 gMapObjectPic_Man7_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/0.4bpp"); -const u32 gMapObjectPic_Man7_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/1.4bpp"); -const u32 gMapObjectPic_Man7_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/2.4bpp"); -const u32 gMapObjectPic_Man7_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/3.4bpp"); -const u32 gMapObjectPic_Man7_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/4.4bpp"); -const u32 gMapObjectPic_Man7_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/5.4bpp"); -const u32 gMapObjectPic_Man7_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/6.4bpp"); -const u32 gMapObjectPic_Man7_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/7.4bpp"); -const u32 gMapObjectPic_Man7_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/8.4bpp"); -const u32 gMapObjectPic_AquaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/0.4bpp"); -const u32 gMapObjectPic_AquaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/1.4bpp"); -const u32 gMapObjectPic_AquaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/2.4bpp"); -const u32 gMapObjectPic_AquaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/3.4bpp"); -const u32 gMapObjectPic_AquaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/4.4bpp"); -const u32 gMapObjectPic_AquaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/5.4bpp"); -const u32 gMapObjectPic_AquaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/6.4bpp"); -const u32 gMapObjectPic_AquaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/7.4bpp"); -const u32 gMapObjectPic_AquaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/8.4bpp"); -const u32 gMapObjectPic_AquaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/0.4bpp"); -const u32 gMapObjectPic_AquaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/1.4bpp"); -const u32 gMapObjectPic_AquaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/2.4bpp"); -const u32 gMapObjectPic_AquaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/3.4bpp"); -const u32 gMapObjectPic_AquaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/4.4bpp"); -const u32 gMapObjectPic_AquaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/5.4bpp"); -const u32 gMapObjectPic_AquaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/6.4bpp"); -const u32 gMapObjectPic_AquaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/7.4bpp"); -const u32 gMapObjectPic_AquaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/8.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/0.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/1.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/2.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/3.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/4.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/5.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/6.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/7.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/8.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/0.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/1.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/2.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/3.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/4.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/5.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/6.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/7.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/8.4bpp"); -const u32 gMapObjectPic_Sidney_0[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/0.4bpp"); -const u32 gMapObjectPic_Sidney_1[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/1.4bpp"); -const u32 gMapObjectPic_Sidney_2[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/2.4bpp"); -const u32 gMapObjectPic_Phoebe_0[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/0.4bpp"); -const u32 gMapObjectPic_Phoebe_1[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/1.4bpp"); -const u32 gMapObjectPic_Phoebe_2[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/2.4bpp"); -const u32 gMapObjectPic_Glacia_0[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/0.4bpp"); -const u32 gMapObjectPic_Glacia_1[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/1.4bpp"); -const u32 gMapObjectPic_Glacia_2[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/2.4bpp"); -const u32 gMapObjectPic_Drake_0[] = INCBIN_U32("graphics/map_objects/pics/people/drake/0.4bpp"); -const u32 gMapObjectPic_Drake_1[] = INCBIN_U32("graphics/map_objects/pics/people/drake/1.4bpp"); -const u32 gMapObjectPic_Drake_2[] = INCBIN_U32("graphics/map_objects/pics/people/drake/2.4bpp"); -const u32 gMapObjectPic_Roxanne_0[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/0.4bpp"); -const u32 gMapObjectPic_Roxanne_1[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/1.4bpp"); -const u32 gMapObjectPic_Roxanne_2[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/2.4bpp"); -const u32 gMapObjectPic_Brawly_0[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/0.4bpp"); -const u32 gMapObjectPic_Brawly_1[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/1.4bpp"); -const u32 gMapObjectPic_Brawly_2[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/2.4bpp"); -const u32 gMapObjectPic_Wattson_0[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/0.4bpp"); -const u32 gMapObjectPic_Wattson_1[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/1.4bpp"); -const u32 gMapObjectPic_Wattson_2[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/2.4bpp"); -const u32 gMapObjectPic_Flannery_0[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/0.4bpp"); -const u32 gMapObjectPic_Flannery_1[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/1.4bpp"); -const u32 gMapObjectPic_Flannery_2[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/2.4bpp"); -const u32 gMapObjectPic_Norman_0[] = INCBIN_U32("graphics/map_objects/pics/people/norman/0.4bpp"); -const u32 gMapObjectPic_Norman_1[] = INCBIN_U32("graphics/map_objects/pics/people/norman/1.4bpp"); -const u32 gMapObjectPic_Norman_2[] = INCBIN_U32("graphics/map_objects/pics/people/norman/2.4bpp"); -const u32 gMapObjectPic_Norman_3[] = INCBIN_U32("graphics/map_objects/pics/people/norman/3.4bpp"); -const u32 gMapObjectPic_Norman_4[] = INCBIN_U32("graphics/map_objects/pics/people/norman/4.4bpp"); -const u32 gMapObjectPic_Norman_5[] = INCBIN_U32("graphics/map_objects/pics/people/norman/5.4bpp"); -const u32 gMapObjectPic_Norman_6[] = INCBIN_U32("graphics/map_objects/pics/people/norman/6.4bpp"); -const u32 gMapObjectPic_Norman_7[] = INCBIN_U32("graphics/map_objects/pics/people/norman/7.4bpp"); -const u32 gMapObjectPic_Norman_8[] = INCBIN_U32("graphics/map_objects/pics/people/norman/8.4bpp"); -const u32 gMapObjectPic_Winona_0[] = INCBIN_U32("graphics/map_objects/pics/people/winona/0.4bpp"); -const u32 gMapObjectPic_Winona_1[] = INCBIN_U32("graphics/map_objects/pics/people/winona/1.4bpp"); -const u32 gMapObjectPic_Winona_2[] = INCBIN_U32("graphics/map_objects/pics/people/winona/2.4bpp"); -const u32 gMapObjectPic_Liza_0[] = INCBIN_U32("graphics/map_objects/pics/people/liza/0.4bpp"); -const u32 gMapObjectPic_Liza_1[] = INCBIN_U32("graphics/map_objects/pics/people/liza/1.4bpp"); -const u32 gMapObjectPic_Liza_2[] = INCBIN_U32("graphics/map_objects/pics/people/liza/2.4bpp"); -const u32 gMapObjectPic_Tate_0[] = INCBIN_U32("graphics/map_objects/pics/people/tate/0.4bpp"); -const u32 gMapObjectPic_Tate_1[] = INCBIN_U32("graphics/map_objects/pics/people/tate/1.4bpp"); -const u32 gMapObjectPic_Tate_2[] = INCBIN_U32("graphics/map_objects/pics/people/tate/2.4bpp"); -const u32 gMapObjectPic_Wallace_0[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/0.4bpp"); -const u32 gMapObjectPic_Wallace_1[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/1.4bpp"); -const u32 gMapObjectPic_Wallace_2[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/2.4bpp"); -const u32 gMapObjectPic_Wallace_3[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/3.4bpp"); -const u32 gMapObjectPic_Wallace_4[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/4.4bpp"); -const u32 gMapObjectPic_Wallace_5[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/5.4bpp"); -const u32 gMapObjectPic_Wallace_6[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/6.4bpp"); -const u32 gMapObjectPic_Wallace_7[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/7.4bpp"); -const u32 gMapObjectPic_Wallace_8[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/8.4bpp"); -const u32 gMapObjectPic_Steven_0[] = INCBIN_U32("graphics/map_objects/pics/people/steven/0.4bpp"); -const u32 gMapObjectPic_Steven_1[] = INCBIN_U32("graphics/map_objects/pics/people/steven/1.4bpp"); -const u32 gMapObjectPic_Steven_2[] = INCBIN_U32("graphics/map_objects/pics/people/steven/2.4bpp"); -const u32 gMapObjectPic_Steven_3[] = INCBIN_U32("graphics/map_objects/pics/people/steven/3.4bpp"); -const u32 gMapObjectPic_Steven_4[] = INCBIN_U32("graphics/map_objects/pics/people/steven/4.4bpp"); -const u32 gMapObjectPic_Steven_5[] = INCBIN_U32("graphics/map_objects/pics/people/steven/5.4bpp"); -const u32 gMapObjectPic_Steven_6[] = INCBIN_U32("graphics/map_objects/pics/people/steven/6.4bpp"); -const u32 gMapObjectPic_Steven_7[] = INCBIN_U32("graphics/map_objects/pics/people/steven/7.4bpp"); -const u32 gMapObjectPic_Steven_8[] = INCBIN_U32("graphics/map_objects/pics/people/steven/8.4bpp"); -const u32 gMapObjectPic_Wally_0[] = INCBIN_U32("graphics/map_objects/pics/people/wally/0.4bpp"); -const u32 gMapObjectPic_Wally_1[] = INCBIN_U32("graphics/map_objects/pics/people/wally/1.4bpp"); -const u32 gMapObjectPic_Wally_2[] = INCBIN_U32("graphics/map_objects/pics/people/wally/2.4bpp"); -const u32 gMapObjectPic_Wally_3[] = INCBIN_U32("graphics/map_objects/pics/people/wally/3.4bpp"); -const u32 gMapObjectPic_Wally_4[] = INCBIN_U32("graphics/map_objects/pics/people/wally/4.4bpp"); -const u32 gMapObjectPic_Wally_5[] = INCBIN_U32("graphics/map_objects/pics/people/wally/5.4bpp"); -const u32 gMapObjectPic_Wally_6[] = INCBIN_U32("graphics/map_objects/pics/people/wally/6.4bpp"); -const u32 gMapObjectPic_Wally_7[] = INCBIN_U32("graphics/map_objects/pics/people/wally/7.4bpp"); -const u32 gMapObjectPic_Wally_8[] = INCBIN_U32("graphics/map_objects/pics/people/wally/8.4bpp"); -const u32 gMapObjectPic_LittleBoy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/0.4bpp"); -const u32 gMapObjectPic_LittleBoy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/1.4bpp"); -const u32 gMapObjectPic_LittleBoy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/2.4bpp"); -const u32 gMapObjectPic_LittleBoy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/3.4bpp"); -const u32 gMapObjectPic_LittleBoy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/4.4bpp"); -const u32 gMapObjectPic_LittleBoy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/5.4bpp"); -const u32 gMapObjectPic_LittleBoy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/6.4bpp"); -const u32 gMapObjectPic_LittleBoy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/7.4bpp"); -const u32 gMapObjectPic_LittleBoy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/8.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/0.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/1.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/2.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/3.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/4.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/5.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/6.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/7.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/8.4bpp"); -const u32 gMapObjectPic_LatiasLatios_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/0.4bpp"); -const u32 gMapObjectPic_LatiasLatios_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/1.4bpp"); -const u32 gMapObjectPic_LatiasLatios_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/2.4bpp"); -const u32 gMapObjectPic_Boy5_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/0.4bpp"); -const u32 gMapObjectPic_Boy5_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/1.4bpp"); -const u32 gMapObjectPic_Boy5_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/2.4bpp"); -const u32 gMapObjectPic_ContestJudge_0[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/0.4bpp"); -const u32 gMapObjectPic_ContestJudge_1[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/1.4bpp"); -const u32 gMapObjectPic_ContestJudge_2[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/2.4bpp"); -const u32 gMapObjectPic_ContestJudge_3[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/3.4bpp"); -const u32 gMapObjectPic_ContestJudge_4[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/4.4bpp"); -const u32 gMapObjectPic_ContestJudge_5[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/5.4bpp"); -const u32 gMapObjectPic_ContestJudge_6[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/6.4bpp"); -const u32 gMapObjectPic_ContestJudge_7[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/7.4bpp"); -const u32 gMapObjectPic_ContestJudge_8[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/8.4bpp"); -const u32 gMapObjectPic_Archie_0[] = INCBIN_U32("graphics/map_objects/pics/people/archie/0.4bpp"); -const u32 gMapObjectPic_Archie_1[] = INCBIN_U32("graphics/map_objects/pics/people/archie/1.4bpp"); -const u32 gMapObjectPic_Archie_2[] = INCBIN_U32("graphics/map_objects/pics/people/archie/2.4bpp"); -const u32 gMapObjectPic_Archie_3[] = INCBIN_U32("graphics/map_objects/pics/people/archie/3.4bpp"); -const u32 gMapObjectPic_Archie_4[] = INCBIN_U32("graphics/map_objects/pics/people/archie/4.4bpp"); -const u32 gMapObjectPic_Archie_5[] = INCBIN_U32("graphics/map_objects/pics/people/archie/5.4bpp"); -const u32 gMapObjectPic_Archie_6[] = INCBIN_U32("graphics/map_objects/pics/people/archie/6.4bpp"); -const u32 gMapObjectPic_Archie_7[] = INCBIN_U32("graphics/map_objects/pics/people/archie/7.4bpp"); -const u32 gMapObjectPic_Archie_8[] = INCBIN_U32("graphics/map_objects/pics/people/archie/8.4bpp"); -const u32 gMapObjectPic_Maxie_0[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/0.4bpp"); -const u32 gMapObjectPic_Maxie_1[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/1.4bpp"); -const u32 gMapObjectPic_Maxie_2[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/2.4bpp"); -const u32 gMapObjectPic_Maxie_3[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/3.4bpp"); -const u32 gMapObjectPic_Maxie_4[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/4.4bpp"); -const u32 gMapObjectPic_Maxie_5[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/5.4bpp"); -const u32 gMapObjectPic_Maxie_6[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/6.4bpp"); -const u32 gMapObjectPic_Maxie_7[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/7.4bpp"); -const u32 gMapObjectPic_Maxie_8[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/8.4bpp"); -const u32 gMapObjectPic_Kyogre_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/0.4bpp"); -const u32 gMapObjectPic_Kyogre_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/1.4bpp"); -const u32 gMapObjectPic_Groudon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/0.4bpp"); -const u32 gMapObjectPic_Groudon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/1.4bpp"); -const u32 gMapObjectPic_Regi[] = INCBIN_U32("graphics/map_objects/pics/pokemon/regi.4bpp"); -const u32 gMapObjectPic_Skitty_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/0.4bpp"); -const u32 gMapObjectPic_Skitty_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/1.4bpp"); -const u32 gMapObjectPic_Skitty_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/2.4bpp"); -const u32 gMapObjectPic_Kecleon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/0.4bpp"); -const u32 gMapObjectPic_Kecleon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/1.4bpp"); -const u32 gMapObjectPic_Kecleon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/2.4bpp"); -const u32 gMapObjectPic_Rayquaza_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/0.4bpp"); -const u32 gMapObjectPic_Rayquaza_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/1.4bpp"); -const u32 gMapObjectPic_Zigzagoon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/0.4bpp"); -const u32 gMapObjectPic_Zigzagoon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/1.4bpp"); -const u32 gMapObjectPic_Zigzagoon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/2.4bpp"); -const u32 gMapObjectPic_Pikachu_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/0.4bpp"); -const u32 gMapObjectPic_Pikachu_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/1.4bpp"); -const u32 gMapObjectPic_Pikachu_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/2.4bpp"); -const u32 gMapObjectPic_Azumarill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/0.4bpp"); -const u32 gMapObjectPic_Azumarill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/1.4bpp"); -const u32 gMapObjectPic_Azumarill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/2.4bpp"); -const u32 gMapObjectPic_Wingull_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/0.4bpp"); -const u32 gMapObjectPic_Wingull_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/3.4bpp"); -const u32 gMapObjectPic_Wingull_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/1.4bpp"); -const u32 gMapObjectPic_Wingull_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/4.4bpp"); -const u32 gMapObjectPic_Wingull_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/2.4bpp"); -const u32 gMapObjectPic_Wingull_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/5.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/0.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/1.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/2.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/3.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/4.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/5.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/6.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/7.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/8.4bpp"); -const u32 gMapObjectPic_Azurill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/0.4bpp"); -const u32 gMapObjectPic_Azurill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/1.4bpp"); -const u32 gMapObjectPic_Azurill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/2.4bpp"); -const u32 gMapObjectPic_Mom_0[] = INCBIN_U32("graphics/map_objects/pics/people/mom/0.4bpp"); -const u32 gMapObjectPic_Mom_1[] = INCBIN_U32("graphics/map_objects/pics/people/mom/1.4bpp"); -const u32 gMapObjectPic_Mom_2[] = INCBIN_U32("graphics/map_objects/pics/people/mom/2.4bpp"); -const u32 gMapObjectPic_Mom_3[] = INCBIN_U32("graphics/map_objects/pics/people/mom/3.4bpp"); -const u32 gMapObjectPic_Mom_4[] = INCBIN_U32("graphics/map_objects/pics/people/mom/4.4bpp"); -const u32 gMapObjectPic_Mom_5[] = INCBIN_U32("graphics/map_objects/pics/people/mom/5.4bpp"); -const u32 gMapObjectPic_Mom_6[] = INCBIN_U32("graphics/map_objects/pics/people/mom/6.4bpp"); -const u32 gMapObjectPic_Mom_7[] = INCBIN_U32("graphics/map_objects/pics/people/mom/7.4bpp"); -const u32 gMapObjectPic_Mom_8[] = INCBIN_U32("graphics/map_objects/pics/people/mom/8.4bpp"); -const u16 gMapObjectPalette22[] = INCBIN_U16("graphics/map_objects/palettes/22.gbapal"); -const u16 gMapObjectPalette23[] = INCBIN_U16("graphics/map_objects/palettes/23.gbapal"); -const u16 gMapObjectPalette24[] = INCBIN_U16("graphics/map_objects/palettes/24.gbapal"); -const u16 gMapObjectPalette25[] = INCBIN_U16("graphics/map_objects/palettes/25.gbapal"); -const u32 gMapObjectPic_UnusedNatuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_natu_doll.4bpp"); -const u32 gMapObjectPic_UnusedMagnemiteDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_magnemite_doll.4bpp"); -const u32 gMapObjectPic_UnusedSquirtleDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_squirtle_doll.4bpp"); -const u32 gMapObjectPic_UnusedWooperDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_wooper_doll.4bpp"); -const u32 gMapObjectPic_UnusedPikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_pikachu_doll.4bpp"); -const u32 gMapObjectPic_UnusedPorygon2Doll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_porygon2_doll.4bpp"); -const u32 gMapObjectPic_PichuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pichu_doll.4bpp"); -const u32 gMapObjectPic_PikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pikachu_doll.4bpp"); -const u32 gMapObjectPic_MarillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/marill_doll.4bpp"); -const u32 gMapObjectPic_TogepiDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/togepi_doll.4bpp"); -const u32 gMapObjectPic_CyndaquilDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/cyndaquil_doll.4bpp"); -const u32 gMapObjectPic_ChikoritaDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/chikorita_doll.4bpp"); -const u32 gMapObjectPic_TotodileDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/totodile_doll.4bpp"); -const u32 gMapObjectPic_JigglypuffDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/jigglypuff_doll.4bpp"); -const u32 gMapObjectPic_MeowthDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/meowth_doll.4bpp"); -const u32 gMapObjectPic_ClefairyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/clefairy_doll.4bpp"); -const u32 gMapObjectPic_DittoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/ditto_doll.4bpp"); -const u32 gMapObjectPic_SmoochumDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/smoochum_doll.4bpp"); -const u32 gMapObjectPic_TreeckoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/treecko_doll.4bpp"); -const u32 gMapObjectPic_TorchicDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/torchic_doll.4bpp"); -const u32 gMapObjectPic_MudkipDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/mudkip_doll.4bpp"); -const u32 gMapObjectPic_DuskullDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/duskull_doll.4bpp"); -const u32 gMapObjectPic_WynautDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/wynaut_doll.4bpp"); -const u32 gMapObjectPic_BaltoyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/baltoy_doll.4bpp"); -const u32 gMapObjectPic_KecleonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/kecleon_doll.4bpp"); -const u32 gMapObjectPic_AzurillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/azurill_doll.4bpp"); -const u32 gMapObjectPic_SkittyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/skitty_doll.4bpp"); -const u32 gMapObjectPic_SwabluDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/swablu_doll.4bpp"); -const u32 gMapObjectPic_GulpinDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/gulpin_doll.4bpp"); -const u32 gMapObjectPic_LotadDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/lotad_doll.4bpp"); -const u32 gMapObjectPic_SeedotDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/seedot_doll.4bpp"); -const u32 gMapObjectPic_PikaCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/pika_cushion.4bpp"); -const u32 gMapObjectPic_RoundCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/round_cushion.4bpp"); -const u32 gMapObjectPic_KissCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/kiss_cushion.4bpp"); -const u32 gMapObjectPic_ZigzagCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/zigzag_cushion.4bpp"); -const u32 gMapObjectPic_SpinCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/spin_cushion.4bpp"); -const u32 gMapObjectPic_DiamondCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/diamond_cushion.4bpp"); -const u32 gMapObjectPic_BallCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/ball_cushion.4bpp"); -const u32 gMapObjectPic_GrassCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/grass_cushion.4bpp"); -const u32 gMapObjectPic_FireCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/fire_cushion.4bpp"); -const u32 gMapObjectPic_WaterCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/water_cushion.4bpp"); -const u32 gMapObjectPic_BigSnorlaxDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_snorlax_doll.4bpp"); -const u32 gMapObjectPic_BigRhydonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_rhydon_doll.4bpp"); -const u32 gMapObjectPic_BigLaprasDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_lapras_doll.4bpp"); -const u32 gMapObjectPic_BigVenusaurDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_venusaur_doll.4bpp"); -const u32 gMapObjectPic_BigCharizardDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_charizard_doll.4bpp"); -const u32 gMapObjectPic_BigBlastoiseDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_blastoise_doll.4bpp"); -const u32 gMapObjectPic_BigWailmerDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_wailmer_doll.4bpp"); -const u32 gMapObjectPic_BigRegirockDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regirock_doll.4bpp"); -const u32 gMapObjectPic_BigRegiceDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regice_doll.4bpp"); -const u32 gMapObjectPic_BigRegisteelDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_registeel_doll.4bpp"); -const u32 gMapObjectPic_CuttableTree_0[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/0.4bpp"); -const u32 gMapObjectPic_CuttableTree_1[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/1.4bpp"); -const u32 gMapObjectPic_CuttableTree_2[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/2.4bpp"); -const u32 gMapObjectPic_CuttableTree_3[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/3.4bpp"); -const u32 gMapObjectPic_BreakableRock_0[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/0.4bpp"); -const u32 gMapObjectPic_BreakableRock_1[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/1.4bpp"); -const u32 gMapObjectPic_BreakableRock_2[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/2.4bpp"); -const u32 gMapObjectPic_BreakableRock_3[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/3.4bpp"); -const u32 gMapObjectPic_PushableBoulder[] = INCBIN_U32("graphics/map_objects/pics/misc/pushable_boulder.4bpp"); -const u32 gMapObjectPic_MrBrineysBoat_0[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/0.4bpp"); -const u32 gMapObjectPic_MrBrineysBoat_1[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/1.4bpp"); -const u32 gMapObjectPic_MrBrineysBoat_2[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/2.4bpp"); -const u32 gMapObjectPic_Fossil[] = INCBIN_U32("graphics/map_objects/pics/misc/fossil.4bpp"); -const u32 gMapObjectPic_SubmarineShadow[] = INCBIN_U32("graphics/map_objects/pics/misc/submarine_shadow.4bpp"); -const u16 gMapObjectPalette26[] = INCBIN_U16("graphics/map_objects/palettes/26.gbapal"); -const u32 gMapObjectPic_Truck[] = INCBIN_U32("graphics/map_objects/pics/misc/truck.4bpp"); -const u16 gMapObjectPalette14[] = INCBIN_U16("graphics/map_objects/palettes/14.gbapal"); -const u32 gMapObjectPic_MachokeCarryingBox_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/0.4bpp"); -const u32 gMapObjectPic_MachokeCarryingBox_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/1.4bpp"); -const u32 gMapObjectPic_MachokeCarryingBox_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/2.4bpp"); -const u32 gMapObjectPic_MachokeFacingAway_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/0.4bpp"); -const u32 gMapObjectPic_MachokeFacingAway_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/1.4bpp"); -const u16 gMapObjectPalette15[] = INCBIN_U16("graphics/map_objects/palettes/15.gbapal"); -const u32 gMapObjectPic_BirchsBag[] = INCBIN_U32("graphics/map_objects/pics/misc/birchs_bag.4bpp"); -const u32 gMapObjectPic_Poochyena_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/0.4bpp"); -const u32 gMapObjectPic_Poochyena_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/1.4bpp"); -const u32 gMapObjectPic_Poochyena_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/2.4bpp"); -const u32 gMapObjectPic_Poochyena_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/3.4bpp"); -const u32 gMapObjectPic_Poochyena_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/4.4bpp"); -const u32 gMapObjectPic_Poochyena_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/5.4bpp"); -const u32 gMapObjectPic_Poochyena_6[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/6.4bpp"); -const u32 gMapObjectPic_Poochyena_7[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/7.4bpp"); -const u32 gMapObjectPic_Poochyena_8[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/8.4bpp"); -const u16 gMapObjectPalette16[] = INCBIN_U16("graphics/map_objects/palettes/16.gbapal"); -const u32 gMapObjectPic_CableCar[] = INCBIN_U32("graphics/map_objects/pics/misc/cable_car.4bpp"); -const u16 gMapObjectPalette20[] = INCBIN_U16("graphics/map_objects/palettes/20.gbapal"); -const u32 gMapObjectPic_SSTidal[] = INCBIN_U32("graphics/map_objects/pics/misc/ss_tidal.4bpp"); -const u16 gMapObjectPalette21[] = INCBIN_U16("graphics/map_objects/palettes/21.gbapal"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/0.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/1.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_2[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/2.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_3[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/3.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_4[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/4.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_5[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/5.4bpp"); -const u32 gMapObjectPic_BerryTreeDirtPile[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/dirt_pile.4bpp"); -const u32 gMapObjectPic_BerryTreeSprout_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/0.4bpp"); -const u32 gMapObjectPic_BerryTreeSprout_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/1.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/0.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/1.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/2.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/3.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/4.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/5.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/0.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/1.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/2.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/3.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/4.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/5.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/0.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/1.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/2.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/3.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/4.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/5.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/0.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/1.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/2.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/3.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/4.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/5.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/0.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/1.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/2.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/3.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/4.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/5.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/0.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/1.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/2.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/3.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/4.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/5.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/0.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/1.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/2.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/3.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/4.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/5.4bpp"); -const u32 gMapObjectPic_LumBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/0.4bpp"); -const u32 gMapObjectPic_LumBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/1.4bpp"); -const u32 gMapObjectPic_LumBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/2.4bpp"); -const u32 gMapObjectPic_LumBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/3.4bpp"); -const u32 gMapObjectPic_LumBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/4.4bpp"); -const u32 gMapObjectPic_LumBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/5.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/0.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/1.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/2.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/3.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/4.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/5.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/0.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/1.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/2.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/3.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/4.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/5.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/0.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/1.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/2.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/3.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/4.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/5.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/0.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/1.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/2.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/3.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/4.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/5.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/0.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/1.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/2.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/3.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/4.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/5.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/0.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/1.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/2.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/3.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/4.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/5.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/0.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/1.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/2.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/3.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/4.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/5.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/0.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/1.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/2.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/3.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/4.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/5.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/0.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/1.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/2.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/3.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/4.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/5.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/0.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/1.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/2.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/3.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/4.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/5.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/0.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/1.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/2.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/3.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/4.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/5.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/0.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/1.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/2.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/3.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/4.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/5.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/0.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/1.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/2.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/3.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/4.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/5.4bpp"); -const u32 gMapObjectPic_OranBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/0.4bpp"); -const u32 gMapObjectPic_OranBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/1.4bpp"); -const u32 gMapObjectPic_OranBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/2.4bpp"); -const u32 gMapObjectPic_OranBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/3.4bpp"); -const u32 gMapObjectPic_OranBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/4.4bpp"); -const u32 gMapObjectPic_OranBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/5.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/0.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/1.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/2.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/3.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/4.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/5.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/0.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/1.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/2.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/3.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/4.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/5.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/0.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/1.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/2.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/3.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/4.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/5.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/0.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/1.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/2.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/3.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/4.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/5.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/0.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/1.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/2.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/3.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/4.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/5.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/0.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/1.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/2.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/3.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/4.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/5.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/0.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/1.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/2.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/3.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/4.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/5.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/0.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/1.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/2.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/3.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/4.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/5.4bpp"); -const u32 gFieldEffectPic_SurfBlob_0[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/0.4bpp"); -const u32 gFieldEffectPic_SurfBlob_1[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/1.4bpp"); -const u32 gFieldEffectPic_SurfBlob_2[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/2.4bpp"); -const u32 gMapObjectPic_QuintyPlump_0[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/0.4bpp"); -const u32 gMapObjectPic_QuintyPlump_1[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/1.4bpp"); -const u32 gMapObjectPic_QuintyPlump_2[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/2.4bpp"); -const u32 gMapObjectPic_QuintyPlump_3[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/3.4bpp"); -const u32 gMapObjectPic_QuintyPlump_4[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/4.4bpp"); -const u32 gMapObjectPic_QuintyPlump_5[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/5.4bpp"); -const u32 gMapObjectPic_QuintyPlump_6[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/6.4bpp"); -const u16 gMapObjectPalette12[] = INCBIN_U16("graphics/map_objects/palettes/12.gbapal"); -const u16 gMapObjectPalette13[] = INCBIN_U16("graphics/map_objects/palettes/13.gbapal"); - -const u32 gFieldEffectPic_ShadowSmall[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_small.4bpp"); -const u32 gFieldEffectPic_ShadowMedium[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_medium.4bpp"); -const u32 gFieldEffectPic_ShadowLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_large.4bpp"); -const u32 gFieldEffectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_extra_large.4bpp"); -const u32 filler_8368A08[0x48] = {}; -const u32 gFieldEffectPic_CutGrass[] = INCBIN_U32("graphics/field_effect_objects/pics/cut_grass.4bpp"); -const u32 FieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/field_effect_objects/pics/cut_grass.4bpp"); -const u16 gFieldEffectObjectPalette6[] = INCBIN_U16("graphics/field_effect_objects/palettes/06.gbapal"); -const u32 gFieldEffectPic_Ripple_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/0.4bpp"); -const u32 gFieldEffectPic_Ripple_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/1.4bpp"); -const u32 gFieldEffectPic_Ripple_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/2.4bpp"); -const u32 gFieldEffectPic_Ripple_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/3.4bpp"); -const u32 gFieldEffectPic_Ripple_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/4.4bpp"); -const u32 gFieldEffectPic_Ash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/0.4bpp"); -const u32 gFieldEffectPic_Ash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/1.4bpp"); -const u32 gFieldEffectPic_Ash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/2.4bpp"); -const u32 gFieldEffectPic_Ash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/3.4bpp"); -const u32 gFieldEffectPic_Ash_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/4.4bpp"); -const u32 gFieldEffectPic_Arrow_0[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/0.4bpp"); -const u32 gFieldEffectPic_Arrow_1[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/1.4bpp"); -const u32 gFieldEffectPic_Arrow_2[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/2.4bpp"); -const u32 gFieldEffectPic_Arrow_3[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/3.4bpp"); -const u32 gFieldEffectPic_Arrow_4[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/4.4bpp"); -const u32 gFieldEffectPic_Arrow_5[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/5.4bpp"); -const u32 gFieldEffectPic_Arrow_6[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/6.4bpp"); -const u32 gFieldEffectPic_Arrow_7[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/7.4bpp"); -const u16 gFieldEffectObjectPalette0[] = INCBIN_U16("graphics/field_effect_objects/palettes/00.gbapal"); -const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/field_effect_objects/palettes/01.gbapal"); -const u32 gFieldEffectPic_Dust_0[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/0.4bpp"); -const u32 gFieldEffectPic_Dust_1[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/1.4bpp"); -const u32 gFieldEffectPic_Dust_2[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/2.4bpp"); -const u32 unknown_8369588[] = INCBIN_U32("graphics/field_effect_objects/unknown.bin"); -const u32 gFieldEffectPic_JumpTallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/0.4bpp"); -const u32 gFieldEffectPic_JumpTallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/1.4bpp"); -const u32 gFieldEffectPic_JumpTallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/2.4bpp"); -const u32 gFieldEffectPic_JumpTallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/3.4bpp"); -const u32 UnusedGrass0[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/0.4bpp"); -const u32 UnusedGrass1[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/1.4bpp"); -const u32 UnusedGrass2[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/2.4bpp"); -const u32 UnusedGrass3[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/3.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/0.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/1.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/2.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/3.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/4.4bpp"); -const u32 UnusedGrassLong[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/unused.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_5[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/5.4bpp"); -const u32 gFieldEffectPic_Unknown17_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/0.4bpp"); -const u32 gFieldEffectPic_Unknown17_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/1.4bpp"); -const u32 gFieldEffectPic_Unknown17_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/2.4bpp"); -const u32 gFieldEffectPic_Unknown17_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/3.4bpp"); -const u32 gFieldEffectPic_Unknown17_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/4.4bpp"); -const u32 gFieldEffectPic_Unknown17_5[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/5.4bpp"); -const u32 gFieldEffectPic_Unknown17_6[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/6.4bpp"); -const u32 gFieldEffectPic_Unknown17_7[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/7.4bpp"); -const u32 gFieldEffectPic_Unknown18_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/0.4bpp"); -const u32 gFieldEffectPic_Unknown18_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/1.4bpp"); -const u32 gFieldEffectPic_Unknown18_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/2.4bpp"); -const u32 gFieldEffectPic_Unknown18_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/3.4bpp"); -const u32 gFieldEffectPic_LongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/0.4bpp"); -const u32 gFieldEffectPic_LongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/1.4bpp"); -const u32 gFieldEffectPic_LongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/2.4bpp"); -const u32 gFieldEffectPic_LongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/3.4bpp"); -const u32 gFieldEffectPic_TallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/0.4bpp"); -const u32 gFieldEffectPic_TallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/1.4bpp"); -const u32 gFieldEffectPic_TallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/2.4bpp"); -const u32 gFieldEffectPic_TallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/3.4bpp"); -const u32 gFieldEffectPic_TallGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/4.4bpp"); -const u32 gFieldEffectPic_ShortGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/0.4bpp"); -const u32 gFieldEffectPic_ShortGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/1.4bpp"); -const u32 gFieldEffectPic_SandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/0.4bpp"); -const u32 gFieldEffectPic_SandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/1.4bpp"); -const u32 gFieldEffectPic_DeepSandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/0.4bpp"); -const u32 gFieldEffectPic_DeepSandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/1.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/0.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/1.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/2.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/3.4bpp"); -const u32 gFieldEffectPic_Unknown19_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/0.4bpp"); -const u32 gFieldEffectPic_Unknown19_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/1.4bpp"); -const u32 gFieldEffectPic_Unknown19_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/2.4bpp"); -const u32 gFieldEffectPic_Unknown19_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/3.4bpp"); -const u32 gFieldEffectPic_SandPile_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/0.4bpp"); -const u32 gFieldEffectPic_SandPile_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/1.4bpp"); -const u32 gFieldEffectPic_SandPile_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/2.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/0.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/1.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/2.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/3.4bpp"); -const u32 gFieldEffectPic_Splash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/0.4bpp"); -const u32 gFieldEffectPic_Splash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/1.4bpp"); -const u32 gFieldEffectPic_JumpSmallSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/0.4bpp"); -const u32 gFieldEffectPic_JumpSmallSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/1.4bpp"); -const u32 gFieldEffectPic_JumpSmallSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/2.4bpp"); -const u32 gFieldEffectPic_Unknown20_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/0.4bpp"); -const u32 gFieldEffectPic_Unknown20_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/1.4bpp"); -const u32 gFieldEffectPic_Unknown20_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/2.4bpp"); -const u32 gFieldEffectPic_Unknown20_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/3.4bpp"); -const u32 gFieldEffectPic_Unknown20_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/4.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/0.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/1.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/2.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/3.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/4.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/5.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/6.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/0.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/1.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/2.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/3.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/4.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/5.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/6.4bpp"); -const u32 gFieldEffectPic_SandDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/0.4bpp"); -const u32 gFieldEffectPic_SandDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/1.4bpp"); -const u32 gFieldEffectPic_SandDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/2.4bpp"); -const u32 gFieldEffectPic_SandDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/3.4bpp"); -const u32 gFieldEffectPic_SandDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/4.4bpp"); -const u32 gFieldEffectPic_SandDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/5.4bpp"); -const u32 gFieldEffectPic_SandDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/6.4bpp"); -const u32 gFieldEffectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effect_objects/pics/hot_springs_water.4bpp"); -const u16 gFieldEffectObjectPalette2[] = INCBIN_U16("graphics/field_effect_objects/palettes/02.gbapal"); -const u32 gFieldEffectPic_PopOutOfAsh_0[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/0.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_1[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/1.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_2[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/2.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_3[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/3.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_4[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/4.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_0[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/0.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_1[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/1.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_2[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/2.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_3[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/3.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_4[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/4.4bpp"); -const u32 gFieldEffectPic_Bubbles_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/0.4bpp"); -const u32 gFieldEffectPic_Bubbles_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/1.4bpp"); -const u32 gFieldEffectPic_Bubbles_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/2.4bpp"); -const u32 gFieldEffectPic_Bubbles_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/3.4bpp"); -const u32 gFieldEffectPic_Bubbles_4[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/4.4bpp"); -const u32 gFieldEffectPic_Bubbles_5[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/5.4bpp"); -const u32 gFieldEffectPic_Bubbles_6[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/6.4bpp"); -const u32 gFieldEffectPic_Bubbles_7[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/7.4bpp"); -const u32 gFieldEffectPic_Sparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/0.4bpp"); -const u32 gFieldEffectPic_Sparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/1.4bpp"); -const u16 gFieldEffectObjectPalette3[] = INCBIN_U16("graphics/field_effect_objects/palettes/03.gbapal"); -const u32 gFieldEffectPic_Bird[] = INCBIN_U32("graphics/field_effect_objects/pics/bird.4bpp"); - -void (*const gUnknown_0836DA88[])(struct Sprite *) = -{ - sub_805C884, - sub_805CDE8, - sub_805C8AC, - sub_805CF28, - sub_805CF28, - sub_805D0AC, - sub_805D0AC, - sub_805D230, - sub_805D230, - sub_805D230, - sub_805D230, - sub_80587B4, - FieldObjectCB_BerryTree, - sub_805D4F4, - sub_805D634, - sub_805D774, - sub_805D8B4, - sub_805D9F4, - sub_805DB34, - sub_805DC74, - sub_805DDB4, - sub_805DEF4, - sub_805E034, - sub_805E174, - sub_805E278, - sub_805E37C, - sub_805E37C, - sub_805E37C, - sub_805E37C, - sub_805E5DC, - sub_805E668, - sub_805E6F4, - sub_805E780, - sub_805E80C, - sub_805E898, - sub_805E924, - sub_805E9B0, - sub_805EA3C, - sub_805EAC8, - sub_805EB54, - sub_805EBE0, - sub_805EC6C, - sub_805ECF8, - sub_805ED84, - sub_805EE10, - sub_805EE9C, - sub_805EF28, - sub_805EFB4, - sub_805F040, - sub_805F0CC, - sub_805F158, - sub_805F1E4, - sub_805F270, - sub_805F2FC, - sub_805F2FC, - sub_805F2FC, - sub_805F2FC, - FieldObjectCB_TreeDisguise, - FieldObjectCB_MountainDisguise, - sub_805F8E0, - sub_805F8E0, - sub_805F8E0, - sub_805F8E0, - FieldObjectCB_Hidden1, - sub_805FB20, - sub_805FB20, - sub_805FB20, - sub_805FB20, - sub_805FB90, - sub_805FB90, - sub_805FB90, - sub_805FB90, - sub_805FC00, - sub_805FC00, - sub_805FC00, - sub_805FC00, - sub_805FC70 -}; - -const u8 gUnknown_0836DBBC[] = {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -const u8 gUnknown_0836DC09[] = {DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH}; - -#include "data/field_map_obj/map_object_graphics_info_pointers.h" -#include "data/field_map_obj/field_effect_object_template_pointers.h" -#include "data/field_map_obj/map_object_pic_tables.h" -#include "data/field_map_obj/map_object_anims.h" -#include "data/field_map_obj/base_oam.h" -#include "data/field_map_obj/map_object_subsprites.h" -#include "data/field_map_obj/map_object_graphics_info.h" - -const struct SpritePalette gUnknown_0837377C[] = { - {gMapObjectPalette0, 0x1103}, - {gMapObjectPalette1, 0x1104}, - {gMapObjectPalette2, 0x1105}, - {gMapObjectPalette3, 0x1106}, - {gMapObjectPalette4, 0x1107}, - {gMapObjectPalette5, 0x1108}, - {gMapObjectPalette6, 0x1109}, - {gMapObjectPalette7, 0x110A}, - {gMapObjectPalette8, 0x1100}, - {gMapObjectPalette9, 0x1101}, - {gMapObjectPalette10, 0x1102}, - {gMapObjectPalette11, 0x1115}, - {gMapObjectPalette12, 0x110B}, - {gMapObjectPalette13, 0x110C}, - {gMapObjectPalette14, 0x110D}, - {gMapObjectPalette15, 0x110E}, - {gMapObjectPalette16, 0x110F}, - {gMapObjectPalette17, 0x1110}, - {gMapObjectPalette18, 0x1111}, - {gMapObjectPalette19, 0x1112}, - {gMapObjectPalette20, 0x1113}, - {gMapObjectPalette21, 0x1114}, - {gMapObjectPalette22, 0x1116}, - {gMapObjectPalette23, 0x1117}, - {gMapObjectPalette24, 0x1118}, - {gMapObjectPalette25, 0x1119}, - {gMapObjectPalette26, 0x111A}, - {NULL, 0x0000} -}; - -const u16 Palettes_837385C[] = { - 0x1101, - 0x1101, - 0x1101, - 0x1101 -}; - -const u16 Palettes_8373864[] = { - 0x1111, - 0x1111, - 0x1111, - 0x1111 -}; - -const u16 Palettes_837386C[] = { - 0x1115, - 0x1115, - 0x1115, - 0x1115 -}; - -const struct PairedPalettes gUnknown_08373874[] = { - {0x1100, Palettes_837385C}, - {0x1110, Palettes_837385C}, - {0x1115, Palettes_837386C}, - {0x11FF, NULL} -}; - -const u16 Palettes_8373894[] = { - 0x110C, - 0x110C, - 0x110C, - 0x110C -}; - -const u16 Palettes_837389C[] = { - 0x110D, - 0x110D, - 0x110D, - 0x110D -}; - -const u16 Palettes_83738A4[] = { - 0x110E, - 0x110E, - 0x110E, - 0x110E -}; - -const u16 Palettes_83738AC[] = { - 0x1112, - 0x1112, - 0x1112, - 0x1112 -}; - -const u16 Palettes_83738B4[] = { - 0x1113, - 0x1113, - 0x1113, - 0x1113 -}; - -const u16 Palettes_83738BC[] = { - 0x1114, - 0x1114, - 0x1114, - 0x1114 -}; - -const u16 Palettes_83738C4[] = { - 0x111A, - 0x111A, - 0x111A, - 0x111A -}; - -const u16 Palettes_83738CC[] = { - 0x1117, - 0x1117, - 0x1117, - 0x1117 -}; - -const u16 Palettes_83738D4[] = { - 0x1119, - 0x1119, - 0x1119, - 0x1119 -}; - -const u16 Palettes_83738DC[] = { - 0x1109, - 0x1109, - 0x1109, - 0x1109 -}; - -const struct PairedPalettes gUnknown_083738E4[] = { - {0x1100, Palettes_837385C}, - {0x1110, Palettes_837385C}, - {0x110B, Palettes_8373894}, - {0x110D, Palettes_837389C}, - {0x110E, Palettes_83738A4}, - {0x1112, Palettes_83738AC}, - {0x1113, Palettes_83738B4}, - {0x1114, Palettes_83738BC}, - {0x1116, Palettes_83738CC}, - {0x1118, Palettes_83738D4}, - {0x1105, Palettes_83738DC}, - {0x111A, Palettes_83738C4}, - {0x11FF, NULL} -}; - -const u16 Unknown_837394C[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 Unknown_8373960[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 Unknown_8373974[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 Unknown_8373988[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 *const gUnknown_0837399C[] = { - Unknown_837394C, - Unknown_8373960, - Unknown_8373974, - Unknown_8373988 -}; - -#include "data/field_map_obj/berry_tree_graphics_tables.h" -#include "data/field_map_obj/field_effect_objects.h" - -const s16 gUnknown_0837520C[] = {0x20, 0x40, 0x60, 0x80}; -const s16 gUnknown_08375204[] = {0x20, 0x40, 0x80, 0xc0}; -const s16 gUnknown_0837521C[] = {0x20, 0x30, 0x40, 0x50}; - -#include "data/field_map_obj/callback_subroutine_pointers.h" - -const u8 gUnknown_083755F4[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; -const u8 gUnknown_083755FD[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; -const u8 gUnknown_08375606[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; -const u8 gUnknown_0837560F[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F, 0x0C, 0x0C, 0x0D, 0x0D}; -const u8 gUnknown_08375618[] = {0x10, 0x10, 0x11, 0x12, 0x13, 0x10, 0x10, 0x11, 0x11}; -const u8 gUnknown_08375621[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; -const u8 gUnknown_0837562A[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; -const u8 gUnknown_08375633[] = {0x18, 0x18, 0x19, 0x1A, 0x1B, 0x18, 0x18, 0x19, 0x19}; -const u8 gUnknown_0837563C[] = {0x1C, 0x1C, 0x1D, 0x1E, 0x1F, 0x1C, 0x1C, 0x1D, 0x1D}; -const u8 gUnknown_08375645[] = {0x20, 0x20, 0x21, 0x22, 0x23, 0x20, 0x20, 0x21, 0x21}; -const u8 gUnknown_0837564E[] = {0x24, 0x24, 0x25, 0x26, 0x27, 0x24, 0x24, 0x25, 0x25}; -const u8 gUnknown_08375657[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; -const u8 gUnknown_08375660[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; -const u8 gUnknown_08375669[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; -const u8 gUnknown_08375672[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; -const u8 gUnknown_0837567B[] = {0x08, 0x08, 0x07, 0x09, 0x0A, 0x08, 0x08, 0x07, 0x07}; - -bool8 (*const gUnknown_08375684[])(u8) = { - MetatileBehavior_IsSouthBlocked, - MetatileBehavior_IsNorthBlocked, - MetatileBehavior_IsWestBlocked, - MetatileBehavior_IsEastBlocked -}; - -bool8 (*const gUnknown_08375694[])(u8) = { - MetatileBehavior_IsNorthBlocked, - MetatileBehavior_IsSouthBlocked, - MetatileBehavior_IsEastBlocked, - MetatileBehavior_IsWestBlocked -}; - -const struct Coords16 gDirectionToVector[] = { - { 0, 0}, - { 0, 1}, - { 0, -1}, - {-1, 0}, - { 1, 0}, - {-1, 1}, - { 1, 1}, - {-1, -1}, - { 1, -1} -}; - -const u8 gUnknown_083756C8[] = {0x00, 0x00, 0x01, 0x02, 0x03}; -const u8 gUnknown_083756CD[] = {0x04, 0x04, 0x05, 0x06, 0x07}; -const u8 gUnknown_083756D2[] = {0x08, 0x08, 0x09, 0x0A, 0x0B}; -const u8 gUnknown_083756D7[] = {0x15, 0x15, 0x16, 0x17, 0x18}; -const u8 gUnknown_083756DC[] = {0x29, 0x29, 0x2A, 0x2B, 0x2C}; -const u8 gUnknown_083756E1[] = {0x2D, 0x2D, 0x2E, 0x2F, 0x30}; -const u8 gUnknown_083756E6[] = {0x31, 0x31, 0x32, 0x33, 0x34}; -const u8 gUnknown_083756EB[] = {0x35, 0x35, 0x36, 0x37, 0x38}; -const u8 gUnknown_083756F0[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F}; -const u8 gUnknown_083756F5[] = {0x46, 0x46, 0x47, 0x48, 0x49}; -const u8 gUnknown_083756FA[] = {0x4B, 0x4B, 0x4A, 0x4D, 0x4C}; -const u8 gUnknown_083756FF[] = {0x42, 0x42, 0x43, 0x44, 0x45}; -const u8 gUnknown_08375704[] = {0x3A, 0x3A, 0x3B, 0x3C, 0x3D}; -const u8 gUnknown_08375709[] = {0x19, 0x19, 0x1A, 0x1B, 0x1C}; -const u8 gUnknown_0837570E[] = {0x1D, 0x1D, 0x1E, 0x1F, 0x20}; -const u8 gUnknown_08375713[] = {0x21, 0x21, 0x22, 0x23, 0x24}; -const u8 gUnknown_08375718[] = {0x25, 0x25, 0x26, 0x27, 0x28}; -const u8 gUnknown_0837571D[] = {0x62, 0x62, 0x63, 0x64, 0x65}; -const u8 gUnknown_08375722[] = {0x66, 0x66, 0x67, 0x68, 0x69}; -const u8 gUnknown_08375727[] = {0x6A, 0x6A, 0x6B, 0x6C, 0x6D}; -const u8 gUnknown_0837572C[] = {0x6E, 0x6E, 0x6F, 0x70, 0x71}; -const u8 gUnknown_08375731[] = {0x72, 0x72, 0x73, 0x74, 0x75}; -const u8 gUnknown_08375736[] = {0x76, 0x76, 0x77, 0x78, 0x79}; -const u8 gUnknown_0837573B[] = {0x7A, 0x7A, 0x7B, 0x7C, 0x7D}; -const u8 gUnknown_08375740[] = {0x7E, 0x7E, 0x7F, 0x80, 0x81}; -const u8 gUnknown_08375745[] = {0x82, 0x82, 0x83, 0x84, 0x85}; -const u8 gUnknown_0837574A[] = {0x86, 0x86, 0x87, 0x88, 0x89}; - -const u8 gUnknown_0837574F[] = {2, 1, 4, 3, 8, 7, 6, 5}; - -const u8 gUnknown_08375757[][4] = { - {2, 1, 4, 3}, - {1, 2, 3, 4}, - {3, 4, 2, 1}, - {4, 3, 1, 2} -}; - -const u8 gUnknown_08375767[][4] = { - {2, 1, 4, 3}, - {1, 2, 3, 4}, - {4, 3, 1, 2}, - {3, 4, 2, 1} -}; - -#include "data/field_map_obj/anim_func_ptrs.h" - -// text - -extern void strange_npc_table_clear(void); -extern void ClearPlayerAvatarInfo(void); -extern void npc_load_two_palettes__no_record(u16, u8); -extern void npc_load_two_palettes__and_record(u16, u8); -extern void sub_8060388(s16, s16, s16 *, s16 *); -void sub_80634D0(struct MapObject *, struct Sprite *); -extern void pal_patch_for_npc(u16, u16); -extern void CameraObjectReset1(void); - -extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; -extern u8 gReservedSpritePaletteCount; -extern struct Camera gUnknown_0202E844; - -static u8 gUnknown_030005A4; -static u16 gUnknown_030005A6; - -struct MapObject gMapObjects[16]; - -void npc_clear_ids_and_state(struct MapObject *mapObj) -{ - memset(mapObj, 0, sizeof(struct MapObject)); - mapObj->localId = 0xFF; - mapObj->mapNum = 0xFF; - mapObj->mapGroup = 0xFF; - mapObj->mapobj_unk_1C = 0xFF; -} - -void npcs_clear_ids_and_state(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - npc_clear_ids_and_state(&gMapObjects[i]); -} - -void sub_805AA98(void) -{ - strange_npc_table_clear(); - npcs_clear_ids_and_state(); - ClearPlayerAvatarInfo(); - sub_805AAB0(); -} - -void sub_805AAB0(void) -{ - u8 spriteId; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); - - gSprites[spriteId].oam.affineMode = 1; - InitSpriteAffineAnim(&gSprites[spriteId]); - StartSpriteAffineAnim(&gSprites[spriteId], 0); - gSprites[spriteId].invisible = 1; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); - - gSprites[spriteId].oam.affineMode = 1; - InitSpriteAffineAnim(&gSprites[spriteId]); - StartSpriteAffineAnim(&gSprites[spriteId], 1); - gSprites[spriteId].invisible = 1; -} - -u8 sub_805AB54(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (!gMapObjects[i].active) - break; - } - return i; -} - -u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - if (localId <= 0xFE) - return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup); - else - return GetFieldObjectIdByLocalId(localId); -} - -bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 *mapObjectId) -{ - *mapObjectId = GetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup); - if (*mapObjectId == 16) - return TRUE; - else - return FALSE; -} - -u8 GetFieldObjectIdByXY(s16 x, s16 y) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) - break; - } - return i; -} - -u8 GetFieldObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup) - return i; - } - return 16; -} - -u8 GetFieldObjectIdByLocalId(u8 localId) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == localId) - return i; - } - return 16; -} - -#ifdef NONMATCHING -u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) -{ - struct MapObject2 *mapObj; //TODO: resolve the mapobj_unk_19b weirdness - u8 var; - u16 r3; - u16 r2; - - //asm("nop"::"r"(b)); - if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0) - return 16; - //_0805ACCE - mapObj = (struct MapObject2 *)&gMapObjects[var]; - npc_clear_ids_and_state((struct MapObject *)mapObj); - r3 = template->x + 7; - r2 = template->y + 7; - mapObj->active = TRUE; - mapObj->mapobj_bit_2 = TRUE; - mapObj->graphicsId = template->graphicsId; - mapObj->animPattern = template->movementType; - mapObj->localId = template->localId; - mapObj->mapNum = b; - mapObj->mapGroup = c; - mapObj->coords1.x = r3; - mapObj->coords1.y = r2; - mapObj->coords2.x = r3; - mapObj->coords2.y = r2; - mapObj->coords3.x = r3; - mapObj->coords3.y = r2; - mapObj->mapobj_unk_0B_0 = template->elevation; - mapObj->elevation = template->elevation; - mapObj->mapobj_unk_19 = template->unkA_0; - mapObj->mapobj_unk_19b = template->unkA_4; - mapObj->trainerType = template->unkC; - mapObj->trainerRange_berryTreeId = template->unkE; - mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType]; - FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20); - FieldObjectHandleDynamicGraphicsId(mapObj); - //asm("":::"r5","r6"); - if (gUnknown_0836DBBC[mapObj->animPattern] != 0) - { - if (mapObj->mapobj_unk_19 == 0) - mapObj->mapobj_unk_19++; - if (mapObj->mapobj_unk_19b == 0) - mapObj->mapobj_unk_19b++; - } - return var; -} -#else -__attribute__((naked)) -u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x4\n\ - adds r5, r0, 0\n\ - lsls r1, 24\n\ - lsrs r6, r1, 24\n\ - lsls r2, 24\n\ - lsrs r7, r2, 24\n\ - ldrb r0, [r5]\n\ - adds r1, r6, 0\n\ - adds r2, r7, 0\n\ - mov r3, sp\n\ - bl GetAvailableFieldObjectSlot\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0805ACCE\n\ - movs r0, 0x10\n\ - b _0805ADC2\n\ -_0805ACCE:\n\ - mov r0, sp\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 3\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0805ADD0 @ =gMapObjects\n\ - adds r4, r0, r1\n\ - adds r0, r4, 0\n\ - bl npc_clear_ids_and_state\n\ - ldrh r3, [r5, 0x4]\n\ - adds r3, 0x7\n\ - lsls r3, 16\n\ - lsrs r3, 16\n\ - ldrh r2, [r5, 0x6]\n\ - adds r2, 0x7\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - ldrb r0, [r4]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - movs r1, 0x4\n\ - orrs 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\ - movs r7, 0xF\n\ - adds r1, r7, 0\n\ - ands r1, r0\n\ - ldrb r2, [r4, 0xB]\n\ - movs r0, 0x10\n\ - negs r0, r0\n\ - mov r8, r0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0xB]\n\ - ldrb r1, [r5, 0x8]\n\ - lsls r1, 4\n\ - ands r0, r7\n\ - orrs r0, r1\n\ - strb r0, [r4, 0xB]\n\ - ldrb r1, [r5, 0xA]\n\ - lsls r1, 28\n\ - movs r0, 0xF\n\ - mov r9, r0\n\ - lsrs r1, 28\n\ - ldrb r2, [r4, 0x19]\n\ - mov r0, r8\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ - ldrb r1, [r5, 0xA]\n\ - lsrs r1, 4\n\ - lsls r1, 4\n\ - ands r0, r7\n\ - orrs 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, _0805ADD4 @ =gUnknown_0836DC09\n\ - ldrb r0, [r5, 0x9]\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - strb r1, [r0]\n\ - ldrb r1, [r0]\n\ - adds r0, r4, 0\n\ - bl FieldObjectSetDirection\n\ - adds r0, r4, 0\n\ - bl FieldObjectHandleDynamicGraphicsId\n\ - ldr r1, _0805ADD8 @ =gUnknown_0836DBBC\n\ - ldrb r0, [r4, 0x6]\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _0805ADBE\n\ - ldrb r2, [r4, 0x19]\n\ - adds r0, r7, 0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _0805ADA6\n\ - lsls r0, r2, 28\n\ - lsrs r0, 28\n\ - adds r0, 0x1\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r8\n\ - ands r1, r2\n\ - orrs r1, r0\n\ - strb r1, [r4, 0x19]\n\ -_0805ADA6:\n\ - ldrb r2, [r4, 0x19]\n\ - movs r0, 0xF0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _0805ADBE\n\ - lsrs r1, r2, 4\n\ - adds r1, 0x1\n\ - lsls r1, 4\n\ - adds r0, r7, 0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ -_0805ADBE:\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ -_0805ADC2:\n\ - add sp, 0x4\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_0805ADD0: .4byte gMapObjects\n\ -_0805ADD4: .4byte gUnknown_0836DC09\n\ -_0805ADD8: .4byte gUnknown_0836DBBC\n\ - .syntax divided\n"); -} -#endif - -u8 sub_805ADDC(u8 localId) -{ - u8 objectCount; - u8 i; - - if (gMapHeader.events == NULL) - return 16; - objectCount = gMapHeader.events->mapObjectCount; - for (i = 0; i < objectCount; i++) - { - struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; - - if (template->localId == localId && !FlagGet(template->flagId)) - return InitFieldObjectStateFromTemplate(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - } - return 16; -} - -u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d) -{ - u8 i = 0; - - for (i = 0; i < 16 && gMapObjects[i].active; i++) - { - if (gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) - return 1; - } - if (i >= 16) - return 1; - *d = i; - for (; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) - return 1; - } - return 0; -} - -void RemoveFieldObject(struct MapObject *mapObject) -{ - mapObject->active = FALSE; - RemoveFieldObjectInternal(mapObject); -} - -void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - return; - FlagSet(GetFieldObjectFlagIdByFieldObjectId(mapObjectId)); - RemoveFieldObject(&gMapObjects[mapObjectId]); -} - -void RemoveFieldObjectInternal(struct MapObject *mapObject) -{ - struct SpriteFrameImage image; - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - - image.size = gfxInfo->size; - gSprites[mapObject->spriteId].images = ℑ - DestroySprite(&gSprites[mapObject->spriteId]); -} - -void npc_hide_all_but_player(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (i != gPlayerAvatar.mapObjectId) - RemoveFieldObject(&gMapObjects[i]); - } -} - -u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) -{ - u8 mapObjectId; - u8 spriteId; - const struct MapObjectGraphicsInfo *gfxInfo; - struct MapObject *mapObject; - struct Sprite *sprite; - - mapObjectId = InitFieldObjectStateFromTemplate(mapObjTemplate, c, d); - if (mapObjectId == 16) - return 16; - - mapObject = &gMapObjects[mapObjectId]; - gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - if (gfxInfo->paletteSlot == 0) - npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - else if (gfxInfo->paletteSlot == 10) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (mapObject->animPattern == 0x4C) - mapObject->mapobj_bit_13 = TRUE; - -#ifdef NONMATCHING - sprTemplate->paletteTag = 0xFFFF; -#else - *(u16 *)&sprTemplate->paletteTag = 0xFFFF; -#endif - spriteId = CreateSprite(sprTemplate, 0, 0, 0); - if (spriteId == 64) - { - gMapObjects[mapObjectId].active = FALSE; - return 16; - } - sprite = &gSprites[spriteId]; - sub_8060388(e + mapObject->coords2.x, f + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data0 = mapObjectId; - mapObject->spriteId = spriteId; - mapObject->mapobj_bit_12 = gfxInfo->inanimate; - if (!mapObject->mapobj_bit_12) - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); - sub_80634D0(mapObject, sprite); - return mapObjectId; -} - -u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e) -{ - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables = NULL; - struct SpriteFrameImage spriteFrameImage; - const struct MapObjectGraphicsInfo *gfxInfo; - u8 mapObjectId; - - gfxInfo = GetFieldObjectGraphicsInfo(mapObjTemplate->graphicsId); - MakeObjectTemplateFromFieldObjectTemplate(mapObjTemplate, &spriteTemplate, &subspriteTables); - spriteFrameImage.size = gfxInfo->size; - spriteTemplate.images = &spriteFrameImage; - mapObjectId = sub_805AFCC(mapObjTemplate, &spriteTemplate, b, c, d, e); - if (mapObjectId == 16) - return 16; - gSprites[gMapObjects[mapObjectId].spriteId].images = gfxInfo->images; - if (subspriteTables != NULL) - SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTables); - return mapObjectId; -} - -u8 SpawnSpecialFieldObject(struct MapObjectTemplate *mapObjTemplate) -{ - s16 x; - s16 y; - - GetFieldObjectMovingCameraOffset(&x, &y); - return SpawnFieldObject(mapObjTemplate, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); -} - -u8 SpawnSpecialFieldObjectParametrized(u8 a, u8 b, u8 c, s16 d, s16 e, u8 f) -{ - struct MapObjectTemplate mapObjTemplate; - - d -= 7; - e -= 7; - mapObjTemplate.localId = c; - mapObjTemplate.graphicsId = a; - mapObjTemplate.unk2 = 0; - mapObjTemplate.x = d; - mapObjTemplate.y = e; - mapObjTemplate.elevation = f; - mapObjTemplate.movementType = b; - mapObjTemplate.unkA_0 = 0; - mapObjTemplate.unkA_4 = 0; - mapObjTemplate.unkC = 0; - mapObjTemplate.unkE = 0; - return SpawnSpecialFieldObject(&mapObjTemplate); -} - -u8 show_sprite(u8 a, u8 b, u8 c) -{ - struct MapObjectTemplate *r5; - s16 x; - s16 y; - - r5 = GetFieldObjectTemplateByLocalIdAndMap(a, b, c); - if (r5 == NULL) - return 16; - GetFieldObjectMovingCameraOffset(&x, &y); - return SpawnFieldObject(r5, b, c, x, y); -} - -void MakeObjectTemplateFromFieldObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); - - sprTemplate->tileTag = gfxInfo->tileTag; - sprTemplate->paletteTag = gfxInfo->paletteTag1; - sprTemplate->oam = gfxInfo->oam; - sprTemplate->anims = gfxInfo->anims; - sprTemplate->images = gfxInfo->images; - sprTemplate->affineAnims = gfxInfo->affineAnims; - sprTemplate->callback = callback; - *subspriteTables = gfxInfo->subspriteTables; -} - -void MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, gUnknown_0836DA88[callbackIndex], sprTemplate, subspriteTables); -} - -void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables); -} - -u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c, s16 d, u8 subpriority) -{ - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables; - u8 spriteId; - - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables); - if (spriteTemplate.paletteTag != 0xFFFF) - sub_805BDF8(spriteTemplate.paletteTag); - spriteId = CreateSprite(&spriteTemplate, c, d, subpriority); - if (spriteId != 64 && subspriteTables != NULL) - { - SetSubspriteTables(&gSprites[spriteId], subspriteTables); - gSprites[spriteId].subspriteMode = 2; - } - return spriteId; -} - -extern void sub_8064970(struct Sprite *); -extern void sub_8060470(s16 *, s16 *, s16, s16); -extern void InitObjectPriorityByZCoord(); - -u8 sub_805B410(u8 a, u8 b, s16 c, s16 d, u8 e, u8 f) -{ - const struct MapObjectGraphicsInfo *gfxInfo; - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables; - u8 spriteId; - - gfxInfo = GetFieldObjectGraphicsInfo(a); - MakeObjectTemplateFromFieldObjectGraphicsInfo(a, sub_8064970, &spriteTemplate, &subspriteTables); -#ifdef NONMATCHING - spriteTemplate.paletteTag = 0xFFFF; -#else - *(u16 *)&spriteTemplate.paletteTag = 0xFFFF; -#endif - c += 7; - d += 7; - sub_8060470(&c, &d, 8, 16); - spriteId = CreateSpriteAtEnd(&spriteTemplate, c, d, 0); - if (spriteId != 64) - { - struct Sprite *sprite = &gSprites[spriteId]; - - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.y += sprite->centerToCornerVecY; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data0 = b; - sprite->data1 = e; - if (gfxInfo->paletteSlot == 10) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (subspriteTables != NULL) - { - SetSubspriteTables(sprite, subspriteTables); - sprite->subspriteMode = 2; - } - InitObjectPriorityByZCoord(sprite, e); - SetObjectSubpriorityByZCoord(e, sprite, 1); - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(f)); - } - return spriteId; -} - -void sub_805B55C(s16 a, s16 b) -{ - u8 i; - - if (gMapHeader.events != NULL) - { - s16 r9 = gSaveBlock1.pos.x - 2; - s16 sp8 = gSaveBlock1.pos.x + 17; - s16 r10 = gSaveBlock1.pos.y; - s16 spC = gSaveBlock1.pos.y + 16; - u8 objectCount = gMapHeader.events->mapObjectCount; - - for (i = 0; i < objectCount; i++) - { - struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; - s16 foo = template->x + 7; - s16 bar = template->y + 7; - - if (r10 <= bar && spC >= bar && r9 <= foo && sp8 >= foo - && !FlagGet(template->flagId)) - SpawnFieldObject(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, a, b); - } - } -} - -void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject); - -void RemoveFieldObjectsOutsideView(void) -{ - u8 i; - u8 j; - - for (i = 0; i < 16; i++) - { - bool8 isActiveLinkPlayer; - - for (j = 0, isActiveLinkPlayer = 0; j < 4; j++) - { - if (gLinkPlayerMapObjects[j].active && i == gLinkPlayerMapObjects[j].mapObjId) - isActiveLinkPlayer = TRUE; - } - if (!isActiveLinkPlayer) - { - struct MapObject *mapObject = &gMapObjects[i]; - - if (mapObject->active && !mapObject->mapobj_bit_16) - RemoveFieldObjectIfOutsideView(mapObject); - } - } -} - -void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) -{ - s16 r7 = gSaveBlock1.pos.x - 2; - s16 r5 = gSaveBlock1.pos.x + 17; - s16 r4 = gSaveBlock1.pos.y; - s16 r6 = gSaveBlock1.pos.y + 16; - - if (mapObject->coords2.x >= r7 && mapObject->coords2.x <= r5 - && mapObject->coords2.y >= r4 && mapObject->coords2.y <= r6) - return; - if (mapObject->coords1.x >= r7 && mapObject->coords1.x <= r5 - && mapObject->coords1.y >= r4 && mapObject->coords1.y <= r6) - return; - RemoveFieldObject(mapObject); -} - -void sub_805B75C(u8, s16, s16); - -void sub_805B710(u16 a, u16 b) -{ - u8 i; - - ClearPlayerAvatarInfo(); - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active) - sub_805B75C(i, a, b); - } - sub_805AAB0(); -} - -extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); -extern void sub_805B914(struct MapObject *); - -void sub_805B75C(u8 a, s16 b, s16 c) -{ - struct SpriteTemplate sp0; - struct SpriteFrameImage sp18; - const struct SubspriteTable *subspriteTables; - const struct MapObjectGraphicsInfo *gfxInfo; - struct MapObject *mapObject; - u8 spriteId; - - #define i spriteId - for (i = 0; i < 4; i++) - { - if (gLinkPlayerMapObjects[i].active && a == gLinkPlayerMapObjects[i].mapObjId) - return; - } - #undef i - - mapObject = &gMapObjects[a]; - asm("":::"r5"); - subspriteTables = NULL; - gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - sp18.size = gfxInfo->size; - MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObject->graphicsId, mapObject->animPattern, &sp0, &subspriteTables); - sp0.images = &sp18; - *(u16 *)&sp0.paletteTag = 0xFFFF; - if (gfxInfo->paletteSlot == 0) - npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (gfxInfo->paletteSlot > 9) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - *(u16 *)&sp0.paletteTag = 0xFFFF; - spriteId = CreateSprite(&sp0, 0, 0, 0); - if (spriteId != 64) - { - struct Sprite *sprite = &gSprites[spriteId]; - - sub_8060388(b + mapObject->coords2.x, c + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sprite->images = gfxInfo->images; - if (mapObject->animPattern == 11) - { - SetPlayerAvatarFieldObjectIdAndObjectId(a, spriteId); - mapObject->mapobj_unk_1B = sub_8126B54(); - } - if (subspriteTables != NULL) - SetSubspriteTables(sprite, subspriteTables); - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data0 = a; - mapObject->spriteId = spriteId; - if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 11) - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - sub_805B914(mapObject); - SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); - } -} - -void sub_805B914(struct MapObject *mapObject) -{ - mapObject->mapobj_bit_1 = FALSE; - mapObject->mapobj_bit_2 = TRUE; - mapObject->mapobj_bit_22 = FALSE; - mapObject->mapobj_bit_17 = FALSE; - mapObject->mapobj_bit_18 = FALSE; - mapObject->mapobj_bit_19 = FALSE; - mapObject->mapobj_bit_20 = FALSE; - mapObject->mapobj_bit_21 = FALSE; - FieldObjectClearAnim(mapObject); -} - -void SetPlayerAvatarFieldObjectIdAndObjectId(u8 mapObjectId, u8 spriteId) -{ - gPlayerAvatar.mapObjectId = mapObjectId; - gPlayerAvatar.spriteId = spriteId; - gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gMapObjects[mapObjectId].graphicsId); - SetPlayerAvatarExtraStateTransition(gMapObjects[mapObjectId].graphicsId, 0x20); -} - -void sub_805B980(struct MapObject *mapObject, u8 graphicsId) -{ - const struct MapObjectGraphicsInfo *gfxInfo; - struct Sprite *sprite; - - gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); - sprite = &gSprites[mapObject->spriteId]; - if (gfxInfo->paletteSlot == 0) - pal_patch_for_npc(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (gfxInfo->paletteSlot == 10) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - sprite->oam.shape = gfxInfo->oam->shape; - sprite->oam.size = gfxInfo->oam->size; - sprite->images = gfxInfo->images; - sprite->anims = gfxInfo->anims; - sprite->subspriteTables = gfxInfo->subspriteTables; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - mapObject->mapobj_bit_12 = gfxInfo->inanimate; - mapObject->graphicsId = graphicsId; - sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - if (mapObject->mapobj_bit_15) - CameraObjectReset1(); -} - -void unref_sub_805BA80(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - sub_805B980(&gMapObjects[mapObjectId], graphicsId); -} - -void FieldObjectTurn(struct MapObject *mapObject, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - if (!mapObject->mapobj_bit_12) - { - StartSpriteAnim(&gSprites[mapObject->spriteId], FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - SeekSpriteAnim(&gSprites[mapObject->spriteId], 0); - } -} - -void FieldObjectTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - FieldObjectTurn(&gMapObjects[mapObjectId], direction); -} - -void unref_TurnPlayer(struct PlayerAvatar *player, u8 direction) -{ - FieldObjectTurn(&gMapObjects[player->mapObjectId], direction); -} - -void get_berry_tree_graphics(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 treeStage; - u8 treeId; - - mapObject->mapobj_bit_13 = TRUE; - sprite->invisible = TRUE; - treeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); - if (treeStage != 0) - { - mapObject->mapobj_bit_13 = FALSE; - sprite->invisible = FALSE; - treeId = GetBerryTypeByBerryTreeId(mapObject->trainerRange_berryTreeId) - 1; - treeStage--; - if (treeId > 0x2B) - treeId = 0; - sub_805B980(mapObject, gBerryTreeGraphicsIdTablePointers[treeId][treeStage]); - sprite->images = gBerryTreePicTablePointers[treeId]; - sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[treeId][treeStage]; - StartSpriteAnim(sprite, treeStage); - } -} - -const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8 graphicsId) -{ - if (graphicsId > 0xEF) - graphicsId = VarGetFieldObjectGraphicsId(graphicsId + 16); - if (graphicsId > 0xD9) - graphicsId = 5; - return gMapObjectGraphicsInfoPointers[graphicsId]; -} - -void FieldObjectHandleDynamicGraphicsId(struct MapObject *mapObject) -{ - if (mapObject->graphicsId > 0xEF) - mapObject->graphicsId = VarGetFieldObjectGraphicsId(mapObject->graphicsId + 16); -} - -void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 d) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - gMapObjects[mapObjectId].mapobj_bit_13 = d; -} - -void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, u8 *localId, u8 *mapNum, u8 *mapGroup) -{ - *localId = mapObject->localId; - *mapNum = mapObject->mapNum; - *mapGroup = mapObject->mapGroup; -} - -void sub_805BCC0(s16 x, s16 y) -{ - u8 mapObjectId; - struct MapObject *mapObject; - - mapObjectId = GetFieldObjectIdByXY(x, y); - if (mapObjectId != 16) - { - mapObject = &gMapObjects[mapObjectId]; - mapObject->mapobj_bit_2 = TRUE; - } -} - -void sub_805BCF0(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) -{ - u8 mapObjectId; - struct MapObject *mapObject; - struct Sprite *sprite; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - mapObject = &gMapObjects[mapObjectId]; - sprite = &gSprites[mapObject->spriteId]; - mapObject->mapobj_bit_26 = TRUE; - sprite->subpriority = subpriority; - } -} - -void sub_805BD48(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - struct MapObject *mapObject; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - mapObject = &gMapObjects[mapObjectId]; - mapObject->mapobj_bit_26 = FALSE; - mapObject->mapobj_bit_2 = TRUE; - } -} - -void sub_805BD90(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - u8 mapObjectId; - struct Sprite *sprite; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - sprite = &gSprites[gMapObjects[mapObjectId].spriteId]; - sprite->pos2.x = x; - sprite->pos2.y = y; - } -} - -void gpu_pal_allocator_reset__manage_upper_four(void) -{ - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 12; -} - -void sub_805BDF8(u16 tag) -{ - u16 paletteIndex = FindFieldObjectPaletteIndexByTag(tag); - - if (paletteIndex != 0x11FF) //always happens. FindFieldObjectPaletteIndexByTag returns u8 - sub_805BE58(&gUnknown_0837377C[paletteIndex]); -} - -void unref_sub_805BE24(u16 *arr) -{ - u8 i; - - for (i = 0; arr[i] != 0x11FF; i++) - sub_805BDF8(arr[i]); -} - -u8 sub_805BE58(const struct SpritePalette *palette) -{ - if (IndexOfSpritePaletteTag(palette->tag) != 0xFF) - return 0xFF; - else - return LoadSpritePalette(palette); -} - -void pal_patch_for_npc(u16 a, u16 b) -{ - u8 var = b; - u8 paletteIndex = FindFieldObjectPaletteIndexByTag(a); - - LoadPalette(gUnknown_0837377C[paletteIndex].data, var * 16 + 0x100, 0x20); -} - -void pal_patch_for_npc_range(const u16 *arr, u8 b, u8 c) -{ - for (; b < c; arr++, b++) - pal_patch_for_npc(*arr, b); -} - -u8 FindFieldObjectPaletteIndexByTag(u16 tag) -{ - u8 i; - - for (i = 0; gUnknown_0837377C[i].tag != 0x11FF; i++) - { - if (gUnknown_0837377C[i].tag == tag) - return i; - } - return 0xFF; -} - -void npc_load_two_palettes__no_record(u16 a, u8 b) -{ - u8 i; - - pal_patch_for_npc(a, b); - for (i = 0; gUnknown_08373874[i].tag != 0x11FF; i++) - { - if (gUnknown_08373874[i].tag == a) - { - pal_patch_for_npc(gUnknown_08373874[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); - break; - } - } -} - -void npc_load_two_palettes__and_record(u16 a, u8 b) -{ - u8 i; - - gUnknown_030005A6 = a; - pal_patch_for_npc(a, b); - for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) - { - if (gUnknown_083738E4[i].tag == a) - { - pal_patch_for_npc(gUnknown_083738E4[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); - break; - } - } -} - -void unref_sub_805C014(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = mapObject->coords2.x; - mapObject->coords3.y = mapObject->coords2.y; - mapObject->coords2.x += x; - mapObject->coords2.y += y; -} - -void npc_coords_shift(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = mapObject->coords2.x; - mapObject->coords3.y = mapObject->coords2.y; - mapObject->coords2.x = x; - mapObject->coords2.y = y; -} - -void npc_coords_set(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = x; - mapObject->coords3.y = y; - mapObject->coords2.x = x; - mapObject->coords2.y = y; -} - -void sub_805C058(struct MapObject *mapObject, s16 x, s16 y) -{ - struct Sprite *sprite = &gSprites[mapObject->spriteId]; - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - - npc_coords_set(mapObject, x, y); - sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sub_805B914(mapObject); - if (mapObject->mapobj_bit_15) - CameraObjectReset1(); -} - -void sub_805C0F8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - x += 7; - y += 7; - sub_805C058(&gMapObjects[mapObjectId], x, y); - } -} - -void npc_coords_shift_still(struct MapObject *mapObject) -{ - npc_coords_shift(mapObject, mapObject->coords2.x, mapObject->coords2.y); -} - -void UpdateFieldObjectCoordsForCameraUpdate(void) -{ - u8 i; - s16 deltaX; - s16 deltaY; - -#ifndef NONMATCHING - asm(""::"r"(i)); //makes the compiler store i in r3 -#endif - - if (gUnknown_0202E844.field_0) - { - for (i = 0, deltaX = gUnknown_0202E844.x, deltaY = gUnknown_0202E844.y; i < 16; i++) - { - struct MapObject *mapObject = &gMapObjects[i]; - - if (mapObject->active) - { - mapObject->coords1.x -= deltaX; - mapObject->coords1.y -= deltaY; - mapObject->coords2.x -= deltaX; - mapObject->coords2.y -= deltaY; - mapObject->coords3.x -= deltaX; - mapObject->coords3.y -= deltaY; - } - } - } -} - -bool8 FieldObjectDoesZCoordMatch(struct MapObject *, u8); - -u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y - && FieldObjectDoesZCoordMatch(&gMapObjects[i], z)) - return i; - } - return 16; -} - -bool8 FieldObjectDoesZCoordMatch(struct MapObject *mapObject, u8 z) -{ - if (mapObject->mapobj_unk_0B_0 != 0 && z != 0 - && mapObject->mapobj_unk_0B_0 != z) - return FALSE; - else - return TRUE; -} - -void UpdateFieldObjectsForCameraUpdate(s16 x, s16 y) -{ - UpdateFieldObjectCoordsForCameraUpdate(); - sub_805B55C(x, y); - RemoveFieldObjectsOutsideView(); -} - -u8 AddCameraObject(u8 a) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_830FD24, 0, 0, 4); - - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data0 = a; - return spriteId; -} - -void ObjectCB_CameraObject(struct Sprite *sprite) -{ - void (*cameraObjectFuncs[3])(struct Sprite *); - memcpy(cameraObjectFuncs, gCameraObjectFuncs, sizeof gCameraObjectFuncs); - cameraObjectFuncs[sprite->data1](sprite); -} - -void CameraObject_0(struct Sprite *sprite) -{ - sprite->pos1.x = gSprites[sprite->data0].pos1.x; - sprite->pos1.y = gSprites[sprite->data0].pos1.y; - sprite->invisible = TRUE; - sprite->data1 = 1; - CameraObject_1(sprite); -} - -void CameraObject_1(struct Sprite *sprite) -{ - s16 x = gSprites[sprite->data0].pos1.x; - s16 y = gSprites[sprite->data0].pos1.y; - - sprite->data2 = x - sprite->pos1.x; - sprite->data3 = y - sprite->pos1.y; - sprite->pos1.x = x; - sprite->pos1.y = y; -} - -void CameraObject_2(struct Sprite *sprite) -{ - sprite->pos1.x = gSprites[sprite->data0].pos1.x; - sprite->pos1.y = gSprites[sprite->data0].pos1.y; - sprite->data2 = 0; - sprite->data3 = 0; -} - -struct Sprite *FindCameraObject(void) -{ - u8 i; - - for (i = 0; i < 64; i++) - { - if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject) - return &gSprites[i]; - } - return NULL; -} - -void CameraObjectReset1(void) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - if (cameraSprite != NULL) - { - cameraSprite->data1 = 0; - cameraSprite->callback(cameraSprite); - } -} - -void CameraObjectSetFollowedObjectId(u8 spriteId) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - if (cameraSprite != NULL) - { - cameraSprite->data0 = spriteId; - CameraObjectReset1(); - } -} - -u8 CameraObjectGetFollowedObjectId(void) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - if (cameraSprite == NULL) - return 64; - else - return cameraSprite->data0; -} - -void CameraObjectReset2(void) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - cameraSprite->data1 = 2; -} - -u8 unref_sub_805C43C(struct Sprite *src, s16 x, s16 y, u8 subpriority) -{ - u8 i; - - for (i = 0; i < 64; i++) - { - if (!gSprites[i].inUse) - { - gSprites[i] = *src; - gSprites[i].pos1.x = x; - gSprites[i].pos1.y = y; - gSprites[i].subpriority = subpriority; - break; - } - } - return i; -} - -u8 obj_unfreeze(struct Sprite *src, s16 x, s16 y, u8 subpriority) -{ - s16 i; - - for (i = 63; i > -1; i--) - { - if (!gSprites[i].inUse) - { - gSprites[i] = *src; - gSprites[i].pos1.x = x; - gSprites[i].pos1.y = y; - gSprites[i].subpriority = subpriority; - return i; - } - } - return 64; -} - -void FieldObjectSetDirection(struct MapObject *mapObject, u8 direction) -{ - mapObject->mapobj_unk_20 = mapObject->mapobj_unk_18; - if (!mapObject->mapobj_bit_9) - { - s8 _direction = direction; //needed for the asm to match - mapObject->mapobj_unk_18 = _direction; - } - mapObject->placeholder18 = direction; -} - -u8 *GetFieldObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); - - return template->script; -} - -u8 *GetFieldObjectScriptPointerByFieldObjectId(u8 mapObjectId) -{ - return GetFieldObjectScriptPointerByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); -} - -u16 GetFieldObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); - - return template->flagId; -} - -u16 GetFieldObjectFlagIdByFieldObjectId(u8 mapObjectId) -{ - return GetFieldObjectFlagIdByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); -} - -u8 unref_sub_805C5D0(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - return 0xFF; - else - return gMapObjects[mapObjectId].trainerType; -} - -u8 unref_sub_805C60C(u8 mapObjectId) -{ - return gMapObjects[mapObjectId].trainerType; -} - -u8 unref_sub_805C624(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - return 0xFF; - else - return gMapObjects[mapObjectId].trainerRange_berryTreeId; -} - -u8 FieldObjectGetBerryTreeId(u8 mapObjectId) -{ - return gMapObjects[mapObjectId].trainerRange_berryTreeId; -} - -struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8, struct MapObjectTemplate *, u8); - -struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - if (gSaveBlock1.location.mapNum == mapNum && gSaveBlock1.location.mapGroup == mapGroup) - return FindFieldObjectTemplateInArrayByLocalId(localId, gSaveBlock1.mapObjectTemplates, gMapHeader.events->mapObjectCount); - else - { - struct MapHeader *mapHeader = get_mapheader_by_bank_and_number(mapGroup, mapNum); - - return FindFieldObjectTemplateInArrayByLocalId(localId, mapHeader->events->mapObjects, mapHeader->events->mapObjectCount); - } -} - -struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8 localId, struct MapObjectTemplate *templates, u8 count) -{ - u8 i; - - for (i = 0; i < count; i++) - { - if (templates[i].localId == localId) - return &templates[i]; - } - return NULL; -} - -struct MapObjectTemplate *sub_805C700(struct MapObject *mapObject) -{ - s32 i; - - if (mapObject->mapNum != gSaveBlock1.location.mapNum - || mapObject->mapGroup != gSaveBlock1.location.mapGroup) - return NULL; - - for (i = 0; i < 64; i++) - { - if (mapObject->localId == gSaveBlock1.mapObjectTemplates[i].localId) - return &gSaveBlock1.mapObjectTemplates[i]; - } - return NULL; -} - -void sub_805C754(struct MapObject *mapObject) -{ - struct MapObjectTemplate *template = sub_805C700(mapObject); - - if (template != NULL) - { - template->x = mapObject->coords2.x - 7; - template->y = mapObject->coords2.y - 7; - } -} - -void sub_805C774(struct MapObject *mapObject, u8 movementType) -{ - struct MapObjectTemplate *template = sub_805C700(mapObject); - - if (template != NULL) - template->movementType = movementType; -} - -void sub_805C78C(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - sub_805C754(&gMapObjects[mapObjectId]); -} - -void sub_805C7C4(u8 a) -{ - gpu_pal_allocator_reset__manage_upper_four(); - gUnknown_030005A6 = 0x11FF; - gUnknown_030005A4 = a; - pal_patch_for_npc_range(gUnknown_0837399C[gUnknown_030005A4], 0, 10); -} - -u16 npc_paltag_by_palslot(u8 a) -{ - u8 i; - - if (a < 10) - return gUnknown_0837399C[gUnknown_030005A4][a]; - - for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) - { - if (gUnknown_083738E4[i].tag == gUnknown_030005A6) - { - return gUnknown_083738E4[i].data[gUnknown_030005A4]; - } - } - return 0x11FF; -} - -fieldmap_object_null_cb(sub_805C884, sub_805C8A8); -fieldmap_object_cb(sub_805C8AC, sub_805C8D0, gUnknown_08375224); - -u8 sub_805C8F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -extern void FieldObjectSetRegularAnim(struct MapObject *, struct Sprite *, u8); - -u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -extern u8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *); -extern void sub_8064820(struct Sprite *, s16); - -u8 sub_805C930(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) - { - return 0; - } - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - sprite->data1 = 3; - return 1; -} - -extern u8 sub_8064824(struct Sprite *); - -u8 sub_805C96C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) != 0) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -extern u8 sub_805FF20(struct MapObject *, u8); - -u8 sub_805C98C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375240, 4); - direction = directions[Random() & 3]; - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 5; - if (sub_805FF20(mapObject, direction) != 0) - { - sprite->data1 = 1; - } - return 1; -} - -u8 sub_805C9D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = 1; - sprite->data1 = 6; - return 1; -} - -u8 sub_805CA08(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 1; - } - return 0; -} - -u8 FieldObjectIsTrainerAndCloseToPlayer(struct MapObject *mapObject) -{ - s16 x; - s16 y; - s16 objx; - s16 objy; - s16 minx; - s16 maxx; - s16 miny; - s16 maxy; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH) == 0) - { - return 0; - } - if (mapObject->trainerType != 1 && mapObject->trainerType != 3) - { - return 0; - } - PlayerGetDestCoords(&x, &y); - objx = mapObject->coords2.x; - objy = mapObject->coords2.y; - minx = objx - mapObject->trainerRange_berryTreeId; - miny = objy - mapObject->trainerRange_berryTreeId; - maxx = objx + mapObject->trainerRange_berryTreeId; - maxy = objy + mapObject->trainerRange_berryTreeId; - if (minx > x || maxx < x || miny > y || maxy < y) - { - return 0; - } - return 1; -} - -u8 sub_805CAAC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - if (a2 > a3) - { - dirn = DIR_EAST; - if (a0 < 0) - { - dirn = DIR_WEST; - } - } - else - { - dirn = DIR_SOUTH; - if (a1 < 0) - { - dirn = DIR_NORTH; - } - } - return dirn; -} - -u8 sub_805CADC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = DIR_SOUTH; - if (a1 < 0) - { - dirn = DIR_NORTH; - } - return dirn; -} - -u8 sub_805CAEC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = DIR_EAST; - if (a0 < 0) - { - dirn = DIR_WEST; - } - return dirn; -} - -u8 sub_805CB00(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_EAST) - { - dirn = DIR_NORTH; - } - } - else if (dirn == DIR_EAST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = DIR_NORTH; - } - } - return dirn; -} - -u8 sub_805CB5C(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_WEST) - { - dirn = DIR_NORTH; - } - } - else if (dirn == DIR_WEST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = DIR_NORTH; - } - } - return dirn; -} - -u8 sub_805CBB8(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_EAST) - { - dirn = DIR_SOUTH; - } - } - else if (dirn == DIR_EAST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = DIR_SOUTH; - } - } - return dirn; -} - -u8 sub_805CC14(s16 a0, s16 a1, s16 a2, s16 a3) { - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_WEST) - { - dirn = DIR_SOUTH; - } - } - else if (dirn == DIR_WEST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = DIR_SOUTH; - } - } - return dirn; -} - -u8 sub_805CC70(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_EAST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CCAC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_WEST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CCE8(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CD24(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CD60(struct MapObject *mapObject, u8 a1) -{ - s16 x; - s16 y; - s16 x2; - s16 y2; - if (!FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - return 0; - } - PlayerGetDestCoords(&x, &y); - x -= mapObject->coords2.x; - y -= mapObject->coords2.y; - x2 = x; - y2 = y; - if (x2 < 0) - { - x2 = -x2; - } - if (y2 < 0) - { - y2 = -y2; - } - return gUnknown_08375244[a1](x, y, x2, y2); -} - -fieldmap_object_cb(sub_805CDE8, sub_805CE0c, gUnknown_08375270); - -u8 sub_805CE2C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805CE40(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805CE6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805CEB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805CEE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375240, 4); - direction = sub_805CD60(mapObject, 0); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805CF28, sub_805CF4C, gUnknown_08375284); - -u8 sub_805CF6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805CF80(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805CFAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) - { - return 0; - } - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - sprite->data1 = 3; - return 1; -} - -u8 sub_805CFE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) != 0) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805D008(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752A0, 2); - direction = directions[Random() & 1]; - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 5; - if (sub_805FF20(mapObject, direction) != 0) - { - sprite->data1 = 1; - } - return 1; -} - -u8 sub_805D054(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = 1; - sprite->data1 = 6; - return 1; -} - -u8 sub_805D084(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 1; - } - return 0; -} - -fieldmap_object_cb(sub_805D0AC, sub_805D0D0, gUnknown_083752A4); - -u8 sub_805D0F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805D104(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805D130(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) - { - return 0; - } - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - sprite->data1 = 3; - return 1; -} - -u8 sub_805D16C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) != 0) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805D18C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752C0, 2); - direction = directions[Random() & 1]; - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 5; - if (sub_805FF20(mapObject, direction) != 0) - { - sprite->data1 = 1; - } - return 1; -} - -u8 sub_805D1D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = 1; - sprite->data1 = 6; - return 1; -} - -u8 sub_805D208(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 1; - } - return 0; -} - -fieldmap_object_cb(sub_805D230, sub_805D254, gUnknown_083752C4); - -u8 sub_805D274(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; - return 1; -} - -u8 sub_805D2A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - sprite->data1 = 2; - return 1; - } - return 0; -} - -u8 sub_805D2C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 0; - return 0; -} - -u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite); - -void FieldObjectCB_BerryTree(struct Sprite *sprite) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data0]; - if (!(sprite->data7 & 1)) - { - get_berry_tree_graphics(mapObject, sprite); - sprite->data7 |= 1; - } - meta_step(mapObject, sprite, sub_805D314); -} - -u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite) -{ - return gUnknown_083752D0[sprite->data1](mapObject, sprite); -} - -u8 do_berry_tree_growth_sparkle_1(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 berryTreeStage; - npc_reset(mapObject, sprite); - mapObject->mapobj_bit_13 = 1; - sprite->invisible = 1; - berryTreeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); - if (!berryTreeStage) - { - if (!(sprite->data7 & 4) && sprite->animNum == 4) - { - gUnknown_0202FF84[0] = mapObject->coords2.x; - gUnknown_0202FF84[1] = mapObject->coords2.y; - gUnknown_0202FF84[2] = sprite->subpriority - 1; - gUnknown_0202FF84[3] = sprite->oam.priority; - FieldEffectStart(0x17); - sprite->animNum = 0; - } - return 0; - } - mapObject->mapobj_bit_13 = 0; - sprite->invisible = 0; - berryTreeStage--; - if (sprite->animNum != berryTreeStage) - { - sprite->data1 = 2; - return 1; - } - get_berry_tree_graphics(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, 0x39); - sprite->data1 = 1; - return 1; -} - -u8 sub_805D3EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data1 = 0; - return 1; - } - return 0; -} - -u8 do_berry_tree_growth_sparkle_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 1; - sprite->data1 = 3; - sprite->data2 = 0; - sprite->data7 |= 2; - gUnknown_0202FF84[0] = mapObject->coords2.x; - gUnknown_0202FF84[1] = mapObject->coords2.y; - gUnknown_0202FF84[2] = sprite->subpriority - 1; - gUnknown_0202FF84[3] = sprite->oam.priority; - FieldEffectStart(0x17); - return 1; -} - -u8 sub_805D458(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data2++; - mapObject->mapobj_bit_13 = ((sprite->data2 & 0x2) >> 1); - sprite->animPaused = 1; - if (sprite->data2 > 64) - { - get_berry_tree_graphics(mapObject, sprite); - sprite->data1 = 4; - sprite->data2 = 0; - return 1; - } - return 0; -} - -u8 sub_805D4A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data2++; - mapObject->mapobj_bit_13 = ((sprite->data2 & 0x2) >> 1); - sprite->animPaused = 1; - if (sprite->data2 > 64) - { - sprite->data1 = 0; - sprite->data7 &= (-3); - return 1; - } - return 0; -} - -fieldmap_object_cb(sub_805D4F4, sub_805D518, gUnknown_083752E4); - -u8 sub_805D538(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805D54C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805D578(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805D5BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805D5EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752A0, 2); - direction = sub_805CD60(mapObject, 1); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805D634, sub_805D658, gUnknown_083752F8); - -u8 sub_805D678(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805D68C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805D6B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805D6FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805D72C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752C0, 2); - direction = sub_805CD60(mapObject, 2); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805D774, sub_805D798, gUnknown_0837530C); - -u8 sub_805D7B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805D7CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805D7F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805D83C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805D86C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375320, 2); - direction = sub_805CD60(mapObject, 3); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805D8B4, sub_805D8D8, gUnknown_08375324); - -u8 sub_805D8F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805D90C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805D938(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805D97C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805D9AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375338, 2); - direction = sub_805CD60(mapObject, 4); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805D9F4, sub_805DA18, gUnknown_0837533C); - -u8 sub_805DA38(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805DA4C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805DA78(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805DABC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805DAEC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375350, 2); - direction = sub_805CD60(mapObject, 5); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805DB34, sub_805DB58, gUnknown_08375354); - -u8 sub_805DB78(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805DB8C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805DBB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805DBFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805DC2C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375368, 2); - direction = sub_805CD60(mapObject, 6); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805DC74, sub_805DC98, gUnknown_0837536C); - -u8 sub_805DCB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805DCCC(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805DCF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805DD3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805DD6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375380, 4); - direction = sub_805CD60(mapObject, 7); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805DDB4, sub_805DDD8, gUnknown_08375384); - -u8 sub_805DDF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805DE0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805DE38(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805DE7C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805DEAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375398, 4); - direction = sub_805CD60(mapObject, 8); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805DEF4, sub_805DF18, gUnknown_0837539C); - -u8 sub_805DF38(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805DF4C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805DF78(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805DFBC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805DFEC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_083753B0, 4); - direction = sub_805CD60(mapObject, 9); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805E034, sub_805E058, gUnknown_083753B4); - -u8 sub_805E078(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805E08C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 2; - return 1; -} - -u8 sub_805E0B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805E0FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 4; - return 1; - } - return 0; -} - -u8 sub_805E12C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_083753C8, 4); - direction = sub_805CD60(mapObject, 10); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805E174, sub_805E198, gUnknown_083753CC); - -u8 sub_805E1B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; - return 1; -} - -u8 sub_805E1E4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, 0x30); - sprite->data1 = 2; - } - return 0; -} - -u8 sub_805E208(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805E234(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[5]; - memcpy(directions, gUnknown_083753DC, 5); - direction = sub_805CD60(mapObject, 0); - if (direction == 0) - { - direction = directions[mapObject->mapobj_unk_18]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 0; - return 1; -} - -fieldmap_object_cb(sub_805E278, sub_803E29C, gUnknown_083753E4); - -u8 sub_805E2BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; - return 1; -} - -u8 sub_805E2E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, 0x30); - sprite->data1 = 2; - } - return 0; -} - -u8 sub_805E30C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data1 = 3; - } - return 0; -} - -u8 sub_805E338(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[5]; - memcpy(directions, gUnknown_083753F4, 5); - direction = sub_805CD60(mapObject, 0); - if (direction == 0) - { - direction = directions[mapObject->mapobj_unk_18]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 0; - return 1; -} - -fieldmap_object_cb(sub_805E37C, sub_805E3A0, gUnknown_083753FC); - -u8 sub_805E3C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 sub_805E3D4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - direction = gUnknown_0836DC09[mapObject->animPattern]; - if (mapObject->mapobj_unk_21 != 0) - { - direction = GetOppositeDirection(direction); - } - FieldObjectSetDirection(mapObject, direction); - sprite->data1 = 2; - return 1; -} - -u8 sub_805E40C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 v0; - u8 goSpeed0AnimId; - if (mapObject->mapobj_unk_21 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 0; - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - } - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - if (v0 == 1) - { - mapObject->mapobj_unk_21 ++; - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - } - if (v0 != 0) - { - goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); - } - FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); - mapObject->mapobj_bit_1 = 1; - sprite->data1 = 3; - return 1; -} - -u8 sub_805E4C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 1; - } - return 0; -} - -u8 sub_805E4EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data1 = 1; - return 1; -} - -u8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, struct Sprite *sprite, u8 *directionSequence) -{ - u8 v0; - u8 goSpeed0AnimId; - if (mapObject->mapobj_unk_21 == 3 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 0; - } - FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - if (v0 == 1) - { - mapObject->mapobj_unk_21 ++; - FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - } - if (v0 != 0) - { - goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); - } - FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); - mapObject->mapobj_bit_1 = 1; - sprite->data1 = 2; - return 1; -} - -u8 sub_805E5B4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 1; - } - return 0; -} - -fieldmap_object_cb(sub_805E5DC, sub_805E600, gUnknown_0837540C); - -u8 sub_805E620(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375418, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E668, sub_805E68C, gUnknown_0837541C); - -u8 sub_805E6AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375428, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E6F4, sub_805E718, gUnknown_0837542C); - -u8 sub_805E738(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375438, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E780, sub_805E7A4, gUnknown_0837543C); - -u8 sub_805E7C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375448, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - - - -fieldmap_object_cb(sub_805E80C, sub_805E830, gUnknown_0837544C); - -u8 sub_805E850(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375458, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E898, sub_805E8BC, gUnknown_0837545C); - -u8 sub_805E8DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375468, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E924, sub_805E948, gUnknown_0837546C); - -u8 sub_805E968(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375240, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E9B0, sub_805E9D4, gUnknown_08375478); - -u8 sub_805E9F4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375484, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EA3C, sub_805EA60, gUnknown_08375488); - -u8 sub_805EA80(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375494, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EAC8, sub_805EAEC, gUnknown_08375498); - -u8 sub_805EB0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754A4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EB54, sub_805EB78, gUnknown_083754A8); - -u8 sub_805EB98(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754B4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EBE0, sub_805EC04, gUnknown_083754B8); - -u8 sub_805EC24(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754C4, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EC6C, sub_805EC90, gUnknown_083754C8); - -u8 sub_805ECB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754D4, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805ECF8, sub_805ED1C, gUnknown_083754D8); - -u8 sub_805ED3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754E4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805ED84, sub_805EDA8, gUnknown_083754E8); - -u8 sub_805EDC8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754F4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EE10, sub_805EE34, gUnknown_083754F8); - -u8 sub_805EE54(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375504, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EE9C, sub_805EEC0, gUnknown_08375508); - -u8 sub_805EEE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375514, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EF28, sub_805EF4C, gUnknown_08375518); - -u8 sub_805EF6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375524, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EFB4, sub_805EFD8, gUnknown_08375528); - -u8 sub_805EFF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375534, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F040, sub_805F064, gUnknown_08375538); - -u8 sub_805F084(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375544, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F0CC, sub_805F0F0, gUnknown_08375548); - -u8 sub_805F110(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375554, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F158, sub_805F17C, gUnknown_08375558); - -u8 sub_805F19C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375564, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F1E4, sub_805F208, gUnknown_08375568); - -u8 sub_805F228(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375574, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F270, sub_805F294, gUnknown_08375578); - -u8 sub_805F2B4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375584, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -}; - -fieldmap_object_cb(sub_805F2FC, sub_805F320, gUnknown_08375588); - -u8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - if (mapObject->mapobj_unk_21 == 0) - { - mapObject->mapobj_unk_21 = player_get_direction_lower_nybble(); - } - sprite->data1 = 1; - return 1; -} - -u8 sub_805F364(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2) - { - return 0; - } - return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), NULL); -} - -u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = 0; - sprite->data1 = 1; - } - return 0; -} - -#ifdef NONMATCHING - -u8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8)) -{ - return 0; -} - -u8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8)) -{ - int direction; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - mapObject->mapobj_bit_1 = 1; - sprite->data1 = 2; - return 1; -} - -u8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8)) -{ - s16 x; - s16 y; - int direction; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction)); - if (!npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = 1; - sprite->data1 = 2; - return 1; -} -#endif - -asm(".section .text_fmocb2_c\n"); - -fieldmap_object_cb(sub_805F8E0, sub_805F904, gUnknown_083755C0); - -u8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2) - { - return 0; - } - return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), MetatileBehavior_IsPokeGrass); -} - -u8 sub_805F9F8(struct MapObject *, struct Sprite *); - -void FieldObjectCB_TreeDisguise(struct Sprite *sprite) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data0]; - if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data7 == 0)) - { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); - mapObject->mapobj_unk_1A = FieldEffectStart(0x1c); - mapObject->mapobj_unk_21 = 1; - sprite->data7 ++; - } - meta_step(&gMapObjects[sprite->data0], sprite, sub_805F9F8); -} - -u8 sub_805F9F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - return 0; -} - -void FieldObjectCB_MountainDisguise(struct Sprite *sprite) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data0]; - if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data7 == 0)) - { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); - mapObject->mapobj_unk_1A = FieldEffectStart(0x1d); - mapObject->mapobj_unk_21 = 1; - sprite->data7 ++; - } - meta_step(&gMapObjects[sprite->data0], sprite, sub_805F9F8); -} - -u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite); - -void FieldObjectCB_Hidden1(struct Sprite *sprite) -{ - if (sprite->data7 == 0) - { - gMapObjects[sprite->data0].mapobj_bit_26 = 1; - sprite->subspriteMode = 2; - sprite->oam.priority = 3; - sprite->data7 ++; - } - meta_step(&gMapObjects[sprite->data0], sprite, sub_805FAD8); -} - -u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - return gUnknown_083755CC[sprite->data1](mapObject, sprite); -} - -u8 sub_805FAF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - return 0; -} - -u8 sub_805FB04(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data1 = 0; - } - return 0; -} - -fieldmap_object_cb(sub_805FB20, sub_805FB44, gUnknown_083755D0); - -u8 sub_805FB64(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805FB90, sub_805FBB4, gUnknown_083755D8); - -u8 sub_805FBD4(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805FC00, sub_805FC24, gUnknown_083755E0); - -u8 sub_805FC44(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); - sprite->data1 = 1; - return 1; -} - -fieldmap_object_cb(sub_805FC70, sub_805FC94, gUnknown_083755E8); - -u8 sub_805FCB4(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - mapObject->mapobj_bit_13 = 1; - sprite->data1 = 1; - return 1; -} - -u8 sub_805FCE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data1 = 2; - return 1; - } - return 0; -} - -u8 sub_805FD08(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 0; - return 0; -} - -void sub_805FC70(struct Sprite *sprite); - -void npc_reset(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 0; - mapObject->mapobj_bit_6 = 0; - mapObject->mapobj_bit_7 = 0; - mapObject->mapobj_unk_1C = 0xff; - sprite->data1 = 0; -} - -u8 FieldObjectDirectionToImageAnimId(u8 direction) -{ - return gUnknown_083755F4[direction]; -} - -u8 get_go_image_anim_num(u8 direction) -{ - return gUnknown_083755FD[direction]; -} - -u8 get_go_fast_image_anim_num(u8 direction) -{ - return gUnknown_08375606[direction]; -} - -u8 get_go_faster_image_anim_num(u8 direction) -{ - return gUnknown_0837560F[direction]; -} - -u8 sub_805FD78(u8 direction) -{ - return gUnknown_08375618[direction]; -} - -u8 sub_805FD88(u8 direction) -{ - return gUnknown_08375621[direction]; -} - -u8 sub_805FD98(u8 direction) -{ - return gUnknown_0837562A[direction]; -} - -u8 unref_sub_805FDA8(u8 direction) -{ - return gUnknown_08375633[direction]; -} - -u8 sub_805FDB8(u8 direction) -{ - return gUnknown_0837563C[direction]; -} - -u8 sub_805FDC8(u8 direction) -{ - return gUnknown_08375645[direction]; -} - -u8 sub_805FDD8(u8 direction) -{ - return gUnknown_0837564E[direction]; -} - -u8 sub_805FDE8(u8 direction) -{ - return gUnknown_08375657[direction]; -} - -u8 sub_805FDF8(u8 direction) -{ - return gUnknown_08375660[direction]; -} - -u8 sub_805FE08(u8 direction) -{ - return gUnknown_08375669[direction]; -} - -u8 get_run_image_anim_num(u8 direction) -{ - return gUnknown_08375672[direction]; -} - -void sub_805FE28(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) -{ - if (!mapObject->mapobj_bit_12) - { - sprite->animNum = animNum; - if (sprite->animCmdIndex == 1) - { - sprite->animCmdIndex = 2; - } else if (sprite->animCmdIndex == 3) - { - sprite->animCmdIndex = 0; - } - SeekSpriteAnim(sprite, sprite->animCmdIndex); - } -} - -void sub_805FE64(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) -{ - u8 animCmdIndex; - if (!mapObject->mapobj_bit_12) - { - sprite->animNum = animNum; - animCmdIndex = 3; - if (sprite->animCmdIndex < 2) - { - animCmdIndex = 1; - } - SeekSpriteAnim(sprite, animCmdIndex); - } -} - -u8 sub_805FE90(s16 a0, s16 a1, s16 a2, s16 a3) -{ - if (a0 > a2) - { - return DIR_WEST; - } else if (a0 < a2) - { - return DIR_EAST; - } else if (a1 > a3) - { - return DIR_NORTH; - } else - { - return DIR_SOUTH; - } -} - -void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern) -{ - mapObject->animPattern = animPattern; - mapObject->mapobj_unk_21 = 0; - mapObject->animId = 0; - gSprites[mapObject->spriteId].callback = gUnknown_0836DA88[animPattern]; - gSprites[mapObject->spriteId].data1 = 0; -} - -u8 npc_running_behaviour_by_direction(u8 direction) -{ - return gUnknown_0837567B[direction]; -} - -u8 sub_805FF20(struct MapObject *mapObject, u8 direction) -{ - s16 x; - s16 y; - x = mapObject->coords2.x; - y = mapObject->coords2.y; - MoveCoords(direction, &x, &y); - return npc_block_way(mapObject, x, y, direction); -} - -bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject2 *mapObject, s16 x, s16 y); -bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y); -bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction); - -u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u8 direction) -{ - if (IsCoordOutsideFieldObjectMovementRect((struct MapObject2 *)mapObject, x, y)) - { - return 1; - } - if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction)) - { - return 2; - } else if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)) - { - return 2; - } - if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) - { - return 3; - } - if (CheckForCollisionBetweenFieldObjects(mapObject, x, y)) - { - return 4; - } - return 0; -} - -u8 sub_8060024(struct MapObject *mapObject, s16 x, s16 y, u8 direction) -{ - u8 flags; - flags = 0; - if (IsCoordOutsideFieldObjectMovementRect((struct MapObject2 *)mapObject, x, y)) - { - flags |= 1; - } - if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))) - { - flags |= 2; - } - if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) - { - flags |= 4; - } - if (CheckForCollisionBetweenFieldObjects(mapObject, x, y)) - { - flags |= 8; - } - return flags; -} - -bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject2 *mapObject, s16 x, s16 y) -{ - s16 minv; - s16 maxv; - if (mapObject->mapobj_unk_19 != 0) - { - minv = mapObject->coords1.x - (mapObject->mapobj_unk_19); - maxv = mapObject->coords1.x + (mapObject->mapobj_unk_19); - if (minv > x || maxv < x) - { - return 1; - } - } - if (mapObject->mapobj_unk_19b != 0) - { - minv = mapObject->coords1.y - (mapObject->mapobj_unk_19b); - maxv = mapObject->coords1.y + (mapObject->mapobj_unk_19b); - if (minv > y || maxv < y) - { - return 1; - } - } - return 0; -} - -bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction) -{ - if (gUnknown_08375684[direction - 1](mapObject->mapobj_unk_1E) || gUnknown_08375694[direction - 1](MapGridGetMetatileBehaviorAt(x, y))) - { - return 1; - } - return 0; -} - -bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y) -{ - struct MapObject *mapObject2; - u8 i; - for (i=0; i<16; i++) - { - mapObject2 = &gMapObjects[i]; - if (mapObject2->active && mapObject2 != mapObject) - { - if ((mapObject2->coords2.x != x || mapObject2->coords2.y != y) && (mapObject2->coords3.x != x || mapObject2->coords3.y != y)) - { - continue; - } - if (AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, mapObject2->mapobj_unk_0B_0)) - { - return 1; - } - } - } - return 0; -} - -bool8 sub_8060234(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - if (gSprites[gMapObjects[mapObjectId].spriteId].data7 & 2) - { - return 1; - } - } - return 0; -} - -void sub_8060288(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - gSprites[gMapObjects[mapObjectId].spriteId].data7 |= 4; - } -} - -void MoveCoords(u8 direction, s16 *x, s16 *y) -{ - *x += gDirectionToVector[direction].x; - *y += gDirectionToVector[direction].y; -} - -void unref_sub_80602F8(u8 direction, s16 *x, s16 *y) -{ - *x += gDirectionToVector[direction].x << 4; - *y += gDirectionToVector[direction].y << 4; -} - -void sub_8060320(u8 direction, s16 *x, s16 *y, s16 deltaX, s16 deltaY) -{ - if (gDirectionToVector[direction].x > 0) - { - *x += deltaX; - } - if (gDirectionToVector[direction].x < 0) - { - *x -= deltaX; - } - if (gDirectionToVector[direction].y > 0) - { - *y += deltaY; - } - if (gDirectionToVector[direction].y < 0) - { - *y -= deltaY; - } -} - -void sub_8060388(s16 x1, s16 y1, s16 *x2, s16 *y2) -{ - *x2 = (x1 - gSaveBlock1.pos.x) << 4; - *y2 = (y1 - gSaveBlock1.pos.y) << 4; - *x2 -= gUnknown_0300489C; - *y2 -= gUnknown_03004898; -} - -void sub_80603CC(s16 x1, s16 y1, s16 *x2, s16 *y2) -{ - s16 x3; - s16 y3; - x3 = -gUnknown_0300489C - gUnknown_03004880.unk10; - y3 = -gUnknown_03004898 - gUnknown_03004880.unk14; - if (gUnknown_03004880.unk10 > 0) - { - x3 += 0x10; - } - if (gUnknown_03004880.unk10 < 0) - { - x3 -= 0x10; - } - if (gUnknown_03004880.unk14 > 0) - { - y3 += 0x10; - } - if (gUnknown_03004880.unk14 < 0) - { - y3 -= 0x10; - } - *x2 = ((x1 - gSaveBlock1.pos.x) << 4) + x3; - *y2 = ((y1 - gSaveBlock1.pos.y) << 4) + y3; -} - -void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy) -{ - sub_80603CC(*x, *y, x, y); - *x += dx; - *y += dy; -} - -void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y) -{ - *x = 0; - *y = 0; - if (gUnknown_03004880.unk10 > 0) - { - (*x)++; - } - if (gUnknown_03004880.unk10 < 0) - { - (*x)--; - } - if (gUnknown_03004880.unk14 > 0) - { - (*y)++; - } - if (gUnknown_03004880.unk14 < 0) - { - (*y)--; - } -} - -void FieldObjectMoveDestCoords(struct MapObject *mapObject, u8 direction, s16 *x, s16 *y) -{ - *x = mapObject->coords2.x; - *y = mapObject->coords2.y; - MoveCoords(direction, x, y); -} - -bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_1 || mapObject->mapobj_bit_6) - { - return TRUE; - } - return FALSE; -} - -bool8 FieldObjectIsSpecialAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6 && mapObject->mapobj_unk_1C != 0xff) - { - return TRUE; - } - return FALSE; -} - -bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) -{ - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) - { - return TRUE; - } - UnfreezeMapObject(mapObject); - mapObject->mapobj_unk_1C = specialAnimId; - mapObject->mapobj_bit_6 = 1; - mapObject->mapobj_bit_7 = 0; - gSprites[mapObject->spriteId].data2 = 0; - return FALSE; -} - -void FieldObjectForceSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) -{ - FieldObjectClearAnimIfSpecialAnimActive(mapObject); - FieldObjectSetSpecialAnim(mapObject, specialAnimId); -} - -void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - { - FieldObjectClearAnim(mapObject); - } -} - -void FieldObjectClearAnim(struct MapObject *mapObject) -{ - mapObject->mapobj_unk_1C = 0xFF; - mapObject->mapobj_bit_6 = 0; - mapObject->mapobj_bit_7 = 0; - gSprites[mapObject->spriteId].data1 = 0; - gSprites[mapObject->spriteId].data2 = 0; -} - -bool8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - return mapObject->mapobj_bit_7; - return 0x10; -} - -bool8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *mapObject) -{ - u8 specialAnimStatus; - specialAnimStatus = FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject); - if (specialAnimStatus != 0 && specialAnimStatus != 0x10) - { - FieldObjectClearAnimIfSpecialAnimActive(mapObject); - } - return specialAnimStatus; -} - -u8 FieldObjectGetSpecialAnim(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - { - return mapObject->mapobj_unk_1C; - } - return 0xFF; -} - -extern void DoGroundEffects_OnSpawn(struct MapObject *mapObject, struct Sprite *sprite); -extern void DoGroundEffects_OnBeginStep(struct MapObject *mapObject, struct Sprite *sprite); -extern void DoGroundEffects_OnFinishStep(struct MapObject *mapObject, struct Sprite *sprite); -void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite); -void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite); -void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite); -void FieldObjectUpdateSubpriority(struct MapObject *mapObject, struct Sprite *sprite); - -void meta_step(struct MapObject *mapObject, struct Sprite *sprite, u8 (*callback)(struct MapObject *, struct Sprite *)) -{ - DoGroundEffects_OnSpawn(mapObject, sprite); - sub_80634A0(mapObject, sprite); - if (FieldObjectIsSpecialAnimActive(mapObject)) - { - FieldObjectExecSpecialAnim(mapObject, sprite); - } else - { - if (!mapObject->mapobj_bit_8) - { - while (callback(mapObject, sprite)); - } - } - DoGroundEffects_OnBeginStep(mapObject, sprite); - DoGroundEffects_OnFinishStep(mapObject, sprite); - npc_obj_transfer_image_anim_pause_flag(mapObject, sprite); - sub_80634D0(mapObject, sprite); - FieldObjectUpdateSubpriority(mapObject, sprite); -} - - -u8 GetFaceDirectionAnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756C8, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetSimpleGoAnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756CD, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetGoSpeed0AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756D2, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060744(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756D7, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 d2s_08064034(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756DC, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_806079C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756E1, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_80607C8(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756E6, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_80607F4(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756EB, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetJumpLedgeAnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756F0, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_806084C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756F5, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060878(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756FA, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_80608A4(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756FF, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_80608D0(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375704, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetStepInPlaceDelay32AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375709, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetStepInPlaceDelay16AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837570E, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetStepInPlaceDelay8AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375713, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetStepInPlaceDelay4AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375718, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction) -{ - return FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(GetOppositeDirection(direction))); -} - -u8 sub_80609D8(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837571D, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A04(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375722, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A30(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375727, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A5C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837572C, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A88(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375731, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060AB4(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375736, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060AE0(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837573B, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060B0C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375740, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060B38(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375745, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060B64(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837574A, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetOppositeDirection(u8 direction) -{ - u8 directions[8]; - memcpy(directions, gUnknown_0837574F, 8); - if (direction == 0 || direction > 8) - { - return direction; - } - return directions[direction - 1]; -} - -int zffu_offset_calc(u8 a0, u8 a1) -{ - return gUnknown_08375757[a0 - 1][a1 - 1]; -} - -#ifdef NONMATCHING -int state_to_direction(u8 a0, u8 a1, u8 a2) -{ - int zffuOffset; - asm_comment("For some reason, r2 is being backed up to r3 and restored ahead of the zffu call."); - if (a1 == 0 || a2 == 0 || a1 > 4 || a2 > 4) - { - return 0; - } - zffuOffset = zffu_offset_calc(a1, a2); - return gUnknown_08375767[a0 - 1][zffuOffset - 1]; -} -#else -__attribute__((naked)) -int state_to_direction(u8 a0, u8 a1, u8 a2) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r0, r1, 0\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - cmp r1, 0\n\ - beq _08060BFC\n\ - cmp r2, 0\n\ - beq _08060BFC\n\ - cmp r1, 0x4\n\ - bhi _08060BFC\n\ - cmp r2, 0x4\n\ - bls _08060C00\n\ -_08060BFC:\n\ - movs r0, 0\n\ - b _08060C12\n\ -_08060C00:\n\ - adds r1, r2, 0\n\ - bl zffu_offset_calc\n\ - ldr r2, _08060C18 @ =gUnknown_08375767\n\ - lsls r1, r4, 2\n\ - subs r1, 0x5\n\ - adds r0, r1\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ -_08060C12:\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08060C18: .4byte gUnknown_08375767\n\ -.syntax divided\n"); -} -#endif - -void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite)) - { - mapObject->mapobj_bit_7 = 1; - } -} - -bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite)) - { - mapObject->mapobj_unk_1C = 0xFF; - sprite->data2 = 0; - return 1; - } - return 0; -} - -void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId) -{ - mapObject->mapobj_unk_1C = animId; - sprite->data2 = 0; -} - -void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - npc_coords_shift_still(mapObject); - sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - sprite->animPaused = 1; - sprite->data2 = 1; -} - -u8 sub_8060CE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_SOUTH); - return 1; -} - -u8 sub_8060CF0(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_NORTH); - return 1; -} - -u8 sub_8060D00(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_WEST); - return 1; -} - -u8 sub_8060D10(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_EAST); - return 1; -} - -void sub_8060D20(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - s16 x; - s16 y; - x = mapObject->coords2.x; - y = mapObject->coords2.y; - FieldObjectSetDirection(mapObject, direction); - MoveCoords(direction, &x, &y); - npc_coords_shift(mapObject, x, y); - oamt_npc_ministep_reset(sprite, direction, a3); - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - sprite->data2 = 1; -} - -extern u8 (*const gUnknown_083759C0[5])(u8); - -void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - u8 (*const functions[5])(u8); - memcpy((void *)functions, gUnknown_083759C0, sizeof(gUnknown_083759C0)); - sub_8060D20(mapObject, sprite, direction, a3); - sub_805FE28(mapObject, sprite, functions[a3](mapObject->mapobj_unk_18)); -} - -void do_run_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_8060D20(mapObject, sprite, direction, 1); - sub_805FE28(mapObject, sprite, get_run_image_anim_num(mapObject->mapobj_unk_18)); -} - -bool8 obj_npc_ministep(struct Sprite *); - -bool8 npc_obj_ministep_stop_on_arrival(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (obj_npc_ministep(sprite)) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = 1; - sprite->animPaused = 1; - return 1; - } - return 0; -} - -void sub_8060E68(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - s16 x; - s16 y; - x = mapObject->coords2.x; - y = mapObject->coords2.y; - FieldObjectSetDirection(mapObject, direction); - MoveCoords(direction, &x, &y); - npc_coords_shift(mapObject, x, y); - sub_806467C(sprite, direction); - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - sprite->data2 = 1; -} - -void sub_8060ED8(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_8060E68(mapObject, sprite, direction); - sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); -} - -bool8 an_walk_any_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_806468C(sprite)) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = 1; - sprite->animPaused = 1; - return TRUE; - } - return FALSE; -} - -bool8 sub_8060F5C(struct MapObject *, struct Sprite *); - -bool8 sub_8060F3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_SOUTH); - return sub_8060F5C(mapObject, sprite); -} - -bool8 sub_8060F5C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8060F9C(struct MapObject *, struct Sprite *); - -bool8 sub_8060F7C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_NORTH); - return sub_8060F9C(mapObject, sprite); -} - -bool8 sub_8060F9C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8060FDC(struct MapObject *, struct Sprite *); - -bool8 sub_8060FBC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_WEST); - return sub_8060FDC(mapObject, sprite); -} - -bool8 sub_8060FDC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806101C(struct MapObject *, struct Sprite *); - -bool8 sub_8060FFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_EAST); - return sub_806101C(mapObject, sprite); -} - -bool8 sub_806101C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806105C(struct MapObject *, struct Sprite *); - -bool8 sub_806103C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 0); - return sub_806105C(mapObject, sprite); -} - -bool8 sub_806105C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806109C(struct MapObject *, struct Sprite *); - -bool8 sub_806107C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 0); - return sub_806109C(mapObject, sprite); -} - -bool8 sub_806109C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80610DC(struct MapObject *, struct Sprite *); - -bool8 sub_80610BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 0); - return sub_80610DC(mapObject, sprite); -} - -bool8 sub_80610DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806111C(struct MapObject *, struct Sprite *); - -bool8 sub_80610FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 0); - return sub_806111C(mapObject, sprite); -} - -bool8 sub_806111C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -void sub_806113C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) -{ - s16 vSPp4[3]; - s16 x; - s16 y; - memcpy(vSPp4, gUnknown_08375A34, sizeof gUnknown_08375A34); - x = 0; - y = 0; - FieldObjectSetDirection(mapObject, direction); - sub_8060320(direction, &x, &y, vSPp4[a4], vSPp4[a4]); - npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); - sub_80646E4(sprite, direction, a4, a5); - sprite->data2 = 1; - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - mapObject->mapobj_bit_4 = 1; -} - -void maybe_shadow_1(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) -{ - sub_806113C(mapObject, sprite, direction, a4, a5); - sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - DoShadowFieldEffect(mapObject); -} - -u8 sub_806123C(struct MapObject *mapObject, struct Sprite *sprite, u8 (*const callback)(struct Sprite *)) -{ - s16 vSPp4[3]; - s16 x; - s16 y; - u8 retval; - memcpy(vSPp4, gUnknown_08375A3A, sizeof gUnknown_08375A3A); - retval = callback(sprite); - if (retval == 1 && vSPp4[sprite->data4] != 0) - { - x = 0; - y = 0; - sub_8060320(mapObject->placeholder18, &x, &y, vSPp4[sprite->data4], vSPp4[sprite->data4]); - npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); - mapObject->mapobj_bit_2 = 1; - mapObject->mapobj_bit_4 = 1; - } else if (retval == 0xff) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = 1; - mapObject->mapobj_bit_5 = 1; - sprite->animPaused = 1; - } - return retval; -} - -u8 sub_8061300(struct MapObject *mapObject, struct Sprite *sprite) -{ - return sub_806123C(mapObject, sprite, sub_8064704); -} - -u8 sub_8061314(struct MapObject *mapObject, struct Sprite *sprite) -{ - return sub_806123C(mapObject, sprite, sub_806478C); -} - -bool8 sub_8061328(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061300(mapObject, sprite) == 0xFF) - { - return TRUE; - } - return FALSE; -} - -bool8 sub_8061340(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061314(mapObject, sprite) == 0xFF) - { - return TRUE; - } - return FALSE; -} - -bool8 sub_8061358(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 retval; - - retval = sub_8061300(mapObject, sprite); - if (retval != 1) - { - if (retval == 0xFF) - { - return TRUE; - } - return FALSE; - } - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - return FALSE; -} - -bool8 sub_80613D4(struct MapObject *, struct Sprite *); -bool8 sub_806142C(struct MapObject *, struct Sprite *); -bool8 sub_8061484(struct MapObject *, struct Sprite *); -bool8 sub_80614DC(struct MapObject *, struct Sprite *); - -bool8 sub_80613A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 2, 0); - return sub_80613D4(mapObject, sprite); -} - -bool8 sub_80613D4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061400(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 2, 0); - return sub_806142C(mapObject, sprite); -} - -bool8 sub_806142C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061458(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 2, 0); - return sub_8061484(mapObject, sprite); -} - -bool8 sub_8061484(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80614B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 2, 0); - return sub_80614DC(mapObject, sprite); -} - -bool8 sub_80614DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -void sub_8061508(struct Sprite *sprite, u16 duration) -{ - sprite->data2 = 1; - sprite->data3 = duration; -} - -bool8 sub_8061510(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data3--; - if (!sprite->data3) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806152C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 1); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_806154C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 2); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_806156C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 4); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_806158C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 8); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_80615AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 16); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite); -bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite); -bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite); -bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80615CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 1); - return sub_80615EC(mapObject, sprite); -} - -bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} -bool8 sub_806160C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 1); - return sub_806162C(mapObject, sprite); -} - -bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} -bool8 sub_806164C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 1); - return sub_806166C(mapObject, sprite); -} - -bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} -bool8 sub_806168C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 1); - return sub_80616AC(mapObject, sprite); -} - -bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -void sub_80616CC(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animId, u16 duration) -{ - FieldObjectSetDirection(mapObject, direction); - sub_805FE28(mapObject, sprite, animId); - sprite->animPaused = 0; - sprite->data2 = 1; - sprite->data3 = duration; -} - -bool8 sub_8061714(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data3--; - if (sprite->data3 == 0) - { - sprite->data2 = 2; - sprite->animPaused = 1; - return TRUE; - } - return FALSE; -} - -bool8 sub_806173C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sprite->data3 & 1) - { - sprite->animDelayCounter++; - } - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061778(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_80617B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_80617E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_8061820(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_8061858(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061890(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_80618C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061900(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061938(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_fast_image_anim_num(DIR_SOUTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061970(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_fast_image_anim_num(DIR_NORTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_80619A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_fast_image_anim_num(DIR_WEST), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_80619E0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_fast_image_anim_num(DIR_EAST), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061A18(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_faster_image_anim_num(DIR_SOUTH), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061A50(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_faster_image_anim_num(DIR_NORTH), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061A88(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_faster_image_anim_num(DIR_WEST), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061AC0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_faster_image_anim_num(DIR_EAST), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061B18(struct MapObject *, struct Sprite *); - -bool8 sub_8061AF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 2); - return sub_8061B18(mapObject, sprite); -} - -bool8 sub_8061B18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061B58(struct MapObject *, struct Sprite *); - -bool8 sub_8061B38(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 2); - return sub_8061B58(mapObject, sprite); -} - -bool8 sub_8061B58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061B98(struct MapObject *, struct Sprite *); - -bool8 sub_8061B78(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 2); - return sub_8061B98(mapObject, sprite); -} - -bool8 sub_8061B98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061BD8(struct MapObject *, struct Sprite *); - -bool8 sub_8061BB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 2); - return sub_8061BD8(mapObject, sprite); -} - -bool8 sub_8061BD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061C18(struct MapObject *, struct Sprite *); - -bool8 sub_8061BF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 3); - return sub_8061C18(mapObject, sprite); -} - -bool8 sub_8061C18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061C58(struct MapObject *, struct Sprite *); - -bool8 sub_8061C38(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 3); - return sub_8061C58(mapObject, sprite); -} - -bool8 sub_8061C58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061C98(struct MapObject *, struct Sprite *); - -bool8 sub_8061C78(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 3); - return sub_8061C98(mapObject, sprite); -} - -bool8 sub_8061C98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061CD8(struct MapObject *, struct Sprite *); - -bool8 sub_8061CB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 3); - return sub_8061CD8(mapObject, sprite); -} - -bool8 sub_8061CD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061D18(struct MapObject *, struct Sprite *); - -bool8 sub_8061CF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 4); - return sub_8061D18(mapObject, sprite); -} - -bool8 sub_8061D18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061D58(struct MapObject *, struct Sprite *); - -bool8 sub_8061D38(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 4); - return sub_8061D58(mapObject, sprite); -} - -bool8 sub_8061D58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061D98(struct MapObject *, struct Sprite *); - -bool8 sub_8061D78(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 4); - return sub_8061D98(mapObject, sprite); -} - -bool8 sub_8061D98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061DD8(struct MapObject *, struct Sprite *); - -bool8 sub_8061DB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 4); - return sub_8061DD8(mapObject, sprite); -} - -bool8 sub_8061DD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061E18(struct MapObject *, struct Sprite *); - -bool8 do_run_south_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_SOUTH); - return sub_8061E18(mapObject, sprite); -} - -bool8 sub_8061E18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061E58(struct MapObject *, struct Sprite *); - -bool8 do_run_north_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_NORTH); - return sub_8061E58(mapObject, sprite); -} - -bool8 sub_8061E58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061E98(struct MapObject *, struct Sprite *); - -bool8 do_run_west_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_WEST); - return sub_8061E98(mapObject, sprite); -} - -bool8 sub_8061E98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061ED8(struct MapObject *, struct Sprite *); - -bool8 do_run_east_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_EAST); - return sub_8061ED8(mapObject, sprite); -} - -bool8 sub_8061ED8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum) -{ - obj_anim_image_set_and_seek(sprite, animNum, 0); - FieldObjectSetDirection(mapObject, direction); - sprite->data2 = 1; -} - -bool8 sub_8061F24(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, mapObject->placeholder18, sprite->animNum); - return FALSE; -} - -bool8 sub_8064864(struct Sprite *); - -bool8 sub_8061F3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064864(sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -void sub_8061F5C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_806113C(mapObject, sprite, direction, 1, 0); - StartSpriteAnim(sprite, sub_805FD88(direction)); -} - -bool8 sub_8061FB0(struct MapObject *, struct Sprite *); - -bool8 sub_8061F90(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_SOUTH); - return sub_8061FB0(mapObject, sprite); -} - -bool8 sub_8061FB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data2 = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061FF8(struct MapObject *, struct Sprite *); - -bool8 sub_8061FD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_NORTH); - return sub_8061FF8(mapObject, sprite); -} - -bool8 sub_8061FF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data2 = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062040(struct MapObject *, struct Sprite *); - -bool8 sub_8062020(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_WEST); - return sub_8062040(mapObject, sprite); -} - -bool8 sub_8062040(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data2 = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062088(struct MapObject *, struct Sprite *); - -bool8 sub_8062068(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_EAST); - return sub_8062088(mapObject, sprite); -} - -bool8 sub_8062088(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data2 = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_80620B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 objectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, &objectId)) - { - an_look_any(mapObject, sprite, sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y)); - } - sprite->data2 = 1; - return TRUE; -} - -bool8 sub_806210C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 objectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, &objectId)) - { - an_look_any(mapObject, sprite, GetOppositeDirection(sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y))); - } - sprite->data2 = 1; - return TRUE; -} - -bool8 sub_8062170(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_9 = 1; - sprite->data2 = 1; - return TRUE; -} - -bool8 sub_8062180(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_9 = 0; - sprite->data2 = 1; - return TRUE; -} - -bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062190(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 1, 2); - return sub_80621BC(mapObject, sprite); -} - -bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80621E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 1, 2); - return sub_8062214(mapObject, sprite); -} - -bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062240(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 1, 2); - return sub_806226C(mapObject, sprite); -} - -bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062298(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 1, 2); - return sub_80622C4(mapObject, sprite); -} - -bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80622F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 0); - return sub_806231C(mapObject, sprite); -} - -bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062348(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 0); - return sub_8062374(mapObject, sprite); -} - -bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80623A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 0); - return sub_80623CC(mapObject, sprite); -} - -bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80623F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 0); - return sub_8062424(mapObject, sprite); -} - -bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062450(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 2); - return sub_806247C(mapObject, sprite); -} - -bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80624A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 2); - return sub_80624D4(mapObject, sprite); -} - -bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062500(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 2); - return sub_806252C(mapObject, sprite); -} - -bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062558(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 2); - return sub_8062584(mapObject, sprite); -} - -bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80625B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, gUnknown_0836DC09[mapObject->animPattern]); - return TRUE; -} - -bool8 sub_80625C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, 0x14); - return FALSE; -} - -bool8 sub_80625D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_25 = 0; - sprite->data2 = 1; - return TRUE; -} - -bool8 sub_80625E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_25 = 1; - sprite->data2 = 1; - return TRUE; -} - -bool8 sub_80625F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_12 = 1; - sprite->data2 = 1; - return TRUE; -} - -bool8 sub_8062608(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate; - sprite->data2 = 1; - return TRUE; -} - -bool8 sub_8062634(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 = 1; - sprite->data2 = 1; - return TRUE; -} - -bool8 sub_8062644(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 = 0; - sprite->data2 = 1; - return TRUE; -} - -bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); - FieldEffectStart(0x0); - sprite->data2 = 1; - return TRUE; -} - -bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); - FieldEffectStart(0x21); - sprite->data2 = 1; - return TRUE; -} - -bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); - FieldEffectStart(0x2e); - sprite->data2 = 1; - return TRUE; -} - -bool8 sub_8062704(struct MapObject *, struct Sprite *); - -bool8 sub_80626C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->animPattern == 0x3F) - { - sub_8084794(mapObject); - return FALSE; - } - else if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A) - { - sprite->data2 = 2; - return TRUE; - } - else - { - sub_812869C(mapObject); - sprite->data2 = 1; - return sub_8062704(mapObject, sprite); - } -} - -bool8 sub_8062704(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_81286C4(mapObject)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062724(struct MapObject *mapObject, struct Sprite *sprite) -{ - obj_anim_image_set_and_seek(sprite, 1, 0); - sprite->data2 = 1; - return FALSE; -} - -bool8 sub_8062740(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064864(sprite)) - { - sub_8064820(sprite, 0x20); - sprite->data2 = 2; - } - return FALSE; -} - -bool8 sub_8062764(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 ^= 1; - if (sub_8064824(sprite)) - { - mapObject->mapobj_bit_13 = 1; - sprite->data2 = 3; - } - return FALSE; -} - -bool8 sub_80627A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - obj_anim_image_set_and_seek(sprite, 1, 0); - sprite->data2 = 1; - return FALSE; -} - -bool8 sub_80627BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064864(sprite)) - { - sub_8064820(sprite, 0x20); - sprite->data2 = 2; - } - return FALSE; -} - -bool8 sub_80627E0(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 ^= 1; - if (sub_8064824(sprite)) - { - mapObject->mapobj_bit_13 = 1; - sprite->data2 = 3; - } - return FALSE; -} - -bool8 sub_806281C(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_26 = 1; - sprite->data2 = 1; - return TRUE; -} - -bool8 sub_806282C(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_26 = 0; - sprite->data2 = 1; - return TRUE; -} - -bool8 sub_806283C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->oam.affineMode = 3; - InitSpriteAffineAnim(sprite); - sprite->affineAnimPaused = 1; - sprite->subspriteMode = 0; - return TRUE; -} - -bool8 sub_806286C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FreeOamMatrix(sprite->oam.matrixNum); - sprite->oam.affineMode = 0; - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - return TRUE; -} - -bool8 sub_80628D0(struct MapObject *, struct Sprite *); - -bool8 sub_806289C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_SOUTH); - sprite->affineAnimPaused = 0; - StartSpriteAffineAnimIfDifferent(sprite, 0); - return sub_80628D0(mapObject, sprite); -} - -bool8 sub_80628D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->affineAnimPaused = 1; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062930(struct MapObject *, struct Sprite *); - -bool8 sub_80628FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_SOUTH); - sprite->affineAnimPaused = 0; - ChangeSpriteAffineAnimIfDifferent(sprite, 1); - return sub_8062930(mapObject, sprite); -} - -bool8 sub_8062930(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->affineAnimPaused = 1; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -void sub_806295C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - npc_coords_shift_still(mapObject); - sub_805FE64(mapObject, sprite, sub_805FDD8(direction)); - sprite->animPaused = 1; - sprite->data2 = 1; -} - -bool8 sub_806299C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_SOUTH); - return TRUE; -} - -bool8 sub_80629AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_NORTH); - return TRUE; -} - -bool8 sub_80629BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_WEST); - return TRUE; -} - -bool8 sub_80629CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_EAST); - return TRUE; -} - -bool8 sub_80629DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FD98(DIR_SOUTH)); - return FALSE; -} - -bool8 sub_8062A00(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FD98(DIR_NORTH)); - return FALSE; -} - -bool8 sub_8062A24(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FD98(DIR_WEST)); - return FALSE; -} - -bool8 sub_8062A48(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FD98(DIR_EAST)); - return FALSE; -} - -bool8 sub_8062A6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDB8(DIR_SOUTH)); - return FALSE; -} - -bool8 sub_8062A90(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDB8(DIR_NORTH)); - return FALSE; -} - -bool8 sub_8062AB4(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDB8(DIR_WEST)); - return FALSE; -} - -bool8 sub_8062AD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDB8(DIR_EAST)); - return FALSE; -} - -bool8 sub_8062AFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDC8(DIR_SOUTH)); - return FALSE; -} - -bool8 sub_8062B20(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDC8(DIR_NORTH)); - return FALSE; -} - -bool8 sub_8062B44(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDC8(DIR_WEST)); - return FALSE; -} - -bool8 sub_8062B68(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDC8(DIR_EAST)); - return FALSE; -} - -void sub_8062B8C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3, u8 a4) -{ - sub_806113C(mapObject, sprite, direction, a3, a4); - StartSpriteAnimIfDifferent(sprite, sub_805FD98(direction)); - DoShadowFieldEffect(mapObject); -} - -bool8 sub_8062BFC(struct MapObject *, struct Sprite *); - -bool8 sub_8062BD0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_SOUTH, 0, 1); - return sub_8062BFC(mapObject, sprite); -} - -bool8 sub_8062BFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062C54(struct MapObject *, struct Sprite *); - -bool8 sub_8062C28(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_NORTH, 0, 1); - return sub_8062C54(mapObject, sprite); -} - -bool8 sub_8062C54(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062CAC(struct MapObject *, struct Sprite *); - -bool8 sub_8062C80(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_WEST, 0, 1); - return sub_8062CAC(mapObject, sprite); -} - -bool8 sub_8062CAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062D04(struct MapObject *, struct Sprite *); - -bool8 sub_8062CD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_EAST, 0, 1); - return sub_8062D04(mapObject, sprite); -} - -bool8 sub_8062D04(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062D5C(struct MapObject *, struct Sprite *); - -bool8 sub_8062D30(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_SOUTH, 1, 1); - return sub_8062D5C(mapObject, sprite); -} - -bool8 sub_8062D5C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062DB4(struct MapObject *, struct Sprite *); - -bool8 sub_8062D88(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_NORTH, 1, 1); - return sub_8062DB4(mapObject, sprite); -} - -bool8 sub_8062DB4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062E0C(struct MapObject *, struct Sprite *); - -bool8 sub_8062DE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_WEST, 1, 1); - return sub_8062E0C(mapObject, sprite); -} - -bool8 sub_8062E0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062E64(struct MapObject *, struct Sprite *); - -bool8 sub_8062E38(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_EAST, 1, 1); - return sub_8062E64(mapObject, sprite); -} - -bool8 sub_8062E64(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062EBC(struct MapObject *, struct Sprite *); - -bool8 sub_8062E90(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_SOUTH, 2, 0); - return sub_8062EBC(mapObject, sprite); -} - -bool8 sub_8062EBC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062F14(struct MapObject *, struct Sprite *); - -bool8 sub_8062EE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_NORTH, 2, 0); - return sub_8062F14(mapObject, sprite); -} - -bool8 sub_8062F14(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062F6C(struct MapObject *, struct Sprite *); - -bool8 sub_8062F40(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_WEST, 2, 0); - return sub_8062F6C(mapObject, sprite); -} - -bool8 sub_8062F6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062FC4(struct MapObject *, struct Sprite *); - -bool8 sub_8062F98(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_EAST, 2, 0); - return sub_8062FC4(mapObject, sprite); -} - -bool8 sub_8062FC4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062FF0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, sub_805FDD8(DIR_SOUTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8063028(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, sub_805FDD8(DIR_NORTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8063060(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, sub_805FDD8(DIR_WEST), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8063098(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, sub_805FDD8(DIR_EAST), 8); - return sub_8061714(mapObject, sprite); -} - -void sub_80630D0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - sub_8060D20(mapObject, sprite, direction, a3); - StartSpriteAnim(sprite, sub_805FD98(mapObject->mapobj_unk_18)); - SeekSpriteAnim(sprite, 0); -} - -bool8 sub_8063128(struct MapObject *, struct Sprite *); - -bool8 sub_8063108(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_SOUTH, 1); - return sub_8063128(mapObject, sprite); -} - -bool8 sub_8063128(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063168(struct MapObject *, struct Sprite *); - -bool8 sub_8063148(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_NORTH, 1); - return sub_8063168(mapObject, sprite); -} - -bool8 sub_8063168(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80631A8(struct MapObject *, struct Sprite *); - -bool8 sub_8063188(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_WEST, 1); - return sub_80631A8(mapObject, sprite); -} - -bool8 sub_80631A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80631E8(struct MapObject *, struct Sprite *); - -bool8 sub_80631C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_EAST, 1); - return sub_80631E8(mapObject, sprite); -} - -bool8 sub_80631E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -void sub_8063208(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - sub_8060D20(mapObject, sprite, direction, a3); - sub_805FE28(mapObject, sprite, sub_805FDD8(mapObject->mapobj_unk_18)); -} - -bool8 sub_8063258(struct MapObject *, struct Sprite *); - -bool8 sub_8063238(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_SOUTH, 1); - return sub_8063258(mapObject, sprite); -} - -bool8 sub_8063258(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063298(struct MapObject *, struct Sprite *); - -bool8 sub_8063278(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_NORTH, 1); - return sub_8063298(mapObject, sprite); -} - -bool8 sub_8063298(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80632D8(struct MapObject *, struct Sprite *); - -bool8 sub_80632B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_WEST, 1); - return sub_80632D8(mapObject, sprite); -} - -bool8 sub_80632D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063318(struct MapObject *, struct Sprite *); - -bool8 sub_80632F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_EAST, 1); - return sub_8063318(mapObject, sprite); -} - -bool8 sub_8063318(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -void sub_8063338(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - sub_8060D20(mapObject, sprite, direction, a3); - StartSpriteAnim(sprite, sub_805FDB8(mapObject->mapobj_unk_18)); - SeekSpriteAnim(sprite, 0); -} - -bool8 sub_8063390(struct MapObject *, struct Sprite *); - -bool8 sub_8063370(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_SOUTH, 1); - return sub_8063390(mapObject, sprite); -} - -bool8 sub_8063390(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80633D0(struct MapObject *, struct Sprite *); - -bool8 sub_80633B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_NORTH, 1); - return sub_80633D0(mapObject, sprite); -} - -bool8 sub_80633D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063410(struct MapObject *, struct Sprite *); - -bool8 sub_80633F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_WEST, 1); - return sub_8063410(mapObject, sprite); -} - -bool8 sub_8063410(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063450(struct MapObject *, struct Sprite *); - -bool8 sub_8063430(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_EAST, 1); - return sub_8063450(mapObject, sprite); -} - -bool8 sub_8063450(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data2 = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063470(struct MapObject *mapObject, struct Sprite *sprite) -{ - return TRUE; -} - -bool8 sub_8063474(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->animPaused = 1; - return TRUE; -} - -void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->mapobj_bit_10) - { - sprite->animPaused = 1; - } -} - -void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->mapobj_bit_11) - { - sprite->animPaused = 0; - mapObject->mapobj_bit_10 = 0; - mapObject->mapobj_bit_11 = 0; - } -} - -void sub_80634E8(struct MapObject *, struct Sprite *); -void npc_update_obj_anim_flag(struct MapObject *, struct Sprite *); - -void sub_80634D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80634E8(mapObject, sprite); - npc_update_obj_anim_flag(mapObject, sprite); -} - -#ifdef NONMATCHING -void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u16 x; - u16 y; - s16 x2; - s16 y2; - const struct MapObjectGraphicsInfo *graphicsInfo; - mapObject->mapobj_bit_14 = 0; - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - if (sprite->coordOffsetEnabled) - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } else - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - } - x2 = graphicsInfo->width + x; // offending line - y2 = graphicsInfo->height + y; // similarly offending line - if ((s16)x >= 0x100 || x2 < -0x10) - { - mapObject->mapobj_bit_14 = 1; - } - if ((s16)y >= 0xB0 || y2 < -0x10) - { - mapObject->mapobj_bit_14 = 1; - } -} -#else -__attribute__((naked)) -void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) { - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - adds r5, r0, 0\n\ - adds r4, r1, 0\n\ - ldrb r1, [r5, 0x1]\n\ - movs r0, 0x41\n\ - negs r0, r0\n\ - ands r0, r1\n\ - strb r0, [r5, 0x1]\n\ - ldrb r0, [r5, 0x5]\n\ - bl GetFieldObjectGraphicsInfo\n\ - adds r6, r0, 0\n\ - adds r0, r4, 0\n\ - adds r0, 0x3E\n\ - ldrb r1, [r0]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0806354C\n\ - ldrh r1, [r4, 0x24]\n\ - ldrh r0, [r4, 0x20]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x28\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - ldr r2, _08063544 @ =gSpriteCoordOffsetX\n\ - adds r0, r1\n\ - ldrh r2, [r2]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - ldrh r1, [r4, 0x26]\n\ - ldrh r0, [r4, 0x22]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x29\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - ldr r2, _08063548 @ =gSpriteCoordOffsetY\n\ - adds r0, r1\n\ - ldrh r2, [r2]\n\ - adds r0, r2\n\ - b _08063574\n\ - .align 2, 0\n\ -_08063544: .4byte gSpriteCoordOffsetX\n\ -_08063548: .4byte gSpriteCoordOffsetY\n\ -_0806354C:\n\ - ldrh r1, [r4, 0x24]\n\ - ldrh r0, [r4, 0x20]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x28\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - adds r0, r1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - ldrh r1, [r4, 0x26]\n\ - ldrh r0, [r4, 0x22]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x29\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - adds r0, r1\n\ -_08063574:\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - ldrh r0, [r6, 0x8]\n\ - adds r0, r3\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - ldrh r0, [r6, 0xA]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - cmp r0, 0xFF\n\ - bgt _0806359C\n\ - lsls r0, r1, 16\n\ - asrs r0, 16\n\ - movs r1, 0x10\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _080635A4\n\ -_0806359C:\n\ - ldrb r0, [r5, 0x1]\n\ - movs r1, 0x40\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x1]\n\ -_080635A4:\n\ - lsls r0, r2, 16\n\ - asrs r0, 16\n\ - cmp r0, 0xAF\n\ - bgt _080635B8\n\ - lsls r0, r4, 16\n\ - asrs r0, 16\n\ - movs r1, 0x10\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _080635C0\n\ -_080635B8:\n\ - ldrb r0, [r5, 0x1]\n\ - movs r1, 0x40\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x1]\n\ -_080635C0:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ -.syntax divided\n"); -} -#endif - -void npc_update_obj_anim_flag(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->invisible = 0; - if (mapObject->mapobj_bit_13 || mapObject->mapobj_bit_14) - { - sprite->invisible = 1; - } -} diff --git a/src/field_map_obj_helpers.c b/src/field_map_obj_helpers.c deleted file mode 100644 index 87be8e011..000000000 --- a/src/field_map_obj_helpers.c +++ /dev/null @@ -1,318 +0,0 @@ -#include "global.h" -#include "field_map_obj_helpers.h" -#include "field_effect.h" -#include "field_ground_effect.h" -#include "field_map_obj.h" -#include "sprite.h" - -typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir); - -extern s16 gUnknown_08376194[]; -extern SpriteStepFunc *gUnknown_08376180[]; -extern s8 *gUnknown_083761D0[]; -extern s16 gUnknown_083761DC[]; -extern u8 gUnknown_083761E2[]; -extern s16 gUnknown_083761E6[]; -extern u8 gUnknown_083761EC[]; - -bool8 FreezeMapObject(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8) - { - return TRUE; - } - else - { - mapObject->mapobj_bit_8 = 1; - mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused; - mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused; - gSprites[mapObject->spriteId].animPaused = 1; - gSprites[mapObject->spriteId].affineAnimPaused = 1; - return FALSE; - } -} - -void FreezeMapObjects(void) -{ - u8 i; - for (i = 0; i < 16; i++) - if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) - FreezeMapObject(&gMapObjects[i]); -} - -void FreezeMapObjectsExceptOne(u8 a1) -{ - u8 i; - for (i = 0; i < 16; i++) - if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) - FreezeMapObject(&gMapObjects[i]); -} - -void UnfreezeMapObject(struct MapObject *mapObject) -{ - if (mapObject->active && mapObject->mapobj_bit_8) - { - mapObject->mapobj_bit_8 = 0; - gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23; - gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24; - } -} - -void UnfreezeMapObjects(void) -{ - u8 i; - for (i = 0; i < 16; i++) - if (gMapObjects[i].active) - UnfreezeMapObject(&gMapObjects[i]); -} - -void Step1(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += gDirectionToVector[dir].x; - sprite->pos1.y += gDirectionToVector[dir].y; -} - -void Step2(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y; -} - -void Step3(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y; -} - -void Step4(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y; -} - -void Step8(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 8 * (u16) gDirectionToVector[dir].y; -} - -void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3) -{ - sprite->data3 = a2; - sprite->data4 = a3; - sprite->data5 = 0; -} - -bool8 obj_npc_ministep(struct Sprite *sprite) -{ - if (sprite->data5 >= gUnknown_08376194[sprite->data4]) - return FALSE; - - gUnknown_08376180[sprite->data4][sprite->data5](sprite, sprite->data3); - - sprite->data5++; - - if (sprite->data5 < gUnknown_08376194[sprite->data4]) - return FALSE; - - return TRUE; -} - -void sub_806467C(struct Sprite *sprite, u8 a2) -{ - sprite->data3 = a2; - sprite->data4 = 0; - sprite->data5 = 0; -} - -bool8 sub_806468C(struct Sprite *sprite) -{ - if (!(sprite->data4 & 1)) - { - Step1(sprite, sprite->data3); - sprite->data5++; - } - - sprite->data4++; - - if (sprite->data5 > 15) - return TRUE; - else - return FALSE; -} - -s16 sub_80646C8(s16 a1, u8 a2) -{ - return gUnknown_083761D0[a2][a1]; -} - -void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4) -{ - sprite->data3 = a2; - sprite->data4 = a3; - sprite->data5 = a4; - sprite->data6 = 0; -} - -u8 sub_8064704(struct Sprite *sprite) -{ - u8 v2; - s16 v5[3]; - u8 v6[3]; - - memcpy(v5, gUnknown_083761DC, 6); - memcpy(v6, gUnknown_083761E2, 3); - - v2 = 0; - - if (sprite->data4) - Step1(sprite, sprite->data3); - - sprite->pos2.y = sub_80646C8(sprite->data6 >> v6[sprite->data4], sprite->data5); - - sprite->data6++; - - if (sprite->data6 == (v5[sprite->data4] >> 1)) - v2 = 1; - - if (sprite->data6 >= v5[sprite->data4]) - { - sprite->pos2.y = 0; - v2 = -1; - } - - return v2; -} - -u8 sub_806478C(struct Sprite *sprite) -{ - u8 v2; - s16 v5[3]; - u8 v6[3]; - - memcpy(v5, gUnknown_083761E6, 6); - memcpy(v6, gUnknown_083761EC, 3); - - v2 = 0; - - if (sprite->data4 && !(sprite->data6 & 1)) - Step1(sprite, sprite->data3); - - sprite->pos2.y = sub_80646C8(sprite->data6 >> v6[sprite->data4], sprite->data5); - - sprite->data6++; - - if (sprite->data6 == (v5[sprite->data4] >> 1)) - v2 = 1; - - if (sprite->data6 >= v5[sprite->data4]) - { - sprite->pos2.y = 0; - v2 = -1; - } - - return v2; -} - -void sub_8064820(struct Sprite *sprite, u16 a2) -{ - sprite->data3 = a2; -} - -bool8 sub_8064824(struct Sprite *sprite) -{ - sprite->data3--; - - if (sprite->data3 == 0) - return TRUE; - else - return FALSE; -} - -void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3) -{ - sprite->animNum = a2; - sprite->animPaused = 0 ; - SeekSpriteAnim(sprite, a3); -} - -bool8 sub_8064864(struct Sprite *sprite) -{ - if (sprite->animEnded) - return TRUE; - else - return FALSE; -} - -void sub_806487C(struct Sprite *sprite, bool8 invisible) -{ - u16 x, y; - s16 x2, y2; - - sprite->invisible = invisible; - - if (sprite->coordOffsetEnabled) - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } - else - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - } - - x2 = x - (sprite->centerToCornerVecX >> 1); - y2 = y - (sprite->centerToCornerVecY >> 1); - - if ((s16)x > 255 || x2 < -16) - sprite->invisible = 1; - if ((s16)y > 175 || y2 < -16) - sprite->invisible = 1; -} - -void sub_8064970(struct Sprite *sprite) -{ - SetObjectSubpriorityByZCoord(sprite->data1, sprite, 1); - sub_806487C(sprite, 0); -} - -void sub_8064990(u8 a1, u8 dir) -{ - u8 i; - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data0 == a1) - { - u8 animNum = FieldObjectDirectionToImageAnimId(dir); - StartSpriteAnim(sprite, animNum); - break; - } - } -} - -u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject) -{ - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); - return FieldEffectStart(fieldEffectId); -} - -void DoShadowFieldEffect(struct MapObject *mapObject) -{ - if (!mapObject->mapobj_bit_22) - { - mapObject->mapobj_bit_22 = 1; - oe_exec_and_other_stuff(3, mapObject); - } -} - -void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite) -{ - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - gUnknown_0202FF84[0] = sprite->pos1.x; - gUnknown_0202FF84[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2; - gUnknown_0202FF84[2] = 151; - gUnknown_0202FF84[3] = 3; - FieldEffectStart(5); -} diff --git a/src/field_message_box.c b/src/field_message_box.c deleted file mode 100644 index 35aac7ac9..000000000 --- a/src/field_message_box.c +++ /dev/null @@ -1,155 +0,0 @@ -#include "global.h" -#include "field_message_box.h" -#include "menu.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "text_window.h" - -static EWRAM_DATA struct Window gFieldMessageBoxWindow = {0}; - -static u8 sMessageBoxMode; - -static void Task_FieldMessageBox(u8 taskId); -static void CreateFieldMessageBoxTask(void); -static void DestroyFieldMessageBoxTask(void); -static void PrintFieldMessage(const u8 *message); -static void PrintFieldMessageFromStringVar4(void); - -void InitFieldMessageBox(void) -{ - sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; - SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); - InitWindowFromConfig(&gFieldMessageBoxWindow, &gWindowConfig_81E6CE4); -} - -static void Task_FieldMessageBox(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - switch (task->data[0]) - { - case 0: - LoadMessageBoxTiles(&gFieldMessageBoxWindow); - task->data[0]++; - break; - case 1: - DrawStandardMessageBox(&gFieldMessageBoxWindow); - task->data[0]++; - break; - case 2: - switch (sMessageBoxMode) - { - case FIELD_MESSAGE_BOX_NORMAL: - if (!sub_80035AC(&gFieldMessageBoxWindow)) - return; - break; - case FIELD_MESSAGE_BOX_AUTO_SCROLL: - if (!sub_8003778(&gFieldMessageBoxWindow)) - return; - break; - } - sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; - DestroyTask(taskId); - } -} - -static void CreateFieldMessageBoxTask(void) -{ - CreateTask(Task_FieldMessageBox, 80); -} - -static void DestroyFieldMessageBoxTask(void) -{ - u8 taskId = FindTaskIdByFunc(Task_FieldMessageBox); - if (taskId != 0xFF) - DestroyTask(taskId); -} - -bool8 ShowFieldMessage(const u8 *message) -{ - if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) - { - return FALSE; - } - else - { - PrintFieldMessage(message); - sMessageBoxMode = FIELD_MESSAGE_BOX_NORMAL; - return TRUE; - } -} - -bool8 ShowFieldAutoScrollMessage(const u8 *message) -{ - if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) - { - return FALSE; - } - else - { - sMessageBoxMode = FIELD_MESSAGE_BOX_AUTO_SCROLL; - PrintFieldMessage(message); - return TRUE; - } -} - -bool8 unref_sub_8064BB8(const u8 *message) -{ - sMessageBoxMode = FIELD_MESSAGE_BOX_AUTO_SCROLL; - PrintFieldMessage(message); - return TRUE; -} - -bool8 unref_sub_8064BD0(const u8 *message) -{ - if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) - { - return FALSE; - } - else - { - sMessageBoxMode = FIELD_MESSAGE_BOX_NORMAL; - PrintFieldMessageFromStringVar4(); - return TRUE; - } -} - -static void PrintFieldMessage(const u8 *message) -{ - StringExpandPlaceholders(gStringVar4, message); - sub_8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); - CreateFieldMessageBoxTask(); -} - -static void PrintFieldMessageFromStringVar4(void) -{ - sub_8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); - CreateFieldMessageBoxTask(); -} - -void HideFieldMessageBox(void) -{ - DestroyFieldMessageBoxTask(); - ClearStandardMessageBox(&gFieldMessageBoxWindow); - sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; -} - -u8 GetFieldMessageBoxMode(void) -{ - return sMessageBoxMode; -} - -bool8 IsFieldMessageBoxHidden(void) -{ - if (sMessageBoxMode == FIELD_MESSAGE_BOX_HIDDEN) - return TRUE; - else - return FALSE; -} - -void unref_sub_8064CA0(void) -{ - DestroyFieldMessageBoxTask(); - DrawStandardMessageBox(&gFieldMessageBoxWindow); - sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; -} diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c deleted file mode 100644 index 2a7b2f3e0..000000000 --- a/src/field_player_avatar.c +++ /dev/null @@ -1,1728 +0,0 @@ -#include "global.h" -#include "field_player_avatar.h" -#include "bike.h" -#include "event_data.h" -#include "field_effect.h" -#include "field_effect_helpers.h" -#include "field_ground_effect.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" -#include "fieldmap.h" -#include "main.h" -#include "map_object_constants.h" -#include "menu.h" -#include "metatile_behavior.h" -#include "party_menu.h" -#include "rng.h" -#include "rom4.h" -#include "rotating_gate.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "strings2.h" -#include "task.h" -#include "tv.h" -#include "wild_encounter.h" - -EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {0}; - -//Functions -static bool8 sub_8058854(struct MapObject *, u8); -static void npc_clear_strange_bits(struct MapObject *a); -static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c); -static void PlayerAllowForcedMovementIfMovingSameDirection(void); -static u8 TryDoMetatileBehaviorForcedMovement(void); -static u8 GetForcedMovementByMetatileBehavior(void); -static void MovePlayerNotOnBike(u8 a, u16 b); -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); -static u8 sub_8058F6C(s16 a, s16 b, u8 c); -static void check_acro_bike_metatile(int unused1, int unused2, u8 c, u8 *d); -static void DoPlayerAvatarTransition(void); -static bool8 player_is_anim_in_certain_ranges(void); -static bool8 sub_80592A4(void); -static bool8 PlayerIsAnimActive(void); -static bool8 PlayerCheckIfAnimFinishedOrInactive(void); -static void PlayerNotOnBikeCollide(u8 a); -static void PlayCollisionSoundIfNotFacingWarp(u8 a); -static void sub_8059D60(struct MapObject *a); -static void StartStrengthAnim(u8 a, u8 b); -static void sub_8059F94(void); -static void sub_805A06C(void); - -static bool8 (*const gUnknown_0830FB58[])(u8) = -{ - MetatileBehavior_IsTrickHouseSlipperyFloor, - MetatileBehavior_IsIce_2, - MetatileBehavior_IsWalkSouth, - MetatileBehavior_IsWalkNorth, - MetatileBehavior_IsWalkWest, - MetatileBehavior_IsWalkEast, - MetatileBehavior_IsSouthwardCurrent, - MetatileBehavior_IsNorthwardCurrent, - MetatileBehavior_IsWestwardCurrent, - MetatileBehavior_IsEastwardCurrent, - MetatileBehavior_IsSlideSouth, - MetatileBehavior_IsSlideNorth, - MetatileBehavior_IsSlideWest, - MetatileBehavior_IsSlideEast, - MetatileBehavior_IsWaterfall, - MetatileBehavior_0xBB, - MetatileBehavior_0xBC, - MetatileBehavior_IsMuddySlope, -}; -static u8 (*const gUnknown_0830FBA0[])(void) = -{ - ForcedMovement_None, - ForcedMovement_Slip, - ForcedMovement_Slip, - sub_8058AAC, - sub_8058AC4, - sub_8058ADC, - sub_8058AF4, - sub_8058B0C, - sub_8058B24, - sub_8058B3C, - sub_8058B54, - ForcedMovement_SlideSouth, - ForcedMovement_SlideNorth, - ForcedMovement_SlideWest, - ForcedMovement_SlideEast, - sub_8058B0C, - sub_8058C04, - sub_8058C10, - ForcedMovement_MuddySlope, -}; -static void (*const gUnknown_0830FBEC[])(u8, u16) = -{ - PlayerNotOnBikeNotMoving, - PlayerNotOnBikeTurningInPlace, - sub_8058D0C, -}; -static bool8 (*const gUnknown_0830FBF8[])(u8) = -{ - MetatileBehavior_IsBumpySlope, - MetatileBehavior_IsIsolatedVerticalRail, - MetatileBehavior_IsIsolatedHorizontalRail, - MetatileBehavior_IsVerticalRail, - MetatileBehavior_IsHorizontalRail, -}; -static const u8 gUnknown_0830FC0C[] = {9, 10, 11, 12, 13}; -static void (*const gUnknown_0830FC14[])(struct MapObject *) = -{ - PlayerAvatarTransition_Normal, - PlayerAvatarTransition_MachBike, - PlayerAvatarTransition_AcroBike, - PlayerAvatarTransition_Surfing, - PlayerAvatarTransition_Underwater, - sub_80591F4, - nullsub_49, - nullsub_49, -}; -static bool8 (*const gUnknown_0830FC34[])(u8) = -{ - MetatileBehavior_IsSouthArrowWarp, - MetatileBehavior_IsNorthArrowWarp, - MetatileBehavior_IsWestArrowWarp, - MetatileBehavior_IsEastArrowWarp, -}; -static const u8 sRivalAvatarGfxIds[][2] = -{ - {MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL, MAP_OBJ_GFX_RIVAL_MAY_NORMAL}, - {MAP_OBJ_GFX_RIVAL_BRENDAN_MACH_BIKE, MAP_OBJ_GFX_RIVAL_MAY_MACH_BIKE}, - {MAP_OBJ_GFX_RIVAL_BRENDAN_ACRO_BIKE, MAP_OBJ_GFX_RIVAL_MAY_ACRO_BIKE}, - {MAP_OBJ_GFX_RIVAL_BRENDAN_SURFING, MAP_OBJ_GFX_RIVAL_MAY_SURFING}, - {MAP_OBJ_GFX_BRENDAN_UNDERWATER, MAP_OBJ_GFX_MAY_UNDERWATER}, - {MAP_OBJ_GFX_RIVAL_BRENDAN_FIELD_MOVE, MAP_OBJ_GFX_RIVAL_MAY_FIELD_MOVE}, - {MAP_OBJ_GFX_BRENDAN_FISHING, MAP_OBJ_GFX_MAY_FISHING}, - {MAP_OBJ_GFX_BRENDAN_WATERING, MAP_OBJ_GFX_MAY_WATERING}, -}; -static const u8 sPlayerAvatarGfxIds[][2] = -{ - {MAP_OBJ_GFX_BRENDAN_NORMAL, MAP_OBJ_GFX_MAY_NORMAL}, - {MAP_OBJ_GFX_BRENDAN_MACH_BIKE, MAP_OBJ_GFX_MAY_MACH_BIKE}, - {MAP_OBJ_GFX_BRENDAN_ACRO_BIKE, MAP_OBJ_GFX_MAY_ACRO_BIKE}, - {MAP_OBJ_GFX_BRENDAN_SURFING, MAP_OBJ_GFX_MAY_SURFING}, - {MAP_OBJ_GFX_BRENDAN_UNDERWATER, MAP_OBJ_GFX_MAY_UNDERWATER}, - {MAP_OBJ_GFX_BRENDAN_FIELD_MOVE, MAP_OBJ_GFX_MAY_FIELD_MOVE}, - {MAP_OBJ_GFX_BRENDAN_FISHING, MAP_OBJ_GFX_MAY_FISHING}, - {MAP_OBJ_GFX_BRENDAN_WATERING, MAP_OBJ_GFX_MAY_WATERING}, -}; -static const u8 gUnknown_0830FC64[2][5][2] = -{ - //male - { - {MAP_OBJ_GFX_BRENDAN_NORMAL, 1}, - {MAP_OBJ_GFX_BRENDAN_MACH_BIKE, 2}, - {MAP_OBJ_GFX_BRENDAN_ACRO_BIKE, 4}, - {MAP_OBJ_GFX_BRENDAN_SURFING, 8}, - {MAP_OBJ_GFX_BRENDAN_UNDERWATER, 16}, - }, - //female - { - {MAP_OBJ_GFX_MAY_NORMAL, 1}, - {MAP_OBJ_GFX_MAY_MACH_BIKE, 2}, - {MAP_OBJ_GFX_MAY_ACRO_BIKE, 4}, - {MAP_OBJ_GFX_MAY_SURFING, 8}, - {MAP_OBJ_GFX_MAY_UNDERWATER, 16}, - } -}; -static bool8 (*const gUnknown_0830FC78[])(u8) = //Duplicate of gUnknown_0830FC34 -{ - MetatileBehavior_IsSouthArrowWarp, - MetatileBehavior_IsNorthArrowWarp, - MetatileBehavior_IsWestArrowWarp, - MetatileBehavior_IsEastArrowWarp, -}; -static u8 (*const gUnknown_0830FC88[])(struct Task *, struct MapObject *, struct MapObject *) = -{ - sub_8059E84, - sub_8059EA4, - sub_8059F40, -}; -static u8 (*const gUnknown_0830FC94[])(struct Task *, struct MapObject *) = -{ - sub_805A000, -}; -static u8 (*const gUnknown_0830FC98[])(struct Task *, struct MapObject *) = -{ - sub_805A0D8, - sub_805A100, - sub_805A178, - sub_805A1B8, -}; - -fieldmap_object_null_cb(sub_80587B4, sub_80587D8); - -void player_step(u8 direction, u16 newKeys, u16 heldKeys) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - sub_8059D60(playerMapObj); - if (gPlayerAvatar.unk6 == 0) - { - sub_80E5B38(newKeys, heldKeys); - if (!sub_8058854(playerMapObj, direction)) - { - npc_clear_strange_bits(playerMapObj); - DoPlayerAvatarTransition(); - if (TryDoMetatileBehaviorForcedMovement() == 0) - { - MovePlayerAvatarUsingKeypadInput(direction, newKeys, heldKeys); - PlayerAllowForcedMovementIfMovingSameDirection(); - } - } - } -} - -static bool8 sub_8058854(struct MapObject *playerMapObj, u8 direction) -{ - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerMapObj) - && !FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj)) - { - u8 specialAnim = FieldObjectGetSpecialAnim(playerMapObj); - - if (specialAnim > 24 && specialAnim < 29 && direction != DIR_NONE && playerMapObj->placeholder18 != direction) - { - FieldObjectClearAnim(playerMapObj); - return FALSE; - } - else - { - return TRUE; - } - } - return FALSE; -} - -static void npc_clear_strange_bits(struct MapObject *a) -{ - a->mapobj_bit_12 = 0; - a->mapobj_bit_10 = 0; - a->mapobj_bit_9 = 0; - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_DASH; -} - -static void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 heldKeys) -{ - if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) - || (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)) - MovePlayerOnBike(direction, newKeys, heldKeys); - else - MovePlayerNotOnBike(direction, heldKeys); -} - -static void PlayerAllowForcedMovementIfMovingSameDirection(void) -{ - if (gPlayerAvatar.running2 == 2) - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5; -} - -static u8 TryDoMetatileBehaviorForcedMovement(void) -{ - return gUnknown_0830FBA0[GetForcedMovementByMetatileBehavior()](); -} - -static u8 GetForcedMovementByMetatileBehavior(void) -{ - u8 i; - - if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_5)) - { - u8 r5 = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E; - - for (i = 0; i < 18; i++) - { - if (gUnknown_0830FB58[i](r5)) - return i + 1; - } - } - return 0; -} - -u8 ForcedMovement_None(void) -{ - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_6) - { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - playerMapObj->mapobj_bit_9 = 0; - playerMapObj->mapobj_bit_11 = 1; - FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_6; - } - return 0; -} - -static u8 DoForcedMovement(u8 direction, void (*b)(u8)) -{ - struct PlayerAvatar *playerAvatar = &gPlayerAvatar; - u8 collisionType = CheckForPlayerAvatarCollision(direction); - - playerAvatar->flags |= PLAYER_AVATAR_FLAG_6; - if (collisionType != 0) - { - ForcedMovement_None(); - if (collisionType <= 4) - { - return 0; - } - else - { - if (collisionType == COLLISION_LEDGE_JUMP) - PlayerJumpLedge(direction); - playerAvatar->flags |= PLAYER_AVATAR_FLAG_6; - playerAvatar->running2 = 2; - return 1; - } - } - else - { - playerAvatar->running2 = 2; - b(direction); - return 1; - } -} - -static u8 DoForcedMovementInCurrentDirection(void (*a)(u8)) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - playerMapObj->mapobj_bit_10 = 1; - return DoForcedMovement(playerMapObj->placeholder18, a); -} - -u8 ForcedMovement_Slip(void) -{ - return DoForcedMovementInCurrentDirection(sub_80593C4); -} - -u8 sub_8058AAC(void) -{ - return DoForcedMovement(1, PlayerGoSpeed0); -} - -u8 sub_8058AC4(void) -{ - return DoForcedMovement(2, PlayerGoSpeed0); -} - -u8 sub_8058ADC(void) -{ - return DoForcedMovement(3, PlayerGoSpeed0); -} - -u8 sub_8058AF4(void) -{ - return DoForcedMovement(4, PlayerGoSpeed0); -} - -u8 sub_8058B0C(void) -{ - return DoForcedMovement(1, npc_use_some_d2s); -} - -u8 sub_8058B24(void) -{ - return DoForcedMovement(2, npc_use_some_d2s); -} - -u8 sub_8058B3C(void) -{ - return DoForcedMovement(3, npc_use_some_d2s); -} - -u8 sub_8058B54(void) -{ - return DoForcedMovement(4, npc_use_some_d2s); -} - -static u8 ForcedMovement_Slide(u8 direction, void (*b)(u8)) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - playerMapObj->mapobj_bit_10 = 1; - playerMapObj->mapobj_bit_9 = 1; - return DoForcedMovement(direction, b); -} - -u8 ForcedMovement_SlideSouth(void) -{ - return ForcedMovement_Slide(1, sub_80593C4); -} - -u8 ForcedMovement_SlideNorth(void) -{ - return ForcedMovement_Slide(2, sub_80593C4); -} - -u8 ForcedMovement_SlideWest(void) -{ - return ForcedMovement_Slide(3, sub_80593C4); -} - -u8 ForcedMovement_SlideEast(void) -{ - return ForcedMovement_Slide(4, sub_80593C4); -} - -u8 sub_8058C04(void) -{ - sub_8059F94(); - return 1; -} - -u8 sub_8058C10(void) -{ - sub_805A06C(); - return 1; -} - -u8 ForcedMovement_MuddySlope(void) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (playerMapObj->placeholder18 != 2 || GetPlayerSpeed() <= 3) - { - sub_80E6010(0); - playerMapObj->mapobj_bit_9 = 1; - return DoForcedMovement(1, sub_80593C4); - } - else - { - return 0; - } -} - -static void MovePlayerNotOnBike(u8 direction, u16 heldKeys) -{ - gUnknown_0830FBEC[CheckMovementInputNotOnBike(direction)](direction, heldKeys); -} - -static u8 CheckMovementInputNotOnBike(u8 direction) -{ - if (direction == DIR_NONE) - { - gPlayerAvatar.running2 = 0; - return 0; - } - else if (direction != player_get_direction_upper_nybble() && gPlayerAvatar.running2 != 2) - { - gPlayerAvatar.running2 = 1; - return 1; - } - else - { - gPlayerAvatar.running2 = 2; - return 2; - } -} - -void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys) -{ - PlayerFaceDirection(player_get_direction_lower_nybble()); -} - -void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys) -{ - PlayerTurnInPlace(direction); -} - -void sub_8058D0C(u8 direction, u16 heldKeys) -{ - u8 r1 = CheckForPlayerAvatarCollision(direction); - - switch (r1) - { - case 6: - PlayerJumpLedge(direction); - return; - default: - if (r1 > 8 || r1 < 5) - PlayerNotOnBikeCollide(direction); - return; - case 0: - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - { - sub_80593C4(direction); - return; - } - if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_4) && (heldKeys & B_BUTTON) && FlagGet(SYS_B_DASH) - && IsRunningDisallowed(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) == 0) - { - sub_805940C(direction); - gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH; - } - else - { - PlayerGoSpeed0(direction); - } - } -} - -static u8 CheckForPlayerAvatarCollision(u8 direction) -{ - s16 x, y; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - x = playerMapObj->coords2.x; - y = playerMapObj->coords2.y; - MoveCoords(direction, &x, &y); - return CheckForFieldObjectCollision(playerMapObj, x, y, direction, MapGridGetMetatileBehaviorAt(x, y)); -} - -u8 CheckForFieldObjectCollision(struct MapObject *a, s16 x, s16 y, u8 direction, u8 e) -{ - u8 collision; - - collision = npc_block_way(a, x, y, direction); - if (collision == 3 && sub_8058EF0(x, y, direction)) - return 5; - if (ShouldJumpLedge(x, y, direction)) - { - IncrementGameStat(0x2B); - return COLLISION_LEDGE_JUMP; - } - if (collision == 4 && sub_8058F6C(x, y, direction)) - return 7; - - if (collision == 0) - { - if (CheckForRotatingGatePuzzleCollision(direction, x, y)) - return 8; - check_acro_bike_metatile(x, y, e, &collision); - } - return collision; -} - -static u8 sub_8058EF0(s16 a, s16 b, u8 c) -{ - if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - && MapGridGetZCoordAt(a, b) == 3 - && GetFieldObjectIdByXYZ(a, b, 3) == 16) - { - sub_805A20C(c); - return 1; - } - else - { - return 0; - } -} - -static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c) -{ - if (GetLedgeJumpDirection(a, b, c) != 0) - return 1; - else - return 0; -} - -static u8 sub_8058F6C(s16 a, s16 b, u8 c) -{ - if (FlagGet(SYS_USE_STRENGTH)) - { - u8 mapObjectId = GetFieldObjectIdByXY(a, b); - - if (mapObjectId != 16) - { - if (gMapObjects[mapObjectId].graphicsId == 0x57) - { - a = gMapObjects[mapObjectId].coords2.x; - b = gMapObjects[mapObjectId].coords2.y; - MoveCoords(c, &a, &b); - if (npc_block_way(&gMapObjects[mapObjectId], a, b, c) == 0 - && MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(a, b)) == 0) - { - StartStrengthAnim(mapObjectId, c); - return 1; - } - } - } - } - return 0; -} - -static void check_acro_bike_metatile(int unused1, int unused2, u8 c, u8 *d) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - if (gUnknown_0830FBF8[i](c)) - { - *d = gUnknown_0830FC0C[i]; - return; - } - } -} - -void SetPlayerAvatarTransitionFlags(u16 a) -{ - gPlayerAvatar.bike |= a; - DoPlayerAvatarTransition(); -} - -static void DoPlayerAvatarTransition(void) -{ - u8 i; - u32 flags = gPlayerAvatar.bike; - - if (flags != 0) - { - for (i = 0; i < 8; i++, flags >>= 1) - { -#ifdef NONMATCHING - if (flags & 1) - { - gUnknown_0830FC14[i](&gMapObjects[gPlayerAvatar.mapObjectId]); - } -#else - if (flags & 1) - { - register void (*const *funcs)(struct MapObject *) asm("r0") = gUnknown_0830FC14; - funcs[i](&gMapObjects[gPlayerAvatar.mapObjectId]); - } -#endif - } - gPlayerAvatar.bike = 0; - } -} - -void nullsub_49(struct MapObject *a) -{ -} - -void PlayerAvatarTransition_Normal(struct MapObject *a) -{ - sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(0)); - FieldObjectTurn(a, a->placeholder18); - SetPlayerAvatarStateMask(1); -} - -void PlayerAvatarTransition_MachBike(struct MapObject *a) -{ - sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(1)); - FieldObjectTurn(a, a->placeholder18); - SetPlayerAvatarStateMask(2); - BikeClearState(0, 0); -} - -void PlayerAvatarTransition_AcroBike(struct MapObject *a) -{ - sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(2)); - FieldObjectTurn(a, a->placeholder18); - SetPlayerAvatarStateMask(4); - BikeClearState(0, 0); - sub_80E6084(); -} - -void PlayerAvatarTransition_Surfing(struct MapObject *a) -{ - u8 unk; - - sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(3)); - FieldObjectTurn(a, a->placeholder18); - SetPlayerAvatarStateMask(8); - gUnknown_0202FF84[0] = a->coords2.x; - gUnknown_0202FF84[1] = a->coords2.y; - gUnknown_0202FF84[2] = gPlayerAvatar.mapObjectId; - unk = FieldEffectStart(8); - a->mapobj_unk_1A = unk; - sub_8127ED0(unk, 1); -} - -void PlayerAvatarTransition_Underwater(struct MapObject *a) -{ - sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(4)); - FieldObjectTurn(a, a->placeholder18); - SetPlayerAvatarStateMask(16); - a->mapobj_unk_1A = sub_8128124(a->spriteId); -} - -void sub_80591F4(struct MapObject *a) -{ - gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_5; -} - -void sub_8059204(void) -{ - gPlayerAvatar.running1 = 0; - if (PlayerIsAnimActive()) - { - if (!PlayerCheckIfAnimFinishedOrInactive()) - { - if (!player_is_anim_in_certain_ranges()) - gPlayerAvatar.running1 = 1; - } - else - { - if (!sub_80592A4()) - gPlayerAvatar.running1 = 2; - } - } -} - -static bool8 player_is_anim_in_certain_ranges(void) -{ - u8 unk = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C; - - if (unk < 4 - || (unk >= 16 && unk < 0x15) - || (unk >= 25 && unk < 41) - || (unk >= 98 && unk < 110) - || (unk >= 122 && unk < 126)) - return TRUE; - else - return FALSE; -} - -static bool8 sub_80592A4(void) -{ - if (player_is_anim_in_certain_ranges() && gPlayerAvatar.running2 != 1) - return TRUE; - else - return FALSE; -} - -static bool8 PlayerIsAnimActive(void) -{ - return FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(&gMapObjects[gPlayerAvatar.mapObjectId]); -} - -static bool8 PlayerCheckIfAnimFinishedOrInactive(void) -{ - return FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[gPlayerAvatar.mapObjectId]); -} - -static void player_set_x22(u8 a) -{ - gMapObjects[gPlayerAvatar.mapObjectId].animId = a; -} - -u8 player_get_x22(void) -{ - return gMapObjects[gPlayerAvatar.mapObjectId].animId; -} - -static void sub_8059348(u8 a) -{ - FieldObjectForceSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], a); -} - -void PlayerSetAnimId(u8 animId, u8 b) -{ - if (!PlayerIsAnimActive()) - { - player_set_x22(b); - FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], animId); - } -} - -void PlayerGoSpeed0(u8 a) -{ - PlayerSetAnimId(GetGoSpeed0AnimId(a), 2); -} - -void sub_80593C4(u8 a) -{ - PlayerSetAnimId(sub_8060744(a), 2); -} - -void npc_use_some_d2s(u8 a) -{ - PlayerSetAnimId(d2s_08064034(a), 2); -} - -void sub_80593F4(u8 a) -{ - PlayerSetAnimId(sub_806079C(a), 2); -} - -void sub_805940C(u8 a) -{ - PlayerSetAnimId(sub_80607F4(a), 2); -} - -void PlayerOnBikeCollide(u8 a) -{ - PlayCollisionSoundIfNotFacingWarp(a); - PlayerSetAnimId(GetStepInPlaceDelay16AnimId(a), 2); -} - -static void PlayerNotOnBikeCollide(u8 a) -{ - PlayCollisionSoundIfNotFacingWarp(a); - PlayerSetAnimId(GetStepInPlaceDelay32AnimId(a), 2); -} - -void PlayerFaceDirection(u8 direction) -{ - PlayerSetAnimId(GetFaceDirectionAnimId(direction), 1); -} - -void PlayerTurnInPlace(u8 direction) -{ - PlayerSetAnimId(GetStepInPlaceDelay8AnimId(direction), 1); -} - -void PlayerJumpLedge(u8 direction) -{ - PlaySE(SE_DANSA); - PlayerSetAnimId(GetJumpLedgeAnimId(direction), 8); -} - -void sub_80594C0(void) -{ - if (gPlayerAvatar.running1 == 2 || gPlayerAvatar.running1 == 0) - { - if (player_should_look_direction_be_enforced_upon_movement()) - sub_8059348(GetFaceDirectionAnimId(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_18)); - } -} - -void sub_8059504(u8 a) -{ - PlayerSetAnimId(sub_80609D8(a), 1); -} - -//normal to wheelie -void PlayerStartWheelie(u8 a) -{ - PlayerSetAnimId(sub_8060A04(a), 1); -} - -void sub_8059534(u8 a) -{ - PlayerSetAnimId(sub_8060A30(a), 1); -} - -void sub_805954C(u8 a) -{ - PlaySE(SE_JITE_PYOKO); - PlayerSetAnimId(sub_8060A5C(a), 1); -} - -void sub_8059570(u8 a) -{ - PlaySE(SE_JITE_PYOKO); - PlayerSetAnimId(sub_8060A88(a), 2); -} - -void sub_8059594(u8 a) -{ - PlaySE(SE_JITE_PYOKO); - PlayerSetAnimId(sub_8060AB4(a), 8); -} - -void sub_80595B8(u8 direction) -{ - PlaySE(SE_JITE_PYOKO); - PlayerSetAnimId(sub_8060878(direction), 1); -} - -void sub_80595DC(u8 direction) -{ - PlaySE(SE_WALL_HIT); - PlayerSetAnimId(sub_8060AE0(direction), 2); -} - -void sub_8059600(u8 a) -{ - PlayerSetAnimId(sub_8060B0C(a), 2); -} - -void sub_8059618(u8 a) -{ - PlayerSetAnimId(sub_8060B38(a), 2); -} - -void sub_8059630(u8 a) -{ - PlayerSetAnimId(sub_8060B64(a), 2); -} - -static void PlayCollisionSoundIfNotFacingWarp(u8 a) -{ - s16 x, y; - u8 unk = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E; - - if (!gUnknown_0830FC34[a - 1](unk)) - { - if (a == 2) - { - PlayerGetDestCoords(&x, &y); - MoveCoords(2, &x, &y); - if (MetatileBehavior_IsWarpDoor(MapGridGetMetatileBehaviorAt(x, y))) - return; - } - PlaySE(SE_WALL_HIT); - } -} - -void GetXYCoordsOneStepInFrontOfPlayer(s16 *x, s16 *y) -{ - *x = gMapObjects[gPlayerAvatar.mapObjectId].coords2.x; - *y = gMapObjects[gPlayerAvatar.mapObjectId].coords2.y; - MoveCoords(player_get_direction_lower_nybble(), x, y); -} - -void PlayerGetDestCoords(s16 *x, s16 *y) -{ - *x = gMapObjects[gPlayerAvatar.mapObjectId].coords2.x; - *y = gMapObjects[gPlayerAvatar.mapObjectId].coords2.y; -} - -u8 player_get_direction_lower_nybble(void) -{ - return gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_18; -} - -u8 player_get_direction_upper_nybble(void) -{ - return gMapObjects[gPlayerAvatar.mapObjectId].placeholder18; -} - -u8 PlayerGetZCoord(void) -{ - return gMapObjects[gPlayerAvatar.mapObjectId].elevation; -} - -void unref_sub_8059790(s16 a, s16 b) -{ - sub_805C058(&gMapObjects[gPlayerAvatar.mapObjectId], a, b); -} - -u8 TestPlayerAvatarFlags(u8 a) -{ - return gPlayerAvatar.flags & a; -} - -u8 sub_80597D0(void) -{ - return gPlayerAvatar.flags; -} - -u8 GetPlayerAvatarObjectId(void) -{ - return gPlayerAvatar.spriteId; -} - -void sub_80597E8(void) -{ - ForcedMovement_None(); -} - -void sub_80597F4(void) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - npc_clear_strange_bits(playerMapObj); - FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) - { - sub_80E6084(); - sub_80E6010(0); - } -} - -u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) -{ - return sRivalAvatarGfxIds[state][gender]; -} - -static u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) -{ - return sPlayerAvatarGfxIds[state][gender]; -} - -u8 GetPlayerAvatarGraphicsIdByStateId(u8 state) -{ - return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender); -} - -u8 unref_GetRivalAvatarGenderByGraphcsId(u8 gfxId) -{ - switch (gfxId) - { - case MAP_OBJ_GFX_RIVAL_MAY_NORMAL: - case MAP_OBJ_GFX_RIVAL_MAY_MACH_BIKE: - case MAP_OBJ_GFX_RIVAL_MAY_ACRO_BIKE: - case MAP_OBJ_GFX_RIVAL_MAY_SURFING: - case MAP_OBJ_GFX_RIVAL_MAY_FIELD_MOVE: - case MAP_OBJ_GFX_MAY_UNDERWATER: - case MAP_OBJ_GFX_MAY_FISHING: - case MAP_OBJ_GFX_MAY_WATERING: - return FEMALE; - default: - return MALE; - } -} - -u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId) -{ - switch (gfxId) - { - case MAP_OBJ_GFX_MAY_NORMAL: - case MAP_OBJ_GFX_MAY_MACH_BIKE: - case MAP_OBJ_GFX_MAY_ACRO_BIKE: - case MAP_OBJ_GFX_MAY_SURFING: - case MAP_OBJ_GFX_MAY_FIELD_MOVE: - case MAP_OBJ_GFX_MAY_UNDERWATER: - case MAP_OBJ_GFX_MAY_FISHING: - case MAP_OBJ_GFX_MAY_WATERING: - return FEMALE; - default: - return MALE; - } -} - -bool8 PartyHasMonWithSurf(void) -{ - u8 i; - - if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - { - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == 0) - break; - if (pokemon_has_move(&gPlayerParty[i], 0x39)) - return TRUE; - } - } - return FALSE; -} - -bool8 IsPlayerSurfingNorth(void) -{ - if (player_get_direction_upper_nybble() == DIR_NORTH && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - return TRUE; - else - return FALSE; -} - -bool8 IsPlayerFacingSurfableFishableWater(void) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - s16 x = playerMapObj->coords2.x; - s16 y = playerMapObj->coords2.y; - - MoveCoords(playerMapObj->mapobj_unk_18, &x, &y); - if (npc_block_way(playerMapObj, x, y, playerMapObj->mapobj_unk_18) == 3 && PlayerGetZCoord() == 3 - && MetatileBehavior_IsSurfableFishableWater(MapGridGetMetatileBehaviorAt(x, y))) - return TRUE; - else - return FALSE; -} - -void ClearPlayerAvatarInfo(void) -{ - //TODO: 0x24 should be the size of gPlayerAvatar - memset(&gPlayerAvatar, 0, sizeof(struct PlayerAvatar)); -} - -void SetPlayerAvatarStateMask(u8 a) -{ - gPlayerAvatar.flags &= 0xE0; - gPlayerAvatar.flags |= a; -} - -static u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 a, u8 gender) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - if (gUnknown_0830FC64[gender][i][0] == a) - return gUnknown_0830FC64[gender][i][1]; - } - return 1; -} - -u8 GetPlayerAvatarGraphicsIdByCurrentState(void) -{ - u8 i; - u8 r5 = gPlayerAvatar.flags; - - for (i = 0; i < 5; i++) - { - if (gUnknown_0830FC64[gPlayerAvatar.gender][i][1] & r5) - return gUnknown_0830FC64[gPlayerAvatar.gender][i][0]; - } - return 0; -} - -void SetPlayerAvatarExtraStateTransition(u8 a, u8 b) -{ - u8 unk = GetPlayerAvatarStateTransitionByGraphicsId(a, gPlayerAvatar.gender); - - gPlayerAvatar.bike |= unk | b; - DoPlayerAvatarTransition(); -} - -void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) -{ - struct MapObjectTemplate playerMapObjTemplate; - u8 mapObjectId; - struct MapObject *mapObject; - - playerMapObjTemplate.localId = 0xFF; - playerMapObjTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(0, gender); - playerMapObjTemplate.x = x - 7; - playerMapObjTemplate.y = y - 7; - playerMapObjTemplate.elevation = 0; - playerMapObjTemplate.movementType = 11; - playerMapObjTemplate.unkA_0 = 0; - playerMapObjTemplate.unkA_4 = 0; - playerMapObjTemplate.unkC = 0; - playerMapObjTemplate.unkE = 0; - playerMapObjTemplate.script = NULL; - playerMapObjTemplate.flagId = 0; - mapObjectId = SpawnSpecialFieldObject(&playerMapObjTemplate); - mapObject = &gMapObjects[mapObjectId]; - mapObject->mapobj_bit_16 = 1; - mapObject->mapobj_unk_1B = sub_8126B54(); - FieldObjectTurn(mapObject, direction); - ClearPlayerAvatarInfo(); - gPlayerAvatar.running2 = 0; - gPlayerAvatar.running1 = 0; - gPlayerAvatar.mapObjectId = mapObjectId; - gPlayerAvatar.spriteId = mapObject->spriteId; - gPlayerAvatar.gender = gender; - SetPlayerAvatarStateMask(0x21); -} - -void sub_8059B88(u8 a) -{ - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = a; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - gSprites[gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A].invisible = a; -} - -void sub_8059BF4(void) -{ - sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(5)); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], 0); -} - -void sub_8059C3C(u8 a) -{ - sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(6)); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDE8(a)); -} - -void sub_8059C94(u8 a) -{ - sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(2)); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FD98(a)); - SeekSpriteAnim(&gSprites[gPlayerAvatar.spriteId], 1); -} - -void sub_8059D08(u8 a) -{ - sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(7)); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], FieldObjectDirectionToImageAnimId(a)); -} - -static void sub_8059D60(struct MapObject *a) -{ - s16 x; - s16 y; - u8 r6; - u8 r8 = a->mapobj_unk_1E; - - for (x = 0, r6 = 1; x < 4; x++, r6++) - { - if (gUnknown_0830FC78[x](r8) && r6 == a->placeholder18) - { - x = a->coords2.x; - y = a->coords2.y; - MoveCoords(r6, &x, &y); - sub_8126BC4(a->mapobj_unk_1B, r6, x, y); - return; - } - } - objid_set_invisible(a->mapobj_unk_1B); -} - -/* Strength */ - -static void sub_8059E2C(u8 taskId); - -static void StartStrengthAnim(u8 a, u8 b) -{ - u8 taskId = CreateTask(sub_8059E2C, 0xFF); - - gTasks[taskId].data[1] = a; - gTasks[taskId].data[2] = b; - sub_8059E2C(taskId); -} - -static void sub_8059E2C(u8 taskId) -{ - while (gUnknown_0830FC88[gTasks[taskId].data[0]](&gTasks[taskId], - &gMapObjects[gPlayerAvatar.mapObjectId], - &gMapObjects[gTasks[taskId].data[1]])) - ; -} - -u8 sub_8059E84(struct Task *task, struct MapObject *b, struct MapObject *c) -{ - ScriptContext2_Enable(); - gPlayerAvatar.unk6 = 1; - task->data[0]++; - return 0; -} - -u8 sub_8059EA4(struct Task *task, struct MapObject *b, struct MapObject *c) -{ - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(b) - && !FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(c)) - { - FieldObjectClearAnimIfSpecialAnimFinished(b); - FieldObjectClearAnimIfSpecialAnimFinished(c); - FieldObjectSetSpecialAnim(b, GetStepInPlaceDelay16AnimId(task->data[2])); - FieldObjectSetSpecialAnim(c, GetSimpleGoAnimId(task->data[2])); - gUnknown_0202FF84[0] = c->coords2.x; - gUnknown_0202FF84[1] = c->coords2.y; - gUnknown_0202FF84[2] = c->elevation; - gUnknown_0202FF84[3] = gSprites[c->spriteId].oam.priority; - FieldEffectStart(10); - PlaySE(SE_W070); - task->data[0]++; - } - return 0; -} - -u8 sub_8059F40(struct Task *task, struct MapObject *b, struct MapObject *c) -{ - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(b) - && FieldObjectCheckIfSpecialAnimFinishedOrInactive(c)) - { - FieldObjectClearAnimIfSpecialAnimFinished(b); - FieldObjectClearAnimIfSpecialAnimFinished(c); - gPlayerAvatar.unk6 = 0; - ScriptContext2_Disable(); - DestroyTask(FindTaskIdByFunc(sub_8059E2C)); - } - return 0; -} - -/* Some field effect */ - -static void sub_8059FB4(u8 taskId); - -static void sub_8059F94(void) -{ - u8 taskId = CreateTask(sub_8059FB4, 0xFF); - - sub_8059FB4(taskId); -} - -static void sub_8059FB4(u8 taskId) -{ - while (gUnknown_0830FC94[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])) - ; -} - -u8 sub_805A000(struct Task *task, struct MapObject *mapObject) -{ - gPlayerAvatar.unk6 = 1; - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - PlaySE(SE_DANSA); - FieldObjectSetSpecialAnim(mapObject, sub_806084C(mapObject->mapobj_unk_18)); - task->data[1]++; - if (task->data[1] > 1) - { - gPlayerAvatar.unk6 = 0; - gPlayerAvatar.bike |= 0x20; - DestroyTask(FindTaskIdByFunc(sub_8059FB4)); - } - } - return 0; -} - -/* Some field effect */ - -static void sub_805A08C(u8 taskId); - -static void sub_805A06C(void) -{ - u8 taskId = CreateTask(sub_805A08C, 0xFF); - - sub_805A08C(taskId); -} - -static void sub_805A08C(u8 taskId) -{ - while (gUnknown_0830FC98[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])) - ; -} - -u8 sub_805A0D8(struct Task *task, struct MapObject *mapObject) -{ - task->data[0]++; - task->data[1] = mapObject->placeholder18; - gPlayerAvatar.unk6 = 1; - ScriptContext2_Enable(); - PlaySE(SE_TK_WARPIN); - return 1; -} - -u8 sub_805A100(struct Task *task, struct MapObject *mapObject) -{ - u8 directions[] = {DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; - - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - u8 direction; - - FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(direction = directions[mapObject->placeholder18 - 1])); - if (direction == (u8)task->data[1]) - task->data[2]++; - task->data[0]++; - if (task->data[2] > 3 && direction == GetOppositeDirection(task->data[1])) - task->data[0]++; - } - return 0; -} - -u8 sub_805A178(struct Task *task, struct MapObject *mapObject) -{ - const u8 arr[] = {16, 16, 17, 18, 19}; - - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - FieldObjectSetSpecialAnim(mapObject, arr[task->data[2]]); - task->data[0] = 1; - } - return 0; -} - -u8 sub_805A1B8(struct Task *task, struct MapObject *mapObject) -{ - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - FieldObjectSetSpecialAnim(mapObject, GetSimpleGoAnimId(GetOppositeDirection(task->data[1]))); - ScriptContext2_Disable(); - gPlayerAvatar.unk6 = 0; - DestroyTask(FindTaskIdByFunc(sub_805A08C)); - } - return 0; -} - -/* Some Field effect */ - -static void taskFF_0805D1D4(u8 taskId); -static void sub_805A2D0(u8 taskId); - -void sub_805A20C(u8 a) -{ - u8 taskId; - - ScriptContext2_Enable(); - sav1_reset_battle_music_maybe(); - sub_8053F84(); - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; - gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; - gPlayerAvatar.unk6 = 1; - taskId = CreateTask(taskFF_0805D1D4, 0xFF); - gTasks[taskId].data[0] = a; - taskFF_0805D1D4(taskId); -} - -static void taskFF_0805D1D4(u8 taskId) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerMapObj)) - { - if (!FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj)) - return; - } - sub_8127ED0(playerMapObj->mapobj_unk_1A, 2); - FieldObjectSetSpecialAnim(playerMapObj, sub_80608D0(gTasks[taskId].data[0])); - gTasks[taskId].func = sub_805A2D0; -} - -static void sub_805A2D0(u8 taskId) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj)) - { - sub_805B980(playerMapObj, GetPlayerAvatarGraphicsIdByStateId(0)); - FieldObjectSetSpecialAnim(playerMapObj, GetFaceDirectionAnimId(playerMapObj->mapobj_unk_18)); - gPlayerAvatar.unk6 = 0; - ScriptContext2_Disable(); - DestroySprite(&gSprites[playerMapObj->mapobj_unk_1A]); - DestroyTask(taskId); - } -} - -/* Fishing */ - -static u8 (*const gUnknown_0830FCB4[])(struct Task *) = -{ - Fishing1, - Fishing2, - Fishing3, - Fishing4, - Fishing5, - Fishing6, - Fishing7, - Fishing8, - Fishing9, - Fishing10, - Fishing11, - Fishing12, - Fishing13, - Fishing14, - Fishing15, - Fishing16, -}; - -static void Task_Fishing(u8 taskId); -static void sub_805A954(void); - -void StartFishing(u8 a) -{ - u8 taskId = CreateTask(Task_Fishing, 0xFF); - - gTasks[taskId].data[15] = a; - Task_Fishing(taskId); -} - -static void Task_Fishing(u8 taskId) -{ - while (gUnknown_0830FCB4[gTasks[taskId].data[0]](&gTasks[taskId])) - ; -} - -u8 Fishing1(struct Task *task) -{ - ScriptContext2_Enable(); - gPlayerAvatar.unk6 = 1; - task->data[0]++; - return 0; -} - -u8 Fishing2(struct Task *task) -{ - struct MapObject *playerMapObj; - const s16 arr1[] = {1, 1, 1}; - const s16 arr2[] = {1, 3, 6}; - - task->data[12] = 0; - task->data[13] = arr1[task->data[15]] + (Random() % arr2[task->data[15]]); - task->data[14] = gMapObjects[gPlayerAvatar.mapObjectId].graphicsId; - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - FieldObjectClearAnimIfSpecialAnimActive(playerMapObj); - playerMapObj->mapobj_bit_11 = 1; - sub_8059C3C(playerMapObj->mapobj_unk_18); - task->data[0]++; - return 0; -} - -u8 Fishing3(struct Task *task) -{ - sub_805A954(); - task->data[1]++; - if (task->data[1] > 0x3B) - task->data[0]++; - return 0; -} - -u8 Fishing4(struct Task *task) -{ - u32 randVal; - - MenuDisplayMessageBox(); - task->data[0]++; - task->data[1] = 0; - task->data[2] = 0; - randVal = Random(); - randVal %= 10; - task->data[3] = randVal + 1; - if (task->data[12] == 0) - task->data[3] = randVal + 4; - if (task->data[3] > 9) - task->data[3] = 10; - return 1; -} - -u8 Fishing5(struct Task *task) -{ - const u8 dot[] = _("·"); - - sub_805A954(); - task->data[1]++; - if (gMain.newKeys & A_BUTTON) - { - task->data[0] = 11; - if (task->data[12] != 0) - task->data[0] = 12; - return 1; - } - else - { - if (task->data[1] > 0x13) - { - task->data[1] = 0; - if (task->data[2] >= task->data[3]) - { - task->data[0]++; - if (task->data[12] != 0) - task->data[0]++; - task->data[12]++; - } - else - { - MenuPrint(dot, task->data[2] + 4, 15); - task->data[2]++; - } - } - return 0; - } -} - -u8 Fishing6(struct Task *task) -{ - sub_805A954(); - task->data[0]++; - if (!GetFishingWildMonListHeader() || (Random() & 1)) - task->data[0] = 11; - else - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FE08(player_get_direction_lower_nybble())); - return 1; -} - -u8 Fishing7(struct Task *task) -{ - sub_805A954(); - MenuPrint(gOtherText_OhABite, 4, 17); - task->data[0]++; - task->data[1] = 0; - return 0; -} - -u8 Fishing8(struct Task *task) -{ - const s16 arr[3] = {36, 33, 30}; - - sub_805A954(); - task->data[1]++; - if (task->data[1] >= arr[task->data[15]]) - task->data[0] = 12; - else if (gMain.newKeys & A_BUTTON) - task->data[0]++; - return 0; -} - -u8 Fishing9(struct Task *task) -{ - const s16 arr[][2] = - { - {0, 0}, - {40, 10}, - {70, 30} - }; - - sub_805A954(); - task->data[0]++; - if (task->data[12] < task->data[13]) - { - task->data[0] = 3; - } - else if (task->data[12] < 2) - { - s16 randVal = Random() % 100; - - if (arr[task->data[15]][task->data[12]] > randVal) - task->data[0] = 3; - } - return 0; -} - -u8 Fishing10(struct Task *task) -{ - sub_805A954(); - sub_8072044(gOtherText_PokeOnHook); - MenuDisplayMessageBox(); - task->data[0]++; - task->data[1] = 0; - return 0; -} - -u8 Fishing11(struct Task *task) -{ - if (task->data[1] == 0) - { - sub_805A954(); - if (task->data[1] == 0) - { - if (MenuUpdateWindowText()) - { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - sub_805B980(playerMapObj, task->data[14]); - FieldObjectTurn(playerMapObj, playerMapObj->placeholder18); - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0); - gSprites[gPlayerAvatar.spriteId].pos2.x = 0; - gSprites[gPlayerAvatar.spriteId].pos2.y = 0; - MenuZeroFillScreen(); - task->data[1]++; - return 0; - } - else - { - if (task->data[1] == 0) - return 0; - } - } - } - gPlayerAvatar.unk6 = 0; - ScriptContext2_Disable(); - FishingWildEncounter(task->data[15]); - sub_80BE97C(1); - DestroyTask(FindTaskIdByFunc(Task_Fishing)); - return 0; -} - -u8 Fishing12(struct Task *task) -{ - sub_805A954(); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDF8(player_get_direction_lower_nybble())); - sub_8072044(gOtherText_NotEvenANibble); - task->data[0] = 13; - return 1; -} - -u8 Fishing13(struct Task *task) -{ - sub_805A954(); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDF8(player_get_direction_lower_nybble())); - sub_8072044(gOtherText_ItGotAway); - task->data[0]++; - return 1; -} - -u8 Fishing14(struct Task *task) -{ - sub_805A954(); - MenuDisplayMessageBox(); - task->data[0]++; - return 0; -} - -u8 Fishing15(struct Task *task) -{ - sub_805A954(); - if (gSprites[gPlayerAvatar.spriteId].animEnded) - { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - sub_805B980(playerMapObj, task->data[14]); - FieldObjectTurn(playerMapObj, playerMapObj->placeholder18); - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0); - gSprites[gPlayerAvatar.spriteId].pos2.x = 0; - gSprites[gPlayerAvatar.spriteId].pos2.y = 0; - task->data[0]++; - } - return 0; -} - -u8 Fishing16(struct Task *task) -{ - if (MenuUpdateWindowText()) - { - gPlayerAvatar.unk6 = 0; - ScriptContext2_Disable(); - UnfreezeMapObjects(); - MenuZeroFillScreen(); - sub_80BE97C(0); - DestroyTask(FindTaskIdByFunc(Task_Fishing)); - } - return 0; -} - -static void sub_805A954(void) -{ - struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId]; - u8 animCmdIndex; - u8 animType; - - AnimateSprite(playerSprite); - playerSprite->pos2.x = 0; - playerSprite->pos2.y = 0; - animCmdIndex = playerSprite->animCmdIndex; - if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) - { - animCmdIndex--; - } - else - { - playerSprite->animDelayCounter++; - if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) - animCmdIndex--; - } - animType = playerSprite->anims[playerSprite->animNum][animCmdIndex].type; - if (animType == 1 || animType == 2 || animType == 3) - { - playerSprite->pos2.x = 8; - if (player_get_direction_lower_nybble() == 3) - playerSprite->pos2.x = -8; - } - if (animType == 5) - playerSprite->pos2.y = -8; - if (animType == 10 || animType == 11) - playerSprite->pos2.y = 8; - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 1, playerSprite->pos2.y); -} diff --git a/src/field_poison.c b/src/field_poison.c deleted file mode 100644 index 8c9e029e1..000000000 --- a/src/field_poison.c +++ /dev/null @@ -1,143 +0,0 @@ -#include "global.h" -#include "field_poison.h" -#include "field_message_box.h" -#include "fldeff_80C5CD4.h" -#include "pokemon.h" -#include "pokemon_summary_screen.h" -#include "script.h" -#include "string_util.h" -#include "task.h" -#include "text.h" - -extern u16 gScriptResult; -extern u8 fieldPoisonText_PokemonFainted[]; - -bool32 CheckMonIsValid(struct Pokemon *pkmn) -{ - // UB: Too few arguments for function 'GetMonData' - u16 species2 = GetMonData(pkmn, MON_DATA_SPECIES2); - - if (species2 == 0 || species2 == 0x19C) - return FALSE; - else - return TRUE; -} - -bool32 AllMonsFainted(void) -{ - struct Pokemon *pkmn = &gPlayerParty[0]; - int i; - - for (i = 0; i < 6; i++, pkmn++) - { - // UB: Too few arguments for function 'GetMonData' - if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) != 0) - return FALSE; - } - return TRUE; -} - -void MonFaintFromPoisonOnField(u8 partyMember) -{ - struct Pokemon *pkmn = &gPlayerParty[partyMember]; - u32 val = 0; - - AdjustFriendship(pkmn, 7); - SetMonData(pkmn, MON_DATA_STATUS, (u8*)&val); - GetMonData(pkmn, MON_DATA_NICKNAME, gStringVar1); - StringGetEnd10(gStringVar1); -} - -bool32 CheckMonFaintedFromPoison(u8 partyMember) -{ - struct Pokemon *pkmn = &gPlayerParty[partyMember]; - - // UB: Too few arguments for function 'GetMonData' - if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) == 0 - && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1) - return TRUE; - else - return FALSE; -} - -//Task data -enum -{ - TD_STATE, - TD_PARTY_MEMBER, -}; - -void Task_WhiteOut(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - switch (taskData[TD_STATE]) - { - case 0: //Check if Pokemon have fainted due to poison - while (taskData[TD_PARTY_MEMBER] < 6) - { - if (CheckMonFaintedFromPoison(taskData[TD_PARTY_MEMBER])) - { - MonFaintFromPoisonOnField(taskData[TD_PARTY_MEMBER]); - ShowFieldMessage(fieldPoisonText_PokemonFainted); - taskData[TD_STATE]++; - return; - } - taskData[TD_PARTY_MEMBER]++; - } - taskData[TD_STATE] = 2; - break; - case 1: //Wait for message box to disappear - if (IsFieldMessageBoxHidden()) - taskData[TD_STATE]--; //Check next party member - break; - case 2: //Done checking Pokemon - if (AllMonsFainted()) - gScriptResult = 1; - else - gScriptResult = 0; - EnableBothScriptContexts(); - DestroyTask(taskId); - break; - } -} - -void ExecuteWhiteOut(void) -{ - CreateTask(Task_WhiteOut, 0x50); - ScriptContext1_Stop(); -} - -s32 overworld_poison(void) -{ - struct Pokemon *pkmn = &gPlayerParty[0]; - u32 numPoisoned = 0; - u32 numFainting = 0; - int i; - - 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) - { - hp = GetMonData(pkmn, MON_DATA_HP); - if (hp != 0) - hp--; - if (hp == 0) - numFainting++; //Pokemon will now faint due to poison - SetMonData(pkmn, MON_DATA_HP, (u8 *)&hp); - numPoisoned++; - } - pkmn++; - } - if (numFainting != 0 || numPoisoned != 0) - DoFieldPoisonEffect(); - if (numFainting != 0) - return 2; - if (numPoisoned != 0) - return 1; - return 0; -} diff --git a/src/field_region_map.c b/src/field_region_map.c deleted file mode 100644 index 7cb22e5df..000000000 --- a/src/field_region_map.c +++ /dev/null @@ -1,125 +0,0 @@ -#include "global.h" -#include "field_region_map.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "region_map.h" -#include "sprite.h" -#include "strings2.h" -#include "text.h" - -struct RegionMapStruct -{ - u8 str[0x16]; - u8 unk16; - u8 filler[0x869]; -}; - -struct UnkStruct -{ - MainCallback callback; - u8 filler[4]; - // This should be RegionMap, but I can't do that because it overlaps unk888. - struct RegionMapStruct unk8; - u16 unk888; -}; - -extern u8 ewram[]; -#define unk_2000000 (*(struct UnkStruct *)(ewram)) - -void FieldInitRegionMap(MainCallback callback) -{ - SetVBlankCallback(NULL); - unk_2000000.unk888 = 0; - unk_2000000.callback = callback; - SetMainCallback2(CB2_FieldInitRegionMap); -} - -void CB2_FieldInitRegionMap(void) -{ - REG_DISPCNT = 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; - ResetSpriteData(); - FreeAllSpritePalettes(); - // TODO: remove this cast - InitRegionMap((void *)&unk_2000000.unk8, 0); - CreateRegionMapPlayerIcon(0, 0); - CreateRegionMapCursor(1, 1); - SetUpWindowConfig(&gWindowConfig_81E709C); - InitMenuWindow(&gWindowConfig_81E709C); - MenuZeroFillScreen(); - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - MenuDrawTextWindow(21, 0, 29, 3); - sub_8072BD8(gOtherText_Hoenn, 0x16, 1, 0x38); - MenuDrawTextWindow(16, 16, 29, 19); - sub_813F0C8(); - SetMainCallback2(CB2_FieldRegionMap); - SetVBlankCallback(VBlankCB_FieldRegionMap); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); -} - -void VBlankCB_FieldRegionMap(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void CB2_FieldRegionMap(void) -{ - sub_813EFDC(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void sub_813EFDC(void) -{ - switch (unk_2000000.unk888) - { - case 0: - REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - unk_2000000.unk888++; - break; - case 1: - if (!gPaletteFade.active) - unk_2000000.unk888++; - break; - case 2: - switch (sub_80FAB60()) - { - case 3: - sub_813F0C8(); - break; - case 4: - case 5: - unk_2000000.unk888++; - } - break; - case 3: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - unk_2000000.unk888++; - break; - case 4: - if (!gPaletteFade.active) - { - FreeRegionMapIconResources(); - SetMainCallback2(unk_2000000.callback); - } - break; - } -} - -void sub_813F0C8(void) -{ - MenuFillWindowRectWithBlankTile(17, 17, 28, 18); - if (unk_2000000.unk8.unk16) - MenuPrint(unk_2000000.unk8.str, 17, 17); -} diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c deleted file mode 100644 index 79913e1c5..000000000 --- a/src/field_screen_effect.c +++ /dev/null @@ -1,340 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "field_camera.h" -#include "menu.h" -#include "palette.h" -#include "rom4.h" -#include "script.h" -#include "task.h" -#include "text.h" -#include "unknown_task.h" - -struct UnknownStruct1 -{ - u8 filler0[0x14]; - u8 unk14; - u8 filler15[0xB]; -}; -extern struct UnknownStruct1 gUnknown_03004DC0; - -extern u16 gUnknown_03004DE0[][0x3C0]; - -const static u16 gUnknown_0839ACDC[] = { 0xC8, 0x48, 0x38, 0x28, 0x18, 0x0 }; - -const s32 gUnknown_0839ACE8 = 4; - -const static u32 gUnknown_0839ACEC[3] = -{ - REG_ADDR_WIN0H, - ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, - 1 -}; - -static void sub_808136C(u16 *dest, u32 a2, s32 a3, s32 a4) -{ - if (a2 <= 0xA0) - { - if (a3 < 0) - a3 = 0; - if (a3 > 255) - a3 = 255; - if (a4 < 0) - a4 = 0; - if (a4 > 255) - a4 = 255; - dest[a2] = (a3 << 8) | a4; - } -} - -static void sub_8081398(u16 *dest, s32 a2, s32 a3, s32 a4) -{ - s32 v1 = a4; - s32 v2 = a4; - s32 v3 = 0; - while (v1 >= v3) - { - sub_808136C(dest, a3 - v3, a2 - v1, a2 + v1); - sub_808136C(dest, a3 + v3, a2 - v1, a2 + v1); - sub_808136C(dest, a3 - v1, a2 - v3, a2 + v3); - sub_808136C(dest, a3 + v1, a2 - v3, a2 + v3); - v2 -= (v3 * 2) - 1; - v3++; - if (v2 < 0) - { - v2 += 2 * (v1 - 1); - v1--; - } - } -} - -static void sub_8081424(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.unk14][0], data[1], data[2], data[3]); - data[0] = 1; - break; - case 1: - sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.unk14][0], 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(); - data[0] = 2; - } - else - { - DestroyTask(taskId); - } - } - break; - case 2: - dp12_8087EA4(); - DestroyTask(taskId); - break; - } -} - -static void sub_80814E8(u8 taskId) -{ - if (!FuncIsActiveTask(sub_8081424)) - { - EnableBothScriptContexts(); - DestroyTask(taskId); - } -} - -static void sub_8081510(void) -{ - if (!FuncIsActiveTask(sub_80814E8)) - CreateTask(sub_80814E8, 80); -} - -static u8 sub_8081534(s32 a1, s32 a2, s32 a3, s32 a4, s32 a5, u8 a6) -{ - u8 taskId = CreateTask(sub_8081424, 80); - s16 *data = gTasks[taskId].data; - - data[3] = a3; - data[4] = a4; - data[1] = a1; - data[2] = a2; - data[6] = a5; - - if (a3 < a4) - data[5] = a6; - else - data[5] = -a6; - - return taskId; -} - -void sub_8081594(u8 a1) -{ - u8 index = sav1_get_flash_used_on_map(); - u8 value = 0; - if (!a1) - value = 1; - sub_8081534(120, 80, gUnknown_0839ACDC[index], gUnknown_0839ACDC[a1], value, 1); - sub_8081510(); - ScriptContext2_Enable(); -} - -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); - } -} - -static void sub_808161C(u8 a1) -{ - int i; - u16 color[1]; - - if (!a1) - color[0] = 0x1F; - else - color[0] = 0x7C00; - - for (i = 0; i < 16; i++) - { - LoadPalette(color, 0xF0 + i, 2); - } -} - -static bool8 sub_8081658(u16 a1) -{ - u8 lo = REG_BLDALPHA & 0xFF; - u8 hi = REG_BLDALPHA >> 8; - - if (a1) - { - if (lo) - { - lo--; - } - } - else - { - if (hi < 0x10) - { - hi++; - } - } - - REG_BLDALPHA = (hi << 8) | lo; - - if (lo == 0 && hi == 0x10) - { - return TRUE; - } - - return FALSE; -} - -static void sub_80816A8(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - data[6] = REG_DISPCNT; - data[7] = REG_BLDCNT; - data[8] = REG_BLDALPHA; - data[9] = REG_WININ; - data[10] = REG_WINOUT; - REG_DISPCNT &= 0xBFFF; - REG_BLDCNT |= gUnknown_081E29E8[0]; - 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]); - data[0] = 1; - break; - case 1: - MenuFillWindowRectWithBlankTile(0, 0, 29, 19); - sub_808161C(data[1]); - sub_8081534(data[2], data[3], 1, 160, 1, 2); - data[0] = 2; - break; - case 2: - if (!FuncIsActiveTask(sub_8081424)) - { - EnableBothScriptContexts(); - data[0] = 3; - } - break; - case 3: - InstallCameraPanAheadCallback(); - SetCameraPanningCallback(NULL); - data[5] = 0; - data[4] = 4; - data[0] = 4; - break; - case 4: - data[4]--; - if (!data[4]) - { - s32 panning; - data[4] = 4; - data[5] ^= 1; - if (data[5]) - panning = 4; - else - panning = -4; - SetCameraPanning(0, panning); - } - break; - case 6: - InstallCameraPanAheadCallback(); - data[4] = 8; - data[0] = 7; - break; - case 7: - data[4]--; - if (!data[4]) - { - data[4] = 8; - data[5] ^= 1; - if (sub_8081658(data[5]) == TRUE) - data[0] = 5; - } - break; - case 5: - MenuZeroFillWindowRect(0, 0, 29, 19); - LoadFontDefaultPalette(&gWindowConfig_81E6CE4); - REG_WIN0H = 255; - REG_DISPCNT = data[6]; - REG_BLDCNT = data[7]; - REG_BLDALPHA = data[8]; - REG_WININ = data[9]; - REG_WINOUT = data[10]; - EnableBothScriptContexts(); - DestroyTask(taskId); - break; - } -} - -void sub_80818A4(void) -{ - u8 taskId = CreateTask(sub_80816A8, 80); - s16 *data = gTasks[taskId].data; - - if (gScriptResult == 0) - { - data[1] = 0; - data[2] = 104; - } - else if (gScriptResult == 1) - { - data[1] = 1; - data[2] = 104; - } - else if (gScriptResult == 2) - { - data[1] = 0; - data[2] = 120; - } - else - { - data[1] = 1; - data[2] = 120; - } - - data[3] = 80; -} - -void sub_80818FC(void) -{ - u8 taskId = FindTaskIdByFunc(sub_80816A8); - gTasks[taskId].data[0] = 6; -} - -static void task50_0807F0C8(u8); - -void sub_8081924(void) -{ - sub_8054044(); - CreateTask(task50_0807F0C8, 80); -} - -static void task50_0807F0C8(u8 taskId) -{ - if (sub_8054034() == TRUE) - { - DestroyTask(taskId); - EnableBothScriptContexts(); - } -} diff --git a/src/field_special_scene.c b/src/field_special_scene.c deleted file mode 100644 index 82a7a13e3..000000000 --- a/src/field_special_scene.c +++ /dev/null @@ -1,349 +0,0 @@ -#include "global.h" -#include "field_special_scene.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_fadetransition.h" -#include "field_map_obj.h" -#include "field_specials.h" -#include "fieldmap.h" -#include "main.h" -#include "palette.h" -#include "rom4.h" -#include "script.h" -#include "script_movement.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" - -#define SECONDS(value) ((signed) (60.0 * value + 0.5)) - -// porthole states -enum -{ - INIT_PORTHOLE, - IDLE_CHECK, - EXECUTE_MOVEMENT, - EXIT_PORTHOLE, -}; - -extern s8 gTruckCamera_HorizontalTable[]; - -extern u8 gUnknown_083D295F[]; -extern u8 gUnknown_083D2961[]; - -s32 GetTruckCameraBobbingY(int a1) -{ - if (!(a1 % 120)) - return -1; - else if ((a1 % 10) <= 4) - return 1; - - return 0; -} - -s32 GetTruckBoxMovement(int a1) // for the box movement? -{ - if (!((a1 + 120) % 180)) - return -1; - - return 0; -} - -void Task_Truck1(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - s16 cameraYpan; - s16 box1 = 0; - s16 box2 = 0; - s16 box3 = 0; - u8 mapNum, mapGroup; - register s16 zero asm("r4"); - - box1 = GetTruckBoxMovement(data[0] + 30) * 4; // top box. - sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3, box1 + 3); - box2 = GetTruckBoxMovement(data[0]) * 2; // bottom left box. - sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 0, box2 - 3); - box3 = GetTruckBoxMovement(data[0]) * 4; // bottom right box. - mapNum = gSaveBlock1.location.mapNum; - mapGroup = gSaveBlock1.location.mapGroup; - zero = 0; - sub_805BD90(3, mapNum, mapGroup, -3, box3); - - if (++data[0] == SECONDS(500)) // this will never run - data[0] = zero; // reset the timer if it gets stuck. - - cameraYpan = GetTruckCameraBobbingY(data[0]); - SetCameraPanning(0, cameraYpan); -} - -void Task_Truck2(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - s16 cameraYpan; - s16 cameraXpan; - s16 box1; - s16 box2; - s16 box3; - - data[0]++; - data[2]++; - - if (data[0] > 5) - { - data[0] = 0; - data[1]++; - } - if ((u16)data[1] == 19) - { - DestroyTask(taskId); - } - else - { - if (gTruckCamera_HorizontalTable[data[1]] == 2) - gTasks[taskId].func = Task_Truck3; - - cameraXpan = gTruckCamera_HorizontalTable[data[1]]; - cameraYpan = GetTruckCameraBobbingY(data[2]); - SetCameraPanning(cameraXpan, cameraYpan); - box1 = GetTruckBoxMovement(data[2] + 30) * 4; - sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3 - cameraXpan, box1 + 3); - box2 = GetTruckBoxMovement(data[2]) * 2; - sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -cameraXpan, box2 - 3); - box3 = GetTruckBoxMovement(data[2]) * 4; - sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3 - cameraXpan, box3); - } -} - -void Task_Truck3(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - s16 cameraXpan; - s16 cameraYpan; - - data[0]++; - - if (data[0] > 5) - { - data[0] = 0; - data[1]++; - } - - if ((u16)data[1] == 19) - { - DestroyTask(taskId); - } - else - { - cameraXpan = gTruckCamera_HorizontalTable[data[1]]; - cameraYpan = 0; - SetCameraPanning(cameraXpan, 0); - sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3 - cameraXpan, cameraYpan + 3); - sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -cameraXpan, cameraYpan - 3); - sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3 - cameraXpan, cameraYpan); - } -} - -void Task_HandleTruckSequence(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - /* - Each case has a timer which is handled with data[1], incrementing - until it reaches the if function's condition, which sets the next task up. - */ - case 0: - data[1]++; - if (data[1] == SECONDS(1.5)) - { - SetCameraPanningCallback(0); - data[1] = 0; // reset the timer. - data[2] = CreateTask(Task_Truck1, 0xA); - data[0] = 1; // run the next case. - PlaySE(SE_TRACK_MOVE); - } - break; - case 1: - data[1]++; - if (data[1] == SECONDS(2.5)) - { - pal_fill_black(); - data[1] = 0; - data[0] = 2; - } - break; - case 2: - data[1]++; - if (!gPaletteFade.active && data[1] > SECONDS(5)) - { - data[1] = 0; - DestroyTask(data[2]); - data[3] = CreateTask(Task_Truck2, 0xA); - data[0] = 3; - PlaySE(SE_TRACK_STOP); - } - break; - case 3: - if (!gTasks[data[3]].isActive) // is Truck2 no longer active (is Truck3 active?) - { - InstallCameraPanAheadCallback(); - data[1] = 0; - data[0] = 4; - } - break; - case 4: - data[1]++; - if (data[1] == 90) - { - PlaySE(SE_TRACK_HAIK); - data[1] = 0; - data[0] = 5; - } - break; - case 5: - data[1]++; - if (data[1] == 120) - { - MapGridSetMetatileIdAt(11, 8, 520); - MapGridSetMetatileIdAt(11, 9, 528); - MapGridSetMetatileIdAt(11, 10, 536); - DrawWholeMapView(); - PlaySE(SE_TRACK_DOOR); - DestroyTask(taskId); - ScriptContext2_Disable(); - } - break; - } -} - -void ExecuteTruckSequence(void) -{ - MapGridSetMetatileIdAt(11, 8, 525); - MapGridSetMetatileIdAt(11, 9, 533); - MapGridSetMetatileIdAt(11, 10, 541); - DrawWholeMapView(); - ScriptContext2_Enable(); - CpuFastFill(0, gPlttBufferFaded, 0x400); - CreateTask(Task_HandleTruckSequence, 0xA); -} - -void EndTruckSequence(u8 taskId) -{ - if (!FuncIsActiveTask(Task_HandleTruckSequence)) - { - sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3, 3); - sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 0, -3); - sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3, 0); - } -} - -bool8 sub_80C7754(void) -{ - s8 mapGroup, mapNum; - s16 x, y; - - if (GetSSTidalLocation(&mapGroup, &mapNum, &x, &y)) - { - return FALSE; - } - else - { - warp1_set(mapGroup, mapNum, -1, x, y); - return TRUE; - } -} - -void Task_HandlePorthole(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - u16 *var = GetVarPointer(VAR_PORTHOLE); - struct WarpData *location = &gSaveBlock1.location; - - switch (data[0]) - { - case INIT_PORTHOLE: // finish fading before making porthole finish. - if (!gPaletteFade.active) - { - data[1] = 0; - data[0] = EXECUTE_MOVEMENT; // execute movement before checking if should be exited. strange? - } - break; - case IDLE_CHECK: // idle and move. - if (gMain.newKeys & A_BUTTON) - data[1] = 1; - if (!sub_80A212C(0xFF, location->mapNum, location->mapGroup)) - return; - if (CountSSTidalStep(1) == TRUE) - { - if (*var == 2) - *var = 9; - else - *var = 10; - data[0] = 3; - return; - } - data[0] = 2; - case EXECUTE_MOVEMENT: // execute movement. - if (data[1]) - { - data[0] = EXIT_PORTHOLE; // exit porthole. - return; - } - // run this once. - if (*var == 2) // which direction? - { - exec_movement(0xFF, location->mapNum, location->mapGroup, gUnknown_083D295F); - data[0] = IDLE_CHECK; // run case 1. - } - else - { - exec_movement(0xFF, location->mapNum, location->mapGroup, gUnknown_083D2961); - data[0] = IDLE_CHECK; // run case 1. - } - break; - case EXIT_PORTHOLE: // exit porthole. - FlagReset(0x4001); - FlagReset(0x4000); - copy_saved_warp2_bank_and_enter_x_to_warp1(0); - sp13E_warp_to_last_warp(); - DestroyTask(taskId); - break; - } -} - -void sub_80C78A0(void) -{ - u8 spriteId = AddPseudoFieldObject(0x8C, SpriteCallbackDummy, 112, 80, 0); - - gSprites[spriteId].coordOffsetEnabled = FALSE; - - if (VarGet(0x40B4) == 2) - { - StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(4)); - } - else - { - StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(3)); - } -} - -void sub_80C791C(void) -{ - sub_80C78A0(); - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = TRUE; - pal_fill_black(); - CreateTask(Task_HandlePorthole, 80); - ScriptContext2_Enable(); -} - -void sub_80C7958(void) -{ - FlagSet(SYS_CRUISE_MODE); - FlagSet(0x4001); - FlagSet(0x4000); - saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); - sub_80C7754(); - sub_8080F9C(); -} diff --git a/src/field_specials.c b/src/field_specials.c deleted file mode 100644 index 454bd8d96..000000000 --- a/src/field_specials.c +++ /dev/null @@ -1,2383 +0,0 @@ -#include "global.h" -#include "field_specials.h" -#include "diploma.h" -#include "fieldmap.h" -#include "event_data.h" -#include "battle_tower.h" -#include "field_map_obj.h" -#include "region_map.h" -#include "field_region_map.h" -#include "field_message_box.h" -#include "field_camera.h" -#include "field_player_avatar.h" -#include "main.h" -#include "map_constants.h" -#include "rom4.h" -#include "script.h" -#include "songs.h" -#include "string_util.h" -#include "strings.h" -#include "pokeblock.h" -#include "species.h" -#include "abilities.h" -#include "moves.h" -#include "text.h" -#include "wallclock.h" -#include "tv.h" -#include "rtc.h" -#include "link.h" -#include "songs.h" -#include "sound.h" -#include "menu.h" -#include "starter_choose.h" -#include "menu_helpers.h" -#include "battle_tower.h" -#include "field_weather.h" -#include "pokemon_summary_screen.h" -#include "rng.h" - -#if ENGLISH -#define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD -#elif GERMAN -#define CHAR_DECIMAL_SEPARATOR CHAR_COMMA -#endif - -extern struct WarpData gUnknown_020297F0; -extern u8 gBattleOutcome; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gScriptResult; - -EWRAM_DATA u8 gUnknown_02039250 = 0; -EWRAM_DATA u8 gUnknown_02039251 = 0; -EWRAM_DATA u32 gUnknown_02039254 = 0; -EWRAM_DATA u8 gUnknown_02039258 = 0; -EWRAM_DATA u8 gUnknown_02039259 = 0; -EWRAM_DATA u8 gUnknown_0203925A = 0; -EWRAM_DATA u8 gUnknown_0203925B = 0; -EWRAM_DATA u8 gUnknown_0203925C = 0; - -static void RecordCyclingRoadResults(u32, u8); - -static struct ElevatorMenu gUnknown_03000760[20]; - -void sub_810D6A4(void) { - SetMainCallback2(sub_8145D88); - ScriptContext2_Enable(); -} - -void sub_810D6B8(void) { - gMain.savedCallback = c2_exit_to_overworld_2_switch; - SetMainCallback2(CB2_ViewWallClock); - ScriptContext2_Enable(); -} - -void ResetCyclingRoadChallengeData(void) { - gUnknown_02039250 = 0; - gUnknown_02039251 = 0; - gUnknown_02039254 = 0; -} - -void BeginCyclingRoadChallenge(void) { - gUnknown_02039250 = 1; - gUnknown_02039251 = 0; - gUnknown_02039254 = gMain.vblankCounter1; -} - -u16 GetPlayerAvatarBike(void) { - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) - { - return 1; - } - - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) - { - return 2; - } - - return 0; -} - -void DetermineCyclingRoadResults(u32 arg0, u8 arg1) { - u8 result; - - if (arg1 <= 99) - { - ConvertIntToDecimalStringN(gStringVar1, arg1, STR_CONV_MODE_LEFT_ALIGN, 2); - StringAppend(gStringVar1, gOtherText_Times); - } - else - { - StringCopy(gStringVar1, gOtherText_99Times); - } - - if (arg0 < 3600) - { - ConvertIntToDecimalStringN(gStringVar2, arg0 / 60, STR_CONV_MODE_RIGHT_ALIGN, 2); - gStringVar2[2] = CHAR_DECIMAL_SEPARATOR; - ConvertIntToDecimalStringN(&gStringVar2[3], ((arg0 % 60) * 100) / 60, STR_CONV_MODE_LEADING_ZEROS, 2); - StringAppend(gStringVar2, gOtherText_Seconds); - } - else - { - StringCopy(gStringVar2, gOtherText_1Minute); - } - - result = 0; - if (arg1 == 0) - { - result = 5; - } - else if (arg1 < 4) - { - result = 4; - } - else if (arg1 < 10) - { - result = 3; - } - else if (arg1 < 20) - { - result = 2; - } - else if (arg1 < 100) - { - result = 1; - } - - if (arg0 / 60 <= 10) - { - result += 5; - } - else if (arg0 / 60 <= 15) - { - result += 4; - } - else if (arg0 / 60 <= 20) - { - result += 3; - } - else if (arg0 / 60 <= 40) - { - result += 2; - } - else if (arg0 / 60 < 60) - { - result += 1; - } - - - gScriptResult = result; -} - -void FinishCyclingRoadChallenge(void) { - const u32 time = gMain.vblankCounter1 - gUnknown_02039254; - - DetermineCyclingRoadResults(time, gUnknown_02039251); - RecordCyclingRoadResults(time, gUnknown_02039251); -} - -static void RecordCyclingRoadResults(u32 arg0, u8 arg1) { - u16 high = VarGet(0x4028); - u16 low = VarGet(0x4029); - u32 record = high + (low << 16); - - if (record > arg0 || record == 0) - { - VarSet(0x4028, arg0); - VarSet(0x4029, arg0 >> 16); - VarSet(0x4027, arg1); - } -} - -u16 GetRecordedCyclingRoadResults(void) { - u16 high = VarGet(0x4028); - u16 low = VarGet(0x4029); - u32 record = high + (low << 16); - - if (record == 0) - { - return FALSE; - } - - DetermineCyclingRoadResults(record, VarGet(0x4027)); - return TRUE; -} - -void UpdateCyclingRoadState(void) { - if (gUnknown_020297F0.mapNum == MAP_ID_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE && gUnknown_020297F0.mapGroup == MAP_GROUP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE) - { - return; - } - - if (VarGet(0x40a9) == 2 || VarGet(0x40a9) == 3) - { - VarSet(0x40a9, 0); - sav1_set_battle_music_maybe(SE_STOP); - } -} - -void SetSSTidalFlag(void) -{ - FlagSet(SYS_CRUISE_MODE); - *GetVarPointer(VAR_CRUISE_STEP_COUNT) = 0; -} - -void ResetSSTidalFlag(void) -{ - FlagReset(SYS_CRUISE_MODE); -} - -bool32 CountSSTidalStep(u16 delta) -{ - if (!FlagGet(SYS_CRUISE_MODE) || (*GetVarPointer(VAR_CRUISE_STEP_COUNT) += delta) <= 0xcc) - { - return FALSE; - } - return TRUE; -} - -u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y) -{ - u16 *varCruiseStepCount = GetVarPointer(VAR_CRUISE_STEP_COUNT); - switch (*GetVarPointer(VAR_PORTHOLE)) - { - case 1: - case 8: - return 1; - case 3: - case 9: - return 4; - case 4: - case 5: - return 2; - case 6: - case 10: - return 3; - case 2: - if (*varCruiseStepCount < 60) - { - *mapNum = MAP_ID_ROUTE134; - *x = *varCruiseStepCount + 19; - } - else if (*varCruiseStepCount < 140) - { - *mapNum = MAP_ID_ROUTE133; - *x = *varCruiseStepCount - 60; - } - else - { - *mapNum = MAP_ID_ROUTE132; - *x = *varCruiseStepCount - 140; - } - break; - case 7: - if (*varCruiseStepCount < 66) - { - *mapNum = MAP_ID_ROUTE132; - *x = 65 - *varCruiseStepCount; - } - else if (*varCruiseStepCount < 146) { - *mapNum = MAP_ID_ROUTE133; - *x = 145 - *varCruiseStepCount; - } - else - { - *mapNum = MAP_ID_ROUTE134; - *x = 224 - *varCruiseStepCount; - } - break; - } - *mapGroup = MAP_GROUP_ROUTE132; - *y = 20; - return 0; -} - -u8 GetLinkPartnerNames(void) -{ - u8 i; - u8 j = 0; - u8 myLinkPlayerNumber = sub_8008218(); - u8 nLinkPlayers = sub_800820C(); - for (i=0; i=0; i--) - { - MapGridSetMetatileIdAt(switchCoords->x, switchCoords->y, 0x206); - switchCoords++; - } - for (y=12; y<24; y++) - { - for (x=7; x<16; x++) - { - switch (MapGridGetMetatileIdAt(x, y)) - { - case 0x220: - MapGridSetMetatileIdAt(x, y, 0x230); - break; - case 0x221: - MapGridSetMetatileIdAt(x, y, 0x231); - break; - case 0x228: - MapGridSetMetatileIdAt(x, y, 0x238); - break; - case 0x229: - MapGridSetMetatileIdAt(x, y, 0x239); - break; - case 0x222: - MapGridSetMetatileIdAt(x, y, 0x232); - break; - case 0x223: - MapGridSetMetatileIdAt(x, y, 0x233); - break; - case 0x22a: - MapGridSetMetatileIdAt(x, y, 0x23a); - break; - case 0x22b: - MapGridSetMetatileIdAt(x, y, 0x23b); - break; - case 0x240: - MapGridSetMetatileIdAt(x, y, 0xe42); - break; - case 0x241: - MapGridSetMetatileIdAt(x, y, 0xe43); - break; - case 0x248: - case 0x249: - MapGridSetMetatileIdAt(x, y, 0x21a); - break; - case 0x250: - MapGridSetMetatileIdAt(x, y, 0x251); - break; - } - } - } -} - -static void Task_PetalburgGym(u8); -static void PetalburgGymFunc(u8, u16); -const u8 gUnknown_083F8370[] = {0, 1, 1, 1, 1}; -const u16 gUnknown_083F8376[] = {0x218, 0x219, 0x21a, 0x21b, 0x21c}; - -void PetalburgGymSpecial1(void) -{ - gUnknown_02039258 = 0; - gUnknown_02039259 = 0; - PlaySE(SE_KI_GASYAN); - CreateTask(Task_PetalburgGym, 8); -} - -static void Task_PetalburgGym(u8 taskId) -{ - if (gUnknown_083F8370[gUnknown_02039259] == gUnknown_02039258) - { - PetalburgGymFunc(gSpecialVar_0x8004, gUnknown_083F8376[gUnknown_02039259]); - gUnknown_02039258 = 0; - if ((++gUnknown_02039259) == 5) - { - DestroyTask(taskId); - EnableBothScriptContexts(); - } - } - else - { - gUnknown_02039258++; - } -} - -static void PetalburgGymFunc(u8 a0, u16 a1) -{ - u16 x[4]; - u16 y[4]; - u8 i; - u8 nDoors = 0; - switch (a0) - { - case 1: - nDoors = 2; - x[0] = 1; - x[1] = 7; - y[0] = 0x68; - y[1] = 0x68; - break; - case 2: - nDoors = 2; - x[0] = 1; - x[1] = 7; - y[0] = 0x4e; - y[1] = 0x4e; - break; - case 3: - nDoors = 2; - x[0] = 1; - x[1] = 7; - y[0] = 0x5b; - y[1] = 0x5b; - break; - case 4: - nDoors = 1; - x[0] = 7; - y[0] = 0x27; - break; - case 5: - nDoors = 2; - x[0] = 1; - x[1] = 7; - y[0] = 0x34; - y[1] = 0x34; - break; - case 6: - nDoors = 1; - x[0] = 1; - y[0] = 0x41; - break; - case 7: - nDoors = 1; - x[0] = 7; - y[0] = 0xd; - break; - case 8: - nDoors = 1; - x[0] = 1; - y[0] = 0x1a; - break; - } - for (i=0; i 9999) - { - weekCount = 9999; - } - return weekCount; -} - -u8 GetLeadMonFriendshipScore(void) -{ - struct Pokemon *pokemon = &gPlayerParty[GetLeadMonIndex()]; - if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255) - { - return 6; - } - if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 200) - { - return 5; - } - if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 150) - { - return 4; - } - if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 100) - { - return 3; - } - if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 50) - { - return 2; - } - if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 1) - { - return 1; - } - return 0; -} - -void CB2_FieldShowRegionMap(void) -{ - FieldInitRegionMap(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -void FieldShowRegionMap(void) -{ - SetMainCallback2(CB2_FieldShowRegionMap); -} - -static void Task_PCTurnOnEffect(u8); -static void PCTurnOffEffect_0(struct Task *); -static void PCTurnOffEffect_1(s16, s8, s8); -static void PCTurnOffEffect(void); - -void DoPCTurnOnEffect(void) -{ - if (FuncIsActiveTask(Task_PCTurnOnEffect) != TRUE) - { - u8 taskId = CreateTask(Task_PCTurnOnEffect, 8); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = taskId; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = 0; - } -} - -static void Task_PCTurnOnEffect(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - if (task->data[0] == 0) - { - PCTurnOffEffect_0(task); - } -} - -static void PCTurnOffEffect_0(struct Task *task) -{ - u8 playerDirectionLowerNybble; - s8 dx = 0; - s8 dy = 0; - if (task->data[3] == 6) - { - task->data[3] = 0; - playerDirectionLowerNybble = player_get_direction_lower_nybble(); - switch (playerDirectionLowerNybble) - { - case DIR_NORTH: - dx = 0; - dy = -1; - break; - case DIR_WEST: - dx = -1; - dy = -1; - break; - case DIR_EAST: - dx = 1; - dy = -1; - break; - } - PCTurnOffEffect_1(task->data[4], dx, dy); - DrawWholeMapView(); - task->data[4] ^= 1; - if ((++task->data[2]) == 5) - { - DestroyTask(task->data[1]); - } - } - task->data[3]++; -} - -static void PCTurnOffEffect_1(s16 flag, s8 dx, s8 dy) -{ - u16 tileId = 0; - if (flag != 0) - { - if (gSpecialVar_0x8004 == 0) - { - tileId = 0x4; - } - else if (gSpecialVar_0x8004 == 1) - { - tileId = 0x25a; - } - else if (gSpecialVar_0x8004 == 2) - { - tileId = 0x259; - } - } - else - { - if (gSpecialVar_0x8004 == 0) - { - tileId = 0x5; - } - else if (gSpecialVar_0x8004 == 1) - { - tileId = 0x27f; - } - else if (gSpecialVar_0x8004 == 2) - { - tileId = 0x27e; - } - } - MapGridSetMetatileIdAt(gSaveBlock1.pos.x + dx + 7, gSaveBlock1.pos.y + dy + 7, tileId | 0xc00); -} - -void DoPCTurnOffEffect(void) -{ - PCTurnOffEffect(); -} - -static void PCTurnOffEffect(void) -{ - s8 dx = 0; - s8 dy = 0; - u16 tileId = 0; - u8 playerDirectionLowerNybble = player_get_direction_lower_nybble(); - switch (playerDirectionLowerNybble) - { - case DIR_NORTH: - dx = 0; - dy = -1; - break; - case DIR_WEST: - dx = -1; - dy = -1; - break; - case DIR_EAST: - dx = 1; - dy = -1; - break; - } - if (gSpecialVar_0x8004 == 0) - { - tileId = 0x4; - } - else if (gSpecialVar_0x8004 == 1) - { - tileId = 0x25a; - } - else if (gSpecialVar_0x8004 == 2) - { - tileId = 0x259; - } - MapGridSetMetatileIdAt(gSaveBlock1.pos.x + dx + 7, gSaveBlock1.pos.y + dy + 7, tileId | 0xc00); - DrawWholeMapView(); -} - -static void Task_LotteryCornerComputerEffect(u8); -static void LotteryCornerComputerEffect(struct Task *); - -void DoLotteryCornerComputerEffect(void) -{ - if (FuncIsActiveTask(Task_LotteryCornerComputerEffect) != TRUE) - { - u8 taskId = CreateTask(Task_LotteryCornerComputerEffect, 8); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = taskId; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = 0; - } -} - -static void Task_LotteryCornerComputerEffect(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - if (task->data[0] == 0) - { - LotteryCornerComputerEffect(task); - } -} - -static void LotteryCornerComputerEffect(struct Task *task) -{ - if (task->data[3] == 6) - { - task->data[3] = 0; - if (task->data[4] != 0) - { - MapGridSetMetatileIdAt(18, 8, 0xe9d); - MapGridSetMetatileIdAt(18, 9, 0xea5); - } - else - { - MapGridSetMetatileIdAt(18, 8, 0xe58); - MapGridSetMetatileIdAt(18, 9, 0xe60); - } - DrawWholeMapView(); - task->data[4] ^= 1; - if ((++task->data[2]) == 5) - { - DestroyTask(task->data[1]); - } - } - task->data[3]++; -} - -void EndLotteryCornerComputerEffect(void) -{ - MapGridSetMetatileIdAt(18, 8, 0xe9d); - MapGridSetMetatileIdAt(18, 9, 0xea5); - DrawWholeMapView(); -} - -static void sub_810E874(void); -void sub_810E944(void); -void sub_810E984(u8); -bool8 sub_810EAC8(u8, u8); -void sub_810EB90(u8, u8); -void sub_810EBEC(void); -void sub_810EC34(u8); -void sub_810EC9C(u8); -void sub_810ECB0(void); -void sub_810ECD4(void); -void sub_810ECFC(void); -void sub_810ED40(u8); -void sub_810ED60(struct Task *); -void sub_810EEDC(void); - -const u8 *const gUnknown_083F8380[] = { - OtherText_1F, - OtherText_2F, - OtherText_3F, - OtherText_4F, - OtherText_5F, - OtherText_6F, - OtherText_7F, - OtherText_8F, - OtherText_9F, - OtherText_10F, - OtherText_11F, - OtherText_B1F, - OtherText_B2F, - OtherText_B3F, - OtherText_B4F, - OtherText_Rooftop -}; - -void SetDepartmentStoreFloorVar(void) -{ - u8 deptStoreFloor; - switch (gSaveBlock1.warp2.mapNum) - { - case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_1F: - deptStoreFloor = 0; - break; - case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_2F: - deptStoreFloor = 1; - break; - case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_3F: - deptStoreFloor = 2; - break; - case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_4F: - deptStoreFloor = 3; - break; - case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_5F: - deptStoreFloor = 4; - break; - case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP: - deptStoreFloor = 15; - break; - default: - deptStoreFloor = 0; - break; - } - VarSet(VAR_DEPT_STORE_FLOOR, deptStoreFloor); -} - -void ScriptAddElevatorMenuItem(u8 a0, u8 a1, u8 a2, u8 a3) -{ - u8 i; - if (gSpecialVar_0x8004 == 0) - { - for (i=0; i<20; i++) - { - gUnknown_03000760[i].var0 = 16; - } - } - gUnknown_03000760[gSpecialVar_0x8004].var0 = a0; - gUnknown_03000760[gSpecialVar_0x8004].var1 = a1; - gUnknown_03000760[gSpecialVar_0x8004].var2 = a2; - gUnknown_03000760[gSpecialVar_0x8004].var3 = a3; - gSpecialVar_0x8004++; -} - -void ScriptShowElevatorMenu(void) -{ - u8 i = 0; - gUnknown_0203925A = 0; - gUnknown_0203925B = 0; - ScriptAddElevatorMenuItem(16, 0, 0, 0); - while (gUnknown_03000760[i].var0 != 16) - { - gUnknown_0203925A++; - i++; - } - sub_810E874(); -} - -static void sub_810E874(void) -{ - u8 i; - ScriptContext2_Enable(); - if (gUnknown_0203925A > 5) - { - MenuDrawTextWindow(0, 0, 8, 11); - InitMenu(0, 1, 1, 5, 0, 7); - gUnknown_0203925C = 0; - sub_80F944C(); - LoadScrollIndicatorPalette(); - sub_810ECD4(); - } - else - { - MenuDrawTextWindow(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); - } - sub_810E944(); - CreateTask(sub_810E984, 8); -} - -void sub_810E944(void) -{ - MenuDrawTextWindow(20, 0, 29, 5); - sub_8072BD8(gOtherText_NowOn, 21, 1, 64); - sub_8072BD8(gUnknown_083F8380[gSpecialVar_0x8005], 21, 3, 64); -} - -void sub_810E984(u8 taskId) -{ - u8 curMenuPos; - if (gMain.newKeys == DPAD_UP && gUnknown_0203925B != 0) - { - gUnknown_0203925B--; - curMenuPos = GetMenuCursorPos(); - MoveMenuCursorNoWrap(-1); - sub_810EAC8(curMenuPos, DPAD_UP); - } - if (gMain.newKeys == DPAD_DOWN && gUnknown_0203925B != gUnknown_0203925A - 1) - { - gUnknown_0203925B++; - curMenuPos = GetMenuCursorPos(); - MoveMenuCursorNoWrap(+1); - sub_810EAC8(curMenuPos, DPAD_DOWN); - } - if (gMain.newKeys & A_BUTTON) - { - saved_warp2_set_2(0, gUnknown_03000760[gUnknown_0203925B].var1, gUnknown_03000760[gUnknown_0203925B].var2, -1, 2, 1); - if (gSpecialVar_0x8005 == gUnknown_0203925B) - { - gScriptResult = 0; - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(0, 0, 29, 12); - sub_810EC9C(taskId); - } - else - { - gScriptResult = 1; - gSpecialVar_0x8005 = gUnknown_0203925B; - sub_810EBEC(); - FieldObjectTurnByLocalIdAndMap(gScriptLastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, DIR_SOUTH); - sub_810EEDC(); - MenuZeroFillScreen(); - DestroyTask(taskId); - } - } - else if (gMain.newKeys & B_BUTTON) - { - gScriptResult = 0; - PlaySE(SE_SELECT); - sub_810EEDC(); - MenuZeroFillWindowRect(0, 0, 29, 12); - sub_810EC9C(taskId); - } -} - -// This function, as written, swaps the roles of r4 and r5 throughout. -#ifdef NONMATCHING -bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) -{ - u8 i; - bool8 flag = 0; - u8 newPos = 0; - if (gUnknown_0203925A < 5) - { - return FALSE; - } - if (dpadInput == DPAD_UP) - { - if (prevMenuPos == 0) - { - newPos = gUnknown_0203925B; - flag = 1; - } - } - else if (dpadInput == DPAD_DOWN) - { - if (prevMenuPos == 4) - { - newPos = gUnknown_0203925B - 4; - flag = 1; - } - } - if (flag) - { - sub_810EB90(newPos, 5); - MenuFillWindowRectWithBlankTile(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); - } - } - return flag; -} -#else -__attribute__((naked)) -bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r8\n" - "\tpush {r7}\n" - "\tlsls r0, 24\n" - "\tlsrs r2, r0, 24\n" - "\tadds r5, r2, 0\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tadds r3, r1, 0\n" - "\tmovs r7, 0\n" - "\tmovs r4, 0\n" - "\tldr r0, _0810EAEC @ =gUnknown_0203925A\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0x4\n" - "\tbhi _0810EAF0\n" - "\tmovs r0, 0\n" - "\tb _0810EB78\n" - "\t.align 2, 0\n" - "_0810EAEC: .4byte gUnknown_0203925A\n" - "_0810EAF0:\n" - "\tcmp r1, 0x40\n" - "\tbne _0810EB04\n" - "\tcmp r2, 0\n" - "\tbne _0810EB18\n" - "\tldr r0, _0810EB00 @ =gUnknown_0203925B\n" - "\tldrb r4, [r0]\n" - "\tmovs r7, 0x1\n" - "\tb _0810EB1C\n" - "\t.align 2, 0\n" - "_0810EB00: .4byte gUnknown_0203925B\n" - "_0810EB04:\n" - "\tcmp r3, 0x80\n" - "\tbne _0810EB18\n" - "\tcmp r5, 0x4\n" - "\tbne _0810EB18\n" - "\tldr r0, _0810EB84 @ =gUnknown_0203925B\n" - "\tldrb r0, [r0]\n" - "\tsubs r0, 0x4\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tmovs r7, 0x1\n" - "_0810EB18:\n" - "\tcmp r7, 0\n" - "\tbeq _0810EB76\n" - "_0810EB1C:\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0x5\n" - "\tbl sub_810EB90\n" - "\tmovs r0, 0x2\n" - "\tmovs r1, 0x1\n" - "\tmovs r2, 0x7\n" - "\tmovs r3, 0xA\n" - "\tbl MenuFillWindowRectWithBlankTile\n" - "\tmovs r5, 0\n" - "\tldr r2, _0810EB88 @ =gUnknown_03000760\n" - "\tlsls r1, r4, 2\n" - "\tadds r0, r1, r2\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0x10\n" - "\tbeq _0810EB76\n" - "\tldr r0, _0810EB8C @ =gUnknown_083F8380\n" - "\tmov r8, r0\n" - "\tadds r6, r2, 0\n" - "_0810EB44:\n" - "\tadds r0, r1, r6\n" - "\tldrb r0, [r0]\n" - "\tlsls r0, 2\n" - "\tadd r0, r8\n" - "\tldr r0, [r0]\n" - "\tlsls r2, r5, 1\n" - "\tadds r2, 0x1\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tmovs r1, 0x1\n" - "\tbl MenuPrint\n" - "\tadds r0, r4, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tcmp r5, 0x4\n" - "\tbhi _0810EB76\n" - "\tlsls r1, r4, 2\n" - "\tadds r0, r1, r6\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0x10\n" - "\tbne _0810EB44\n" - "_0810EB76:\n" - "\tadds r0, r7, 0\n" - "_0810EB78:\n" - "\tpop {r3}\n" - "\tmov r8, r3\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1\n" - "\t.align 2, 0\n" - "_0810EB84: .4byte gUnknown_0203925B\n" - "_0810EB88: .4byte gUnknown_03000760\n" - "_0810EB8C: .4byte gUnknown_083F8380"); -} -#endif - -void sub_810EB90(u8 newPos, u8 maxItems) -{ - if (newPos == 0) - { - gUnknown_0203925C ^= 0x02; - DestroyVerticalScrollIndicator(0); - } - else - { - sub_810ECB0(); - } - if (newPos + maxItems < gUnknown_0203925A) - { - sub_810ECD4(); - } - else if (newPos + maxItems == gUnknown_0203925A) - { - gUnknown_0203925C ^= 0x01; - DestroyVerticalScrollIndicator(1); - } -} - -void sub_810EBEC(void) -{ - u8 taskId = CreateTask(sub_810EC34, 9); - gTasks[taskId].data[0] = 1; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = 1; - gTasks[taskId].data[5] = 3; - SetCameraPanningCallback(NULL); - sub_810ECFC(); - PlaySE(SE_ELEBETA); -} - -void sub_810EC34(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - task->data[1] ++; - if (task->data[1] % task->data[5] == 0) - { - task->data[1] = 0; - task->data[2] ++; - if (task->data[3] == 0) - { - task->data[4] = -task->data[4]; - SetCameraPanning(0, task->data[4]); - if (task->data[2] == 23) - { - PlaySE(SE_PINPON); - sub_810EC9C(taskId); - InstallCameraPanAheadCallback(); - } - } - } -} - -void sub_810EC9C(u8 taskId) -{ - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -void sub_810ECB0(void) -{ - if (gUnknown_0203925C >> 1 != 1) - { - gUnknown_0203925C |= 0x2; - CreateVerticalScrollIndicators(0, 0x24, 0x08); - } -} - -void sub_810ECD4(void) -{ - if ((gUnknown_0203925C & 1) == 0) - { - gUnknown_0203925C |= 0x1; - CreateVerticalScrollIndicators(1, 0x24, 0x48); - } -} - -void sub_810ECFC(void) -{ - if (FuncIsActiveTask(sub_810ED40) != TRUE) - { - u8 taskId = CreateTask(sub_810ED40, 8); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = taskId; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = 0; - } -} - -void sub_810ED40(u8 taskId) -{ - sub_810ED60(&gTasks[taskId]); -} - -void sub_810ED60(struct Task *task) -{ - if (task->data[3] == 8) - { - task->data[3] = 0; - if (task->data[4] != 0) - { - MapGridSetMetatileIdAt( 7, 7, 0xe68); - MapGridSetMetatileIdAt( 8, 7, 0xe69); - MapGridSetMetatileIdAt( 9, 7, 0xe69); - MapGridSetMetatileIdAt(10, 7, 0xe6a); - MapGridSetMetatileIdAt( 7, 8, 0xe70); - MapGridSetMetatileIdAt( 8, 8, 0xe71); - MapGridSetMetatileIdAt( 9, 8, 0xe71); - MapGridSetMetatileIdAt(10, 8, 0xe72); - MapGridSetMetatileIdAt( 7, 9, 0xe78); - MapGridSetMetatileIdAt( 8, 9, 0xe79); - MapGridSetMetatileIdAt( 9, 9, 0xe79); - MapGridSetMetatileIdAt(10, 9, 0xe7a); - } - else - { - MapGridSetMetatileIdAt( 7, 7, 0xe6b); - MapGridSetMetatileIdAt( 8, 7, 0xe6c); - MapGridSetMetatileIdAt( 9, 7, 0xe6c); - MapGridSetMetatileIdAt(10, 7, 0xe6d); - MapGridSetMetatileIdAt( 7, 8, 0xe73); - MapGridSetMetatileIdAt( 8, 8, 0xe74); - MapGridSetMetatileIdAt( 9, 8, 0xe74); - MapGridSetMetatileIdAt(10, 8, 0xe75); - MapGridSetMetatileIdAt( 7, 9, 0xe7b); - MapGridSetMetatileIdAt( 8, 9, 0xe7c); - MapGridSetMetatileIdAt( 9, 9, 0xe7c); - MapGridSetMetatileIdAt(10, 9, 0xe7d); - } - DrawWholeMapView(); - task->data[4] ^= 1; - task->data[2]++; - if (task->data[2] == 8) - { - DestroyTask(task->data[1]); - } - } - task->data[3]++; -} - -void sub_810EEDC(void) -{ - if ((gUnknown_0203925C & 1) != 0) - { - DestroyVerticalScrollIndicator(1); - } - if ((gUnknown_0203925C >> 1) == 1) - { - DestroyVerticalScrollIndicator(0); - } - BuyMenuFreeMemory(); -} - -void SetTrickHouseEndRoomFlag(void) -{ - u16 *specVar = &gSpecialVar_0x8004; - u16 flag = 0x259; - *specVar = flag; - FlagSet(flag); -} - -void ResetTrickHouseEndRoomFlag(void) -{ - u16 *specVar = &gSpecialVar_0x8004; - u16 flag = 0x259; - *specVar = flag; - FlagReset(flag); -} - -bool8 CheckLeadMonCool(void) -{ - if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_COOL) < 200) - { - return FALSE; - } - return TRUE; -} - -bool8 CheckLeadMonBeauty(void) -{ - if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_BEAUTY) < 200) - { - return FALSE; - } - return TRUE; -} - -bool8 CheckLeadMonCute(void) -{ - if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_CUTE) < 200) - { - return FALSE; - } - return TRUE; -} - -bool8 CheckLeadMonSmart(void) -{ - if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SMART) < 200) - { - return FALSE; - } - return TRUE; -} - -bool8 CheckLeadMonTough(void) -{ - if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_TOUGH) < 200) - { - return FALSE; - } - return TRUE; -} - -void IsGrassTypeInParty(void) -{ - u8 i; - u16 species; - struct Pokemon *pokemon; - for (i=0; i> 1 != 1) - { - gUnknown_0203925C |= 0x02; - CreateVerticalScrollIndicators(0, 0x2c, 0x08); - } -} - -void sub_810F2B4(void) -{ - if (!(gUnknown_0203925C & 0x01)) - { - gUnknown_0203925C |= 0x01; - CreateVerticalScrollIndicators(1, 0x2c, 0x58); - } -} - -void GlassWorkshopUpdateScrollIndicators(u8 newPos, u8 maxItems) -{ - if (newPos == 0) - { - gUnknown_0203925C ^= 0x02; - DestroyVerticalScrollIndicator(0); - } - else - { - sub_810F290(); - } - if (newPos + maxItems < gUnknown_0203925A) - { - sub_810F2B4(); - } - else if (newPos + maxItems == gUnknown_0203925A) - { - gUnknown_0203925C ^= 0x01; - DestroyVerticalScrollIndicator(1); - } -} - -void SpawnCameraDummy(void) -{ - u8 mapObjectId = SpawnSpecialFieldObjectParametrized(7, 8, 0x7f, gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7, 3); - gMapObjects[mapObjectId].mapobj_bit_13 = 1; - CameraObjectSetFollowedObjectId(gMapObjects[mapObjectId].spriteId); -} - -void RemoveCameraDummy(void) -{ - CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId()); - RemoveFieldObjectByLocalIdAndMap(0x7f, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); -} - -u8 GetPokeblockNameByMonNature(void) -{ - return sub_810CB68(GetNature(&gPlayerParty[GetLeadMonIndex()]), gStringVar1); -} - -void GetSecretBaseNearbyMapName(void) -{ - GetMapSectionName(gStringVar1, VarGet(VAR_SECRET_BASE_MAP), 0); -} - -u16 sub_810F404(void) -{ - return GetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK); -} - -void sub_810F414(void) -{ - sub_8135FF4(gStringVar1); -} - -const u8 gUnknown_083F83E0[] = {12, 2, 4, 5, 1, 8, 7, 11, 3, 10, 9, 6}; -const u8 gUnknown_083F83EC[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5}; -const u8 gUnknown_083F83F8[] = {3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5}; - -u8 sub_810F424(void) -{ - u32 v0 = gSaveBlock1.easyChatPairs[0].unk0_0 + gSaveBlock1.easyChatPairs[0].unk2 + gUnknown_083F83E0[gSpecialVar_0x8004]; - if (GetPriceReduction(2)) - { - return gUnknown_083F83F8[v0 % 12]; - } - return gUnknown_083F83EC[v0 % 12]; -} - -bool8 sub_810F488(void) -{ - u16 *specVar = &gSpecialVar_0x8004; - u16 flag = 0x277; - *specVar = flag; - if (!FlagGet(flag)) - { - return FALSE; - } - return TRUE; -} - -bool8 sub_810F4B0(void) -{ - u16 *specVar = &gSpecialVar_0x8004; - u16 flag = 0x278; - *specVar = flag; - if (!FlagGet(flag)) - { - return FALSE; - } - return TRUE; -} - -bool8 sub_810F4D4(void) -{ - u16 *specVar = &gSpecialVar_0x8004; - u16 flag = 0x279; - *specVar = flag; - if (!FlagGet(flag)) - { - return FALSE; - } - return TRUE; -} - -bool8 sub_810F4FC(void) -{ - u16 *specVar = &gSpecialVar_0x8004; - u16 flag = 0x27a; - *specVar = flag; - if (!FlagGet(flag)) - { - return FALSE; - } - return TRUE; -} - -bool8 LeadMonHasEffortRibbon(void) -{ - return GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_EFFORT_RIBBON, NULL); -} - -void GivLeadMonEffortRibbon(void) -{ - bool8 ribbonSet; - IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); - FlagSet(SYS_RIBBON_GET); - ribbonSet = TRUE; - SetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_EFFORT_RIBBON, &ribbonSet); -} - -bool8 GetLeadMonEVCount(void) -{ - if (GetMonEVCount(&gPlayerParty[GetLeadMonIndex()]) >= 510) - { - return TRUE; - } - return FALSE; -} - -u8 sub_810F5BC(void) -{ - if (!FlagGet(0xc7) && gSaveBlock1.location.mapGroup == MAP_GROUP_RUSTURF_TUNNEL && gSaveBlock1.location.mapNum == MAP_ID_RUSTURF_TUNNEL) - { - if (FlagGet(0x3a3)) - { - VarSet(VAR_0x409a, 4); - return TRUE; - } - else if (FlagGet(0x3a4)) - { - VarSet(VAR_0x409a, 5); - return TRUE; - } - } - return FALSE; -} - -void SetShoalItemFlag(u16 v0) -{ - FlagSet(0x85f); -} - -void PutZigzagoonInPlayerParty(void) -{ - u16 monData; - CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, FALSE, 0); - monData = TRUE; - SetMonData(&gPlayerParty[0], MON_DATA_ALT_ABILITY, (u8 *)&monData); - monData = MOVE_TACKLE; - SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, (u8 *)&monData); - monData = MOVE_NONE; - SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, (u8 *)&monData); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, (u8 *)&monData); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, (u8 *)&monData); -} - -bool8 IsStarterInParty(void) -{ - u8 i; - u16 starter = GetStarterPokemon(VarGet(VAR_FIRST_POKE)); - u8 partyCount = CalculatePlayerPartyCount(); - for (i=0; idata[1]++; - if ((task->data[1] % task->data[5]) == 0) - { - task->data[1] = 0; - task->data[2]++; - if (task->data[3] == 0) - { - task->data[0] = -task->data[0]; - task->data[4] = -task->data[4]; - SetCameraPanning(task->data[0], task->data[4]); - if (task->data[2] == 8) - { - sub_810F814(taskId); - InstallCameraPanAheadCallback(); - } - } - } -} - -static void sub_810F814(u8 taskId) -{ - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -bool8 sub_810F828(void) -{ - return FlagGet(0x2b8); -} - -void SetRoute119Weather(void) -{ - if (is_light_level_1_2_3_5_or_6(get_map_light_from_warp0()) != TRUE) - { - SetSav1Weather(0x14); - } -} - -void SetRoute123Weather(void) -{ - if (is_light_level_1_2_3_5_or_6(get_map_light_from_warp0()) != TRUE) - { - SetSav1Weather(0x15); - } -} - -u8 GetLeadMonIndex(void) -{ - u8 i; - u8 partyCount = CalculatePlayerPartyCount(); - for (i=0; i= 7) - { - return 0; - } - else if (gLocalTime.days < 0) - { - return 8; - } - return 7 - (gLocalTime.days - var40c2); -} - -u16 sub_810F950(void) -{ - VarSet(VAR_0x40C2, gLocalTime.days); - return gLocalTime.days; -} - -bool8 sub_810F96C(void) -{ - GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_NAME, gStringVar1); - if (!StringCompareWithoutExtCtrlCodes(gSaveBlock2.playerName, gStringVar1)) - { - return FALSE; - } - return TRUE; -} - -void sub_810F9AC(void) -{ - if (gScriptResult >= 10000) - { - sub_80BF088(0, gScriptResult); - } - else if (gScriptResult >= 1000) - { - gStringVar1[0] = CHAR_0; - ConvertIntToDecimalStringN(gStringVar1 + 1, gScriptResult, 0, sub_80BF0B8(gScriptResult)); - } - else if (gScriptResult >= 100) - { - gStringVar1[0] = CHAR_0; - gStringVar1[1] = CHAR_0; - ConvertIntToDecimalStringN(gStringVar1 + 2, gScriptResult, 0, sub_80BF0B8(gScriptResult)); - } - else if (gScriptResult >= 10) - { - gStringVar1[0] = CHAR_0; - gStringVar1[1] = CHAR_0; - gStringVar1[2] = CHAR_0; - ConvertIntToDecimalStringN(gStringVar1 + 3, gScriptResult, 0, sub_80BF0B8(gScriptResult)); - } - else - { - gStringVar1[0] = CHAR_0; - gStringVar1[1] = CHAR_0; - gStringVar1[2] = CHAR_0; - gStringVar1[3] = CHAR_0; - ConvertIntToDecimalStringN(gStringVar1 + 4, gScriptResult, 0, sub_80BF0B8(gScriptResult)); - } -} - -const u8 gUnknown_083F8404[] = {2, 1, 2, 1}; -const u8 gUnknown_083F8408[] = {8, 9, 10, 11, 12, 13, 14, 15}; -const u8 gUnknown_083F8410[] = {8, 13, 14, 11, 10, 12, 15, 9}; - -bool8 sub_810FF30(void); -void sub_810FCE8(void); -void sub_810FF48(void); -void sub_810FD80(void); -u16 sub_810FCB0(void); -int sub_810FB9C(void); - -void ResetFanClub(void) -{ - gSaveBlock1.vars[0x41] = 0; - gSaveBlock1.vars[0x42] = 0; -} - -void sub_810FA74(void) -{ - if (sub_810FF30()) - { - sub_810FCE8(); - gSaveBlock1.vars[0x42] = gSaveBlock2.playTimeHours; - } -} - -void sub_810FAA0(void) -{ - if (!((gSaveBlock1.vars[0x41] >> 7) & 1)) - { - sub_810FF48(); - sub_810FD80(); - gSaveBlock1.vars[0x42] = gSaveBlock2.playTimeHours; - FlagReset(0x315); - FlagReset(0x316); - FlagReset(0x317); - FlagReset(0x318); - VarSet(VAR_0x4095, 1); - } -} - -u8 sub_810FB10(u8 a0) -{ - if (VarGet(VAR_0x4095) == 2) - { - if ((gSaveBlock1.vars[0x41] & 0x7f) + gUnknown_083F8404[a0] >= 20) - { - if (sub_810FCB0() < 3) - { - sub_810FB9C(); - gSaveBlock1.vars[0x41] &= 0xff80; - } - else - { - gSaveBlock1.vars[0x41] = (gSaveBlock1.vars[0x41] & 0xff80) | 20; - } - } - else - { - gSaveBlock1.vars[0x41] += gUnknown_083F8404[a0]; - } - } - return gSaveBlock1.vars[0x41] & 0x7f; -} - -int sub_810FB9C(void) -{ - u8 i; - int retval = 0; - for (i=0; i<8; i++) - { - if (!((gSaveBlock1.vars[0x41] >> gUnknown_083F8408[i]) & 0x01)) - { - retval = i; - if (Random() & 1) - { - gSaveBlock1.vars[0x41] |= (1 << gUnknown_083F8408[i]); - return retval; - } - } - } - gSaveBlock1.vars[0x41] |= (1 << gUnknown_083F8408[retval]); - return retval; -} - -int sub_810FC18(void) -{ - u8 i; - int retval = 0; - if (sub_810FCB0() == TRUE) - { - return 0; - } - for (i=0; i<8; i++) - { - if ((gSaveBlock1.vars[0x41] >> gUnknown_083F8410[i]) & 1) - { - retval = i; - if (Random() & 1) - { - gSaveBlock1.vars[0x41] ^= (1 << gUnknown_083F8410[i]); - return retval; - } - } - } - if ((gSaveBlock1.vars[0x41] >> gUnknown_083F8410[retval]) & 1) - { - gSaveBlock1.vars[0x41] ^= (1 << gUnknown_083F8410[retval]); - } - return retval; -} - -u16 sub_810FCB0(void) -{ - u8 i; - u8 retval = 0; - for (i=0; i<8; i++) - { - if ((gSaveBlock1.vars[0x41] >> (i + 8)) & 1) - { - retval ++; - } - } - return retval; -} - -void sub_810FCE8(void) -{ - u8 i = 0; - if (gSaveBlock2.playTimeHours < 999) - { - while (1) - { - if (sub_810FCB0() < 5) - { - gSaveBlock1.vars[0x42] = gSaveBlock2.playTimeHours; - break; - } - else if (i == 8) - { - break; - } - else if (gSaveBlock2.playTimeHours - gSaveBlock1.vars[0x42] < 12) - { - return; - } - sub_810FC18(); - gSaveBlock1.vars[0x42] += 12; - i++; - } - } -} - -bool8 sub_810FD60(void) -{ - return (gSaveBlock1.vars[0x41] >> gSpecialVar_0x8004) & 0x01; -} - -void sub_810FD80(void) -{ - gSaveBlock1.vars[0x41] |= 0x2000; - gSaveBlock1.vars[0x41] |= 0x100; - gSaveBlock1.vars[0x41] |= 0x400; -} - -void sub_810FE1C(void *, u8, u8); - -void sub_810FDAC(void) -{ - u8 a = 0; - u8 b = 0; - switch (gSpecialVar_0x8004) - { - case 8: - break; - case 9: - break; - case 10: - a = 0; - b = 3; - break; - case 11: - a = 0; - b = 1; - break; - case 12: - a = 1; - b = 0; - break; - case 13: - a = 0; - b = 4; - break; - case 14: - a = 1; - b = 5; - break; - case 15: - break; - } - sub_810FE1C(gSaveBlock1.linkBattleRecords, a, b); -} - -void sub_810FE1C(void *linkRecords, u8 a, u8 b) -{ - u8 *curRecord = (linkRecords + 16 * a); - if (*curRecord == EOS) - { - switch (b) - { - case 0: - StringCopy(gStringVar1, gOtherText_Wallace); - break; - case 1: - StringCopy(gStringVar1, gOtherText_Steven); - break; - case 2: - StringCopy(gStringVar1, gOtherText_Brawly); - break; - case 3: - StringCopy(gStringVar1, gOtherText_Winona); - break; - case 4: - StringCopy(gStringVar1, gOtherText_Phoebe); - break; - case 5: - StringCopy(gStringVar1, gOtherText_Glacia); - break; - default: - StringCopy(gStringVar1, gOtherText_Wallace); - break; - } - } - else - { - StringCopyN(gStringVar1, curRecord, 7); - gStringVar1[7] = EOS; - if (gStringVar1[0] == 0xfc && gStringVar1[1] == 0x15) - { - ConvertInternationalString(gStringVar1, 1); - } - } -} - -void sub_810FEFC(void) -{ - if (VarGet(VAR_0x4095) == 2) - { - sub_810FA74(); - if (gBattleOutcome == 1) - { - sub_810FB9C(); - } - else - { - sub_810FC18(); - } - } -} - -bool8 sub_810FF30(void) -{ - return (gSaveBlock1.vars[0x41] >> 7) & 0x01; -} - -void sub_810FF48(void) -{ - gSaveBlock1.vars[0x41] |= 0x80; -} - -u8 sub_810FF60(void) -{ - return sub_810FB10(gSpecialVar_0x8004); -} diff --git a/src/field_tasks.c b/src/field_tasks.c deleted file mode 100644 index caf2ce6b9..000000000 --- a/src/field_tasks.c +++ /dev/null @@ -1,859 +0,0 @@ -// -// Created by scott on 6/22/2017. -// - -#include "global.h" -#include "task.h" -#include "main.h" -#include "vars.h" -#include "bike.h" -#include "item.h" -#include "items.h" -#include "event_data.h" -#include "rom4.h" -#include "clock.h" -#include "script.h" -#include "field_special_scene.h" -#include "field_effect_helpers.h" -#include "secret_base.h" -#include "metatile_behavior.h" -#include "fieldmap.h" -#include "field_player_avatar.h" -#include "field_camera.h" -#include "songs.h" -#include "sound.h" -#include "field_tasks.h" - -void DummyPerStepCallback(u8); -void PerStepCallback_8069F64(u8); -void PerStepCallback_8069AA0(u8); -void PerStepCallback_8069864(u8); -void PerStepCallback_8069DD4(u8); -void PerStepCallback_806A07C(u8); - -void (*const gUnknown_08376364[])(u8) = { - DummyPerStepCallback, - PerStepCallback_8069F64, - PerStepCallback_8069AA0, - PerStepCallback_8069864, - PerStepCallback_8069DD4, - EndTruckSequence, - sub_80BCF1C, - PerStepCallback_806A07C -}; - -void Task_RunPerStepCallback(u8 taskId) -{ - int idx = gTasks[taskId].data[0]; - gUnknown_08376364[idx](taskId); -} - -static void RunTimeBasedEvents(s16 *taskData) -{ - switch (*taskData) - { - case 0: - if (gMain.vblankCounter1 & 0x1000) - { - DoTimeBasedEvents(); - (*taskData)++; - } - break; - case 1: - if (!(gMain.vblankCounter1 & 0x1000)) - { - (*taskData)--; - } - break; - } -} - -void Task_RunTimeBasedEvents(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - if (!ScriptContext2_IsEnabled()) - { - RunTimeBasedEvents(taskData); - sub_80540D0(taskData + 1, taskData + 2); - } -} - -void Task_MuddySlope(u8); - -void SetUpFieldTasks(void) -{ - if (!FuncIsActiveTask(Task_RunPerStepCallback)) - { - u8 taskId = CreateTask(Task_RunPerStepCallback, 0x50); - gTasks[taskId].data[0] = 0; - } - if (!FuncIsActiveTask(Task_MuddySlope)) - { - CreateTask(Task_MuddySlope, 0x50); - } - if (!FuncIsActiveTask(Task_RunTimeBasedEvents)) - { - CreateTask(Task_RunTimeBasedEvents, 0x50); - } -} - -void ActivatePerStepCallback(u8 callback) -{ - s16 *dataPointer; - s16 *dataStart; - s16 zero; - u8 taskId = FindTaskIdByFunc(Task_RunPerStepCallback); - if (taskId != 0xff) - { - dataStart = gTasks[taskId].data; - zero = 0; - dataPointer = &dataStart[15]; - do - { - *dataPointer-- = zero; - } while ((int)dataPointer >= (int)dataStart); - if (callback >= ARRAY_COUNT(gUnknown_08376364)) - { - *dataStart = 0; - } - else - { - *dataStart = callback; - } - } -} - -void ResetFieldTasksArgs(void) -{ - u8 taskId; - s16 *taskData; - taskId = FindTaskIdByFunc(Task_RunPerStepCallback); - if (taskId != 0xff) - { - taskData = gTasks[taskId].data; - } - taskId = FindTaskIdByFunc(Task_RunTimeBasedEvents); - if (taskId != 0xff) - { - taskData = gTasks[taskId].data; - taskData[1] = 0; - taskData[2] = 0; - } -} - -const struct MetatileOffset gUnknown_08376384[][2] = { - {{ 0, 0,0x259}, { 0, 1,0x261}}, - {{ 0, -1,0x259}, { 0, 0,0x261}}, - {{ 0, 0,0x252}, { 1, 0,0x253}}, - {{ -1, 0,0x252}, { 0, 0,0x253}} -}; - -const struct MetatileOffset gUnknown_083763A4[][2] = { - {{ 0, 0,0x25A}, { 0, 1,0x262}}, - {{ 0, -1,0x25A}, { 0, 0,0x262}}, - {{ 0, 0,0x254}, { 1, 0,0x255}}, - {{ -1, 0,0x254}, { 0, 0,0x255}} -}; - -const struct MetatileOffset gUnknown_083763C4[][2] = { - {{ 0, 0,0x258}, { 0, 1,0x260}}, - {{ 0, -1,0x258}, { 0, 0,0x260}}, - {{ 0, 0,0x250}, { 1, 0,0x251}}, - {{ -1, 0,0x250}, { 0, 0,0x251}} -}; - -void DummyPerStepCallback(u8 taskId) {} - -const struct MetatileOffset *sub_80695E0(const struct MetatileOffset a0[][2], s8 a1) -{ - if (sub_80576A0(a1)) - { - return a0[0]; - } - else if (sub_80576B4(a1)) - { - return a0[1]; - } - else if (sub_80576C8(a1)) - { - return a0[2]; - } - else if (sub_80576DC(a1)) - { - return a0[3]; - } - else - { - return NULL; - } -} - -#ifdef NONMATCHING -void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag) -{ - const struct MetatileOffset *offsetData = sub_80695E0(offsets, MapGridGetMetatileBehaviorAt(x, y)); - const struct MetatileOffset *offsetData2 = offsetData; - if (offsetData != NULL) - { - MapGridSetMetatileIdAt(x + offsetData[0].x, y + offsetData[0].y, offsetData[0].tileId); - if (flag) - { - CurrentMapDrawMetatileAt(x + offsetData[0].x, y + offsetData[0].y); - } - MapGridSetMetatileIdAt(x + offsetData2[1].x, y + offsetData2[1].y, offsetData2[1].tileId); - if (flag) - { - CurrentMapDrawMetatileAt(x + offsetData2[1].x, y + offsetData2[1].y); - } - } -} -#else -__attribute__((naked)) -void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r8\n" - "\tpush {r7}\n" - "\tadds r5, r0, 0\n" - "\tmov r8, r3\n" - "\tlsls r1, 16\n" - "\tasrs r6, r1, 16\n" - "\tlsls r2, 16\n" - "\tasrs r7, r2, 16\n" - "\tadds r0, r6, 0\n" - "\tadds r1, r7, 0\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tadds r1, r0, 0\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tadds r0, r5, 0\n" - "\tbl sub_80695E0\n" - "\tadds r4, r0, 0\n" - "\tadds r5, r4, 0\n" - "\tcmp r4, 0\n" - "\tbeq _080696B6\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r4, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x1\n" - "\tldrsb r1, [r4, r1]\n" - "\tadds r1, r7, r1\n" - "\tldrh r2, [r4, 0x2]\n" - "\tbl MapGridSetMetatileIdAt\n" - "\tmov r0, r8\n" - "\tcmp r0, 0\n" - "\tbeq _0806968E\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r4, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x1\n" - "\tldrsb r1, [r4, r1]\n" - "\tadds r1, r7, r1\n" - "\tbl CurrentMapDrawMetatileAt\n" - "_0806968E:\n" - "\tmovs r0, 0x4\n" - "\tldrsb r0, [r5, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x5\n" - "\tldrsb r1, [r5, r1]\n" - "\tadds r1, r7, r1\n" - "\tldrh r2, [r5, 0x6]\n" - "\tbl MapGridSetMetatileIdAt\n" - "\tmov r0, r8\n" - "\tcmp r0, 0\n" - "\tbeq _080696B6\n" - "\tmovs r0, 0x4\n" - "\tldrsb r0, [r5, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x5\n" - "\tldrsb r1, [r5, r1]\n" - "\tadds r1, r7, r1\n" - "\tbl CurrentMapDrawMetatileAt\n" - "_080696B6:\n" - "\tpop {r3}\n" - "\tmov r8, r3\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif - -void sub_80696C0(s16 x, s16 y, bool32 flag) -{ - sub_8069638(gUnknown_08376384, x, y, flag); -} - -void sub_80696E4(s16 x, s16 y, bool32 flag) -{ - sub_8069638(gUnknown_083763A4, x, y, flag); -} - -void sub_8069708(s16 x, s16 y, bool32 flag) -{ - sub_8069638(gUnknown_083763C4, x, y, flag); -} - -bool32 sub_806972C(s16 x1, s16 y1, s16 x2, s16 y2) -{ - s8 metatileBehavior = MapGridGetMetatileBehaviorAt(x2, y2); - if (sub_80576A0(metatileBehavior)) - { - if (y1 > y2) - { - return FALSE; - } - } - else if (sub_80576B4(metatileBehavior)) - { - if (y1 < y2) - { - return FALSE; - } - } - else if (sub_80576C8(metatileBehavior)) - { - if (x1 > x2) - { - return FALSE; - } - } - else if (sub_80576DC(metatileBehavior)) - { - if (x1 < x2) - { - return FALSE; - } - } - return TRUE; -} - -bool32 sub_80697C8(s16 x1, s16 y1, s16 x2, s16 y2) -{ - s8 metatileBehavior = MapGridGetMetatileBehaviorAt(x1, y1); - if (sub_80576A0(metatileBehavior)) - { - if (y1 < y2) - { - return FALSE; - } - } - else if (sub_80576B4(metatileBehavior)) - { - if (y1 > y2) - { - return FALSE; - } - } - else if (sub_80576C8(metatileBehavior)) - { - if (x1 < x2) - { - return FALSE; - } - } - else if (sub_80576DC(metatileBehavior)) - { - if (x1 > x2) - { - return FALSE; - } - } - return TRUE; -} - -void PerStepCallback_8069864(u8 taskId) -{ - s16 *data; - s16 x, y; - data = gTasks[taskId].data; - PlayerGetDestCoords(&x, &y); - switch (data[1]) - { - case 0: - data[2] = x; - data[3] = y; - sub_80696E4(x, y, TRUE); - data[1] = 1; - break; - case 1: - if (x != data[2] || y != data[3]) - { - if (sub_806972C(x, y, data[2], data[3])) - { - sub_80696C0(data[2], data[3], TRUE); - sub_8069708(data[2], data[3], FALSE); - data[4] = data[2]; - data[5] = data[3]; - data[1] = 2; - data[6] = 8; - } - else - { - data[4] = -1; - data[5] = -1; - } - if (sub_80697C8(x, y, data[2], data[3])) - { - sub_80696C0(x, y, TRUE); - data[1] = 2; - data[6] = 8; - } - data[2] = x; - data[3] = y; - if (MetatileBehavior_IsPacifidlogLog(MapGridGetMetatileBehaviorAt(x, y))) - { - PlaySE(SE_MIZU); - } - } - break; - case 2: - if ((--data[6]) == 0) - { - sub_80696E4(x, y, TRUE); - if (data[4] != -1 && data[5] != -1) - { - sub_8069708(data[4], data[5], TRUE); - } - data[1] = 1; - } - break; - } -} - -void sub_80699D8(s16 x, s16 y) -{ - u8 z = PlayerGetZCoord(); - if (!(z & 0x01)) - { - switch (MapGridGetMetatileIdAt(x, y)) - { - case 0x24e: - MapGridSetMetatileIdAt(x, y, 0x24f); - break; - case 0x256: - MapGridSetMetatileIdAt(x, y, 0x257); - break; - } - } -} - -void sub_8069A3C(s16 x, s16 y) -{ - u8 z = PlayerGetZCoord(); - if (!(z & 0x01)) - { - switch (MapGridGetMetatileIdAt(x, y)) - { - case 0x24f: - MapGridSetMetatileIdAt(x, y, 0x24e); - break; - case 0x257: - MapGridSetMetatileIdAt(x, y, 0x256); - break; - } - } -} - -void PerStepCallback_8069AA0(u8 taskId) -{ - bool8 isFortreeBridgeCur; - bool8 isFortreeBridgePrev; - u8 z, flag; - s16 x, y, x2, y2; - s16 *data = gTasks[taskId].data; - PlayerGetDestCoords(&x, &y); - switch (data[1]) - { - default: - break; - case 0: - data[2] = x; - data[3] = y; - if (MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y))) - { - sub_80699D8(x, y); - CurrentMapDrawMetatileAt(x, y); - } - data[1] = 1; - break; - case 1: - x2 = data[2]; - y2 = data[3]; - if (x == x2 && y == y2) - { - break; - } - isFortreeBridgeCur = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y)); - isFortreeBridgePrev = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x2, y2)); - z = PlayerGetZCoord(); - flag = 0; - if ((u8)(z & 1) == 0) - { - flag = 1; - } - if (flag && (isFortreeBridgeCur == 1 || isFortreeBridgePrev == 1)) - { - PlaySE(SE_HASHI); - } - if (isFortreeBridgePrev) - { - sub_8069A3C(x2, y2); - CurrentMapDrawMetatileAt(x2, y2); - sub_80699D8(x, y); - CurrentMapDrawMetatileAt(x, y); - } - data[4] = x2; - data[5] = y2; - data[2] = x; - data[3] = y; - if (!isFortreeBridgePrev) - { - break; - } - data[6] = 16; - data[1] = 2; - // fallthrough - case 2: - data[6]--; - x2 = data[4]; - y2 = data[5]; - switch (data[6] % 7) - { - case 0: - CurrentMapDrawMetatileAt(x2, y2); - case 1: - case 2: - case 3: - break; - case 4: - sub_80699D8(x2, y2); - CurrentMapDrawMetatileAt(x2, y2); - sub_8069A3C(x2, y2); - case 5: - case 6: - case 7: - break; - } - if (data[6] == 0) - { - data[1] = 1; - } - break; - } -} - -const u16 gUnknown_083763E4[] = { - 0, - 0, - 0, - 0, - 0, - 0, - VAR_0x4001, - VAR_0x4002, - VAR_0x4003, - VAR_0x4004, - 0, - 0, - VAR_0x4005, - VAR_0x4006, - VAR_0x4007, - 0, - 0, - VAR_0x4008, - VAR_0x4009, - VAR_0x400A, - 0, - 0, - 0, - 0, - 0, - 0 -}; - -bool32 sub_8069CB8(s16 x, s16 y) -{ - if ((u16)(x - 3) < 11 && (u16)(y - 6) < 14 && gUnknown_083763E4[y]) - { - return TRUE; - } - return FALSE; -} - -void sub_8069CFC(s16 x, s16 y) -{ - if (sub_8069CB8(x, y)) - { - *GetVarPointer(gUnknown_083763E4[y]) |= (1 << (x - 3)); - } -} - -bool32 sub_8069D34(s16 x, s16 y) -{ - u32 var; - if (!sub_8069CB8(x, y)) - { - return FALSE; - } - var = VarGet(gUnknown_083763E4[y]) << 16; - if (((1 << 16) << (x - 3)) & var) - { - return TRUE; - } - return FALSE; -} - -void sub_8069D78(void) -{ - s32 x, y; - s32 width = gMapHeader.mapData->width; - s32 height = gMapHeader.mapData->height; - for (x=0; x> 8; - } - v9 = v4; - v10 = 0x1f00 - v4; - if ((0x1f00 - v4) < 0) - { - v10 += 0xf; - } - v11 = v10 >> 4; - if (v2 <= 0xb) - { - for (; v6 <= 0x12; 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++) - { - v4 += v11; - v1[v6][v2] = v4 >> 8; - if (v1[v6][v2] > 0x1f) - { - v1[v6][v2] = 0x1f; - } - } - } - } - } -} - -void sub_807CC24(void) -{ - if (gWeather.unknown_6C0 == gWeather.unknown_6C1) - { - gWeather.unknown_6C6 = 3; - } - else - { - if (++gWeather.unknown_6C3 >= gWeather.unknown_6C2) - { - gWeather.unknown_6C3 = 0; - if (gWeather.unknown_6C0 < gWeather.unknown_6C1) - { - gWeather.unknown_6C0++; - } - else - { - gWeather.unknown_6C0--; - } - sub_807CEBC(0, 0x20, gWeather.unknown_6C0); - } - } -} - -void sub_807CCAC(void) -{ - if (++gWeather.unknown_6CB > 1) - { - gWeather.unknown_6CA = 0; - } - switch (gWeather.unknown_6D0) - { - case 3: - case 4: - case 5: - case 11: - case 13: - if (sub_807CDC4() == 0) - { - gWeather.unknown_6C0 = 3; - gWeather.unknown_6C6 = 3; - } - break; - case 12: - if (sub_807CE24() == 0) - { - gWeather.unknown_6C0 = -6; - gWeather.unknown_6C6 = 3; - } - break; - case 6: - if (sub_807CE7C() == 0) - { - gWeather.unknown_6C0 = 0; - gWeather.unknown_6C6 = 3; - } - break; - case 7: - case 8: - case 9: - case 10: - default: - if (!gPaletteFade.active) - { - gWeather.unknown_6C0 = gWeather.unknown_6C1; - gWeather.unknown_6C6 = 3; - } - break; - } -} - -u8 sub_807CDC4(void) -{ - if (gWeather.unknown_6C7 == 0x10) - { - return 0; - } - if (++gWeather.unknown_6C7 >= 0x10) - { - sub_807CEBC(0, 0x20, 3); - gWeather.unknown_6C7 = 0x10; - return 0; - } - sub_807D1BC(0, 0x20, 3, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4); - return 1; -} - -u8 sub_807CE24(void) -{ - if (gWeather.unknown_6C7 == 0x10) - { - return 0; - } - if (++gWeather.unknown_6C7 >= 0x10) - { - sub_807CEBC(0, 0x20, -6); - gWeather.unknown_6C7 = 0x10; - return 0; - } - sub_807D304(-6, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4); - return 1; -} - -u8 sub_807CE7C(void) -{ - if (gWeather.unknown_6C7 == 0x10) - { - return 0; - } - ++gWeather.unknown_6C7; - sub_807D424(0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4); - return 1; -} - -void nullsub_39(void) -{ -} diff --git a/src/fieldmap.c b/src/fieldmap.c deleted file mode 100644 index 0e0ec246c..000000000 --- a/src/fieldmap.c +++ /dev/null @@ -1,955 +0,0 @@ -#include "global.h" -#include "fieldmap.h" -#include "palette.h" -#include "rom4.h" -#include "script.h" -#include "secret_base.h" -#include "tv.h" - -struct ConnectionFlags -{ - u8 south:1; - u8 north:1; - u8 west:1; - u8 east:1; -}; - -struct Coords32 -{ - s32 x; - s32 y; -}; - -EWRAM_DATA static u16 gUnknown_02029828[0x2800] = {0}; -EWRAM_DATA struct MapHeader gMapHeader = {0}; -EWRAM_DATA struct Camera gUnknown_0202E844 = {0}; -EWRAM_DATA static struct ConnectionFlags gUnknown_0202E850 = {0}; - -struct BackupMapData gUnknown_03004870; - -static const struct ConnectionFlags sDummyConnectionFlags = {0}; - -struct MapHeader *mapconnection_get_mapheader(struct MapConnection *connection) -{ - return get_mapheader_by_bank_and_number(connection->mapGroup, connection->mapNum); -} - -void not_trainer_hill_battle_pyramid(void) -{ - mapheader_copy_mapdata_with_padding(&gMapHeader); - sub_80BB970(gMapHeader.events); - mapheader_run_script_with_tag_x1(); -} - -void sub_8055FC0(void) -{ - mapheader_copy_mapdata_with_padding(&gMapHeader); - sub_80BBCCC(0); - sub_80BB970(gMapHeader.events); - sub_8056670(); - mapheader_run_script_with_tag_x1(); - UpdateTVScreensOnMap(gUnknown_03004870.width, gUnknown_03004870.height); -} - -void mapheader_copy_mapdata_with_padding(struct MapHeader *mapHeader) -{ - struct MapData *mapData; - int width; - int height; - mapData = mapHeader->mapData; - CpuFastFill16(0x03ff, gUnknown_02029828, sizeof(gUnknown_02029828)); - gUnknown_03004870.map = gUnknown_02029828; - width = mapData->width + 15; - gUnknown_03004870.width = width; - height = mapData->height + 14; - gUnknown_03004870.height = height; - if (width * height <= 0x2800) - { - map_copy_with_padding(mapData->map, mapData->width, mapData->height); - sub_80560AC(mapHeader); - } -} - -void map_copy_with_padding(u16 *map, u16 width, u16 height) -{ - u16 *dest; - int y; - dest = gUnknown_03004870.map; - dest += gUnknown_03004870.width * 7 + 7; - for (y = 0; y < height; y++) - { - CpuCopy16(map, dest, width * 2); - dest += width + 0xf; - map += width; - } -} - -void sub_80560AC(struct MapHeader *mapHeader) -{ - 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; - switch (connection->direction) - { - case CONNECTION_SOUTH: - fillSouthConnection(mapHeader, cMap, offset); - gUnknown_0202E850.south = 1; - break; - case CONNECTION_NORTH: - fillNorthConnection(mapHeader, cMap, offset); - gUnknown_0202E850.north = 1; - break; - case CONNECTION_WEST: - fillWestConnection(mapHeader, cMap, offset); - gUnknown_0202E850.west = 1; - break; - case CONNECTION_EAST: - fillEastConnection(mapHeader, cMap, offset); - gUnknown_0202E850.east = 1; - break; - } - } -} - -void sub_8056134(int x, int y, struct MapHeader *mapHeader, int x2, int y2, int width, int height) -{ - int i; - u16 *src; - u16 *dest; - int mapWidth; - - mapWidth = mapHeader->mapData->width; - src = &mapHeader->mapData->map[mapWidth * y2 + x2]; - dest = &gUnknown_03004870.map[gUnknown_03004870.width * y + x]; - - for (i = 0; i < height; i++) - { - CpuCopy16(src, dest, width * 2); - dest += gUnknown_03004870.width; - src += mapWidth; - } -} - -void fillSouthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) -{ - int x, y; - int x2; - int width; - int cWidth; - - if (connectedMapHeader) - { - cWidth = connectedMapHeader->mapData->width; - x = offset + 7; - y = mapHeader->mapData->height + 7; - if (x < 0) - { - x2 = -x; - x += cWidth; - if (x < gUnknown_03004870.width) - { - width = x; - } - else - { - width = gUnknown_03004870.width; - } - x = 0; - } - else - { - x2 = 0; - if (x + cWidth < gUnknown_03004870.width) - { - width = cWidth; - } - else - { - width = gUnknown_03004870.width - x; - } - } - sub_8056134( - x, y, - connectedMapHeader, - x2, /*y2*/ 0, - width, /*height*/ 7); - } -} - -void fillNorthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) -{ - int x; - int x2, y2; - int width; - int cWidth, cHeight; - - if (connectedMapHeader) - { - cWidth = connectedMapHeader->mapData->width; - cHeight = connectedMapHeader->mapData->height; - x = offset + 7; - y2 = cHeight - 7; - if (x < 0) - { - x2 = -x; - x += cWidth; - if (x < gUnknown_03004870.width) - { - width = x; - } - else - { - width = gUnknown_03004870.width; - } - x = 0; - } - else - { - x2 = 0; - if (x + cWidth < gUnknown_03004870.width) - { - width = cWidth; - } - else - { - width = gUnknown_03004870.width - x; - } - } - - sub_8056134( - x, /*y*/ 0, - connectedMapHeader, - x2, y2, - width, /*height*/ 7); - - } -} - - -void fillWestConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) -{ - int y; - int x2, y2; - int height; - int cWidth, cHeight; - if (connectedMapHeader) - { - cWidth = connectedMapHeader->mapData->width; - cHeight = connectedMapHeader->mapData->height; - y = offset + 7; - x2 = cWidth - 7; - if (y < 0) - { - y2 = -y; - if (y + cHeight < gUnknown_03004870.height) - { - height = y + cHeight; - } - else - { - height = gUnknown_03004870.height; - } - y = 0; - } - else - { - y2 = 0; - if (y + cHeight < gUnknown_03004870.height) - { - height = cHeight; - } - else - { - height = gUnknown_03004870.height - y; - } - } - - sub_8056134( - /*x*/ 0, y, - connectedMapHeader, - x2, y2, - /*width*/ 7, height); - } -} - -void fillEastConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) -{ - int x, y; - int y2; - int height; - int cHeight; - if (connectedMapHeader) - { - cHeight = connectedMapHeader->mapData->height; - x = mapHeader->mapData->width + 7; - y = offset + 7; - if (y < 0) - { - y2 = -y; - if (y + cHeight < gUnknown_03004870.height) - { - height = y + cHeight; - } - else - { - height = gUnknown_03004870.height; - } - y = 0; - } - else - { - y2 = 0; - if (y + cHeight < gUnknown_03004870.height) - { - height = cHeight; - } - else - { - height = gUnknown_03004870.height - y; - } - } - - sub_8056134( - x, y, - connectedMapHeader, - /*x2*/ 0, y2, - /*width*/ 8, height); - } -} - -union Block -{ - struct - { - u16 block:10; - u16 collision:2; - u16 elevation:4; - } block; - u16 value; -}; - -u8 MapGridGetZCoordAt(int x, int y) -{ - u16 block; - int i; - u16 *border; - - if (x >= 0 && x < gUnknown_03004870.width - && y >= 0 && y < gUnknown_03004870.height) - { - block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; - } - else - { - border = gMapHeader.mapData->border; - i = (x + 1) & 1; - i += ((y + 1) & 1) * 2; - block = gMapHeader.mapData->border[i]; - block |= 0xc00; - } - if (block == 0x3ff) - { - return 0; - } - return block >> 12; -} - -u8 MapGridIsImpassableAt(int x, int y) -{ - u16 block; - int i; - u16 *border; - - if (x >= 0 && x < gUnknown_03004870.width - && y >= 0 && y < gUnknown_03004870.height) - { - block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; - } - else - { - border = gMapHeader.mapData->border; - i = (x + 1) & 1; - i += ((y + 1) & 1) * 2; - block = gMapHeader.mapData->border[i]; - block |= 0xc00; - } - if (block == 0x3ff) - { - return 1; - } - return (block & 0xc00) >> 10; -} - -u32 MapGridGetMetatileIdAt(int x, int y) -{ - u16 block; - int i; - int j; - struct MapData *mapData; - u16 *border; - u16 block2; - - if (x >= 0 && x < gUnknown_03004870.width - && y >= 0 && y < gUnknown_03004870.height) - { - block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; - } - else - { - mapData = gMapHeader.mapData; - i = (x + 1) & 1; - i += ((y + 1) & 1) * 2; - block = mapData->border[i] | 0xc00; - } - if (block == 0x3ff) - { - border = gMapHeader.mapData->border; - j = (x + 1) & 1; - j += ((y + 1) & 1) * 2; - block2 = gMapHeader.mapData->border[j]; - block2 |= 0xc00; - return block2 & block; - } - return block & 0x3ff; -} - -u32 MapGridGetMetatileBehaviorAt(int x, int y) -{ - u16 metatile; - metatile = MapGridGetMetatileIdAt(x, y); - return GetBehaviorByMetatileId(metatile) & 0xff; -} - -u8 MapGridGetMetatileLayerTypeAt(int x, int y) -{ - u16 metatile; - metatile = MapGridGetMetatileIdAt(x, y); - return (GetBehaviorByMetatileId(metatile) & 0xf000) >> 12; -} - -void MapGridSetMetatileIdAt(int x, int y, u16 metatile) -{ - int i; - if (x >= 0 && x < gUnknown_03004870.width - && y >= 0 && y < gUnknown_03004870.height) - { - i = x + y * gUnknown_03004870.width; - gUnknown_03004870.map[i] = (gUnknown_03004870.map[i] & 0xf000) | (metatile & 0xfff); - } -} - -void MapGridSetMetatileEntryAt(int x, int y, u16 metatile) -{ - int i; - if (x >= 0 && x < gUnknown_03004870.width - && y >= 0 && y < gUnknown_03004870.height) - { - i = x + gUnknown_03004870.width * y; - gUnknown_03004870.map[i] = metatile; - } -} - -u32 GetBehaviorByMetatileId(u16 metatile) -{ - u16 *attributes; - if (metatile <= 0x1ff) - { - attributes = gMapHeader.mapData->primaryTileset->metatileAttributes; - return attributes[metatile]; - } - else if (metatile <= 0x3ff) - { - attributes = gMapHeader.mapData->secondaryTileset->metatileAttributes; - return attributes[metatile - 0x200]; - } - else - { - return 0xff; - } -} - -void save_serialize_map(void) -{ - int i, j; - int x, y; - u16 *mapView; - int width; - mapView = gSaveBlock1.mapView; - width = gUnknown_03004870.width; - x = gSaveBlock1.pos.x; - y = gSaveBlock1.pos.y; - for (i = y; i < y + 14; i++) - { - for (j = x; j < x + 15; j++) - { - *mapView++ = gUnknown_02029828[width * i + j]; - } - } -} - -int sub_8056618(void) -{ - u16 i; - u32 r2; - r2 = 0; - for (i = 0; i < 0x200; i++) - { - r2 |= gSaveBlock1.mapView[i]; - } - if (r2 == 0) - { - return 1; - } - return 0; -} - -void sav2_mapdata_clear(void) -{ - CpuFill16(0, gSaveBlock1.mapView, sizeof(gSaveBlock1.mapView)); -} - -void sub_8056670(void) -{ - int i, j; - int x, y; - u16 *mapView; - int width; - mapView = gSaveBlock1.mapView; - if (!sub_8056618()) - { - width = gUnknown_03004870.width; - x = gSaveBlock1.pos.x; - y = gSaveBlock1.pos.y; - for (i = y; i < y + 14; i++) - { - for (j = x; j < x + 15; j++) - { - gUnknown_02029828[width * i + j] = *mapView++; - } - } - sav2_mapdata_clear(); - } -} - -void sub_80566F0(u8 a1) -{ - u16 *mapView; - int width; - int x0, y0; - int x2, y2; - u16 *src, *dest; - int srci, desti; - int r9, r8; - int x, y; - int i, j; - mapView = gSaveBlock1.mapView; - width = gUnknown_03004870.width; - r9 = 0; - r8 = 0; - x0 = gSaveBlock1.pos.x; - y0 = gSaveBlock1.pos.y; - x2 = 15; - y2 = 14; - switch (a1) - { - case CONNECTION_NORTH: - y0 += 1; - y2 = 13; - break; - case CONNECTION_SOUTH: - r8 = 1; - y2 = 13; - break; - case CONNECTION_WEST: - x0 += 1; - x2 = 14; - break; - case CONNECTION_EAST: - r9 = 1; - x2 = 14; - break; - } - for (y = 0; y < y2; y++) - { - i = 0; - j = 0; - for (x = 0; x < x2; x++) - { - desti = width * (y + y0); - srci = (y + r8) * 15 + r9; - src = &mapView[srci + i]; - dest = &gUnknown_02029828[x0 + desti + j]; - *dest = *src; - i++; - j++; - } - } - sav2_mapdata_clear(); -} - -int GetMapBorderIdAt(int x, int y) -{ - struct MapData *mapData; - u16 block, block2; - int i, j; - if (x >= 0 && x < gUnknown_03004870.width - && y >= 0 && y < gUnknown_03004870.height) - { - i = gUnknown_03004870.width; - i *= y; - block = gUnknown_03004870.map[x + i]; - if (block == 0x3ff) - { - goto fail; - } - } - else - { - mapData = gMapHeader.mapData; - j = (x + 1) & 1; - j += ((y + 1) & 1) * 2; - block2 = 0xc00 | mapData->border[j]; - if (block2 == 0x3ff) - { - goto fail; - } - } - goto success; -fail: - return -1; -success: - - if (x >= (gUnknown_03004870.width - 8)) - { - if (!gUnknown_0202E850.east) - { - return -1; - } - return CONNECTION_EAST; - } - else if (x < 7) - { - if (!gUnknown_0202E850.west) - { - return -1; - } - return CONNECTION_WEST; - } - else if (y >= (gUnknown_03004870.height - 7)) - { - if (!gUnknown_0202E850.south) - { - return -1; - } - return CONNECTION_SOUTH; - } - else if (y < 7) - { - if (!gUnknown_0202E850.north) - { - return -1; - } - return CONNECTION_NORTH; - } - else - { - return 0; - } -} - -int GetPostCameraMoveMapBorderId(int x, int y) -{ - return GetMapBorderIdAt(gSaveBlock1.pos.x + 7 + x, gSaveBlock1.pos.y + 7 + y); -} - -int CanCameraMoveInDirection(int direction) -{ - int x, y; - x = gSaveBlock1.pos.x + 7 + gUnknown_0821664C[direction].x; - y = gSaveBlock1.pos.y + 7 + gUnknown_0821664C[direction].y; - if (GetMapBorderIdAt(x, y) == -1) - { - return 0; - } - return 1; -} - -void sub_8056918(struct MapConnection *connection, int direction, int x, int y) -{ - struct MapHeader *mapHeader; - mapHeader = mapconnection_get_mapheader(connection); - switch (direction) - { - case CONNECTION_EAST: - gSaveBlock1.pos.x = -x; - gSaveBlock1.pos.y -= connection->offset; - break; - case CONNECTION_WEST: - gSaveBlock1.pos.x = mapHeader->mapData->width; - gSaveBlock1.pos.y -= connection->offset; - break; - case CONNECTION_SOUTH: - gSaveBlock1.pos.x -= connection->offset; - gSaveBlock1.pos.y = -y; - break; - case CONNECTION_NORTH: - gSaveBlock1.pos.x -= connection->offset; - gSaveBlock1.pos.y = mapHeader->mapData->height; - break; - } -} - -bool8 CameraMove(int x, int y) -{ - unsigned int direction; - struct MapConnection *connection; - int old_x, old_y; - gUnknown_0202E844.field_0 = FALSE; - direction = GetPostCameraMoveMapBorderId(x, y); - if (direction + 1 <= 1) - { - gSaveBlock1.pos.x += x; - gSaveBlock1.pos.y += y; - } - else - { - save_serialize_map(); - old_x = gSaveBlock1.pos.x; - old_y = gSaveBlock1.pos.y; - connection = sub_8056A64(direction, gSaveBlock1.pos.x, gSaveBlock1.pos.y); - sub_8056918(connection, direction, x, y); - sub_80538F0(connection->mapGroup, connection->mapNum); - gUnknown_0202E844.field_0 = TRUE; - gUnknown_0202E844.x = old_x - gSaveBlock1.pos.x; - gUnknown_0202E844.y = old_y - gSaveBlock1.pos.y; - gSaveBlock1.pos.x += x; - gSaveBlock1.pos.y += y; - sub_80566F0(direction); - } - return gUnknown_0202E844.field_0; -} - -struct MapConnection *sub_8056A64(u8 direction, int x, int y) -{ - int count; - struct MapConnection *connection; - int i; - count = gMapHeader.connections->count; - connection = gMapHeader.connections->connections; - for (i = 0; i < count; i++, connection++) - { - if (connection->direction == direction) - { - if (sub_8056ABC(direction, x, y, connection) == TRUE) - { - return connection; - } - } - } - return NULL; -} - -bool8 sub_8056ABC(u8 direction, int x, int y, struct MapConnection *connection) -{ - struct MapHeader *mapHeader; - mapHeader = mapconnection_get_mapheader(connection); - switch (direction) - { - case CONNECTION_SOUTH: - case CONNECTION_NORTH: - return sub_8056B20(x, gMapHeader.mapData->width, mapHeader->mapData->width, connection->offset); - case CONNECTION_WEST: - case CONNECTION_EAST: - return sub_8056B20(y, gMapHeader.mapData->height, mapHeader->mapData->height, connection->offset); - } - return FALSE; -} - -bool8 sub_8056B20(int x, int src_width, int dest_width, int offset) -{ - int offset2; - offset2 = offset; - if (offset2 < 0) - { - offset2 = 0; - } - if (dest_width + offset < src_width) - { - src_width = dest_width + offset; - } - if (offset2 <= x && x <= src_width) - { - return TRUE; - } - return FALSE; -} - -int sub_8056B4C(int x, int width) -{ - if (x >= 0 && x < width) - { - return TRUE; - } - return FALSE; -} - -int sub_8056B60(struct MapConnection *connection, int x, int y) -{ - struct MapHeader *mapHeader; - mapHeader = mapconnection_get_mapheader(connection); - switch (connection->direction) - { - case CONNECTION_SOUTH: - case CONNECTION_NORTH: - return sub_8056B4C(x - connection->offset, mapHeader->mapData->width); - case CONNECTION_WEST: - case CONNECTION_EAST: - return sub_8056B4C(y - connection->offset, mapHeader->mapData->height); - } - return FALSE; -} - -struct MapConnection *sub_8056BA0(s16 x, s16 y) -{ - int count; - struct MapConnection *connection; - int i; - u8 direction; - if (!gMapHeader.connections) - { - return NULL; - } - else - { - count = gMapHeader.connections->count; - connection = gMapHeader.connections->connections; - for (i = 0; i < count; i++, connection++) - { - direction = connection->direction; - if ((direction == CONNECTION_DIVE || direction == CONNECTION_EMERGE) - || (direction == CONNECTION_NORTH && y > 6) - || (direction == CONNECTION_SOUTH && y < gMapHeader.mapData->height + 7) - || (direction == CONNECTION_WEST && x > 6) - || (direction == CONNECTION_EAST && x < gMapHeader.mapData->width + 7)) - { - continue; - } - if (sub_8056B60(connection, x - 7, y - 7) == TRUE) - { - return connection; - } - } - } - return NULL; -} - -void sub_8056C50(u16 x, u16 y) -{ - gSaveBlock1.pos.x = x - 7; - gSaveBlock1.pos.y = y - 7; -} - -void sav1_camera_get_focus_coords(u16 *x, u16 *y) -{ - *x = gSaveBlock1.pos.x + 7; - *y = gSaveBlock1.pos.y + 7; -} - -void unref_sub_8056C7C(u16 x, u16 y) -{ - gSaveBlock1.pos.x = x; - gSaveBlock1.pos.y = y; -} - -void GetCameraCoords(u16 *x, u16 *y) -{ - *x = gSaveBlock1.pos.x; - *y = gSaveBlock1.pos.y; -} - -void sub_8056C98(struct Tileset *tileset, void *src) -{ - if (tileset) - { - if (!tileset->isCompressed) - { - CpuFastSet(tileset->tiles, src, 0x1000); - } - else - { - LZ77UnCompVram(tileset->tiles, src); - } - } -} - -void sub_8056CBC(struct Tileset *tileset, int offset, int size) -{ - u16 black; - if (tileset) - { - if (tileset->isSecondary == FALSE) - { - black = 0; - LoadPalette(&black, offset, 2); - LoadPalette(tileset->palettes + 2, offset + 1, size - 2); - } - else if (tileset->isSecondary == TRUE) - { - LoadPalette(tileset->palettes + 0xc0, offset, size); - } - else - { - LZ77UnCompVram(tileset->palettes, (void*)0x2000000); - LoadPalette((void*)0x2000000, offset, size); - } - } -} - -void sub_8056D28(struct MapData *mapData) -{ - void *src = (void*)(BG_VRAM); - sub_8056C98(mapData->primaryTileset, src); -} - -void sub_8056D38(struct MapData *mapData) -{ - void *src = (void*)(BG_VRAM + 0x4000); - sub_8056C98(mapData->secondaryTileset, src); -} - -void apply_map_tileset1_palette(struct MapData *mapData) -{ - sub_8056CBC(mapData->primaryTileset, 0, 0xc0); -} - -void apply_map_tileset2_palette(struct MapData *mapData) -{ - sub_8056CBC(mapData->secondaryTileset, 0x60, 0xc0); -} - -void copy_map_tileset1_tileset2_to_vram(struct MapData *mapData) -{ - if (mapData) - { - sub_8056D28(mapData); - sub_8056D38(mapData); - } -} - -void apply_map_tileset1_tileset2_palette(struct MapData *mapData) -{ - if (mapData) - { - apply_map_tileset1_palette(mapData); - apply_map_tileset2_palette(mapData); - } -} diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c deleted file mode 100644 index b394d1e4c..000000000 --- a/src/fldeff_cut.c +++ /dev/null @@ -1,290 +0,0 @@ -#include "global.h" -#include "fldeff_cut.h" -#include "field_camera.h" -#include "field_effect.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "map_obj_lock.h" -#include "metatile_behavior.h" -#include "metatile_behaviors.h" -#include "pokemon_menu.h" -#include "rom4.h" -#include "rom6.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" - -extern u8 gCutGrassSpriteArray[8]; // seems to be an array of 8 sprite IDs - -extern void (*gFieldCallback)(void); -extern void (*gUnknown_03005CE4)(void); - -extern struct SpriteTemplate gSpriteTemplate_CutGrass; - -extern struct MapPosition gUnknown_0203923C; - -extern u8 gLastFieldPokeMenuOpened; - -extern u8 UseCutScript; - -bool8 SetUpFieldMove_Cut(void) -{ - s16 x, y; - u8 i, j; - u8 tileBehavior; - - if(npc_before_player_of_type(0x52) == TRUE) // is in front of tree? - { - gFieldCallback = sub_808AB90; - gUnknown_03005CE4 = sub_80A2634; - return TRUE; - } - else // is in ash or grass to cut? - { - PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y); - for(i = 0; i < 3; i++) - { - y = i - 1 + gUnknown_0203923C.y; - for(j = 0; j < 3; j++) - { - x = j - 1 + gUnknown_0203923C.x; - if(MapGridGetZCoordAt(x, y) == (s8)gUnknown_0203923C.height) - { - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - if(MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE - || MetatileBehavior_IsAshGrass(tileBehavior) == TRUE) - { - gFieldCallback = sub_808AB90; - gUnknown_03005CE4 = sub_80A25E8; - return TRUE; - } - } - } - } - return FALSE; // do not use cut - } -} - -void sub_80A25E8(void) -{ - FieldEffectStart(1); - gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; -} - -bool8 FldEff_UseCutOnGrass(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_80A2684 >> 16; - gTasks[taskId].data[9] = (u32)sub_80A2684; - IncrementGameStat(0x12); - return FALSE; -} - -void sub_80A2634(void) -{ - gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; - ScriptContext1_SetupScript(&UseCutScript); -} - -bool8 FldEff_UseCutOnTree(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_80A2B00 >> 16; - gTasks[taskId].data[9] = (u32)sub_80A2B00; - IncrementGameStat(0x12); - return FALSE; -} - -void sub_80A2684(void) -{ - FieldEffectActiveListRemove(1); - FieldEffectStart(0x3A); -} - -bool8 FldEff_CutGrass(void) -{ - s16 x, y; - u8 tileBehavior; - u8 i, j; // not in for loop? - - for(i = 0, PlaySE(SE_W015), PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y); i < 3; i++) - { - y = i - 1 + gUnknown_0203923C.y; - for(j = 0; j < 3; j++) - { - x = j - 1 + gUnknown_0203923C.x; - if(MapGridGetZCoordAt(x, y) == (s8)gUnknown_0203923C.height) - { - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - if(MetatileBehavior_IsCuttableGrass(tileBehavior) == TRUE) - { - sub_80A27A8(x, y); - sub_805BCC0(x, y); - } - } - } - } - sub_80A28F4(gUnknown_0203923C.x - 1, gUnknown_0203923C.y - 2); - DrawWholeMapView(); - - // populate sprite ID array - for(i = 0; i < 8; i++) - { - gCutGrassSpriteArray[i] = CreateSprite((struct SpriteTemplate *)&gSpriteTemplate_CutGrass, - gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0); - gSprites[gCutGrassSpriteArray[i]].data2 = 32 * i; - } - return 0; -} - -// set map grid metatile depending on x, y -// TODO: enum for metatile IDs -void sub_80A27A8(s16 x, s16 y) -{ - int metatileId = MapGridGetMetatileIdAt(x, y); - - switch(metatileId) - { - case 0x208: - case 0x15: - case 0xD: - MapGridSetMetatileIdAt(x, y, 0x1); - break; - case 0x1C6: - MapGridSetMetatileIdAt(x, y, 0x1CE); - break; - case 0x1C7: - MapGridSetMetatileIdAt(x, y, 0x1CF); - break; - case 0x281: - MapGridSetMetatileIdAt(x, y, 0x279); - break; - case 0x282: - MapGridSetMetatileIdAt(x, y, 0x27A); - break; - case 0x283: - MapGridSetMetatileIdAt(x, y, 0x27B); - break; - case 0x206: - case 0x207: - MapGridSetMetatileIdAt(x, y, 0x271); - break; - case 0x212: - case 0x20A: - MapGridSetMetatileIdAt(x, y, 0x218); - break; - case 0x25: - MapGridSetMetatileIdAt(x, y, 0xE); - break; - } -} - -s32 sub_80A28A0(s16 x, s16 y) -{ - u16 metatileId = MapGridGetMetatileIdAt(x, y); - - if(metatileId == 1) - return 1; - else if(metatileId == 633) - return 2; - else if(metatileId == 634) - return 3; - else if(metatileId == 635) - return 4; - else - return 0; -} - -void sub_80A28F4(s16 x, s16 y) -{ - s16 i; - u16 lowerY = y + 3; - - for(i = 0; i < 3; i++) - { - u16 currentX = x + i; - s16 currentXsigned = x + i; - if(MapGridGetMetatileIdAt(currentXsigned, y) == 21) - { - switch((u8)sub_80A28A0(currentXsigned, y + 1)) - { - case 1: - MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x208); - break; - case 2: - MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x281); - break; - case 3: - MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x282); - break; - case 4: - MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x283); - break; - } - } - if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY) == 1) - { - if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x208) - MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x1); - if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x281) - MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x279); - if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x282) - MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x27A); - if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x283) - MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x27B); - } - } -} - -void sub_80A2A48(struct Sprite *sprite) -{ - sprite->data0 = 8; - sprite->data1 = 0; - sprite->data3 = 0; - sprite->callback = (void *)objc_8097BBC; -} - -void objc_8097BBC(struct Sprite *sprite) -{ - u16 tempdata; - u16 tempdata2; - - sprite->pos2.x = Sin(sprite->data2, sprite->data0); - sprite->pos2.y = Cos(sprite->data2, sprite->data0); - - sprite->data2 = (sprite->data2 + 8) & 0xFF; - sprite->data0 += ((tempdata2 = sprite->data3) << 16 >> 18) + 1; // what? - sprite->data3 = tempdata2 + 1; - - tempdata = sprite->data1; - if((s16)tempdata != 28) // done rotating the grass, execute clean up function - sprite->data1++; - else - sprite->callback = (void *)sub_80A2AB8; -} - -void sub_80A2AB8(void) -{ - u8 i; - - for(i = 1; i < 8; i++) - { - DestroySprite(&gSprites[gCutGrassSpriteArray[i]]); - } - - FieldEffectStop(&gSprites[gCutGrassSpriteArray[0]], 0x3A); - sub_8064E2C(); - ScriptContext2_Disable(); -} - -void sub_80A2B00(void) -{ - PlaySE(0x80); - FieldEffectActiveListRemove(2); - EnableBothScriptContexts(); -} diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c deleted file mode 100644 index 6c2633567..000000000 --- a/src/fldeff_flash.c +++ /dev/null @@ -1,306 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "field_effect.h" -#include "main.h" -#include "palette.h" -#include "pokemon_menu.h" -#include "rom4.h" -#include "rom6.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" - -struct FlashStruct -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; - void (*func)(void); -}; - -extern struct FlashStruct gUnknown_083F7FC4[]; -extern u16 gCaveTransitionPalette_White[]; -extern u16 gCaveTransitionPalette_Black[]; -extern u16 gUnknown_083F808C[]; -extern u16 gUnknown_083F809C[]; -extern u16 gCaveTransitionTilemap[]; -extern u8 gCaveTransitionTiles[]; - -extern u8 gLastFieldPokeMenuOpened; -extern void (*gUnknown_03005CE4)(void); - -extern u8 gUnknown_081B694A[]; - -void sub_810CBFC(void); -void sub_810CC34(void); -bool8 sub_810CD5C(void); -void sub_810CE5C(u8); -void sub_810CE78(u8); -void sub_810CF18(u8); -void sub_810CF5C(u8); -void sub_810CFC4(u8); -void sub_810D00C(u8); -void sub_810D028(u8); -void sub_810D0C4(u8); -void sub_810D128(u8); - -bool8 SetUpFieldMove_Flash(void) -{ - if (gMapHeader.cave == TRUE && !FlagGet(SYS_USE_FLASH)) - { - gFieldCallback = sub_808AB90; - gUnknown_03005CE4 = sub_810CBFC; - return TRUE; - } - - return FALSE; -} - -void sub_810CBFC(void) -{ - u8 taskId = oei_task_add(); - gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; - gTasks[taskId].data[8] = (uintptr_t)sub_810CC34 >> 16; - gTasks[taskId].data[9] = (uintptr_t)sub_810CC34; -} - -void sub_810CC34(void) -{ - PlaySE(SE_W115); - FlagSet(SYS_USE_FLASH); - ScriptContext1_SetupScript(gUnknown_081B694A); -} - -void sub_810CC54(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void VBlankCB(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void sub_810CC80(void) -{ - u16 ime; - - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *)OAM, OAM_SIZE); - DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); - ResetPaletteFade(); - ResetTasks(); - ResetSpriteData(); - ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - SetVBlankCallback(VBlankCB); - SetMainCallback2(sub_810CC54); - if (!sub_810CD5C()) - SetMainCallback2(gMain.savedCallback); -} - -bool8 sub_810CD5C(void) -{ - u8 i; - u8 v0 = get_map_light_from_warp0(); - u8 v1 = sav1_map_get_light_level(); - - for (i = 0; gUnknown_083F7FC4[i].unk0; i++) - { - if (gUnknown_083F7FC4[i].unk0 == v0 && gUnknown_083F7FC4[i].unk1 == v1) - { - gUnknown_083F7FC4[i].func(); - return TRUE; - } - } - - return FALSE; -} - -u8 sub_810CDB8(u8 a1, u8 a2) -{ - u8 i; - u8 v0 = a1; - u8 v1 = a2; - - for (i = 0; gUnknown_083F7FC4[i].unk0; i++) - { - if (gUnknown_083F7FC4[i].unk0 == v0 && gUnknown_083F7FC4[i].unk1 == v1) - { - return gUnknown_083F7FC4[i].unk2; - } - } - - return FALSE; -} - -u8 fade_type_for_given_maplight_pair(u8 a1, u8 a2) -{ - u8 i; - u8 v0 = a1; - u8 v1 = a2; - - for (i = 0; gUnknown_083F7FC4[i].unk0; i++) - { - if (gUnknown_083F7FC4[i].unk0 == v0 && gUnknown_083F7FC4[i].unk1 == v1) - { - return gUnknown_083F7FC4[i].unk3; - } - } - - return FALSE; -} - -void sub_810CE48(void) -{ - CreateTask(sub_810CE5C, 0); -} - -void sub_810CE5C(u8 taskId) -{ - gTasks[taskId].func = sub_810CE78; -} - -void sub_810CE78(u8 taskId) -{ - REG_DISPCNT = 0; - LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000); - LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800); - LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20); - LoadPalette(gUnknown_083F809C, 0xE0, 0x10); - REG_BLDCNT = 15937; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG0CNT = 7948; - REG_DISPCNT = 4416; - gTasks[taskId].func = sub_810CF18; - gTasks[taskId].data[0] = 16; - gTasks[taskId].data[1] = 0; -} - -void sub_810CF18(u8 taskId) -{ - u16 count = gTasks[taskId].data[1]; - u16 blend = count + 0x1000; - REG_BLDALPHA = blend; - if (count <= 0x10) - { - gTasks[taskId].data[1]++; - } - else - { - gTasks[taskId].data[2] = 0; - gTasks[taskId].func = sub_810CF5C; - } -} - -void sub_810CF5C(u8 taskId) -{ - u16 count; - - REG_BLDALPHA = 4112; - - count = gTasks[taskId].data[2]; - - if (count < 8) - { - gTasks[taskId].data[2]++; - LoadPalette(&gUnknown_083F809C[count], 0xE0, 16 - 2 * count); - } - else - { - LoadPalette(gCaveTransitionPalette_White, 0, 0x20); - gTasks[taskId].func = sub_810CFC4; - gTasks[taskId].data[2] = 8; - } -} - -void sub_810CFC4(u8 taskId) -{ - if (gTasks[taskId].data[2]) - gTasks[taskId].data[2]--; - else - SetMainCallback2(gMain.savedCallback); -} - -void sub_810CFF8(void) -{ - CreateTask(sub_810D00C, 0); -} - -void sub_810D00C(u8 taskId) -{ - gTasks[taskId].func = sub_810D028; -} - -void sub_810D028(u8 taskId) -{ - REG_DISPCNT = 0; - LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000); - LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800); - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG0CNT = 7948; - REG_DISPCNT = 4416; - LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20); - LoadPalette(gCaveTransitionPalette_Black, 0, 0x20); - gTasks[taskId].func = sub_810D0C4; - gTasks[taskId].data[0] = 16; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; -} - -void sub_810D0C4(u8 taskId) -{ - u16 count = gTasks[taskId].data[2]; - if (count < 16) - { - gTasks[taskId].data[2]++; - gTasks[taskId].data[2]++; - LoadPalette(&gUnknown_083F808C[15 - count], 0xE0, 2 * (count + 1)); - } - else - { - REG_BLDALPHA = 4112; - REG_BLDCNT = 15937; - gTasks[taskId].func = sub_810D128; - } -} - -void sub_810D128(u8 taskId) -{ - u16 count = 16 - gTasks[taskId].data[1]; - u16 blend = count + 0x1000; - REG_BLDALPHA = blend; - if (count) - { - gTasks[taskId].data[1]++; - } - else - { - LoadPalette(gCaveTransitionPalette_Black, 0, 0x20); - SetMainCallback2(gMain.savedCallback); - } -} diff --git a/src/fldeff_softboiled.c b/src/fldeff_softboiled.c deleted file mode 100644 index cb26d9966..000000000 --- a/src/fldeff_softboiled.c +++ /dev/null @@ -1,153 +0,0 @@ -#include "global.h" -#include "fldeff_softboiled.h" -#include "menu.h" -#include "party_menu.h" -#include "pokemon.h" -#include "pokemon_menu.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "strings.h" -#include "task.h" - -struct Struct2001000 { - u8 unk0; - u8 unk1; - u8 unk2; - u8 filler3[9]; - void *unkC; -}; - -struct Struct201C000 { - struct Pokemon *unk0; - u8 filler4[1]; - u8 unk5; - u16 unk6; - u8 filler8[4]; - s32 unkC; - void* unk10; - u8 filler14[26]; - s16 unk2E; -}; - -#if ENGLISH -#define WINDOW_LEFT 3 -#define WINDOW_RIGHT 26 -#elif GERMAN -#define WINDOW_LEFT 0 -#define WINDOW_RIGHT 29 -#endif - -#define EWRAM_1000 (*(struct Struct2001000 *)(unk_2000000 + 0x1000)) -#define EWRAM_1B000_2 (*(struct Struct201B000 *)(unk_2000000 + 0x1B000)) -#define EWRAM_1C000 (*(struct Struct201C000 *)(unk_2000000 + 0x1C000)) - -// extern -extern u8 gUnknown_0202E8F6; -extern u8 gLastFieldPokeMenuOpened; - -extern u8 unk_2000000[]; -extern u8 gUnknown_0202E8F4; - -// Static -static void sub_8133D50(u8 taskId); -static void sub_8133E74(u8 taskId); -static void sub_8133EB8(u8 taskId); -static void sub_8133EF8(void); - -bool8 SetUpFieldMove_SoftBoiled(void) { - u16 maxHp; - u16 hp; - u16 minHp; - - maxHp = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_MAX_HP); - hp = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HP); - - minHp = (maxHp / 5); - if (hp >= minHp) - { - return TRUE; - } - - return FALSE; -} - -void sub_8133D28(u8 taskid) { - EWRAM_1000.unkC = sub_8133D50; - EWRAM_1B000_2.unk272 = 3; - sub_808A004(taskid); -} - -static void sub_8133D50(u8 taskId) { - u8 unk1, unk2; - u16 hp; - struct Pokemon *pokemon; - //struct Task *task; - - struct Sprite *sprites = gSprites; - - - unk1 = sprites[EWRAM_1000.unk1].data0; - unk2 = sprites[EWRAM_1000.unk2].data0; - - if (unk1 > 5 || unk2 > 5) - { - sub_806CD44(taskId); - return; - } - - EWRAM_1C000.unk0 = &gPlayerParty[sprites[EWRAM_1000.unk2].data0]; - hp = GetMonData(EWRAM_1C000.unk0, MON_DATA_HP); - - if (hp == 0 || unk1 == unk2 || GetMonData(EWRAM_1C000.unk0, MON_DATA_MAX_HP) == hp) - { - sub_8133EB8(taskId); - return; - } - - PlaySE(SE_KAIFUKU); - - EWRAM_1C000.unk5 = gSprites[EWRAM_1000.unk1].data0; - - pokemon = &gPlayerParty[EWRAM_1C000.unk5]; - EWRAM_1C000.unk0 = pokemon; - EWRAM_1C000.unk6 = 0; - EWRAM_1C000.unkC = -0x8000; - EWRAM_1C000.unk10 = sub_8133EF8; - - - gTasks[taskId].data[10] = GetMonData(EWRAM_1C000.unk0, MON_DATA_MAX_HP); - gTasks[taskId].data[11] = GetMonData(EWRAM_1C000.unk0, MON_DATA_HP); - gTasks[taskId].data[12] = gTasks[taskId].data[10] / 5; - - sub_806D5A4(); - gTasks[taskId].func = sub_806FA18; - EWRAM_1B000_2.unk282 = gTasks[taskId].data[11]; -} - -static void sub_8133E74(u8 taskId) { - if (gUnknown_0202E8F6) - { - return; - } - - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - sub_806D538(3, 0); - gTasks[taskId].func = sub_806CB74; -} - -static void sub_8133EB8(u8 taskId) { - gUnknown_0202E8F4 = 0; - sub_806D5A4(); - sub_806E834(gOtherText_CantUseOnPoke, 1); - gTasks[taskId].func = sub_8133E74; -} - -static void sub_8133EF8(void) { - sub_806CCE4(); - EWRAM_1B000_2.unk261 = 2; - DestroySprite(&gSprites[EWRAM_1000.unk1]); - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - sub_806D538(0, 0); - SwitchTaskToFollowupFunc(EWRAM_1000.unk0); -} diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c deleted file mode 100644 index 81f4f63c6..000000000 --- a/src/fldeff_strength.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "global.h" -#include "braille_puzzles.h" -#include "field_effect.h" -#include "party_menu.h" -#include "pokemon.h" -#include "pokemon_menu.h" -#include "rom6.h" -#include "script.h" -#include "task.h" -#include "text.h" - -static void sub_811AA18(void); -static void sub_811AA38(void); -static void sub_811AA9C(void); - -extern u8 gLastFieldPokeMenuOpened; -extern u16 gScriptResult; -extern void (*gFieldCallback)(void); -extern void (*gUnknown_03005CE4)(void); - -extern u8 UseStrengthScript[]; - -bool8 SetUpFieldMove_Strength(void) -{ - if (ShouldDoBrailleStrengthEffect()) - { - gScriptResult = gLastFieldPokeMenuOpened; - gFieldCallback = sub_808AB90; - gUnknown_03005CE4 = sub_811AA38; - } - else - { - if (npc_before_player_of_type(87) != TRUE) - return 0; - gScriptResult = gLastFieldPokeMenuOpened; - gFieldCallback = sub_808AB90; - gUnknown_03005CE4 = sub_811AA18; - } - - return TRUE; -} - -static void sub_811AA18(void) -{ - gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; - ScriptContext1_SetupScript(UseStrengthScript); -} - -static void sub_811AA38(void) -{ - gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; - FieldEffectStart(40); -} - -bool8 FldEff_UseStrength(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_811AA9C >> 16; - gTasks[taskId].data[9] = (u32)sub_811AA9C; - GetMonNickname(&gPlayerParty[gUnknown_0202FF84[0]], gStringVar1); - return FALSE; -} - -static void sub_811AA9C(void) -{ - if (ShouldDoBrailleStrengthEffect()) - { - DoBrailleStrengthEffect(); - } - else - { - FieldEffectActiveListRemove(40); - EnableBothScriptContexts(); - } -} diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c deleted file mode 100644 index 4c3e6bf4a..000000000 --- a/src/fldeff_sweetscent.c +++ /dev/null @@ -1,88 +0,0 @@ -#include "global.h" -#include "field_effect.h" -#include "field_player_avatar.h" -#include "palette.h" -#include "pokemon_menu.h" -#include "rom6.h" -#include "script.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "wild_encounter.h" - -static void sub_812BFD4(void); -static void sub_812C01C(void); -static void sub_812C084(u8); -static void sub_812C118(u8); - -extern u8 gLastFieldPokeMenuOpened; -extern void (*gFieldCallback)(void); -extern void (*gUnknown_03005CE4)(void); - -extern u8 SweetScentNothingHereScript[]; - -bool8 SetUpFieldMove_SweetScent(void) -{ - gFieldCallback = sub_808AB90; - gUnknown_03005CE4 = sub_812BFD4; - return TRUE; -} - -static void sub_812BFD4(void) -{ - FieldEffectStart(51); - gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; -} - -bool8 FldEff_SweetScent() -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_812C01C >> 16; - gTasks[taskId].data[9] = (u32)sub_812C01C; - return FALSE; -} - -static void sub_812C01C(void) -{ - u8 taskId; - - PlaySE(0xEC); - BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, 0x1F); - taskId = CreateTask(sub_812C084, 0); - gTasks[taskId].data[0] = 0; - FieldEffectActiveListRemove(51); -} - -static void sub_812C084(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gTasks[taskId].data[0] == 64) - { - gTasks[taskId].data[0] = 0; - if (SweetScentWildEncounter() == TRUE) - { - DestroyTask(taskId); - } - else - { - gTasks[taskId].func = sub_812C118; - BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, 0x1F); - } - } - else - { - gTasks[taskId].data[0]++; - } - } -} - -static void sub_812C118(u8 taskId) -{ - if (!gPaletteFade.active) - { - ScriptContext1_SetupScript(SweetScentNothingHereScript); - DestroyTask(taskId); - } -} diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c deleted file mode 100644 index 74e68df06..000000000 --- a/src/fldeff_teleport.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "global.h" -#include "fldeff_teleport.h" -#include "field_effect.h" -#include "field_player_avatar.h" -#include "pokemon_menu.h" -#include "rom4.h" -#include "rom6.h" -#include "task.h" - -extern void (*gFieldCallback)(void); -extern u8 gLastFieldPokeMenuOpened; -extern void (*gUnknown_03005CE4)(void); - -bool8 SetUpFieldMove_Teleport(void) -{ - if (is_light_level_1_2_3_or_6(gMapHeader.mapType) == TRUE) - { - gFieldCallback = sub_808AB90; - gUnknown_03005CE4 = hm_teleport_run_dp02scr; - return TRUE; - } - - return FALSE; -} - -void hm_teleport_run_dp02scr(void) -{ - new_game(); - FieldEffectStart(63); - gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; -} - -bool8 FldEff_UseTeleport(void) -{ - u8 taskId = oei_task_add(); - gTasks[taskId].data[8] = (u32)sub_814A404 >> 16; - gTasks[taskId].data[9] = (u32)sub_814A404; - SetPlayerAvatarTransitionFlags(1); - return 0; -} - -void sub_814A404(void) -{ - FieldEffectActiveListRemove(63); - sub_8087BA8(); -} diff --git a/src/heal_location.c b/src/heal_location.c deleted file mode 100644 index 42bc18567..000000000 --- a/src/heal_location.c +++ /dev/null @@ -1,63 +0,0 @@ -#include "global.h" -#include "heal_location.h" -#include "map_constants.h" - -#define NUM_HEAL_LOCATIONS 22 - -static const struct HealLocation sHealLocations[] = -{ - {MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, 4, 2}, - {MAP_GROUP_LITTLEROOT_TOWN_MAYS_HOUSE_2F, MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_2F, 4, 2}, - {MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, 20, 17}, - {MAP_GROUP_SLATEPORT_CITY, MAP_ID_SLATEPORT_CITY, 19, 20}, - {MAP_GROUP_MAUVILLE_CITY, MAP_ID_MAUVILLE_CITY, 22, 6}, - {MAP_GROUP_RUSTBORO_CITY, MAP_ID_RUSTBORO_CITY, 16, 39}, - {MAP_GROUP_FORTREE_CITY, MAP_ID_FORTREE_CITY, 5, 7}, - {MAP_GROUP_LILYCOVE_CITY, MAP_ID_LILYCOVE_CITY, 24, 15}, - {MAP_GROUP_MOSSDEEP_CITY, MAP_ID_MOSSDEEP_CITY, 28, 17}, - {MAP_GROUP_SOOTOPOLIS_CITY, MAP_ID_SOOTOPOLIS_CITY, 43, 32}, - {MAP_GROUP_EVER_GRANDE_CITY, MAP_ID_EVER_GRANDE_CITY, 27, 49}, - {MAP_GROUP_LITTLEROOT_TOWN, MAP_ID_LITTLEROOT_TOWN, 5, 9}, - {MAP_GROUP_LITTLEROOT_TOWN, MAP_ID_LITTLEROOT_TOWN, 14, 9}, - {MAP_GROUP_OLDALE_TOWN, MAP_ID_OLDALE_TOWN, 6, 17}, - {MAP_GROUP_DEWFORD_TOWN, MAP_ID_DEWFORD_TOWN, 2, 11}, - {MAP_GROUP_LAVARIDGE_TOWN, MAP_ID_LAVARIDGE_TOWN, 9, 7}, - {MAP_GROUP_FALLARBOR_TOWN, MAP_ID_FALLARBOR_TOWN, 14, 8}, - {MAP_GROUP_VERDANTURF_TOWN, MAP_ID_VERDANTURF_TOWN, 16, 4}, - {MAP_GROUP_PACIFIDLOG_TOWN, MAP_ID_PACIFIDLOG_TOWN, 8, 16}, - {MAP_GROUP_EVER_GRANDE_CITY, MAP_ID_EVER_GRANDE_CITY, 18, 6}, - {MAP_GROUP_BATTLE_TOWER_OUTSIDE, MAP_ID_BATTLE_TOWER_OUTSIDE, 14, 9}, - {MAP_GROUP_SOUTHERN_ISLAND_EXTERIOR, MAP_ID_SOUTHERN_ISLAND_EXTERIOR, 15, 20}, -}; - -u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum) -{ - u32 i; - - for (i = 0; i < NUM_HEAL_LOCATIONS; i++) - { - if (sHealLocations[i].group == mapGroup && sHealLocations[i].map == mapNum) - return i + 1; - } - return 0; -} - -const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum) -{ - u32 index = GetHealLocationIndexByMap(mapGroup, mapNum); - - if (index == 0) - return NULL; - else - return &sHealLocations[index - 1]; -} - -const struct HealLocation *GetHealLocation(u32 index) -{ - if (index == 0) - return NULL; - else if (index > NUM_HEAL_LOCATIONS) - return NULL; - else - return &sHealLocations[index - 1]; -} diff --git a/src/hof_pc.c b/src/hof_pc.c deleted file mode 100644 index 4646d171c..000000000 --- a/src/hof_pc.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "global.h" -#include "hall_of_fame.h" -#include "main.h" -#include "palette.h" -#include "rom4.h" -#include "script.h" -#include "script_menu.h" -#include "task.h" - -extern void (*gFieldCallback)(void); -extern void (*gUnknown_0300485C)(void); - -static void ReshowPCMenuAfterHallOfFamePC(void); -static void Task_WaitForPaletteFade(u8); - -void AccessHallOfFamePC(void) -{ - SetMainCallback2(sub_81428CC); - ScriptContext2_Enable(); -} - -void ReturnFromHallOfFamePC(void) -{ - SetMainCallback2(c2_exit_to_overworld_2_switch); - gFieldCallback = ReshowPCMenuAfterHallOfFamePC; -} - -static void ReshowPCMenuAfterHallOfFamePC(void) -{ - ScriptContext2_Enable(); - sub_8053E90(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); - TryCreatePCMenu(); - sub_80B5838(); - CreateTask(Task_WaitForPaletteFade, 10); -} - -static void Task_WaitForPaletteFade(u8 taskId) -{ - if (!gPaletteFade.active) - DestroyTask(taskId); -} diff --git a/src/intro.c b/src/intro.c deleted file mode 100644 index a43e0356c..000000000 --- a/src/intro.c +++ /dev/null @@ -1,3167 +0,0 @@ -#include "global.h" -#include "gba/m4a_internal.h" -#include "intro.h" -#include "data2.h" -#include "decompress.h" -#include "hall_of_fame.h" -#include "intro_credits_graphics.h" -#include "libgncmultiboot.h" -#include "link.h" -#include "m4a.h" -#include "main.h" -#include "new_game.h" -#include "palette.h" -#include "rng.h" -#include "save.h" -#include "songs.h" -#include "sound.h" -#include "species.h" -#include "task.h" -#include "title_screen.h" -#include "trig.h" -#include "unknown_task.h" - -extern struct SpriteTemplate gUnknown_02024E8C; -extern u16 gUnknown_02039358; -extern u16 gUnknown_0203935A; -extern u16 gSaveFileStatus; -extern u8 gReservedSpritePaletteCount; -extern const u8 gInterfaceGfx_PokeBall[]; -extern const u8 gInterfacePal_PokeBall[]; -extern const u8 gIntroCopyright_Gfx[]; -extern const u16 gIntroCopyright_Pal[]; -extern const u16 gIntroCopyright_Tilemap[]; -extern void *const gUnknown_0840B5A0[]; - -static EWRAM_DATA u16 gUnknown_02039318 = 0; -static EWRAM_DATA u16 gUnknown_0203931A = 0; - -u32 gIntroFrameCounter; -struct GcmbStruct gMultibootProgramStruct; - -//-------------------------------------------------- -// Graphics Data -//-------------------------------------------------- - -static const u16 Palette_406340[] = INCBIN_U16("graphics/intro/unknown1.gbapal"); -static const u16 Palette_406360[] = INCBIN_U16("graphics/intro/unknown2.gbapal"); -#if ENGLISH -static const u8 gIntroTiles[] = INCBIN_U8("graphics/intro/intro.4bpp.lz"); -#elif GERMAN -extern const u8 gIntroTiles[]; -#endif -static const u16 gIntro1BGPals[][16] = -{ - INCBIN_U16("graphics/intro/intro1_bgpal1.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal2.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal3.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal4.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal5.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal6.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal7.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal8.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal9.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal10.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal11.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal12.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal13.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal14.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal15.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal16.gbapal"), -}; -static const u8 gIntro1BG0_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg0_map.bin.lz"); -static const u8 gIntro1BG1_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg1_map.bin.lz"); -static const u8 gIntro1BG2_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg2_map.bin.lz"); -static const u8 gIntro1BG3_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg3_map.bin.lz"); -static const u8 gIntro1BGLeavesGfx[] = INCBIN_U8("graphics/intro/introgfx.4bpp.lz"); -static const u16 gIntro3PokeballPal[] = INCBIN_U16("graphics/intro/intro3_pokeball.gbapal"); -static const u8 gIntro3Pokeball_Tilemap[] = INCBIN_U8("graphics/intro/intro3_pokeball_map.bin.lz"); -static const u8 gIntro3Pokeball_Gfx[] = INCBIN_U8("graphics/intro/intro3_pokeball.8bpp.lz"); -static const u16 gIntro3Streaks_Pal[] = INCBIN_U16("graphics/intro/intro3_streaks.gbapal"); -static const u8 gIntro3Streaks_Gfx[] = INCBIN_U8("graphics/intro/intro3_streaks.4bpp.lz"); -static const u8 gIntro3Streaks_Tilemap[] = INCBIN_U8("graphics/intro/intro3_streaks_map.bin.lz"); -static const u16 gIntro3Misc1Palette[] = INCBIN_U16("graphics/intro/intro3_misc1.gbapal"); -static const u16 gIntro3Misc2Palette[] = INCBIN_U16("graphics/intro/intro3_misc2.gbapal"); -static const u8 gIntro3MiscTiles[] = INCBIN_U8("graphics/intro/intro3_misc.4bpp.lz"); -static const u16 gIntro1EonPalette[] = INCBIN_U16("graphics/intro/intro1_eon.gbapal"); -static const u8 gIntro1EonTiles[] = INCBIN_U8("graphics/intro/intro1_eon.4bpp.lz"); -static const struct OamData gOamData_840ADE8 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840ADF0[] = -{ - ANIMCMD_FRAME(16, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840ADF8[] = -{ - ANIMCMD_FRAME(24, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AE00[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AE08[] = -{ - ANIMCMD_FRAME(48, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840AE10[] = -{ - gSpriteAnim_840ADF0, - gSpriteAnim_840ADF8, - gSpriteAnim_840AE00, - gSpriteAnim_840AE08, -}; -static void sub_813D208(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840AE20 = -{ - .tileTag = 2000, - .paletteTag = 2000, - .oam = &gOamData_840ADE8, - .anims = gSpriteAnimTable_840AE10, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813D208, -}; -static const union AnimCmd Unknown_40AE38[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(64, 4), - ANIMCMD_FRAME(128, 4), - ANIMCMD_FRAME(192, 4), - ANIMCMD_JUMP(0), -}; -static const union AnimCmd Unknown_40AE4C[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(64, 8), - ANIMCMD_FRAME(128, 8), - ANIMCMD_FRAME(192, 8), - ANIMCMD_JUMP(0), -}; -static const union AnimCmd Unknown_40AE60[] = -{ - ANIMCMD_FRAME(256, 4), - ANIMCMD_FRAME(0x140, 4), - ANIMCMD_FRAME(0x180, 4), - ANIMCMD_END, -}; -static const union AnimCmd Unknown_40AE70[] = -{ - ANIMCMD_FRAME(0x180, 16), - ANIMCMD_FRAME(0x140, 16), - ANIMCMD_FRAME(256, 16), - ANIMCMD_END, -}; -static const union AnimCmd *const gUnknown_0840AE80[] = -{ - Unknown_40AE38, - Unknown_40AE4C, - Unknown_40AE60, - Unknown_40AE70, -}; -static const struct OamData gOamData_840AE90 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_840AE98 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_840AEA0 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 2, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840AEA8[] = -{ - ANIMCMD_FRAME(80, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEB0[] = -{ - ANIMCMD_FRAME(84, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEB8[] = -{ - ANIMCMD_FRAME(88, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEC0[] = -{ - ANIMCMD_FRAME(92, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEC8[] = -{ - ANIMCMD_FRAME(96, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AED0[] = -{ - ANIMCMD_FRAME(100, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AED8[] = -{ - ANIMCMD_FRAME(104, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEE0[] = -{ - ANIMCMD_FRAME(112, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEE8[] = -{ - ANIMCMD_FRAME(113, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEF0[] = -{ - ANIMCMD_FRAME(114, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEF8[] = -{ - ANIMCMD_FRAME(115, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AF00[] = -{ - ANIMCMD_FRAME(116, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AF08[] = -{ - ANIMCMD_FRAME(117, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AF10[] = -{ - ANIMCMD_FRAME(128, 8), - ANIMCMD_END, -}; -#if GERMAN -static const union AnimCmd gSpriteAnim_8416DA4[] = -{ - ANIMCMD_FRAME(118, 8), - ANIMCMD_END, -}; -#endif -static const union AnimCmd *const gSpriteAnimTable_840AF18[] = -{ - gSpriteAnim_840AEA8, - gSpriteAnim_840AEB0, - gSpriteAnim_840AEB8, - gSpriteAnim_840AEC0, - gSpriteAnim_840AEC8, - gSpriteAnim_840AED0, - gSpriteAnim_840AED8, -}; -static const union AnimCmd *const gSpriteAnimTable_840AF34[] = -{ - gSpriteAnim_840AEE0, - gSpriteAnim_840AEE8, - gSpriteAnim_840AEF0, - gSpriteAnim_840AEF8, - gSpriteAnim_840AF00, - gSpriteAnim_840AF08, -#if GERMAN - gSpriteAnim_8416DA4, -#endif -}; -static const union AnimCmd *const gSpriteAnimTable_840AF4C[] = -{ - gSpriteAnim_840AF10, -}; -static const s16 gUnknown_0840AF50[][2] = -{ - {0, -72}, - {1, -56}, - {2, -40}, - {3, -24}, - {4, 8}, - {5, 24}, - {3, 40}, - {1, 56}, - {6, 72}, -}; -static const s16 gUnknown_0840AF74[][2] = -{ - {0, -28}, - {1, -20}, - {2, -12}, - {3, -4}, - {2, 4}, - {4, 12}, - {5, 20}, - {3, 28}, -}; -static void sub_813D908(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840AF94 = -{ - .tileTag = 2000, - .paletteTag = 2001, - .oam = &gOamData_840AE90, - .anims = gSpriteAnimTable_840AF18, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813D908, -}; -static const struct SpriteTemplate gSpriteTemplate_840AFAC = -{ - .tileTag = 2000, - .paletteTag = 2001, - .oam = &gOamData_840AE98, - .anims = gSpriteAnimTable_840AF34, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813D908, -}; -static const struct SpriteTemplate gSpriteTemplate_840AFC4 = -{ - .tileTag = 2000, - .paletteTag = 2001, - .oam = &gOamData_840AEA0, - .anims = gSpriteAnimTable_840AF4C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813D908, -}; -static const struct OamData gOamData_840AFDC = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840AFE4[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_JUMP(0), -}; -static const union AnimCmd *const gSpriteAnimTable_840AFEC[] = -{ - gSpriteAnim_840AFE4, -}; -static void sub_813DA64(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840AFF0 = -{ - .tileTag = 2002, - .paletteTag = 2002, - .oam = &gOamData_840AFDC, - .anims = gSpriteAnimTable_840AFEC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813DA64, -}; -const struct CompressedSpriteSheet gUnknown_0840B008[] = -{ - {gIntroTiles, 0x1400, 2000}, - {NULL}, -}; -const struct CompressedSpriteSheet gUnknown_0840B018[] = -{ - {gIntro1EonTiles, 0x400, 2002}, - {NULL}, -}; -const struct SpritePalette gUnknown_0840B028[] = -{ - {Palette_406340, 2000}, - {Palette_406360, 2001}, - {gIntro1EonPalette, 2002}, - {NULL}, -}; -static const union AnimCmd gUnknown_0840B048[] = -{ - ANIMCMD_FRAME(3, 0), - ANIMCMD_END, -}; -static const union AnimCmd gUnknown_0840B050[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -static const union AnimCmd gUnknown_0840B058[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(2, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gUnknown_0840B064[] = -{ - gUnknown_0840B048, - gUnknown_0840B050, - gUnknown_0840B058, -}; -static const struct OamData gOamData_840B070 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B078[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840B080[] = -{ - gSpriteAnim_840B078, -}; -static void sub_813E30C(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B084 = -{ - .tileTag = 2002, - .paletteTag = 2002, - .oam = &gOamData_840B070, - .anims = gSpriteAnimTable_840B080, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813E30C, -}; -static const struct OamData gOamData_840B09C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B0A4[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840B0AC[] = -{ - gSpriteAnim_840B0A4, -}; -static void sub_813E4B8(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B0B0 = -{ - .tileTag = 2003, - .paletteTag = 2003, - .oam = &gOamData_840B09C, - .anims = gSpriteAnimTable_840B0AC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813E4B8, -}; -static const struct OamData gOamData_840B0C8 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B0D0[] = -{ - ANIMCMD_FRAME(14, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840B0D8[] = -{ - gSpriteAnim_840B0D0, -}; -static void sub_813E5E0(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B0DC = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B0C8, - .anims = gSpriteAnimTable_840B0D8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813E5E0, -}; -static void sub_813E6C0(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B0F4 = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B0C8, - .anims = gSpriteAnimTable_840B0D8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813E6C0, -}; -static const struct OamData gOamData_840B10C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B114[] = -{ - ANIMCMD_FRAME(6, 8), - ANIMCMD_FRAME(6, 8, .hFlip = TRUE), - ANIMCMD_JUMP(0), -}; -static const union AnimCmd *const gSpriteAnimTable_840B120[] = -{ - gSpriteAnim_840B114, -}; -static void sub_813E804(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B124 = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B10C, - .anims = gSpriteAnimTable_840B120, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813E804, -}; -static const struct OamData gOamData_840B13C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B144[] = -{ - ANIMCMD_FRAME(10, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840B14C[] = -{ - gSpriteAnim_840B144, -}; -static void sub_813E980(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B150 = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B13C, - .anims = gSpriteAnimTable_840B14C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813E980, -}; -static const u8 gUnknown_0840B168[] = {0xE6, 0xEB, 0xE4, 0xEA, 0xE5, 0xE9, 0xE7, 0xE8}; -static void sub_813EA60(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B170 = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B13C, - .anims = gSpriteAnimTable_840B14C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813EA60, -}; -static const u16 gUnknown_0840B188[] = {0x200, 0x1C0, 0x180, 0x140, 0x100, 0xE0, 0xC0, 0xA0, 0x80, 0x80}; -static const struct OamData gOamData_840B19C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B1A4[] = -{ - ANIMCMD_FRAME(2, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840B1AC[] = -{ - gSpriteAnim_840B1A4, -}; -static void sub_813EBBC(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B1B0 = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B19C, - .anims = gSpriteAnimTable_840B1AC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813EBBC, -}; -static void sub_813EC90(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B1C8 = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B19C, - .anims = gSpriteAnimTable_840B1AC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813EC90, -}; -static const struct OamData gOamData_840B1E0 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B1E8[] = -{ - ANIMCMD_FRAME(16, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840B1F0[] = -{ - gSpriteAnim_840B1E8, -}; -static void sub_813EDFC(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B1F4 = -{ - .tileTag = 2003, - .paletteTag = 2003, - .oam = &gOamData_840B1E0, - .anims = gSpriteAnimTable_840B1F0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813EDFC, -}; -const struct CompressedSpriteSheet gIntro3PokeballGfx_Table[] = -{ - {gInterfaceGfx_PokeBall, 0x100, 2002}, - {NULL}, -}; -const struct CompressedSpriteSheet gIntro3MiscGfx_Table[] = -{ - {gIntro3MiscTiles, 0xa00, 2003}, - {NULL}, -}; -const struct CompressedSpritePalette gInterfacePokeballPal_Table[] = -{ - {gInterfacePal_PokeBall, 2002}, - {NULL}, -}; -const struct SpritePalette gIntro3MiscPal_Table[] = -{ - {gIntro3Misc1Palette, 2003}, - {gIntro3Misc2Palette, 2004}, - {NULL}, -}; -const u32 unusedData = 0x02000000; - -static void MainCB2_EndIntro(void); -static void Task_IntroLoadPart1Graphics(u8); -static void Task_IntroFadeIn(u8); -static void Task_IntroWaterDrops(u8); -static void Task_IntroScrollDownAndShowEon(u8); -static void Task_IntroWaitToSetupPart2(u8); -static void Task_IntroLoadPart2Graphics(u8); -static void Task_IntroStartBikeRide(u8); -static void Task_IntroHandleBikeAndEonMovement(u8); -static void Task_IntroWaitToSetupPart3(u8); -static void Task_IntroLoadPart3Graphics(u8); -static void Task_IntroSpinAndZoomPokeball(u8); -static void Task_IntroWaitToSetupPart3DoubleFight(u8); -static void Task_IntroLoadPart3Streaks(u8); -static void task_intro_14(u8); -static void task_intro_15(u8); -static void task_intro_16(u8); -static void task_intro_17(u8); -static void Task_IntroPokemonBattle(u8); -static void task_intro_19(u8); -static void task_intro_20(u8); -static void intro_reset_and_hide_bgs(void); -static void sub_813CCE8(u8); -static u16 sub_813CE88(u16, s16, s16, u16, u8); -static u8 sub_813CFA8(u16, u16, u16, u16); -static void sub_813D084(u8); -static void sub_813D220(struct Sprite *); -static void sub_813D368(struct Sprite *); -static void sub_813D414(struct Sprite *); -static void SpriteCB_WaterDropFall(struct Sprite *); -static u8 CreateWaterDrop(s16, s16, u16, u16, u16, u8); -static void sub_813D788(struct Sprite *); -static void sub_813D880(struct Sprite *); -static u8 CreateGameFreakLogo(s16, s16, u8); -static void sub_813DB9C(struct Sprite *); -static void sub_813DE70(struct Sprite *); -static void sub_813E10C(struct Sprite *); -static void sub_813E210(struct Sprite *); -static void sub_813E580(u16, u16); -static void sub_813E7C0(u8); -static void sub_813E930(u8); -static void InitIntroTorchicAttackAnim(u8); -static void InitIntroMudkipAttackAnim(u8); - -static void VBlankCB_Intro(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void MainCB2_Intro(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - if (gMain.newKeys && !gPaletteFade.active) - SetMainCallback2(MainCB2_EndIntro); - else if (gIntroFrameCounter != -1) - gIntroFrameCounter++; -} - -static void MainCB2_EndIntro(void) -{ - if (!UpdatePaletteFade()) - SetMainCallback2(CB2_InitTitleScreen); -} - -static void LoadCopyrightGraphics(u16 tilesetAddress, u16 tilemapAddress, u16 paletteAddress) -{ - LZ77UnCompVram(gIntroCopyright_Gfx, (void *)(VRAM + tilesetAddress)); - LoadPalette(gIntroCopyright_Pal, paletteAddress, 0x20); - CpuCopy16(gIntroCopyright_Tilemap, (void *)(VRAM + tilemapAddress), 0x500); -} - -static void SerialCB_CopyrightScreen(void) -{ - GameCubeMultiBoot_HandleSerialInterrupt(&gMultibootProgramStruct); -} - -static u8 SetUpCopyrightScreen(void) -{ - u16 ime; - - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - *(u16 *)PLTT = 0x7FFF; - REG_DISPCNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *)OAM, OAM_SIZE); - DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); - ResetPaletteFade(); - LoadCopyrightGraphics(0, 0x3800, 0); - remove_some_task(); - ResetTasks(); - ResetSpriteData(); - FreeAllSpritePalettes(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF); - REG_BG0CNT = BGCNT_PRIORITY(0) - | BGCNT_CHARBASE(0) - | BGCNT_SCREENBASE(7) - | BGCNT_16COLOR - | BGCNT_TXT256x256; - ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - SetVBlankCallback(VBlankCB_Intro); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; - SetSerialCallback(SerialCB_CopyrightScreen); - GameCubeMultiBoot_Init(&gMultibootProgramStruct); - default: - UpdatePaletteFade(); - gMain.state++; - GameCubeMultiBoot_Main(&gMultibootProgramStruct); - break; - case 140: - GameCubeMultiBoot_Main(&gMultibootProgramStruct); - if (gMultibootProgramStruct.gcmb_field_2 != 1) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - gMain.state++; - } - break; - case 141: - if (UpdatePaletteFade()) - break; - CreateTask(Task_IntroLoadPart1Graphics, 0); - SetMainCallback2(MainCB2_Intro); - if (gMultibootProgramStruct.gcmb_field_2) - { - GameCubeMultiBoot_ExecuteProgram(&gMultibootProgramStruct); - } - else - { - GameCubeMultiBoot_Quit(); - SetSerialCallback(SerialCB); - } - return 0; - } - - return 1; -} - -void CB2_InitCopyrightScreenAfterBootup(void) -{ - if (!SetUpCopyrightScreen()) - { - sub_8052E4C(); - ResetSaveCounters(); - sub_8125EC8(0); - if (gSaveFileStatus == 0 || gSaveFileStatus == 2) - ClearSav2(); - SetPokemonCryStereo(gSaveBlock2.optionsSound); - } -} - -void CB2_InitCopyrightScreenAfterTitleScreen(void) -{ - SetUpCopyrightScreen(); -} - -static void Task_IntroLoadPart1Graphics(u8 taskId) -{ - SetVBlankCallback(NULL); - gUnknown_02039318 = Random() & 1; - intro_reset_and_hide_bgs(); - REG_BG3VOFS = 0; - REG_BG2VOFS = 0x50; - REG_BG1VOFS = 0x18; - REG_BG0VOFS = 0x28; - LZ77UnCompVram(gIntro1BGLeavesGfx, (void *)VRAM); - LZ77UnCompVram(gIntro1BG0_Tilemap, (void *)(VRAM + 0x8000)); - DmaClear16(3, VRAM + 0x8800, 0x800); - LZ77UnCompVram(gIntro1BG1_Tilemap, (void *)(VRAM + 0x9000)); - DmaClear16(3, VRAM + 0x9800, 0x800); - LZ77UnCompVram(gIntro1BG2_Tilemap, (void *)(VRAM + 0xA000)); - DmaClear16(3, VRAM + 0xA800, 0x800); - LZ77UnCompVram(gIntro1BG3_Tilemap, (void *)(VRAM + 0xB000)); - DmaClear16(3, VRAM + 0xB800, 0x800); - LoadPalette(gIntro1BGPals, 0, sizeof(gIntro1BGPals)); - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(22) | BGCNT_16COLOR | BGCNT_TXT256x512; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(20) | BGCNT_16COLOR | BGCNT_TXT256x512; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(18) | BGCNT_16COLOR | BGCNT_TXT256x512; - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(16) | BGCNT_16COLOR | BGCNT_TXT256x512; - LoadCompressedObjectPic(&gUnknown_0840B008[0]); - LoadCompressedObjectPic(&gUnknown_0840B018[0]); - LoadSpritePalettes(gUnknown_0840B028); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1F0, 0x20); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1E1, 0x1E); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1D2, 0x1C); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1C3, 0x1A); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1B4, 0x18); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1A5, 0x16); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x196, 0x14); - gTasks[taskId].data[0] = CreateWaterDrop(236, -14, 0x200, 1, 0x78, FALSE); - gTasks[taskId].func = Task_IntroFadeIn; -} - -static void Task_IntroFadeIn(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - SetVBlankCallback(VBlankCB_Intro); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; - gTasks[taskId].func = Task_IntroWaterDrops; - gIntroFrameCounter = 0; - m4aSongNumStart(0x19E); - ResetSerial(); -} - -static void Task_IntroWaterDrops(u8 taskId) -{ - //start moving rock - if (gIntroFrameCounter == 76) - gSprites[gTasks[taskId].data[0]].data0 = 1; - - //drop rock - if (gIntroFrameCounter == 251) - gSprites[gTasks[taskId].data[0]].data0 = 2; - - if (gIntroFrameCounter == 368) - CreateWaterDrop(48, 0, 0x400, 5, 0x70, TRUE); - if (gIntroFrameCounter == 384) - CreateWaterDrop(200, 60, 0x400, 9, 0x80, TRUE); - - if (gIntroFrameCounter == 560) - CreateGameFreakLogo(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, CreateTask(sub_813CCE8, 0)); - - if (gIntroFrameCounter > 739) - { - gTasks[taskId].data[1] = 0x50; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0x18; - gTasks[taskId].data[4] = 0; - gTasks[taskId].data[5] = 0x28; - gTasks[taskId].data[6] = 0; - gTasks[taskId].func = Task_IntroScrollDownAndShowEon; - } -} - -static void Task_IntroScrollDownAndShowEon(u8 taskId) -{ - if (gIntroFrameCounter < 904) - { - s32 r2; - - //slide backgrounds downward - r2 = (gTasks[taskId].data[1] << 16) + (u16)gTasks[taskId].data[2] - 0xC000; - gTasks[taskId].data[1] = r2 >> 16; - gTasks[taskId].data[2] = r2; - REG_BG2VOFS = gTasks[taskId].data[1]; - r2 = (gTasks[taskId].data[3] << 16) + (u16)gTasks[taskId].data[4] - 0x10000; - gTasks[taskId].data[3] = r2 >> 16; - gTasks[taskId].data[4] = r2; - REG_BG1VOFS = gTasks[taskId].data[3]; - r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6] - 0x18000; - gTasks[taskId].data[5] = r2 >> 16; - gTasks[taskId].data[6] = r2; - REG_BG0VOFS = gTasks[taskId].data[5]; - - //show Lati@s sprite - if (gIntroFrameCounter == 880) - { - u8 spriteId = CreateSprite(&gSpriteTemplate_840AFF0, 200, 160, 10); - - gSprites[spriteId].invisible = 1; - } - } - else - { - //fade to white - if (gIntroFrameCounter > 1007) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0xFFFF); - gTasks[taskId].func = Task_IntroWaitToSetupPart2; - } - } -} - -static void Task_IntroWaitToSetupPart2(u8 taskId) -{ - if (gIntroFrameCounter > 1026) - gTasks[taskId].func = Task_IntroLoadPart2Graphics; -} - -static void Task_IntroLoadPart2Graphics(u8 taskId) -{ - intro_reset_and_hide_bgs(); - SetVBlankCallback(NULL); - ResetSpriteData(); - FreeAllSpritePalettes(); - gUnknown_02039358 = 0; - gUnknown_0203935A = 0; -#ifdef SAPPHIRE - load_intro_part2_graphics(0); -#else - load_intro_part2_graphics(1); -#endif - gTasks[taskId].func = Task_IntroStartBikeRide; -} - -static void Task_IntroStartBikeRide(u8 taskId) -{ - u8 spriteId; - - if (gUnknown_02039318 == 0) - LoadCompressedObjectPic(&gIntro2BrendanSpriteSheet); - else - LoadCompressedObjectPic(&gIntro2MaySpriteSheet); - LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet); -#ifdef SAPPHIRE - LoadCompressedObjectPic(&gIntro2LatiasSpriteSheet); -#else - LoadCompressedObjectPic(&gIntro2LatiosSpriteSheet); -#endif - LoadSpritePalettes(gIntro2SpritePalettes); - if (gUnknown_02039318 == 0) - spriteId = intro_create_brendan_sprite(0x110, 100); - else - spriteId = intro_create_may_sprite(0x110, 100); - gSprites[spriteId].callback = sub_813D788; - gSprites[spriteId].anims = gUnknown_0840AE80; - gTasks[taskId].data[1] = spriteId; -#ifdef SAPPHIRE - spriteId = intro_create_latias_sprite(-0x40, 0x3C); -#else - spriteId = intro_create_latios_sprite(-0x40, 0x3C); -#endif - gSprites[spriteId].callback = sub_813D880; - gTasks[taskId].data[2] = spriteId; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0xFFFF); - SetVBlankCallback(VBlankCB_Intro); -#ifdef SAPPHIRE - gTasks[taskId].data[0] = sub_8148EC0(0, 0x4000, 0x40, 0x10); - sub_8148C78(0); -#else - gTasks[taskId].data[0] = sub_8148EC0(1, 0x4000, 0x400, 0x10); - sub_8148C78(1); -#endif - gTasks[taskId].func = Task_IntroHandleBikeAndEonMovement; -} - -static void Task_IntroHandleBikeAndEonMovement(u8 taskId) -{ - s16 a; - u16 sine; - - if (gIntroFrameCounter > 1823) - { - BeginNormalPaletteFade(0xFFFFFFFF, 16, 0, 16, 0xFFFF); - gTasks[taskId].func = Task_IntroWaitToSetupPart3; - } - if (gIntroFrameCounter == 1109) - gSprites[gTasks[taskId].data[1]].data0 = 1; - if (gIntroFrameCounter == 1214) - gSprites[gTasks[taskId].data[1]].data0 = 0; - if (gIntroFrameCounter == 1394) - gSprites[gTasks[taskId].data[2]].data0 = 1; - if (gIntroFrameCounter == 1398) - gSprites[gTasks[taskId].data[1]].data0 = 2; - if (gIntroFrameCounter == 1586) - gSprites[gTasks[taskId].data[1]].data0 = 3; - if (gIntroFrameCounter == 1727) - gSprites[gTasks[taskId].data[1]].data0 = 4; - - //TODO: Clean this up - a = (((u16)gTasks[taskId].data[3] << 16) >> 18) & 0x7F; - sine = Sin(a, 48); - gUnknown_0203935A = sine; - if (gTasks[taskId].data[3] < 512) - gTasks[taskId].data[3]++; -#ifdef SAPPHIRE - sub_8149020(0); -#else - sub_8149020(1); -#endif -} - -static void Task_IntroWaitToSetupPart3(u8 taskId) -{ - if (gIntroFrameCounter > 2068) - { - DestroyTask(gTasks[taskId].data[0]); - gTasks[taskId].func = Task_IntroLoadPart3Graphics; - } -} - -static void Task_IntroLoadPart3Graphics(u8 taskId) -{ - intro_reset_and_hide_bgs(); - LZ77UnCompVram(gIntro3Pokeball_Gfx, (void *)VRAM); - LZ77UnCompVram(gIntro3Pokeball_Tilemap, (void *)(VRAM + 0x4000)); - LoadPalette(gIntro3PokeballPal, 0, 0x200); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - sub_813CE30(0x78, 0x50, 0, 0); - ResetSpriteData(); - FreeAllSpritePalettes(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF); - REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_256COLOR | BGCNT_AFF256x256; - REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - gTasks[taskId].func = Task_IntroSpinAndZoomPokeball; - gIntroFrameCounter = 0; - m4aSongNumStart(0x1BA); -} - -static void Task_IntroSpinAndZoomPokeball(u8 taskId) -{ - gTasks[taskId].data[0] += 0x400; - if (gTasks[taskId].data[1] <= 0x6BF) - { - gTasks[taskId].data[1] += gTasks[taskId].data[2]; - gTasks[taskId].data[2]++; - } - else - { - gTasks[taskId].func = Task_IntroWaitToSetupPart3DoubleFight; - } - sub_813CE30(0x78, 0x50, 0x10000 / gTasks[taskId].data[1], gTasks[taskId].data[0]); - if (gIntroFrameCounter == 44) - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); -} - -static void Task_IntroWaitToSetupPart3DoubleFight(u8 taskId) -{ - if (gIntroFrameCounter > 59) - gTasks[taskId].func = Task_IntroLoadPart3Streaks; -} - -extern u8 unk_2000000[][32]; - -static void Task_IntroLoadPart3Streaks(u8 taskId) -{ - u16 i; - void *vram; - - intro_reset_and_hide_bgs(); - for (i = 0; i < 32; i++) - { - unk_2000000[0][i] = 0; - unk_2000000[1][i] = 17; - unk_2000000[2][i] = 34; - } - vram = (void *)VRAM; - DmaCopy16(3, unk_2000000, vram, 0x60); - for (i = 0; i < 0x280; i++) - ((u16 *)(VRAM + 0x3000))[i] = 0xF001; - for (i = 0; i < 0x80; i++) - ((u16 *)(VRAM + 0x3800))[i] = 0xF002; - for (i = 0; i < 0x180; i++) - ((u16 *)(VRAM + 0x3900))[i] = 0xF000; - for (i = 0; i < 0x80; i++) - ((u16 *)(VRAM + 0x3C00))[i] = 0xF002; - gPlttBufferUnfaded[0xF0] = RGB_WHITE; - gPlttBufferFaded[0xF0] = RGB_WHITE; - sub_813D084(1); - gPlttBufferUnfaded[0xF2] = RGB_BLACK; - gPlttBufferFaded[0xF2] = RGB_BLACK; - LZ77UnCompVram(gIntro3Streaks_Gfx, (void *)(VRAM + 0x4000)); - LZ77UnCompVram(gIntro3Streaks_Tilemap, (void *)(VRAM + 0x7000)); - LoadPalette(gIntro3Streaks_Pal, 0, 0x20); - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 8; - LoadCompressedObjectPic(&gIntro3PokeballGfx_Table[0]); - LoadCompressedObjectPic(&gIntro3MiscGfx_Table[0]); - LoadCompressedObjectPalette(&gInterfacePokeballPal_Table[0]); - LoadSpritePalettes(gIntro3MiscPal_Table); - gTasks[taskId].func = task_intro_14; -} - -static void task_intro_14(u8 taskId) -{ - REG_WIN0H = 0xF0; - REG_WIN0V = 0xA0; - REG_WININ = 0x1C; - REG_WINOUT = 0x1D; - REG_BG3CNT = BGCNT_PRIORITY(3) - | BGCNT_CHARBASE(0) - | BGCNT_SCREENBASE(6) - | BGCNT_16COLOR - | BGCNT_TXT256x256; - REG_BG0CNT = BGCNT_PRIORITY(0) - | BGCNT_CHARBASE(0) - | BGCNT_SCREENBASE(7) - | BGCNT_16COLOR - | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; - gTasks[taskId].data[15] = CreateTask(task_intro_20, 0); - gTasks[gTasks[taskId].data[15]].data[0] = 0; - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = task_intro_15; -} - -static void task_intro_15(u8 taskId) -{ - u16 foo = gTasks[taskId].data[0]; - - if (gTasks[taskId].data[0] != 32) - { - u32 bar; //needed to match for some reason - - gTasks[taskId].data[0] += 4; - REG_WIN0V = (gTasks[taskId].data[0] * 256) - (bar = foo - 0x9C); - } - else - { - REG_WIN0V = 0x2080; - gTasks[taskId].func = task_intro_16; - } -} - -static void task_intro_16(u8 taskId) -{ - gTasks[taskId].func = task_intro_17; -} - -static void task_intro_17(u8 taskId) -{ - gUnknown_0203931A = 0; - gTasks[taskId].func = Task_IntroPokemonBattle; -} - -static void Task_IntroPokemonBattle(u8 taskId) -{ - u8 spriteId; - - if (gIntroFrameCounter == 80) - { - spriteId = sub_813CE88(SPECIES_SHARPEDO, 0xF0, 0xA0, 5, 1); - gSprites[spriteId].callback = sub_813DB9C; - gSprites[spriteId].data1 = 1; - gSprites[spriteId].data2 = 0; - } - if (gIntroFrameCounter == 152) - { - spriteId = sub_813CE88(SPECIES_DUSKULL, 0, 0xA0, 4, 1); - gSprites[spriteId].callback = sub_813DB9C; - gSprites[spriteId].data1 = 2; - gSprites[spriteId].data2 = 1; - } - if (gIntroFrameCounter == 219) - { - sub_813D084(0); - spriteId = sub_813CFA8(gUnknown_02039318, 0x110, 0x60, 6); - gSprites[spriteId].callback = sub_813DE70; - gTasks[taskId].data[1] = spriteId; - } - if (gIntroFrameCounter == 304) - { - gTasks[gTasks[taskId].data[15]].data[0] = 4; - gSprites[gTasks[taskId].data[1]].data0 = 2; - } - if (gIntroFrameCounter == 384) - { - gTasks[gTasks[taskId].data[15]].data[0] = 0; - gSprites[gTasks[taskId].data[1]].data0 = 4; - } - if (gIntroFrameCounter == 400) - { - BeginNormalPaletteFade(0xFF0000, 0, 0x10, 0, 0x7EFF); - } - if (gIntroFrameCounter == 432) - { - gSprites[gTasks[taskId].data[1]].data0 = 5; - } - if (gIntroFrameCounter == 462) - { - gSprites[gTasks[taskId].data[1]].data0 = 6; - gTasks[gTasks[taskId].data[15]].data[0] = 2; - } - if (gIntroFrameCounter == 463) - { - sub_813D084(1); - spriteId = sub_813CE88(SPECIES_SHARPEDO, 0xD0, 8, 5, 1); - gSprites[spriteId].callback = sub_813E10C; - gTasks[taskId].data[2] = spriteId; - sub_813E7C0(spriteId); - } - if (gIntroFrameCounter == 539) - { - spriteId = sub_813CE88(SPECIES_DUSKULL, 0xF8, 0x10, 4, 1); - gSprites[spriteId].callback = sub_813E10C; - gTasks[taskId].data[3] = spriteId; - sub_813E930(spriteId); - } - if (gIntroFrameCounter == 623) - { - gSprites[gTasks[taskId].data[2]].data0 = 2; - gSprites[gTasks[taskId].data[3]].data0 = 2; - gTasks[gTasks[taskId].data[15]].data[0] = 3; - } - if (gIntroFrameCounter == 624) - { - sub_813D084(0); - spriteId = sub_813CE88(SPECIES_MUDKIP, 0x20, 0x98, 0, 0); - gSprites[spriteId].callback = sub_813E210; - gTasks[taskId].data[4] = spriteId; - InitIntroMudkipAttackAnim(spriteId); - } - if (gIntroFrameCounter == 700) - { - spriteId = sub_813CE88(SPECIES_TORCHIC, -8, 0x90, 1, 0); - gSprites[spriteId].callback = sub_813E210; - gTasks[taskId].data[5] = spriteId; - InitIntroTorchicAttackAnim(spriteId); - } - if (gIntroFrameCounter == 776) - { - gUnknown_0203931A = 1; - gSprites[gTasks[taskId].data[4]].data0 = 2; - gSprites[gTasks[taskId].data[5]].data0 = 2; - gTasks[gTasks[taskId].data[15]].data[0] = 0; - } - if (gIntroFrameCounter == 781) - { - sub_813D084(2); - gSprites[gTasks[taskId].data[2]].data0 = 3; - gSprites[gTasks[taskId].data[3]].data0 = 3; - gSprites[gTasks[taskId].data[4]].data0 = 3; - gSprites[gTasks[taskId].data[5]].data0 = 3; - spriteId = CreateSprite(&gSpriteTemplate_840B1F4, 0x78, 0x50, 15); - gSprites[spriteId].invisible = 1; - } - if (gIntroFrameCounter == 800) - PlaySE(SE_OP_BASYU); - if (gIntroFrameCounter == 850) - BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, 0xFFFF); - if (gIntroFrameCounter == 946) - gTasks[taskId].func = task_intro_19; -} - -static void task_intro_19(u8 taskId) -{ - DestroyTask(taskId); - SetMainCallback2(MainCB2_EndIntro); -} - -static void task_intro_20(u8 taskId) -{ -#define BG2_FLAGS (BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256) -#define DISPCNT_FLAGS (DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON) - - gTasks[taskId].data[15]++; - switch (gTasks[taskId].data[0]) - { - case 0: - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; - REG_BG2CNT = 0; - gTasks[taskId].data[0] = 0xFF; - break; - case 2: - BeginNormalPaletteFade(1, 0, 0x10, 0, 0xFFFF); - REG_BG2CNT = BG2_FLAGS; - REG_DISPCNT = DISPCNT_FLAGS; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[0] = 20; - //fall through - case 20: - REG_BG2VOFS = gTasks[taskId].data[1]; - REG_BG2HOFS = gTasks[taskId].data[2]; - gTasks[taskId].data[1] += 6; - gTasks[taskId].data[2] -= 8; - break; - case 3: - BeginNormalPaletteFade(1, 0, 0x10, 0, 0xFFFF); - REG_BG2CNT = BG2_FLAGS; - REG_DISPCNT = DISPCNT_FLAGS; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[0] = 0x1E; - //fall through - case 0x1E: - REG_BG2VOFS = gTasks[taskId].data[1]; - REG_BG2HOFS = gTasks[taskId].data[2]; - gTasks[taskId].data[1] -= 6; - gTasks[taskId].data[2] += 8; - break; - case 4: - BeginNormalPaletteFade(1, 5, 0, 0x10, 0x37F7); - REG_BG2CNT = BG2_FLAGS; - REG_DISPCNT = DISPCNT_FLAGS; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 8; - gTasks[taskId].data[0] = 0x28; - //fall through - case 0x28: - REG_BG2VOFS = gTasks[taskId].data[1]; - REG_BG2HOFS = gTasks[taskId].data[2]; - gTasks[taskId].data[1] -= gTasks[taskId].data[3]; - gTasks[taskId].data[2] += gTasks[taskId].data[3]; - if (!(gTasks[taskId].data[15] & 7) && gTasks[taskId].data[3] != 0) - gTasks[taskId].data[3]--; - break; - case 0xFF: //needed to prevent jump table optimization - break; - } - -#undef BG2_FLAGS -#undef DISPCNT_FLAGS -} - -static void intro_reset_and_hide_bgs(void) -{ - REG_DISPCNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; -} - -#ifdef NONMATCHING -static void sub_813CCE8(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - default: - case 0: - REG_BLDCNT = 0x3F50; - REG_BLDALPHA = 0x1000; - REG_BLDY = 0; - gTasks[taskId].data[1] = 0x40; - gTasks[taskId].data[0] = 1; - return; - case 1: - if (gTasks[taskId].data[1] != 0) - { - u32 foo; - u32 bar asm("r2"); - - gTasks[taskId].data[1]--; - //tail merge at _0813CDC2 - foo = gTasks[taskId].data[1] + (gTasks[taskId].data[1] < 0); - bar = 0x1FE; - REG_BLDALPHA = gUnknown_08393E64[(foo & bar) / 2]; - } - else - { - REG_BLDALPHA = gUnknown_08393E64[0]; - gTasks[taskId].data[1] = 0x80; - gTasks[taskId].data[0]++; - } - return; - case 2: - if (gTasks[taskId].data[1] != 0) - { - //tail merge at _0813CE0E - gTasks[taskId].data[1]--; - } - else - { - gTasks[taskId].data[1] = 0; //redundant? - gTasks[taskId].data[0]++; - } - return; - case 3: - if (gTasks[taskId].data[1] <= 0x3D) - { - u32 foo; - u32 bar asm("r2"); - - gTasks[taskId].data[1]++; - //_0813CDC2 - foo = gTasks[taskId].data[1] + (gTasks[taskId].data[1] < 0); - bar = 0x1FE; - REG_BLDALPHA = gUnknown_08393E64[(foo & bar) / 2]; - } - else - { - //_0813CDE0 - REG_BLDALPHA = gUnknown_08393E64[0x1F]; - gTasks[taskId].data[1] = 0x10; - gTasks[taskId].data[0]++; - } - return; - case 4: - if (gTasks[taskId].data[1] != 0) - { - gTasks[taskId].data[1]--; - } - else - { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - DestroyTask(taskId); - } - return; - } -} -#else -__attribute__((naked)) -static void sub_813CCE8(u8 taskId) -{ - asm("\n\ - .equ REG_BLDCNT, 0x4000050\n\ - .equ REG_BLDALPHA, 0x4000052\n\ - .syntax unified\n\ - push {r4,lr}\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - ldr r1, _0813CD0C @ =gTasks\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - movs r2, 0x8\n\ - ldrsh r0, [r0, r2]\n\ - adds r2, r1, 0\n\ - cmp r0, 0x4\n\ - bhi _0813CD28\n\ - lsls r0, 2\n\ - ldr r1, _0813CD10 @ =_0813CD14\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0813CD0C: .4byte gTasks\n\ -_0813CD10: .4byte _0813CD14\n\ - .align 2, 0\n\ -_0813CD14:\n\ - .4byte _0813CD28\n\ - .4byte _0813CD5C\n\ - .4byte _0813CD8C\n\ - .4byte _0813CDA8\n\ - .4byte _0813CDFC\n\ -_0813CD28:\n\ - ldr r1, _0813CD54 @ =REG_BLDCNT\n\ - ldr r4, _0813CD58 @ =0x00003f50\n\ - adds r0, r4, 0\n\ - strh r0, [r1]\n\ - adds r1, 0x2\n\ - movs r4, 0x80\n\ - lsls r4, 5\n\ - adds r0, r4, 0\n\ - strh r0, [r1]\n\ - adds r1, 0x2\n\ - movs r0, 0\n\ - strh r0, [r1]\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - movs r1, 0x40\n\ - strh r1, [r0, 0xA]\n\ - movs r1, 0x1\n\ - strh r1, [r0, 0x8]\n\ - b _0813CE26\n\ - .align 2, 0\n\ -_0813CD54: .4byte REG_BLDCNT\n\ -_0813CD58: .4byte 0x00003f50\n\ -_0813CD5C:\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 3\n\ - adds r2, r0, r2\n\ - ldrh r1, [r2, 0xA]\n\ - movs r3, 0xA\n\ - ldrsh r0, [r2, r3]\n\ - cmp r0, 0\n\ - beq _0813CD78\n\ - subs r0, r1, 0x1\n\ - strh r0, [r2, 0xA]\n\ - movs r4, 0xA\n\ - ldrsh r0, [r2, r4]\n\ - b _0813CDC2\n\ -_0813CD78:\n\ - ldr r1, _0813CD84 @ =REG_BLDALPHA\n\ - ldr r0, _0813CD88 @ =gUnknown_08393E64\n\ - ldrh r0, [r0]\n\ - strh r0, [r1]\n\ - movs r0, 0x80\n\ - b _0813CDEA\n\ - .align 2, 0\n\ -_0813CD84: .4byte REG_BLDALPHA\n\ -_0813CD88: .4byte gUnknown_08393E64\n\ -_0813CD8C:\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 3\n\ - adds r1, r0, r2\n\ - ldrh r0, [r1, 0xA]\n\ - movs r3, 0xA\n\ - ldrsh r2, [r1, r3]\n\ - cmp r2, 0\n\ - bne _0813CE0E\n\ - strh r2, [r1, 0xA]\n\ - ldrh r0, [r1, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r1, 0x8]\n\ - b _0813CE26\n\ -_0813CDA8:\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 3\n\ - adds r2, r0, r2\n\ - ldrh r1, [r2, 0xA]\n\ - movs r4, 0xA\n\ - ldrsh r0, [r2, r4]\n\ - cmp r0, 0x3D\n\ - bgt _0813CDE0\n\ - adds r0, r1, 0x1\n\ - strh r0, [r2, 0xA]\n\ - movs r1, 0xA\n\ - ldrsh r0, [r2, r1]\n\ -_0813CDC2:\n\ - lsrs r1, r0, 31\n\ - adds r0, r1\n\ - movs r2, 0xFF\n\ - lsls r2, 1\n\ - ldr r3, _0813CDD8 @ =REG_BLDALPHA\n\ - ldr r1, _0813CDDC @ =gUnknown_08393E64\n\ - ands r0, r2\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - strh r0, [r3]\n\ - b _0813CE26\n\ - .align 2, 0\n\ -_0813CDD8: .4byte REG_BLDALPHA\n\ -_0813CDDC: .4byte gUnknown_08393E64\n\ -_0813CDE0:\n\ - ldr r1, _0813CDF4 @ =REG_BLDALPHA\n\ - ldr r0, _0813CDF8 @ =gUnknown_08393E64\n\ - ldrh r0, [r0, 0x3E]\n\ - strh r0, [r1]\n\ - movs r0, 0x10\n\ -_0813CDEA:\n\ - strh r0, [r2, 0xA]\n\ - ldrh r0, [r2, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r2, 0x8]\n\ - b _0813CE26\n\ - .align 2, 0\n\ -_0813CDF4: .4byte REG_BLDALPHA\n\ -_0813CDF8: .4byte gUnknown_08393E64\n\ -_0813CDFC:\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 3\n\ - adds r1, r0, r2\n\ - ldrh r0, [r1, 0xA]\n\ - movs r4, 0xA\n\ - ldrsh r2, [r1, r4]\n\ - cmp r2, 0\n\ - beq _0813CE14\n\ -_0813CE0E:\n\ - subs r0, 0x1\n\ - strh r0, [r1, 0xA]\n\ - b _0813CE26\n\ -_0813CE14:\n\ - ldr r0, _0813CE2C @ =REG_BLDCNT\n\ - strh r2, [r0]\n\ - adds r0, 0x2\n\ - strh r2, [r0]\n\ - adds r0, 0x2\n\ - strh r2, [r0]\n\ - adds r0, r3, 0\n\ - bl DestroyTask\n\ -_0813CE26:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0813CE2C: .4byte REG_BLDCNT\n\ - .syntax divided\n"); -} -#endif - -void sub_813CE30(u16 scrX, u16 scrY, u16 zoom, u16 alpha) -{ - struct BgAffineSrcData src; - struct BgAffineDstData dest; - - src.texX = 0x8000; - src.texY = 0x8000; - src.scrX = scrX; - src.scrY = scrY; - src.sx = zoom; - src.sy = zoom; - src.alpha = alpha; - BgAffineSet(&src, &dest, 1); - REG_BG2PA = dest.pa; - REG_BG2PB = dest.pb; - REG_BG2PC = dest.pc; - REG_BG2PD = dest.pd; - REG_BG2X = dest.dx; - REG_BG2Y = dest.dy; -} - -static u16 sub_813CE88(u16 species, s16 x, s16 y, u16 d, u8 front) -{ - const u8 *lzPaletteData; - u8 spriteId; - - if (front) - LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 1); - else - LoadSpecialPokePic(&gMonBackPicTable[species], gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 0); - lzPaletteData = species_and_otid_get_pal(species, 0, 0xFFFF); - LoadCompressedPalette(lzPaletteData, 0x100 + d * 0x10, 0x20); - sub_8143648(d, d); - spriteId = CreateSprite(&gUnknown_02024E8C, x, y, (d + 1) * 4); - gSprites[spriteId].oam.paletteNum = d; - gSprites[spriteId].oam.priority = 1; - return spriteId; -} - -static u8 sub_813CFA8(u16 a, u16 b, u16 c, u16 d) -{ - u8 spriteId; - - DecompressPicFromTable_2(&gTrainerBackPicTable[a], gTrainerBackPicCoords[a].coords, gTrainerBackPicCoords[a].y_offset, (void *)0x2000000, gUnknown_0840B5A0[d], a); - LoadCompressedPalette(gTrainerBackPicPaletteTable[a].data, 0x100 + d * 0x10, 0x20); - sub_8143680(d, d); - gUnknown_02024E8C.anims = gUnknown_0840B064; - spriteId = CreateSprite(&gUnknown_02024E8C, b, c, 1); - gSprites[spriteId].oam.paletteNum = d; - gSprites[spriteId].oam.priority = 1; - return spriteId; -} - -static void sub_813D084(u8 a) -{ - u16 color; - - switch (a) - { - default: - case 0: - color = RGB(22, 31, 15); - break; - case 1: - color = RGB(31, 14, 12); - break; - case 2: - color = RGB(12, 12, 20); - break; - } - gPlttBufferUnfaded[241] = color; - gPlttBufferFaded[241] = color; -} - -static void sub_813D0CC(struct Sprite *sprite) -{ - u8 r0; - - if (sprite->data2 >= 192) - { - if (sprite->data3 != 0) - { - sprite->data3--; - } - else - { - sprite->invisible = FALSE; - SetOamMatrix(sprite->data1, sprite->data2, 0, 0, sprite->data2); - sprite->data2 = (sprite->data2 * 95) / 100; - r0 = (sprite->data2 - 192) / 128 + 9; - if (r0 > 15) - r0 = 15; - sprite->oam.paletteNum = r0; - } - } - else - { - DestroySprite(sprite); - } -} - -static void sub_813D158(struct Sprite *sprite) -{ - if (gSprites[sprite->data7].data7 != 0) - { - sprite->invisible = TRUE; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - StartSpriteAnim(sprite, 3); - sprite->data2 = 1024; - sprite->data3 = 8 * (sprite->data1 & 3); - sprite->callback = sub_813D0CC; - sprite->oam.shape = 1; - sprite->oam.size = 3; - CalcCenterToCornerVec(sprite, 1, 3, 2); - } - else - { - sprite->pos2.x = gSprites[sprite->data7].pos2.x; - sprite->pos2.y = gSprites[sprite->data7].pos2.y; - sprite->pos1.x = gSprites[sprite->data7].pos1.x; - sprite->pos1.y = gSprites[sprite->data7].pos1.y; - } -} - -static void sub_813D208(struct Sprite *sprite) -{ - if (sprite->data0 != 0) - sprite->callback = sub_813D220; -} - -static void sub_813D220(struct Sprite *sprite) -{ - if (sprite->pos1.x <= 116) - { - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.y = 0; - sprite->pos1.x += 4; - sprite->pos2.x = -4; - sprite->data4 = 128; - sprite->callback = sub_813D368; - } - else - { - u16 data2; - u16 data3; - u16 data4; - s16 sin1; - s16 sin2; - s16 sin3; - s16 sin4; - s16 var1; - s16 var2; - s16 var3; - s16 var4; - s16 temp; - - data4 = sprite->data4; - sin1 = gSineTable[(u8)data4]; - sin2 = gSineTable[(u8)(data4 + 64)]; - sprite->data4 += 2; - sprite->pos2.y = sin1 / 32; - sprite->pos1.x--; - if (sprite->pos1.x & 1) - sprite->pos1.y++; - temp = -sin2 / 16; - data2 = sprite->data2; - data3 = sprite->data3; - sin3 = gSineTable[(u8)(temp - 16)]; - sin4 = gSineTable[(u8)(temp + 48)]; - var1 = sin4 * data2 / 256; - var2 = -sin3 * data3 / 256; - var3 = sin3 * data2 / 256; - var4 = sin4 * data3 / 256; - SetOamMatrix(sprite->data1, data2, 0, 0, data3); - SetOamMatrix(sprite->data1 + 1, var1, var3, var2, var4); - SetOamMatrix(sprite->data1 + 2, var1, var3, var2 * 2, var4 * 2); - } -} - -static void sub_813D368(struct Sprite *sprite) -{ - SetOamMatrix(sprite->data1, sprite->data6 + 64, 0, 0, sprite->data6 + 64); - SetOamMatrix(sprite->data1 + 1, sprite->data6 + 64, 0, 0, sprite->data6 + 64); - SetOamMatrix(sprite->data1 + 2, sprite->data6 + 64, 0, 0, sprite->data6 + 64); - if (sprite->data4 != 64) - { - u16 data4; - - sprite->data4 -= 8; - data4 = sprite->data4; - sprite->pos2.x = gSineTable[(u8)(data4 + 64)] / 64; - sprite->pos2.y = gSineTable[(u8)data4] / 64; - } - else - { - sprite->data4 = 0; - sprite->callback = sub_813D414; - } -} - -static void sub_813D414(struct Sprite *sprite) -{ - if (sprite->data0 != 2) - { - s16 r2; - - sprite->data4 += 8; - r2 = gSineTable[(u8)sprite->data4] / 16 + 64; - sprite->pos2.x = gSineTable[(u8)(r2 + 64)] / 64; - sprite->pos2.y = gSineTable[(u8)r2] / 64; - } - else - { - sprite->callback = SpriteCB_WaterDropFall; - } -} - -static void SpriteCB_WaterDropFall(struct Sprite *sprite) -{ - if (sprite->pos1.y < sprite->data5) - { - sprite->pos1.y += 4; - } - else - { - sprite->data7 = 1; - sprite->invisible = TRUE; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - StartSpriteAnim(sprite, 3); - sprite->data2 = 1024; - sprite->data3 = 8 * (sprite->data1 & 3); - sprite->callback = sub_813D0CC; - sprite->oam.shape = 1; - sprite->oam.size = 3; - CalcCenterToCornerVec(sprite, 1, 3, 2); - } -} - -//Duplicate function -static void SpriteCB_WaterDropFall_2(struct Sprite *sprite) -{ - if (sprite->pos1.y < sprite->data5) - { - sprite->pos1.y += 4; - } - else - { - sprite->data7 = 1; - sprite->invisible = TRUE; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - StartSpriteAnim(sprite, 3); - sprite->data2 = 1024; - sprite->data3 = 8 * (sprite->data1 & 3); - sprite->callback = sub_813D0CC; - sprite->oam.shape = 1; - sprite->oam.size = 3; - CalcCenterToCornerVec(sprite, 1, 3, 2); - } -} - -static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately) -{ - u8 spriteId; - u8 oldSpriteId; - - spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0); - gSprites[spriteId].data0 = 0; - gSprites[spriteId].data7 = 0; - gSprites[spriteId].data1 = d; - gSprites[spriteId].data2 = c; - gSprites[spriteId].data3 = c; - gSprites[spriteId].data5 = e; - gSprites[spriteId].data6 = c; - gSprites[spriteId].oam.affineMode = 3; - gSprites[spriteId].oam.matrixNum = d; - CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); - StartSpriteAnim(&gSprites[spriteId], 2); - if (!fallImmediately) - gSprites[spriteId].callback = sub_813D208; - else - gSprites[spriteId].callback = SpriteCB_WaterDropFall_2; - oldSpriteId = spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0); - gSprites[spriteId].data7 = oldSpriteId; - gSprites[spriteId].data1 = d + 1; - gSprites[spriteId].oam.affineMode = 3; - gSprites[spriteId].oam.matrixNum = d + 1; - CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); - gSprites[spriteId].callback = sub_813D158; - - spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0); - gSprites[spriteId].data7 = oldSpriteId; - gSprites[spriteId].data1 = d + 2; - StartSpriteAnim(&gSprites[spriteId], 1); - gSprites[spriteId].oam.affineMode = 3; - gSprites[spriteId].oam.matrixNum = d + 2; - CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); - gSprites[spriteId].callback = sub_813D158; - - SetOamMatrix(d, c + 32, 0, 0, c + 32); - SetOamMatrix(d + 1, c + 32, 0, 0, c + 32); - SetOamMatrix(d + 2, c + 32, 0, 0, 2 * (c + 32)); - - return oldSpriteId; -} - -static void sub_813D788(struct Sprite *sprite) -{ - switch (sprite->data0) - { - case 0: - StartSpriteAnimIfDifferent(sprite, 0); - sprite->pos1.x--; - break; - case 1: - StartSpriteAnimIfDifferent(sprite, 0); - if (gIntroFrameCounter & 7) - return; - sprite->pos1.x++; - break; - case 2: - StartSpriteAnimIfDifferent(sprite, 2); - if (sprite->pos1.x <= 120 || (gIntroFrameCounter & 7)) - sprite->pos1.x++; - break; - case 3: - StartSpriteAnimIfDifferent(sprite, 3); - break; - case 4: - StartSpriteAnimIfDifferent(sprite, 0); - if (sprite->pos1.x > -32) - sprite->pos1.x -= 2; - break; - } - if (gIntroFrameCounter & 7) - return; - if (sprite->pos2.y != 0) - { - sprite->pos2.y = 0; - } - else - { - switch (Random() & 3) - { - case 0: - sprite->pos2.y = -1; - break; - case 1: - sprite->pos2.y = 1; - break; - case 2: - case 3: - sprite->pos2.y = 0; - break; - } - } -} - -static void sub_813D880(struct Sprite *sprite) -{ - switch (sprite->data0) - { - case 0: - break; - case 1: - if (sprite->pos2.x + sprite->pos1.x < 304) - sprite->pos2.x += 8; - else - sprite->data0 = 2; - break; - case 2: - if (sprite->pos2.x + sprite->pos1.x > 120) - sprite->pos2.x -= 1; - else - sprite->data0 = 3; - break; - case 3: - if (sprite->pos2.x > 0) - sprite->pos2.x -= 2; - break; - } - sprite->pos2.y = Sin((u8)sprite->data1, 8) - gUnknown_0203935A; - sprite->data1 += 4; -} - -static void sub_813D908(struct Sprite *sprite) -{ - if (gTasks[sprite->data0].data[0] == 0) - { - sprite->invisible = TRUE; - } - else if (gTasks[sprite->data0].data[0] != 4) - { - sprite->invisible = FALSE; - } - else - { - DestroySprite(sprite); - } -} - -static u8 CreateGameFreakLogo(s16 a, s16 b, u8 c) -{ - u8 spriteId; - u16 i; - - for (i = 0; i < 9; i++) - { - spriteId = CreateSprite(&gSpriteTemplate_840AF94, gUnknown_0840AF50[i][1] + a, b - 4, 0); - gSprites[spriteId].data0 = c; - StartSpriteAnim(&gSprites[spriteId], gUnknown_0840AF50[i][0]); - } - for (i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gSpriteTemplate_840AFAC, gUnknown_0840AF74[i][1] + a, b + 12, 0); - gSprites[spriteId].data0 = c; - StartSpriteAnim(&gSprites[spriteId], gUnknown_0840AF74[i][0]); - } - spriteId = CreateSprite(&gSpriteTemplate_840AFC4, 120, b - 4, 0); - gSprites[spriteId].data0 = c; - - return spriteId; -} - -#ifdef NONMATCHING -static void sub_813DA64(struct Sprite *sprite) -{ - sprite->data7++; - - switch (sprite->data0) - { - case 0: - default: - sprite->oam.affineMode = 3; - sprite->oam.matrixNum = 1; - CalcCenterToCornerVec(sprite, 1, 3, 3); - sprite->invisible = FALSE; - sprite->data0 = 1; - sprite->data1 = 128; - sprite->data2 = -24; - sprite->data3 = 0; - break; - case 1: - { - s16 r3; - s16 sin1; - s16 r6; - s16 foo; - s16 r5; - s16 r2; - - //_0813DAC0 - if (sprite->data3 < 0x50) - { - sprite->pos2.y = -Sin((u8)sprite->data3, 0x78); - sprite->pos2.x = -Sin((u8)sprite->data3, 0x8C); - if (sprite->data3 > 64) - sprite->oam.priority = 3; - } - //_0813DAF8 - r3 = gSineTable[(u8)sprite->data2]; - sin1 = gSineTable[(u8)(sprite->data2 + 64)]; - r6 = sin1 * sprite->data1 / 256; - foo = sin1 * sprite->data1 / 256; - r5 = -r3 * sprite->data1 / 256; - r2 = r3 * sprite->data1 / 256; - - SetOamMatrix(1, r6, r2, r5, foo); - - if (sprite->data1 < 0x100) - sprite->data1 += 8; - else - sprite->data1 += 32; - if (sprite->data2 < 0x18) - sprite->data2 += 1; - if (sprite->data3 < 64) - sprite->data3 += 2; - else if (!(sprite->data7 & 3)) - sprite->data3 += 1; - break; - } - } - //_0813DB92 -} -#else -__attribute__((naked)) -static void sub_813DA64(struct Sprite *sprite) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - sub sp, 0x4\n\ - adds r4, r0, 0\n\ - ldrh r0, [r4, 0x3C]\n\ - adds r0, 0x1\n\ - strh r0, [r4, 0x3C]\n\ - movs r1, 0x2E\n\ - ldrsh r0, [r4, r1]\n\ - cmp r0, 0\n\ - beq _0813DA7C\n\ - cmp r0, 0x1\n\ - beq _0813DAC0\n\ -_0813DA7C:\n\ - ldrb r0, [r4, 0x1]\n\ - movs r1, 0x3\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x1]\n\ - ldrb r1, [r4, 0x3]\n\ - movs r0, 0x3F\n\ - negs r0, r0\n\ - ands r0, r1\n\ - movs r1, 0x2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x3]\n\ - adds r0, r4, 0\n\ - movs r1, 0x1\n\ - movs r2, 0x3\n\ - movs r3, 0x3\n\ - bl CalcCenterToCornerVec\n\ - adds r2, r4, 0\n\ - adds r2, 0x3E\n\ - ldrb r1, [r2]\n\ - movs r0, 0x5\n\ - negs r0, r0\n\ - ands r0, r1\n\ - strb r0, [r2]\n\ - movs r0, 0x1\n\ - strh r0, [r4, 0x2E]\n\ - movs r0, 0x80\n\ - strh r0, [r4, 0x30]\n\ - ldr r0, _0813DABC @ =0x0000ffe8\n\ - strh r0, [r4, 0x32]\n\ - movs r0, 0\n\ - b _0813DB92\n\ - .align 2, 0\n\ -_0813DABC: .4byte 0x0000ffe8\n\ -_0813DAC0:\n\ - ldrh r1, [r4, 0x34]\n\ - movs r2, 0x34\n\ - ldrsh r0, [r4, r2]\n\ - cmp r0, 0x4F\n\ - bgt _0813DAF8\n\ - lsls r0, r1, 24\n\ - lsrs r0, 24\n\ - movs r1, 0x78\n\ - bl Sin\n\ - negs r0, r0\n\ - strh r0, [r4, 0x26]\n\ - ldrh r0, [r4, 0x34]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - movs r1, 0x8C\n\ - bl Sin\n\ - negs r0, r0\n\ - strh r0, [r4, 0x24]\n\ - movs r1, 0x34\n\ - ldrsh r0, [r4, r1]\n\ - cmp r0, 0x40\n\ - ble _0813DAF8\n\ - ldrb r0, [r4, 0x5]\n\ - movs r1, 0xC\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x5]\n\ -_0813DAF8:\n\ - ldr r2, _0813DB60 @ =gSineTable\n\ - ldrh r1, [r4, 0x32]\n\ - lsls r0, r1, 24\n\ - lsrs r0, 23\n\ - adds r0, r2\n\ - ldrh r3, [r0]\n\ - adds r1, 0x40\n\ - lsls r1, 24\n\ - lsrs r1, 23\n\ - adds r1, r2\n\ - movs r2, 0\n\ - ldrsh r0, [r1, r2]\n\ - movs r1, 0x30\n\ - ldrsh r2, [r4, r1]\n\ - adds r1, r0, 0\n\ - muls r1, r2\n\ - adds r0, r1, 0\n\ - cmp r1, 0\n\ - bge _0813DB20\n\ - adds r0, 0xFF\n\ -_0813DB20:\n\ - lsls r0, 8\n\ - lsrs r6, r0, 16\n\ - lsls r0, r3, 16\n\ - asrs r3, r0, 16\n\ - negs r0, r3\n\ - muls r0, r2\n\ - cmp r0, 0\n\ - bge _0813DB32\n\ - adds r0, 0xFF\n\ -_0813DB32:\n\ - lsls r0, 8\n\ - lsrs r5, r0, 16\n\ - adds r0, r3, 0\n\ - muls r0, r2\n\ - cmp r0, 0\n\ - bge _0813DB40\n\ - adds r0, 0xFF\n\ -_0813DB40:\n\ - lsls r0, 8\n\ - lsrs r2, r0, 16\n\ - adds r1, r6, 0\n\ - adds r3, r5, 0\n\ - str r1, [sp]\n\ - movs r0, 0x1\n\ - bl SetOamMatrix\n\ - ldrh r1, [r4, 0x30]\n\ - movs r2, 0x30\n\ - ldrsh r0, [r4, r2]\n\ - cmp r0, 0xFF\n\ - bgt _0813DB64\n\ - adds r0, r1, 0\n\ - adds r0, 0x8\n\ - b _0813DB68\n\ - .align 2, 0\n\ -_0813DB60: .4byte gSineTable\n\ -_0813DB64:\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ -_0813DB68:\n\ - strh r0, [r4, 0x30]\n\ - ldrh r1, [r4, 0x32]\n\ - movs r2, 0x32\n\ - ldrsh r0, [r4, r2]\n\ - cmp r0, 0x17\n\ - bgt _0813DB78\n\ - adds r0, r1, 0x1\n\ - strh r0, [r4, 0x32]\n\ -_0813DB78:\n\ - ldrh r2, [r4, 0x34]\n\ - movs r1, 0x34\n\ - ldrsh r0, [r4, r1]\n\ - cmp r0, 0x3F\n\ - bgt _0813DB86\n\ - adds r0, r2, 0x2\n\ - b _0813DB92\n\ -_0813DB86:\n\ - ldrh r1, [r4, 0x3C]\n\ - movs r0, 0x3\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0813DB94\n\ - adds r0, r2, 0x1\n\ -_0813DB92:\n\ - strh r0, [r4, 0x34]\n\ -_0813DB94:\n\ - add sp, 0x4\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif - -static void sub_813DB9C(struct Sprite *sprite) -{ - switch (sprite->data0) - { - case 0: - default: - if (sprite->data2 != 0) - sprite->hFlip = TRUE; - else - sprite->hFlip = FALSE; - sprite->data0 = 1; - //fall through - case 1: - if (sprite->pos1.y > 96) - { - sprite->pos1.y -= 4; - if (sprite->data2 != 0) - sprite->pos1.x += 2; - else - sprite->pos1.x -= 2; - } - else - { - sprite->data0++; - sprite->data3 = 8; - } - break; - case 2: - if (sprite->data3 != 0) - { - sprite->data3--; - } - else - { - sprite->data0++; - sprite->data3 = 0; //redundant? - } - break; - case 3: - sprite->oam.affineMode = 3; - sprite->oam.matrixNum = sprite->data1; - CalcCenterToCornerVec(sprite, 0, 3, 3); - if (sprite->data2 != 0) - SetOamMatrix(sprite->data1, -256, 0, 0, 256); - else - SetOamMatrix(sprite->data1, 256, 0, 0, 256); - sprite->data0++; - sprite->data4 = 0; - break; - case 4: - sprite->data4++; - if (sprite->pos1.y + sprite->pos2.y > -32 - && sprite->pos1.x + sprite->pos2.x > -64) - { - u16 r2; - - sprite->pos2.y = -(sprite->data4 * sprite->data4) / 8; - if (sprite->data2 != 0) - sprite->pos2.x += sprite->data4; - else - sprite->pos2.x -= sprite->data4; - if (sprite->data3 < 128) - sprite->data3 += 8; - r2 = 256 - sprite->data3; - if (sprite->data2 != 0) - SetOamMatrix(sprite->data1, -r2, 0, 0, r2); - else - SetOamMatrix(sprite->data1, r2, 0, 0, r2); - } - else - { - DestroySprite(sprite); - } - } -} - -static void sub_813DD58(struct Sprite *sprite) -{ - switch (sprite->data0) - { - case 0: - default: - sprite->invisible = FALSE; - sprite->oam.affineMode = 1; - sprite->oam.matrixNum = sprite->data1; - sprite->data3 = 2048; - sprite->data0 = 1; - //fall through - case 1: - if (sprite->data3 > 256) - { - sprite->data3 -= 128; - if (sprite->data2 != 0) - SetOamMatrix(sprite->data1, -sprite->data3, 0, 0, sprite->data3); - else - SetOamMatrix(sprite->data1, sprite->data3, 0, 0, sprite->data3); - } - else - { - if (sprite->data2 != 0) - SetOamMatrix(sprite->data1, -256, 0, 0, 256); - else - SetOamMatrix(sprite->data1, 256, 0, 0, 256); - sprite->data0++; - } - break; - case 2: - break; - case 3: - sprite->data4++; - sprite->pos2.y = sprite->data4 * sprite->data4 / 32; - if (sprite->data2 != 0) - sprite->pos2.x = sprite->data4 / 4; - else - sprite->pos2.x = -(sprite->data4 / 4); - break; - } -} - -static void sub_813DE70(struct Sprite *sprite) -{ - switch (sprite->data0) - { - case 0: - default: - if (sprite->pos1.x > 40) - { - sprite->pos1.x -= 4; - } - else - { - StartSpriteAnim(sprite, 1); - sprite->data6 = CreateSprite(&gSpriteTemplate_840B084, 16, 104, 100); - sprite->data7 = CreateSprite(&gSpriteTemplate_840B084, 12, 106, 101); - sprite->data0 = 1; - } - break; - case 1: - break; - case 2: - StartSpriteAnim(sprite, 2); - gSprites[sprite->data6].data0 = 1; - gSprites[sprite->data7].data0 = 2; - sprite->data0++; - break; - case 3: - if (sprite->pos1.y > 160) - { - sprite->invisible = 1; - sprite->data0 = 1; - } - else - { - sprite->pos1.y += 2; - sprite->pos1.x--; - } - break; - case 4: - { - s16 r4, r5; - - r5 = gSprites[sprite->data6].pos1.x + gSprites[sprite->data6].pos2.x; - r4 = gSprites[sprite->data6].pos1.y + gSprites[sprite->data6].pos2.y; - DestroySprite(&gSprites[sprite->data6]); - sprite->data6 = sub_813CE88(SPECIES_TORCHIC, r5, r4, 2, 1); - gSprites[sprite->data6].callback = sub_813DD58; - gSprites[sprite->data6].invisible = TRUE; - gSprites[sprite->data6].data1 = 1; - gSprites[sprite->data6].data2 = 1; - sub_813E580(r5, r4); - - r5 = gSprites[sprite->data7].pos1.x + gSprites[sprite->data7].pos2.x; - r4 = gSprites[sprite->data7].pos1.y + gSprites[sprite->data7].pos2.y; - DestroySprite(&gSprites[sprite->data7]); - sprite->data7 = sub_813CE88(SPECIES_MUDKIP, r5, r4, 3, 1); - gSprites[sprite->data7].callback = sub_813DD58; - gSprites[sprite->data7].invisible = TRUE; - gSprites[sprite->data7].data1 = 2; - gSprites[sprite->data7].data2 = 0; - sub_813E580(r5, r4); - - BeginNormalPaletteFade(0xFF0000, 0, 16, 16, RGB(31, 23, 31)); - sprite->data0 = 1; - break; - } - case 5: - gSprites[sprite->data6].data0 = 3; - gSprites[sprite->data7].data0 = 3; - break; - case 6: - DestroySprite(&gSprites[sprite->data6]); - DestroySprite(&gSprites[sprite->data7]); - DestroySprite(sprite); - break; - } -} - -static void sub_813E10C(struct Sprite *sprite) -{ - switch (sprite->data0) - { - case 0: - default: - if (sprite->pos2.x > -56) - { - sprite->pos2.x -= 8; - sprite->pos2.y += 6; - } - else - { - sprite->data6 = sprite->pos1.x; - sprite->data7 = sprite->pos1.y; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data0 = 1; - sprite->data1 = 0; - } - break; - case 1: - if (!(sprite->data1 & 1)) - { - if (sprite->data1 & 2) - { - sprite->pos2.x = -1; - sprite->pos2.y = 1; - } - else - { - sprite->pos2.x = 0; - sprite->pos2.y = 0; - } - } - sprite->data1++; - break; - case 2: - sprite->invisible = TRUE; - sprite->pos1.x = sprite->data6; - sprite->pos1.y = sprite->data7; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - break; - case 3: - sprite->invisible = FALSE; - sprite->data1++; - //fall through - case 4: - if (sprite->pos2.x > -56) - { - sprite->pos2.x -= 4; - sprite->pos2.y += 3; - } - else - { - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data0 = 1; - } - break; - } -} - -static void sub_813E210(struct Sprite *sprite) -{ - switch (sprite->data0) - { - case 0: - default: - if (sprite->pos2.x < 56) - { - sprite->pos2.x += 8; - sprite->pos2.y -= 6; - } - else - { - sprite->data6 = sprite->pos1.x; - sprite->data7 = sprite->pos1.y; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data0 = 1; - sprite->data1 = 0; - } - break; - case 1: - if (!(sprite->data1 & 1)) - { - if (sprite->data1 & 2) - { - sprite->pos2.x = 1; - sprite->pos2.y = -1; - } - else - { - sprite->pos2.x = 0; - sprite->pos2.y = 0; - } - } - sprite->data1++; - break; - case 2: - sprite->invisible = TRUE; - sprite->pos1.x = sprite->data6; - sprite->pos1.y = sprite->data7; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - break; - case 3: - sprite->invisible = FALSE; - sprite->data1++; - //fall through - case 4: - if (sprite->pos2.x < 56) - { - sprite->pos2.x += 4; - sprite->pos2.y -= 3; - } - else - { - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data0 = 1; - } - break; - } -} - -static void sub_813E30C(struct Sprite *sprite) -{ - u16 r4, r1; - - sprite->data7++; - switch (sprite->data0) - { - case 0: - default: - break; - case 1: - sprite->oam.affineMode = 1; - sprite->oam.matrixNum = 1; - sprite->data0 = 10; - sprite->data4 = 36; - //fall through - case 10: - if (sprite->pos1.x <= 144) - { - sprite->pos1.x += 4; - sprite->pos1.y -= 1; - sprite->pos2.y = -Sin((u8)sprite->data2, 24); - sprite->data2 += 4; - } - sprite->data3 -= sprite->data4; - if ((sprite->data7 & 1) && sprite->data4 != 0) - sprite->data4--; - r4 = gSineTable[(u8)sprite->data3]; - r1 = gSineTable[(u8)(sprite->data3 + 64)]; - SetOamMatrix(1, r1, r4, -r4, r1); - break; - case 2: - sprite->oam.affineMode = 1; - sprite->oam.matrixNum = 2; - sprite->data0 = 20; - sprite->data4 = 36; - //fall through - case 20: - if (sprite->pos1.x <= 96) - { - sprite->pos1.x += 3; - sprite->pos1.y -= 1; - sprite->pos2.y = -Sin((u8)sprite->data2, 24); - sprite->data2 += 4; - } - sprite->data3 -= sprite->data4; - if ((sprite->data7 & 1) && sprite->data4 != 0) - sprite->data4--; - r4 = gSineTable[(u8)sprite->data3]; - r1 = gSineTable[(u8)(sprite->data3 + 64)]; - SetOamMatrix(2, r1, r4, -r4, r1); - break; - } -} - -static void sub_813E4B8(struct Sprite *sprite) -{ - u16 r4; - u16 r2; - u16 r1; - - sprite->data7++; - if (sprite->data7 & 1) - sprite->invisible = FALSE; - else - sprite->invisible = TRUE; - if (sprite->data2 >= 64) - { - DestroySprite(sprite); - return; - } - sprite->data2 += 2; - r4 = Sin((u8)sprite->data2, 40); - sprite->pos2.x = Cos((u8)(sprite->data0 * 32), r4); - sprite->pos2.y = Sin((u8)(sprite->data0 * 32), r4); - if (sprite->data0 == 0) - { - sprite->data3 -= sprite->data1; - if ((sprite->data7 & 1) && sprite->data1 != 0) - sprite->data1--; - r2 = gSineTable[(u8)sprite->data3]; - r1 = gSineTable[(u8)(sprite->data3 + 64)]; - SetOamMatrix(16, r1, r2, -r2, r1); - } -} - -static void sub_813E580(u16 x, u16 y) -{ - u8 i; - u8 spriteId; - - for (i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gSpriteTemplate_840B0B0, x, y, 0); - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].oam.matrixNum = 16; - gSprites[spriteId].data0 = i; - gSprites[spriteId].data1 = 32; - } -} - -static void sub_813E5E0(struct Sprite *sprite) -{ - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - sprite->invisible = gSprites[sprite->data0].invisible; - if (sprite->data7 < 12) - sprite->data7++; - sprite->data6 += 4; - sprite->pos1.x = sprite->data4 + gSineTable[(u8)(sprite->data3 + 64)] * sprite->data6 / 256; - //This useless '+ 0' is needed to make the asm match - sprite->pos1.y = sprite->data5 + gSineTable[(u8)(sprite->data3 + 0)] * sprite->data6 / 256; - sprite->pos2.y = gSineTable[(u8)(sprite->data1 + 0)] * sprite->data7 / 256; - sprite->data1 += 16; - if (sprite->pos1.y > sprite->data2) - DestroySprite(sprite); - } -} - -static void sub_813E6C0(struct Sprite *sprite) -{ - u8 spriteId; - u8 i; - s16 var1; - s16 var2; - - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - sprite->data7++; - sprite->invisible = TRUE; - if (gSprites[sprite->data0].data0 == 1 && !(sprite->data7 & 3)) - { - var1 = sprite->data1 + gSprites[sprite->data0].pos1.x; - var2 = sprite->data2 + gSprites[sprite->data0].pos1.y; - for (i = 0; i < 3; i++) - { - u8 r3 = gSprites[sprite->data0].subpriority - 1; - //Make redundant copies of these variables to get the asm to match - s16 _var1 = var1; - s16 _var2 = var2; - - spriteId = CreateSprite(&gSpriteTemplate_840B0DC, _var1, _var2, r3); - if (spriteId != 64) - { - gSprites[spriteId].data0 = sprite->data0; - gSprites[spriteId].data1 = (((sprite->data7 >> 2) & 7) << 5) + i * 85; - gSprites[spriteId].data2 = sprite->data3; - gSprites[spriteId].data3 = 104; - gSprites[spriteId].data4 = var1; - gSprites[spriteId].data5 = var2; - gSprites[spriteId].data6 = 0; - } - } - } - } -} - -static void sub_813E7C0(u8 a) -{ - u8 spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_840B0F4, 0, 0, 0); - if (spriteId != 64) - { - gSprites[spriteId].data0 = a; - gSprites[spriteId].data1 = -12; - gSprites[spriteId].data2 = 0; - gSprites[spriteId].data3 = 136; - } -} - -static void sub_813E804(struct Sprite *sprite) -{ - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - sprite->invisible = gSprites[sprite->data0].invisible; - sprite->data7++; - if (sprite->data3 < 40) - sprite->data3 += 2; - //This useless '+ 0' is needed to make the asm match - sprite->pos1.x = gSprites[sprite->data0].pos1.x + gSprites[sprite->data0].pos2.x + gSineTable[(u8)(sprite->data1 + 64)] * sprite->data3 / 256; - sprite->pos1.y = gSprites[sprite->data0].pos1.y + gSprites[sprite->data0].pos2.y + gSineTable[(u8)(sprite->data1 + 0)] * sprite->data3 / 512; - sprite->data1 += 2; - sprite->pos2.y = gSineTable[(u8)(sprite->data2 + 0)] / 32; - sprite->data2 += 8; - if ((sprite->data1 & 0xFF) < 128) - sprite->subpriority = gSprites[sprite->data0].subpriority - 1; - else - sprite->subpriority = gSprites[sprite->data0].subpriority + 1; - } -} - -static void sub_813E930(u8 a) -{ - u8 i; - u8 spriteId; - - for (i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gSpriteTemplate_840B124, gSprites[a].pos1.x, gSprites[a].pos1.y, 0); - if (spriteId != 64) - { - gSprites[spriteId].data0 = a; - gSprites[spriteId].data1 = i * 32; - } - } -} - -static void sub_813E980(struct Sprite *sprite) -{ - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - u8 r0; - u16 matrixNum; - - sprite->invisible = gSprites[sprite->data0].invisible; - sprite->data7++; - sprite->data6 += 8; - sprite->pos1.x = sprite->data4 + gSineTable[(u8)(sprite->data3 + 64)] * sprite->data6 / 256; - sprite->pos1.y = sprite->data5 + gSineTable[(u8)(sprite->data3 + 0)] * sprite->data6 / 256; - r0 = sprite->data6 / 16; - if (r0 > 9) - r0 = 9; - matrixNum = (r0 + 18) & 31; - sprite->oam.matrixNum = matrixNum; - if (sprite->data6 > 160) - DestroySprite(sprite); - } -} - -static void sub_813EA60(struct Sprite *sprite) -{ - bool32 r6; - s16 r1, r2; - u8 spriteId; - - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - sprite->data7++; - sprite->invisible = TRUE; - if (gSprites[sprite->data0].data0 == 1) - { - r6 = (sprite->data7 & 1); - if (!r6) - { - r1 = sprite->data1 + gSprites[sprite->data0].pos1.x; - r2 = sprite->data2 + gSprites[sprite->data0].pos1.y; - spriteId = CreateSprite(&gSpriteTemplate_840B150, r1, r2, gSprites[sprite->data0].subpriority + 1); - if (spriteId != 64) - { - gSprites[spriteId].oam.affineMode = 3; - gSprites[spriteId].oam.matrixNum = 18; - CalcCenterToCornerVec(&gSprites[spriteId], 0, 1, 3); - gSprites[spriteId].data0 = sprite->data0; - gSprites[spriteId].data3 = gUnknown_0840B168[(sprite->data7 >> 1) & 7]; - gSprites[spriteId].data4 = r1; - gSprites[spriteId].data5 = r2; - gSprites[spriteId].data6 = r6; - } - } - } - } -} - -static void InitIntroTorchicAttackAnim(u8 a) -{ - u8 spriteId; - u8 i; - - spriteId = CreateSprite(&gSpriteTemplate_840B170, 0, 0, 0); - if (spriteId != 64) - { - gSprites[spriteId].data0 = a; - gSprites[spriteId].data1 = 0; - gSprites[spriteId].data2 = 8; - gSprites[spriteId].data3 = 24; - } - for (i = 0; i < 10; i++) - { - SetOamMatrix(18 + i, gUnknown_0840B188[i], 0, 0, gUnknown_0840B188[i]); - } -} - -static void sub_813EBBC(struct Sprite *sprite) -{ - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - sprite->invisible = gSprites[sprite->data0].invisible; - sprite->data7 += 1; - sprite->data6 += 8; - sprite->pos1.x = sprite->data4 + gSineTable[(u8)(sprite->data3 + 64)] * sprite->data6 / 256; - sprite->pos1.y = sprite->data5 + gSineTable[(u8)(sprite->data3 + 0)] * sprite->data6 / 256; - sprite->pos2.y = gSineTable[(u8)(sprite->data1 + 0)] / 64; - sprite->data1 += 16; - if (sprite->pos1.y < sprite->data2) - DestroySprite(sprite); - } -} - -static void sub_813EC90(struct Sprite *sprite) -{ - bool32 r6; - s16 r1, r2; - u8 spriteId; - u16 foo; - - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - sprite->data7++; - sprite->invisible = TRUE; - if (gSprites[sprite->data0].data0 == 1) - { - r6 = sprite->data7 & 1; - if (!r6) - { - r1 = sprite->data1 + gSprites[sprite->data0].pos1.x; - r2 = sprite->data2 + gSprites[sprite->data0].pos1.y; - spriteId = CreateSprite(&gSpriteTemplate_840B1B0, r1, r2, gSprites[sprite->data0].subpriority + 1); - if (spriteId != 64) - { - gSprites[spriteId].oam.affineMode = 3; - gSprites[spriteId].oam.matrixNum = 17; - CalcCenterToCornerVec(&gSprites[spriteId], 0, 1, 3); - gSprites[spriteId].data0 = sprite->data0; - gSprites[spriteId].data1 = ((sprite->data7 >> 2) & 7) << 5; - gSprites[spriteId].data2 = sprite->data3; - gSprites[spriteId].data3 = 232; - gSprites[spriteId].data4 = r1; - gSprites[spriteId].data5 = r2; - gSprites[spriteId].data6 = r6; - } - } - if (sprite->data6 < 112) - sprite->data6 += 4; - } - foo = 256 - gSineTable[(u8)sprite->data6] / 2; - SetOamMatrix(17, foo, 0, 0, foo); - } -} - -static void InitIntroMudkipAttackAnim(u8 a) -{ - u8 spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_840B1C8, 0, 0, 0); - if (spriteId != 64) - { - gSprites[spriteId].data0 = a; - gSprites[spriteId].data1 = 0; - gSprites[spriteId].data2 = 12; - gSprites[spriteId].data3 = 24; - } -} - -static void sub_813EDFC(struct Sprite *sprite) -{ - u16 foo; - - //I'm not sure why a switch statement was used here. - //if (sprite->data0 != 1) would have been more appropriate. - switch (sprite->data0) - { - case 0: - default: - sprite->invisible = FALSE; - sprite->oam.affineMode = 3; - sprite->oam.matrixNum = 18; - CalcCenterToCornerVec(sprite, 0, 3, 3); - sprite->data1 = 0; - sprite->data0 = 1; - //fall through - case 1: - break; - } - sprite->data7++; - if (sprite->data7 & 1) - { - sprite->invisible = TRUE; - } - else - { - sprite->invisible = FALSE; - if (sprite->data1 < 64) - sprite->data1++; - } - foo = 256 - gSineTable[(u8)sprite->data1] / 2; - SetOamMatrix(18, foo, 0, 0, foo); -} diff --git a/src/item.c b/src/item.c deleted file mode 100644 index 36871285a..000000000 --- a/src/item.c +++ /dev/null @@ -1,674 +0,0 @@ -#include "global.h" -#include "hold_effects.h" -#include "item.h" -#include "items.h" -#include "item_use.h" -#include "berry.h" -#include "string_util.h" -#include "strings.h" - -extern u8 gUnknown_02038560; - -// These constants are used in gItems -enum -{ - POCKET_NONE, - POCKET_ITEMS, - POCKET_POKE_BALLS, - POCKET_TM_HM, - POCKET_BERRIES, - POCKET_KEY_ITEMS, -}; - -enum -{ - ITEMS_POCKET, - BALLS_POCKET, - TMHM_POCKET, - BERRIES_POCKET, - KEYITEMS_POCKET -}; - -#if ENGLISH -#include "data/item_descriptions_en.h" -#include "data/items_en.h" -#elif GERMAN -#include "data/item_descriptions_de.h" -#include "data/items_de.h" -#endif - -static void CompactPCItems(void); - -void CopyItemName(u16 itemId, u8 *string) -{ - if (itemId == ITEM_ENIGMA_BERRY) - { - StringCopy(string, GetBerryInfo(0x2B)->name); // berry 0x2b = enigma berry - StringAppend(string, gOtherText_Berry2); - } - else - StringCopy(string, ItemId_GetItem(itemId)->name); -} - -//Unreferenced -s8 CountUsedBagPocketSlots(u8 pocket) -{ - u8 i; - - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (gBagPockets[pocket].itemSlots[i].itemId == 0) - return i; - } - return -1; -} - -bool8 IsBagPocketNonEmpty(u8 pocket) -{ - u8 i; - - for (i = 0; i < gBagPockets[pocket - 1].capacity; i++) - { - if (gBagPockets[pocket - 1].itemSlots[i].itemId != 0) - return TRUE; - } - return FALSE; -} - -bool8 CheckBagHasItem(u16 itemId, u16 count) -{ - u8 i; - u8 pocket; - - if (ItemId_GetPocket(itemId) == 0) - return FALSE; - pocket = ItemId_GetPocket(itemId) - 1; - //Check for item slots that contain the item - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) - { - //Does this item slot contain enough of the item? - if (gBagPockets[pocket].itemSlots[i].quantity >= count) - return TRUE; - count -= gBagPockets[pocket].itemSlots[i].quantity; - //Does this item slot and all previous slots contain enough of the item? - if (count == 0) - return TRUE; - } - } - return FALSE; -} - -bool8 CheckBagHasSpace(u16 itemId, u16 count) -{ - u8 i; - u8 pocket; - u16 slotCapacity; - - if (ItemId_GetPocket(itemId) == 0) - return FALSE; - pocket = ItemId_GetPocket(itemId) - 1; - if (pocket != BERRIES_POCKET) - slotCapacity = 99; - else - slotCapacity = 999; - - //Check space in any existing item slots that already contain this item - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) - { - if (gBagPockets[pocket].itemSlots[i].quantity + count <= slotCapacity) - return TRUE; - if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) - return FALSE; - count -= slotCapacity - gBagPockets[pocket].itemSlots[i].quantity; - if (count == 0) - return TRUE; - } - } - - //Check space in empty item slots - if (count > 0) - { - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (gBagPockets[pocket].itemSlots[i].itemId == 0) - { - if (count <= slotCapacity) - return TRUE; - else - count -= slotCapacity; - } - } - if (count > 0) - return FALSE; //No more item slots. The bag is full - } - - return TRUE; -} - -// This function matches if gBagPockets is declared non-const, -// but it should be fixed anyway. -#ifdef NONMATCHING -bool8 AddBagItem(u16 itemId, u16 count) -{ - u8 i; - u8 pocket; - u16 slotCapacity; - struct ItemSlot newItems[64]; - - if (ItemId_GetPocket(itemId) == 0) - return FALSE; - pocket = ItemId_GetPocket(itemId) - 1; - //Copy the bag pocket - memcpy(newItems, gBagPockets[pocket].itemSlots, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); - if (pocket != BERRIES_POCKET) - slotCapacity = 99; - else - slotCapacity = 999; - - //Use any item slots that already contain this item - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (newItems[i].itemId == itemId) - { - if (newItems[i].quantity + count <= slotCapacity) - { - newItems[i].quantity += count; - //Copy pocket back into the bag. - memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); - return TRUE; - } - if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) - return FALSE; - count -= slotCapacity - newItems[i].quantity; - newItems[i].quantity = slotCapacity; - if (count == 0) - goto copy_items; - } - } - - //Put any remaining items into new item slots. - if (count > 0) - { - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (newItems[i].itemId == 0) - { - newItems[i].itemId = itemId; - if (count <= slotCapacity) - { - newItems[i].quantity = count; - goto copy_items; - } - count -= slotCapacity; - newItems[i].quantity = slotCapacity; - } - } - if (count > 0) - return FALSE; //No more empty item slots. The bag is full. - } - - copy_items: - //Copy pocket back into the bag. - memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); - return TRUE; -} -#else -__attribute__((naked)) -bool8 AddBagItem(u16 itemId, u16 count) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x100\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ - lsls r1, 16\n\ - lsrs r4, r1, 16\n\ - bl ItemId_GetPocket\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080A9510\n\ - mov r0, r8\n\ - bl ItemId_GetPocket\n\ - subs r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldr r1, _080A94F8 @ =gBagPockets\n\ - lsls r0, r6, 3\n\ - adds r5, r0, r1\n\ - ldr r1, [r5]\n\ - ldrb r2, [r5, 0x4]\n\ - lsls r2, 2\n\ - mov r0, sp\n\ - bl memcpy\n\ - ldr r7, _080A94FC @ =0x000003e7\n\ - cmp r6, 0x3\n\ - beq _080A9468\n\ - movs r7, 0x63\n\ -_080A9468:\n\ - movs r1, 0\n\ - ldrb r0, [r5, 0x4]\n\ - cmp r1, r0\n\ - bcs _080A94B2\n\ - subs r0, r6, 0x2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r12, r0\n\ -_080A9478:\n\ - lsls r0, r1, 2\n\ - mov r2, sp\n\ - adds r3, r2, r0\n\ - ldrh r0, [r3]\n\ - cmp r0, r8\n\ - bne _080A94A6\n\ - ldrh r2, [r3, 0x2]\n\ - adds r0, r2, r4\n\ - cmp r0, r7\n\ - ble _080A9500\n\ - mov r0, r12\n\ - cmp r0, 0x1\n\ - bls _080A9510\n\ - subs r0, r7, r2\n\ - subs r0, r4, r0\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - strh r7, [r3, 0x2]\n\ - ldr r2, _080A94F8 @ =gBagPockets\n\ - mov r9, r2\n\ - lsls r3, r6, 3\n\ - cmp r4, 0\n\ - beq _080A9516\n\ -_080A94A6:\n\ - adds r0, r1, 0x1\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - ldrb r0, [r5, 0x4]\n\ - cmp r1, r0\n\ - bcc _080A9478\n\ -_080A94B2:\n\ - ldr r2, _080A94F8 @ =gBagPockets\n\ - mov r9, r2\n\ - lsls r3, r6, 3\n\ - cmp r4, 0\n\ - beq _080A9516\n\ - movs r1, 0\n\ - adds r0, r3, r2\n\ - ldrb r0, [r0, 0x4]\n\ - cmp r1, r0\n\ - bcs _080A94F2\n\ - mov r6, r9\n\ - adds r5, r3, r6\n\ -_080A94CA:\n\ - lsls r0, r1, 2\n\ - mov r6, sp\n\ - adds r2, r6, r0\n\ - ldrh r0, [r2]\n\ - cmp r0, 0\n\ - bne _080A94E6\n\ - mov r0, r8\n\ - strh r0, [r2]\n\ - cmp r4, r7\n\ - bls _080A9514\n\ - subs r0, r4, r7\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - strh r7, [r2, 0x2]\n\ -_080A94E6:\n\ - adds r0, r1, 0x1\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - ldrb r2, [r5, 0x4]\n\ - cmp r1, r2\n\ - bcc _080A94CA\n\ -_080A94F2:\n\ - cmp r4, 0\n\ - beq _080A9516\n\ - b _080A9510\n\ - .align 2, 0\n\ -_080A94F8: .4byte gBagPockets\n\ -_080A94FC: .4byte 0x000003e7\n\ -_080A9500:\n\ - strh r0, [r3, 0x2]\n\ - ldr r0, _080A950C @ =gBagPockets\n\ - lsls r1, r6, 3\n\ - adds r1, r0\n\ - b _080A951A\n\ - .align 2, 0\n\ -_080A950C: .4byte gBagPockets\n\ -_080A9510:\n\ - movs r0, 0\n\ - b _080A9528\n\ -_080A9514:\n\ - strh r4, [r2, 0x2]\n\ -_080A9516:\n\ - mov r6, r9\n\ - adds r1, r3, r6\n\ -_080A951A:\n\ - ldr r0, [r1]\n\ - ldrb r2, [r1, 0x4]\n\ - lsls r2, 2\n\ - mov r1, sp\n\ - bl memcpy\n\ - movs r0, 0x1\n\ -_080A9528:\n\ - add sp, 0x100\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} -#endif - -bool8 RemoveBagItem(u16 itemId, u16 count) -{ - u8 i; - u8 pocket; - u16 totalQuantity = 0; - - if (ItemId_GetPocket(itemId) == 0 || itemId == 0) - return FALSE; - pocket = ItemId_GetPocket(itemId) - 1; - - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) - totalQuantity += gBagPockets[pocket].itemSlots[i].quantity; - } - if (totalQuantity < count) - return FALSE; //We don't have enough of the item - - if (gBagPockets[pocket].capacity > gUnknown_02038560 - && gBagPockets[pocket].itemSlots[gUnknown_02038560].itemId == itemId) - { - if (gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity >= count) - { - gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity -= count; - count = 0; - } - else - { - count -= gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity; - gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity = 0; - } - if (gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity == 0) - gBagPockets[pocket].itemSlots[gUnknown_02038560].itemId = 0; - if (count == 0) - return TRUE; - } - - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) - { - if (gBagPockets[pocket].itemSlots[i].quantity >= count) - { - gBagPockets[pocket].itemSlots[i].quantity -= count; - count = 0; - } - else - { - count -= gBagPockets[pocket].itemSlots[i].quantity; - gBagPockets[pocket].itemSlots[i].quantity = 0; - } - if (gBagPockets[pocket].itemSlots[i].quantity == 0) - gBagPockets[pocket].itemSlots[i].itemId = 0; - if (count == 0) - return TRUE; - } - } - return TRUE; -} - -u8 GetPocketByItemId(u16 itemId) -{ - return ItemId_GetPocket(itemId); -} - -void ClearItemSlots(struct ItemSlot *itemSlots, u8 b) -{ - u16 i; - - for (i = 0; i < b; i++) - { - itemSlots[i].itemId = 0; - itemSlots[i].quantity = 0; - } -} - -static s32 FindFreePCItemSlot(void) -{ - s8 i; - - for (i = 0; i < 50; i++) - { - if (gSaveBlock1.pcItems[i].itemId == 0) - return i; - } - return -1; -} - -u8 CountUsedPCItemSlots(void) -{ - u8 usedSlots = 0; - u8 i; - - for (i = 0; i < 50; i++) - { - if (gSaveBlock1.pcItems[i].itemId != 0) - usedSlots++; - } - return usedSlots; -} - -bool8 CheckPCHasItem(u16 itemId, u16 count) -{ - u8 i; - - for (i = 0; i < 50; i++) - { - if (gSaveBlock1.pcItems[i].itemId == itemId && gSaveBlock1.pcItems[i].quantity >= count) - return TRUE; - } - return FALSE; -} - -bool8 AddPCItem(u16 itemId, u16 count) -{ - u8 i; - s8 freeSlot; - struct ItemSlot newItems[50]; - - //Copy PC items - memcpy(newItems, gSaveBlock1.pcItems, sizeof(newItems)); - - //Use any item slots that already contain this item - for (i = 0; i < 50; i++) - { - if (newItems[i].itemId == itemId) - { - if (newItems[i].quantity + count <= 999) - { - newItems[i].quantity += count; - memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems)); - return TRUE; - } - count += newItems[i].quantity - 999; - newItems[i].quantity = 999; - if (count == 0) - { - memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems)); - return TRUE; - } - } - } - - //Put any remaining items into a new item slot. - if (count > 0) - { - freeSlot = FindFreePCItemSlot(); - if (freeSlot == -1) - return FALSE; - newItems[freeSlot].itemId = itemId; - newItems[freeSlot].quantity = count; - } - - //Copy items back to the PC - memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems)); - return TRUE; -} - -void RemovePCItem(u8 index, u16 count) -{ - gSaveBlock1.pcItems[index].quantity -= count; - if (gSaveBlock1.pcItems[index].quantity == 0) - { - gSaveBlock1.pcItems[index].itemId = 0; - CompactPCItems(); - } -} - -static void CompactPCItems(void) -{ - u16 i; - u16 j; - - for (i = 0; i < 49; i++) - { - for (j = i + 1; j <= 49; j++) - { - if (gSaveBlock1.pcItems[i].itemId == 0) - { - struct ItemSlot temp = gSaveBlock1.pcItems[i]; - gSaveBlock1.pcItems[i] = gSaveBlock1.pcItems[j]; - gSaveBlock1.pcItems[j] = temp; - } - } - } -} - -void SwapRegisteredBike(void) -{ - switch (gSaveBlock1.registeredItem) - { - case 0x103: - gSaveBlock1.registeredItem = 0x110; - break; - case 0x110: - gSaveBlock1.registeredItem = 0x103; - break; - } -} - -static u16 SanitizeItemId(u16 itemId) -{ - if (itemId > 0x15C) - return 0; - else - return itemId; -} - -const struct Item *ItemId_GetItem(u16 itemId) -{ - return &gItems[SanitizeItemId(itemId)]; -} - -u16 ItemId_GetId(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].itemId; -} - -u16 ItemId_GetPrice(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].price; -} - -u8 ItemId_GetHoldEffect(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].holdEffect; -} - -u8 ItemId_GetHoldEffectParam(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].holdEffectParam; -} - -const u8 *ItemId_GetDescription(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].description; -} - -bool32 ItemId_CopyDescription(u8 *a, u32 itemId, u32 c) -{ - u32 r5 = c + 1; - const u8 *description = gItems[SanitizeItemId(itemId)].description; - u8 *str = a; - - for (;;) - { - if (*description == 0xFF || *description == 0xFE) - { - r5--; - if (r5 == 0) - { - *str = 0xFF; - return TRUE; - } - if (*description == 0xFF) - return FALSE; - str = a; - description++; - } - else - *(str++) = *(description++); - } -} - -u8 ItemId_GetImportance(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].importance; -} - -u8 ItemId_GetUnknownValue(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].unk19; -} - -u8 ItemId_GetPocket(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].pocket; -} - -u8 ItemId_GetType(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].type; -} - -ItemUseFunc ItemId_GetFieldFunc(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].fieldUseFunc; -} - -u8 ItemId_GetBattleUsage(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].battleUsage; -} - -ItemUseFunc ItemId_GetBattleFunc(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].battleUseFunc; -} - -u8 ItemId_GetSecondaryId(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].secondaryId; -} diff --git a/src/item_menu.c b/src/item_menu.c deleted file mode 100644 index 350ba3db4..000000000 --- a/src/item_menu.c +++ /dev/null @@ -1,4583 +0,0 @@ -#include "global.h" -#include "berry.h" -#include "berry_tag_screen.h" -#include "data2.h" -#include "decompress.h" -#include "field_effect.h" -#include "field_map_obj_helpers.h" -#include "field_player_avatar.h" -#include "graphics.h" -#include "item.h" -#include "items.h" -#include "item_menu.h" -#include "item_use.h" -#include "link.h" -#include "mail_data.h" -#include "main.h" -#include "map_name_popup.h" -#include "menu.h" -#include "menu_cursor.h" -#include "menu_helpers.h" -#include "money.h" -#include "palette.h" -#include "party_menu.h" -#include "player_pc.h" -#include "pokemon_menu.h" -#include "rom4.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "strings.h" -#include "strings2.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "unknown_task.h" - -// External stuff -extern u8 ewram[]; -extern void gpu_pal_allocator_reset__manage_upper_four(void); -extern void sub_80F9020(void); -extern void sub_80F9988(); -extern void sub_809D104(u16 *, u16, u16, const u8 *, u16, u16, u16, u16); -extern void PauseVerticalScrollIndicator(); -extern u8 sub_80F9284(void); -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 u8 sub_80F931C(); -extern void sub_808A3F8(u8); -extern void sub_80B3050(void); -extern void sub_80546B8(u8); -extern void sub_804E990(u8); -extern void sub_802E424(u8); -extern void sub_8064E2C(void); - -struct PocketScrollState -{ - u8 cursorPos; - u8 scrollTop; - u8 numSlots; - u8 cursorMax; -}; - -struct UnknownStruct2 -{ - u8 unk0; - u8 textLine; - u8 unk2; -}; - -struct UnknownStruct3 -{ - u8 unk0; - u8 unk1; - u8 unk2; -}; - -struct UnknownStruct4 -{ - u8 unk0; - u8 unk1; - u16 unk2; - const u8 *unk4; - TaskFunc unk8; -}; - -struct UnknownStruct5 -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; -}; - -struct UnknownStruct6 -{ - u8 unk0; -}; - -enum -{ - BAG_POCKET_ITEMS, // 0 - BAG_POCKET_POKE_BALLS, // 1 - BAG_POCKET_TMs_HMs, // 2 - BAG_POCKET_BERRIES, // 3 - BAG_POCKET_KEY_ITEMS, // 4 -}; - -enum -{ - RETURN_TO_FIELD_0, - RETURN_TO_BATTLE, - RETURN_TO_PKMN_LIST, - RETURN_TO_SHOP, - RETURN_TO_FIELD_4, - RETURN_TO_FIELD_5, - RETURN_TO_PC, - RETURN_TO_WALLY_BATTLE, -}; - -enum -{ - ITEM_ACTION_USE_0, // 0 - ITEM_ACTION_TOSS, // 1 - ITEM_ACTION_CANCEL_2, // 2 - ITEM_ACTION_REGISTER, // 3 - ITEM_ACTION_USE_4, // 4 - ITEM_ACTION_CANCEL_5, // 5 - ITEM_ACTION_GIVE, // 6 - ITEM_ACTION_CHECK_TAG, // 7 - ITEM_ACTION_NONE, // 8 - ITEM_ACTION_CONFIRM, // 9 -}; - -// ewram -EWRAM_DATA static struct UnknownStruct2 gUnknown_0203853C = {0}; -EWRAM_DATA static struct UnknownStruct3 gUnknown_02038540 = {0}; -EWRAM_DATA static struct UnknownStruct4 gUnknown_02038544 = {0}; -EWRAM_DATA static struct UnknownStruct5 gUnknown_02038550 = {0}; -EWRAM_DATA static struct UnknownStruct6 gUnknown_02038554 = {0}; // There are 3 bytes of padding after this, so I assume it's a struct -EWRAM_DATA static u8 gUnknown_02038558 = 0; -EWRAM_DATA static s8 sCurrentBagPocket = 0; -EWRAM_DATA static u8 gUnknown_0203855A = 0; -EWRAM_DATA static s8 gUnknown_0203855B = 0; -EWRAM_DATA static s8 gUnknown_0203855C = 0; -EWRAM_DATA u16 gScriptItemId = 0; -EWRAM_DATA u8 gUnknown_02038560 = 0; -EWRAM_DATA u8 gUnknown_02038561 = 0; -EWRAM_DATA static u8 gUnknown_02038562 = 0; -EWRAM_DATA static u8 gUnknown_02038563 = 0; -EWRAM_DATA static u8 gUnknown_02038564 = 0; -EWRAM_DATA static u8 sPokeballSpriteId ALIGNED(4) = 0; // HACK: why is there a space before this variable? - -// bss -static u8 sPopupMenuSelection; -static u8 sReturnLocation; -static const u8 *sPopupMenuActionList; - -// common -void (*gUnknown_03005D00)(u8) = NULL; -extern u16 gUnknown_030041B4; -extern struct PocketScrollState gBagPocketScrollStates[]; -extern struct ItemSlot *gCurrentBagPocketItemSlots; // selected pocket item slots -extern const u8 Event_NoRegisteredItem[]; - -#define ewramBerryPic (ewram + 0) -#define ewramBerryPicTemp (ewram + 0x1000) -#define ewramSavedItemsPocket ((struct ItemSlot *)(ewram + 0x1E000)) // saved items pocket (for Wally battle) -#define ewramSavedPokeballsPocket ((struct ItemSlot *)(ewram + 0x1F000)) // saved Pokeballs pocket (for Wally battle) -#define ewramBagSetupStep (ewram[0x1FFFF]) - -extern const struct CompressedSpriteSheet sMaleBagSpriteSheet; -extern const struct CompressedSpriteSheet sFemaleBagSpriteSheet; -extern const struct CompressedSpritePalette sBagSpritePalette; - -const struct BagPocket gBagPockets[NUM_BAG_POCKETS] = -{ - {gSaveBlock1.bagPocket_Items, 20}, - {gSaveBlock1.bagPocket_PokeBalls, 16}, - {gSaveBlock1.bagPocket_TMHM, 64}, - {gSaveBlock1.bagPocket_Berries, 46}, - {gSaveBlock1.bagPocket_KeyItems, 20}, -}; - -static void HandlePopupMenuAction_UseOnField(u8); -static void HandlePopupMenuAction_Toss(u8); -static void sub_80A5F80(u8); -static void HandlePopupMenuAction_Register(u8); -static void HandlePopupMenuAction_UseInBattle(u8); -static void sub_80A7124(u8); -static void HandlePopupMenuAction_Give(u8); -static void HandlePopupMenuAction_CheckTag(u8); -static void HandlePopupMenuAction_Confirm(u8); - -static const struct MenuAction2 sItemPopupMenuActions[] = -{ - {OtherText_Use, HandlePopupMenuAction_UseOnField}, - {OtherText_Toss, HandlePopupMenuAction_Toss}, - {gOtherText_CancelNoTerminator, sub_80A5F80}, - {OtherText_Register, HandlePopupMenuAction_Register}, - {OtherText_Use, HandlePopupMenuAction_UseInBattle}, - {gOtherText_CancelNoTerminator, sub_80A7124}, - {OtherText_Give2, HandlePopupMenuAction_Give}, - {OtherText_CheckTag, HandlePopupMenuAction_CheckTag}, - {gOtherText_CancelWithTerminator, NULL}, - {OtherText_Confirm, HandlePopupMenuAction_Confirm}, -}; - -static const u8 sItemPopupMenuChoicesTable[][6] = -{ - [BAG_POCKET_ITEMS] = - { - ITEM_ACTION_USE_0, - ITEM_ACTION_TOSS, - ITEM_ACTION_GIVE, - ITEM_ACTION_CANCEL_2, - }, - - [BAG_POCKET_POKE_BALLS] = - { - ITEM_ACTION_GIVE, - ITEM_ACTION_TOSS, - ITEM_ACTION_NONE, - ITEM_ACTION_CANCEL_2, - }, - - [BAG_POCKET_TMs_HMs] = - { - ITEM_ACTION_USE_0, - ITEM_ACTION_NONE, - ITEM_ACTION_GIVE, - ITEM_ACTION_CANCEL_2, - }, - - [BAG_POCKET_BERRIES] = - { - ITEM_ACTION_CHECK_TAG, - ITEM_ACTION_USE_0, - ITEM_ACTION_TOSS, - ITEM_ACTION_NONE, - ITEM_ACTION_GIVE, - ITEM_ACTION_CANCEL_2 - }, - - [BAG_POCKET_KEY_ITEMS] = - { - ITEM_ACTION_USE_0, - ITEM_ACTION_NONE, - ITEM_ACTION_REGISTER, - ITEM_ACTION_CANCEL_2, - }, -}; - -const u8 gUnknown_083C16AE[][2] = -{ - {6, 2}, - {6, 2}, - {6, 2}, - {6, 2}, - {2, 0}, -}; - -const u8 gUnknown_083C16B8[] = {7, 9, 8, 2}; - -static void OnItemSelect_Field05(u8); -static void OnBagClose_Field0(u8); -static void OnBagClose_PkmnList(u8); -static void OnItemSelect_PkmnList(u8); -static void OnBagClose_Shop(u8); -static void OnItemSelect_Shop(u8); -static void OnBagClose_Field4(u8); -static void OnItemSelect_Field4(u8); -static void OnBagClose_Field5(u8); -static void OnBagClose_PC(u8); -static void OnItemSelect_PC(u8); -static void OnItemSelect_Battle(u8); -static void OnBagClose_Battle(u8); - -static const struct {TaskFunc onItemSelect; TaskFunc onBagClose;} gUnknown_083C16BC[] = -{ - [RETURN_TO_FIELD_0] = {OnItemSelect_Field05, OnBagClose_Field0}, - [RETURN_TO_BATTLE] = {OnItemSelect_Battle, OnBagClose_Battle}, - [RETURN_TO_PKMN_LIST] = {OnItemSelect_PkmnList, OnBagClose_PkmnList}, - [RETURN_TO_SHOP] = {OnItemSelect_Shop, OnBagClose_Shop}, - [RETURN_TO_FIELD_4] = {OnItemSelect_Field4, OnBagClose_Field4}, - [RETURN_TO_FIELD_5] = {OnItemSelect_Field05, OnBagClose_Field5}, - [RETURN_TO_PC] = {OnItemSelect_PC, OnBagClose_PC}, -}; - -static void sub_80A5E60(u8); -static void sub_80A5E90(u8); - -static const struct YesNoFuncTable gUnknown_083C16F4 = {sub_80A5E60, sub_80A5E90}; - -static void sub_80A65AC(u8); -static void sub_80A6618(u8); - -const struct YesNoFuncTable gUnknown_083C16FC = {sub_80A65AC, sub_80A6618}; - -void sub_80A34E8(void); -static bool8 LoadBagGraphicsMultistep(void); -static void sub_80A362C(void); -static void sub_80A3740(void); -static void sub_80A396C(u16 *, u8, u8, u8); -static void sub_80A39B8(u16 *, u8); -static void sub_80A39E4(u16 *, u8, u8, s8); -static void DrawPocketIndicatorDots(u16 *, u8); -static void SortItemSlots(struct BagPocket); -static void UpdateAllBagPockets(void); -static void sub_80A3D24(u8); -static void sub_80A3D40(void); -static void RemoveSelectIconFromRegisteredItem(void); -static void sub_80A48E8(u16, int, int); -static void ItemListMenu_InitDescription(s16); -static void ItemListMenu_ChangeDescription(s16, int); -static void sub_80A4F68(u8); -static void sub_80A50C8(u8); -static void sub_80A5AE4(u8); -static void sub_80A5BF8(u8); -static void Task_CallItemUseOnFieldCallback(u8); -static void sub_80A6444(u8); -static void sub_80A648C(u8); -static void Task_BuyHowManyDialogueHandleInput(u8); -static void BuyMenuPrintItemQuantityAndPrice(u8); -static void BuyMenuDisplayMessage(u16, u16); -static void sub_80A683C(void); -static void sub_80A6870(u16, u8); -static void sub_80A699C(void); -static void sub_80A7230(u8); -static void ItemListMenu_InitMenu(void); -static void sub_80A73C0(void); -static void sub_80A73F0(void); -static void sub_80A73FC(void); -static void sub_80A740C(void); -static void sub_80A7420(void); -static void sub_80A751C(void); -static void sub_80A7528(u8); -static void sub_80A7590(void); -static void sub_80A75E4(void); -static void sub_80A7630(void); -static void sub_80A763C(void); -static void sub_80A76A0(void); -static void sub_80A770C(void); -static void DisplayCannotUseItemMessage(int, const u8 *, TaskFunc, int); -static void sub_80A7768(void); -static void sub_80A7828(void); -static void sub_80A7834(int, int); -static bool32 sub_80A78A0(void); -static void sub_80A78B8(void); -static bool32 sub_80A78C4(void); -static void sub_80A78E8(void); -static int sub_80A78F4(void); -static void sub_80A7918(void); -static int sub_80A7924(void); -static int sub_80A7958(void); -static void sub_80A7970(void); -static void sub_80A797C(void); -static int sub_80A7988(void); -static void sub_80A79B4(struct Sprite *); -static void sub_80A79EC(struct Sprite *); -static void sub_80A7A94(struct Sprite *); -static void sub_80A7AE4(struct Sprite *); -static void CreateBagSprite(void); -static void sub_80A7B6C(struct Sprite *); -static void CreateBagPokeballSprite(u8); -static void sub_80A7C64(void); - -static void sub_80A3118(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - sub_80A740C(); - UpdatePaletteFade(); -} - -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); - } -} - -static bool8 SetupBagMultistep(void) -{ - u32 index; - u16 savedIme; - - switch (gMain.state) - { - case 0: - sub_80F9438(); - sub_80A34E8(); - gMain.state++; - break; - case 1: - remove_some_task(); - gMain.state++; - break; - case 2: - gpu_pal_allocator_reset__manage_upper_four(); - gMain.state++; - break; - case 3: - sub_80F9020(); - ewramBagSetupStep = 0; - gMain.state++; - break; - case 4: - ResetPaletteFade(); - gPaletteFade.bufferTransferDisabled = TRUE; - gMain.state++; - break; - case 5: - ResetSpriteData(); - gMain.state++; - break; - case 6: - if (LoadBagGraphicsMultistep() == FALSE) - break; - gMain.state++; - break; - case 7: - SetUpWindowConfig(&gWindowConfig_81E6DFC); - gMain.state++; - break; - case 8: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6DFC); - gMain.state++; - break; - case 9: - if (!MultistepInitMenuWindowContinue()) - break; - gMain.state++; - break; - case 10: - sub_80F944C(); - 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); - if (sReturnLocation == RETURN_TO_FIELD_4 || sReturnLocation == RETURN_TO_FIELD_5) - { - sub_80F979C(2, 1); - sub_80F979C(3, 1); - } - gMain.state++; - break; - case 11: - gUnknown_0203855A = 16; - sub_80A39B8(gBGTilemapBuffers[2], sCurrentBagPocket + 1); - DrawPocketIndicatorDots(gBGTilemapBuffers[2], sCurrentBagPocket); - UpdateAllBagPockets(); - SortItemSlots(gBagPockets[2]); - SortItemSlots(gBagPockets[3]); - sub_80A3D40(); - gCurrentBagPocketItemSlots = gBagPockets[sCurrentBagPocket].itemSlots; - sub_80A362C(); - gMain.state++; - break; - case 12: - sub_80A48E8(0xFFFF, 0, 7); - index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - ItemListMenu_InitDescription(gCurrentBagPocketItemSlots[index].itemId); - ItemListMenu_InitMenu(); - gUnknown_0203855B = sCurrentBagPocket + 1; - gUnknown_0203855C = 0; - gMain.state++; - break; - case 13: - CreateBagSprite(); - CreateBagPokeballSprite(0); - sub_80A3740(); - gMain.state++; - break; - case 14: - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - gPaletteFade.bufferTransferDisabled = FALSE; - gMain.state++; - break; - case 15: - if (sub_8055870() == TRUE) - break; - gMain.state++; - break; - case 16: - SetVBlankCallback(sub_80A3134); - SetMainCallback2(sub_80A3118); - sub_80A751C(); - sub_80A7630(); - sub_80A770C(); - sub_80A7828(); - sub_80A78B8(); - return TRUE; - } - return FALSE; -} - -static bool8 sub_80A34B4(void) -{ - while (1) - { - if (SetupBagMultistep() == TRUE) - { - sPopupMenuSelection = 0; - ResetTasks(); - return TRUE; - } - if (sub_80F9344() == TRUE) - break; - } - return FALSE; -} - - -void sub_80A34E8(void) -{ - sub_80F9368(); - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(12) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(4) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - REG_BLDCNT = 0; -} - -static bool8 LoadBagGraphicsMultistep(void) -{ - switch (ewramBagSetupStep) - { - case 0: - LZDecompressVram(gBagScreen_Gfx, (void *)(VRAM + 0x4000)); - ewramBagSetupStep++; - break; - case 1: - CpuCopy16(gUnknown_08E77004, gBGTilemapBuffers[2], 0x800); - ewramBagSetupStep++; - break; - case 2: - if (gSaveBlock2.playerGender == MALE || sReturnLocation == RETURN_TO_WALLY_BATTLE) - LoadCompressedPalette(gBagScreenMale_Pal, 0, 64); - else - LoadCompressedPalette(gBagScreenFemale_Pal, 0, 64); - ewramBagSetupStep++; - break; - case 3: - if (gSaveBlock2.playerGender == MALE || sReturnLocation == RETURN_TO_WALLY_BATTLE) - LoadCompressedObjectPic(&sMaleBagSpriteSheet); - else - LoadCompressedObjectPic(&sFemaleBagSpriteSheet); - ewramBagSetupStep++; - break; - case 4: - LoadCompressedObjectPalette(&sBagSpritePalette); - ewramBagSetupStep = 0; - return TRUE; - } - return FALSE; -} - -static void sub_80A362C(void) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - u8 r3; - - if (sReturnLocation == RETURN_TO_FIELD_5) - r3 = gBagPocketScrollStates[i].numSlots - 1; - else - r3 = gBagPocketScrollStates[i].numSlots; - - if (gBagPocketScrollStates[i].scrollTop != 0) - { - if (gBagPocketScrollStates[i].scrollTop + gBagPocketScrollStates[i].cursorMax > r3) - gBagPocketScrollStates[i].scrollTop = r3 - gBagPocketScrollStates[i].cursorMax; - } - else - { - if (gBagPocketScrollStates[i].cursorPos > r3) - gBagPocketScrollStates[i].cursorPos = r3; - } - } -} - -void ResetBagScrollPositions(void) -{ - u16 i; - - for (i = 0; i < NUM_BAG_POCKETS; i++) - { - gBagPocketScrollStates[i].cursorPos = 0; - gBagPocketScrollStates[i].scrollTop = 0; - gBagPocketScrollStates[i].numSlots = 0; - gBagPocketScrollStates[i].cursorMax = 0; - } - sCurrentBagPocket = 0; -} - -static void sub_80A36B8(u16 *a, u8 b, u8 c, u8 d, u8 e) -{ - u16 i; - u16 j; - - for (i = c; i <= c + e; i++) - { - for (j = b; j <= b + d; j++) - { - u32 index = j + i * 32; - - a[index] = 0; - } - } -} - -void ClearBag(void) -{ - u16 i; - - for (i = 0; i < NUM_BAG_POCKETS; i++) - ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity); - ResetBagScrollPositions(); -} - -static void sub_80A3740(void) -{ - const u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE}; - - LoadPalette(&colors[1], 0xD1, sizeof(colors[1])); - LoadPalette(&colors[0], 0xD8, sizeof(colors[0])); -} - -static void sub_80A3770(void) -{ - if (sReturnLocation == RETURN_TO_FIELD_0) - { - sPopupMenuActionList = sItemPopupMenuChoicesTable[sCurrentBagPocket]; - if (sCurrentBagPocket != BAG_POCKET_BERRIES) - gUnknown_02038564 = 4; - else - gUnknown_02038564 = 6; - } -} - -static void sub_80A37C0(u8 taskId) -{ - gTasks[taskId].func = sub_80A50C8; - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - StartVerticalScrollIndicators(2); - StartVerticalScrollIndicators(3); -} - -static void sub_80A37F8(u8 taskId) -{ - u8 r5 = gUnknown_0203855A; - - if (r5 < 16) - { - gUnknown_0203855A++; - sub_80A396C(gBGTilemapBuffers[2], r5, gUnknown_0203855A, 0x4F); - sub_80A39E4(gBGTilemapBuffers[2], sCurrentBagPocket + 1, gUnknown_0203855A / 2, gTasks[taskId].data[5]); - gUnknown_02038558 = 1; - sub_80A48E8(taskId, r5 / 2, gUnknown_0203855A / 2 - 1); - gUnknown_02038558 = 0; - return; - } - - if (gLinkOpen == TRUE) - { - u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - - ItemListMenu_ChangeDescription(gCurrentBagPocketItemSlots[index].itemId, gUnknown_02038562); - gUnknown_02038562++; - } - else - { - while (gUnknown_02038562 < 3) - { - u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - - ItemListMenu_ChangeDescription(gCurrentBagPocketItemSlots[index].itemId, gUnknown_02038562); - gUnknown_02038562++; - } - } - if (gUnknown_02038562 == 3) - { - gUnknown_0203855A = 16; - gUnknown_0203855B = sCurrentBagPocket + 1; - sub_80A37C0(FindTaskIdByFunc(sub_80A4F68)); - DestroyTask(taskId); - ItemListMenu_InitMenu(); - sub_80F979C(2, 0); - sub_80F979C(3, 0); - } -} - -static void sub_80A3954(u16 *a) -{ - CpuCopy16(gUnknown_08E77004, a, 0x800); -} - -static void sub_80A396C(u16 *a, u8 b, u8 c, u8 d) -{ - u16 *dst = a + 14 + (b + 2) * 32; - u16 i; - - while (c > b++) - { - for (i = 0; i < 15; i++) - dst[i] = d; - dst += 32; - } -} - -static void sub_80A39B8(u16 *a, u8 b) -{ - u8 var = b * 2; - - sub_809D104(a, 4, 10, gUnknown_08E96EC8, 0, var, 8, 2); -} - -static void sub_80A39E4(u16 *a, u8 b, u8 c, s8 d) -{ - u16 r2 = b * 2; - u16 r7; - - if (d == -1) - { - r7 = (b + 1) * 2; - if (b == 5) - r7 = 2; - - sub_809D104(a, 4, 10, gUnknown_08E96EC8, 8 - c, r2, c, 2); - sub_809D104(a, c + 4, 10, gUnknown_08E96EC8, 0, r7, 8 - c, 2); - } - else if (d == 1) - { - r7 = (b - 1) * 2; - if (b == 1) - r7 = 10; - - sub_809D104(a, 4, 10, gUnknown_08E96EC8, c, r7, 8 - c, 2); - sub_809D104(a, 12 - c, 10, gUnknown_08E96EC8, 0, r2, c, 2); - } -} - -// Draws dots under the bag sprite, showing which pocket is selected -static void DrawPocketIndicatorDots(u16 *tileMapBuffer, u8 selectedPocket) -{ - u8 i; - - for (i = 0; i < NUM_BAG_POCKETS; i++) - { - if (i == selectedPocket) - tileMapBuffer[0x125 + i] = 0x107D; - else - tileMapBuffer[0x125 + i] = 0x107C; - } -} - -static void ChangePocket(u16 *tileMapBuffer, s8 delta) -{ - u8 taskId; - - sCurrentBagPocket += delta; - // Wrap around - if (sCurrentBagPocket >= NUM_BAG_POCKETS) - sCurrentBagPocket = 0; - if (sCurrentBagPocket < 0) - sCurrentBagPocket = NUM_BAG_POCKETS - 1; - - sub_80A76A0(); - sub_80A7590(); - gCurrentBagPocketItemSlots = gBagPockets[sCurrentBagPocket].itemSlots; - sub_80A3D24(sCurrentBagPocket); - gUnknown_0203855A = 0; - sub_80A3954(tileMapBuffer); - sub_80A396C(tileMapBuffer, 0, 16, 3); - sub_80A39B8(tileMapBuffer, 0); - gUnknown_0203855B = 6; - gUnknown_02038562 = 0; - taskId = FindTaskIdByFunc(sub_80A37F8); - if (taskId == 0xFF) - taskId = CreateTask(sub_80A37F8, 8); - gTasks[taskId].data[5] = delta; -} - -static void SwapItemSlots(struct ItemSlot *a, struct ItemSlot *b) -{ - struct ItemSlot temp = *a; - - *a = *b; - *b = temp; -} - -static void RemoveEmptyItemSlots(struct BagPocket pocket) -{ - u16 i; - u16 j; - - for (i = 0; i < pocket.capacity - 1; i++) - { - for (j = i + 1; j < pocket.capacity; j++) - { - if (pocket.itemSlots[i].quantity == 0) - SwapItemSlots(&pocket.itemSlots[i], &pocket.itemSlots[j]); - } - } -} - -static void SortItemSlots(struct BagPocket pocket) -{ - u16 i; - u16 j; - - for (i = 0; i < pocket.capacity; i++) - { - for (j = i + 1; j < pocket.capacity; j++) - { - if (pocket.itemSlots[i].quantity != 0 && pocket.itemSlots[j].quantity != 0 - && pocket.itemSlots[i].itemId > pocket.itemSlots[j].itemId) - SwapItemSlots(&pocket.itemSlots[i], &pocket.itemSlots[j]); - } - } -} - -static void UpdateBagPocket(u8 pocketNum) -{ - u16 i; - - gBagPocketScrollStates[pocketNum].numSlots = 0; - for (i = 0; i < gBagPockets[pocketNum].capacity; i++) - { - if (gBagPockets[pocketNum].itemSlots[i].quantity != 0) - gBagPocketScrollStates[pocketNum].numSlots++; - } - RemoveEmptyItemSlots(gBagPockets[pocketNum]); -} - -static void UpdateAllBagPockets(void) -{ - u8 i; - - for (i = 0; i < NUM_BAG_POCKETS; i++) - UpdateBagPocket(i); -} - -static void sub_80A3D24(u8 pocketNum) -{ - if (gBagPocketScrollStates[pocketNum].numSlots >= 7) - gBagPocketScrollStates[pocketNum].cursorMax = 7; - else - gBagPocketScrollStates[pocketNum].cursorMax = gBagPocketScrollStates[pocketNum].numSlots; -} - -static void sub_80A3D40(void) -{ - u8 i; - - for (i = 0; i < NUM_BAG_POCKETS; i++) - sub_80A3D24(i); -} - -static void sub_80A3D5C(u8 taskId) -{ - u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - - gCurrentBagPocketItemSlots[index].quantity -= gTasks[taskId].data[1]; - if (gCurrentBagPocketItemSlots[index].quantity == 0) // item slot will be removed if the quantity is zero - { - // Un-register the item if registered - if (gSaveBlock1.registeredItem == gCurrentBagPocketItemSlots[index].itemId) - { - RemoveSelectIconFromRegisteredItem(); - gSaveBlock1.registeredItem = ITEM_NONE; - } - - gCurrentBagPocketItemSlots[index].itemId = ITEM_NONE; - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 7 == gBagPocketScrollStates[sCurrentBagPocket].numSlots - && gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) - gBagPocketScrollStates[sCurrentBagPocket].scrollTop--; - UpdateBagPocket(sCurrentBagPocket); - } - sub_80A3D24(sCurrentBagPocket); -} - -void sub_80A3E0C(void) -{ - u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - - if (gCurrentBagPocketItemSlots[index].quantity == 0) - { - gCurrentBagPocketItemSlots[index].itemId = 0; - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 7 == gBagPocketScrollStates[sCurrentBagPocket].numSlots - && gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) - gBagPocketScrollStates[sCurrentBagPocket].scrollTop--; - UpdateBagPocket(sCurrentBagPocket); - } - sub_80A3D24(sCurrentBagPocket); -} - -static void nullsub_16(void) -{ -} - -static void sub_80A3E70(u8 a, u8 b) -{ - struct ItemSlot temp = gCurrentBagPocketItemSlots[a]; - - gCurrentBagPocketItemSlots[a] = gCurrentBagPocketItemSlots[b]; - gCurrentBagPocketItemSlots[b] = temp; -} - -static void sub_80A3E90(u8 taskId) -{ - PlaySE(SE_SELECT); - nullsub_16(); - sub_80A3E70( - gTasks[taskId].data[10] - 1, - gBagPocketScrollStates[sCurrentBagPocket].cursorPos + gBagPocketScrollStates[sCurrentBagPocket].scrollTop); - gTasks[taskId].data[10] = 0; - sub_80A763C(); - sub_80A7528(0); - ItemListMenu_InitMenu(); -} - -static void sub_80A3EF4(u8 taskId) -{ - u8 r2; - - PlaySE(SE_SELECT); - nullsub_16(); - r2 = gTasks[taskId].data[10] - gBagPocketScrollStates[sCurrentBagPocket].scrollTop - 1; - gTasks[taskId].data[10] = 0; - if (r2 < 8) - sub_80A48E8(taskId, r2, r2); - sub_80A7528(0); -} - -static void sub_80A3F50(u8 taskId) -{ - gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A7528(1); -} - -void sub_80A3FA0(u16 *a, u8 b, u8 c, u8 d, u8 e, u16 f) -{ - s16 i; - s16 j; - - for (i = c; i < c + e; i++) - { - for (j = b; j < b + d; j++) - { - u32 index = j + i * 32; - - a[index] = f; - } - } -} - -static void sub_80A4008(u16 *a, u8 b, u8 c, u8 d, u8 e) -{ - sub_80A3FA0(a, b, c, d, e, 1); -} - -static void DrawSelectIcon(u32 itemPos) -{ - u16 *ptr1 = gBGTilemapBuffers[2] + 0x5A; - - ptr1 += itemPos * 64; - ptr1[0] = 0x5A; - ptr1[1] = 0x5B; - ptr1[2] = 0x5C; - ptr1[32] = 0x6A; - ptr1[33] = 0x6B; - ptr1[34] = 0x6C; -} - -static void MoveSelectIcon(u8 itemPos) -{ - u16 i; - u16 *ptr; - - ptr = gBGTilemapBuffers[2] + 0x5A; - for (i = 0; i < 16; i++) - { - ptr[0] = 0x4F; - ptr[1] = 0x4F; - ptr[2] = 0x4F; - ptr += 32; - } - - ptr = gBGTilemapBuffers[2] + 0x5A + itemPos * 64; - ptr[0] = 0x5A; - ptr[1] = 0x5B; - ptr[2] = 0x5C; - ptr[32] = 0x6A; - ptr[33] = 0x6B; - ptr[34] = 0x6C; -} - -static void EraseSelectIcon(u8 itemPos) -{ - u16 *ptr = gBGTilemapBuffers[2] + 0x5A; - - ptr += itemPos * 64; - ptr[0] = 0x4F; - ptr[1] = 0x4F; - ptr[2] = 0x4F; - ptr[32] = 0x4F; - ptr[33] = 0x4F; - ptr[34] = 0x4F; -} - -static void RemoveSelectIconFromRegisteredItem(void) -{ - u8 i; - - for (i = 0; i < 8; i++) - { - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i == gBagPocketScrollStates[sCurrentBagPocket].numSlots) - break; - if (gCurrentBagPocketItemSlots[gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i].itemId == gSaveBlock1.registeredItem) - { - EraseSelectIcon(i); - break; - } - } -} - -static void AddSelectIconToRegisteredItem(void) -{ - RemoveSelectIconFromRegisteredItem(); - MoveSelectIcon(gBagPocketScrollStates[sCurrentBagPocket].cursorPos); -} - -void sub_80A4164(u8 *dest, u16 value, enum StringConvertMode mode, u8 digits) -{ - *dest++ = CHAR_MULT_SIGN; - dest[0] = EXT_CTRL_CODE_BEGIN; - dest[1] = 0x14; - dest[2] = 6; - dest += 3; - ConvertIntToDecimalStringN(dest, value, mode, 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); -} - -static void sub_80A41D4(u8 taskId) -{ - sub_80A763C(); -} - -static void sub_80A41E0(u8 *a, u16 b, const u8 *c, u16 d, u8 e) -{ - a[0] = EXT_CTRL_CODE_BEGIN; - a[1] = 0x13; - a[2] = 8; - a += 3; - a = ConvertIntToDecimalStringN(a, b, STR_CONV_MODE_LEADING_ZEROS, 2); - a[0] = EXT_CTRL_CODE_BEGIN; - a[1] = 0x13; - a[2] = 0x18; - a += 3; - a = sub_8072C74(a, c, 0x78 - (e + 1) * 6, 0); - *a++ = CHAR_MULT_SIGN; - sub_8072C14(a, d, 0x78, 1); -} - -static u8 *sub_80A425C(u8 taskId, u8 *text, u8 c) -{ - if (gTasks[taskId].data[10] - gBagPocketScrollStates[sCurrentBagPocket].scrollTop - 1 == c) - { - text[0] = EXT_CTRL_CODE_BEGIN; - text[1] = 1; - text[2] = 2; - text += 3; - } - return text; -} - -static bool8 sub_80A42B0(u8 itemPos, int b) -{ - u8 r5; - u16 *ptr; - struct UnknownStruct3 *r8 = &gUnknown_02038540; - - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + itemPos > gBagPocketScrollStates[sCurrentBagPocket].numSlots) - return TRUE; - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + itemPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) - { - if (sReturnLocation == RETURN_TO_FIELD_5) - return TRUE; - r5 = itemPos * 2 + 2; - sub_8072C74(gStringVar1, gOtherText_CloseBag, 0x78, 0); - MenuPrint(gStringVar1, 14, r5); - ptr = gBGTilemapBuffers[2] + 14 + r5 * 32; - ptr[0] = 0x4F; - ptr[1] = 0x4F; - ptr[32] = 0x4F; - ptr[33] = 0x4F; - if (itemPos == 7) - return TRUE; - if ((b == 1 && r8->unk2 != 0) || b == 2) - MenuFillWindowRectWithBlankTile(14, r5 + 2, 29, 13); - else - MenuFillWindowRectWithBlankTile(14, r5 + 2, 29, 17); - return TRUE; - } - return FALSE; -} - -static void sub_80A4380(u16 a, int b, int c, int d) -{ - u8 i; - - for (i = b; i <= c; i++) - { - u8 r4; - u8 r5; - u8 *text; - - if (sub_80A42B0(i, d) == TRUE) - break; - r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; - r5 = i * 2 + 2; - text = gStringVar1; - text = sub_80A425C(a, text, i); - 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); - } -} - -static void sub_80A444C(u16 a, int b, int c, int d) -{ - u8 i; - - for (i = b; i <= c; i++) - { - u8 r4; - u8 r5; - u8 *text; - - if (sub_80A42B0(i, d) == TRUE) - break; - r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; - r5 = i * 2 + 2; - text = gStringVar1; - text = sub_80A425C(a, text, i); -#if ENGLISH - sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x60, 0); -#else - sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x63, 0); -#endif - MenuPrint(gStringVar1, 14, r5); - if (gUnknown_02038558 != 0) - { - if (gCurrentBagPocketItemSlots[r4].itemId == gSaveBlock1.registeredItem) - DrawSelectIcon(i); - } - else - { - if (gCurrentBagPocketItemSlots[r4].itemId == gSaveBlock1.registeredItem) - MoveSelectIcon(i); - else - EraseSelectIcon(i); - } - } -} - -// more gBGTilemapBuffers shenanigans -#ifdef NONMATCHING -static void sub_80A4548(u16 a, int b, int c, int d) -{ - u8 i; - - for (i = b; i <= c; i++) - { - u8 r4; - u8 sp10; - u32 r5; - u8 *text; - - if (sub_80A42B0(i, d) == TRUE) - break; - r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; - sp10 = i * 2 + 2; - r5 = sp10 * 32 + 14; - text = gStringVar1; - text = sub_80A425C(a, text, i); - if (gCurrentBagPocketItemSlots[r4].itemId < 0x153) - { - const u8 *r2; - - gBGTilemapBuffers[2][r5 + 0] = 0x59; - gBGTilemapBuffers[2][r5 + 1] = 0x4F; - gBGTilemapBuffers[2][r5 + 32] = 0x69; - gBGTilemapBuffers[2][r5 + 33] = 0x4F; - r2 = gMoveNames[ItemIdToBattleMoveId(gCurrentBagPocketItemSlots[r4].itemId)]; - sub_80A41E0(text, gCurrentBagPocketItemSlots[r4].itemId - 288, r2, gCurrentBagPocketItemSlots[r4].quantity, 2); - } - else - { - const u8 *moveName; - - gBGTilemapBuffers[2][r5 + 0] = 0x105D; - gBGTilemapBuffers[2][r5 + 1] = 0x105E; - gBGTilemapBuffers[2][r5 + 32] = 0x106D; - gBGTilemapBuffers[2][r5 + 33] = 0x106E; - text[0] = EXT_CTRL_CODE_BEGIN; - text[1] = 0x13; - text[2] = 0x11; - text += 3; - text = ConvertIntToDecimalString(text, gCurrentBagPocketItemSlots[r4].itemId); - text[0] = EXT_CTRL_CODE_BEGIN; - text[1] = 0x13; - text[2] = 0x18; - text += 3; - moveName = gMoveNames[ItemIdToBattleMoveId(gCurrentBagPocketItemSlots[r4].itemId)]; - sub_8072C74(text, moveName, 0x78, 0); - } - MenuPrint(gStringVar1, 14, sp10); - } -} -#else -__attribute__((naked)) -static void sub_80A4548(u16 a, int b, int c, int d) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - str r2, [sp, 0x8]\n\ - str r3, [sp, 0xC]\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x4]\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r8, r1\n\ - ldr r0, _080A456C @ =gBGTilemapBuffers + 0x1000\n\ - mov r9, r0\n\ - b _080A46C2\n\ - .align 2, 0\n\ -_080A456C: .4byte gBGTilemapBuffers + 0x1000\n\ -_080A4570:\n\ - ldr r1, _080A461C @ =gBagPocketScrollStates\n\ - ldr r0, _080A4620 @ =sCurrentBagPocket\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r4, [r0, 0x1]\n\ - add r4, r8\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - mov r1, r8\n\ - lsls r0, r1, 25\n\ - movs r3, 0x80\n\ - lsls r3, 18\n\ - adds r0, r3\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x10]\n\ - lsls r0, 5\n\ - adds r0, 0xE\n\ - adds r5, r0, 0\n\ - ldr r6, _080A4624 @ =gStringVar1\n\ - ldr r1, [sp, 0x4]\n\ - lsls r0, r1, 24\n\ - lsrs r0, 24\n\ - adds r1, r6, 0\n\ - mov r2, r8\n\ - bl sub_80A425C\n\ - adds r6, r0, 0\n\ - ldr r3, _080A4628 @ =gCurrentBagPocketItemSlots\n\ - mov r10, r3\n\ - ldr r0, [r3]\n\ - lsls r7, r4, 2\n\ - adds r3, r7, r0\n\ - ldrh r1, [r3]\n\ - movs r0, 0xA9\n\ - lsls r0, 1\n\ - cmp r1, r0\n\ - bhi _080A4634\n\ - lsls r0, r5, 1\n\ - add r0, r9\n\ - movs r1, 0x59\n\ - strh r1, [r0]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 1\n\ - add r0, r9\n\ - movs r2, 0x4F\n\ - strh r2, [r0]\n\ - adds r0, r5, 0\n\ - adds r0, 0x20\n\ - lsls r0, 1\n\ - add r0, r9\n\ - movs r1, 0x69\n\ - strh r1, [r0]\n\ - adds r0, r5, 0\n\ - adds r0, 0x21\n\ - lsls r0, 1\n\ - add r0, r9\n\ - strh r2, [r0]\n\ - ldrh r0, [r3]\n\ - bl ItemIdToBattleMoveId\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0xD\n\ - adds r2, r0, 0\n\ - muls r2, r1\n\ - ldr r0, _080A462C @ =gMoveNames\n\ - adds r2, r0\n\ - mov r1, r10\n\ - ldr r0, [r1]\n\ - adds r0, r7, r0\n\ - ldr r3, _080A4630 @ =0xfffffee0\n\ - adds r1, r3, 0\n\ - ldrh r3, [r0]\n\ - adds r1, r3\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - ldrh r3, [r0, 0x2]\n\ - movs r0, 0x2\n\ - str r0, [sp]\n\ - adds r0, r6, 0\n\ - bl sub_80A41E0\n\ - b _080A46AE\n\ - .align 2, 0\n\ -_080A461C: .4byte gBagPocketScrollStates\n\ -_080A4620: .4byte sCurrentBagPocket\n\ -_080A4624: .4byte gStringVar1\n\ -_080A4628: .4byte gCurrentBagPocketItemSlots\n\ -_080A462C: .4byte gMoveNames\n\ -_080A4630: .4byte 0xfffffee0\n\ -_080A4634:\n\ - lsls r0, r5, 1\n\ - add r0, r9\n\ - ldr r1, _080A46EC @ =0x0000105d\n\ - strh r1, [r0]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 1\n\ - add r0, r9\n\ - adds r1, 0x1\n\ - strh r1, [r0]\n\ - adds r0, r5, 0\n\ - adds r0, 0x20\n\ - lsls r0, 1\n\ - add r0, r9\n\ - adds r1, 0xF\n\ - strh r1, [r0]\n\ - adds r0, r5, 0\n\ - adds r0, 0x21\n\ - lsls r0, 1\n\ - add r0, r9\n\ - adds r1, 0x1\n\ - strh r1, [r0]\n\ - movs r0, 0xFC\n\ - strb r0, [r6]\n\ - movs r4, 0x13\n\ - strb r4, [r6, 0x1]\n\ - movs r0, 0x11\n\ - strb r0, [r6, 0x2]\n\ - adds r6, 0x3\n\ - mov r1, r10\n\ - ldr r0, [r1]\n\ - adds r0, r7, r0\n\ - ldrh r1, [r0]\n\ - ldr r3, _080A46F0 @ =0xfffffeae\n\ - adds r1, r3\n\ - adds r0, r6, 0\n\ - bl ConvertIntToDecimalString\n\ - adds r6, r0, 0\n\ - movs r0, 0xFC\n\ - strb r0, [r6]\n\ - strb r4, [r6, 0x1]\n\ - movs r0, 0x18\n\ - strb r0, [r6, 0x2]\n\ - adds r6, 0x3\n\ - mov r1, r10\n\ - ldr r0, [r1]\n\ - adds r0, r7, r0\n\ - ldrh r0, [r0]\n\ - bl ItemIdToBattleMoveId\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0xD\n\ - muls r1, r0\n\ - ldr r0, _080A46F4 @ =gMoveNames\n\ - adds r1, r0\n\ - adds r0, r6, 0\n\ - movs r2, 0x78\n\ - movs r3, 0\n\ - bl sub_8072C74\n\ -_080A46AE:\n\ - ldr r0, _080A46F8 @ =gStringVar1\n\ - movs r1, 0xE\n\ - ldr r2, [sp, 0x10]\n\ - bl MenuPrint\n\ - mov r0, r8\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ -_080A46C2:\n\ - ldr r3, [sp, 0x8]\n\ - cmp r8, r3\n\ - bgt _080A46DA\n\ - mov r0, r8\n\ - ldr r1, [sp, 0xC]\n\ - bl sub_80A42B0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - beq _080A46DA\n\ - b _080A4570\n\ -_080A46DA:\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080A46EC: .4byte 0x0000105d\n\ -_080A46F0: .4byte 0xfffffeae\n\ -_080A46F4: .4byte gMoveNames\n\ -_080A46F8: .4byte gStringVar1\n\ - .syntax divided\n"); -} -#endif - -static void sub_80A46FC(u16 a, int b, int c, int d) -{ - u8 i; - - for (i = b; i <= c; i++) - { - u8 r4; - u8 r5; - u8 *text; - register int var asm("r0"); - - if (sub_80A42B0(i, d) == TRUE) - break; - r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; - r5 = i * 2 + 2; - - var = 14 + r5 * 32; - gBGTilemapBuffers[2][var] = 0x59; - var += 32; - gBGTilemapBuffers[2][var] = 0x69; - - text = gStringVar1; - 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); - } -} - -static void sub_80A47E8(u16 a, int b, int c, int d) -{ - switch (sCurrentBagPocket) - { - case BAG_POCKET_ITEMS: - case BAG_POCKET_POKE_BALLS: - sub_80A4380(a, b, c, d); - break; - case BAG_POCKET_KEY_ITEMS: - sub_80A444C(a, b, c, d); - break; - case BAG_POCKET_TMs_HMs: - sub_80A4548(a, b, c, d); - break; - case BAG_POCKET_BERRIES: - sub_80A46FC(a, b, c, d); - break; - } - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) - sub_80F979C(0, 0); - else - sub_80F979C(0, 1); - 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); - else - sub_80F979C(1, 1); -} - -static void sub_80A48E8(u16 taskId, int b, int c) -{ - sub_80A47E8(taskId, b, c, 0); -} - -static void sub_80A48F8(u16 taskId) -{ - sub_80A47E8(taskId, 0, 5, 2); -} - -static void ItemListMenu_InitDescription(s16 itemId) -{ - u8 r5; - - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) - { - r5 = sub_8072A18(gOtherText_ReturnTo, 4, 0x68, 0x68, 1); - r5 += sub_8072A18(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0x68, 1); - } - else - { - r5 = sub_8072A18(ItemId_GetDescription(itemId), 4, 0x68, 0x68, 1); - } - - if (r5 < 3) - MenuZeroFillWindowRect(0, 13 + r5 * 2, 13, 20); -} - -static void ItemListMenu_ChangeDescription(s16 itemId, int b) -{ - u8 description[100]; - - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) - { - if (b == 0) - { - MenuZeroFillWindowRect(0, 13, 13, 20); - MenuPrint_PixelCoords(gOtherText_ReturnTo, 4, 0x68, 0); - } - else if (b == 1) - { - MenuPrint_PixelCoords(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0); - } - } - else - { - if (b == 0) - MenuZeroFillWindowRect(0, 13, 13, 20); - if (ItemId_CopyDescription(description, itemId, b)) - MenuPrint_PixelCoords(description, 4, 104 + b * 16, 0); - } -} - -static bool32 CopyTextLine(u8 *destination, const u8 *source, u32 c) -{ - u32 r4 = c + 1; - const u8 *src = source; - u8 *dst = destination; - - while (1) - { - if (*src == CHAR_NEWLINE || *src == EOS) - { - r4--; - if (r4 == 0) - { - *dst = EOS; - return TRUE; - } - if (*src == EOS) - return FALSE; - // got a new line - reset dst pointer - dst = destination; - src++; - } - else - { - *dst++ = *src++; - } - } -} - -static void sub_80A4A98(const u8 *text, u32 line) -{ - u8 buffer[100]; - - if (line == 0) - MenuZeroFillWindowRect(0, 13, 13, 20); - if (CopyTextLine(buffer, text, line)) - MenuPrint_PixelCoords(buffer, 4, 104 + line * 16, 0); -} - -static void sub_80A4ADC(u8 taskId) -{ - if (gTasks[taskId].data[10] == 0) - sub_80A7528(0); - PlaySE(SE_SELECT); - gUnknown_0203855C = 1; -} - -static void sub_80A4B14(s8 a, u8 b) -{ - gBagPocketScrollStates[sCurrentBagPocket].scrollTop += a; - MoveMenuCursor(0); - sub_80A73C0(); - sub_80A763C(); - sub_80A4ADC(b); -} - -static void sub_80A4B58(s8 delta, u8 b) -{ - gBagPocketScrollStates[sCurrentBagPocket].cursorPos = MoveMenuCursor(delta); - sub_80A73C0(); - sub_80A4ADC(b); -} - -static const u8 *sub_80A4B90(u16 itemId) -{ - if (TestPlayerAvatarFlags(6)) - { - if (itemId == ITEM_MACH_BIKE || itemId == ITEM_ACRO_BIKE) - return gOtherText_Walk; - } - if (ItemIsMail(itemId) == TRUE) - return gOtherText_Check; - return sItemPopupMenuActions[sPopupMenuActionList[0]].text; -} - -static void sub_80A4BF0(u16 *a) -{ - u8 i; - - if (gUnknown_02038564 == 4) - { - MenuDrawTextWindow(0, 7, 13, 12); - sub_80A4008(a, 1, 8, 12, 4); - if (sub_80F9344() == TRUE && sReturnLocation == RETURN_TO_FIELD_5) - { - sub_80A7834(1, 0); - } - else - { - for (i = 0; i < gUnknown_02038564; i++) - { - const u8 *text; - - if (i == 0) - text = sub_80A4B90(gScriptItemId); - else - text = sItemPopupMenuActions[sPopupMenuActionList[i]].text; - MenuPrint(text, 1 + (i / 2) * 6, 8 + (i % 2) * 2); - } - } - if (sReturnLocation == RETURN_TO_FIELD_5) - InitMenu(0, 1, 8, gUnknown_02038564, sPopupMenuSelection, 1); - else - InitMenu(0, 1, 8, gUnknown_02038564, 0, 1); - sub_8072DCC(0x2F); - } - else - { - MenuDrawTextWindow(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); - InitMenu(0, 1, 6, gUnknown_02038564, 0, 1); - sub_8072DCC(0x2F); - } - sub_80A7528(2); -} - -static void sub_80A4DA4(u16 *a) -{ - sub_80A73FC(); - sub_80A36B8(a, 0, 6, 13, 6); - MenuZeroFillWindowRect(0, 5, 13, 12); - sub_80A7590(); -} - -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); - sub_80A4008(gBGTilemapBuffers[1], b + 1, c + 1, d - 1, e - 1); - sub_80A418C(1, 1, b + 2, c + 1, 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); - ChangePocket(gBGTilemapBuffers[2], delta); - DrawPocketIndicatorDots(gBGTilemapBuffers[2], sCurrentBagPocket); - sub_80A3770(); - sub_80A7C64(); - CreateBagPokeballSprite(b); -} - -static bool8 sub_80A4F0C(void) -{ - if (sReturnLocation == RETURN_TO_FIELD_5 || sReturnLocation == RETURN_TO_FIELD_4) - return FALSE; - if (gMain.newKeys == DPAD_RIGHT || sub_80F9284() == 2) - { - sub_80A4E8C(1, 2); - return TRUE; - } - if (gMain.newKeys == DPAD_LEFT || sub_80F9284() == 1) - { - sub_80A4E8C(-1, 1); - return TRUE; - } - return FALSE; -} - -static void sub_80A4F68(u8 taskId) -{ - sub_80A4F0C(); -} - -static bool8 sub_80A4F74(u8 a) -{ - bool8 retVal = FALSE; - - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) - { - if (gBagPocketScrollStates[sCurrentBagPocket].cursorPos != 0) - sub_80A4B58(-1, a); - else if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) - sub_80A4B14(-1, a); - if (gLinkOpen == TRUE && gMain.keyRepeatCounter == 5) - gMain.keyRepeatCounter = 11; - retVal = TRUE; - } - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) - { - if (sReturnLocation != RETURN_TO_FIELD_5) - { - if (gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].cursorMax) - { - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots) - sub_80A4B14(1, a); - } - else - { - sub_80A4B58(1, a); - } - } - else - { - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots - 1) - { - if (gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].cursorMax) - sub_80A4B58(1, a); - else - sub_80A4B14(1, a); - } - } - retVal = TRUE; - if (gLinkOpen == TRUE && gMain.keyRepeatCounter == 5) - gMain.keyRepeatCounter = 11; - } - else - { - if (gTasks[a].data[10] == 0 && sub_80A4F0C() == TRUE) - { - sub_80A73F0(); - gTasks[a].func = sub_80A4F68; - retVal = TRUE; - } - else - { - sub_80A73C0(); - } - } - return retVal; -} - -static void sub_80A50C8(u8 taskId) -{ - s16 *r5 = gTasks[taskId].data; - - if (!gPaletteFade.active) - { - if (sub_80A4F74(taskId) == TRUE) - { - sub_808B5B4(taskId); - return; - } - - if ((gMain.newKeys & SELECT_BUTTON) - && !(sCurrentBagPocket == BAG_POCKET_BERRIES || sCurrentBagPocket == BAG_POCKET_TMs_HMs) - && (sReturnLocation == RETURN_TO_FIELD_0 || sReturnLocation == RETURN_TO_BATTLE)) - { - if (r5[10] == 0) - { - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots) - { - PlaySE(SE_SELECT); - sub_80A3F50(taskId); - } - sub_808B5B4(taskId); - } - else - { - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots) - { - PlaySE(SE_SELECT); - sub_80A3E90(taskId); - } - else - { - sub_80A3EF4(taskId); - } - sub_808B5B4(taskId); - } - return; - } - - if (gMain.newKeys & A_BUTTON) - { - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) - { - if (r5[10] == 0) - { - gScriptItemId = 0; - gUnknown_083C16BC[sReturnLocation].onBagClose(taskId); - } - else - { - sub_80A3EF4(taskId); - } - sub_808B5B4(taskId); - } - else - { - if (r5[10] == 0) - { - PlaySE(SE_SELECT); - gUnknown_02038560 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - gScriptItemId = gCurrentBagPocketItemSlots[gUnknown_02038560].itemId; - gUnknown_083C16BC[sReturnLocation].onItemSelect(taskId); - sub_80F98A4(0); - sub_80F98A4(1); - sub_80F98A4(2); - sub_80F98A4(3); - sub_80A797C(); - } - else - { - sub_80A3E90(taskId); - } - sub_808B5B4(taskId); - } - return; - } - - if (gMain.newKeys & B_BUTTON) - { - if (r5[10] == 0) - { - if (sReturnLocation != RETURN_TO_FIELD_5) - { - gScriptItemId = 0; - gUnknown_083C16BC[sReturnLocation].onBagClose(taskId); - } - } - else - { - sub_80A3EF4(taskId); - } - sub_808B5B4(taskId); - return; - } - } -} - -bool8 sub_80A52C4(u8 taskId, u16 b) -{ - s16 *taskData = gTasks[taskId].data; - - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) - { - if (taskData[1] != b) - taskData[1]++; - else - taskData[1] = 1; - return TRUE; - } - - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) - { - if (taskData[1] != 1) - taskData[1]--; - else - taskData[1] = b; - return TRUE; - } - - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_RIGHT) - { - if (taskData[1] + 10 < b) - taskData[1] += 10; - else - taskData[1] = b; - return TRUE; - } - - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_LEFT) - { - if (taskData[1] > 10) - taskData[1] -= 10; - else - taskData[1] = 1; - return TRUE; - } - - return FALSE; -} - -static bool8 sub_80A5350(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - if (sub_80A52C4(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) - sub_80A418C(taskData[1], 1, taskData[2], taskData[3], 3); - else - sub_80A418C(taskData[1], 1, taskData[2], taskData[3], 2); - return TRUE; - } - return FALSE; -} - -static void sub_80A53CC(void) -{ - if (sub_80A34B4() == TRUE) - { - sub_80A3770(); - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); - } -} - -void sub_80A53F8(void) -{ - sReturnLocation = RETURN_TO_FIELD_0; - SetMainCallback2(sub_80A53CC); -} - -#ifdef NONMATCHING -static void sub_80A5414(u8 taskId) -{ - TaskFunc r5 = NULL; - - if (sub_80A78A0() != 0) - { - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x40) - { - if ((sPopupMenuSelection & 1) && sPopupMenuActionList[sPopupMenuSelection - 1] == 8) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor3(-1); - } - } - //_080A546C - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x80) - { - if (!(sPopupMenuSelection & 1) && sPopupMenuActionList[sPopupMenuSelection + 1] != 8) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor3(1); - } - } - //_080A549C - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x20) - { - if (sPopupMenuSelection > 1 && sPopupMenuActionList[sPopupMenuSelection - 2] != 8) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor3(-2); - } - } - //_080A54CC - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x10) - { - if (sPopupMenuSelection <= 1 && sPopupMenuActionList[sPopupMenuSelection + 2] != 8) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor3(2); - } - } - //_080A5500 - else if (!(gMain.newKeys & A_BUTTON)) - { - if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].data[10] = 0; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A4DA4(gBGTilemapBuffers[1]); - r5 = sItemPopupMenuActions[sPopupMenuActionList[3]].func; - r5(taskId); - } - } - else - { - //_080A5590 - gTasks[taskId].data[10] = 0; - sub_80A4DA4(gBGTilemapBuffers[1]); - r5 = sItemPopupMenuActions[sPopupMenuActionList[sPopupMenuSelection]].func; - r5(taskId); - } - } - //_080A5552 - if (r5 == NULL) - { - if (sReturnLocation == RETURN_TO_FIELD_5) - { - if (sPopupMenuSelection == 0) - { - sub_8072DDC(12); - return; - } - //_080A55D4 - //else - //{ - if (sPopupMenuSelection == 0 || sPopupMenuSelection == 1) - sub_8072DCC(0x2F); - else - sub_8072DCC(0x30); - //} - } - //_080A55E0 - else - { - if (sPopupMenuSelection == 0 || sPopupMenuSelection == 1) - sub_8072DCC(0x2F); - else - sub_8072DCC(0x30); - } - } -} -#else -__attribute__((naked)) -static void sub_80A5414(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - movs r5, 0\n\ - bl sub_80A78A0\n\ - cmp r0, 0\n\ - bne _080A5426\n\ - b _080A5552\n\ -_080A5426:\n\ - ldr r2, _080A5460 @ =gMain\n\ - ldrh r0, [r2, 0x30]\n\ - movs r1, 0xF0\n\ - ands r1, r0\n\ - cmp r1, 0x40\n\ - bne _080A546C\n\ - ldr r4, _080A5464 @ =sPopupMenuSelection\n\ - ldrb r1, [r4]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080A5440\n\ - b _080A5552\n\ -_080A5440:\n\ - ldrb r1, [r4]\n\ - ldr r0, _080A5468 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - subs r1, 0x1\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x8\n\ - bne _080A5452\n\ - b _080A5552\n\ -_080A5452:\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - b _080A54EE\n\ - .align 2, 0\n\ -_080A5460: .4byte gMain\n\ -_080A5464: .4byte sPopupMenuSelection\n\ -_080A5468: .4byte sPopupMenuActionList\n\ -_080A546C:\n\ - cmp r1, 0x80\n\ - bne _080A549C\n\ - ldr r4, _080A5494 @ =sPopupMenuSelection\n\ - ldrb r1, [r4]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080A5552\n\ - ldrb r1, [r4]\n\ - ldr r0, _080A5498 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0x8\n\ - beq _080A5552\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - b _080A54EE\n\ - .align 2, 0\n\ -_080A5494: .4byte sPopupMenuSelection\n\ -_080A5498: .4byte sPopupMenuActionList\n\ -_080A549C:\n\ - cmp r1, 0x20\n\ - bne _080A54CC\n\ - ldr r4, _080A54C4 @ =sPopupMenuSelection\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x1\n\ - bls _080A5552\n\ - adds r1, r0, 0\n\ - ldr r0, _080A54C8 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - subs r1, 0x2\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x8\n\ - beq _080A5552\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x2\n\ - negs r0, r0\n\ - b _080A54EE\n\ - .align 2, 0\n\ -_080A54C4: .4byte sPopupMenuSelection\n\ -_080A54C8: .4byte sPopupMenuActionList\n\ -_080A54CC:\n\ - cmp r1, 0x10\n\ - bne _080A5500\n\ - ldr r4, _080A54F8 @ =sPopupMenuSelection\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x1\n\ - bhi _080A5552\n\ - adds r1, r0, 0\n\ - ldr r0, _080A54FC @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x2]\n\ - cmp r0, 0x8\n\ - beq _080A5552\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x2\n\ -_080A54EE:\n\ - bl MoveMenuCursor3\n\ - strb r0, [r4]\n\ - b _080A5552\n\ - .align 2, 0\n\ -_080A54F8: .4byte sPopupMenuSelection\n\ -_080A54FC: .4byte sPopupMenuActionList\n\ -_080A5500:\n\ - ldrh r1, [r2, 0x2E]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080A5590\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080A5552\n\ - ldr r1, _080A5570 @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - strh r5, [r0, 0x1C]\n\ - ldr r1, _080A5574 @ =gBagPocketScrollStates\n\ - ldr r0, _080A5578 @ =sCurrentBagPocket\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r2, [r0]\n\ - adds r0, r4, 0\n\ - adds r1, r2, 0\n\ - bl sub_80A48E8\n\ - ldr r0, _080A557C @ =gBGTilemapBuffers + 0x800\n\ - bl sub_80A4DA4\n\ - ldr r1, _080A5580 @ =sItemPopupMenuActions\n\ - ldr r0, _080A5584 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 3\n\ - adds r1, 0x4\n\ - adds r0, r1\n\ - ldr r5, [r0]\n\ - adds r0, r4, 0\n\ - bl _call_via_r5\n\ -_080A5552:\n\ - cmp r5, 0\n\ - bne _080A55FA\n\ - ldr r0, _080A5588 @ =sReturnLocation\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x5\n\ - bne _080A55E0\n\ - ldr r0, _080A558C @ =sPopupMenuSelection\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _080A55D4\n\ - movs r0, 0xC\n\ - bl sub_8072DDC\n\ - b _080A55FA\n\ - .align 2, 0\n\ -_080A5570: .4byte gTasks\n\ -_080A5574: .4byte gBagPocketScrollStates\n\ -_080A5578: .4byte sCurrentBagPocket\n\ -_080A557C: .4byte gBGTilemapBuffers + 0x800\n\ -_080A5580: .4byte sItemPopupMenuActions\n\ -_080A5584: .4byte sPopupMenuActionList\n\ -_080A5588: .4byte sReturnLocation\n\ -_080A558C: .4byte sPopupMenuSelection\n\ -_080A5590:\n\ - ldr r1, _080A55C0 @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - strh r5, [r0, 0x1C]\n\ - ldr r0, _080A55C4 @ =gBGTilemapBuffers + 0x800\n\ - bl sub_80A4DA4\n\ - ldr r1, _080A55C8 @ =sItemPopupMenuActions\n\ - ldr r0, _080A55CC @ =sPopupMenuSelection\n\ - ldrb r2, [r0]\n\ - ldr r0, _080A55D0 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 3\n\ - adds r1, 0x4\n\ - adds r0, r1\n\ - ldr r5, [r0]\n\ - adds r0, r4, 0\n\ - bl _call_via_r5\n\ - b _080A5552\n\ - .align 2, 0\n\ -_080A55C0: .4byte gTasks\n\ -_080A55C4: .4byte gBGTilemapBuffers + 0x800\n\ -_080A55C8: .4byte sItemPopupMenuActions\n\ -_080A55CC: .4byte sPopupMenuSelection\n\ -_080A55D0: .4byte sPopupMenuActionList\n\ -_080A55D4:\n\ - cmp r0, 0x1\n\ - bls _080A55E8\n\ - movs r0, 0x30\n\ - bl sub_8072DCC\n\ - b _080A55FA\n\ -_080A55E0:\n\ - ldr r0, _080A55F0 @ =sPopupMenuSelection\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - bhi _080A55F4\n\ -_080A55E8:\n\ - movs r0, 0x2F\n\ - bl sub_8072DCC\n\ - b _080A55FA\n\ - .align 2, 0\n\ -_080A55F0: .4byte sPopupMenuSelection\n\ -_080A55F4:\n\ - movs r0, 0x30\n\ - bl sub_8072DCC\n\ -_080A55FA:\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif - -__attribute__((naked)) -static void sub_80A5600(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - movs r5, 0\n\ - ldr r2, _080A563C @ =gMain\n\ - ldrh r0, [r2, 0x30]\n\ - movs r1, 0xF0\n\ - ands r1, r0\n\ - cmp r1, 0x40\n\ - bne _080A5648\n\ - ldr r4, _080A5640 @ =sPopupMenuSelection\n\ - ldrb r0, [r4]\n\ - cmp r0, 0\n\ - bne _080A561E\n\ - b _080A5736\n\ -_080A561E:\n\ - adds r1, r0, 0\n\ - ldr r0, _080A5644 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - subs r1, 0x1\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x8\n\ - bne _080A5630\n\ - b _080A5736\n\ -_080A5630:\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - b _080A56D2\n\ - .align 2, 0\n\ -_080A563C: .4byte gMain\n\ -_080A5640: .4byte sPopupMenuSelection\n\ -_080A5644: .4byte sPopupMenuActionList\n\ -_080A5648:\n\ - cmp r1, 0x80\n\ - bne _080A5680\n\ - ldr r4, _080A5674 @ =sPopupMenuSelection\n\ - ldrb r1, [r4]\n\ - ldr r0, _080A5678 @ =gUnknown_02038564\n\ - ldrb r0, [r0]\n\ - subs r0, 0x1\n\ - cmp r1, r0\n\ - beq _080A5736\n\ - cmp r1, 0x2\n\ - beq _080A5736\n\ - ldr r0, _080A567C @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r0, r1, r0\n\ - ldrb r0, [r0, 0x1]\n\ - cmp r0, 0x8\n\ - beq _080A5736\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - b _080A56D2\n\ - .align 2, 0\n\ -_080A5674: .4byte sPopupMenuSelection\n\ -_080A5678: .4byte gUnknown_02038564\n\ -_080A567C: .4byte sPopupMenuActionList\n\ -_080A5680:\n\ - cmp r1, 0x20\n\ - bne _080A56B0\n\ - ldr r4, _080A56A8 @ =sPopupMenuSelection\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x2\n\ - bls _080A5736\n\ - adds r1, r0, 0\n\ - ldr r0, _080A56AC @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - subs r1, 0x3\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x8\n\ - beq _080A5736\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x3\n\ - negs r0, r0\n\ - b _080A56D2\n\ - .align 2, 0\n\ -_080A56A8: .4byte sPopupMenuSelection\n\ -_080A56AC: .4byte sPopupMenuActionList\n\ -_080A56B0:\n\ - cmp r1, 0x10\n\ - bne _080A56E4\n\ - ldr r4, _080A56DC @ =sPopupMenuSelection\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x2\n\ - bhi _080A5736\n\ - adds r1, r0, 0\n\ - ldr r0, _080A56E0 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x3]\n\ - cmp r0, 0x8\n\ - beq _080A5736\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x3\n\ -_080A56D2:\n\ - bl MoveMenuCursor3\n\ - strb r0, [r4]\n\ - b _080A5736\n\ - .align 2, 0\n\ -_080A56DC: .4byte sPopupMenuSelection\n\ -_080A56E0: .4byte sPopupMenuActionList\n\ -_080A56E4:\n\ - ldrh r1, [r2, 0x2E]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080A5768\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080A5736\n\ - ldr r1, _080A574C @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - strh r5, [r0, 0x1C]\n\ - ldr r1, _080A5750 @ =gBagPocketScrollStates\n\ - ldr r0, _080A5754 @ =sCurrentBagPocket\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r2, [r0]\n\ - adds r0, r4, 0\n\ - adds r1, r2, 0\n\ - bl sub_80A48E8\n\ - ldr r0, _080A5758 @ =gBGTilemapBuffers + 0x800\n\ - bl sub_80A4DA4\n\ - ldr r1, _080A575C @ =sItemPopupMenuActions\n\ - ldr r0, _080A5760 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x5]\n\ - lsls r0, 3\n\ - adds r1, 0x4\n\ - adds r0, r1\n\ - ldr r5, [r0]\n\ - adds r0, r4, 0\n\ - bl _call_via_r5\n\ -_080A5736:\n\ - cmp r5, 0\n\ - bne _080A57BE\n\ - ldr r0, _080A5764 @ =sPopupMenuSelection\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _080A57AC\n\ - movs r0, 0xC\n\ - bl sub_8072DDC\n\ - b _080A57BE\n\ - .align 2, 0\n\ -_080A574C: .4byte gTasks\n\ -_080A5750: .4byte gBagPocketScrollStates\n\ -_080A5754: .4byte sCurrentBagPocket\n\ -_080A5758: .4byte gBGTilemapBuffers + 0x800\n\ -_080A575C: .4byte sItemPopupMenuActions\n\ -_080A5760: .4byte sPopupMenuActionList\n\ -_080A5764: .4byte sPopupMenuSelection\n\ -_080A5768:\n\ - ldr r1, _080A5798 @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - strh r5, [r0, 0x1C]\n\ - ldr r0, _080A579C @ =gBGTilemapBuffers + 0x800\n\ - bl sub_80A4DA4\n\ - ldr r1, _080A57A0 @ =sItemPopupMenuActions\n\ - ldr r0, _080A57A4 @ =sPopupMenuSelection\n\ - ldrb r2, [r0]\n\ - ldr r0, _080A57A8 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 3\n\ - adds r1, 0x4\n\ - adds r0, r1\n\ - ldr r5, [r0]\n\ - adds r0, r4, 0\n\ - bl _call_via_r5\n\ - b _080A5736\n\ - .align 2, 0\n\ -_080A5798: .4byte gTasks\n\ -_080A579C: .4byte gBGTilemapBuffers + 0x800\n\ -_080A57A0: .4byte sItemPopupMenuActions\n\ -_080A57A4: .4byte sPopupMenuSelection\n\ -_080A57A8: .4byte sPopupMenuActionList\n\ -_080A57AC:\n\ - cmp r0, 0x2\n\ - bhi _080A57B8\n\ - movs r0, 0x2F\n\ - bl sub_8072DCC\n\ - b _080A57BE\n\ -_080A57B8:\n\ - movs r0, 0x30\n\ - bl sub_8072DCC\n\ -_080A57BE:\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} - -static void sub_80A57C4(void) -{ - u8 r5; - - sPopupMenuActionList = gUnknown_083C16AE[sCurrentBagPocket]; - if (sCurrentBagPocket == BAG_POCKET_KEY_ITEMS) - { - gUnknown_02038564 = 1; - r5 = 9; - } - else if (sub_80F92F4(gScriptItemId) == 0) - { - sPopupMenuActionList = gUnknown_083C16AE[4]; - gUnknown_02038564 = 1; - r5 = 9; - } - else - { - gUnknown_02038564 = 2; - r5 = 7; - } - sub_80A4008(gBGTilemapBuffers[1], 7, r5 + 1, 6, gUnknown_02038564 * 2); - MenuDrawTextWindow(6, r5, 13, gUnknown_02038564 * 2 + 1 + r5); - sub_80A7834(0, r5); - InitMenu(0, 7, r5 + 1, gUnknown_02038564, 0, 6); -} - -static void sub_80A5888(u8 taskId) -{ - if (sub_80A78A0() != 0) - { - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (sPopupMenuSelection != 0) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor(-1); - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (sPopupMenuSelection != gUnknown_02038564 - 1) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor(1); - } - } - else if (gMain.newKeys & A_BUTTON) - { - gTasks[taskId].data[10] = 0; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A4DA4(gBGTilemapBuffers[1]); - sItemPopupMenuActions[sPopupMenuActionList[sPopupMenuSelection]].func(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].data[10] = 0; - sub_80A4DA4(gBGTilemapBuffers[1]); - sItemPopupMenuActions[2].func(taskId); - } - } -} - -static void OnBagClose_Field0(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_805469C >> 16; - gTasks[taskId].data[9] = (u32)sub_805469C; - gLastFieldPokeMenuOpened = 0; - sub_80A5AE4(taskId); -} - -static void OnItemSelect_Field05(u8 taskId) -{ - sPopupMenuSelection = 0; - if (sReturnLocation == RETURN_TO_FIELD_5) - sPopupMenuSelection = 1; - gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A73FC(); - if (sub_80F9344() == TRUE && sReturnLocation != RETURN_TO_FIELD_5) - { - sub_80A57C4(); - gTasks[taskId].func = sub_80A5888; - } - else - { - sub_80A4BF0(gBGTilemapBuffers[1]); - if (sCurrentBagPocket != BAG_POCKET_BERRIES || sReturnLocation == RETURN_TO_FIELD_5) - gTasks[taskId].func = sub_80A5414; - else - gTasks[taskId].func = sub_80A5600; - } -} - -static void sub_80A5AAC(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = HandleItemMenuPaletteFade; -} - -static void sub_80A5AE4(u8 taskId) -{ - PlaySE(SE_SELECT); - sub_80A5AAC(taskId); -} - -void HandleItemMenuPaletteFade(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - if (!gPaletteFade.active) - { - MainCallback cb = (MainCallback)((u16)taskData[8] << 16 | (u16)taskData[9]); - - SetMainCallback2(cb); - gpu_pal_allocator_reset__manage_upper_four(); - DestroyTask(taskId); - } -} - -void sub_80A5B40(void) -{ - while (1) - { - if (SetupBagMultistep() == TRUE) - { - ResetTasks(); - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -static void HandlePopupMenuAction_UseOnField(u8 taskId) -{ - if (ItemId_GetFieldFunc(gScriptItemId) != NULL) - { - PlaySE(SE_SELECT); - if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gScriptItemId) == 1) - { - sub_80A5BF8(taskId); - } - else - { - gTasks[taskId].data[2] = 0; - if (sCurrentBagPocket != BAG_POCKET_BERRIES) - ItemId_GetFieldFunc(gScriptItemId)(taskId); - else - sub_80C9C7C(taskId); - } - } -} - -static void sub_80A5BF8(u8 taskId) -{ - sub_80A73FC(); - sub_80A7590(); - DisplayCannotUseItemMessage(taskId, gOtherText_NoPokemon, CleanUpItemMenuMessage, 1); -} - -static void sub_80A5C24(u8 taskId) -{ - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -void CleanUpItemMenuMessage(u8 taskId) -{ - sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - MenuZeroFillWindowRect(7, 7, 13, 12); - MenuZeroFillWindowRect(0, 14, 29, 19); - gTasks[taskId].func = sub_80A5C24; -} - -void CleanUpOverworldMessage(u8 taskId) -{ - MenuZeroFillWindowRect(0, 13, 29, 19); - DestroyTask(taskId); - sub_8064E2C(); - ScriptContext2_Disable(); -} - -void ExecuteItemUseFromBlackPalette(void) -{ - pal_fill_black(); - CreateTask(Task_CallItemUseOnFieldCallback, 8); -} - -static void Task_CallItemUseOnFieldCallback(u8 taskId) -{ - if (sub_807D770() == TRUE) - gUnknown_03005D00(taskId); -} - -void sub_80A5D04(void) -{ - while (1) - { - if (SetupBagMultistep() == TRUE) - { - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -static void sub_80A5D38(u8 taskId) -{ - gTasks[taskId].data[1] = 0; - sub_80A4DA4(gBGTilemapBuffers[1]); - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void sub_80A5D78(void) -{ - sub_80A4008(gBGTilemapBuffers[1], 8, 8, 5, 4); - DisplayYesNoMenu(7, 7, 1); -} - -static void sub_80A5DA0(u16 itemId, u16 quantity) -{ - CopyItemName(itemId, gStringVar1); - if (quantity >= 100) - ConvertIntToDecimalStringN(gStringVar2, quantity, STR_CONV_MODE_LEFT_ALIGN, 3); - else - ConvertIntToDecimalStringN(gStringVar2, quantity, STR_CONV_MODE_LEFT_ALIGN, 2); - sub_80A4DA4(gBGTilemapBuffers[1]); - sub_80A7528(5); - sub_80A5D78(); -} - -static void sub_80A5DF8(void) -{ - sub_80A4DA4(gBGTilemapBuffers[1]); - MenuZeroFillWindowRect(7, 6, 11, 13); - sub_80A7528(4); -} - -static void sub_80A5E1C(u8 taskId) -{ - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - gTasks[taskId].data[10] = 0; - sub_80A41D4(taskId); - sub_80A5D38(taskId); - } -} - -static void sub_80A5E60(u8 taskId) -{ - sub_80A5DF8(); - sub_80A3D5C(taskId); - gTasks[taskId].func = sub_80A5E1C; -} - -static void sub_80A5E90(u8 taskId) -{ - sub_80A5D38(taskId); -} - -static void sub_80A5EA0(u8 taskId) -{ - if (sub_80A5350(taskId) == TRUE) - return; - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_80A5DA0(gScriptItemId, gTasks[taskId].data[1]); - DoYesNoFuncWithChoice(taskId, &gUnknown_083C16F4); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_80A5D38(taskId); - } -} - -static void HandlePopupMenuAction_Toss(u8 taskId) -{ - PlaySE(SE_SELECT); - gTasks[taskId].func = sub_80A5EA0; - sub_80A7528(3); - // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way - if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) - sub_80A4DD8(taskId, 6, 9, 7, 3, 3); - else - sub_80A4DD8(taskId, 7, 9, 6, 3, 2); -} - -static void sub_80A5F80(u8 taskId) -{ - PlaySE(SE_SELECT); - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void HandlePopupMenuAction_Register(u8 taskId) -{ - PlaySE(SE_SELECT); - if (gSaveBlock1.registeredItem == gScriptItemId) - { - // Un-register the registered item - RemoveSelectIconFromRegisteredItem(); - gSaveBlock1.registeredItem = 0; - } - else - { - AddSelectIconToRegisteredItem(); - gSaveBlock1.registeredItem = gScriptItemId; - } - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void sub_80A6000(u8 taskId) -{ - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void sub_80A6024(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON) - { - sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - MenuZeroFillWindowRect(0, 14, 29, 19); - gTasks[taskId].func = sub_80A6000; - } -} - -static void DisplayCannotBeHeldMessage(u8 taskId) -{ - sub_80A73FC(); - CopyItemName(gScriptItemId, gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_CantBeHeld); - sub_80A7590(); - DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6024, 1); -} - -static void HandlePopupMenuAction_Give(u8 taskId) -{ - PlaySE(SE_SELECT); - if (sub_80F931C(gScriptItemId) == 0) - { - sub_80A73FC(); - sub_80A7590(); - DisplayCannotUseItemMessage(taskId, gOtherText_CantWriteMail, sub_80A6024, 1); - } - else if (ItemId_GetImportance(gScriptItemId) == 0) - { - if (CalculatePlayerPartyCount() == 0) - { - sub_80A5BF8(taskId); - } - else - { - gTasks[taskId].data[8] = (u32)sub_808B020 >> 16; - gTasks[taskId].data[9] = (u32)sub_808B020; - gTasks[taskId].func = HandleItemMenuPaletteFade; - gUnknown_02038561 = 1; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - } - } - else - { - DisplayCannotBeHeldMessage(taskId); - } -} - -static void HandlePopupMenuAction_CheckTag(u8 taskId) -{ - sub_80A5AE4(taskId); - gTasks[taskId].data[8] = (u32)BerryTagScreen_814625C >> 16; - gTasks[taskId].data[9] = (u32)BerryTagScreen_814625C; -} - -static void sub_80A61A8(void) -{ - if (sub_80A34B4() == TRUE) - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); -} - -void sub_80A61D0(void) -{ - sReturnLocation = RETURN_TO_PKMN_LIST; - SetMainCallback2(sub_80A61A8); -} - -static void OnBagClose_PkmnList(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_808A3F8 >> 16; - gTasks[taskId].data[9] = (u32)sub_808A3F8; - sub_80A5AE4(taskId); -} - -static void OnItemSelect_PkmnList(u8 taskId) -{ - u8 r6 = sCurrentBagPocket + 1; - - if (sub_80F931C(gScriptItemId) == 0) - { - sub_80A73FC(); - sub_80A7590(); - DisplayCannotUseItemMessage(taskId, gOtherText_CantWriteMail, sub_80A6024, 1); - } - else if (sub_80F92F4(gScriptItemId) == 0) - { - sub_80A73FC(); - CopyItemName(gScriptItemId, gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_CantBeHeldHere); - sub_80A7590(); - DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6024, 1); - } - else if (r6 != 5 && ItemId_GetImportance(gScriptItemId) == 0) - { - gTasks[taskId].data[8] = (u32)sub_808A3F8 >> 16; - gTasks[taskId].data[9] = (u32)sub_808A3F8; - sub_80A5AAC(taskId); - } - else - { - DisplayCannotBeHeldMessage(taskId); - } -} - -static void sub_80A62D8(void) -{ - if (sub_80A34B4() == TRUE) - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); -} - -void sub_80A6300(void) -{ - sReturnLocation = RETURN_TO_SHOP; - SetMainCallback2(sub_80A62D8); -} - -static void OnBagClose_Shop(u8 taskId) -{ - gFieldCallback = sub_80B3050; - 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); -} - -static void OnItemSelect_Shop(u8 taskId) -{ - sub_80A7590(); - gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A73FC(); - CopyItemName(gScriptItemId, gStringVar2); - if (ItemId_GetPrice(gScriptItemId) == 0) - { - StringExpandPlaceholders(gStringVar4, gOtherText_CantBuyThat); - DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6444, 1); - } - else - { - StringExpandPlaceholders(gStringVar4, gOtherText_HowManyToSell); - DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A648C, 1); - } -} - -static void sub_80A640C(u8 taskId) -{ - gTasks[taskId].data[10] = 0; - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void sub_80A6444(u8 taskId) -{ - sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - MenuZeroFillWindowRect(0, 14, 29, 19); - gTasks[taskId].func = sub_80A640C; -} - -static void sub_80A648C(u8 taskId) -{ - gTasks[taskId].func = Task_BuyHowManyDialogueHandleInput; - sub_80A4008(gBGTilemapBuffers[1], 1, 11, 12, 2); - MenuDrawTextWindow(0, 10, 13, 13); - gTasks[taskId].data[1] = 1; - gTasks[taskId].data[2] = 1; - gTasks[taskId].data[3] = 11; - // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way - if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) - sub_80A418C(1, 1, 1, 11, 3); - else - sub_80A418C(1, 1, 1, 11, 2); - BuyMenuDisplayMessage(gScriptItemId, 1); - sub_80A683C(); -} - -static void sub_80A6520(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - BuyMenuPrintItemQuantityAndPrice(taskId); - } -} - -static void sub_80A6548(u8 taskId) -{ - sub_80A48F8(taskId); - gTasks[taskId].func = sub_80A6520; -} - -static void sub_80A6574(u8 taskId) -{ - PlaySE(SE_REGI); - sub_80A6870(gScriptItemId, gTasks[taskId].data[1]); - gTasks[taskId].func = sub_80A6548; -} - -static void sub_80A65AC(u8 taskId) -{ - MenuZeroFillWindowRect(7, 6, 13, 12); - sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6); - CopyItemName(gScriptItemId, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_SoldItem); - DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6574, 1); - sub_80A3D5C(taskId); -} - -static void sub_80A6618(u8 taskId) -{ - MenuZeroFillWindowRect(7, 6, 13, 12); - sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6); - BuyMenuPrintItemQuantityAndPrice(taskId); -} - -static void sub_80A6650(u8 taskId) -{ - sub_80A5D78(); - DoYesNoFuncWithChoice(taskId, &gUnknown_083C16FC); -} - -static void Task_BuyHowManyDialogueHandleInput(u8 taskId) -{ - if (sub_80A5350(taskId) == TRUE) - { - MenuZeroFillWindowRect(6, 11, 12, 11); - BuyMenuDisplayMessage(gScriptItemId, gTasks[taskId].data[1]); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(0, 10, 13, 13); - sub_80A36B8(gBGTilemapBuffers[1], 0, 10, 13, 3); - ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(gScriptItemId) / 2 * gTasks[taskId].data[1], STR_CONV_MODE_LEFT_ALIGN, 6); - StringExpandPlaceholders(gStringVar4, gOtherText_CanPay); - DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6650, 1); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - BuyMenuPrintItemQuantityAndPrice(taskId); - } -} - -static void sub_80A6760(u8 taskId) -{ - gTasks[taskId].data[10] = 0; - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void BuyMenuPrintItemQuantityAndPrice(u8 taskId) -{ - sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - RemoveMoneyLabelObject(0, 0); - MenuZeroFillWindowRect(0, 4, 13, 13); - MenuZeroFillWindowRect(0, 14, 29, 19); - gTasks[taskId].func = sub_80A6760; -} - -static void BuyMenuDisplayMessage(u16 itemId, u16 quantity) -{ - sub_80B7A94(ItemId_GetPrice(itemId) / 2 * quantity, 6, 6, 11); - ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(itemId) / 2 * quantity, STR_CONV_MODE_LEFT_ALIGN, 6); -} - -static void sub_80A683C(void) -{ - sub_80B7C14(gSaveBlock1.money, 0, 0); - sub_80A4008(gBGTilemapBuffers[1], 1, 1, 12, 2); -} - -static void sub_80A6870(u16 itemId, u8 quantity) -{ - sub_80B79B8(&gSaveBlock1.money, ItemId_GetPrice(itemId) / 2 * quantity); - sub_80B7BEC(gSaveBlock1.money, 0, 0); -} - -static void sub_80A68A4(void) -{ - if (sub_80A34B4() == TRUE) - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); -} - -void sub_80A68CC(void) -{ - sCurrentBagPocket = BAG_POCKET_BERRIES; - sReturnLocation = RETURN_TO_FIELD_4; - SetMainCallback2(sub_80A68A4); -} - -static void OnBagClose_Field4(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_80546B8 >> 16; - gTasks[taskId].data[9] = (u32)sub_80546B8; - sub_80A5AE4(taskId); -} - -static void OnItemSelect_Field4(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_80546B8 >> 16; - gTasks[taskId].data[9] = (u32)sub_80546B8; - sub_80A5AAC(taskId); -} - -static void sub_80A6940(void) -{ - while (1) - { - if (SetupBagMultistep() == TRUE) - { - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); - sub_80A699C(); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -void sub_80A6978(void) -{ - sCurrentBagPocket = BAG_POCKET_BERRIES; - sReturnLocation = RETURN_TO_FIELD_5; - SetMainCallback2(sub_80A6940); -} - -static void sub_80A699C(void) -{ - sPopupMenuActionList = gUnknown_083C16B8; - gUnknown_02038564 = 4; -} - -static void OnBagClose_Field5(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_804E990 >> 16; - gTasks[taskId].data[9] = (u32)sub_804E990; - sub_80A5AE4(taskId); -} - -static void HandlePopupMenuAction_Confirm(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_804E990 >> 16; - gTasks[taskId].data[9] = (u32)sub_804E990; - sub_80A5AAC(taskId); -} - -static void sub_80A6A08(void) -{ - if (sub_80A34B4() == TRUE) - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); -} - -void sub_80A6A30(void) -{ - sReturnLocation = RETURN_TO_PC; - SetMainCallback2(sub_80A6A08); -} - -static void OnBagClose_PC(u8 taskId) -{ - gFieldCallback = ItemStorage_ReturnToMenuAfterDeposit; - 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); -} - -static void sub_80A6A84(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - sub_80A4DA4(gBGTilemapBuffers[1]); - CopyItemName(gScriptItemId, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, taskData[1], STR_CONV_MODE_LEFT_ALIGN, 3); - MenuZeroFillWindowRect(7, 6, 11, 13); - sub_80A7528(7); - sub_80A3D5C(taskId); - gTasks[taskId].func = sub_80A5E1C; -} - -static void sub_80A6B00(u8 taskId) -{ - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - gTasks[taskId].data[10] = 0; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - PlaySE(SE_SELECT); - sub_80A5D38(taskId); - } -} - -static void sub_80A6B64(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - if (ItemId_GetImportance(gScriptItemId) == 2) - { - gTasks[taskId].func = sub_80A6B00; - sub_80A7528(9); - } - else - { - if (AddPCItem(gScriptItemId, taskData[1]) == TRUE) - { - sub_80A6A84(taskId); - } - else - { - gTasks[taskId].func = sub_80A6B00; - sub_80A7528(8); - } - } -} - -static void sub_80A6BE0(u8 taskId) -{ - if (sub_80A5350(taskId) == TRUE) - return; - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_80A4DA4(gBGTilemapBuffers[1]); - sub_80A6B64(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].data[10] = 0; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - PlaySE(SE_SELECT); - sub_80A5D38(taskId); - } -} - -static void OnItemSelect_PC(u8 taskId) -{ - gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A73FC(); - PlaySE(SE_SELECT); - sub_80A7590(); - if (sCurrentBagPocket != BAG_POCKET_KEY_ITEMS) - { - gTasks[taskId].func = sub_80A6BE0; - sub_80A7528(6); - // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way - if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) - sub_80A4DD8(taskId, 6, 9, 7, 3, 3); - else - sub_80A4DD8(taskId, 7, 9, 6, 3, 2); - } - else - { - gTasks[taskId].data[1] = 1; - sub_80A6B64(taskId); - } -} - -bool32 sub_80A6D1C(void) -{ - HideMapNamePopup(); - if (gSaveBlock1.registeredItem != 0) - { - if (CheckBagHasItem(gSaveBlock1.registeredItem, 1) == TRUE) - { - u8 taskId; - - ScriptContext2_Enable(); - FreezeMapObjects(); - sub_80594C0(); - sub_80597F4(); - gScriptItemId = gSaveBlock1.registeredItem; - taskId = CreateTask(ItemId_GetFieldFunc(gSaveBlock1.registeredItem), 8); - gTasks[taskId].data[2] = 1; - return TRUE; - } - gSaveBlock1.registeredItem = 0; - } - ScriptContext1_SetupScript(Event_NoRegisteredItem); - return TRUE; -} - -static void sub_80A6D98(void) -{ - while (1) - { - if (SetupBagMultistep() == TRUE) - { - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -void sub_80A6DCC(void) -{ - sPopupMenuSelection = 0; - sReturnLocation = RETURN_TO_BATTLE; - SetMainCallback2(sub_80A6D98); -} - -static void sub_80A6DF0(u16 *a) -{ - u8 r6 = (gUnknown_02038564 - 1) * 2; - - MenuDrawTextWindow(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); - } - else - { - MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 8); - MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[1]].text, 8, 10); - } - InitMenu(0, 8, 10 - r6, gUnknown_02038564, 0, 5); - sub_80A7528(2); -} - -static void sub_80A6EB8(u8 taskId) -{ - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) - { - if (sPopupMenuSelection == 1) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor(-1); - } - } - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) - { - if (sPopupMenuSelection + 1 < gUnknown_02038564) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor(1); - } - } - else if (gMain.newKeys & A_BUTTON) - { - gTasks[taskId].data[10] = 0; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A4DA4(gBGTilemapBuffers[1]); - sItemPopupMenuActions[sPopupMenuActionList[sPopupMenuSelection]].func(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].data[10] = 0; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A4DA4(gBGTilemapBuffers[1]); - sItemPopupMenuActions[5].func(taskId); - } -} - -static const u8 gUnknown_083C1708[] = {4, 5}; -static const u8 gUnknown_083C170A[] = {5, 0}; - -static void sub_80A6FDC(void) -{ - if (ItemId_GetBattleUsage(gScriptItemId) != 0) - { - sPopupMenuActionList = gUnknown_083C1708; - gUnknown_02038564 = 2; - } - else - { - sPopupMenuActionList = gUnknown_083C170A; - gUnknown_02038564 = 1; - } -} - -static void OnItemSelect_Battle(u8 taskId) -{ - sPopupMenuSelection = 0; - sub_80A6FDC(); - gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A73FC(); - sub_80A6DF0(gBGTilemapBuffers[1]); - gTasks[taskId].func = sub_80A6EB8; -} - -void sub_80A7094(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_802E424 >> 16; - gTasks[taskId].data[9] = (u32)sub_802E424; - gTasks[taskId].func = HandleItemMenuPaletteFade; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -static void OnBagClose_Battle(u8 taskId) -{ - PlaySE(SE_SELECT); - sub_80A7094(taskId); -} - -static void HandlePopupMenuAction_UseInBattle(u8 taskId) -{ - if (ItemId_GetBattleFunc(gScriptItemId) != NULL) - { - PlaySE(SE_SELECT); - ItemId_GetBattleFunc(gScriptItemId)(taskId); - } -} - -static void sub_80A7124(u8 taskId) -{ - PlaySE(SE_SELECT); - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void sub_80A7150(void) -{ - while (1) - { - if (SetupBagMultistep() == TRUE) - { - gUnknown_02038563 = CreateTask(sub_80A7230, 0); - gTasks[gUnknown_02038563].data[15] = 0; - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -void PrepareBagForWallyTutorial(void) -{ - u8 i; - - sPopupMenuSelection = 0; - sCurrentBagPocket = BAG_POCKET_ITEMS; - for (i = 0; i < 5; i++) - { - gBagPocketScrollStates[i].cursorPos = 0; - gBagPocketScrollStates[i].scrollTop = 0; - } - - // Save player's items - memcpy(ewramSavedItemsPocket, gSaveBlock1.bagPocket_Items, sizeof(gSaveBlock1.bagPocket_Items)); - memcpy(ewramSavedPokeballsPocket, gSaveBlock1.bagPocket_PokeBalls, sizeof(gSaveBlock1.bagPocket_PokeBalls)); - - // Add Wally's items to the bag - ClearItemSlots(gSaveBlock1.bagPocket_Items, ARRAY_COUNT(gSaveBlock1.bagPocket_Items)); - ClearItemSlots(gSaveBlock1.bagPocket_PokeBalls, ARRAY_COUNT(gSaveBlock1.bagPocket_PokeBalls)); - AddBagItem(ITEM_POTION, 1); - AddBagItem(ITEM_POKE_BALL, 1); - - sReturnLocation = RETURN_TO_WALLY_BATTLE; - SetMainCallback2(sub_80A7150); -} - -static void sub_80A7230(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - switch (taskData[15]) - { - case 102: - PlaySE(SE_SELECT); - sub_80A4E8C(1, 2); - break; - case 204: - PlaySE(SE_SELECT); - sub_80F98A4(2); - sub_80F98A4(3); - gScriptItemId = ITEM_POKE_BALL; - sPopupMenuActionList = gUnknown_083C1708; - gUnknown_02038564 = 2; - gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A73FC(); - sub_80A6DF0(gBGTilemapBuffers[1]); - break; - case 306: - PlaySE(SE_SELECT); - sub_80A4DA4(gBGTilemapBuffers[1]); - - // Restore player's items - memcpy(gSaveBlock1.bagPocket_Items, ewramSavedItemsPocket, sizeof(gSaveBlock1.bagPocket_Items)); - memcpy(gSaveBlock1.bagPocket_PokeBalls, ewramSavedPokeballsPocket, sizeof(gSaveBlock1.bagPocket_PokeBalls)); - - taskData[8] = (u32)sub_802E424 >> 16; - taskData[9] = (u32)sub_802E424; - gTasks[taskId].func = HandleItemMenuPaletteFade; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - return; - } - taskData[15]++; -} - -static void ItemListMenu_InitMenu(void) -{ - InitMenu(0, 14, 2, gBagPocketScrollStates[sCurrentBagPocket].cursorMax + 1, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, 0); - CreateBlendedOutlineCursor(16, 0xFFFF, 12, 0x2D9F, 15); - sub_80A73C0(); -} - -static void sub_80A73C0(void) -{ - sub_814AD7C(0x70, gBagPocketScrollStates[sCurrentBagPocket].cursorPos * 16 + 16); -} - -static void sub_80A73F0(void) -{ - sub_814ADC8(); -} - -static void sub_80A73FC(void) -{ - HandleDestroyMenuCursors(); - sub_814AD44(); -} - -static void sub_80A740C(void) -{ - sub_80A75E4(); - sub_80A7768(); - sub_80A7420(); -} - -static void sub_80A7420(void) -{ - struct UnknownStruct2 *unkStruct = &gUnknown_0203853C; - int index; - - switch (unkStruct->unk0) - { - case 3: - unkStruct->unk0 = 2; - break; - case 2: - switch (unkStruct->unk2) - { - case 0: - index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - ItemListMenu_ChangeDescription(gCurrentBagPocketItemSlots[index].itemId, unkStruct->textLine); - break; - case 1: - sub_80A4A98(gOtherText_SwitchWhichItem, unkStruct->textLine); - break; - case 2: - sub_80A4A98(gOtherText_WhatWillYouDo2, unkStruct->textLine); - break; - case 3: - sub_80A4A98(gOtherText_HowManyToToss, unkStruct->textLine); - break; - case 4: - sub_80A4A98(gOtherText_ThrewAwayItem, unkStruct->textLine); - break; - case 5: - sub_80A4A98(gOtherText_OkayToThrowAwayPrompt, unkStruct->textLine); - break; - case 6: - sub_80A4A98(gOtherText_HowManyToDeposit, unkStruct->textLine); - break; - case 7: - sub_80A4A98(gOtherText_DepositedItems, unkStruct->textLine); - break; - case 8: - sub_80A4A98(gOtherText_NoRoomForItems, unkStruct->textLine); - break; - case 9: - sub_80A4A98(gOtherText_CantStoreSomeoneItem, unkStruct->textLine); - break; - } - unkStruct->textLine++; - if (unkStruct->textLine == 3) - { - unkStruct->unk0 = 0; - sub_80A7918(); - } - break; - } -} - -static void sub_80A751C(void) -{ - gUnknown_0203853C.unk0 = 0; -} - -static void sub_80A7528(u8 a) -{ - gUnknown_0203853C.textLine = 0; - gUnknown_0203853C.unk2 = a; - switch (sub_80A78F4()) - { - case 0: - gUnknown_0203853C.unk0 = 2; - while (gUnknown_0203853C.unk0 != 0) - sub_80A7420(); - break; - case 1: - gUnknown_0203853C.unk0 = 3; - break; - case 2: - gUnknown_0203853C.unk0 = 1; - break; - } -} - -static void sub_80A756C(void) -{ - if (gUnknown_0203853C.unk0 == 2 || gUnknown_0203853C.unk0 == 3) - sub_80A7918(); - gUnknown_0203853C.unk0 = 0; -} - -static void sub_80A7590(void) -{ - MenuZeroFillWindowRect(0, 13, 13, 20); - sub_80A756C(); -} - -static void sub_80A75A8(void) -{ - if (gUnknown_0203853C.unk0 == 2 || gUnknown_0203853C.unk0 == 3) - gUnknown_0203853C.unk0 = 1; -} - -static void sub_80A75C4(void) -{ - switch (gUnknown_0203853C.unk0) - { - case 1: - gUnknown_0203853C.unk0 = 3; - break; - case 0: - sub_80A7918(); - break; - } -} - -static void sub_80A75E4(void) -{ - if (gUnknown_02038540.unk0 == 1 && sub_80A7988() == 0) - { - int r1; - - sub_80A47E8(gUnknown_02038563, gUnknown_02038540.unk1, gUnknown_02038540.unk1, 1); - gUnknown_02038540.unk1++; - if (gUnknown_02038540.unk2 != 0) - r1 = 5; - else - r1 = 7; - if (r1 < gUnknown_02038540.unk1) - { - gUnknown_02038540.unk0 = 0; - sub_80A78E8(); - } - } -} - -static void sub_80A7630(void) -{ - gUnknown_02038540.unk0 = 0; -} - -static void sub_80A763C(void) -{ - struct UnknownStruct3 *r4 = &gUnknown_02038540; - - switch (sub_80A78C4()) - { - case FALSE: - sub_80A48E8(gUnknown_02038563, 0, 7); - break; - case TRUE: - r4->unk0 = 1; - r4->unk1 = 0; - r4->unk2 = 0; - break; - } -} - -static void sub_80A7678(void) -{ - if (gUnknown_02038540.unk0 == 1) - sub_80A78E8(); - gUnknown_02038540.unk0 = 0; -} - -static void sub_80A7694(void) -{ - gUnknown_02038540.unk2 = 1; -} - -static void sub_80A76A0(void) -{ - MenuZeroFillWindowRect(14, 2, 29, 18); - sub_80A7678(); -} - -static bool32 sub_80A76B8(void) -{ - struct UnknownStruct3 *s = &gUnknown_02038540; - - return (s->unk0 == 0); -} - -static bool32 sub_80A76D0(void) -{ - struct UnknownStruct3 *s = &gUnknown_02038540; - - return (s->unk1 > 5); -} - -static void sub_80A76E8(void) -{ - if (gUnknown_02038544.unk0 == 1) - { - DisplayItemMessageOnField( - gUnknown_02038544.unk1, - gUnknown_02038544.unk4, - gUnknown_02038544.unk8, - gUnknown_02038544.unk2); - gUnknown_02038544.unk0 = 0; - } -} - -static void sub_80A770C(void) -{ - gUnknown_02038544.unk0 = 0; -} - -static void DisplayCannotUseItemMessage(int a, const u8 *b, TaskFunc func, int d) -{ - struct UnknownStruct4 *r4 = &gUnknown_02038544; - - switch (sub_80A7924()) - { - case 0: - DisplayItemMessageOnField(a, b, func, d); - break; - case 2: - r4->unk0 = 1; - r4->unk1 = a; - r4->unk4 = b; - r4->unk8 = func; - r4->unk2 = d; - break; - } -} - -static void sub_80A7768(void) -{ - struct UnknownStruct5 *r4 = &gUnknown_02038550; - - if (r4->unk0 == 2) - { - if (r4->unk1 != 0) - { - if (r4->unk2 != 1) - { - const u8 *text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text; - int var = r4->unk1 - 1; - - MenuPrint(text, 7, var * 2 + 1 + r4->unk3); - } - else - { - const u8 *text; - int var; - - if (r4->unk1 == 1) - text = sub_80A4B90(gScriptItemId); - else - text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text; - var = r4->unk1 - 1; - MenuPrint(text, (var >> 1) * 6 + 1, (var & 1) * 2 + 8); - } - if (r4->unk1 == gUnknown_02038564) - { - r4->unk0 = 0; - sub_80A7970(); - } - } - r4->unk1++; - } -} - -static void sub_80A7828(void) -{ - gUnknown_02038550.unk0 = 0; -} - -static void sub_80A7834(int a, int b) -{ - struct UnknownStruct5 *r4 = &gUnknown_02038550; - - switch (sub_80A7958()) - { - case 1: - r4->unk0 = 2; - r4->unk1 = 0; - r4->unk2 = a; - r4->unk3 = b; - break; - case 2: - r4->unk0 = 1; - r4->unk1 = 0; - r4->unk2 = a; - r4->unk3 = b; - break; - } -} - -static void sub_80A7868(void) -{ - if (gUnknown_02038550.unk0 == 2) - gUnknown_02038550.unk0 = 1; -} - -static void sub_80A7880(void) -{ - switch (gUnknown_02038550.unk0) - { - case 1: - gUnknown_02038550.unk0 = 2; - break; - case 0: - sub_80A7970(); - break; - } -} - -static bool32 sub_80A78A0(void) -{ - struct UnknownStruct5 *r0 = &gUnknown_02038550; - - return (r0->unk0 == 0); -} - -static void sub_80A78B8(void) -{ - gUnknown_02038554.unk0 = 0; -} - -static bool32 sub_80A78C4(void) -{ - bool32 retVal; - - if (gLinkOpen == TRUE) - { - sub_80A7868(); - sub_80A75A8(); - retVal = TRUE; - } - else - { - retVal = FALSE; - } - return retVal; -} - -static void sub_80A78E8(void) -{ - sub_80A7880(); -} - -static int sub_80A78F4(void) -{ - int retVal; - - if (gLinkOpen == TRUE) - { - if (sub_80A76B8() != 0) - retVal = 1; - else - retVal = 2; - } - else - { - retVal = 0; - } - return retVal; -} - -static void sub_80A7918(void) -{ - sub_80A76E8(); -} - -static int sub_80A7924(void) -{ - if (gLinkOpen == TRUE && sub_80A76B8() == 0) - { - if (sub_80A76D0() != 0) - { - sub_80A7678(); - return 0; - } - } - else - { - return 0; - } - sub_80A7694(); - return 2; -} - -static int sub_80A7958(void) -{ - if (sub_80A76B8() == 0) - return 2; - sub_80A75A8(); - return 1; -} - -static void sub_80A7970(void) -{ - sub_80A75C4(); -} - -static void sub_80A797C(void) -{ - gUnknown_02038554.unk0 = 1; -} - -static int sub_80A7988(void) -{ - int val = gUnknown_02038554.unk0; - - gUnknown_02038554.unk0 = 0; - return val; -} - -static const u16 gPalette_83C170C[] = INCBIN_U16("graphics/unknown/83C170C.gbapal"); -static const u8 gSpriteImage_83C172C[] = INCBIN_U8("graphics/unknown_sprites/83C172C.4bpp"); - -const u8 gSpriteImage_UnusedCherry[] = INCBIN_U8("graphics/unused/cherry.4bpp"); -const u16 gSpritePalette_UnusedCherry[] = INCBIN_U16("graphics/unused/cherry.gbapal"); - -//------------------------------------------------------------------------------ -// Bag Sprite -//------------------------------------------------------------------------------ - -static const struct OamData sBagSpriteOamData = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 2, - .paletteNum = 7, - .affineParam = 0, -}; - -static const union AnimCmd sBagSpriteAnimSeq0[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sBagSpriteAnimSeq1[] = -{ - ANIMCMD_FRAME(64, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sBagSpriteAnimSeq5[] = -{ - ANIMCMD_FRAME(128, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sBagSpriteAnimSeq2[] = -{ - ANIMCMD_FRAME(192, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sBagSpriteAnimSeq3[] = -{ - ANIMCMD_FRAME(256, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sBagSpriteAnimSeq4[] = -{ - ANIMCMD_FRAME(320, 4), - ANIMCMD_END, -}; - -static const union AnimCmd *const sBagSpriteAnimTable[] = -{ - sBagSpriteAnimSeq0, - sBagSpriteAnimSeq1, - sBagSpriteAnimSeq2, - sBagSpriteAnimSeq3, - sBagSpriteAnimSeq4, - sBagSpriteAnimSeq5, -}; - -static const union AffineAnimCmd sBagSpriteAffineAnimSeq[] = -{ - AFFINEANIMCMD_FRAME(0, 0, -2, 2), - AFFINEANIMCMD_FRAME(0, 0, 2, 4), - AFFINEANIMCMD_FRAME(0, 0, -2, 4), - AFFINEANIMCMD_FRAME(0, 0, 2, 2), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd *const sBagSpriteAffineAnimTable[] = -{ - sBagSpriteAffineAnimSeq, -}; - -static const struct CompressedSpriteSheet sMaleBagSpriteSheet = {gBagMaleTiles, 0x3000, 30000}; -static const struct CompressedSpriteSheet sFemaleBagSpriteSheet = {gBagFemaleTiles, 0x3000, 30000}; -static const struct CompressedSpritePalette sBagSpritePalette = {gBagPalette, 30000}; - -static void sub_80A7998(struct Sprite *sprite) -{ - sprite->animNum = 0; - sprite->data0 = 0; - sprite->data1 = 0; - sprite->data2 = 0; - sprite->data3 = 0; - sprite->data4 = 0; - sprite->callback = sub_80A79B4; -} - -static void sub_80A79B4(struct Sprite *sprite) -{ - if (gUnknown_0203855B != -1) - sub_80A79EC(sprite); - if (gUnknown_0203855C != 0) - sub_80A7A94(sprite); -} - -static void sub_80A79EC(struct Sprite *sprite) -{ - switch (sprite->data3) - { - case 0: - if (gUnknown_0203855B != 6) - { - sprite->animBeginning = TRUE; - sprite->animNum = gUnknown_0203855B; - gUnknown_0203855B = -1; - } - else - { - sprite->animBeginning = TRUE; - sprite->animNum = 0; - sprite->pos1.y -= 4; - sprite->data0 = 4; - sprite->data3 = 1; - sub_80A7AE4(sprite); - } - break; - case 1: - if (sprite->data0 != 0) - { - if (sprite->data1 != 0) - { - sprite->pos1.y++; - sprite->data0--; - } - sprite->data1 = (sprite->data1 + 1) & 1; - } - else - { - gUnknown_0203855B = -1; - sprite->data1 = 0; - sprite->data3 = 0; - } - break; - } -} - -static void sub_80A7A94(struct Sprite *sprite) -{ - switch (sprite->data4) - { - case 0: - sprite->oam.affineMode = 1; - sprite->affineAnims = sBagSpriteAffineAnimTable; - InitSpriteAffineAnim(sprite); - sprite->data4 = 1; - break; - case 1: - sprite->data2++; - if (sprite->data2 == 12) - sub_80A7AE4(sprite); - break; - } -} - -static void sub_80A7AE4(struct Sprite *sprite) -{ - gUnknown_0203855C = 0; - sprite->oam.affineMode = 0; - sprite->data2 = 0; - sprite->data4 = 0; - FreeOamMatrix(sprite->oam.matrixNum); -} - -static const struct SpriteTemplate sBagSpriteTemplate = -{ - .tileTag = 30000, - .paletteTag = 30000, - .oam = &sBagSpriteOamData, - .anims = sBagSpriteAnimTable, - .images = NULL, - .affineAnims = sBagSpriteAffineAnimTable, - .callback = sub_80A7998, -}; - -static void CreateBagSprite(void) -{ - CreateSprite(&sBagSpriteTemplate, 58, 40, 0); -} - -//------------------------------------------------------------------------------ -// Pokeball Sprite -//------------------------------------------------------------------------------ - -static const struct OamData gOamData_83C1CF8 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 4, - .size = 1, - .tileNum = 0, - .priority = 2, - .paletteNum = 8, - .affineParam = 0, -}; - -static const union AffineAnimCmd gSpriteAffineAnim_83C1D00[] = -{ - AFFINEANIMCMD_FRAME(0, 0, 8, 32), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd gSpriteAffineAnim_83C1D10[] = -{ - AFFINEANIMCMD_FRAME(0, 0, -8, 32), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd *const gSpriteAffineAnimTable_83C1D20[] = -{ - gSpriteAffineAnim_83C1D00, - gSpriteAffineAnim_83C1D10, -}; - -static const struct SpriteFrameImage gSpriteImageTable_83C1D28[] = -{ - {gSpriteImage_83C172C, sizeof(gSpriteImage_83C172C)}, -}; - -static const struct SpritePalette sPokeballSpritePalette = {gPalette_83C170C, 8}; - -static void sub_80A7B28(struct Sprite *sprite) -{ - sprite->data3 = 0; - sprite->data0 = 0; - sub_80A7B6C(sprite); - sprite->callback = sub_80A7B6C; -} - -static void sub_80A7B48(struct Sprite *sprite) -{ - sprite->centerToCornerVecX = sprite->data5 - ((sprite->data0 + 1) & 1); - sprite->centerToCornerVecY = sprite->data6 - ((sprite->data0 + 1) & 1); -} - -static void sub_80A7B6C(struct Sprite *sprite) -{ - if (sprite->data7 != 0) - { - switch (sprite->data3) - { - case 0: - sprite->oam.affineMode = 1; - if (sprite->data7 == 1) - sprite->affineAnims = gSpriteAffineAnimTable_83C1D20; - else - sprite->affineAnims = gSpriteAffineAnimTable_83C1D20 + 1; - InitSpriteAffineAnim(sprite); - sprite->data3 = 1; - sprite->data5 = sprite->centerToCornerVecX; - sprite->data6 = sprite->centerToCornerVecY; - sub_80A7B48(sprite); - break; - case 1: - sprite->data0++; - sub_80A7B48(sprite); - if (sprite->data0 == 32) - { - sprite->data0 = 0; - sprite->data3 = 0; - sprite->centerToCornerVecX = sprite->data5; - sprite->centerToCornerVecY = sprite->data6; - FreeOamMatrix(sprite->oam.matrixNum); - sprite->oam.affineMode = 0; - sprite->callback = SpriteCallbackDummy; - } - break; - } - } -} - -static const struct SpriteTemplate sPokeballSpriteTemplate = -{ - .tileTag = 0xFFFF, - .paletteTag = 8, - .oam = &gOamData_83C1CF8, - .anims = sBagSpriteAnimTable, - .images = gSpriteImageTable_83C1D28, - .affineAnims = gSpriteAffineAnimTable_83C1D20, - .callback = sub_80A7B28, -}; - -static void CreateBagPokeballSprite(u8 a) -{ - LoadSpritePalette(&sPokeballSpritePalette); - sPokeballSpriteId = CreateSprite(&sPokeballSpriteTemplate, 16, 88, 0); - gSprites[sPokeballSpriteId].data7 = a; -} - -static void sub_80A7C64(void) -{ - FreeSpritePaletteByTag(8); - FreeOamMatrix(gSprites[sPokeballSpriteId].oam.matrixNum); - DestroySprite(&gSprites[sPokeballSpriteId]); -} - -static const struct OamData sBerrySpriteOamData = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 7, - .affineParam = 0, -}; - -static const struct OamData gOamData_83C1D58 = -{ - .y = 0, - .affineMode = 3, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 7, - .affineParam = 0, -}; - -static const union AnimCmd sBerrySpriteAnimSeq[] = -{ - ANIMCMD_FRAME(0, 0), - ANIMCMD_END, -}; - -static const union AnimCmd *const sBerrySpriteAnimTable[] = -{ - sBerrySpriteAnimSeq, -}; - -static const struct SpriteFrameImage sBerrySpriteImageTable[] = -{ - {ewramBerryPic, 0x800}, -}; - -static void SpriteCB_BerrySprite(struct Sprite *); -static const struct SpriteTemplate sBerrySpriteTemplate = -{ - .tileTag = 0xFFFF, - .paletteTag = 30020, - .oam = &sBerrySpriteOamData, - .anims = sBerrySpriteAnimTable, - .images = sBerrySpriteImageTable, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_BerrySprite, -}; - -static const union AffineAnimCmd gSpriteAffineAnim_83C1D8C[] = -{ - AFFINEANIMCMD_FRAME(-1, -1, -3, 96), - AFFINEANIMCMD_FRAME(0, 0, 0, 16), - AFFINEANIMCMD_FRAME(-2, -2, -1, 64), - AFFINEANIMCMD_FRAME(-8, 0, 0, 16), - AFFINEANIMCMD_FRAME(0, -8, 0, 16), - AFFINEANIMCMD_FRAME(256, 256, 0, 0), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd gSpriteAffineAnim_83C1DC4[] = -{ - AFFINEANIMCMD_FRAME(-1, -1, 3, 96), - AFFINEANIMCMD_FRAME(0, 0, 0, 16), - AFFINEANIMCMD_FRAME(-2, -2, 1, 64), - AFFINEANIMCMD_FRAME(-8, 0, 0, 16), - AFFINEANIMCMD_FRAME(0, -8, 0, 16), - AFFINEANIMCMD_FRAME(256, 256, 0, 0), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd *const gSpriteAffineAnimTable_83C1DFC[] = -{ - gSpriteAffineAnim_83C1D8C, - gSpriteAffineAnim_83C1DC4, -}; - -static const struct SpriteTemplate gSpriteTemplate_83C1E04 = -{ - .tileTag = 0xFFFF, - .paletteTag = 30020, - .oam = &gOamData_83C1D58, - .anims = sBerrySpriteAnimTable, - .images = sBerrySpriteImageTable, - .affineAnims = gSpriteAffineAnimTable_83C1DFC, - .callback = SpriteCallbackDummy, -}; - -static const struct {const u8 *lzPic; const u8 *lzPalette;} sBerryGraphicsTable[] = -{ - {gBerryPic_Cheri, gBerryPalette_Cheri}, - {gBerryPic_Chesto, gBerryPalette_Chesto}, - {gBerryPic_Pecha, gBerryPalette_Pecha}, - {gBerryPic_Rawst, gBerryPalette_Rawst}, - {gBerryPic_Aspear, gBerryPalette_Aspear}, - {gBerryPic_Leppa, gBerryPalette_Leppa}, - {gBerryPic_Oran, gBerryPalette_Oran}, - {gBerryPic_Persim, gBerryPalette_Persim}, - {gBerryPic_Lum, gBerryPalette_Lum}, - {gBerryPic_Sitrus, gBerryPalette_Sitrus}, - {gBerryPic_Figy, gBerryPalette_Figy}, - {gBerryPic_Wiki, gBerryPalette_Wiki}, - {gBerryPic_Mago, gBerryPalette_Mago}, - {gBerryPic_Aguav, gBerryPalette_Aguav}, - {gBerryPic_Iapapa, gBerryPalette_Iapapa}, - {gBerryPic_Razz, gBerryPalette_Razz}, - {gBerryPic_Bluk, gBerryPalette_Bluk}, - {gBerryPic_Nanab, gBerryPalette_Nanab}, - {gBerryPic_Wepear, gBerryPalette_Wepear}, - {gBerryPic_Pinap, gBerryPalette_Pinap}, - {gBerryPic_Pomeg, gBerryPalette_Pomeg}, - {gBerryPic_Kelpsy, gBerryPalette_Kelpsy}, - {gBerryPic_Qualot, gBerryPalette_Qualot}, - {gBerryPic_Hondew, gBerryPalette_Hondew}, - {gBerryPic_Grepa, gBerryPalette_Grepa}, - {gBerryPic_Tamato, gBerryPalette_Tamato}, - {gBerryPic_Cornn, gBerryPalette_Cornn}, - {gBerryPic_Magost, gBerryPalette_Magost}, - {gBerryPic_Rabuta, gBerryPalette_Rabuta}, - {gBerryPic_Nomel, gBerryPalette_Nomel}, - {gBerryPic_Spelon, gBerryPalette_Spelon}, - {gBerryPic_Pamtre, gBerryPalette_Pamtre}, - {gBerryPic_Watmel, gBerryPalette_Watmel}, - {gBerryPic_Durin, gBerryPalette_Durin}, - {gBerryPic_Belue, gBerryPalette_Belue}, - {gBerryPic_Liechi, gBerryPalette_Liechi}, - {gBerryPic_Ganlon, gBerryPalette_Ganlon}, - {gBerryPic_Salac, gBerryPalette_Salac}, - {gBerryPic_Petaya, gBerryPalette_Petaya}, - {gBerryPic_Apicot, gBerryPalette_Apicot}, - {gBerryPic_Lansat, gBerryPalette_Lansat}, - {gBerryPic_Starf, gBerryPalette_Starf}, - {gBerryPic_Enigma, gBerryPalette_Enigma}, -}; - -static void DrawBerryPic(const u8 *src, u8 *dst) -{ - u8 i; - u8 j; - - memset(dst, 0, 0x800); - dst += 0x100; - for (i = 0; i < 6; i++) - { - dst += 32; - for (j = 0; j < 6; j++) - { - memcpy(dst, src, 32); - dst += 32; - src += 32; - } - if (i != 5) - dst += 32; - } -} - -static void LoadBerryPic(u8 berryId) -{ - struct SpritePalette spritePal; - - if (berryId == 0x2A && IsEnigmaBerryValid() == TRUE) - { - DrawBerryPic(gSaveBlock1.enigmaBerry.pic, ewramBerryPic); - spritePal.data = gSaveBlock1.enigmaBerry.palette; - spritePal.tag = 0x7544; - LoadSpritePalette(&spritePal); - } - else - { - spritePal.data = (u16 *)sBerryGraphicsTable[berryId].lzPalette; - spritePal.tag = 0x7544; - LoadCompressedObjectPalette((struct CompressedSpritePalette *)&spritePal); - sub_800D238(sBerryGraphicsTable[berryId].lzPic, ewramBerryPicTemp); - DrawBerryPic(ewramBerryPicTemp, ewramBerryPic); - } -} - -u8 CreateBerrySprite(u8 berryId, s16 x, s16 y) -{ - LoadBerryPic(berryId); - return CreateSprite(&sBerrySpriteTemplate, x, y, 0); -} - -static void SpriteCB_BerrySprite(struct Sprite *sprite) -{ - sprite->pos2.y = -gUnknown_030041B4; -} - -void sub_80A7DD4(void) -{ - FreeSpritePaletteByTag(0x7544); - FreeSpritePaletteByTag(8); -} - -u8 sub_80A7DEC(u8 berryId, u8 x, u8 y, bool8 animate) -{ - u8 spriteId; - - FreeSpritePaletteByTag(0x7544); - LoadBerryPic(berryId); - spriteId = CreateSprite(&gSpriteTemplate_83C1E04, x, y, 0); - if (animate == TRUE) - StartSpriteAffineAnim(&gSprites[spriteId], 1); - return spriteId; -} - -const struct CompressedSpriteSheet gUnknown_083C1F74 = {gBerryCheckCircle_Gfx, 2048, 0x2710}; - -const struct CompressedSpritePalette gUnknown_083C1F7C = {gBerryCheck_Pal, 0x2710}; - -static const struct OamData gOamData_83C1F84 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd gSpriteAnim_83C1F8C[] = -{ - ANIMCMD_FRAME(0, 0), - ANIMCMD_END, -}; - -static const union AnimCmd *const gSpriteAnimTable_83C1F94[] = -{ - gSpriteAnim_83C1F8C, -}; - -static const struct SpriteTemplate gSpriteTemplate_83C1F98 = -{ - .tileTag = 10000, - .paletteTag = 10000, - .oam = &gOamData_83C1F84, - .anims = gSpriteAnimTable_83C1F94, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_BerrySprite, -}; - -u8 sub_80A7E5C(s16 x) -{ - return CreateSprite(&gSpriteTemplate_83C1F98, x, 99, 0); -} diff --git a/src/item_use.c b/src/item_use.c deleted file mode 100644 index 1750c1584..000000000 --- a/src/item_use.c +++ /dev/null @@ -1,1198 +0,0 @@ -#include "global.h" -#include "item_use.h" -#include "battle.h" -#include "berry.h" -#include "bike.h" -#include "coins.h" -#include "data2.h" -#include "event_data.h" -#include "field_effect.h" -#include "field_fadetransition.h" -#include "field_map_obj_helpers.h" -#include "field_player_avatar.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "item.h" -#include "item_menu.h" -#include "items.h" -#include "mail.h" -#include "main.h" -#include "map_obj_lock.h" -#include "menu.h" -#include "menu_helpers.h" -#include "metatile_behavior.h" -#include "palette.h" -#include "party_menu.h" -#include "pokeblock.h" -#include "pokemon_item_effect.h" -#include "pokemon_menu.h" -#include "rom4.h" -#include "rom_8094928.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "vars.h" - -extern void (* gUnknown_03005D00)(u8); -extern void (* gFieldCallback)(void); -extern void (* gUnknown_0300485C)(void); -extern void (* gUnknown_03004AE4)(u8, u16, TaskFunc); - -extern u8 gUnknown_02038561; -extern u8 gLastFieldPokeMenuOpened; -extern u8 gBankInMenu; - -extern u8 gUnknown_081A1654[]; -extern u8 gUnknown_081A168F[]; - -extern u16 gBattlePartyID[]; - -extern u16 gBattleTypeFlags; - -static const u8 gSSTidalBetaString[] = _("この チケットで ふねに のりほうだい\nはやく のってみたいな"); -static const u8 gSSTidalBetaString2[] = _("この チケットで ふねに のりほうだい\nはやく のってみたいな"); - -static const u8 *const gUnknown_083D61DC[2] = -{ - gSSTidalBetaString, - gSSTidalBetaString2, -}; - -static const MainCallback gExitToOverworldFuncList[] = -{ - sub_808B020, - c2_exit_to_overworld_2_switch, - sub_810B96C, -}; - -static const u8 gItemFinderDirections[] = { DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST }; - -static const struct YesNoFuncTable gUnknown_083D61F4 = -{ - .yesFunc = sub_80C9FC0, - .noFunc = CleanUpItemMenuMessage, -}; - -void ExecuteSwitchToOverworldFromItemUse(u8 taskId) -{ - u8 taskData; - - if (gScriptItemId == 0xAF) - taskData = gTasks[taskId].data[15] - 1; - else - taskData = ItemId_GetType(gScriptItemId) - 1; - - gTasks[taskId].data[8] = (u32)gExitToOverworldFuncList[taskData] >> 16; - gTasks[taskId].data[9] = (u32)gExitToOverworldFuncList[taskData]; - gTasks[taskId].func = HandleItemMenuPaletteFade; -} - -void ItemMenu_ConfirmNormalFade(u8 var) -{ - ExecuteSwitchToOverworldFromItemUse(var); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void ItemMenu_ConfirmComplexFade(u8 var) -{ - ExecuteSwitchToOverworldFromItemUse(var); - fade_screen(1, 0); -} - -void SetUpItemUseOnFieldCallback(u8 taskId) -{ - if (gTasks[taskId].data[2] != 1) - { - gFieldCallback = (void *)ExecuteItemUseFromBlackPalette; - ItemMenu_ConfirmNormalFade(taskId); - } - else - gUnknown_03005D00(taskId); -} - -void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text) -{ - StringExpandPlaceholders(gStringVar4, text); - - switch (playerMenuStatus) - { - case 0: // Item Menu - MenuZeroFillWindowRect(0, 13, 13, 20); - DisplayItemMessageOnField(var1, gStringVar4, CleanUpItemMenuMessage, 1); - break; - default: // Field - DisplayItemMessageOnField(var1, gStringVar4, CleanUpOverworldMessage, 0); - break; - } -} - -void DisplayDadsAdviceCannotUseItemMessage(u8 var1, u8 playerMenuStatus) -{ - HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_DadsAdvice); -} - -void DisplayCantGetOffBikeItemMessage(u8 var1, u8 playerMenuStatus) -{ - HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_CantGetOffBike); -} - -u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId) -{ - if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_TMHM) - return 1; - else if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_EvolutionStone) - return 2; - else - return 0; -} - -void ItemMenu_ReadMail(u8 taskId) -{ - struct MailStruct mailStruct; - - if (!gPaletteFade.active) - { - mailStruct.itemId = gScriptItemId; - HandleReadMail(&mailStruct, sub_80A5D04, 0); - DestroyTask(taskId); - } -} - -void ItemUseOutOfBattle_Mail(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = ItemMenu_ReadMail; -} - -void ItemUseOutOfBattle_Bike(u8 taskId) -{ - s16 x, y; - u8 tileBehavior; - - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - - if (FlagGet(SYS_CYCLING_ROAD) == TRUE // on cycling road? - || MetatileBehavior_IsVerticalRail(tileBehavior) == TRUE - || MetatileBehavior_IsHorizontalRail(tileBehavior) == TRUE - || MetatileBehavior_IsIsolatedVerticalRail(tileBehavior) == TRUE - || MetatileBehavior_IsIsolatedHorizontalRail(tileBehavior) == TRUE) - { - DisplayCantGetOffBikeItemMessage(taskId, gTasks[taskId].data[2]); - } - else - { - if (IsBikingAllowedByMap() == TRUE && IsBikingDisallowedByPlayer() == FALSE) - { - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Bike; - SetUpItemUseOnFieldCallback(taskId); - } - else - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } -} - -void ItemUseOnFieldCB_Bike(u8 taskId) -{ - if (ItemId_GetSecondaryId(gScriptItemId) == 0) - GetOnOffBike(2); - if (ItemId_GetSecondaryId(gScriptItemId) == 1) - GetOnOffBike(4); - - sub_8064E2C(); - ScriptContext2_Disable(); - DestroyTask(taskId); -} - -bool32 CanFish(void) -{ - s16 x, y; - u16 tileBehavior; - - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - - if (MetatileBehavior_IsWaterfall(tileBehavior)) - return FALSE; - - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4)) - return FALSE; - - if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - { - if (IsPlayerFacingSurfableFishableWater()) - return TRUE; - } - else - { - if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior) && !MapGridIsImpassableAt(x, y)) - return TRUE; - if (MetatileBehavior_IsBridge(tileBehavior) == TRUE) - return TRUE; - } - - return FALSE; -} - -void ItemUseOutOfBattle_Rod(u8 taskId) -{ - if (CanFish() == TRUE) - { - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Rod; - SetUpItemUseOnFieldCallback(taskId); - } - else - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); -} - -void ItemUseOnFieldCB_Rod(u8 taskId) -{ - StartFishing(ItemId_GetSecondaryId(gScriptItemId)); - DestroyTask(taskId); -} - -void ItemUseOutOfBattle_Itemfinder(u8 var) -{ - IncrementGameStat(0x27); - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Itemfinder; - SetUpItemUseOnFieldCallback(var); -} - -void ItemUseOnFieldCB_Itemfinder(u8 taskId) -{ - if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE) - gTasks[taskId].func = RunItemfinderResults; - else - DisplayItemMessageOnField(taskId, gOtherText_NoResponse, ExitItemfinder, 0); -} - -void RunItemfinderResults(u8 taskId) -{ - u8 playerDir; - u8 playerDirToItem; - u8 i; - s16 *data = gTasks[taskId].data; - - if (!data[3]) - { - if (data[4] == 4) - { - playerDirToItem = GetPlayerDirectionTowardsHiddenItem(data[0], data[1]); - if (playerDirToItem) - { - SetPlayerDirectionTowardsItem(gItemFinderDirections[playerDirToItem - 1]); - gTasks[taskId].func = DisplayItemRespondingMessageAndExitItemfinder; - } - else // player is above hidden item. - { - playerDir = player_get_direction_lower_nybble(); - - // rotate player clockwise depending on current direction. - for (i = 0; i < 4; i++) - if (playerDir == gItemFinderDirections[i]) - data[5] = (i + 1) & 3; - - gTasks[taskId].func = RotatePlayerAndExitItemfinder; - data[3] = 0; - data[2] = 0; - } - return; - } - PlaySE(SE_DAUGI); // play the itemfinder jingle 4 times before executing the itemfinder. - data[4]++; - } - data[3] = (data[3] + 1) & 0x1F; -} - -void ExitItemfinder(u8 taskId) -{ - MenuZeroFillWindowRect(0, 14, 29, 19); - sub_8064E2C(); - ScriptContext2_Disable(); - DestroyTask(taskId); -} - -bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId) -{ - int distanceX, distanceY; - u16 x, y; - s16 newDistanceX, newDistanceY, i; - - PlayerGetDestCoords(&x, &y); - gTasks[taskId].data[2] = FALSE; - - for (i = 0; i < events->bgEventCount; i++) - { - if ((events -> bgEvents[i].kind == 7) && !FlagGet(events -> bgEvents[i].bgUnion.hiddenItem.hiddenItemId + 600)) - { - // do a distance lookup of each item so long as the index remains less than the objects on the current map. - distanceX = (u16)events -> bgEvents[i].x + 7; - newDistanceX = distanceX - x; - distanceY = (u16)events -> bgEvents[i].y + 7; - newDistanceY = distanceY - y; - - // is item in range? - if ((u16)(newDistanceX + 7) < 15 && (newDistanceY >= -5) && (newDistanceY < 6)) - sub_80C9838(taskId, newDistanceX, newDistanceY); // send coordinates of the item relative to the player - } - } - sub_80C9720(taskId); - - // hidden item detected? - if(gTasks[taskId].data[2] == TRUE) - return TRUE; - else - return FALSE; -} - -bool8 HiddenItemAtPos(struct MapEvents *events, s16 x, s16 y) -{ - u8 bgEventCount = events->bgEventCount; - struct BgEvent *bgEvent = events->bgEvents; - int i; - - for(i = 0; i < bgEventCount; i++) - { - if(bgEvent[i].kind == 7 && x == (u16)bgEvent[i].x && y == (u16)bgEvent[i].y) // hidden item and coordinates matches x and y passed? - { - if(!FlagGet(bgEvent[i].bgUnion.hiddenItem.hiddenItemId + 600)) - return TRUE; - else - return FALSE; - } - } - return FALSE; -} - -bool8 sub_80C9688(struct MapConnection *connection, int x, int y) -{ - struct MapHeader *mapHeader; - u16 localX, localY; - u32 localOffset; - s32 localLength; - - mapHeader = mapconnection_get_mapheader(connection); - - switch(connection->direction) - { - // same weird temp variable behavior seen in HiddenItemAtPos - case 2: - localOffset = connection->offset + 7; - localX = x - localOffset; - localLength = mapHeader->mapData->height - 7; - localY = localLength + y; // additions are reversed for some reason - break; - case 1: - localOffset = connection->offset + 7; - localX = x - localOffset; - localLength = gMapHeader.mapData->height + 7; - localY = y - localLength; - break; - case 3: - localLength = mapHeader->mapData->width - 7; - localX = localLength + x; // additions are reversed for some reason - localOffset = connection->offset + 7; - localY = y - localOffset; - break; - case 4: - localLength = gMapHeader.mapData->width + 7; - localX = x - localLength; - localOffset = connection->offset + 7; - localY = y - localOffset; - break; - default: - return FALSE; - } - return HiddenItemAtPos(mapHeader->events, localX, localY); -} - -// weird math -#ifdef NONMATCHING -void sub_80C9720(u8 taskId) -{ - s16 x, y; - s16 curX, curY; - s16 width = gMapHeader.mapData->width + 7; - s16 height = gMapHeader.mapData->height + 7; - - PlayerGetDestCoords(&x, &y); - - for (curX = x - 7; curX <= x + 7; curX++) - { - for (curY = y - 5; curY <= y + 5; curY++) - { - if (7 > curX - || curX >= width - || 7 > curY - || curY >= height) - { - struct MapConnection *conn = sub_8056BA0(curX, curY); - if (conn && sub_80C9688(conn, curX, curY) == TRUE) - sub_80C9838(taskId, curX - x, curY - y); - } - } - } -} -#else -__attribute__((naked)) -void sub_80C9720(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x4]\n\ - ldr r0, _080C9834 @ =gMapHeader\n\ - ldr r1, [r0]\n\ - ldr r0, [r1]\n\ - adds r0, 0x7\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x8]\n\ - ldr r0, [r1, 0x4]\n\ - adds r0, 0x7\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0xC]\n\ - mov r4, sp\n\ - adds r4, 0x2\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl PlayerGetDestCoords\n\ - mov r0, sp\n\ - ldrh r0, [r0]\n\ - subs r0, 0x7\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - mov r1, sp\n\ - movs r2, 0\n\ - ldrsh r1, [r1, r2]\n\ - adds r1, 0x7\n\ - cmp r0, r1\n\ - bgt _080C9824\n\ -_080C976E:\n\ - mov r5, sp\n\ - ldrh r0, [r5, 0x2]\n\ - subs r0, 0x5\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - lsls r2, r4, 16\n\ - asrs r1, r2, 16\n\ - movs r6, 0x2\n\ - ldrsh r0, [r5, r6]\n\ - adds r0, 0x5\n\ - lsls r3, 16\n\ - mov r8, r3\n\ - cmp r1, r0\n\ - bgt _080C980E\n\ - movs r0, 0x7\n\ - str r0, [sp, 0x10]\n\ - mov r1, r8\n\ - asrs r1, 16\n\ - mov r9, r1\n\ - mov r10, r0\n\ -_080C9796:\n\ - ldr r3, [sp, 0x10]\n\ - cmp r3, r9\n\ - bgt _080C97B8\n\ - ldr r5, [sp, 0x8]\n\ - lsls r0, r5, 16\n\ - asrs r0, 16\n\ - cmp r9, r0\n\ - bge _080C97B8\n\ - asrs r1, r2, 16\n\ - cmp r10, r1\n\ - bgt _080C97B8\n\ - ldr r6, [sp, 0xC]\n\ - lsls r0, r6, 16\n\ - asrs r0, 16\n\ - lsls r7, r4, 16\n\ - cmp r1, r0\n\ - blt _080C97F6\n\ -_080C97B8:\n\ - mov r0, r8\n\ - asrs r5, r0, 16\n\ - lsls r4, 16\n\ - asrs r6, r4, 16\n\ - adds r0, r5, 0\n\ - adds r1, r6, 0\n\ - bl sub_8056BA0\n\ - adds r7, r4, 0\n\ - cmp r0, 0\n\ - beq _080C97F6\n\ - adds r1, r5, 0\n\ - adds r2, r6, 0\n\ - bl sub_80C9688\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _080C97F6\n\ - mov r0, sp\n\ - ldrh r1, [r0]\n\ - subs r1, r5, r1\n\ - lsls r1, 16\n\ - asrs r1, 16\n\ - ldrh r2, [r0, 0x2]\n\ - subs r2, r6, r2\n\ - lsls r2, 16\n\ - asrs r2, 16\n\ - ldr r0, [sp, 0x4]\n\ - bl sub_80C9838\n\ -_080C97F6:\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - adds r0, r7, r1\n\ - lsrs r4, r0, 16\n\ - lsls r2, r4, 16\n\ - asrs r1, r2, 16\n\ - mov r3, sp\n\ - movs r5, 0x2\n\ - ldrsh r0, [r3, r5]\n\ - adds r0, 0x5\n\ - cmp r1, r0\n\ - ble _080C9796\n\ -_080C980E:\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - add r1, r8\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - mov r0, sp\n\ - movs r6, 0\n\ - ldrsh r0, [r0, r6]\n\ - adds r0, 0x7\n\ - cmp r1, r0\n\ - ble _080C976E\n\ -_080C9824:\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080C9834: .4byte gMapHeader\n\ - .syntax divided"); -} -#endif - -void sub_80C9838(u8 taskId, s16 x, s16 y) -{ - s16 *data = gTasks[taskId].data; - s16 var1, var2, var3, var4; - - if(data[2] == FALSE) - { - data[0] = x; - data[1] = y; - data[2] = TRUE; - } - else - { - // data[0] and data[1] contain the player's coordinates. - // x and y contain the item's coordinates. - if(data[0] < 0) - var1 = data[0] * -1; // item is to the left - else - var1 = data[0]; // item is to the right - - if(data[1] < 0) - var2 = data[1] * -1; // item is to the north - else - var2 = data[1]; // item is to the south - - if(x < 0) - var3 = x * -1; - else - var3 = x; - - if(y < 0) - var4 = y * -1; - else - var4 = y; - - if(var1 + var2 > var3 + var4) - { - data[0] = x; - data[1] = y; - } - else - { - if(var1 + var2 == var3 + var4 && (var2 > var4 || (var2 == var4 && data[1] < y))) - { - data[0] = x; - data[1] = y; - } - } - } -} - -u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY) -{ - s16 abX, abY; - - if(itemX == 0 && itemY == 0) - return DIR_NONE; // player is standing on the item. - - // get absolute X distance. - if(itemX < 0) - abX = itemX * -1; - else - abX = itemX; - - // get absolute Y distance. - if(itemY < 0) - abY = itemY * -1; - else - abY = itemY; - - if(abX > abY) - { - if(itemX < 0) - return DIR_EAST; - else - return DIR_NORTH; - } - else - { - if(abX < abY) - { - if(itemY < 0) - return DIR_SOUTH; - else - return DIR_WEST; - } - if(abX == abY) - { - if(itemY < 0) - return DIR_SOUTH; - else - return DIR_WEST; - } - return DIR_NONE; // should never get here. return something so it doesnt crash. - } -} - -void SetPlayerDirectionTowardsItem(u8 direction) -{ - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - FieldObjectClearAnim(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - UnfreezeMapObject(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - PlayerTurnInPlace(direction); -} - -void DisplayItemRespondingMessageAndExitItemfinder(u8 taskId) -{ - if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE) - DisplayItemMessageOnField(taskId, gOtherText_ItemfinderResponding, ExitItemfinder, 0); -} - -void RotatePlayerAndExitItemfinder(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE - || data[2] == FALSE) - { - SetPlayerDirectionTowardsItem(gItemFinderDirections[data[5]]); - data[2] = 1; - data[5] = (data[5] + 1) & 3; - data[3]++; - - if(data[3] == 4) - DisplayItemMessageOnField(taskId, gOtherText_ItemfinderItemUnderfoot, ExitItemfinder, 0); - } -} - -void ItemUseOutOfBattle_PokeblockCase(u8 taskId) -{ - if(sub_80F9344() == TRUE) - { - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } - else if(gTasks[taskId].data[2] != TRUE) - { - sub_810BA7C(0); - ItemMenu_ConfirmNormalFade(taskId); - } - else - { - gFieldCallback = (void *)sub_8080E28; - sub_810BA7C(1); - ItemMenu_ConfirmComplexFade(taskId); - } -} - -void ItemUseOutOfBattle_CoinCase(u8 taskId) -{ - ConvertIntToDecimalStringN(gStringVar1, GetCoins(), 0, 4); - StringExpandPlaceholders(gStringVar4, gOtherText_Coins3); - - if(!gTasks[taskId].data[2]) - { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); - } - else - { - DisplayItemMessageOnField(taskId, gStringVar4, CleanUpOverworldMessage, 0); - } -} - -void sub_80C9BB8(u8 var) -{ - if(gMain.newKeys & A_BUTTON) - CleanUpItemMenuMessage(var); -} - -void sub_80C9BD8(u8 var) -{ - if(gMain.newKeys & A_BUTTON) - CleanUpOverworldMessage(var); -} - -// unused -void ItemUseOutOfBattle_SSTicket(u8 taskId) -{ - if(gTasks[taskId].data[2] == 0) - { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gScriptItemId)], sub_80C9BB8, 1); - } - else - { - DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gScriptItemId)], sub_80C9BD8, 0); - } -} - -void sub_80C9C7C(u8 taskId) -{ - if(IsPlayerFacingPlantedBerryTree() == TRUE) - { - gUnknown_03005D00 = sub_80C9D00; - gFieldCallback = ExecuteItemUseFromBlackPalette; - gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; - gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; - gTasks[taskId].func = HandleItemMenuPaletteFade; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - } - else - { - ItemId_GetFieldFunc(gScriptItemId)(taskId); - } -} - -void sub_80C9D00(u8 taskId) -{ - RemoveBagItem(gScriptItemId, 1); - ScriptContext2_Enable(); - ScriptContext1_SetupScript(gUnknown_081A1654); - DestroyTask(taskId); -} - -void ItemUseOutOfBattle_WailmerPail(u8 taskId) -{ - if(TryToWaterBerryTree() == TRUE) - { - gUnknown_03005D00 = sub_80C9D74; - SetUpItemUseOnFieldCallback(taskId); - } - else - { - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } -} - -void sub_80C9D74(u8 taskId) -{ - ScriptContext2_Enable(); - ScriptContext1_SetupScript(gUnknown_081A168F); - DestroyTask(taskId); -} - -void sub_80C9D98(u8 taskId) -{ - gUnknown_02038561 = 0; - ItemMenu_ConfirmNormalFade(taskId); -} - -void ItemUseOutOfBattle_Medicine(u8 taskId) -{ - gUnknown_03004AE4 = UseMedicine; - sub_80C9D98(taskId); -} - -void ItemUseOutOfBattle_SacredAsh(u8 taskId) -{ - u8 i; - - gLastFieldPokeMenuOpened = 0; - - for(i = 0; i < 6; i++) - { - if(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0 && GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) - { - gLastFieldPokeMenuOpened = i; - break; - } - } - gUnknown_03004AE4 = sub_8070048; - gUnknown_02038561 = 4; - ItemMenu_ConfirmNormalFade(taskId); -} - -void ItemUseOutOfBattle_PPRecovery(u8 taskId) -{ - gUnknown_03004AE4 = DoPPRecoveryItemEffect; - sub_80C9D98(taskId); -} - -void ItemUseOutOfBattle_PPUp(u8 taskId) -{ - gUnknown_03004AE4 = DoPPUpItemEffect; - sub_80C9D98(taskId); -} - -void ItemUseOutOfBattle_RareCandy(u8 taskId) -{ - gUnknown_03004AE4 = DoRareCandyItemEffect; - sub_80C9D98(taskId); -} - -void ItemUseOutOfBattle_TMHM(u8 taskId) -{ - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - - if(gScriptItemId >= ITEM_HM01) - DisplayItemMessageOnField(taskId, gOtherText_BootedHM, sub_80C9EE4, 1); // HM - else - DisplayItemMessageOnField(taskId, gOtherText_BootedTM, sub_80C9EE4, 1); // TM -} - -void sub_80C9EE4(u8 taskId) -{ - PlaySE(2); - gTasks[taskId].func = sub_80C9F10; -} - -void sub_80C9F10(u8 taskId) -{ - if(gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - { - StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gScriptItemId)]); - StringExpandPlaceholders(gStringVar4, gOtherText_ContainsMove); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80C9F80, 1); - } -} - -void sub_80C9F80(u8 var) -{ - DisplayYesNoMenu(7, 7, 1); - sub_80A3FA0(gBGTilemapBuffers[1], 8, 8, 5, 4, 1); - DoYesNoFuncWithChoice(var, &gUnknown_083D61F4); -} - -void sub_80C9FC0(u8 var) -{ - gUnknown_03004AE4 = TeachMonTMMove; - sub_80C9D98(var); -} - -void sub_80C9FDC(void) -{ - RemoveBagItem(gScriptItemId, 1); - sub_80A3E0C(); - CopyItemName(gScriptItemId, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_UsedItem); -} - -void ItemUseOutOfBattle_Repel(u8 var) -{ - if(VarGet(VAR_REPEL_STEP_COUNT) == FALSE) - { - VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gScriptItemId)); - sub_80C9FDC(); - DisplayItemMessageOnField(var, gStringVar4, CleanUpItemMenuMessage, 1); - } - else - { - DisplayItemMessageOnField(var, gOtherText_RepelLingers, CleanUpItemMenuMessage, 1); - } -} - -void sub_80CA07C(void) -{ - sub_80A3E0C(); - CopyItemName(gScriptItemId, gStringVar2); -} - -void sub_80CA098(u8 taskId) -{ - if(++gTasks[taskId].data[15] > 7) - { - PlaySE(0x75); - DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); - } -} - -void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId) -{ - if(gScriptItemId == 43) - { - FlagSet(SYS_ENC_UP_ITEM); - FlagReset(SYS_ENC_DOWN_ITEM); - sub_80CA07C(); - StringExpandPlaceholders(gStringVar4, gOtherText_UsedFlute); - gTasks[taskId].func = sub_80CA098; - gTasks[taskId].data[15] = 0; - } - else if(gScriptItemId == 42) - { - FlagSet(SYS_ENC_DOWN_ITEM); - FlagReset(SYS_ENC_UP_ITEM); - sub_80CA07C(); - StringExpandPlaceholders(gStringVar4, gOtherText_UsedRepel); - gTasks[taskId].func = sub_80CA098; - gTasks[taskId].data[15] = 0; - } -} - -void task08_080A1C44(u8 taskId) -{ - player_avatar_init_params_reset(); - sub_80878A8(); - DestroyTask(taskId); -} - -void sub_80CA18C(u8 taskId) -{ - sub_8053014(); - sub_80C9FDC(); - gTasks[taskId].data[0] = 0; - DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44, 0); -} - -bool8 sub_80CA1C8(void) -{ - if(gMapHeader.mapType == MAP_TYPE_UNDERGROUND) - return TRUE; - else - return FALSE; -} - -void ItemUseOutOfBattle_EscapeRope(u8 taskId) -{ - if(sub_80CA1C8() == TRUE) // is map type an area you can use escape rope? - { - gUnknown_03005D00 = sub_80CA18C; - SetUpItemUseOnFieldCallback(taskId); - } - else - { - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } -} - -void ItemUseOutOfBattle_EvolutionStone(u8 var) -{ - gUnknown_03004AE4 = DoEvolutionStoneItemEffect; - sub_80C9D98(var); -} - -void ItemUseInBattle_PokeBall(u8 var) -{ - if(PlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon? - { - RemoveBagItem(gScriptItemId, 1); - sub_80A7094(var); - } - else - { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - DisplayItemMessageOnField(var, gOtherText_BoxIsFull, CleanUpItemMenuMessage, 1); - } -} - -void sub_80CA294(u8 var) -{ - if(gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - sub_80A7094(var); -} - -void sub_80CA2BC(u8 taskId) -{ - if(++gTasks[taskId].data[15] > 7) - { - PlaySE(1); - RemoveBagItem(gScriptItemId, 1); - DisplayItemMessageOnField(taskId, sub_803F378(gScriptItemId), sub_80CA294, 1); - } -} - -void ItemUseInBattle_StatIncrease(u8 taskId) -{ - u16 partyId = gBattlePartyID[gBankInMenu]; - - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - - if(ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gScriptItemId, partyId, 0) != FALSE) - { - DisplayItemMessageOnField(taskId, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1); - } - else - { - gTasks[taskId].func = sub_80CA2BC; - gTasks[taskId].data[15] = 0; - } -} - -void sub_80CA394(u8 taskId) -{ - if(!gPaletteFade.active) - { - sub_8094E4C(); - gpu_pal_allocator_reset__manage_upper_four(); - DestroyTask(taskId); - } -} - -void sub_80CA3C0(u8 taskId) -{ - gTasks[taskId].func = sub_80CA394; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void ItemUseInBattle_Medicine(u8 var) -{ - gUnknown_03004AE4 = UseMedicine; - sub_80CA3C0(var); -} - -void unref_sub_80CA410(u8 var) -{ - gUnknown_03004AE4 = sub_8070048; - sub_80CA3C0(var); -} - -void ItemUseInBattle_PPRecovery(u8 var) -{ - gUnknown_03004AE4 = DoPPRecoveryItemEffect; - sub_80CA3C0(var); -} - -void unref_sub_80CA448(u8 var) -{ - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - - if(ExecuteTableBasedItemEffect__(0, gScriptItemId, 0) == FALSE) - { - RemoveBagItem(gScriptItemId, 1); - GetMonNickname(&gPlayerParty[0], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); - DisplayItemMessageOnField(var, gStringVar4, sub_80A7094, 1); - } - else - { - DisplayItemMessageOnField(var, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1); - } -} - -void ItemUseInBattle_Escape(u8 taskId) -{ - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - - if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE) - { - sub_80C9FDC(); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80A7094, 1); - } - else - { - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } -} - -void ItemUseOutOfBattle_EnigmaBerry(u8 taskId) -{ - switch(GetItemEffectType(gScriptItemId) - 1) - { - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 16: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_Medicine(taskId); - break; - case 9: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_SacredAsh(taskId); - break; - case 0: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_RareCandy(taskId); - break; - case 18: - case 19: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_PPUp(taskId); - break; - case 20: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_PPRecovery(taskId); - break; - default: - gTasks[taskId].data[15] = 4; - ItemUseOutOfBattle_CannotUse(taskId); - } -} - -void ItemUseInBattle_EnigmaBerry(u8 taskId) -{ - switch(GetItemEffectType(gScriptItemId)) - { - case 0: - ItemUseInBattle_StatIncrease(taskId); - break; - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 11: - ItemUseInBattle_Medicine(taskId); - break; - case 21: - ItemUseInBattle_PPRecovery(taskId); - break; - default: - ItemUseOutOfBattle_CannotUse(taskId); - } -} - -void ItemUseOutOfBattle_CannotUse(u8 taskId) -{ - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); -} diff --git a/src/landmark.c b/src/landmark.c deleted file mode 100644 index 6a53716bb..000000000 --- a/src/landmark.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "global.h" -#include "landmark.h" -#include "event_data.h" - -#define MAPSEC_NONE 0x58 - -struct Landmark -{ - u8 *name; - u16 flag; -}; - -struct LandmarkList -{ - u8 mapSection; - u8 id; - const struct Landmark **landmarks; -}; - -extern const struct LandmarkList gLandmarkLists[]; - -static const struct Landmark **GetLandmarks(u8 mapSection, u8 id); - -u8 *GetLandmarkName(u8 mapSection, u8 id, u8 count) -{ - const struct Landmark **landmarks = GetLandmarks(mapSection, id); - - if (!landmarks) - return NULL; - - while (1) - { - const struct Landmark *landmark = *landmarks; - - if (landmark->flag == 0xFFFF || FlagGet(landmark->flag) == TRUE) - { - if (count == 0) - break; - else - count--; - } - - landmarks++; - if (!*landmarks) - return NULL; - } - - return (*landmarks)->name; -} - -static const struct Landmark **GetLandmarks(u8 mapSection, u8 id) -{ - u16 i = 0; - - for (; gLandmarkLists[i].mapSection != MAPSEC_NONE; i++) - { - if (gLandmarkLists[i].mapSection > mapSection) - return NULL; - if (gLandmarkLists[i].mapSection == mapSection) - break; - } - - if (gLandmarkLists[i].mapSection == MAPSEC_NONE) - return NULL; - - for (; gLandmarkLists[i].mapSection == mapSection; i++) - { - if (gLandmarkLists[i].id == id) - return gLandmarkLists[i].landmarks; - } - - return NULL; -} diff --git a/src/libc.c b/src/libc.c deleted file mode 100644 index 920673e3e..000000000 --- a/src/libc.c +++ /dev/null @@ -1,143 +0,0 @@ -#include "global.h" -#include - -#define LBLOCKSIZE (sizeof(long)) - -// Nonzero if (long)X contains a NULL byte. -#define CONTAINSNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) - -// Nonzero if X is not aligned on a "long" boundary. -#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1)) - -void *memcpy(void *dst0, const void *src0, size_t len0) -{ - char *dst = dst0; - const char *src = src0; - long *aligned_dst; - const long *aligned_src; - unsigned int len = len0; - - // If the size is small, or either src or dst is unaligned, - // then go to the byte copy loop. This should be rare. - if (len >= 16 && !(UNALIGNED(src) | UNALIGNED(dst))) - { - aligned_dst = (long *)dst; - aligned_src = (long *)src; - - // Copy 4X long words at a time if possible. - while (len >= 16) - { - *aligned_dst++ = *aligned_src++; - *aligned_dst++ = *aligned_src++; - *aligned_dst++ = *aligned_src++; - *aligned_dst++ = *aligned_src++; - len -= 16; - } - - // Copy one long word at a time if possible - while (len >= 4) - { - *aligned_dst++ = *aligned_src++; - len -= 4; - } - - dst = (char *)aligned_dst; - src = (char *)aligned_src; - } - - // Pick up any remaining bytes with a byte copier. - while (len--) - *dst++ = *src++; - - return dst0; -} - -void *memset(void *m, int c, size_t n) -{ - char *s = (char *)m; - int count, i; - unsigned long buffer; - unsigned long *aligned_addr; - unsigned char *unaligned_addr; - - // If the size is small or m is unaligned, - // then go to the byte copy loop. This should be rare. - if (n >= LBLOCKSIZE && !UNALIGNED(m)) - { - // We know that n is large and m is word-aligned. - aligned_addr = (unsigned long *)m; - - // Store C into each char sized location in buffer so that - // we can set large blocks quickly. - c &= 0xFF; - if (LBLOCKSIZE == 4) - { - buffer = (c << 8) | c; - buffer |= (buffer << 16); - } - else - { - buffer = 0; - for (i = 0; i < LBLOCKSIZE; i++) - buffer = (buffer << 8) | c; - } - - while (n >= LBLOCKSIZE * 4) - { - *aligned_addr++ = buffer; - *aligned_addr++ = buffer; - *aligned_addr++ = buffer; - *aligned_addr++ = buffer; - n -= LBLOCKSIZE * 4; - } - while (n >= LBLOCKSIZE) - { - *aligned_addr++ = buffer; - n -= LBLOCKSIZE; - } - - s = (char *)aligned_addr; - } - - // Pick up the remainder with a bytewise loop. - while (n--) - *s++ = (char)c; - - return m; -} - -int strcmp(const char *s1, const char *s2) -{ - unsigned long *a1; - unsigned long *a2; - - // If s1 or s2 are unaligned, then skip this and compare bytes. - if (!(UNALIGNED(s1) | UNALIGNED(s2))) - { - // Compare them a word at a time. - a1 = (unsigned long *)s1; - a2 = (unsigned long *)s2; - while (*a1 == *a2) - { - // If *a1 == *a2, and we find a null in *a1, - // then the strings must be equal, so return zero. - if (CONTAINSNULL(*a1)) - return 0; - - a1++; - a2++; - } - - s1 = (char *)a1; - s2 = (char *)a2; - } - - // Check the remaining few bytes. - while (*s1 != '\0' && *s1 == *s2) - { - s1++; - s2++; - } - - return (*(unsigned char *) s1) - (*(unsigned char *) s2); -} diff --git a/src/link.c b/src/link.c deleted file mode 100644 index 5858ad8bf..000000000 --- a/src/link.c +++ /dev/null @@ -1,1820 +0,0 @@ -#include "global.h" -#include "link.h" -#include "battle.h" -#include "berry.h" -#include "berry_blender.h" -#include "hall_of_fame.h" -#include "item_use.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "rng.h" -#include "save.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "strings2.h" -#include "task.h" -#include "text.h" - -#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT) - -struct BlockTransfer -{ - u16 pos; - u16 size; - void *src; - bool8 active; - u8 multiplayerId; -}; - -struct LinkTestBGInfo -{ - u32 screenBaseBlock; - u32 paletteNum; - u32 dummy_8; - u32 dummy_C; -}; - -extern u8 unk_2000000[]; -extern u8 unk_2004000[]; -extern u16 gBattleTypeFlags; - -extern u16 word_3004858; - -static void InitLinkTestBG(u8, u8, u8, u8); -void InitLinkTestBG_Unused(u8, u8, u8, u8); -void LinkTestScreen(); -static void InitLocalLinkPlayer(void); -static void VBlankCB_LinkTest(void); -static void InitLink(void); -static void Task_TriggerHandshake(u8); -static void TestBlockTransfer(u32, u32, u32); -static void LinkTestProcessKeyInput(void); -static void CB2_LinkTest(void); -static void HandleReceiveRemoteLinkPlayer(u8); -static void ProcessRecvCmds(u8); -static void BuildSendCmd(u16); -static void sub_8007B44(void); -static void ResetBlockSend(void); -static bool8 InitBlockSend(void *, u32); -static void LinkCB_BlockSendBegin(void); -static void LinkCB_BlockSend(void); -static void LinkCB_BlockSendEnd(void); -static void sub_8007E04(void); -u32 sub_8007E40(void); -static void SetBlockReceivedFlag(u8); -static u16 LinkTestCalcBlockChecksum(void *, u16); -static void PrintHexDigit(u8, u8, u8); -static void PrintHex(u32, u8, u8, u8); -static void LinkCB_RequestPlayerDataExchange(void); -static void Task_PrintTestData(u8); -bool8 sub_8008224(void); -u8 GetDummy2(void); -static void sub_8008350(void); -static void sub_800837C(void); -static void sub_80083E0(void); -static void sub_8008454(void); -static void sub_80084C8(void); -static void sub_80084F4(void); - -static void CheckErrorStatus(void); -static void CB2_PrintErrorMessage(void); -static u8 IsSioMultiMaster(void); -static void DisableSerial(void); -static void EnableSerial(void); -static void CheckMasterOrSlave(void); -static void InitTimer(void); -static void EnqueueSendCmd(u16 *); -static void DequeueRecvCmds(u16[CMD_LENGTH][MAX_LINK_PLAYERS]); -static void StartTransfer(void); -static bool8 DoHandshake(void); -static void DoRecv(void); -static void DoSend(void); -static void StopTimer(void); -static void SendRecvDone(void); -void ResetSendBuffer(void); -void ResetRecvBuffer(void); - -static struct BlockTransfer sBlockSend; -static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS]; -static u32 sBlockSendDelayCounter; -static u32 sDummy1; -static u8 sDummy2; -static u32 sPlayerDataExchangeStatus; -static u32 sErrorLinkStatus; -static u32 sErrorLastRecvQueueCount; -static u32 sErrorLastSendQueueCount; -static u32 sDummy3; -static u8 sLinkTestLastBlockSendPos; -static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS]; -static u8 sNumVBlanksWithoutSerialIntr; -static bool8 sSendBufferEmpty; -static u16 sSendNonzeroCheck; -static u16 sRecvNonzeroCheck; -static u8 sChecksumAvailable; -static u8 sHandshakePlayerCount; - -u16 word_3002910[MAX_LINK_PLAYERS]; -u32 gLinkDebugValue1; -struct LinkPlayerBlock localLinkPlayerBlock; -bool8 gLinkErrorOccurred; -u32 gLinkDebugValue2; -bool8 gLinkPlayerPending[MAX_LINK_PLAYERS]; -struct LinkPlayer gLinkPlayers[MAX_LINK_PLAYERS]; -bool8 gBlockReceived[MAX_LINK_PLAYERS]; -u16 gLinkHeldKeys; -u16 gLinkTimeOutCounter; -struct LinkPlayer localLinkPlayer; -u16 gRecvCmds[CMD_LENGTH][MAX_LINK_PLAYERS]; -u32 gLinkStatus; -bool8 gLinkDummyBool; -u8 byte_3002A68; -u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE]; -bool8 u8_array_3002B70[MAX_LINK_PLAYERS]; -u16 gLinkType; -bool8 u8_array_3002B78[MAX_LINK_PLAYERS]; -u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2]; -bool8 gSuppressLinkErrorMessage; -u8 gSavedLinkPlayerCount; -u16 gSendCmd[CMD_LENGTH]; -u8 gSavedMultiplayerId; -bool8 gReceivedRemoteLinkPlayers; -struct LinkTestBGInfo gLinkTestBGInfo; -void (*gLinkCallback)(void); -struct LinkPlayer gSavedLinkPlayers[MAX_LINK_PLAYERS]; -u8 gShouldAdvanceLinkState; -u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; -u8 gBlockRequestType; -u8 gLastSendQueueCount; -struct Link gLink; -u8 gLastRecvQueueCount; -u16 gLinkSavedIme; - -#ifdef GERMAN -u8 deUnkValue1; -u8 deUnkValue2; -#endif - -EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = {0}; -EWRAM_DATA bool8 gLinkTestDummyBool = {0}; -EWRAM_DATA u32 gFiller_20238B8 = {0}; -EWRAM_DATA u32 dword_20238BC = {0}; -EWRAM_DATA bool8 gLinkOpen = {0}; - -static const u16 sLinkTestDigitPalette[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal"); -static const u32 sLinkTestDigitTiles[] = INCBIN_U32("graphics/interface/link_test_digits.4bpp"); - -static const u8 sDebugMessages[7][12] = -{ - _("せつぞく ちゅうです"), - _("せつぞく できません"), - _("かくにん ちゅうです"), - _("かくにん できました"), - _("かくにん できません"), - _("かくにん を かくにん"), - _("かくにん は しっぱい"), -}; - -static const u8 sColorCodes[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE2}"); - -const struct BlockRequest sBlockRequestLookupTable[5] = -{ - {gBlockSendBuffer, 200}, - {gBlockSendBuffer, 200}, - {gBlockSendBuffer, 100}, - {gBlockSendBuffer, 220}, - {gBlockSendBuffer, 40}, -}; - -static const u8 sTestString[] = _("テストな"); - -ALIGNED(4) static const u8 sMagic[] = "GameFreak inc."; - -ALIGNED(4) static const u8 sEmptyString[] = _(""); - -void Task_DestroySelf(u8 taskId) -{ - DestroyTask(taskId); -} - -static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) -{ - LoadPalette(sLinkTestDigitPalette, 16 * paletteNum, 32); - DmaCopy16(3, sLinkTestDigitTiles, BG_CHAR_ADDR(charBaseBlock), 0x220); - - gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; - gLinkTestBGInfo.paletteNum = paletteNum; - - switch (bgNum) - { - case 1: - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock); - break; - case 2: - REG_BG2CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock); - break; - case 3: - REG_BG3CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock); - break; - } -} - -void InitLinkTestBG_Unused(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) -{ - LoadPalette(sLinkTestDigitPalette, 16 * paletteNum, 32); - DmaCopy16(3, sLinkTestDigitTiles, BG_CHAR_ADDR(charBaseBlock), 0x220); - - gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; - gLinkTestBGInfo.paletteNum = paletteNum; - - *gBGControlRegs[bgNum] = (screenBaseBlock << 8) | (charBaseBlock << 2); -} - -void LinkTestScreen(void) -{ - s32 i; - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); - SetVBlankCallback(VBlankCB_LinkTest); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E6CE4); - ResetBlockSend(); - gLinkType = 0x1111; - OpenLink(); - SeedRng(gMain.vblankCounter1); - - for (i = 0; i < 4; i++) - { - // Very weird code, but nothing else seems to match. - // The following would have the same effect: - // gSaveBlock2.playerTrainerId[i] = Random(); - u8 *trainerId = gSaveBlock2.playerTrainerId; - s32 r; - s32 mask = 0xFF; - trainerId[i] = (r = Random()) & mask; - } - - InitLinkTestBG(0, 2, 4, 0); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_1D_MAP; - CreateTask(Task_DestroySelf, 0); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - sDummy3 = 0; - InitLocalLinkPlayer(); - CreateTask(Task_PrintTestData, 0); - SetMainCallback2(CB2_LinkTest); -} - -void sub_8007270(u8 a1) -{ - localLinkPlayer.lp_field_18 = a1; -} - -static void InitLocalLinkPlayer(void) -{ - s32 i; - - localLinkPlayer.trainerId = gSaveBlock2.playerTrainerId[0] - | (gSaveBlock2.playerTrainerId[1] << 8) - | (gSaveBlock2.playerTrainerId[2] << 16) - | (gSaveBlock2.playerTrainerId[3] << 24); - - for (i = 0; i < (s32)sizeof(localLinkPlayer.name); i++) - localLinkPlayer.name[i] = gSaveBlock2.playerName[i]; // UB: reads past the end of "playerName" array - - localLinkPlayer.gender = gSaveBlock2.playerGender; - localLinkPlayer.linkType = gLinkType; - localLinkPlayer.language = gGameLanguage; - localLinkPlayer.version = gGameVersion + 0x4000; - localLinkPlayer.lp_field_2 = 0; -} - -static void VBlankCB_LinkTest(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void InitLink(void) -{ - s32 i; - - for (i = 0; i < CMD_LENGTH; i++) - gSendCmd[i] = 0xEFFF; - - gLinkOpen = TRUE; - EnableSerial(); -} - -static void Task_TriggerHandshake(u8 taskId) -{ - gTasks[taskId].data[0]++; - - if (gTasks[taskId].data[0] == 5) - { - gShouldAdvanceLinkState = 1; - DestroyTask(taskId); - } -} - -void OpenLink(void) -{ - s32 i; - - ResetSerial(); - InitLink(); - - gLinkCallback = LinkCB_RequestPlayerDataExchange; - gLinkVSyncDisabled = FALSE; - gLinkErrorOccurred = FALSE; - gSuppressLinkErrorMessage = FALSE; - - ResetBlockReceivedFlags(); - - sDummy1 = 0; - byte_3002A68 = 0; - gLinkDummyBool = FALSE; - gReceivedRemoteLinkPlayers = FALSE; - - for (i = 0; i < 4; i++) - { - gLinkPlayerPending[i] = TRUE; - u8_array_3002B78[i] = 0; - u8_array_3002B70[i] = 0; - } - - CreateTask(Task_TriggerHandshake, 2); -} - -void CloseLink(void) -{ - gReceivedRemoteLinkPlayers = FALSE; - gLinkOpen = FALSE; - DisableSerial(); -} - -static void TestBlockTransfer(u32 a1, u32 a2, u32 a3) -{ - u8 i; - u8 val; - - if (sLinkTestLastBlockSendPos != sBlockSend.pos) - { - PrintHex(sBlockSend.pos, 2, 3, 2); - sLinkTestLastBlockSendPos = sBlockSend.pos; - } - - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos) - { - PrintHex(sBlockRecv[i].pos, 2, i + 4, 2); - sLinkTestLastBlockRecvPos[i] = sBlockRecv[i].pos; - } - } - - val = GetBlockReceivedStatus(); - - if (val == 0xF) - { - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - if ((val >> i) & 1) - { - gLinkTestBlockChecksums[i] = LinkTestCalcBlockChecksum(&gBlockRecvBuffer[i], sBlockRecv[i].size); - ResetBlockReceivedFlag(i); - if (gLinkTestBlockChecksums[i] != 834) - { - gLinkTestDebugValuesEnabled = FALSE; - gLinkTestDummyBool = FALSE; - } - } - } - } -} - -static void LinkTestProcessKeyInput(void) -{ - if (gMain.newKeys & A_BUTTON) - gShouldAdvanceLinkState = 1; - if (gMain.heldKeys & B_BUTTON) - InitBlockSend(unk_2004000, 0x2004); - if (gMain.newKeys & L_BUTTON) - BeginNormalPaletteFade(-1, 0, 0x10, 0, 2); - if (gMain.newKeys & START_BUTTON) - SetSuppressLinkErrorMessage(TRUE); - if (gMain.newKeys & R_BUTTON) - TrySavingData(LINK_SAVE); - if (gMain.newKeys & SELECT_BUTTON) - sub_800832C(); - if (gLinkTestDebugValuesEnabled) - { - u32 vblankCounter1 = gMain.vblankCounter1; - u8 val = gLinkVSyncDisabled; - if (!gLinkCallback) - val = gLinkVSyncDisabled | 0x10; - SetLinkDebugValues(vblankCounter1, val); - } -} - -static void CB2_LinkTest(void) -{ - LinkTestProcessKeyInput(); - TestBlockTransfer(1, 1, 0); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -u16 LinkMain2(u16 *heldKeys) -{ - u8 i; - - if (!gLinkOpen) - return 0; - - for (i = 0; i < CMD_LENGTH; i++) - gSendCmd[i] = 0; - - gLinkHeldKeys = *heldKeys; - - if (gLinkStatus & LINK_STAT_CONN_ESTABLISHED) - { - ProcessRecvCmds(SIO_MULTI_CNT->id); - if (gLinkCallback) - gLinkCallback(); - CheckErrorStatus(); - } - - return gLinkStatus; -} - -static void HandleReceiveRemoteLinkPlayer(u8 multiplayerId) -{ - u32 pendingLinkPlayerCount = 0; - s32 i; - - gLinkPlayerPending[multiplayerId] = FALSE; - - for (i = 0; i < GetLinkPlayerCount_2(); i++) - pendingLinkPlayerCount += gLinkPlayerPending[i]; - - if (pendingLinkPlayerCount == 0 && !gReceivedRemoteLinkPlayers) - gReceivedRemoteLinkPlayers = TRUE; -} - -static void ProcessRecvCmds(u8 unusedParam) -{ - u16 i; - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - word_3002910[i] = 0; - if (!gRecvCmds[0][i]) - continue; - switch (gRecvCmds[0][i]) - { - case 0x2222: - InitLocalLinkPlayer(); - localLinkPlayerBlock.linkPlayer = localLinkPlayer; - memcpy(localLinkPlayerBlock.magic1, sMagic, sizeof(localLinkPlayerBlock.magic1) - 1); - memcpy(localLinkPlayerBlock.magic2, sMagic, sizeof(localLinkPlayerBlock.magic2) - 1); - InitBlockSend(&localLinkPlayerBlock, sizeof(localLinkPlayerBlock)); - break; - case 0x4444: - word_3002910[i] = gRecvCmds[1][i]; - break; - case 0x5555: - byte_3002A68 = 1; - break; - case 0x5566: - byte_3002A68 = 1; - break; - case 0xBBBB: - { - struct BlockTransfer *blockRecv = &sBlockRecv[i]; - blockRecv->pos = 0; - blockRecv->size = gRecvCmds[1][i]; - blockRecv->multiplayerId = gRecvCmds[2][i]; - break; - } - case 0x8888: - if (sBlockRecv[i].size > BLOCK_BUFFER_SIZE) - { - u16 *buffer = (u16 *)unk_2000000; - u16 j; - for (j = 0; j < CMD_LENGTH - 1; j++) - buffer[(sBlockRecv[i].pos / 2) + j] = gRecvCmds[j + 1][i]; - } - else - { - u16 j; - for (j = 0; j < CMD_LENGTH - 1; j++) - gBlockRecvBuffer[i][(sBlockRecv[i].pos / 2) + j] = gRecvCmds[j + 1][i]; - } - - sBlockRecv[i].pos += (CMD_LENGTH - 1) * 2; - - if (sBlockRecv[i].pos >= sBlockRecv[i].size) - { - if (gLinkPlayerPending[i] == TRUE) - { - struct LinkPlayerBlock *block = (struct LinkPlayerBlock *)&gBlockRecvBuffer[i]; - struct LinkPlayer *linkPlayer = &gLinkPlayers[i]; - *linkPlayer = block->linkPlayer; - - if (strcmp(block->magic1, sMagic) - || strcmp(block->magic2, sMagic)) - { - SetMainCallback2(CB2_LinkError); - } - else - { - HandleReceiveRemoteLinkPlayer(i); - } - - ConvertInternationalString(gLinkPlayers[i].name, gLinkPlayers[i].language); - } - else - { - SetBlockReceivedFlag(i); - } - } - break; - case 0x5FFF: - u8_array_3002B78[i] = 1; - break; - case 0x2FFE: - u8_array_3002B70[i] = 1; - break; - case 0xAAAA: - sub_8007E24(); - break; - case 0xAAAB: - sub_80516C4(i, gRecvCmds[1][i]); - break; - case 0xCCCC: -#if defined(ENGLISH) - SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); -#elif defined(GERMAN) - if (deUnkValue2 == 1) - { - deUnkValue2 = 2; - deUnkValue1 = gRecvCmds[1][i]; - } - else if (deUnkValue2 == 2 || deUnkValue2 == 3) - { - SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); - - if (deUnkValue2 == 2) - deUnkValue2 = 1; - else - deUnkValue2 = 0; - } - else - { - SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); - } -#endif - break; - case 0xCAFE: - word_3002910[i] = gRecvCmds[1][i]; - break; - } - } -} - -static void BuildSendCmd(u16 code) -{ - switch (code) - { - case 0x2222: - gSendCmd[0] = 0x2222; - gSendCmd[1] = gLinkType; - break; - case 0x2FFE: - gSendCmd[0] = 0x2FFE; - break; - case 0x4444: - gSendCmd[0] = 0x4444; - gSendCmd[1] = gMain.heldKeys; - break; - case 0x5555: - gSendCmd[0] = 0x5555; - break; - case 0x5566: - gSendCmd[0] = 0x5566; - break; - case 0x6666: - gSendCmd[0] = 0x6666; - gSendCmd[1] = 0; - break; - case 0x7777: - { - u8 i; - - gSendCmd[0] = 0x7777; - - for (i = 0; i < 5; i++) - gSendCmd[i + 1] = 0xEE; - - break; - } - case 0xBBBB: - gSendCmd[0] = 0xBBBB; - gSendCmd[1] = sBlockSend.size; - gSendCmd[2] = sBlockSend.multiplayerId + 128; - break; - case 0xAAAA: - gSendCmd[0] = 0xAAAA; - break; - case 0xAAAB: - gSendCmd[0] = 0xAAAB; - gSendCmd[1] = gScriptItemId; - break; - case 0xCCCC: - gSendCmd[0] = 0xCCCC; - gSendCmd[1] = gBlockRequestType; - break; - case 0x5FFF: - gSendCmd[0] = 0x5FFF; - break; - case 0xCAFE: - if (!word_3004858 || gLinkTransferringData) - break; - gSendCmd[0] = 0xCAFE; - gSendCmd[1] = word_3004858; - break; - } -} - -void sub_8007B14(void) -{ - gLinkCallback = sub_8007B44; -} - -bool32 sub_8007B24(void) -{ - if (gLinkCallback == sub_8007B44) - return TRUE; - else - return FALSE; -} - -static void sub_8007B44(void) -{ - if (gReceivedRemoteLinkPlayers == TRUE) - BuildSendCmd(0xCAFE); -} - -void ClearLinkCallback(void) -{ - gLinkCallback = NULL; -} - -void ClearLinkCallback_2(void) -{ - gLinkCallback = NULL; -} - -u8 GetLinkPlayerCount(void) -{ - return EXTRACT_PLAYER_COUNT(gLinkStatus); -} - -void OpenLinkTimed(void) -{ - sPlayerDataExchangeStatus = EXCHANGE_NOT_STARTED; - gLinkTimeOutCounter = 0; -#if defined(GERMAN) - ResetBlockSend(); -#endif - OpenLink(); -} - -u8 GetLinkPlayerDataExchangeStatusTimed(void) -{ - s32 i; - s32 count = 0; - u32 index; - - if (gReceivedRemoteLinkPlayers == TRUE) - { - if (GetLinkPlayerCount() == 0) - { - gLinkErrorOccurred = TRUE; - CloseLink(); - } - - i = 0; - index = 0; - - while (i < GetLinkPlayerCount()) - { - if (gLinkPlayers[index].linkType == gLinkPlayers[0].linkType) - ++count; - ++index; - ++i; - } - - if (count == GetLinkPlayerCount()) - sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; - else - sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; - } - else - { - gLinkTimeOutCounter++; - if (gLinkTimeOutCounter > 600) - sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT; - } - - return sPlayerDataExchangeStatus; -} - -bool8 IsLinkPlayerDataExchangeComplete(void) -{ - u8 i; - u8 count = 0; - u8 isComplete; - - for (i = 0; i < GetLinkPlayerCount(); i++) - if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType) - count++; - - if (count == GetLinkPlayerCount()) - { - isComplete = TRUE; - sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; - } - else - { - isComplete = FALSE; - sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; - } - - return isComplete; -} - -u32 GetLinkPlayerTrainerId(u8 multiplayerId) -{ - return gLinkPlayers[multiplayerId].trainerId; -} - -void ResetLinkPlayers(void) -{ - s32 i; - for (i = 0; i < 4; i++) - memset(&gLinkPlayers[i], 0, sizeof(struct LinkPlayer)); -} - -static void ResetBlockSend(void) -{ - sBlockSend.active = FALSE; - sBlockSend.pos = 0; - sBlockSend.size = 0; - sBlockSend.src = NULL; -} - -static bool8 InitBlockSend(void *data, u32 size) -{ - if (sBlockSend.active) - { - return FALSE; - } - else - { - sBlockSend.multiplayerId = GetMultiplayerId(); - sBlockSend.active = TRUE; - sBlockSend.size = size; - sBlockSend.pos = 0; - - if (size > BLOCK_BUFFER_SIZE) - { - sBlockSend.src = data; - } - else - { - if (data != gBlockSendBuffer) - memcpy(gBlockSendBuffer, data, size); - sBlockSend.src = gBlockSendBuffer; - } - - BuildSendCmd(0xBBBB); - gLinkCallback = LinkCB_BlockSendBegin; - sBlockSendDelayCounter = 0; - return TRUE; - } -} - -static void LinkCB_BlockSendBegin(void) -{ - sBlockSendDelayCounter++; - if (sBlockSendDelayCounter > 2) - gLinkCallback = LinkCB_BlockSend; -} - -static void LinkCB_BlockSend(void) -{ - s32 i; - u8 *buffer = sBlockSend.src; - - gSendCmd[0] = 0x8888; - - for (i = 0; i < CMD_LENGTH - 1; i++) - { - s32 offset = sBlockSend.pos + 2 * i; - gSendCmd[i + 1] = (buffer[offset + 1] << 8) | buffer[offset]; - } - - sBlockSend.pos += (CMD_LENGTH - 1) * 2; - - if (sBlockSend.size <= sBlockSend.pos) - { - sBlockSend.active = FALSE; - gLinkCallback = LinkCB_BlockSendEnd; - } -} - -static void LinkCB_BlockSendEnd(void) -{ - gLinkCallback = NULL; -} - -static void sub_8007E04(void) -{ - GetMultiplayerId(); // whats the point of calling this if you dont use the multiplayer ID? - BuildSendCmd(0x4444); - dword_20238BC++; -} - -void sub_8007E24(void) -{ - dword_20238BC = 0; - gLinkCallback = sub_8007E04; -} - -u32 sub_8007E40(void) -{ - return dword_20238BC; -} - -void sub_8007E4C(void) -{ - BuildSendCmd(0xAAAA); -} - -u8 GetMultiplayerId(void) -{ - return SIO_MULTI_CNT->id; -} - -u8 bitmask_all_link_players_but_self(void) -{ - return ((1 << GetMultiplayerId()) ^ 0xF); -} - -bool8 SendBlock(u8 a1, void *a2, u16 a3) -{ - return InitBlockSend(a2, a3); -} - -bool8 sub_8007E9C(u8 a1) -{ - if (!gLinkCallback) - { - gBlockRequestType = a1; - BuildSendCmd(0xCCCC); - return TRUE; - } - else - { - return FALSE; - } -} - -bool8 sub_8007ECC(void) -{ - u8 retVal = FALSE; - - if (!gLinkCallback) - retVal = TRUE; - - return retVal; -} - -u8 GetBlockReceivedStatus(void) -{ - return (gBlockReceived[3] << 3) - | (gBlockReceived[2] << 2) - | (gBlockReceived[1] << 1) - | gBlockReceived[0]; -} - -static void SetBlockReceivedFlag(u8 multiplayerId) -{ - gBlockReceived[multiplayerId] = TRUE; -} - -void ResetBlockReceivedFlags(void) -{ - s32 i; - for (i = 0; i < 4; i++) - gBlockReceived[i] = FALSE; -} - -void ResetBlockReceivedFlag(u8 multiplayerId) -{ - if (gBlockReceived[multiplayerId]) - gBlockReceived[multiplayerId] = FALSE; -} - -void sub_8007F4C(void) -{ - if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1) - gShouldAdvanceLinkState = 1; -} - -static u16 LinkTestCalcBlockChecksum(void *data, u16 size) -{ - u16 sum = 0; - u16 i; - - for (i = 0; i < size / 2; i++) - sum += ((u16 *)data)[i]; - - return sum; -} - -static void PrintHexDigit(u8 tileNum, u8 x, u8 y) -{ - u16 *tilemap = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock); - tilemap[(32 * y) + x] = (gLinkTestBGInfo.paletteNum << 12) | (tileNum + 1); -} - -static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) -{ - u8 buffer[16]; - s32 i; - - for (i = 0; i < maxDigits; i++) - { - buffer[i] = num & 0xF; - num >>= 4; - } - - for (i = maxDigits - 1; i >= 0; i--) - { - PrintHexDigit(buffer[i], x, y); - x++; - } -} - -static void LinkCB_RequestPlayerDataExchange(void) -{ - // Only one request needs to be sent, so only the master sends it. - if (gLinkStatus & LINK_STAT_MASTER) - BuildSendCmd(0x2222); - gLinkCallback = NULL; -} - -void Task_PrintTestData(u8 taskId) -{ - s32 i; - - PrintHex(gShouldAdvanceLinkState, 2, 1, 2); - PrintHex(gLinkStatus, 15, 1, 8); - PrintHex(gLink.state, 2, 10, 2); - PrintHex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2); - PrintHex(GetMultiplayerId(), 15, 12, 2); - PrintHex(gLastSendQueueCount, 25, 1, 2); - PrintHex(gLastRecvQueueCount, 25, 2, 2); - PrintHex(GetBlockReceivedStatus(), 15, 5, 2); - PrintHex(gLinkDebugValue1, 2, 12, 8); - PrintHex(gLinkDebugValue2, 2, 13, 8); - PrintHex(GetSioMultiSI(), 25, 5, 1); - PrintHex(IsSioMultiMaster(), 25, 6, 1); - PrintHex(IsLinkConnectionEstablished(), 25, 7, 1); - PrintHex(HasLinkErrorOccurred(), 25, 8, 1); - - for (i = 0; i < MAX_LINK_PLAYERS; i++) - PrintHex(gLinkTestBlockChecksums[i], 10, 4 + i, 4); -} - -void SetLinkDebugValues(u32 value1, u32 value2) -{ - gLinkDebugValue1 = value1; - gLinkDebugValue2 = value2; -} - -u8 sub_8008198(void) -{ - u8 result = 0; - s32 i; - - for (i = 0; i < gSavedLinkPlayerCount; i++) - result |= (1 << i); - - return result; -} - -void sub_80081C8(u8 playerCount) -{ - s32 i; - - gSavedLinkPlayerCount = playerCount; - gSavedMultiplayerId = GetMultiplayerId(); - - for (i = 0; i < 4; i++) - gSavedLinkPlayers[i] = gLinkPlayers[i]; -} - -u8 sub_800820C(void) -{ - return gSavedLinkPlayerCount; -} - -u8 sub_8008218(void) -{ - return gSavedMultiplayerId; -} - -bool8 sub_8008224(void) -{ - s32 count = 0; - s32 i; - - for (i = 0; i < gSavedLinkPlayerCount; i++) - if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId) - count++; - - if (count == gSavedLinkPlayerCount) - return TRUE; - else - return FALSE; -} - -void sub_800826C(void) -{ - u8 i; - - for (i = 0; i < gSavedLinkPlayerCount; i++) - { - if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId - || StringCompareWithoutExtCtrlCodes(gSavedLinkPlayers[i].name, gLinkPlayers[i].name)) - { - gLinkErrorOccurred = TRUE; - CloseLink(); - SetMainCallback2(CB2_LinkError); - } - } -} - -void sub_80082EC(void) -{ - gSavedLinkPlayerCount = 0; - gSavedMultiplayerId = 0; -} - -u8 GetLinkPlayerCount_2(void) -{ - return EXTRACT_PLAYER_COUNT(gLinkStatus); -} - -bool8 IsLinkMaster(void) -{ - return EXTRACT_MASTER(gLinkStatus); -} - -u8 GetDummy2(void) -{ - return sDummy2; -} - -void sub_800832C(void) -{ - if (!gLinkCallback) - { - gLinkCallback = sub_8008350; - gLinkDummyBool = FALSE; - } -} - -static void sub_8008350(void) -{ - if (gLastRecvQueueCount == 0) - { - BuildSendCmd(0x5FFF); - gLinkCallback = sub_800837C; - } -} - -static void sub_800837C(void) -{ - s32 i; - s32 totalCount = GetLinkPlayerCount(); - s32 count = 0; - - for (i = 0; i < totalCount; i++) - if (u8_array_3002B78[i]) - count++; - - if (count == totalCount) - { - gBattleTypeFlags &= ~BATTLE_TYPE_20; - gLinkVSyncDisabled = TRUE; - CloseLink(); - gLinkCallback = NULL; - gLinkDummyBool = TRUE; - } -} - -static void sub_80083E0(void) -{ - s32 i; - s32 totalCount = GetLinkPlayerCount(); - s32 count = 0; - - for (i = 0; i < totalCount; i++) - { - if (gLinkPlayers[i].language == 1) - count++; - else if (u8_array_3002B78[i]) - count++; - } - - if (count == totalCount) - { - gBattleTypeFlags &= ~BATTLE_TYPE_20; - gLinkVSyncDisabled = TRUE; - CloseLink(); - gLinkCallback = 0; - gLinkDummyBool = TRUE; - } -} - -static void sub_8008454(void) -{ - if (gLastRecvQueueCount == 0) - { - BuildSendCmd(0x5FFF); - gLinkCallback = sub_80083E0; - } -} - -void sub_8008480(void) -{ - if (!gLinkCallback) - { - gLinkCallback = sub_8008454; - gLinkDummyBool = FALSE; - } -} - -void sub_80084A4(void) -{ - if (!gLinkCallback) - gLinkCallback = sub_80084C8; - gLinkDummyBool = FALSE; -} - -static void sub_80084C8(void) -{ - if (gLastRecvQueueCount == 0) - { - BuildSendCmd(0x2FFE); - gLinkCallback = sub_80084F4; - } -} - -static void sub_80084F4(void) -{ - u8 totalCount = GetLinkPlayerCount(); - u8 count = 0; - - while (count < totalCount && u8_array_3002B70[count]) - count++; - - if (count == totalCount) - { - u8 i; - for (i = 0; i < 4; i++) - u8_array_3002B70[i] = 0; - gLinkCallback = NULL; - } -} - -static void CheckErrorStatus(void) -{ - if (gLinkOpen) - { - if (gLinkStatus & LINK_STAT_ERRORS) - { - if (!gSuppressLinkErrorMessage) - { - sErrorLinkStatus = gLinkStatus; - sErrorLastRecvQueueCount = gLastRecvQueueCount; - sErrorLastSendQueueCount = gLastSendQueueCount; - SetMainCallback2(CB2_LinkError); - } - gLinkErrorOccurred = TRUE; - CloseLink(); - } - } -} - -void CB2_LinkError(void) -{ - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetPaletteFadeControl(); - FillPalette(0, 0, 2); - ResetTasks(); - SetVBlankCallback(VBlankCB_LinkTest); - SetUpWindowConfig(&gWindowConfig_81E7198); - InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E7198); - MenuZeroFillScreen(); - REG_BLDALPHA = 0; - REG_BG0VOFS = 0; - REG_BG0HOFS = 0; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; - gSoftResetDisabled = FALSE; - CreateTask(Task_DestroySelf, 0); - StopMapMusic(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - SetMainCallback2(CB2_PrintErrorMessage); -} - -static void CB2_PrintErrorMessage(void) -{ - u8 array[64] __attribute__((unused)); // unused - - switch (gMain.state) - { - case 0: - MenuPrint_PixelCoords(gMultiText_LinkError, 20, 56, 1); - break; - case 30: - case 60: - PlaySE(SE_BOO); - break; - case 90: - PlaySE(SE_BOO); - break; - } - - if (gMain.state != 200) - gMain.state++; -} - -u8 GetSioMultiSI(void) -{ - return (REG_SIOCNT >> SIO_MULTI_SI_SHIFT) & SIO_MULTI_SI_MASK; -} - -static bool8 IsSioMultiMaster(void) -{ - bool8 isMaster = FALSE; - - if ((REG_SIOCNT & SIO_MULTI_SD) && !(REG_SIOCNT & SIO_MULTI_SI)) - isMaster = TRUE; - - return isMaster; -} - -bool8 IsLinkConnectionEstablished(void) -{ - return EXTRACT_CONN_ESTABLISHED(gLinkStatus); -} - -void SetSuppressLinkErrorMessage(bool8 value) -{ - gSuppressLinkErrorMessage = value; -} - -bool8 HasLinkErrorOccurred(void) -{ - return gLinkErrorOccurred; -} - -static void DisableSerial(void) -{ - gLinkSavedIme = REG_IME; - REG_IME = 0; - REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); - REG_IME = gLinkSavedIme; - - REG_SIOCNT = 0; - REG_TM3CNT_H = 0; - REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL; - - CpuFill32(0, &gLink, sizeof(gLink)); -} - -static void EnableSerial(void) -{ - gLinkSavedIme = REG_IME; - REG_IME = 0; - REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); - REG_IME = gLinkSavedIme; - - REG_RCNT = 0; - - REG_SIOCNT = SIO_MULTI_MODE; - REG_SIOCNT |= SIO_INTR_ENABLE | SIO_115200_BPS; - - gLinkSavedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_SERIAL; - REG_IME = gLinkSavedIme; - - REG_SIOMLT_SEND = 0; - - CpuFill32(0, &gLink, sizeof(gLink)); - - sNumVBlanksWithoutSerialIntr = 0; - sSendNonzeroCheck = 0; - sRecvNonzeroCheck = 0; - sChecksumAvailable = FALSE; - sHandshakePlayerCount = 0; - gLastSendQueueCount = 0; - gLastRecvQueueCount = 0; -} - -void ResetSerial(void) -{ - EnableSerial(); - DisableSerial(); -} - -u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 recvCmds[CMD_LENGTH][MAX_LINK_PLAYERS]) -{ - u32 retVal; - u32 retVal2; - - switch (gLink.state) - { - case LINK_STATE_START0: - DisableSerial(); - gLink.state = LINK_STATE_START1; - break; - case LINK_STATE_START1: - if (*shouldAdvanceLinkState == 1) - { - EnableSerial(); - gLink.state = LINK_STATE_HANDSHAKE; - } - break; - case LINK_STATE_HANDSHAKE: - switch (*shouldAdvanceLinkState) - { - case 1: - if (gLink.isMaster == 8 && gLink.playerCount > 1) - gLink.handshakeAsMaster = TRUE; - break; - case 2: - gLink.state = LINK_STATE_START0; - REG_SIOMLT_SEND = 0; - break; - default: - CheckMasterOrSlave(); - break; - } - break; - case LINK_STATE_INIT_TIMER: - InitTimer(); - gLink.state = LINK_STATE_CONN_ESTABLISHED; - case LINK_STATE_CONN_ESTABLISHED: - EnqueueSendCmd(sendCmd); - DequeueRecvCmds(recvCmds); - break; - } - - *shouldAdvanceLinkState = 0; - - retVal = gLink.localId; - retVal |= (gLink.playerCount << 2); - - if (gLink.isMaster == 8) - retVal |= 0x20; - - { - u32 receivedNothing = gLink.receivedNothing << 8; - u32 link_field_F = gLink.link_field_F << 9; - u32 hardwareError = gLink.hardwareError << 12; - u32 badChecksum = gLink.badChecksum << 13; - u32 queueFull = gLink.queueFull << 14; - u32 val; - - if (gLink.state == LINK_STATE_CONN_ESTABLISHED) - { - val = 0x40; - val |= receivedNothing; - val |= retVal; - val |= link_field_F; - val |= hardwareError; - val |= badChecksum; - val |= queueFull; - } - else - { - val = retVal; - val |= receivedNothing; - val |= link_field_F; - val |= hardwareError; - val |= badChecksum; - val |= queueFull; - } - - retVal = val; - } - - if (gLink.lag == LAG_MASTER) - retVal |= 0x10000; - - if (gLink.localId > 3) - retVal |= 0x20000; - - retVal2 = retVal; - if (gLink.lag == LAG_SLAVE) - retVal2 |= 0x40000; - - return retVal2; -} - -static void CheckMasterOrSlave(void) -{ - u32 terminals = *(u32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SD | SIO_MULTI_SI); - - if (terminals == SIO_MULTI_SD && !gLink.localId) - gLink.isMaster = 8; - else - gLink.isMaster = 0; -} - -static void InitTimer(void) -{ - if (gLink.isMaster) - { - REG_TM3CNT_L = 65339; - REG_TM3CNT_H = TIMER_INTR_ENABLE | TIMER_64CLK; - - gLinkSavedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_TIMER3; - REG_IME = gLinkSavedIme; - } -} - -static void EnqueueSendCmd(u16 *sendCmd) -{ - gLinkSavedIme = REG_IME; - REG_IME = 0; - - if (gLink.sendQueue.count < QUEUE_CAPACITY) - { - u8 i; - u8 offset = gLink.sendQueue.pos + gLink.sendQueue.count; - - if (offset >= QUEUE_CAPACITY) - offset -= QUEUE_CAPACITY; - - for (i = 0; i < CMD_LENGTH; i++) - { - sSendNonzeroCheck |= *sendCmd; - gLink.sendQueue.data[i][offset] = *sendCmd; - *sendCmd = 0; - sendCmd++; - } - } - else - { - gLink.queueFull = QUEUE_FULL_SEND; - } - - if (sSendNonzeroCheck) - { - gLink.sendQueue.count++; - sSendNonzeroCheck = 0; - } - - REG_IME = gLinkSavedIme; - gLastSendQueueCount = gLink.sendQueue.count; -} - -void DequeueRecvCmds(u16 recvCmds[CMD_LENGTH][MAX_LINK_PLAYERS]) -{ - u8 i; - u8 j; - - gLinkSavedIme = REG_IME; - REG_IME = 0; - - if (gLink.recvQueue.count == 0) - { - for (i = 0; i < CMD_LENGTH; i++) - for (j = 0; j < gLink.playerCount; j++) - recvCmds[i][j] = 0; - - gLink.receivedNothing = TRUE; - } - else - { - for (i = 0; i < CMD_LENGTH; i++) - for (j = 0; j < gLink.playerCount; j++) - recvCmds[i][j] = gLink.recvQueue.data[j][i][gLink.recvQueue.pos]; - - gLink.recvQueue.count--; - gLink.recvQueue.pos++; - - if (gLink.recvQueue.pos >= QUEUE_CAPACITY) - gLink.recvQueue.pos = 0; - - gLink.receivedNothing = FALSE; - } - - REG_IME = gLinkSavedIme; -} - -void LinkVSync(void) -{ - if (gLink.isMaster) - { - switch (gLink.state) - { - case LINK_STATE_HANDSHAKE: - StartTransfer(); - break; - case LINK_STATE_CONN_ESTABLISHED: - if (gLink.serialIntrCounter > 8) - { - if (gLink.lag == LAG_MASTER) - return; - gLink.serialIntrCounter = 0; - } - else if (gLink.hardwareError != TRUE) - { - gLink.lag = LAG_MASTER; - return; - } - StartTransfer(); - break; - } - } - else if (gLink.state == LINK_STATE_CONN_ESTABLISHED - || gLink.state == LINK_STATE_HANDSHAKE) - { - sNumVBlanksWithoutSerialIntr++; - - if (sNumVBlanksWithoutSerialIntr > 10) - { - if (gLink.state == LINK_STATE_CONN_ESTABLISHED) - gLink.lag = LAG_SLAVE; - - if (gLink.state == LINK_STATE_HANDSHAKE) - { - gLink.playerCount = 0; - gLink.link_field_F = 0; - } - } - } -} - -void Timer3Intr(void) -{ - StopTimer(); - StartTransfer(); -} - -void SerialCB(void) -{ - gLink.localId = SIO_MULTI_CNT->id; - - switch (gLink.state) - { - case LINK_STATE_CONN_ESTABLISHED: - gLink.hardwareError = SIO_MULTI_CNT->error; - DoRecv(); - DoSend(); - SendRecvDone(); - break; - case LINK_STATE_HANDSHAKE: - if (DoHandshake()) - { - if (gLink.isMaster) - { - gLink.state = LINK_STATE_INIT_TIMER; - gLink.serialIntrCounter = 8; - } - else - { - gLink.state = LINK_STATE_CONN_ESTABLISHED; - } - } - break; - } - - gLink.serialIntrCounter++; - sNumVBlanksWithoutSerialIntr = 0; - - if (gLink.serialIntrCounter == 8) - gLastRecvQueueCount = gLink.recvQueue.count; -} - -static void StartTransfer(void) -{ - REG_SIOCNT |= SIO_START; -} - -static bool8 DoHandshake(void) -{ - u8 i; - u8 playerCount = 0; - u16 minRecv = 0xFFFF; - - if (gLink.handshakeAsMaster == TRUE) - REG_SIOMLT_SEND = MASTER_HANDSHAKE; - else - REG_SIOMLT_SEND = SLAVE_HANDSHAKE; - - *(u64 *)&gLink.tempRecvBuffer[0] = REG_SIOMLT_RECV; - REG_SIOMLT_RECV = 0; - - gLink.handshakeAsMaster = FALSE; - - for (i = 0; i < 4; i++) - { - if ((gLink.tempRecvBuffer[i] & ~0x3) == SLAVE_HANDSHAKE - || gLink.tempRecvBuffer[i] == MASTER_HANDSHAKE) - { - playerCount++; - - if (minRecv > gLink.tempRecvBuffer[i] && gLink.tempRecvBuffer[i] != 0) - minRecv = gLink.tempRecvBuffer[i]; - } - else - { - if (gLink.tempRecvBuffer[i] != 0xFFFF) - playerCount = 0; - break; - } - } - - gLink.playerCount = playerCount; - - // The handshake is successful when: - // 1. There are multiple players. - // 2. The number of players agrees with the last attempt. - // 3. Player no. 0 is identifying as the master. - if (gLink.playerCount > 1 - && gLink.playerCount == sHandshakePlayerCount - && gLink.tempRecvBuffer[0] == MASTER_HANDSHAKE) - return TRUE; - - if (gLink.playerCount > 1) - gLink.link_field_F = (minRecv & 3) + 1; - else - gLink.link_field_F = 0; - - sHandshakePlayerCount = gLink.playerCount; - - return FALSE; -} - -static void DoRecv(void) -{ - u16 recvBuffer[4]; - u8 i; - - *(u64 *)&recvBuffer[0] = REG_SIOMLT_RECV; - - if (gLink.sendCmdIndex == 0) - { - for (i = 0; i < gLink.playerCount; i++) - if (gLink.checksum != recvBuffer[i] && sChecksumAvailable) - gLink.badChecksum = TRUE; - - gLink.checksum = 0; - sChecksumAvailable = TRUE; - } - else - { - u8 index = gLink.recvQueue.pos + gLink.recvQueue.count; - - if (index >= QUEUE_CAPACITY) - index -= QUEUE_CAPACITY; - - if (gLink.recvQueue.count < QUEUE_CAPACITY) - { - for (i = 0; i < gLink.playerCount; i++) - { - gLink.checksum += recvBuffer[i]; - sRecvNonzeroCheck |= recvBuffer[i]; - gLink.recvQueue.data[i][gLink.recvCmdIndex][index] = recvBuffer[i]; - } - } - else - { - gLink.queueFull = QUEUE_FULL_RECV; - } - - gLink.recvCmdIndex++; - - if (gLink.recvCmdIndex == CMD_LENGTH && sRecvNonzeroCheck) - { - gLink.recvQueue.count++; - sRecvNonzeroCheck = 0; - } - } -} - -static void DoSend(void) -{ - if (gLink.sendCmdIndex == CMD_LENGTH) - { - REG_SIOMLT_SEND = gLink.checksum; - - if (!sSendBufferEmpty) - { - gLink.sendQueue.count--; - gLink.sendQueue.pos++; - - if (gLink.sendQueue.pos >= QUEUE_CAPACITY) - gLink.sendQueue.pos = 0; - } - else - { - sSendBufferEmpty = FALSE; - } - } - else - { - if (!sSendBufferEmpty && gLink.sendQueue.count == 0) - sSendBufferEmpty = TRUE; - - if (sSendBufferEmpty) - REG_SIOMLT_SEND = 0; - else - REG_SIOMLT_SEND = gLink.sendQueue.data[gLink.sendCmdIndex][gLink.sendQueue.pos]; - - gLink.sendCmdIndex++; - } -} - -static void StopTimer(void) -{ - if (gLink.isMaster) - { - REG_TM3CNT_H &= ~TIMER_ENABLE; - REG_TM3CNT_L = 65339; - } -} - -static void SendRecvDone(void) -{ - if (gLink.recvCmdIndex == CMD_LENGTH) - { - gLink.sendCmdIndex = 0; - gLink.recvCmdIndex = 0; - } - else if (gLink.isMaster) - { - REG_TM3CNT_H |= TIMER_ENABLE; - } -} - -void ResetSendBuffer(void) -{ - u8 i; - u8 j; - - gLink.sendQueue.count = 0; - gLink.sendQueue.pos = 0; - - for (i = 0; i < CMD_LENGTH; i++) - for (j = 0; j < QUEUE_CAPACITY; j++) - gLink.sendQueue.data[i][j] = 0xEFFF; -} - -void ResetRecvBuffer(void) -{ - u8 i; - u8 j; - u8 k; - - gLink.recvQueue.count = 0; - gLink.recvQueue.pos = 0; - - for (i = 0; i < 4; i++) - for (j = 0; j < CMD_LENGTH; j++) - for (k = 0; k < QUEUE_CAPACITY; k++) - gLink.recvQueue.data[i][j][k] = 0xEFFF; -} diff --git a/src/load_save.c b/src/load_save.c deleted file mode 100644 index 730aea2b8..000000000 --- a/src/load_save.c +++ /dev/null @@ -1,168 +0,0 @@ -#include "global.h" -#include "gba/flash_internal.h" -#include "load_save.h" -#include "main.h" -#include "pokemon.h" -#include "rom4.h" - -extern u8 gPlayerPartyCount; - -bool32 gFlashMemoryPresent; - -struct LoadedSaveData -{ - struct ItemSlot items[20]; - struct ItemSlot keyItems[20]; - struct ItemSlot pokeBalls[16]; - struct ItemSlot TMsHMs[64]; - struct ItemSlot berries[46]; - struct MailStruct mail[16]; -}; - -EWRAM_DATA struct SaveBlock2 gSaveBlock2 = {0}; -EWRAM_DATA struct SaveBlock1 gSaveBlock1 = {0}; - -static EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0}; - -void CheckForFlashMemory(void) -{ - if (!IdentifyFlash()) - { - gFlashMemoryPresent = TRUE; - InitFlashTimer(); - } - else - gFlashMemoryPresent = FALSE; -} - -bool32 GetSecretBase2Field_9(void) -{ - return gSaveBlock2.specialSaveWarp; -} - -void ClearSecretBase2Field_9(void) -{ - gSaveBlock2.specialSaveWarp = 0; -} - -void SetSecretBase2Field_9(void) -{ - gSaveBlock2.specialSaveWarp = 1; -} - -void SetSecretBase2Field_9_AndHideBG(void) // note: no other function sets specialSaveWarp to values other than 0 or 1, hence clear and set distinctions. -{ - gpu_sync_bg_hide(0); // the function doesn't use the parameter passed to it, but this is necessary to match. - gSaveBlock2.specialSaveWarp = 1; -} - -void ClearSecretBase2Field_9_2(void) // duplicate function -{ - gSaveBlock2.specialSaveWarp = 0; -} - -void SavePlayerParty(void) -{ - int i; - - gSaveBlock1.playerPartyCount = gPlayerPartyCount; - - for (i = 0; i < 6; i++) - gSaveBlock1.playerParty[i] = gPlayerParty[i]; -} - -void LoadPlayerParty(void) -{ - int i; - - gPlayerPartyCount = gSaveBlock1.playerPartyCount; - - for (i = 0; i < 6; i++) - gPlayerParty[i] = gSaveBlock1.playerParty[i]; -} - -static void SaveMapObjects(void) -{ - int i; - - for (i = 0; i < 16; i++) - gSaveBlock1.mapObjects[i] = gMapObjects[i]; -} - -static void LoadMapObjects(void) -{ - int i; - - for (i = 0; i < 16; i++) - gMapObjects[i] = gSaveBlock1.mapObjects[i]; -} - -void SaveSerializedGame(void) -{ - SavePlayerParty(); - SaveMapObjects(); -} - -void LoadSerializedGame(void) -{ - LoadPlayerParty(); - LoadMapObjects(); -} - -void LoadPlayerBag(void) -{ - int i; - - // load player items. - for (i = 0; i < 20; i++) - gLoadedSaveData.items[i] = gSaveBlock1.bagPocket_Items[i]; - - // load player key items. - for (i = 0; i < 20; i++) - gLoadedSaveData.keyItems[i] = gSaveBlock1.bagPocket_KeyItems[i]; - - // load player pokeballs. - for (i = 0; i < 16; i++) - gLoadedSaveData.pokeBalls[i] = gSaveBlock1.bagPocket_PokeBalls[i]; - - // load player TMs and HMs. - for (i = 0; i < 64; i++) - gLoadedSaveData.TMsHMs[i] = gSaveBlock1.bagPocket_TMHM[i]; - - // load player berries. - for (i = 0; i < 46; i++) - gLoadedSaveData.berries[i] = gSaveBlock1.bagPocket_Berries[i]; - - // load mail. - for (i = 0; i < 16; i++) - gLoadedSaveData.mail[i] = gSaveBlock1.mail[i]; -} - -void SavePlayerBag(void) -{ - int i; - - // save player items. - for (i = 0; i < 20; i++) - gSaveBlock1.bagPocket_Items[i] = gLoadedSaveData.items[i]; - - // save player key items. - for (i = 0; i < 20; i++) - gSaveBlock1.bagPocket_KeyItems[i] = gLoadedSaveData.keyItems[i]; - - // save player pokeballs. - for (i = 0; i < 16; i++) - gSaveBlock1.bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i]; - - // save player TMs and HMs. - for (i = 0; i < 64; i++) - gSaveBlock1.bagPocket_TMHM[i] = gLoadedSaveData.TMsHMs[i]; - - // save player berries. - for (i = 0; i < 46; i++) - gSaveBlock1.bagPocket_Berries[i] = gLoadedSaveData.berries[i]; - - // save mail. - for (i = 0; i < 16; i++) - gSaveBlock1.mail[i] = gLoadedSaveData.mail[i]; -} diff --git a/src/lottery_corner.c b/src/lottery_corner.c deleted file mode 100644 index c2c25b9ac..000000000 --- a/src/lottery_corner.c +++ /dev/null @@ -1,174 +0,0 @@ -#include "global.h" -#include "lottery_corner.h" -#include "event_data.h" -#include "items.h" -#include "rng.h" -#include "species.h" -#include "string_util.h" -#include "text.h" - -extern u16 gScriptResult; -extern u16 gSpecialVar_0x8004; -extern struct PokemonStorage gPokemonStorage; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; -static EWRAM_DATA u16 sWinNumberDigit = 0; -static EWRAM_DATA u16 sOtIdDigit = 0; - -static const u16 sLotteryPrizes[] = -{ - ITEM_PP_UP, - ITEM_EXP_SHARE, - ITEM_MAX_REVIVE, - ITEM_MASTER_BALL, -}; - -static u8 GetMatchingDigits(u16, u16); - -void ResetLotteryCorner(void) -{ - u16 rand = Random(); - - SetLotteryNumber((Random() << 16) | rand); - VarSet(VAR_POKELOT_PRIZE, 0); -} - -void SetRandomLotteryNumber(u16 i) -{ - u32 var = Random(); - - while (--i != 0xFFFF) - var = var * 1103515245 + 12345; - - SetLotteryNumber(var); -} - -void RetrieveLotteryNumber(void) -{ - u16 lottoNumber = GetLotteryNumber(); - gScriptResult = lottoNumber; -} - -void PickLotteryCornerTicket(void) -{ - u16 i; - u16 j; - u32 box; - u32 slot; - - gSpecialVar_0x8004 = 0; - slot = 0; - box = 0; - for (i = 0; i < 6; i++) - { - struct Pokemon *pkmn = &gPlayerParty[i]; - - // UB: Too few arguments for function GetMonData - if (GetMonData(pkmn, MON_DATA_SPECIES) != SPECIES_NONE) - { - // do not calculate ticket values for eggs. - if (!GetMonData(pkmn, MON_DATA_IS_EGG)) - { - u32 otId = GetMonData(pkmn, MON_DATA_OT_ID); - u8 numMatchingDigits = GetMatchingDigits(gScriptResult, otId); - - if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1) - { - gSpecialVar_0x8004 = numMatchingDigits - 1; - box = 14; - slot = i; - } - } - } - else // pokemon are always arranged from populated spots first to unpopulated, so the moment a NONE species is found, that's the end of the list. - break; - } - - // player has 14 boxes. - for (i = 0; i < 14; i++) - { - // player has 30 slots per box. - for (j = 0; j < 30; j++) - { - struct BoxPokemon *pkmn = &gPokemonStorage.boxes[i][j]; - - // UB: Too few arguments for function GetMonData - if (GetBoxMonData(pkmn, MON_DATA_SPECIES) != SPECIES_NONE && - !GetBoxMonData(pkmn, MON_DATA_IS_EGG)) - { - u32 otId = GetBoxMonData(pkmn, MON_DATA_OT_ID); - u8 numMatchingDigits = GetMatchingDigits(gScriptResult, otId); - - if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1) - { - gSpecialVar_0x8004 = numMatchingDigits - 1; - box = i; - slot = j; - } - } - } - } - - if (gSpecialVar_0x8004 != 0) - { - gSpecialVar_0x8005 = sLotteryPrizes[gSpecialVar_0x8004 - 1]; - - if (box == 14) - { - gSpecialVar_0x8006 = 0; - GetMonData(&gPlayerParty[slot], MON_DATA_NICKNAME, gStringVar1); - } - else - { - gSpecialVar_0x8006 = 1; - GetBoxMonData(&gPokemonStorage.boxes[box][slot], MON_DATA_NICKNAME, gStringVar1); - } - StringGetEnd10(gStringVar1); - } -} - -static u8 GetMatchingDigits(u16 winNumber, u16 otId) -{ - u8 i; - u8 matchingDigits = 0; - - for (i = 0; i < 5; i++) - { - sWinNumberDigit = winNumber % 10; - sOtIdDigit = otId % 10; - - if (sWinNumberDigit == sOtIdDigit) - { - winNumber = winNumber / 10; - otId = otId / 10; - matchingDigits++; - } - else - break; - } - return matchingDigits; -} - -// lottery numbers go from 0 to 99999, not 65535 (0xFFFF). interestingly enough, the function that calls GetLotteryNumber shifts to u16, so it cant be anything above 65535 anyway. -void SetLotteryNumber(u32 lotteryNum) -{ - u16 lowNum = lotteryNum >> 16; - u16 highNum = lotteryNum; - - VarSet(VAR_POKELOT_RND1, highNum); - VarSet(VAR_POKELOT_RND2, lowNum); -} - -u32 GetLotteryNumber(void) -{ - u16 highNum = VarGet(VAR_POKELOT_RND1); - u16 lowNum = VarGet(VAR_POKELOT_RND2); - - return (lowNum << 16) | highNum; -} - -// interestingly, this may have been the original lottery number set function, but GF tried to change it to 32-bit later but didnt finish changing all calls as one GetLotteryNumber still shifts to u16. -void SetLotteryNumber16_Unused(u16 lotteryNum) -{ - SetLotteryNumber(lotteryNum); -} diff --git a/src/m4a_2.c b/src/m4a_2.c deleted file mode 100644 index 2d3c65848..000000000 --- a/src/m4a_2.c +++ /dev/null @@ -1,912 +0,0 @@ -#include "gba/m4a_internal.h" - -#define BSS_CODE __attribute__((section(".bss.code"))) - -BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0}; - -struct SoundInfo gSoundInfo; -struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES]; -struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES]; -void *gMPlayJumpTable[36]; -struct CgbChannel gCgbChans[4]; -struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2]; -struct PokemonCrySong gPokemonCrySong; -struct MusicPlayerInfo gMPlay_BGM; -struct MusicPlayerInfo gMPlay_SE1; -struct MusicPlayerInfo gMPlay_SE2; -struct MusicPlayerInfo gMPlay_SE3; -u8 gMPlayMemAccArea[0x10]; - -u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust) -{ - u32 val1; - u32 val2; - u32 fineAdjustShifted = fineAdjust << 24; - - if (key > 178) - { - key = 178; - fineAdjustShifted = 255 << 24; - } - - val1 = gScaleTable[key]; - val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4); - - val2 = gScaleTable[key + 1]; - val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4); - - return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted)); -} - -void UnusedDummyFunc() -{ -} - -void MPlayContinue(struct MusicPlayerInfo *mplayInfo) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; - mplayInfo->ident = ID_NUMBER; - } -} - -void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->fadeOC = speed; - mplayInfo->fadeOI = speed; - mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aSoundInit(void) -{ - s32 i; - - CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); - - SoundInit(&gSoundInfo); - MPlayExtender(gCgbChans); - m4aSoundMode(SOUND_MODE_DA_BIT_8 - | SOUND_MODE_FREQ_13379 - | (12 << SOUND_MODE_MASVOL_SHIFT) - | (5 << SOUND_MODE_MAXCHN_SHIFT)); - - for (i = 0; i < NUM_MUSIC_PLAYERS; i++) - { - struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info; - MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8); - mplayInfo->unk_B = gMPlayTable[i].unk_A; - mplayInfo->memAccArea = gMPlayMemAccArea; - } - - memcpy(&gPokemonCrySong, &gPokemonCrySongTemplate, sizeof(struct PokemonCrySong)); - - for (i = 0; i < MAX_POKEMON_CRIES; i++) - { - struct MusicPlayerInfo *mplayInfo = &gPokemonCryMusicPlayers[i]; - struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; - MPlayOpen(mplayInfo, track, 2); - track->chan = 0; - } -} - -void m4aSoundMain(void) -{ - SoundMain(); -} - -void m4aSongNumStart(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - MPlayStart(mplay->info, song->header); -} - -void m4aSongNumStartOrChange(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader != song->header) - { - MPlayStart(mplay->info, song->header); - } - else - { - if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0 - || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)) - { - MPlayStart(mplay->info, song->header); - } - } -} - -void m4aSongNumStartOrContinue(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader != song->header) - MPlayStart(mplay->info, song->header); - else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0) - MPlayStart(mplay->info, song->header); - else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE) - MPlayContinue(mplay->info); -} - -void m4aSongNumStop(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader == song->header) - m4aMPlayStop(mplay->info); -} - -void m4aSongNumContinue(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader == song->header) - MPlayContinue(mplay->info); -} - -void m4aMPlayAllStop(void) -{ - s32 i; - - for (i = 0; i < NUM_MUSIC_PLAYERS; i++) - m4aMPlayStop(gMPlayTable[i].info); - - for (i = 0; i < MAX_POKEMON_CRIES; i++) - m4aMPlayStop(&gPokemonCryMusicPlayers[i]); -} - -void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo) -{ - MPlayContinue(mplayInfo); -} - -void m4aMPlayAllContinue(void) -{ - s32 i; - - for (i = 0; i < NUM_MUSIC_PLAYERS; i++) - MPlayContinue(gMPlayTable[i].info); - - for (i = 0; i < MAX_POKEMON_CRIES; i++) - MPlayContinue(&gPokemonCryMusicPlayers[i]); -} - -void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - MPlayFadeOut(mplayInfo, speed); -} - -void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->fadeOC = speed; - mplayInfo->fadeOI = speed; - mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE; - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->fadeOC = speed; - mplayInfo->fadeOI = speed; - mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN; - mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo) -{ - s32 trackCount = mplayInfo->trackCount; - struct MusicPlayerTrack *track = mplayInfo->tracks; - - while (trackCount > 0) - { - if (track->flags & MPT_FLG_EXIST) - { - if (track->flags & MPT_FLG_START) - { - Clear64byte(track); - track->flags = MPT_FLG_EXIST; - track->bendRange = 2; - track->volX = 64; - track->lfoSpeed = 22; - track->tone.type = 1; - } - } - - trackCount--; - track++; - } -} - -void MPlayExtender(struct CgbChannel *cgbChans) -{ - struct SoundInfo *soundInfo; - u32 ident; - - REG_SOUNDCNT_X = SOUND_MASTER_ENABLE - | SOUND_4_ON - | SOUND_3_ON - | SOUND_2_ON - | SOUND_1_ON; - REG_SOUNDCNT_L = 0; // set master volume to zero - REG_NR12 = 0x8; - REG_NR22 = 0x8; - REG_NR42 = 0x8; - REG_NR14 = 0x80; - REG_NR24 = 0x80; - REG_NR44 = 0x80; - REG_NR30 = 0; - REG_NR50 = 0x77; - - soundInfo = SOUND_INFO_PTR; - - ident = soundInfo->ident; - - if (ident != ID_NUMBER) - return; - - soundInfo->ident++; - - gMPlayJumpTable[8] = ply_memacc; - gMPlayJumpTable[17] = ply_lfos; - gMPlayJumpTable[19] = ply_mod; - gMPlayJumpTable[28] = ply_xcmd; - gMPlayJumpTable[29] = ply_endtie; - gMPlayJumpTable[30] = SampleFreqSet; - gMPlayJumpTable[31] = TrackStop; - gMPlayJumpTable[32] = FadeOutBody; - gMPlayJumpTable[33] = TrkVolPitSet; - - soundInfo->cgbChans = (struct CgbChannel *)cgbChans; - soundInfo->CgbSound = CgbSound; - soundInfo->CgbOscOff = CgbOscOff; - soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq; - soundInfo->maxLines = MAX_LINES; - - CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4); - - cgbChans[0].ty = 1; - cgbChans[0].panMask = 0x11; - cgbChans[1].ty = 2; - cgbChans[1].panMask = 0x22; - cgbChans[2].ty = 3; - cgbChans[2].panMask = 0x44; - cgbChans[3].ty = 4; - cgbChans[3].panMask = 0x88; - - soundInfo->ident = ident; -} - -void MusicPlayerJumpTableCopy(void) -{ - asm("swi 0x2A"); -} - -void ClearChain(void *x) -{ - void (*func)(void *) = *(&gMPlayJumpTable[34]); - func(x); -} - -void Clear64byte(void *x) -{ - void (*func)(void *) = *(&gMPlayJumpTable[35]); - func(x); -} - -void SoundInit(struct SoundInfo *soundInfo) -{ - soundInfo->ident = 0; - - if (REG_DMA1CNT & (DMA_REPEAT << 16)) - REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - if (REG_DMA2CNT & (DMA_REPEAT << 16)) - REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - REG_DMA1CNT_H = DMA_32BIT; - REG_DMA2CNT_H = DMA_32BIT; - REG_SOUNDCNT_X = SOUND_MASTER_ENABLE - | SOUND_4_ON - | SOUND_3_ON - | SOUND_2_ON - | SOUND_1_ON; - REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT - | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT - | SOUND_ALL_MIX_FULL; - REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40; - - REG_DMA1SAD = (s32)soundInfo->pcmBuffer; - REG_DMA1DAD = (s32)®_FIFO_A; - REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE; - REG_DMA2DAD = (s32)®_FIFO_B; - - SOUND_INFO_PTR = soundInfo; - CpuFill32(0, soundInfo, sizeof(struct SoundInfo)); - - soundInfo->maxChans = 8; - soundInfo->masterVolume = 15; - soundInfo->plynote = (u32)ply_note; - soundInfo->CgbSound = DummyFunc; - soundInfo->CgbOscOff = (void (*)(u8))DummyFunc; - soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc; - soundInfo->ExtVolPit = (u32)DummyFunc; - - MPlayJumpTableCopy(gMPlayJumpTable); - - soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable; - - SampleFreqSet(SOUND_MODE_FREQ_13379); - - soundInfo->ident = ID_NUMBER; -} - -void SampleFreqSet(u32 freq) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - freq = (freq & 0xF0000) >> 16; - soundInfo->freq = freq; - soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; - soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; - - // LCD refresh rate 59.7275Hz - soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000; - - // CPU frequency 16.78Mhz - soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1; - - // Turn off timer 0. - REG_TM0CNT_H = 0; - - // cycles per LCD fresh 280896 - REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank); - - m4aSoundVSyncOn(); - - while (*(vu8 *)REG_ADDR_VCOUNT == 159) - ; - - while (*(vu8 *)REG_ADDR_VCOUNT != 159) - ; - - REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK; -} - -void m4aSoundMode(u32 mode) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - u32 temp; - - if (soundInfo->ident != ID_NUMBER) - return; - - soundInfo->ident++; - - temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL); - - if (temp) - soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL; - - temp = mode & SOUND_MODE_MAXCHN; - - if (temp) - { - struct SoundChannel *chan; - - soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; - - temp = MAX_DIRECTSOUND_CHANNELS; - chan = &soundInfo->chans[0]; - - while (temp != 0) - { - chan->status = 0; - temp--; - chan++; - } - } - - temp = mode & SOUND_MODE_MASVOL; - - if (temp) - soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT; - - temp = mode & SOUND_MODE_DA_BIT; - - if (temp) - { - temp = (temp & 0x300000) >> 14; - REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp; - } - - temp = mode & SOUND_MODE_FREQ; - - if (temp) - { - m4aSoundVSyncOff(); - SampleFreqSet(temp); - } - - soundInfo->ident = ID_NUMBER; -} - -void SoundClear(void) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - s32 i; - void *chan; - - if (soundInfo->ident != ID_NUMBER) - return; - - soundInfo->ident++; - - i = MAX_DIRECTSOUND_CHANNELS; - chan = &soundInfo->chans[0]; - - while (i > 0) - { - ((struct SoundChannel *)chan)->status = 0; - i--; - chan = (void *)((s32)chan + sizeof(struct SoundChannel)); - } - - chan = soundInfo->cgbChans; - - if (chan) - { - i = 1; - - while (i <= 4) - { - soundInfo->CgbOscOff(i); - ((struct CgbChannel *)chan)->sf = 0; - i++; - chan = (void *)((s32)chan + sizeof(struct CgbChannel)); - } - } - - soundInfo->ident = ID_NUMBER; -} - -void m4aSoundVSyncOff(void) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) - { - soundInfo->ident += 10; - - if (REG_DMA1CNT & (DMA_REPEAT << 16)) - REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - if (REG_DMA2CNT & (DMA_REPEAT << 16)) - REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - REG_DMA1CNT_H = DMA_32BIT; - REG_DMA2CNT_H = DMA_32BIT; - - CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer)); - } -} - -void m4aSoundVSyncOn(void) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - u32 ident = soundInfo->ident; - - if (ident == ID_NUMBER) - return; - - REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; - REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; - - soundInfo->pcmDmaCounter = 0; - soundInfo->ident = ident - 10; -} - -void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount) -{ - struct SoundInfo *soundInfo; - - if (trackCount == 0) - return; - - if (trackCount > MAX_MUSICPLAYER_TRACKS) - trackCount = MAX_MUSICPLAYER_TRACKS; - - soundInfo = SOUND_INFO_PTR; - - if (soundInfo->ident != ID_NUMBER) - return; - - soundInfo->ident++; - - Clear64byte(mplayInfo); - - mplayInfo->tracks = tracks; - mplayInfo->trackCount = trackCount; - mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; - - while (trackCount != 0) - { - tracks->flags = 0; - trackCount--; - tracks++; - } - - if (soundInfo->func != 0) - { - mplayInfo->func = soundInfo->func; - mplayInfo->intp = soundInfo->intp; - soundInfo->func = 0; - } - - soundInfo->intp = (u32)mplayInfo; - soundInfo->func = (u32)MPlayMain; - soundInfo->ident = ID_NUMBER; - mplayInfo->ident = ID_NUMBER; -} - -void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader) -{ - s32 i; - u8 unk_B; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - unk_B = mplayInfo->unk_B; - - if (!unk_B - || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START)) - && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0 - || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE))) - || (mplayInfo->priority <= songHeader->priority)) - { - mplayInfo->ident++; - mplayInfo->status = 0; - mplayInfo->songHeader = songHeader; - mplayInfo->tone = songHeader->tone; - mplayInfo->priority = songHeader->priority; - mplayInfo->clock = 0; - mplayInfo->tempoD = 150; - mplayInfo->tempoI = 150; - mplayInfo->tempoU = 0x100; - mplayInfo->tempoC = 0; - mplayInfo->fadeOI = 0; - - i = 0; - track = mplayInfo->tracks; - - while (i < songHeader->trackCount && i < mplayInfo->trackCount) - { - TrackStop(mplayInfo, track); - track->flags = MPT_FLG_EXIST | MPT_FLG_START; - track->chan = 0; - track->cmdPtr = songHeader->part[i]; - i++; - track++; - } - - while (i < mplayInfo->trackCount) - { - TrackStop(mplayInfo, track); - track->flags = 0; - i++; - track++; - } - - if (songHeader->reverb & 0x80) - m4aSoundMode(songHeader->reverb); - - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo) -{ - s32 i; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { - TrackStop(mplayInfo, track); - i--; - track++; - } - - mplayInfo->ident = ID_NUMBER; -} - -void FadeOutBody(struct MusicPlayerInfo *mplayInfo) -{ - s32 i; - struct MusicPlayerTrack *track; - u16 fadeOI = mplayInfo->fadeOI; - register u32 temp asm("r3"); - register u16 mask asm("r2"); - - if (fadeOI == 0) - return; - - mplayInfo->fadeOC--; - - temp = 0xFFFF; - mask = temp; - - if (mplayInfo->fadeOC != 0) - return; - - mplayInfo->fadeOC = fadeOI; - - if (mplayInfo->fadeOV & FADE_IN) - { - mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT); - - if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT)) - { - mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); - mplayInfo->fadeOI = 0; - } - } - else - { - mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT); - - if ((s16)(mplayInfo->fadeOV & mask) <= 0) - { - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { - register u32 fadeOV asm("r7"); - u32 val; - - TrackStop(mplayInfo, track); - - val = TEMPORARY_FADE; - fadeOV = mplayInfo->fadeOV; - val &= fadeOV; - - if (!val) - track->flags = 0; - - i--; - track++; - } - - if (mplayInfo->fadeOV & TEMPORARY_FADE) - mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; - else - mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; - - mplayInfo->fadeOI = 0; - return; - } - } - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { - if (track->flags & MPT_FLG_EXIST) - { - track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT); - track->flags |= MPT_FLG_VOLCHG; - } - - i--; - track++; - } -} - -void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - if (track->flags & MPT_FLG_VOLSET) - { - s32 x; - s32 y; - - x = (u32)(track->vol * track->volX) >> 5; - - if (track->modT == 1) - x = (u32)(x * (track->modM + 128)) >> 7; - - y = 2 * track->pan + track->panX; - - if (track->modT == 2) - y += track->modM; - - if (y < -128) - y = -128; - else if (y > 127) - y = 127; - - track->volMR = (u32)((y + 128) * x) >> 8; - track->volML = (u32)((127 - y) * x) >> 8; - } - - if (track->flags & MPT_FLG_PITSET) - { - s32 bend = track->bend * track->bendRange; - register s32 x asm("r1") = track->tune; - x += bend; - x *= 4; - x += (track->keyShift << 8); - x += (track->keyShiftX << 8); - x += track->pitX; - - if (track->modT == 0) - x += 16 * track->modM; - - track->keyM = x >> 8; - track->pitM = x; - } - - track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET); -} - -u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) -{ - if (chanNum == 4) - { - if (key <= 20) - { - key = 0; - } - else - { - key -= 21; - if (key > 59) - key = 59; - } - - return gNoiseTable[key]; - } - else - { - s32 val1; - s32 val2; - - if (key <= 35) - { - fineAdjust = 0; - key = 0; - } - else - { - key -= 36; - if (key > 130) - { - key = 130; - fineAdjust = 255; - } - } - - val1 = gCgbScaleTable[key]; - val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4); - - val2 = gCgbScaleTable[key + 1]; - val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4); - - return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048; - } -} - -void CgbOscOff(u8 chanNum) -{ - switch (chanNum) - { - case 1: - REG_NR12 = 8; - REG_NR14 = 0x80; - break; - case 2: - REG_NR22 = 8; - REG_NR24 = 0x80; - break; - case 3: - REG_NR30 = 0; - break; - default: - REG_NR42 = 8; - REG_NR44 = 0x80; - } -} - -static inline int CgbPan(struct CgbChannel *chan) -{ - u32 rightVolume = chan->rightVolume; - u32 leftVolume = chan->leftVolume; - - if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) - { - if (rightVolume / 2 >= leftVolume) - { - chan->pan = 0x0F; - return 1; - } - } - else - { - if (leftVolume / 2 >= rightVolume) - { - chan->pan = 0xF0; - return 1; - } - } - - return 0; -} - -void CgbModVol(struct CgbChannel *chan) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - if ((soundInfo->mode & 1) || !CgbPan(chan)) - { - chan->pan = 0xFF; - chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; - } - else - { - // Force chan->rightVolume and chan->leftVolume to be read from memory again, - // even though there is no reason to do so. - // The command line option "-fno-gcse" achieves the same result as this. - asm("" : : : "memory"); - - chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; - if (chan->eg > 15) - chan->eg = 15; - } - - chan->sg = (chan->eg * chan->su + 15) >> 4; - chan->pan &= chan->panMask; -} diff --git a/src/m4a_4.c b/src/m4a_4.c deleted file mode 100644 index 99195ec00..000000000 --- a/src/m4a_4.c +++ /dev/null @@ -1,545 +0,0 @@ -#include "gba/m4a_internal.h" - -void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->tempoU = tempo; - mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8; - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->volX = volume / 4; - track->flags |= MPT_FLG_VOLCHG; - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 pitch) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->keyShiftX = (s16)pitch >> 8; - track->pitX = pitch; - track->flags |= MPT_FLG_PITCHG; - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->panX = pan; - track->flags |= MPT_FLG_VOLCHG; - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void ClearModM(struct MusicPlayerTrack *track) -{ - track->lfoSpeedC = 0; - track->modM = 0; - - if (track->modT == 0) - track->flags |= MPT_FLG_PITCHG; - else - track->flags |= MPT_FLG_VOLCHG; -} - -void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->mod = modDepth; - - if (!track->mod) - ClearModM(track); - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->lfoSpeed = lfoSpeed; - - if (!track->lfoSpeed) - ClearModM(track); - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -#define MEMACC_COND_JUMP(cond) \ -if (cond) \ - goto cond_true; \ -else \ - goto cond_false; \ - -void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 op; - u8 *addr; - u8 data; - - op = *track->cmdPtr; - track->cmdPtr++; - - addr = mplayInfo->memAccArea + *track->cmdPtr; - track->cmdPtr++; - - data = *track->cmdPtr; - track->cmdPtr++; - - switch (op) - { - case 0: - *addr = data; - return; - case 1: - *addr += data; - return; - case 2: - *addr -= data; - return; - case 3: - *addr = mplayInfo->memAccArea[data]; - return; - case 4: - *addr += mplayInfo->memAccArea[data]; - return; - case 5: - *addr -= mplayInfo->memAccArea[data]; - return; - case 6: - MEMACC_COND_JUMP(*addr == data) - return; - case 7: - MEMACC_COND_JUMP(*addr != data) - return; - case 8: - MEMACC_COND_JUMP(*addr > data) - return; - case 9: - MEMACC_COND_JUMP(*addr >= data) - return; - case 10: - MEMACC_COND_JUMP(*addr <= data) - return; - case 11: - MEMACC_COND_JUMP(*addr < data) - return; - case 12: - MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data]) - return; - case 13: - MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data]) - return; - case 14: - MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data]) - return; - case 15: - MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data]) - return; - case 16: - MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data]) - return; - case 17: - MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data]) - return; - default: - return; - } - -cond_true: - { - void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]); - func(mplayInfo, track); - return; - } - -cond_false: - track->cmdPtr += 4; -} - -void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 n = *track->cmdPtr; - track->cmdPtr++; - - gXcmdTable[n](mplayInfo, track); -} - -void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]); - func(mplayInfo, track); -} - -#define READ_XCMD_BYTE(var, n) \ -{ \ - u32 byte = track->cmdPtr[(n)]; \ - byte <<= n * 8; \ - (var) &= ~(0xFF << (n * 8)); \ - (var) |= byte; \ -} - -void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 wav; - - READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable - READ_XCMD_BYTE(wav, 1) - READ_XCMD_BYTE(wav, 2) - READ_XCMD_BYTE(wav, 3) - - track->tone.wav = (struct WaveData *)wav; - track->cmdPtr += 4; -} - -void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.type = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.attack = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.decay = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.sustain = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.release = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->echoVolume = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->echoLength = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.length = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.pan_sweep = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 unk; - - READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable - READ_XCMD_BYTE(unk, 1) - - if (track->unk_3A < (u16)unk) - { - track->unk_3A++; - track->cmdPtr -= 2; - track->wait = 1; - } - else - { - track->unk_3A = 0; - track->cmdPtr += 2; - } -} - -void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 unk; - - READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable - READ_XCMD_BYTE(unk, 1) - READ_XCMD_BYTE(unk, 2) - READ_XCMD_BYTE(unk, 3) - - track->unk_3C = unk; - track->cmdPtr += 4; -} - -void DummyFunc(void) -{ -} - -struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone) -{ - u32 maxClock = 0; - s32 maxClockIndex = 0; - s32 i; - struct MusicPlayerInfo *mplayInfo; - - for (i = 0; i < MAX_POKEMON_CRIES; i++) - { - struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; - - if (!track->flags && (!track->chan || track->chan->track != track)) - goto start_song; - - if (maxClock < gPokemonCryMusicPlayers[i].clock) - { - maxClock = gPokemonCryMusicPlayers[i].clock; - maxClockIndex = i; - } - } - - i = maxClockIndex; - -start_song: - mplayInfo = &gPokemonCryMusicPlayers[i]; - mplayInfo->ident++; - -#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong)) -#define CRY_OFS(field) offsetof(struct PokemonCrySong, field) - - memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong)); - - *(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone; - *(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0); - *(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1); - *(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont); - -#undef CRY_OFS -#undef CRY - - mplayInfo->ident = ID_NUMBER; - - MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i])); - - return mplayInfo; -} - -void SetPokemonCryVolume(u8 val) -{ - gPokemonCrySong.volumeValue = val & 0x7F; -} - -void SetPokemonCryPanpot(s8 val) -{ - gPokemonCrySong.panValue = (val + C_V) & 0x7F; -} - -void SetPokemonCryPitch(s16 val) -{ - s16 b = val + 0x80; - u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue; - gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F; - gPokemonCrySong.tuneValue = (b >> 1) & 0x7F; - gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F; -} - -void SetPokemonCryLength(u16 val) -{ - gPokemonCrySong.unkCmd0CParam = val; -} - -void SetPokemonCryRelease(u8 val) -{ - gPokemonCrySong.releaseValue = val; -} - -void SetPokemonCryProgress(u32 val) -{ - gPokemonCrySong.unkCmd0DParam = val; -} - -int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo) -{ - struct MusicPlayerTrack *track = mplayInfo->tracks; - - if (track->chan && track->chan->track == track) - return 1; - else - return 0; -} - -void SetPokemonCryChorus(s8 val) -{ - if (val) - { - gPokemonCrySong.trackCount = 2; - gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F; - } - else - { - gPokemonCrySong.trackCount = 1; - } -} - -void SetPokemonCryStereo(u32 val) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - if (val) - { - REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT - | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT - | SOUND_ALL_MIX_FULL; - soundInfo->mode &= ~1; - } - else - { - REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT - | SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT - | SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL; - soundInfo->mode |= 1; - } -} - -void SetPokemonCryPriority(u8 val) -{ - gPokemonCrySong.priority = val; -} diff --git a/src/m4a_tables.c b/src/m4a_tables.c deleted file mode 100644 index 91f00a31d..000000000 --- a/src/m4a_tables.c +++ /dev/null @@ -1,307 +0,0 @@ -#include "gba/m4a_internal.h" - -// Some of these functions have different signatures, so we need to make this -// an array of void pointers or a struct. It's simpler to just make it an array -// for now. -void * const gMPlayJumpTableTemplate[] = -{ - ply_fine, - ply_goto, - ply_patt, - ply_pend, - ply_rept, - ply_fine, - ply_fine, - ply_fine, - ply_fine, - ply_prio, - ply_tempo, - ply_keysh, - ply_voice, - ply_vol, - ply_pan, - ply_bend, - ply_bendr, - ply_lfos, - ply_lfodl, - ply_mod, - ply_modt, - ply_fine, - ply_fine, - ply_tune, - ply_fine, - ply_fine, - ply_fine, - ply_port, - ply_fine, - ply_endtie, - SampleFreqSet, - TrackStop, - FadeOutBody, - TrkVolPitSet, - RealClearChain, - SoundMainBTM, -}; - -// This is a table of deltas between sample values in compressed PCM data. -const s8 gDeltaEncodingTable[] = -{ - 0, - 1, - 4, - 9, - 16, - 25, - 36, - 49, - -64, - -49, - -36, - -25, - -16, - -9, - -4, - -1, -}; - -const u8 gScaleTable[] = -{ - 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, - 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, - 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, -}; - -const u32 gFreqTable[] = -{ - 2147483648u, - 2275179671u, - 2410468894u, - 2553802834u, - 2705659852u, - 2866546760u, - 3037000500u, - 3217589947u, - 3408917802u, - 3611622603u, - 3826380858u, - 4053909305u, -}; - -const u16 gPcmSamplesPerVBlankTable[] = -{ - 96, - 132, - 176, - 224, - 264, - 304, - 352, - 448, - 528, - 608, - 672, - 704, -}; - -const u8 gCgbScaleTable[] = -{ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, -}; - -const s16 gCgbFreqTable[] = -{ - -2004, - -1891, - -1785, - -1685, - -1591, - -1501, - -1417, - -1337, - -1262, - -1192, - -1125, - -1062, -}; - -const u8 gNoiseTable[] = -{ - 0xD7, 0xD6, 0xD5, 0xD4, - 0xC7, 0xC6, 0xC5, 0xC4, - 0xB7, 0xB6, 0xB5, 0xB4, - 0xA7, 0xA6, 0xA5, 0xA4, - 0x97, 0x96, 0x95, 0x94, - 0x87, 0x86, 0x85, 0x84, - 0x77, 0x76, 0x75, 0x74, - 0x67, 0x66, 0x65, 0x64, - 0x57, 0x56, 0x55, 0x54, - 0x47, 0x46, 0x45, 0x44, - 0x37, 0x36, 0x35, 0x34, - 0x27, 0x26, 0x25, 0x24, - 0x17, 0x16, 0x15, 0x14, - 0x07, 0x06, 0x05, 0x04, - 0x03, 0x02, 0x01, 0x00, -}; - -const u8 gCgb3Vol[] = -{ - 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, - 0x40, 0x40, 0x40, 0x40, - 0x80, 0x80, 0x80, 0x80, - 0x20, 0x20, -}; - -const u8 gClockTable[] = -{ - 0x00, - 0x01, - 0x02, - 0x03, - 0x04, - 0x05, - 0x06, - 0x07, - 0x08, - 0x09, - 0x0A, - 0x0B, - 0x0C, - 0x0D, - 0x0E, - 0x0F, - 0x10, - 0x11, - 0x12, - 0x13, - 0x14, - 0x15, - 0x16, - 0x17, - 0x18, - 0x1C, - 0x1E, - 0x20, - 0x24, - 0x28, - 0x2A, - 0x2C, - 0x30, - 0x34, - 0x36, - 0x38, - 0x3C, - 0x40, - 0x42, - 0x44, - 0x48, - 0x4C, - 0x4E, - 0x50, - 0x54, - 0x58, - 0x5A, - 0x5C, - 0x60, -}; - -#define FINE 0xb1 -#define GOTO 0xb2 -#define PATT 0xb3 -#define PEND 0xb4 -#define REPT 0xb5 -#define MEMACC 0xb9 -#define PRIO 0xba -#define TEMPO 0xbb -#define KEYSH 0xbc -#define VOICE 0xbd -#define VOL 0xbe -#define PAN 0xbf -#define BEND 0xc0 -#define BENDR 0xc1 -#define LFOS 0xc2 -#define LFODL 0xc3 -#define MOD 0xc4 -#define MODT 0xc5 -#define TUNE 0xc8 - -#define XCMD 0xcd -#define xRELE 0x07 -#define xIECV 0x08 -#define xIECL 0x09 - -#define EOT 0xce -#define TIE 0xcf - -const struct PokemonCrySong gPokemonCrySongTemplate = -{ - 1, // track count - 0, // block count - 255, // priority - 0, // reverb - (struct ToneData *)&voicegroup_pokemon_cry, - NULL, - NULL, - 0, - TUNE, // part 0 - C_V, // TUNE value - GOTO, - 0, // GOTO target address - TUNE, // part 1 - C_V + 16, // TUNE value - {VOICE, 0}, // part 0 jumps here with GOTO - VOL, - 127, // volume - {XCMD, 0x0D}, - 0, // unk value - {XCMD, xRELE}, - 0, // release - PAN, - C_V, // PAN value - TIE, - 60, // TIE key (default is Cn3) - 127, // TIE velocity - {XCMD, 0x0C}, - 60, // unk value - {EOT, FINE} // end -}; - -const XcmdFunc gXcmdTable[] = -{ - ply_xxx, - ply_xwave, - ply_xtype, - ply_xxx, - ply_xatta, - ply_xdeca, - ply_xsust, - ply_xrele, - ply_xiecv, - ply_xiecl, - ply_xleng, - ply_xswee, - ply_xcmd_0C, - ply_xcmd_0D, -}; diff --git a/src/mail.c b/src/mail.c deleted file mode 100644 index 658d37976..000000000 --- a/src/mail.c +++ /dev/null @@ -1,437 +0,0 @@ -#include "global.h" -#include "mail.h" -#include "easy_chat.h" -#include "items.h" -#include "mail_data.h" -#include "menu.h" -#include "menu_helpers.h" -#include "name_string_util.h" -#include "palette.h" -#include "pokemon_icon.h" -#include "rom4.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "text.h" -#include "unknown_task.h" - -struct UnkMailStruct -{ - u8 unk_0_0:2; - u8 unk_0_2:2; - u8 unk_0_4:4; -}; - -struct MailLayout -{ - u8 var0; - u8 var1; - u8 var2; - u8 var3_0:4; - u8 var3_4:4; - struct UnkMailStruct *var4; -}; - -struct Unk2000000 -{ - /* 0x00*/ u8 words[8][27]; - /* 0xD8*/ u8 varD8[20]; - /* 0xEC*/ MainCallback varEC; - /* 0xF0*/ MainCallback varF0; - /* 0xF4*/ struct MailStruct *varF4; - /* 0xF8*/ u8 varF8; - /* 0xF9*/ u8 varF9; - /* 0xFA*/ u8 varFA; - /* 0xFB*/ u8 varFB; - /* 0xFC*/ u8 varFC; - u8 padFD[1]; - /* 0xFE*/ u8 varFE; - /* 0xFF*/ u8 varFF; - /*0x100*/ u8 var100; - u8 pad101[3]; - /*0x104*/ MainCallback var104; - /*0x108*/ MainCallback var108; - /*0x10C*/ struct MailLayout *var10C; -}; - -struct MailGraphics -{ - u16 (*palette)[]; - u8 (*tiles)[]; - u8 (*tileMap)[]; - u16 var0C; - u16 var0E; - u16 color10; - u16 color12; -}; - -extern u8 ewram[]; -#define ewram0 (*(struct Unk2000000 *)(ewram)) - -extern struct MailGraphics gMailGraphicsTable[]; -extern u16 gUnknown_083E562C[][2]; - -extern struct MailLayout gUnknown_083E5730[]; -extern struct MailLayout gUnknown_083E57A4[]; - -static u8 sub_80F8A28(void); -static void sub_80F8D50(void); -static void sub_80F8DA0(void); -static void sub_80F8E80(void); -static void sub_80F8F18(void); -static void sub_80F8F2C(void); -static void sub_80F8F58(void); -static void sub_80F8F78(void); -static void sub_80F8FB4(void); - -void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) -{ - u16 mailDesign; - u16 buffer[2]; - - ewram0.varFF = GAME_LANGUAGE; - ewram0.var100 = 1; - ewram0.var104 = (MainCallback)sub_80EB3FC; - ewram0.var108 = (MainCallback)ConvertEasyChatWordsToString; - - mailDesign = arg0->itemId - ITEM_ORANGE_MAIL; - - if (mailDesign <= 11) - { - ewram0.varFA = arg0->itemId - ITEM_ORANGE_MAIL; - } - else - { - ewram0.varFA = 0; - arg2 = FALSE; - } - - switch (ewram0.var100) - { - case 0: - default: - ewram0.var10C = &gUnknown_083E5730[ewram0.varFA]; - break; - - case 1: - ewram0.var10C = &gUnknown_083E57A4[ewram0.varFA]; - break; - } - - if (((MailSpeciesToSpecies(arg0->species, buffer) << 16) + 0xFFFF0000) <= (410 << 16)) - { - switch (ewram0.varFA) - { - case 6: - ewram0.varFB = 1; - break; - - case 9: - ewram0.varFB = 2; - break; - - default: - ewram0.varFB = 0; - break; - } - } - else - { - ewram0.varFB = 0; - } - - - ewram0.varF4 = arg0; - ewram0.varEC = arg1; - ewram0.varF8 = arg2; - - SetMainCallback2(sub_80F8D50); -} - -#define RETURN_UP_STATE break -#define RETURN_SKIP_STATE return FALSE - -static u8 sub_80F8A28(void) -{ - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - remove_some_task(); - REG_DISPCNT = 0; - RETURN_UP_STATE; - - case 1: CpuFill16(0, (void *)OAM, OAM_SIZE); - RETURN_UP_STATE; - - case 2: - ResetPaletteFade(); - RETURN_UP_STATE; - - case 3: - ResetTasks(); - RETURN_UP_STATE; - - case 4: - ResetSpriteData(); - RETURN_UP_STATE; - - case 5: - FreeAllSpritePalettes(); - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2VOFS = 0; - REG_BG2HOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - RETURN_UP_STATE; - - case 6: - SetUpWindowConfig(&gWindowConfig_81E6DFC); - RETURN_UP_STATE; - - case 7: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6DFC); - RETURN_UP_STATE; - - case 8: - if (MultistepInitMenuWindowContinue() == 0) - { - return FALSE; - } - RETURN_UP_STATE; - - case 9: - MenuZeroFillScreen(); - RETURN_UP_STATE; - - case 10: CpuFill16(1, (void *)(VRAM + 0x4800), 0x800); - RETURN_UP_STATE; - - case 11: - LoadPalette(gMailGraphicsTable[ewram0.varFA].palette, 0, 16 * 2); - RETURN_UP_STATE; - - case 12: - LZ77UnCompVram(gMailGraphicsTable[ewram0.varFA].tileMap, (void *)(VRAM + 0x4000)); - RETURN_UP_STATE; - - case 13: - LZ77UnCompVram(gMailGraphicsTable[ewram0.varFA].tiles, (void *)(VRAM)); - - gPlttBufferUnfaded[241] = gMailGraphicsTable[ewram0.varFA].color10; - gPlttBufferUnfaded[248] = gMailGraphicsTable[ewram0.varFA].color12; - gPlttBufferUnfaded[10] = gUnknown_083E562C[gSaveBlock2.playerGender][0]; - gPlttBufferUnfaded[11] = gUnknown_083E562C[gSaveBlock2.playerGender][1]; - RETURN_UP_STATE; - - case 14: - if (ewram0.varF8 != 0) - { - sub_80F8DA0(); - } - RETURN_UP_STATE; - - case 15: - if (ewram0.varF8 != 0) - { - sub_80F8E80(); - } - - SetVBlankCallback(sub_80F8F18); - gPaletteFade.bufferTransferDisabled = 1; - RETURN_UP_STATE; - - case 16: - { - u16 local1; - - local1 = sub_809D4A8(ewram0.varF4->species); - - switch (ewram0.varFB) - { - case 1: - sub_809D580(local1); - ewram0.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 96, 128, 0); - break; - - case 2: - sub_809D580(local1); - ewram0.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 40, 128, 0); - break; - } - RETURN_UP_STATE; - } - - case 17: - if (sub_8055870() != TRUE) - { - RETURN_UP_STATE; - } - RETURN_SKIP_STATE; - - case 18: - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x512; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BLDCNT = 0; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - gPaletteFade.bufferTransferDisabled = 0; - ewram0.varF0 = sub_80F8F58; - return TRUE; - - default: - return FALSE; - } - - gMain.state += 1; - return FALSE; -} - -static void sub_80F8D50(void) -{ - do - { - if (sub_80F8A28() == 1) - { - SetMainCallback2(sub_80F8F2C); - return; - } - } while (sub_80F9344() != 1); -} - -static u8 *sub_80F8D7C(u8 *dest, u8 *src) -{ - u16 length; - - StringCopy(dest, src); - SanitizeNameString(dest); - - length = StringLength(dest); - - return dest + length; -} - -static void sub_80F8DA0(void) -{ - u16 i; - u8 r6; - u8 *ptr; - - r6 = 0; - for (i = 0; i < ewram0.var10C->var0; i++) - { - ConvertEasyChatWordsToString(ewram0.words[i], &ewram0.varF4->words[r6], ewram0.var10C->var4[i].unk_0_2, 1); - r6 += ewram0.var10C->var4[i].unk_0_2; - } - ptr = ewram0.varD8; - if (ewram0.var100 == 0) - { - ptr = sub_80F8D7C(ptr, ewram0.varF4->playerName); - StringCopy(ptr, gOtherText_From); - ewram0.varF9 = ewram0.var10C->var2 - StringLength(ewram0.varD8); - - } - else - { - ptr = StringCopy(ptr, gOtherText_From); - sub_80F8D7C(ptr, ewram0.varF4->playerName); - ewram0.varF9 = ewram0.var10C->var2; - } -} - -static void sub_80F8E80(void) -{ - u16 pos; - u8 x; - u8 y = 0; - - for (pos = 0; pos < ewram0.var10C->var0; pos++) - { - if (ewram0.words[pos][0] == 0xFF) - { - continue; - } - - if (ewram0.words[pos][0] == 0x00) - { - continue; - } - - x = ewram0.var10C->var4[pos].unk_0_4; - y += ewram0.var10C->var4[pos].unk_0_0; - MenuPrint(ewram0.words[pos], ewram0.var10C->var3_4 + x, ewram0.var10C->var3_0 + y); - y += 2; - } - - MenuPrint(ewram0.varD8, ewram0.varF9, ewram0.var10C->var1); -} - -static void sub_80F8F18(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void sub_80F8F2C(void) -{ - if (ewram0.varFB != 0) - { - AnimateSprites(); - BuildOamBuffer(); - } - - ewram0.varF0(); -} - -static void sub_80F8F58(void) -{ - u8 local0; - - local0 = UpdatePaletteFade(); - if (local0 == 0) - { - ewram0.varF0 = sub_80F8F78; - } -} - -static void sub_80F8F78(void) -{ - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - ewram0.varF0 = sub_80F8FB4; - } -} - -static void sub_80F8FB4(void) -{ - u16 local1; - - if (UpdatePaletteFade()) - { - return; - } - - SetMainCallback2(ewram0.varEC); - switch (ewram0.varFB) - { - case 2: - case 1: - local1 = sub_809D4A8(ewram0.varF4->species); - sub_809D608(local1); - - sub_809D510(&gSprites[ewram0.varFC]); - break; - } - - memset(&ewram0, 0, 0x110); - ResetPaletteFade(); -} diff --git a/src/mail_data.c b/src/mail_data.c deleted file mode 100644 index ae3f4b3e8..000000000 --- a/src/mail_data.c +++ /dev/null @@ -1,208 +0,0 @@ -#include "global.h" -#include "mail_data.h" -#include "items.h" -#include "name_string_util.h" -#include "pokemon.h" -#include "pokemon_icon.h" -#include "species.h" -#include "text.h" - -void ClearMailData(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - ClearMailStruct(&gSaveBlock1.mail[i]); -} - -void ClearMailStruct(struct MailStruct *mail) -{ - int i; - - for (i = 0; i < 9; i++) - mail->words[i] = -1; - - for (i = 0; i < 8; i++) - mail->playerName[i] = -1; - - for (i = 0; i < 4; i++) - mail->trainerId[i] = 0; - - mail->species = 1; - mail->itemId = 0; -} - -bool8 MonHasMail(struct Pokemon *mon) -{ - u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); - if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF) - return TRUE; - else - return FALSE; -} - -u8 GiveMailToMon(struct Pokemon *mon, u16 itemId) -{ - u16 _itemId; - u8 heldItem[2]; - u8 id; - u8 i; - u16 species; - u32 personality; - - _itemId = itemId; - heldItem[0] = _itemId; - heldItem[1] = _itemId >> 8; - id = 0; - - while (id < 6) - { - if (gSaveBlock1.mail[id].itemId == 0) - { - for (i = 0; i < 9; i++) - gSaveBlock1.mail[id].words[i] = -1; - - for (i = 0; i < 7; i++) - gSaveBlock1.mail[id].playerName[i] = gSaveBlock2.playerName[i]; - gSaveBlock1.mail[id].playerName[i] = EOS; - PadNameString(gSaveBlock1.mail[id].playerName, 0); - - for (i = 0; i < 4; i++) - gSaveBlock1.mail[id].trainerId[i] = gSaveBlock2.playerTrainerId[i]; - - species = GetBoxMonData(&mon->box, MON_DATA_SPECIES); - personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY); - gSaveBlock1.mail[id].species = SpeciesToMailSpecies(species, personality); - gSaveBlock1.mail[id].itemId = _itemId; - SetMonData(mon, MON_DATA_MAIL, &id); - SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); - return id; - } - id++; - } - - return -1; -} - -u16 SpeciesToMailSpecies(u16 species, u32 personality) -{ - if (species == SPECIES_UNOWN) - { - int mailSpecies = GetUnownLetterByPersonality(personality) + 30000; - return mailSpecies; - } - - return species; -} - -u16 MailSpeciesToSpecies(u16 a1, u16 *a2) -{ - u16 result; - - if (a1 >= 30000 && a1 < (30000 + UNOWN_FORM_COUNT)) - { - result = SPECIES_UNOWN; - *a2 = a1 - 30000; - } - else - { - result = a1; - } - - return result; -} - -u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail) -{ - u8 heldItem[2]; - u16 itemId = mail->itemId; - u8 mailId = GiveMailToMon(mon, itemId); - - if (mailId == 0xFF) - return 0xFF; - - gSaveBlock1.mail[mailId] = *mail; - - SetMonData(mon, MON_DATA_MAIL, &mailId); - - heldItem[0] = itemId; - heldItem[1] = itemId >> 8; - - SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); - - return mailId; -} - -int unref_sub_80A2DF4(void) -{ - return 0; -} - -void TakeMailFromMon(struct Pokemon *mon) -{ - u8 heldItem[2]; - u8 mailId; - - if (MonHasMail(mon)) - { - mailId = GetMonData(mon, MON_DATA_MAIL); - gSaveBlock1.mail[mailId].itemId = 0; - mailId = 0xFF; - heldItem[0] = 0; - heldItem[1] = 0; - SetMonData(mon, MON_DATA_MAIL, &mailId); - SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); - } -} - -void DeleteMail(u8 mailId) -{ - gSaveBlock1.mail[mailId].itemId = 0; -} - -u8 TakeMailFromMon2(struct Pokemon *mon) -{ - u8 i; - u8 newHeldItem[2]; - u8 newMailId; - - newHeldItem[0] = 0; - newHeldItem[1] = 0; - newMailId = 0xFF; - - for (i = 6; i < 16; i++) - { - if (gSaveBlock1.mail[i].itemId == 0) - { - memcpy(&gSaveBlock1.mail[i], &gSaveBlock1.mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct)); - gSaveBlock1.mail[GetMonData(mon, MON_DATA_MAIL)].itemId = 0; - SetMonData(mon, MON_DATA_MAIL, &newMailId); - SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem); - return i; - } - } - - return 0xFF; -} - -bool8 ItemIsMail(u16 itemId) -{ - switch (itemId) - { - case ITEM_ORANGE_MAIL: - case ITEM_HARBOR_MAIL: - case ITEM_GLITTER_MAIL: - case ITEM_MECH_MAIL: - case ITEM_WOOD_MAIL: - case ITEM_WAVE_MAIL: - case ITEM_BEAD_MAIL: - case ITEM_SHADOW_MAIL: - case ITEM_TROPIC_MAIL: - case ITEM_DREAM_MAIL: - case ITEM_FAB_MAIL: - case ITEM_RETRO_MAIL: - return TRUE; - default: - return FALSE; - } -} diff --git a/src/main.c b/src/main.c deleted file mode 100644 index afaa0e77a..000000000 --- a/src/main.c +++ /dev/null @@ -1,363 +0,0 @@ -#include "global.h" -#include "gba/flash_internal.h" -#include "gba/m4a_internal.h" -#include "main.h" -#include "intro.h" -#include "link.h" -#include "load_save.h" -#include "m4a.h" -#include "play_time.h" -#include "rng.h" -#include "rom3.h" -#include "rom4.h" -#include "rtc.h" -#include "siirtc.h" -#include "sound.h" -#include "unknown_task.h" - -extern struct SoundInfo gSoundInfo; -extern u32 IntrMain[]; - -static void VBlankIntr(void); -static void HBlankIntr(void); -static void VCountIntr(void); -static void SerialIntr(void); -static void IntrDummy(void); - -#ifdef SAPPHIRE -#define GAME_VERSION VERSION_SAPPHIRE -#else -#define GAME_VERSION VERSION_RUBY -#endif - -const u8 gGameVersion = GAME_VERSION; - -const u8 gGameLanguage = GAME_LANGUAGE; - -#if defined(ENGLISH) -const char BuildDateTime[] = "2002 10 15 20:34"; -#elif defined(GERMAN) -const char BuildDateTime[] = "$Name: debug-Euro-2003-05-09-A $"; -#endif - -const IntrFunc gIntrTableTemplate[] = -{ - SerialIntr, // Serial interrupt - Timer3Intr, // Timer 3 interrupt - HBlankIntr, // H-blank interrupt - VBlankIntr, // V-blank interrupt - VCountIntr, // V-count interrupt - IntrDummy, // Timer 0 interrupt - IntrDummy, // Timer 1 interrupt - IntrDummy, // Timer 2 interrupt - IntrDummy, // DMA 0 interrupt - IntrDummy, // DMA 1 interrupt - IntrDummy, // DMA 2 interrupt - IntrDummy, // DMA 3 interrupt - IntrDummy, // Key interrupt - IntrDummy, // Game Pak interrupt -}; - -#define INTR_COUNT ((int)(sizeof(gIntrTableTemplate)/sizeof(IntrFunc))) - -u16 gKeyRepeatStartDelay; -bool8 gLinkTransferringData; -struct Main gMain; -u16 gKeyRepeatContinueDelay; -u8 gSoftResetDisabled; -IntrFunc gIntrTable[INTR_COUNT]; -bool8 gLinkVSyncDisabled; -u32 IntrMain_Buffer[0x200]; -u8 gPcmDmaCounter; - -EWRAM_DATA void (**gFlashTimerIntrFunc)(void) = NULL; - -static void UpdateLinkAndCallCallbacks(void); -static void InitMainCallbacks(void); -static void CallCallbacks(void); -static void SeedRngWithRtc(void); -static void ReadKeys(void); -static void InitIntrHandlers(void); -static void WaitForVBlank(void); - -#define B_START_SELECT (B_BUTTON | START_BUTTON | SELECT_BUTTON) - -void AgbMain() -{ - RegisterRamReset(RESET_ALL); - REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3; - InitKeys(); - InitIntrHandlers(); - m4aSoundInit(); - RtcInit(); - CheckForFlashMemory(); - InitMainCallbacks(); - InitMapMusic(); - SeedRngWithRtc(); - - gSoftResetDisabled = FALSE; - - if (gFlashMemoryPresent != TRUE) - SetMainCallback2(NULL); - - gLinkTransferringData = FALSE; - - for (;;) - { - ReadKeys(); - - if (gSoftResetDisabled == FALSE - && (gMain.heldKeysRaw & A_BUTTON) - && (gMain.heldKeysRaw & B_START_SELECT) == B_START_SELECT) - DoSoftReset(); - - if (gLink.sendQueue.count > 1 && sub_8055910() == 1) - { - gLinkTransferringData = TRUE; - UpdateLinkAndCallCallbacks(); - gLinkTransferringData = FALSE; - } - else - { - gLinkTransferringData = FALSE; - UpdateLinkAndCallCallbacks(); - - if (gLink.recvQueue.count > 1) - { - if (sub_80558AC() == 1) - { - gMain.newKeys = 0; - gLinkTransferringData = TRUE; - UpdateLinkAndCallCallbacks(); - gLinkTransferringData = FALSE; - } - } - } - - PlayTimeCounter_Update(); - MapMusicMain(); - WaitForVBlank(); - } -} - -static void UpdateLinkAndCallCallbacks(void) -{ - gLinkStatus = LinkMain1(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds); - LinkMain2(&gMain.heldKeys); - if (!(gLinkStatus & LINK_STAT_RECEIVED_NOTHING) || sub_8055940() != 1) - CallCallbacks(); -} - -static void InitMainCallbacks(void) -{ - gMain.vblankCounter1 = 0; - gMain.vblankCounter2 = 0; - gMain.callback1 = NULL; - SetMainCallback2(CB2_InitCopyrightScreenAfterBootup); -} - -static void CallCallbacks(void) -{ - if (gMain.callback1) - gMain.callback1(); - - if (gMain.callback2) - gMain.callback2(); -} - -void SetMainCallback2(MainCallback callback) -{ - gMain.callback2 = callback; - gMain.state = 0; -} - -static void SeedRngWithRtc(void) -{ - u32 seed = RtcGetMinuteCount(); - seed = (seed >> 16) ^ (seed & 0xFFFF); - SeedRng(seed); -} - -void InitKeys(void) -{ - gKeyRepeatContinueDelay = 5; - gKeyRepeatStartDelay = 40; - - gMain.heldKeys = 0; - gMain.newKeys = 0; - gMain.newAndRepeatedKeys = 0; - gMain.heldKeysRaw = 0; - gMain.newKeysRaw = 0; -} - -static void ReadKeys(void) -{ - u16 keyInput = REG_KEYINPUT ^ KEYS_MASK; - gMain.newKeysRaw = keyInput & ~gMain.heldKeysRaw; - gMain.newKeys = gMain.newKeysRaw; - gMain.newAndRepeatedKeys = gMain.newKeysRaw; - - // BUG: Key repeat won't work when pressing L using L=A button mode - // because it compares the raw key input with the remapped held keys. - // Note that newAndRepeatedKeys is never remapped either. - - if (keyInput != 0 && gMain.heldKeys == keyInput) - { - gMain.keyRepeatCounter--; - - if (gMain.keyRepeatCounter == 0) - { - gMain.newAndRepeatedKeys = keyInput; - gMain.keyRepeatCounter = gKeyRepeatContinueDelay; - } - } - else - { - // If there is no input or the input has changed, reset the counter. - gMain.keyRepeatCounter = gKeyRepeatStartDelay; - } - - gMain.heldKeysRaw = keyInput; - gMain.heldKeys = gMain.heldKeysRaw; - - // Remap L to A if the L=A option is enabled. - if (gSaveBlock2.optionsButtonMode == 2) - { - if (gMain.newKeys & L_BUTTON) - gMain.newKeys |= A_BUTTON; - - if (gMain.heldKeys & L_BUTTON) - gMain.heldKeys |= A_BUTTON; - } - - if (gMain.newKeys & gMain.watchedKeysMask) - gMain.watchedKeysPressed = TRUE; -} - -static void InitIntrHandlers(void) -{ - int i; - - for (i = 0; i < INTR_COUNT; i++) - gIntrTable[i] = gIntrTableTemplate[i]; - - DmaCopy32(3, IntrMain, IntrMain_Buffer, sizeof(IntrMain_Buffer)); - - INTR_VECTOR = IntrMain_Buffer; - - SetVBlankCallback(NULL); - SetHBlankCallback(NULL); - SetSerialCallback(NULL); - - REG_IME = 1; - REG_IE = INTR_FLAG_VBLANK; - REG_DISPSTAT = DISPSTAT_VBLANK_INTR; - REG_IE |= INTR_FLAG_VBLANK; -} - -void SetVBlankCallback(IntrCallback callback) -{ - gMain.vblankCallback = callback; -} - -void SetHBlankCallback(IntrCallback callback) -{ - gMain.hblankCallback = callback; -} - -void SetVCountCallback(IntrCallback callback) -{ - gMain.vcountCallback = callback; -} - -void SetSerialCallback(IntrCallback callback) -{ - gMain.serialCallback = callback; -} - -static void VBlankIntr(void) -{ - u16 savedIme; - - if (!gLinkVSyncDisabled) - LinkVSync(); - - savedIme = REG_IME; - REG_IME = 0; - m4aSoundVSync(); - REG_IME = savedIme; - - gMain.vblankCounter1++; - - if (gMain.vblankCallback) - gMain.vblankCallback(); - - gMain.vblankCounter2++; - - gPcmDmaCounter = gSoundInfo.pcmDmaCounter; - - m4aSoundMain(); - sub_800C35C(); - Random(); - - INTR_CHECK |= INTR_FLAG_VBLANK; - gMain.intrCheck |= INTR_FLAG_VBLANK; -} - -void InitFlashTimer(void) -{ - SetFlashTimerIntr(2, gFlashTimerIntrFunc); -} - -static void HBlankIntr(void) -{ - if (gMain.hblankCallback) - gMain.hblankCallback(); - - INTR_CHECK |= INTR_FLAG_HBLANK; - gMain.intrCheck |= INTR_FLAG_HBLANK; -} - -static void VCountIntr(void) -{ - if (gMain.vcountCallback) - gMain.vcountCallback(); - - INTR_CHECK |= INTR_FLAG_VCOUNT; - gMain.intrCheck |= INTR_FLAG_VCOUNT; -} - -static void SerialIntr(void) -{ - if (gMain.serialCallback) - gMain.serialCallback(); - - INTR_CHECK |= INTR_FLAG_SERIAL; - gMain.intrCheck |= INTR_FLAG_SERIAL; -} - -static void IntrDummy(void) -{} - -static void WaitForVBlank(void) -{ - gMain.intrCheck &= ~INTR_FLAG_VBLANK; - VBlankIntrWait(); -} - -void DoSoftReset(void) -{ - REG_IME = 0; - m4aSoundVSyncOff(); - remove_some_task(); - DmaStop(1); - DmaStop(2); - DmaStop(3); - SiiRtcProtect(); - SoftReset(RESET_ALL); -} - -void ClearPokemonCrySongs(void) -{ - CpuFill16(0, gPokemonCrySongs, MAX_POKEMON_CRIES * sizeof(struct PokemonCrySong)); -} diff --git a/src/main_menu.c b/src/main_menu.c deleted file mode 100644 index 09fd06d9e..000000000 --- a/src/main_menu.c +++ /dev/null @@ -1,1639 +0,0 @@ -#include "global.h" -#include "main_menu.h" -#include "data2.h" -#include "decompress.h" -#include "event_data.h" -#include "field_effect.h" -#include "menu.h" -#include "mystery_event_menu.h" -#include "naming_screen.h" -#include "option_menu.h" -#include "palette.h" -#include "pokeball.h" -#include "rom4.h" -#include "rtc.h" -#include "save_menu_util.h" -#include "songs.h" -#include "sound.h" -#include "species.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" -#include "title_screen.h" -#include "unknown_task.h" - -#define BirchSpeechUpdateWindowText() ((u8)MenuUpdateWindowText_OverrideLineLength(24)) - -extern struct PaletteFadeControl gPaletteFade; - -extern u16 gSaveFileStatus; - -extern u16 gMainMenuPalette[]; - -extern const u8 gBirchSpeech_Welcome[]; -extern const u8 gBirchSpeech_ThisIsPokemon[]; -extern const u8 gBirchSpeech_WorldInhabitedByPokemon[]; -extern const u8 gBirchSpeech_AndYouAre[]; -extern const u8 gBirchSpeech_AreYouBoyOrGirl[]; -extern const u8 gBirchSpeech_WhatsYourName[]; -extern u8 gBirchSpeech_SoItsPlayer[]; -extern u8 gBirchSpeech_AhOkayYouArePlayer[]; -extern u8 gBirchSpeech_AreYouReady[]; - -extern struct SpriteTemplate gUnknown_02024E8C; -extern u16 gUnknown_081E795C[]; -extern const struct MenuAction gUnknown_081E79B0[]; -extern const struct MenuAction gMalePresetNames[]; -extern const struct MenuAction gFemalePresetNames[]; - -extern const u8 gUnknown_081E764C[]; -extern const u8 gBirchIntroShadowGfx[]; -extern const u8 gUnknown_081E7834[]; -extern const u8 gUnknown_081E796C[]; - -extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E79AC[]; - -extern u8 unk_2000000[]; - -//Task data -enum { - TD_MENULAYOUT, - TD_SELECTEDMENUITEM, -}; - -//Menu layouts -enum { - HAS_NO_SAVED_GAME, //NEW GAME, OPTION - HAS_SAVED_GAME, //CONTINUE, NEW GAME, OPTION - HAS_MYSTERY_GIFT, //CONTINUE, NEW GAME, MYSTERY EVENTS, OPTION -}; - -//Task data -enum { - TD_TRAINER_SPRITE_ID = 2, //Trainer sprite being displayed during gender menu - TD_BGHOFS = 4, //Used to set REG_BG1HOFS and slide the platform around - TD_SUBTASK_DONE, //Set to true if the spawned task has finished - TD_GENDER_SELECTION, - TD_COUNTER, - TD_BIRCH_SPRITE_ID, - TD_AZURILL_SPRITE_ID, - TD_BRENDAN_SPRITE_ID, - TD_MAY_SPRITE_ID -}; - -static void CB2_MainMenu(void); -static void VBlankCB_MainMenu(void); -static void CB2_InitMainMenuFromOptions(void); -static u32 InitMainMenu(bool8 a1); -static void Task_MainMenuCheckSave(u8 taskId); -static void Task_MainMenuWaitForSaveErrorAck(u8 taskId); -static void Task_MainMenuCheckRtc(u8 taskId); -static void Task_MainMenuWaitForRtcErrorAck(u8 taskId); -static void Task_MainMenuDraw(u8 taskId); -static void Task_MainMenuHighlight(u8 taskId); -static bool8 MainMenuProcessKeyInput(u8 taskId); -static void Task_MainMenuProcessKeyInput(u8 taskId); -static void Task_MainMenuPressedA(u8 taskId); -static void Task_MainMenuPressedB(u8 taskId); -static void HighlightCurrentMenuItem(u8 layout, u8 menuItem); -static void PrintMainMenuItem(const u8 *text, u8 left, u8 top); -static void PrintSaveFileInfo(void); -static void PrintPlayerName(void); -static void PrintPlayTime(void); -static void PrintPokedexCount(void); -static void PrintBadgeCount(void); -static void Task_NewGameSpeech1(u8 taskId); -static void Task_NewGameSpeech2(u8 taskId); -static void Task_NewGameSpeech3(u8 taskId); -static void Task_NewGameSpeech4(u8 taskId); -static void Task_NewGameSpeech5(u8 taskId); -static void Task_NewGameSpeech6(u8 taskId); -static void Task_NewGameSpeech7(u8 taskId); -static void Task_NewGameSpeech8(u8 taskId); -static void Task_NewGameSpeech9(u8 taskId); -static void Task_NewGameSpeech10(u8 taskId); -static void Task_NewGameSpeech11(u8 taskId); -static void Task_NewGameSpeech12(u8 taskId); -static void Task_NewGameSpeech13(u8 taskId); -static void Task_NewGameSpeech14(u8 taskId); -static void Task_NewGameSpeech15(u8 taskId); -static void Task_NewGameSpeech16(u8 taskId); -static void Task_NewGameSpeech17(u8 taskId); -static void Task_NewGameSpeech18(u8 taskId); -static void Task_NewGameSpeech19(u8 taskId); -static void Task_NewGameSpeech20(u8 taskId); -static void Task_NewGameSpeech21(u8 taskId); -static void Task_NewGameSpeech22(u8 taskId); -static void Task_NewGameSpeech23(u8 taskId); -static void Task_NewGameSpeech24(u8 taskId); -static void Task_NewGameSpeech25(u8 taskId); -static void Task_NewGameSpeech26(u8 taskId); -static void Task_NewGameSpeech27(u8 taskId); -static void Task_NewGameSpeech28(u8 taskId); -static void Task_NewGameSpeech29(u8 taskId); -static void Task_NewGameSpeech30(u8 taskId); -static void Task_NewGameSpeech31(u8 taskId); -static void Task_NewGameSpeech32(u8 taskId); -static void Task_NewGameSpeech33(u8 taskId); -static void CB_ContinueNewGameSpeechPart2(); -static void nullsub_34(struct Sprite *sprite); -static void ShrinkPlayerSprite(struct Sprite *sprite); -static u8 CreateAzurillSprite(u8 x, u8 y); -static void AddBirchSpeechObjects(u8 taskId); -static void Task_SpriteFadeOut(u8 taskId); -static void StartSpriteFadeOut(u8 taskId, u8 interval); -static void Task_SpriteFadeIn(u8 taskId); -static void StartSpriteFadeIn(u8 taskId, u8 interval); -static void HandleFloorShadowFadeOut(u8 taskId); -static void StartBackgroundFadeOut(u8 taskId, u8 interval); -static void HandleFloorShadowFadeIn(u8 taskId); -static void StartBackgroundFadeIn(u8 taskId, u8 interval); -static void CreateGenderMenu(u8 left, u8 top); -static s8 GenderMenuProcessInput(void); -static void CreateNameMenu(u8 left, u8 top); -static s8 NameMenuProcessInput(void); -static void SetPresetPlayerName(u8 index); - -static void CB2_MainMenu(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void VBlankCB_MainMenu(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void CB2_InitMainMenu(void) -{ - InitMainMenu(FALSE); -} - -static void CB2_InitMainMenuFromOptions(void) -{ - InitMainMenu(TRUE); -} - -u32 InitMainMenu(u8 a1) -{ - u16 savedIme; - u8 taskId; - - SetVBlankCallback(NULL); - - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *)OAM, OAM_SIZE); - DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); - - ResetPaletteFade(); - LoadPalette(gMainMenuPalette, 0, 32); - remove_some_task(); - ResetTasks(); - ResetSpriteData(); - FreeAllSpritePalettes(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E6CE4); - - if (a1) - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0x0000); // fade to black - else - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xFFFF); // fade to white - - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0; - REG_WINOUT = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - - SetVBlankCallback(VBlankCB_MainMenu); - SetMainCallback2(CB2_MainMenu); - - REG_DISPCNT = DISPCNT_MODE_0 - | DISPCNT_OBJ_1D_MAP - | DISPCNT_BG0_ON - | DISPCNT_OBJ_ON - | DISPCNT_WIN0_ON; - - taskId = CreateTask(Task_MainMenuCheckSave, 0); - gTasks[taskId].data[TD_SELECTEDMENUITEM] = 0; - - return 0; -} - -void Task_MainMenuCheckSave(u8 taskId) -{ - if (gPaletteFade.active) - return; - - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0x1111; - REG_WINOUT = 49; - REG_BLDCNT = 241; - REG_BLDALPHA = 0; - REG_BLDY = 7; - - switch (gSaveFileStatus) - { - case 1: - if (IsMysteryGiftEnabled() == TRUE) - gTasks[taskId].data[TD_MENULAYOUT] = HAS_MYSTERY_GIFT; - else - gTasks[taskId].data[TD_MENULAYOUT] = HAS_SAVED_GAME; - - gTasks[taskId].func = Task_MainMenuCheckRtc; - break; - case 2: - MenuDrawTextWindow(2, 14, 27, 19); - MenuPrintMessage(gSaveFileDeletedMessage, 3, 15); - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(113, 159); - gTasks[taskId].data[TD_MENULAYOUT] = HAS_NO_SAVED_GAME; - gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; - break; - case 255: - MenuDrawTextWindow(2, 14, 27, 19); - MenuPrintMessage(gSaveFileCorruptMessage, 3, 15); - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(113, 159); - gTasks[taskId].data[TD_MENULAYOUT] = HAS_SAVED_GAME; - gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; - - if (IsMysteryGiftEnabled() == TRUE) - gTasks[taskId].data[TD_MENULAYOUT] = HAS_MYSTERY_GIFT; - else - gTasks[taskId].data[TD_MENULAYOUT] = HAS_SAVED_GAME; - break; - case 0: - default: - gTasks[taskId].data[TD_MENULAYOUT] = HAS_NO_SAVED_GAME; - gTasks[taskId].func = Task_MainMenuCheckRtc; - break; - case 4: - MenuDrawTextWindow(2, 14, 27, 19); - MenuPrintMessage(gBoardNotInstalledMessage, 3, 15); - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(113, 159); - gTasks[taskId].data[TD_MENULAYOUT] = HAS_NO_SAVED_GAME; - gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; - return; - } -} - -void Task_MainMenuWaitForSaveErrorAck(u8 taskId) -{ - if (MenuUpdateWindowText()) - { - if (gMain.newKeys & A_BUTTON) - { - MenuZeroFillWindowRect(2, 14, 27, 19); - gTasks[taskId].func = Task_MainMenuCheckRtc; - } - } -} - -void Task_MainMenuCheckRtc(u8 taskId) -{ - if (!gPaletteFade.active) - { - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0x1111; - REG_WINOUT = 49; - REG_BLDCNT = 241; - REG_BLDALPHA = 0; - REG_BLDY = 7; - - if (!(RtcGetErrorStatus() & RTC_ERR_FLAG_MASK)) - { - gTasks[taskId].func = Task_MainMenuDraw; - } - else - { - MenuDrawTextWindow(2, 14, 27, 19); - MenuPrintMessage(gBatteryDryMessage, 3, 15); - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(113, 159); - gTasks[taskId].func = Task_MainMenuWaitForRtcErrorAck; - } - } -} - -void Task_MainMenuWaitForRtcErrorAck(u8 taskId) -{ - if (MenuUpdateWindowText()) - { - if ( gMain.newKeys & 1 ) - { - MenuZeroFillWindowRect(2, 14, 27, 19); - gTasks[taskId].func = Task_MainMenuDraw; - } - } -} - -void Task_MainMenuDraw(u8 taskId) -{ - u16 palette; - - if (!gPaletteFade.active) - { - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0x1111; - REG_WINOUT = 49; - REG_BLDCNT = 241; - REG_BLDALPHA = 0; - REG_BLDY = 7; - - palette = RGB(0, 0, 0); - LoadPalette(&palette, 254, 2); - - if (gSaveBlock2.playerGender == MALE) - { - palette = RGB(4, 16, 31); - LoadPalette(&palette, 241, 2); - } - else - { - palette = RGB(31, 3, 21); - LoadPalette(&palette, 241, 2); - } - - switch (gTasks[taskId].data[TD_MENULAYOUT]) - { - case HAS_NO_SAVED_GAME: - default: - MenuDrawTextWindow(1, 0, 28, 3); - PrintMainMenuItem(gMainMenuString_NewGame, 2, 1); - MenuDrawTextWindow(1, 4, 28, 7); - PrintMainMenuItem(gMainMenuString_Option, 2, 5); - break; - case HAS_SAVED_GAME: - MenuDrawTextWindow(1, 0, 28, 7); - PrintMainMenuItem(gMainMenuString_Continue, 2, 1); - MenuDrawTextWindow(1, 8, 28, 11); - PrintMainMenuItem(gMainMenuString_NewGame, 2, 9); - MenuDrawTextWindow(1, 12, 28, 15); - PrintMainMenuItem(gMainMenuString_Option, 2, 13); - PrintSaveFileInfo(); - break; - case HAS_MYSTERY_GIFT: - MenuDrawTextWindow(1, 0, 28, 7); - PrintMainMenuItem(gMainMenuString_Continue, 2, 1); - MenuDrawTextWindow(1, 8, 28, 11); - PrintMainMenuItem(gMainMenuString_NewGame, 2, 9); - MenuDrawTextWindow(1, 12, 28, 15); - PrintMainMenuItem(gMainMenuString_MysteryEvents, 2, 13); - MenuDrawTextWindow(1, 16, 28, 19); - PrintMainMenuItem(gMainMenuString_Option, 2, 0x11); - PrintSaveFileInfo(); - break; - } - - gTasks[taskId].func = Task_MainMenuHighlight; - } -} - -void Task_MainMenuHighlight(u8 taskId) -{ - HighlightCurrentMenuItem(gTasks[taskId].data[TD_MENULAYOUT], gTasks[taskId].data[TD_SELECTEDMENUITEM]); - gTasks[taskId].func = Task_MainMenuProcessKeyInput; -} - -bool8 MainMenuProcessKeyInput(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0x0000); - gTasks[taskId].func = Task_MainMenuPressedA; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); - REG_WIN0H = WIN_RANGE(0, 240); - REG_WIN0V = WIN_RANGE(0, 160); - gTasks[taskId].func = Task_MainMenuPressedB; - } - else - { - s32 menuItemCount; - - switch (gTasks[taskId].data[TD_MENULAYOUT]) - { - case HAS_NO_SAVED_GAME: - default: - menuItemCount = 2; - break; - case HAS_SAVED_GAME: - menuItemCount = 3; - break; - case HAS_MYSTERY_GIFT: - menuItemCount = 4; - break; - } - - if (gMain.newKeys & DPAD_UP) - { - if (gTasks[taskId].data[TD_SELECTEDMENUITEM] > 0) - { - gTasks[taskId].data[TD_SELECTEDMENUITEM]--; - return TRUE; - } - } - if (gMain.newKeys & DPAD_DOWN) - { - if (gTasks[taskId].data[TD_SELECTEDMENUITEM] < menuItemCount - 1) - { - gTasks[taskId].data[TD_SELECTEDMENUITEM]++; - return TRUE; - } - } - } - - return FALSE; -} - -void Task_MainMenuProcessKeyInput(u8 taskId) -{ - bool8 currentMenuItemChanged = MainMenuProcessKeyInput(taskId); - if (currentMenuItemChanged) - gTasks[taskId].func = Task_MainMenuHighlight; -} - -void Task_MainMenuPressedA(u8 taskId) -{ - enum - { - NEW_GAME, - CONTINUE, - OPTION, - MYSTERY_EVENTS, - } action; - - if (gPaletteFade.active) - return; - - switch (gTasks[taskId].data[TD_MENULAYOUT]) - { - case HAS_NO_SAVED_GAME: - default: - switch (gTasks[taskId].data[TD_SELECTEDMENUITEM]) - { - case 0: - default: - action = NEW_GAME; - break; - case 1: - action = OPTION; - break; - } - break; - case HAS_SAVED_GAME: - switch (gTasks[taskId].data[TD_SELECTEDMENUITEM]) - { - case 0: - default: - action = CONTINUE; - break; - case 1: - action = NEW_GAME; - break; - case 2: - action = OPTION; - break; - } - break; - case HAS_MYSTERY_GIFT: - switch (gTasks[taskId].data[TD_SELECTEDMENUITEM]) - { - case 0: - default: - action = CONTINUE; - break; - case 1: - action = NEW_GAME; - break; - case 2: - action = MYSTERY_EVENTS; - break; - case 3: - action = OPTION; - break; - } - break; - } - - switch ((int)action) - { - case NEW_GAME: - default: - gPlttBufferUnfaded[0] = 0; - gPlttBufferFaded[0] = 0; - gTasks[taskId].func = Task_NewGameSpeech1; - break; - case CONTINUE: - gPlttBufferUnfaded[0] = 0; - gPlttBufferFaded[0] = 0; - SetMainCallback2(CB2_ContinueSavedGame); - DestroyTask(taskId); - break; - case OPTION: - gMain.savedCallback = CB2_InitMainMenuFromOptions; - SetMainCallback2(CB2_InitOptionMenu); - DestroyTask(taskId); - break; - case MYSTERY_EVENTS: - SetMainCallback2(CB2_InitMysteryEventMenu); - DestroyTask(taskId); - break; - } -} - -void Task_MainMenuPressedB(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(CB2_InitTitleScreen); - DestroyTask(taskId); - } -} - -void HighlightCurrentMenuItem(u8 layout, u8 menuItem) -{ - REG_WIN0H = WIN_RANGE(9, 231); - - switch (layout) - { - case HAS_NO_SAVED_GAME: - default: - switch (menuItem) - { - case 0: - default: - REG_WIN0V = WIN_RANGE(1, 31); - break; - case 1: - REG_WIN0V = WIN_RANGE(33, 63); - break; - } - break; - case HAS_SAVED_GAME: - switch (menuItem) - { - case 0: - default: - REG_WIN0V = WIN_RANGE(1, 63); - break; - case 1: - REG_WIN0V = WIN_RANGE(65, 95); - break; - case 2: - REG_WIN0V = WIN_RANGE(97, 127); - break; - } - break; - case HAS_MYSTERY_GIFT: - switch (menuItem) - { - case 0: - default: - REG_WIN0V = WIN_RANGE(1, 63); - break; - case 1: - REG_WIN0V = WIN_RANGE(65, 95); - break; - case 2: - REG_WIN0V = WIN_RANGE(97, 127); - break; - case 3: - REG_WIN0V = WIN_RANGE(129, 159); - break; - } - break; - } -} - -void PrintMainMenuItem(const u8 *text, u8 left, u8 top) -{ - u8 i; - u8 buffer[32]; - - buffer[0] = 0xFC; - buffer[1] = 1; - buffer[2] = 14; - - for (i = 0; i < 26; i++) - buffer[3 + i] = text[i]; - - buffer[29] = EOS; - - MenuPrint(buffer, left, top); -} - -void PrintSaveFileInfo(void) -{ - PrintPlayerName(); - PrintPokedexCount(); - PrintPlayTime(); - PrintBadgeCount(); -} - -void PrintPlayerName(void) -{ - MenuPrint(gMainMenuString_Player, 2, 3); - MenuPrint(gSaveBlock2.playerName, 9, 3); -} - -void PrintPlayTime(void) -{ - u8 playTime[16]; - u8 alignedPlayTime[32]; - -#if defined(ENGLISH) - MenuPrint(gMainMenuString_Time, 16, 3); - FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); - sub_8072C74(alignedPlayTime, playTime, 48, 1); - MenuPrint(alignedPlayTime, 22, 3); -#elif defined(GERMAN) - MenuPrint_PixelCoords(gMainMenuString_Time, 124, 24, TRUE); - FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); - sub_8072C74(alignedPlayTime, playTime, 40, 1); - MenuPrint(alignedPlayTime, 23, 3); -#endif -} - -void PrintPokedexCount(void) -{ - u8 buffer[16]; - - MenuPrint(gMainMenuString_Pokedex, 2, 5); - sub_8072C14(buffer, GetPokedexSeenCount(), 18, 0); - MenuPrint(buffer, 9, 5); -} - -void PrintBadgeCount(void) -{ - u8 buffer[16]; - -#if defined(ENGLISH) - MenuPrint(gMainMenuString_Badges, 16, 5); -#elif defined(GERMAN) - MenuPrint_PixelCoords(gMainMenuString_Badges, 124, 40, TRUE); -#endif - ConvertIntToDecimalString(buffer, GetBadgeCount()); - MenuPrint_PixelCoords(buffer, 205, 40, 1); -} - -static void Task_NewGameSpeech1(u8 taskId) -{ - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E6CE4); - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0; - REG_WINOUT = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - LZ77UnCompVram(gBirchIntroShadowGfx, (void *)BG_VRAM); - LZ77UnCompVram(gUnknown_081E7834, (void *)(BG_VRAM + 0x3800)); - LoadPalette(gUnknown_081E764C, 0, 0x40); - LoadPalette(gUnknown_081E796C, 1, 0x10); - remove_some_task(); - ResetSpriteData(); - FreeAllSpritePalettes(); - AddBirchSpeechObjects(taskId); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP; - gTasks[taskId].data[TD_BGHOFS] = 0; - gTasks[taskId].func = Task_NewGameSpeech2; - gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = 0xFF; - gTasks[taskId].data[3] = 0xFF; - gTasks[taskId].data[TD_COUNTER] = 216; //Wait 3.6 seconds (216 frames) before starting speech - - PlayBGM(BGM_DOORO_X4); -} - -static void Task_NewGameSpeech2(u8 taskId) -{ - if (gTasks[taskId].data[TD_COUNTER] != 0) - { - gTasks[taskId].data[TD_COUNTER]--; - } - else - { - //Initialize Birch sprite - u8 spriteId = gTasks[taskId].data[TD_BIRCH_SPRITE_ID]; - - gSprites[spriteId].pos1.x = 136; - gSprites[spriteId].pos1.y = 60; - gSprites[spriteId].invisible = 0; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - StartSpriteFadeIn(taskId, 10); - StartBackgroundFadeIn(taskId, 20); - gTasks[taskId].data[TD_COUNTER] = 80; - gTasks[taskId].func = Task_NewGameSpeech3; - } -} - -static void Task_NewGameSpeech3(u8 taskId) -{ - if (gTasks[taskId].data[TD_SUBTASK_DONE] != FALSE) - { - gSprites[gTasks[taskId].data[TD_BIRCH_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_NORMAL; - if (gTasks[taskId].data[TD_COUNTER]) - { - gTasks[taskId].data[TD_COUNTER]--; - } - else - { - MenuDrawTextWindow(2, 13, 27, 18); - //"Hi! Sorry to keep you waiting... - //...But everyone calls me the POKEMON PROFESSOR." - MenuPrintMessage(gBirchSpeech_Welcome, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech4; - } - } -} - -static void Task_NewGameSpeech4(u8 taskId) -{ - if (!gPaletteFade.active && BirchSpeechUpdateWindowText()) - { - gTasks[taskId].func = Task_NewGameSpeech5; - //"This is what we call a POKEMON." - MenuPrintMessage(gBirchSpeech_ThisIsPokemon, 3, 14); - } -} - -static void Task_NewGameSpeech5(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - gTasks[taskId].func = Task_NewGameSpeech6; -} - -static void Task_NewGameSpeech6(u8 taskId) -{ - u8 spriteId = gTasks[taskId].data[TD_AZURILL_SPRITE_ID]; - - gSprites[spriteId].pos1.x = 104; - gSprites[spriteId].pos1.y = 72; - gSprites[spriteId].invisible = 0; - gSprites[spriteId].data0 = 0; - CreatePokeballSprite(spriteId, gSprites[spriteId].oam.paletteNum, 0x70, 0x3A, 0, 0, 0x20, 0x0000FFFF); - gTasks[taskId].func = Task_NewGameSpeech7; - gTasks[taskId].data[TD_COUNTER] = 0; -} - -static void Task_NewGameSpeech7(u8 taskId) -{ - if (IsCryFinished()) - { - //Go on to next sentence after frame 95 - if (gTasks[taskId].data[TD_COUNTER] > 95) - { - MenuSetText(gSystemText_NewPara); - gTasks[taskId].func = Task_NewGameSpeech8; - } - } - - if (gTasks[taskId].data[TD_COUNTER] < 16384) - { - gTasks[taskId].data[TD_COUNTER]++; - //Play Azurill cry at frame 32 - if (gTasks[taskId].data[TD_COUNTER] == 32) - PlayCry1(SPECIES_AZURILL, 0); - } -} - -static void Task_NewGameSpeech8(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - { - //"This world is widely inhabited by POKEMON... - //...That's what I do." - MenuPrintMessage(gBirchSpeech_WorldInhabitedByPokemon, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech9; - } -} - -static void Task_NewGameSpeech9(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - { - MenuDrawTextWindow(2, 13, 27, 18); - //"And you are?" - MenuPrintMessage(gBirchSpeech_AndYouAre, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech10; - } -} - -static void Task_NewGameSpeech10(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - { - gSprites[gTasks[taskId].data[TD_BIRCH_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_BLEND; - gSprites[gTasks[taskId].data[TD_AZURILL_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_BLEND; - StartSpriteFadeOut(taskId, 2); - StartBackgroundFadeOut(taskId, 1); - gTasks[taskId].data[TD_COUNTER] = 64; - gTasks[taskId].func = Task_NewGameSpeech11; - } -} - -//Slide platform away to the right -static void Task_NewGameSpeech11(u8 taskId) -{ - if (gTasks[taskId].data[TD_BGHOFS] != -60) - { - gTasks[taskId].data[TD_BGHOFS] -= 2; - REG_BG1HOFS = gTasks[taskId].data[TD_BGHOFS]; - } - else - { - gTasks[taskId].data[TD_BGHOFS] = -60; - gTasks[taskId].func = Task_NewGameSpeech12; - } -} - -static void Task_NewGameSpeech12(u8 taskId) -{ - if (gTasks[taskId].data[TD_SUBTASK_DONE]) - { - //Hide Birch and Azurill - gSprites[gTasks[taskId].data[TD_BIRCH_SPRITE_ID]].invisible = TRUE; - gSprites[gTasks[taskId].data[TD_AZURILL_SPRITE_ID]].invisible = TRUE; - - if (gTasks[taskId].data[TD_COUNTER]) - { - gTasks[taskId].data[TD_COUNTER]--; - } - else - { - //Initialize Brendan sprite - u8 spriteId = gTasks[taskId].data[TD_BRENDAN_SPRITE_ID]; - - gSprites[spriteId].pos1.x = 180; - gSprites[spriteId].pos1.y = 60; - gSprites[spriteId].invisible = FALSE; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = spriteId; - gTasks[taskId].data[TD_GENDER_SELECTION] = 0; - StartSpriteFadeIn(taskId, 2); - StartBackgroundFadeIn(taskId, 1); - gTasks[taskId].func = Task_NewGameSpeech13; - } - } -} - -static void Task_NewGameSpeech13(u8 taskId) -{ - if (gTasks[taskId].data[TD_SUBTASK_DONE]) - { - gSprites[gTasks[taskId].data[TD_TRAINER_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_NORMAL; - gTasks[taskId].func = Task_NewGameSpeech14; - } -} - -static void Task_NewGameSpeech14(u8 taskId) -{ - MenuDrawTextWindow(2, 13, 27, 18); - //"Are you a boy? Or are you a girl?" - MenuPrintMessage(gBirchSpeech_AreYouBoyOrGirl, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech15; -} - -static void Task_NewGameSpeech15(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - { - CreateGenderMenu(2, 4); - gTasks[taskId].func = Task_NewGameSpeech16; - } -} - -//Process gender menu -static void Task_NewGameSpeech16(u8 taskId) -{ - u8 cursorPos; - - switch (GenderMenuProcessInput()) - { - case MALE: - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - gSaveBlock2.playerGender = MALE; - MenuZeroFillWindowRect(2, 4, 8, 9); - gTasks[taskId].func = Task_NewGameSpeech19; - break; - case FEMALE: - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - gSaveBlock2.playerGender = FEMALE; - MenuZeroFillWindowRect(2, 4, 8, 9); - gTasks[taskId].func = Task_NewGameSpeech19; - break; - } - - cursorPos = GetMenuCursorPos(); - - if (cursorPos != gTasks[taskId].data[TD_GENDER_SELECTION]) - { - //Menu selection changed. Slide Brendan or May out and slide the other in - gTasks[taskId].data[TD_GENDER_SELECTION] = cursorPos; - gSprites[gTasks[taskId].data[TD_TRAINER_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_BLEND; - StartSpriteFadeOut(taskId, 0); - gTasks[taskId].func = Task_NewGameSpeech17; - } -} - -//Slide old trainer sprite off right of screen -static void Task_NewGameSpeech17(u8 taskId) -{ - u8 spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID]; - - if (gTasks[taskId].data[TD_SUBTASK_DONE] == FALSE) - { - gSprites[spriteId].pos1.x += 4; //Move sprite right - } - else - { - gSprites[spriteId].invisible = TRUE; - - //Set up new trainer sprite - if (gTasks[taskId].data[TD_GENDER_SELECTION]) - spriteId = gTasks[taskId].data[TD_MAY_SPRITE_ID]; - else - spriteId = gTasks[taskId].data[TD_BRENDAN_SPRITE_ID]; - gSprites[spriteId].pos1.x = 240; - gSprites[spriteId].pos1.y = 60; - gSprites[spriteId].invisible = FALSE; - gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = spriteId; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - StartSpriteFadeIn(taskId, 0); - gTasks[taskId].func = Task_NewGameSpeech18; - } -} - -//Slide new trainer sprite from right of screen -static void Task_NewGameSpeech18(u8 taskId) -{ - u8 spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID]; - - if (gSprites[spriteId].pos1.x > 180) - { - gSprites[spriteId].pos1.x -= 4; //Move sprite left - } - else - { - gSprites[spriteId].pos1.x = 180; - if (gTasks[taskId].data[TD_SUBTASK_DONE]) - { - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; - gTasks[taskId].func = Task_NewGameSpeech16; //Go back to gender menu - } - } -} - -static void Task_NewGameSpeech19(u8 taskId) -{ - MenuDrawTextWindow(2, 13, 27, 18); - //"All right. What's your name?" - MenuPrintMessage(gBirchSpeech_WhatsYourName, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech20; -} - -static void Task_NewGameSpeech20(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - { - CreateNameMenu(2, 1); - gTasks[taskId].func = Task_NewGameSpeech21; - } -} - -//Handle name menu selection -static void Task_NewGameSpeech21(u8 taskId) -{ - s8 selection = NameMenuProcessInput(); - - switch (selection) - { - case 1: //preset names - case 2: - case 3: - case 4: - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(2, 1, 22, 12); - SetPresetPlayerName(selection); - gTasks[taskId].func = Task_NewGameSpeech23; - break; - case 0: //NEW NAME - PlaySE(SE_SELECT); - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = Task_NewGameSpeech22; - break; - case -1: //B button - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(2, 1, 22, 12); - gTasks[taskId].func = Task_NewGameSpeech14; //Go back to gender menu - break; - } -} - -//Open naming screen -static void Task_NewGameSpeech22(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetPresetPlayerName(1); - DoNamingScreen(0, gSaveBlock2.playerName, gSaveBlock2.playerGender, 0, 0, CB_ContinueNewGameSpeechPart2); - } -} - -static void Task_NewGameSpeech23(u8 taskId) -{ - MenuDrawTextWindow(2, 13, 27, 18); - //"So it's (PLAYER)?" - StringExpandPlaceholders(gStringVar4, gBirchSpeech_SoItsPlayer); - MenuPrintMessage(gStringVar4, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech24; -} - -static void Task_NewGameSpeech24(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - { - DisplayYesNoMenu(2, 1, 1); - gTasks[taskId].func = Task_NewGameSpeech25; - } -} - -//Handle yes/no menu selection -static void Task_NewGameSpeech25(u8 taskId) -{ - switch (ProcessMenuInputNoWrap_()) - { - case 0: //YES - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(2, 1, 8, 7); - gSprites[gTasks[taskId].data[TD_TRAINER_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_BLEND; - StartSpriteFadeOut(taskId, 2); - StartBackgroundFadeOut(taskId, 1); - gTasks[taskId].func = Task_NewGameSpeech26; //Continue - break; - case -1: //B button - case 1: //NO - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(2, 1, 8, 7); - gTasks[taskId].func = Task_NewGameSpeech14; //Go back to gender menu - break; - } -} - -static void Task_NewGameSpeech26(u8 taskId) -{ - if (gTasks[taskId].data[TD_BGHOFS]) - { - gTasks[taskId].data[TD_BGHOFS] += 2; - REG_BG1HOFS = gTasks[taskId].data[TD_BGHOFS]; - } - else - { - gTasks[taskId].func = Task_NewGameSpeech27; - } -} - -static void Task_NewGameSpeech27(u8 taskId) -{ - if (gTasks[taskId].data[TD_SUBTASK_DONE]) - { - s16 spriteId; - - //Hide Brendan and May sprites - spriteId = gTasks[taskId].data[TD_BRENDAN_SPRITE_ID]; - gSprites[spriteId].invisible = TRUE; - spriteId = gTasks[taskId].data[TD_MAY_SPRITE_ID]; - gSprites[spriteId].invisible = TRUE; - - //Fade in Birch and Azurill - spriteId = (u8)gTasks[taskId].data[TD_BIRCH_SPRITE_ID]; - gSprites[spriteId].pos1.x = 136; - gSprites[spriteId].pos1.y = 64; - gSprites[spriteId].invisible = FALSE; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - spriteId = (u8)gTasks[taskId].data[TD_AZURILL_SPRITE_ID]; - gSprites[spriteId].pos1.x = 104; - gSprites[spriteId].pos1.y = 72; - gSprites[spriteId].invisible = FALSE; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - - StartSpriteFadeIn(taskId, 2); - StartBackgroundFadeIn(taskId, 1); - MenuDrawTextWindow(2, 13, 27, 18); - StringExpandPlaceholders(gStringVar4, gBirchSpeech_AhOkayYouArePlayer); - //"Ah, okay! You're (PLAYER) who's moving... - //...I get it now!" - MenuPrintMessage(gStringVar4, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech28; - } -} - -static void Task_NewGameSpeech28(u8 taskId) -{ - if (gTasks[taskId].data[TD_SUBTASK_DONE]) - { - s16 spriteId; - - spriteId = gTasks[taskId].data[TD_BIRCH_SPRITE_ID]; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; - - spriteId = gTasks[taskId].data[TD_AZURILL_SPRITE_ID]; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; - - if (BirchSpeechUpdateWindowText()) - { - //Fade out Birch and Azurill - spriteId = gTasks[taskId].data[TD_BIRCH_SPRITE_ID]; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - spriteId = gTasks[taskId].data[TD_AZURILL_SPRITE_ID]; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - - StartSpriteFadeOut(taskId, 2); - StartBackgroundFadeOut(taskId, 1); - gTasks[taskId].data[TD_COUNTER] = 64; - gTasks[taskId].func = Task_NewGameSpeech29; - } - } -} - -static void Task_NewGameSpeech29(u8 taskId) -{ - if (gTasks[taskId].data[TD_SUBTASK_DONE]) - { - s16 spriteId; - - //Hide Birch and Azurill - spriteId = gTasks[taskId].data[TD_BIRCH_SPRITE_ID]; - gSprites[spriteId].invisible = TRUE; - spriteId = gTasks[taskId].data[TD_AZURILL_SPRITE_ID]; - gSprites[spriteId].invisible = TRUE; - - if (gTasks[taskId].data[TD_COUNTER]) - { - gTasks[taskId].data[TD_COUNTER]--; - } - else - { - u8 spriteId; - - //Fade in trainer and background - if (gSaveBlock2.playerGender) - spriteId = (u8)gTasks[taskId].data[TD_MAY_SPRITE_ID]; - else - spriteId = (u8)gTasks[taskId].data[TD_BRENDAN_SPRITE_ID]; - gSprites[spriteId].pos1.x = 120; - gSprites[spriteId].pos1.y = 60; - gSprites[spriteId].invisible = FALSE; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = spriteId; - - StartSpriteFadeIn(taskId, 2); - StartBackgroundFadeIn(taskId, 1); - MenuDrawTextWindow(2, 13, 27, 18); - MenuPrintMessage(gBirchSpeech_AreYouReady, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech30; - } - } -} - -static void Task_NewGameSpeech30(u8 taskId) -{ - if (gTasks[taskId].data[TD_SUBTASK_DONE]) - { - s16 spriteId; - - spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID]; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; - - if (BirchSpeechUpdateWindowText()) - { - u8 spriteId; - - spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID]; - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_81E79AC; - InitSpriteAffineAnim(&gSprites[spriteId]); - StartSpriteAffineAnim(&gSprites[spriteId], 0); - gSprites[spriteId].callback = ShrinkPlayerSprite; - BeginNormalPaletteFade(0x0000FFFF, 0, 0, 0x10, 0); - FadeOutBGM(4); - gTasks[taskId].func = Task_NewGameSpeech31; - } - } -} - -static void Task_NewGameSpeech31(u8 taskId) -{ - u8 spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID]; - - if (gSprites[spriteId].affineAnimEnded) - gTasks[taskId].func = Task_NewGameSpeech32; -} - -static void Task_NewGameSpeech32(u8 taskId) -{ - if (!gPaletteFade.active) - { - u8 spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID]; - gSprites[spriteId].callback = nullsub_34; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON; - BeginNormalPaletteFade(0xFFFF0000, 0, 0, 0x10, 0xFFFF); - gTasks[taskId].func = Task_NewGameSpeech33; - } -} - -static void Task_NewGameSpeech33(u8 taskId) -{ - if (!gPaletteFade.active) - { - //We're finished setting up. Start the new game! - SetMainCallback2(CB2_NewGame); - DestroyTask(taskId); - } -} - -// Re-initializes graphics state after running the naming screen -// and continues the new game speech -void CB_ContinueNewGameSpeechPart2() -{ - u8 taskId; - u8 spriteId; - u16 savedIme; - - SetVBlankCallback(NULL); - - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *)OAM, OAM_SIZE); - DmaFill16(3, 0, (void *)PLTT, PLTT_SIZE); - - ResetPaletteFade(); - - LZ77UnCompVram(gBirchIntroShadowGfx, (void *)BG_VRAM); - LZ77UnCompVram(gUnknown_081E7834, (void *)(BG_VRAM + 0x3800)); - - LoadPalette(gUnknown_081E764C, 0, 0x40); - - ResetTasks(); - - taskId = CreateTask(Task_NewGameSpeech23, 0); - - gTasks[taskId].data[TD_BGHOFS] = -60; - - remove_some_task(); - ResetSpriteData(); - FreeAllSpritePalettes(); - AddBirchSpeechObjects(taskId); - - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow((struct WindowConfig *)&gWindowConfig_81E6CE4); - - if (gSaveBlock2.playerGender != MALE) - { - gTasks[taskId].data[TD_GENDER_SELECTION] = FEMALE; - spriteId = gTasks[taskId].data[TD_MAY_SPRITE_ID]; - } - else - { - gTasks[taskId].data[TD_GENDER_SELECTION] = MALE; - spriteId = gTasks[taskId].data[TD_BRENDAN_SPRITE_ID]; - } - - gSprites[spriteId].pos1.x = 180; - gSprites[spriteId].pos1.y = 60; - gSprites[spriteId].invisible = FALSE; - - gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = spriteId; - - REG_BG1HOFS = -60; - - BeginNormalPaletteFade(0xFFFFFFFFu, 0, 0x10, 0, 0); - - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0; - REG_WINOUT = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - - SetVBlankCallback(VBlankCB_MainMenu); - SetMainCallback2(CB2_MainMenu); - REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | - DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; -} - -void nullsub_34(struct Sprite *sprite) -{ -} - -void ShrinkPlayerSprite(struct Sprite *sprite) -{ - u32 y = (sprite->pos1.y << 16) + sprite->data0 + 0xC000; - sprite->pos1.y = y >> 16; - sprite->data0 = y; -} - -u8 CreateAzurillSprite(u8 x, u8 y) -{ - DecompressPicFromTable_2( - &gMonFrontPicTable[SPECIES_AZURILL], - gMonFrontPicCoords[SPECIES_AZURILL].coords, - gMonFrontPicCoords[SPECIES_AZURILL].y_offset, - gUnknown_081FAF4C[0], - gUnknown_081FAF4C[1], - SPECIES_AZURILL); - LoadCompressedObjectPalette(&gMonPaletteTable[SPECIES_AZURILL]); - GetMonSpriteTemplate_803C56C(SPECIES_AZURILL, 1); - return CreateSprite(&gUnknown_02024E8C, x, y, 0); -} - -void AddBirchSpeechObjects(u8 taskId) -{ - u8 spriteId; - - spriteId = CreateBirchSprite(136, 60, 1); - gSprites[spriteId].callback = nullsub_34; - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].invisible = 1; - gTasks[taskId].data[TD_BIRCH_SPRITE_ID] = spriteId; - - spriteId = CreateAzurillSprite(0x68, 0x48); - gSprites[spriteId].callback = nullsub_34; - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].invisible = 1; - gTasks[taskId].data[TD_AZURILL_SPRITE_ID] = spriteId; - - //Create Brendan sprite - spriteId = CreateTrainerSprite_BirchSpeech(0, 120, 60, 0, unk_2000000); - gSprites[spriteId].callback = nullsub_34; - gSprites[spriteId].invisible = 1; - gSprites[spriteId].oam.priority = 0; - gTasks[taskId].data[TD_BRENDAN_SPRITE_ID] = spriteId; - - //Create May sprite - spriteId = CreateTrainerSprite_BirchSpeech(1, 120, 60, 0, unk_2000000 + 0x800); - gSprites[spriteId].callback = nullsub_34; - gSprites[spriteId].invisible = 1; - gSprites[spriteId].oam.priority = 0; - gTasks[taskId].data[TD_MAY_SPRITE_ID] = spriteId; -} - -enum { - TD_PARENT_TASK_ID, - TD_EVA, //EVA coefficient of REG_BLDALPHA - TD_EVB, //EVB coefficient of REG_BLDALPHA - TD_INTERVAL, - TD_FRAMECOUNTER -}; - -static void Task_SpriteFadeOut(u8 taskId) -{ - if (gTasks[taskId].data[TD_EVA] == 0) - { - gTasks[gTasks[taskId].data[TD_PARENT_TASK_ID]].data[TD_SUBTASK_DONE] = TRUE; - DestroyTask(taskId); - } - else - { - if (gTasks[taskId].data[TD_FRAMECOUNTER]) - { - gTasks[taskId].data[TD_FRAMECOUNTER]--; - } - else - { - gTasks[taskId].data[TD_FRAMECOUNTER] = gTasks[taskId].data[TD_INTERVAL]; - gTasks[taskId].data[TD_EVA]--; - gTasks[taskId].data[TD_EVB]++; - REG_BLDALPHA = gTasks[taskId].data[TD_EVA] + (gTasks[taskId].data[TD_EVB] * 256); - } - } -} - -//Launches a helper task to fade out sprites -static void StartSpriteFadeOut(u8 taskId, u8 interval) -{ - u8 newTaskId; - - REG_BLDCNT = 592; - REG_BLDALPHA = 16; - REG_BLDY = 0; - gTasks[taskId].data[TD_SUBTASK_DONE] = FALSE; - newTaskId = CreateTask(Task_SpriteFadeOut, 0); - - gTasks[newTaskId].data[TD_PARENT_TASK_ID] = taskId; - gTasks[newTaskId].data[TD_EVA] = 16; - gTasks[newTaskId].data[TD_EVB] = 0; - gTasks[newTaskId].data[TD_INTERVAL] = interval; - gTasks[newTaskId].data[TD_FRAMECOUNTER] = interval; -} - -static void Task_SpriteFadeIn(u8 taskId) -{ - if (gTasks[taskId].data[TD_EVA] == 16) - { - gTasks[gTasks[taskId].data[TD_PARENT_TASK_ID]].data[TD_SUBTASK_DONE] = TRUE; - DestroyTask(taskId); - } - else if (gTasks[taskId].data[TD_FRAMECOUNTER]) - { - gTasks[taskId].data[TD_FRAMECOUNTER]--; - } - else - { - gTasks[taskId].data[TD_FRAMECOUNTER] = gTasks[taskId].data[TD_INTERVAL]; - gTasks[taskId].data[TD_EVA]++; - gTasks[taskId].data[TD_EVB]--; - REG_BLDALPHA = gTasks[taskId].data[TD_EVA] + (gTasks[taskId].data[TD_EVB] * 256); - } -} - -//Launches a helper task to fade in sprites -static void StartSpriteFadeIn(u8 taskId, u8 interval) -{ - u8 newTaskId; - - REG_BLDCNT = 592; - REG_BLDALPHA = 4096; - REG_BLDY = 0; - gTasks[taskId].data[TD_SUBTASK_DONE] = FALSE; - newTaskId = CreateTask(Task_SpriteFadeIn, 0); - - gTasks[newTaskId].data[TD_PARENT_TASK_ID] = taskId; - gTasks[newTaskId].data[TD_EVA] = 0; - gTasks[newTaskId].data[TD_EVB] = 16; - gTasks[newTaskId].data[TD_INTERVAL] = interval; - gTasks[newTaskId].data[TD_FRAMECOUNTER] = interval; -} - -enum { - TD_FADELEVEL = 1, - TD_DELAY, -}; - -static void HandleFloorShadowFadeOut(u8 taskId) -{ - if (gTasks[taskId].data[TD_DELAY]) - gTasks[taskId].data[TD_DELAY]--; - else - { - if (gTasks[taskId].data[TD_FADELEVEL] == 8) - DestroyTask(taskId); - else if (gTasks[taskId].data[TD_FRAMECOUNTER]) - gTasks[taskId].data[TD_FRAMECOUNTER]--; - else - { - gTasks[taskId].data[TD_FRAMECOUNTER] = gTasks[taskId].data[TD_INTERVAL]; - gTasks[taskId].data[TD_FADELEVEL]++; - LoadPalette(&gUnknown_081E795C[gTasks[taskId].data[TD_FADELEVEL]], 1, 0x10); - } - } -} - -//Launches a helper task to fade out the background -static void StartBackgroundFadeOut(u8 taskId, u8 interval) -{ - u8 newTaskId = CreateTask(HandleFloorShadowFadeOut, 0); - gTasks[newTaskId].data[TD_PARENT_TASK_ID] = taskId; - gTasks[newTaskId].data[TD_FADELEVEL] = 0; - gTasks[newTaskId].data[TD_DELAY] = 8; - gTasks[newTaskId].data[TD_INTERVAL] = interval; - gTasks[newTaskId].data[TD_FRAMECOUNTER] = interval; -} - -static void HandleFloorShadowFadeIn(u8 taskId) -{ - if (gTasks[taskId].data[TD_DELAY]) - gTasks[taskId].data[TD_DELAY]--; - else - { - if (gTasks[taskId].data[TD_FADELEVEL] == 0) - DestroyTask(taskId); - else - { - if (gTasks[taskId].data[TD_FRAMECOUNTER]) - gTasks[taskId].data[TD_FRAMECOUNTER]--; - else - { - gTasks[taskId].data[TD_FRAMECOUNTER] = gTasks[taskId].data[TD_INTERVAL]; - gTasks[taskId].data[TD_FADELEVEL]--; - LoadPalette(&gUnknown_081E795C[gTasks[taskId].data[TD_FADELEVEL]], 1, 0x10); - } - } - } -} - -//Launches a helper task to fade in the background -static void StartBackgroundFadeIn(u8 taskId, u8 interval) -{ - u8 newTaskId = CreateTask(HandleFloorShadowFadeIn, 0); - gTasks[newTaskId].data[TD_PARENT_TASK_ID] = taskId; - gTasks[newTaskId].data[TD_FADELEVEL] = 8; - gTasks[newTaskId].data[TD_DELAY] = 8; - gTasks[newTaskId].data[TD_INTERVAL] = interval; - gTasks[newTaskId].data[TD_FRAMECOUNTER] = interval; -} - -static void CreateGenderMenu(u8 left, u8 top) -{ - u8 menuLeft, menuTop; - MenuDrawTextWindow(left, top, left + 6, top + 5); - menuLeft = left + 1; - menuTop = top + 1; - PrintMenuItems(menuLeft, menuTop, 2, gUnknown_081E79B0); - InitMenu(0, menuLeft, menuTop, 2, 0, 5); -} - -static s8 GenderMenuProcessInput(void) -{ - return ProcessMenuInputNoWrap(); -} - -static void CreateNameMenu(u8 left, u8 top) -{ - MenuDrawTextWindow(left, top, left + 10, top + 11); - - if (gSaveBlock2.playerGender == MALE) - PrintMenuItems(left + 1, top + 1, 5, gMalePresetNames); - else - PrintMenuItems(left + 1, top + 1, 5, gFemalePresetNames); - - InitMenu(0, left + 1, top + 1, 5, 0, 9); -} - -static s8 NameMenuProcessInput(void) -{ - return ProcessMenuInput(); -} - -static void SetPresetPlayerName(u8 index) -{ - u8 i; - u8 *name; - - if (gSaveBlock2.playerGender == MALE) - name = (u8 *) gMalePresetNames[index].text; - else - name = (u8 *) gFemalePresetNames[index].text; - - for (i = 0; i < 7; i++) - gSaveBlock2.playerName[i] = name[i]; - - gSaveBlock2.playerName[i] = EOS; -} diff --git a/src/map_name_popup.c b/src/map_name_popup.c deleted file mode 100644 index 01105d0db..000000000 --- a/src/map_name_popup.c +++ /dev/null @@ -1,107 +0,0 @@ -#include "global.h" -#include "map_name_popup.h" -#include "event_data.h" -#include "menu.h" -#include "region_map.h" -#include "task.h" - -EWRAM_DATA static u8 sTaskId = 0; - -static void Task_MapNamePopup(u8); -static void DrawMapNamePopup(void); - -bool8 unref_sub_80A2F44(void) -{ - CloseMenu(); - ShowMapNamePopup(); - return 1; -} - -void ShowMapNamePopup(void) -{ - if (FlagGet(0x4000) != TRUE) - { - if (!FuncIsActiveTask(Task_MapNamePopup)) - { - sTaskId = CreateTask(Task_MapNamePopup, 90); - REG_BG0VOFS = 32; - DrawMapNamePopup(); - gTasks[sTaskId].data[0] = 0; - gTasks[sTaskId].data[2] = 32; - } - else - { - if (gTasks[sTaskId].data[0] != 2) - gTasks[sTaskId].data[0] = 2; - gTasks[sTaskId].data[3] = 1; - } - } -} - -void Task_MapNamePopup(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - task->data[2] -= 2; - if (task->data[2] <= 0 ) - { - task->data[0] = 1; - gTasks[sTaskId].data[1] = 0; - } - break; - case 1: - task->data[1]++; - if (task->data[1] > 120 ) - { - task->data[1] = 0; - task->data[0] = 2; - } - break; - case 2: - task->data[2] += 2; - if (task->data[2] > 31) - { - if (task->data[3]) - { - DrawMapNamePopup(); - task->data[0] = 0; - task->data[3] = 0; - } - else - { - task->data[0] = 4; - return; - } - } - break; - case 4: - HideMapNamePopup(); - return; - } - - REG_BG0VOFS = task->data[2]; -} - -void HideMapNamePopup(void) -{ - if (FuncIsActiveTask(Task_MapNamePopup)) - { - MenuLoadTextWindowGraphics(); - MenuZeroFillWindowRect(0, 0, 13, 3); - REG_BG0VOFS = 0; - DestroyTask(sTaskId); - } -} - -void DrawMapNamePopup(void) -{ - u8 name[20]; - - MenuLoadTextWindowGraphics_OverrideFrameType(0); - GetMapSectionName(name, gMapHeader.regionMapSectionId, 0); - MenuDrawTextWindow(0, 0, 13, 3); - sub_8072BD8(name, 1, 1, 0x60); -} diff --git a/src/map_obj_lock.c b/src/map_obj_lock.c deleted file mode 100644 index bd40bcacc..000000000 --- a/src/map_obj_lock.c +++ /dev/null @@ -1,118 +0,0 @@ -#include "global.h" -#include "map_obj_lock.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" -#include "field_player_avatar.h" -#include "script_movement.h" -#include "task.h" - -extern u16 gScriptFacing; - -bool8 walkrun_is_standing_still(void) -{ - if (gPlayerAvatar.running1 == 1) - return FALSE; - else - return TRUE; -} - -void sub_8064CDC(u8 taskId) -{ - if (walkrun_is_standing_still()) - { - sub_80594C0(); - DestroyTask(taskId); - } -} - -bool8 sub_8064CFC(void) -{ - if (FuncIsActiveTask(sub_8064CDC)) - { - return FALSE; - } - else - { - sub_80597F4(); - return TRUE; - } -} - -void ScriptFreezeMapObjects(void) -{ - FreezeMapObjects(); - CreateTask(sub_8064CDC, 80); -} - -void sub_8064D38(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - if (!task->data[0] && walkrun_is_standing_still() == TRUE) - { - sub_80594C0(); - task->data[0] = 1; - } - if (!task->data[1] && !gMapObjects[gSelectedMapObject].mapobj_bit_1) - { - FreezeMapObject(&gMapObjects[gSelectedMapObject]); - task->data[1] = 1; - } - if (task->data[0] && task->data[1]) - DestroyTask(taskId); -} - -bool8 sub_8064DB4(void) -{ - if (FuncIsActiveTask(sub_8064D38)) - { - return FALSE; - } - else - { - sub_80597F4(); - return TRUE; - } -} - -void sub_8064DD8(void) -{ - u8 taskId; - FreezeMapObjectsExceptOne(gSelectedMapObject); - taskId = CreateTask(sub_8064D38, 80); - if (!gMapObjects[gSelectedMapObject].mapobj_bit_1) - { - FreezeMapObject(&gMapObjects[gSelectedMapObject]); - gTasks[taskId].data[1] = 1; - } -} - -void sub_8064E2C(void) -{ - u8 objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); - sub_80A2178(); - UnfreezeMapObjects(); -} - -void unref_sub_8064E5C(void) -{ - u8 objectId; - - if (gMapObjects[gSelectedMapObject].active) - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]); - objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); - sub_80A2178(); - UnfreezeMapObjects(); -} - -void sub_8064EAC(void) -{ - FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], gScriptFacing); -} - -void sub_8064ED4(void) -{ - FieldObjectClearAnimIfSpecialAnimActive(&gMapObjects[gSelectedMapObject]); -} diff --git a/src/matsuda_debug_menu.c b/src/matsuda_debug_menu.c deleted file mode 100644 index 3665cabd8..000000000 --- a/src/matsuda_debug_menu.c +++ /dev/null @@ -1,1113 +0,0 @@ -#include "global.h" -#include "matsuda_debug_menu.h" -#include "contest.h" -#include "contest_link_80C2020.h" -#include "contest_link_80C857C.h" -#include "data2.h" -#include "link.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "rom4.h" -#include "sprite.h" -#include "start_menu.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "unknown_task.h" - -extern u8 gUnknown_0203856C; -extern u8 gUnknown_0203857D[][64]; -extern u16 gUnknown_02038670[]; -extern u16 gUnknown_02038678[]; -extern u16 gUnknown_02038680[]; -extern u8 gUnknown_02038690[]; -extern u8 gUnknown_02038694; -extern u8 gIsLinkContest; -extern u8 gUnknown_0203869B; -extern u8 gContestPlayerMonIndex; -extern u16 gScriptContestCategory; -extern u16 gScriptContestRank; - -extern u16 gUnknown_030042A4; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042C0; -extern u16 gUnknown_030041B4; -extern u16 gUnknown_03004288; -extern u16 gUnknown_03004280; -extern u16 gUnknown_030041B0; -extern u16 gUnknown_030041B8; -extern struct Window gUnknown_03004210; -extern u8 (*gCallback_03004AE8)(void); - -extern u8 gUnknown_083C926E[][2]; -extern u8 gUnknown_083C9282[]; -extern const u8 gUnknown_083C928E[][2]; -extern u8 gUnknown_083C9296[]; -extern u8 gUnknown_083C92A8[]; -extern u8 unk_2000000[]; -extern u8 gMatsudaDebugMenu_GoBackText[]; -extern u8 gMatsudaDebugMenu_BattlePointsText[]; -extern u8 gMatsudaDebugMenu_StartText[]; - -extern struct SpritePalette gUnknown_083C92BC; -extern struct SpriteSheet gUnknown_083C92B4; -extern struct SpriteTemplate gSpriteTemplate_83C92CC; -extern void (*gUnknown_083C92E4[][2])(struct Sprite *, s8); -extern u32 gUnknown_083C9400[2]; - - -extern u8 gMatsudaDebugMenu_UnknownByteArray[]; -extern u8* gMatsudaDebugMenuTextList1[]; -extern u8* gMatsudaDebugMenuTextList2[]; -extern u8* gMatsudaDebugMenuTextList3[]; -extern u8 gMatsudaDebugMenuContestTopLeft[][2]; - -extern bool8 gReceivedRemoteLinkPlayers; - -extern struct MenuAction gMatsudaDebugMenuActions[]; - -static bool8 sub_80A9B78(void); -static void sub_80A9BE4(u8 taskId); -static void sub_80A9C98(u8); -static void sub_80A9CC0(u8); -static void sub_80A9CDC(u8); -static void sub_80A9D58(u8); -static void sub_80A9DBC(u8); -static void sub_80A9DD8(u8); -static void sub_80A9E04(u8 taskId); -static void sub_80A9E3C(u8 taskId); -static void sub_80A9E80(u8); -static void sub_80A9ED8(u8); -static void sub_80A9F10(u8); -static void sub_80AA10C(void); -static void sub_80AA5BC(u8); -static void sub_80AA614(u8, u8); -static void sub_80AAD08(struct Sprite *, s8); - -u8 unref_sub_80A9B28(void) -{ - MenuZeroFillScreen(); - MenuDrawTextWindow(0, 0, 17, 18); - PrintMenuItems(1, 1, 7, gMatsudaDebugMenuActions); - InitMenu(0, 1, 1, 7, 0, 16); - gCallback_03004AE8 = sub_80A9B78; - return 0; -} - -static bool8 sub_80A9B78(void) -{ - s8 choice = ProcessMenuInput(); - - switch (choice) - { - case -2: - return FALSE; - default: - gCallback_03004AE8 = gMatsudaDebugMenuActions[choice].func; - return FALSE; - case -1: - CloseMenu(); - return TRUE; - } -} - -s8 MatsudaDebugMenu_ContestResults(void) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - CreateTask(sub_80A9BE4, 0xFF); - return 1; -} - -static void sub_80A9BE4(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyTask(taskId); - - if (!(gIsLinkContest & 1)) - sub_80AF668(); - - sub_80C2358(); - } -} - -s8 MatsudaDebugMenu_Contest(void) -{ - gIsLinkContest = 0; - sub_80AA10C(); - return 0; -} - -s8 MatsudaDebugMenu_ContestComm(void) -{ - sub_80AA10C(); - return 0; -} - -s8 MatsudaDebugMenu_CommTest(void) -{ - u8 newTaskId; - u8 newTaskId2; - - newTaskId = CreateTask(sub_80A9E3C, 0); - SetTaskFuncWithFollowupFunc(newTaskId, sub_80A9E3C, sub_80A9C98); - newTaskId2 = CreateTask(sub_80A9E04, 1); - gTasks[newTaskId2].data[10] = newTaskId; - gTasks[newTaskId].data[10] = newTaskId2; - return 1; -} - -static void sub_80A9C98(u8 taskId) -{ - sub_80AE098(0); - SetTaskFuncWithFollowupFunc(taskId, sub_80C8734, sub_80A9CC0); -} - -static void sub_80A9CC0(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80C88AC, sub_80A9CDC); -} - -static void sub_80A9CDC(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80C8E1C, sub_80A9D58); -} - -static void sub_80A9CF8(u8 taskId) -{ - if (gReceivedRemoteLinkPlayers == FALSE) - { - DestroyTask(gTasks[taskId].data[10]); - DestroyTask(taskId); - CloseMenu(); - } -} - -static void sub_80A9D30(u8 taskId) -{ - sub_800832C(); - gTasks[taskId].func = sub_80A9CF8; -} - -static void sub_80A9D58(u8 taskId) -{ - int i; - u8 dest[4]; - - for (i = 0; i < 4; i++) - dest[i] = gTasks[taskId].data[5 + i]; - - gUnknown_0203869B = sub_80C4B34(dest); - sub_80AE82C((u8)gScriptContestCategory); - sub_80B0F28(0); - SetTaskFuncWithFollowupFunc(taskId, sub_80C8EBC, sub_80A9DBC); -} - -static void sub_80A9DBC(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80C8F34, sub_80A9DD8); -} - -static void sub_80A9DD8(u8 taskId) -{ - DestroyTask(gTasks[taskId].data[10]); - DestroyTask(taskId); - CloseMenu(); -} - -static void sub_80A9E04(u8 taskId) -{ - if (gMain.newKeys == 2) - gTasks[(u8)gTasks[taskId].data[10]].func = sub_80A9D30; -} - -static void sub_80A9E3C(u8 taskId) -{ - u8 i; - - OpenLink(); - - for (i = 0; i < 4; i++) - gBlockRecvBuffer[i][0] = 255; - - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80A9E80; -} - -static void sub_80A9E80(u8 taskId) -{ - TaskFunc func; - - if (gTasks[taskId].data[0] < 10) - gTasks[taskId].data[0]++; - else - { - if (GetLinkPlayerCount_2() > 3) - { - gTasks[taskId].data[0] = 0; - - if (IsLinkMaster()) - { - func = sub_80A9ED8; - gTasks[taskId].func = (TaskFunc)func; - } - else - { - func = sub_80A9F10; - gTasks[taskId].func = (TaskFunc)func; - } - } - } -} - -static void sub_80A9ED8(u8 taskId) -{ - gTasks[taskId].data[0] = gTasks[taskId].data[0] + 1; - if ((gTasks[taskId].data[0]) == 101) - { - sub_8007F4C(); - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80A9F10; - } -} - -static void sub_80A9F10(u8 taskId) -{ - if (gReceivedRemoteLinkPlayers) - { - gContestPlayerMonIndex = GetMultiplayerId(); - if (GetLinkPlayerCount() == 4) - { - gIsLinkContest = 1; - SwitchTaskToFollowupFunc(taskId); - } - } -} - -static void sub_80A9F50(void) -{ - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP; - REG_DISPCNT |= DISPCNT_OBJ_ON | DISPCNT_BG0_ON; - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitWindowFromConfig(&gMenuWindow, &gWindowConfig_81E6C3C); - REG_MOSAIC = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 0; - gUnknown_030042C0 = 0; - gUnknown_030041B4 = 0; - gUnknown_03004288 = 0; - gUnknown_03004280 = 0; - gUnknown_030041B0 = 0; - gUnknown_030041B8 = 0; -} - -static void sub_80A9FE4(void) -{ - u8 *addr; - u32 i; - u8 ptr[5]; - - memcpy(ptr, gMatsudaDebugMenu_UnknownByteArray, 5); - - addr = (void *)VRAM; - i = VRAM_SIZE; - - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - i -= 0x1000; - if (i <= 0x1000) - { - DmaFill32(3, 0, addr, i); - break; - } - } - sub_80034D4((void *)VRAM, ptr); - LoadFontDefaultPalette(&gWindowConfig_81E6C3C); -} - -static void sub_80AA064(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - UpdatePaletteFade(); - if (gMain.newKeys == 4) - SetMainCallback2(sub_805469C); -} - -static void sub_80AA090(void) -{ - REG_BG0HOFS = gUnknown_030042A4; - REG_BG0VOFS = gUnknown_030042A0; - REG_BG1HOFS = gUnknown_030042C0; - REG_BG1VOFS = gUnknown_030041B4; - REG_BG2HOFS = gUnknown_03004288; - REG_BG2VOFS = gUnknown_03004280; - REG_BG3HOFS = gUnknown_030041B0; - REG_BG3VOFS = gUnknown_030041B8; - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - sub_8089668(); -} - -static void sub_80AA10C(void) -{ - u8 i; - u8 zero; - u8 spriteId; - - gPaletteFade.bufferTransferDisabled = 1; - SetVBlankCallback(0); - sub_80A9F50(); - dp12_8087EA4(); - ResetPaletteFade(); - ResetSpriteData(); - ResetTasks(); - FreeAllSpritePalettes(); - sub_80A9FE4(); - SetVBlankCallback(sub_80AA090); - SetMainCallback2(sub_80AA064); - gPaletteFade.bufferTransferDisabled = 0; - gUnknown_02038694 = 0; - - if (!(gContestMons[0].nickname[0])) - sub_80AE398(0, 0); - - sub_80AE098(gUnknown_02038694); - - for (i = 0; i < 6; i++) - { - sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList1[i], - (0xA * i + 0x2A), gMatsudaDebugMenuContestTopLeft[i][0], - gMatsudaDebugMenuContestTopLeft[i][1]); - } - - gScriptContestCategory = gScriptContestRank = 0; - zero = 0; // it's possible this was some assignment that matsuda used to quickly edit and test things without changing whats passed to the later functions. - sub_80AA5BC(zero); - sub_80AA5E8(gScriptContestRank); - sub_8003460(&gMenuWindow, gMatsudaDebugMenu_GoBackText, 0xD6, 0x12, 0x12); - sub_8003460(&gMenuWindow, gMatsudaDebugMenu_BattlePointsText, 0xDC, zero, 0xC); - LoadSpriteSheet(&gUnknown_083C92B4); - LoadSpritePalette(&gUnknown_083C92BC); - sub_80AA280(3); - sub_80AA658(3); - sub_80AA614(3, zero); - spriteId = CreateSprite(&gSpriteTemplate_83C92CC, gUnknown_083C9296[3], gUnknown_083C92A8[1], 5); - gSprites[spriteId].data0 = 1; - gSprites[spriteId].data1 = 1; - gSprites[spriteId].data2 = 3; - gSprites[spriteId].data3 = zero; // only this assignment of zero is necessary. other replacements of 0 with zero do not change the asm, compiler will treat it the same. -} - -void sub_80AA280(u8 var) // no? -{ - u8 i; - - FillWindowRect_DefaultPalette(&gMenuWindow, 0, 0, 0, 0x1E, 3); - StringCopy(unk_2000000, gMatsudaDebugMenu_StartText); - StringAppend(unk_2000000, &gUnknown_0203857D[var][0]); - - for (i = 0; i < 4; i++) - { - if (var == i) - { - sub_8003460(&gMenuWindow, unk_2000000, (10 * i + 2), gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]); - } - else - { - u8 *ptr = gUnknown_0203857D[i]; - sub_8003460(&gMenuWindow, ptr, (10 * i + 2), gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]); - } - } -} - -static void sub_80AA340(u8 var) -{ - ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].cool, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, unk_2000000, 0x66, gUnknown_083C9282[0], gUnknown_083C9282[1]); -} - -static void sub_80AA388(u8 var) -{ - ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].cute, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, unk_2000000, 0x6C, gUnknown_083C9282[2], gUnknown_083C9282[3]); -} - -static void sub_80AA3D0(u8 var) -{ - ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].beauty, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, unk_2000000, 0x72, gUnknown_083C9282[4], gUnknown_083C9282[5]); -} - -static void sub_80AA418(u8 var) -{ - ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].smart, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, unk_2000000, 0x78, gUnknown_083C9282[6], gUnknown_083C9282[7]); -} - -static void sub_80AA460(u8 var) -{ - ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].tough, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, unk_2000000, 0x7E, gUnknown_083C9282[8], gUnknown_083C9282[9]); -} - -static void sub_80AA4A8(u8 var) -{ - ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].sheen, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, unk_2000000, 0x84, gUnknown_083C9282[10], gUnknown_083C9282[11]); -} - -static void sub_80AA4F0(u8 var1, u8 var2) -{ - FillWindowRect_DefaultPalette(&gMenuWindow, 0, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1], gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1] + 1); - sub_8003460(&gMenuWindow, gMoveNames[gContestMons[var1].moves[var2]], 0x8A + var2 * 14, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1]); - ConvertIntToDecimalStringN(gStringVar1, gContestMons[var1].moves[var2], STR_CONV_MODE_LEADING_ZEROS, 3); - sub_8003460(&gMenuWindow, gStringVar1, 0xFA + var2 * 6, gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1]); -} - -static void sub_80AA5BC(u8 var) -{ - sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList2[var], 0xC2, 3, 0x12); -} - -void sub_80AA5E8(u8 var) -{ - sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList3[var], 0xE8, 3, 4); -} - -static void sub_80AA614(u8 var1, u8 var2) -{ - u16 var = sub_80AE770(var1, var2); - - ConvertIntToDecimalStringN(unk_2000000, var, STR_CONV_MODE_RIGHT_ALIGN, 3); - sub_8003460(&gMenuWindow, unk_2000000, 0xE2, 3, 0xC); -} - -void sub_80AA658(u8 var) -{ - u8 i; - - sub_80AA340(var); - sub_80AA388(var); - sub_80AA3D0(var); - sub_80AA418(var); - sub_80AA460(var); - sub_80AA4A8(var); - - for (i = 0; i < 4; i++) - sub_80AA4F0(var, i); -} - -void SetDebugMonForContest(void) -{ - SetMonData(&gPlayerParty[0], MON_DATA_COOL, &gContestMons[gContestPlayerMonIndex].cool); - SetMonData(&gPlayerParty[0], MON_DATA_CUTE, &gContestMons[gContestPlayerMonIndex].cute); - SetMonData(&gPlayerParty[0], MON_DATA_BEAUTY, &gContestMons[gContestPlayerMonIndex].beauty); - SetMonData(&gPlayerParty[0], MON_DATA_SMART, &gContestMons[gContestPlayerMonIndex].smart); - SetMonData(&gPlayerParty[0], MON_DATA_TOUGH, &gContestMons[gContestPlayerMonIndex].tough); - SetMonData(&gPlayerParty[0], MON_DATA_SHEEN, &gContestMons[gContestPlayerMonIndex].sheen); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[0]); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[1]); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[2]); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[3]); -} - -void sub_80AA754(struct Sprite *sprite) -{ - switch (gMain.newAndRepeatedKeys) - { - case DPAD_RIGHT: - case DPAD_LEFT: - sprite->data0 ^= 1; - break; - case DPAD_UP: - if (sprite->data1 == 0) - sprite->data1 = 8; - else - sprite->data1--; - break; - case DPAD_DOWN: - if (sprite->data1 == 8) - sprite->data1 = 0; - else - sprite->data1++; - break; - case A_BUTTON: - gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, 1); - sub_80AA614(sprite->data2, sprite->data3); - break; - case B_BUTTON: - gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, -1); - sub_80AA614(sprite->data2, sprite->data3); - break; - case R_BUTTON: - gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, 10); - sub_80AA614(sprite->data2, sprite->data3); - break; - case L_BUTTON: - gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, -10); - sub_80AA614(sprite->data2, sprite->data3); - break; - case START_BUTTON: - sub_80AAD08(sprite, 1); - break; - } - sprite->pos1.x = gUnknown_083C9296[sprite->data0 + sprite->data1 * 2]; - sprite->pos1.y = gUnknown_083C92A8[sprite->data1]; -} - -static void sub_80AA8A0(struct Sprite *sprite, s8 var1, u8 var2) -{ - if (var1 == 1) - { - sprite->data2 = var2; - sub_80AA280(var2); - sub_80AA658(sprite->data2); - } -} - -void sub_80AA8C8(struct Sprite *sprite, s8 var1) -{ - sub_80AA8A0(sprite, var1, 0); -} - -void sub_80AA8D8(struct Sprite *sprite, s8 var1) -{ - sub_80AA8A0(sprite, var1, 1); -} - -void sub_80AA8E8(struct Sprite *sprite, s8 var1) -{ - sub_80AA8A0(sprite, var1, 2); -} - -void sub_80AA8F8(struct Sprite *sprite, s8 var1) -{ - sub_80AA8A0(sprite, var1, 3); -} - -static u8 sub_80AA908(u32 a1, u8 a2, s8 a3) // first param is unused. -{ - s16 val = a2 + a3; - - if (val > 255) - val = 255; - else if (val < 0) - val = 0; - - return val; -} - -void sub_80AA930(struct Sprite *sprite, u8 var2) -{ - u8 val = sprite->data2; - - gContestMons[sprite->data2].cool = sub_80AA908(val, gContestMons[sprite->data2].cool, var2); - sub_80AA340(sprite->data2); -} - -void sub_80AA974(struct Sprite *sprite, u8 var2) -{ - u8 val = sprite->data2; - - gContestMons[sprite->data2].cute = sub_80AA908(val, gContestMons[sprite->data2].cute, var2); - sub_80AA388(sprite->data2); -} - -void sub_80AA9B8(struct Sprite *sprite, u8 var2) -{ - u8 val = sprite->data2; - - gContestMons[sprite->data2].beauty = sub_80AA908(val, gContestMons[sprite->data2].beauty, var2); - sub_80AA3D0(sprite->data2); -} - -void sub_80AA9FC(struct Sprite *sprite, u8 var2) -{ - u8 val = sprite->data2; - - gContestMons[sprite->data2].smart = sub_80AA908(val, gContestMons[sprite->data2].smart, var2); - sub_80AA418(sprite->data2); -} - -void sub_80AAA40(struct Sprite *sprite, u8 var2) -{ - u8 val = sprite->data2; - - gContestMons[sprite->data2].tough = sub_80AA908(val, gContestMons[sprite->data2].tough, var2); - sub_80AA460(sprite->data2); -} - -void sub_80AAA84(struct Sprite *sprite, u8 var2) -{ - u8 val = sprite->data2; - - gContestMons[sprite->data2].sheen = sub_80AA908(val, gContestMons[sprite->data2].sheen, var2); - sub_80AA4A8(sprite->data2); -} - -// a similar function is at 0x80AA908, however, it apparently returns the wrong type (u8 vs u16). -static u16 sub_80AAAC8(u32 a1, u16 a2, s8 a3) // first param is unused. -{ - s16 val = a2 + a3; - - if (val > 354) - val = 1; - else if (val < 0) - val = 354; - - return val; -} - -void sub_80AAAF0(struct Sprite *sprite, u8 var2) -{ - u8 val = sprite->data2; - - gContestMons[sprite->data2].moves[0] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[0], var2); - sub_80AA4F0(sprite->data2, 0); -} - -void sub_80AAB30(struct Sprite *sprite, u8 var2) -{ - u8 val = sprite->data2; - - gContestMons[sprite->data2].moves[1] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[1], var2); - sub_80AA4F0(sprite->data2, 1); -} - -void sub_80AAB70(struct Sprite *sprite, u8 var2) -{ - u8 val = sprite->data2; - - gContestMons[sprite->data2].moves[2] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[2], var2); - sub_80AA4F0(sprite->data2, 2); -} - -void sub_80AABB0(struct Sprite *sprite, u8 var2) -{ - u8 val = sprite->data2; - - gContestMons[sprite->data2].moves[3] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[3], var2); - sub_80AA4F0(sprite->data2, 3); -} - -void sub_80AABF0(struct Sprite *sprite, s8 var2) -{ - s8 a = (var2 > 0) ? 1 : -1; - s8 r4 = sprite->data3 + a; - - if (r4 < 0) - r4 = 0; - else if (r4 > 4) - r4 = 4; - sub_80AA5BC(r4); - sprite->data3 = r4; - gScriptContestCategory = sprite->data3; - sub_80AE398(sprite->data3, gScriptContestRank); - sub_80AA280(sprite->data2); - sub_80AA658(sprite->data2); -} - -void sub_80AAC5C(struct Sprite *sprite, s8 var2) -{ - if (var2 > 0) - gScriptContestRank++; - else if (gScriptContestRank != 0) - gScriptContestRank--; - if (gScriptContestRank > 3) - gScriptContestRank = 3; - sub_80AA5E8(gScriptContestRank); - sub_80AE398(gScriptContestCategory, gScriptContestRank); - sub_80AA280(sprite->data2); - sub_80AA658(sprite->data2); -} - -void sub_80AACC4(void) -{ - UpdatePaletteFade(); - if (!gPaletteFade.active) - { - SetDebugMonForContest(); - if (!(gIsLinkContest & 1)) - sub_80AE82C(unk_2000000[0]); - SetMainCallback2(sub_80AB47C); - } -} - -void sub_80AAD08(struct Sprite *sprite, s8 var2) -{ - if (var2 == 1) - { - unk_2000000[0] = sprite->data3; - SetMainCallback2(sub_80AACC4); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - } -} - -void sub_80AAD44(struct Sprite *sprite, s8 var2) -{ - if (var2 == 1) - { - int i; - - SetDebugMonForContest(); - for (i = 0; i < 4; i++) - gUnknown_02038670[i] = sub_80AE770(i, gScriptContestCategory); - SetMainCallback2(sub_805469C); - } -} - -//Do this later -/* -void sub_80AAD84(u8 *string, u8 b, u8 c, u8 d) -{ - u32 r5; - u16 r7; - u8 r7_2; - //u32 sp44; - //u32 sp48; - u32 sp58; - - gMain.state = 0; - - r5 = d + 1; - //Could also be DmaClear32 - DmaFill32(3, 0, (u8 *)VRAM + 0x18000 - r5 * 256, 0x100); - - r7 = StringLength(string); - if (r7 > 8) - r7 = 8; - sp58 = d * 2; - - //More stuff - - r7_2 = 0x7C - sp58; - -} -*/ - -__attribute__((naked)) -void sub_80AAD84(u8 *string, u8 b, u8 c, u8 d) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x64\n\ - mov r9, r0\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - str r1, [sp, 0x48]\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - str r2, [sp, 0x4C]\n\ - lsls r3, 24\n\ - lsrs r3, 24\n\ - mov r10, r3\n\ - mov r5, r10\n\ - adds r5, 0x1\n\ - lsls r1, r5, 8\n\ - ldr r0, _080AAEC4 @ =0x06018000\n\ - subs r1, r0, r1\n\ - movs r0, 0\n\ - str r0, [sp, 0x44]\n\ - ldr r4, _080AAEC8 @ =0x040000d4\n\ - add r0, sp, 0x44\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - ldr r0, _080AAECC @ =0x85000040\n\ - str r0, [r4, 0x8]\n\ - ldr r0, [r4, 0x8]\n\ - mov r0, r9\n\ - bl StringLength\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ - cmp r7, 0x8\n\ - bls _080AADD0\n\ - movs r7, 0x8\n\ -_080AADD0:\n\ - movs r6, 0\n\ - mov r8, r5\n\ - mov r1, r10\n\ - lsls r1, 1\n\ - str r1, [sp, 0x58]\n\ - ldr r2, [sp, 0x48]\n\ - adds r2, 0x20\n\ - str r2, [sp, 0x5C]\n\ - cmp r6, r7\n\ - bge _080AAE1E\n\ - add r5, sp, 0x40\n\ - add r0, sp, 0x20\n\ - mov r10, r0\n\ - ldr r2, _080AAEC4 @ =0x06018000\n\ -_080AADEC:\n\ - mov r1, r9\n\ - adds r0, r1, r6\n\ - ldrb r0, [r0]\n\ - strb r0, [r5]\n\ - movs r0, 0xFF\n\ - strb r0, [r5, 0x1]\n\ - mov r0, sp\n\ - adds r1, r5, 0\n\ - str r2, [sp, 0x60]\n\ - bl sub_80034D4\n\ - mov r1, r8\n\ - lsls r0, r1, 8\n\ - ldr r2, [sp, 0x60]\n\ - subs r0, r2, r0\n\ - mov r1, r10\n\ - str r1, [r4]\n\ - str r0, [r4, 0x4]\n\ - ldr r0, _080AAED0 @ =0x84000008\n\ - str r0, [r4, 0x8]\n\ - ldr r0, [r4, 0x8]\n\ - adds r2, 0x20\n\ - adds r6, 0x1\n\ - cmp r6, r7\n\ - blt _080AADEC\n\ -_080AAE1E:\n\ - movs r1, 0x7C\n\ - ldr r2, [sp, 0x58]\n\ - subs r1, r2\n\ - lsls r1, 24\n\ - lsrs r7, r1, 24\n\ - ldr r0, _080AAED4 @ =gMain\n\ - mov r9, r0\n\ - lsls r3, r7, 3\n\ - add r3, r9\n\ - ldr r0, _080AAED8 @ =gUnknown_083C9400\n\ - ldr r1, [r0]\n\ - ldr r2, [r0, 0x4]\n\ - str r1, [sp, 0x50]\n\ - str r2, [sp, 0x54]\n\ - str r1, [r3, 0x3C]\n\ - str r2, [r3, 0x40]\n\ - mov r2, r8\n\ - lsls r0, r2, 3\n\ - movs r1, 0x80\n\ - lsls r1, 3\n\ - adds r2, r1, 0\n\ - subs r2, r0\n\ - adds r6, r3, 0\n\ - adds r6, 0x40\n\ - ldr r0, _080AAEDC @ =0x000003ff\n\ - mov r8, r0\n\ - mov r1, r8\n\ - ands r2, r1\n\ - ldrh r5, [r6]\n\ - ldr r4, _080AAEE0 @ =0xfffffc00\n\ - adds r0, r4, 0\n\ - ands r0, r5\n\ - orrs r0, r2\n\ - strh r0, [r6]\n\ - ldrh r5, [r3, 0x3E]\n\ - ldr r2, _080AAEE4 @ =0xfffffe00\n\ - adds r0, r2, 0\n\ - ands r0, r5\n\ - ldr r1, [sp, 0x48]\n\ - orrs r0, r1\n\ - strh r0, [r3, 0x3E]\n\ - adds r3, 0x3C\n\ - add r0, sp, 0x4C\n\ - ldrb r0, [r0]\n\ - strb r0, [r3]\n\ - adds r1, r7, 0x1\n\ - lsls r1, 3\n\ - mov r0, r9\n\ - adds r7, r1, r0\n\ - ldr r0, [sp, 0x50]\n\ - ldr r1, [sp, 0x54]\n\ - str r0, [r7, 0x3C]\n\ - str r1, [r7, 0x40]\n\ - ldrh r0, [r6]\n\ - lsls r0, 22\n\ - lsrs r0, 22\n\ - adds r0, 0x4\n\ - adds r5, r7, 0\n\ - adds r5, 0x40\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldrh r3, [r5]\n\ - ands r4, r3\n\ - orrs r4, r0\n\ - strh r4, [r5]\n\ - ldrh r0, [r7, 0x3E]\n\ - ands r2, r0\n\ - ldr r0, [sp, 0x5C]\n\ - orrs r2, r0\n\ - strh r2, [r7, 0x3E]\n\ - adds r1, r7, 0\n\ - adds r1, 0x3C\n\ - add r2, sp, 0x4C\n\ - ldrb r2, [r2]\n\ - strb r2, [r1]\n\ - add sp, 0x64\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080AAEC4: .4byte 0x06018000\n\ -_080AAEC8: .4byte 0x040000d4\n\ -_080AAECC: .4byte 0x85000040\n\ -_080AAED0: .4byte 0x84000008\n\ -_080AAED4: .4byte gMain\n\ -_080AAED8: .4byte gUnknown_083C9400\n\ -_080AAEDC: .4byte 0x000003ff\n\ -_080AAEE0: .4byte 0xfffffc00\n\ -_080AAEE4: .4byte 0xfffffe00\n\ - .syntax divided\n"); -} - -void unref_sub_80AAEE8(s32 a, u8 b, u8 c, u8 d) -{ - u8 string[12]; - u8 offset = 0; - - if (a < 0) - { - string[0] = 0xAE; - offset = 1; - } - ConvertIntToDecimalStringN(string + offset, (a < 0) ? -a : a, 0, 8); - sub_80AAD84(string, b, c, d); -} - -void sub_80AAF30(void) -{ - s32 i; - - gUnknown_0203856C = 1; - gContestPlayerMonIndex = 3; - sub_80AE098(0); - - for (i = 3; i > -1; i--) - gUnknown_02038690[i] = 3 - i; - - for (i = 0; i < 3; i++) - { - gUnknown_02038670[i] = 0; - gUnknown_02038680[i] = 0; - gUnknown_02038678[i] = 0; - memcpy(&gContestMons[i], &gContestMons[3], sizeof(struct ContestPokemon)); - } - - gUnknown_02038670[3] = 0x12C; - gUnknown_02038680[3] = 0x190; - gUnknown_02038678[3] = 0x190; - sub_80B2A7C(0xFE); -} - -//Don't know size of return type -int MatsudaDebugMenu_SetHighScore(void) -{ - sub_80AAF30(); - CloseMenu(); - return 1; -} - -//Don't know size of return type -int MatsudaDebugMenu_ResetHighScore(void) -{ - s32 i; - - gUnknown_0203856C = 0; - for (i = 0; i < 4; i++) - { - gUnknown_02038670[i] = 0; - gUnknown_02038680[i] = 0; - gUnknown_02038678[i] = 0; - } - CloseMenu(); - return 1; -} - -//Don't know size of return type -int MatsudaDebugMenu_SetArtMuseumItems(void) -{ - s32 i; - - gContestPlayerMonIndex = 3; - sub_80AE098(0); - for (i = 3; i > -1; i--) - gUnknown_02038690[i] = 3 - i; - for (gScriptContestCategory = 0; gScriptContestCategory < 5; gScriptContestCategory++) - sub_80B2A7C(0xFF); - CloseMenu(); - return 1; -} - -void unref_sub_80AB084(u8 *text) -{ - u16 savedIme; - u8 *addr; - size_t size; - - 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_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT = 8; - ResetTasks(); - ResetSpriteData(); - SetMainCallback2(sub_80AB184); - - addr = (void *)VRAM; - size = 0x18000; - while (1) - { - DmaFill32(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill32(3, 0, addr, size); - break; - } - } - SetUpWindowConfig(&gWindowConfig_81E6FD8); - InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6FD8); - LoadFontDefaultPalette(&gWindowConfig_81E6FD8); - sub_8003460(&gUnknown_03004210, text, 1, 9, 7); -} - -void sub_80AB184(void) -{ - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; -} diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c deleted file mode 100644 index 93684fc60..000000000 --- a/src/mauville_old_man.c +++ /dev/null @@ -1,247 +0,0 @@ -#include "global.h" -#include "mauville_old_man.h" -#include "easy_chat.h" -#include "menu.h" -#include "rng.h" -#include "script.h" -#include "string_util.h" -#include "strings.h" -#include "trader.h" - -extern u16 gScriptResult; -extern u16 gSpecialVar_0x8004; - -extern u32 gUnknown_083E5388[]; -extern u32 gUnknown_083E53A8[]; - -extern u16 gUnknown_083E537C[]; - -void sub_80F7A34(void) -{ - u16 i; - OldMan *oldMan = &gSaveBlock1.oldMan; - - oldMan->oldMan1.unk_2D94 = 0; - oldMan->oldMan1.unk_2DBD = 0; - - for(i = 0; i < 6; i++) - oldMan->oldMan1.mauvilleOldMan_ecArray[i] = gUnknown_083E537C[i]; -} - -void sub_80F7A6C(void) -{ - struct UnkMauvilleOldManStruct *bard = &gSaveBlock1.oldMan.oldMan1; - - bard->unk_2D94 = 1; - bard->unk_2D95 = 0; -} - -void sub_80F7A7C(void) -{ - sub_80F83F8(); -} - -void sub_80F7A88(void) -{ - OldMan *oldMan = &gSaveBlock1.oldMan; - - oldMan->oldMan1.unk_2D94 = 4; - oldMan->oldMan1.unk_2D95 = 0; -} - -void sub_80F7A98(void) -{ - sub_81099CC(); -} - -void SetMauvilleOldMan(void) -{ - u32 var = ((u16)((gSaveBlock2.playerTrainerId[1] << 8 | gSaveBlock2.playerTrainerId[0])) % 10) / 2; - - switch(var) - { - case 0: - sub_80F7A34(); - break; - case 1: - sub_80F7A6C(); - break; - case 2: - sub_80F7A98(); - break; - case 3: - sub_80F7A7C(); - break; - case 4: - sub_80F7A88(); - break; - } - sub_80F83D0(); -} - -u8 GetCurrentMauvilleOldMan(void) -{ - OldMan *oldMan = &gSaveBlock1.oldMan; - - return oldMan->oldMan1.unk_2D94; -} - -void sub_80F7B14(void) -{ - gScriptResult = GetCurrentMauvilleOldMan(); -} - -void sub_80F7B2C(void) -{ - u16 *scriptPtr = &gScriptResult; // why?? - OldMan *oldMan = &gSaveBlock1.oldMan; - - *scriptPtr = oldMan->oldMan1.unk_2DBD; -} - -void sub_80F7B40(void) -{ - u16 i; - OldMan *oldMan = &gSaveBlock1.oldMan; - //struct UnkMauvilleOldManStruct *oldManStruct = &gSaveBlock1.oldManStruct; - - StringCopy(oldMan->oldMan1.playerName, gSaveBlock2.playerName); - - for(i = 0; i < 4; i++) - oldMan->oldMan1.playerTrainerId[i] = gSaveBlock2.playerTrainerId[i]; - - for(i = 0; i < 6; i++) - oldMan->oldMan1.mauvilleOldMan_ecArray[i] = oldMan->oldMan1.mauvilleOldMan_ecArray2[i]; - - oldMan->oldMan1.unk_2DBD = 1; -} - -void sub_80F7BA0(void) -{ - struct UnkMauvilleOldManStruct *oldMan = &gSaveBlock1.oldMan.oldMan1; - u16 specialVar = gSpecialVar_0x8004; // It's a bit odd to use this temp variable, but it seems needed to match. - u16 *r5; - u16 i; - u8 *ptr; - u8 *r4; - - r5 = oldMan->mauvilleOldMan_ecArray2; - if (specialVar == 0) - r5 = oldMan->mauvilleOldMan_ecArray; - ptr = gStringVar4; - r4 = ptr; - for (i = 0; i < 2; i++) - { - ptr = sub_80EB3FC(ptr, *(r5++)); - while (ptr != r4) - { - if (*r4 == 0) - *r4 = 0x37; - r4++; - } - r4++; - *(ptr++) = 0; - ptr = sub_80EB3FC(ptr, *(r5++)); - while (ptr != r4) - { - if (*r4 == 0) - *r4 = 0x37; - r4++; - } - r4++; - *(ptr++) = 0xFE; - ptr = sub_80EB3FC(ptr, *(r5++)); - while (ptr != r4) - { - if (*r4 == 0) - *r4 = 0x37; - r4++; - } - //_080F7C2A - if (i == 0) - { - *(ptr++) = EXT_CTRL_CODE_BEGIN; - *(ptr++) = 0xF; - } - } -} - -void sub_80F7C54(void) -{ - sub_80F7F80(gSpecialVar_0x8004); - MenuDisplayMessageBox(); - ScriptContext1_Stop(); -} - -void sub_80F7C70(void) -{ - u16 *scriptPtr = &gScriptResult; // again?? - OldMan *oldMan = &gSaveBlock1.oldMan; - - *scriptPtr = oldMan->oldMan1.unk_2D95; -} - -void sub_80F7C84(void) -{ - OldMan *oldMan = &gSaveBlock1.oldMan; - - oldMan->oldMan1.unk_2D95 = 1; -} - -void sub_80F7C90(void) -{ - u16 var = sub_80EB8EC(); - - if(var == 0xFFFF) - { - gScriptResult = FALSE; - } - else - { - sub_80EB3FC(gStringVar1, var); - gScriptResult = TRUE; - } -} - -void sub_80F7CC8(void) -{ - OldMan *oldMan = &gSaveBlock1.oldMan; - - if(oldMan->oldMan1.unk_2D95 == 10) - { - gScriptResult = FALSE; - oldMan->oldMan1.unk_2D95 = 0; - } - else - gScriptResult = TRUE; -} - -void sub_80F7CF4(void) -{ - struct UnkMauvilleOldManStruct2 *oldMan = &gSaveBlock1.oldMan.oldMan2; - - if(oldMan->unk1 == 0) - sub_80F7DC0(); - - if(oldMan->mauvilleOldMan_ecArray[oldMan->unk1] != 0xFFFF) // is not the last element of the array? - { - u8 *stringPtr; - u32 random = Random(); - - random %= 8; - stringPtr = sub_80EB3FC(gStringVar4, oldMan->mauvilleOldMan_ecArray[oldMan->unk1]); - stringPtr = StringCopy(stringPtr, gOtherText_Is); - stringPtr = StringCopy(stringPtr, (u8 *)gUnknown_083E5388[random]); - StringCopy(stringPtr, gOtherText_DontYouAgree); - } - else - { - StringCopy(gStringVar4, (u8 *)gUnknown_083E53A8[oldMan->mauvilleOldMan_ecArray2[oldMan->unk2++]]); - } - if(!(Random() % 10)) - oldMan->unk1 = 10; - else - oldMan->unk1++; - - gScriptResult = TRUE; -} diff --git a/src/menu.c b/src/menu.c deleted file mode 100644 index ef458124b..000000000 --- a/src/menu.c +++ /dev/null @@ -1,871 +0,0 @@ -#include "global.h" -#include "menu.h" -#include "main.h" -#include "map_obj_lock.h" -#include "menu_cursor.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "strings.h" -#include "text.h" -#include "text_window.h" -#include "string_util.h" - -struct Menu -{ - u8 left; - u8 top; - s8 cursorPos; - s8 minCursorPos; - s8 maxCursorPos; - u8 width; - u8 height; - u8 menu_field_7; - u8 columnXCoords[8]; -}; - -static void MultistepInitMenuWindowInternal(const struct WindowConfig *, u16); -static void InitMenuWindowInternal(const struct WindowConfig *, u16); -static bool8 sub_80723D4(void); -static u8 sub_8072484(u8, u8, u8, u8, u8, u8, u32); -static u8 sub_80724F4(u8, u8, u8, const struct MenuAction[], u8); -static void sub_8072620(u8, u8, u8, const struct MenuAction[], u8); -static void sub_8072D18(u8, u8); - -static struct Menu gMenu; - -EWRAM_DATA struct Window gMenuWindow = {0}; -EWRAM_DATA u8 gFiller_202E908[0x90] = {0}; -EWRAM_DATA struct Window *gMenuWindowPtr = NULL; -EWRAM_DATA u8 gMenuMultistepInitState = 0; -EWRAM_DATA u16 gMenuTextTileOffset = 0; -EWRAM_DATA u16 gMenuTextWindowTileOffset = 0; -EWRAM_DATA u16 gMenuTextWindowContentTileOffset = 0; -EWRAM_DATA u16 gMenuMessageBoxContentTileOffset = 0; - -const struct MenuAction gMenuYesNoItems[] = -{ - { OtherText_Yes, NULL }, - { OtherText_No, NULL }, -}; - -void CloseMenu(void) -{ - PlaySE(SE_SELECT); - MenuZeroFillScreen(); - sub_8064E2C(); - ScriptContext2_Disable(); - HandleDestroyMenuCursors(); -} - -void AppendToList(u8 *list, u8 *pindex, u32 value) -{ - list[*pindex] = value; - (*pindex)++; -} - -void InitMenuWindow(const struct WindowConfig *winConfig) -{ - InitMenuWindowInternal(winConfig, 1); -} - -void MultistepInitMenuWindowBegin(const struct WindowConfig *winConfig) -{ - MultistepInitMenuWindowInternal(winConfig, 1); -} - -static void MultistepInitMenuWindowInternal(const struct WindowConfig *winConfig, u16 tileOffset) -{ - gMenuMultistepInitState = 0; - gMenuTextTileOffset = tileOffset; - gMenuWindowPtr = &gMenuWindow; - InitWindowFromConfig(&gMenuWindow, winConfig); -} - -bool32 MultistepInitMenuWindowContinue(void) -{ - switch (gMenuMultistepInitState) - { - case 0: - gMenuMultistepInitState++; - return 0; - case 1: - gMenuTextWindowTileOffset = MultistepInitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); - goto next; - case 2: - if (!MultistepLoadFont()) - goto fail; - goto next; - case 3: - gMenuTextWindowContentTileOffset = SetTextWindowBaseTileNum(gMenuTextWindowTileOffset); - next: - gMenuMultistepInitState++; - return 0; - case 4: - LoadTextWindowGraphics(gMenuWindowPtr); - gMenuMessageBoxContentTileOffset = SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); - return 1; - default: - fail: - return 0; - } -} - -static void InitMenuWindowInternal(const struct WindowConfig *winConfig, u16 tileOffset) -{ - gMenuWindowPtr = &gMenuWindow; - InitWindowFromConfig(&gMenuWindow, winConfig); - gMenuTextTileOffset = tileOffset; - gMenuTextWindowTileOffset = InitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); - gMenuTextWindowContentTileOffset = SetTextWindowBaseTileNum(gMenuTextWindowTileOffset); - LoadTextWindowGraphics(gMenuWindowPtr); - gMenuMessageBoxContentTileOffset = SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); -} - -void unref_sub_8071DA4(struct WindowConfig *winConfig, u16 tileOffset) -{ - gMenuWindowPtr = &gMenuWindow; - InitWindowFromConfig(&gMenuWindow, winConfig); - gMenuTextWindowTileOffset = tileOffset; - gMenuTextWindowContentTileOffset = SetTextWindowBaseTileNum(gMenuTextWindowTileOffset); - LoadTextWindowGraphics(gMenuWindowPtr); - gMenuTextTileOffset = SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); - gMenuMessageBoxContentTileOffset = InitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); -} - -void MenuLoadTextWindowGraphics_OverrideFrameType(u8 frameType) -{ - LoadTextWindowGraphics_OverrideFrameType(gMenuWindowPtr, frameType); -} - -void MenuLoadTextWindowGraphics(void) -{ - LoadTextWindowGraphics(gMenuWindowPtr); -} - -void BasicInitMenuWindow(const struct WindowConfig *winConfig) -{ - InitWindowFromConfig(gMenuWindowPtr, winConfig); - gMenuWindowPtr->tileDataStartOffset = gMenuTextTileOffset; -} - -void MenuPrint(const u8 *str, u8 left, u8 top) -{ - sub_8003460(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); -} - -void MenuZeroFillWindowRect(u8 a1, u8 a2, u8 a3, u8 a4) -{ - ZeroFillWindowRect(gMenuWindowPtr, a1, a2, a3, a4); -} - -void MenuFillWindowRectWithBlankTile(u8 left, u8 top, u8 right, u8 bottom) -{ - FillWindowRectWithBlankTile(gMenuWindowPtr, left, top, right, bottom); -} - -void MenuZeroFillScreen(void) -{ - MenuZeroFillWindowRect(0, 0, 29, 19); -} - -void MenuDrawTextWindow(u8 left, u8 top, u8 right, u8 bottom) -{ - DrawTextWindow(gMenuWindowPtr, left, top, right, bottom); -} - -void sub_8071F40(const u8 *str) -{ - MenuDrawTextWindow(2, 14, 28, 19); - MenuPrint(str, 3, 15); -} - -void sub_8071F60(u8 a1, u8 a2, u8 a3) -{ - sub_8003490(gMenuWindowPtr, a1, gMenuTextTileOffset, a2, a3); -} - -u16 unref_sub_8071F98(u8 x, u8 y) -{ - return GetWindowTilemapEntry(gMenuWindowPtr, x, y); -} - -void unref_sub_8071FBC(u16 a1, u8 a2, u8 a3, u8 a4, u8 a5) -{ - DrawWindowRect(gMenuWindowPtr, a1, a2, a3, a4, a5); -} - -void MenuDisplayMessageBox(void) -{ - DisplayMessageBox(gMenuWindowPtr); -} - -void MenuPrintMessage(const u8 *str, u8 left, u8 top) -{ - sub_8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); -} - -void sub_8072044(const u8 *str) -{ - sub_8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, 2, 15); -} - -void MenuSetText(const u8 *str) -{ - sub_8002E90(gMenuWindowPtr, str); -} - -u8 MenuUpdateWindowText(void) -{ - return sub_80035AC(gMenuWindowPtr); -} - -u8 unref_sub_8072098(void) -{ - return sub_8003418(gMenuWindowPtr); -} - -void sub_80720B0(void) -{ - ClearWindowTextLines(gMenuWindowPtr); -} - -u8 MoveMenuCursor(s8 delta) -{ - s32 newPos = gMenu.cursorPos + delta; - - if (newPos < gMenu.minCursorPos) - gMenu.cursorPos = gMenu.maxCursorPos; - else if (newPos > gMenu.maxCursorPos) - gMenu.cursorPos = gMenu.minCursorPos; - else - gMenu.cursorPos += delta; - - RedrawMenuCursor(gMenu.left, 2 * gMenu.cursorPos + gMenu.top); - return gMenu.cursorPos; -} - -u8 MoveMenuCursorNoWrap(s8 delta) -{ - s32 newPos = gMenu.cursorPos + delta; - - if (newPos < gMenu.minCursorPos) - gMenu.cursorPos = gMenu.minCursorPos; - else if (newPos > gMenu.maxCursorPos) - gMenu.cursorPos = gMenu.maxCursorPos; - else - gMenu.cursorPos += delta; - - RedrawMenuCursor(gMenu.left, 2 * gMenu.cursorPos + gMenu.top); - return gMenu.cursorPos; -} - -u8 GetMenuCursorPos(void) -{ - return gMenu.cursorPos; -} - -s8 ProcessMenuInput(void) -{ - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gMenu.menu_field_7) - HandleDestroyMenuCursors(); - return gMenu.cursorPos; - } - - if (gMain.newKeys & B_BUTTON) - { - if (gMenu.menu_field_7) - HandleDestroyMenuCursors(); - return -1; - } - - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - MoveMenuCursor(-1); - return -2; - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - MoveMenuCursor(1); - return -2; - } - - return -2; -} - -s8 ProcessMenuInputNoWrap(void) -{ - u8 cursorPos = gMenu.cursorPos; - - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gMenu.menu_field_7) - HandleDestroyMenuCursors(); - return gMenu.cursorPos; - } - - if (gMain.newKeys & B_BUTTON) - { - if (gMenu.menu_field_7) - HandleDestroyMenuCursors(); - return -1; - } - - if (gMain.newKeys & DPAD_UP) - { - if (cursorPos != MoveMenuCursorNoWrap(-1)) - PlaySE(SE_SELECT); - return -2; - } - else if (gMain.newKeys & DPAD_DOWN) - { - if (cursorPos != MoveMenuCursorNoWrap(1)) - PlaySE(SE_SELECT); - return -2; - } - - MoveMenuCursorNoWrap(0); - return -2; -} - -u8 MoveMenuCursor3(s8 delta) -{ - u8 menuHeight = (gMenu.maxCursorPos + 1) >> 1; - s32 newPos = gMenu.cursorPos + delta; - - if (newPos < gMenu.minCursorPos) - gMenu.cursorPos = gMenu.maxCursorPos; - else if (newPos > gMenu.maxCursorPos) - gMenu.cursorPos = gMenu.minCursorPos; - else - gMenu.cursorPos += delta; - - RedrawMenuCursor( - 6 * (gMenu.cursorPos / menuHeight) + gMenu.left, - 2 * (gMenu.cursorPos % menuHeight) + gMenu.top); - - return gMenu.cursorPos; -} - -u8 MoveMenuCursor4(s8 delta) -{ - if (gMenu.cursorPos + delta <= gMenu.maxCursorPos) - { - if (sub_80723D4() == TRUE) - return gMenu.cursorPos; - } - else - { - return gMenu.cursorPos; - } - - gMenu.cursorPos += delta; - - if ((gMenu.maxCursorPos + 1) / gMenu.width == 0) - RedrawMenuCursor( - gMenu.left + gMenu.columnXCoords[gMenu.cursorPos % gMenu.width], - 2 * ((gMenu.cursorPos / gMenu.width) % gMenu.height) + gMenu.top); - else - RedrawMenuCursor( - gMenu.left + gMenu.columnXCoords[gMenu.cursorPos % gMenu.width], - 2 * (gMenu.cursorPos / gMenu.width) + gMenu.top); - - return gMenu.cursorPos; -} - -static bool8 sub_80723D4(void) -{ - if ((gMain.newKeys & DPAD_UP) && gMenu.cursorPos < gMenu.width) - return TRUE; - - if ((gMain.newKeys & DPAD_DOWN) && gMenu.cursorPos >= (gMenu.maxCursorPos + 1) - gMenu.width) - return TRUE; - - if ((gMain.newKeys & DPAD_LEFT) - && ((gMenu.cursorPos - (gMenu.cursorPos % gMenu.width)) % gMenu.width == 1 // always false - || gMenu.cursorPos == 0 - || gMenu.cursorPos % gMenu.width == 0)) - return TRUE; - - if ((gMain.newKeys & DPAD_RIGHT) && gMenu.cursorPos % gMenu.width == gMenu.width - 1) - return TRUE; - - return FALSE; -} - -static u8 sub_8072484(u8 a1, u8 a2, u8 menuItemCount, u8 a4, u8 width, u8 a6, u32 a7) -{ - u8 v7; - - gMenu.width = width; - gMenu.height = menuItemCount / width; - InitMenu(0, a1, a2, menuItemCount, a4, a6); - v7 = 0; - if (a7) - v7 = -1; - gMenu.menu_field_7 = v7; - return a4; -} - -static u8 sub_80724F4(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], u8 columnCount) -{ - u8 i; - u8 maxWidth; - s32 height; - - for (i = 0; i < 7; i++) - gMenu.columnXCoords[i] = 0; - - maxWidth = 0; - for (i = 0; i < menuItemCount; i++) - { - u8 width = (sub_8072CA4(menuItems[i].text) + 7) / 8; - - if (width > maxWidth) - maxWidth = width; - } - - for (i = 1; i <= columnCount; i++) - gMenu.columnXCoords[i] = maxWidth; - - for (i = 1; i <= columnCount; i++) - gMenu.columnXCoords[i] += 1 + gMenu.columnXCoords[i - 1]; - - gMenu.columnXCoords[columnCount]--; - - if (!((menuItemCount / 2) < columnCount || (menuItemCount % 2 != 0)) - || columnCount == 1 - || columnCount == menuItemCount) - { - height = 2 * (menuItemCount / columnCount) + 1; - } - else - { - height = 2 * ((menuItemCount / columnCount) + 1) + 1; - } - - { - // TODO: Make this code less hideous but still match the original asm. - u8 right; - u8 bottom; - u32 totalWidth; - register s32 val asm("r1"); - - val = (s8)top + height; - val = val << 24; - asm("" ::: "r3"); - bottom = val >> 24; - - totalWidth = (gMenu.columnXCoords[columnCount] + 1); - right = left + totalWidth; - - MenuDrawTextWindow(left, top, right, bottom); - } - - return maxWidth; -} - -static void sub_8072620(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], u8 columnCount) -{ - u8 i; - u8 maxWidth; - - for (i = 0; i < 7; i++) - gMenu.columnXCoords[i] = 0; - - maxWidth = 0; - for (i = 0; i < menuItemCount; i++) - { - u8 width = (sub_8072CA4(menuItems[i].text) + 7) / 8; - - if (width > maxWidth) - maxWidth = width; - } - - for (i = 1; i <= columnCount; i++) - gMenu.columnXCoords[i] = maxWidth; - - for (i = 1; i <= columnCount; i++) - gMenu.columnXCoords[i] += 1 + gMenu.columnXCoords[i - 1]; - - gMenu.columnXCoords[columnCount]--; - - for (i = 0; i < columnCount; i++) - { - u8 row = 0; - u8 j; - for (j = 0; i + j < menuItemCount; j += columnCount, row++) - MenuPrint(menuItems[i + j].text, left + gMenu.columnXCoords[i % columnCount], top + 2 * row); - } -} - -void sub_807274C(u8 left, u8 top, u8 menuItemCount, u8 a4, const struct MenuAction menuItems[], u8 columnCount, u32 a7) -{ - u8 maxWidth = sub_80724F4(left, top, menuItemCount, menuItems, columnCount); - - sub_8072484(left + 1, top + 1, menuItemCount, a4, columnCount, maxWidth, a7); - sub_8072620(left + 1, top + 1, menuItemCount, menuItems, columnCount); -} - -s8 sub_80727CC(void) -{ - if (gMain.newKeys & A_BUTTON) - { - if (gMenu.menu_field_7) - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - return GetMenuCursorPos(); - } - - if (gMain.newKeys & B_BUTTON) - { - if (gMenu.menu_field_7) - HandleDestroyMenuCursors(); - return -1; - } - - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - MoveMenuCursor4(-gMenu.width); - return -2; - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - MoveMenuCursor4(gMenu.width); - return -2; - } - else if (gMain.newKeys & DPAD_LEFT) - { - PlaySE(SE_SELECT); - MoveMenuCursor4(-1); - return -2; - } - else if (gMain.newKeys & DPAD_RIGHT) - { - PlaySE(SE_SELECT); - MoveMenuCursor4(1); - return -2; - } - - return -2; -} - -u8 sub_807288C(u8 column) -{ - return gMenu.columnXCoords[column]; -} - -void PrintMenuItems(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[]) -{ - u8 i; - - for (i = 0; i < menuItemCount; i++) - MenuPrint(menuItems[i].text, left, top + 2 * i); -} - -void PrintMenuItemsReordered(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], const u8 *order) -{ - u8 i; - - for (i = 0; i < menuItemCount; i++) - MenuPrint(menuItems[order[i]].text, left, top + 2 * i); -} - -void InitYesNoMenu(u8 left, u8 top, u8 a3) -{ - PrintMenuItems(left + 1, top + 1, 2, gMenuYesNoItems); - InitMenu(0, left + 1, top + 1, 2, 0, a3); -} - -void DisplayYesNoMenu(u8 left, u8 top, u32 a3) -{ - MenuDrawTextWindow(left, top, left + 6, top + 5); - InitYesNoMenu(left, top, 5); - gMenu.menu_field_7 = a3 ? -1 : 0; -} - -s8 ProcessMenuInputNoWrap_(void) -{ - return ProcessMenuInputNoWrap(); -} - -u8 MenuPrint_PixelCoords(const u8 *text, u8 left, u16 top, u8 a4) -{ - return sub_8004D04(gMenuWindowPtr, text, gMenuTextTileOffset, left, top, a4); -} - -u8 sub_8072A18(const u8 *text, u8 left, u16 top, u8 width, u32 a5) -{ - return sub_8004FD0(gMenuWindowPtr, 0, text, gMenuTextTileOffset, left, top, width, a5); -} - -u8 unref_sub_8072A5C(u8 *dest, u8 *src, u8 left, u16 top, u8 width, u32 a6) -{ - return sub_8004FD0(gMenuWindowPtr, dest, src, gMenuTextTileOffset, left, top, width, a6); -} - -#if ENGLISH -int sub_8072AB0(const u8 *str, u8 left, u16 top, u8 width, u8 height, u32 a6) -{ - u8 newlineCount = sub_8004FD0(gMenuWindowPtr, NULL, str, gMenuTextTileOffset, left, top, width, a6); - - left /= 8; - top /= 8; - width = (width + 7) / 8; - height = (height + 7) / 8; - - if (newlineCount < height) - MenuFillWindowRectWithBlankTile(left, top + 2 * newlineCount, left + width - 1, height + top - 1); -} -#elif GERMAN -__attribute__((naked)) -int sub_8072AB0(const u8 *str, u8 left, u16 top, u8 width, u8 height, u32 a6) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - sub sp, 0x10\n\ - mov r12, r0\n\ - ldr r0, [sp, 0x24]\n\ - ldr r4, [sp, 0x28]\n\ - str r4, [sp, 0xC]\n\ - lsls r1, 24\n\ - lsrs r5, r1, 24\n\ - lsls r2, 16\n\ - lsrs r4, r2, 16\n\ - lsls r3, 24\n\ - lsrs r6, r3, 24\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r0, _08072AF8 @ =gMenuWindowPtr\n\ - ldr r0, [r0]\n\ - ldr r1, _08072AFC @ =gMenuTextTileOffset\n\ - ldrh r3, [r1]\n\ - str r5, [sp]\n\ - str r4, [sp, 0x4]\n\ - str r6, [sp, 0x8]\n\ - movs r1, 0\n\ - mov r2, r12\n\ - bl sub_8004FD0\n\ - adds r1, r0, 0\n\ - lsls r1, 24\n\ - lsrs r2, r1, 24\n\ - movs r3, 0x7\n\ - ands r3, r5\n\ - cmp r3, 0\n\ - bne _08072B00\n\ - adds r1, r6, 0x7\n\ - asrs r1, 3\n\ - subs r1, 0x1\n\ - b _08072B0C\n\ - .align 2, 0\n\ -_08072AF8: .4byte gMenuWindowPtr\n\ -_08072AFC: .4byte gMenuTextTileOffset\n\ -_08072B00:\n\ - adds r3, r6, r3\n\ - subs r1, r3, 0x1\n\ - cmp r1, 0\n\ - bge _08072B0A\n\ - adds r1, r3, 0x6\n\ -_08072B0A:\n\ - asrs r1, 3\n\ -_08072B0C:\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r6, r1, 0\n\ - lsrs r5, 3\n\ - adds r1, r7, 0x7\n\ - asrs r1, 3\n\ - lsls r1, 24\n\ - lsrs r7, r1, 24\n\ - lsrs r4, 3\n\ - cmp r2, r7\n\ - bcs _08072B3E\n\ - lsls r1, r2, 1\n\ - adds r1, r4, r1\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r2, r5, r6\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - adds r3, r7, r4\n\ - subs r3, 0x1\n\ - lsls r3, 24\n\ - lsrs r3, 24\n\ - adds r0, r5, 0\n\ - bl MenuFillWindowRectWithBlankTile\n\ -_08072B3E:\n\ - add sp, 0x10\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} -#endif - -void MenuPrint_RightAligned(const u8 *str, u8 left, u8 top) -{ - sub_8004D38(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); -} - -void sub_8072B80(const u8 *a1, u8 a2, u8 a3, const u8 *a4) -{ - u8 buffer[64]; - u8 width = GetStringWidth(gMenuWindowPtr, a4); - AlignString(gMenuWindowPtr, buffer, a1, width, 1); - sub_8003460(gMenuWindowPtr, buffer, gMenuTextTileOffset, a2, a3); -} - -void sub_8072BD8(const u8 *a1, u8 a2, u8 a3, u16 a4) -{ - sub_8004DB0(gMenuWindowPtr, a1, gMenuTextTileOffset, a2, a3, a4); -} - -u8 *sub_8072C14(u8 *a1, s32 a2, u8 a3, u8 a4) -{ - return AlignInt1(gMenuWindowPtr, a1, a2, a3, a4); -} - -u8 *sub_8072C44(u8 *a1, s32 a2, u8 a3, u8 a4) -{ - return AlignInt2(gMenuWindowPtr, a1, a2, a3, a4); -} - -u8 *sub_8072C74(u8 *a1, const u8 *a2, u8 a3, u8 a4) -{ - return AlignString(gMenuWindowPtr, a1, a2, a3, a4); -} - -u8 sub_8072CA4(const u8 *str) -{ - return GetStringWidth(gMenuWindowPtr, str); -} - -u8 sub_8072CBC() -{ - return sub_8004E24(gMenuWindowPtr); -} - -void sub_8072CD4(u8 *a1, u8 *a2, u8 *a3) -{ - sub_8004E28(gMenuWindowPtr, a1, a2, a3); -} - -u32 MenuUpdateWindowText_OverrideLineLength(u8 lineLength) -{ - return sub_80037C8(gMenuWindowPtr, lineLength); -} - -struct Window *unref_sub_8072D0C(void) -{ - return gMenuWindowPtr; -} - -static void sub_8072D18(u8 a1, u8 a2) -{ - sub_814A5C0(a1, 0xFFFF, 12, 11679, 8 * a2); -} - -u8 InitMenu(u8 cursorSubpriority, u8 left, u8 top, u8 numChoices, u8 cursorPos, u8 cursorWidth) -{ - s32 pos; - - if (cursorWidth) - sub_8072D18(cursorSubpriority, cursorWidth); - - gMenu.left = left - 1; - gMenu.top = top; - gMenu.minCursorPos = 0; - gMenu.maxCursorPos = numChoices - 1; - gMenu.menu_field_7 = 0; - - pos = cursorPos; - - if (pos < 0 || pos > gMenu.maxCursorPos) - pos = 0; - - gMenu.cursorPos = pos; - MoveMenuCursor(0); - - return pos; -} - -void RedrawMenuCursor(u8 a1, u8 a2) -{ - sub_814A880((a1 + 1) * 8, 8 * a2); -} - -void unref_sub_8072DC0() -{ - sub_814A904(); -} - -void sub_8072DCC(u8 a1) -{ - sub_814A958(a1); -} - -void sub_8072DDC(u8 a1) -{ - sub_8072DCC(8 * a1); -} - -void HandleDestroyMenuCursors(void) -{ - DestroyMenuCursor(); -} - -#if GERMAN -void de_sub_8073110(u8 * buffer, u8 * name) { - u8 * ptr, *ptr2, *ptr3; - - ptr2 = buffer; - ptr = &gStringVar1[1 + StringLengthN(gStringVar1, 256)]; - ptr3 = ptr; - - for (;;) - { - if (*ptr2 == EOS) - break; - - if (*ptr2 == 0xFD) - { - - *ptr3 = EOS; - ptr2 += 2; - - StringAppend(ptr, name); - StringAppend(ptr, ptr2); - - buffer[0] = EOS; - StringAppend(buffer, ptr); - break; - } - - *ptr3 = *ptr2; - ptr2 += 1; - ptr3 += 1; - } -} - -u8 *de_sub_8073174(u8 *name, const u8 *format) { - u32 offset; - u8 *ptr; - - offset = StringLengthN(gStringVar2, 0x100); - ptr = &gStringVar2[1 + offset]; - - StringCopy(ptr, format); - - de_sub_8073110(ptr, name); - - return StringCopy(name, ptr); -} -#endif diff --git a/src/menu_cursor.c b/src/menu_cursor.c deleted file mode 100644 index 64ab36573..000000000 --- a/src/menu_cursor.c +++ /dev/null @@ -1,798 +0,0 @@ -#include "global.h" -#include "menu_cursor.h" -#include "palette.h" -#include "sprite.h" - -extern const struct SpriteSheet gUnknown_0842F140[]; -extern const struct SpriteSheet gUnknown_0842F1C0[]; -extern const struct SpritePalette gUnknown_0842F240; -extern const struct SpritePalette gUnknown_0842F248; -extern const struct SpriteTemplate gSpriteTemplate_842F250[]; -extern const struct SpriteTemplate gSpriteTemplate_842F298[]; - -extern struct Subsprite *const gUnknown_0842F5BC[]; - -extern const struct SubspriteTable gSubspriteTables_842F5C0[]; -extern const struct SubspriteTable gSubspriteTables_842F6C0[]; -extern const struct SubspriteTable gUnknown_0842F758[]; - -extern const struct Subsprite gUnknown_0842F780; -extern const struct Subsprite gUnknown_0842F788; -extern const struct Subsprite gUnknown_0842F790; - -extern u16 gUnknown_0203A360[]; - -EWRAM_DATA struct Subsprite gMenuCursorSubsprites[10] = {0}; -EWRAM_DATA u8 gUnknown_0203A3D0 = 0; -EWRAM_DATA u8 gUnknown_0203A3D1 = 0; -EWRAM_DATA u8 gUnknown_0203A3D2 = 0; -EWRAM_DATA u8 gUnknown_0203A3D3 = 0; -EWRAM_DATA u8 gUnknown_0203A3D4 = 0; - -void sub_814A590(void) -{ - gUnknown_0203A3D0 = 0x40; - gUnknown_0203A3D1 = 0x40; - gUnknown_0203A3D2 = 0x40; - gUnknown_0203A3D3 = 0; - gUnknown_0203A3D4 = 0; -} - -u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5) -{ - int v9; - struct Sprite *v10; - - if (gUnknown_0203A3D0 != 0x40 || gUnknown_0203A3D1 != 0x40) - DestroyMenuCursor(); - - v9 = 1; - if (a2 == 0xFFFF) - { - gUnknown_0203A360[a3 & 0xF] = a4; - if (LoadSpritePalette(&gUnknown_0842F240) != 0xFF) - { - a2 = 0xFFF0; - v9 = 0; - } - } - - LoadSpriteSheetDeferred(&gUnknown_0842F140[a3 & 0xF]); - gUnknown_0203A3D0 = CreateSprite(&gSpriteTemplate_842F250[v9], 0, 0xA0, a1); - gUnknown_0203A3D1 = CreateSprite(&gSpriteTemplate_842F250[2], 0, 0xA0, a1); - if (gUnknown_0203A3D0 != 0x40) - { - v10 = &gSprites[gUnknown_0203A3D0]; - if (a2 == 0xFFFF) - v10->oam.paletteNum = 0; - else - v10->oam.paletteNum = IndexOfSpritePaletteTag(a2); - } - if (gUnknown_0203A3D1 != 0x40) - { - v10 = &gSprites[gUnknown_0203A3D1]; - if (a2 == 0xFFFF) - v10->oam.paletteNum = 0; - else - v10->oam.paletteNum = IndexOfSpritePaletteTag(a2); - - if (!(REG_DISPCNT & (DISPCNT_WIN0_ON | DISPCNT_WIN1_ON))) - *(u8 *)(REG_ADDR_WINOUT) |= 0x1F; - gUnknown_0203A3D3 = REG_DISPCNT >> 0xF; - gUnknown_0203A3D4 = *(u8 *)(REG_BASE + REG_OFFSET_WINOUT + 1); - REG_DISPCNT |= DISPCNT_OBJWIN_ON; - *(u8 *)(REG_ADDR_WINOUT + 1) = 0x10; - } - sub_814A958(a5); - return gUnknown_0203A3D0; -} - -u8 sub_814A758(u8 a1, u8 a2, u8 a3, u8 a4) -{ - u8 result; - struct Sprite *spr; - - result = sub_814A5C0(a1, 0, a3, 0, a4); - if (result != 0x40) - { - spr = &gSprites[gUnknown_0203A3D0]; - spr->oam.paletteNum = a2; - } - return result; -} - -u8 unref_sub_814A7AC(u8 a1, u16 a2, u8 a3) -{ - u16 i; - u8 val1 = 0; - u16 val2 = 0xF; - - for (i = 0; i <= 0xFF; i++) - { - if (gPlttBufferUnfaded[i] == a2) - { - val1 = (u8)(i >> 4); - val2 = i & 0xF; - } - } - - return sub_814A758(a1, val1, val2, a3); -} - -void DestroyMenuCursor(void) -{ - if (gUnknown_0203A3D0 != 0x40) - { - LoadTilesForSpriteSheet(&gUnknown_0842F140[0]); - DestroySpriteAndFreeResources(&gSprites[gUnknown_0203A3D0]); - gUnknown_0203A3D0 = 0x40; - } - - if (gUnknown_0203A3D1 != 0x40) - { - DestroySpriteAndFreeResources(&gSprites[gUnknown_0203A3D1]); - gUnknown_0203A3D1 = 0x40; - if (!gUnknown_0203A3D3) - REG_DISPCNT &= ~DISPCNT_OBJWIN_ON; - *(u8 *)(REG_BASE + REG_OFFSET_WINOUT + 1) = gUnknown_0203A3D4; - } - - return; -} - -void sub_814A880(u8 a1, u8 a2) -{ - struct Sprite *spr; - - if (gUnknown_0203A3D0 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D0]; - spr->invisible = 0; - spr->centerToCornerVecX = 0; - spr->centerToCornerVecY = 0; - spr->pos1.x = a1; - spr->pos1.y = a2; - } - - if (gUnknown_0203A3D1 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D1]; - spr->invisible = 0; - spr->centerToCornerVecX = 0; - spr->centerToCornerVecY = 0; - spr->pos1.x = a1; - spr->pos1.y = a2; - } - - return; -} - -void sub_814A904(void) -{ - struct Sprite *spr; - - if (gUnknown_0203A3D0 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D0]; - spr->invisible = 1; - } - - if (gUnknown_0203A3D1 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D1]; - spr->invisible = 1; - } - - return; -} - -#ifdef NONMATCHING -// Fix pls -void sub_814A958(u8 a1) -{ - struct Subsprite *cursub; - u8 v2; // r7@1 - s16 v3; // r2@1 - s32 v5; // r0@1 - s32 v6; // r3@1 - s32 v7; // r5@3 - int v8; // r7@9 - s16 negone; - - cursub = &gMenuCursorSubsprites[0]; - negone = -1; - cursub = (struct Subsprite){0,2}; - cursub->x = negone; - cursub++; - - v2 = 1; - v3 = 1; - v5 = (a1 - 1) << 0x10; - v6 = v5 >> 0x10; - if ((v5 >> 0x10) > 7) - { - do - { - if (v6 > 0x1F) - { - *cursub = gUnknown_0842F780; - cursub->x = v3; - v3 = ((v3 << 16) + 0x200000) >> 16; - v7 = a1 << 16; - } - else - { - v7 = a1 << 16; - if (a1 <= 0x27 || v6 <= 0x8) - { - *cursub = gUnknown_0842F788; - cursub->x = v3; - v3 = ((v3 << 16) + 0x80000) >> 16; - } - else - { - *cursub = gUnknown_0842F780; - cursub->x = v3 - 0x20 + (v6 & 0xFFF8); - v3 = (v3 + (v6 & 0x18)) & negone; - } - } - - cursub++; - v2 = v2 + 1; - v6 = ((v7 >> 16) - v3) & 0xFFFF; - } - while (v7 - v3 > 7); - } - *cursub = gUnknown_0842F790; - cursub->x = v6 + v3 - 7; - v8 = v2 + 1; - if (gUnknown_0203A3D0 != 0x40) - SetSubspriteTables(&gSprites[gUnknown_0203A3D0], &gSubspriteTables_842F5C0[v8]); - if (gUnknown_0203A3D1 != 0x40) - SetSubspriteTables(&gSprites[gUnknown_0203A3D1], &gSubspriteTables_842F5C0[v8]); - return; -} -#elif ENGLISH -__attribute__((naked)) -void sub_814A958(u8 a1) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - ldr r4, _0814A9C4\n\ - ldr r2, _0814A9C8\n\ - lsrs r0, 24\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0\n\ - movs r1, 0x2\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - strh r2, [r4]\n\ - adds r4, 0x8\n\ - movs r7, 0x1\n\ - movs r2, 0x1\n\ - ldr r1, [sp]\n\ - subs r0, r1, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x7\n\ - ble _0814AA3A\n\ - ldr r0, _0814A9CC\n\ - mov r12, r0\n\ - mov r8, r1\n\ - movs r1, 0x8\n\ - negs r1, r1\n\ - mov r10, r1\n\ - ldr r5, _0814A9D0\n\ - mov r9, r5\n\ -_0814A99E:\n\ - lsls r0, r3, 16\n\ - asrs r3, r0, 16\n\ - cmp r3, 0x1F\n\ - ble _0814A9D4\n\ - mov r6, r12\n\ - ldr r0, [r6]\n\ - ldr r1, [r6, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - strh r2, [r4]\n\ - lsls r0, r2, 16\n\ - movs r1, 0x80\n\ - lsls r1, 14\n\ - adds r0, r1\n\ - lsrs r2, r0, 16\n\ - ldr r3, [sp]\n\ - lsls r5, r3, 16\n\ - b _0814AA20\n\ - .align 2, 0\n\ -_0814A9C4: .4byte gMenuCursorSubsprites\n\ -_0814A9C8: .4byte 0x0000ffff\n\ -_0814A9CC: .4byte gUnknown_0842F780\n\ -_0814A9D0: .4byte gUnknown_0842F788\n\ -_0814A9D4:\n\ - ldr r6, [sp]\n\ - lsls r5, r6, 16\n\ - mov r0, r8\n\ - cmp r0, 0x27\n\ - ble _0814AA0A\n\ - cmp r3, 0x8\n\ - ble _0814AA0A\n\ - mov r6, r12\n\ - ldr r0, [r6]\n\ - ldr r1, [r6, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - lsls r1, r2, 16\n\ - asrs r1, 16\n\ - adds r2, r1, 0\n\ - subs r2, 0x20\n\ - adds r0, r3, 0\n\ - mov r6, r10\n\ - ands r0, r6\n\ - adds r2, r0\n\ - strh r2, [r4]\n\ - movs r0, 0x18\n\ - ands r0, r3\n\ - adds r1, r0\n\ - lsls r1, 16\n\ - lsrs r2, r1, 16\n\ - b _0814AA20\n\ -_0814AA0A:\n\ - mov r3, r9\n\ - ldr r0, [r3]\n\ - ldr r1, [r3, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - strh r2, [r4]\n\ - lsls r0, r2, 16\n\ - movs r6, 0x80\n\ - lsls r6, 12\n\ - adds r0, r6\n\ - lsrs r2, r0, 16\n\ -_0814AA20:\n\ - adds r4, 0x8\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - asrs r1, r5, 16\n\ - lsls r0, r2, 16\n\ - asrs r0, 16\n\ - subs r1, r0\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - cmp r1, 0x7\n\ - bgt _0814A99E\n\ -_0814AA3A:\n\ - ldr r5, _0814AAA8\n\ - ldr r0, [r5]\n\ - ldr r1, [r5, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - lsls r1, r2, 16\n\ - asrs r1, 16\n\ - subs r1, 0x7\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - adds r0, r1\n\ - strh r0, [r4]\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r6, _0814AAAC\n\ - ldrb r0, [r6]\n\ - cmp r0, 0x40\n\ - beq _0814AA78\n\ - adds r1, r0, 0\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0814AAB0\n\ - adds r2, r0, r1\n\ - lsls r1, r7, 3\n\ - ldr r0, _0814AAB4\n\ - adds r1, r0\n\ - adds r0, r2, 0\n\ - bl SetSubspriteTables\n\ -_0814AA78:\n\ - ldr r1, _0814AAB8\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x40\n\ - beq _0814AA98\n\ - adds r1, r0, 0\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0814AAB0\n\ - adds r2, r0, r1\n\ - lsls r1, r7, 3\n\ - ldr r0, _0814AAB4\n\ - adds r1, r0\n\ - adds r0, r2, 0\n\ - bl SetSubspriteTables\n\ -_0814AA98:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0814AAA8: .4byte gUnknown_0842F790\n\ -_0814AAAC: .4byte gUnknown_0203A3D0\n\ -_0814AAB0: .4byte gSprites\n\ -_0814AAB4: .4byte gSubspriteTables_842F5C0\n\ -_0814AAB8: .4byte gUnknown_0203A3D1\n\ - .syntax divided\n"); -} -#elif GERMAN -__attribute__((naked)) -void sub_814A958(u8 a1) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - ldr r4, _0814A9C4 @ =gMenuCursorSubsprites\n\ - ldr r2, _0814A9C8 @ =0x0000ffff\n\ - lsrs r0, 24\n\ - str r0, [sp]\n\ - ldr r0, _0814A9CC @ =gUnknown_0842F780\n\ - ldr r1, [r0, 0x4]\n\ - ldr r0, [r0]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - strh r2, [r4]\n\ - adds r4, 0x8\n\ - movs r7, 0x1\n\ - movs r2, 0x1\n\ - ldr r1, [sp]\n\ - subs r0, r1, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x7\n\ - ble _0814AA3E\n\ - ldr r0, _0814A9D0 @ =gUnknown_0842F788\n\ - mov r12, r0\n\ - mov r8, r1\n\ - movs r1, 0x8\n\ - negs r1, r1\n\ - mov r10, r1\n\ - ldr r5, _0814A9D4 @ =gUnknown_0842F790\n\ - mov r9, r5\n\ -_0814A99E:\n\ - lsls r0, r3, 16\n\ - asrs r3, r0, 16\n\ - cmp r3, 0x1F\n\ - ble _0814A9D8\n\ - mov r6, r12\n\ - ldr r0, [r6]\n\ - ldr r1, [r6, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - strh r2, [r4]\n\ - lsls r0, r2, 16\n\ - movs r1, 0x80\n\ - lsls r1, 14\n\ - adds r0, r1\n\ - lsrs r2, r0, 16\n\ - ldr r3, [sp]\n\ - lsls r5, r3, 16\n\ - b _0814AA24\n\ - .align 2, 0\n\ -_0814A9C4: .4byte gMenuCursorSubsprites\n\ -_0814A9C8: .4byte 0x0000ffff\n\ -_0814A9CC: .4byte gUnknown_0842F780\n\ -_0814A9D0: .4byte gUnknown_0842F788\n\ -_0814A9D4: .4byte gUnknown_0842F790\n\ -_0814A9D8:\n\ - ldr r6, [sp]\n\ - lsls r5, r6, 16\n\ - mov r0, r8\n\ - cmp r0, 0x27\n\ - ble _0814AA0E\n\ - cmp r3, 0x8\n\ - ble _0814AA0E\n\ - mov r6, r12\n\ - ldr r0, [r6]\n\ - ldr r1, [r6, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - lsls r1, r2, 16\n\ - asrs r1, 16\n\ - adds r2, r1, 0\n\ - subs r2, 0x20\n\ - adds r0, r3, 0\n\ - mov r6, r10\n\ - ands r0, r6\n\ - adds r2, r0\n\ - strh r2, [r4]\n\ - movs r0, 0x18\n\ - ands r0, r3\n\ - adds r1, r0\n\ - lsls r1, 16\n\ - lsrs r2, r1, 16\n\ - b _0814AA24\n\ -_0814AA0E:\n\ - mov r3, r9\n\ - ldr r0, [r3]\n\ - ldr r1, [r3, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - strh r2, [r4]\n\ - lsls r0, r2, 16\n\ - movs r6, 0x80\n\ - lsls r6, 12\n\ - adds r0, r6\n\ - lsrs r2, r0, 16\n\ -_0814AA24:\n\ - adds r4, 0x8\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - asrs r1, r5, 16\n\ - lsls r0, r2, 16\n\ - asrs r0, 16\n\ - subs r1, r0\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - cmp r1, 0x7\n\ - bgt _0814A99E\n\ -_0814AA3E:\n\ - ldr r5, _0814AAAC @ =gUnknown_0842F798\n\ - ldr r0, [r5]\n\ - ldr r1, [r5, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - lsls r1, r2, 16\n\ - asrs r1, 16\n\ - subs r1, 0x7\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - adds r0, r1\n\ - strh r0, [r4]\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r6, _0814AAB0 @ =gUnknown_0203A3D0\n\ - ldrb r0, [r6]\n\ - cmp r0, 0x40\n\ - beq _0814AA7C\n\ - adds r1, r0, 0\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0814AAB4 @ =gSprites\n\ - adds r2, r0, r1\n\ - lsls r1, r7, 3\n\ - ldr r0, _0814AAB8 @ =gSubspriteTables_842F5C0\n\ - adds r1, r0\n\ - adds r0, r2, 0\n\ - bl SetSubspriteTables\n\ -_0814AA7C:\n\ - ldr r1, _0814AABC @ =gUnknown_0203A3D1\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x40\n\ - beq _0814AA9C\n\ - adds r1, r0, 0\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0814AAB4 @ =gSprites\n\ - adds r2, r0, r1\n\ - lsls r1, r7, 3\n\ - ldr r0, _0814AAB8 @ =gSubspriteTables_842F5C0\n\ - adds r1, r0\n\ - adds r0, r2, 0\n\ - bl SetSubspriteTables\n\ -_0814AA9C:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0814AAAC: .4byte gUnknown_0842F798\n\ -_0814AAB0: .4byte gUnknown_0203A3D0\n\ -_0814AAB4: .4byte gSprites\n\ -_0814AAB8: .4byte gSubspriteTables_842F5C0\n\ -_0814AABC: .4byte gUnknown_0203A3D1\n\ - .syntax divided\n"); -} -#endif - -void sub_814AABC(void (*callback)(struct Sprite *)) -{ - struct Sprite *spr; - - if (gUnknown_0203A3D0 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D0]; - spr->callback = callback; - } - - if (gUnknown_0203A3D1 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D1]; - spr->callback = callback; - } - - return; -} - -void sub_814AAF8(u16 a1) -{ - struct Sprite *spr; - u8 v2; - u8 v3; - u16 v4; - - if (gUnknown_0203A3D0 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D0]; - if (spr->template->paletteTag == 0xFFFF) - { - for (v2 = 0, v3 = 0xF, v4 = 0; v4 <= 0xFF; v4++) - { - if (gPlttBufferUnfaded[v4] == a1) - { - v2 = v4 >> 4; - v3 = v4 & 0xF; - } - } - spr->oam.paletteNum = v2; - RequestSpriteSheetCopy(&gUnknown_0842F140[v3 & 0xF]); - } - } - return; -} - -void sub_814AB84(void) -{ - struct Sprite *spr; - - if (gUnknown_0203A3D1 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D1]; - FreeSpriteOamMatrix(spr); - DestroySprite(spr); - gUnknown_0203A3D1 = 0x40; - - if (!gUnknown_0203A3D3) - REG_DISPCNT &= ~DISPCNT_OBJWIN_ON; - *(u8 *)(REG_ADDR_WINOUT + 1) = gUnknown_0203A3D4; - } - return; -} - -void unref_sub_814ABE4(int a1) -{ - struct Sprite *spr; - - CpuCopy16(gUnknown_0842F5BC[a1], &gMenuCursorSubsprites, 80); - - if (gUnknown_0203A3D0 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D0]; - SetSubspriteTables(spr, &gUnknown_0842F758[a1]); - } - if (gUnknown_0203A3D1 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D1]; - SetSubspriteTables(spr, &gUnknown_0842F758[a1]); - } - return; -} - -u8 CreateBlendedOutlineCursor(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5) -{ - int v8; - struct Sprite *spr; - u8 var1 = gUnknown_0203A3D2; - - if (var1 != 0x40) - sub_814AD44(); - - v8 = 1; - - if (a2 == 0xFFFF) - { - gUnknown_0203A360[a3 & 0xF] = a4; - if (LoadSpritePalette(&gUnknown_0842F248) != 0xFF ) - { - a2 = 0xFFF1; - v8 = 0; - } - } - - LoadSpriteSheetDeferred(&gUnknown_0842F1C0[a3 & 0xF]); -#if ENGLISH - gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 160, a1); -#elif GERMAN - gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 161, a1); -#endif - - if (gUnknown_0203A3D2 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D2]; - - if (a2 == 0xFFFF) - spr->oam.paletteNum = 0; - else - spr->oam.paletteNum = IndexOfSpritePaletteTag(a2); - } - sub_814ADF4(a5); - - return gUnknown_0203A3D2; -} - -void sub_814AD44(void) -{ - if (gUnknown_0203A3D2 != 0x40) - { - LoadTilesForSpriteSheet(&gUnknown_0842F1C0[0]); - DestroySpriteAndFreeResources(&gSprites[gUnknown_0203A3D2]); - gUnknown_0203A3D2 = 0x40; - } - return; -} - -void sub_814AD7C(u8 a1, u8 a2) -{ - struct Sprite *spr; - if (gUnknown_0203A3D2 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D2]; - spr->invisible = 0; - spr->centerToCornerVecX = 0; - spr->centerToCornerVecY = 0; - spr->pos1.x = a1; - spr->pos1.y = a2; - } - return; -} - -void sub_814ADC8() -{ - struct Sprite *spr; - if (gUnknown_0203A3D2 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D2]; - spr->invisible = 1; - } - return; -} - -void sub_814ADF4(u8 a1) -{ - if (a1 > 0x12) - a1 = 0; - - if (gUnknown_0203A3D2 != 0x40) - SetSubspriteTables(&gSprites[gUnknown_0203A3D2], &gSubspriteTables_842F6C0[a1]); - return; -} - -#if GERMAN -void nullsub_814B200(void) -{ -} -#endif diff --git a/src/menu_helpers.c b/src/menu_helpers.c deleted file mode 100644 index 9915d67ac..000000000 --- a/src/menu_helpers.c +++ /dev/null @@ -1,572 +0,0 @@ -#include "global.h" -#include "item_menu.h" -#include "items.h" -#include "link.h" -#include "mail_data.h" -#include "main.h" -#include "map_constants.h" -#include "menu.h" -#include "menu_helpers.h" -#include "rom4.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "text.h" - -#define SCROLL_INDICATOR_PAL_TAG 6 - -static void sub_80F9834(struct Sprite *sprite); - -static EWRAM_DATA u8 gUnknown_020388C0[4] = {0}; -static EWRAM_DATA struct YesNoFuncTable gUnknown_020388C4 = {0}; - -static TaskFunc gUnknown_0300074C; - -static const u8 gSpriteImage_83E5808[] = INCBIN_U8("graphics/unknown_sprites/83E59A0/0.4bpp"); - -static const u8 gSpriteImage_83E5848[] = INCBIN_U8("graphics/unknown_sprites/83E59A0/1.4bpp"); - -static const u8 gSpriteImage_83E5888[] = INCBIN_U8("graphics/unknown_sprites/83E59B0/0.4bpp"); - -static const u8 gSpriteImage_83E58C8[] = INCBIN_U8("graphics/unknown_sprites/83E59B0/1.4bpp"); - -static const u8 gSpriteImage_83E5908[] = INCBIN_U8("graphics/unknown_sprites/83E59C0/0.4bpp"); - -static const u8 gSpriteImage_83E5928[] = INCBIN_U8("graphics/unknown_sprites/83E59C0/1.4bpp"); - -static const u16 Palette_3E5948[] = INCBIN_U16("graphics/interface/83E5948.gbapal"); - -static const struct SpritePalette gUnknown_083E5968 = { Palette_3E5948, SCROLL_INDICATOR_PAL_TAG }; - -static const struct OamData gOamData_83E5970 = -{ - .tileNum = 1 -}; - -static const struct OamData gOamData_83E5978 = -{ - .shape = ST_OAM_H_RECTANGLE, - .tileNum = 1 -}; - -static const struct OamData gOamData_83E5980 = -{ - .shape = ST_OAM_V_RECTANGLE, - .tileNum = 1 -}; - -static const union AnimCmd gSpriteAnim_83E5988[] = -{ - ANIMCMD_FRAME(0, 0), - ANIMCMD_END, -}; - -static const union AnimCmd gSpriteAnim_83E5990[] = -{ - ANIMCMD_FRAME(1, 0), - ANIMCMD_END, -}; - -static const union AnimCmd *const gSpriteAnimTable_83E5998[] = -{ - gSpriteAnim_83E5988, - gSpriteAnim_83E5990, -}; - -static const struct SpriteFrameImage gSpriteImageTable_83E59A0[] = -{ - { gSpriteImage_83E5808, 0x40 }, - { gSpriteImage_83E5848, 0x40 }, -}; - -static const struct SpriteFrameImage gSpriteImageTable_83E59B0[] = -{ - { gSpriteImage_83E5888, 0x40 }, - { gSpriteImage_83E58C8, 0x40 }, -}; - -static const struct SpriteFrameImage gSpriteImageTable_83E59C0[] = -{ - { gSpriteImage_83E5908, 0x20 }, - { gSpriteImage_83E5928, 0x20 }, -}; - -static const struct SpriteTemplate gSpriteTemplate_83E59D0 = -{ - .tileTag = 0xFFFF, - .paletteTag = SCROLL_INDICATOR_PAL_TAG, - .oam = &gOamData_83E5978, - .anims = gSpriteAnimTable_83E5998, - .images = gSpriteImageTable_83E59A0, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80F9834, -}; - -static const struct SpriteTemplate gSpriteTemplate_83E59E8 = -{ - .tileTag = 0xFFFF, - .paletteTag = SCROLL_INDICATOR_PAL_TAG, - .oam = &gOamData_83E5980, - .anims = gSpriteAnimTable_83E5998, - .images = gSpriteImageTable_83E59B0, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80F9834, -}; - -static const struct SpriteTemplate gSpriteTemplate_83E5A00 = -{ - .tileTag = 0xFFFF, - .paletteTag = SCROLL_INDICATOR_PAL_TAG, - .oam = &gOamData_83E5970, - .anims = gSpriteAnimTable_83E5998, - .images = gSpriteImageTable_83E59C0, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -void sub_80F9020(void) -{ - memset(&gBGTilemapBuffers[1], 0, 0x800); - memset(&gBGTilemapBuffers[2], 0, 0x800); - memset(&gBGTilemapBuffers[3], 0, 0x800); -} - -// display message box, fill box with tile if tile is not zero, print string -static void PrintMessage(const u8 *str, u16 tile) -{ - MenuDisplayMessageBox(); - if (tile) - { - sub_80A3FA0(&gBGTilemapBuffers[1][0], 2, 15, 26, 4, tile); - } - sub_8072044(str); -} - -static void sub_80F9090(u8 taskId) -{ - if (MenuUpdateWindowText() == TRUE) - { - gUnknown_0300074C(taskId); - } -} - -void DisplayItemMessageOnField(u8 taskId, const u8 *str, TaskFunc callback, u16 tile) -{ - PrintMessage(str, tile); - gUnknown_0300074C = callback; - gTasks[taskId].func = sub_80F9090; -} - -static void Task_CallYesOrNoCallback(u8 taskId) -{ - switch (ProcessMenuInputNoWrap_()) - { - case 0: - PlaySE(SE_SELECT); - gUnknown_020388C4.yesFunc(taskId); - break; - case 1: - case -1: - PlaySE(SE_SELECT); - gUnknown_020388C4.noFunc(taskId); - } -} - -void DoYesNoFuncWithChoice(u8 taskId, const struct YesNoFuncTable *funcTable) -{ - gUnknown_020388C4 = *funcTable; - gTasks[taskId].func = Task_CallYesOrNoCallback; -} - -static void PrintStringWithPalette(const u8 *str, u8 paletteNum, u8 left, u8 top) -{ - u8 paletteStr[] = _("{PALETTE 0}"); - - if (paletteNum != 0xFF) - { - paletteStr[2] = paletteNum; - StringCopy(gStringVar4, paletteStr); - StringAppend(gStringVar4, str); - paletteStr[2] = gMenuWindowPtr->paletteNum; - StringAppend(gStringVar4, paletteStr); - } - else - { - StringCopy(gStringVar4, str); - } - - MenuPrint(gStringVar4, left, top); -} - -// unused -void PrintNumberWithPalette(s32 value, u8 paletteNum, u8 n, u8 mode, u8 left, u8 top) -{ - ConvertIntToDecimalStringN(gStringVar1, value, mode, n); - if (paletteNum != 0xFF) - { - PrintStringWithPalette(gStringVar1, paletteNum, left, top); - } - else - { - MenuPrint(gStringVar1, left, top); - } -} - -// unused -void PrintTriangleCursorWithPalette(u8 left, u8 top, u8 paletteNum) -{ - u8 cursorStr[] = _("▶"); - PrintStringWithPalette(cursorStr, paletteNum, left, top); -} - -u8 sub_80F9284(void) -{ - if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) - { - if (gMain.newKeys & L_BUTTON) - { - return 1; - } - if (gMain.newKeys & R_BUTTON) - { - return 2; - } - } - - return 0; -} - -u8 sub_80F92BC(void) -{ - if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) - { - if (gMain.newAndRepeatedKeys & L_BUTTON) - { - return 1; - } - if (gMain.newAndRepeatedKeys & R_BUTTON) - { - return 2; - } - } - - return 0; -} - -bool8 sub_80F92F4(u16 itemId) -{ - if (itemId != ITEM_ENIGMA_BERRY) - { - return TRUE; - } - - if (!(gSaveBlock1.location.mapGroup == MAP_GROUP_TRADE_CENTER && gSaveBlock1.location.mapNum == MAP_ID_TRADE_CENTER)) - { - return TRUE; - } - - return FALSE; -} - -bool8 sub_80F931C(u16 itemId) -{ - if (is_c1_link_related_active() != TRUE) - { - return TRUE; - } - - if (ItemIsMail(itemId) != TRUE) - { - return TRUE; - } - - return FALSE; -} - -bool8 sub_80F9344(void) -{ - if (is_c1_link_related_active() == TRUE || gReceivedRemoteLinkPlayers == 1) - { - return TRUE; - } - - return FALSE; -} - -void sub_80F9368(void) -{ - u8 *addr; - u32 size; - - REG_DISPCNT = 0; - REG_BG3CNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - 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; - } - } - - DmaClear32(3, OAM, OAM_SIZE); - DmaClear16(3, PLTT, PLTT_SIZE); -} - -void sub_80F9438(void) -{ - SetVBlankCallback(NULL); - SetHBlankCallback(NULL); -} - -void sub_80F944C(void) -{ - u8 i; - - for (i = 0; i < 4; i++) - { - gUnknown_020388C0[i] = 0xFF; - } - - FreeSpritePaletteByTag(SCROLL_INDICATOR_PAL_TAG); - LoadSpritePalette(&gUnknown_083E5968); -} - -void sub_80F9480(u8 *data, u8 n) -{ - u8 i; - - for (i = 0; i < n; i++) - { - data[i] = 0xFF; - } -} - -void sub_80F94A4(u8 animNum, u8 *spriteId, s16 x, s16 y) -{ - if (animNum <= 5) - { - if (*spriteId == 0xFF) - { - *spriteId = CreateSprite(&gSpriteTemplate_83E5A00, x, y, 0); - } - animNum -= 4; - StartSpriteAnim(&gSprites[*spriteId], animNum); - } -} - -void sub_80F94F8(u8 *spriteId) -{ - if (*spriteId != 0xFF) - { - DestroySprite(&gSprites[*spriteId]); - *spriteId = 0xFF; - } -} - -void sub_80F9520(u8 *data, u8 n) -{ - u8 i; - - for (i = 0; i < 8; i++) - { - sub_80F94F8(&data[i]); - } -} - -void CreateVerticalScrollIndicators(u8 id, u16 x, u16 y) -{ - if (id >= 4) - { - return; - } - - switch (id) - { - case 0: - if (gUnknown_020388C0[0] == 0xFF) - { - gUnknown_020388C0[0] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); - gSprites[gUnknown_020388C0[0]].data2 = -1; - if (gUnknown_020388C0[1] != 0xFF) - { - gSprites[gUnknown_020388C0[0]].pos2.y = gSprites[gUnknown_020388C0[1]].pos2.y * -1; - gSprites[gUnknown_020388C0[0]].data3 = gSprites[gUnknown_020388C0[1]].data3; - } - else - { - gSprites[gUnknown_020388C0[0]].data3 = 0; - } - } - break; - - case 1: - if (gUnknown_020388C0[1] == 0xFF) - { - gUnknown_020388C0[1] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); - gSprites[gUnknown_020388C0[1]].data2 = 1; - if (gUnknown_020388C0[0] != 0xFF) - { - gSprites[gUnknown_020388C0[1]].pos2.y = gSprites[gUnknown_020388C0[0]].pos2.y * -1; - gSprites[gUnknown_020388C0[1]].data3 = gSprites[gUnknown_020388C0[0]].data3; - } - else - { - gSprites[gUnknown_020388C0[1]].data3 = 0; - } - } - break; - - case 2: - if (gUnknown_020388C0[2] == 0xFF) - { - gUnknown_020388C0[2] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); - gSprites[gUnknown_020388C0[2]].data0 = -1; - if (gUnknown_020388C0[3] != 0xFF) - { - gSprites[gUnknown_020388C0[2]].pos2.x = gSprites[gUnknown_020388C0[3]].pos2.x * -1; - gSprites[gUnknown_020388C0[2]].data1 = gSprites[gUnknown_020388C0[3]].data1; - } - else - { - gSprites[gUnknown_020388C0[2]].data1 = 0; - } - } - break; - - case 3: - if (gUnknown_020388C0[3] == 0xFF) - { - gUnknown_020388C0[3] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); - gSprites[gUnknown_020388C0[3]].data0 = 1; - if (gUnknown_020388C0[2] != 0xFF) - { - gSprites[gUnknown_020388C0[3]].pos2.x = gSprites[gUnknown_020388C0[2]].pos2.x * -1; - gSprites[gUnknown_020388C0[3]].data1 = gSprites[gUnknown_020388C0[2]].data1; - } - else - { - gSprites[gUnknown_020388C0[3]].data1 = 0; - } - } - break; - } - - StartSpriteAnim(&gSprites[gUnknown_020388C0[id]], id & 1); -} - -void sub_80F979C(u8 id, bool8 invisible) -{ - if (id < 4 && gUnknown_020388C0[id] != 0xFF) - { - gSprites[gUnknown_020388C0[id]].invisible = invisible; - } -} - -void DestroyVerticalScrollIndicator(u8 id) -{ - if (id < 4 && gUnknown_020388C0[id] != 0xFF) - { - DestroySprite(&gSprites[gUnknown_020388C0[id]]); - gUnknown_020388C0[id] = 0xFF; - } -} - -void LoadScrollIndicatorPalette(void) -{ - LoadSpritePalette(&gUnknown_083E5968); -} - -void BuyMenuFreeMemory(void) -{ - FreeSpritePaletteByTag(SCROLL_INDICATOR_PAL_TAG); -} - -static void sub_80F9834(struct Sprite *sprite) -{ - if (sprite->data1 == 0) - { - sprite->pos2.x += sprite->data0; - } - if (sprite->data3 == 0) - { - sprite->pos2.y += sprite->data2; - } - sprite->data1++; - sprite->data3++; - if (sprite->data1 > 2) - { - sprite->data1 = 0; - } - if (sprite->data3 > 2) - { - sprite->data3 = 0; - } - if (sprite->pos2.x == 8 || sprite->pos2.x == -8) - { - sprite->pos2.x = 0; - } - if (sprite->pos2.y == 8 || sprite->pos2.y == -8) - { - sprite->pos2.y = 0; - } -} - -void sub_80F98A4(u8 id) -{ - if (gUnknown_020388C0[id] != 0xFF && id < 4) - { - gSprites[gUnknown_020388C0[id]].callback = SpriteCallbackDummy; - } -} - -void StartVerticalScrollIndicators(u8 id) -{ - if (gUnknown_020388C0[id] != 0xFF && id < 4) - { - gSprites[gUnknown_020388C0[id]].callback = sub_80F9834; - } -} - -static void sub_80F9914(u8 id) -{ - if (gUnknown_020388C0[id] != 0xFF && id < 4) - { - gSprites[gUnknown_020388C0[id]].pos2.x = 0; - gSprites[gUnknown_020388C0[id]].pos2.y = 0; - gSprites[gUnknown_020388C0[id]].data1 = 0; - gSprites[gUnknown_020388C0[id]].data3 = 0; - } -} - -void PauseVerticalScrollIndicator(u8 id) -{ - sub_80F98A4(id); - sub_80F9914(id); -} - -void sub_80F9988(u8 id, u8 priority) -{ - if (gUnknown_020388C0[id] != 0xFF && id < 4) - { - gSprites[gUnknown_020388C0[id]].oam.priority = priority; - } -} diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c deleted file mode 100644 index d05ba0b89..000000000 --- a/src/metatile_behavior.c +++ /dev/null @@ -1,1308 +0,0 @@ -#include "global.h" -#include "metatile_behavior.h" -#include "metatile_behaviors.h" - -#define TILE_ATTRIBUTES(three, two, one) (((one) ? 1 : 0) | ((two) ? 2 : 0) | ((three) ? 4 : 0)) - -static const u8 sTileBitAttributes[] = -{ - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, TRUE), - TILE_ATTRIBUTES(TRUE, TRUE, TRUE), - TILE_ATTRIBUTES(TRUE, TRUE, TRUE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE) -}; - -// only used as default case for checking jump landing in field_ground_effect. -bool8 MetatileBehavior_IsATile(u8 var) -{ - return TRUE; -} - -bool8 MetatileBehavior_IsEncounterTile(u8 var) -{ - if ((sTileBitAttributes[var] & 1) != 0) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsJumpEast(u8 var) -{ - if (var == MB_JUMP_EAST) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsJumpWest(u8 var) -{ - if (var == MB_JUMP_WEST) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsJumpNorth(u8 var) -{ - if (var == MB_JUMP_NORTH) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsJumpSouth(u8 var) -{ - if (var == MB_JUMP_SOUTH) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPokeGrass(u8 var) -{ - if (var == MB_TALL_GRASS || var == MB_LONG_GRASS) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSandOrDeepSand(u8 var) -{ - if (var == MB_SAND || var == MB_DEEP_SAND) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsDeepSand(u8 var) -{ - if (var == MB_DEEP_SAND) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsReflective(u8 var) -{ - if (var == MB_POND_WATER || var == MB_PUDDLE || var == MB_1A || var == MB_ICE || var == MB_SOOTOPOLIS_DEEP_WATER || var == MB_REFLECTION_UNDER_BRIDGE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsIce(u8 var) -{ - if (var == MB_ICE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWarpDoor(u8 var) -{ - if (var == MB_ANIMATED_DOOR) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsDoor(u8 var) -{ - if (var == MB_8D || var == MB_ANIMATED_DOOR) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsEscalator(u8 var) -{ - if (var == MB_UP_ESCALATOR || var == MB_DOWN_ESCALATOR) - return TRUE; - else - return FALSE; -} - -bool8 unref_sub_8056EE0(u8 var) -{ - if (var == MB_04) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsLadder(u8 var) -{ - if (var == MB_LADDER) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsNonAnimDoor(u8 var) -{ - if (var == MB_NON_ANIMATED_DOOR || var == MB_WATER_DOOR || var == MB_DEEP_SOUTH_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsDeepSouthWarp(u8 var) -{ - if (var == MB_DEEP_SOUTH_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSurfableWaterOrUnderwater(u8 var) -{ - if ((sTileBitAttributes[var] & 2) != 0) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsEastArrowWarp(u8 var) -{ - if (var == MB_EAST_ARROW_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWestArrowWarp(u8 var) -{ - if (var == MB_WEST_ARROW_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsNorthArrowWarp(u8 var) -{ - if (var == MB_NORTH_ARROW_WARP || var == MB_STAIRS_OUTSIDE_ABANDONED_SHIP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSouthArrowWarp(u8 var) -{ - if (var == MB_SOUTH_ARROW_WARP || var == MB_WATER_SOUTH_ARROW_WARP || var == MB_SHOAL_CAVE_ENTRANCE) - return TRUE; - else - return FALSE; -} - -// unused -bool8 MetatileBehavior_IsArrowWarp(u8 var) -{ - u8 var2 = 0; - - if (MetatileBehavior_IsEastArrowWarp(var) - || MetatileBehavior_IsWestArrowWarp(var) - || MetatileBehavior_IsNorthArrowWarp(var) - || MetatileBehavior_IsSouthArrowWarp(var)) - { - var2 = 1; - } - return var2; -} - -bool8 MetatileBehavior_IsMoveTile(u8 var) -{ - if ((var >= MB_WALK_EAST && var <= MB_TRICK_HOUSE_PUZZLE_8_FLOOR) || (var >= MB_EASTWARD_CURRENT && var <= MB_SOUTHWARD_CURRENT) - || var == MB_MUDDY_SLOPE || var == MB_CRACKED_FLOOR || var == MB_WATERFALL || var == MB_ICE || var == MB_BB || var == MB_BC) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsIce_2(u8 var) -{ - if (var == MB_ICE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsTrickHouseSlipperyFloor(u8 var) -{ - if (var == MB_TRICK_HOUSE_PUZZLE_8_FLOOR) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_0x05(u8 var) -{ - if (var == MB_05) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWalkNorth(u8 var) -{ - if (var == MB_WALK_NORTH) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWalkSouth(u8 var) -{ - if (var == MB_WALK_SOUTH) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWalkWest(u8 var) -{ - if (var == MB_WALK_WEST) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWalkEast(u8 var) -{ - if (var == MB_WALK_EAST) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsNorthwardCurrent(u8 var) -{ - if (var == MB_NORTHWARD_CURRENT) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSouthwardCurrent(u8 var) -{ - if (var == MB_SOUTHWARD_CURRENT) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWestwardCurrent(u8 var) -{ - if (var == MB_WESTWARD_CURRENT) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsEastwardCurrent(u8 var) -{ - if (var == MB_EASTWARD_CURRENT) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSlideNorth(u8 var) -{ - if (var == MB_SLIDE_NORTH) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSlideSouth(u8 var) -{ - if (var == MB_SLIDE_SOUTH) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSlideWest(u8 var) -{ - if (var == MB_SLIDE_WEST) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSlideEast(u8 var) -{ - if (var == MB_SLIDE_EAST) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsCounter(u8 var) -{ - if (var == MB_COUNTER) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPlayerFacingTVScreen(u8 tile, u8 playerDir) -{ - if (playerDir != CONNECTION_NORTH) // if the player isn't facing north, forget about it. - return FALSE; - else if (tile == MB_TELEVISION) // is the player's north tile a TV? - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPC(u8 var) -{ - if (var == MB_PC) - return TRUE; - else - return FALSE; -} - -bool8 is_tile_x84(u8 var) -{ - if (var == MB_84) - return TRUE; - else - return FALSE; -} - -bool8 sub_80571C0(u8 var) -{ - if (var == MB_91 || var == MB_93 || var == MB_95 || var == MB_97 - || var == MB_99 || var == MB_9B || var == MB_9D) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSecretBaseCave(u8 var) -{ - if (var == MB_SECRET_BASE_SPOT_RED_CAVE || var == MB_SECRET_BASE_SPOT_BROWN_CAVE || var == MB_SECRET_BASE_SPOT_YELLOW_CAVE || var == MB_SECRET_BASE_SPOT_BLUE_CAVE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSecretBaseTree(u8 var) -{ - if (var == MB_SECRET_BASE_SPOT_TREE_1 || var == MB_SECRET_BASE_SPOT_TREE_2) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSecretBaseShrub(u8 var) -{ - if (var == MB_SECRET_BASE_SPOT_SHRUB) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSecretBasePC(u8 var) -{ - if (var == MB_SECRET_BASE_PC) - return TRUE; - else - return FALSE; -} - -bool8 sub_805724C(u8 var) -{ - if (var == MB_B1) - return TRUE; - else - return FALSE; -} - -bool8 unref_sub_8057260(u8 var) -{ - if (var == MB_B2) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057274(u8 var) -{ - if (var == MB_B3) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057288(u8 var) -{ - if (var == MB_B9) - return TRUE; - else - return FALSE; -} - -bool8 sub_805729C(u8 var) -{ - if (var == MB_NORMAL) - return TRUE; - else - return FALSE; -} - -bool8 sub_80572B0(u8 var) -{ - if (var == MB_B7) - return TRUE; - else - return FALSE; -} - -bool8 unref_sub_80572C4(u8 var) -{ - if (var == MB_B2) - return TRUE; - else - return FALSE; -} - -bool8 sub_80572D8(u8 var) -{ - if (var == MB_B5) - return TRUE; - else - return FALSE; -} - -bool8 sub_80572EC(u8 var) -{ - if (var == MB_C3) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057300(u8 var) -{ - if (var == MB_C2) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057314(u8 var) -{ - if (var == MB_B8) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057328(u8 var) -{ - if (var == MB_BE) - return TRUE; - else - return FALSE; -} - -bool8 sub_805733C(u8 var) -{ - if (var == MB_BD) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057350(u8 var) -{ - if (var == MB_BA) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057364(u8 var) -{ - if (var == MB_BF) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057378(u8 var) -{ - if (var == MB_C4) - return TRUE; - else - return FALSE; -} - -bool8 sub_805738C(u8 var) -{ - if (var == MB_C5) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_HasRipples(u8 var) -{ - if (var == MB_POND_WATER || var == MB_PUDDLE || var == MB_SOOTOPOLIS_DEEP_WATER) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPuddle(u8 var) -{ - if (var == MB_PUDDLE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsTallGrass(u8 var) -{ - if (var == MB_TALL_GRASS) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsLongGrass(u8 var) -{ - if (var == MB_LONG_GRASS) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsBerryTreeSoil(u8 var) -{ - if (var == MB_BERRY_TREE_SOIL) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsAshGrass(u8 var) -{ - if (var == MB_ASHGRASS) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsUnusedFootprintMetatile(u8 var) -{ - if (var == MB_25) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsBridge(u8 var) -{ - if (var >= MB_WARP_OR_BRIDGE && var <= MB_ROUTE120_NORTH_BRIDGE_2) - return TRUE; - else - return FALSE; -} - -u8 sub_8057450(u8 var) -{ - u8 result = var - MB_WARP_OR_BRIDGE; - - if (result > 3) - result = 0; - - return result; -} - -bool8 MetatileBehavior_IsLandWildEncounter(u8 var) -{ - if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) == FALSE && MetatileBehavior_IsEncounterTile(var) == TRUE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWaterWildEncounter(u8 var) -{ - if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) == TRUE && MetatileBehavior_IsEncounterTile(var) == TRUE) - return TRUE; - else - return FALSE; -} - -bool8 sub_80574C4(u8 var) -{ - if (var == MB_0B) - return TRUE; - else - return FALSE; -} - -bool8 sub_80574D8(u8 var) -{ - if (var == MB_MOUNTAIN_TOP) - return TRUE; - else - return FALSE; -} - -bool8 sub_80574EC(u8 var) -{ - if (var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER || var == MB_SOOTOPOLIS_DEEP_WATER) - return TRUE; - else - return FALSE; -} - -bool8 sub_805750C(u8 var) -{ - if (var == MB_NO_SURFACING || var == MB_SEAWEED_NO_SURFACING) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsShallowFlowingWater(u8 var) -{ - if (var == MB_SHALLOW_WATER || var == MB_STAIRS_OUTSIDE_ABANDONED_SHIP || var == MB_SHOAL_CAVE_ENTRANCE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsThinIce(u8 var) -{ - if (var == MB_THIN_ICE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsCrackedIce(u8 var) -{ - if (var == MB_CRACKED_ICE) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057568(u8 var) -{ - if (var == MB_OCEAN_WATER || var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER) - return TRUE; - else - return FALSE; -} - -bool8 unref_sub_8057584(u8 var) -{ - if (var == MB_18 || var == MB_1A) - return TRUE; - else - return FALSE; -} - -bool8 sub_805759C(u8 var) -{ - if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) && MetatileBehavior_IsWaterfall(var) == FALSE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsEastBlocked(u8 var) -{ - if (var == MB_IMPASSABLE_EAST || var == MB_IMPASSABLE_NORTHEAST || var == MB_IMPASSABLE_SOUTHEAST || var == MB_C1 || var == MB_BE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWestBlocked(u8 var) -{ - if (var == MB_IMPASSABLE_WEST || var == MB_IMPASSABLE_NORTHWEST || var == MB_IMPASSABLE_SOUTHWEST || var == MB_C1 || var == MB_BE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsNorthBlocked(u8 var) -{ - if (var == MB_IMPASSABLE_NORTH || var == MB_IMPASSABLE_NORTHEAST || var == MB_IMPASSABLE_NORTHWEST || var == MB_BED) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSouthBlocked(u8 var) -{ - if (var == MB_IMPASSABLE_SOUTH || var == MB_IMPASSABLE_SOUTHEAST || var == MB_IMPASSABLE_SOUTHWEST || var == MB_BED) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsShortGrass(u8 var) -{ - if (var == MB_SHORT_GRASS) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsHotSprings(u8 var) -{ - if (var == MB_HOT_SPRINGS) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWaterfall(u8 var) -{ - if (var == MB_WATERFALL) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsFortreeBridge(u8 var) -{ - if (var == MB_FORTREE_BRIDGE) - return TRUE; - else - return FALSE; -} - -bool8 sub_80576A0(u8 var) -{ - if (var == MB_PACIFIDLOG_VERTICAL_LOG_1) - return TRUE; - else - return FALSE; -} - -bool8 sub_80576B4(u8 var) -{ - if (var == MB_PACIFIDLOG_VERTICAL_LOG_2) - return TRUE; - else - return FALSE; -} - -bool8 sub_80576C8(u8 var) -{ - if (var == MB_PACIFIDLOG_HORIZONTAL_LOG_1) - return TRUE; - else - return FALSE; -} - -bool8 sub_80576DC(u8 var) -{ - if (var == MB_PACIFIDLOG_HORIZONTAL_LOG_2) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPacifidlogLog(u8 var) -{ - if (var >= MB_PACIFIDLOG_VERTICAL_LOG_1 && var <= MB_PACIFIDLOG_HORIZONTAL_LOG_2) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsTrickHousePuzzleDoor(u8 var) -{ - if (var == MB_TRICK_HOUSE_PUZZLE_DOOR) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsRegionMap(u8 var) -{ - if (var == MB_REGION_MAP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsClosedSootopolisGymDoor(u8 var) -{ - if (var == MB_CLOSED_SOOTOPOLIS_GYM_DOOR) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsRoulette(u8 var) -{ - if (var == MB_ROULETTE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPokeblockFeeder(u8 var) -{ - if (var == MB_POKEBLOCK_FEEDER) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_0xBB(u8 var) -{ - if (var == MB_BB) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_0xBC(u8 var) -{ - if (var == MB_BC) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8 var) -{ - if (var == MB_LAVARIDGE_GYM_B1F_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsLavaridge1FWarp(u8 var) -{ - if (var == MB_LAVARIDGE_GYM_1F_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsAquaHideoutWarp(u8 var) -{ - if (var == MB_AQUA_HIDEOUT_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSurfableFishableWater(u8 var) -{ - if (var == MB_POND_WATER || var == MB_OCEAN_WATER || var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER || var == MB_SOOTOPOLIS_DEEP_WATER || (var >= MB_EASTWARD_CURRENT && var <= MB_SOUTHWARD_CURRENT)) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsMtPyreHole(u8 var) -{ - if (var == MB_MT_PYRE_HOLE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsCrackedFloorHole(u8 var) -{ - if (var == MB_CRACKED_FLOOR_HOLE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsCrackedFloor(u8 var) -{ - if (var == MB_CRACKED_FLOOR) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsMuddySlope(u8 var) -{ - if (var == MB_MUDDY_SLOPE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsBumpySlope(u8 var) -{ - if (var == MB_BUMPY_SLOPE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsIsolatedVerticalRail(u8 var) -{ - if (var == MB_ISOLATED_VERTICAL_RAIL) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsIsolatedHorizontalRail(u8 var) -{ - if (var == MB_ISOLATED_HORIZONTAL_RAIL) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsVerticalRail(u8 var) -{ - if (var == MB_VERTICAL_RAIL) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsHorizontalRail(u8 var) -{ - if (var == MB_HORIZONTAL_RAIL) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSeaweed(u8 var) -{ - if (var == MB_SEAWEED || var == MB_SEAWEED_NO_SURFACING) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsRunningDisallowed(u8 var) -{ - if (var == MB_NO_RUNNING || var == MB_LONG_GRASS || var == MB_HOT_SPRINGS || MetatileBehavior_IsPacifidlogLog(var) != FALSE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsCuttableGrass(u8 var) -{ - if (var == MB_TALL_GRASS || var == MB_LONG_GRASS || var == MB_ASHGRASS || var == MB_LONG_GRASS_SOUTH_EDGE) - return TRUE; - else - return FALSE; -} - -bool8 sub_805791C(u8 var) -{ - if (var == MB_8E) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPictureBookShelf(u8 var) -{ - if (var == MB_PICTURE_BOOK_SHELF) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsBookShelf(u8 var) -{ - if (var == MB_BOOKSHELF) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPokeCenterBookShelf(u8 var) -{ - if (var == MB_POKEMON_CENTER_BOOKSHELF) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsVase(u8 var) -{ - if (var == MB_VASE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsTrashCan(u8 var) -{ - if (var == MB_TRASH_CAN) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsShopShelf(u8 var) -{ - if (var == MB_SHOP_SHELF) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsBlueprint(u8 var) -{ - if (var == MB_BLUEPRINT) - return TRUE; - else - return FALSE; -} diff --git a/src/misc/de_rom_8040FE0.c b/src/misc/de_rom_8040FE0.c new file mode 100644 index 000000000..c618ebdb2 --- /dev/null +++ b/src/misc/de_rom_8040FE0.c @@ -0,0 +1,272 @@ +#include "global.h" +#include "battle.h" + +#if GERMAN + +enum { + TRAINER_CLASS_NAME_LEADER = 25, + TRAINER_CLASS_NAME_SCHOOL_KID = 26, + TRAINER_CLASS_NAME_EXPERT = 30, + TRAINER_CLASS_NAME_POKEMON_TRAINER_3 = 46, +}; + +enum { + TRAINER_CLASS_LEADER_F = 26, + TRAINER_CLASS_ELITE_FOUR_F = 25, + TRAINER_CLASS_SCHOOL_KID_F = 30, + TRAINER_CLASS_BIRD_KEEPER = 46, + TRAINER_CLASS_MAY_1 = 61, + TRAINER_CLASS_MAY_2 = 62, + TRAINER_CLASS_MAY_3 = 63, +}; + +extern struct SecretBaseRecord gSecretBaseRecord; + +extern u8 gTrainerClassNames[][13]; +extern struct Trainer gTrainers[]; + +u8 *de_sub_8040FE0(u8 gender) { + if (gender) + { + gender++; + + } + + gender = TRAINER_CLASS_NAME_SCHOOL_KID; + return gTrainerClassNames[gender]; +} + +u8 *de_sub_8040FF4(u8 gender) { + if (gender) { + gender++; + } + + gender = TRAINER_CLASS_NAME_POKEMON_TRAINER_3; + return gTrainerClassNames[gender]; +} + +u8 *de_sub_804100C(u8 gender) { + if (gender) { + gender++; + } + + gender = TRAINER_CLASS_NAME_LEADER; + return gTrainerClassNames[gender]; +} + +#ifdef NONMATCHING + +u8 de_sub_81364AC(void); +u8 get_trainer_class_name_index(void); +u8 de_sub_81364F8(void); +u8 sub_8135FD8(void); + +u8 *de_sub_8041024(s32 arg0, u32 arg1) { + u8 nameIndex, trainerClass, gender; + struct Trainer *trainer; + u8 local2; + + switch (arg0) + { + case 0x400: + nameIndex = GetSecretBaseTrainerNameIndex(); + gender = gSecretBaseRecord.gender; + if (nameIndex == TRAINER_CLASS_NAME_SCHOOL_KID) + { + return de_sub_8040FE0(gender); + } + + return gTrainerClassNames[nameIndex]; + + case 0x100: + trainerClass = de_sub_81364AC(); + nameIndex = get_trainer_class_name_index(); + if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) + { + return de_sub_8040FE0(FEMALE); + } + if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) + { + return de_sub_8040FF4(FEMALE); + } + + return gTrainerClassNames[nameIndex]; + + case 0x800: + trainerClass = de_sub_81364F8(); + nameIndex = sub_8135FD8(); + if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) + { + return de_sub_8040FE0(FEMALE); + } + if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) + { + return de_sub_8040FF4(FEMALE); + } + + return gTrainerClassNames[nameIndex]; + + default: + trainer = &gTrainers[arg1]; + trainerClass = trainer->trainerClass; + local2 = sub_803FC58(arg1); + + if (trainerClass == TRAINER_CLASS_LEADER_F) + { + return de_sub_8040FE0(local2); + } + + if (trainerClass == TRAINER_CLASS_BIRD_KEEPER && local2 == FEMALE) + { + return de_sub_8040FF4(FEMALE); + } + + if (trainerClass == TRAINER_CLASS_ELITE_FOUR_F) + { + if (gTrainers[arg1].doubleBattle == TRUE) + { + return de_sub_804100C(FEMALE); + } + else + { + return de_sub_804100C(MALE); + } + } + + + return gTrainerClassNames[trainerClass]; + } +} +#else + +__attribute__((naked)) +void de_sub_8041024(void) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + adds r2, r0, 0\n\ + adds r6, r1, 0\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + cmp r2, r0\n\ + beq _0804104A\n\ + cmp r2, r0\n\ + bgt _08041040\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + cmp r2, r0\n\ + beq _08041064\n\ + b _0804109C\n\ +_08041040:\n\ + movs r0, 0x80\n\ + lsls r0, 4\n\ + cmp r2, r0\n\ + beq _08041086\n\ + b _0804109C\n\ +_0804104A:\n\ + bl GetSecretBaseTrainerNameIndex\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + ldr r0, _08041060 @ =0x02017000\n\ + ldrb r0, [r0, 0x1]\n\ + lsls r0, 27\n\ + lsrs r2, r0, 31\n\ + cmp r5, 0x1A\n\ + beq _080410B8\n\ + b _080410F8\n\ + .align 2, 0\n\ +_08041060: .4byte 0x02017000\n\ +_08041064:\n\ + bl de_sub_81364AC\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + bl get_trainer_class_name_index\n\ +_08041070:\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r4, 0x1E\n\ + beq _08041094\n\ + adds r0, r4, 0\n\ + subs r0, 0x3D\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x2\n\ + bls _080410CC\n\ + b _080410F8\n\ +_08041086:\n\ + bl de_sub_81364F8\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + bl sub_8135FD8\n\ + b _08041070\n\ +_08041094:\n\ + movs r0, 0x1\n\ + bl de_sub_8040FE0\n\ + b _08041102\n\ +_0804109C:\n\ + ldr r1, _080410C0 @ =gTrainers\n\ + lsls r4, r6, 2\n\ + adds r0, r4, r6\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldrb r5, [r0, 0x1]\n\ + lsls r0, r6, 16\n\ + lsrs r0, 16\n\ + bl sub_803FC58\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r5, 0x1A\n\ + bne _080410C4\n\ +_080410B8:\n\ + adds r0, r2, 0\n\ + bl de_sub_8040FE0\n\ + b _08041102\n\ + .align 2, 0\n\ +_080410C0: .4byte gTrainers\n\ +_080410C4:\n\ + cmp r5, 0x2E\n\ + bne _080410D4\n\ + cmp r2, 0x1\n\ + bne _080410D4\n\ +_080410CC:\n\ + movs r0, 0x1\n\ + bl de_sub_8040FF4\n\ + b _08041102\n\ +_080410D4:\n\ + cmp r5, 0x19\n\ + bne _080410F8\n\ + ldr r0, _080410F4 @ =gTrainers\n\ + adds r1, r4, r6\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x18]\n\ + movs r2, 0\n\ + cmp r0, 0x1\n\ + bne _080410EA\n\ + movs r2, 0x1\n\ +_080410EA:\n\ + adds r0, r2, 0\n\ + bl de_sub_804100C\n\ + b _08041102\n\ + .align 2, 0\n\ +_080410F4: .4byte gTrainers\n\ +_080410F8:\n\ + movs r0, 0xD\n\ + adds r1, r5, 0\n\ + muls r1, r0\n\ + ldr r0, _08041108 @ =gTrainerClassNames\n\ + adds r0, r1, r0\n\ +_08041102:\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08041108: .4byte gTrainerClassNames\n\ + .syntax divided\n"); +} +#endif + +u32 de_sub_804110C(u32 arg0, u32 arg1) { + return arg1; +} + +#endif diff --git a/src/misc/rom3.c b/src/misc/rom3.c new file mode 100644 index 000000000..803bbf943 --- /dev/null +++ b/src/misc/rom3.c @@ -0,0 +1,1393 @@ +#include "global.h" +#include "battle.h" +#include "battle_811DA74.h" +#include "battle_ai.h" +#include "battle_anim.h" +#include "battle_anim_81258BC.h" +#include "battle_anim_8137220.h" +#include "cable_club.h" +#include "items.h" +#include "link.h" +#include "pokemon.h" +#include "rom3.h" +#include "rom_8094928.h" +#include "species.h" +#include "task.h" +#include "util.h" + +extern u8 unk_2000000[]; + +#define EWRAM_14000 ((u8 *)(unk_2000000 + 0x14000)) +#define EWRAM_15000 ((u8 *)(unk_2000000 + 0x15000)) + +extern u16 gBattleTypeFlags; +extern u16 gBattleWeather; +extern struct BattlePokemon gBattleMons[]; + +static EWRAM_DATA u8 gUnknown_020238C4 = 0; +static EWRAM_DATA u8 gUnknown_020238C5 = 0; +static EWRAM_DATA u8 gUnknown_020238C6 = 0; + +extern u32 gUnknown_020239FC; +extern u8 gBattleBufferA[][0x200]; +extern u8 gBattleBufferB[][0x200]; +extern u8 gActiveBank; +extern u32 gBattleExecBuffer; +extern u8 gNoOfAllBanks; +extern u16 gBattlePartyID[]; +extern u8 gBanksBySide[]; +extern u16 gCurrentMove; +extern u16 gUnknown_02024BE8; +extern u16 gLastUsedItem; +extern u8 gLastUsedAbility; +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u8 gEffectBank; +extern u8 gStringBank; +extern u8 gAbsentBankFlags; +extern u8 gMultiHitCounter; +extern u8 gUnknown_02024C78; +extern u8 gBattleOutcome; +extern u8 gActionSelectionCursor[]; +extern u8 gMoveSelectionCursor[]; +extern u8 gBattleTextBuff1[]; +extern u8 gBattleTextBuff2[]; +extern u8 gBattleTextBuff3[]; +extern void (*gBattleMainFunc)(void); +extern void (*gBattleBankFunc[])(void); + +u8 gBattleBuffersTransferData[0x170]; + +void sub_800B858(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + OpenLink(); + CreateTask(sub_8083C50, 0); + sub_800BF28(); + } +} + +void setup_poochyena_battle(void) +{ + s32 i; + + gBattleMainFunc = nullsub_41; + for (i = 0; i < 4; i++) + { + gBattleBankFunc[i] = nullsub_91; + gBanksBySide[i] = 0xFF; + gActionSelectionCursor[i] = 0; + gMoveSelectionCursor[i] = 0; + } + sub_800B858(); + gBattleExecBuffer = 0; + battle_anim_clear_some_data(); + ClearBattleMonForms(); + BattleAI_HandleItemUseBeforeAISetup(); + if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) + { + ZeroEnemyPartyMons(); + CreateMon(&gEnemyParty[0], SPECIES_POOCHYENA, 2, 32, 0, 0, 0, 0); + i = ITEM_NONE; + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&i); + } + gUnknown_020239FC = 0; + gUnknown_02024C78 = 0; +} + +void sub_800B950(void) +{ + s32 i; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + sub_800BA78(); + else + sub_800B9A8(); + sub_800BD54(); + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + for (i = 0; i < gNoOfAllBanks; i++) + sub_8094978(i, 0); + } +} + +void sub_800B9A8(void) +{ + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + gBattleMainFunc = sub_8010800; + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + gBattleBankFunc[0] = SetBankFuncToSafariBufferRunCommand; + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) + gBattleBankFunc[0] = SetBankFuncToWallyBufferRunCommand; + else + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[0] = 0; + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksBySide[1] = 1; + gNoOfAllBanks = 2; + } + else + { + gBattleMainFunc = sub_8010800; + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[0] = 0; + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksBySide[1] = 1; + gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[2] = 2; + gBattleBankFunc[3] = SetBankFuncToOpponentBufferRunCommand; + gBanksBySide[3] = 3; + gNoOfAllBanks = 4; + } +} + +void sub_800BA78(void) +{ + u8 multiplayerId; + int i; + + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + { + gBattleMainFunc = sub_8010800; + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[0] = 0; + gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[1] = 1; + gNoOfAllBanks = 2; + } + else + { + gBattleBankFunc[1] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[1] = 0; + gBattleBankFunc[0] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[0] = 1; + gNoOfAllBanks = 2; + } + return; + } + if ((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_DOUBLE)) == BATTLE_TYPE_DOUBLE) + { + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + { + gBattleMainFunc = sub_8010800; + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[0] = 0; + gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[1] = 1; + gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[2] = 2; + gBattleBankFunc[3] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[3] = 3; + gNoOfAllBanks = 4; + } + else + { + gBattleBankFunc[1] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[1] = 0; + gBattleBankFunc[0] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[0] = 1; + gBattleBankFunc[3] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[3] = 2; + gBattleBankFunc[2] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[2] = 3; + gNoOfAllBanks = 4; + + } + return; + } + multiplayerId = GetMultiplayerId(); + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + gBattleMainFunc = sub_8010800; + for (i = 0; i < 4; i++) + { + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + sub_8094978(gLinkPlayers[i].lp_field_18, 0); + break; + case 1: + case 2: + sub_8094978(gLinkPlayers[i].lp_field_18, 1); + break; + } + + if (i == multiplayerId) + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToPlayerBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 0; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 2; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + else + { + if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[multiplayerId].lp_field_18 & 1)) + || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[multiplayerId].lp_field_18 & 1))) + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToLinkPartnerBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 0; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 2; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + else + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToLinkOpponentBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 1; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 3; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + } + } + gNoOfAllBanks = 4; +} + +void sub_800BD54(void) +{ + int i; + int j; + + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + for (i = 0; i < gNoOfAllBanks; i++) + { + for (j = 0; j < 6; j++) + { + if (i < 2) + { + if (!(gBanksBySide[i] & 1)) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0) + { + gBattlePartyID[i] = j; + break; + } + } + else + { + if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0) + { + gBattlePartyID[i] = j; + break; + } + } + } + else + { + if (!(gBanksBySide[i] & 1)) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != 0 //Probably a typo by Game Freak. The rest use SPECIES2 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0 + && gBattlePartyID[i - 2] != j) + { + gBattlePartyID[i] = j; + break; + } + } + else + { + if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0 + && gBattlePartyID[i - 2] != j) + { + gBattlePartyID[i] = j; + break; + } + } + } + } + } + } +} + +void dp01_prepare_buffer(u8 a, u8 *b, u16 c) +{ + int i; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + dp01_prepare_buffer_wireless_probably(a, c, b); + } + else + { + switch (a) + { + case 0: + for (i = 0; i < c; i++) + { + gBattleBufferA[gActiveBank][i] = *b; + b++; + } + break; + case 1: + for (i = 0; i < c; i++) + { + gBattleBufferB[gActiveBank][i] = *b; + b++; + } + break; + } + } +} + +void sub_800BF28(void) +{ + gUnknown_020238C4 = CreateTask(sub_800C1A8, 0); + gTasks[gUnknown_020238C4].data[11] = 0; + gTasks[gUnknown_020238C4].data[12] = 0; + gTasks[gUnknown_020238C4].data[13] = 0; + gTasks[gUnknown_020238C4].data[14] = 0; + gTasks[gUnknown_020238C4].data[15] = 0; + gUnknown_020238C5 = CreateTask(sub_800C47C, 0); + gTasks[gUnknown_020238C5].data[12] = 0; + gTasks[gUnknown_020238C5].data[13] = 0; + gTasks[gUnknown_020238C5].data[14] = 0; + gTasks[gUnknown_020238C5].data[15] = 0; + gUnknown_020238C6 = 0; + CpuFill16(0, EWRAM_14000, 0x2000); +} + +void dp01_prepare_buffer_wireless_probably(u8 a, u16 b, u8 *c) +{ + s32 r9; + int i; + + r9 = b - b % 4 + 4; + if (gTasks[gUnknown_020238C4].data[14] + r9 + 9 > 0x1000) + { + gTasks[gUnknown_020238C4].data[12] = gTasks[gUnknown_020238C4].data[14]; + gTasks[gUnknown_020238C4].data[14] = 0; + } + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14000] = a; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14001] = gActiveBank; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14002] = gBankAttacker; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14003] = gBankTarget; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14004] = r9; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14005] = (r9 & 0x0000FF00) >> 8; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14006] = gAbsentBankFlags; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14007] = gEffectBank; + for (i = 0; i < b; i++) + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14008 + i] = c[i]; + gTasks[gUnknown_020238C4].data[14] = gTasks[gUnknown_020238C4].data[14] + r9 + 8; +} + +void sub_800C1A8(u8 taskId) +{ + u16 var; + + switch (gTasks[taskId].data[11]) + { + case 0: + gTasks[taskId].data[10] = 100; + gTasks[taskId].data[11]++; + break; + case 1: + gTasks[taskId].data[10]--; + if (gTasks[taskId].data[10] == 0) + gTasks[taskId].data[11]++; + break; + case 2: + GetLinkPlayerCount_2(); + if (IsLinkMaster()) + { + sub_8007F4C(); + gTasks[taskId].data[11]++; + break; + } + gTasks[taskId].data[11]++; + break; + case 3: + if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) + { + if (gTasks[taskId].data[13] == 0) + { + if (gTasks[taskId].data[15] > gTasks[taskId].data[14] + && gTasks[taskId].data[15] == gTasks[taskId].data[12]) + { + gTasks[taskId].data[12] = 0; + gTasks[taskId].data[15] = 0; + } + var = (unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8)) + 8; + SendBlock(bitmask_all_link_players_but_self(), &unk_2000000[gTasks[taskId].data[15] + 0x14000], var); + gTasks[taskId].data[11]++; + } + else + { + gTasks[taskId].data[13]--; + break; + } + } + break; + case 4: + if (sub_8007ECC()) + { + var = unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8); + gTasks[taskId].data[13] = 1; + gTasks[taskId].data[15] = gTasks[taskId].data[15] + var + 8; + gTasks[taskId].data[11] = 3; + } + break; + case 5: + gTasks[taskId].data[13]--; + if (gTasks[taskId].data[13] == 0) + { + gTasks[taskId].data[13] = 1; + gTasks[taskId].data[11] = 3; + } + break; + } +} + +//fix me +void sub_800C35C(void) +{ + u8 i; //r4 + s32 j; //r2 + u16 r6; //r6 + u8 *recvBuffer; //r3 + u8 *dest; //r5 + u8 *src; //r4 + + if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & 0x20) && gLinkPlayers[0].linkType == 0x2211) + { + for (i = 0; i < GetLinkPlayerCount(); i++) + { + if (GetBlockReceivedStatus() & gBitTable[i]) + { + ResetBlockReceivedFlag(i); + recvBuffer = (u8 *)&gBlockRecvBuffer[i]; +#ifndef NONMATCHING + asm(""); + recvBuffer = (u8 *)&gBlockRecvBuffer[i]; +#endif + r6 = gBlockRecvBuffer[i][2]; + if (gTasks[gUnknown_020238C5].data[14] + 9 + r6 > 0x1000) + { + gTasks[gUnknown_020238C5].data[12] = gTasks[gUnknown_020238C5].data[14]; + gTasks[gUnknown_020238C5].data[14] = 0; + } + //_0800C402 + dest = EWRAM_15000 + gTasks[gUnknown_020238C5].data[14]; + src = recvBuffer; + for (j = 0; j < r6 + 8; j++) + dest[j] = src[j]; + gTasks[gUnknown_020238C5].data[14] = gTasks[gUnknown_020238C5].data[14] + r6 + 8; + } + //_0800C446 + } + } +} + +void sub_800C47C(u8 taskId) +{ + u16 r7; + u8 r4; + u8 r2; + + if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) + { + if (gTasks[taskId].data[15] > gTasks[taskId].data[14] + && gTasks[taskId].data[15] == gTasks[taskId].data[12]) + { + gTasks[taskId].data[12] = 0; + gTasks[taskId].data[15] = 0; + } + r4 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 1]; + r7 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 4] | (unk_2000000[0x15000 + gTasks[taskId].data[15] + 5] << 8); + switch (unk_2000000[0x15000 + gTasks[taskId].data[15] + 0]) + { + case 0: + if (gBattleExecBuffer & gBitTable[r4]) + return; + memcpy(gBattleBufferA[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7); + sub_80155A4(r4); + if (!(gBattleTypeFlags & BATTLE_TYPE_WILD)) + { + gBankAttacker = unk_2000000[0x15000 + gTasks[taskId].data[15] + 2]; + gBankTarget = unk_2000000[0x15000 + gTasks[taskId].data[15] + 3]; + gAbsentBankFlags = unk_2000000[0x15000 + gTasks[taskId].data[15] + 6]; + gEffectBank = unk_2000000[0x15000 + gTasks[taskId].data[15] + 7]; + } + break; + case 1: + memcpy(gBattleBufferB[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7); + break; + case 2: + r2 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 8]; + gBattleExecBuffer &= ~(gBitTable[r4] << (r2 * 4)); + break; + } + gTasks[taskId].data[15] = gTasks[taskId].data[15] + r7 + 8; + } +} + +void EmitGetAttributes(u8 a, u8 b, u8 c) +{ + gBattleBuffersTransferData[0] = 0; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = 0; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void dp01_build_cmdbuf_x01_a_b_0(u8 a, u8 b, u8 c) +{ + gBattleBuffersTransferData[0] = 1; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = 0; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitSetAttributes(u8 a, u8 b, u8 c, u8 d, void *e) +{ + int i; + + gBattleBuffersTransferData[0] = 2; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + for (i = 0; i < d; i++) + gBattleBuffersTransferData[3 + i] = *(u8*)(e++); + dp01_prepare_buffer(a, gBattleBuffersTransferData, d + 3); +} + +void unref_sub_800C6A4(u8 a, u8 b, u8 c, u8 *d) +{ + int i; + + gBattleBuffersTransferData[0] = 3; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + for (i = 0; i < c; i++) + gBattleBuffersTransferData[3 + i] = *(d++); + dp01_prepare_buffer(a, gBattleBuffersTransferData, c + 3); +} + +void dp01_build_cmdbuf_x04_4_4_4(u8 a) +{ + gBattleBuffersTransferData[0] = 4; + gBattleBuffersTransferData[1] = 4; + gBattleBuffersTransferData[2] = 4; + gBattleBuffersTransferData[3] = 4; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitSwitchInAnim(u8 a, u8 b, u8 c) +{ + gBattleBuffersTransferData[0] = 5; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = 5; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitReturnPokeToBall(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 6; + gBattleBuffersTransferData[1] = b; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); +} + +void dp01_build_cmdbuf_x07_7_7_7(u8 a) +{ + gBattleBuffersTransferData[0] = 7; + gBattleBuffersTransferData[1] = 7; + gBattleBuffersTransferData[2] = 7; + gBattleBuffersTransferData[3] = 7; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitTrainerSlide(u8 a) +{ + gBattleBuffersTransferData[0] = 8; + gBattleBuffersTransferData[1] = 8; + gBattleBuffersTransferData[2] = 8; + gBattleBuffersTransferData[3] = 8; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void dp01_build_cmdbuf_x09_9_9_9(u8 a) +{ + gBattleBuffersTransferData[0] = 9; + gBattleBuffersTransferData[1] = 9; + gBattleBuffersTransferData[2] = 9; + gBattleBuffersTransferData[3] = 9; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitFaintAnimation(u8 a) +{ + gBattleBuffersTransferData[0] = 10; + gBattleBuffersTransferData[1] = 10; + gBattleBuffersTransferData[2] = 10; + gBattleBuffersTransferData[3] = 10; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void dp01_build_cmdbuf_x0B_B_B_B(u8 a) +{ + gBattleBuffersTransferData[0] = 11; + gBattleBuffersTransferData[1] = 11; + gBattleBuffersTransferData[2] = 11; + gBattleBuffersTransferData[3] = 11; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void dp01_build_cmdbuf_x0C_C_C_C(u8 a) +{ + gBattleBuffersTransferData[0] = 12; + gBattleBuffersTransferData[1] = 12; + gBattleBuffersTransferData[2] = 12; + gBattleBuffersTransferData[3] = 12; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitBallThrowAnim(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 13; + gBattleBuffersTransferData[1] = b; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); +} + +void unref_sub_800C828(u8 a, u8 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 14; + gBattleBuffersTransferData[1] = b; + for (i = 0; i < b * 3; i++) + gBattleBuffersTransferData[2 + i] = *(c++); + dp01_prepare_buffer(a, gBattleBuffersTransferData, b * 3 + 2); +} + +void EmitMoveAnimation(u8 a, u16 b, u8 c, u16 d, s32 e, u8 f, struct DisableStruct *g) +{ + gBattleBuffersTransferData[0] = 15; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = c; + gBattleBuffersTransferData[4] = d; + gBattleBuffersTransferData[5] = (d & 0xFF00) >> 8; + gBattleBuffersTransferData[6] = e; + gBattleBuffersTransferData[7] = (e & 0x0000FF00) >> 8; + gBattleBuffersTransferData[8] = (e & 0x00FF0000) >> 16; + gBattleBuffersTransferData[9] = (e & 0xFF000000) >> 24; + gBattleBuffersTransferData[10] = f; + gBattleBuffersTransferData[11] = gMultiHitCounter; + if (AbilityBattleEffects(14, 0, 13, 0, 0) == 0 && AbilityBattleEffects(14, 0, 0x4D, 0, 0) == 0) + { + gBattleBuffersTransferData[12] = gBattleWeather; + gBattleBuffersTransferData[13] = (gBattleWeather & 0xFF00) >> 8; + } + else + { + gBattleBuffersTransferData[12] = 0; + gBattleBuffersTransferData[13] = 0; + } + gBattleBuffersTransferData[14] = 0; + gBattleBuffersTransferData[15] = 0; + memcpy(&gBattleBuffersTransferData[16], g, sizeof(*g)); + dp01_prepare_buffer(a, gBattleBuffersTransferData, 0x2C); +} + +#ifdef NONMATCHING +void EmitPrintString(u8 a, u16 b) +{ + int i; + //u16 *r12; + + gBattleBuffersTransferData[0] = 16; + gBattleBuffersTransferData[1] = gBattleOutcome; + gBattleBuffersTransferData[2] = b; + gBattleBuffersTransferData[3] = (b & 0xFF00) >> 8; + + *((u16 *)&gBattleBuffersTransferData[4]) = gCurrentMove; + *((u16 *)&gBattleBuffersTransferData[6]) = gUnknown_02024BE8; + *((u16 *)&gBattleBuffersTransferData[8]) = gLastUsedItem; + + gBattleBuffersTransferData[10] = gLastUsedAbility; + gBattleBuffersTransferData[11] = unk_2000000[0x16000 + 3]; + gBattleBuffersTransferData[12] = unk_2000000[0x16000 + 0x5E]; + gBattleBuffersTransferData[13] = unk_2000000[0x16000 + 0xC1]; + gBattleBuffersTransferData[14] = gStringBank; + gBattleBuffersTransferData[15] = gBattleMoves[gCurrentMove].type; + for (i = 0; i < 4; i++) + { + gBattleBuffersTransferData[16 + i] = gBattleMons[i].ability; + } + for (i = 0; i < 16; i++) + { + gBattleBuffersTransferData[20 + i] = gBattleTextBuff1[i]; + gBattleBuffersTransferData[36 + i] = gBattleTextBuff2[i]; + gBattleBuffersTransferData[52 + i] = gBattleTextBuff3[i]; + } + dp01_prepare_buffer(a, gBattleBuffersTransferData, 0x44); +} +#else +__attribute__((naked)) +void EmitPrintString(u8 a, u16 b) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + ldr r2, _0800CA2C @ =gBattleBuffersTransferData\n\ + movs r0, 0x10\n\ + strb r0, [r2]\n\ + ldr r0, _0800CA30 @ =gBattleOutcome\n\ + ldrb r0, [r0]\n\ + strb r0, [r2, 0x1]\n\ + strb r1, [r2, 0x2]\n\ + lsrs r1, 8\n\ + strb r1, [r2, 0x3]\n\ + adds r0, r2, 0x4\n\ + mov r12, r0\n\ + ldr r4, _0800CA34 @ =gCurrentMove\n\ + ldrh r0, [r4]\n\ + strh r0, [r2, 0x4]\n\ + ldr r0, _0800CA38 @ =gUnknown_02024BE8\n\ + ldrh r0, [r0]\n\ + mov r1, r12\n\ + strh r0, [r1, 0x2]\n\ + ldr r0, _0800CA3C @ =gLastUsedItem\n\ + ldrh r0, [r0]\n\ + strh r0, [r1, 0x4]\n\ + ldr r0, _0800CA40 @ =gLastUsedAbility\n\ + ldrb r0, [r0]\n\ + strb r0, [r1, 0x6]\n\ + ldr r1, _0800CA44 @ =0x02000000\n\ + ldr r3, _0800CA48 @ =0x00016003\n\ + adds r0, r1, r3\n\ + ldrb r0, [r0]\n\ + mov r7, r12\n\ + strb r0, [r7, 0x7]\n\ + adds r3, 0x5B\n\ + adds r0, r1, r3\n\ + ldrb r0, [r0]\n\ + strb r0, [r7, 0x8]\n\ + ldr r7, _0800CA4C @ =0x000160c1\n\ + adds r1, r7\n\ + ldrb r0, [r1]\n\ + mov r1, r12\n\ + strb r0, [r1, 0x9]\n\ + ldr r0, _0800CA50 @ =gStringBank\n\ + ldrb r0, [r0]\n\ + strb r0, [r1, 0xA]\n\ + ldr r3, _0800CA54 @ =gBattleMoves\n\ + ldrh r1, [r4]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + ldrb r0, [r0, 0x2]\n\ + mov r3, r12\n\ + strb r0, [r3, 0xB]\n\ + movs r3, 0\n\ + mov r9, r2\n\ + ldr r7, _0800CA58 @ =gBattleTextBuff3\n\ + mov r8, r7\n\ + adds r2, 0x10\n\ + ldr r0, _0800CA5C @ =gBattleMons\n\ + adds r4, r0, 0\n\ + adds r4, 0x20\n\ +_0800C9D2:\n\ + adds r1, r2, r3\n\ + ldrb r0, [r4]\n\ + strb r0, [r1]\n\ + adds r4, 0x58\n\ + adds r3, 0x1\n\ + cmp r3, 0x3\n\ + ble _0800C9D2\n\ + movs r3, 0\n\ + mov r5, r12\n\ + adds r5, 0x10\n\ + mov r4, r12\n\ + adds r4, 0x20\n\ + ldr r6, _0800CA60 @ =gBattleTextBuff2\n\ + mov r2, r12\n\ + adds r2, 0x30\n\ +_0800C9F0:\n\ + adds r1, r5, r3\n\ + ldr r7, _0800CA64 @ =gBattleTextBuff1\n\ + adds r0, r3, r7\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + adds r1, r4, r3\n\ + adds r0, r3, r6\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + adds r1, r2, r3\n\ + mov r7, r8\n\ + adds r0, r3, r7\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + adds r3, 0x1\n\ + cmp r3, 0xF\n\ + ble _0800C9F0\n\ + mov r0, r10\n\ + mov r1, r9\n\ + movs r2, 0x44\n\ + bl dp01_prepare_buffer\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0800CA2C: .4byte gBattleBuffersTransferData\n\ +_0800CA30: .4byte gBattleOutcome\n\ +_0800CA34: .4byte gCurrentMove\n\ +_0800CA38: .4byte gUnknown_02024BE8\n\ +_0800CA3C: .4byte gLastUsedItem\n\ +_0800CA40: .4byte gLastUsedAbility\n\ +_0800CA44: .4byte 0x02000000\n\ +_0800CA48: .4byte 0x00016003\n\ +_0800CA4C: .4byte 0x000160c1\n\ +_0800CA50: .4byte gStringBank\n\ +_0800CA54: .4byte gBattleMoves\n\ +_0800CA58: .4byte gBattleTextBuff3\n\ +_0800CA5C: .4byte gBattleMons\n\ +_0800CA60: .4byte gBattleTextBuff2\n\ +_0800CA64: .4byte gBattleTextBuff1\n\ + .syntax divided\n"); +} +#endif + +__attribute__((naked)) +void EmitPrintStringPlayerOnly(u8 a, u16 stringID) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + ldr r2, _0800CB28 @ =gBattleBuffersTransferData\n\ + movs r0, 0x11\n\ + strb r0, [r2]\n\ + strb r0, [r2, 0x1]\n\ + strb r1, [r2, 0x2]\n\ + lsrs r1, 8\n\ + strb r1, [r2, 0x3]\n\ + adds r0, r2, 0x4\n\ + mov r12, r0\n\ + ldr r0, _0800CB2C @ =gCurrentMove\n\ + ldrh r0, [r0]\n\ + strh r0, [r2, 0x4]\n\ + ldr r0, _0800CB30 @ =gUnknown_02024BE8\n\ + ldrh r0, [r0]\n\ + mov r1, r12\n\ + strh r0, [r1, 0x2]\n\ + ldr r0, _0800CB34 @ =gLastUsedItem\n\ + ldrh r0, [r0]\n\ + strh r0, [r1, 0x4]\n\ + ldr r0, _0800CB38 @ =gLastUsedAbility\n\ + ldrb r0, [r0]\n\ + strb r0, [r1, 0x6]\n\ + ldr r0, _0800CB3C @ =0x02000000\n\ + ldr r3, _0800CB40 @ =0x00016003\n\ + adds r1, r0, r3\n\ + ldrb r1, [r1]\n\ + mov r7, r12\n\ + strb r1, [r7, 0x7]\n\ + ldr r1, _0800CB44 @ =0x0001605e\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + strb r0, [r7, 0x8]\n\ + movs r3, 0\n\ + mov r9, r2\n\ + ldr r7, _0800CB48 @ =gBattleTextBuff3\n\ + mov r8, r7\n\ + mov r4, r9\n\ + adds r4, 0x10\n\ + ldr r0, _0800CB4C @ =gBattleMons\n\ + adds r2, r0, 0\n\ + adds r2, 0x20\n\ +_0800CACE:\n\ + adds r1, r4, r3\n\ + ldrb r0, [r2]\n\ + strb r0, [r1]\n\ + adds r2, 0x58\n\ + adds r3, 0x1\n\ + cmp r3, 0x3\n\ + ble _0800CACE\n\ + movs r3, 0\n\ + mov r5, r12\n\ + adds r5, 0x10\n\ + mov r4, r12\n\ + adds r4, 0x20\n\ + ldr r6, _0800CB50 @ =gBattleTextBuff2\n\ + mov r2, r12\n\ + adds r2, 0x30\n\ +_0800CAEC:\n\ + adds r1, r5, r3\n\ + ldr r7, _0800CB54 @ =gBattleTextBuff1\n\ + adds r0, r3, r7\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + adds r1, r4, r3\n\ + adds r0, r3, r6\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + adds r1, r2, r3\n\ + mov r7, r8\n\ + adds r0, r3, r7\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + adds r3, 0x1\n\ + cmp r3, 0xF\n\ + ble _0800CAEC\n\ + mov r0, r10\n\ + mov r1, r9\n\ + movs r2, 0x44\n\ + bl dp01_prepare_buffer\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0800CB28: .4byte gBattleBuffersTransferData\n\ +_0800CB2C: .4byte gCurrentMove\n\ +_0800CB30: .4byte gUnknown_02024BE8\n\ +_0800CB34: .4byte gLastUsedItem\n\ +_0800CB38: .4byte gLastUsedAbility\n\ +_0800CB3C: .4byte 0x02000000\n\ +_0800CB40: .4byte 0x00016003\n\ +_0800CB44: .4byte 0x0001605e\n\ +_0800CB48: .4byte gBattleTextBuff3\n\ +_0800CB4C: .4byte gBattleMons\n\ +_0800CB50: .4byte gBattleTextBuff2\n\ +_0800CB54: .4byte gBattleTextBuff1\n\ + .syntax divided\n"); +} + +void dp01_build_cmdbuf_x12_a_bb(u8 a, u8 b, u16 c) +{ + gBattleBuffersTransferData[0] = 18; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void unref_sub_800CB84(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 19; + gBattleBuffersTransferData[1] = b; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); +} + +void sub_800CBA4(u8 a, u8 b, u8 c, u8 *d) +{ + u32 i; + + gBattleBuffersTransferData[0] = 20; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = 0; + for (i = 0; i < 20; i++) + gBattleBuffersTransferData[4 + i] = d[i]; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 24); +} + +void sub_800CBE0(u8 a, u8 *b) +{ + int i; + + gBattleBuffersTransferData[0] = 21; + for (i = 0; i < 3; i++) + gBattleBuffersTransferData[1 + i] = b[i]; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitChoosePokemon(u8 a, u8 b, u8 c, u8 d, u8 *e) +{ + int i; + + gBattleBuffersTransferData[0] = 22; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = d; + for (i = 0; i < 3; i++) + gBattleBuffersTransferData[4 + i] = e[i]; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 8); //but only 7 bytes were written +} + +void dp01_build_cmdbuf_x17_17_17_17(u8 a) +{ + gBattleBuffersTransferData[0] = 23; + gBattleBuffersTransferData[1] = 23; + gBattleBuffersTransferData[2] = 23; + gBattleBuffersTransferData[3] = 23; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +// FIXME: I think this function is supposed to take s16 as its second argument, +// but battle_4.c expects u16 +void EmitHealthBarUpdate(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 24; + gBattleBuffersTransferData[1] = 0; + gBattleBuffersTransferData[2] = (s16)b; + gBattleBuffersTransferData[3] = ((s16)b & 0xFF00) >> 8; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +// FIXME: I think this function is supposed to take s16 as its third argument, +// but battle_4.c expects u16 +void EmitExpBarUpdate(u8 a, u8 b, u16 c) +{ + gBattleBuffersTransferData[0] = 25; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (s16)c; + gBattleBuffersTransferData[3] = ((s16)c & 0xFF00) >> 8; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitStatusIconUpdate(u8 a, u32 b, u32 c) +{ + gBattleBuffersTransferData[0] = 26; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0x0000FF00) >> 8; + gBattleBuffersTransferData[3] = (b & 0x00FF0000) >> 16; + gBattleBuffersTransferData[4] = (b & 0xFF000000) >> 24; + gBattleBuffersTransferData[5] = c; + gBattleBuffersTransferData[6] = (c & 0x0000FF00) >> 8; + gBattleBuffersTransferData[7] = (c & 0x00FF0000) >> 16; + gBattleBuffersTransferData[8] = (c & 0xFF000000) >> 24; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 9); +} + +void EmitStatusAnimation(u8 a, u8 b, u32 c) +{ + gBattleBuffersTransferData[0] = 27; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = (c & 0x0000FF00) >> 8; + gBattleBuffersTransferData[4] = (c & 0x00FF0000) >> 16; + gBattleBuffersTransferData[5] = (c & 0xFF000000) >> 24; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 6); +} + +void EmitStatusXor(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 28; + gBattleBuffersTransferData[1] = b; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); +} + +void dp01_build_cmdbuf_x1D_1D_numargs_varargs(u8 a, u16 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 29; + gBattleBuffersTransferData[1] = 29; + gBattleBuffersTransferData[2] = b; + gBattleBuffersTransferData[3] = (b & 0xFF00) >> 8; + for (i = 0; i < b; i++) + gBattleBuffersTransferData[4 + i] = *(c++); + dp01_prepare_buffer(a, gBattleBuffersTransferData, b + 4); +} + +void unref_sub_800CDD4(u8 a, u32 b, u16 c, u8 *d) +{ + int i; + + gBattleBuffersTransferData[0] = 30; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0x0000FF00) >> 8; + gBattleBuffersTransferData[3] = (b & 0x00FF0000) >> 16; + gBattleBuffersTransferData[4] = (b & 0xFF000000) >> 24; + gBattleBuffersTransferData[5] = c; + gBattleBuffersTransferData[6] = (c & 0xFF00) >> 8; + for (i = 0; i < c; i++) + gBattleBuffersTransferData[7 + i] = *(d++); + dp01_prepare_buffer(a, gBattleBuffersTransferData, c + 7); +} + +void unref_sub_800CE3C(u8 a, u16 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 31; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + for (i = 0; i < b; i++) + gBattleBuffersTransferData[3 + i] = *(c++); + dp01_prepare_buffer(a, gBattleBuffersTransferData, b + 3); +} + +void unref_sub_800CE84(u8 a, u16 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 32; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + for (i = 0; i < b; i++) + gBattleBuffersTransferData[3 + i] = *(c++); + dp01_prepare_buffer(a, gBattleBuffersTransferData, b + 3); +} + +void dp01_build_cmdbuf_x21_a_bb(u8 a, u8 b, u16 c) +{ + gBattleBuffersTransferData[0] = 33; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void dp01_build_cmdbuf_x22_a_three_bytes(u8 a, u8 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 34; + gBattleBuffersTransferData[1] = b; + for (i = 0; i < 3; i++) + gBattleBuffersTransferData[2 + i] = c[i]; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 5); +} + +void dp01_build_cmdbuf_x23_aa_0(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 35; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void dp01_build_cmdbuf_x24_aa_0(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 36; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void dp01_build_cmdbuf_x25_25_25_25(u8 a) +{ + gBattleBuffersTransferData[0] = 37; + gBattleBuffersTransferData[1] = 37; + gBattleBuffersTransferData[2] = 37; + gBattleBuffersTransferData[3] = 37; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void dp01_build_cmdbuf_x26_a(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 38; + gBattleBuffersTransferData[1] = b; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); +} + +void dp01_build_cmdbuf_x27_27_27_27(u8 a) +{ + gBattleBuffersTransferData[0] = 39; + gBattleBuffersTransferData[1] = 39; + gBattleBuffersTransferData[2] = 39; + gBattleBuffersTransferData[3] = 39; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void dp01_build_cmdbuf_x28_28_28_28(u8 a) +{ + gBattleBuffersTransferData[0] = 40; + gBattleBuffersTransferData[1] = 40; + gBattleBuffersTransferData[2] = 40; + gBattleBuffersTransferData[3] = 40; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitHitAnimation(u8 a) +{ + gBattleBuffersTransferData[0] = 41; + gBattleBuffersTransferData[1] = 41; + gBattleBuffersTransferData[2] = 41; + gBattleBuffersTransferData[3] = 41; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void dp01_build_cmdbuf_x2A_2A_2A_2A(u8 a) +{ + gBattleBuffersTransferData[0] = 42; + gBattleBuffersTransferData[1] = 42; + gBattleBuffersTransferData[2] = 42; + gBattleBuffersTransferData[3] = 42; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitEffectivenessSound(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 43; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitPlaySound(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 44; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitFaintingCry(u8 a) +{ + gBattleBuffersTransferData[0] = 45; + gBattleBuffersTransferData[1] = 45; + gBattleBuffersTransferData[2] = 45; + gBattleBuffersTransferData[3] = 45; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitBattleIntroSlide(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 46; + gBattleBuffersTransferData[1] = b; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); +} + +void dp01_build_cmdbuf_x2F_2F_2F_2F(u8 a) +{ + gBattleBuffersTransferData[0] = 47; + gBattleBuffersTransferData[1] = 47; + gBattleBuffersTransferData[2] = 47; + gBattleBuffersTransferData[3] = 47; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void dp01_build_cmdbuf_x30_TODO(u8 a, u8 *b, u8 c) +{ + int i; + + gBattleBuffersTransferData[0] = 48; + gBattleBuffersTransferData[1] = c & 0x7F; + gBattleBuffersTransferData[2] = (c & 0x80) >> 7; + gBattleBuffersTransferData[3] = 48; + for (i = 0; i < 48; i++) + gBattleBuffersTransferData[4 + i] = b[i]; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 52); +} + +void dp01_build_cmdbuf_x31_31_31_31(u8 a) +{ + gBattleBuffersTransferData[0] = 49; + gBattleBuffersTransferData[1] = 49; + gBattleBuffersTransferData[2] = 49; + gBattleBuffersTransferData[3] = 49; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void dp01_build_cmdbuf_x32_32_32_32(u8 a) +{ + gBattleBuffersTransferData[0] = 50; + gBattleBuffersTransferData[1] = 50; + gBattleBuffersTransferData[2] = 50; + gBattleBuffersTransferData[3] = 50; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitSpriteInvisibility(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 51; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = 51; + gBattleBuffersTransferData[3] = 51; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitBattleAnimation(u8 a, u8 b, u16 c) +{ + gBattleBuffersTransferData[0] = 52; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); +} + +void EmitLinkStandbyMsg(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 53; + gBattleBuffersTransferData[1] = b; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); +} + +void EmitResetActionMoveSelection(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 54; + gBattleBuffersTransferData[1] = b; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); +} + +void dp01_build_cmdbuf_x37_a(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 55; + gBattleBuffersTransferData[1] = b; + dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); +} diff --git a/src/misc/rom4.c b/src/misc/rom4.c new file mode 100644 index 000000000..f9006efba --- /dev/null +++ b/src/misc/rom4.c @@ -0,0 +1,2573 @@ +#include "global.h" +#include "rom4.h" +#include "battle_setup.h" +#include "berry.h" +#include "cable_club.h" +#include "clock.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_control_avatar.h" +#include "field_effect.h" +#include "field_fadetransition.h" +#include "field_ground_effect.h" +#include "field_map_obj.h" +#include "field_map_obj_helpers.h" +#include "field_message_box.h" +#include "field_player_avatar.h" +#include "field_screen_effect.h" +#include "field_special_scene.h" +#include "field_specials.h" +#include "field_tasks.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "fldeff_flash.h" +#include "heal_location.h" +#include "link.h" +#include "load_save.h" +#include "main.h" +#include "map_name_popup.h" +#include "menu.h" +#include "metatile_behavior.h" +#include "new_game.h" +#include "palette.h" +#include "play_time.h" +#include "rng.h" +#include "roamer.h" +#include "rotating_gate.h" +#include "safari_zone.h" +#include "script.h" +#include "script_pokemon_80C4.h" +#include "secret_base.h" +#include "songs.h" +#include "sound.h" +#include "start_menu.h" +#include "task.h" +#include "tileset_anim.h" +#include "time_events.h" +#include "tv.h" +#include "unknown_task.h" +#include "wild_encounter.h" + +#ifdef SAPPHIRE +#define LEGENDARY_MUSIC BGM_OOAME // Heavy Rain +#else +#define LEGENDARY_MUSIC BGM_HIDERI // Drought +#endif + +struct UnkTVStruct +{ + u32 tv_field_0; + u32 tv_field_4; +}; + +EWRAM_DATA struct WarpData gUnknown_020297F0 = {0}; +EWRAM_DATA struct WarpData gUnknown_020297F8 = {0}; +EWRAM_DATA struct WarpData gUnknown_02029800 = {0}; +EWRAM_DATA struct WarpData gUnknown_02029808 = {0}; +EWRAM_DATA struct UnkPlayerStruct gUnknown_02029810 = {0}; +EWRAM_DATA u16 gUnknown_02029814 = 0; +EWRAM_DATA bool8 gUnknown_02029816 = FALSE; +EWRAM_DATA struct LinkPlayerMapObject gLinkPlayerMapObjects[4] = {0}; + +static u8 gUnknown_03000580[4]; +static u16 (*gUnknown_03000584)(u32); +static u8 gUnknown_03000588; + +u16 word_3004858; +void (*gFieldCallback)(void); +u8 gUnknown_03004860; +u8 gFieldLinkPlayerCount; + +extern u16 gUnknown_03004898; +extern u16 gUnknown_0300489C; + +extern u8 EventScript_LeagueWhiteOut[]; +extern u8 gUnknown_0819FC9F[]; +extern u8 SingleBattleColosseum_EventScript_1A436F[]; +extern u8 SingleBattleColosseum_EventScript_1A4379[]; +extern u8 DoubleBattleColosseum_EventScript_1A4383[]; +extern u8 DoubleBattleColosseum_EventScript_1A439E[]; +extern u8 DoubleBattleColosseum_EventScript_1A43B9[]; +extern u8 DoubleBattleColosseum_EventScript_1A43D4[]; +extern u8 TradeCenter_EventScript_1A43F0[]; +extern u8 TradeCenter_EventScript_1A43FA[]; +extern u8 RecordCorner_EventScript_1A4418[]; +extern u8 RecordCorner_EventScript_1A442D[]; +extern u8 RecordCorner_EventScript_1A4442[]; +extern u8 RecordCorner_EventScript_1A4457[]; +extern u8 TradeRoom_ReadTrainerCard1[]; +extern u8 TradeRoom_ReadTrainerCard2[]; +extern u8 TradeRoom_TooBusyToNotice[]; +extern u8 TradeRoom_PromptToCancelLink[]; +extern u8 TradeRoom_TerminateLink[]; +extern u8 gUnknown_081A4508[]; + +extern u8 (*gUnknown_082166A0[])(struct LinkPlayerMapObject *, struct MapObject *, u8); +extern u8 (*gUnknown_082166AC[])(struct LinkPlayerMapObject *, struct MapObject *, u8); +extern void (*gUnknown_082166D8[])(struct LinkPlayerMapObject *, struct MapObject *); + +extern struct MapData * const gMapAttributes[]; +extern struct MapHeader * const * const gMapGroups[]; +extern const struct WarpData gDummyWarpData; +extern s32 gUnknown_0839ACE8; +extern u32 gUnknown_08216694[]; + +void DoWhiteOut(void) +{ + ScriptContext2_RunNewScript(EventScript_LeagueWhiteOut); + gSaveBlock1.money /= 2; + HealPlayerParty(); + sub_8053050(); + sub_8053570(); + warp_in(); +} + +void flag_var_implications_of_teleport_(void) +{ + player_avatar_init_params_reset(); + FlagReset(SYS_CYCLING_ROAD); + FlagReset(SYS_CRUISE_MODE); + FlagReset(SYS_SAFARI_MODE); + FlagReset(SYS_USE_STRENGTH); + FlagReset(SYS_USE_FLASH); +} + +void new_game(void) +{ + player_avatar_init_params_reset(); + FlagReset(SYS_CYCLING_ROAD); + FlagReset(SYS_CRUISE_MODE); + FlagReset(SYS_SAFARI_MODE); + FlagReset(SYS_USE_STRENGTH); + FlagReset(SYS_USE_FLASH); + ScriptContext2_RunNewScript(gUnknown_0819FC9F); +} + +void sub_8053014(void) +{ + player_avatar_init_params_reset(); + FlagReset(SYS_CYCLING_ROAD); + FlagReset(SYS_CRUISE_MODE); + FlagReset(SYS_SAFARI_MODE); + FlagReset(SYS_USE_STRENGTH); + FlagReset(SYS_USE_FLASH); +} + +void sub_8053050(void) +{ + player_avatar_init_params_reset(); + FlagReset(SYS_CYCLING_ROAD); + FlagReset(SYS_CRUISE_MODE); + FlagReset(SYS_SAFARI_MODE); + FlagReset(SYS_USE_STRENGTH); + FlagReset(SYS_USE_FLASH); +} + +void sub_805308C(void) +{ + FlagReset(SYS_SAFARI_MODE); + sub_8054164(); + ResetCyclingRoadChallengeData(); + UpdateLocationHistoryForRoamer(); + RoamerMoveToOtherLocationSet(); +} + +void ResetGameStats(void) +{ + s32 i; + + for (i = 0; i < NUM_GAME_STATS; i++) + gSaveBlock1.gameStats[i] = 0; +} + +void IncrementGameStat(u8 index) +{ + if (index < NUM_GAME_STATS) + { + if (gSaveBlock1.gameStats[index] < 0xFFFFFF) + gSaveBlock1.gameStats[index]++; + else + gSaveBlock1.gameStats[index] = 0xFFFFFF; + } +} + +u32 GetGameStat(u8 index) +{ + if (index >= NUM_GAME_STATS) + return 0; + + return gSaveBlock1.gameStats[index]; +} + +void SetGameStat(u8 index, u32 value) +{ + if (index < NUM_GAME_STATS) + gSaveBlock1.gameStats[index] = value; +} + +void sub_8053154(void) +{ + CpuFill32(0, gSaveBlock1.mapObjectTemplates, sizeof(gSaveBlock1.mapObjectTemplates)); + CpuCopy32(gMapHeader.events->mapObjects, + gSaveBlock1.mapObjectTemplates, + gMapHeader.events->mapObjectCount * sizeof(struct MapObjectTemplate)); +} + +void sub_8053198(void) +{ + struct MapObjectTemplate *mapObjectTemplates = gSaveBlock1.mapObjectTemplates; + s32 i; + for (i = 0; i < 64; i++) + mapObjectTemplates[i].script = gMapHeader.events->mapObjects[i].script; +} + +void update_saveblock1_field_object_coords(u8 localId, s16 x, s16 y) +{ + s32 i; + for (i = 0; i < 64; i++) + { + struct MapObjectTemplate *mapObjectTemplate = &gSaveBlock1.mapObjectTemplates[i]; + if (mapObjectTemplate->localId == localId) + { + mapObjectTemplate->x = x; + mapObjectTemplate->y = y; + break; + } + } +} + +void update_saveblock1_field_object_movement_behavior(u8 localId, u8 movementType) +{ + s32 i = 0; + struct MapObjectTemplate *mapObjectTemplate = gSaveBlock1.mapObjectTemplates; + do + { + if (mapObjectTemplate->localId == localId) + { + mapObjectTemplate->movementType = movementType; + break; + } + mapObjectTemplate++; + i++; + } while (i < 64); +} + +void mapdata_load_assets_to_gpu_and_full_redraw(void) +{ + move_tilemap_camera_to_upper_left_corner(); + copy_map_tileset1_tileset2_to_vram(gMapHeader.mapData); + apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + DrawWholeMapView(); + cur_mapheader_run_tileset_funcs_after_some_cpuset(); +} + +struct MapData *get_mapdata_header(void) +{ + u16 mapDataId = gSaveBlock1.mapDataId; + if (mapDataId) + return gMapAttributes[mapDataId - 1]; + return NULL; +} + +void warp_shift(void) +{ + gUnknown_020297F0 = gSaveBlock1.location; + gSaveBlock1.location = gUnknown_020297F8; + gUnknown_02029800 = gDummyWarpData; + gUnknown_02029808 = gDummyWarpData; +} + +void warp_set(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp->mapGroup = mapGroup; + warp->mapNum = mapNum; + warp->warpId = warpId; + warp->x = x; + warp->y = y; +} + +bool32 warp_data_is_not_neg_1(struct WarpData *warp) +{ + if (warp->mapGroup != -1) + return FALSE; + if (warp->mapNum != -1) + return FALSE; + if (warp->warpId != -1) + return FALSE; + if (warp->x != -1) + return FALSE; + if (warp->y != -1) + return FALSE; + return TRUE; +} + +struct MapHeader * const get_mapheader_by_bank_and_number(u16 mapGroup, u16 mapNum) +{ + return gMapGroups[mapGroup][mapNum]; +} + +struct MapHeader * const warp1_get_mapheader(void) +{ + return get_mapheader_by_bank_and_number(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum); +} + +void set_current_map_header_from_sav1_save_old_name(void) +{ + struct MapHeader *dest = &gMapHeader; + struct MapHeader *src = get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); + *dest = *src; + gSaveBlock1.mapDataId = dest->mapDataId; + dest->mapData = get_mapdata_header(); +} + +void sub_805338C(void) +{ + struct MapHeader *dest = &gMapHeader; + struct MapHeader *src = get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); + *dest = *src; + dest->mapData = get_mapdata_header(); +} + +void sub_80533CC(void) +{ + if (gSaveBlock1.location.warpId >= 0 && gSaveBlock1.location.warpId < gMapHeader.events->warpCount) + { + gSaveBlock1.pos.x = gMapHeader.events->warps[gSaveBlock1.location.warpId].x; + gSaveBlock1.pos.y = gMapHeader.events->warps[gSaveBlock1.location.warpId].y; + } + else if (gSaveBlock1.location.x >= 0 && gSaveBlock1.location.y >= 0) + { + gSaveBlock1.pos.x = gSaveBlock1.location.x; + gSaveBlock1.pos.y = gSaveBlock1.location.y; + } + else + { + gSaveBlock1.pos.x = gMapHeader.mapData->width / 2; + gSaveBlock1.pos.y = gMapHeader.mapData->height / 2; + } +} + +void warp_in(void) +{ + warp_shift(); + set_current_map_header_from_sav1_save_old_name(); + sub_80533CC(); +} + +void warp1_set(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp_set(&gUnknown_020297F8, mapGroup, mapNum, warpId, x, y); +} + +void warp1_set_2(s8 mapGroup, s8 mapNum, s8 warpId) +{ + warp1_set(mapGroup, mapNum, warpId, -1, -1); +} + +void saved_warp2_set(int unused, s8 mapGroup, s8 mapNum, s8 warpId) +{ + warp_set(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, gSaveBlock1.pos.x, gSaveBlock1.pos.y); +} + +void saved_warp2_set_2(int unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp_set(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, x, y); +} + +void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused) +{ + gUnknown_020297F8 = gSaveBlock1.warp2; +} + +void sub_8053538(u8 a1) +{ + const struct HealLocation *warp = GetHealLocation(a1); + if (warp) + warp1_set(warp->group, warp->map, -1, warp->x, warp->y); +} + +void sub_8053570(void) +{ + gUnknown_020297F8 = gSaveBlock1.warp3; +} + +void sub_8053588(u8 a1) +{ + const struct HealLocation *warp = GetHealLocation(a1); + if (warp) + warp_set(&gSaveBlock1.warp3, warp->group, warp->map, -1, warp->x, warp->y); +} + +void sub_80535C4(s16 a1, s16 a2) +{ + u8 v4 = sav1_map_get_light_level(); + u8 v5 = get_map_light_level_by_bank_and_number(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum); + if (is_light_level_1_2_3_5_or_6(v4) && is_light_level_1_2_3_5_or_6(v5) != TRUE) + sub_805363C(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, a1 - 7, a2 - 6); +} + +void sub_805363C(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp_set(&gSaveBlock1.warp4, mapGroup, mapNum, warpId, x, y); +} + +void sub_8053678(void) +{ + gUnknown_020297F8 = gSaveBlock1.warp4; +} + +void sub_8053690(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp_set(&gUnknown_02029800, mapGroup, mapNum, warpId, x, y); +} + +void warp1_set_to_warp2(void) +{ + gUnknown_020297F8 = gUnknown_02029800; +} + +void sub_80536E4(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp_set(&gUnknown_02029808, mapGroup, mapNum, warpId, x, y); +} + +void sub_8053720(s16 x, s16 y) +{ + if (warp_data_is_not_neg_1(&gUnknown_02029808) == TRUE) + { + gUnknown_020297F8 = gUnknown_020297F0; + } + else + { + warp1_set(gUnknown_02029808.mapGroup, gUnknown_02029808.mapNum, -1, x, y); + } +} + +void sub_8053778(void) +{ + gUnknown_020297F8 = gSaveBlock1.warp1; +} + +void unref_sub_8053790(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp_set(&gSaveBlock1.warp1, mapGroup, mapNum, warpId, x, y); +} + +void sub_80537CC(u8 a1) +{ + const struct HealLocation *warp = GetHealLocation(a1); + if (warp) + warp_set(&gSaveBlock1.warp1, warp->group, warp->map, -1, warp->x, warp->y); +} + +void gpu_sync_bg_hide() +{ + gSaveBlock1.warp1 = gSaveBlock1.warp2; +} + +struct MapConnection *sub_8053818(u8 dir) +{ + s32 i; + s32 count = gMapHeader.connections->count; + struct MapConnection *connection = gMapHeader.connections->connections; + + if (connection == NULL) + return NULL; + + for(i = 0; i < count; i++, connection++) + if (connection->direction == dir) + return connection; + + return NULL; +} + +bool8 sub_8053850(u8 dir, u16 x, u16 y) +{ + struct MapConnection *connection = sub_8053818(dir); + if (connection) + { + warp1_set(connection->mapGroup, connection->mapNum, -1, x, y); + } + else + { + mapheader_run_script_with_tag_x6(); + if (warp_data_is_not_neg_1(&gUnknown_02029800)) + return FALSE; + warp1_set_to_warp2(); + } + return TRUE; +} + +bool8 sub_80538B0(u16 x, u16 y) +{ + return sub_8053850(CONNECTION_EMERGE, x, y); +} + +bool8 sub_80538D0(u16 x, u16 y) +{ + return sub_8053850(CONNECTION_DIVE, x, y); +} + +void sub_80538F0(u8 mapGroup, u8 mapNum) +{ + s32 i; + + warp1_set(mapGroup, mapNum, -1, -1, -1); + sub_8053F0C(); + warp_shift(); + set_current_map_header_from_sav1_save_old_name(); + sub_8053154(); + ClearTempFieldEventData(); + ResetCyclingRoadChallengeData(); + prev_quest_postbuffer_cursor_backup_reset(); + sub_8082BD0(mapGroup, mapNum); + DoTimeBasedEvents(); + sub_80806E4(); + sub_8054164(); + sub_8053C98(); + sav1_reset_battle_music_maybe(); + mapheader_run_script_with_tag_x3(); + not_trainer_hill_battle_pyramid(); + sub_8056D38(gMapHeader.mapData); + apply_map_tileset2_palette(gMapHeader.mapData); + + for (i = 6; i < 12; i++) + sub_807D874(i); + + sub_8072ED0(); + UpdateLocationHistoryForRoamer(); + RoamerMove(); + DoCurrentWeather(); + ResetFieldTasksArgs(); + mapheader_run_script_with_tag_x5(); + ShowMapNamePopup(); +} + +void sub_8053994(u32 a1) +{ + bool8 v2; + bool8 v3; + + set_current_map_header_from_sav1_save_old_name(); + sub_8053154(); + v2 = is_light_level_1_2_3_5_or_6(gMapHeader.mapType); + v3 = is_light_level_8_or_9(gMapHeader.mapType); + ClearTempFieldEventData(); + ResetCyclingRoadChallengeData(); + prev_quest_postbuffer_cursor_backup_reset(); + sub_8082BD0(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); + if (a1 != 1) + DoTimeBasedEvents(); + sub_80806E4(); + sub_8054164(); + if (v2) + FlagReset(SYS_USE_FLASH); + sub_8053C98(); + sav1_reset_battle_music_maybe(); + mapheader_run_script_with_tag_x3(); + UpdateLocationHistoryForRoamer(); + RoamerMoveToOtherLocationSet(); + not_trainer_hill_battle_pyramid(); + if (a1 != 1 && v3) + { + UpdateTVScreensOnMap(gUnknown_03004870.width, gUnknown_03004870.height); + sub_80BBCCC(1); + } +} + +void player_avatar_init_params_reset(void) +{ + gUnknown_02029810.player_field_1 = 1; + gUnknown_02029810.player_field_0 = 1; +} + +void walkrun_find_lowest_active_bit_in_bitfield(void) +{ + gUnknown_02029810.player_field_1 = player_get_direction_lower_nybble(); + + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) + gUnknown_02029810.player_field_0 = 2; + else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) + gUnknown_02029810.player_field_0 = 4; + else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + gUnknown_02029810.player_field_0 = 8; + else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4)) + gUnknown_02029810.player_field_0 = 16; + else + gUnknown_02029810.player_field_0 = 1; +} + +struct UnkPlayerStruct *sub_8053AA8(void) +{ + struct UnkPlayerStruct playerStruct; + u8 light = sav1_map_get_light_level(); + u16 v2 = cur_mapdata_block_role_at_screen_center_acc_to_sav1(); + u8 v4 = sub_8053B00(&gUnknown_02029810, v2, light); + playerStruct.player_field_0 = v4; + playerStruct.player_field_1 = sub_8053B60(&gUnknown_02029810, v4, v2, light); + gUnknown_02029810 = playerStruct; + return &gUnknown_02029810; +} + +u8 sub_8053B00(struct UnkPlayerStruct *playerStruct, u16 a2, u8 a3) +{ + if (a3 != 8 && FlagGet(SYS_CRUISE_MODE)) + return 1; + if (a3 == 5) + return 16; + if (MetatileBehavior_IsSurfableWaterOrUnderwater(a2) == 1) + return 8; + if (IsBikingAllowedByMap() != TRUE) + return 1; + if (playerStruct->player_field_0 == 2) + return 2; + if (playerStruct->player_field_0 != 4) + return 1; + return 4; +} + +u8 sub_8053B60(struct UnkPlayerStruct *playerStruct, u8 a2, u16 a3, u8 a4) +{ + if (FlagGet(SYS_CRUISE_MODE) && a4 == 6) + return 4; + if (MetatileBehavior_IsDeepSouthWarp(a3) == TRUE) + return 2; + if (MetatileBehavior_IsNonAnimDoor(a3) == TRUE || MetatileBehavior_IsDoor(a3) == TRUE) + return 1; + if (MetatileBehavior_IsSouthArrowWarp(a3) == TRUE) + return 2; + if (MetatileBehavior_IsNorthArrowWarp(a3) == TRUE) + return 1; + if (MetatileBehavior_IsWestArrowWarp(a3) == TRUE) + return 4; + if (MetatileBehavior_IsEastArrowWarp(a3) == TRUE) + return 3; + if ((playerStruct->player_field_0 == 16 && a2 == 8) + || (playerStruct->player_field_0 == 8 && a2 == 16)) + return playerStruct->player_field_1; + if (MetatileBehavior_IsLadder(a3) == TRUE) + return playerStruct->player_field_1; + return 1; +} + +u16 cur_mapdata_block_role_at_screen_center_acc_to_sav1(void) +{ + return MapGridGetMetatileBehaviorAt(gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7); +} + +bool32 IsBikingAllowedByMap(void) +{ + // is player in cycling road entrance? + if (gSaveBlock1.location.mapGroup == 29 && (gSaveBlock1.location.mapNum == 11 || gSaveBlock1.location.mapNum == 12)) + return TRUE; + + // is player indoor, in a secret base, or underwater? + if (gMapHeader.mapType == MAP_TYPE_INDOOR) + return FALSE; + if (gMapHeader.mapType == MAP_TYPE_SECRET_BASE) + return FALSE; + if (gMapHeader.mapType == MAP_TYPE_UNDERWATER) + return FALSE; + + // is player in SeafloorCavern_Room9? + if (gSaveBlock1.location.mapGroup == 24 && gSaveBlock1.location.mapNum == 36) + return FALSE; + + // is player in CaveOfOrigin_B4F? + if (gSaveBlock1.location.mapGroup == 24 && gSaveBlock1.location.mapNum == 42) + return FALSE; + + return TRUE; +} + +void sub_8053C98(void) +{ + if (!gMapHeader.cave) + gSaveBlock1.flashUsed = 0; + else if (FlagGet(SYS_USE_FLASH)) + gSaveBlock1.flashUsed = 1; + else + gSaveBlock1.flashUsed = gUnknown_0839ACE8; +} + +void sub_8053CE4(s32 a1) +{ + if (a1 < 0 || a1 > gUnknown_0839ACE8) + a1 = 0; + gSaveBlock1.flashUsed = a1; +} + +u8 sav1_get_flash_used_on_map(void) +{ + return gSaveBlock1.flashUsed; +} + +void sub_8053D14(u16 mapDataId) +{ + gSaveBlock1.mapDataId = mapDataId; + gMapHeader.mapData = get_mapdata_header(); +} + +bool16 sub_8053D30(struct WarpData *warp) +{ + if (!FlagGet(SYS_WEATHER_CTRL)) + return FALSE; + if (warp->mapGroup != 0) + return FALSE; + switch (warp->mapNum) + { + case 5: + case 6: + case 7: + case 8: + return TRUE; + case 39: + case 40: + case 41: + case 42: + case 43: + return TRUE; + } + return FALSE; +} + +bool16 sub_8053D6C(struct WarpData *warp) +{ + if (VarGet(0x40B3)) + return FALSE; + if (warp->mapGroup != 32) + return FALSE; + if (warp->mapNum == 0 || warp->mapNum == 1) + return TRUE; + return FALSE; +} + +u16 sub_8053D9C(struct WarpData *warp) +{ + if (sub_8053D30(warp) == TRUE) + return LEGENDARY_MUSIC; + else if (sub_8053D6C(warp) == TRUE) + return BGM_TOZAN; + else + return get_mapheader_by_bank_and_number(warp->mapGroup, warp->mapNum)->music; +} + +u16 sav1_map_get_music(void) +{ + u16 music; + + if (gSaveBlock1.location.mapGroup == 0 + && gSaveBlock1.location.mapNum == 26 + && GetSav1Weather() == 8) + return BGM_ASHROAD; + + music = sub_8053D9C(&gSaveBlock1.location); + if (music != 0x7FFF) + { + return music; + } + else + { + if (gSaveBlock1.pos.x < 24) + return BGM_DOORO_X1; + else + return BGM_GRANROAD; + } +} + +u16 warp1_target_get_music(void) +{ + u16 music = sub_8053D9C(&gUnknown_020297F8); + if (music != 0x7FFF) + { + return music; + } + else + { + if (gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 2) + return BGM_DOORO_X1; + else + return BGM_GRANROAD; + } +} + +void call_map_music_set_to_zero(void) +{ + ResetMapMusic(); +} + +void sub_8053E90(void) +{ + u16 music = sav1_map_get_music(); + + if (music != LEGENDARY_MUSIC) + { + if (gSaveBlock1.battleMusic) + music = gSaveBlock1.battleMusic; + else if (sav1_map_get_light_level() == 5) + music = BGM_DEEPDEEP; + else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + music = BGM_NAMINORI; + } + + if (music != GetCurrentMapMusic()) + PlayNewMapMusic(music); +} + +void sav1_set_battle_music_maybe(u16 songNum) +{ + gSaveBlock1.battleMusic = songNum; +} + +void sav1_reset_battle_music_maybe(void) +{ + gSaveBlock1.battleMusic = 0; +} + +void sub_8053F0C(void) +{ + if (FlagGet(SPECIAL_FLAG_1) != TRUE) + { + u16 newMusic = warp1_target_get_music(); + u16 currentMusic = GetCurrentMapMusic(); + if (newMusic != LEGENDARY_MUSIC) + { + if (currentMusic == BGM_DEEPDEEP || currentMusic == BGM_NAMINORI) + return; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + newMusic = BGM_NAMINORI; + } + if (newMusic != currentMusic) + { + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) + FadeOutAndFadeInNewMapMusic(newMusic, 4, 4); + else + FadeOutAndPlayNewMapMusic(newMusic, 8); + } + } +} + +void sub_8053F84(void) +{ + u16 currentMusic = GetCurrentMapMusic(); + if (currentMusic != sav1_map_get_music()) + FadeOutAndPlayNewMapMusic(sav1_map_get_music(), 8); +} + +void sub_8053FB0(u16 music) +{ + u16 currentMusic = GetCurrentMapMusic(); + if (currentMusic != music && currentMusic != LEGENDARY_MUSIC) + FadeOutAndPlayNewMapMusic(music, 8); +} + +u8 is_warp1_light_level_8_or_9(void) +{ + struct MapHeader *mapHeader = warp1_get_mapheader(); + if (is_light_level_8_or_9(mapHeader->mapType) == TRUE) + return 2; + else + return 4; +} + +void sub_8053FF8(void) +{ + u16 music = warp1_target_get_music(); + if (FlagGet(SPECIAL_FLAG_1) != TRUE && music != GetCurrentMapMusic()) + { + u8 speed = is_warp1_light_level_8_or_9(); + FadeOutMapMusic(speed); + } +} + +bool8 sub_8054034(void) +{ + return IsNotWaitingForBGMStop(); +} + +void sub_8054044(void) +{ + FadeOutMapMusic(4); +} + +void sub_8054050(void) +{ + s16 x, y; + PlayerGetDestCoords((u16 *)&x, (u16 *)&y); + if (gUnknown_02029816 != TRUE + || MetatileBehavior_IsSurfableWaterOrUnderwater(MapGridGetMetatileBehaviorAt(x, y))) + { + s8 pan = (Random() % 88) + 212; + s8 volume = (Random() % 30) + 50; + PlayCry2(gUnknown_02029814, pan, volume, 1); + } +} + +void sub_80540D0(s16 *a1, u16 *a2) +{ + switch (*a1) + { + case 0: + if (!gUnknown_02029814) + *a1 = 4; + else + *a1 = 1; + break; + case 1: + *a2 = (Random() % 2400) + 1200; + *a1 = 3; + break; + case 2: + *a2 = (Random() % 1200) + 1200; + *a1 = 3; + break; + case 3: + (*a2)--; + if (*a2 == 0) + { + sub_8054050(); + *a1 = 2; + } + break; + case 4: + break; + } +} + +void sub_8054164(void) +{ + if ((gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 45) && !IsMirageIslandPresent()) + { + gUnknown_02029816 = TRUE; + gUnknown_02029814 = GetMirageIslandMon(); + } + else + { + gUnknown_02029814 = GetLocalWildMon(&gUnknown_02029816); + } +} + +u8 get_map_light_level_by_bank_and_number(s8 mapGroup, s8 mapNum) +{ + return get_mapheader_by_bank_and_number(mapGroup, mapNum)->mapType; +} + +u8 get_map_light_level_from_warp(struct WarpData *warp) +{ + return get_map_light_level_by_bank_and_number(warp->mapGroup, warp->mapNum); +} + +u8 sav1_map_get_light_level(void) +{ + return get_map_light_level_from_warp(&gSaveBlock1.location); +} + +u8 get_map_light_from_warp0(void) +{ + return get_map_light_level_from_warp(&gUnknown_020297F0); +} + +bool8 is_light_level_1_2_3_5_or_6(u8 a1) +{ + if (a1 == 3 || a1 == 1 || a1 == 5 || a1 == 2 || a1 == 6) + return TRUE; + else + return FALSE; +} + +bool8 is_light_level_1_2_3_or_6(u8 a1) +{ + if (a1 == 3 || a1 == 1 || a1 == 6 || a1 == 2) + return TRUE; + else + return FALSE; +} + +bool8 is_light_level_8_or_9(u8 a1) +{ + if (a1 == 8 || a1 == 9) + return TRUE; + else + return FALSE; +} + +u8 unref_sub_8054260(void) +{ + return get_mapheader_by_bank_and_number(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum)->regionMapSectionId; +} + +u8 sav1_map_get_name(void) +{ + return get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->regionMapSectionId; +} + +u8 sav1_map_get_battletype(void) +{ + return get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->battleType; +} + +void ResetSafariZoneFlag_(void) +{ + ResetSafariZoneFlag(); +} + +bool32 is_c1_link_related_active(void) +{ + if (gMain.callback1 == sub_8055354) + return TRUE; + else + return FALSE; +} + +void c1_overworld_normal(u16 newKeys, u16 heldKeys) +{ + struct FieldInput inputStruct; + + sub_8059204(); + FieldClearPlayerInput(&inputStruct); + FieldGetPlayerInput(&inputStruct, newKeys, heldKeys); + if (!ScriptContext2_IsEnabled()) + { + if (sub_8068024(&inputStruct) == 1) + { + ScriptContext2_Enable(); + HideMapNamePopup(); + } + else + { + player_step(inputStruct.dpadDirection, newKeys, heldKeys); + } + } +} + +void c1_overworld(void) +{ + if (gMain.callback2 == c2_overworld) + c1_overworld_normal(gMain.newKeys, gMain.heldKeys); +} + +void c2_overworld_basic(void) +{ + ScriptContext2_RunScript(); + RunTasks(); + AnimateSprites(); + CameraUpdate(); + UpdateCameraPanning(); + BuildOamBuffer(); + UpdatePaletteFade(); + sub_8072EDC(); +} + +void sub_8054398(void) +{ + c2_overworld_basic(); +} + +void c2_overworld(void) +{ + int fading = (gPaletteFade.active != 0); + if (fading) + SetVBlankCallback(NULL); + c2_overworld_basic(); + if (fading) + SetFieldVBlankCallback(); +} + +void set_callback1(MainCallback cb) +{ + gMain.callback1 = cb; +} + +void sub_80543DC(u16 (*a1)(u32)) +{ + gUnknown_03000584 = a1; +} + +void sub_80543E8(void) +{ + if (gFieldCallback) + gFieldCallback(); + else + mapldr_default(); + gFieldCallback = NULL; +} + +void CB2_NewGame(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + ResetSafariZoneFlag_(); + NewGameInitData(); + player_avatar_init_params_reset(); + PlayTimeCounter_Start(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + gFieldCallback = ExecuteTruckSequence; + do_load_map_stuff_loop(&gMain.state); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); +} + +void CB2_WhiteOut(void) +{ + u8 val; + gMain.state++; + if (gMain.state >= 120) + { + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + ResetSafariZoneFlag_(); + DoWhiteOut(); + player_avatar_init_params_reset(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + gFieldCallback = sub_8080B60; + val = 0; + do_load_map_stuff_loop(&val); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); + } +} + +void CB2_LoadMap(void) +{ + FieldClearVBlankHBlankCallbacks(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + set_callback1(NULL); + SetMainCallback2(sub_810CC80); + gMain.savedCallback = CB2_LoadMap2; +} + +void CB2_LoadMap2(void) +{ + do_load_map_stuff_loop(&gMain.state); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); +} + +void sub_8054534(void) +{ + if (!gMain.state) + { + FieldClearVBlankHBlankCallbacks(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + set_callback1(NULL); + } + if (sub_805493C(&gMain.state, 1)) + { + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); + } +} + +void sub_8054588(void) +{ + FieldClearVBlankHBlankCallbacks(); + gFieldCallback = sub_8080AC4; + SetMainCallback2(c2_80567AC); +} + +void c2_80567AC(void) +{ + if (sub_805483C(&gMain.state)) + { + SetFieldVBlankCallback(); + set_callback1(sub_8055354); + sub_80543DC(sub_8055390); + SetMainCallback2(c2_overworld); + } +} + +void c2_exit_to_overworld_2_switch(void) +{ + if (is_c1_link_related_active() == TRUE) + { + SetMainCallback2(c2_exit_to_overworld_2_link); + } + else + { + FieldClearVBlankHBlankCallbacks(); + SetMainCallback2(c2_exit_to_overworld_2_local); + } +} + +void c2_exit_to_overworld_2_local(void) +{ + if (sub_8054A4C(&gMain.state)) + { + SetFieldVBlankCallback(); + SetMainCallback2(c2_overworld); + } +} + +void c2_exit_to_overworld_2_link(void) +{ + if (!sub_8055870() && sub_8054A9C(&gMain.state)) + SetMainCallback2(c2_overworld); +} + +void sub_805465C(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + sub_8054F70(); + set_callback1(sub_8055354); + sub_80543DC(sub_8055390); + gFieldCallback = sub_8080A3C; + ScriptContext1_Init(); + ScriptContext2_Disable(); + c2_exit_to_overworld_2_switch(); +} + +void sub_805469C(void) +{ + FieldClearVBlankHBlankCallbacks(); + gFieldCallback = atk17_seteffectuser; + c2_exit_to_overworld_2_switch(); +} + +void sub_80546B8(void) +{ + FieldClearVBlankHBlankCallbacks(); + gFieldCallback = sub_80809B0; + c2_exit_to_overworld_2_switch(); +} + +void c2_exit_to_overworld_1_continue_scripts_restart_music(void) +{ + FieldClearVBlankHBlankCallbacks(); + gFieldCallback = sub_8080990; + c2_exit_to_overworld_2_switch(); +} + +void sub_80546F0(void) +{ + FieldClearVBlankHBlankCallbacks(); + gFieldCallback = sub_8080B60; + c2_exit_to_overworld_2_switch(); +} + +void sub_805470C(void) +{ + if (gMapHeader.flags == 1 && sub_80BBB24() == 1) + ShowMapNamePopup(); + sub_8080B60(); +} + +void CB2_ContinueSavedGame(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + ResetSafariZoneFlag_(); + sub_805338C(); + sub_8053198(); + UnfreezeMapObjects(); + DoTimeBasedEvents(); + sub_805308C(); + sub_8055FC0(); + PlayTimeCounter_Start(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + if (GetSecretBase2Field_9() == 1) + { + ClearSecretBase2Field_9(); + sub_8053778(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + } + else + { + gFieldCallback = sub_805470C; + set_callback1(c1_overworld); + c2_exit_to_overworld_2_switch(); + } +} + +void FieldClearVBlankHBlankCallbacks(void) +{ + u16 savedIme = REG_IME; + REG_IME = 0; + REG_IE &= ~INTR_FLAG_HBLANK; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); +} + +void SetFieldVBlankCallback(void) +{ + SetVBlankCallback(VBlankCB_Field); +} + +void VBlankCB_Field(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + sub_8089668(); + sub_8057A58(); + TransferPlttBuffer(); + sub_8072E74(); +} + +void sub_8054814(void) +{ + u8 val = sav1_get_flash_used_on_map(); + if (val) + { + sub_80815E0(val); + sub_80895F8(gUnknown_08216694[0], gUnknown_08216694[1], gUnknown_08216694[2]); + } +} + +bool32 sub_805483C(u8 *a1) +{ + switch (*a1) + { + case 0: + FieldClearVBlankHBlankCallbacks(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + sub_8054F70(); + sub_8054BA8(); + (*a1)++; + break; + case 1: + sub_8053994(1); + (*a1)++; + break; + case 2: + sub_8054D4C(1); + (*a1)++; + break; + case 3: + sub_8054E98(); + sub_8054D90(); + sub_8054EC8(); + sub_8054E60(); + (*a1)++; + break; + case 4: + sub_8054814(); + sub_8054C54(); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + (*a1)++; + break; + case 5: + move_tilemap_camera_to_upper_left_corner(); + (*a1)++; + break; + case 6: + sub_8056D28(gMapHeader.mapData); + (*a1)++; + break; + case 7: + sub_8056D38(gMapHeader.mapData); + (*a1)++; + break; + case 8: + apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + (*a1)++; + break; + case 9: + DrawWholeMapView(); + (*a1)++; + break; + case 10: + cur_mapheader_run_tileset_funcs_after_some_cpuset(); + (*a1)++; + break; + case 12: + sub_80543E8(); + (*a1)++; + break; + case 11: + (*a1)++; + break; + case 13: + return 1; + } + return 0; +} + +bool32 sub_805493C(u8 *a1, u32 a2) +{ + switch (*a1) + { + case 0: + FieldClearVBlankHBlankCallbacks(); + sub_8053994(a2); + (*a1)++; + break; + case 1: + sub_8054BA8(); + (*a1)++; + break; + case 2: + sub_8054D4C(a2); + (*a1)++; + break; + case 3: + mli4_mapscripts_and_other(); + sub_8054E34(); + (*a1)++; + break; + case 4: + sub_8054814(); + sub_8054C54(); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + (*a1)++; + break; + case 5: + move_tilemap_camera_to_upper_left_corner(); + (*a1)++; + break; + case 6: + sub_8056D28(gMapHeader.mapData); + (*a1)++; + break; + case 7: + sub_8056D38(gMapHeader.mapData); + (*a1)++; + break; + case 8: + apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + (*a1)++; + break; + case 9: + DrawWholeMapView(); + (*a1)++; + break; + case 10: + cur_mapheader_run_tileset_funcs_after_some_cpuset(); + (*a1)++; + break; + case 11: + if (gMapHeader.flags == 1 && sub_80BBB24() == 1) + ShowMapNamePopup(); + (*a1)++; + break; + case 12: + sub_80543E8(); + (*a1)++; + break; + case 13: + return 1; + } + return 0; +} + +bool32 sub_8054A4C(u8 *a1) +{ + switch (*a1) + { + case 0: + sub_8054BA8(); + sub_8054D4C(0); + sub_8054E20(); + sub_8054E34(); + (*a1)++; + break; + case 1: + sub_8054C2C(); + (*a1)++; + break; + case 2: + sub_80543E8(); + (*a1)++; + break; + case 3: + return 1; + } + return 0; +} + +bool32 sub_8054A9C(u8 *a1) +{ + switch (*a1) + { + case 0: + FieldClearVBlankHBlankCallbacks(); + sub_8054BA8(); + (*a1)++; + break; + case 1: + sub_8054D4C(1); + (*a1)++; + break; + case 2: + sub_8054F48(); + sub_8054E20(); + sub_8054E7C(); + (*a1)++; + break; + case 3: + sub_8054814(); + sub_8054C54(); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + (*a1)++; + break; + case 4: + move_tilemap_camera_to_upper_left_corner(); + (*a1)++; + break; + case 5: + sub_8056D28(gMapHeader.mapData); + (*a1)++; + break; + case 6: + sub_8056D38(gMapHeader.mapData); + (*a1)++; + break; + case 7: + apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + (*a1)++; + break; + case 8: + DrawWholeMapView(); + (*a1)++; + break; + case 9: + cur_mapheader_run_tileset_funcs_after_some_cpuset(); + (*a1)++; + break; + case 12: + sub_80543E8(); + (*a1)++; + break; + case 10: + case 11: + (*a1)++; + break; + case 13: + SetFieldVBlankCallback(); + (*a1)++; + return 1; + } + return 0; +} + +void do_load_map_stuff_loop(u8 *a1) +{ + while (!sub_805493C(a1, 0)) + ; +} + +void sub_8054BA8(void) +{ + u8 *addr; + u32 size; + + REG_DISPCNT = 0; + + remove_some_task(); + + 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; + } + } + + ResetOamRange(0, 128); + LoadOam(); +} + +void sub_8054C2C(void) +{ + sub_8054814(); + sub_8054C54(); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + mapdata_load_assets_to_gpu_and_full_redraw(); +} + +void sub_8054C54(void) +{ + REG_MOSAIC = 0; + REG_WININ = 7967; + REG_WINOUT = 257; + REG_WIN0H = 255; + REG_WIN0V = 255; + REG_WIN1H = -1; + REG_WIN1V = -1; + REG_BLDCNT = gUnknown_081E29E0[1] | gUnknown_081E29E0[2] | gUnknown_081E29E0[3] | 0x1040; + REG_BLDALPHA = 1805; + *gBGHOffsetRegs[0] = 0; + *gBGVOffsetRegs[0] = 0; + *gBGControlRegs[0] = 0; + *gBGHOffsetRegs[1] = 0; + *gBGVOffsetRegs[1] = 0; + *gBGControlRegs[1] = 7489; + *gBGHOffsetRegs[2] = 0; + *gBGVOffsetRegs[2] = 0; + *gBGControlRegs[2] = 7234; + *gBGHOffsetRegs[3] = 0; + *gBGVOffsetRegs[3] = 0; + *gBGControlRegs[3] = 7747; + REG_DISPCNT = gUnknown_081E29D8[1] | 0x7060 | gUnknown_081E29D8[2] | gUnknown_081E29D8[0] | gUnknown_081E29D8[3]; +} + +void sub_8054D4C(u32 a1) +{ + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + dp12_8087EA4(); + ResetCameraUpdateInfo(); + InstallCameraPanAheadCallback(); + sub_805C7C4(0); + FieldEffectActiveListClear(); + InitFieldMessageBox(); + sub_807C828(); + sub_8080750(); + if (!a1) + SetUpFieldTasks(); + mapheader_run_script_with_tag_x5(); +} + +void sub_8054D90(void) +{ + gUnknown_0300489C = 0; + gUnknown_03004898 = 0; + sub_805AA98(); + sub_805B55C(0, 0); + mapheader_run_first_tag4_script_list_match(); +} + +void mli4_mapscripts_and_other(void) +{ + s16 x, y; + struct UnkPlayerStruct *player; + gUnknown_0300489C = 0; + gUnknown_03004898 = 0; + sub_805AA98(); + sav1_camera_get_focus_coords(&x, &y); + player = sub_8053AA8(); + InitPlayerAvatar(x, y, player->player_field_1, gSaveBlock2.playerGender); + SetPlayerAvatarTransitionFlags(player->player_field_0); + player_avatar_init_params_reset(); + sub_805B55C(0, 0); + ResetBerryTreeSparkleFlags(); + mapheader_run_first_tag4_script_list_match(); +} + +void sub_8054E20(void) +{ + sub_805B710(0, 0); + RotatingGate_InitPuzzleAndGraphics(); +} + +void sub_8054E34(void) +{ + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_15 = 1; + InitCameraUpdateCallback(gPlayerAvatar.spriteId); +} + +void sub_8054E60(void) +{ + InitCameraUpdateCallback(sub_8055AE8(gUnknown_03004860)); +} + +void sub_8054E7C(void) +{ + InitCameraUpdateCallback(sub_8055AE8(gUnknown_03004860)); +} + +void sub_8054E98(void) +{ + u16 x, y; + sav1_camera_get_focus_coords(&x, &y); + sub_8056C50(x + gUnknown_03004860, y); +} + +void sub_8054EC8(void) +{ + u16 i; + u16 x, y; + + sav1_camera_get_focus_coords(&x, &y); + x -= gUnknown_03004860; + + for (i = 0; i < gFieldLinkPlayerCount; i++) + { + SpawnLinkPlayerMapObject(i, i + x, y, gLinkPlayers[i].gender); + CreateLinkPlayerSprite(i); + } + + sub_8055340(word_3002910); +} + +void sub_8054F48(void) +{ + u16 i; + for (i = 0; i < gFieldLinkPlayerCount; i++) + CreateLinkPlayerSprite(i); +} + +void sub_8054F70(void) +{ + int i; + for (i = 0; i < 4; i++) + gUnknown_03000580[i] = 0x80; +} + +bool32 sub_8054F88(u16 a1) +{ + int i; + int count = gFieldLinkPlayerCount; + + for (i = 0; i < count; i++) + if (gUnknown_03000580[i] != a1) + return FALSE; + return TRUE; +} + +bool32 sub_8054FC0(u16 a1) +{ + int i; + int count = gFieldLinkPlayerCount; + + for (i = 0; i < count; i++) + if (gUnknown_03000580[i] == a1) + return TRUE; + return FALSE; +} + +void sub_8054FF8(u32 a1, u16 a2, struct UnkStruct_8054FF8 *a3, u16 *a4) +{ + u8 *script; + + if (gUnknown_03000580[a1] == 0x80) + { + script = sub_8055648(a3); + if (script) + { + *a4 = sub_8055758(script); + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_80553E4); + sub_8055808(script); + } + return; + } + if (sub_8054FC0(0x83) == 1) + { + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_80553E4); + sub_805585C(); + } + return; + } + switch (a2) + { + case 24: + if (sub_8055630(a3)) + { + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_80553E4); + sub_80557F4(); + } + } + break; + case 18: + if (sub_8055660(a3) == 1) + { + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_80553E4); + sub_8055824(); + } + } + break; + case 25: + script = sub_805568C(a3); + if (script) + { + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_80553E4); + sub_8055840(script); + } + } + break; + case 27: + if (sub_8055618(a3)) + { + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_8055408); + sub_80557E8(); + } + } + break; + case 28: + if (sub_8055618(a3)) + { + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_8055438); + sub_80557E8(); + } + } + break; + } + } + + switch (a2) + { + case 23: + gUnknown_03000580[a1] = 0x83; + break; + case 22: + gUnknown_03000580[a1] = 0x82; + break; + case 26: + gUnknown_03000580[a1] = 0x80; + if (a3->b) + sub_80543DC(sub_8055390); + break; + case 29: + if (gUnknown_03000580[a1] == 0x82) + gUnknown_03000580[a1] = 0x81; + break; + } +} + +void sub_8055218(u16 *a1, int a2) +{ + struct UnkStruct_8054FF8 st; + int i; + for (i = 0; i < 4; i++) + { + u16 v5 = a1[i]; + u16 v8 = 0; + sub_80555B0(i, a2, &st); + sub_8054FF8(i, v5, &st, &v8); + if (gUnknown_03000580[i] == 0x80) + v8 = sub_805530C(v5); + sub_8055BFC(i, v8); + } +} + +void sub_8055280(u16 a1) +{ + if (a1 >= 17 && a1 < 30) + word_3004858 = a1; + else + word_3004858 = 17; +} + +u16 sub_80552B0(u32 a1) +{ + if (gMain.heldKeys & 0x40) + { + return 19; + } + else if (gMain.heldKeys & 0x80) + { + return 18; + } + else if (gMain.heldKeys & 0x20) + { + return 20; + } + else if (gMain.heldKeys & 0x10) + { + return 21; + } + else if (gMain.newKeys & 8) + { + return 24; + } + else if (gMain.newKeys & 1) + { + return 25; + } + else + { + return 17; + } +} + +u16 sub_805530C(u16 a1) +{ + switch (a1) + { + case 21: + return 4; + case 20: + return 3; + case 19: + return 1; + case 18: + return 2; + default: + return 0; + } +} + +void sub_8055340(u16 *a1) +{ + int i; + for (i = 0; i < 4; i++) + a1[i] = 17; +} + +void sub_8055354(void) +{ + u8 val = gUnknown_03004860; + sub_8055218(word_3002910, val); + sub_8055280(gUnknown_03000584(val)); + sub_8055340(word_3002910); +} + +u16 sub_8055390(u32 a1) +{ + if (ScriptContext2_IsEnabled() == 1) + return 17; + if (gLink.recvQueue.count > 4) + return 27; + if (gLink.sendQueue.count <= 4) + return sub_80552B0(a1); + return 28; +} + +u16 sub_80553E0(u32 a1) +{ + return 17; +} + +u16 sub_80553E4(u32 a1) +{ + u16 retVal; + if (ScriptContext2_IsEnabled() == 1) + { + retVal = 17; + } + else + { + retVal = 26; + sub_80543DC(sub_80553E0); + } + return retVal; +} + +u16 sub_8055408(u32 a1) +{ + u16 retVal; + if (gLink.recvQueue.count > 2) + { + retVal = 17; + } + else + { + retVal = 26; + ScriptContext2_Disable(); + sub_80543DC(sub_80553E0); + } + return retVal; +} + +u16 sub_8055438(u32 a1) +{ + u16 retVal; + if (gLink.sendQueue.count > 2) + { + retVal = 17; + } + else + { + retVal = 26; + ScriptContext2_Disable(); + sub_80543DC(sub_80553E0); + } + return retVal; +} + +u16 sub_8055468(u32 a1) +{ + return 17; +} + +u16 sub_805546C(u32 linkPlayerId) +{ + if (gUnknown_03000580[linkPlayerId] == 0x82 && (gMain.newKeys & B_BUTTON)) + { + sub_80543DC(sub_8055468); + return 29; + } + else + { + return 17; + } +} + +u16 sub_80554A4(u32 a1) +{ + sub_80543DC(sub_805546C); + return 22; +} + +u16 sub_80554B8(u32 a1) +{ + return 17; +} + +u16 sub_80554BC(u32 a1) +{ + if (sub_8054F88(0x83) == TRUE) + { + ScriptContext1_SetupScript(gUnknown_081A4508); + sub_80543DC(sub_80554B8); + } + return 17; +} + +u16 sub_80554E4(u32 a1) +{ + sub_80543DC(sub_80554BC); + return 23; +} + +u32 sub_80554F8(void) +{ + if (sub_8054FC0(0x83) == TRUE) + return 2; + if (gUnknown_03000584 == sub_805546C && gUnknown_03000580[gUnknown_03004860] != 0x82) + return 0; + if (gUnknown_03000584 == sub_8055468 && gUnknown_03000580[gUnknown_03004860] == 0x81) + return 2; + return sub_8054F88(0x82); +} + +bool32 unref_sub_8055568(void) +{ + return sub_8054FC0(0x83); +} + +u16 sub_8055574(void) +{ + sub_80543DC(sub_80554A4); + return 0; +} + +u16 sub_8055588(void) +{ + sub_80543DC(sub_80553E4); + return 0; +} + +u16 sub_805559C(void) +{ + sub_80543DC(sub_80554E4); + return 0; +} + +void sub_80555B0(int linkPlayerId, int a2, struct UnkStruct_8054FF8 *a3) +{ + s16 x, y; + + a3->a = linkPlayerId; + a3->b = (linkPlayerId == a2) ? 1 : 0; + a3->c = gLinkPlayerMapObjects[linkPlayerId].mode; + a3->d = sub_8055B30(linkPlayerId); + sub_8055B08(linkPlayerId, &x, &y); + a3->sub.x = x; + a3->sub.y = y; + a3->sub.height = sub_8055B50(linkPlayerId); + a3->field_C = MapGridGetMetatileBehaviorAt(x, y); +} + +bool32 sub_8055618(struct UnkStruct_8054FF8 *a1) +{ + u8 v1 = a1->c; + if (v1 == 2 || v1 == 0) + return TRUE; + else + return FALSE; +} + +bool32 sub_8055630(struct UnkStruct_8054FF8 *a1) +{ + u8 v1 = a1->c; + if (v1 == 2 || v1 == 0) + return TRUE; + else + return FALSE; +} + +u8 *sub_8055648(struct UnkStruct_8054FF8 *a1) +{ + if (a1->c != 2) + return 0; + return sub_8068E24(&a1->sub); +} + +bool32 sub_8055660(struct UnkStruct_8054FF8 *a1) +{ + if (a1->c != 2 && a1->c != 0) + return FALSE; + if (!MetatileBehavior_IsSouthArrowWarp(a1->field_C)) + return FALSE; + if (a1->d != 1) + return FALSE; + return TRUE; +} + +u8 *sub_805568C(struct UnkStruct_8054FF8 *a1) +{ + struct MapPosition unkStruct; + u8 linkPlayerId; + + if (a1->c && a1->c != 2) + return 0; + + unkStruct = a1->sub; + unkStruct.x += gUnknown_0821664C[a1->d].x; + unkStruct.y += gUnknown_0821664C[a1->d].y; + unkStruct.height = 0; + linkPlayerId = GetLinkPlayerIdAt(unkStruct.x, unkStruct.y); + + if (linkPlayerId != 4) + { + if (!a1->b) + return TradeRoom_TooBusyToNotice; + if (gUnknown_03000580[linkPlayerId] != 0x80) + return TradeRoom_TooBusyToNotice; + if (!sub_8083BF4(linkPlayerId)) + return TradeRoom_ReadTrainerCard1; + else + return TradeRoom_ReadTrainerCard2; + } + + return sub_80682A8(&unkStruct, a1->field_C, a1->d); +} + +u16 sub_8055758(u8 *script) +{ + if (script == DoubleBattleColosseum_EventScript_1A4383) + return 10; + if (script == DoubleBattleColosseum_EventScript_1A439E) + return 9; + if (script == DoubleBattleColosseum_EventScript_1A43B9) + return 10; + if (script == DoubleBattleColosseum_EventScript_1A43D4) + return 9; + if (script == RecordCorner_EventScript_1A4418) + return 10; + if (script == RecordCorner_EventScript_1A442D) + return 9; + if (script == RecordCorner_EventScript_1A4442) + return 10; + if (script == RecordCorner_EventScript_1A4457) + return 9; + if (script == SingleBattleColosseum_EventScript_1A436F) + return 10; + if (script == SingleBattleColosseum_EventScript_1A4379) + return 9; + if (script == TradeCenter_EventScript_1A43F0) + return 10; + if (script == TradeCenter_EventScript_1A43FA) + return 9; + return 0; +} + +void sub_80557E8(void) +{ + ScriptContext2_Enable(); +} + +void sub_80557F4(void) +{ + PlaySE(SE_WIN_OPEN); + sub_8071310(); + ScriptContext2_Enable(); +} + +void sub_8055808(u8 *script) +{ + PlaySE(SE_SELECT); + ScriptContext1_SetupScript(script); + ScriptContext2_Enable(); +} + +void sub_8055824(void) +{ + PlaySE(SE_WIN_OPEN); + ScriptContext1_SetupScript(TradeRoom_PromptToCancelLink); + ScriptContext2_Enable(); +} + +void sub_8055840(u8 *script) +{ + PlaySE(SE_SELECT); + ScriptContext1_SetupScript(script); + ScriptContext2_Enable(); +} + +void sub_805585C(void) +{ + ScriptContext1_SetupScript(TradeRoom_TerminateLink); + ScriptContext2_Enable(); +} + +bool32 sub_8055870(void) +{ + if (!is_c1_link_related_active()) + return 0; + if (gLink.recvQueue.count >= 3) + gUnknown_03000588 = 1; + else + gUnknown_03000588 = 0; + return gUnknown_03000588; +} + +bool32 sub_80558AC(void) +{ + u8 temp; + + if (is_c1_link_related_active() != TRUE) + return FALSE; + + if (sub_8007B24() != TRUE) + return FALSE; + + if (gUnknown_03000584 == sub_8055408) + return TRUE; + + if (gUnknown_03000584 != sub_80553E4) + return FALSE; + + temp = gUnknown_03000588; + gUnknown_03000588 = 0; + + if (temp == TRUE) + return TRUE; + + if (gPaletteFade.active && gPaletteFade.softwareFadeFinishing) + return TRUE; + + return FALSE; +} + +bool32 sub_8055910(void) +{ + if (is_c1_link_related_active() != TRUE) + return FALSE; + + if (sub_8007B24() != TRUE) + return FALSE; + + if (gUnknown_03000584 == sub_8055438) + return TRUE; + + return FALSE; +} + +bool32 sub_8055940(void) +{ + if (!sub_8007B24()) + return FALSE; + return TRUE; +} + +void ZeroLinkPlayerMapObject(struct LinkPlayerMapObject *linkPlayerMapObj) +{ + memset(linkPlayerMapObj, 0, sizeof(struct LinkPlayerMapObject)); +} + +void strange_npc_table_clear(void) +{ + memset(gLinkPlayerMapObjects, 0, sizeof(gLinkPlayerMapObjects)); +} + +void ZeroMapObject(struct MapObject *mapObj) +{ + memset(mapObj, 0, sizeof(struct MapObject)); +} + +void SpawnLinkPlayerMapObject(u8 linkPlayerId, s16 x, s16 y, u8 a4) +{ + u8 mapObjId = sub_805AB54(); + struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + + ZeroLinkPlayerMapObject(linkPlayerMapObj); + ZeroMapObject(mapObj); + + linkPlayerMapObj->active = 1; + linkPlayerMapObj->linkPlayerId = linkPlayerId; + linkPlayerMapObj->mapObjId = mapObjId; + linkPlayerMapObj->mode = 0; + + mapObj->active = 1; + mapObj->mapobj_bit_1 = a4; + mapObj->mapobj_unk_19 = 2; + mapObj->spriteId = 64; + + InitLinkPlayerMapObjectPos(mapObj, x, y); +} + +void InitLinkPlayerMapObjectPos(struct MapObject *mapObj, s16 x, s16 y) +{ + mapObj->coords2.x = x; + mapObj->coords2.y = y; + mapObj->coords3.x = x; + mapObj->coords3.y = y; + sub_80603CC(x, y, &mapObj->coords1.x, &mapObj->coords1.y); + mapObj->coords1.x += 8; + FieldObjectUpdateZCoord(mapObj); +} + +void unref_sub_8055A6C(u8 linkPlayerId, u8 a2) +{ + if (gLinkPlayerMapObjects[linkPlayerId].active) + { + u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + mapObj->mapobj_unk_19 = a2; + } +} + +void unref_sub_8055A9C(u8 linkPlayerId) +{ + struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; + u8 mapObjId = linkPlayerMapObj->mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + if (mapObj->spriteId != 64 ) + DestroySprite(&gSprites[mapObj->spriteId]); + linkPlayerMapObj->active = 0; + mapObj->active = 0; +} + +u8 sub_8055AE8(u8 linkPlayerId) +{ + u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + return mapObj->spriteId; +} + +void sub_8055B08(u8 linkPlayerId, u16 *x, u16 *y) +{ + u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + *x = mapObj->coords2.x; + *y = mapObj->coords2.y; +} + +u8 sub_8055B30(u8 linkPlayerId) +{ + u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + return mapObj->mapobj_unk_19; +} + +u8 sub_8055B50(u8 linkPlayerId) +{ + u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + return mapObj->mapobj_unk_0B_0; +} + +s32 unref_sub_8055B74(u8 linkPlayerId) +{ + u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + return 16 - (s8)mapObj->mapobj_unk_21; +} + +u8 GetLinkPlayerIdAt(s16 x, s16 y) +{ + u8 i; + for (i = 0; i < 4; i++) + { + if (gLinkPlayerMapObjects[i].active + && (gLinkPlayerMapObjects[i].mode == 0 || gLinkPlayerMapObjects[i].mode == 2)) + { + struct MapObject *mapObj = &gMapObjects[gLinkPlayerMapObjects[i].mapObjId]; + if (mapObj->coords2.x == x && mapObj->coords2.y == y) + return i; + } + } + return 4; +} + +void sub_8055BFC(u8 linkPlayerId, u8 a2) +{ + struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; + u8 mapObjId = linkPlayerMapObj->mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + + if (linkPlayerMapObj->active) + { + if (a2 > 10) + mapObj->mapobj_bit_2 = 1; + else + gUnknown_082166D8[gUnknown_082166A0[linkPlayerMapObj->mode](linkPlayerMapObj, mapObj, a2)](linkPlayerMapObj, mapObj); + } +} + +u8 sub_8055C68(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +{ + return gUnknown_082166AC[a3](linkPlayerMapObj, mapObj, a3); +} + +u8 sub_8055C88(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +{ + return 1; +} + +u8 sub_8055C8C(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +{ + return gUnknown_082166AC[a3](linkPlayerMapObj, mapObj, a3); +} + +u8 sub_8055CAC(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +{ + return 0; +} + +u8 sub_8055CB0(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +{ + s16 x, y; + + mapObj->mapobj_unk_19 = npc_something3(a3, mapObj->mapobj_unk_19); + FieldObjectMoveDestCoords(mapObj, mapObj->mapobj_unk_19, &x, &y); + + if (LinkPlayerDetectCollision(linkPlayerMapObj->mapObjId, mapObj->mapobj_unk_19, x, y)) + { + return 0; + } + else + { + mapObj->mapobj_unk_21 = 16; + npc_coords_shift(mapObj, x, y); + FieldObjectUpdateZCoord(mapObj); + return 1; + } +} + +u8 sub_8055D18(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +{ + mapObj->mapobj_unk_19 = npc_something3(a3, mapObj->mapobj_unk_19); + return 0; +} + +void sub_8055D30(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj) +{ + linkPlayerMapObj->mode = 0; +} + +void sub_8055D38(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj) +{ + mapObj->mapobj_unk_21--; + linkPlayerMapObj->mode = 1; + MoveCoords(mapObj->mapobj_unk_19, &mapObj->coords1.x, &mapObj->coords1.y); + if (!mapObj->mapobj_unk_21) + { + npc_coords_shift_still(mapObj); + linkPlayerMapObj->mode = 2; + } +} + +u8 npc_something3(u8 a1, u8 a2) +{ + switch (a1 - 1) + { + case 0: + case 6: + return 2; + case 1: + case 7: + return 1; + case 2: + case 8: + return 3; + case 3: + case 9: + return 4; + } + return a2; +} + +u8 LinkPlayerDetectCollision(u8 selfMapObjId, u8 a2, s16 x, s16 y) +{ + u8 i; + for (i = 0; i < 16; i++) + { + if (i != selfMapObjId) + { + if ((gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) + || (gMapObjects[i].coords3.x == x && gMapObjects[i].coords3.y == y)) + { + return 1; + } + } + } + return MapGridIsImpassableAt(x, y); +} + +void CreateLinkPlayerSprite(u8 linkPlayerId) +{ + struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; + u8 mapObjId = linkPlayerMapObj->mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + struct Sprite *sprite; + + if (linkPlayerMapObj->active) + { + u8 val = GetRivalAvatarGraphicsIdByStateIdAndGender(0, mapObj->mapobj_bit_1); + mapObj->spriteId = AddPseudoFieldObject(val, SpriteCB_LinkPlayer, 0, 0, 0); + sprite = &gSprites[mapObj->spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->data0 = linkPlayerId; + mapObj->mapobj_bit_2 = 0; + } +} + +void SpriteCB_LinkPlayer(struct Sprite *sprite) +{ + struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[sprite->data0]; + struct MapObject *mapObj = &gMapObjects[linkPlayerMapObj->mapObjId]; + sprite->pos1.x = mapObj->coords1.x; + sprite->pos1.y = mapObj->coords1.y; + SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1); + sprite->oam.priority = ZCoordToPriority(mapObj->elevation); + if (!linkPlayerMapObj->mode) + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObj->mapobj_unk_19)); + else + StartSpriteAnimIfDifferent(sprite, get_go_image_anim_num(mapObj->mapobj_unk_19)); + sub_806487C(sprite, 0); + if (mapObj->mapobj_bit_2) + { + sprite->invisible = ((sprite->data7 & 4) >> 2); + sprite->data7++; + } +} diff --git a/src/misc/rom6.c b/src/misc/rom6.c new file mode 100644 index 000000000..ff032b6c2 --- /dev/null +++ b/src/misc/rom6.c @@ -0,0 +1,202 @@ +#include "global.h" +#include "rom6.h" +#include "braille_puzzles.h" +#include "field_effect.h" +#include "field_map_obj.h" +#include "field_player_avatar.h" +#include "item_use.h" +#include "pokemon_menu.h" +#include "rom4.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" + +extern u16 gScriptLastTalked; +extern void (*gFieldCallback)(void); +extern u8 gLastFieldPokeMenuOpened; +extern void (*gUnknown_03005CE4)(void); +extern u8 UseRockSmashScript[]; + +EWRAM_DATA struct MapPosition gUnknown_0203923C = {0}; + +static void task08_080C9820(u8); +static void sub_810B3DC(u8); +static void sub_810B428(u8); +static void sub_810B4CC(u8); +static void sub_810B53C(void); +static void sub_810B58C(void); +static void sub_810B5D8(void); +static void sub_810B634(void); + +bool8 npc_before_player_of_type(u8 a) +{ + u8 mapObjId; + + GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); + gUnknown_0203923C.height = PlayerGetZCoord(); + mapObjId = GetFieldObjectIdByXYZ(gUnknown_0203923C.x, gUnknown_0203923C.y, gUnknown_0203923C.height); + if (gMapObjects[mapObjId].graphicsId != a) + { + return FALSE; + } + else + { + gScriptLastTalked = gMapObjects[mapObjId].localId; + return TRUE; + } +} + +u8 oei_task_add(void) +{ + GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); + return CreateTask(task08_080C9820, 8); +} + +static void task08_080C9820(u8 taskId) +{ + u8 mapObjId; + + ScriptContext2_Enable(); + gPlayerAvatar.unk6 = 1; + mapObjId = gPlayerAvatar.mapObjectId; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(&gMapObjects[mapObjId]) + || FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId])) + { + if (gMapHeader.mapType == 5) + { + FieldEffectStart(0x3B); + gTasks[taskId].func = sub_810B428; + } + else + { + sub_8059BF4(); + FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 0x39); + gTasks[taskId].func = sub_810B3DC; + } + } +} + +static void sub_810B3DC(u8 taskId) +{ + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[gPlayerAvatar.mapObjectId]) == TRUE) + { + FieldEffectStart(0x3B); + gTasks[taskId].func = sub_810B428; + } +} + +static void sub_810B428(u8 taskId) +{ + if (!FieldEffectActiveListContains(6)) + { + gUnknown_0202FF84[1] = player_get_direction_lower_nybble(); + if (gUnknown_0202FF84[1] == 1) + gUnknown_0202FF84[2] = 0; + if (gUnknown_0202FF84[1] == 2) + gUnknown_0202FF84[2] = 1; + if (gUnknown_0202FF84[1] == 3) + gUnknown_0202FF84[2] = 2; + if (gUnknown_0202FF84[1] == 4) + gUnknown_0202FF84[2] = 3; + sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByCurrentState()); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gUnknown_0202FF84[2]); + FieldEffectActiveListRemove(6); + gTasks[taskId].func = sub_810B4CC; + } +} + +static void sub_810B4CC(u8 taskId) +{ + void (*func)(void) = (void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]); + + func(); + gPlayerAvatar.unk6 = 0; + DestroyTask(taskId); +} + +bool8 SetUpFieldMove_RockSmash(void) +{ + if (npc_before_player_of_type(0x56) == TRUE) + { + gFieldCallback = sub_808AB90; + gUnknown_03005CE4 = sub_810B53C; + return TRUE; + } + else + { + return FALSE; + } +} + +static void sub_810B53C(void) +{ + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; + ScriptContext1_SetupScript(UseRockSmashScript); +} + +int FldEff_RockSmash(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_810B58C >> 16; + gTasks[taskId].data[9] = (u32)sub_810B58C; + IncrementGameStat(0x13); + return 0; +} + +static void sub_810B58C(void) +{ + PlaySE(SE_W088); + FieldEffectActiveListRemove(0x25); + EnableBothScriptContexts(); +} + +int SetUpFieldMove_Dig(void) +{ + if (sub_80CA1C8() == TRUE) + { + gFieldCallback = sub_808AB90; + gUnknown_03005CE4 = sub_810B5D8; + return TRUE; + } + else + { + return FALSE; + } +} + +static void sub_810B5D8(void) +{ + sub_8053014(); + FieldEffectStart(0x26); + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; +} + +int FldEff_UseDig(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_810B634 >> 16; + gTasks[taskId].data[9] = (u32)sub_810B634; + if (!ShouldDoBrailleDigEffect()) + SetPlayerAvatarTransitionFlags(1); + return 0; +} + +static void sub_810B634(void) +{ + u8 taskId; + + FieldEffectActiveListRemove(0x26); + if (ShouldDoBrailleDigEffect()) + { + DoBrailleDigEffect(); + } + else + { + taskId = CreateTask(task08_080A1C44, 8); + gTasks[taskId].data[0] = 0; + } +} diff --git a/src/misc/rom_800D42C.c b/src/misc/rom_800D42C.c new file mode 100644 index 000000000..f51779e65 --- /dev/null +++ b/src/misc/rom_800D42C.c @@ -0,0 +1,118 @@ +#include "global.h" +#include "battle.h" +#include "link.h" +#include "text.h" + +extern u16 gBattleTypeFlags; +extern u8 gBattleOutcome; + +extern struct Window gUnknown_03004210; + +extern u8 BattleText_Win[]; +extern u8 BattleText_Loss[]; +extern u8 BattleText_Tie[]; + +#if ENGLISH +#define LEFT_MESSAGE_X 6 +#define RIGHT_MESSAGE_X 21 +#define TILE_OFFSET_LOSS 168 +#elif GERMAN +#define LEFT_MESSAGE_X 5 +#define RIGHT_MESSAGE_X 20 +#define TILE_OFFSET_LOSS 172 +#endif +#define TILE_OFFSET_WIN 160 +#define CENTER_MESSAGE_X 13 +#define MESSAGE_Y 2 + +#define PRINT_MESSAGE(text, tileDataStartOffset, x) \ +{ \ + InitWindow(&gUnknown_03004210, text, tileDataStartOffset, x, MESSAGE_Y); \ + sub_8002F44(&gUnknown_03004210); \ +} + +#define PRINT_MESSAGE_LEFT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, LEFT_MESSAGE_X) +#define PRINT_MESSAGE_RIGHT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, RIGHT_MESSAGE_X) + +void PrintLinkBattleWinLossTie(void) +{ + + if (gBattleOutcome == 3) + { + PRINT_MESSAGE(BattleText_Tie, TILE_OFFSET_WIN, CENTER_MESSAGE_X); + return; + } + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + // Double battle? + + if (gBattleOutcome == 1) + { + + // lp_field_18 = player position? + switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18) + { + case 0: + case 2: + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); + return; + + case 1: + case 3: + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN) + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS) + return; + } + } + else + { + + switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18) + { + case 1: + case 3: + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); + return; + + case 0: + case 2: + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); + return; + } + } + + return; + } + + + if (gBattleOutcome == 1) + { + if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0) + { + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); + } + else + { + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); + } + } + else + { + if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0) + { + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); + } + else + { + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); + } + } +} diff --git a/src/misc/rom_8077ABC.c b/src/misc/rom_8077ABC.c new file mode 100644 index 000000000..249146b37 --- /dev/null +++ b/src/misc/rom_8077ABC.c @@ -0,0 +1,2055 @@ +#include "global.h" +#include "rom_8077ABC.h" +#include "battle.h" +#include "battle_anim.h" +#include "blend_palette.h" +#include "data2.h" +#include "decompress.h" +#include "palette.h" +#include "pokemon_icon.h" +#include "species.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" +#include "util.h" + +#define GET_UNOWN_LETTER(personality) ((\ + (((personality & 0x03000000) >> 24) << 6) \ + | (((personality & 0x00030000) >> 16) << 4) \ + | (((personality & 0x00000300) >> 8) << 2) \ + | (((personality & 0x00000003) >> 0) << 0) \ +) % 28) + +#define IS_DOUBLE_BATTLE() ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) ? TRUE : FALSE) + +#define NUM_BATTLE_SLOTS 4 + +#define gBattleMonPartyPositions gBattlePartyID +#define gCastformElevations gUnknownCastformData_0837F5A8 +#define gCastformBackSpriteYCoords gUnknown_0837F5AC +#define gTransformPersonalities gPID_perBank +#define gBattleMonSprites gObjectBankIDs + + +struct Struct_unk_2019348 { + u16 field_0; + u16 field_2; + u8 field_4; + u32 field_8; + u32 field_c; + u32 field_10; +}; + +struct TransformStatus { + u16 unknown; + u16 species; +}; + +struct Struct_gUnknown_0837F578 { + u8 field_0; + u8 field_1; +}; + +struct OamMatrix { + s16 a; + s16 b; + s16 c; + s16 d; +}; + +struct Struct_2017810 { + u8 filler_0[6]; + u8 field_6; + u8 filler_7[5]; +}; + +struct Color { + u16 r:5; + u16 g:5; + u16 b:5; +}; + +struct Struct_sub_8078914 { + u8 *field_0; + u8 *field_4; + u8 field_8; +}; + +struct BGCnt { + u16 priority:2; + u16 charBase:2; + u16 unused:2; + u16 mosaic:1; + u16 colorMode:1; + u16 screenBase:5; + u16 overflow:1; + u16 size:2; +}; + +#define BG1CNT (*(volatile struct BGCnt*)REG_ADDR_BG1CNT) +#define BG2CNT (*(volatile struct BGCnt*)REG_ADDR_BG2CNT) +#define BG3CNT (*(volatile struct BGCnt*)REG_ADDR_BG3CNT) + +extern struct OamData gOamData_837DF9C[]; +extern const union AnimCmd *const gDummySpriteAnimTable[]; +extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[]; + +extern struct Struct_unk_2019348 unk_2019348; +extern struct TransformStatus gTransformStatuses[]; +extern u16 gBattleMonPartyPositions[]; +extern u16 gBattleTypeFlags; +extern u32 gTransformPersonalities[NUM_BATTLE_SLOTS]; +extern u8 gBattleMonForms[NUM_BATTLE_SLOTS]; +extern u16 gUnknown_0202F7CA[]; +extern u8 gBattleMonSprites[NUM_BATTLE_SLOTS]; +extern u8 gBattleAnimPlayerMonIndex; +extern u8 gBattleAnimEnemyMonIndex; +extern s16 gBattleAnimArgs[8]; +extern u8 gBanksBySide[NUM_BATTLE_SLOTS]; +extern u8 gNoOfAllBanks; // gNumBattleMons? +extern struct OamMatrix gOamMatrices[]; +extern struct Struct_2017810 unk_2017810[]; +extern u8 gHappinessMoveAnim; + +EWRAM_DATA union AffineAnimCmd *gUnknown_0202F7D4 = NULL; +EWRAM_DATA u32 filler_0202F7D8[3] = {0}; + +const struct Struct_gUnknown_0837F578 gUnknown_0837F578[][4] = { + { + { 72, 80 }, + { 176, 40 }, + { 48, 40 }, + { 112, 80 }, + }, + { + { 32, 80 }, + { 200, 40 }, + { 90, 88 }, + { 152, 32 }, + }, +}; + +// One entry for each of the four Castform forms. +// Coords are probably front pic coords or back pic coords, but this data does not seem to be +// used during battle, party summary, or pokedex screens. +const struct MonCoords gCastformFrontSpriteCoords[] = { + { 0x44, 17 }, // NORMAL + { 0x66, 9 }, // SUN + { 0x46, 9 }, // RAIN + { 0x86, 8 }, // HAIL +}; + +const u8 gCastformElevations[] = { + 13, // NORMAL + 14, // SUN + 13, // RAIN + 13, // HAIL +}; + +// Y position of the backsprite for each of the four Castform forms. +const u8 gCastformBackSpriteYCoords[] = { + 0, // NORMAL + 0, // SUN + 0, // RAIN + 0, // HAIL +}; + +const struct SpriteTemplate gSpriteTemplate_837F5B0[] = { + { + .tileTag = 55125, + .paletteTag = 55125, + .oam = gOamData_837DF9C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, { + .tileTag = 55126, + .paletteTag = 55126, + .oam = gOamData_837DF9C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + } +}; + +const struct SpriteSheet gUnknown_0837F5E0[] = { + { gMiscBlank_Gfx, 0x800, 55125, }, + { gMiscBlank_Gfx, 0x800, 55126, }, +}; + + +u8 sub_8077ABC(u8 slot, u8 a2) { + u8 var; + u16 species; + struct TransformStatus *transform; + + if (IsContest()) { + if (a2 == 3 && slot == 3) { + a2 = 1; + } + } + switch (a2) { + case 0: + case 2: + var = gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_0; + break; + case 1: + var = gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_1; + break; + case 3: + case 4: + default: + if (IsContest()) { + if (unk_2019348.field_4 & 1) { + species = unk_2019348.field_2; + } else { + species = unk_2019348.field_0; + } + } else { + if (GetBankSide(slot)) { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); + } else { + species = transform->species; + } + } else { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); + } else { + species = transform->species; + } + } + } + if (a2 == 3) { + var = sub_8077E44(slot, species, 1); + } else { + var = sub_8077E44(slot, species, 0); + } + break; + } + return var; +} + +u8 sub_8077BFC(u8 slot, u16 species) { + u16 letter; + u32 personality; + struct TransformStatus *transform; + u8 ret; + u16 var; + + if (!GetBankSide(slot) || IsContest()) { + if (species == SPECIES_UNOWN) { + if (IsContest()) { + if (unk_2019348.field_4 & 1) { + personality = unk_2019348.field_10; + } else { + personality = unk_2019348.field_8; + } + } else { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + personality = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); + } else { + personality = gTransformPersonalities[slot]; + } + } + letter = GET_UNOWN_LETTER(personality); + if (!letter) { + var = species; + } else { + var = letter + SPECIES_UNOWN_B - 1; + } + ret = gMonBackPicCoords[var].y_offset; + } else if (species == SPECIES_CASTFORM) { + ret = gCastformBackSpriteYCoords[gBattleMonForms[slot]]; + } else if (species > NUM_SPECIES) { + ret = gMonBackPicCoords[0].y_offset; + } else { + ret = gMonBackPicCoords[species].y_offset; + } + } else { + if (species == SPECIES_UNOWN) { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + personality = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); + } else { + personality = gTransformPersonalities[slot]; + } + letter = GET_UNOWN_LETTER(personality); + if (!letter) { + var = species; + } else { + var = letter + SPECIES_UNOWN_B - 1; + } + ret = gMonFrontPicCoords[var].y_offset; + } else if (species == SPECIES_CASTFORM) { + ret = gCastformFrontSpriteCoords[gBattleMonForms[slot]].y_offset; + } else if (species > NUM_SPECIES) { + ret = gMonFrontPicCoords[0].y_offset; + } else { + ret = gMonFrontPicCoords[species].y_offset; + } + } + return ret; +} + +u8 sub_8077DD8(u8 slot, u16 species) { + u8 ret = 0; + if (GetBankSide(slot) == 1) { + if (!IsContest()) { + if (species == SPECIES_CASTFORM) { + ret = gCastformElevations[gBattleMonForms[slot]]; + } else if (species > NUM_SPECIES) { + ret = gEnemyMonElevation[0]; + } else { + ret = gEnemyMonElevation[species]; + } + } + } + return ret; +} + +u8 sub_8077E44(u8 slot, u16 species, u8 a3) { + u16 offset; + u8 y; + if (GetBankSide(slot) == 0 || IsContest()) { + offset = sub_8077BFC(slot, species); + } else { + offset = sub_8077BFC(slot, species); + offset -= sub_8077DD8(slot, species); + } + y = offset + gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_1; + if (a3) { + if (GetBankSide(slot) == 0) { + y += 8; + } + if (y > 104) y = 104; + } + return y; +} + +u8 sub_8077EE4(u8 slot, u8 a2) { + u16 species; + struct TransformStatus *transform; + if (a2 == 3 || a2 == 4) { + if (IsContest()) { + if (unk_2019348.field_4 & 1) { + species = unk_2019348.field_2; + } else { + species = unk_2019348.field_0; + } + } else { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = gUnknown_0202F7CA[slot]; + } else { + species = transform->species; + } + } + if (a2 == 3) { + return sub_8077E44(slot, species, 1); + } else { + return sub_8077E44(slot, species, 0); + } + } else { + return sub_8077ABC(slot, a2); + } +} + +u8 sub_8077F68(u8 slot) { + return sub_8077ABC(slot, 4); +} + +u8 sub_8077F7C(u8 slot) { + u16 var; + if (GetBankSide(slot)) { + var = sub_8077ABC(slot, 1) + 16; + } else { + var = sub_8077ABC(slot, 1) + 17; + } + return var; +} + +u8 sub_8077FC0(u8 slot) { + u16 var; + u8 r6; + struct TransformStatus *transform; + r6 = sub_8077ABC(slot, 1); + if (!IsContest()) { + if (GetBankSide(slot)) { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + var = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); + } else { + var = transform->species; + } + } else { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + var = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); + } else { + var = transform->species; + } + } + if (GetBankSide(slot)) { + r6 -= sub_8077DD8(slot, var); + } + } + return r6; +} + +u8 obj_id_for_side_relative_to_move(u8 a1) { + u8 *sprites; + if (a1 == 0) { + if (sub_8078874(gBattleAnimPlayerMonIndex)) { + sprites = gBattleMonSprites; + return sprites[gBattleAnimPlayerMonIndex]; + } else { + return 0xff; + } + } else if (a1 == 1) { + if (sub_8078874(gBattleAnimEnemyMonIndex)) { + sprites = gBattleMonSprites; + return sprites[gBattleAnimEnemyMonIndex]; + } else { + return 0xff; + } + } else if (a1 == 2) { + if (!b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) { + return 0xff; + } else { + return gBattleMonSprites[gBattleAnimPlayerMonIndex ^ 2]; + } + } else { + if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) { + return gBattleMonSprites[gBattleAnimEnemyMonIndex ^ 2]; + } else { + return 0xff; + } + } +} + +void oamt_set_x3A_32(struct Sprite *sprite, void (*callback)(struct Sprite*)) { + sprite->data6 = (u32)(callback) & 0xffff; + sprite->data7 = (u32)(callback) >> 16; +} + +void sub_8078104(struct Sprite *sprite) { + u32 callback = (u16)sprite->data6 | (sprite->data7 << 16); + sprite->callback = (void (*)(struct Sprite *))callback; +} + +void sub_8078114(struct Sprite *sprite) { + if (sprite->data3) { + sprite->pos2.x = Sin(sprite->data0, sprite->data1); + sprite->pos2.y = Cos(sprite->data0, sprite->data1); + sprite->data0 += sprite->data2; + if (sprite->data0 >= 0x100) { + sprite->data0 -= 0x100; + } else if (sprite->data0 < 0) { + sprite->data0 += 0x100; + } + sprite->data3--; + } else { + sub_8078104(sprite); + } +} + +void sub_8078174(struct Sprite *sprite) { + if (sprite->data3) { + sprite->pos2.x = Sin(sprite->data0, (sprite->data5 >> 8) + sprite->data1); + sprite->pos2.y = Cos(sprite->data0, (sprite->data5 >> 8) + sprite->data1); + sprite->data0 += sprite->data2; + sprite->data5 += sprite->data4; + if (sprite->data0 >= 0x100) { + sprite->data0 -= 0x100; + } else if (sprite->data0 < 0) { + sprite->data0 += 0x100; + } + sprite->data3--; + } else { + sub_8078104(sprite); + } +} + +void unref_sub_80781F0(struct Sprite *sprite) { + if (sprite->data3) { + sprite->pos2.x = Sin(sprite->data0, sprite->data1); + sprite->pos2.y = Cos(sprite->data4, sprite->data1); + sprite->data0 += sprite->data2; + sprite->data4 += sprite->data5; + if (sprite->data0 >= 0x100) { + sprite->data0 -= 0x100; + } else if (sprite->data0 < 0) { + sprite->data0 += 0x100; + } + if (sprite->data4 >= 0x100) { + sprite->data4 -= 0x100; + } else if (sprite->data4 < 0) { + sprite->data4 += 0x100; + } + sprite->data3--; + } else { + sub_8078104(sprite); + } +} + +void sub_8078278(struct Sprite *sprite) { + if (sprite->data3) { + sprite->pos2.x = Sin(sprite->data0, sprite->data1); + sprite->pos2.y = Cos(sprite->data0, sprite->data4); + sprite->data0 += sprite->data2; + if (sprite->data0 >= 0x100) { + sprite->data0 -= 0x100; + } else if (sprite->data0 < 0) { + sprite->data0 += 0x100; + } + sprite->data3--; + } else { + sub_8078104(sprite); + } +} + +void sub_80782D8(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + } else { + sub_8078104(sprite); + } +} + +void sub_80782F8(struct Sprite *sprite) { + sub_8078314(sprite); + sprite->callback = sub_8078364; + sprite->callback(sprite); +} + +void sub_8078314(struct Sprite *sprite) { + s16 old; + int v1; + if (sprite->data1 > sprite->data2) { + sprite->data0 = -sprite->data0; + } + v1 = sprite->data2 - sprite->data1; + old = sprite->data0; + sprite->data0 = abs(v1 / sprite->data0); + sprite->data2 = (sprite->data4 - sprite->data3) / sprite->data0; + sprite->data1 = old; +} + +void sub_8078364(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + sprite->pos2.x += sprite->data1; + sprite->pos2.y += sprite->data2; + } else { + sub_8078104(sprite); + } +} + +void sub_8078394(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + sprite->data3 += sprite->data1; + sprite->data4 += sprite->data2; + sprite->pos2.x = sprite->data3 >> 8; + sprite->pos2.y = sprite->data4 >> 8; + } else { + sub_8078104(sprite); + } +} + +void sub_80783D0(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + sprite->data3 += sprite->data1; + sprite->data4 += sprite->data2; + sprite->pos2.x = sprite->data3 >> 8; + sprite->pos2.y = sprite->data4 >> 8; + } else { + sub_8078104(sprite); + } + UpdateMonIconFrame(sprite); +} + +void unref_sub_8078414(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x + sprite->pos2.x; + sprite->data3 = sprite->pos1.y + sprite->pos2.y; + sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2); + sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3); + sprite->callback = sub_80782F8; +} + +void sub_8078458(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + gSprites[sprite->data3].pos2.x += sprite->data1; + gSprites[sprite->data3].pos2.y += sprite->data2; + } else { + sub_8078104(sprite); + } +} + +void sub_80784A8(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + sprite->data3 += sprite->data1; + sprite->data4 += sprite->data2; + gSprites[sprite->data5].pos2.x = sprite->data3 >> 8; + gSprites[sprite->data5].pos2.y = sprite->data4 >> 8; + } else { + sub_8078104(sprite); + } +} + +void sub_8078504(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + sprite->pos2.x = sprite->data2 >> 8; + sprite->data2 += sprite->data1; + sprite->pos2.y = sprite->data4 >> 8; + sprite->data4 += sprite->data3; + if (sprite->data0 % sprite->data5 == 0) { + if (sprite->data5) { + sprite->invisible ^= 1; + } + } + } else { + sub_8078104(sprite); + } +} + +void move_anim_8074EE0(struct Sprite *sprite) { + FreeSpriteOamMatrix(sprite); + move_anim_8072740(sprite); +} + +void unref_sub_8078588(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x + sprite->pos2.x; + sprite->data3 = sprite->pos1.y + sprite->pos2.y; + sprite->data2 = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); + sprite->data4 = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); + sprite->callback = sub_80782F8; +} + +void unref_sub_80785CC(struct Sprite *sprite) { + ResetPaletteStructByUid(sprite->data5); + move_anim_8074EE0(sprite); +} + +void sub_80785E4(struct Sprite *sprite) { + if (sprite->affineAnimEnded) { + sub_8078104(sprite); + } +} + +void sub_8078600(struct Sprite *sprite) { + if (sprite->animEnded) { + sub_8078104(sprite); + } +} + +void sub_807861C(struct Sprite *sprite) { + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + move_anim_8072740(sprite); +} + +void sub_8078634(u8 task) { + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyAnimVisualTask(task); +} + +void sub_8078650(struct Sprite *sprite) { + sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); + sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); +} + +void sub_807867C(struct Sprite *sprite, s16 a2) { + u16 v1 = sub_8077ABC(gBattleAnimPlayerMonIndex, 0); + u16 v2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 0); + if (v1 > v2) { + sprite->pos1.x -= a2; + } else if (v1 < v2) { + sprite->pos1.x += a2; + } else { + if (GetBankSide(gBattleAnimPlayerMonIndex)) { + sprite->pos1.x -= a2; + } else { + sprite->pos1.x += a2; + } + } +} + +void sub_80786EC(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x; + sprite->data3 = sprite->pos1.y; + obj_translate_based_on_private_1_2_3_4(sprite); + sprite->data6 = 0x8000 / sprite->data0; + sprite->data7 = 0; +} + +bool8 sub_8078718(struct Sprite *sprite) { + if (sub_8078B5C(sprite)) { + return TRUE; + } + sprite->data7 += sprite->data6; + sprite->pos2.y += Sin((u8)(sprite->data7 >> 8), sprite->data5); + return FALSE; +} + +void oamt_add_pos2_onto_pos1(struct Sprite *sprite) { + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; +} + +void sub_8078764(struct Sprite *sprite, u8 a2) { + if (!a2) { + sprite->pos1.x = sub_8077EE4(gBattleAnimEnemyMonIndex, 0); + sprite->pos1.y = sub_8077EE4(gBattleAnimEnemyMonIndex, 1); + } + sub_807867C(sprite, gBattleAnimArgs[0]); + sprite->pos1.y += gBattleAnimArgs[1]; +} + +void sub_80787B0(struct Sprite *sprite, u8 a2) { + if (!a2) { + sprite->pos1.x = sub_8077EE4(gBattleAnimPlayerMonIndex, 0); + sprite->pos1.y = sub_8077EE4(gBattleAnimPlayerMonIndex, 1); + } else { + sprite->pos1.x = sub_8077EE4(gBattleAnimPlayerMonIndex, 2); + sprite->pos1.y = sub_8077EE4(gBattleAnimPlayerMonIndex, 3); + } + sub_807867C(sprite, gBattleAnimArgs[0]); + sprite->pos1.y += gBattleAnimArgs[1]; +} + +u8 GetBankSide(u8 slot) { + return gBanksBySide[slot] & 1; +} + +u8 GetBankIdentity(u8 slot) { + return gBanksBySide[slot]; +} + +u8 GetBankByPlayerAI(u8 slot) { + u8 i; + for (i = 0; i < gNoOfAllBanks; i++) { + if (gBanksBySide[i] == slot) { + break; + } + } + return i; +} + +bool8 sub_8078874(u8 slot) { + if (IsContest()) { + if (gBattleAnimPlayerMonIndex == slot) { + return TRUE; + } + if (gBattleAnimEnemyMonIndex == slot) { + return TRUE; + } + return FALSE; + } else { + if (gBanksBySide[slot] == 0xff) { + return FALSE; + } + if (GetBankSide(slot)) { + if (GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) { + return TRUE; + } + } else { + if (GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) { + return TRUE; + } + } + return FALSE; + } +} + +bool8 IsDoubleBattle() { + return IS_DOUBLE_BATTLE(); +} + +void sub_8078914(struct Struct_sub_8078914 *unk) { + if (IsContest()) { + unk->field_0 = (u8 *)0x6008000; + unk->field_4 = (u8 *)0x600f000; + unk->field_8 = 0xe; + } else { + unk->field_0 = (u8 *)0x6004000; + unk->field_4 = (u8 *)0x600e000; + unk->field_8 = 0x8; + } +} + +void sub_8078954(struct Struct_sub_8078914 *unk) { + if (IsContest()) { + unk->field_0 = (u8 *)0x6008000; + unk->field_4 = (u8 *)0x600f000; + unk->field_8 = 0xe; + } else if (GetBankIdentity_permutated(gBattleAnimPlayerMonIndex) == 1) { + unk->field_0 = (u8 *)0x6004000; + unk->field_4 = (u8 *)0x600e000; + unk->field_8 = 0x8; + } else { + unk->field_0 = (u8 *)0x6006000; + unk->field_4 = (u8 *)0x600f000; + unk->field_8 = 0x9; + } +} + +u8 sub_80789BC() { + if (IsContest()) { + return 1; + } + return 2; +} + +void sub_80789D4(bool8 a1) { + if (!a1) { + BG3CNT.size = 0; + BG3CNT.overflow = 1; + } else if (IsContest()) { + BG3CNT.size = 0; + BG3CNT.overflow = 1; + } else { + BG3CNT.size = 1; + BG3CNT.overflow = 0; + } +} + +void sub_8078A34(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x; + sprite->data3 = sprite->pos1.y; + sub_8078A5C(sprite); + sprite->callback = sub_80783D0; + sprite->callback(sprite); +} + +void sub_8078A5C(struct Sprite *sprite) { + s16 x = (sprite->data2 - sprite->data1) << 8; + s16 y = (sprite->data4 - sprite->data3) << 8; + sprite->data1 = x / sprite->data0; + sprite->data2 = y / sprite->data0; + sprite->data4 = 0; + sprite->data3 = 0; +} + +void obj_translate_based_on_private_1_2_3_4(struct Sprite *sprite) { + int x = sprite->data2 - sprite->data1; + int y = sprite->data4 - sprite->data3; + bool8 r8 = x < 0; + bool8 r9 = y < 0; + u16 x2 = abs(x) << 8; + u16 y2 = abs(y) << 8; + x2 = x2 / sprite->data0; + y2 = y2 / sprite->data0; + if (r8) { + x2 |= 1; + } else { + x2 &= ~1; + } + if (r9) { + y2 |= 1; + } else { + y2 &= ~1; + } + sprite->data1 = x2; + sprite->data2 = y2; + sprite->data4 = 0; + sprite->data3 = 0; +} + +void sub_8078B34(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x; + sprite->data3 = sprite->pos1.y; + obj_translate_based_on_private_1_2_3_4(sprite); + sprite->callback = sub_8078BB8; + sprite->callback(sprite); +} + +bool8 sub_8078B5C(struct Sprite *sprite) { + u16 v1, v2, x, y; + if (!sprite->data0) { + return TRUE; + } + v1 = sprite->data1; + v2 = sprite->data2; + x = sprite->data3; + y = sprite->data4; + x += v1; + y += v2; + if (v1 & 1) { + sprite->pos2.x = -(x >> 8); + } else { + sprite->pos2.x = x >> 8; + } + if (v2 & 1) { + sprite->pos2.y = -(y >> 8); + } else { + sprite->pos2.y = y >> 8; + } + sprite->data3 = x; + sprite->data4 = y; + sprite->data0--; + return FALSE; +} + +void sub_8078BB8(struct Sprite *sprite) { + if (sub_8078B5C(sprite)) { + sub_8078104(sprite); + } +} + +void sub_8078BD4(struct Sprite *sprite) { + int v1 = abs(sprite->data2 - sprite->data1) << 8; + sprite->data0 = v1 / sprite->data0; + obj_translate_based_on_private_1_2_3_4(sprite); +} + +void sub_8078C00(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x; + sprite->data3 = sprite->pos1.y; + sub_8078BD4(sprite); + sprite->callback = sub_8078BB8; + sprite->callback(sprite); +} + +void sub_8078C28(struct Sprite *sprite) { + int x = sprite->data2 - sprite->data1; + int y = sprite->data4 - sprite->data3; + bool8 x_sign = x < 0; + bool8 y_sign = y < 0; + u16 x2 = abs(x) << 4; + u16 y2 = abs(y) << 4; + x2 /= sprite->data0; + y2 /= sprite->data0; + if (x_sign) { + x2 |= 1; + } else { + x2 &= ~1; + } + if (y_sign) { + y2 |= 1; + } else { + y2 &= ~1; + } + sprite->data1 = x2; + sprite->data2 = y2; + sprite->data4 = 0; + sprite->data3 = 0; +} + +void sub_8078CC0(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x; + sprite->data3 = sprite->pos1.y; + sub_8078C28(sprite); + sprite->callback = sub_8078D44; + sprite->callback(sprite); +} + +bool8 sub_8078CE8(struct Sprite *sprite) { + u16 v1, v2, x, y; + if (!sprite->data0) { + return TRUE; + } + v1 = sprite->data1; + v2 = sprite->data2; + x = sprite->data3; + y = sprite->data4; + x += v1; + y += v2; + if (v1 & 1) { + sprite->pos2.x = -(x >> 4); + } else { + sprite->pos2.x = x >> 4; + } + if (v2 & 1) { + sprite->pos2.y = -(y >> 4); + } else { + sprite->pos2.y = y >> 4; + } + sprite->data3 = x; + sprite->data4 = y; + sprite->data0--; + return FALSE; +} + +void sub_8078D44(struct Sprite *sprite) { + if (sub_8078CE8(sprite)) { + sub_8078104(sprite); + } +} + +void sub_8078D60(struct Sprite *sprite) { + int v1 = abs(sprite->data2 - sprite->data1) << 4; + sprite->data0 = v1 / sprite->data0; + sub_8078C28(sprite); +} + +void sub_8078D8C(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x; + sprite->data3 = sprite->pos1.y; + sub_8078D60(sprite); + sprite->callback = sub_8078D44; + sprite->callback(sprite); +} + +void obj_id_set_rotscale(u8 sprite, s16 xScale, s16 yScale, u16 rotation) { + int i; + struct ObjAffineSrcData src; + struct OamMatrix matrix; + src.xScale = xScale; + src.yScale = yScale; + src.rotation = rotation; + if (sub_8078E38()) { + src.xScale = -src.xScale; + } + i = gSprites[sprite].oam.matrixNum; + ObjAffineSet(&src, &matrix, 1, 2); + gOamMatrices[i].a = matrix.a; + gOamMatrices[i].b = matrix.b; + gOamMatrices[i].c = matrix.c; + gOamMatrices[i].d = matrix.d; +} + +bool8 sub_8078E38() { + if (IsContest()) { + if (gSprites[obj_id_for_side_relative_to_move(0)].data2 == 0xc9 /* XXX SPECIES_UNOWN? */) { + return FALSE; + } + return TRUE; + } + return FALSE; +} + +void sub_8078E70(u8 sprite, u8 a2) { + struct Struct_2017810 *unk; + u8 r7 = gSprites[sprite].data0; + if (IsContest() || b_side_obj__get_some_boolean(r7)) { + gSprites[sprite].invisible = FALSE; + } + gSprites[sprite].oam.objMode = a2; + gSprites[sprite].affineAnimPaused = TRUE; + if (!IsContest() && !gSprites[sprite].oam.affineMode) { + unk = &unk_2017810[r7]; + gSprites[sprite].oam.matrixNum = unk->field_6; + } + gSprites[sprite].oam.affineMode = 3; + CalcCenterToCornerVec(&gSprites[sprite], gSprites[sprite].oam.shape, gSprites[sprite].oam.size, gSprites[sprite].oam.affineMode); +} + +void sub_8078F40(u8 sprite) { + obj_id_set_rotscale(sprite, 0x100, 0x100, 0); + gSprites[sprite].oam.affineMode = 1; + gSprites[sprite].oam.objMode = 0; + gSprites[sprite].affineAnimPaused = FALSE; + CalcCenterToCornerVec(&gSprites[sprite], gSprites[sprite].oam.shape, gSprites[sprite].oam.size, gSprites[sprite].oam.affineMode); +} + +void sub_8078F9C(u8 sprite) { + u16 matrix = gSprites[sprite].oam.matrixNum; + s16 c = gOamMatrices[matrix].c; + if (c < 0) { + c = -c; + } + gSprites[sprite].pos2.y = c >> 3; +} + +// related to obj_id_set_rotscale +void sub_8078FDC(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 rotation) { + int i; + struct ObjAffineSrcData src; + struct OamMatrix matrix; + if (sprite->oam.affineMode & 1) { + sprite->affineAnimPaused = TRUE; + if (a2) { + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); + } + src.xScale = xScale; + src.yScale = yScale; + src.rotation = rotation; + if (sub_8078E38()) { + src.xScale = -src.xScale; + } + i = sprite->oam.matrixNum; + ObjAffineSet(&src, &matrix, 1, 2); + gOamMatrices[i].a = matrix.a; + gOamMatrices[i].b = matrix.b; + gOamMatrices[i].c = matrix.c; + gOamMatrices[i].d = matrix.d; + } +} + +void sub_8079098(struct Sprite *sprite) { + sub_8078FDC(sprite, TRUE, 0x100, 0x100, 0); + sprite->affineAnimPaused = FALSE; + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); +} + +u16 sub_80790D8(s16 a, s16 b) { + return ArcTan2(a, b); +} + +u16 sub_80790F0(s16 a, s16 b) { + u16 var = sub_80790D8(a, b); + return -var; +} + +void sub_8079108(u16 a1, bool8 a2) { + int i; + struct Color *c; + struct Color *c2; + u16 average; + + a1 *= 0x10; + + if (!a2) { + for (i = 0; i < 0x10; i++) { + c = (struct Color *)&gPlttBufferUnfaded[a1 + i]; + average = c->r + c->g + c->b; + average /= 3; + + c2 = (struct Color *)&gPlttBufferFaded[a1 + i]; + c2->r = average; + c2->g = average; + c2->b = average; + } + } else { + CpuCopy32(&gPlttBufferUnfaded[a1], &gPlttBufferFaded[a1], 0x20); + } +} + +u32 sub_80791A8(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) { + u32 var = 0; + u32 shift; + if (a1) { + if (!IsContest()) { + var = 0xe; + } else { + var = 1 << sub_80789BC(); + } + } + if (a2) { + shift = gBattleAnimPlayerMonIndex + 16; + var |= 1 << shift; + } + if (a3) { + shift = gBattleAnimEnemyMonIndex + 16; + var |= 1 << shift; + } + if (a4) { + if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) { + shift = (gBattleAnimPlayerMonIndex ^ 2) + 16; + var |= 1 << shift; + } + } + if (a5) { + if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) { + shift = (gBattleAnimEnemyMonIndex ^ 2) + 16; + var |= 1 << shift; + } + } + if (a6) { + if (!IsContest()) { + var |= 0x100; + } else { + var |= 0x4000; + } + } + if (a7) { + if (!IsContest()) { + var |= 0x200; + } + } + return var; +} + +u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4) { + u32 var = 0; + u32 shift; + if (IsContest()) { + if (a1) { + var |= 1 << 18; + return var; + } + } else { + if (a1) { + if (b_side_obj__get_some_boolean(GetBankByPlayerAI(0))) { + var |= 1 << (GetBankByPlayerAI(0) + 16); + } + } + if (a2) { + if (b_side_obj__get_some_boolean(GetBankByPlayerAI(2))) { + shift = GetBankByPlayerAI(2) + 16; + var |= 1 << shift; + } + } + if (a3) { + if (b_side_obj__get_some_boolean(GetBankByPlayerAI(1))) { + shift = GetBankByPlayerAI(1) + 16; + var |= 1 << shift; + } + } + if (a4) { + if (b_side_obj__get_some_boolean(GetBankByPlayerAI(3))) { + shift = GetBankByPlayerAI(3) + 16; + var |= 1 << shift; + } + } + } + return var; +} + +u8 sub_80793A8(u8 a1) { + return a1; +} + +u8 unref_sub_80793B0(u8 a1) { + return GetBankByPlayerAI(a1); +} + +void sub_80793C4(struct Sprite *sprite) { + bool8 var; + if (!sprite->data0) { + if (!gBattleAnimArgs[3]) { + var = TRUE; + } else { + var = FALSE; + } + if (!gBattleAnimArgs[2]) { + sub_80787B0(sprite, var); + } else { + sub_8078764(sprite, var); + } + sprite->data0++; + + } else if (sprite->animEnded || sprite->affineAnimEnded) { + move_anim_8074EE0(sprite); + } +} + +void sub_807941C(struct Sprite *sprite) { + bool8 v1; + u8 v2; + if (!(gBattleAnimArgs[5] & 0xff00)) { + v1 = TRUE; + } else { + v1 = FALSE; + } + if (!(gBattleAnimArgs[5] & 0xff)) { + v2 = 3; + } else { + v2 = 1; + } + sub_80787B0(sprite, v1); + if (GetBankSide(gBattleAnimPlayerMonIndex)) { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + sprite->data0 = gBattleAnimArgs[4]; + sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) + gBattleAnimArgs[2]; + sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, v2) + gBattleAnimArgs[3]; + sprite->callback = sub_8078B34; + oamt_set_x3A_32(sprite, move_anim_8072740); +} + +void sub_80794A8(struct Sprite *sprite) { + sub_80787B0(sprite, 1); + if (GetBankSide(gBattleAnimPlayerMonIndex)) { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + sprite->data0 = gBattleAnimArgs[4]; + sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) + gBattleAnimArgs[2]; + sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3) + gBattleAnimArgs[3]; + sprite->data5 = gBattleAnimArgs[5]; + sub_80786EC(sprite); + sprite->callback = sub_8079518; +} + +void sub_8079518(struct Sprite *sprite) { + if (sub_8078718(sprite)) { + move_anim_8072740(sprite); + } +} + +void sub_8079534(struct Sprite *sprite) { + u8 r4, slot, r7; + if (!gBattleAnimArgs[6]) { + r4 = 1; + r7 = 3; + } else { + r4 = 0; + r7 = 1; + } + if (!gBattleAnimArgs[5]) { + sub_80787B0(sprite, r4); + slot = gBattleAnimPlayerMonIndex; + } else { + sub_8078764(sprite, r4); + slot = gBattleAnimEnemyMonIndex; + } + if (GetBankSide(gBattleAnimPlayerMonIndex)) { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + sub_8078764(sprite, r4); + sprite->data0 = gBattleAnimArgs[4]; + sprite->data2 = sub_8077ABC(slot, 2) + gBattleAnimArgs[2]; + sprite->data4 = sub_8077ABC(slot, r7) + gBattleAnimArgs[3]; + sprite->callback = sub_8078B34; + oamt_set_x3A_32(sprite, move_anim_8072740); +} + +s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 a1) { + u16 i; + u8 sprite = obj_id_for_side_relative_to_move(a1); + if (sprite != 0xff) { + for (i = 0; i < 0x40; i++) { + if (gSprites[i].inUse) { + continue; + } + gSprites[i] = gSprites[sprite]; + gSprites[i].oam.objMode = 1; + gSprites[i].invisible = FALSE; + return i; + } + } + return -1; +} + +void obj_delete_but_dont_free_vram(struct Sprite *sprite) { + sprite->usingSheet = TRUE; + DestroySprite(sprite); +} + +void sub_8079670(u8 task) { + s16 v1 = 0; + s16 v2 = 0; + if (gBattleAnimArgs[2] > gBattleAnimArgs[0]) { + v2 = 1; + } + if (gBattleAnimArgs[2] < gBattleAnimArgs[0]) { + v2 = -1; + } + if (gBattleAnimArgs[3] > gBattleAnimArgs[1]) { + v1 = 1; + } + if (gBattleAnimArgs[3] < gBattleAnimArgs[1]) { + v1 = -1; + } + gTasks[task].data[0] = 0; + gTasks[task].data[1] = gBattleAnimArgs[4]; + gTasks[task].data[2] = 0; + gTasks[task].data[3] = gBattleAnimArgs[0]; + gTasks[task].data[4] = gBattleAnimArgs[1]; + gTasks[task].data[5] = v2; + gTasks[task].data[6] = v1; + gTasks[task].data[7] = gBattleAnimArgs[2]; + gTasks[task].data[8] = gBattleAnimArgs[3]; + REG_BLDALPHA = (gBattleAnimArgs[1] << 8) | gBattleAnimArgs[0]; + gTasks[task].func = sub_80796F8; +} + +void sub_80796F8(u8 taskId) { + struct Task *task = &gTasks[taskId]; + if (++task->data[0] > task->data[1]) { + task->data[0] = 0; + if (++task->data[2] & 1) { + if (task->data[3] != task->data[7]) { + task->data[3] += task->data[5]; + } + } else { + if (task->data[4] != task->data[8]) { + task->data[4] += task->data[6]; + } + } + REG_BLDALPHA = (task->data[4] << 8) | task->data[3]; + if (task->data[3] == task->data[7] && task->data[4] == task->data[8]) { + DestroyAnimVisualTask(taskId); + return; + } + } +} + +void sub_8079790(u8 task) { + u8 sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + if (sprite == 0xff) { + DestroyAnimVisualTask(task); + return; + } + gTasks[task].data[0] = (gSprites[sprite].oam.paletteNum * 0x10) + 0x101; + sub_80797EC(&gTasks[task]); +} + +void sub_80797EC(struct Task *task) { + task->data[1] = gBattleAnimArgs[1]; + task->data[2] = 0; + task->data[3] = gBattleAnimArgs[2]; + task->data[4] = 0; + task->data[5] = gBattleAnimArgs[3]; + task->data[6] = 0; + task->data[7] = gBattleAnimArgs[4]; + task->func = sub_8079814; +} + +void sub_8079814(u8 taskId) { + struct Task *task = &gTasks[taskId]; + if (++task->data[4] >= task->data[5]) { + task->data[4] = 0; + if (!task->data[6]) { + task->data[2]++; + BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]); + if (task->data[2] == task->data[3]) { + task->data[6] = 1; + } + } else { + task->data[2]--; + BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]); + if (!task->data[2]) { + if (--task->data[7]) { + task->data[4] = 0; + task->data[6] = 0; + } else { + DestroyAnimVisualTask(taskId); + return; + } + } + } + } +} + +void sub_80798AC(u8 task) { + u8 palette = IndexOfSpritePaletteTag(gBattleAnimArgs[0]); + if (palette == 0xff) { + DestroyAnimVisualTask(task); + return; + } + gTasks[task].data[0] = (palette * 0x10) + 0x101; + sub_80797EC(&gTasks[task]); +} + +void sub_80798F4(struct Task *task, u8 a2, void *a3) { + task->data[7] = 0; + task->data[8] = 0; + task->data[9] = 0; + task->data[15] = a2; + task->data[10] = 0x100; + task->data[11] = 0x100; + task->data[12] = 0; + sub_8079BF4(&task->data[13], &task->data[14], a3); + sub_8078E70(a2, 0); +} + +bool8 sub_807992C(struct Task *task) { + gUnknown_0202F7D4 = sub_8079BFC(task->data[13], task->data[14]) + (task->data[7] << 3); + switch (gUnknown_0202F7D4->type) { + default: + if (!gUnknown_0202F7D4->frame.duration) { + task->data[10] = gUnknown_0202F7D4->frame.xScale; + task->data[11] = gUnknown_0202F7D4->frame.yScale; + task->data[12] = gUnknown_0202F7D4->frame.rotation; + task->data[7]++; + gUnknown_0202F7D4++; + } + task->data[10] += gUnknown_0202F7D4->frame.xScale; + task->data[11] += gUnknown_0202F7D4->frame.yScale; + task->data[12] += gUnknown_0202F7D4->frame.rotation; + obj_id_set_rotscale(task->data[15], task->data[10], task->data[11], task->data[12]); + sub_8079A64(task->data[15]); + if (++task->data[8] >= gUnknown_0202F7D4->frame.duration) { + task->data[8] = 0; + task->data[7]++; + } + break; + + case AFFINEANIMCMDTYPE_JUMP: + task->data[7] = gUnknown_0202F7D4->jump.target; + break; + + case AFFINEANIMCMDTYPE_LOOP: + if (gUnknown_0202F7D4->loop.count) { + if (task->data[9]) { + if (!--task->data[9]) { + task->data[7]++; + break; + } + } else { + task->data[9] = gUnknown_0202F7D4->loop.count; + } + if (!task->data[7]) { + break; + } + for (;;) { + task->data[7]--; + gUnknown_0202F7D4--; + if (gUnknown_0202F7D4->type == AFFINEANIMCMDTYPE_LOOP) { + task->data[7]++; + return TRUE; + } + if (!task->data[7]) { + return TRUE; + } + } + } + task->data[7]++; + break; + + case 0x7fff: + gSprites[task->data[15]].pos2.y = 0; + sub_8078F40(task->data[15]); + return FALSE; + } + + return TRUE; +} + +void sub_8079A64(u8 sprite) { + int var = 0x40 - sub_8079B10(sprite) * 2; + u16 matrix = gSprites[sprite].oam.matrixNum; + int var2 = (var << 8) / gOamMatrices[matrix].d; + if (var2 > 0x80) { + var2 = 0x80; + } + gSprites[sprite].pos2.y = (var - var2) / 2; +} + +void sub_8079AB8(u8 sprite, u8 sprite2) { + int var = 0x40 - sub_8079B10(sprite2) * 2; + u16 matrix = gSprites[sprite].oam.matrixNum; + int var2 = (var << 8) / gOamMatrices[matrix].d; + if (var2 > 0x80) { + var2 = 0x80; + } + gSprites[sprite].pos2.y = (var - var2) / 2; +} + +u16 sub_8079B10(u8 sprite) { + struct TransformStatus *transform; + u8 slot = gSprites[sprite].data0; + u16 species; + u16 i; + for (i = 0; i < (sizeof(gBattleMonSprites) / sizeof(u8)); i++) { + if (gBattleMonSprites[i] == sprite) { + if (IsContest()) { + species = unk_2019348.field_0; + return gMonBackPicCoords[species].y_offset; + } else { + if (!GetBankSide(i)) { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[i]], MON_DATA_SPECIES); + } else { + species = transform->species; + } + return gMonBackPicCoords[species].y_offset; + } else { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[i]], MON_DATA_SPECIES); + } else { + species = transform->species; + } + return gMonFrontPicCoords[species].y_offset; + } + } + } + } + return 0x40; +} + +void sub_8079BF4(s16 *bottom, s16 *top, void *ptr) { + *bottom = ((intptr_t) ptr) & 0xffff; + *top = (((intptr_t) ptr) >> 16) & 0xffff; +} + +void *sub_8079BFC(s16 bottom, s16 top) { + return (void *)((u16)bottom | ((u16)top << 16)); +} + + +// possible new file + +void sub_8079C08(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7) { + task->data[8] = a7; + task->data[15] = a2; + task->data[9] = a3; + task->data[10] = a4; + task->data[13] = a5; + task->data[14] = a6; + task->data[11] = (a5 - a3) / a7; + task->data[12] = (a6 - a4) / a7; +} + +u8 sub_8079C74(struct Task *task) { + if (!task->data[8]) { + return 0; + } + if (--task->data[8]) { + task->data[9] += task->data[11]; + task->data[10] += task->data[12]; + } else { + task->data[9] = task->data[13]; + task->data[10] = task->data[14]; + } + obj_id_set_rotscale(task->data[15], task->data[9], task->data[10], 0); + if (task->data[8]) { + sub_8079A64(task->data[15]); + } else { + gSprites[task->data[15]].pos2.y = 0; + } + return task->data[8]; +} + +void sub_8079CEC(u8 task) { + u16 v1; + if (gHappinessMoveAnim <= 30) { + v1 = 0; + } else if (gHappinessMoveAnim <= 100) { + v1 = 1; + } else if (gHappinessMoveAnim <= 200) { + v1 = 2; + } else { + v1 = 3; + } + gBattleAnimArgs[7] = v1; + DestroyAnimVisualTask(task); +} + +void unref_sub_8079D20(u8 priority) { + if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex)) { + gSprites[gBattleMonSprites[gBattleAnimEnemyMonIndex]].oam.priority = priority; + } + if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex)) { + gSprites[gBattleMonSprites[gBattleAnimPlayerMonIndex]].oam.priority = priority; + } + if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) { + gSprites[gBattleMonSprites[gBattleAnimEnemyMonIndex ^ 2]].oam.priority = priority; + } + if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) { + gSprites[gBattleMonSprites[gBattleAnimPlayerMonIndex ^ 2]].oam.priority = priority; + } +} + +void sub_8079E24() { + int i; + for (i = 0; i < gNoOfAllBanks; i++) { + if (b_side_obj__get_some_boolean(i)) { + gSprites[gBattleMonSprites[i]].subpriority = sub_8079E90(i); + gSprites[gBattleMonSprites[i]].oam.priority = 2; + } + } +} + +u8 sub_8079E90(u8 slot) { + u8 status; + u8 ret; + if (IsContest()) { + if (slot == 2) { + return 30; + } else { + return 40; + } + } else { + status = GetBankIdentity(slot); + if (status == 0) { + ret = 30; + } else if (status == 2) { + ret = 20; + } else if (status == 1) { + ret = 40; + } else { + ret = 50; + } + } + return ret; +} + +u8 sub_8079ED4(u8 slot) { + u8 status = GetBankIdentity(slot); + if (IsContest()) { + return 2; + } + if (status == 0 || status == 3) { + return BG2CNT.priority; + } else { + return BG1CNT.priority; + } +} + +u8 GetBankIdentity_permutated(u8 slot) { + u8 status; + if (!IsContest()) { + status = GetBankIdentity(slot); + if (status == 0 || status == 3) { + return 2; + } else { + return 1; + } + } + return 1; +} + +u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, u32 a8) { + void *src; + void *dest; + int size; + + u8 sprite; + u16 sheet = LoadSpriteSheet(&gUnknown_0837F5E0[a3]); + u16 palette = AllocSpritePalette(gSpriteTemplate_837F5B0[a3].paletteTag); + if (!isBackpic) { + LoadCompressedPalette(species_and_otid_get_pal(species, a8, a7), (palette * 0x10) + 0x100, 0x20); + LoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, + gMonFrontPicCoords[species].y_offset, + 0x2000000, + (void *)0x2000000, + species, + a7, + 1 + ); + } else { + LoadCompressedPalette( + species_and_otid_get_pal(species, a8, a7), (palette * 0x10) + 0x100, 0x20); + LoadSpecialPokePic( + &gMonBackPicTable[species], + gMonBackPicCoords[species].coords, + gMonBackPicCoords[species].y_offset, + 0x2000000, + (void *)0x2000000, + species, + a7, + 0 + ); + } + + src = (void *)0x2000000; + dest = (void *)(0x6010000 + (sheet * 0x20)); + size = 0x800; + DmaCopy32(3, src, dest, size); + + if (!isBackpic) { + sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonFrontPicCoords[species].y_offset, a6); + } else { + sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonBackPicCoords[species].y_offset, a6); + } + if (IsContest()) { + gSprites[sprite].affineAnims = &gSpriteAffineAnimTable_81E7C18; + StartSpriteAffineAnim(&gSprites[sprite], 0); + } + return sprite; +} + +void sub_807A0F4(struct Sprite *sprite) { + DestroySpriteAndFreeResources(sprite); +} + +int sub_807A100(u8 slot, u8 a2) { + u16 species; + u32 personality; + u16 letter; + u16 var; + int ret; + const struct MonCoords *coords; + struct TransformStatus *transform; + if (IsContest()) { + if (unk_2019348.field_4 & 1) { + species = unk_2019348.field_2; + personality = unk_2019348.field_10; + } else { + species = unk_2019348.field_0; + personality = unk_2019348.field_8; + } + if (species == SPECIES_UNOWN) { + letter = GET_UNOWN_LETTER(personality); + if (!letter) { + var = SPECIES_UNOWN; + } else { + var = letter + SPECIES_UNOWN_B - 1; + } + coords = &gMonBackPicCoords[var]; + } else if (species == SPECIES_CASTFORM) { + coords = &gCastformFrontSpriteCoords[gBattleMonForms[slot]]; + } else if (species <= SPECIES_EGG) { + coords = &gMonBackPicCoords[species]; + } else { + coords = &gMonBackPicCoords[0]; + } + } else { + if (!GetBankSide(slot)) { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); + personality = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); + } else { + species = transform->species; + personality = gTransformPersonalities[slot]; + } + if (species == SPECIES_UNOWN) { + letter = GET_UNOWN_LETTER(personality); + if (!letter) { + var = SPECIES_UNOWN; + } else { + var = letter + SPECIES_UNOWN_B - 1; + } + coords = &gMonBackPicCoords[var]; + } else if (species > SPECIES_EGG) { + coords = &gMonBackPicCoords[0]; + } else { + coords = &gMonBackPicCoords[species]; + } + } else { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); + personality = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); + } else { + species = transform->species; + personality = gTransformPersonalities[slot]; + } + if (species == SPECIES_UNOWN) { + letter = GET_UNOWN_LETTER(personality); + if (!letter) { + var = SPECIES_UNOWN; + } else { + var = letter + SPECIES_UNOWN_B - 1; + } + coords = &gMonFrontPicCoords[var]; + } else if (species == SPECIES_CASTFORM) { + coords = &gCastformFrontSpriteCoords[gBattleMonForms[slot]]; + } else if (species > SPECIES_EGG) { + coords = &gMonFrontPicCoords[0]; + } else { + coords = &gMonFrontPicCoords[species]; + } + } + } + + switch (a2) { + case 0: + return (coords->coords & 0xf) * 8; + case 1: + return (coords->coords >> 4) * 8; + case 4: + return sub_8077ABC(slot, 2) - ((coords->coords >> 4) * 4); + case 5: + return sub_8077ABC(slot, 2) + ((coords->coords >> 4) * 4); + case 2: + return sub_8077ABC(slot, 3) - ((coords->coords & 0xf) * 4); + case 3: + return sub_8077ABC(slot, 3) + ((coords->coords & 0xf) * 4); + case 6: + ret = sub_8077ABC(slot, 1) + 0x1f; + return ret - coords->y_offset; + default: + return 0; + } +} + +void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4) { + u8 v1, v2; + s16 v3, v4; + s16 v5, v6; + if (!a2) { + v1 = 0; + v2 = 1; + } else { + v1 = 2; + v2 = 3; + } + v3 = sub_8077ABC(slot, v1); + v4 = sub_8077ABC(slot, v2); + if (IsDoubleBattle() && !IsContest()) { + v5 = sub_8077ABC(slot ^ 2, v1); + v6 = sub_8077ABC(slot ^ 2, v2); + } else { + v5 = v3; + v6 = v4; + } + *a3 = (v3 + v5) / 2; + *a4 = (v4 + v6) / 2; +} + +u8 sub_807A4A0(int a1, u8 sprite, int a3) { + u8 new_sprite = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); + gSprites[new_sprite] = gSprites[sprite]; + gSprites[new_sprite].usingSheet = TRUE; + gSprites[new_sprite].oam.priority = 0; + gSprites[new_sprite].oam.objMode = 2; + gSprites[new_sprite].oam.tileNum = gSprites[sprite].oam.tileNum; + gSprites[new_sprite].callback = SpriteCallbackDummy; + return new_sprite; +} + +void sub_807A544(struct Sprite *sprite) { + sub_8078650(sprite); + if (GetBankSide(gBattleAnimPlayerMonIndex)) { + sprite->pos1.x -= gBattleAnimArgs[0]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + sprite->hFlip = TRUE; + } else { + sprite->pos1.x += gBattleAnimArgs[0]; + } + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data0 = gBattleAnimArgs[2]; + sprite->data1 = gBattleAnimArgs[3]; + sprite->data3 = gBattleAnimArgs[4]; + sprite->data5 = gBattleAnimArgs[5]; + oamt_set_x3A_32(sprite, move_anim_8074EE0); + sprite->callback = sub_8078504; +} + +void sub_807A5C4(struct Sprite *sprite) { + if (GetBankSide(gBattleAnimPlayerMonIndex)) { + sprite->pos1.x -= gBattleAnimArgs[0]; + gBattleAnimArgs[3] *= -1; + } else { + sprite->pos1.x += gBattleAnimArgs[0]; + } + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data0 = gBattleAnimArgs[2]; + sprite->data1 = gBattleAnimArgs[3]; + sprite->data3 = gBattleAnimArgs[4]; + sprite->data5 = gBattleAnimArgs[5]; + StartSpriteAnim(sprite, gBattleAnimArgs[6]); + oamt_set_x3A_32(sprite, move_anim_8074EE0); + sprite->callback = sub_8078504; +} + +void sub_807A63C(struct Sprite *sprite) { + sub_8078650(sprite); + if (GetBankSide(gBattleAnimPlayerMonIndex)) { + sprite->pos1.x -= gBattleAnimArgs[0]; + } else { + sprite->pos1.x += gBattleAnimArgs[0]; + } + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->callback = sub_8078600; + oamt_set_x3A_32(sprite, move_anim_8072740); +} + +void sub_807A69C(u8 taskId) { + u16 src; + u16 dest; + struct Task *task = &gTasks[taskId]; + task->data[0] = obj_id_for_side_relative_to_move(0); + task->data[1] = (GetBankSide(gBattleAnimPlayerMonIndex)) ? -8 : 8; + task->data[2] = 0; + task->data[3] = 0; + gSprites[task->data[0]].pos2.x -= task->data[0]; + task->data[4] = AllocSpritePalette(10097); + task->data[5] = 0; + + dest = (task->data[4] + 0x10) * 0x10; + src = (gSprites[task->data[0]].oam.paletteNum + 0x10) * 0x10; + task->data[6] = sub_8079E90(gBattleAnimPlayerMonIndex); + if (task->data[6] == 20 || task->data[6] == 40) { + task->data[6] = 2; + } else { + task->data[6] = 3; + } + CpuCopy32(&gPlttBufferUnfaded[src], &gPlttBufferFaded[dest], 0x20); + BlendPalette(dest, 0x10, gBattleAnimArgs[1], gBattleAnimArgs[0]); + task->func = sub_807A784; +} + +void sub_807A784(u8 taskId) { + struct Task *task = &gTasks[taskId]; + switch (task->data[2]) { + case 0: + sub_807A850(task, taskId); + gSprites[task->data[0]].pos2.x += task->data[1]; + if (++task->data[3] == 5) { + task->data[3]--; + task->data[2]++; + } + break; + case 1: + sub_807A850(task, taskId); + gSprites[task->data[0]].pos2.x -= task->data[1]; + if (--task->data[3] == 0) { + gSprites[task->data[0]].pos2.x = 0; + task->data[2]++; + } + break; + case 2: + if (!task->data[5]) { + FreeSpritePaletteByTag(10097); + DestroyAnimVisualTask(taskId); + } + break; + } +} + +void sub_807A850(struct Task *task, u8 taskId) { + s16 sprite = duplicate_obj_of_side_rel2move_in_transparent_mode(0); + if (sprite >= 0) { + gSprites[sprite].oam.priority = task->data[6]; + gSprites[sprite].oam.paletteNum = task->data[4]; + gSprites[sprite].data0 = 8; + gSprites[sprite].data1 = taskId; + gSprites[sprite].data2 = sprite; + gSprites[sprite].pos2.x = gSprites[task->data[0]].pos2.x; + gSprites[sprite].callback = sub_807A8D4; + task->data[5]++; + } +} + +void sub_807A8D4(struct Sprite *sprite) { + if (--sprite->data0 == 0) { + gTasks[sprite->data1].data[5]--; + obj_delete_but_dont_free_vram(sprite); + } +} + +void sub_807A908(struct Sprite *sprite) { + sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); + sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); + if (!GetBankSide(gBattleAnimPlayerMonIndex)) { + sprite->data0 = 5; + } else { + sprite->data0 = -10; + } + sprite->data1 = -40; + sprite->callback = sub_807A960; +} + +void sub_807A960(struct Sprite *sprite) { + sprite->data2 += sprite->data0; + sprite->data3 += sprite->data1; + sprite->pos2.x = sprite->data2 / 10; + sprite->pos2.y = sprite->data3 / 10; + if (sprite->data1 < -20) { + sprite->data1++; + } + if ((sprite->pos1.y + sprite->pos2.y) < -32) { + move_anim_8072740(sprite); + } +} + +void sub_807A9BC(struct Sprite *sprite) { + int x; + sprite->data0 = gBattleAnimArgs[2]; + sprite->data2 = sprite->pos1.x + gBattleAnimArgs[4]; + sprite->data4 = sprite->pos1.y + gBattleAnimArgs[5]; + if (!GetBankSide(gBattleAnimEnemyMonIndex)) { + x = (u16)gBattleAnimArgs[4] + 30; + sprite->pos1.x += x; + sprite->pos1.y = gBattleAnimArgs[5] - 20; + } else { + x = (u16)gBattleAnimArgs[4] - 30; + sprite->pos1.x += x; + sprite->pos1.y = gBattleAnimArgs[5] - 80; + } + sprite->callback = sub_8078B34; + oamt_set_x3A_32(sprite, move_anim_8072740); +} diff --git a/src/misc/script_pokemon_util_80C4BF0.c b/src/misc/script_pokemon_util_80C4BF0.c new file mode 100644 index 000000000..cbca07011 --- /dev/null +++ b/src/misc/script_pokemon_util_80C4BF0.c @@ -0,0 +1,716 @@ +#include "global.h" +#include "battle.h" +#include "berry.h" +#include "choose_party.h" +#include "contest.h" +#include "contest_link_80C2020.h" +#include "contest_painting.h" +#include "data2.h" +#include "daycare.h" +#include "debug.h" +#include "decompress.h" +#include "event_data.h" +#include "items.h" +#include "link.h" +#include "load_save.h" +#include "main.h" +#include "menu.h" +#include "pokedex.h" +#include "pokemon.h" +#include "rng.h" +#include "rom4.h" +#include "script_pokemon_80C4.h" +#include "species.h" +#include "task.h" + +#define CONTEST_ENTRY_PIC_LEFT 10 +#define CONTEST_ENTRY_PIC_TOP 3 + +extern struct SpriteTemplate gUnknown_02024E8C; + +extern u8 gContestPlayerMonIndex; +extern u8 gIsLinkContest; +extern u8 gPlayerPartyCount; +extern u8 gSelectedOrderFromParty[]; + +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; + +extern u16 gScriptContestCategory; +extern u16 gScriptContestRank; +extern u16 gScriptResult; + +extern u32 gUnknown_03005D28; + +extern u8 gUnknown_02038694; +extern u8 gUnknown_0203856C; +extern u8 gUnknown_02038690[]; +extern u16 gUnknown_02038678[]; + +void sub_80C4BF0(void) +{ + gSaveBlock1.vars[0x10] = gContestMons[0].unk16; + gSaveBlock1.vars[0x11] = gContestMons[1].unk16; + gSaveBlock1.vars[0x12] = gContestMons[2].unk16; +} + +void sub_80C4C28(void) +{ + u16 var; + u8 specialVar = gSpecialVar_0x8005; + + switch(specialVar) + { + case 0: + var = 3; + break; + case 1: + var = 4; + break; + case 2: + var = 5; + break; + default: + var = 100; + break; + } + gSpecialVar_0x8004 = var; +} + +void sub_80C4C64(void) +{ + sub_80C46EC(); + sub_80C4740(); + sub_80C48F4(); +} + +void sub_80C4C78(void) +{ + u16 var; + u16 returnVar; + + switch(gScriptContestCategory) + { + case 0: + var = 8; + break; + case 1: + var = 9; + break; + case 2: + var = 10; + break; + case 3: + var = 11; + break; + case 4: + default: + var = 12; + break; + } + + returnVar = gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[var].var; + + if(returnVar == 0) + gSpecialVar_0x8004 = returnVar; + else + gSpecialVar_0x8004 = 1; +} + +void sub_80C4CEC(void) +{ + sub_80B2A7C(0xFF); +} + +void sub_80C4CF8(void) +{ + if(!gUnknown_02038690[gContestPlayerMonIndex] + && gScriptContestRank == 3 + && (s16)gUnknown_02038678[gContestPlayerMonIndex] >= 800) + { + gSpecialVar_0x8004 = 1; + } + else + { + gSpecialVar_0x8004 = 0; + } +} + +u8 sub_80C4D50(void) +{ + u8 retVar = 0; + int i; + + for (i = 0; i < 5; i++) + if (gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[i + 8].var) + retVar++; + + return retVar; +} + +// nope. too hard +__attribute__((naked)) +void sub_80C4D80(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + ldr r0, _080C4EA0 @ =gUnknown_02038670\n\ + mov r12, r0\n\ + ldr r1, _080C4EA4 @ =gSpecialVar_0x8006\n\ + mov r8, r1\n\ + ldr r2, _080C4EA8 @ =gStringVar1\n\ + mov r9, r2\n\ + mov r2, r12\n\ + mov r1, sp\n\ + movs r6, 0x3\n\ +_080C4D9E:\n\ + ldrh r0, [r2]\n\ + strh r0, [r1]\n\ + adds r2, 0x2\n\ + adds r1, 0x2\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _080C4D9E\n\ + movs r6, 0\n\ +_080C4DAE:\n\ + movs r1, 0x3\n\ + cmp r1, r6\n\ + ble _080C4DD8\n\ +_080C4DB4:\n\ + subs r4, r1, 0x1\n\ + lsls r0, r4, 1\n\ + mov r5, sp\n\ + adds r3, r5, r0\n\ + lsls r0, r1, 1\n\ + adds r2, r5, r0\n\ + ldrh r5, [r3]\n\ + movs r7, 0\n\ + ldrsh r1, [r3, r7]\n\ + movs r7, 0\n\ + ldrsh r0, [r2, r7]\n\ + cmp r1, r0\n\ + bge _080C4DD2\n\ + strh r5, [r2]\n\ + strh r0, [r3]\n\ +_080C4DD2:\n\ + adds r1, r4, 0\n\ + cmp r1, r6\n\ + bgt _080C4DB4\n\ +_080C4DD8:\n\ + adds r6, 0x1\n\ + cmp r6, 0x2\n\ + ble _080C4DAE\n\ + mov r2, r8\n\ + ldrh r0, [r2]\n\ + lsls r0, 1\n\ + add r0, sp\n\ + ldrh r0, [r0]\n\ + movs r2, 0\n\ + movs r7, 0\n\ + movs r6, 0\n\ + lsls r0, 16\n\ + asrs r4, r0, 16\n\ + adds r3, r0, 0\n\ + mov r1, sp\n\ +_080C4DF6:\n\ + movs r5, 0\n\ + ldrsh r0, [r1, r5]\n\ + cmp r0, r4\n\ + bne _080C4E12\n\ + lsls r0, r2, 24\n\ + movs r2, 0x80\n\ + lsls r2, 17\n\ + adds r0, r2\n\ + lsrs r2, r0, 24\n\ + mov r5, r8\n\ + ldrh r5, [r5]\n\ + cmp r6, r5\n\ + bne _080C4E12\n\ + adds r7, r2, 0\n\ +_080C4E12:\n\ + adds r1, 0x2\n\ + adds r6, 0x1\n\ + cmp r6, 0x3\n\ + ble _080C4DF6\n\ + movs r6, 0\n\ + mov r0, sp\n\ + movs r1, 0\n\ + ldrsh r0, [r0, r1]\n\ + asrs r1, r3, 16\n\ + lsls r2, 24\n\ + mov r10, r2\n\ + cmp r0, r1\n\ + beq _080C4E40\n\ + adds r2, r1, 0\n\ + mov r1, sp\n\ +_080C4E30:\n\ + adds r1, 0x2\n\ + adds r6, 0x1\n\ + cmp r6, 0x3\n\ + bgt _080C4E40\n\ + movs r4, 0\n\ + ldrsh r0, [r1, r4]\n\ + cmp r0, r2\n\ + bne _080C4E30\n\ +_080C4E40:\n\ + lsls r0, r6, 24\n\ + lsrs r4, r0, 24\n\ + adds r2, r7, 0\n\ + movs r6, 0\n\ + asrs r5, r3, 16\n\ + mov r8, r5\n\ + mov r1, r12\n\ + movs r5, 0\n\ + ldrsh r0, [r1, r5]\n\ + cmp r8, r0\n\ + bne _080C4E60\n\ + cmp r7, 0x1\n\ + beq _080C4E78\n\ +_080C4E5A:\n\ + subs r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ +_080C4E60:\n\ + adds r6, 0x1\n\ + cmp r6, 0x3\n\ + bgt _080C4E78\n\ + lsls r0, r6, 1\n\ + add r0, r12\n\ + asrs r1, r3, 16\n\ + movs r5, 0\n\ + ldrsh r0, [r0, r5]\n\ + cmp r1, r0\n\ + bne _080C4E60\n\ + cmp r2, 0x1\n\ + bne _080C4E5A\n\ +_080C4E78:\n\ + lsls r1, r6, 24\n\ + lsrs r1, 24\n\ + mov r0, r9\n\ + bl sub_80C4698\n\ + ldr r0, _080C4EAC @ =gIsLinkContest\n\ + ldrb r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080C4EB8\n\ + ldr r0, _080C4EB0 @ =gStringVar2\n\ + lsls r1, r6, 3\n\ + subs r1, r6\n\ + lsls r1, 2\n\ + ldr r2, _080C4EB4 @ =gLinkPlayers + 0x8\n\ + adds r1, r2\n\ + bl sub_80C4674\n\ + b _080C4EC4\n\ + .align 2, 0\n\ +_080C4EA0: .4byte gUnknown_02038670\n\ +_080C4EA4: .4byte gSpecialVar_0x8006\n\ +_080C4EA8: .4byte gStringVar1\n\ +_080C4EAC: .4byte gIsLinkContest\n\ +_080C4EB0: .4byte gStringVar2\n\ +_080C4EB4: .4byte gLinkPlayers + 0x8\n\ +_080C4EB8:\n\ + ldr r0, _080C4ED8 @ =gStringVar2\n\ + lsls r1, r6, 6\n\ + ldr r2, _080C4EDC @ =gUnknown_0203857D\n\ + adds r1, r2\n\ + bl sub_80C4674\n\ +_080C4EC4:\n\ + mov r1, r10\n\ + asrs r0, r1, 24\n\ + cmp r0, 0x1\n\ + beq _080C4ED0\n\ + cmp r7, r0\n\ + bne _080C4EE4\n\ +_080C4ED0:\n\ + ldr r0, _080C4EE0 @ =gSpecialVar_0x8006\n\ + strh r4, [r0]\n\ + b _080C4EEA\n\ + .align 2, 0\n\ +_080C4ED8: .4byte gStringVar2\n\ +_080C4EDC: .4byte gUnknown_0203857D\n\ +_080C4EE0: .4byte gSpecialVar_0x8006\n\ +_080C4EE4:\n\ + ldr r1, _080C4EFC @ =gSpecialVar_0x8006\n\ + adds r0, r4, 0x4\n\ + strh r0, [r1]\n\ +_080C4EEA:\n\ + add sp, 0x8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080C4EFC: .4byte gSpecialVar_0x8006\n\ + .syntax divided"); +} + +void ShowContestWinnerCleanup(void) +{ + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void ShowContestWinner(void) +{ + if(gUnknown_0203856C) + { + sub_80AAF30(); + BATTLE_STRUCT->unk15DDF = 1; + BATTLE_STRUCT->unk15DDE = sub_80B2C4C(254, 0); + sub_80B2A7C(3); + gUnknown_0203856C = 0; + } + SetMainCallback2(CB2_ContestPainting); + gMain.savedCallback = ShowContestWinnerCleanup; +} + +void sub_80C4F70(void) +{ + VarSet(0x4010, gContestMons[0].unk16); + VarSet(0x4011, gContestMons[1].unk16); + VarSet(0x4012, gContestMons[2].unk16); + VarSet(0x4013, gContestMons[3].unk16); +} + +bool8 GiveMonArtistRibbon(void) +{ + u8 ribbon = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_ARTIST_RIBBON); + + if(ribbon == FALSE + && gUnknown_02038690[gContestPlayerMonIndex] == 0 + && gScriptContestRank == 3 + && (s16)gUnknown_02038678[gContestPlayerMonIndex] >= 800) + { + ribbon = TRUE; + SetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_ARTIST_RIBBON, &ribbon); + return TRUE; + } + else + { + return FALSE; + } +} + +u8 sub_80C5044(void) +{ + return gUnknown_0203856C; +} + +void ShowContestEntryMonPic(void) +{ + const struct CompressedSpritePalette *palette; + u32 var1, var2; + u16 species; + u8 spriteId; + u8 taskId; + + if(FindTaskIdByFunc(sub_80C5190) == 0xFF) + { + u8 left = CONTEST_ENTRY_PIC_LEFT; + u8 top = CONTEST_ENTRY_PIC_TOP; + + MenuDrawTextWindow(left, top, 19, 13); + species = gContestMons[gSpecialVar_0x8006].species; + var1 = gContestMons[gSpecialVar_0x8006].unk38; // v2 + var2 = gContestMons[gSpecialVar_0x8006].unk3C; // v3 + taskId = CreateTask(sub_80C5190, 0x50); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = species; + HandleLoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, + gMonFrontPicCoords[species].y_offset, + (u32)gUnknown_081FAF4C[0], + gUnknown_081FAF4C[1], + species, + var1); + palette = sub_80409C8(species, var2, var1); + LoadCompressedObjectPalette(palette); + GetMonSpriteTemplate_803C56C(species, 1); + gUnknown_02024E8C.paletteTag = palette->tag; + spriteId = CreateSprite(&gUnknown_02024E8C, 0x78, 0x40, 0); + gTasks[taskId].data[2] = spriteId; + gTasks[taskId].data[3] = left; + gTasks[taskId].data[4] = top; + gSprites[spriteId].callback = SpriteCallbackDummy; + gSprites[spriteId].oam.priority = 0; + } +} + +void sub_80C5164(void) +{ + u8 taskId = FindTaskIdByFunc(sub_80C5190); + + if(taskId != 0xFF) + gTasks[taskId].data[0]++; +} + +void sub_80C5190(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + struct Sprite *sprite; + + switch(task->data[0]) + { + case 2: + sprite = &gSprites[task->data[2]]; + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); + + if(sprite->oam.affineMode) + FreeOamMatrix(sprite->oam.matrixNum); + + DestroySprite(sprite); + task->data[0]++; + break; + case 0: + task->data[0]++; + break; + case 3: + MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10); + DestroyTask(taskId); + break; + case 1: + default: + break; + } +} + +void ScriptGetMultiplayerId(void) +{ + if(gIsLinkContest & 1) + gScriptResult = GetMultiplayerId(); + else + gScriptResult = 4; +} + +void ScriptRandom(void) +{ + u16 random; + u16 *scriptPtr; + + if(gIsLinkContest & 1) + { + gUnknown_03005D28 = 1103515245 * gUnknown_03005D28 + 24691; + random = gUnknown_03005D28 >> 16; + scriptPtr = &gScriptResult; + } + else + { + scriptPtr = &gScriptResult; + random = Random(); + } + *scriptPtr = random % *scriptPtr; +} + +void HealPlayerParty(void) +{ + u8 i, j; + u8 ppBonuses; + u8 arg[4]; + + // restore HP. + for(i = 0; i < gPlayerPartyCount; i++) + { + u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); + arg[0] = maxHP; + arg[1] = maxHP >> 8; + SetMonData(&gPlayerParty[i], MON_DATA_HP, arg); + ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES); + + // restore PP. + for(j = 0; j < 4; j++) + { + arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j); + SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg); + } + + // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData. + arg[0] = 0; + arg[1] = 0; + arg[2] = 0; + arg[3] = 0; + SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg); + } +} + +u8 ScriptGiveMon(u16 species, u8 var, u16 item, u32 var3, u32 var4, u8 var5) +{ + u16 nationalSpecies; + int sentToPc; + u8 array[2]; + struct Pokemon mon; + + CreateMon(&mon, species, var, 32, 0, 0, 0, 0); + array[0] = item; + array[1] = item >> 8; + SetMonData(&mon, MON_DATA_HELD_ITEM, array); + sentToPc = GiveMonToPlayer(&mon); + nationalSpecies = SpeciesToNationalPokedexNum(species); + + // nested if check to fool compiler + switch(sentToPc) + { + case 0: + case 1: + GetNationalPokedexFlag(nationalSpecies, 2); + GetNationalPokedexFlag(nationalSpecies, 3); + return sentToPc; + default: + return sentToPc; + } +} + +u8 ScriptGiveEgg(u16 value) +{ + struct Pokemon mon; + u8 data; + + sub_8042044(&mon, value, 1); + data = 1; + SetMonData(&mon, MON_DATA_IS_EGG, &data); + + return GiveMonToPlayer(&mon); +} + +void CheckForAlivePartyMons(void) +{ + u8 var = sub_803DAA0(); + + switch(var) + { + case 1: + gScriptResult = var; + break; + case 0: + gScriptResult = var; + break; + case 2: + gScriptResult = var; + break; + } +} + +bool8 CheckPartyMonHasHeldItem(u16 item) +{ + int i; + + for(i = 0; i < 6; i++) + { + u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); + if(species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == item) + return TRUE; + } + return FALSE; +} + +bool8 GetNameOfEnigmaBerryInPlayerParty(void) +{ + bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY); + + if(hasItem == TRUE) + GetBerryNameByBerryType(ItemIdToBerryType(ITEM_ENIGMA_BERRY), gStringVar1); + + return hasItem; +} + +void ScriptWildBattle(u16 species, u8 level, u16 item) +{ + u8 data[2]; + + ZeroEnemyPartyMons(); + CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, 0, 0); + + if(item) + { + data[0] = item; + data[1] = item >> 8; + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, data); + } +} + +void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot) +{ + if(monIndex > 6) + monIndex = gPlayerPartyCount - 1; + + SetMonMoveSlot(&gPlayerParty[monIndex], move, slot); +} + +void sub_80C5568(void) +{ + gMain.savedCallback = sub_80C5580; + sub_8121E10(); +} + +void sub_80C5580(void) +{ + u8 var = gSelectedOrderFromParty[0]; + + switch(var) + { + case 0: + gScriptResult = 0; + break; + default: + gScriptResult = 1; + break; + } + + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void ChooseBattleTowerPlayerParty(void) +{ + gMain.savedCallback = SetBattleTowerPlayerParty; + sub_8121E34(); +} + +void SetBattleTowerPlayerParty(void) +{ + u8 var = gSelectedOrderFromParty[0]; + + switch(var) + { + case 0: // player quit battle tower? + LoadPlayerParty(); + gScriptResult = 0; + break; + default: // load battle tower. + ReducePlayerPartyToThree(); + gScriptResult = 1; + break; + } + + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void ReducePlayerPartyToThree(void) +{ + struct Pokemon party[3]; + int i; + + CpuFill32(0, party, sizeof party); + + // copy the selected pokemon according to the order. + for(i = 0; i < 3; i++) + if(gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop + party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal + + // delete the last 3 pokemon + CpuFill32(0, gPlayerParty, sizeof gPlayerParty); + + // overwrite the first 3 with the order copied to. + for(i = 0; i < 3; i++) + gPlayerParty[i] = party[i]; + + CalculatePlayerPartyCount(); +} diff --git a/src/misc/script_pokemon_util_80F99CC.c b/src/misc/script_pokemon_util_80F99CC.c new file mode 100644 index 000000000..2b48cc0d8 --- /dev/null +++ b/src/misc/script_pokemon_util_80F99CC.c @@ -0,0 +1,445 @@ +#include "global.h" +#include "battle_party_menu.h" +#include "choose_party.h" +#include "contest.h" +#include "data2.h" +#include "party_menu.h" +#include "field_fadetransition.h" +#include "palette.h" +#include "party_menu.h" +#include "pokemon.h" +#include "pokemon_summary_screen.h" +#include "rom4.h" +#include "script.h" +#include "script_pokemon_80F9.h" +#include "sound.h" +#include "string_util.h" +#include "task.h" +#include "text.h" + + + +extern u8 gPlayerPartyCount; +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u8 gUnknown_02038694; +extern u16 gScriptResult; + +extern void (*gFieldCallback)(void); + +void sub_80F99CC(void) +{ + u8 taskId; + + ScriptContext2_Enable(); + taskId = CreateTask((void *)sub_80F9A8C, 0xA); + gTasks[taskId].data[0] = 2; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void sub_80F9A0C(void) +{ + u8 taskId; + + ScriptContext2_Enable(); + taskId = CreateTask((void *)sub_80F9A8C, 0xA); + gTasks[taskId].data[0] = 3; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void sub_80F9A4C(void) +{ + u8 taskId; + + ScriptContext2_Enable(); + taskId = CreateTask((void *)sub_80F9A8C, 0xA); + gTasks[taskId].data[0] = 7; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void sub_80F9A8C(u8 taskId) +{ + if(!gPaletteFade.active) + { + gPaletteFade.bufferTransferDisabled = 1; + OpenPartyMenu((u8) gTasks[taskId].data[0], 0); + DestroyTask(taskId); + } +} + +bool8 sub_80F9ACC(void) +{ + switch(EWRAM_1B000.unk264) + { + case 0: + if(EWRAM_1B000.unk266 < gPlayerPartyCount) + { + TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); + EWRAM_1B000.unk266++; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264++; + } + break; + case 1: + LoadHeldItemIconGraphics(); + EWRAM_1B000.unk264++; + break; + case 2: + CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); + EWRAM_1B000.unk264++; + break; + case 3: + if(sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1) + { + EWRAM_1B000.unk266++; + break; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264++; + break; + } + case 4: + PartyMenuPrintMonsLevelOrStatus(); + EWRAM_1B000.unk264++; + break; + case 5: + PrintPartyMenuMonNicknames(); + EWRAM_1B000.unk264++; + break; + case 6: + sub_80F9C00(); + EWRAM_1B000.unk264++; + break; + case 7: // the only case that can return true. + if(sub_806B58C(EWRAM_1B000.unk266) != 1) + { + EWRAM_1B000.unk266++; + break; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264 = 0; + return TRUE; + } + } + return FALSE; +} + +void sub_80F9C00(void) +{ + u8 i; + + for(i = 0; i < gPlayerPartyCount; i++) + { + switch(sub_80AE47C(&gPlayerParty[i])) + { + case 0: + case 3: + case 4: + sub_806BC3C(i, 0x7E); + break; + case 1: + case 2: + sub_806BC3C(i, 0x70); + break; + } + } +} + +void sub_80F9C6C(u8 var) +{ + if(!gPaletteFade.active) + { + switch(sub_806BD80(var)) + { + case 1: + PlaySE(5); + gUnknown_02038694 = sub_806CA38(var); + gSpecialVar_0x8004 = gUnknown_02038694; + sub_8123138(var); + break; + case 2: + PlaySE(5); + gUnknown_02038694 = 0xFF; + gSpecialVar_0x8004 = 0xFF; + sub_8123138(var); + break; + } + } +} + +bool8 sub_80F9CE8(void) // this is the same function as sub_80F9ACC except case 6 calls a different function. why +{ + switch(EWRAM_1B000.unk264) + { + case 0: + if(EWRAM_1B000.unk266 < gPlayerPartyCount) + { + TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); + EWRAM_1B000.unk266++; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264++; + } + break; + case 1: + LoadHeldItemIconGraphics(); + EWRAM_1B000.unk264++; + break; + case 2: + CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); + EWRAM_1B000.unk264++; + break; + case 3: + if(sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1) + { + EWRAM_1B000.unk266++; + break; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264++; + break; + } + case 4: + PartyMenuPrintMonsLevelOrStatus(); + EWRAM_1B000.unk264++; + break; + case 5: + PrintPartyMenuMonNicknames(); + EWRAM_1B000.unk264++; + break; + case 6: + sub_80F9E1C(); + EWRAM_1B000.unk264++; + break; + case 7: // the only case that can return true. + if(sub_806B58C(EWRAM_1B000.unk266) != 1) + { + EWRAM_1B000.unk266++; + break; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264 = 0; + return TRUE; + } + } + return FALSE; +} + +void sub_80F9E1C(void) +{ + u8 i; + + for(i = 0; i < gPlayerPartyCount; i++) + { + if(!sub_8040574(&gPlayerParty[i])) + sub_806BC3C(i, 0x9A); + else + sub_806BC3C(i, 0x8C); + } +} + +void sub_80F9E64(u8 var) +{ + if(!gPaletteFade.active) + { + switch(sub_806BD80(var)) + { + case 1: + PlaySE(5); + gSpecialVar_0x8004 = sub_806CA38(var); + gSpecialVar_0x8005 = sub_8040574(&gPlayerParty[gSpecialVar_0x8004]); + sub_8123138(var); + break; + case 2: + PlaySE(5); + gSpecialVar_0x8004 = 0xFF; + sub_8123138(var); + } + } +} + +void sub_80F9EEC(void) +{ + sub_809D9F0(&gPlayerParty[0], gSpecialVar_0x8004, gPlayerPartyCount - 1, c2_exit_to_overworld_2_switch, 0); + unk_2018000.unk8 = 3; + gFieldCallback = sub_8080990; +} + +void sub_80F9F3C(void) // count pokemon moves +{ + u8 i; + + gScriptResult = 0; + + for(i = 0; i < 4; i++) // checks MOVE1-MOVE4 + if(GetMonData(&gPlayerParty[gSpecialVar_0x8004], i + 13)) + gScriptResult++; +} + +void sub_80F9F84(void) +{ + struct Pokemon *party = &gPlayerParty[gSpecialVar_0x8004]; + u16 data = GetMonData(party, gSpecialVar_0x8005 + 13); + + GetMonNickname(party, gStringVar1); + StringCopy(gStringVar2, gMoveNames[data]); +} + +// no. hard +__attribute__((naked)) +void sub_80F9FDC(struct Pokemon *party, u8 var, u8 var2) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x20\n\ + mov r8, r0\n\ + adds r5, r1, 0\n\ + adds r4, r2, 0\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + adds r0, r5, 0\n\ + adds r0, 0xD\n\ + str r0, [sp, 0x8]\n\ + mov r0, r8\n\ + ldr r1, [sp, 0x8]\n\ + bl GetMonData\n\ + mov r1, sp\n\ + adds r1, 0x2\n\ + str r1, [sp, 0x14]\n\ + strh r0, [r1]\n\ + adds r3, r4, 0\n\ + adds r3, 0xD\n\ + str r3, [sp, 0xC]\n\ + mov r0, r8\n\ + adds r1, r3, 0\n\ + bl GetMonData\n\ + mov r1, sp\n\ + strh r0, [r1]\n\ + adds r7, r5, 0\n\ + adds r7, 0x11\n\ + str r7, [sp, 0x10]\n\ + mov r0, r8\n\ + adds r1, r7, 0\n\ + bl GetMonData\n\ + mov r1, sp\n\ + adds r1, 0x5\n\ + str r1, [sp, 0x18]\n\ + strb r0, [r1]\n\ + adds r3, r4, 0\n\ + adds r3, 0x11\n\ + str r3, [sp, 0x1C]\n\ + mov r0, r8\n\ + adds r1, r3, 0\n\ + bl GetMonData\n\ + add r7, sp, 0x4\n\ + mov r10, r7\n\ + strb r0, [r7]\n\ + mov r0, r8\n\ + movs r1, 0x15\n\ + bl GetMonData\n\ + mov r6, sp\n\ + adds r6, 0x6\n\ + strb r0, [r6]\n\ + ldr r1, _080FA0D8 @ =gUnknown_08208238\n\ + adds r0, r5, r1\n\ + ldrb r0, [r0]\n\ + mov r9, r0\n\ + ldrb r0, [r6]\n\ + adds r2, r0, 0\n\ + mov r3, r9\n\ + ands r2, r3\n\ + lsls r5, 1\n\ + asrs r2, r5\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r1, r4, r1\n\ + ldrb r3, [r1]\n\ + adds r1, r0, 0\n\ + ands r1, r3\n\ + lsls r4, 1\n\ + asrs r1, r4\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r7, r9\n\ + bics r0, r7\n\ + strb r0, [r6]\n\ + ldrb r0, [r6]\n\ + bics r0, r3\n\ + strb r0, [r6]\n\ + lsls r2, r4\n\ + lsls r1, r5\n\ + adds r2, r1\n\ + ldrb r0, [r6]\n\ + orrs r0, r2\n\ + strb r0, [r6]\n\ + mov r0, r8\n\ + ldr r1, [sp, 0x8]\n\ + mov r2, sp\n\ + bl SetMonData\n\ + mov r0, r8\n\ + ldr r1, [sp, 0xC]\n\ + ldr r2, [sp, 0x14]\n\ + bl SetMonData\n\ + mov r0, r8\n\ + ldr r1, [sp, 0x10]\n\ + mov r2, r10\n\ + bl SetMonData\n\ + mov r0, r8\n\ + ldr r1, [sp, 0x1C]\n\ + ldr r2, [sp, 0x18]\n\ + bl SetMonData\n\ + mov r0, r8\n\ + movs r1, 0x15\n\ + adds r2, r6, 0\n\ + bl SetMonData\n\ + add sp, 0x20\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080FA0D8: .4byte gUnknown_08208238\n\ + .syntax divided"); +} + +void sub_80FA0DC(void) +{ + u16 i; + + SetMonMoveSlot(&gPlayerParty[gSpecialVar_0x8004], 0, gSpecialVar_0x8005); + RemoveMonPPBonus(&gPlayerParty[gSpecialVar_0x8004], gSpecialVar_0x8005); + + for(i = gSpecialVar_0x8005; i < 3; i++) + sub_80F9FDC(&gPlayerParty[gSpecialVar_0x8004], i, i + 1); +} + +void sub_80FA148(void) +{ + struct Pokemon *party = &gPlayerParty[gSpecialVar_0x8004]; + gScriptResult = 0; + + if(GetMonData(party, MON_DATA_IS_EGG)) + gScriptResult = 1; +} diff --git a/src/misc/unknown_task.c b/src/misc/unknown_task.c new file mode 100644 index 000000000..81b89ef92 --- /dev/null +++ b/src/misc/unknown_task.c @@ -0,0 +1,255 @@ +#include "global.h" +#include "data2.h" +#include "task.h" +#include "trig.h" + +struct UnknownStruct1 +{ + void *src[2]; + void *dest; + u32 unkC; + void (*unk10)(void); + u8 srcBank; + u8 unk15; + u8 unk16; + u8 unk17; + u8 taskId; + u8 filler19[0x7]; +}; + +struct UnknownStruct2 +{ + void *dest; + u32 control; + u8 unk8; + u8 unk9; +}; + +static void sub_80896F4(void); +static void sub_8089714(void); + +extern u16 gUnknown_030041B0; +extern u16 gUnknown_030041B4; +extern u16 gUnknown_030041B8; +extern u16 gUnknown_03004280; +extern u16 gUnknown_03004288; +extern u16 gUnknown_030042A0; +extern u16 gUnknown_030042A4; +extern u16 gUnknown_030042C0; + +extern u8 gUnknown_0202FFA4; + +extern struct UnknownStruct1 gUnknown_03004DC0; + +extern u16 gUnknown_03004DE0[][0x3C0]; + +void remove_some_task(void) +{ + gUnknown_03004DC0.unk15 = 0; + DmaStop(0); + if (gUnknown_03004DC0.taskId != 0xFF) + { + DestroyTask(gUnknown_03004DC0.taskId); + gUnknown_03004DC0.taskId = 0xFF; + } +} + +void dp12_8087EA4(void) +{ + CpuFill16(0, gUnknown_03004DE0, 0x780 * 2); + gUnknown_03004DC0.src[0] = 0; + gUnknown_03004DC0.src[1] = 0; + gUnknown_03004DC0.dest = 0; + gUnknown_03004DC0.unkC = 0; + gUnknown_03004DC0.srcBank = 0; + gUnknown_03004DC0.unk15 = 0; + gUnknown_03004DC0.unk16 = 0; + gUnknown_03004DC0.unk17 = 0; + gUnknown_03004DC0.taskId = 0xFF; +} + +void sub_80895F8(struct UnknownStruct2 unk) +{ + if (unk.control == (((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1)) + { + gUnknown_03004DC0.src[0] = &gUnknown_03004DE0[0][1]; + gUnknown_03004DC0.src[1] = &gUnknown_03004DE0[1][1]; + gUnknown_03004DC0.unk10 = sub_80896F4; + } + else + { + gUnknown_03004DC0.src[0] = &gUnknown_03004DE0[0][2]; + gUnknown_03004DC0.src[1] = &gUnknown_03004DE0[1][2]; + gUnknown_03004DC0.unk10 = sub_8089714; + } + + gUnknown_03004DC0.unkC = unk.control; + gUnknown_03004DC0.dest = unk.dest; + gUnknown_03004DC0.unk15 = unk.unk8; + gUnknown_03004DC0.unk16 = unk.unk9; + gUnknown_03004DC0.unk17 = unk.unk9; +} + +void sub_8089668(void) +{ + if (gUnknown_03004DC0.unk15) + { + if (gUnknown_03004DC0.unk15 == 3) + { + gUnknown_03004DC0.unk15 = 0; + DmaStop(0); + gUnknown_0202FFA4 = 1; + } + else + { + DmaStop(0); + DmaSet(0, gUnknown_03004DC0.src[gUnknown_03004DC0.srcBank], gUnknown_03004DC0.dest, gUnknown_03004DC0.unkC); + gUnknown_03004DC0.unk10(); + gUnknown_03004DC0.srcBank ^= 1; + } + } +} + +static void sub_80896F4(void) +{ + u16 *dest = (u16 *)gUnknown_03004DC0.dest; + u16 *src = (u16 *)&gUnknown_03004DE0[gUnknown_03004DC0.srcBank]; + *dest = *src; +} + +static void sub_8089714(void) +{ + u32 *dest = (u32 *)gUnknown_03004DC0.dest; + u32 *src = (u32 *)&gUnknown_03004DE0[gUnknown_03004DC0.srcBank]; + *dest = *src; +} + +static void task00_for_dp12(u8 taskId) +{ + int value = 0; + + if (gUnknown_0202FFA4) + { + DestroyTask(taskId); + gUnknown_03004DC0.taskId = 0xFF; + } + else + { + if (gTasks[taskId].data[7]) + { + switch (gTasks[taskId].data[6]) + { + case 0x0: + value = gUnknown_030042A4; + break; + case 0x2: + value = gUnknown_030042A0; + break; + case 0x4: + value = gUnknown_030042C0; + break; + case 0x6: + value = gUnknown_030041B4; + break; + case 0x8: + value = gUnknown_03004288; + break; + case 0xA: + value = gUnknown_03004280; + break; + case 0xC: + value = gUnknown_030041B0; + break; + case 0xE: + value = gUnknown_030041B8; + break; + } + } + if (gTasks[taskId].data[4]) + { + int i; + int offset; + gTasks[taskId].data[4]--; + offset = gTasks[taskId].data[3] + 320; + for (i = gTasks[taskId].data[0]; i < gTasks[taskId].data[1]; i++) + { + gUnknown_03004DE0[gUnknown_03004DC0.srcBank][i] = gUnknown_03004DE0[0][offset] + value; + offset++; + } + } + else + { + int i; + int offset; + gTasks[taskId].data[4] = gTasks[taskId].data[5]; + offset = gTasks[taskId].data[3] + 320; + for (i = gTasks[taskId].data[0]; i < gTasks[taskId].data[1]; i++) + { + gUnknown_03004DE0[gUnknown_03004DC0.srcBank][i] = gUnknown_03004DE0[0][offset] + value; + offset++; + } + gTasks[taskId].data[3]++; + if (gTasks[taskId].data[3] == gTasks[taskId].data[2]) + { + gTasks[taskId].data[3] = 0; + } + } + } +} + +static void sub_80898FC(u16 *a1, u8 a2, u8 a3, u8 a4) +{ + u16 i = 0; + u8 offset = 0; + + while (i < 0x100) + { + a1[i] = (gSineTable[offset] * a3) / 256; + offset += a2; + i++; + } +} + +u8 sub_8089944(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) +{ + int i; + int offset; + struct UnknownStruct2 unk; + u8 taskId; + + dp12_8087EA4(); + + unk.dest = (void *)(REG_ADDR_BG0HOFS + a6); + unk.control = ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1; + unk.unk8 = 1; + unk.unk9 = 0; + + sub_80895F8(unk); + + taskId = CreateTask(task00_for_dp12, 0); + + gTasks[taskId].data[0] = a1; + gTasks[taskId].data[1] = a2; + gTasks[taskId].data[2] = 256 / a3; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = a5; + gTasks[taskId].data[5] = a5; + gTasks[taskId].data[6] = a6; + gTasks[taskId].data[7] = a7; + + gUnknown_03004DC0.taskId = taskId; + gUnknown_0202FFA4 = 0; + + sub_80898FC(&gUnknown_03004DE0[0][320], a3, a4, a2 - a1); + + offset = 320; + + for (i = a1; i < a2; i++) + { + gUnknown_03004DE0[0][i] = gUnknown_03004DE0[0][offset]; + gUnknown_03004DE0[1][i] = gUnknown_03004DE0[0][offset]; + offset++; + } + + return taskId; +} diff --git a/src/misc/unused_8124F94.c b/src/misc/unused_8124F94.c new file mode 100644 index 000000000..93b569058 --- /dev/null +++ b/src/misc/unused_8124F94.c @@ -0,0 +1,126 @@ +#include "global.h" +#include "decompress.h" +#include "palette.h" + +struct UnknownStruct2 +{ + void *src; + u8 unk4; + u8 unk5; + u8 unk6; + u16 unk8; +}; + +struct UnknownStruct3 +{ + u16 *paletteSrc; + u8 unk4; + u8 paletteCount; +}; + +struct UnknownStruct1 +{ + u8 paletteNum; + u8 unk1; + u16 unk2; + u8 *dest; + struct UnknownStruct3 unk8[16]; + struct UnknownStruct2 unk88[32]; +}; + +void unref_sub_8124F94(struct UnknownStruct1 *a) +{ + a->unk1 = 0; + a->paletteNum = 0; + a->unk2 = 0; + a->dest = (void *)VRAM; + DmaFill16(3, 0, a->unk8, sizeof(a->unk8)); + DmaFill16(3, 0, a->unk88, sizeof(a->unk88)); +} + +u8 unref_sub_8124FD8(struct UnknownStruct1 *a, const struct UnknownStruct2 *b) +{ + while (1) + { + s32 r6; + s32 temp; + + // Couldn't get it to match any other way + if (a->unk1 < 32 && b->src == NULL) + return 0; + if (a->unk1 >= 32) + break; + + a->unk88[a->unk1].src = b->src; + a->unk88[a->unk1].unk6 = b->unk6; + a->unk88[a->unk1].unk4 = b->unk4; + a->unk88[a->unk1].unk5 = b->unk5; + r6 = b->unk4 * b->unk5; + if (a->unk2 + r6 > 0x400) + return 2; + if (b->unk8 == 0) + { + DmaCopy16(3, b->src, a->dest + a->unk2 * 64, r6 * 32); + } + else + { + sub_800D238(b->src, a->dest + a->unk2 * 64); + } + a->unk88[a->unk1].unk8 = a->unk2; + temp = r6 + a->unk2; + a->unk2 = temp; + a->unk1++; + b++; + } + return 1; +} + +u8 unref_sub_81250A4(struct UnknownStruct1 *a, struct UnknownStruct3 *b) +{ + while (1) + { + // Couldn't get it to match any other way + if (a->paletteNum < 16 && b->paletteSrc == NULL) + return 0; + if (a->paletteNum >= 16) + break; + + a->unk8[a->paletteNum].paletteSrc = b->paletteSrc; + a->unk8[a->paletteNum].unk4 = b->unk4; + if (b->paletteCount == 0) + { + LoadPalette(b->paletteSrc, a->paletteNum * 16, 32); + } + else + { + u16 palette[16]; + + sub_800D238(b->paletteSrc, palette); + LoadPalette(palette, a->paletteNum * 16, 32); + } + a->unk8[a->paletteNum].paletteCount = a->paletteNum; + a->paletteNum = a->paletteNum + 1; + b++; + } + return 1; +} + +u8 unref_sub_8125118(struct UnknownStruct1 *a, struct UnknownStruct3 *b) +{ + u16 palettes[16][16] = {0}; + u8 r7 = b->paletteCount; + u8 i; + + sub_800D238(b->paletteSrc, palettes); + for (i = a->paletteNum; i < r7; i++) + { + if (a->paletteNum + i >= 16) + return 1; + a->unk8[i].paletteSrc = b->paletteSrc; + a->unk8[i].unk4 = b->unk4 + i; + a->unk8[i].paletteCount = a->paletteNum; + LoadPalette(palettes[i], a->paletteNum * 16, sizeof(palettes[i])); + a->paletteNum++; + } + return 0; +} diff --git a/src/mon_markings.c b/src/mon_markings.c deleted file mode 100644 index 0cad8db59..000000000 --- a/src/mon_markings.c +++ /dev/null @@ -1,383 +0,0 @@ -#include "global.h" -#include "main.h" -#include "menu_cursor.h" -#include "text_window.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" - -#ifdef GERMAN -#define MENU_TEXT_SPRITE_X_OFFSET 24 -#else -#define MENU_TEXT_SPRITE_X_OFFSET 32 -#endif - -struct PokemonMarkMenu -{ - /*0x0000*/ u16 baseTileTag; - /*0x0002*/ u16 basePaletteTag; - /*0x0004*/ u8 markings; // bit flags - /*0x0005*/ s8 cursorPos; - /*0x0006*/ bool8 markingsArray[4]; - /*0x000A*/ u8 cursorBaseY; - /*0x000B*/ bool8 spriteSheetLoadRequired; - /*0x000C*/ struct Sprite *menuWindowSprites[2]; // upper and lower halves of menu window - /*0x0014*/ struct Sprite *menuMarkingSprites[4]; - /*0x0024*/ struct Sprite *menuTextSprite; - /*0x0028*/ u8 *frameTiles; - /*0x002C*/ u16 *framePalette; - /*0x0030*/ u8 menuWindowSpriteTiles[0x1000]; - /*0x1030*/ u8 filler1030[0x80]; - /*0x10B0*/ u8 tileLoadState; -}; - -extern u8 gPokenavConditionMenuMisc_Gfx[]; -extern u16 gUnknown_08E966B8[]; - -extern u16 gUnknown_083E49F4[]; -extern u8 gUnknown_083E4A14[]; -extern struct OamData gOamData_83E5214; -extern struct OamData gOamData_83E521C; -extern const union AnimCmd *const gSpriteAnimTable_83E5274[]; -extern const union AnimCmd *const gSpriteAnimTable_83E52AC[]; -extern struct OamData gOamData_83E52B4; -extern const union AnimCmd *const gSpriteAnimTable_83E533C[]; - -static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL; - -void sub_80F761C(s16, s16, u16, u16); -void nullsub_65(struct Sprite *); -void sub_80F78CC(struct Sprite *); -void sub_80F7908(struct Sprite *); -struct Sprite *sub_80F7960(u16, u16, u16 *, u16); - -void sub_80F727C(struct PokemonMarkMenu *ptr) -{ - sMenu = ptr; - sMenu->spriteSheetLoadRequired = FALSE; -} - -void sub_80F728C(void) -{ - const struct FrameGraphics *frame = GetTextWindowFrameGraphics(gSaveBlock2.optionsWindowFrameType); - sMenu->frameTiles = frame->tiles; - sMenu->framePalette = frame->palette; - sMenu->tileLoadState = 0; - CpuFill16(0, sMenu->menuWindowSpriteTiles, sizeof(sMenu->menuWindowSpriteTiles)); -} - -bool8 sub_80F72D4(void) -{ - u16 i; - u8 *dest = sMenu->menuWindowSpriteTiles + sMenu->tileLoadState * 0x100; - - switch (sMenu->tileLoadState) - { - case 0: - CpuFastCopy(sMenu->frameTiles, dest, TILE_SIZE_4BPP); - for (i = 0; i < 6; i++) - { - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); - } - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 2, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); - sMenu->tileLoadState++; - break; - default: - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 3, dest, TILE_SIZE_4BPP); - for (i = 0; i < 6; i++) - { - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 4, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); - } - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 5, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); - sMenu->tileLoadState++; - break; - case 13: - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 6, dest, TILE_SIZE_4BPP); - for (i = 0; i < 6; i++) - { - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 7, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); - } - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 8, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); - sMenu->tileLoadState++; - return FALSE; - case 14: - return FALSE; - } - - return TRUE; -} - -void sub_80F7404(void) -{ - sub_80F728C(); - while (sub_80F72D4()) - ; -} - -void sub_80F7418(u8 markings, s16 x, s16 y) -{ - u16 i; - sMenu->cursorPos = 0; - sMenu->markings = markings; - for (i = 0; i < 4; i++) - sMenu->markingsArray[i] = (sMenu->markings >> i) & 1; - DestroyMenuCursor(); - sub_80F761C(x, y, sMenu->baseTileTag, sMenu->basePaletteTag); -} - -void sub_80F7470(void) -{ - u16 i; - - for (i = 0; i < 3; i++) - { - FreeSpriteTilesByTag(sMenu->baseTileTag + i); - } - - FreeSpritePaletteByTag(sMenu->basePaletteTag); - FreeSpritePaletteByTag(sMenu->basePaletteTag + 1); - - for (i = 0; i < 2; i++) - { - if (!sMenu->menuWindowSprites[i]) - return; - DestroySprite(sMenu->menuWindowSprites[i]); - } - - for (i = 0; i < 4; i++) - { - if (!sMenu->menuMarkingSprites[i]) - return; - DestroySprite(sMenu->menuMarkingSprites[i]); - } - - DestroyMenuCursor(); - - if (sMenu->menuTextSprite) - DestroySprite(sMenu->menuTextSprite); -} - -bool8 sub_80F7500(void) -{ - u16 i; - struct SpriteSheet sheets[3] = - { - { sMenu->menuWindowSpriteTiles, 0x1000, sMenu->baseTileTag }, - { gPokenavConditionMenuMisc_Gfx, 0x520, sMenu->baseTileTag + 1 }, - { NULL, 0, 0 } - }; - - if (sMenu->spriteSheetLoadRequired) - { - LoadTilesForSpriteSheets(sheets); - sMenu->spriteSheetLoadRequired = FALSE; - } - - if (gMain.newKeys & DPAD_UP) - { - s8 pos; - PlaySE(SE_SELECT); - pos = --sMenu->cursorPos; - if (pos < 0) - sMenu->cursorPos = 5; - return TRUE; - } - - if (gMain.newKeys & DPAD_DOWN) - { - s8 pos; - PlaySE(SE_SELECT); - pos = ++sMenu->cursorPos; - if (pos > 5) - sMenu->cursorPos = 0; - return TRUE; - } - - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - - switch (sMenu->cursorPos) - { - case 4: - sMenu->markings = 0; - for (i = 0; i < 4; i++) - sMenu->markings |= sMenu->markingsArray[i] << i; - return FALSE; - case 5: - return FALSE; - } - - sMenu->markingsArray[sMenu->cursorPos] = !sMenu->markingsArray[sMenu->cursorPos]; - return TRUE; - } - - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - return FALSE; - } - - return TRUE; -} - -void sub_80F761C(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag) -{ - u16 i; - u8 spriteId; - - struct SpriteSheet sheets[] = - { - { sMenu->menuWindowSpriteTiles, 0x1000, baseTileTag }, - { gPokenavConditionMenuMisc_Gfx, 0x520, baseTileTag + 1 }, - { NULL, 0 } - }; - - struct SpritePalette palettes[] = - { - { sMenu->framePalette, basePaletteTag }, - { gUnknown_08E966B8, basePaletteTag + 1}, - { NULL, 0 } - }; - - struct SpriteTemplate sprTemplate = - { - baseTileTag, - basePaletteTag, - &gOamData_83E5214, - gSpriteAnimTable_83E52AC, - NULL, - gDummySpriteAffineAnimTable, - nullsub_65, - }; - - sMenu->spriteSheetLoadRequired = TRUE; - AllocTilesForSpriteSheets(sheets); - LoadSpritePalettes(palettes); - - for (i = 0; i < 2; i++) - { - spriteId = CreateSprite(&sprTemplate, x + 32, y + 32, 2); - if (spriteId != 64) - { - sMenu->menuWindowSprites[i] = &gSprites[spriteId]; - StartSpriteAnim(&gSprites[spriteId], i); - } - else - { - sMenu->menuWindowSprites[i] = NULL; - return; - } - } - - sMenu->menuWindowSprites[1]->pos1.y = y + 96; - - sprTemplate.tileTag++; - sprTemplate.paletteTag++; - sprTemplate.anims = gSpriteAnimTable_83E5274; - sprTemplate.callback = sub_80F78CC; - sprTemplate.oam = &gOamData_83E521C; - - for (i = 0; i < 4; i++) - { - spriteId = CreateSprite(&sprTemplate, x + 32, y + 16 + 16 * i, 1); - if (spriteId != 64) - { - sMenu->menuMarkingSprites[i] = &gSprites[spriteId]; - gSprites[spriteId].data0 = i; - } - else - { - sMenu->menuMarkingSprites[i] = NULL; - return; - } - } - - sprTemplate.callback = SpriteCallbackDummy; - - spriteId = CreateSprite(&sprTemplate, 0, 0, 1); - - if (spriteId != 64) - { - sMenu->menuTextSprite = &gSprites[spriteId]; - sMenu->menuTextSprite->oam.shape = ST_OAM_H_RECTANGLE; - sMenu->menuTextSprite->oam.size = 3; - StartSpriteAnim(sMenu->menuTextSprite, 9); - sMenu->menuTextSprite->pos1.x = x + MENU_TEXT_SPRITE_X_OFFSET; - sMenu->menuTextSprite->pos1.y = y + 80; - CalcCenterToCornerVec(sMenu->menuTextSprite, 1, 2, 0); - } - else - { - sMenu->menuTextSprite = NULL; - } - - sMenu->cursorBaseY = y + 8; - sub_814A5C0(0, basePaletteTag + 1, 15, 0, 0x30); - sub_814A880(x + 8, sMenu->cursorBaseY); - sub_814AABC(sub_80F7908); -} - -void nullsub_65(struct Sprite *sprite) -{ -} - -void sub_80F78CC(struct Sprite *sprite) -{ - if (sMenu->markingsArray[sprite->data0]) - StartSpriteAnim(sprite, 2 * sprite->data0 + 1); - else - StartSpriteAnim(sprite, 2 * sprite->data0); -} - -void sub_80F7908(struct Sprite *sprite) -{ - sprite->pos1.y = 16 * sMenu->cursorPos + sMenu->cursorBaseY; -} - -struct Sprite *sub_80F7920(u16 tileTag, u16 paletteTag, u16 *palette) -{ - if (!palette) - palette = gUnknown_083E49F4; - return sub_80F7960(tileTag, paletteTag, palette, 16); -} - -struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, u16 *palette) -{ - if (!palette) - palette = gUnknown_083E49F4; - return sub_80F7960(tileTag, paletteTag, palette, 1); -} - -struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, u16 *palette, u16 size) -{ - u8 spriteId; - struct SpriteTemplate sprTemplate; - struct SpriteSheet sheet = { gUnknown_083E4A14, 0x80, tileTag }; - struct SpritePalette sprPalette = { palette, paletteTag }; - - sprTemplate.tileTag = tileTag; - sprTemplate.paletteTag = paletteTag; - sprTemplate.oam = &gOamData_83E52B4; - sprTemplate.anims = gSpriteAnimTable_83E533C; - sprTemplate.images = NULL; - sprTemplate.affineAnims = gDummySpriteAffineAnimTable; - sprTemplate.callback = nullsub_65; - - sheet.size = size * 0x80; - - LoadSpriteSheet(&sheet); - LoadSpritePalette(&sprPalette); - - spriteId = CreateSprite(&sprTemplate, 0, 0, 0); - if (spriteId != 64) - return &gSprites[spriteId]; - else - return NULL; -} - -void sub_80F7A10(u8 markings, void *dest) -{ - void *src = gUnknown_083E4A14 + markings * 0x80; - DmaCopy16(3, src, dest, 0x80); -} diff --git a/src/money.c b/src/money.c deleted file mode 100644 index 5d9d0b689..000000000 --- a/src/money.c +++ /dev/null @@ -1,275 +0,0 @@ -#include "global.h" -#include "money.h" -#include "decompress.h" -#include "menu.h" -#include "sprite.h" -#include "string_util.h" - -#define SPRITE_TAG_MONEY (0x2722) - -extern u16 gSpecialVar_0x8005; - -static EWRAM_DATA u8 gUnknown_02038734 = 0; - -extern const struct CompressedSpriteSheet gUnknown_083CF584; -extern const struct CompressedSpritePalette gUnknown_083CF58C; -extern const struct SpriteTemplate gSpriteTemplate_83CF56C; - -bool8 IsEnoughMoney(u32 budget, u32 cost) -{ - if (budget >= cost) - { - return TRUE; - } - - return FALSE; -} - -void sub_80B79B8(u32 *arg0, u32 arg1) -{ - if (*arg0 > *arg0 + arg1) - { - *arg0 = 999999; - return; - } - - *arg0 = *arg0 + arg1; - if (*arg0 > 999999) - { - *arg0 = 999999; - } -} - -void sub_80B79E0(u32 *arg0, u32 arg1) -{ - if (*arg0 < arg1) - { - *arg0 = 0; - } - else - { - *arg0 = *arg0 - arg1; - } -} - -void sub_80B79F8(u8 *buffer, u32 arg1, u8 arg2) -{ - u8 width; - u8 i; - - if (arg1 > 999999) - { - width = 7; - } - else if (arg1 > 99999) - { - width = 6; - } - else if (arg1 > 10000) - { - width = 5; - } - else if (arg1 > 999) - { - width = 4; - } - else if (arg1 > 99) - { - width = 3; - } - else if (arg1 > 9) - { - width = 2; - } - else - { - width = 1; - } - - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x14; - buffer[2] = 0x06; - buffer += 3; - - for (i = 0; i < arg2 - width; i++) - { - buffer[0] = CHAR_SPACE; - buffer += 1; - } - - buffer[0] = CHAR_CURRENCY; - buffer += 1; - - buffer = ConvertIntToDecimalString(buffer, arg1); - - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x14; - buffer[2] = 0x00; - buffer[3] = EOS; -} - -void sub_80B7A94(u32 arg0, u8 size, u8 x, u8 y) -{ - u8 buffer[16]; - u8 stringWidth; - - sub_80B79F8(buffer, arg0, size); - stringWidth = sub_8072CA4(buffer); - - if (stringWidth >= (size + 1) * 8) - MenuPrint(buffer, x, y); - else - { - int xPlusOne = x + 1; - MenuPrint_PixelCoords(buffer, (xPlusOne + size) * 8 - stringWidth, y * 8, 1); - } -} - -void sub_80B7AEC(u32 arg0, u8 left, u8 top) -{ - u8 buffer[32]; - u8 *ptr; - - ptr = &buffer[0]; - - ptr[0] = CHAR_CURRENCY; - ptr++; - - ptr = ConvertIntToDecimalString(ptr, arg0); - - MenuPrint_RightAligned(buffer, left, top); - -#ifdef ENGLISH - ptr[0] = 0xFC; - ptr[1] = 0x14; - ptr[2] = 0x00; - ptr[3] = 0xFF; -#endif -} - -__attribute__((naked)) -void sub_80B7B34(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x4\n\ - mov r8, r0\n\ - adds r5, r1, 0\n\ - mov r9, r2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - lsls r5, 24\n\ - lsrs r5, 24\n\ - mov r1, r9\n\ - lsls r1, 8\n\ - mov r9, r1\n\ - ldr r4, _080B7BD8 @ =gDecoration10000_Gfx\n\ - adds r0, r1, r4\n\ - lsls r6, r5, 4\n\ - subs r6, r5\n\ - lsls r1, r6, 6\n\ - mov r3, r8\n\ - adds r3, 0x1\n\ - lsls r3, 5\n\ - ldr r2, _080B7BDC @ =0x06008000\n\ - adds r3, r2\n\ - adds r1, r3\n\ - movs r2, 0x20\n\ - str r3, [sp]\n\ - bl CpuFastSet\n\ - adds r4, 0x80\n\ - add r9, r4\n\ - adds r0, r5, 0x1\n\ - lsls r4, r0, 4\n\ - subs r4, r0\n\ - lsls r1, r4, 6\n\ - ldr r3, [sp]\n\ - adds r1, r3\n\ - mov r0, r9\n\ - movs r2, 0x20\n\ - bl CpuFastSet\n\ - movs r3, 0\n\ - lsls r5, 5\n\ - mov r0, r8\n\ - adds r7, r5, r0\n\ - lsls r6, 1\n\ - adds r6, 0x1\n\ - add r6, r8\n\ - ldr r1, _080B7BE0 @ =0xfffff000\n\ - adds r5, r1, 0\n\ - ldr r0, _080B7BE4 @ =0x0600f800\n\ - mov r12, r0\n\ - ldr r1, _080B7BE8 @ =0x0600f840\n\ - mov r9, r1\n\ - lsls r4, 1\n\ - adds r4, 0x1\n\ - add r4, r8\n\ -_080B7BAA:\n\ - adds r1, r7, r3\n\ - lsls r1, 1\n\ - mov r0, r12\n\ - adds r2, r1, r0\n\ - adds r0, r3, r6\n\ - adds r0, r5\n\ - strh r0, [r2]\n\ - add r1, r9\n\ - adds r0, r3, r4\n\ - adds r0, r5\n\ - strh r0, [r1]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x3\n\ - bls _080B7BAA\n\ - add sp, 0x4\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B7BD8: .4byte gDecoration10000_Gfx\n\ -_080B7BDC: .4byte 0x06008000\n\ -_080B7BE0: .4byte 0xfffff000\n\ -_080B7BE4: .4byte 0x0600f800\n\ -_080B7BE8: .4byte 0x0600f840\n\ - .syntax divided\n"); -} - -void sub_80B7BEC(u32 arg0, u8 x, u8 y) -{ - sub_80B7A94(arg0, 6, x + 6, y + 1); -} - -void sub_80B7C14(u32 arg0, u8 x, u8 y) -{ - MenuDrawTextWindow(x, y, x + 13, y + 3); - sub_80B7BEC(arg0, x, y); - - LoadCompressedObjectPic(&gUnknown_083CF584); - LoadCompressedObjectPalette(&gUnknown_083CF58C); - - gUnknown_02038734 = CreateSprite(&gSpriteTemplate_83CF56C, x * 8 + 19, y * 8 + 11, 0); -} - -void RemoveMoneyLabelObject(u8 x, u8 y) -{ - DestroySpriteAndFreeResources(&gSprites[gUnknown_02038734]); - FreeSpritePaletteByTag(SPRITE_TAG_MONEY); - MenuZeroFillWindowRect(x, y, x + 13, y + 3); -} - -bool8 sub_80B7CE8(void) -{ - return IsEnoughMoney(gSaveBlock1.money, gSpecialVar_0x8005); -} - -void sub_80B7D0C(void) -{ - sub_80B79E0(&gSaveBlock1.money, gSpecialVar_0x8005); -} diff --git a/src/mori_debug_menu.c b/src/mori_debug_menu.c deleted file mode 100644 index 273191192..000000000 --- a/src/mori_debug_menu.c +++ /dev/null @@ -1,168 +0,0 @@ -#include "global.h" -#include "mori_debug_menu.h" -#include "data2.h" -#include "daycare.h" -#include "learn_move.h" -#include "link.h" -#include "main.h" -#include "menu.h" -#include "pokeblock.h" -#include "start_menu.h" -#include "string_util.h" - -#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT) - -extern u8 (*gCallback_03004AE8)(void); - -u8 gUnknown_03004DA0[0x20]; - -extern u8 gUnknown_0839B22C[][3]; -extern u8 gUnknown_0839B24A[]; -extern u8 gUnknown_0839B24D[]; -extern u8 gUnknown_0839B255[]; -extern u8 gUnknown_0839B257[]; - -extern const struct MenuAction gMoriDebugMenuActions[]; - -void unref_sub_8083CF0(void) -{ - int i; - int id = SIO_MULTI_CNT->id; - gUnknown_03004DA0[0] = EOS; - StringAppend(gUnknown_03004DA0, gUnknown_0839B24A); - for (i = 0; i < 10; i++) - if ((word_3002910[id ^ 1] >> i) & 1) - StringAppend(gUnknown_03004DA0, gUnknown_0839B22C[i]); -} - -bool8 sub_8083D4C(void) -{ - if ( gMain.newKeys & A_BUTTON ) - { - CloseMenu(); - return TRUE; - } - else - return FALSE; -} - -u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr) -{ - u8 localPtr[52]; - u16 monData; - u16 var; - - monData = GetMonData(gPlayerParty, 11, ptr); - var = sub_8041870(monData); - StringCopy(localPtr, gSpeciesNames[monData]); - StringAppend(localPtr, gUnknown_0839B24D); - StringAppend(localPtr, gSpeciesNames[var]); - StringAppend(localPtr, gUnknown_0839B255); - MenuZeroFillScreen(); - MenuDrawTextWindow(0, 14, 30, 19); - MenuPrint(localPtr, 1, 15); - gCallback_03004AE8 = sub_8083D4C; - return 0; -} - -s8 MoriDebugMenu_Egg(void) -{ - if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) - sub_8041940(); - CloseMenu(); - - return 1; -} - -s8 MoriDebugMenu_MaleEgg(void) -{ - if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) - sub_8041950(); - CloseMenu(); - - return 1; -} - -s8 MoriDebugMenu_1000Steps(void) -{ - sub_8041790(1000); - CloseMenu(); - return 1; -} - -s8 MoriDebugMenu_10000Steps(void) -{ - sub_8041790(10000); - CloseMenu(); - return 1; -} - -s8 MoriDebugMenu_MoveTutor(void) -{ - sub_8132670(); - CloseMenu(); - return 1; -} - -s8 MoriDebugMenu_BreedEgg(void) -{ - u8 loopCounter; - - for (loopCounter = 0; loopCounter <= 5; loopCounter++) - { - //UB: Too few arguments for function 'GetMonData' - if ( GetMonData(&gPlayerParty[loopCounter], MON_DATA_IS_EGG) ) - { - u8 friendship = 0; - SetMonData(&gPlayerParty[loopCounter], MON_DATA_FRIENDSHIP, &friendship); - } - } - gSaveBlock1.filler_30B6 = -3; - CloseMenu(); - return 1; -} - -s8 MoriDebugMenu_LongName(void) -{ - SetMonData(gPlayerParty, MON_DATA_NICKNAME, gUnknown_0839B257); - CloseMenu(); - return 1; -} - -s8 MoriDebugMenu_PokeblockCase(void) -{ - s32 loopCounter; - - for (loopCounter = 0; loopCounter <= 39; loopCounter++) - sub_810CA6C(loopCounter); - - CloseMenu(); - return 1; -} - -bool8 MoriDebugMenuProcessInput(void) -{ - s8 choice = ProcessMenuInput(); - - switch (choice) - { - default: - gCallback_03004AE8 = gMoriDebugMenuActions[choice].func; - return FALSE; - case -2: - return FALSE; - case -1: - CloseMenu(); - return TRUE; - } -} - -s8 InitMoriDebugMenu(void) -{ - MenuZeroFillScreen(); - MenuDrawTextWindow(0, 0, 10, 19); - PrintMenuItems(1, 1, 9, gMoriDebugMenuActions); - InitMenu(0, 1, 1, 9, 0, 9); - gCallback_03004AE8 = MoriDebugMenuProcessInput; - return 0; -} diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c deleted file mode 100644 index 46b76fd88..000000000 --- a/src/mystery_event_menu.c +++ /dev/null @@ -1,341 +0,0 @@ -#include "global.h" -#include "mystery_event_menu.h" -#include "link.h" -#include "main.h" -#include "menu.h" -#include "mystery_event_script.h" -#include "palette.h" -#include "save.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "text.h" - -extern u8 unk_2000000[]; - -static EWRAM_DATA u8 gUnknown_02039338 = 0; - -static void VBlankCB(void); -static bool8 CheckLanguageMatch(void); -static bool8 GetEventLoadMessage(u8 *dest, u32 status); -static void CB2_MysteryEventMenu(void); - -static void VBlankCB(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static bool8 CheckLanguageMatch(void) -{ - bool8 val = FALSE; - - if (gLinkPlayers[0].language == gLinkPlayers[1].language) - val = TRUE; - - return val; -} - -void CB2_InitMysteryEventMenu(void) -{ - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); - SetVBlankCallback(VBlankCB); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); - MenuZeroFillScreen(); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; - REG_BLDCNT = 0; - CreateTask(Task_DestroySelf, 0); - StopMapMusic(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - FillPalette(0, 0, 2); - SetMainCallback2(CB2_MysteryEventMenu); -} - -static bool8 GetEventLoadMessage(u8 *dest, u32 status) -{ - bool8 retVal = 1; - - if (status == 0) - { - StringCopy(dest, gSystemText_EventLoadSuccess); - retVal = 0; - } - - if (status == 2) - retVal = 0; - - if (status == 1) - StringCopy(dest, gSystemText_LoadingError); - - return retVal; -} - -static void CB2_MysteryEventMenu(void) -{ - u16 unkVal; - - switch (gMain.state) - { - case 0: - MenuDrawTextWindow(0, 14, 29, 19); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); - gMain.state++; - break; - case 1: - if (gPaletteFade.active) - break; - sub_8072044(gSystemText_LinkStandby); - gMain.state++; - break; - case 2: - if (MenuUpdateWindowText()) - { - gMain.state++; - gLinkType = 21761; - OpenLink(); - } - break; - case 3: - if ((gLinkStatus & 0x20) && (gLinkStatus & 0x1C) > 4) - { - PlaySE(SE_PIN); - sub_8072044(gSystemText_LoadEventPressA); - gMain.state++; - } - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - CloseLink(); - gMain.state = 15; - } - break; - case 4: - if (MenuUpdateWindowText()) - gMain.state++; - break; -#ifdef NONMATCHING - case 5: - if (GetLinkPlayerCount_2() != 2) - { - GetEventLoadMessage(gStringVar4, 1); - sub_8072044(gStringVar4); - gMain.state = 13; - break; - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_8007F4C(); - MenuDrawTextWindow(6, 5, 23, 8); - MenuPrint(gSystemText_LoadingEvent, 7, 6); - gMain.state++; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - CloseLink(); - gMain.state = 15; - } - break; - case 6: - if (IsLinkConnectionEstablished()) - { - if (!gReceivedRemoteLinkPlayers) - break; - - if (GetLinkPlayerDataExchangeStatusTimed() == 3) - { - sub_800832C(); - MenuZeroFillWindowRect(6, 5, 23, 8); - GetEventLoadMessage(gStringVar4, 1); - sub_8072044(gStringVar4); - gMain.state = 13; - break; - } - else if (CheckLanguageMatch()) - { - sub_8072044(gSystemText_DontCutLink); - gMain.state++; - break; - } - else - { - CloseLink(); - MenuZeroFillWindowRect(6, 5, 23, 8); - GetEventLoadMessage(gStringVar4, 1); - sub_8072044(gStringVar4); - gMain.state = 13; - break; - } - } - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - CloseLink(); - gMain.state = 15; - break; - } - break; -#else - case 5: - if (GetLinkPlayerCount_2() != 2) - { - goto label; - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_8007F4C(); - MenuDrawTextWindow(6, 5, 23, 8); - MenuPrint(gSystemText_LoadingEvent, 7, 6); - gMain.state++; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - CloseLink(); - gMain.state = 15; - } - break; - case 6: - if (IsLinkConnectionEstablished()) - { - register u8 *ptr asm("r0"); - register u32 offset1 asm("r2"); - register u32 offset2 asm("r1"); - - if (!gReceivedRemoteLinkPlayers) - break; - - if (GetLinkPlayerDataExchangeStatusTimed() == 3) - { - sub_800832C(); - MenuZeroFillWindowRect(6, 5, 23, 8); - GetEventLoadMessage(gStringVar4, 1); - sub_8072044(gStringVar4); - ptr = (u8 *)&gMain; - offset1 = offsetof(struct Main, state); - asm("" ::: "r1"); - ptr += offset1; - *ptr = 13; - } - else if (CheckLanguageMatch()) - { - register u8 *ptr2 asm("r1"); - register int offset3 asm("r0"); - register int dummy asm("r2"); - sub_8072044(gSystemText_DontCutLink); - ptr2 = (u8 *)&gMain; - offset3 = offsetof(struct Main, state); - if (dummy) - dummy++; - ptr2 += offset3; - (*ptr2)++; - break; - } - else - { - CloseLink(); - MenuZeroFillWindowRect(6, 5, 23, 8); - label: - GetEventLoadMessage(gStringVar4, 1); - sub_8072044(gStringVar4); - ptr = (u8 *)&gMain; - offset2 = offsetof(struct Main, state); - ptr += offset2; - *ptr = 13; - } - break; - } - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - CloseLink(); - gMain.state = 15; - break; - } - break; -#endif - case 7: - if (MenuUpdateWindowText()) - gMain.state++; - break; - case 8: - if (GetBlockReceivedStatus()) - { - ResetBlockReceivedFlags(); - gMain.state++; - } - break; - case 9: - gMain.state++; - break; - case 10: - sub_800832C(); - gMain.state++; - break; - case 11: - if (gReceivedRemoteLinkPlayers) - break; - unkVal = RunMysteryEventScript(unk_2000000); - CpuFill32(0, unk_2000000, 0x7D4); - if (!GetEventLoadMessage(gStringVar4, unkVal)) - TrySavingData(NORMAL_SAVE); - gMain.state++; - break; - case 12: - sub_8072044(gStringVar4); - gMain.state++; - break; - case 13: - MenuZeroFillWindowRect(6, 5, 23, 8); - if (MenuUpdateWindowText()) - { - gMain.state++; - gUnknown_02039338 = 0; - } - break; - case 14: - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gMain.state++; - } - break; - case 15: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - gMain.state++; - break; - case 16: - if (!gPaletteFade.active) - DoSoftReset(); - break; - } - - if (gLinkStatus & 0x40) - { - if (!IsLinkMaster()) - { - CloseLink(); - MenuZeroFillWindowRect(6, 5, 23, 8); - GetEventLoadMessage(gStringVar4, 1); - sub_8072044(gStringVar4); - gMain.state = 13; - } - } - - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c deleted file mode 100644 index f507942a7..000000000 --- a/src/mystery_event_script.c +++ /dev/null @@ -1,462 +0,0 @@ -#include "global.h" -#include "berry.h" -#include "easy_chat.h" -#include "event_data.h" -#include "mail_data.h" -#include "mystery_event_script.h" -#include "pokedex.h" -#include "pokemon.h" -#include "pokemon_size_record.h" -#include "script.h" -#include "species.h" -#include "strings.h" -#include "string_util.h" -#include "text.h" -#include "util.h" - -#if ENGLISH -#define LANGUAGE_MASK 0x2 -#elif GERMAN -#define LANGUAGE_MASK 0x4 -#endif - -#ifdef SAPPHIRE -#define VERSION_MASK 0x100 -#else -#define VERSION_MASK 0x80 -#endif - -extern void party_compaction(void); -extern void sub_813601C(void); - -extern ScrCmdFunc gMysteryEventScriptCmdTable[]; -extern ScrCmdFunc gMysteryEventScriptCmdTableEnd[]; - -extern const u8 gOtherText_BerryObtainedDadHasIt[]; -extern const u8 gOtherText_BerryTransformed[]; -extern const u8 gOtherText_BerryAlreadyObtained[]; -extern const u8 gOtherText_SpecialRibbonReceived[]; -extern const u8 gOtherText_DexUpgraded[]; -extern const u8 gOtherText_RareWordAdded[]; -extern const u8 gOtherText_PokeWasSentOver[]; -extern const u8 gOtherText_PartyIsFull[]; -extern const u8 gOtherText_NewTrainerInHoenn[]; -extern const u8 gOtherText_DataCannotUseVersion[]; - -static EWRAM_DATA struct ScriptContext sMysteryEventScriptContext = {0}; - -static bool32 CheckCompatibility(u16 a1, u32 a2, u16 a3, u32 a4) -{ - if (!(a1 & LANGUAGE_MASK)) - return FALSE; - - if (!(a2 & LANGUAGE_MASK)) - return FALSE; - - if (!(a3 & 0x4)) - return FALSE; - - if (!(a4 & VERSION_MASK)) - return FALSE; - - return TRUE; -} - -static void SetIncompatible(void) -{ - StringExpandPlaceholders(gStringVar4, gOtherText_DataCannotUseVersion); - SetMysteryEventScriptStatus(3); -} - -static void InitMysteryEventScript(struct ScriptContext *ctx, u8 *script) -{ - InitScriptContext(ctx, gMysteryEventScriptCmdTable, gMysteryEventScriptCmdTableEnd); - SetupBytecodeScript(ctx, script); - ctx->data[0] = (u32)script; - ctx->data[1] = 0; - ctx->data[2] = 0; - ctx->data[3] = 0; -} - -static bool32 RunMysteryEventScriptCommand(struct ScriptContext *ctx) -{ - if (RunScriptCommand(ctx) && ctx->data[3]) - return TRUE; - else - return FALSE; -} - -u32 RunMysteryEventScript(u8 *script) -{ - struct ScriptContext *ctx = &sMysteryEventScriptContext; - InitMysteryEventScript(ctx, script); - while (RunMysteryEventScriptCommand(ctx)) - ; - return ctx->data[2]; -} - -void SetMysteryEventScriptStatus(u32 val) -{ - sMysteryEventScriptContext.data[2] = val; -} - -static int CalcChecksum(u8 *data, int size) -{ - unsigned int i; - int sum = 0; - - for (i = 0; i < size; i++) - sum += data[i]; - - return sum; -} - -static u32 GetWord(u8 *ptr) -{ - return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); -} - -static void SetWord(u8 *ptr, u32 val) -{ - ptr[0] = val; - ptr[1] = val >> 8; - ptr[2] = val >> 16; - ptr[3] = val >> 24; -} - -bool8 unref_sub_81261B4(u8 *a1, int a2) -{ - if (a1[0x0] == 1 && a1[0x11] == 15 && !GetWord(a1 + 0x12)) - { - int v4 = GetWord(a1 + 0x16) - a2 + (int)a1; - int v5 = GetWord(a1 + 0x1A); - int v6 = CalcChecksum((u8*)v4, v5 - a2 + (int)a1 - v4); - SetWord(a1 + 0x12, v6); - return TRUE; - } - - return FALSE; -} - -bool8 unref_sub_812620C(u8 *a1, int a2) -{ - if (a1[0x0] == 1 && a1[0x11] == 16 && !GetWord(a1 + 0x12)) - { - int v4 = GetWord(a1 + 0x16) - a2 + (int)a1; - int v5 = GetWord(a1 + 0x1A); - int v6 = CalcCRC16((u8*)v4, v5 - a2 + (int)a1 - v4); - SetWord(a1 + 0x12, v6); - return TRUE; - } - - return FALSE; -} - -static u32 CalcRecordMixingGiftChecksum(void) -{ - u32 sum = 0; - int i; - char *data = (char *)&gSaveBlock1.recordMixingGift.data; - - for (i = 0; i < sizeof(gSaveBlock1.recordMixingGift.data); i++) - { - sum += data[i]; - } - - return sum; -} - -static bool32 IsRecordMixingGiftValid(void) -{ - struct RecordMixingGiftData *data = &gSaveBlock1.recordMixingGift.data; - - u32 checksum = CalcRecordMixingGiftChecksum(); - - if (!data->unk0) - return FALSE; - - if (!data->quantity) - return FALSE; - - if (!data->itemId) - return FALSE; - - if (checksum == 0) - return FALSE; - - if (checksum == gSaveBlock1.recordMixingGift.checksum) - return TRUE; - else - return FALSE; -} - -static void ClearRecordMixingGift(void) -{ - CpuFill16(0, &gSaveBlock1.recordMixingGift, sizeof(gSaveBlock1.recordMixingGift)); -} - -static void SetRecordMixingGift(u8 unk, u8 quantity, u16 itemId) -{ - if (!unk || !quantity || !itemId) - { - ClearRecordMixingGift(); - } - else - { - gSaveBlock1.recordMixingGift.data.unk0 = unk; - gSaveBlock1.recordMixingGift.data.quantity = quantity; - gSaveBlock1.recordMixingGift.data.itemId = itemId; - gSaveBlock1.recordMixingGift.checksum = CalcRecordMixingGiftChecksum(); - } -} - -u16 GetRecordMixingGift(void) -{ - struct RecordMixingGiftData *data = &gSaveBlock1.recordMixingGift.data; - - if (!IsRecordMixingGiftValid()) - { - ClearRecordMixingGift(); - return 0; - } - else - { - u16 itemId = data->itemId; - data->quantity--; - if (data->quantity == 0) - ClearRecordMixingGift(); - else - gSaveBlock1.recordMixingGift.checksum = CalcRecordMixingGiftChecksum(); - return itemId; - } -} - -bool8 MEScrCmd_end(struct ScriptContext *ctx) -{ - StopScript(ctx); - return TRUE; -} - -bool8 MEScrCmd_checkcompat(struct ScriptContext *ctx) -{ - u16 v1; - u32 v2; - u16 v3; - u32 v4; - - ctx->data[1] = ScriptReadWord(ctx); - v1 = ScriptReadHalfword(ctx); - v2 = ScriptReadWord(ctx); - v3 = ScriptReadHalfword(ctx); - v4 = ScriptReadWord(ctx); - - if (CheckCompatibility(v1, v2, v3, v4) == TRUE) - ctx->data[3] = 1; - else - SetIncompatible(); - - return TRUE; -} - -bool8 MEScrCmd_nop(struct ScriptContext *ctx) -{ - return FALSE; -} - -bool8 MEScrCmd_setstatus(struct ScriptContext *ctx) -{ - u8 value = ScriptReadByte(ctx); - ctx->data[2] = value; - return FALSE; -} - -bool8 MEScrCmd_setmsg(struct ScriptContext *ctx) -{ - u8 value = ScriptReadByte(ctx); - u8 *str = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - if (value == 255 || value == ctx->data[2]) - StringExpandPlaceholders(gStringVar4, str); - return FALSE; -} - -bool8 MEScrCmd_runscript(struct ScriptContext *ctx) -{ - u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - ScriptContext2_RunNewScript(script); - return FALSE; -} - -bool8 MEScrCmd_setenigmaberry(struct ScriptContext *ctx) -{ - u8 *str; - const u8 *message; - bool32 haveBerry = IsEnigmaBerryValid(); - u8 *berry = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - StringCopyN(gStringVar1, gSaveBlock1.enigmaBerry.berry.name, 7); - SetEnigmaBerry(berry); - StringCopyN(gStringVar2, gSaveBlock1.enigmaBerry.berry.name, 7); - - if (!haveBerry) - { - str = gStringVar4; - message = gOtherText_BerryObtainedDadHasIt; - } - else if (StringCompare(gStringVar1, gStringVar2)) - { - str = gStringVar4; - message = gOtherText_BerryTransformed; - } - else - { - str = gStringVar4; - message = gOtherText_BerryAlreadyObtained; - } - - StringExpandPlaceholders(str, message); - - ctx->data[2] = 2; - - if (IsEnigmaBerryValid() == TRUE) - VarSet(0x402D, 1); - else - ctx->data[2] = 1; - - return FALSE; -} - -bool8 MEScrCmd_giveribbon(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - u8 ribbonId = ScriptReadByte(ctx); - GiveGiftRibbonToParty(index, ribbonId); - StringExpandPlaceholders(gStringVar4, gOtherText_SpecialRibbonReceived); - ctx->data[2] = 2; - return FALSE; -} - -bool8 MEScrCmd_initramscript(struct ScriptContext *ctx) -{ - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u8 objectId = ScriptReadByte(ctx); - u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - u8 *scriptEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - InitRamScript(script, scriptEnd - script, mapGroup, mapNum, objectId); - return FALSE; -} - -bool8 MEScrCmd_givenationaldex(struct ScriptContext *ctx) -{ - EnableNationalPokedex(); - StringExpandPlaceholders(gStringVar4, gOtherText_DexUpgraded); - ctx->data[2] = 2; - return FALSE; -} - -bool8 MEScrCmd_addrareword(struct ScriptContext *ctx) -{ - sub_80EB890(ScriptReadByte(ctx)); - StringExpandPlaceholders(gStringVar4, gOtherText_RareWordAdded); - ctx->data[2] = 2; - return FALSE; -} - -bool8 MEScrCmd_setrecordmixinggift(struct ScriptContext *ctx) -{ - u8 unk = ScriptReadByte(ctx); - u8 quantity = ScriptReadByte(ctx); - u16 itemId = ScriptReadHalfword(ctx); - SetRecordMixingGift(unk, quantity, itemId); - return FALSE; -} - -bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) -{ - struct MailStruct mail; - struct Pokemon pokemon; - u16 species; - u16 heldItem; - u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; - void *pokemonPtr = (void *)data; - void *mailPtr = (void *)(data + sizeof(struct Pokemon)); - - pokemon = *(struct Pokemon *)pokemonPtr; - species = GetMonData(&pokemon, MON_DATA_SPECIES2); - - if (species == SPECIES_EGG) - StringCopyN(gStringVar1, gSystemText_Egg, 11); - else - StringCopyN(gStringVar1, gSystemText_Pokemon2, 11); - - if (gPlayerPartyCount == 6) - { - StringExpandPlaceholders(gStringVar4, gOtherText_PartyIsFull); - ctx->data[2] = 3; - } - else - { - memcpy(&gPlayerParty[5], pokemonPtr, sizeof(struct Pokemon)); - memcpy(&mail, mailPtr, sizeof(struct MailStruct)); - - if (species != SPECIES_EGG) - { - u16 pokedexNum = SpeciesToNationalPokedexNum(species); - GetNationalPokedexFlag(pokedexNum, 2); - GetNationalPokedexFlag(pokedexNum, 3); - } - - heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM); - if (ItemIsMail(heldItem)) - GiveMailToMon2(&gPlayerParty[5], &mail); - party_compaction(); - CalculatePlayerPartyCount(); - StringExpandPlaceholders(gStringVar4, gOtherText_PokeWasSentOver); - ctx->data[2] = 2; - } - - return FALSE; -} - -bool8 MEScrCmd_addtrainer(struct ScriptContext *ctx) -{ - u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; - memcpy(gSaveBlock2.filler_A8.ereaderTrainer, (void *)data, sizeof(gSaveBlock2.filler_A8.ereaderTrainer)); - sub_813601C(); - StringExpandPlaceholders(gStringVar4, gOtherText_NewTrainerInHoenn); - ctx->data[2] = 2; - return FALSE; -} - -bool8 MEScrCmd_enableresetrtc(struct ScriptContext *ctx) -{ - EnableResetRTC(); - StringExpandPlaceholders(gStringVar4, gSystemText_ClockAdjustmentUsable); - ctx->data[2] = 2; - return FALSE; -} - -bool8 MEScrCmd_checksum(struct ScriptContext *ctx) -{ - int checksum = ScriptReadWord(ctx); - u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - if (checksum != CalcChecksum(data, dataEnd - data)) - { - ctx->data[3] = 0; - ctx->data[2] = 1; - } - return TRUE; -} - -bool8 MEScrCmd_crc(struct ScriptContext *ctx) -{ - int crc = ScriptReadWord(ctx); - u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - if (crc != CalcCRC16(data, dataEnd - data)) - { - ctx->data[3] = 0; - ctx->data[2] = 1; - } - return TRUE; -} diff --git a/src/name_string_util.c b/src/name_string_util.c deleted file mode 100644 index f1a935453..000000000 --- a/src/name_string_util.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "global.h" -#include "name_string_util.h" -#include "string_util.h" -#include "text.h" - -void PadNameString(u8 *a1, u8 a2) -{ - u8 i; - - StripExtCtrlCodes(a1); - i = StringLength(a1); - - if (a2 == 0xFC) - { - while (i < 6) - { - a1[i] = 0xFC; - a1[i + 1] = 7; - i += 2; - } - } - else - { - while (i < 6) - { - a1[i] = a2; - i++; - } - } - - a1[i] = EOS; -} - -void SanitizeNameString(u8 *a1) -{ - if (StringLength(a1) < 6) - ConvertInternationalString(a1, 1); - else - StripExtCtrlCodes(a1); -} diff --git a/src/naming_screen.c b/src/naming_screen.c deleted file mode 100644 index 6c107f022..000000000 --- a/src/naming_screen.c +++ /dev/null @@ -1,2038 +0,0 @@ -#include "global.h" -#include "naming_screen.h" -#include "data2.h" -#include "field_effect.h" -#include "field_map_obj.h" -#include "field_player_avatar.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "pokemon_icon.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "text.h" -#include "trig.h" -#include "util.h" - -#ifdef ENGLISH -#define COLUMN_COUNT 9 -#elif GERMAN -#define COLUMN_COUNT 10 -#endif - -extern u16 gKeyRepeatStartDelay; - -extern u8 unk_2000000[]; - -#define namingScreenData (*(struct NamingScreenData *)(unk_2000000)) - -const u32 gSpriteImage_83CE094[] = INCBIN_U32("graphics/naming_screen/pc_icon/0.4bpp"); -const u32 gSpriteImage_83CE154[] = INCBIN_U32("graphics/naming_screen/pc_icon/1.4bpp"); - -//Some unused pointer, perhaps. -asm(".section .rodata\n\ -@ XXX: what is this?\n\ - .align 2\n\ - .4byte 0x2000000\n"); - -extern u16 *const gUnknown_083CE28C[]; -extern const struct SubspriteTable gSubspriteTables_83CE558[]; -extern const struct SubspriteTable gSubspriteTables_83CE560[]; -extern const struct SubspriteTable gSubspriteTables_83CE578[]; -extern const struct SubspriteTable gSubspriteTables_83CE580[]; -extern const struct SpriteTemplate gSpriteTemplate_83CE5C8; -extern const struct SpriteTemplate gSpriteTemplate_83CE5E0; -extern const struct SpriteTemplate gSpriteTemplate_83CE5F8; -extern const struct SpriteTemplate gSpriteTemplate_83CE610; -extern const struct SpriteTemplate gSpriteTemplate_83CE628; -extern const struct SpriteTemplate gSpriteTemplate_83CE640; -extern const struct SpriteTemplate gSpriteTemplate_83CE658; -extern const struct SpriteTemplate gSpriteTemplate_83CE670; -extern const struct SpriteTemplate gSpriteTemplate_83CE688; -extern const struct SpriteSheet gUnknown_083CE6A0[]; -extern const struct SpritePalette gUnknown_083CE708[]; -extern const u8 gNamingScreenMenu_Gfx[]; -extern const u16 gNamingScreenPalettes[]; -extern const u16 gUnknown_083CE748[]; -extern const u16 gUnknown_083CEBF8[]; -extern const u16 gUnknown_083CF0A8[]; -extern const u16 gUnknown_08E86258[]; - -static void C2_NamingScreen(void); -static void sub_80B5AA0(void); -static void StoreNamingScreenParameters(u8, u8 *, u16, u16, u32, MainCallback); -static void NamingScreen_TurnOffScreen(void); -static void NamingScreen_Init(void); -static void NamingScreen_ClearVram(void); -static void NamingScreen_ClearOam(void); -static void NamingScreen_SetUpVideoRegs(void); -static void NamingScreen_SetUpWindow(void); -static void NamingScreen_ResetObjects(void); -static void sub_80B5DFC(void); -static void sub_80B5E20(void); -static void sub_80B5E3C(void); -static void NamingScreen_InitDisplayMode(void); -static void Task_DoNothing(u8); -static void sub_80B7558(void); -static void sub_80B753C(void); -static void sub_80B7680(void); -static void sub_80B75C4(void); -static void sub_80B7794(void); -static void sub_80B78A8(void); -static void sub_80B7960(void); -static void CursorInit(void); -static void sub_80B6A80(void); -static void sub_80B6CA8(void); -static void sub_80B6D04(void); -static void sub_80B6E44(void); -static void InputInit(void); -static void sub_80B6438(void); -static void sub_80B5E50(void); -static void Task_NamingScreenMain(u8); -static void SetInputState(u8); -static void sub_80B68D8(u8); -static bool8 HandleKeyboardEvent(void); -static bool8 IsCursorAnimFinished(void); -static void MoveCursorToOKButton(void); -static void sub_80B6B14(void); -static void StartPageSwapAnim(void); -static void sub_80B6888(u8); -static void sub_80B6460(u8, u8, u8); -static bool8 IsPageSwapAnimNotInProgress(void); -static void sub_80B7614(void); -static void GetCursorPos(s16 *, s16 *); -static void SetCursorPos(s16, s16); -static void sub_80B77F8(void); -static void sub_80B74B0(void); -static void DisplaySentToPCMessage(void); -static u8 GetKeyRoleAtCursorPos(void); -static u8 sub_80B61C8(void); -static void DeleteTextCharacter(void); -static void sub_80B7090(void); -static u8 GetInputEvent(void); -static bool8 sub_80B7004(void); -static void sub_80B6914(void); -static void Task_HandlePageSwapAnim(u8); -static void sub_80B6C48(u8, struct Sprite *, struct Sprite *); -static u8 GetTextCaretPosition(void); -static u8 GetCharAtKeyboardPos(s16, s16); -static bool8 sub_80B7104(void); -static bool8 sub_80B713C(void); -static void AddTextCharacter(u8); -static bool8 sub_80B7198(u8); -static bool8 sub_80B7264(u8); -static void sub_80B7370(u8, u8); -static void sub_80B73CC(u8, u8); -static bool8 sub_80B71E4(u8); -static void sub_80B7474(u8, u8); -static void sub_80B72A4(u8, u8); -static bool8 sub_80B720C(u8); -static void sub_80B7568(void); -static void sub_80B75B0(void); -static void sub_80B7698(u16 *, const u16 *); -static void sub_80B76E0(); -static void nullsub_20(u8, u8); -static void PrintKeyboardCharacters(u8); - -void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) -{ - StoreNamingScreenParameters(templateNum, destBuffer, c, d, e, returnCallback); - SetMainCallback2(C2_NamingScreen); -} - -static void C2_NamingScreen(void) -{ - switch (gMain.state) - { - case 0: - NamingScreen_TurnOffScreen(); - NamingScreen_Init(); - gMain.state++; - break; - case 1: - NamingScreen_ClearVram(); - gMain.state++; - break; - case 2: - NamingScreen_ClearOam(); - gMain.state++; - break; - case 3: - NamingScreen_SetUpVideoRegs(); - gMain.state++; - break; - case 4: - NamingScreen_SetUpWindow(); - gMain.state++; - break; - case 5: - NamingScreen_ResetObjects(); - gMain.state++; - break; - case 6: - sub_80B5DFC(); - gMain.state++; - break; - case 7: - sub_80B5E20(); - sub_80B5E3C(); - NamingScreen_InitDisplayMode(); - SetMainCallback2(sub_80B5AA0); - break; - } -} - -static void sub_80B5AA0(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void VBlankCB_NamingScreen(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - REG_BG1VOFS = namingScreenData.bg1vOffset; - REG_BG2VOFS = namingScreenData.bg2vOffset; - REG_BG1CNT &= 0xFFFC; - REG_BG1CNT |= namingScreenData.unk8; - REG_BG2CNT &= 0xFFFC; - REG_BG2CNT |= namingScreenData.unkA; -} - -static void StoreNamingScreenParameters(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) -{ - struct Task *task; - - //Create a task that does nothing, and use it as a temporary space to store parameters - task = &gTasks[CreateTask(Task_DoNothing, 0xFF)]; - task->data[0] = templateNum; - task->data[1] = c; - task->data[2] = d; - task->data[3] = e >> 16; - task->data[4] = e; - StoreWordInTwoHalfwords(&task->data[5], (u32)destBuffer); - StoreWordInTwoHalfwords(&task->data[7], (u32)returnCallback); -} - -static void GetNamingScreenParameters(void) -{ - u8 taskId; - struct Task *task; - - taskId = FindTaskIdByFunc(Task_DoNothing); - task = &gTasks[taskId]; - namingScreenData.templateNum = task->data[0]; - namingScreenData.unk3E = task->data[1]; - namingScreenData.unk40 = task->data[2]; - namingScreenData.unk42 = (task->data[3] << 16) | (u16)task->data[4]; - LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&namingScreenData.destBuffer); - LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&namingScreenData.returnCallback); - DestroyTask(taskId); -} - -static void Task_DoNothing(u8 taskId) -{ -} - -static void NamingScreen_TurnOffScreen(void) -{ - SetVBlankCallback(NULL); - SetHBlankCallback(NULL); - REG_DISPCNT = 0; -} - -static void NamingScreen_InitDisplayMode(void) -{ - u16 savedIme; - - SetVBlankCallback(VBlankCB_NamingScreen); - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; -} - -static void NamingScreen_ClearVram(void) -{ - u8 *addr = (void *)VRAM; - u32 size = 0x10000; - - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } -} - -static void NamingScreen_ClearOam(void) -{ - DmaClear16(3, (void *)OAM, 0x400); -} - -static void NamingScreen_SetUpVideoRegs(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_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(28) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(29) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(30) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BLDCNT = 0x640; - REG_BLDALPHA = 0x80C; -} - -static const struct NamingScreenTemplate *const sNamingScreenTemplates[]; //forward declaration - -static void NamingScreen_Init(void) -{ - GetNamingScreenParameters(); - namingScreenData.state = 0; - namingScreenData.bg1vOffset = 0; - namingScreenData.bg2vOffset = 0; - namingScreenData.unk8 = 1; - namingScreenData.unkA = 2; - namingScreenData.unkC = 0; - namingScreenData.unkD = 1; - namingScreenData.template = sNamingScreenTemplates[namingScreenData.templateNum]; - namingScreenData.currentPage = namingScreenData.template->unk4; - namingScreenData.unk2 = 14 - namingScreenData.template->maxChars / 2; - namingScreenData.unk3C = gKeyRepeatStartDelay; - memset(namingScreenData.textBuffer, 0xFF, sizeof(namingScreenData.textBuffer)); - if (namingScreenData.template->unk0 != 0) - StringCopy(namingScreenData.textBuffer, namingScreenData.destBuffer); - gKeyRepeatStartDelay = 16; -} - -static void NamingScreen_SetUpWindow(void) -{ - SetUpWindowConfig(&gWindowConfig_81E6E88); - InitMenuWindow(&gWindowConfig_81E6E88); -} - -static void NamingScreen_ResetObjects(void) -{ - ResetPaletteFade(); - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); -} - -static void sub_80B5DFC(void) -{ - sub_80B7558(); - sub_80B753C(); - sub_80B7680(); - sub_80B75C4(); - sub_80B7794(); - sub_80B78A8(); - sub_80B7960(); -} - -static void sub_80B5E20(void) -{ - CursorInit(); - sub_80B6A80(); - sub_80B6CA8(); - sub_80B6D04(); - sub_80B6E44(); -} - -static void sub_80B5E3C(void) -{ - InputInit(); - sub_80B6438(); - sub_80B5E50(); -} - -//-------------------------------------------------- -// Naming screen main -//-------------------------------------------------- - -static bool8 MainState_BeginFadeIn(struct Task *); -static bool8 MainState_WaitFadeIn(struct Task *); -static bool8 MainState_HandleInput(struct Task *); -static bool8 MainState_MoveToOKButton(struct Task *); -static bool8 MainState_StartPageSwap(struct Task *); -static bool8 MainState_WaitPageSwap(struct Task *); -static bool8 MainState_6(struct Task *); -static bool8 MainState_UpdateSentToPCMessage(struct Task *); -static bool8 MainState_BeginFadeInOut(struct Task *); -static bool8 MainState_WaitFadeOutAndExit(struct Task *); - -static bool8 (*const sMainStateFuncs[])(struct Task *) = -{ - MainState_BeginFadeIn, - MainState_WaitFadeIn, - MainState_HandleInput, - MainState_MoveToOKButton, - MainState_StartPageSwap, - MainState_WaitPageSwap, - MainState_6, - MainState_UpdateSentToPCMessage, - MainState_BeginFadeInOut, - MainState_WaitFadeOutAndExit, -}; - -static void sub_80B5E50(void) -{ - u8 taskId; - - taskId = CreateTask(Task_NamingScreenMain, 2); - Task_NamingScreenMain(taskId); -} - -static void Task_NamingScreenMain(u8 taskId) -{ - while (sMainStateFuncs[namingScreenData.state](&gTasks[taskId]) != 0) - ; -} - -static bool8 MainState_BeginFadeIn(struct Task *task) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - namingScreenData.state++; - return 0; -} - -static bool8 MainState_WaitFadeIn(struct Task *task) -{ - if (!gPaletteFade.active) - { - SetInputState(INPUT_STATE_ENABLED); - sub_80B68D8(1); - namingScreenData.state++; - } - return FALSE; -} - -static bool8 MainState_HandleInput(struct Task *task) -{ - return HandleKeyboardEvent(); -} - -static bool8 MainState_MoveToOKButton(struct Task *task) -{ - if (IsCursorAnimFinished()) - { - SetInputState(INPUT_STATE_ENABLED); - MoveCursorToOKButton(); - namingScreenData.state = MAIN_STATE_HANDLE_INPUT; - } - return FALSE; -} - -static bool8 MainState_StartPageSwap(struct Task *task) -{ - SetInputState(INPUT_STATE_DISABLED); - sub_80B6B14(); - StartPageSwapAnim(); - sub_80B6888(1); - sub_80B6460(0, 0, 1); - PlaySE(SE_WIN_OPEN); - namingScreenData.state = MAIN_STATE_WAIT_PAGE_SWAP; - return FALSE; -} - -static bool8 MainState_WaitPageSwap(struct Task *task) -{ - s16 cursorX; - s16 cursorY; - - if (IsPageSwapAnimNotInProgress()) - { - namingScreenData.state = MAIN_STATE_HANDLE_INPUT; - namingScreenData.currentPage++; - namingScreenData.currentPage %= 3; - sub_80B7614(); - sub_80B77F8(); - SetInputState(INPUT_STATE_ENABLED); - GetCursorPos(&cursorX, &cursorY); -#if ENGLISH - if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) - cursorX = 5; -#elif GERMAN - if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 7 || cursorX == 8)) - cursorX = 6; -#endif - SetCursorPos(cursorX, cursorY); - sub_80B6888(0); - } - return FALSE; -} - -static bool8 MainState_6(struct Task *task) -{ - sub_80B74B0(); - SetInputState(INPUT_STATE_DISABLED); - sub_80B68D8(0); - sub_80B6460(3, 0, 1); - gKeyRepeatStartDelay = namingScreenData.unk3C; - if (namingScreenData.templateNum == NAMING_SCREEN_TEMPLATE_MON_NAME - && CalculatePlayerPartyCount() >= 6) - { - DisplaySentToPCMessage(); - namingScreenData.state = MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE; - return FALSE; - } - else - { - namingScreenData.state = MAIN_STATE_BEGIN_FADE_OUT; - return TRUE; //Exit the naming screen - } -} - -static bool8 MainState_UpdateSentToPCMessage(struct Task *task) -{ - if (MenuUpdateWindowText()) - namingScreenData.state++; - return FALSE; -} - -static bool8 MainState_BeginFadeInOut(struct Task *task) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - namingScreenData.state++; - return FALSE; -} - -static bool8 MainState_WaitFadeOutAndExit(struct Task *task) -{ - if (!gPaletteFade.active) - SetMainCallback2(namingScreenData.returnCallback); - return FALSE; -} - -//-------------------------------------------------- -// Keyboard handling -//-------------------------------------------------- - -enum -{ - KEY_ROLE_CHAR, - KEY_ROLE_PAGE, - KEY_ROLE_BACKSPACE, - KEY_ROLE_OK, -}; - - -static bool8 KeyboardKeyHandler_Character(u8); -static bool8 KeyboardKeyHandler_Page(u8); -static bool8 KeyboardKeyHandler_Backspace(u8); -static bool8 KeyboardKeyHandler_OK(u8); - -static bool8 (*const sKeyboardKeyHandlers[])(u8) = -{ - KeyboardKeyHandler_Character, - KeyboardKeyHandler_Page, - KeyboardKeyHandler_Backspace, - KeyboardKeyHandler_OK, -}; - -static bool8 HandleKeyboardEvent(void) -{ - u8 event = GetInputEvent(); - u8 keyRole = GetKeyRoleAtCursorPos(); - - if (event == KBEVENT_PRESSED_SELECT) - return sub_80B61C8(); - else if (event == KBEVENT_PRESSED_B) - { - DeleteTextCharacter(); - return FALSE; - } - else if (event == 7) - { - sub_80B7090(); - return FALSE; - } - return sKeyboardKeyHandlers[keyRole](event); -} - -static bool8 KeyboardKeyHandler_Character(u8 event) -{ - sub_80B6460(3, 0, 0); - if (event == KBEVENT_PRESSED_A) - { - u8 var = sub_80B7004(); - - sub_80B6914(); - if (var) - { - SetInputState(INPUT_STATE_DISABLED); - namingScreenData.state = MAIN_STATE_MOVE_TO_OK_BUTTON; - } - } - return FALSE; -} - -static bool8 KeyboardKeyHandler_Page(u8 event) -{ - sub_80B6460(0, 1, 0); - if (event == KBEVENT_PRESSED_A) - return sub_80B61C8(); - else - return FALSE; -} - -static bool8 KeyboardKeyHandler_Backspace(u8 event) -{ - sub_80B6460(1, 1, 0); - if (event == KBEVENT_PRESSED_A) - DeleteTextCharacter(); - return FALSE; -} - -static bool8 KeyboardKeyHandler_OK(u8 event) -{ - sub_80B6460(2, 1, 0); - if (event == KBEVENT_PRESSED_A) - { - PlaySE(SE_SELECT); - namingScreenData.state = MAIN_STATE_6; - return TRUE; - } - else - return FALSE; -} - -static bool8 sub_80B61C8(void) -{ - namingScreenData.state = MAIN_STATE_START_PAGE_SWAP; - return TRUE; -} - -//-------------------------------------------------- -// Input handling -//-------------------------------------------------- - -enum -{ - FNKEY_CASE, - FNKEY_BACK, - FNKEY_OK, -}; - -#define tState data[0] -#define tKeyboardEvent data[1] -#define tKbFunctionKey data[2] - -static void InputState_Disabled(struct Task *); -static void InputState_Enabled(struct Task *); - -static void (*const sInputStateFuncs[])(struct Task *) = -{ - InputState_Disabled, - InputState_Enabled, -}; - -static void Task_HandleInput(u8); -static void HandleDpadMovement(struct Task *); - -static void InputInit(void) -{ - CreateTask(Task_HandleInput, 1); -} - -static u8 GetInputEvent(void) -{ - u8 taskId = FindTaskIdByFunc(Task_HandleInput); - - return gTasks[taskId].tKeyboardEvent; -} - -static void SetInputState(u8 state) -{ - u8 taskId = FindTaskIdByFunc(Task_HandleInput); - - gTasks[taskId].tState = state; -} - -static void Task_HandleInput(u8 taskId) -{ - sInputStateFuncs[gTasks[taskId].tState](&gTasks[taskId]); -} - -static void InputState_Disabled(struct Task *task) -{ - task->tKeyboardEvent = 0; -} - -static void InputState_Enabled(struct Task *task) -{ - task->tKeyboardEvent = 0; - if (gMain.newKeys & A_BUTTON) - { - task->tKeyboardEvent = KBEVENT_PRESSED_A; - return; - } - if (gMain.newKeys & B_BUTTON) - { - task->tKeyboardEvent = KBEVENT_PRESSED_B; - return; - } - if (gMain.newKeys & SELECT_BUTTON) - { - task->tKeyboardEvent = KBEVENT_PRESSED_SELECT; - return; - } - if (gMain.newKeys & START_BUTTON) - { - task->tKeyboardEvent = KBEVENT_PRESSED_START; - MoveCursorToOKButton(); - return; - } - HandleDpadMovement(task); -} - -static const s16 sDpadDeltaX[] = -{ - 0, //none - 0, //up - 0, //down - -1, //left - 1 //right -}; - -static const s16 sDpadDeltaY[] = -{ - 0, //none - -1, //up - 1, //down - 0, //left - 0 //right -}; - -static const s16 s4RowTo3RowTableY[] = {0, 1, 1, 2}; -static const s16 gUnknown_083CE274[] = {0, 0, 3, 0}; - -static void HandleDpadMovement(struct Task *task) -{ - s16 cursorX; - s16 cursorY; - u16 dpadDir; - s16 prevCursorX; - - GetCursorPos(&cursorX, &cursorY); - dpadDir = 0; - if (gMain.newAndRepeatedKeys & DPAD_UP) - dpadDir = 1; - if (gMain.newAndRepeatedKeys & DPAD_DOWN) - dpadDir = 2; - if (gMain.newAndRepeatedKeys & DPAD_LEFT) - dpadDir = 3; - if (gMain.newAndRepeatedKeys & DPAD_RIGHT) - dpadDir = 4; - - //Get new cursor position - prevCursorX = cursorX; - cursorX += sDpadDeltaX[dpadDir]; - cursorY += sDpadDeltaY[dpadDir]; - - //Wrap cursor position in the X direction - if (cursorX < 0) - cursorX = COLUMN_COUNT - 1; - if (cursorX > COLUMN_COUNT - 1) - cursorX = 0; - - //Handle cursor movement in X direction - if (sDpadDeltaX[dpadDir] != 0) - { - //The "others" page only has 5 columns -#if ENGLISH - if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) -#elif GERMAN - if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7 || cursorX == 8)) -#endif - { - if (sDpadDeltaX[dpadDir] > 0) - cursorX = COLUMN_COUNT - 1; - else - cursorX = 5; - } - - if (cursorX == COLUMN_COUNT - 1) - { - //We are now on the last column - task->tKbFunctionKey = cursorY; - cursorY = s4RowTo3RowTableY[cursorY]; - } - else if (prevCursorX == COLUMN_COUNT - 1) - { - if (cursorY == 1) - cursorY = task->tKbFunctionKey; - else - cursorY = gUnknown_083CE274[cursorY]; - } - } - - if (cursorX == COLUMN_COUNT - 1) - { - //There are only 3 keys on the last column, unlike the others, - //so wrap Y accordingly - if (cursorY < 0) - cursorY = 2; - if (cursorY > 2) - cursorY = 0; - if (cursorY == 0) - task->tKbFunctionKey = FNKEY_BACK; - else if (cursorY == 2) - task->tKbFunctionKey = FNKEY_OK; - } - else - { - if (cursorY < 0) - cursorY = 3; - if (cursorY > 3) - cursorY = 0; - } - SetCursorPos(cursorX, cursorY); -} - -#undef tState -#undef tKeyboardEvent -#undef tKbFunctionKey - -//-------------------------------------------------- -// -//-------------------------------------------------- - -static void Task_80B64D4(u8); -static u16 sub_80B654C(u8); -static void sub_80B65AC(u8); -static void sub_80B65D4(struct Task *, u8, u8); - -static void sub_80B6438(void) -{ - u8 taskId; - - taskId = CreateTask(Task_80B64D4, 3); - gTasks[taskId].data[0] = 3; -} - -static void sub_80B6460(u8 a, u8 b, u8 c) -{ - struct Task *task = &gTasks[FindTaskIdByFunc(Task_80B64D4)]; - - if (a == task->data[0] && c == 0) - { - task->data[1] = b; - task->data[2] = 1; - return; - } - if (a == 3 && task->data[1] == 0 && c == 0) - return; - if (task->data[0] != 3) - sub_80B65AC(task->data[0]); - sub_80B65D4(task, a, b); -} - -static void Task_80B64D4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - if (task->data[0] == 3 || task->data[2] == 0) - return; - MultiplyInvertedPaletteRGBComponents(sub_80B654C(task->data[0]), task->data[3], task->data[3], task->data[3]); - if (task->data[5] != 0) - { - task->data[5]--; - if (task->data[5] != 0) - return; - } - task->data[5] = 2; - task->data[3] += task->data[4]; - if (task->data[3] == 16) - task->data[4] = -task->data[4]; - else if (task->data[3] == 0) - { - task->data[2] = task->data[1]; - task->data[4] = -task->data[4]; - } -} - -static u16 sub_80B654C(u8 a) -{ - const u16 arr[] = - { - IndexOfSpritePaletteTag(4) * 16 + 0x10E, - IndexOfSpritePaletteTag(6) * 16 + 0x10C, - IndexOfSpritePaletteTag(6) * 16 + 0x10E, - }; - - return arr[a]; -} - -static void sub_80B65AC(u8 a) -{ - u16 index = sub_80B654C(a); - - gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; -} - -static void sub_80B65D4(struct Task *task, u8 b, u8 c) -{ - task->data[0] = b; - task->data[1] = c; - task->data[2] = 1; - task->data[3] = 15; - task->data[4] = 1; - task->data[5] = 0; -} - -//-------------------------------------------------- -// Page Swap -//-------------------------------------------------- - -#define tState data[0] -#define tFrameCount data[1] - -static bool8 PageSwapAnimState_Init(struct Task *); -static bool8 PageSwapAnimState_1(struct Task *); -static bool8 PageSwapAnimState_2(struct Task *); -static bool8 PageSwapAnimState_Done(struct Task *); - -static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) = -{ - PageSwapAnimState_Init, - PageSwapAnimState_1, - PageSwapAnimState_2, - PageSwapAnimState_Done, -}; - -static void StartPageSwapAnim(void) -{ - u8 taskId; - - taskId = CreateTask(Task_HandlePageSwapAnim, 0); - Task_HandlePageSwapAnim(taskId); -} - -static bool8 IsPageSwapAnimNotInProgress(void) -{ - if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == 0xFF) - return TRUE; - else - return FALSE; -} - -static void Task_HandlePageSwapAnim(u8 taskId) -{ - while (sPageSwapAnimStateFuncs[gTasks[taskId].tState](&gTasks[taskId]) != 0) - ; -} - -static bool8 PageSwapAnimState_Init(struct Task *task) -{ - namingScreenData.bg1vOffset = 0; - namingScreenData.bg2vOffset = 0; - task->tState++; - return 0; -} - -static bool8 PageSwapAnimState_1(struct Task *task) -{ - u16 *const arr[] = - { - &namingScreenData.bg2vOffset, - &namingScreenData.bg1vOffset - }; - - task->tFrameCount += 4; - *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40); - *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); - if (task->tFrameCount >= 64) - { - u8 temp = namingScreenData.unk8; //Why u8 and not u16? - - namingScreenData.unk8 = namingScreenData.unkA; - namingScreenData.unkA = temp; - task->tState++; - } - return 0; -} - -static bool8 PageSwapAnimState_2(struct Task *task) -{ - u16 *const arr[] = {&namingScreenData.bg2vOffset, &namingScreenData.bg1vOffset}; - - task->tFrameCount += 4; - *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40); - *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); - if (task->tFrameCount >= 128) - { - u8 temp = namingScreenData.unkC; - - namingScreenData.unkC = namingScreenData.unkD; - namingScreenData.unkD = temp; - task->tState++; - } - return 0; -} - -static bool8 PageSwapAnimState_Done(struct Task *task) -{ - DestroyTask(FindTaskIdByFunc(Task_HandlePageSwapAnim)); - return 0; -} - -#undef tState -#undef tFrameCount - -//-------------------------------------------------- -// Cursor -//-------------------------------------------------- - -static void CursorInit(void) -{ - namingScreenData.cursorSpriteId = CreateSprite(&gSpriteTemplate_83CE640, 0, 0, 0); - gSprites[namingScreenData.cursorSpriteId].oam.priority = 1; - gSprites[namingScreenData.cursorSpriteId].oam.objMode = 1; - gSprites[namingScreenData.cursorSpriteId].data6 = 1; - gSprites[namingScreenData.cursorSpriteId].data6 = 2; - SetCursorPos(0, 0); -} - -static const u8 sKeyboardSymbolPositions[][COLUMN_COUNT] = { -#if ENGLISH - {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Upper page - {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Lower page - {1, 4, 7, 10, 13, 16, 16, 16, 19}, //Others page -#elif GERMAN - {2, 3, 4, 5, 9, 10, 11, 12, 16, 19}, //Upper page - {2, 3, 4, 5, 9, 10, 11, 12, 16, 19}, //Lower page - {1, 4, 7, 10, 13, 16, 16, 16, 16, 19}, //Others page -#endif -}; - -static u8 CursorColToKeyboardCol(s16 x) -{ - return sKeyboardSymbolPositions[namingScreenData.currentPage][x]; -} - -static void SetCursorPos(s16 x, s16 y) -{ - struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId]; - - cursorSprite->pos1.x = CursorColToKeyboardCol(x) * 8 + 27; - cursorSprite->pos1.y = y * 16 + 80; - cursorSprite->data2 = cursorSprite->data0; - cursorSprite->data3 = cursorSprite->data1; - cursorSprite->data0 = x; - cursorSprite->data1 = y; -} - -static void GetCursorPos(s16 *x, s16 *y) -{ - struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId]; - - *x = cursorSprite->data0; - *y = cursorSprite->data1; -} - -static void MoveCursorToOKButton(void) -{ - SetCursorPos(COLUMN_COUNT - 1, 2); -} - -static void sub_80B6888(u8 a) -{ - gSprites[namingScreenData.cursorSpriteId].data4 &= -256; - gSprites[namingScreenData.cursorSpriteId].data4 |= a; - StartSpriteAnim(&gSprites[namingScreenData.cursorSpriteId], 0); -} - -static void sub_80B68D8(u8 a) -{ - gSprites[namingScreenData.cursorSpriteId].data4 &= 0xFF; - gSprites[namingScreenData.cursorSpriteId].data4 |= a << 8; -} - -static void sub_80B6914(void) -{ - StartSpriteAnim(&gSprites[namingScreenData.cursorSpriteId], 1); -} - -static bool8 IsCursorAnimFinished(void) -{ - return gSprites[namingScreenData.cursorSpriteId].animEnded; -} - -static u8 GetKeyRoleAtCursorPos(void) -{ - const u8 keyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK}; - s16 cursorX; - s16 cursorY; - - GetCursorPos(&cursorX, &cursorY); - if (cursorX < COLUMN_COUNT - 1) - return KEY_ROLE_CHAR; - else - return keyRoles[cursorY]; -} - -void sub_80B6998(struct Sprite *sprite) -{ - if (sprite->animEnded) - StartSpriteAnim(sprite, 0); - sprite->invisible = (sprite->data4 & 0xFF); - if (sprite->data0 == COLUMN_COUNT - 1) - sprite->invisible = TRUE; - if (sprite->invisible || (sprite->data4 & 0xFF00) == 0 - || sprite->data0 != sprite->data2 || sprite->data1 != sprite->data3) - { - sprite->data5 = 0; - sprite->data6 = 1; - sprite->data7 = 2; - } - sprite->data7--; - if (sprite->data7 == 0) - { - sprite->data5 += sprite->data6; - if (sprite->data5 == 16 || sprite->data5 == 0) - sprite->data6 = -sprite->data6; - sprite->data7 = 2; - } - if ((sprite->data4 & 0xFF00) != 0) - { - s8 gb = sprite->data5; - s8 r = sprite->data5 >> 1; - u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101; - - MultiplyInvertedPaletteRGBComponents(index, r, gb, gb); - } -} - -static void sub_80B6A80(void) -{ - u8 spriteId1; - u8 spriteId2; - u8 spriteId3; - - spriteId1 = CreateSprite(&gSpriteTemplate_83CE5C8, 0xCC, 0x50, 0); - namingScreenData.unk10 = spriteId1; - SetSubspriteTables(&gSprites[spriteId1], gSubspriteTables_83CE558); - - spriteId2 = CreateSprite(&gSpriteTemplate_83CE5F8, 0xCC, 0x4C, 1); - gSprites[spriteId1].data6 = spriteId2; - SetSubspriteTables(&gSprites[spriteId2], gSubspriteTables_83CE560); - - spriteId3 = CreateSprite(&gSpriteTemplate_83CE5E0, 0xCC, 0x4B, 2); - gSprites[spriteId3].oam.priority = 1; - gSprites[spriteId1].data7 = spriteId3; -} - -static void sub_80B6B14(void) -{ - struct Sprite *sprite = &gSprites[namingScreenData.unk10]; - - sprite->data0 = 2; - sprite->data1 = namingScreenData.currentPage; -} - -static u8 sub_80B6B5C(struct Sprite *); -static u8 sub_80B6B98(struct Sprite *); -static u8 sub_80B6B9C(struct Sprite *); -static u8 sub_80B6C08(struct Sprite *); - -static u8 (*const gUnknown_083CE2B4[])(struct Sprite *) = -{ - sub_80B6B5C, - sub_80B6B98, - sub_80B6B9C, - sub_80B6C08, -}; - -void sub_80B6B34(struct Sprite *sprite) -{ - while (gUnknown_083CE2B4[sprite->data0](sprite) != 0) - ; -} - -static u8 sub_80B6B5C(struct Sprite *sprite) -{ - struct Sprite *sprite1 = &gSprites[sprite->data6]; - struct Sprite *sprite2 = &gSprites[sprite->data7]; - - sub_80B6C48(namingScreenData.currentPage, sprite1, sprite2); - sprite->data0++; - return 0; -} - -static u8 sub_80B6B98(struct Sprite *sprite) -{ - return 0; -} - -static u8 sub_80B6B9C(struct Sprite *sprite) -{ - struct Sprite *r4 = &gSprites[sprite->data6]; - struct Sprite *r5 = &gSprites[sprite->data7]; - - r4->pos2.y++; - if (r4->pos2.y > 7) - { - sprite->data0++; - r4->pos2.y = -4; - r4->invisible = TRUE; - sub_80B6C48(((u8)sprite->data1 + 1) % 3, r4, r5); - } - return 0; -} - -static u8 sub_80B6C08(struct Sprite *sprite) -{ - struct Sprite *r2 = &gSprites[sprite->data6]; - - r2->invisible = FALSE; - r2->pos2.y++; - if (r2->pos2.y >= 0) - { - r2->pos2.y = 0; - sprite->data0 = 1; - } - return 0; -} - -static const u16 gUnknown_083CE2C4[] = {1, 3, 2}; -static const u16 gUnknown_083CE2CA[] = {4, 6, 5}; - -static void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c) -{ - c->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_083CE2C4[a]); - b->sheetTileStart = GetSpriteTileStartByTag(gUnknown_083CE2CA[a]); - b->subspriteTableNum = a; -} - -// - -static void sub_80B6CA8(void) -{ - u8 spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_83CE610, 0xCC, 0x6C, 0); - SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); - - spriteId = CreateSprite(&gSpriteTemplate_83CE628, 0xCC, 0x84, 0); - SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); -} - -static void sub_80B6D04(void) -{ - u8 spriteId; - s16 r1; - u8 i; - - r1 = (namingScreenData.unk2 - 1) * 8 + 4; - spriteId = CreateSprite(&gSpriteTemplate_83CE658, r1, 0x28, 0); - gSprites[spriteId].oam.priority = 3; - r1 = namingScreenData.unk2 * 8 + 4; - for (i = 0; i < namingScreenData.template->maxChars; i++, r1 += 8) - { - spriteId = CreateSprite(&gSpriteTemplate_83CE670, r1, 0x2C, 0); - gSprites[spriteId].oam.priority = 3; - gSprites[spriteId].data0 = i; - } -} - -void sub_80B6D9C(struct Sprite *sprite) -{ - const s16 arr[] = {0, -4, -2, -1}; - - if (sprite->data0 == 0 || --sprite->data0 == 0) - { - sprite->data0 = 8; - sprite->data1 = (sprite->data1 + 1) & 3; - } - sprite->pos2.x = arr[sprite->data1]; -} - -void sub_80B6DE8(struct Sprite *sprite) -{ - const s16 arr[] = {2, 3, 2, 1}; - u8 var; - - var = GetTextCaretPosition(); - if (var != (u8)sprite->data0) - { - sprite->pos2.y = 0; - sprite->data1 = 0; - sprite->data2 = 0; - } - else - { - sprite->pos2.y = arr[sprite->data1]; - sprite->data2++; - if (sprite->data2 > 8) - { - sprite->data1 = (sprite->data1 + 1) & 3; - sprite->data2 = 0; - } - } -} - -// - -static void nullsub_40(void); -static void sub_80B6E68(void); -static void sub_80B6EBC(void); -static void sub_80B6EFC(void); - -static void (*const gUnknown_083CE2E0[])(void) = -{ - nullsub_40, - sub_80B6E68, - sub_80B6EBC, - sub_80B6EFC, -}; - -static void sub_80B6E44(void) -{ - gUnknown_083CE2E0[namingScreenData.template->unk2](); -} - -static void nullsub_40(void) -{ -} - -static void sub_80B6E68(void) -{ - u8 rivalGfxId; - u8 spriteId; - - rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, namingScreenData.unk3E); - spriteId = AddPseudoFieldObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x18, 0); - gSprites[spriteId].oam.priority = 3; - StartSpriteAnim(&gSprites[spriteId], 4); -} - -static void sub_80B6EBC(void) -{ - u8 spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_83CE688, 0x34, 0x18, 0); - SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE580); - gSprites[spriteId].oam.priority = 3; -} - -static void sub_80B6EFC(void) -{ - u8 spriteId; - - sub_809D51C(); - spriteId = CreateMonIcon(namingScreenData.unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, namingScreenData.unk42); - gSprites[spriteId].oam.priority = 3; -} - -static u8 GetTextCaretPosition(void) -{ - u8 i; - - for (i = 0; i < namingScreenData.template->maxChars; i++) - { - if (namingScreenData.textBuffer[i] == EOS) - return i; - } - return namingScreenData.template->maxChars - 1; -} - -static u8 GetPreviousTextCaretPosition(void) -{ - s8 i; - - for (i = namingScreenData.template->maxChars - 1; i > 0; i--) - { - if (namingScreenData.textBuffer[i] != EOS) - return i; - } - return 0; -} - -static void DeleteTextCharacter(void) -{ - u8 index; - u8 var2; - - index = GetPreviousTextCaretPosition(); - namingScreenData.textBuffer[index] = 0; - sub_80B7960(); - namingScreenData.textBuffer[index] = EOS; - var2 = GetKeyRoleAtCursorPos(); - if (var2 == 0 || var2 == 2) - sub_80B6460(1, 0, 1); - PlaySE(SE_BOWA); -} - -static bool8 sub_80B7004(void) -{ - s16 x; - s16 y; - u8 ch; - bool8 r4; - - GetCursorPos(&x, &y); - x = CursorColToKeyboardCol(x); - ch = GetCharAtKeyboardPos(x, y); - r4 = 1; - if (ch == 0xFF) - r4 = sub_80B7104(); - else if (ch == 0xFE) - r4 = sub_80B713C(); - else - AddTextCharacter(ch); - sub_80B7960(); - PlaySE(SE_SELECT); - if (r4) - { - if (GetPreviousTextCaretPosition() == namingScreenData.template->maxChars - 1) - return TRUE; - } - return FALSE; -} - -static void sub_80B7090(void) // DoInput? -{ - u8 r5; - u8 r4; - - r5 = GetPreviousTextCaretPosition(); - r4 = namingScreenData.textBuffer[r5]; - if (sub_80B7198(r4)) - { - if (sub_80B7264(r4)) - sub_80B7370(r4, r5); - else - sub_80B73CC(r4, r5); - } - else - { - if (sub_80B71E4(r4)) - sub_80B7474(r4, r5); - else - sub_80B72A4(r4, r5); - } - sub_80B7960(); - PlaySE(SE_SELECT); -} - -static bool8 sub_80B7104(void) -{ - u8 r5; - u8 r4; - - r5 = GetPreviousTextCaretPosition(); - r4 = namingScreenData.textBuffer[r5]; - if (sub_80B720C(r4)) - { - sub_80B72A4(r4, r5); - return TRUE; - } - return FALSE; -} - -static bool8 sub_80B713C(void) -{ - u8 r5; - u8 r4; - - r5 = GetPreviousTextCaretPosition(); - r4 = namingScreenData.textBuffer[r5]; - if (sub_80B7264(r4)) - { - sub_80B7370(r4, r5); - return TRUE; - } - return FALSE; -} - -static void AddTextCharacter(u8 ch) -{ - u8 index = GetTextCaretPosition(); - - namingScreenData.textBuffer[index] = ch; -} - -static bool8 sub_80B7198(u8 a) -{ - if ((a >= 55 && a <= 74) - || (a >= 135 && a <= 139) - || (a >= 140 && a <= 144) - || (a >= 145 && a <= 149) - || (a >= 150 && a <= 154)) - return TRUE; - else - return FALSE; -} - -static bool8 sub_80B71E4(u8 a) -{ - if ((a >= 75 && a <= 79) - || (a >= 155 && a <= 159)) - return TRUE; - else - return FALSE; -} - -static bool8 sub_80B720C(u8 a) -{ - if ((a >= 6 && a <= 20) - || (a >= 26 && a <= 30) - || (a >= 75 && a <= 79) - || (a >= 86 && a <= 100) - || (a >= 106 && a <= 110) - || (a >= 155 && a <= 159)) - return TRUE; - else - return FALSE; -} - -static bool8 sub_80B7264(u8 a) -{ - if ((a >= 26 && a <= 30) - || (a >= 70 && a <= 74) - || (a >= 106 && a <= 110) - || (a >= 150 && a <= 154)) - return TRUE; - else - return FALSE; -} - -static void sub_80B72A4(u8 a, u8 b) -{ - u8 chr = a; - - if (a >= 6 && a <= 10) - chr = a + 0x31; - else if (a >= 11 && a <= 15) - chr = a + 0x31; - else if (a >= 16 && a <= 20) - chr = a + 0x31; - else if (a >= 26 && a <= 30) - chr = a + 0x2C; - else if (a >= 75 && a <= 79) - chr = a + 0xFB; - else if (a >= 86 && a <= 90) - chr = a + 0x31; - else if (a >= 91 && a <= 95) - chr = a + 0x31; - else if (a >= 96 && a <= 100) - chr = a + 0x31; - else if (a >= 106 && a <= 110) - chr = a + 0x2C; - else if (a >= 155 && a <= 159) - chr = a + 0xFB; - namingScreenData.textBuffer[b] = chr; -} - -static void sub_80B7370(u8 a, u8 b) -{ - u8 chr = a; - - if (a >= 26 && a <= 30) - chr = a + 0x31; - else if (a >= 70 && a <= 74) - chr = a + 5; - else if (a >= 106 && a <= 110) - chr = a + 0x31; - else if (a >= 150 && a <= 154) - chr = a + 5; - namingScreenData.textBuffer[b] = chr; -} - -static void sub_80B73CC(u8 a, u8 b) -{ - u8 chr = a; - - if (a >= 55 && a <= 59) - chr = a + 0xCF; - else if (a >= 60 && a <= 64) - chr = a + 0xCF; - else if (a >= 65 && a <= 69) - chr = a + 0xCF; - else if (a >= 70 && a <= 74) - chr = a + 0xD4; - else if (a >= 135 && a <= 139) - chr = a + 0xCF; - else if (a >= 140 && a <= 144) - chr = a + 0xCF; - else if (a >= 145 && a <= 149) - chr = a + 0xCF; - else if (a >= 150 && a <= 154) - chr = a + 0xD4; - namingScreenData.textBuffer[b] = chr; -} - -static void sub_80B7474(u8 a, u8 b) -{ - u8 chr = a; - - if (a >= 75 && a <= 79) - chr = a + 0xCF; - else if (a >= 155 && a <= 159) - chr = a + 0xCF; - namingScreenData.textBuffer[b] = chr; -} - -static void sub_80B74B0(void) -{ - u8 i; - - for (i = 0; i < namingScreenData.template->maxChars; i++) - { - if (namingScreenData.textBuffer[i] != 0 && namingScreenData.textBuffer[i] != 0xFF) - { - StringCopyN(namingScreenData.destBuffer, namingScreenData.textBuffer, namingScreenData.template->maxChars + 1); - break; - } - } -} - -static void DisplaySentToPCMessage(void) -{ - StringCopy(gStringVar1, namingScreenData.destBuffer); - StringExpandPlaceholders(gStringVar4, gOtherText_SentToPC); - BasicInitMenuWindow(&gWindowConfig_81E6E88); - MenuDisplayMessageBox(); - sub_8072044(gStringVar4); -} - -static void sub_80B753C(void) -{ - LoadSpriteSheets(gUnknown_083CE6A0); - LoadSpritePalettes(gUnknown_083CE708); -} - -static void sub_80B7558(void) -{ - sub_80B7568(); - sub_80B75B0(); -} - -static void sub_80B7568(void) -{ - const void *src; - void *dst; - - src = gNamingScreenMenu_Gfx; - dst = (void *)(VRAM + gMenuMessageBoxContentTileOffset * 32); - DmaCopy16(3, src, dst, 0x800); - - src = gNamingScreenMenu_Gfx; - dst = (void *)(VRAM + 0x8000 + gMenuMessageBoxContentTileOffset * 32); - DmaCopy16(3, src, dst, 0x800); -} - -static void sub_80B75B0(void) -{ - LoadPalette(gNamingScreenPalettes, 0, 0x80); -} - -static void sub_80B7650(u16 *); -static void sub_80B7660(u16 *); -static void sub_80B7670(u16 *); - -static void (*const gUnknown_083CE2F0[][2])(u16 *) = -{ - {sub_80B7660, sub_80B7650}, - {sub_80B7650, sub_80B7670}, - {sub_80B7670, sub_80B7660}, -}; - -static void sub_80B75C4(void) -{ - u16 *const arr[] = - { - (u16 *)(VRAM + 0xE000), - (u16 *)(VRAM + 0xE800), - }; - - gUnknown_083CE2F0[namingScreenData.currentPage][0](arr[namingScreenData.unkC]); - gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]); -} - -static void sub_80B7614(void) -{ - u16 *const arr[] = - { - (u16 *)(VRAM + 0xE000), - (u16 *)(VRAM + 0xE800), - }; - - gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]); -} - -static void sub_80B7650(u16 *vramBuffer) -{ - sub_80B7698(vramBuffer, gUnknown_083CE748); -} - -static void sub_80B7660(u16 *vramBuffer) -{ - sub_80B7698(vramBuffer, gUnknown_083CEBF8); -} - -static void sub_80B7670(u16 *vramBuffer) -{ - sub_80B7698(vramBuffer, gUnknown_083CF0A8); -} - -static void sub_80B7680(void) -{ - sub_80B76E0(VRAM + 0xF000, gUnknown_08E86258); -} - -static void sub_80B7698(u16 *vramBuffer, const u16 *src) -{ - s16 i; - s16 j; - - for (i = 0; i < 20; i++) - { - for (j = 0; j < 30; j++, src++) - { - vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset; - } - } -} - -static void sub_80B76E0(u16 *vramBuffer, const u16 *src) -{ - s16 i; - s16 j; - - for (i = 0; i < 20; i++) - { - for (j = 0; j < 30; j++, src++) - { - vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset; - } - src += 2; - } -} - -static void sub_80B772C(void) -{ - nullsub_20(namingScreenData.currentPage, namingScreenData.unkC); -} - -static void sub_80B7740(void) -{ - nullsub_20((namingScreenData.currentPage + 1) % 3, namingScreenData.unkD); -} - -static void nullsub_20(u8 a, u8 b) -{ -} - -static void sub_80B7838(void); -static void sub_80B7844(void); -static void sub_80B7850(void); - -static void (*const gUnknown_083CE310[][2])(void) = -{ - sub_80B7844, - sub_80B7838, - sub_80B7838, - sub_80B7850, - sub_80B7850, - sub_80B7844, -}; - -static const struct WindowConfig *const gUnknown_083CE328[][2][2] = -{ - { - {&gWindowConfig_81E6EDC, &gWindowConfig_81E6EF8}, - {&gWindowConfig_81E6EA4, &gWindowConfig_81E6EC0}, - }, - { - {&gWindowConfig_81E6EA4, &gWindowConfig_81E6EC0}, - {&gWindowConfig_81E6F14, &gWindowConfig_81E6F30}, - }, - { - {&gWindowConfig_81E6F14, &gWindowConfig_81E6F30}, - {&gWindowConfig_81E6EDC, &gWindowConfig_81E6EF8}, - }, -}; - -static void nullsub_61(void); -static void sub_80B78F8(void); - -static void (*const gUnknown_083CE358[])(void) = -{ - nullsub_61, - nullsub_61, - sub_80B78F8, - sub_80B78F8, -}; - -static void nullsub_62(void); -static void sub_80B7924(void); - -static void (*const gUnknown_083CE368[])(void) = -{ - nullsub_62, - sub_80B7924, -}; - -static const u8 sKeyboardCharacters[][4][20]; //forward declaration - -static u8 GetCharAtKeyboardPos(s16 a, s16 b) -{ - return sKeyboardCharacters[namingScreenData.currentPage][b][a]; -} - -static void sub_80B7794(void) -{ - BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][0][namingScreenData.unkC]); - gUnknown_083CE310[namingScreenData.currentPage][0](); - BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][1][namingScreenData.unkD]); - gUnknown_083CE310[namingScreenData.currentPage][1](); - sub_80B772C(); - sub_80B7740(); -} - -static void sub_80B77F8(void) -{ - BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][1][namingScreenData.unkD]); - gUnknown_083CE310[namingScreenData.currentPage][1](); - sub_80B7740(); -} - -static void sub_80B7838(void) -{ - PrintKeyboardCharacters(1); -} - -static void sub_80B7844(void) -{ - PrintKeyboardCharacters(0); -} - -static void sub_80B7850(void) -{ - PrintKeyboardCharacters(2); -} - -static void PrintKeyboardCharacters(u8 page) //print letters on page -{ - s16 i; - s16 r5; - - for (i = 0, r5 = 9; i < 4; i++, r5 += 2) - MenuPrint(sKeyboardCharacters[page][i], 3, r5); -} - -static void sub_80B78A8(void) -{ - BasicInitMenuWindow(&gWindowConfig_81E6F4C); - gUnknown_083CE358[namingScreenData.templateNum](); - gUnknown_083CE368[namingScreenData.template->unk3](); - MenuPrint(namingScreenData.template->title, 9, 2); -} - -static void nullsub_61(void) -{ -} - -static void sub_80B78F8(void) -{ - StringCopy(gStringVar1, gSpeciesNames[(s16)namingScreenData.unk3E]); -} - -static void nullsub_62(void) -{ -} - -static void sub_80B7924(void) -{ - u8 genderSymbol[2] = _("♂"); - - if ((s16)namingScreenData.unk40 != MON_GENDERLESS) - { - if ((s16)namingScreenData.unk40 == MON_FEMALE) - genderSymbol[0] = 0xB6; //female symbol - MenuPrint(genderSymbol, 0x14, 4); - } -} - -static void sub_80B7960(void) -{ - u8 *string = gStringVar1; - - string[0] = 0xFC; - string[1] = 0x14; - string[2] = 8; - string[3] = 0xFC; - string[4] = 0x11; - string[5] = 1; - string += 6; - StringCopy(string, namingScreenData.textBuffer); - BasicInitMenuWindow(&gWindowConfig_81E6F4C); - MenuPrint(gStringVar1, namingScreenData.unk2, 4); -} - -//-------------------------------------------------- -// Forward-declared variables -//-------------------------------------------------- - -static const struct NamingScreenTemplate playerNamingScreenTemplate = -{ - .unk0 = 0, - .maxChars = 7, - .unk2 = 1, - .unk3 = 0, - .unk4 = 0, - .unk5 = 0, - .unk6 = 0, - .unk7 = 0, - .title = OtherText_YourName, -}; - -static const struct NamingScreenTemplate pcBoxNamingTemplate = -{ - .unk0 = 0, - .maxChars = 8, - .unk2 = 2, - .unk3 = 0, - .unk4 = 0, - .unk5 = 0, - .unk6 = 0, - .unk7 = 0, - .title = OtherText_BoxName, -}; - -static const struct NamingScreenTemplate monNamingScreenTemplate = -{ - .unk0 = 0, - .maxChars = 10, - .unk2 = 3, - .unk3 = 1, - .unk4 = 0, - .unk5 = 0, - .unk6 = 0, - .unk7 = 0, - .title = OtherText_PokeName, -}; - -static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = -{ - &playerNamingScreenTemplate, - &pcBoxNamingTemplate, - &monNamingScreenTemplate, - &monNamingScreenTemplate, -}; - -static const u8 sKeyboardCharacters[][4][20] = -{ -#if ENGLISH - { - _(" A B C D E F . "), - _(" G H I J K L , "), - _(" M N O P Q R S "), - _(" T U V W X Y Z "), - }, - { - _(" a b c d e f . "), - _(" g h i j k l , "), - _(" m n o p q r s "), - _(" t u v w x y z "), - }, -#elif GERMAN - { - _(" ABCD EFGH . "), - _(" IJKL MNOP , "), - _(" QRST UVWX "), - _(" YZ ÄÖÜ "), - }, - { - _(" abcd efgh . "), - _(" ijkl mnop , "), - _(" qrst uvwx "), - _(" yz äöü "), - }, -#endif - { - _(" 0 1 2 3 4 "), - _(" 5 6 7 8 9 "), - _(" ! ? ♂ ♀ / - "), - _(" … “ ” ‘ ’ "), - }, -}; - -const struct OamData gOamData_83CE498 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -const struct OamData gOamData_83CE4A0 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -const struct OamData gOamData_83CE4A8 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -//TODO: dump sprite data diff --git a/src/new_game.c b/src/new_game.c deleted file mode 100644 index 226ac9bb7..000000000 --- a/src/new_game.c +++ /dev/null @@ -1,166 +0,0 @@ -#include "global.h" -#include "new_game.h" -#include "battle_records.h" -#include "berry.h" -#include "contest.h" -#include "decoration_inventory.h" -#include "dewford_trend.h" -#include "easy_chat.h" -#include "event_data.h" -#include "field_specials.h" -#include "item_menu.h" -#include "lottery_corner.h" -#include "mail_data.h" -#include "mauville_old_man.h" -#include "play_time.h" -#include "player_pc.h" -#include "pokeblock.h" -#include "pokedex.h" -#include "pokemon_size_record.h" -#include "pokemon_storage_system.h" -#include "rng.h" -#include "roamer.h" -#include "rom4.h" -#include "rtc.h" -#include "script.h" -#include "secret_base.h" -#include "tv.h" - -EWRAM_DATA u8 gDifferentSaveFile = 0; -EWRAM_DATA u8 gUnknown_020297ED = 0; - -extern u8 gPlayerPartyCount; -extern u8 gUnknown_03005CE8; -extern u16 gSaveFileStatus; - -extern u8 gUnknown_0819FA81[]; - -const struct SB1_2EFC_Struct gUnknown_08216604 = -{ - 0x0000, - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - } -}; - -void write_word_to_mem(u32 var, u8 *dataPtr) -{ - dataPtr[0] = var; - dataPtr[1] = var >> 8; - dataPtr[2] = var >> 16; - dataPtr[3] = var >> 24; -} - -void copy_word_to_mem(u8 *copyTo, u8 *copyFrom) -{ - s32 i; - for (i = 0; i < 4; i++) - copyTo[i] = copyFrom[i]; -} - -void InitPlayerTrainerId(void) -{ - write_word_to_mem((Random() << 16) | Random(), gSaveBlock2.playerTrainerId); -} - -// L=A isnt set here for some reason. -void SetDefaultOptions(void) -{ - gSaveBlock2.optionsTextSpeed = OPTIONS_TEXT_SPEED_MID; - gSaveBlock2.optionsWindowFrameType = 0; - gSaveBlock2.optionsSound = OPTIONS_SOUND_MONO; - gSaveBlock2.optionsBattleStyle = OPTIONS_BATTLE_STYLE_SHIFT; - gSaveBlock2.optionsBattleSceneOff = FALSE; - gSaveBlock2.regionMapZoom = FALSE; -} - -void ClearPokedexFlags(void) -{ - gUnknown_03005CE8 = 0; - memset(&gSaveBlock2.pokedex.owned, 0, sizeof(gSaveBlock2.pokedex.owned)); - memset(&gSaveBlock2.pokedex.seen, 0, sizeof(gSaveBlock2.pokedex.seen)); -} - -void sub_8052DA8(void) -{ - s32 i; - - sub_80B2D1C(); - for (i = 0; i < 5; i++) - gSaveBlock1.sbStruct.unkSB1.sb1_2EFC_struct[i] = gUnknown_08216604; -} - -void sub_8052DE4(void) -{ - CpuFill32(0, &gSaveBlock2.filler_A8, sizeof(gSaveBlock2.filler_A8)); -} - -void WarpToTruck(void) -{ - warp1_set(25, 40, -1, -1, -1); // inside of truck - warp_in(); -} - -void ClearSav2(void) -{ - CpuFill16(0, &gSaveBlock2, sizeof(gSaveBlock2)); - SetDefaultOptions(); -} - -void sub_8052E4C(void) -{ - gDifferentSaveFile = 0; - sub_808C0A0(); - ZeroPlayerPartyMons(); - ZeroEnemyPartyMons(); - ResetBagScrollPositions(); -} - -void NewGameInitData(void) -{ - if (gSaveFileStatus == 0 || gSaveFileStatus == 2) - RtcReset(); - - gDifferentSaveFile = 1; - ZeroPlayerPartyMons(); - ZeroEnemyPartyMons(); - ResetPokedex(); - sub_8052DE4(); - memset(&gSaveBlock1, 0, sizeof(gSaveBlock1)); - ClearMailData(); - gSaveBlock2.specialSaveWarp = 0; - InitPlayerTrainerId(); - PlayTimeCounter_Reset(); - ClearPokedexFlags(); - InitEventData(); - ClearTVShowData(); - ResetGabbyAndTy(); - ResetSecretBases(); - ClearBerryTrees(); - gSaveBlock1.money = 3000; - ResetLinkContestBoolean(); - ResetGameStats(); - sub_8052DA8(); - InitLinkBattleRecords(); - InitShroomishSizeRecord(); - InitBarboachSizeRecord(); - gPlayerPartyCount = 0; - ZeroPlayerPartyMons(); - ResetPokemonStorageSystem(); - ClearRoamerData(); - ClearRoamerLocationData(); - gSaveBlock1.registeredItem = 0; - ClearBag(); - NewGameInitPCItems(); - ClearPokeblocks(); - ClearDecorationInventories(); - InitEasyChatPhrases(); - SetMauvilleOldMan(); - InitDewfordTrend(); - ResetFanClub(); - ResetLotteryCorner(); - WarpToTruck(); - ScriptContext2_RunNewScript(gUnknown_0819FA81); -} diff --git a/src/option_menu.c b/src/option_menu.c deleted file mode 100644 index 7f8d76528..000000000 --- a/src/option_menu.c +++ /dev/null @@ -1,579 +0,0 @@ -#include "global.h" -#include "option_menu.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "sprite.h" -#include "strings2.h" -#include "task.h" - -extern void SetPokemonCryStereo(u32 val); -extern void remove_some_task(void); - -//Task data -enum { - TD_MENUSELECTION, - TD_TEXTSPEED, - TD_BATTLESCENE, - TD_BATTLESTYLE, - TD_SOUND, - TD_BUTTONMODE, - TD_FRAMETYPE, -}; - -//Menu items -enum { - MENUITEM_TEXTSPEED, - MENUITEM_BATTLESCENE, - MENUITEM_BATTLESTYLE, - MENUITEM_SOUND, - MENUITEM_BUTTONMODE, - MENUITEM_FRAMETYPE, - MENUITEM_CANCEL, -}; - -const u16 gUnknown_0839F5FC[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal"); -// note: this is only used in the Japanese release -const u8 gUnknown_0839F63C[] = INCBIN_U8("graphics/misc/option_menu_equals_sign.4bpp"); - -static void Task_OptionMenuFadeIn(u8 taskId); -static void Task_OptionMenuProcessInput(u8 taskId); -static void Task_OptionMenuSave(u8 taskId); -static void Task_OptionMenuFadeOut(u8 taskId); -static void HighlightOptionMenuItem(u8 selection); -static u8 TextSpeed_ProcessInput(u8 selection); -static void TextSpeed_DrawChoices(u8 selection); -static u8 BattleScene_ProcessInput(u8 selection); -static void BattleScene_DrawChoices(u8 selection); -static u8 BattleStyle_ProcessInput(u8 selection); -static void BattleStyle_DrawChoices(u8 selection); -static u8 Sound_ProcessInput(u8 selection); -static void Sound_DrawChoices(u8 selection); -static u8 FrameType_ProcessInput(u8 selection); -static void FrameType_DrawChoices(u8 selection); -static u8 ButtonMode_ProcessInput(u8 selection); -static void ButtonMode_DrawChoices(u8 selection); - -static void MainCB(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void VBlankCB(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void CB2_InitOptionMenu(void) -{ - switch (gMain.state) - { - default: - case 0: - { - u8 *addr; - u32 size; - - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - 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; - } - } - DmaClear32(3, OAM, OAM_SIZE); - DmaClear16(3, PLTT, PLTT_SIZE); - gMain.state++; - break; - } - case 1: - ResetPaletteFade(); - remove_some_task(); - ResetTasks(); - ResetSpriteData(); - gMain.state++; - break; - case 2: - SetUpWindowConfig(&gWindowConfig_81E71B4); - gMain.state++; - break; - case 3: - MultistepInitMenuWindowBegin(&gWindowConfig_81E71B4); - gMain.state++; - break; - case 4: - if (!MultistepInitMenuWindowContinue()) - return; - gMain.state++; - break; - case 5: - LoadPalette(gUnknown_0839F5FC, 0x80, 0x40); - CpuCopy16(gUnknown_0839F63C, (void *)0x0600BEE0, 0x40); - gMain.state++; - break; - case 6: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - gMain.state++; - break; - case 7: - { - u16 savedIme; - - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_WININ = 0x1111; - REG_WINOUT = 0x31; - REG_BLDCNT = 0xE1; - REG_BLDALPHA = 0; - REG_BLDY = 7; - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - SetVBlankCallback(VBlankCB); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON | - DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; - gMain.state++; - break; - } - case 8: - { - u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0); - - gTasks[taskId].data[TD_MENUSELECTION] = 0; - gTasks[taskId].data[TD_TEXTSPEED] = gSaveBlock2.optionsTextSpeed; - gTasks[taskId].data[TD_BATTLESCENE] = gSaveBlock2.optionsBattleSceneOff; - gTasks[taskId].data[TD_BATTLESTYLE] = gSaveBlock2.optionsBattleStyle; - gTasks[taskId].data[TD_SOUND] = gSaveBlock2.optionsSound; - gTasks[taskId].data[TD_BUTTONMODE] = gSaveBlock2.optionsButtonMode; - gTasks[taskId].data[TD_FRAMETYPE] = gSaveBlock2.optionsWindowFrameType; - - MenuDrawTextWindow(2, 0, 27, 3); - MenuDrawTextWindow(2, 4, 27, 19); - - MenuPrint(gSystemText_OptionMenu, 4, 1); - MenuPrint(gSystemText_TextSpeed, 4, 5); - MenuPrint(gSystemText_BattleScene, 4, 7); - MenuPrint(gSystemText_BattleStyle, 4, 9); - MenuPrint(gSystemText_Sound, 4, 11); - MenuPrint(gSystemText_ButtonMode, 4, 13); - MenuPrint(gSystemText_Frame, 4, 15); - MenuPrint(gSystemText_Cancel, 4, 17); - - TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]); - BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]); - BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]); - Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]); - ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]); - FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]); - - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(1, 31); - - HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); - gMain.state++; - break; - } - case 9: - SetMainCallback2(MainCB); - return; - } -} - -static void Task_OptionMenuFadeIn(u8 taskId) -{ - if (!gPaletteFade.active) - { - gTasks[taskId].func = Task_OptionMenuProcessInput; - } -} - -static void Task_OptionMenuProcessInput(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON) - { - if (gTasks[taskId].data[TD_MENUSELECTION] == MENUITEM_CANCEL) - gTasks[taskId].func = Task_OptionMenuSave; - } - else if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].func = Task_OptionMenuSave; - } - else if (gMain.newKeys & DPAD_UP) - { - if (gTasks[taskId].data[TD_MENUSELECTION] > 0) - gTasks[taskId].data[TD_MENUSELECTION]--; - else - gTasks[taskId].data[TD_MENUSELECTION] = 6; - HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); - } - else if (gMain.newKeys & DPAD_DOWN) - { - if (gTasks[taskId].data[TD_MENUSELECTION] <= 5) - gTasks[taskId].data[TD_MENUSELECTION]++; - else - gTasks[taskId].data[TD_MENUSELECTION] = 0; - HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); - } - else - { - switch (gTasks[taskId].data[TD_MENUSELECTION]) - { - case MENUITEM_TEXTSPEED: - gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]); - TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]); - break; - case MENUITEM_BATTLESCENE: - gTasks[taskId].data[TD_BATTLESCENE] = BattleScene_ProcessInput(gTasks[taskId].data[TD_BATTLESCENE]); - BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]); - break; - case MENUITEM_BATTLESTYLE: - gTasks[taskId].data[TD_BATTLESTYLE] = BattleStyle_ProcessInput(gTasks[taskId].data[TD_BATTLESTYLE]); - BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]); - break; - case MENUITEM_SOUND: - gTasks[taskId].data[TD_SOUND] = Sound_ProcessInput(gTasks[taskId].data[TD_SOUND]); - Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]); - break; - case MENUITEM_BUTTONMODE: - gTasks[taskId].data[TD_BUTTONMODE] = ButtonMode_ProcessInput(gTasks[taskId].data[TD_BUTTONMODE]); - ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]); - break; - case MENUITEM_FRAMETYPE: - gTasks[taskId].data[TD_FRAMETYPE] = FrameType_ProcessInput(gTasks[taskId].data[TD_FRAMETYPE]); - FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]); - break; - } - } -} - -static void Task_OptionMenuSave(u8 taskId) -{ - gSaveBlock2.optionsTextSpeed = gTasks[taskId].data[TD_TEXTSPEED]; - gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].data[TD_BATTLESCENE]; - gSaveBlock2.optionsBattleStyle = gTasks[taskId].data[TD_BATTLESTYLE]; - gSaveBlock2.optionsSound = gTasks[taskId].data[TD_SOUND]; - gSaveBlock2.optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE]; - gSaveBlock2.optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE]; - - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_OptionMenuFadeOut; -} - -static void Task_OptionMenuFadeOut(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyTask(taskId); - SetMainCallback2(gMain.savedCallback); - } -} - -//This version uses addition '+' instead of OR '|'. -#define WIN_RANGE_(a, b) (((a) << 8) + (b)) - -static void HighlightOptionMenuItem(u8 index) -{ - REG_WIN1H = WIN_RANGE(24, 215); - REG_WIN1V = WIN_RANGE_(index * 16 + 40, index * 16 + 56); -} - -static void DrawOptionMenuChoice(const u8 *text, u8 x, u8 y, u8 style) -{ - u8 dst[16]; - u16 i; - - for (i = 0; *text != EOS && i <= 14; i++) - dst[i] = *(text++); - - dst[2] = style; - dst[i] = EOS; - MenuPrint_PixelCoords(dst, x, y, 1); -} - -static u8 TextSpeed_ProcessInput(u8 selection) -{ - if (gMain.newKeys & DPAD_RIGHT) - { - if (selection <= 1) - selection++; - else - selection = 0; - } - if (gMain.newKeys & DPAD_LEFT) - { - if (selection != 0) - selection--; - else - selection = 2; - } - return selection; -} - -#if ENGLISH -#define TEXTSPEED_SLOW_LEFT (120) -#define TEXTSPEED_MIX_LEFT (155) -#define TEXTSPEED_FAST_LEFT (184) -#endif -#if GERMAN -#define TEXTSPEED_SLOW_LEFT (120) -#define TEXTSPEED_MIX_LEFT (161) -#define TEXTSPEED_FAST_LEFT (202) -#endif - -static void TextSpeed_DrawChoices(u8 selection) -{ - u8 styles[3]; - - styles[0] = 0xF; - styles[1] = 0xF; - styles[2] = 0xF; - styles[selection] = 0x8; - - DrawOptionMenuChoice(gSystemText_Slow, TEXTSPEED_SLOW_LEFT, 40, styles[0]); - DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]); - DrawOptionMenuChoice(gSystemText_Fast, TEXTSPEED_FAST_LEFT, 40, styles[2]); -} - -static u8 BattleScene_ProcessInput(u8 selection) -{ - if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) - selection ^= 1; - return selection; -} - -static void BattleScene_DrawChoices(u8 selection) -{ - u8 styles[2]; - - styles[0] = 0xF; - styles[1] = 0xF; - styles[selection] = 0x8; - - DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]); - DrawOptionMenuChoice(gSystemText_Off, 190, 56, styles[1]); -} - -static u8 BattleStyle_ProcessInput(u8 selection) -{ - if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) - selection ^= 1; - return selection; -} - -#if ENGLISH -#define BATTLESTYLE_SHIFT (120) -#define BATTLESTYLE_SET (190) -#elif GERMAN -#define BATTLESTYLE_SHIFT (120) -#define BATTLESTYLE_SET (178) -#endif - -static void BattleStyle_DrawChoices(u8 selection) -{ - u8 styles[2]; - - styles[0] = 0xF; - styles[1] = 0xF; - styles[selection] = 0x8; - - DrawOptionMenuChoice(gSystemText_Shift, BATTLESTYLE_SHIFT, 72, styles[0]); - DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]); -} - -static u8 Sound_ProcessInput(u8 selection) -{ - if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) - { - selection ^= 1; - SetPokemonCryStereo(selection); - } - return selection; -} - -static void Sound_DrawChoices(u8 selection) -{ - u8 styles[3]; - - styles[0] = 0xF; - styles[1] = 0xF; - styles[selection] = 0x8; - - DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]); - DrawOptionMenuChoice(gSystemText_Stereo, 172, 88, styles[1]); -} - -static u8 FrameType_ProcessInput(u8 selection) -{ - if (gMain.newKeys & DPAD_RIGHT) - { - if (selection <= 18) - selection++; - else - selection = 0; - MenuLoadTextWindowGraphics_OverrideFrameType(selection); - } - if (gMain.newKeys & DPAD_LEFT) - { - if (selection != 0) - selection--; - else - selection = 19; - MenuLoadTextWindowGraphics_OverrideFrameType(selection); - } - return selection; -} - -#define CHAR_0 0xA1 //Character code of '0' character - -#if ENGLISH -static void FrameType_DrawChoices(u8 selection) -{ - u8 text[8]; - u8 n = selection + 1; - u16 i; - - for (i = 0; gSystemText_Terminator[i] != EOS && i <= 5; i++) - text[i] = gSystemText_Terminator[i]; - - //Convert number to decimal string - if (n / 10 != 0) - { - text[i] = n / 10 + CHAR_0; - i++; - text[i] = n % 10 + CHAR_0; - i++; - } - else - { - text[i] = n % 10 + CHAR_0; - i++; - text[i] = CHAR_SPACE; - i++; - } - - text[i] = EOS; - MenuPrint(gSystemText_Type, 15, 15); - MenuPrint(text, 18, 15); -} -#elif GERMAN -__attribute__((naked)) -static void FrameType_DrawChoices(u8 selection) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - sub sp, 0x10\n\ - lsls r0, 24\n\ - movs r1, 0x80\n\ - lsls r1, 17\n\ - adds r0, r1\n\ - lsrs r5, r0, 24\n\ - ldr r1, _0808C368 @ =gSystemText_Type\n\ - mov r0, sp\n\ - bl StringCopy\n\ - ldr r1, _0808C36C @ =gSystemText_Terminator\n\ - mov r0, sp\n\ - bl StringAppend\n\ - adds r4, r0, 0\n\ - adds r0, r5, 0\n\ - movs r1, 0xA\n\ - bl __udivsi3\n\ - adds r1, r0, 0\n\ - lsls r0, r1, 24\n\ - lsrs r6, r0, 24\n\ - cmp r6, 0\n\ - beq _0808C370\n\ - adds r0, r1, 0\n\ - adds r0, 0xA1\n\ - strb r0, [r4]\n\ - adds r4, 0x1\n\ - adds r0, r5, 0\n\ - movs r1, 0xA\n\ - bl __umodsi3\n\ - adds r0, 0xA1\n\ - strb r0, [r4]\n\ - b _0808C380\n\ - .align 2, 0\n\ -_0808C368: .4byte gSystemText_Type\n\ -_0808C36C: .4byte gSystemText_Terminator\n\ -_0808C370:\n\ - adds r0, r5, 0\n\ - movs r1, 0xA\n\ - bl __umodsi3\n\ - adds r0, 0xA1\n\ - strb r0, [r4]\n\ - adds r4, 0x1\n\ - strb r6, [r4]\n\ -_0808C380:\n\ - adds r4, 0x1\n\ - movs r0, 0xFF\n\ - strb r0, [r4]\n\ - mov r0, sp\n\ - movs r1, 0xF\n\ - movs r2, 0xF\n\ - bl MenuPrint\n\ - add sp, 0x10\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif - -static u8 ButtonMode_ProcessInput(u8 selection) -{ - if (gMain.newKeys & DPAD_RIGHT) - { - if (selection <= 1) - selection++; - else - selection = 0; - } - if (gMain.newKeys & DPAD_LEFT) - { - if (selection != 0) - selection--; - else - selection = 2; - } - return selection; -} - -static void ButtonMode_DrawChoices(u8 selection) -{ - u8 styles[3]; - - styles[0] = 0xF; - styles[1] = 0xF; - styles[2] = 0xF; - styles[selection] = 0x8; - - DrawOptionMenuChoice(gSystemText_Normal, 120, 104, styles[0]); - DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]); - DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]); -} diff --git a/src/palette.c b/src/palette.c deleted file mode 100644 index 94a4f8092..000000000 --- a/src/palette.c +++ /dev/null @@ -1,834 +0,0 @@ -#include "global.h" -#include "palette.h" -#include "blend_palette.h" -#include "decompress.h" - -enum -{ - NORMAL_FADE, - FAST_FADE, - HARDWARE_FADE, -}; - -// These are structs for some unused palette system. -// The full functionality of this system is unknown. - -struct PaletteStructTemplate -{ - u16 uid; - u16 *src; - u16 pst_field_8_0:1; - u16 pst_field_8_1:9; - u16 size:5; - u16 pst_field_9_7:1; - u8 pst_field_A; - u8 srcCount:5; - u8 pst_field_B_5:3; - u8 pst_field_C; -}; - -struct PaletteStruct -{ - const struct PaletteStructTemplate *base; - u32 ps_field_4_0:1; - u16 ps_field_4_1:1; - u32 baseDestOffset:9; - u16 destOffset:10; - u16 srcIndex:7; - u8 ps_field_8; - u8 ps_field_9; -}; - -EWRAM_DATA u16 gPlttBufferUnfaded[0x200] = {0}; -EWRAM_DATA u16 gPlttBufferFaded[0x200] = {0}; -EWRAM_DATA static struct PaletteStruct sPaletteStructs[0x10] = {0}; -EWRAM_DATA struct PaletteFadeControl gPaletteFade = {0}; -EWRAM_DATA u32 gFiller_202F394 = 0; -EWRAM_DATA static u32 sPlttBufferTransferPending = 0; -EWRAM_DATA static u8 sPaletteDecompressionBuffer[0x400] = {0}; - -static const struct PaletteStructTemplate sDummyPaletteStructTemplate = -{ - 0xFFFF, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0 -}; - -static void unused_sub_8073DFC(struct PaletteStruct *, u32 *); -static void unused_sub_8073F60(struct PaletteStruct *, u32 *); -static void unused_sub_8074020(struct PaletteStruct *); -static u8 GetPaletteNumByUid(u16); -static u8 UpdateNormalPaletteFade(void); -static void BeginFastPaletteFadeInternal(u8); -static u8 UpdateFastPaletteFade(void); -static u8 UpdateHardwarePaletteFade(void); -static void UpdateBlendRegisters(void); -static bool8 IsSoftwarePaletteFadeFinishing(void); - -void LoadCompressedPalette(const void *src, u16 offset, u16 size) -{ - sub_800D238(src, sPaletteDecompressionBuffer); - CpuCopy16(sPaletteDecompressionBuffer, gPlttBufferUnfaded + offset, size); - CpuCopy16(sPaletteDecompressionBuffer, gPlttBufferFaded + offset, size); -} - -void LoadPalette(const void *src, u16 offset, u16 size) -{ - CpuCopy16(src, gPlttBufferUnfaded + offset, size); - CpuCopy16(src, gPlttBufferFaded + offset, size); -} - -void FillPalette(u16 value, u16 offset, u16 size) -{ - CpuFill16(value, gPlttBufferUnfaded + offset, size); - CpuFill16(value, gPlttBufferFaded + offset, size); -} - -void TransferPlttBuffer(void) -{ - if (!gPaletteFade.bufferTransferDisabled) - { - void *src = gPlttBufferFaded; - void *dest = (void *)PLTT; - DmaCopy16(3, src, dest, PLTT_SIZE); - sPlttBufferTransferPending = 0; - if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) - UpdateBlendRegisters(); - } -} - -u8 UpdatePaletteFade(void) -{ - u8 result; - u8 dummy = 0; - - if (sPlttBufferTransferPending) - return -1; - - if (gPaletteFade.mode == NORMAL_FADE) - result = UpdateNormalPaletteFade(); - else if (gPaletteFade.mode == FAST_FADE) - result = UpdateFastPaletteFade(); - else - result = UpdateHardwarePaletteFade(); - - sPlttBufferTransferPending = gPaletteFade.multipurpose1 | dummy; - - return result; -} - -void ResetPaletteFade(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - ResetPaletteStruct(i); - - ResetPaletteFadeControl(); -} - -void ReadPlttIntoBuffers(void) -{ - u16 i; - u16 *pltt = (u16 *)PLTT; - - for (i = 0; i < PLTT_SIZE / 2; i++) - { - gPlttBufferUnfaded[i] = pltt[i]; - gPlttBufferFaded[i] = pltt[i]; - } -} - -bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor) -{ - u8 temp; - register u32 _blendColor asm("r8") = blendColor; - - if (gPaletteFade.active) - { - return FALSE; - } - else - { - gPaletteFade.deltaY = 2; - - if (delay < 0) - { - gPaletteFade.deltaY += (delay * -1); - delay = 0; - } - - gPaletteFade_selectedPalettes = selectedPalettes; - gPaletteFade.delayCounter = delay; - gPaletteFade_delay = delay; - gPaletteFade.y = startY; - gPaletteFade.targetY = targetY; - gPaletteFade.blendColor = _blendColor; - gPaletteFade.active = 1; - gPaletteFade.mode = NORMAL_FADE; - - if (startY < targetY) - gPaletteFade.yDec = 0; - else - gPaletteFade.yDec = 1; - - UpdatePaletteFade(); - - temp = gPaletteFade.bufferTransferDisabled; - gPaletteFade.bufferTransferDisabled = 0; - CpuCopy32(gPlttBufferFaded, (void *)PLTT, PLTT_SIZE); - sPlttBufferTransferPending = 0; - if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) - UpdateBlendRegisters(); - gPaletteFade.bufferTransferDisabled = temp; - return TRUE; - } -} - -bool8 unref_sub_8073D3C(u32 a1, u8 a2, u8 a3, u8 a4, u16 a5) -{ - ReadPlttIntoBuffers(); - return BeginNormalPaletteFade(a1, a2, a3, a4, a5); -} - -void unref_sub_8073D84(u8 a1, u32 *a2) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - struct PaletteStruct *palstruct = &sPaletteStructs[i]; - if (palstruct->ps_field_4_0) - { - if (palstruct->base->pst_field_8_0 == a1) - { - u8 val1 = palstruct->srcIndex; - u8 val2 = palstruct->base->srcCount; - if (val1 == val2) - { - unused_sub_8074020(palstruct); - if (!palstruct->ps_field_4_0) - continue; - } - if (palstruct->ps_field_8 == 0) - unused_sub_8073DFC(palstruct, a2); - else - palstruct->ps_field_8--; - - unused_sub_8073F60(palstruct, a2); - } - } - } -} - -static void unused_sub_8073DFC(struct PaletteStruct *a1, u32 *a2) -{ - s32 srcIndex; - s32 srcCount; - u8 i = 0; - u16 srcOffset = a1->srcIndex * a1->base->size; - - if (!a1->base->pst_field_8_0) - { - while (i < a1->base->size) - { - gPlttBufferUnfaded[a1->destOffset] = a1->base->src[srcOffset]; - gPlttBufferFaded[a1->destOffset] = a1->base->src[srcOffset]; - i++; - a1->destOffset++; - srcOffset++; - } - } - else - { - while (i < a1->base->size) - { - gPlttBufferFaded[a1->destOffset] = a1->base->src[srcOffset]; - i++; - a1->destOffset++; - srcOffset++; - } - } - - a1->destOffset = a1->baseDestOffset; - a1->ps_field_8 = a1->base->pst_field_A; - a1->srcIndex++; - - srcIndex = a1->srcIndex; - srcCount = a1->base->srcCount; - - if (srcIndex >= srcCount) - { - if (a1->ps_field_9) - a1->ps_field_9--; - a1->srcIndex = 0; - } - - *a2 |= 1 << (a1->baseDestOffset >> 4); -} - -static void unused_sub_8073F60(struct PaletteStruct *a1, u32 *a2) -{ - if (gPaletteFade.active && ((1 << (a1->baseDestOffset >> 4)) & gPaletteFade_selectedPalettes)) - { - if (!a1->base->pst_field_8_0) - { - if (gPaletteFade.delayCounter != gPaletteFade_delay) - { - BlendPalette( - a1->baseDestOffset, - a1->base->size, - gPaletteFade.y, - gPaletteFade.blendColor); - } - } - else - { - if (!gPaletteFade.delayCounter) - { - if (a1->ps_field_8 != a1->base->pst_field_A) - { - u32 srcOffset = a1->srcIndex * a1->base->size; - u8 i; - - for (i = 0; i < a1->base->size; i++) - gPlttBufferFaded[a1->baseDestOffset + i] = a1->base->src[srcOffset + i]; - } - } - } - } -} - -static void unused_sub_8074020(struct PaletteStruct *a1) -{ - if (!a1->ps_field_9) - { - s32 val = a1->base->pst_field_B_5; - - if (!val) - { - a1->srcIndex = 0; - a1->ps_field_8 = a1->base->pst_field_A; - a1->ps_field_9 = a1->base->pst_field_C; - a1->destOffset = a1->baseDestOffset; - } - else - { - if (val < 0) - return; - if (val > 2) - return; - ResetPaletteStructByUid(a1->base->uid); - } - } - else - { - a1->ps_field_9--; - } -} - -void ResetPaletteStructByUid(u16 a1) -{ - u8 paletteNum = GetPaletteNumByUid(a1); - if (paletteNum != 16) - ResetPaletteStruct(paletteNum); -} - -void ResetPaletteStruct(u8 paletteNum) -{ - sPaletteStructs[paletteNum].base = &sDummyPaletteStructTemplate; - sPaletteStructs[paletteNum].ps_field_4_0 = 0; - sPaletteStructs[paletteNum].baseDestOffset = 0; - sPaletteStructs[paletteNum].destOffset = 0; - sPaletteStructs[paletteNum].srcIndex = 0; - sPaletteStructs[paletteNum].ps_field_4_1 = 0; - sPaletteStructs[paletteNum].ps_field_8 = 0; - sPaletteStructs[paletteNum].ps_field_9 = 0; -} - -void ResetPaletteFadeControl() -{ - gPaletteFade.multipurpose1 = 0; - gPaletteFade.multipurpose2 = 0; - gPaletteFade.delayCounter = 0; - gPaletteFade.y = 0; - gPaletteFade.targetY = 0; - gPaletteFade.blendColor = 0; - gPaletteFade.active = 0; - gPaletteFade.multipurpose2 = 0; // assign same value twice - gPaletteFade.yDec = 0; - gPaletteFade.bufferTransferDisabled = 0; - gPaletteFade.shouldResetBlendRegisters = 0; - gPaletteFade.hardwareFadeFinishing = 0; - gPaletteFade.softwareFadeFinishing = 0; - gPaletteFade.softwareFadeFinishingCounter = 0; - gPaletteFade.objPaletteToggle = 0; - gPaletteFade.deltaY = 2; -} - -void unref_sub_8074168(u16 uid) -{ - u8 paletteNum = GetPaletteNumByUid(uid); - if (paletteNum != 16) - sPaletteStructs[paletteNum].ps_field_4_1 = 1; -} - -void unref_sub_8074194(u16 uid) -{ - u8 paletteNum = GetPaletteNumByUid(uid); - if (paletteNum != 16) - sPaletteStructs[paletteNum].ps_field_4_1 = 0; -} - -static u8 GetPaletteNumByUid(u16 uid) -{ - u8 i; - - for (i = 0; i < 16; i++) - if (sPaletteStructs[i].base->uid == uid) - return i; - - return 16; -} - -static u8 UpdateNormalPaletteFade() -{ - u16 paletteOffset; - u16 selectedPalettes; - - if (!gPaletteFade.active) - return 0; - - if (IsSoftwarePaletteFadeFinishing()) - { - return gPaletteFade.active; - } - else - { - if (!gPaletteFade.objPaletteToggle) - { - if (gPaletteFade.delayCounter < gPaletteFade_delay) - { - gPaletteFade.delayCounter++; - return 2; - } - gPaletteFade.delayCounter = 0; - } - - paletteOffset = 0; - - if (!gPaletteFade.objPaletteToggle) - { - selectedPalettes = gPaletteFade_selectedPalettes; - } - else - { - selectedPalettes = gPaletteFade_selectedPalettes >> 16; - paletteOffset = 256; - } - - while (selectedPalettes) - { - if (selectedPalettes & 1) - BlendPalette( - paletteOffset, - 16, - gPaletteFade.y, - gPaletteFade.blendColor); - selectedPalettes >>= 1; - paletteOffset += 16; - } - - gPaletteFade.objPaletteToggle ^= 1; - - if (!gPaletteFade.objPaletteToggle) - { - if (gPaletteFade.y == gPaletteFade.targetY) - { - gPaletteFade_selectedPalettes = 0; - gPaletteFade.softwareFadeFinishing = 1; - } - else - { - s8 val; - - if (!gPaletteFade.yDec) - { - val = gPaletteFade.y; - val += gPaletteFade.deltaY; - if (val > gPaletteFade.targetY) - val = gPaletteFade.targetY; - gPaletteFade.y = val; - } - else - { - val = gPaletteFade.y; - val -= gPaletteFade.deltaY; - if (val < gPaletteFade.targetY) - val = gPaletteFade.targetY; - gPaletteFade.y = val; - } - } - } - - return gPaletteFade.active; - } -} - -void InvertPlttBuffer(u32 selectedPalettes) -{ - u16 paletteOffset = 0; - - while (selectedPalettes) - { - if (selectedPalettes & 1) - { - u8 i; - for (i = 0; i < 16; i++) - gPlttBufferFaded[paletteOffset + i] = ~gPlttBufferFaded[paletteOffset + i]; - } - selectedPalettes >>= 1; - paletteOffset += 16; - } -} - -void TintPlttBuffer(u32 selectedPalettes, s8 r, s8 g, s8 b) -{ - u16 paletteOffset = 0; - - while (selectedPalettes) - { - if (selectedPalettes & 1) - { - u8 i; - for (i = 0; i < 16; i++) - { - struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[paletteOffset + i]; - data->r += r; - data->g += g; - data->b += b; - } - } - selectedPalettes >>= 1; - paletteOffset += 16; - } -} - -void UnfadePlttBuffer(u32 selectedPalettes) -{ - u16 paletteOffset = 0; - - while (selectedPalettes) - { - if (selectedPalettes & 1) - { - u8 i; - for (i = 0; i < 16; i++) - gPlttBufferFaded[paletteOffset + i] = gPlttBufferUnfaded[paletteOffset + i]; - } - selectedPalettes >>= 1; - paletteOffset += 16; - } -} - -void BeginFastPaletteFade(u8 submode) -{ - gPaletteFade.deltaY = 2; - BeginFastPaletteFadeInternal(submode); -} - -static void BeginFastPaletteFadeInternal(u8 submode) -{ - gPaletteFade.y = 31; - gPaletteFade_submode = submode & 0x3F; - gPaletteFade.active = 1; - gPaletteFade.mode = FAST_FADE; - - if (submode == FAST_FADE_IN_FROM_BLACK) - CpuFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE); - - if (submode == FAST_FADE_IN_FROM_WHITE) - CpuFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE); - - UpdatePaletteFade(); -} - -static u8 UpdateFastPaletteFade(void) -{ - u16 i; - u16 paletteOffsetStart; - u16 paletteOffsetEnd; - s8 r0; - s8 g0; - s8 b0; - s8 r; - s8 g; - s8 b; - - if (!gPaletteFade.active) - return 0; - - if (IsSoftwarePaletteFadeFinishing()) - return gPaletteFade.active; - - if (gPaletteFade.objPaletteToggle) - { - paletteOffsetStart = 256; - paletteOffsetEnd = 512; - } - else - { - paletteOffsetStart = 0; - paletteOffsetEnd = 256; - } - - switch (gPaletteFade_submode) - { - case FAST_FADE_IN_FROM_WHITE: - for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) - { - struct PlttData *unfaded; - struct PlttData *faded; - - unfaded = (struct PlttData *)&gPlttBufferUnfaded[i]; - r0 = unfaded->r; - g0 = unfaded->g; - b0 = unfaded->b; - - faded = (struct PlttData *)&gPlttBufferFaded[i]; - r = faded->r - 2; - g = faded->g - 2; - b = faded->b - 2; - - if (r < r0) - r = r0; - if (g < g0) - g = g0; - if (b < b0) - b = b0; - - gPlttBufferFaded[i] = RGB(r, g, b); - } - break; - case FAST_FADE_OUT_TO_WHTIE: - for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) - { - struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i]; - r = data->r + 2; - g = data->g + 2; - b = data->b + 2; - - if (r > 31) - r = 31; - if (g > 31) - g = 31; - if (b > 31) - b = 31; - - gPlttBufferFaded[i] = RGB(r, g, b); - } - break; - case FAST_FADE_IN_FROM_BLACK: - for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) - { - struct PlttData *unfaded; - struct PlttData *faded; - - unfaded = (struct PlttData *)&gPlttBufferUnfaded[i]; - r0 = unfaded->r; - g0 = unfaded->g; - b0 = unfaded->b; - - faded = (struct PlttData *)&gPlttBufferFaded[i]; - r = faded->r + 2; - g = faded->g + 2; - b = faded->b + 2; - - if (r > r0) - r = r0; - if (g > g0) - g = g0; - if (b > b0) - b = b0; - - gPlttBufferFaded[i] = RGB(r, g, b); - } - break; - case FAST_FADE_OUT_TO_BLACK: - for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) - { - struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i]; - r = data->r - 2; - g = data->g - 2; - b = data->b - 2; - - if (r < 0) - r = 0; - if (g < 0) - g = 0; - if (b < 0) - b = 0; - - gPlttBufferFaded[i] = RGB(r, g, b); - } - } - - gPaletteFade.objPaletteToggle ^= 1; - - if (gPaletteFade.objPaletteToggle) - return gPaletteFade.active; - - if (gPaletteFade.y - gPaletteFade.deltaY < 0) - gPaletteFade.y = 0; - else - gPaletteFade.y -= gPaletteFade.deltaY; - - if (gPaletteFade.y == 0) - { - switch (gPaletteFade_submode) - { - case FAST_FADE_IN_FROM_WHITE: - case FAST_FADE_IN_FROM_BLACK: - CpuCopy32(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE); - break; - case FAST_FADE_OUT_TO_WHTIE: - CpuFill32(0xFFFFFFFF, gPlttBufferFaded, PLTT_SIZE); - break; - case FAST_FADE_OUT_TO_BLACK: - CpuFill32(0x00000000, gPlttBufferFaded, PLTT_SIZE); - break; - } - - gPaletteFade.mode = NORMAL_FADE; - gPaletteFade.softwareFadeFinishing = 1; - } - - return gPaletteFade.active; -} - -void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters) -{ - gPaletteFade_blendCnt = blendCnt; - gPaletteFade.delayCounter = delay; - gPaletteFade_delay = delay; - gPaletteFade.y = y; - gPaletteFade.targetY = targetY; - gPaletteFade.active = 1; - gPaletteFade.mode = HARDWARE_FADE; - gPaletteFade.shouldResetBlendRegisters = shouldResetBlendRegisters & 1; - gPaletteFade.hardwareFadeFinishing = 0; - - if (y < targetY) - gPaletteFade.yDec = 0; - else - gPaletteFade.yDec = 1; -} - -static u8 UpdateHardwarePaletteFade(void) -{ - if (!gPaletteFade.active) - return 0; - - if (gPaletteFade.delayCounter < gPaletteFade_delay) - { - gPaletteFade.delayCounter++; - return 2; - } - - gPaletteFade.delayCounter = 0; - - if (!gPaletteFade.yDec) - { - gPaletteFade.y++; - if (gPaletteFade.y > gPaletteFade.targetY) - { - gPaletteFade.hardwareFadeFinishing++; - gPaletteFade.y--; - } - } - else - { - s32 y = gPaletteFade.y--; - if (y - 1 < gPaletteFade.targetY) - { - gPaletteFade.hardwareFadeFinishing++; - gPaletteFade.y++; - } - } - - if (gPaletteFade.hardwareFadeFinishing) - { - if (gPaletteFade.shouldResetBlendRegisters) - { - gPaletteFade_blendCnt = 0; - gPaletteFade.y = 0; - } - gPaletteFade.shouldResetBlendRegisters = 0; - } - - return gPaletteFade.active; -} - -static void UpdateBlendRegisters(void) -{ - REG_BLDCNT = gPaletteFade_blendCnt; - REG_BLDY = gPaletteFade.y; - if (gPaletteFade.hardwareFadeFinishing) - { - gPaletteFade.hardwareFadeFinishing = 0; - gPaletteFade.mode = 0; - gPaletteFade_blendCnt = 0; - gPaletteFade.y = 0; - gPaletteFade.active = 0; - } -} - -static bool8 IsSoftwarePaletteFadeFinishing(void) -{ - if (gPaletteFade.softwareFadeFinishing) - { - if (gPaletteFade.softwareFadeFinishingCounter == 4) - { - gPaletteFade.active = 0; - gPaletteFade.softwareFadeFinishing = 0; - gPaletteFade.softwareFadeFinishingCounter = 0; - } - else - { - gPaletteFade.softwareFadeFinishingCounter++; - } - - return TRUE; - } - else - { - return FALSE; - } -} - -void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) -{ - u16 paletteOffset; - - for (paletteOffset = 0; selectedPalettes; paletteOffset += 16) - { - if (selectedPalettes & 1) - BlendPalette(paletteOffset, 16, coeff, color); - selectedPalettes >>= 1; - } -} - -void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) -{ - void *src = gPlttBufferUnfaded; - void *dest = gPlttBufferFaded; - DmaCopy32(3, src, dest, PLTT_SIZE); - BlendPalettes(selectedPalettes, coeff, color); -} diff --git a/src/party_menu.c b/src/party_menu.c deleted file mode 100644 index 1fcd2cdda..000000000 --- a/src/party_menu.c +++ /dev/null @@ -1,1505 +0,0 @@ -#include "global.h" -#include "party_menu.h" -#include "battle.h" -#include "battle_interface.h" -#include "battle_party_menu.h" -#include "data2.h" -#include "event_data.h" -#include "item.h" -#include "item_use.h" -#include "mail_data.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "pokemon.h" -#include "pokemon_item_effect.h" -#include "pokemon_menu.h" -#include "pokemon_summary_screen.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "songs.h" -#include "sound.h" -#include "species.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "sprite.h" -#include "palette.h" -#include "event_data.h" -#include "main.h" -#include "item.h" -#include "battle_interface.h" -#include "species.h" -#include "party_menu.h" - -#define DATA_COUNT (6) - -struct Unk2001000 -{ - u8 unk0; - u8 unk1; - u8 unk2; -}; - -struct Unk201C000 -{ - /*0x00*/ struct Pokemon *pokemon; - /*0x04*/ u8 unk4; - /*0x05*/ u8 unk5; - /*0x06*/ u16 unk6; - /*0x08*/ u16 unk8; - /*0x0A*/ u8 pad_0A[2]; - /*0x0C*/ s32 unkC; - /*0x10*/ TaskFunc unk10; - /*0x14*/ TaskFunc unk14; -}; - -struct Unk201F000 -{ - u8 filler0[0xE00]; - u8 unkE00[3]; // not sure if this is an array or struct, or how big it is -}; - -struct UnknownStruct5 -{ - u8 unk0; - u8 unk1; - u16 *unk4; -}; - -extern u8 ewram[]; -#define ewram01000 (*(struct Unk2001000 *)(ewram + 0x01000)) -#define ewram1C000 (*(struct Unk201C000 *)(ewram + 0x1C000)) -#define ewram1F000 (*(struct Unk201F000 *)(ewram + 0x1F000)) - -extern u8 gUnknown_0202E8F4; -extern u8 gUnknown_0202E8F6; -extern u16 gUnknown_0202E8F8; -extern u8 gUnknown_0202E8FA; -extern u8 gLastFieldPokeMenuOpened; -extern u8 gPlayerPartyCount; -extern s32 gBattleMoveDamage; - -//extern const u16 gUnknown_083769A8[][6]; -//extern const u8 gUnknown_083769A8[][12]; -extern void *const gUnknown_08376858[][6]; -extern const u8 gUnknown_083769A8[]; -extern const u8 gUnknown_08376D1C[DATA_COUNT]; -extern const u16 gUnknown_08376504[]; -extern void (*const gUnknown_08376B54[])(u8); -extern const u8 *const gUnknown_08376D04[DATA_COUNT]; -extern const struct UnknownStruct5 gUnknown_08376BB4[][6]; - -static void sub_806E884(u8 taskId); - -/* -void sub_806AEDC(void) -{ - const struct UnknownStruct5 *r5; - s32 i; - - AnimateSprites(); - BuildOamBuffer(); - r5 = gUnknown_08376BB4[gUnknown_0202E8FA]; - for (i = 0; i < 6; i++) - sub_800142C(r5[i].unk0 * 8, r5[i].unk1 * 8, r5[i].unk4, 0, (i << 5) | 0x200); - RunTasks(); - UpdatePaletteFade(); -} -*/ - -#if ENGLISH -#define WINDOW_LEFT (3) -#define WINDOW_RIGHT (26) -#elif GERMAN -#define WINDOW_LEFT (0) -#define WINDOW_RIGHT (29) -#endif - -u8 sub_806E834(const u8 *message, u8 arg1) -{ - u8 taskId; - - gUnknown_0202E8F6 = 1; - - MenuDrawTextWindow(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - MenuPrintMessage(message, WINDOW_LEFT + 1, 15); - - taskId = CreateTask(sub_806E884, 1); - gTasks[taskId].data[0] = arg1; - - return taskId; -} - -static void sub_806E884(u8 taskId) -{ - if (MenuUpdateWindowText()) - { - gUnknown_0202E8F6 = 0; - if (gTasks[taskId].data[0] == 0) - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - DestroyTask(taskId); - } -} - -void sub_806E8D0(u8 taskId, u16 b, TaskFunc c) -{ - ewram1C000.unk10 = c; - ewram1C000.unk4 = taskId; - ewram1C000.unk5 = sub_806CA38(taskId); - ewram1C000.unk6 = b; - ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; -} - -bool8 PartyMenuUpdateMonHeldItem(struct Pokemon *pkmn, u16 item) -{ - u8 itemData[2]; - - if (ItemIsMail(item) == TRUE) - { - if (GiveMailToMon(pkmn, item) == 0xFF) - return TRUE; - gUnknown_0202E8F4 = 2; - } - else - { - gUnknown_0202E8F4 = 1; - } - - itemData[0] = item; - itemData[1] = item >> 8; - SetMonData(pkmn, MON_DATA_HELD_ITEM, itemData); - return FALSE; -} - -void PartyMenuTryGiveMonHeldItem(u8 taskId, u16 newItem, TaskFunc c) -{ - u16 currentItem; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, newItem, c); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - gUnknown_0202E8F4 = 0; - gUnknown_0202E8F8 = 0; - if (currentItem != 0) - { - if (ItemIsMail(currentItem) == TRUE) - { - sub_806E834(gOtherText_MailMustBeRemoved, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - else - { - GetMonNickname(ewram1C000.pokemon, gStringVar1); - CopyItemName(currentItem, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyHolding); - sub_806E834(gStringVar4, 1); - CreateTask(Task_ConfirmGiveHeldItem, 5); - if (ItemIsMail(newItem) == TRUE) - gUnknown_0202E8F8 = currentItem; - } - } - else - { - PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, newItem); - RemoveBagItem(newItem, 1); - if (ItemIsMail(newItem)) - { - gTasks[taskId].func = c; - } - else - { - DisplayGiveHeldItemMessage(ewram1C000.unk5, newItem, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - } -} - -void party_menu_link_mon_held_item_object(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } -} - -void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId) -{ - s8 selection = ProcessMenuInputNoWrap_(); - - if (selection == 0) - { - u16 currentItem; - - MenuZeroFillWindowRect(23, 8, 29, 13); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - RemoveBagItem(ewram1C000.unk6, 1); - if (AddBagItem(currentItem, 1) == TRUE) - { - PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, ewram1C000.unk6); - if (ItemIsMail(ewram1C000.unk6)) - { - DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 1); - } - else - { - CopyItemName(ewram1C000.unk6, gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_TakenAndReplaced); - sub_806E834(gStringVar4, 1); - } - } - else - { - sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); - AddBagItem(ewram1C000.unk6, 1); - } - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - } - gTasks[taskId].func = party_menu_link_mon_held_item_object; -} - -void Task_ConfirmGiveHeldItem(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = PartyMenuTryGiveMonHeldItem_806EACC; - } -} - -void DisplayGiveHeldItemMessage(u8 a, u16 b, u8 c) -{ - GetMonNickname(&gPlayerParty[a], gStringVar1); - CopyItemName(b, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasGivenToHold); - sub_806E834(gStringVar4, c); -} - - -// Not sure about this one for now. -/* -void PartyMenuTryGiveMonMail(u8 taskId, TaskFunc func) -{ - u16 currentItem; - struct MailStruct *r4; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, 0, func); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - gUnknown_0202E8F4 = 0; - r4 = &gSaveBlock1.mail[ewram1F000.unkE00[0] + ewram1F000.unkE00[2]]; - if (currentItem != 0) - { - sub_806E834(gOtherText_PokeHoldingItemCantMail, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - else - { - GiveMailToMon2(ewram1C000.pokemon, r4); - ClearMailStruct(r4); - sub_806E834(gOtherText_MailTransferredMailbox, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } -} -*/ -__attribute__((naked)) -void PartyMenuTryGiveMonMail(u8 taskId, TaskFunc func) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - adds r2, r1, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldr r3, _0806ECA0 @ =gTasks\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 3\n\ - adds r1, r3\n\ - ldr r3, _0806ECA4 @ =TaskDummy\n\ - str r3, [r1]\n\ - movs r1, 0\n\ - bl sub_806E8D0\n\ - ldr r5, _0806ECA8 @ =0x0201c000\n\ - ldr r0, [r5]\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - ldr r2, _0806ECAC @ =gUnknown_0202E8F4\n\ - movs r1, 0\n\ - strb r1, [r2]\n\ - movs r1, 0xF8\n\ - lsls r1, 6\n\ - adds r2, r5, r1\n\ - ldrb r1, [r2]\n\ - adds r1, 0x6\n\ - ldrb r2, [r2, 0x2]\n\ - adds r1, r2\n\ - lsls r2, r1, 3\n\ - adds r2, r1\n\ - lsls r2, 2\n\ - ldr r1, _0806ECB0 @ =gSaveBlock1 + 0x2B4C\n\ - adds r4, r2, r1\n\ - cmp r0, 0\n\ - beq _0806ECBC\n\ - ldr r0, _0806ECB4 @ =gOtherText_PokeHoldingItemCantMail\n\ - movs r1, 0x1\n\ - bl sub_806E834\n\ - ldr r0, _0806ECB8 @ =party_menu_link_mon_held_item_object\n\ - movs r1, 0x5\n\ - bl CreateTask\n\ - b _0806ECDA\n\ - .align 2, 0\n\ -_0806ECA0: .4byte gTasks\n\ -_0806ECA4: .4byte TaskDummy\n\ -_0806ECA8: .4byte 0x0201c000\n\ -_0806ECAC: .4byte gUnknown_0202E8F4\n\ -_0806ECB0: .4byte gSaveBlock1 + 0x2B4C\n\ -_0806ECB4: .4byte gOtherText_PokeHoldingItemCantMail\n\ -_0806ECB8: .4byte party_menu_link_mon_held_item_object\n\ -_0806ECBC:\n\ - ldr r0, [r5]\n\ - adds r1, r4, 0\n\ - bl GiveMailToMon2\n\ - adds r0, r4, 0\n\ - bl ClearMailStruct\n\ - ldr r0, _0806ECE0 @ =gOtherText_MailTransferredMailbox\n\ - movs r1, 0x1\n\ - bl sub_806E834\n\ - ldr r0, _0806ECE4 @ =party_menu_link_mon_held_item_object\n\ - movs r1, 0x5\n\ - bl CreateTask\n\ -_0806ECDA:\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806ECE0: .4byte gOtherText_MailTransferredMailbox\n\ -_0806ECE4: .4byte party_menu_link_mon_held_item_object\n\ - .syntax divided\n"); -} - -void PartyMenuTryGiveMonHeldItem_806ECE8(u8 taskId, TaskFunc func) -{ - u16 currentItem; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, 0, func); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - if (currentItem == 0) - { - StringExpandPlaceholders(gStringVar4, gOtherText_NotHoldingAnything); - sub_806E834(gStringVar4, 0); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - else - { - u8 itemData[2]; - - itemData[0] = 0; - itemData[1] = 0; - if (AddBagItem(currentItem, 1) == TRUE) - { - if (ItemIsMail(currentItem) == TRUE) - TakeMailFromMon(ewram1C000.pokemon); - DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 0); - SetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM, itemData); - } - else - { - sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); - } - CreateTask(party_menu_link_mon_held_item_object, 5); - } -} - -void DisplayTakeHeldItemMessage(u8 a, u16 b, u8 c) -{ - GetMonNickname(&gPlayerParty[a], gStringVar1); - CopyItemName(b, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_ReceivedTheThingFrom); - sub_806E834(gStringVar4, c); -} - -void DoTakeMail(u8 taskId, TaskFunc func) -{ - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, 0, func); - ewram1C000.unk6 = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - sub_806E834(gOtherText_SendRemovedMailPrompt, 1); - CreateTask(Task_ConfirmTakeHeldMail, 5); -} - -void Task_LoseMailMessage(u8 taskId) -{ - s8 selection = ProcessMenuInputNoWrap_(); - - if (selection == 0) - { - if (AddBagItem(ewram1C000.unk6, 1) == TRUE) - { - TakeMailFromMon(ewram1C000.pokemon); - sub_806E834(gOtherText_MailTaken, 0); - } - else - { - sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); - } - MenuZeroFillWindowRect(23, 8, 29, 13); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - MenuZeroFillWindowRect(0, 14, 29, 19); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } -} - -void Task_ConfirmLoseMailMessage(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = Task_LoseMailMessage; - } -} - -void Task_TakeHeldMail(u8 taskId) -{ - s8 selection = ProcessMenuInputNoWrap_(); - - if (selection == 0) - { - MenuZeroFillWindowRect(23, 8, 29, 13); - if (TakeMailFromMon2(ewram1C000.pokemon) != 0xFF) - sub_806E834(gOtherText_MailWasSent, 0); - else - sub_806E834(gOtherText_MailboxIsFull, 0); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - sub_806E834(gOtherText_MailRemovedMessageLost, 1); - gTasks[taskId].func = Task_ConfirmLoseMailMessage; - } -} - -void Task_ConfirmTakeHeldMail(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = Task_TakeHeldMail; - } -} - -u16 ItemIdToBattleMoveId(u16 item) -{ - u16 moveId = item - 289; - - return gUnknown_08376504[moveId]; -} - -bool8 pokemon_has_move(struct Pokemon *pkmn, u16 move) -{ - u8 i; - - for (i = 0; i < 4; i++) - { - if (GetMonData(pkmn, MON_DATA_MOVE1 + i) == move) - return TRUE; - } - return FALSE; -} - -void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func) -{ - PlaySE(SE_SELECT); - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, move, func); - CreateTask(Task_TeamMonTMMove, 5); -} - -void Task_TeamMonTMMove(u8 taskId) -{ - GetMonNickname(ewram1C000.pokemon, gStringVar1); - ewram1C000.unk8 = ItemIdToBattleMoveId(ewram1C000.unk6); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - ewram1B000.unk282 = 0; - if (pokemon_has_move(ewram1C000.pokemon, ewram1C000.unk8)) - { - StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyKnows); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (!CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) - { - StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (GiveMoveToMon(ewram1C000.pokemon, ewram1C000.unk8) != 0xFFFF) - { - Task_TeamMonTMMove2(taskId); - } - else - { - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = sub_806F358; - } - } - } -} - -void Task_TeamMonTMMove2(u8 taskId) -{ - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); - sub_806E834(gStringVar4, 1); - AdjustFriendship(ewram1C000.pokemon, 4); - if (ewram1B000.unk282 == 0 && ewram1C000.unk6 <= 0x152) - RemoveBagItem(ewram1C000.unk6, 1); - gTasks[taskId].func = Task_TeamMonTMMove3; -} - -void Task_TeamMonTMMove3(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - PlayFanfare(BGM_FANFA1); - gTasks[taskId].func = Task_TeamMonTMMove4; - } -} - -void Task_TeamMonTMMove4(u8 taskId) -{ - if (IsFanfareTaskInactive()) - { - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); - if (ewram1B000.unk282 == 1) - { - sub_8070C54(taskId); - } - else - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } - } - } -} - -void sub_806F2FC(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); - if (ewram1B000.unk282 == 1) - { - sub_8070C54(taskId); - } - else - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } - } -} - -void sub_806F358(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = sub_806F390; - } -} - -void sub_806F390(u8 taskId) -{ - s8 selection = ProcessMenuInputNoWrap_(); - - if (selection == 0) - { - MenuZeroFillWindowRect(23, 8, 29, 13); - sub_806E834(gOtherText_WhichMoveToForget2, 1); - gTasks[taskId].func = sub_806F44C; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - StopTryingToTeachMove_806F614(taskId); - } -} - -void sub_806F3FC(u8 taskId) -{ - if (!gPaletteFade.active) - { - sub_809D9F0(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8); - DestroyTask(taskId); - } -} - -void sub_806F44C(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_806F3FC; - } -} - -void TaughtMove(u8 taskId) -{ - if (!gPaletteFade.active) - { - u8 moveIndex; - u16 r4; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, gScriptItemId, sub_808B508); - moveIndex = sub_809FA30(); - r4 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + moveIndex); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[r4]); - StringExpandPlaceholders(gStringVar4, gOtherText_ForgetMove123_2); - sub_806E834(gStringVar4, 1); - CreateTask(TMMoveUpdateMoveSlot, 5); - } -} - -void TMMoveUpdateMoveSlot(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - RemoveMonPPBonus(ewram1C000.pokemon, sub_809FA30()); - SetMonMoveSlot(ewram1C000.pokemon, ewram1C000.unk8, sub_809FA30()); - Task_TeamMonTMMove2(taskId); - } -} - -void StopTryingToTeachMove_806F588(u8 taskId) -{ - if (!gPaletteFade.active) - { - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, gScriptItemId, sub_808B508); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); - sub_806E834(gStringVar4, 1); - CreateTask(StopTryingToTeachMove_806F67C, 5); - } -} - -void StopTryingToTeachMove_806F614(u8 taskId) -{ - MenuZeroFillWindowRect(23, 8, 29, 13); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = StopTryingToTeachMove_806F67C; -} - -void StopTryingToTeachMove_806F67C(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = StopTryingToTeachMove_806F6B4; - } -} - -void StopTryingToTeachMove_806F6B4(u8 taskId) -{ - s8 selection = ProcessMenuInputNoWrap_(); - - if (selection == 0) - { - MenuZeroFillWindowRect(23, 8, 29, 13); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_DidNotLearnMove2); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = sub_806F2FC; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = sub_806F358; - } -} - -bool8 IsHMMove(u16 move) -{ - u8 i; - - for (i = 0; i < 8; i++) - { - if (gUnknown_08376504[50 + i] == move) - return TRUE; - } - return FALSE; -} - -s16 sub_806F7E8(u8 taskId, struct BattleInterfaceStruct1 *b, s8 c) -{ - s16 *taskData; - u8 hpBarLevel; - void *vramPtr; - - taskData = gTasks[taskId].data; - - b->unk0 = taskData[10]; - b->unk4 = taskData[11]; - b->unk8 = taskData[12] * c; - b->unk10 = 0x100; - hpBarLevel = GetHPBarLevel(ewram1B000.unk282, b->unk0); - if (hpBarLevel > 2) - b->unkC_0 = 4; - if (hpBarLevel == 2) - b->unkC_0 = 5; - if (hpBarLevel < 2) - b->unkC_0 = 6; - vramPtr = gUnknown_08376858[IsDoubleBattle()][ewram1C000.unk5]; - return sub_80460C8(b, &ewram1C000.unkC, vramPtr, 0); -} - -void sub_806F8AC(u8 taskId) -{ - struct BattleInterfaceStruct1 sp0; - u16 sp14; - - ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, -1); - if (ewram1B000.unk282 == -1) - { - ewram1C000.unkC = 0; - if (-sp0.unk8 + sp0.unk4 > sp0.unk0) - sp14 = sp0.unk0 - sp0.unk4; - else - sp14 = -sp0.unk8; - gBattleMoveDamage = -sp14; - GetMonNickname(ewram1C000.pokemon, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, sp14, 0, 3); - if (gTasks[taskId].data[14] == 0) - StringExpandPlaceholders(gStringVar4, gOtherText_HPRestoredBy); - else - StringExpandPlaceholders(gStringVar4, gOtherText_RegainedHealth); - SetMonIconAnim(GetMonIconSpriteId_maybe(ewram1C000.unk4, ewram1C000.unk5), ewram1C000.pokemon); - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 7); - ewram1B000.unk261 = 2; - sub_806E834(gStringVar4, 1); - sp14 += sp0.unk4; - SetMonData(ewram1C000.pokemon, MON_DATA_HP, (u8 *)&sp14); - RemoveBagItem(ewram1C000.unk6, 1); - sub_8032638(); - gTasks[taskId].func = sub_806FB44; - } - else - { - PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); - } -} - -void sub_806FA18(u8 taskId) -{ - struct BattleInterfaceStruct1 sp0; - - ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, 1); - if (ewram1B000.unk282 == -1) - { - PlaySE(SE_KAIFUKU); - ewram1C000.unkC = 0; - gTasks[taskId].data[11] -= gTasks[taskId].data[12]; - SetMonData(ewram1C000.pokemon, MON_DATA_HP, (u8 *)&gTasks[taskId].data[11]); - SetMonIconAnim(GetMonIconSpriteId_maybe(ewram1C000.unk4, ewram01000.unk1), ewram1C000.pokemon); - ewram1C000.unk5 = gSprites[ewram01000.unk2].data0; - ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; - gTasks[taskId].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); - gTasks[taskId].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); - ewram1C000.unkC = -32768; - ewram1C000.unk14 = ewram1C000.unk10; - gTasks[taskId].func = sub_806F8AC; - ewram1B000.unk282 = gTasks[taskId].data[11]; - } - else - { - PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); - } -} - -void sub_806FB0C(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } -} - -void sub_806FB44(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk14; - DestroyTask(taskId); - } -} - -bool8 IsHPRecoveryItem(u16 item) -{ - const u8 *itemEffect; - - if (item == 0xAF) - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - else - itemEffect = gItemEffectTable[item - 13]; - - if (itemEffect[4] & 4) - return TRUE; - else - return FALSE; -} - -void PartyMenuUpdateLevelOrStatus(struct Pokemon *pkmn, u8 b) -{ - PartyMenuClearLevelStatusTilemap(b); - PartyMenuPrintMonLevelOrStatus(b, pkmn); -} - -void GetMedicineItemEffectMessage(u16 item) -{ - switch (GetItemEffectType(item)) - { - case 3: - StringExpandPlaceholders(gStringVar4, gOtherText_CuredPoisoning); - break; - case 4: - StringExpandPlaceholders(gStringVar4, gOtherText_WokeUp); - break; - case 5: - StringExpandPlaceholders(gStringVar4, gOtherText_BurnHealed); - break; - case 6: - StringExpandPlaceholders(gStringVar4, gOtherText_ThawedOut); - break; - case 7: - StringExpandPlaceholders(gStringVar4, gOtherText_CuredParalysis); - break; - case 8: - StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); - break; - case 9: - StringExpandPlaceholders(gStringVar4, gOtherText_GotOverLove); - break; - case 11: - StringExpandPlaceholders(gStringVar4, gOtherText_BecameHealthy); - break; - case 13: - StringCopy(gStringVar2, gOtherText_Hp2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 12: - StringCopy(gStringVar2, gOtherText_Attack); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 17: - StringCopy(gStringVar2, gOtherText_Defense); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 16: - StringCopy(gStringVar2, gOtherText_Speed); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 14: - StringCopy(gStringVar2, gOtherText_SpAtk2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 15: - StringCopy(gStringVar2, gOtherText_SpDef2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 19: - case 20: - StringExpandPlaceholders(gStringVar4, gOtherText_PPIncreased); - break; - case 21: - StringExpandPlaceholders(gStringVar4, gOtherText_PPRestored); - break; - default: - StringExpandPlaceholders(gStringVar4, gOtherText_WontHaveAnyEffect); - break; - } -} - -bool8 IsMedicineIneffective(struct Pokemon *pkmn, u16 item) -{ - if (GetItemEffectType(item) == 13 - && GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA) - return TRUE; - else - return FALSE; -} - -bool8 ExecuteTableBasedItemEffect__(u8 a, u16 b, u8 c) -{ - if (gMain.inBattle) - return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, sub_8094C20(a), c); - else - return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, a, c); -} - -void UseMedicine(u8 taskId, u16 item, TaskFunc func) -{ - u8 r7; - bool8 r9 = FALSE; - bool8 r0; - - gTasks[taskId].func = TaskDummy; - r7 = CreateTask(TaskDummy, 5); - sub_806E8D0(taskId, item, func); - if (!IsMedicineIneffective(ewram1C000.pokemon, item)) - { - r9 = IsHPRecoveryItem(item); - if (r9 == TRUE) - { - gTasks[r7].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); - gTasks[r7].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); - if (gTasks[r7].data[10] == gTasks[r7].data[11]) - { - r9 = FALSE; - gTasks[r7].data[10] = 0; - gTasks[r7].data[11] = 0; - } - } - r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, item, 0); - } - else - { - r0 = TRUE; - } - - if (r0) - { - gUnknown_0202E8F4 = 0; - PlaySE(SE_SELECT); - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - gTasks[r7].func = sub_806FB0C; - } - else - { - u8 statusAndPkrs; - - gUnknown_0202E8F4 = 1; - if (!IsBlueYellowRedFlute(item)) - PlaySE(SE_KAIFUKU); - else - PlaySE(SE_BIDORO); - statusAndPkrs = GetMonStatusAndPokerus(ewram1C000.pokemon); - if (statusAndPkrs == 6 || statusAndPkrs == 0) - PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); - if (r9 == TRUE) - { - gTasks[r7].data[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - gTasks[r7].data[11]; - ewram1C000.unkC = -32768; - if (gTasks[r7].data[11] == 0) - gTasks[r7].data[14] = 1; - else - gTasks[r7].data[14] = 0; - ewram1C000.unk14 = ewram1C000.unk10; - gTasks[r7].func = sub_806F8AC; - ewram1B000.unk282 = gTasks[r7].data[11]; - } - else - { - GetMonNickname(ewram1C000.pokemon, gStringVar1); - if (!IsBlueYellowRedFlute(item)) - RemoveBagItem(item, 1); - GetMedicineItemEffectMessage(item); - TryPrintPartyMenuMonNickname(ewram1C000.unk5, ewram1C000.pokemon); - sub_806E834(gStringVar4, 1); - gTasks[r7].func = sub_806FB0C; - } - } -} - -bool8 IsBlueYellowRedFlute(u16 item) -{ - if (item == 0x27 - || item == 0x29 - || item == 0x28) - return TRUE; - else - return FALSE; -} - -void sub_8070048(u8 taskId, u16 item, TaskFunc func) -{ - ewram1C000.unk10 = func; - ewram1C000.unk4 = taskId; - ewram1C000.unk6 = item; - ewram1C000.unk5 = 0; - ewram1C000.unk14 = sub_80701DC; - ewram1B000.unk27E = 0; - ewram1B000.unk280 = 0; - sub_8070088(taskId); -} - -void sub_8070088(u8 taskId) -{ - u8 taskId2; - - gTasks[taskId].func = TaskDummy; - if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) == 0) - { - gTasks[taskId].func = sub_80701DC; - } - else - { - s16 *taskData; - - taskId2 = CreateTask(TaskDummy, 5); - taskData = gTasks[taskId2].data; - ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; - taskData[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); - taskData[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); - if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, 0)) - { - DestroyTask(taskId2); - gTasks[taskId].func = sub_80701DC; - } - else - { - gUnknown_0202E8F4 = 1; - MenuZeroFillWindowRect(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); - ewram1B000.unk261 = 2; - taskData[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - taskData[11]; - taskData[14] = 1; - ewram1B000.unk27E = 1; - ewram1B000.unk280 = 1; - ewram1B000.unk282 = taskData[11]; - ewram1C000.unkC = -32768; - gTasks[taskId2].func = sub_806F8AC; - } - } -} - -void sub_80701DC(u8 taskId) -{ - if (ewram1B000.unk27E == 1) - { - AddBagItem(ewram1C000.unk6, 1); - if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) != 0) - { - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 3); - ewram1B000.unk261 = 2; - } - ewram1B000.unk27E = 0; - } - ewram1C000.unk5++; - if (ewram1C000.unk5 == 6) - { - gUnknown_0202E8F4 = 0; - if (ewram1B000.unk280 == 0) - { - gTasks[taskId].func = TaskDummy; - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - CreateTask(sub_806FB0C, 8); - } - else - { - RemoveBagItem(ewram1C000.unk6, 1); - gTasks[taskId].func = ewram1C000.unk10; - } - gLastFieldPokeMenuOpened = 0; - } - else - { - sub_8070088(taskId); - } -} - -void CreateItemUseMoveMenu(u8 partyMonIndex) -{ - u8 r6; - u8 i; - - r6 = 0; - MenuDrawTextWindow(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); - if (move != 0) - r6++; - } - InitMenu(0, 20, 11, r6, 0, 9); -} - -void Task_HandleItemUseMoveMenuInput(u8 taskId) -{ - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - MoveMenuCursor(-1); - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - MoveMenuCursor(1); - } - else if (gMain.newKeys & A_BUTTON) - { - gUnknown_08376B54[0](taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_08376B54[1](taskId); - } -} - -void DoPPRecoveryItemEffect(u8 taskId, u16 b, TaskFunc c) -{ - const u8 *itemEffect; - u8 taskId2; - - if (b == 0xAF) - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - else - itemEffect = gItemEffectTable[b - 13]; - gTasks[taskId].func = TaskDummy; - taskId2 = CreateTask(TaskDummy, 5); - sub_806E8D0(taskId, b, c); - if (!(itemEffect[4] & 0x10)) - { - gTasks[taskId2].data[11] = 0; - DoRecoverPP(taskId2); - } - else - { - PlaySE(SE_SELECT); - sub_806D538(10, 3); - CreateItemUseMoveMenu(ewram1C000.unk5); - gTasks[taskId2].func = Task_HandleItemUseMoveMenuInput; - gMain.newKeys = 0; - } -} - -void ItemUseMoveMenu_HandleMoveSelection(u8 taskId) -{ - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(19, 10, 29, 19); - sub_806D5A4(); - gTasks[taskId].data[11] = GetMenuCursorPos(); - DoRecoverPP(taskId); -} - -void ItemUseMoveMenu_HandleCancel(u8 taskId) -{ - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(19, 10, 29, 19); - if (gMain.inBattle) - gTasks[ewram1C000.unk4].func = SetUpBattlePokemonMenu; - else - gTasks[ewram1C000.unk4].func = sub_808B0C0; - sub_806D538(3, 0); - DestroyTask(taskId); -} - -void DoRecoverPP(u8 taskId) -{ - u16 r5 = 0; - - if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, gTasks[taskId].data[11])) - { - gUnknown_0202E8F4 = r5; - PlaySE(SE_SELECT); - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - } - else - { - gUnknown_0202E8F4 = 1; - PlaySE(SE_KAIFUKU); - RemoveBagItem(ewram1C000.unk6, 1); - r5 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + gTasks[taskId].data[11]); - StringCopy(gStringVar1, gMoveNames[r5]); - GetMedicineItemEffectMessage(ewram1C000.unk6); - sub_806E834(gStringVar4, 1); - } - gTasks[taskId].func = sub_806FB0C; -} - -void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c) -{ - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, b, c); - PlaySE(SE_SELECT); - sub_806D538(11, 3); - CreateItemUseMoveMenu(ewram1C000.unk5); - CreateTask(Task_HandleItemUseMoveMenuInput, 5); - gMain.newKeys = 0; -} - -void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c) -{ - u8 i; - bool8 r0; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, b, c); - - if (GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL) != 100) - { - for (i = 0; i < 6; i++) - ewram1B000.unk264[i] = GetMonData(ewram1C000.pokemon, gUnknown_08376D1C[i]); - r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, b, 0); - } - else - r0 = TRUE; - - if (r0) - { - gUnknown_0202E8F4 = 0; - PlaySE(SE_SELECT); - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - CreateTask(sub_806FB0C, 5); - } - else - { - u8 level; - - gUnknown_0202E8F4 = 1; - PlayFanfareByFanfareNum(0); - sub_8070A20(ewram1C000.unk5, ewram1C000.pokemon); - RemoveBagItem(b, 1); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - level = GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL); - ConvertIntToDecimalStringN(gStringVar2, level, 0, 3); - StringExpandPlaceholders(gStringVar4, gOtherText_ElevatedTo); - sub_806E834(gStringVar4, 1); - CreateTask(Task_RareCandy1, 5); - } -} - -void Task_RareCandy1(u8 taskId) -{ - if (WaitFanfare(0) && gUnknown_0202E8F6 == 0) - { - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - PlaySE(SE_SELECT); - sub_8070848(taskId); - gTasks[taskId].func = Task_RareCandy2; - } - } -} - -void Task_RareCandy2(u8 taskId) -{ - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - PlaySE(SE_SELECT); - sub_8070968(taskId); - gTasks[taskId].func = Task_RareCandy3; - } -} - -#if ENGLISH -void sub_8070848(u8 taskId) -{ - u8 i; - - MenuDrawTextWindow(11, 0, 29, 7); - - for (i = 0; i < DATA_COUNT; i++) - { - u8 x; - u8 y; - u32 stat; - - stat = GetMonData(ewram1C000.pokemon, gUnknown_08376D1C[i]); - - ewram1B000.unk264[i + DATA_COUNT] = stat; - ewram1B000.unk264[i] = stat - ewram1B000.unk264[i]; - - x = (i / 3) * 9 + 11; - y = ((i % 3) << 1) + 1; - - MenuPrint_PixelCoords(gUnknown_08376D04[i], (x + 1) * 8, y * 8, 1); - - if (i == 2) - MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); - else - MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); - - gStringVar1[0] = EXT_CTRL_CODE_BEGIN; - gStringVar1[1] = 0x14; - gStringVar1[2] = 0x06; - - ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.unk264[i], 1, 2); - - MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); - } -} -#elif GERMAN -__attribute__((naked)) -void sub_8070848(u8 taskId) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - movs r0, 0xB\n\ - movs r1, 0\n\ - movs r2, 0x1D\n\ - movs r3, 0x7\n\ - bl MenuDrawTextWindow\n\ - movs r7, 0\n\ - ldr r0, _0807092C @ =gStringVar1\n\ - mov r10, r0\n\ - movs r1, 0xFC\n\ - mov r9, r1\n\ - movs r2, 0x13\n\ - mov r8, r2\n\ -_0807086C:\n\ - ldr r1, _08070930 @ =0x0201c000\n\ - ldr r0, [r1]\n\ - ldr r1, _08070934 @ =gUnknown_08376D1C\n\ - adds r1, r7, r1\n\ - ldrb r1, [r1]\n\ - bl GetMonData\n\ - adds r1, r7, 0x6\n\ - lsls r1, 1\n\ - ldr r2, _08070938 @ =0x0201b264\n\ - adds r1, r2, r1\n\ - strh r0, [r1]\n\ - lsls r6, r7, 1\n\ - adds r6, r2, r6\n\ - ldrh r1, [r6]\n\ - subs r0, r1\n\ - strh r0, [r6]\n\ - adds r0, r7, 0\n\ - movs r1, 0x3\n\ - bl __udivsi3\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r4, r0, 3\n\ - adds r4, r0\n\ - adds r4, 0xB\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - adds r0, r7, 0\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - adds r5, r0, 0\n\ - lsls r5, 1\n\ - adds r5, 0x1\n\ - lsls r5, 24\n\ - lsrs r5, 24\n\ - ldr r1, _0807093C @ =gUnknown_08376D04\n\ - lsls r0, r7, 2\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - mov r0, r10\n\ - bl StringCopy\n\ - adds r2, r0, 0\n\ - mov r0, r9\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - mov r1, r8\n\ - strb r1, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0x2E\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - adds r0, r2, 0\n\ - ldr r1, _08070940 @ =gOtherText_TallPlusAndRightArrow\n\ - bl StringCopy\n\ - adds r2, r0, 0\n\ - mov r0, r9\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - mov r1, r8\n\ - strb r1, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0x34\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0\n\ - ldrsh r1, [r6, r0]\n\ - adds r0, r2, 0\n\ - movs r2, 0x1\n\ - movs r3, 0x2\n\ - bl ConvertIntToDecimalStringN\n\ - adds r4, 0x1\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - mov r0, r10\n\ - adds r1, r4, 0\n\ - adds r2, r5, 0\n\ - bl MenuPrint\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - cmp r7, 0x5\n\ - bls _0807086C\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0807092C: .4byte gStringVar1\n\ -_08070930: .4byte 0x0201c000\n\ -_08070934: .4byte gUnknown_08376D1C\n\ -_08070938: .4byte 0x0201b264\n\ -_0807093C: .4byte gUnknown_08376D04\n\ -_08070940: .4byte gOtherText_TallPlusAndRightArrow\n\ - .syntax divided\n"); -} -#endif diff --git a/src/play_time.c b/src/play_time.c deleted file mode 100644 index 9882c9c4b..000000000 --- a/src/play_time.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "global.h" -#include "play_time.h" - -enum -{ - STOPPED, - RUNNING, - MAXED_OUT -}; - -static u8 sPlayTimeCounterState; - -void PlayTimeCounter_Reset() -{ - sPlayTimeCounterState = STOPPED; - - gSaveBlock2.playTimeHours = 0; - gSaveBlock2.playTimeMinutes = 0; - gSaveBlock2.playTimeSeconds = 0; - gSaveBlock2.playTimeVBlanks = 0; -} - -void PlayTimeCounter_Start() -{ - sPlayTimeCounterState = RUNNING; - - if (gSaveBlock2.playTimeHours > 999) - PlayTimeCounter_SetToMax(); -} - -void PlayTimeCounter_Stop() -{ - sPlayTimeCounterState = STOPPED; -} - -void PlayTimeCounter_Update() -{ - if (sPlayTimeCounterState == RUNNING) - { - gSaveBlock2.playTimeVBlanks++; - - if (gSaveBlock2.playTimeVBlanks > 59) - { - gSaveBlock2.playTimeVBlanks = 0; - gSaveBlock2.playTimeSeconds++; - - if (gSaveBlock2.playTimeSeconds > 59) - { - gSaveBlock2.playTimeSeconds = 0; - gSaveBlock2.playTimeMinutes++; - - if (gSaveBlock2.playTimeMinutes > 59) - { - gSaveBlock2.playTimeMinutes = 0; - gSaveBlock2.playTimeHours++; - - if (gSaveBlock2.playTimeHours > 999) - PlayTimeCounter_SetToMax(); - } - } - } - } -} - -void PlayTimeCounter_SetToMax() -{ - sPlayTimeCounterState = MAXED_OUT; - - gSaveBlock2.playTimeHours = 999; - gSaveBlock2.playTimeMinutes = 59; - gSaveBlock2.playTimeSeconds = 59; - gSaveBlock2.playTimeVBlanks = 59; -} diff --git a/src/player_pc.c b/src/player_pc.c deleted file mode 100644 index 6d52c560a..000000000 --- a/src/player_pc.c +++ /dev/null @@ -1,1368 +0,0 @@ -#include "global.h" -#include "player_pc.h" -#include "decoration.h" -#include "field_fadetransition.h" -#include "field_weather.h" -#include "item.h" -#include "item_menu.h" -#include "items.h" -#include "main.h" -#include "menu.h" -#include "menu_helpers.h" -#include "palette.h" -#include "script.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "songs.h" -#include "name_string_util.h" -#include "mail.h" -#include "rom4.h" -#include "player_pc.h" - -extern void DisplayItemMessageOnField(u8, const u8*, TaskFunc, u16); -extern void DoPlayerPCDecoration(u8); -extern void BuyMenuFreeMemory(void); -extern void DestroyVerticalScrollIndicator(u8); -extern void PauseVerticalScrollIndicator(u8); -extern void LoadScrollIndicatorPalette(void); -extern void ClearMailStruct(struct MailStruct *); -extern u8 sub_807D770(void); -extern void sub_808B020(void); -extern void sub_80F944C(void); - -static EWRAM_DATA u8 *gPcItemMenuOptionOrder = NULL; - -static u8 gPcItemMenuOptionsNum; - -extern u8 gUnknown_02038561; - -// event scripts -extern u8 gBrendanHouse_TurnPCOff[]; -extern u8 gMayHouse_TurnPCOff[]; - -extern void (*gFieldCallback)(void); - -static void InitPlayerPCMenu(u8 taskId); -static void PlayerPCProcessMenuInput(u8 taskId); -static void InitItemStorageMenu(u8); -static void ItemStorageMenuPrint(const u8 *); -static void ItemStorageMenuProcessInput(u8); -static void ItemStorage_ProcessInput(u8); -static void ItemStorage_SetItemAndMailCount(u8); -static void ItemStorage_DoItemAction(u8); -static void ItemStorage_GoBackToPlayerPCMenu(u8); -static void ItemStorage_HandleQuantityRolling(u8); -static void ItemStorage_DoItemWithdraw(u8); -static void ItemStorage_DoItemToss(u8); -static void ItemStorage_HandleRemoveItem(u8); -static void ItemStorage_WaitPressHandleResumeProcessInput(u8); -static void ItemStorage_HandleResumeProcessInput(u8); -static void ItemStorage_DoItemSwap(u8, bool8); -static void ItemStorage_DrawItemList(u8); -static void ItemStorage_PrintItemPcResponse(u16); -static void ItemStorage_DrawBothListAndDescription(u8); -static void ItemStorage_GoBackToItemPCMenu(u8, u8); -static void ItemStorage_LoadPalette(void); -static u8 GetMailboxMailCount(void); -static void Mailbox_UpdateMailList(void); -static void Mailbox_DrawMailboxMenu(u8); -static void Mailbox_ProcessInput(u8); -static void Mailbox_CloseScrollIndicators(void); -static void Mailbox_PrintWhatToDoWithPlayerMailText(u8); -static void Mailbox_TurnOff(u8); -static void Mailbox_PrintMailOptions(u8); -static void Mailbox_MailOptionsProcessInput(u8); -static void Mailbox_FadeAndReadMail(u8); -static void Mailbox_ReturnToFieldFromReadMail(void); -static void Mailbox_DrawYesNoBeforeMove(u8); -static void Mailbox_DoGiveMailPokeMenu(u8); -static void Mailbox_NoPokemonForMail(u8); -static void Mailbox_Cancel(u8); -static void Mailbox_DrawMailMenuAndDoProcessInput(u8); -static void PlayerPC_ItemStorage(u8 taskId); -static void PlayerPC_Mailbox(u8 taskId); -static void PlayerPC_Decoration(u8 var); -static void PlayerPC_TurnOff(u8 taskId); -static void ItemStorage_Withdraw(u8); -static void ItemStorage_Deposit(u8); -static void ItemStorage_Toss(u8); -static void ItemStorage_Exit(u8); -static void ItemStorage_ResumeInputFromYesToss(u8); -static void ItemStorage_ResumeInputFromNoToss(u8); -static void Mailbox_DoMailMoveToBag(u8); -static void Mailbox_ReturnToInputAfterNo(u8); -static void Mailbox_DoMailRead(u8); -static void Mailbox_MoveToBag(u8); -static void Mailbox_Give(u8); -static void Mailbox_Cancel(u8); - -static const u8 *const gPCText_OptionDescList[] = -{ - PCText_TakeOutItems, - PCText_StoreItems, - PCText_ThrowAwayItems, - gMenuText_GoBackToPrev -}; - -static const struct MenuAction2 gPCText_PlayerPCOptionsText[] = -{ - { SecretBaseText_ItemStorage, PlayerPC_ItemStorage }, - { gPCText_Mailbox, PlayerPC_Mailbox }, - { SecretBaseText_Decoration, PlayerPC_Decoration }, - { SecretBaseText_TurnOff, PlayerPC_TurnOff } -}; - -static const u8 gBedroomPC_OptionOrder[] = -{ - PLAYERPC_MENU_ITEMSTORAGE, - PLAYERPC_MENU_MAILBOX, - PLAYERPC_MENU_DECORATION, - PLAYERPC_MENU_TURNOFF -}; - -static const u8 gPlayerPC_OptionOrder[] = -{ - PLAYERPC_MENU_ITEMSTORAGE, - PLAYERPC_MENU_MAILBOX, - PLAYERPC_MENU_TURNOFF -}; - -static const struct MenuAction2 gPCText_ItemPCOptionsText[] = -{ - { PCText_WithdrawItem, ItemStorage_Withdraw }, - { PCText_DepositItem, ItemStorage_Deposit }, - { PCText_TossItem, ItemStorage_Toss }, - { gUnknownText_Exit, ItemStorage_Exit } -}; - -static const struct YesNoFuncTable ResumeFromTossYesNoFuncList[] = // ResumeFromTossYesNoFuncList -{ - ItemStorage_ResumeInputFromYesToss, - ItemStorage_ResumeInputFromNoToss -}; - -static const struct YesNoFuncTable ResumeFromWithdrawYesNoFuncList[] = // ResumeFromWithdrawYesNoFuncList -{ - Mailbox_DoMailMoveToBag, - Mailbox_ReturnToInputAfterNo -}; - -// the use of this struct is meant to be an ItemSlot struct, but NewGameInitPCItems refuses to match without a weird pointer access. -static const struct ItemSlot gNewGamePCItems[] = -{ - { ITEM_POTION, 1 }, - { ITEM_NONE, 0 } -}; - -static const struct MenuAction2 gMailboxMailOptions[] = -{ - { OtherText_Read, Mailbox_DoMailRead }, - { gOtherText_MoveToBag, Mailbox_MoveToBag }, - { OtherText_Give, Mailbox_Give }, - { gOtherText_CancelNoTerminator, Mailbox_Cancel } -}; - -static const u8 gNonSelectedItemFormattedText[] = _("{STR_VAR_1}{CLEAR_TO 80}"); -static const u8 gSelectedItemFormattedText[] = _("{COLOR RED}{STR_VAR_1}{CLEAR_TO 80}"); -static const u8 gNonSelectedItemQuantityFormatText[] = _("{STR_VAR_1}"); -static const u8 gSelectedItemQuantityFormatText[] = _("{COLOR RED}{STR_VAR_1}"); -static const u8 gUnknown_08406330[] = _("{CLEAR_TO 32}"); - -static const u16 gUnknown_08406334[3] = -{ - 0x5294, - 0x6B5A, - 0x7FFF -}; - -static const u8 gHighlightedMoveToBagFormatText[] = _("{COLOR RED}{STR_VAR_1}"); - -extern u8 *gUnknown_02039314; -extern struct MenuAction gUnknown_08406298[]; - -extern u8 gUnknown_084062B8[]; -extern u8 gUnknown_084062BC[]; -extern u8 gUnknown_0840632A[]; -extern u8 gUnknown_08406327[]; -extern u8 gUnknown_0840631E[]; -extern u8 gUnknown_08406318[]; - -extern u8 gUnknown_030007B4; -extern u8 unk_201FE00[]; - -extern u8 gUnknown_08152850; -extern u8 gUnknown_08152C75; - -extern u32 gUnknown_08406288[]; -extern const struct MenuAction gUnknown_084062C0[]; -extern const struct YesNoFuncTable gUnknown_084062E0; - -void NewGameInitPCItems(void) -{ - u8 i; - - // because Game Freak don't know how to use a struct or a 2d array - for(i = 0, ClearItemSlots(gSaveBlock1.pcItems, ARRAY_COUNT(gSaveBlock1.pcItems)); NEW_GAME_PC_ITEMS(i, ITEM_ID) && NEW_GAME_PC_ITEMS(i, QUANTITY) && - AddPCItem(NEW_GAME_PC_ITEMS(i, ITEM_ID), NEW_GAME_PC_ITEMS(i, QUANTITY)) == TRUE; i++) - ; -} - -void BedroomPC(void) -{ - gPcItemMenuOptionOrder = (u8 *)gBedroomPC_OptionOrder; - gPcItemMenuOptionsNum = 4; - DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); -} - -void PlayerPC(void) -{ - gPcItemMenuOptionOrder = (u8 *)gPlayerPC_OptionOrder; - gPcItemMenuOptionsNum = 3; - DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); -} - -static void InitPlayerPCMenu(u8 taskId) -{ - MenuDrawTextWindow(0, 0, 10, gPcItemMenuOptionsNum * 2 + 1); - PrintMenuItemsReordered(1, 1, gPcItemMenuOptionsNum, (struct MenuAction *)gPCText_PlayerPCOptionsText, gPcItemMenuOptionOrder); - InitMenu(0, 1, 1, gPcItemMenuOptionsNum, 0, 9); - TASK.FUNC = PlayerPCProcessMenuInput; -} - -static void PlayerPCProcessMenuInput(u8 taskId) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - MoveMenuCursor(-1); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - MoveMenuCursor(1); - } - else if (gMain.newKeys & A_BUTTON) - { - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - gPCText_PlayerPCOptionsText[gPcItemMenuOptionOrder[GetMenuCursorPos()]].func(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - gPCText_PlayerPCOptionsText[gPcItemMenuOptionsNum[gPcItemMenuOptionOrder - 1]].func(taskId); // run EXIT. - } -} - -void ReshowPlayerPC(u8 var) -{ - DisplayItemMessageOnField(var, gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); -} - -static void PlayerPC_ItemStorage(u8 taskId) -{ - InitItemStorageMenu(ITEMPC_MENU_WITHDRAW); - TASK.FUNC = ItemStorageMenuProcessInput; -} - -static void PlayerPC_Mailbox(u8 taskId) -{ - MenuZeroFillWindowRect(0, 0, 10, 9); - gMailboxInfo.count = GetMailboxMailCount(); - - if (gMailboxInfo.count == 0) - DisplayItemMessageOnField(taskId, gOtherText_NoMailHere, ReshowPlayerPC, 0); - else - { - gMailboxInfo.cursorPos = 0; - gMailboxInfo.itemsAbove = 0; - Mailbox_UpdateMailList(); - ItemStorage_SetItemAndMailCount(taskId); - Mailbox_DrawMailboxMenu(taskId); - TASK.FUNC = Mailbox_ProcessInput; - } -} - -static void PlayerPC_Decoration(u8 var) -{ - MenuZeroFillWindowRect(0, 0, 10, 9); - DoPlayerPCDecoration(var); -} - -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); - - if (gSaveBlock2.playerGender == MALE) - ScriptContext1_SetupScript(gBrendanHouse_TurnPCOff); - else - ScriptContext1_SetupScript(gMayHouse_TurnPCOff); - } - else - { - MenuZeroFillWindowRect(0, 0, 10, 9); - EnableBothScriptContexts(); - } - DestroyTask(taskId); -} - -static void InitItemStorageMenu(u8 var) -{ - MenuZeroFillWindowRect(0, 0, 10, 9); - MenuDrawTextWindow(0, 0, 11, 9); - PrintMenuItems(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); -} - -static void ItemStorageMenuProcessInput(u8 var) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - MoveMenuCursor(-1); - ItemStorageMenuPrint(gPCText_OptionDescList[GetMenuCursorPos()]); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - MoveMenuCursor(1); - ItemStorageMenuPrint(gPCText_OptionDescList[GetMenuCursorPos()]); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gPCText_ItemPCOptionsText[GetMenuCursorPos()].func(var); - } - else if (gMain.newKeys & B_BUTTON) - { - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - gPCText_ItemPCOptionsText[ITEMPC_MENU_EXIT].func(var); - } -} - -static void Task_ItemStorage_Deposit(u8 taskId) -{ - if (!gPaletteFade.active) - { - sub_80A6A30(); - DestroyTask(taskId); - } -} - -static void ItemStorage_Deposit(u8 taskId) -{ - TASK.FUNC = Task_ItemStorage_Deposit; - fade_screen(1, 0); -} - -static void ItemStorage_HandleReturnToProcessInput(u8 taskId) -{ - if (sub_807D770() == TRUE) - TASK.FUNC = ItemStorageMenuProcessInput; -} - -void ItemStorage_ReturnToMenuAfterDeposit(void) -{ - MenuDisplayMessageBox(); - InitItemStorageMenu(ITEMPC_MENU_DEPOSIT); - CreateTask(ItemStorage_HandleReturnToProcessInput, 0); - pal_fill_black(); -} - -static void ItemStorage_Withdraw(u8 taskId) -{ - s16 *data = TASK.data; - - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 11, 9); - NUM_ITEMS = CountUsedPCItemSlots(); - - if (NUM_ITEMS != 0) - { - MenuZeroFillWindowRect(0, 14, 29, 19); - CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_WITHDRAW; - PAGE_INDEX = 0; - ITEMS_ABOVE_TOP = 0; - ItemStorage_SetItemAndMailCount(taskId); - ItemStorage_GoBackToItemPCMenu(taskId, 0); - TASK.FUNC = ItemStorage_ProcessInput; - } - else - DisplayItemMessageOnField(taskId, gOtherText_NoItems, PlayerPC_ItemStorage, 0); -} - -static void ItemStorage_Toss(u8 taskId) -{ - s16 *data = TASK.data; - - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 11, 9); - NUM_ITEMS = CountUsedPCItemSlots(); - - if (NUM_ITEMS) - { - MenuZeroFillWindowRect(0, 14, 29, 19); - CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_TOSS; - PAGE_INDEX = 0; - ITEMS_ABOVE_TOP = 0; - ItemStorage_SetItemAndMailCount(taskId); - ItemStorage_GoBackToItemPCMenu(taskId, 2); - TASK.FUNC = ItemStorage_ProcessInput; - } - else - DisplayItemMessageOnField(taskId, gOtherText_NoItems, PlayerPC_ItemStorage, 0); -} - -static void ItemStorage_Exit(u8 var) -{ - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 11, 9); - ReshowPlayerPC(var); -} - -static void ItemStorage_SetItemAndMailCount(u8 taskId) -{ - s16 *data = TASK.data; - - if (NUM_ITEMS > 7) // we have a full page, so set the num of page items appropriately. - NUM_PAGE_ITEMS = 8; - else - NUM_PAGE_ITEMS = NUM_ITEMS + 1; // there are not enough items to fill a full page; take the # of items and add 1 for the cancel button. - - if (gMailboxInfo.count > 7) - gMailboxInfo.pageItems = 8; - else - gMailboxInfo.pageItems = gMailboxInfo.count + 1; -} - -static void ItemStorage_ProcessInput(u8 taskId) -{ - s16 *data = TASK.data; - s16 trueIndex; - - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if(PAGE_INDEX != 0) // did the cursor move physically upwards? - { - PlaySE(SE_SELECT); - PAGE_INDEX = MoveMenuCursor(-1); - trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; - if (SWITCH_MODE_ACTIVE == FALSE) // are we not currently switching items? - { - if (trueIndex == NUM_ITEMS) // if the cursor is on top of cancel, print the go back to prev description. - { - ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); - } - else - { - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); - } - } - } - else // the page cursor is at the top. but we may not be at the top of the true index list, so do another check. - { - if (ITEMS_ABOVE_TOP == 0) // did the cursor not move due to being at the top of the list? - return; - - PlaySE(SE_SELECT); - ITEMS_ABOVE_TOP--; - 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. - } - } - else if(gMain.newAndRepeatedKeys & DPAD_DOWN) // _0813A306 - { - if(PAGE_INDEX != NUM_PAGE_ITEMS - 1) - { - PlaySE(SE_SELECT); - PAGE_INDEX = MoveMenuCursor(1); - trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; - - if(SWITCH_MODE_ACTIVE != FALSE) - return; - - if (trueIndex == NUM_ITEMS) - ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); // probably further down - else - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); - } - else if(ITEMS_ABOVE_TOP + PAGE_INDEX != NUM_ITEMS) - { - PlaySE(SE_SELECT); - ITEMS_ABOVE_TOP++; - ItemStorage_DrawBothListAndDescription(taskId); - - if (SWITCH_MODE_ACTIVE != FALSE) - MoveMenuCursor(0); - } - } - else if(gMain.newKeys & SELECT_BUTTON) // _0813A3A0 - { - if (SWITCH_MODE_ACTIVE == FALSE) - { - if (PAGE_INDEX + ITEMS_ABOVE_TOP != NUM_ITEMS) // you cannot swap the Cancel button. - { - PlaySE(SE_SELECT); - SWITCH_MODE_ACTIVE = TRUE; - SWAP_ITEM_INDEX = ITEMS_ABOVE_TOP + PAGE_INDEX; - ItemStorage_PrintItemPcResponse(ITEMPC_SWITCH_WHICH_ITEM); - } - // _0813A3DC - ItemStorage_DrawItemList(taskId); - } - else // _0813A3E8 - { - PlaySE(SE_SELECT); - ItemStorage_DoItemSwap(taskId, FALSE); - ItemStorage_DrawBothListAndDescription(taskId); - } - } - else if(gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if(SWITCH_MODE_ACTIVE == FALSE) - { - if(ITEMS_ABOVE_TOP + PAGE_INDEX != NUM_ITEMS) - { - ItemStorage_DoItemAction(taskId); - } - else - { - ItemStorage_GoBackToPlayerPCMenu(taskId); - } - } - else - { - ItemStorage_DoItemSwap(taskId, FALSE); - ItemStorage_DrawBothListAndDescription(taskId); - } - } - else if(gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - if(SWITCH_MODE_ACTIVE == FALSE) - { - HandleDestroyMenuCursors(); - ItemStorage_GoBackToPlayerPCMenu(taskId); - } - else - { - ItemStorage_DoItemSwap(taskId, TRUE); - ItemStorage_DrawBothListAndDescription(taskId); - } - } -} - -static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId) -{ - BuyMenuFreeMemory(); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); - MenuZeroFillWindowRect(0, 0, 29, 19); - MenuDisplayMessageBox(); - InitItemStorageMenu(TASK.CURRENT_ITEM_STORAGE_MENU); - TASK.FUNC = ItemStorageMenuProcessInput; -} - -static void ItemStorage_DoItemAction(u8 taskId) -{ - s16 *data = TASK.data; - u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; - - PauseVerticalScrollIndicator(0); - PauseVerticalScrollIndicator(1); // PauseVerticalScrollIndicator - - if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW) - { - if(gSaveBlock1.pcItems[trueIndex].quantity == 1) - { - NUM_QUANTITY_ROLLER = 1; - ItemStorage_DoItemWithdraw(taskId); - return; - } - else // _0813A50C - { - ItemStorage_PrintItemPcResponse(ITEMPC_HOW_MANY_TO_WITHDRAW); - } - } - else if(gSaveBlock1.pcItems[trueIndex].quantity == 1) // _0813A518 - { - NUM_QUANTITY_ROLLER = 1; - ItemStorage_DoItemToss(taskId); - return; - } - else - { - ItemStorage_PrintItemPcResponse(ITEMPC_HOW_MANY_TO_TOSS); - } - NUM_QUANTITY_ROLLER = 1; - MenuDrawTextWindow(6, 8, 13, 11); - sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); - TASK.FUNC = ItemStorage_HandleQuantityRolling; -} - -static void ItemStorage_HandleQuantityRolling(u8 taskId) -{ - s16 *data = TASK.data; - u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; - - if(gMain.newAndRepeatedKeys & DPAD_UP) - { - if(NUM_QUANTITY_ROLLER != gSaveBlock1.pcItems[trueIndex].quantity) - NUM_QUANTITY_ROLLER++; - else - NUM_QUANTITY_ROLLER = 1; // you are at the max amount of items you have when you press Up, set your quantity back to 1. - - sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? - } - else if(gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if(NUM_QUANTITY_ROLLER != 1) - NUM_QUANTITY_ROLLER--; - else - NUM_QUANTITY_ROLLER = gSaveBlock1.pcItems[trueIndex].quantity; // you are at 0 when you press down, set your quantity to the amount you have. - - sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? - } - else if(gMain.newAndRepeatedKeys & DPAD_LEFT) // reduce by 10. - { - NUM_QUANTITY_ROLLER -= 10; - - if(NUM_QUANTITY_ROLLER <= 0) - NUM_QUANTITY_ROLLER = 1; // dont underflow or allow 0! - - sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? - } - else if(gMain.newAndRepeatedKeys & DPAD_RIGHT) // add 10. - { - NUM_QUANTITY_ROLLER += 10; - - if(NUM_QUANTITY_ROLLER > gSaveBlock1.pcItems[trueIndex].quantity) - NUM_QUANTITY_ROLLER = gSaveBlock1.pcItems[trueIndex].quantity; // dont overflow! - - sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? - } - else if(gMain.newKeys & A_BUTTON) // confirm quantity. - { - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(6, 6, 0xD, 0xB); - - if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW) - ItemStorage_DoItemWithdraw(taskId); - else - ItemStorage_DoItemToss(taskId); - } - else if(gMain.newKeys & B_BUTTON) // cancel quantity. - { - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(6, 6, 0xD, 0xB); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); // why not use trueIndex? - TASK.FUNC = ItemStorage_ProcessInput; - } -} - -static void ItemStorage_DoItemWithdraw(u8 taskId) -{ - s16 *data = TASK.data; - u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; - - if(AddBagItem(gSaveBlock1.pcItems[trueIndex].itemId, NUM_QUANTITY_ROLLER) == TRUE) // add item works. - { - CopyItemName(gSaveBlock1.pcItems[trueIndex].itemId, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, NUM_QUANTITY_ROLLER, 0, 3); - ItemStorage_PrintItemPcResponse(ITEMPC_WITHDREW_THING); - TASK.FUNC = ItemStorage_HandleRemoveItem; - } - else - { - NUM_QUANTITY_ROLLER = 0; - ItemStorage_PrintItemPcResponse(ITEMPC_NO_MORE_ROOM); - TASK.FUNC = ItemStorage_WaitPressHandleResumeProcessInput; - } -} - -static void ItemStorage_DoItemToss(u8 taskId) -{ - s16 *data = TASK.data; - u8 var = PAGE_INDEX + ITEMS_ABOVE_TOP; - - if(ItemId_GetImportance(gSaveBlock1.pcItems[var].itemId) == FALSE) - { - CopyItemName(gSaveBlock1.pcItems[var].itemId, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, NUM_QUANTITY_ROLLER, 0, 3); - ItemStorage_PrintItemPcResponse(ITEMPC_OKAY_TO_THROW_AWAY); - DisplayYesNoMenu(7, 6, 1); - DoYesNoFuncWithChoice(taskId, (struct YesNoFuncTable *)&ResumeFromTossYesNoFuncList); - } - else - { - NUM_QUANTITY_ROLLER = 0; - ItemStorage_PrintItemPcResponse(ITEMPC_TOO_IMPORTANT); - TASK.FUNC = ItemStorage_HandleRemoveItem; - } -} - -static void ItemStorage_ResumeInputFromYesToss(u8 taskId) -{ - MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB); - ItemStorage_PrintItemPcResponse(ITEMPC_THREW_AWAY_ITEM); - TASK.FUNC = ItemStorage_HandleRemoveItem; -} - -static void ItemStorage_ResumeInputFromNoToss(u8 taskId) -{ - s16 *data = TASK.data; - - MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB); - InitMenu(0, 16, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); - TASK.FUNC = ItemStorage_ProcessInput; -} - -static void ItemStorage_HandleRemoveItem(u8 taskId) -{ - s16 *data = TASK.data; - s16 oldNumItems; - - if(gMain.newKeys & A_BUTTON || gMain.newKeys == B_BUTTON) - { - RemovePCItem(PAGE_INDEX + ITEMS_ABOVE_TOP, NUM_QUANTITY_ROLLER); - oldNumItems = NUM_ITEMS; - NUM_ITEMS = CountUsedPCItemSlots(); - - if(oldNumItems != NUM_ITEMS && oldNumItems < NUM_PAGE_ITEMS + ITEMS_ABOVE_TOP && ITEMS_ABOVE_TOP != 0) - ITEMS_ABOVE_TOP--; - - ItemStorage_SetItemAndMailCount(taskId); - ItemStorage_HandleResumeProcessInput(taskId); - InitMenu(0, 16, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); - } -} - -static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId) -{ - s16 *data = TASK.data; - - if(gMain.newKeys & A_BUTTON || gMain.newKeys == B_BUTTON) - { - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - TASK.FUNC = ItemStorage_ProcessInput; - } -} - -static void ItemStorage_HandleResumeProcessInput(u8 taskId) -{ - MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - ItemStorage_DrawBothListAndDescription(taskId); - TASK.FUNC = ItemStorage_ProcessInput; -} - -static void ItemStorage_DoItemSwap(u8 taskId, bool8 switchModeDisabled) -{ - s16 *data = TASK.data; - u8 trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; - - SWITCH_MODE_ACTIVE = FALSE; - - if((u8)NUM_ITEMS > trueIndex && (u8)SWAP_ITEM_INDEX != trueIndex && switchModeDisabled == FALSE) - { - struct ItemSlot itemSlot = gSaveBlock1.pcItems[SWAP_ITEM_INDEX]; // backup the itemSlot before swapping the two. - - gSaveBlock1.pcItems[SWAP_ITEM_INDEX] = gSaveBlock1.pcItems[trueIndex]; - gSaveBlock1.pcItems[trueIndex] = itemSlot; - return; - } - else if(trueIndex == NUM_ITEMS) - { - ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); - } - else - { - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); - } - - /* - THEORY: This check produces essentially dead code, but it might have been working in an earlier build - in which case it allows a programmer to easily duplicate items without the use of a debug menu. - This gets the page index of the swap index for some reason. It is currently unknown what it would have been used - for, but perhaps it was used to increase the quantity of the item without a debug menu. - With the removal of a lot of the debug menus close to release, a programmer may have added this to - help test things with a low key (such as planting a lot of duplicated berries, which requires this lazy "cheat") - without bringing the relevent debug menus back. The commented out line is intentionally left in below to show - what it may have looked like. - */ - if(SWAP_ITEM_INDEX - ITEMS_ABOVE_TOP <= 0) { // this check is arbitrary and used to generate the correct assembly using the subtraction, which is what matters. the 0 check doesn't. - //gSaveBlock1.pcItems[SWAP_ITEM_INDEX].quantity += 100; - gSaveBlock1.pcItems[SWAP_ITEM_INDEX].quantity += 0; // do not enforce item cap. - } -} - -static void ItemStorage_DrawItemQuantity(u16 arg1, enum StringConvertMode arg2, u8 arg3, u8 arg4, int isSwapSelected) -{ - sub_80A4164(gStringVar1, arg1, arg2, arg4); - - if(isSwapSelected != FALSE) - MenuPrint(gSelectedItemQuantityFormatText, 0x1A, arg3); - else - MenuPrint(gNonSelectedItemQuantityFormatText, 0x1A, arg3); -} - -static void ItemStorage_DrawItemVoidQuantity(u8 var) -{ - MenuPrint(gUnknown_08406330, 0x19, var); -} - -static void ItemStorage_DrawItemName(struct ItemSlot *itemSlot, u8 var, int isSwapSelected) -{ - CopyItemName(itemSlot->itemId, gStringVar1); - - if(isSwapSelected != FALSE) - MenuPrint(gSelectedItemFormattedText, 16, var); - else - MenuPrint(gNonSelectedItemFormattedText, 16, var); -} - -static void ItemStorage_DrawNormalItemEntry(struct ItemSlot *itemSlot, u8 var, int var2) -{ - ItemStorage_DrawItemName(itemSlot, var, var2); - ItemStorage_DrawItemQuantity(itemSlot->quantity, STR_CONV_MODE_RIGHT_ALIGN, var, 3, var2); -} - -static void ItemStorage_DrawKeyItemEntry(struct ItemSlot *itemSlot, u8 var, int var2) -{ - ItemStorage_DrawItemName(itemSlot, var, var2); - ItemStorage_DrawItemVoidQuantity(var); -} - -static void ItemStorage_DrawTMHMEntry(struct ItemSlot *itemSlot, u8 var, int var2) -{ - ItemStorage_DrawItemName(itemSlot, var, var2); - - if(itemSlot->itemId < ITEM_HM01) - ItemStorage_DrawItemQuantity(itemSlot->quantity, STR_CONV_MODE_RIGHT_ALIGN, var, 3, var2); - else - ItemStorage_DrawItemVoidQuantity(var); // HMs do not have a quantity. -} - -static void ItemStorage_DrawItemList(u8 taskId) -{ - s16 *data = TASK.data; - int tempArg; - 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++) - { - yCoord = (i - ITEMS_ABOVE_TOP) * 2; - - if(i != NUM_ITEMS) - { - tempArg = 0; - - if(SWITCH_MODE_ACTIVE != FALSE && i == SWAP_ITEM_INDEX) - tempArg = 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; - } - } - else - { - goto weirdCase; // what??? - } - } - -beforeLabel: - if(i - ITEMS_ABOVE_TOP < 8) - MenuFillWindowRectWithBlankTile(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 + NUM_PAGE_ITEMS <= NUM_ITEMS) - CreateVerticalScrollIndicators(1, 0xB8, 0x98); - else - DestroyVerticalScrollIndicator(1); -} - -static void ItemStorage_PrintItemPcResponse(u16 itemId) -{ - const u8 *string; - - switch(itemId) - { - case ITEMPC_GO_BACK_TO_PREV: - string = gMenuText_GoBackToPrev; - break; - case ITEMPC_HOW_MANY_TO_WITHDRAW: - string = gOtherText_HowManyToWithdraw; - break; - case ITEMPC_WITHDREW_THING: - string = gOtherText_WithdrewThing; - break; - case ITEMPC_HOW_MANY_TO_TOSS: - string = gOtherText_HowManyToToss; - break; - case ITEMPC_THREW_AWAY_ITEM: - string = gOtherText_ThrewAwayItem; - break; - case ITEMPC_NO_MORE_ROOM: - string = gOtherText_NoMoreRoom; - break; - case ITEMPC_TOO_IMPORTANT: - string = gOtherText_TooImportant; - break; - case ITEMPC_OKAY_TO_THROW_AWAY: - string = gOtherText_OkayToThrowAwayPrompt; - break; - case ITEMPC_SWITCH_WHICH_ITEM: - string = gOtherText_SwitchWhichItem; - break; - default: - string = ItemId_GetDescription(itemId); - break; - } - - sub_8072AB0(string, 8, 0x68, 0x68, 0x30, 1); -} - -static void ItemStorage_DrawBothListAndDescription(u8 taskId) -{ - s16 *data = TASK.data; - s16 trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; - - ItemStorage_DrawItemList(taskId); - - if(SWITCH_MODE_ACTIVE == FALSE) - { - if(trueIndex == NUM_ITEMS) - ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); - else - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); - } -} - -static void ItemStorage_GoBackToItemPCMenu(u8 taskId, u8 var) -{ - s16 *data = TASK.data; - - sub_80F944C(); - LoadScrollIndicatorPalette(); - ItemStorage_LoadPalette(); - MenuDrawTextWindow(0xF, 0, 0x1D, 0x13); - MenuDrawTextWindow(0, 0xC, 0xE, 0x13); - MenuDrawTextWindow(0, 0, 0xB, 3); - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[0].itemId); - MenuPrint(gPCText_ItemPCOptionsText[var].text, 1, 1); - ItemStorage_DrawItemList(taskId); - InitMenu(0, 0x10, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); -} - -static void ItemStorage_LoadPalette(void) -{ - u16 arr[3]; - - memcpy(arr, gUnknown_08406334, sizeof(arr)); - LoadPalette(&arr[2], 0xDF, 2); - LoadPalette(&arr[1], 0xD1, 2); - LoadPalette(&arr[0], 0xD8, 2); -} - -static u8 GetMailboxMailCount(void) -{ - u8 i, j; - - for(i = 0, j = 6; j < 16; j++) - if(gSaveBlock1.mail[j].itemId != 0) - i++; - - return i; -} - -static void Mailbox_UpdateMailList(void) -{ - struct MailStruct mailBuffer; - u8 i, j; - - for (i=6; i<15; i++) - { - for (j=i+1; j<16; j++) - { - if (gSaveBlock1.mail[i].itemId == 0) - { - mailBuffer = gSaveBlock1.mail[i]; - gSaveBlock1.mail[i] = gSaveBlock1.mail[j]; - gSaveBlock1.mail[j] = mailBuffer; - } - } - } -} - -// WWHHHHHYYYYYYYY SOMEBODY PLEASE FIX THIS -static void Mailbox_DrawMailList(u8 taskId) // taskId is unused -{ - u16 yCoord = 0; - u16 i = gMailboxInfo.itemsAbove; - register struct MailboxStruct *tempMailbox asm("r1") = &gMailboxInfo; - register struct MailboxStruct *mailbox asm("r6"); - - if(i < i + tempMailbox->pageItems) - { - 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) - { - StringCopy(gStringVar1, (u8 *)gSaveBlock1.mail[i + 6].playerName); - SanitizeNameString(gStringVar1); - MenuPrint(gStringVar1, 0x15, yCoord + 2); - } - else - { - goto weirdCase; // again, what??? - } - } - } - -beforeLabel: - if(i - gMailboxInfo.itemsAbove != 8) - MenuFillWindowRectWithBlankTile(0x15, yCoord + 4, 0x1C, 0x12); - - switch(gMailboxInfo.itemsAbove) - { - default: - CreateVerticalScrollIndicators(0, 0xC8, 8); - break; -weirdCase: - MenuPrint(gOtherText_CancelNoTerminator, 0x15, yCoord + 2); - goto beforeLabel; - case 0: - DestroyVerticalScrollIndicator(0); - break; - } - - if(gMailboxInfo.itemsAbove + gMailboxInfo.pageItems <= gMailboxInfo.count) - CreateVerticalScrollIndicators(1, 0xC8, 0x98); - else - DestroyVerticalScrollIndicator(1); -} - -static void Mailbox_DrawMailboxMenu(u8 taskId) -{ - sub_80F944C(); - LoadScrollIndicatorPalette(); - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - MenuDrawTextWindow(0, 0, 0x8, 0x3); - MenuPrint(gPCText_Mailbox, 1, 1); - MenuDrawTextWindow(0x14, 0, 0x1D, 0x13); - Mailbox_DrawMailList(taskId); - InitMenu(0, 0x15, 2, gMailboxInfo.pageItems, gMailboxInfo.cursorPos, 8); -} - -// Mailbox_ProcessInput -static void Mailbox_ProcessInput(u8 taskId) -{ - if(!gPaletteFade.active) - { - if(gMain.newAndRepeatedKeys & DPAD_UP) - { - if(gMailboxInfo.cursorPos != 0) - { - PlaySE(SE_SELECT); - gMailboxInfo.cursorPos = MoveMenuCursor(-1); - } - else if(gMailboxInfo.itemsAbove != 0) - { - PlaySE(SE_SELECT); - gMailboxInfo.itemsAbove--; - Mailbox_DrawMailList(taskId); - } - } - else if(gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if(gMailboxInfo.cursorPos != gMailboxInfo.pageItems - 1) - { - PlaySE(SE_SELECT); - gMailboxInfo.cursorPos = MoveMenuCursor(1); - } - else if(gMailboxInfo.itemsAbove + gMailboxInfo.cursorPos != gMailboxInfo.count) - { - PlaySE(SE_SELECT); - gMailboxInfo.itemsAbove++; - Mailbox_DrawMailList(taskId); - } - } - else if(gMain.newKeys & A_BUTTON) - { - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - - if(gMailboxInfo.itemsAbove + gMailboxInfo.cursorPos == gMailboxInfo.count) - { - Mailbox_TurnOff(taskId); - } - else - { - Mailbox_CloseScrollIndicators(); - TASK.FUNC = Mailbox_PrintWhatToDoWithPlayerMailText; - } - } - else if(gMain.newKeys & B_BUTTON) - { - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - Mailbox_TurnOff(taskId); - } - } -} - -static void Mailbox_CloseScrollIndicators(void) -{ - BuyMenuFreeMemory(); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); -} - -static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId) -{ - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - StringCopy(gStringVar1, gSaveBlock1.mail[gMailboxInfo.itemsAbove + 6 + gMailboxInfo.cursorPos].playerName); - SanitizeNameString(gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_WhatWillYouDoMail); - DisplayItemMessageOnField(taskId, gStringVar4, Mailbox_PrintMailOptions, 0); -} - -static void Mailbox_ReturnToPlayerPC(u8 taskId) -{ - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - ReshowPlayerPC(taskId); -} - -static void Mailbox_TurnOff(u8 taskId) -{ - Mailbox_CloseScrollIndicators(); - TASK.FUNC = Mailbox_ReturnToPlayerPC; -} - -static void Mailbox_PrintMailOptions(u8 taskId) // Mailbox_PrintMailOptions -{ - MenuDrawTextWindow(0, 0, 0xC, 0x9); - PrintMenuItems(1, 1, 4, (struct MenuAction *)gMailboxMailOptions); - InitMenu(0, 1, 1, 4, 0, 0xB); - TASK.FUNC = Mailbox_MailOptionsProcessInput; -} - -static void Mailbox_MailOptionsProcessInput(u8 taskId) -{ - if(gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - MoveMenuCursor(-1); - } - else if(gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - MoveMenuCursor(1); - } - else if(gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gMailboxMailOptions[GetMenuCursorPos()].func(taskId); - } - else if(gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - Mailbox_Cancel(taskId); - } -} - -static void Mailbox_DoMailRead(u8 taskId) -{ - fade_screen(1, 0); - TASK.FUNC = Mailbox_FadeAndReadMail; -} - -static void Mailbox_FadeAndReadMail(u8 taskId) -{ - if(!gPaletteFade.active) - { - HandleReadMail(&gSaveBlock1.mail[gMailboxInfo.itemsAbove + 6 + gMailboxInfo.cursorPos], Mailbox_ReturnToFieldFromReadMail, 1); - DestroyTask(taskId); - } -} - -static void Mailbox_HandleReturnToProcessInput(u8 taskId) // Mailbox_HandleReturnToProcessInput -{ - if(sub_807D770() == TRUE) // is black fade finished? why not gPaletteFade.active? - TASK.FUNC = Mailbox_ProcessInput; -} - -static void Mailbox_DoRedrawMailboxMenuAfterReturn(void) -{ - Mailbox_DrawMailboxMenu(CreateTask(Mailbox_HandleReturnToProcessInput, 0)); - pal_fill_black(); -} - -static void Mailbox_ReturnToFieldFromReadMail(void) -{ - gFieldCallback = Mailbox_DoRedrawMailboxMenuAfterReturn; - SetMainCallback2(c2_exit_to_overworld_2_switch); -} - -static void Mailbox_MoveToBag(u8 taskId) -{ - HandleDestroyMenuCursors(); - StringCopy(gStringVar1, gOtherText_MoveToBag); - MenuPrint(gHighlightedMoveToBagFormatText, 1, 3); // gHighlightedMoveToBagFormatText - DisplayItemMessageOnField(taskId, gOtherText_MessageWillBeLost, Mailbox_DrawYesNoBeforeMove, 0); -} - -static void Mailbox_DrawYesNoBeforeMove(u8 taskId) -{ - DisplayYesNoMenu(0x14, 0x8, 0x1); - DoYesNoFuncWithChoice(taskId, (struct YesNoFuncTable *)&ResumeFromWithdrawYesNoFuncList); -} - -static void Mailbox_DoMailMoveToBag(u8 taskId) -{ - struct MailStruct *mail = &gSaveBlock1.mail[gMailboxInfo.itemsAbove + 6 + gMailboxInfo.cursorPos]; - - MenuZeroFillWindowRect(0x14, 8, 0x1A, 0xD); - - if(AddBagItem(mail->itemId, 1) == FALSE) - { - DisplayItemMessageOnField(taskId, gOtherText_BagIsFull, Mailbox_DrawMailMenuAndDoProcessInput, 0); - } - else - { - DisplayItemMessageOnField(taskId, gOtherText_MailWasReturned, Mailbox_DrawMailMenuAndDoProcessInput, 0); - ClearMailStruct(mail); - Mailbox_UpdateMailList(); - - gMailboxInfo.count--; - - if(gMailboxInfo.count < gMailboxInfo.pageItems + gMailboxInfo.itemsAbove && gMailboxInfo.itemsAbove != 0) - gMailboxInfo.itemsAbove--; - - ItemStorage_SetItemAndMailCount(taskId); - } -} - -static void Mailbox_ReturnToInputAfterNo(u8 taskId) // Mailbox_ReturnToInputAfterNo -{ - MenuZeroFillWindowRect(0x14, 0x8, 0x1A, 0xD); - Mailbox_DrawMailMenuAndDoProcessInput(taskId); -} - -static void Mailbox_Give(u8 taskId) -{ - if(CalculatePlayerPartyCount() == 0) - Mailbox_NoPokemonForMail(taskId); // cannot be reached normally - else - { - fade_screen(1, 0); - TASK.FUNC = Mailbox_DoGiveMailPokeMenu; - } -} - -static void Mailbox_DoGiveMailPokeMenu(u8 taskId) // Mailbox_DoGiveMailPokeMenu -{ - if(!gPaletteFade.active) - { - SetMainCallback2(sub_808B020); - gUnknown_02038561 = 3; - DestroyTask(taskId); - } -} - -static void Mailbox_UpdateMailListAfterDeposit(void) -{ - u8 taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0); - u8 oldCount = gMailboxInfo.count; - - gMailboxInfo.count = GetMailboxMailCount(); - Mailbox_UpdateMailList(); - - if(oldCount != gMailboxInfo.count && gMailboxInfo.count < gMailboxInfo.pageItems + gMailboxInfo.itemsAbove && gMailboxInfo.itemsAbove != 0) // did the count update? - gMailboxInfo.itemsAbove--; - - ItemStorage_SetItemAndMailCount(taskId); - Mailbox_DrawMailboxMenu(taskId); - pal_fill_black(); -} - -void Mailbox_ReturnToMailListAfterDeposit(void) -{ - gFieldCallback = Mailbox_UpdateMailListAfterDeposit; - SetMainCallback2(c2_exit_to_overworld_2_switch); -} - -// you always have at least 1 POKeMON and you cannot receive mail before you leave Littleroot: therefore this function cannot be reached normally. -static void Mailbox_NoPokemonForMail(u8 taskId) -{ - DisplayItemMessageOnField(taskId, gOtherText_NoPokemon, Mailbox_DrawMailMenuAndDoProcessInput, 0); -} - -static void Mailbox_Cancel(u8 taskId) -{ - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 0xC, 0x9); - Mailbox_DrawMailMenuAndDoProcessInput(taskId); -} - -static void Mailbox_DrawMailMenuAndDoProcessInput(u8 taskId) -{ - Mailbox_DrawMailboxMenu(taskId); - TASK.FUNC = Mailbox_ProcessInput; -} diff --git a/src/pokeball.c b/src/pokeball.c deleted file mode 100644 index ee3b95678..000000000 --- a/src/pokeball.c +++ /dev/null @@ -1,1193 +0,0 @@ -#include "global.h" -#include "gba/m4a_internal.h" -#include "battle.h" -#include "decompress.h" -#include "graphics.h" -#include "m4a.h" -#include "main.h" -#include "pokeball.h" -#include "pokemon.h" -#include "rom_8077ABC.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" -#include "util.h" - -extern struct MusicPlayerInfo gMPlay_BGM; -extern u16 gBattleTypeFlags; -extern u8 gBankTarget; -extern u8 gActiveBank; -extern u16 gBattlePartyID[]; -extern u8 gObjectBankIDs[]; -extern u8 gDoingBattleAnim; -extern u8 gHealthboxIDs[]; - -#define GFX_TAG_POKEBALL 55000 -#define GFX_TAG_GREATBALL 55001 -#define GFX_TAG_SAFARIBALL 55002 -#define GFX_TAG_ULTRABALL 55003 -#define GFX_TAG_MASTERBALL 55004 -#define GFX_TAG_NETBALL 55005 -#define GFX_TAG_DIVEBALL 55006 -#define GFX_TAG_NESTBALL 55007 -#define GFX_TAG_REPEATBALL 55008 -#define GFX_TAG_TIMERBALL 55009 -#define GFX_TAG_LUXURYBALL 55010 -#define GFX_TAG_PREMIERBALL 55011 - -static const struct CompressedSpriteSheet sBallSpriteSheets[] = -{ - {gInterfaceGfx_PokeBall, 384, GFX_TAG_POKEBALL}, - {gInterfaceGfx_GreatBall, 384, GFX_TAG_GREATBALL}, - {gInterfaceGfx_SafariBall, 384, GFX_TAG_SAFARIBALL}, - {gInterfaceGfx_UltraBall, 384, GFX_TAG_ULTRABALL}, - {gInterfaceGfx_MasterBall, 384, GFX_TAG_MASTERBALL}, - {gInterfaceGfx_NetBall, 384, GFX_TAG_NETBALL}, - {gInterfaceGfx_DiveBall, 384, GFX_TAG_DIVEBALL}, - {gInterfaceGfx_NestBall, 384, GFX_TAG_NESTBALL}, - {gInterfaceGfx_RepeatBall, 384, GFX_TAG_REPEATBALL}, - {gInterfaceGfx_TimerBall, 384, GFX_TAG_TIMERBALL}, - {gInterfaceGfx_LuxuryBall, 384, GFX_TAG_LUXURYBALL}, - {gInterfaceGfx_PremierBall, 384, GFX_TAG_PREMIERBALL}, -}; - -static const struct CompressedSpritePalette sBallSpritePalettes[] = -{ - {gInterfacePal_PokeBall, GFX_TAG_POKEBALL}, - {gInterfacePal_GreatBall, GFX_TAG_GREATBALL}, - {gInterfacePal_SafariBall, GFX_TAG_SAFARIBALL}, - {gInterfacePal_UltraBall, GFX_TAG_ULTRABALL}, - {gInterfacePal_MasterBall, GFX_TAG_MASTERBALL}, - {gInterfacePal_NetBall, GFX_TAG_NETBALL}, - {gInterfacePal_DiveBall, GFX_TAG_DIVEBALL}, - {gInterfacePal_NestBall, GFX_TAG_NESTBALL}, - {gInterfacePal_RepeatBall, GFX_TAG_REPEATBALL}, - {gInterfacePal_TimerBall, GFX_TAG_TIMERBALL}, - {gInterfacePal_LuxuryBall, GFX_TAG_LUXURYBALL}, - {gInterfacePal_PremierBall, GFX_TAG_PREMIERBALL}, -}; - -static const struct OamData sBallOamData = -{ - .y = 0, - .affineMode = 3, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sBallAnimSeq3[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sBallAnimSeq5[] = -{ - ANIMCMD_FRAME(4, 1), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sBallAnimSeq4[] = -{ - ANIMCMD_FRAME(8, 5), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sBallAnimSeq6[] = -{ - ANIMCMD_FRAME(12, 1), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sBallAnimSeq0[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sBallAnimSeq1[] = -{ - ANIMCMD_FRAME(4, 5), - ANIMCMD_FRAME(8, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sBallAnimSeq2[] = -{ - ANIMCMD_FRAME(4, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd *const sBallAnimSequences[] = -{ - sBallAnimSeq0, - sBallAnimSeq1, - sBallAnimSeq2, - - // unused? - sBallAnimSeq3, - sBallAnimSeq4, - sBallAnimSeq5, - sBallAnimSeq6, -}; - -static const union AffineAnimCmd sBallAffineAnimSeq0[] = -{ - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sBallAffineAnimSeq1[] = -{ - AFFINEANIMCMD_FRAME(0, 0, -3, 1), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sBallAffineAnimSeq2[] = -{ - AFFINEANIMCMD_FRAME(0, 0, 3, 1), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sBallAffineAnimSeq3[] = -{ - AFFINEANIMCMD_FRAME(256, 256, 0, 0), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sBallAffineAnimSeq4[] = -{ - AFFINEANIMCMD_FRAME(0, 0, 25, 1), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd *const sBallAffineAnimSequences[] = -{ - sBallAffineAnimSeq0, - sBallAffineAnimSeq1, - sBallAffineAnimSeq2, - sBallAffineAnimSeq3, - sBallAffineAnimSeq4, -}; - -static void objc_0804ABD4(struct Sprite *sprite); -const struct SpriteTemplate gBallSpriteTemplates[] = -{ - { - .tileTag = GFX_TAG_POKEBALL, - .paletteTag = GFX_TAG_POKEBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_GREATBALL, - .paletteTag = GFX_TAG_GREATBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_SAFARIBALL, - .paletteTag = GFX_TAG_SAFARIBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_ULTRABALL, - .paletteTag = GFX_TAG_ULTRABALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_MASTERBALL, - .paletteTag = GFX_TAG_MASTERBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_NETBALL, - .paletteTag = GFX_TAG_NETBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_DIVEBALL, - .paletteTag = GFX_TAG_DIVEBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_NESTBALL, - .paletteTag = GFX_TAG_NESTBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_REPEATBALL, - .paletteTag = GFX_TAG_REPEATBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_TIMERBALL, - .paletteTag = GFX_TAG_TIMERBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_LUXURYBALL, - .paletteTag = GFX_TAG_LUXURYBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, - { - .tileTag = GFX_TAG_PREMIERBALL, - .paletteTag = GFX_TAG_PREMIERBALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sBallAffineAnimSequences, - .callback = objc_0804ABD4, - }, -}; - -extern u32 ball_number_to_ball_processing_index(u16); // not sure of return type -extern void sub_80786EC(); -extern bool8 sub_8078718(struct Sprite *); -extern u8 sub_814086C(u8, u8, int, int, u8); -extern u8 sub_8141314(u8, u8, int, u8); - -static void sub_8046464(u8); -static void sub_80466E8(struct Sprite *); -static void sub_80466F4(struct Sprite *); -static void sub_8046760(struct Sprite *); -static void sub_80467F8(struct Sprite *); -static void sub_804684C(struct Sprite *); -static void sub_8046944(struct Sprite *); -static void sub_8046984(struct Sprite *); -static void sub_8046C78(struct Sprite *); -static void sub_8046E7C(struct Sprite *); -static void sub_8046E9C(struct Sprite *); -static void sub_8046FBC(struct Sprite *); -static void sub_8047074(struct Sprite *); -static void sub_80470C4(struct Sprite *); -static void sub_8047230(struct Sprite *); -static void sub_8047254(struct Sprite *); -static void sub_80473D0(struct Sprite *); -static void sub_804748C(struct Sprite *); -static void sub_8047638(struct Sprite *); -static void sub_80476E0(struct Sprite *); -static void sub_8047754(struct Sprite *); -static void sub_804780C(struct Sprite *); -static void sub_8047830(struct Sprite *); -static void oamc_804BEB4(struct Sprite *); -static u16 sub_8047978(u8); - -u8 sub_8046400(u16 a, u8 b) -{ - u8 taskId; - - gDoingBattleAnim = 1; - ewram17810[gActiveBank].unk0_3 = 1; - taskId = CreateTask(sub_8046464, 5); - gTasks[taskId].data[1] = a; - gTasks[taskId].data[2] = b; - gTasks[taskId].data[3] = gActiveBank; - return 0; -} - -static void sub_8046464(u8 taskId) -{ - bool8 sp0 = FALSE; - u16 r8; - u8 r5; - u16 ball; - u8 r4; - u8 spriteId; - - if (gTasks[taskId].data[0] == 0) - { - gTasks[taskId].data[0]++; - return; - } - r8 = gTasks[taskId].data[2]; - r5 = gTasks[taskId].data[3]; - if (GetBankSide(r5) != 0) - ball = GetMonData(&gEnemyParty[gBattlePartyID[r5]], MON_DATA_POKEBALL); - else - ball = GetMonData(&gPlayerParty[gBattlePartyID[r5]], MON_DATA_POKEBALL); - r4 = ball_number_to_ball_processing_index(ball); - sub_80478DC(r4); - spriteId = CreateSprite(&gBallSpriteTemplates[r4], 32, 80, 0x1D); - gSprites[spriteId].data0 = 0x80; - gSprites[spriteId].data1 = 0; - gSprites[spriteId].data7 = r8; - switch (r8) - { - case 0xFF: - gBankTarget = r5; - gSprites[spriteId].pos1.x = 24; - gSprites[spriteId].pos1.y = 68; - gSprites[spriteId].callback = sub_8047074; - break; - case 0xFE: - gSprites[spriteId].pos1.x = sub_8077ABC(r5, 0); - gSprites[spriteId].pos1.y = sub_8077ABC(r5, 1) + 24; - gBankTarget = r5; - gSprites[spriteId].data0 = 0; - gSprites[spriteId].callback = sub_8047254; - break; - default: - gBankTarget = GetBankByPlayerAI(1); - sp0 = TRUE; - break; - } - gSprites[spriteId].data6 = gBankTarget; - if (!sp0) - { - DestroyTask(taskId); - return; - } - gSprites[spriteId].data0 = 0x22; - gSprites[spriteId].data2 = sub_8077ABC(gBankTarget, 0); - gSprites[spriteId].data4 = sub_8077ABC(gBankTarget, 1) - 16; - gSprites[spriteId].data5 = -40; - sub_80786EC(&gSprites[spriteId]); - gSprites[spriteId].oam.affineParam = taskId; - gTasks[taskId].data[4] = gBankTarget; - gTasks[taskId].func = TaskDummy; - PlaySE(SE_NAGERU); -} - -static void objc_0804ABD4(struct Sprite *sprite) -{ - if (sub_8078718(sprite)) - { - u8 taskId = sprite->oam.affineParam; - u8 r5 = gTasks[taskId].data[4]; - u8 r8 = gTasks[taskId].data[2]; - u32 r4; // not sure of this type - - StartSpriteAnim(sprite, 1); - sprite->affineAnimPaused = TRUE; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data5 = 0; - r4 = ball_number_to_ball_processing_index(sub_8047978(r5)); - sub_814086C(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, r4); - sprite->data0 = sub_8141314(0, r5, 14, r4); - sprite->data6 = r5; - sprite->data7 = r8; - DestroyTask(taskId); - sprite->callback = sub_80466E8; - } -} - -static void sub_80466E8(struct Sprite *sprite) -{ - sprite->callback = sub_80466F4; -} - -static void sub_80466F4(struct Sprite *sprite) -{ - sprite->data5++; - if (sprite->data5 == 10) - { - sprite->data5 = 0; - sprite->callback = sub_8046760; - StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data6]], 2); - AnimateSprite(&gSprites[gObjectBankIDs[sprite->data6]]); - gSprites[gObjectBankIDs[sprite->data6]].data1 = 0; - } -} - -static void sub_8046760(struct Sprite *sprite) -{ - sprite->data5++; - if (sprite->data5 == 11) - PlaySE(SE_SUIKOMU); - if (gSprites[gObjectBankIDs[sprite->data6]].affineAnimEnded) - { - StartSpriteAnim(sprite, 2); - gSprites[gObjectBankIDs[sprite->data6]].invisible = TRUE; - sprite->data5 = 0; - sprite->callback = sub_80467F8; - } - else - { - gSprites[gObjectBankIDs[sprite->data6]].data1 += 0x60; - gSprites[gObjectBankIDs[sprite->data6]].pos2.y = -gSprites[gObjectBankIDs[sprite->data6]].data1 >> 8; - } -} - -static void sub_80467F8(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - sprite->data5++; - if (sprite->data5 == 1) - { - sprite->data3 = 0; - sprite->data4 = 32; - sprite->data5 = 0; - sprite->pos1.y += Cos(0, 32); - sprite->pos2.y = -Cos(0, sprite->data4); - sprite->callback = sub_804684C; - } - } -} - -static void sub_804684C(struct Sprite *sprite) -{ - bool8 r5 = FALSE; - - switch (sprite->data3 & 0xFF) - { - case 0: - sprite->pos2.y = -Cos(sprite->data5, sprite->data4); - sprite->data5 += 4 + (sprite->data3 >> 8); - if (sprite->data5 >= 64) - { - sprite->data4 -= 10; - sprite->data3 += 0x101; - if (sprite->data3 >> 8 == 4) - r5 = TRUE; - switch (sprite->data3 >> 8) - { - case 1: - PlaySE(SE_KON); - break; - case 2: - PlaySE(SE_KON2); - break; - case 3: - PlaySE(SE_KON3); - break; - default: - PlaySE(SE_KON4); - break; - } - } - break; - case 1: - sprite->pos2.y = -Cos(sprite->data5, sprite->data4); - sprite->data5 -= 4 + (sprite->data3 >> 8); - if (sprite->data5 <= 0) - { - sprite->data5 = 0; - sprite->data3 &= 0xFF00; - } - break; - } - if (r5) - { - sprite->data3 = 0; - sprite->pos1.y += Cos(64, 32); - sprite->pos2.y = 0; - if (sprite->data7 == 0) - { - sprite->callback = sub_8046C78; - } - else - { - sprite->callback = sub_8046944; - sprite->data4 = 1; - sprite->data5 = 0; - } - } -} - -static void sub_8046944(struct Sprite *sprite) -{ - sprite->data3++; - if (sprite->data3 == 31) - { - sprite->data3 = 0; - sprite->affineAnimPaused = TRUE; - StartSpriteAffineAnim(sprite, 1); - sprite->callback = sub_8046984; - PlaySE(SE_BOWA); - } -} - -static void sub_8046984(struct Sprite *sprite) -{ - switch (sprite->data3 & 0xFF) - { - case 0: - case 2: - sprite->pos2.x += sprite->data4; - sprite->data5 += sprite->data4; - sprite->affineAnimPaused = FALSE; - if (sprite->data5 > 3 || sprite->data5 < -3) - { - sprite->data3++; - sprite->data5 = 0; - } - break; - case 1: - sprite->data5++; - if (sprite->data5 == 1) - { - sprite->data5 = 0; - sprite->data4 = -sprite->data4; - sprite->data3++; - sprite->affineAnimPaused = FALSE; - if (sprite->data4 < 0) - ChangeSpriteAffineAnim(sprite, 2); - else - ChangeSpriteAffineAnim(sprite, 1); - } - else - { - sprite->affineAnimPaused = TRUE; - } - break; - case 3: - sprite->data3 += 0x100; - if (sprite->data3 >> 8 == sprite->data7) - { - sprite->callback = sub_8046C78; - } - else - { - if (sprite->data7 == 4 && sprite->data3 >> 8 == 3) - { - sprite->callback = sub_8046E7C; - sprite->affineAnimPaused = TRUE; - } - else - { - sprite->data3++; - sprite->affineAnimPaused = TRUE; - } - } - break; - case 4: - default: - sprite->data5++; - if (sprite->data5 == 31) - { - sprite->data5 = 0; - sprite->data3 &= 0xFF00; - StartSpriteAffineAnim(sprite, 3); - if (sprite->data4 < 0) - StartSpriteAffineAnim(sprite, 2); - else - StartSpriteAffineAnim(sprite, 1); - PlaySE(SE_BOWA); - } - break; - } -} - -static void sub_8046AD0(u8 taskId) -{ - u8 r6 = gTasks[taskId].data[2]; - u8 r3 = gTasks[taskId].data[1]; - u16 species = gTasks[taskId].data[0]; - - switch (gTasks[taskId].data[15]) - { - case 0: - default: - if (gTasks[taskId].data[8] < 3) - gTasks[taskId].data[8]++; - else - gTasks[taskId].data[15] = r6 + 1; - break; - case 1: - PlayCry1(species, r3); - DestroyTask(taskId); - break; - case 2: - StopCryAndClearCrySongs(); - gTasks[taskId].data[10] = 3; - gTasks[taskId].data[15] = 20; - break; - case 20: - if (gTasks[taskId].data[10] != 0) - { - gTasks[taskId].data[10]--; - break; - } - PlayCry4(species, r3, 1); - DestroyTask(taskId); - break; - case 3: - gTasks[taskId].data[10] = 6; - gTasks[taskId].data[15] = 30; - break; - case 30: - if (gTasks[taskId].data[10] != 0) - { - gTasks[taskId].data[10]--; - break; - } - gTasks[taskId].data[15]++; - // fall through - case 31: - if (!IsCryPlayingOrClearCrySongs()) - { - StopCryAndClearCrySongs(); - gTasks[taskId].data[10] = 3; - gTasks[taskId].data[15]++; - } - break; - case 32: - if (gTasks[taskId].data[10] != 0) - { - gTasks[taskId].data[10]--; - break; - } - PlayCry4(species, r3, 0); - DestroyTask(taskId); - break; - } -} - -static void sub_8046C78(struct Sprite *sprite) -{ - u8 r5 = sprite->data6; - u32 r4; // not sure of this type - - StartSpriteAnim(sprite, 1); - r4 = ball_number_to_ball_processing_index(sub_8047978(r5)); - sub_814086C(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, r4); - sprite->data0 = sub_8141314(1, sprite->data6, 14, r4); - sprite->callback = sub_8046E9C; - if (gMain.inBattle) - { - struct Pokemon *pkmn; - u16 species; - s8 r8; - u16 r4_2; - u8 taskId; - - if (GetBankSide(r5) != 0) - { - pkmn = &gEnemyParty[gBattlePartyID[r5]]; - r8 = 25; - } - else - { - pkmn = &gPlayerParty[gBattlePartyID[r5]]; - r8 = -25; - } - species = GetMonData(pkmn, MON_DATA_SPECIES); - if ((r5 == GetBankByPlayerAI(0) || r5 == GetBankByPlayerAI(1)) - && IsDoubleBattle() && ewram17840.unk9_0) - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (IsBGMPlaying()) - m4aMPlayStop(&gMPlay_BGM); - } - else - { - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128); - } - } - if (!IsDoubleBattle() || !ewram17840.unk9_0) - r4_2 = 0; - else if (r5 == GetBankByPlayerAI(0) || r5 == GetBankByPlayerAI(1)) - r4_2 = 1; - else - r4_2 = 2; - taskId = CreateTask(sub_8046AD0, 3); - gTasks[taskId].data[0] = species; - gTasks[taskId].data[1] = r8; - gTasks[taskId].data[2] = r4_2; - gTasks[taskId].data[15] = 0; - } - StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data6]], 1); - AnimateSprite(&gSprites[gObjectBankIDs[sprite->data6]]); - gSprites[gObjectBankIDs[sprite->data6]].data1 = 0x1000; -} - -static void sub_8046E7C(struct Sprite *sprite) -{ - sprite->animPaused = TRUE; - sprite->callback = sub_8046FBC; - sprite->data3 = 0; - sprite->data4 = 0; - sprite->data5 = 0; -} - -static void sub_8046E9C(struct Sprite *sprite) -{ - bool8 r7 = FALSE; - u8 r4 = sprite->data6; - - gSprites[gObjectBankIDs[r4]].invisible = FALSE; - if (sprite->animEnded) - sprite->invisible = TRUE; - if (gSprites[gObjectBankIDs[r4]].affineAnimEnded) - { - StartSpriteAffineAnim(&gSprites[gObjectBankIDs[r4]], 0); - r7 = TRUE; - } - else - { - gSprites[gObjectBankIDs[r4]].data1 -= 288; - gSprites[gObjectBankIDs[r4]].pos2.y = gSprites[gObjectBankIDs[r4]].data1 >> 8; - } - if (sprite->animEnded && r7) - { - s32 i; - u32 r3; - - gSprites[gObjectBankIDs[r4]].pos2.y = 0; - gDoingBattleAnim = 0; - ewram17810[r4].unk0_3 = 0; - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - for (r3 = 0, i = 0; i < 4; i++) - { - if (ewram17810[i].unk0_3 == 0) - r3++; - } - if (r3 == 4) - { - for (i = 0; i < 12; i++) - sub_804794C(i); - } - } -} - -static void sub_8046FBC(struct Sprite *sprite) -{ - u8 r7 = sprite->data6; - - sprite->data4++; - if (sprite->data4 == 40) - { - return; - } - else if (sprite->data4 == 95) - { - gDoingBattleAnim = 0; - m4aMPlayAllStop(); - PlaySE(BGM_FANFA5); - } - else if (sprite->data4 == 315) - { - FreeOamMatrix(gSprites[gObjectBankIDs[sprite->data6]].oam.matrixNum); - DestroySprite(&gSprites[gObjectBankIDs[sprite->data6]]); - DestroySpriteAndFreeResources(sprite); - if (gMain.inBattle) - ewram17810[r7].unk0_3 = 0; - } -} - -static void sub_8047074(struct Sprite *sprite) -{ - sprite->data0 = 25; - sprite->data2 = sub_8077ABC(sprite->data6, 2); - sprite->data4 = sub_8077ABC(sprite->data6, 3) + 24; - sprite->data5 = -30; - sprite->oam.affineParam = sprite->data6; - sub_80786EC(sprite); - sprite->callback = sub_80470C4; -} - -#define HIBYTE(x) (((x) >> 8) & 0xFF) - -static void sub_80470C4(struct Sprite *sprite) -{ - u32 r6; - u32 r7; - - if (HIBYTE(sprite->data7) >= 35 && HIBYTE(sprite->data7) < 80) - { - s16 r4; - - if ((sprite->oam.affineParam & 0xFF00) == 0) - { - r6 = sprite->data1 & 1; - r7 = sprite->data2 & 1; - sprite->data1 = ((sprite->data1 / 3) & ~1) | r6; - sprite->data2 = ((sprite->data2 / 3) & ~1) | r7; - StartSpriteAffineAnim(sprite, 4); - } - r4 = sprite->data0; - sub_8078B5C(sprite); - sprite->data7 += sprite->data6 / 3; - sprite->pos2.y += Sin(HIBYTE(sprite->data7), sprite->data5); - sprite->oam.affineParam += 0x100; - if ((sprite->oam.affineParam >> 8) % 3 != 0) - sprite->data0 = r4; - else - sprite->data0 = r4 - 1; - if (HIBYTE(sprite->data7) >= 80) - { - r6 = sprite->data1 & 1; - r7 = sprite->data2 & 1; - sprite->data1 = ((sprite->data1 * 3) & ~1) | r6; - sprite->data2 = ((sprite->data2 * 3) & ~1) | r7; - } - } - else - { - if (sub_8078718(sprite)) - { - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.y = 0; - sprite->pos2.x = 0; - sprite->data6 = sprite->oam.affineParam & 0xFF; - sprite->data0 = 0; - if (IsDoubleBattle() && ewram17840.unk9_0 - && sprite->data6 == GetBankByPlayerAI(2)) - sprite->callback = sub_8047230; - else - sprite->callback = sub_8046C78; - StartSpriteAffineAnim(sprite, 0); - } - } -} - -static void sub_8047230(struct Sprite *sprite) -{ - if (sprite->data0++ > 24) - { - sprite->data0 = 0; - sprite->callback = sub_8046C78; - } -} - -static void sub_8047254(struct Sprite *sprite) -{ - sprite->data0++; - if (sprite->data0 > 15) - { - sprite->data0 = 0; - if (IsDoubleBattle() && ewram17840.unk9_0 - && sprite->data6 == GetBankByPlayerAI(3)) - sprite->callback = sub_8047230; - else - sprite->callback = sub_8046C78; - } -} - -static u8 sub_80472B0(u8 a, u8 b, u8 c, u8 d) -{ - return sub_814086C(a, b, c, d, 0); -} - -static u8 sub_80472D8(u8 a, u8 b, u32 c) -{ - return sub_8141314(a, b, c, 0); -} - -void CreatePokeballSprite(u8 a, u8 b, u8 x, u8 y, u8 e, u8 f, u8 g, u32 h) -{ - u8 spriteId; - - LoadCompressedObjectPic(&sBallSpriteSheets[0]); - LoadCompressedObjectPalette(&sBallSpritePalettes[0]); - spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, f); - gSprites[spriteId].data0 = a; - gSprites[spriteId].data5 = gSprites[a].pos1.x; - gSprites[spriteId].data6 = gSprites[a].pos1.y; - gSprites[a].pos1.x = x; - gSprites[a].pos1.y = y; - gSprites[spriteId].data1 = g; - gSprites[spriteId].data2 = b; - gSprites[spriteId].data3 = h; - gSprites[spriteId].data4 = h >> 16; - gSprites[spriteId].oam.priority = e; - gSprites[spriteId].callback = sub_80473D0; - gSprites[a].invisible = TRUE; -} - -static void sub_80473D0(struct Sprite *sprite) -{ - if (sprite->data1 == 0) - { - u8 r5; - u8 r7 = sprite->data0; - u8 r8 = sprite->data2; - u32 r4 = (u16)sprite->data3 | ((u16)sprite->data4 << 16); - - if (sprite->subpriority != 0) - r5 = sprite->subpriority - 1; - else - r5 = 0; - StartSpriteAnim(sprite, 1); - sub_80472B0(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r5); - sprite->data1 = sub_80472D8(1, r8, r4); - sprite->callback = sub_804748C; - gSprites[r7].invisible = FALSE; - StartSpriteAffineAnim(&gSprites[r7], 1); - AnimateSprite(&gSprites[r7]); - gSprites[r7].data1 = 0x1000; - sprite->data7 = 0; - } - else - { - sprite->data1--; - } -} - -static void sub_804748C(struct Sprite *sprite) -{ - bool8 r12 = FALSE; - bool8 r6 = FALSE; - u8 r3 = sprite->data0; - u16 var1; - u16 var2; - - if (sprite->animEnded) - sprite->invisible = TRUE; - if (gSprites[r3].affineAnimEnded) - { - StartSpriteAffineAnim(&gSprites[r3], 0); - r12 = TRUE; - } - var1 = (sprite->data5 - sprite->pos1.x) * sprite->data7 / 128 + sprite->pos1.x; - var2 = (sprite->data6 - sprite->pos1.y) * sprite->data7 / 128 + sprite->pos1.y; - gSprites[r3].pos1.x = var1; - gSprites[r3].pos1.y = var2; - if (sprite->data7 < 128) - { - s16 sine = -(gSineTable[(u8)sprite->data7] / 8); - - sprite->data7 += 4; - gSprites[r3].pos2.x = sine; - gSprites[r3].pos2.y = sine; - } - else - { - gSprites[r3].pos1.x = sprite->data5; - gSprites[r3].pos1.y = sprite->data6; - gSprites[r3].pos2.x = 0; - gSprites[r3].pos2.y = 0; - r6 = TRUE; - } - if (sprite->animEnded && r12 && r6) - DestroySpriteAndFreeResources(sprite); -} - -u8 sub_8047580(u8 a, u8 b, u8 x, u8 y, u8 e, u8 f, u8 g, u32 h) -{ - u8 spriteId; - - LoadCompressedObjectPic(&sBallSpriteSheets[0]); - LoadCompressedObjectPalette(&sBallSpritePalettes[0]); - spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, f); - gSprites[spriteId].data0 = a; - gSprites[spriteId].data1 = g; - gSprites[spriteId].data2 = b; - gSprites[spriteId].data3 = h; - gSprites[spriteId].data4 = h >> 16; - gSprites[spriteId].oam.priority = e; - gSprites[spriteId].callback = sub_8047638; - return spriteId; -} - -static void sub_8047638(struct Sprite *sprite) -{ - if (sprite->data1 == 0) - { - u8 r6; - u8 r7 = sprite->data0; - u8 r8 = sprite->data2; - u32 r5 = (u16)sprite->data3 | ((u16)sprite->data4 << 16); - - if (sprite->subpriority != 0) - r6 = sprite->subpriority - 1; - else - r6 = 0; - StartSpriteAnim(sprite, 1); - sub_80472B0(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r6); - sprite->data1 = sub_80472D8(1, r8, r5); - sprite->callback = sub_80476E0; - StartSpriteAffineAnim(&gSprites[r7], 2); - AnimateSprite(&gSprites[r7]); - gSprites[r7].data1 = 0; - } - else - { - sprite->data1--; - } -} - -static void sub_80476E0(struct Sprite *sprite) -{ - u8 r1; - - sprite->data5++; - if (sprite->data5 == 11) - PlaySE(SE_SUIKOMU); - r1 = sprite->data0; - if (gSprites[r1].affineAnimEnded) - { - StartSpriteAnim(sprite, 2); - gSprites[r1].invisible = TRUE; - sprite->data5 = 0; - sprite->callback = sub_8047754; - } - else - { - gSprites[r1].data1 += 96; - gSprites[r1].pos2.y = -gSprites[r1].data1 >> 8; - } -} - -static void sub_8047754(struct Sprite *sprite) -{ - if (sprite->animEnded) - sprite->callback = SpriteCallbackDummy; -} - -void obj_delete_and_free_associated_resources_(struct Sprite *sprite) -{ - DestroySpriteAndFreeResources(sprite); -} - -void sub_804777C(u8 a) -{ - struct Sprite *sprite = &gSprites[gHealthboxIDs[a]]; - - sprite->data0 = 5; - sprite->data1 = 0; - sprite->pos2.x = 0x73; - sprite->pos2.y = 0; - sprite->callback = sub_8047830; - if (GetBankSide(a) != 0) - { - sprite->data0 = -sprite->data0; - sprite->data1 = -sprite->data1; - sprite->pos2.x = -sprite->pos2.x; - sprite->pos2.y = -sprite->pos2.y; - } - gSprites[sprite->data5].callback(&gSprites[sprite->data5]); - if (GetBankIdentity(a) == 2) - sprite->callback = sub_804780C; -} - -static void sub_804780C(struct Sprite *sprite) -{ - sprite->data1++; - if (sprite->data1 == 20) - { - sprite->data1 = 0; - sprite->callback = sub_8047830; - } -} - -static void sub_8047830(struct Sprite *sprite) -{ - sprite->pos2.x -= sprite->data0; - sprite->pos2.y -= sprite->data1; - if (sprite->pos2.x == 0 && sprite->pos2.y == 0) - sprite->callback = SpriteCallbackDummy; -} - -void sub_8047858(u8 a) -{ - u8 spriteId; - - spriteId = CreateInvisibleSpriteWithCallback(oamc_804BEB4); - gSprites[spriteId].data0 = 1; - gSprites[spriteId].data1 = gHealthboxIDs[a]; - gSprites[spriteId].callback = oamc_804BEB4; -} - -static void oamc_804BEB4(struct Sprite *sprite) -{ - u8 r1 = sprite->data1; - - gSprites[r1].pos2.y = sprite->data0; - sprite->data0 = -sprite->data0; - sprite->data2++; - if (sprite->data2 == 21) - { - gSprites[r1].pos2.x = 0; - gSprites[r1].pos2.y = 0; - DestroySprite(sprite); - } -} - -void sub_80478DC(u8 a) -{ - u16 var; - - if (GetSpriteTileStartByTag(sBallSpriteSheets[a].tag) == 0xFFFF) - { - LoadCompressedObjectPic(&sBallSpriteSheets[a]); - LoadCompressedObjectPalette(&sBallSpritePalettes[a]); - } - switch (a) - { - case 6: - case 10: - case 11: - break; - default: - var = GetSpriteTileStartByTag(sBallSpriteSheets[a].tag); - LZDecompressVram(gUnknown_08D030D0, (void *)(VRAM + 0x10100 + var * 32)); - break; - } -} - -void sub_804794C(u8 a) -{ - FreeSpriteTilesByTag(sBallSpriteSheets[a].tag); - FreeSpritePaletteByTag(sBallSpritePalettes[a].tag); -} - -static u16 sub_8047978(u8 a) -{ - if (GetBankSide(a) == 0) - return GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_POKEBALL); - else - return GetMonData(&gEnemyParty[gBattlePartyID[a]], MON_DATA_POKEBALL); -} diff --git a/src/pokeblock.c b/src/pokeblock.c deleted file mode 100644 index 775280f6e..000000000 --- a/src/pokeblock.c +++ /dev/null @@ -1,1134 +0,0 @@ -// -// Created by scott on 6/27/2017. -// - -#include "global.h" -#include "rom4.h" -#include "sprite.h" -#include "script.h" -#include "strings.h" -#include "task.h" -#include "unknown_task.h" -#include "text.h" -#include "main.h" -#include "menu.h" -#include "field_fadetransition.h" -#include "palette.h" -#include "graphics.h" -#include "decompress.h" -#include "menu_helpers.h" -#include "battle.h" -#include "item_menu.h" -#include "item_use.h" -#include "item.h" -#include "items.h" -#include "sound.h" -#include "songs.h" -#include "safari_zone.h" -#include "use_pokeblock.h" -#include "event_data.h" -#include "pokeblock.h" - -struct UnkPokeblockStruct -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; -}; - -extern u8 ewram[]; - - -static EWRAM_DATA u8 gUnknown_02039244 = 0; -static EWRAM_DATA struct UnkPokeblockStruct gUnknown_02039248 = {0}; -static EWRAM_DATA u8 gUnknown_0203924C = 0; - -// function declarations - -// gUnknown_083F7EF4 -static void sub_810C508(u8); -static void sub_810C5C0(u8); -static void sub_810C748(u8); -static void sub_810C788(u8); -static void sub_810C854(u8); - -// gUnknown_083F7F24 -static void sub_810C610(u8); -static void sub_810C668(u8); - -// sub_810B6C0 -static bool8 sub_810B998(void); -static void sub_810BC98(void); -static void sub_810BD08(void); -static void sub_810BB0C(void); -static void sub_810BB30(void); -static void sub_810BC84(u8); - -// sub_810B96C -static void sub_810BF7C(u8); - -// sub_810BC84 -static void sub_810BDAC(bool8); - -// sub_810BF38 -static void sub_810C8D4(struct Sprite *); - -// sub_810BF7C -static void sub_810C0C8(u8); -static void sub_810C31C(u8); -static void sub_810C368(u8); - -// sub_810C0C8 -static void sub_810C1C8(u8, u8); -static void sub_810C23C(u8); - -// sub_810C368 -static void sub_810C40C(u8); - -// sub_810C540 -static void sub_810C5EC(u8); - -// sub_810C610 -static void sub_810C704(u8); - -static const u8 *gUnknown_03000758; - -// rodata - -#define GFX_TAG_POKEBLOCK_CASE 14800 - -const s8 gPokeblockFlavorCompatibilityTable[] = { - // Cool, Beauty, Cute, Smart, Tough - 0, 0, 0, 0, 0, // Hardy - 1, 0, 0, 0, -1, // Lonely - 1, 0, -1, 0, 0, // Brave - 1, -1, 0, 0, 0, // Adamant - 1, 0, 0, -1, 0, // Naughty - -1, 0, 0, 0, 1, // Bold - 0, 0, 0, 0, 0, // Docile - 0, 0, -1, 0, 1, // Relaxed - 0, -1, 0, 0, 1, // Impish - 0, 0, 0, -1, 1, // Lax - -1, 0, 1, 0, 0, // Timid - 0, 0, 1, 0, -1, // Hasty - 0, 0, 0, 0, 0, // Serious - 0, -1, 1, 0, 0, // Jolly - 0, 0, 1, -1, 0, // Naive - -1, 1, 0, 0, 0, // Modest - 0, 1, 0, 0, -1, // Mild - 0, 1, -1, 0, 0, // Quiet - 0, 0, 0, 0, 0, // Bashful - 0, 1, 0, -1, 0, // Rash - -1, 0, 0, 1, 0, // Calm - 0, 0, 0, 1, -1, // Gentle - 0, 0, -1, 1, 0, // Sassy - 0, -1, 0, 1, 0, // Careful - 0, 0, 0, 0, 0 // Quirky -}; - -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[] = { - NULL, - ContestStatsText_RedPokeBlock, - ContestStatsText_BluePokeBlock, - ContestStatsText_PinkPokeBlock, - ContestStatsText_GreenPokeBlock, - ContestStatsText_YellowPokeBlock, - ContestStatsText_PurplePokeBlock, - ContestStatsText_IndigoPokeBlock, - ContestStatsText_BrownPokeBlock, - ContestStatsText_LiteBluePokeBlock, - ContestStatsText_OlivePokeBlock, - ContestStatsText_GrayPokeBlock, - ContestStatsText_BlackPokeBlock, - ContestStatsText_WhitePokeBlock, - ContestStatsText_GoldPokeBlock -}; - -const struct MenuAction2 gUnknown_083F7EF4[] = { - {OtherText_Use, sub_810C508}, - {OtherText_Toss, sub_810C5C0}, - {gOtherText_CancelNoTerminator, sub_810C748}, - {OtherText_Use, sub_810C788}, - {OtherText_Use, sub_810C854}, -}; - -const u8 gUnknown_083F7F1C[] = {0, 1, 2}; -const u8 gUnknown_083F7F1F[] = {3, 2}; -const u8 gUnknown_083F7F21[] = {4, 2}; - -const struct YesNoFuncTable gUnknown_083F7F24 = {sub_810C610, sub_810C668}; - -const u8 UnreferencedData_083F7F2C[] = {0x16, 0x17, 0x18, 0x21, 0x2f}; - -const struct OamData gOamData_83F7F34 = { - .size = 3, - .priority = 2 -}; - -const union AnimCmd gSpriteAnim_83F7F3C[] = { - ANIMCMD_FRAME(.imageValue = 0, .duration = 0), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_83F7F44[] = { - gSpriteAnim_83F7F3C -}; - -const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = { - AFFINEANIMCMD_FRAME(0, 0, -2, 2), - AFFINEANIMCMD_FRAME(0, 0, 2, 4), - AFFINEANIMCMD_FRAME(0, 0, -2, 4), - AFFINEANIMCMD_FRAME(0, 0, 2, 2), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] = { - gSpriteAffineAnim_83F7F48 -}; - -const struct CompressedSpriteSheet gUnknown_083F7F74 = { - gMenuPokeblockDevice_Gfx, - 0x800, - GFX_TAG_POKEBLOCK_CASE -}; - -const struct CompressedSpritePalette gUnknown_083F7F7C = { - gMenuPokeblockDevice_Pal, - GFX_TAG_POKEBLOCK_CASE -}; - -const struct SpriteTemplate gSpriteTemplate_83F7F84 = { - GFX_TAG_POKEBLOCK_CASE, - GFX_TAG_POKEBLOCK_CASE, - &gOamData_83F7F34, - gSpriteAnimTable_83F7F44, - NULL, - gDummySpriteAffineAnimTable, - 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} -}; - -// text - -static void sub_810B674(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - UpdatePaletteFade(); -} - -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]); -} - -static bool8 sub_810B6C0(void) -{ - u16 ime; - switch (gMain.state) - { - case 0: - sub_80F9438(); - sub_80F9368(); - REG_BG2CNT = BGCNT_SCREENBASE(15) | BGCNT_CHARBASE(2) | BGCNT_PRIORITY(2); - REG_BLDCNT = 0; - gMain.state++; - break; - case 1: - remove_some_task(); - gMain.state++; - break; - case 2: - ResetPaletteFade(); - gPaletteFade.bufferTransferDisabled = TRUE; - gMain.state++; - break; - case 3: - ResetSpriteData(); - gMain.state++; - break; - case 4: - if (gUnknown_02039244 != 2) - { - ResetTasks(); - } - gMain.state++; - break; - case 5: - SetUpWindowConfig(&gWindowConfig_81E6E34); - gMain.state++; - break; - case 6: - SetUpWindowConfig(&gWindowConfig_81E6E50); - gMain.state++; - break; - case 7: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6E34); - gMain.state++; - break; - case 8: - if (MultistepInitMenuWindowContinue()) - { - gMain.state++; - } - break; - case 9: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6E50); - gMain.state++; - break; - case 10: - if (MultistepInitMenuWindowContinue()) - { - ewram[0x1ffff] = 0; - gMain.state++; - } - break; - case 11: - if (sub_810B998()) - { - gMain.state++; - } - break; - case 12: - sub_80F944C(); - LoadScrollIndicatorPalette(); - CreateVerticalScrollIndicators(0, 0xb0, 0x08); - CreateVerticalScrollIndicators(1, 0xb0, 0x98); - gMain.state++; - break; - case 13: - ewram[0x1fffe] = sub_810BA50(0x38, 0x40, 0); - gMain.state++; - break; - case 14: - sub_810BC98(); - sub_810BD08(); - gMain.state++; - break; - case 15: - sub_810BB0C(); - sub_810BB30(); - sub_810BC84(gUnknown_02039248.unk1); - gMain.state++; - break; - case 16: - ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - SetVBlankCallback(sub_810B68C); - REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG2_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP; - gMain.state++; - break; - case 17: - if (sub_8055870() != TRUE) - { - gMain.state++; - } - break; - case 18: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - gPaletteFade.bufferTransferDisabled = FALSE; - SetMainCallback2(sub_810B674); - return TRUE; - } - return FALSE; -} - -void sub_810B96C(void) -{ - do { - if (sub_810B6C0() == TRUE) - { - CreateTask(sub_810BF7C, 0); - break; - } - } while (sub_80F9344() != TRUE); -} - -static bool8 sub_810B998(void) -{ - switch (ewram[0x1ffff]) - { - case 0: - LZDecompressVram(gMenuPokeblock_Gfx, (u8 *)BG_CHAR_ADDR(2)); - ewram[0x1ffff]++; - break; - case 1: - sub_800D238(gMenuPokeblock_Tilemap, gBGTilemapBuffers[2]); - ewram[0x1ffff]++; - break; - case 2: - LoadCompressedPalette(gMenuPokeblock_Pal, 0, 0xc0); - ewram[0x1ffff]++; - break; - case 3: - LoadCompressedObjectPic(&gUnknown_083F7F74); - ewram[0x1ffff]++; - break; - case 4: - LoadCompressedObjectPalette(&gUnknown_083F7F7C); - ewram[0x1ffff] = 0; - return TRUE; - } - return FALSE; -} - -u8 sub_810BA50(s16 x, s16 y, u8 subpriority) -{ - return CreateSprite(&gSpriteTemplate_83F7F84, x, y, subpriority); -} - -void sub_810BA7C(u8 a0) -{ - gUnknown_02039244 = a0; - switch (gUnknown_02039244) - { - default: - gUnknown_03000758 = gUnknown_083F7F1C; - gUnknown_0203924C = sizeof gUnknown_083F7F1C; - break; - case 2: - gUnknown_03000758 = gUnknown_083F7F1F; - gUnknown_0203924C = sizeof gUnknown_083F7F1F; - break; - case 3: - gUnknown_03000758 = gUnknown_083F7F21; - gUnknown_0203924C = sizeof gUnknown_083F7F21; - break; - } -} - -void sub_810BADC(void) -{ - sub_810BA7C(2); - SetMainCallback2(sub_810B96C); -} - -void sub_810BAF4(void) -{ - sub_810BA7C(3); - SetMainCallback2(sub_810B96C); -} - -#ifdef DEBUG -void debug_sub_8120F98(void) -{ - u8 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); - 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); -} - -static void sub_810BB88(u8 a0) -{ - u8 i; - u8 y; - u8 *buf; - BasicInitMenuWindow(&gWindowConfig_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); - if (i != a0 + 8) - { - MenuZeroFillWindowRect(15, y + 3, 29, 18); - } - break; - } - buf = sub_8072C74(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[i].color], 0x5e, 0); - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x14; - buf[2] = 0x06; - buf += 3; - ConvertIntToDecimalStringN(buf, sub_810C9B0(&gSaveBlock1.pokeblocks[i]), STR_CONV_MODE_RIGHT_ALIGN, 3); - MenuPrint(gStringVar1, 15, y + 1); - } -} - -static void sub_810BC84(u8 a0) -{ - sub_810BB88(a0); - sub_810BDAC(FALSE); -} - -static void sub_810BC98(void) -{ - u16 i, j; - struct Pokeblock buf; - for (i=0; i<39; i++) - { - for (j=i+1; j<40; j++) - { - if (gSaveBlock1.pokeblocks[i].color == 0) - { - buf = gSaveBlock1.pokeblocks[i]; - gSaveBlock1.pokeblocks[i] = gSaveBlock1.pokeblocks[j]; - gSaveBlock1.pokeblocks[j] = buf; - } - } - } -} - -static void sub_810BD08(void) -{ - u8 i; - gUnknown_02039248.unk2 = 0; - for (i=0; i<40; i++) - { - if (gSaveBlock1.pokeblocks[i].color != 0) - gUnknown_02039248.unk2++; - } - if (gUnknown_02039248.unk2 < 8) - { - gUnknown_02039248.unk3 = gUnknown_02039248.unk2; - } - else - { - gUnknown_02039248.unk3 = 8; - } - if (gUnknown_02039248.unk1 + 8 > gUnknown_02039248.unk2 && gUnknown_02039248.unk1 != 0) - { - gUnknown_02039248.unk1--; - } -} - -static void sub_810BD64(u16 a0, u16 a1) -{ - u8 i; - int y; - for (i=0; i<14; i++) - { - gBGTilemapBuffers[2][(2 * gUnknown_02039248.unk0 + 1) * 32 + (y = i + 15)] = a0; - gBGTilemapBuffers[2][(2 * gUnknown_02039248.unk0 + 2) * 32 + y] = a0; - } -} - -static void sub_810BDAC(bool8 flag) -{ - u8 i; - u16 v0; - if (!flag) - { - sub_810BD64(0x1005, 0x1014); - } - else - { - sub_810BD64(0x2005, 0x2014); - } - if (gUnknown_02039248.unk1) - { - sub_80F979C(0, 0); - } - else - { - sub_80F979C(0, 1); - } - if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2) - { - sub_80F979C(1, 0); - } - else - { - sub_80F979C(1, 1); - } - for (i=0; i<5; i++) - { - v0 = ((i % 3) << 6) + 0x1a1 + (i / 3) * 6; - if (gUnknown_02039248.unk0 + gUnknown_02039248.unk1 != gUnknown_02039248.unk2) - { - if (sub_810CA9C(&gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1], i + 1) > 0) - { - gBGTilemapBuffers[2][v0] = (i << 12) + 23; - gBGTilemapBuffers[2][v0 + 32] = (i << 12) + 24; - } - else - { - gBGTilemapBuffers[2][v0] = 15; - gBGTilemapBuffers[2][v0 + 32] = 15; - } - } - else - { - gBGTilemapBuffers[2][v0] = 15; - gBGTilemapBuffers[2][v0 + 32] = 15; - } - } - BasicInitMenuWindow(&gWindowConfig_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); - } - else - { - MenuZeroFillWindowRect(11, 17, 12, 18); - } -} - -static void sub_810BF38(bool8 flag) -{ - PlaySE(SE_SELECT); - gSprites[ewram[0x1fffe]].callback = sub_810C8D4; - sub_810BDAC(flag); -} - -static void sub_810BF7C(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (gUnknown_02039248.unk0 != 0) - { - sub_810BD64(5, 20); - gUnknown_02039248.unk0--; - sub_810BF38(FALSE); - } - else if (gUnknown_02039248.unk1 != 0) - { - gUnknown_02039248.unk1--; - sub_810BB88(gUnknown_02039248.unk1); - sub_810BF38(FALSE); - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (gUnknown_02039248.unk0 != gUnknown_02039248.unk3) - { - sub_810BD64(5, 20); - gUnknown_02039248.unk0++; - sub_810BF38(FALSE); - } - else if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2) - { - gUnknown_02039248.unk1++; - sub_810BB88(gUnknown_02039248.unk1); - sub_810BF38(FALSE); - } - } - else if (gMain.newKeys & SELECT_BUTTON) - { - if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2) - { - PlaySE(SE_SELECT); - sub_810BDAC(TRUE); - gTasks[taskId].data[0] = gUnknown_02039248.unk1 + gUnknown_02039248.unk0; - gTasks[taskId].func = sub_810C0C8; - } - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 == gUnknown_02039248.unk2) - { - gScriptResult = 0xffff; - sub_810C31C(taskId); - } - else - { - sub_810C368(taskId); - } - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gScriptResult = 0xffff; - sub_810C31C(taskId); - } - } -} - -static void sub_810C0C8(u8 taskId) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (gUnknown_02039248.unk0 != 0) - { - sub_810BD64(5, 20); - gUnknown_02039248.unk0--; - sub_810BF38(TRUE); - sub_810C1C8(taskId, 1); - } - else if (gUnknown_02039248.unk1 != 0) - { - sub_810C1C8(taskId, 0); - gUnknown_02039248.unk1--; - sub_810BB88(gUnknown_02039248.unk1); - sub_810BF38(TRUE); - sub_810C1C8(taskId, 1); - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (gUnknown_02039248.unk0 != gUnknown_02039248.unk3) - { - sub_810BD64(5, 20); - gUnknown_02039248.unk0++; - sub_810BF38(TRUE); - sub_810C1C8(taskId, 1); - } - else if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2) - { - sub_810C1C8(taskId, 0); - gUnknown_02039248.unk1++; - sub_810BB88(gUnknown_02039248.unk1); - sub_810BF38(TRUE); - sub_810C1C8(taskId, 1); - } - } - else if (gMain.newKeys & A_BUTTON || gMain.newKeys & SELECT_BUTTON) - { - PlaySE(SE_SELECT); - sub_810C1C8(taskId, 0); - sub_810C23C(taskId); - gTasks[taskId].func = sub_810BF7C; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_810C1C8(taskId, 0); - sub_810BDAC(0); - gTasks[taskId].func = sub_810BF7C; - } -} - -static void sub_810C1C8(u8 taskId, u8 flag) -{ - u8 i; - u32 x; - s16 y; - u16 v0 = 0x1005; - if (!flag) - { - v0 = 0x0005; - } - y = gTasks[taskId].data[0] - gUnknown_02039248.unk1; - if ((u16)y <= 8 && y != gUnknown_02039248.unk0) - { - for (i=0; i<14; i++) - { - gBGTilemapBuffers[2][(2 * y + 1) * 32 + (x = i + 15)] = v0; - gBGTilemapBuffers[2][(2 * y + 2) * 32 + x] = v0; - } - } -} - -static void sub_810C23C(u8 taskId) -{ - struct Pokeblock buf; - u8 selidx = gUnknown_02039248.unk1 + gUnknown_02039248.unk0; - if (selidx == gUnknown_02039248.unk2) - { - sub_810BDAC(FALSE); - } - else - { - buf = gSaveBlock1.pokeblocks[selidx]; - gSaveBlock1.pokeblocks[selidx] = gSaveBlock1.pokeblocks[gTasks[taskId].data[0]]; - gSaveBlock1.pokeblocks[gTasks[taskId].data[0]] = buf; - sub_810BB88(gUnknown_02039248.unk1); - sub_810BDAC(FALSE); - } -} - -static void sub_810C2B0(void) -{ - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); - BuyMenuFreeMemory(); -} - -static void sub_810C2C8(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gUnknown_02039244 == 3) - { - gFieldCallback = sub_8080990; - } - sub_810C2B0(); - SetMainCallback2(gUnknown_083F7EA8[gUnknown_02039244]); - DestroyTask(taskId); - } -} - -static void sub_810C31C(u8 taskId) -{ - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - if (gUnknown_02039244 > 1) - { - gScriptItemId = ITEM_NONE; - } - gTasks[taskId].func = sub_810C2C8; -} - -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, (const struct MenuAction *)gUnknown_083F7EF4, gUnknown_03000758); - InitMenu(0, 8, v0 + 5, gUnknown_0203924C, 0, 5); - gScriptItemId = gUnknown_02039248.unk0 + gUnknown_02039248.unk1; - gTasks[taskId].func = sub_810C40C; -} - -static void sub_810C40C(u8 taskId) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (GetMenuCursorPos()) - { - PlaySE(SE_SELECT); - MoveMenuCursor(-1); - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (GetMenuCursorPos() != gUnknown_0203924C - 1) - { - PlaySE(SE_SELECT); - MoveMenuCursor(+1); - } - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_083F7EF4[gUnknown_03000758[GetMenuCursorPos()]].func(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_810C748(taskId); - } -} - -static void sub_810C4C4(u8 taskId) -{ - if (!gPaletteFade.active) - { - sub_810C2B0(); - sub_8136130(&gSaveBlock1.pokeblocks[gScriptItemId], sub_810B96C); - DestroyTask(taskId); - } -} - -static void sub_810C508(u8 taskId) -{ - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = sub_810C4C4; -} - -static void sub_810C540(u8 taskId) -{ - BasicInitMenuWindow(&gWindowConfig_81E6E50); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(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); -} - -static void sub_810C5C0(u8 taskId) -{ - sub_80F979C(1, 1); - gTasks[taskId].func = sub_810C540; -} - -static void sub_810C5EC(u8 taskId) -{ - DisplayYesNoMenu(7, 6, 1); - DoYesNoFuncWithChoice(taskId, &gUnknown_083F7F24); -} - -static void sub_810C610(u8 taskId) -{ - MenuZeroFillWindowRect(7, 6, 13, 11); - sub_810CA6C((gUnknown_02039248.unk0 + gUnknown_02039248.unk1)); - StringExpandPlaceholders(gStringVar4, gContestStatsText_WasThrownAway); - DisplayItemMessageOnField(taskId, gStringVar4, sub_810C704, 0); - sub_810BC98(); - sub_810BD08(); -} - -static void sub_810C668(u8 taskId) -{ - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2) - { - sub_80F979C(1, 0); - } - BasicInitMenuWindow(&gWindowConfig_81E6E50); - MenuZeroFillWindowRect(7, 6, 13, 11); - MenuZeroFillWindowRect(0, 14, 29, 19); - gTasks[taskId].func = sub_810BF7C; -} - -static void sub_810C6DC(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - { - sub_810C668(taskId); - } -} - -static void sub_810C704(u8 taskId) -{ - BasicInitMenuWindow(&gWindowConfig_81E6E34); - sub_810BC84(gUnknown_02039248.unk1); - sub_80F979C(1, 1); - gTasks[taskId].func = sub_810C6DC; -} - -static void sub_810C748(u8 taskId) -{ - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(7, 4, 13, 11); - gTasks[taskId].func = sub_810BF7C; -} - -static void sub_810C788(u8 taskId) -{ - s16 v0 = sub_810CAE4(GetNature(&gEnemyParty[0]), &gSaveBlock1.pokeblocks[gScriptItemId]); - StringCopy(gBattleTextBuff1, gPokeblockNames[gSaveBlock1.pokeblocks[gScriptItemId].color]); - sub_810CA6C(gScriptItemId); - gScriptItemId = gSaveBlock1.pokeblocks[gScriptItemId].color << 8; - if (v0 == 0) - { - gScriptItemId += 1; - } - if (v0 > 0) - { - gScriptItemId += 2; - } - if (v0 < 0) - { - gScriptItemId += 3; - } - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = sub_810C2C8; -} - -static void sub_810C854(u8 taskId) -{ - SafariZoneActivatePokeblockFeeder(gScriptItemId); - StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gScriptItemId].color]); - gScriptResult = gScriptItemId; - sub_810CA6C(gScriptItemId); - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = sub_810C2C8; -} - -static void sub_810C8D4(struct Sprite *sprite) -{ - if (sprite->data0 > 1) - { - sprite->data0 = 0; - } - switch (sprite->data0) - { - case 0: - sprite->oam.affineMode = 1; - sprite->affineAnims = gSpriteAffineAnimTable_83F7F70; - InitSpriteAffineAnim(sprite); - sprite->data0 = 1; - sprite->data1 = 0; - break; - case 1: - if (++sprite->data1 > 11) - { - sprite->oam.affineMode = 0; - sprite->data0 = 0; - sprite->data1 = 0; - FreeOamMatrix(sprite->oam.matrixNum); - sprite->callback = SpriteCallbackDummy; - } - break; - } -} - -static void ClearPokeblock(u8 pokeblockIdx) -{ - gSaveBlock1.pokeblocks[pokeblockIdx].color = 0; - gSaveBlock1.pokeblocks[pokeblockIdx].spicy = 0; - gSaveBlock1.pokeblocks[pokeblockIdx].dry = 0; - gSaveBlock1.pokeblocks[pokeblockIdx].sweet = 0; - gSaveBlock1.pokeblocks[pokeblockIdx].bitter = 0; - gSaveBlock1.pokeblocks[pokeblockIdx].sour = 0; - gSaveBlock1.pokeblocks[pokeblockIdx].feel = 0; -} - -void ClearPokeblocks(void) -{ - u8 pokeblockIdx; - for (pokeblockIdx=0; pokeblockIdx 99) - feel = 99; - return feel; -} - -s8 sub_810CA00(void) -{ - u8 i; - for (i=0; icolor; - if (field == 1) - return pokeblock->spicy; - if (field == 2) - return pokeblock->dry; - if (field == 3) - return pokeblock->sweet; - if (field == 4) - return pokeblock->bitter; - if (field == 5) - return pokeblock->sour; - if (field == 6) - return pokeblock->feel; - return 0; -} - -s16 sub_810CAE4(u8 nature, const struct Pokeblock *pokeblock) -{ - u8 flavor; - s16 curGain; - s16 totalGain = 0; - for (flavor=0; flavor<5; flavor++) - { - curGain = sub_810CA9C(pokeblock, flavor + 1); - if (curGain > 0) - { - totalGain += curGain * gPokeblockFlavorCompatibilityTable[5 * nature + flavor]; - } - } - return totalGain; -} - -void sub_810CB44(struct Pokeblock *pokeblock, u8 *dest) -{ - u8 color = sub_810CA9C(pokeblock, 0); - StringCopy(dest, gPokeblockNames[color]); -} - -bool8 sub_810CB68(u8 nature, u8 *dest) -{ - u8 flavor; - for (flavor=0; flavor<5; flavor++) - { - if (sub_810CAE4(nature, &gUnknown_083F7F9C[flavor]) > 0) - { - StringCopy(dest, gPokeblockNames[flavor + 1]); - return TRUE; - } - } - return FALSE; -} diff --git a/src/pokedex.c b/src/pokedex.c deleted file mode 100644 index c132635cb..000000000 --- a/src/pokedex.c +++ /dev/null @@ -1,5528 +0,0 @@ - -#include "global.h" -#include "gba/m4a_internal.h" -#include "pokedex.h" -#include "battle.h" -#include "data2.h" -#include "decompress.h" -#include "event_data.h" -#include "graphics.h" -#include "m4a.h" -#include "main.h" -#include "menu.h" -#include "menu_cursor.h" -#include "palette.h" -#include "pokedex_area_screen.h" -#include "pokedex_cry_screen.h" -#include "pokemon.h" -#include "rng.h" -#include "rom4.h" -#include "songs.h" -#include "sound.h" -#include "species.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "trig.h" -#include "unknown_task.h" - -#define NATIONAL_DEX_COUNT 386 - -struct PokedexListItem -{ - u16 dexNum; - u16 seen:1; - u16 owned:1; -}; - -struct PokedexView -{ - struct PokedexListItem unk0[NATIONAL_DEX_COUNT]; - u16 unk608; - u8 unk60A_1:1; - u8 unk60A_2:1; - u8 unk60B; - u16 pokemonListCount; - u16 selectedPokemon; - u16 unk610; - u16 dexMode; - u16 unk614; - u16 dexOrder; - u16 unk618; - u16 unk61A; - u16 unk61C; - u16 unk61E[4]; - u16 selectedMonSpriteId; - u16 unk628; - u16 unk62A; - u8 unk62C; - u8 unk62D; - u8 unk62E; - u8 unk62F; - s16 unk630; - s16 unk632; - u16 unk634; - u16 unk636; - u16 unk638; - u16 unk63A[4]; - u8 filler642[8]; - u8 unk64A; - u8 unk64B; - u8 unk64C_1:1; - u8 selectedScreen; - u8 descriptionPageNum; - u8 unk64F; - u8 menuIsOpen; //menuIsOpen - u8 unk651; - u16 menuCursorPos; //Menu cursor position - s16 menuY; //Menu Y position (inverted because we use REG_BG0VOFS for this) - u8 unk656[8]; - u8 unk65E[8]; -}; - -enum -{ - DEX_MODE_HOENN, - DEX_MODE_NATIONAL -}; - -enum -{ - PAGE_SCREEN, - AREA_SCREEN, - CRY_SCREEN, - SIZE_SCREEN -}; - -struct PokedexEntry -{ - /*0x00*/ u8 categoryName[12]; - /*0x0C*/ u16 height; //in decimeters - /*0x0E*/ u16 weight; //in hectograms - /*0x10*/ const u8 *descriptionPage1; - /*0x14*/ const u8 *descriptionPage2; - /*0x18*/ u16 unused; - /*0x1A*/ u16 pokemonScale; - /*0x1C*/ u16 pokemonOffset; - /*0x1E*/ u16 trainerScale; - /*0x20*/ u16 trainerOffset; -}; /*size = 0x24*/ - -struct UnknownStruct2 -{ - const u8 *text1; - const u8 *text2; -}; - -struct UnknownStruct1 -{ - const struct UnknownStruct2 *unk0; - u8 unk4; - u8 unk5; - u16 unk6; -}; - -struct UnknownStruct3 -{ - const u8 *text; - u8 unk4; - u8 unk5; - u8 unk6; -}; - -struct UnknownStruct4 -{ - const u8 *text; - u8 unk4; - u8 unk5; - u8 unk6; - u8 unk7; - u8 unk8; - u8 unk9; -}; - -extern struct MusicPlayerInfo gMPlay_BGM; -extern u8 gReservedSpritePaletteCount; -extern struct SpriteTemplate gUnknown_02024E8C; -extern u8 gUnknown_03005E98; -extern const u8 gPokedexMenu_Gfx[]; -extern const u8 gUnknown_08E96738[]; -extern const u8 gUnknown_08E96888[]; -extern const u8 gUnknown_08E96994[]; -extern const u8 gUnknown_08E9C6DC[]; -extern const u8 gUnknown_08D00524[]; -extern const u8 gUnknown_08E96BD4[]; -extern const u8 gUnknown_08E96ACC[]; -extern const u8 gUnknown_08E96B58[]; -extern const u16 gPokedexMenu_Pal[]; -extern const u16 gPokedexMenu2_Pal[]; -extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; -extern const struct MonCoords gTrainerFrontPicCoords[]; -extern const struct PokedexEntry gPokedexEntries[]; -extern const u8 gPokedexMenuSearch_Gfx[]; -extern const u8 gUnknown_08E96D2C[]; -extern const u16 gPokedexMenuSearch_Pal[]; -extern const u8 gTypeNames[][7]; -extern const u8 gPokedexMenu2_Gfx[]; - -static EWRAM_DATA struct PokedexView *gPokedexView = NULL; -static EWRAM_DATA u16 gUnknown_0202FFB8 = 0; -static EWRAM_DATA u8 gUnknown_0202FFBA = 0; -static EWRAM_DATA struct PokedexListItem *gUnknown_0202FFBC = NULL; - -u8 gUnknown_03005CE8; -IntrCallback gUnknown_03005CEC; - -static u8 sub_8091E3C(void); - -static const u16 sPokedexSearchPalette[] = INCBIN_U16("graphics/pokedex/search.gbapal"); -static const u16 sNationalPokedexPalette[] = INCBIN_U16("graphics/pokedex/national.gbapal"); -const u8 gEmptySpacce_839F7FC[0xA4] = {0}; -static const u8 gUnknown_0839F8A0[] = INCBIN_U8("graphics/pokedex/pokedex_cry_layout.bin.lz"); -static const u8 gUnknown_0839F988[] = INCBIN_U8("graphics/pokedex/pokedex_size_layout.bin.lz"); -#if ENGLISH -static const u8 gUnknown_0839FA7C[] = INCBIN_U8("graphics/pokedex/noball.4bpp.lz"); -#elif GERMAN -extern const u8 gUnknown_0839FA7C[]; -#endif - -#include "data/pokedex_orders.h" -static const struct OamData gOamData_83A0404 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83A040C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83A0414 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83A041C = -{ - .y = 160, - .affineMode = 0, - .objMode = 2, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83A0424 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83A042C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 2, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_83A0434[] = -{ - ANIMCMD_FRAME(3, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A043C[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A0444[] = -{ - ANIMCMD_FRAME(16, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A044C[] = -{ - ANIMCMD_FRAME(32, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A0454[] = -{ - ANIMCMD_FRAME(64, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A045C[] = -{ - ANIMCMD_FRAME(96, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A0464[] = -{ - ANIMCMD_FRAME(128, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A046C[] = -{ - ANIMCMD_FRAME(160, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A0474[] = -{ - ANIMCMD_FRAME(192, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A047C[] = -{ - ANIMCMD_FRAME(224, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A0484[] = -{ - ANIMCMD_FRAME(226, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A048C[] = -{ - ANIMCMD_FRAME(228, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A0494[] = -{ - ANIMCMD_FRAME(230, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A049C[] = -{ - ANIMCMD_FRAME(232, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A04A4[] = -{ - ANIMCMD_FRAME(234, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A04AC[] = -{ - ANIMCMD_FRAME(236, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A04B4[] = -{ - ANIMCMD_FRAME(238, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A04BC[] = -{ - ANIMCMD_FRAME(240, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A04C4[] = -{ - ANIMCMD_FRAME(242, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A04CC[] = -{ - ANIMCMD_FRAME(4, 30), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_83A04D4[] = -{ - gSpriteAnim_83A0434, -}; -static const union AnimCmd *const gSpriteAnimTable_83A04D8[] = -{ - gSpriteAnim_83A043C, -}; -static const union AnimCmd *const gSpriteAnimTable_83A04DC[] = -{ - gSpriteAnim_83A0444, -}; -static const union AnimCmd *const gSpriteAnimTable_83A04E0[] = -{ - gSpriteAnim_83A044C, - gSpriteAnim_83A0454, - gSpriteAnim_83A045C, - gSpriteAnim_83A0464, -}; -static const union AnimCmd *const gSpriteAnimTable_83A04F0[] = -{ - gSpriteAnim_83A046C, - gSpriteAnim_83A0474, -}; -static const union AnimCmd *const gSpriteAnimTable_83A04F8[] = -{ - gSpriteAnim_83A047C, - gSpriteAnim_83A0484, - gSpriteAnim_83A048C, - gSpriteAnim_83A0494, - gSpriteAnim_83A049C, - gSpriteAnim_83A04A4, - gSpriteAnim_83A04AC, - gSpriteAnim_83A04B4, - gSpriteAnim_83A04BC, - gSpriteAnim_83A04C4, -}; -static const union AnimCmd *const gSpriteAnimTable_83A0520[] = -{ - gSpriteAnim_83A04CC, -}; -static void sub_808EF38(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83A0524 = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A0404, - .anims = gSpriteAnimTable_83A04D4, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808EF38, -}; -static void sub_808EF8C(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83A053C = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A040C, - .anims = gSpriteAnimTable_83A04D8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808EF8C, -}; -static void sub_808F08C(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83A0554 = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A0414, - .anims = gSpriteAnimTable_83A04E0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808F08C, -}; -static void sub_808F0B4(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83A056C = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A041C, - .anims = gSpriteAnimTable_83A04DC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808F0B4, -}; -static void sub_808ED94(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83A0584 = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A0424, - .anims = gSpriteAnimTable_83A04F0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808ED94, -}; -static const struct SpriteTemplate gSpriteTemplate_83A059C = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A042C, - .anims = gSpriteAnimTable_83A04F8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808ED94, -}; -static void sub_808F168(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83A05B4 = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A042C, - .anims = gSpriteAnimTable_83A0520, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808F168, -}; -static const struct CompressedSpriteSheet gUnknown_083A05CC[] = -{ - {gPokedexMenu2_Gfx, 0x1F00, 0x1000}, - {NULL, 0, 0}, -}; -static const struct SpritePalette gUnknown_083A05DC[] = -{ - {gPokedexMenu_Pal, 0x1000}, - {NULL, 0}, -}; -static const u8 gUnknown_083A05EC[] = {2, 4, 8, 16, 32}; -static const u8 gUnknown_083A05F1[] = {16, 8, 4, 2, 1}; -const u8 gEmptySpacce_83A05F6[] = {0, 0}; // Padding, maybe? -static const u8 gUnknown_083A05F8[] = _(""); -#if ENGLISH -#include "data/pokedex_entries_en.h" -#elif GERMAN -#include "data/pokedex_entries_de.h" -#endif -static const u16 gUnknown_083B4EC4[16] = {0}; -static const u8 *const sMonFootprintTable[] = -{ - gMonFootprint_Bulbasaur, - gMonFootprint_Bulbasaur, - gMonFootprint_Ivysaur, - gMonFootprint_Venusaur, - gMonFootprint_Charmander, - gMonFootprint_Charmeleon, - gMonFootprint_Charizard, - gMonFootprint_Squirtle, - gMonFootprint_Wartortle, - gMonFootprint_Blastoise, - gMonFootprint_Caterpie, - gMonFootprint_Metapod, - gMonFootprint_Butterfree, - gMonFootprint_Weedle, - gMonFootprint_Kakuna, - gMonFootprint_Beedrill, - gMonFootprint_Pidgey, - gMonFootprint_Pidgeotto, - gMonFootprint_Pidgeot, - gMonFootprint_Rattata, - gMonFootprint_Raticate, - gMonFootprint_Spearow, - gMonFootprint_Fearow, - gMonFootprint_Ekans, - gMonFootprint_Arbok, - gMonFootprint_Pikachu, - gMonFootprint_Raichu, - gMonFootprint_Sandshrew, - gMonFootprint_Sandslash, - gMonFootprint_NidoranF, - gMonFootprint_Nidorina, - gMonFootprint_Nidoqueen, - gMonFootprint_NidoranM, - gMonFootprint_Nidorino, - gMonFootprint_Nidoking, - gMonFootprint_Clefairy, - gMonFootprint_Clefable, - gMonFootprint_Vulpix, - gMonFootprint_Ninetales, - gMonFootprint_Jigglypuff, - gMonFootprint_Wigglytuff, - gMonFootprint_Zubat, - gMonFootprint_Golbat, - gMonFootprint_Oddish, - gMonFootprint_Gloom, - gMonFootprint_Vileplume, - gMonFootprint_Paras, - gMonFootprint_Parasect, - gMonFootprint_Venonat, - gMonFootprint_Venomoth, - gMonFootprint_Diglett, - gMonFootprint_Dugtrio, - gMonFootprint_Meowth, - gMonFootprint_Persian, - gMonFootprint_Psyduck, - gMonFootprint_Golduck, - gMonFootprint_Mankey, - gMonFootprint_Primeape, - gMonFootprint_Growlithe, - gMonFootprint_Arcanine, - gMonFootprint_Poliwag, - gMonFootprint_Poliwhirl, - gMonFootprint_Poliwrath, - gMonFootprint_Abra, - gMonFootprint_Kadabra, - gMonFootprint_Alakazam, - gMonFootprint_Machop, - gMonFootprint_Machoke, - gMonFootprint_Machamp, - gMonFootprint_Bellsprout, - gMonFootprint_Weepinbell, - gMonFootprint_Victreebel, - gMonFootprint_Tentacool, - gMonFootprint_Tentacruel, - gMonFootprint_Geodude, - gMonFootprint_Graveler, - gMonFootprint_Golem, - gMonFootprint_Ponyta, - gMonFootprint_Rapidash, - gMonFootprint_Slowpoke, - gMonFootprint_Slowbro, - gMonFootprint_Magnemite, - gMonFootprint_Magneton, - gMonFootprint_Farfetchd, - gMonFootprint_Doduo, - gMonFootprint_Dodrio, - gMonFootprint_Seel, - gMonFootprint_Dewgong, - gMonFootprint_Grimer, - gMonFootprint_Muk, - gMonFootprint_Shellder, - gMonFootprint_Cloyster, - gMonFootprint_Gastly, - gMonFootprint_Haunter, - gMonFootprint_Gengar, - gMonFootprint_Onix, - gMonFootprint_Drowzee, - gMonFootprint_Hypno, - gMonFootprint_Krabby, - gMonFootprint_Kingler, - gMonFootprint_Voltorb, - gMonFootprint_Electrode, - gMonFootprint_Exeggcute, - gMonFootprint_Exeggutor, - gMonFootprint_Cubone, - gMonFootprint_Marowak, - gMonFootprint_Hitmonlee, - gMonFootprint_Hitmonchan, - gMonFootprint_Lickitung, - gMonFootprint_Koffing, - gMonFootprint_Weezing, - gMonFootprint_Rhyhorn, - gMonFootprint_Rhydon, - gMonFootprint_Chansey, - gMonFootprint_Tangela, - gMonFootprint_Kangaskhan, - gMonFootprint_Horsea, - gMonFootprint_Seadra, - gMonFootprint_Goldeen, - gMonFootprint_Seaking, - gMonFootprint_Staryu, - gMonFootprint_Starmie, - gMonFootprint_Mrmime, - gMonFootprint_Scyther, - gMonFootprint_Jynx, - gMonFootprint_Electabuzz, - gMonFootprint_Magmar, - gMonFootprint_Pinsir, - gMonFootprint_Tauros, - gMonFootprint_Magikarp, - gMonFootprint_Gyarados, - gMonFootprint_Lapras, - gMonFootprint_Ditto, - gMonFootprint_Eevee, - gMonFootprint_Vaporeon, - gMonFootprint_Jolteon, - gMonFootprint_Flareon, - gMonFootprint_Porygon, - gMonFootprint_Omanyte, - gMonFootprint_Omastar, - gMonFootprint_Kabuto, - gMonFootprint_Kabutops, - gMonFootprint_Aerodactyl, - gMonFootprint_Snorlax, - gMonFootprint_Articuno, - gMonFootprint_Zapdos, - gMonFootprint_Moltres, - gMonFootprint_Dratini, - gMonFootprint_Dragonair, - gMonFootprint_Dragonite, - gMonFootprint_Mewtwo, - gMonFootprint_Mew, - gMonFootprint_Chikorita, - gMonFootprint_Bayleef, - gMonFootprint_Meganium, - gMonFootprint_Cyndaquil, - gMonFootprint_Quilava, - gMonFootprint_Typhlosion, - gMonFootprint_Totodile, - gMonFootprint_Croconaw, - gMonFootprint_Feraligatr, - gMonFootprint_Sentret, - gMonFootprint_Furret, - gMonFootprint_Hoothoot, - gMonFootprint_Noctowl, - gMonFootprint_Ledyba, - gMonFootprint_Ledian, - gMonFootprint_Spinarak, - gMonFootprint_Ariados, - gMonFootprint_Crobat, - gMonFootprint_Chinchou, - gMonFootprint_Lanturn, - gMonFootprint_Pichu, - gMonFootprint_Cleffa, - gMonFootprint_Igglybuff, - gMonFootprint_Togepi, - gMonFootprint_Togetic, - gMonFootprint_Natu, - gMonFootprint_Xatu, - gMonFootprint_Mareep, - gMonFootprint_Flaaffy, - gMonFootprint_Ampharos, - gMonFootprint_Bellossom, - gMonFootprint_Marill, - gMonFootprint_Azumarill, - gMonFootprint_Sudowoodo, - gMonFootprint_Politoed, - gMonFootprint_Hoppip, - gMonFootprint_Skiploom, - gMonFootprint_Jumpluff, - gMonFootprint_Aipom, - gMonFootprint_Sunkern, - gMonFootprint_Sunflora, - gMonFootprint_Yanma, - gMonFootprint_Wooper, - gMonFootprint_Quagsire, - gMonFootprint_Espeon, - gMonFootprint_Umbreon, - gMonFootprint_Murkrow, - gMonFootprint_Slowking, - gMonFootprint_Misdreavus, - gMonFootprint_Unown, - gMonFootprint_Wobbuffet, - gMonFootprint_Girafarig, - gMonFootprint_Pineco, - gMonFootprint_Forretress, - gMonFootprint_Dunsparce, - gMonFootprint_Gligar, - gMonFootprint_Steelix, - gMonFootprint_Snubbull, - gMonFootprint_Granbull, - gMonFootprint_Qwilfish, - gMonFootprint_Scizor, - gMonFootprint_Shuckle, - gMonFootprint_Heracross, - gMonFootprint_Sneasel, - gMonFootprint_Teddiursa, - gMonFootprint_Ursaring, - gMonFootprint_Slugma, - gMonFootprint_Magcargo, - gMonFootprint_Swinub, - gMonFootprint_Piloswine, - gMonFootprint_Corsola, - gMonFootprint_Remoraid, - gMonFootprint_Octillery, - gMonFootprint_Delibird, - gMonFootprint_Mantine, - gMonFootprint_Skarmory, - gMonFootprint_Houndour, - gMonFootprint_Houndoom, - gMonFootprint_Kingdra, - gMonFootprint_Phanpy, - gMonFootprint_Donphan, - gMonFootprint_Porygon2, - gMonFootprint_Stantler, - gMonFootprint_Smeargle, - gMonFootprint_Tyrogue, - gMonFootprint_Hitmontop, - gMonFootprint_Smoochum, - gMonFootprint_Elekid, - gMonFootprint_Magby, - gMonFootprint_Miltank, - gMonFootprint_Blissey, - gMonFootprint_Raikou, - gMonFootprint_Entei, - gMonFootprint_Suicune, - gMonFootprint_Larvitar, - gMonFootprint_Pupitar, - gMonFootprint_Tyranitar, - gMonFootprint_Lugia, - gMonFootprint_HoOh, - gMonFootprint_Celebi, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_Treecko, - gMonFootprint_Grovyle, - gMonFootprint_Sceptile, - gMonFootprint_Torchic, - gMonFootprint_Combusken, - gMonFootprint_Blaziken, - gMonFootprint_Mudkip, - gMonFootprint_Marshtomp, - gMonFootprint_Swampert, - gMonFootprint_Poochyena, - gMonFootprint_Mightyena, - gMonFootprint_Zigzagoon, - gMonFootprint_Linoone, - gMonFootprint_Wurmple, - gMonFootprint_Silcoon, - gMonFootprint_Beautifly, - gMonFootprint_Cascoon, - gMonFootprint_Dustox, - gMonFootprint_Lotad, - gMonFootprint_Lombre, - gMonFootprint_Ludicolo, - gMonFootprint_Seedot, - gMonFootprint_Nuzleaf, - gMonFootprint_Shiftry, - gMonFootprint_Nincada, - gMonFootprint_Ninjask, - gMonFootprint_Shedinja, - gMonFootprint_Taillow, - gMonFootprint_Swellow, - gMonFootprint_Shroomish, - gMonFootprint_Breloom, - gMonFootprint_Spinda, - gMonFootprint_Wingull, - gMonFootprint_Pelipper, - gMonFootprint_Surskit, - gMonFootprint_Masquerain, - gMonFootprint_Wailmer, - gMonFootprint_Wailord, - gMonFootprint_Skitty, - gMonFootprint_Delcatty, - gMonFootprint_Kecleon, - gMonFootprint_Baltoy, - gMonFootprint_Claydol, - gMonFootprint_Nosepass, - gMonFootprint_Torkoal, - gMonFootprint_Sableye, - gMonFootprint_Barboach, - gMonFootprint_Whiscash, - gMonFootprint_Luvdisc, - gMonFootprint_Corphish, - gMonFootprint_Crawdaunt, - gMonFootprint_Feebas, - gMonFootprint_Milotic, - gMonFootprint_Carvanha, - gMonFootprint_Sharpedo, - gMonFootprint_Trapinch, - gMonFootprint_Vibrava, - gMonFootprint_Flygon, - gMonFootprint_Makuhita, - gMonFootprint_Hariyama, - gMonFootprint_Electrike, - gMonFootprint_Manectric, - gMonFootprint_Numel, - gMonFootprint_Camerupt, - gMonFootprint_Spheal, - gMonFootprint_Sealeo, - gMonFootprint_Walrein, - gMonFootprint_Cacnea, - gMonFootprint_Cacturne, - gMonFootprint_Snorunt, - gMonFootprint_Glalie, - gMonFootprint_Lunatone, - gMonFootprint_Solrock, - gMonFootprint_Azurill, - gMonFootprint_Spoink, - gMonFootprint_Grumpig, - gMonFootprint_Plusle, - gMonFootprint_Minun, - gMonFootprint_Mawile, - gMonFootprint_Meditite, - gMonFootprint_Medicham, - gMonFootprint_Swablu, - gMonFootprint_Altaria, - gMonFootprint_Wynaut, - gMonFootprint_Duskull, - gMonFootprint_Dusclops, - gMonFootprint_Roselia, - gMonFootprint_Slakoth, - gMonFootprint_Vigoroth, - gMonFootprint_Slaking, - gMonFootprint_Gulpin, - gMonFootprint_Swalot, - gMonFootprint_Tropius, - gMonFootprint_Whismur, - gMonFootprint_Loudred, - gMonFootprint_Exploud, - gMonFootprint_Clamperl, - gMonFootprint_Huntail, - gMonFootprint_Gorebyss, - gMonFootprint_Absol, - gMonFootprint_Shuppet, - gMonFootprint_Banette, - gMonFootprint_Seviper, - gMonFootprint_Zangoose, - gMonFootprint_Relicanth, - gMonFootprint_Aron, - gMonFootprint_Lairon, - gMonFootprint_Aggron, - gMonFootprint_Castform, - gMonFootprint_Volbeat, - gMonFootprint_Illumise, - gMonFootprint_Lileep, - gMonFootprint_Cradily, - gMonFootprint_Anorith, - gMonFootprint_Armaldo, - gMonFootprint_Ralts, - gMonFootprint_Kirlia, - gMonFootprint_Gardevoir, - gMonFootprint_Bagon, - gMonFootprint_Shelgon, - gMonFootprint_Salamence, - gMonFootprint_Beldum, - gMonFootprint_Metang, - gMonFootprint_Metagross, - gMonFootprint_Regirock, - gMonFootprint_Regice, - gMonFootprint_Registeel, - gMonFootprint_Kyogre, - gMonFootprint_Groudon, - gMonFootprint_Rayquaza, - gMonFootprint_Latias, - gMonFootprint_Latios, - gMonFootprint_Jirachi, - gMonFootprint_Deoxys, - gMonFootprint_Chimecho, - gMonFootprint_Bulbasaur, -}; -static const u8 gUnknown_083B5558[] = _("{CLEAR_TO 0}"); -const u8 gUnknown_083B555C[] = INCBIN_U8("graphics/unknown/unknown_3B555C.bin"); -static const struct OamData gOamData_83B557C = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static void *const gUnknown_083B5584[] = -{ - (void *)0x02008000, - (void *)0x0200C000, - (void *)0x02010000, - (void *)0x02014000, -}; -static const struct SpriteFrameImage gSpriteImageTable_83B5594[] = -{ - {(u8 *)0x02008000, 0x800}, - {(u8 *)0x02008800, 0x800}, - {(u8 *)0x02009000, 0x800}, - {(u8 *)0x02009800, 0x800}, - {(u8 *)0x0200A000, 0x800}, - {(u8 *)0x0200A800, 0x800}, - {(u8 *)0x0200B000, 0x800}, - {(u8 *)0x0200B800, 0x800}, - {(u8 *)0x0200C000, 0x800}, - {(u8 *)0x0200C800, 0x800}, - {(u8 *)0x0200D000, 0x800}, - {(u8 *)0x0200D800, 0x800}, - {(u8 *)0x0200E000, 0x800}, - {(u8 *)0x0200E800, 0x800}, - {(u8 *)0x0200F000, 0x800}, - {(u8 *)0x0200F800, 0x800}, -}; -static const struct SpriteFrameImage gSpriteImageTable_83B5614[] = -{ - {(u8 *)0x0200C000, 0x800}, - {(u8 *)0x0200C800, 0x800}, - {(u8 *)0x0200D000, 0x800}, - {(u8 *)0x0200D800, 0x800}, - {(u8 *)0x0200E000, 0x800}, - {(u8 *)0x0200E800, 0x800}, - {(u8 *)0x0200F000, 0x800}, - {(u8 *)0x0200F800, 0x800}, - {(u8 *)0x02010000, 0x800}, - {(u8 *)0x02010800, 0x800}, - {(u8 *)0x02011000, 0x800}, - {(u8 *)0x02011800, 0x800}, - {(u8 *)0x02012000, 0x800}, - {(u8 *)0x02012800, 0x800}, - {(u8 *)0x02013000, 0x800}, - {(u8 *)0x02013800, 0x800}, -}; -static const struct SpriteFrameImage gSpriteImageTable_83B5694[] = -{ - {(u8 *)0x02010000, 0x800}, - {(u8 *)0x02010800, 0x800}, - {(u8 *)0x02011000, 0x800}, - {(u8 *)0x02011800, 0x800}, - {(u8 *)0x02012000, 0x800}, - {(u8 *)0x02012800, 0x800}, - {(u8 *)0x02013000, 0x800}, - {(u8 *)0x02013800, 0x800}, - {(u8 *)0x02014000, 0x800}, - {(u8 *)0x02014800, 0x800}, - {(u8 *)0x02015000, 0x800}, - {(u8 *)0x02015800, 0x800}, - {(u8 *)0x02016000, 0x800}, - {(u8 *)0x02016800, 0x800}, - {(u8 *)0x02017000, 0x800}, - {(u8 *)0x02017800, 0x800}, -}; -static const struct SpriteFrameImage gSpriteImageTable_83B5714[] = -{ - {(u8 *)0x02014000, 0x800}, - {(u8 *)0x02014800, 0x800}, - {(u8 *)0x02015000, 0x800}, - {(u8 *)0x02015800, 0x800}, - {(u8 *)0x02016000, 0x800}, - {(u8 *)0x02016800, 0x800}, - {(u8 *)0x02017000, 0x800}, - {(u8 *)0x02017800, 0x800}, - {(u8 *)0x02018000, 0x800}, - {(u8 *)0x02018800, 0x800}, - {(u8 *)0x02019000, 0x800}, - {(u8 *)0x02019800, 0x800}, - {(u8 *)0x0201A000, 0x800}, - {(u8 *)0x0201A800, 0x800}, - {(u8 *)0x0201B000, 0x800}, - {(u8 *)0x0201B800, 0x800}, -}; -static const struct SpriteFrameImage *const gUnknown_083B5794[] = -{ - gSpriteImageTable_83B5594, - gSpriteImageTable_83B5614, - gSpriteImageTable_83B5694, - gSpriteImageTable_83B5714, -}; -static void nullsub_59(struct Sprite *); -static const struct SpriteTemplate gUnknown_083B57A4 = -{ - .tileTag = 0xFFFF, - .paletteTag = 0, - .oam = &gOamData_83B557C, - .anims = NULL, - .images = gSpriteImageTable_83B5594, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = nullsub_59, -}; -static const u8 gUnknown_083B57BC[][4] = -{ - {0, 0, 0, 0}, - {CHAR_A, 3, CHAR_a, 3}, - {CHAR_D, 3, CHAR_d, 3}, - {CHAR_G, 3, CHAR_g, 3}, - {CHAR_J, 3, CHAR_j, 3}, - {CHAR_M, 3, CHAR_m, 3}, - {CHAR_P, 3, CHAR_p, 3}, - {CHAR_S, 3, CHAR_s, 3}, - {CHAR_V, 3, CHAR_v, 3}, - {CHAR_Y, 2, CHAR_y, 2}, -}; -static const struct UnknownStruct3 gUnknown_083B57E4[] = -{ - {DexText_SearchForPoke, 0, 0, 5}, - {DexText_SwitchDex, 6, 0, 5}, - {DexText_ReturnToDex, 12, 0, 5}, -}; -static const struct UnknownStruct4 gUnknown_083B57FC[] = -{ - {DexText_ListByABC, 0, 2, 5, 5, 2, 12}, - {DexText_ListByColor, 0, 4, 5, 5, 4, 12}, - {DexText_ListByType, 0, 6, 5, 5, 6, 6}, - {DexText_ListByType, 0, 6, 5, 11, 6, 6}, - {DexText_SelectDexList, 0, 8, 5, 5, 8, 12}, - {DexText_SelectDexMode, 0, 10, 5, 5, 10, 12}, - {DexText_ExecuteSearchSwitch, 0, 12, 5, 0, 0, 0}, -}; -static const u8 gUnknown_083B5850[][4] = -{ - {0xFF, 0xFF, 0xFF, 1}, - {0xFF, 0xFF, 0, 2}, - {0xFF, 3, 1, 4}, - { 2, 0xFF, 1, 4}, - {0xFF, 0xFF, 2, 5}, - {0xFF, 0xFF, 4, 6}, - {0xFF, 0xFF, 5, 0xFF}, -}; -static const u8 gUnknown_083B586C[][4] = -{ - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 5}, - {0xFF, 0xFF, 4, 6}, - {0xFF, 0xFF, 5, 0xFF}, -}; -static const u8 gUnknown_083B5888[][4] = -{ - {0xFF, 0xFF, 0xFF, 1}, - {0xFF, 0xFF, 0, 2}, - {0xFF, 3, 1, 4}, - { 2, 0xFF, 1, 4}, - {0xFF, 0xFF, 2, 6}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 4, 0xFF}, -}; -static const u8 gUnknown_083B58A4[][4] = -{ - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 6}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 4, 0xFF}, -}; -static const struct UnknownStruct2 gUnknown_083B58C0[] = -{ - {DexText_HoennDex2, DexText_HoennDex}, - {DexText_NationalDex2, DexText_NationalDex}, - {NULL, NULL}, -}; -static const struct UnknownStruct2 gUnknown_083B58D8[] = -{ - {DexText_ListByNumber, DexText_NumericalMode}, - {DexText_ListByABC2, DexText_ABCMode}, - {DexText_ListByHeavyToLightest, DexText_HeaviestMode}, - {DexText_ListByLightToHeaviest, DexText_LightestMode}, - {DexText_ListByTallToSmallest, DexText_TallestMode}, - {DexText_ListBySmallToTallest, DexText_SmallestMode}, - {NULL, NULL}, -}; -static const struct UnknownStruct2 gUnknown_083B5910[] = -{ - {DexText_Terminator5, DexText_DontSpecify}, - {DexText_Terminator5, DexText_ABC}, - {DexText_Terminator5, DexText_DEF}, - {DexText_Terminator5, DexText_GHI}, - {DexText_Terminator5, DexText_JKL}, - {DexText_Terminator5, DexText_MNO}, - {DexText_Terminator5, DexText_PQR}, - {DexText_Terminator5, DexText_STU}, - {DexText_Terminator5, DexText_VWX}, - {DexText_Terminator5, DexText_YZ}, - {NULL, NULL}, -}; -static const struct UnknownStruct2 gUnknown_083B5968[] = -{ - {DexText_Terminator5, DexText_DontSpecify}, - {DexText_Terminator5, DexText_Red}, - {DexText_Terminator5, DexText_Blue}, - {DexText_Terminator5, DexText_Yellow}, - {DexText_Terminator5, DexText_Green}, - {DexText_Terminator5, DexText_Black}, - {DexText_Terminator5, DexText_Brown}, - {DexText_Terminator5, DexText_Purple}, - {DexText_Terminator5, DexText_Gray}, - {DexText_Terminator5, DexText_White}, - {DexText_Terminator5, DexText_Pink}, - {NULL, NULL}, -}; -static const struct UnknownStruct2 gUnknown_083B59C8[] = -{ - {DexText_Terminator5, DexText_None}, - {DexText_Terminator5, gTypeNames[TYPE_NORMAL]}, - {DexText_Terminator5, gTypeNames[TYPE_FIGHTING]}, - {DexText_Terminator5, gTypeNames[TYPE_FLYING]}, - {DexText_Terminator5, gTypeNames[TYPE_POISON]}, - {DexText_Terminator5, gTypeNames[TYPE_GROUND]}, - {DexText_Terminator5, gTypeNames[TYPE_ROCK]}, - {DexText_Terminator5, gTypeNames[TYPE_BUG]}, - {DexText_Terminator5, gTypeNames[TYPE_GHOST]}, - {DexText_Terminator5, gTypeNames[TYPE_STEEL]}, - {DexText_Terminator5, gTypeNames[TYPE_FIRE]}, - {DexText_Terminator5, gTypeNames[TYPE_WATER]}, - {DexText_Terminator5, gTypeNames[TYPE_GRASS]}, - {DexText_Terminator5, gTypeNames[TYPE_ELECTRIC]}, - {DexText_Terminator5, gTypeNames[TYPE_PSYCHIC]}, - {DexText_Terminator5, gTypeNames[TYPE_ICE]}, - {DexText_Terminator5, gTypeNames[TYPE_DRAGON]}, - {DexText_Terminator5, gTypeNames[TYPE_DARK]}, - {NULL, NULL}, -}; -static const u8 gUnknown_083B5A60[] = {0, 1}; -static const u8 gUnknown_083B5A62[] = {0, 1, 2, 3, 4, 5}; -static const u8 gUnknown_083B5A68[] = {0xFF, 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17}; -static const struct UnknownStruct1 gUnknown_083B5A7C[] = -{ - {gUnknown_083B5910, 6, 7, 10}, - {gUnknown_083B5968, 8, 9, 11}, - {gUnknown_083B59C8, 10, 11, 18}, - {gUnknown_083B59C8, 12, 13, 18}, - {gUnknown_083B58D8, 4, 5, 6}, - {gUnknown_083B58C0, 2, 3, 2}, -}; -static const u8 gUnknown_083B5AAC[] = _("{STR_VAR_1}{CLEAR_TO 43}"); -static const u8 gUnknown_083B5AB2[] = _("{STR_VAR_1}{CLEAR_TO 96}"); - -static void MainCB(void); -static void Task_PokedexShowMainScreen(u8 taskId); -static void Task_PokedexMainScreen(u8 taskId); -static void sub_808C898(u8 taskId); -static void Task_PokedexMainScreenMenu(u8 taskId); -static void sub_808CA64(u8 taskId); -static void sub_808CAE4(u8 taskId); -static void sub_808CB8C(u8 taskId); -static void Task_ClosePokedex(u8 taskId); -static void sub_808CCC4(u8 taskId); -static void Task_PokedexResultsScreen(u8 taskId); -static void sub_808CEF8(u8 taskId); -static void Task_PokedexResultsScreenMenu(u8 taskId); -static void sub_808D118(u8 taskId); -static void sub_808D198(u8 taskId); -static void Task_PokedexResultsScreenReturnToMainScreen(u8 taskId); -static void Task_PokedexResultsScreenExitPokedex(u8 taskId); -static bool8 sub_808D344(u8 a); -static void sub_808D640(void); -static void SortPokedex(u8 dexMode, u8 sortMode); -static void sub_808DEB0(u16 a, u8 b, u8 c, u16 d); -static void sub_808DF88(u16 a, u8 b, u8 c, u16 d); -static u8 sub_808DFE4(u16 num, u8 b, u8 c); -static void sub_808E090(u8 a, u8 b, u16 c); -static void sub_808E0CC(u16 a, u16 b); -static bool8 sub_808E208(u8 a, u8 b, u8 c); -static u16 sub_808E48C(u16 a, u16 b); -static void sub_808E6BC(void); -static u8 sub_808E71C(void); -static u8 sub_808E82C(void); -static u16 sub_808E888(u16 a1); -static u32 sub_808E8C8(u16 a, s16 b, s16 c); -static void sub_808E978(u8 a); -static void sub_808EDB8(struct Sprite *sprite); -static void sub_808EE28(struct Sprite *sprite); -static u8 sub_808F210(struct PokedexListItem *, u8); -static bool8 sub_808F250(u8 taskId); -static u8 sub_808F284(struct PokedexListItem *, u8); -static void Task_InitPageScreenMultistep(u8 taskId); -static void Task_PageScreenProcessInput(u8 taskId); -static void sub_808F888(u8 taskId); -static void Task_ClosePageScreen(u8 taskId); -static void Task_InitAreaScreenMultistep(u8 taskId); -static void Task_AreaScreenProcessInput(u8 taskId); -static void sub_808FA00(u8 taskId); -static void Task_InitCryScreenMultistep(u8 taskId); -static void Task_CryScreenProcessInput(u8 taskId); -static void sub_808FFBC(u8 taskId); -static void sub_8090040(u8 a); -static void Task_InitSizeScreenMultistep(u8 taskId); -static void Task_SizeScreenProcessInput(u8 taskId); -static void sub_8090498(u8 taskId); -static void sub_80904FC(u16 a); -static void sub_8090540(u16 a); -static void sub_8090584(u8 a, u16 b); -static void sub_8090644(u8 a, u16 b); -static void sub_8090750(u8); -static void sub_8090A3C(u8); -static void sub_8090B8C(u8); -static void sub_8090C28(struct Sprite *); -static void sub_8090C68(void); -static void sub_8091060(u16); -static void sub_8091154(u16 order, u8, u8); -static u8 sub_80911C8(u16 num, u8, u8); -static u8 sub_8091260(u16 num, u8, u8, u8); -static void sub_8091304(const u8 *name, u8, u8); -static void sub_8091458(u16 height, u8 i, u8 i1); -static void sub_8091564(u16 weight, u8 i, u8 i1); -static void sub_8091738(u16, u16, u16); -static void sub_80917CC(u16 i, u16 i1); -static u16 sub_8091818(u8, u16, u16, u16); -static u16 sub_80918EC(u16 a, s16 b, s16 c, u16 d); -static u8 sub_8091A4C(u16 gender, s16, s16, u16); -static void sub_8091E54(u8); -static void sub_809204C(u8); -static void sub_809207C(u8); -static void sub_809217C(u8); -static void sub_80921B0(u8); -static void sub_80923FC(u8); -static void sub_80924A4(u8); -static void sub_8092508(u8); -static void sub_80925CC(u8); -static void sub_8092644(u8); -static void sub_80927B8(u8); -static void sub_80927F0(u8); -static void sub_8092AB0(u8); -static void sub_8092AD4(u8, u8); -static void sub_8092B68(u8); -static void sub_8092C8C(u8); -static void sub_8092D78(u8); -static u8 sub_8092E10(u8, u8); -static void sub_8092EB0(u8); -static void sub_809308C(u8); - - -void ResetPokedex(void) -{ - u16 i; - - gUnknown_0202FFB8 = 0; - gUnknown_0202FFBA = 0x40; - gUnknown_03005CE8 = 0; - gSaveBlock2.pokedex.unknown1 = 0; - gSaveBlock2.pokedex.order = 0; - gSaveBlock2.pokedex.nationalMagic = 0; - gSaveBlock2.pokedex.unknown2 = 0; - gSaveBlock2.pokedex.unownPersonality = 0; - gSaveBlock2.pokedex.spindaPersonality = 0; - gSaveBlock2.pokedex.unknown3 = 0; - DisableNationalPokedex(); - for (i = 0; i <= 51; i++) - { - gSaveBlock2.pokedex.owned[i] = 0; - gSaveBlock2.pokedex.seen[i] = 0; - gSaveBlock1.unk938[i] = 0; - gSaveBlock1.unk3A8C[i] = 0; - } -} - -void sub_808C0A0(void) -{ - gUnknown_0202FFB8 = 0; - gUnknown_0202FFBA = 0x40; -} - -static void sub_808C0B8(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void ClearPokedexView(struct PokedexView *pokedexView) -{ - u16 i; - - for (i = 0; i < NATIONAL_DEX_COUNT; i++) - { - pokedexView->unk0[i].dexNum |= 0xFFFF; - pokedexView->unk0[i].seen = 0; - pokedexView->unk0[i].owned = 0; - } - pokedexView->unk608 = 0; - pokedexView->unk60A_1 = 0; - pokedexView->unk60A_2 = 0; - pokedexView->pokemonListCount = 0; - pokedexView->selectedPokemon = 0; - pokedexView->unk610 = 0; - pokedexView->dexMode = 0; - pokedexView->unk614 = 0; - pokedexView->dexOrder = 0; - pokedexView->unk618 = 0; - pokedexView->unk61A = 0; - pokedexView->unk61C = 0; - for (i = 0; i <= 3; i++) - pokedexView->unk61E[i] |= 0xFFFF; - pokedexView->unk628 = 0; - pokedexView->unk62A = 0; - pokedexView->unk62C = 0; - pokedexView->unk62D = 0; - pokedexView->unk62E = 0; - pokedexView->unk62F = 0; - pokedexView->unk630 = 0; - pokedexView->unk632 = 0; - pokedexView->unk634 = 0; - pokedexView->unk636 = 0; - pokedexView->unk638 = 0; - for (i = 0; i <= 3; i++) - pokedexView->unk63A[i] = 0; - pokedexView->unk64A = 0; - pokedexView->unk64B = 0; - pokedexView->unk64C_1 = 0; - pokedexView->selectedScreen = 0; - pokedexView->unk64F = 0; - pokedexView->menuIsOpen = 0; - pokedexView->menuCursorPos = 0; - pokedexView->menuY = 0; - for (i = 0; i <= 7; i++) - pokedexView->unk656[i] = 0; - for (i = 0; i <= 7; i++) - pokedexView->unk65E[i] = 0; -} - -void CB2_InitPokedex(void) -{ - switch (gMain.state) - { - case 0: - default: - { - u8 *addr; - u32 size; - - SetVBlankCallback(NULL); - sub_8091060(0); - 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; - } - } - DmaClear32(3, OAM, OAM_SIZE); - DmaClear16(3, PLTT, PLTT_SIZE); - gMain.state = 1; - } - break; - case 1: - remove_some_task(); - ResetTasks(); - ResetSpriteData(); - ResetPaletteFade(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 8; - SetUpWindowConfig(&gWindowConfig_81E7048); - InitMenuWindow(&gWindowConfig_81E7048); - gMain.state++; - break; - case 2: - switch (Random() & 3) - { - case 0: - default: - gPokedexView = (struct PokedexView *)0x02018000; - break; - case 1: - gPokedexView = (struct PokedexView *)0x02018800; - break; - case 2: - gPokedexView = (struct PokedexView *)0x02019000; - break; - case 3: - gPokedexView = (struct PokedexView *)0x02019800; - break; - } - ClearPokedexView(gPokedexView); - CreateTask(Task_PokedexShowMainScreen, 0); - gPokedexView->dexMode = gSaveBlock2.pokedex.unknown1; - if (!IsNationalPokedexEnabled()) - gPokedexView->dexMode = DEX_MODE_HOENN; - gPokedexView->dexOrder = gSaveBlock2.pokedex.order; - gPokedexView->selectedPokemon = gUnknown_0202FFB8; - gPokedexView->unk62C = gUnknown_0202FFBA; - gPokedexView->selectedScreen = PAGE_SCREEN; - gPokedexView->descriptionPageNum = 0; - if (!IsNationalPokedexEnabled()) - { - gPokedexView->unk61A = GetHoennPokedexCount(0); - gPokedexView->unk61C = GetHoennPokedexCount(1); - } - else - { - gPokedexView->unk61A = GetNationalPokedexCount(0); - gPokedexView->unk61C = GetNationalPokedexCount(1); - } - gPokedexView->unk62D = 8; - gMain.state++; - break; - case 3: - { - u16 savedIme; - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= 1; - REG_IME = savedIme; - REG_DISPSTAT |= 8; - SetVBlankCallback(sub_808C0B8); - SetMainCallback2(MainCB); - SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder); - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x80); - } - break; - } -} - -u8 unref_sub_808C540(void (*func)(u8)) -{ - u16 savedIme; - u8 taskId; - - SetVBlankCallback(NULL); - sub_8091060(0x200); - remove_some_task(); - ResetTasks(); - ResetPaletteFade(); - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= 1; - REG_IME = savedIme; - REG_DISPSTAT |= 0x8; - SetVBlankCallback(sub_808C0B8); - SetMainCallback2(MainCB); - if (!gPokedexView->unk64B) - taskId = CreateTask(sub_808CAE4, 0); - else - taskId = CreateTask(sub_808D198, 0); - gTasks[taskId].data[0] = CreateTask(func, 0); - return gTasks[taskId].data[0]; -} - -static void MainCB(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void Task_PokedexShowMainScreen(u8 taskId) -{ - gPokedexView->unk64C_1 = 0; - if (sub_808D344(0)) - gTasks[taskId].func = Task_PokedexMainScreen; -} - -//Hide menu and process input on main screen -void Task_PokedexMainScreen(u8 taskId) -{ - REG_BG0VOFS = gPokedexView->menuY; - - //If menu is open, slide it down, off screen - if (gPokedexView->menuY) - gPokedexView->menuY -= 8; - else - { - if ((gMain.newKeys & A_BUTTON) && gPokedexView->unk0[gPokedexView->selectedPokemon].seen) - { - sub_808E6BC(); - BeginNormalPaletteFade( - ~(1 << (gSprites[gPokedexView->selectedMonSpriteId].oam.paletteNum + 16)), - 0, 0, 0x10, 0); - gSprites[gPokedexView->selectedMonSpriteId].callback = sub_808EDB8; - gTasks[taskId].func = sub_808CA64; - PlaySE(SE_PIN); - } - else if (gMain.newKeys & START_BUTTON) - { - //Open menu - gPokedexView->menuY = 0; - gPokedexView->menuIsOpen = 1; - gPokedexView->menuCursorPos = 0; - gTasks[taskId].func = Task_PokedexMainScreenMenu; - PlaySE(SE_SELECT); - } - else if (gMain.newKeys & SELECT_BUTTON) - { - PlaySE(SE_SELECT); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].data[0] = sub_8091E3C(); - gPokedexView->unk64F = 0; - gPokedexView->unk62A = gPokedexView->unk62C; - gPokedexView->unk610 = gPokedexView->selectedPokemon; - gPokedexView->unk614 = gPokedexView->dexMode; - gPokedexView->unk618 = gPokedexView->dexOrder; - gTasks[taskId].func = sub_808CB8C; - PlaySE(SE_PC_LOGON); - } - else if (gMain.newKeys & B_BUTTON) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_ClosePokedex; - PlaySE(SE_PC_OFF); - } - else - { - //Handle D-pad - gPokedexView->selectedPokemon = sub_808E48C(gPokedexView->selectedPokemon, 0xE); - if (gPokedexView->unk62E) - gTasks[taskId].func = sub_808C898; - } - } -} - -static void sub_808C898(u8 taskId) -{ - if (sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636)) - gTasks[taskId].func = Task_PokedexMainScreen; -} - -//Bring up menu and process menu input -static void Task_PokedexMainScreenMenu(u8 taskId) -{ - REG_BG0VOFS = gPokedexView->menuY; - - //If menu is not open, slide it up, on screen - if (gPokedexView->menuY != 80) - gPokedexView->menuY += 8; - else - { - if (gMain.newKeys & A_BUTTON) - { - switch (gPokedexView->menuCursorPos) - { - case 0: //BACK TO LIST - default: - gMain.newKeys |= START_BUTTON; //Exit menu - break; - case 1: //LIST TOP - gPokedexView->selectedPokemon = 0; - gPokedexView->unk62C = 0x40; - sub_808E82C(); - sub_808E0CC(gPokedexView->selectedPokemon, 0xE); - gMain.newKeys |= START_BUTTON; //Exit menu - break; - case 2: //LIST BOTTOM - gPokedexView->selectedPokemon = gPokedexView->pokemonListCount - 1; - gPokedexView->unk62C = gPokedexView->pokemonListCount * 16 + 0x30; - sub_808E82C(); - sub_808E0CC(gPokedexView->selectedPokemon, 0xE); - gMain.newKeys |= START_BUTTON; //Exit menu - break; - case 3: //CLOSE POKEDEX - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_ClosePokedex; - PlaySE(SE_PC_OFF); - break; - } - } - - //Exit menu when Start or B is pressed - if (gMain.newKeys & (START_BUTTON | B_BUTTON)) - { - gPokedexView->menuIsOpen = 0; - gTasks[taskId].func = Task_PokedexMainScreen; - PlaySE(SE_SELECT); - } - else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gPokedexView->menuCursorPos != 0) - { - gPokedexView->menuCursorPos--; - PlaySE(SE_SELECT); - } - else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gPokedexView->menuCursorPos <= 2) - { - gPokedexView->menuCursorPos++; - PlaySE(SE_SELECT); - } - } -} - -static void sub_808CA64(u8 taskId) -{ - if (gSprites[gPokedexView->selectedMonSpriteId].pos1.x == 48 - && gSprites[gPokedexView->selectedMonSpriteId].pos1.y == 56) - { - gPokedexView->unk64B = gPokedexView->unk64A; - gTasks[taskId].data[0] = sub_808F210(&gPokedexView->unk0[gPokedexView->selectedPokemon], gPokedexView->selectedMonSpriteId); - gTasks[taskId].func = sub_808CAE4; - } -} - -static void sub_808CAE4(u8 taskId) -{ - if (gTasks[gTasks[taskId].data[0]].isActive) - { - if (gPokedexView->unk64A == 1 && !sub_808F250(gTasks[taskId].data[0]) && sub_808E71C()) - sub_808F284(&gPokedexView->unk0[gPokedexView->selectedPokemon], gTasks[taskId].data[0]); - } - else - { - gUnknown_0202FFB8 = gPokedexView->selectedPokemon; - gUnknown_0202FFBA = gPokedexView->unk62C; - gTasks[taskId].func = Task_PokedexShowMainScreen; - } -} - -static void sub_808CB8C(u8 taskId) -{ - bool8 isActive = gTasks[gTasks[taskId].data[0]].isActive; - - if (!isActive) - { - if (gPokedexView->unk64F != 0) - { - gPokedexView->selectedPokemon = isActive; - gPokedexView->unk62C = 0x40; - gTasks[taskId].func = sub_808CCC4; - } - else - { - gPokedexView->unk62C = gPokedexView->unk62A; - gPokedexView->selectedPokemon = gPokedexView->unk610; - gPokedexView->dexMode = gPokedexView->unk614; - if (!IsNationalPokedexEnabled()) - gPokedexView->dexMode = DEX_MODE_HOENN; - gPokedexView->dexOrder = gPokedexView->unk618; - gTasks[taskId].func = Task_PokedexShowMainScreen; - } - } -} - -static void Task_ClosePokedex(u8 taskId) -{ - if (!gPaletteFade.active) - { - gSaveBlock2.pokedex.unknown1 = gPokedexView->dexMode; - if (!IsNationalPokedexEnabled()) - gSaveBlock2.pokedex.unknown1 = 0; - gSaveBlock2.pokedex.order = gPokedexView->dexOrder; - DestroyTask(taskId); - SetMainCallback2(sub_805469C); - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); - } -} - -static void sub_808CCC4(u8 taskId) -{ - gPokedexView->unk64C_1 = 1; - if (sub_808D344(3)) - gTasks[taskId].func = Task_PokedexResultsScreen; -} - -static void Task_PokedexResultsScreen(u8 taskId) -{ - REG_BG0VOFS = gPokedexView->menuY; - - if (gPokedexView->menuY) - { - gPokedexView->menuY -= 8; - } - else - { - if ((gMain.newKeys & A_BUTTON) && gPokedexView->unk0[gPokedexView->selectedPokemon].seen) - { - u32 a; - - sub_808E6BC(); - a = (1 << (gSprites[gPokedexView->selectedMonSpriteId].oam.paletteNum + 16)); - gSprites[gPokedexView->selectedMonSpriteId].callback = sub_808EDB8; - BeginNormalPaletteFade(~a, 0, 0, 0x10, 0); - gTasks[taskId].func = sub_808D118; - PlaySE(SE_PIN); - } - else if (gMain.newKeys & START_BUTTON) - { - gPokedexView->menuY = 0; - gPokedexView->menuIsOpen = 1; - gPokedexView->menuCursorPos = 0; - gTasks[taskId].func = Task_PokedexResultsScreenMenu; - PlaySE(SE_SELECT); - } - else if (gMain.newKeys & SELECT_BUTTON) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].data[0] = sub_8091E3C(); - gPokedexView->unk64F = 0; - gTasks[taskId].func = sub_808CB8C; - PlaySE(SE_PC_LOGON); - } - else if (gMain.newKeys & B_BUTTON) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen; - PlaySE(SE_PC_OFF); - } - else - { - //Handle D-pad - gPokedexView->selectedPokemon = sub_808E48C(gPokedexView->selectedPokemon, 0xE); - if (gPokedexView->unk62E) - gTasks[taskId].func = sub_808CEF8; - } - } -} - -static void sub_808CEF8(u8 taskId) -{ - if (sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636)) - gTasks[taskId].func = Task_PokedexResultsScreen; -} - -static void Task_PokedexResultsScreenMenu(u8 taskId) -{ - REG_BG0VOFS = gPokedexView->menuY; - - if (gPokedexView->menuY != 96) - { - gPokedexView->menuY += 8; - } - else - { - if (gMain.newKeys & A_BUTTON) - { - switch (gPokedexView->menuCursorPos) - { - case 0: //BACK TO LIST - default: - gMain.newKeys |= START_BUTTON; - break; - case 1: //LIST TOP - gPokedexView->selectedPokemon = 0; - gPokedexView->unk62C = 0x40; - sub_808E82C(); - sub_808E0CC(gPokedexView->selectedPokemon, 0xE); - gMain.newKeys |= START_BUTTON; - break; - case 2: //LIST BOTTOM - gPokedexView->selectedPokemon = gPokedexView->pokemonListCount - 1; - gPokedexView->unk62C = gPokedexView->pokemonListCount * 16 + 0x30; - sub_808E82C(); - sub_808E0CC(gPokedexView->selectedPokemon, 0xE); - gMain.newKeys |= START_BUTTON; - break; - case 3: //BACK TO POKEDEX - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen; - PlaySE(SE_TRACK_DOOR); - break; - case 4: //CLOSE POKEDEX - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_PokedexResultsScreenExitPokedex; - PlaySE(SE_PC_OFF); - break; - } - } - - //Exit menu when Start or B is pressed - if (gMain.newKeys & (START_BUTTON | B_BUTTON)) - { - gPokedexView->menuIsOpen = 0; - gTasks[taskId].func = Task_PokedexResultsScreen; - PlaySE(SE_SELECT); - } - else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gPokedexView->menuCursorPos) - { - gPokedexView->menuCursorPos--; - PlaySE(SE_SELECT); - } - else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gPokedexView->menuCursorPos <= 3) - { - gPokedexView->menuCursorPos++; - PlaySE(SE_SELECT); - } - } -} - -static void sub_808D118(u8 taskId) -{ - if (gSprites[gPokedexView->selectedMonSpriteId].pos1.x == 48 - && gSprites[gPokedexView->selectedMonSpriteId].pos1.y == 56) - { - gPokedexView->unk64B = gPokedexView->unk64A; - gTasks[taskId].data[0] = sub_808F210(&gPokedexView->unk0[gPokedexView->selectedPokemon], gPokedexView->selectedMonSpriteId); - gTasks[taskId].func = sub_808D198; - } -} - -static void sub_808D198(u8 taskId) -{ - if (gTasks[gTasks[taskId].data[0]].isActive) - { - if (gPokedexView->unk64A == 1 && !sub_808F250(gTasks[taskId].data[0]) && sub_808E71C()) - sub_808F284(&gPokedexView->unk0[gPokedexView->selectedPokemon], gTasks[taskId].data[0]); - } - else - { - gTasks[taskId].func = sub_808CCC4; - } -} - -static void Task_PokedexResultsScreenReturnToMainScreen(u8 taskId) -{ - if (!gPaletteFade.active) - { - gPokedexView->unk62C = gPokedexView->unk62A; - gPokedexView->selectedPokemon = gPokedexView->unk610; - gPokedexView->dexMode = gPokedexView->unk614; - if (!IsNationalPokedexEnabled()) - gPokedexView->dexMode = DEX_MODE_HOENN; - gPokedexView->dexOrder = gPokedexView->unk618; - gTasks[taskId].func = Task_PokedexShowMainScreen; - } -} - -static void Task_PokedexResultsScreenExitPokedex(u8 taskId) -{ - if (!gPaletteFade.active) - { - gPokedexView->unk62C = gPokedexView->unk62A; - gPokedexView->selectedPokemon = gPokedexView->unk610; - gPokedexView->dexMode = gPokedexView->unk614; - if (!IsNationalPokedexEnabled()) - gPokedexView->dexMode = DEX_MODE_HOENN; - gPokedexView->dexOrder = gPokedexView->unk618; - gTasks[taskId].func = Task_ClosePokedex; - } -} - -static bool8 sub_808D344(u8 a) -{ - switch (gMain.state) - { - case 0: - default: - if (gPaletteFade.active) - return 0; - SetVBlankCallback(NULL); - gPokedexView->unk64A = a; - sub_8091060(0); - REG_BG2VOFS = gPokedexView->unk62D; - LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM)); - LZ77UnCompVram(gUnknown_08E96738, (void *)(VRAM + 0x6800)); - LZ77UnCompVram(gUnknown_08E9C6DC, (void *)(VRAM + 0x7800)); - DmaClear16(3, VRAM + 0x6000, 0x500); - if (a == 0) - LZ77UnCompVram(gUnknown_08E96888, (void *)(VRAM + 0x6500)); - else - LZ77UnCompVram(gUnknown_08E96994, (void *)(VRAM + 0x6500)); - ResetPaletteFade(); - if (a == 0) - gPokedexView->unk64C_1 = 0; - else - gPokedexView->unk64C_1 = 1; - sub_808D640(); - gMain.state = 1; - break; - case 1: - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 8; - LoadCompressedObjectPic(&gUnknown_083A05CC[0]); - LoadSpritePalettes(gUnknown_083A05DC); - sub_808E978(a); - gMain.state++; - break; - case 2: - SetUpWindowConfig(&gWindowConfig_81E7048); - InitMenuWindow(&gWindowConfig_81E7048); - LZ77UnCompVram(gUnknown_0839FA7C, (void *)(VRAM + 0xFF80)); - gMain.state++; - break; - case 3: - if (a == 0) - SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder); - sub_808E0CC(gPokedexView->selectedPokemon, 0xE); - gPokedexView->menuIsOpen = 0; - gPokedexView->menuY = 0; - gMain.state++; - break; - case 4: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - SetVBlankCallback(sub_808C0B8); - gMain.state++; - break; - case 5: - REG_WININ = 0x3F3F; - REG_WINOUT = 0x1D3F; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(12) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_OBJWIN_ON; - gMain.state++; - break; - case 6: - if (!gPaletteFade.active) - { - gMain.state = 0; - return TRUE; - } - break; - } - return FALSE; -} - -static void sub_808D640(void) -{ - if (gPokedexView->unk64C_1) - LoadPalette(sPokedexSearchPalette + 1, 1, sizeof(sPokedexSearchPalette) - sizeof(u16)); - else if (!IsNationalPokedexEnabled()) - LoadPalette(gPokedexMenu_Pal + 1, 1, 0xBE); - else - LoadPalette(sNationalPokedexPalette + 1, 1, sizeof(sNationalPokedexPalette) - sizeof(u16)); -} - -static void SortPokedex(u8 dexMode, u8 sortMode) -{ - u16 vars[3]; //I have no idea why three regular variables are stored in an array, but whatever. - s16 i; - - gPokedexView->pokemonListCount = 0; - - switch (dexMode) - { - default: - case DEX_MODE_HOENN: - vars[0] = 202; - vars[1] = 1; - break; - case DEX_MODE_NATIONAL: - if (IsNationalPokedexEnabled()) - { - vars[0] = NATIONAL_DEX_COUNT; - vars[1] = 0; - } - else - { - vars[0] = 202; - vars[1] = 1; - } - break; - } - - switch (sortMode) - { - case 0: - if (vars[1]) - { - for (i = 0; i < vars[0]; i++) - { - vars[2] = HoennToNationalOrder(i + 1); - gPokedexView->unk0[i].dexNum = vars[2]; - gPokedexView->unk0[i].seen = GetNationalPokedexFlag(vars[2], 0); - gPokedexView->unk0[i].owned = GetNationalPokedexFlag(vars[2], 1); - if (gPokedexView->unk0[i].seen) - gPokedexView->pokemonListCount = i + 1; - } - } - else - { - bool32 r10; - s16 r5; - - r10 = r5 = i = 0; - for (i = 0; i < vars[0]; i++) - { - vars[2] = i + 1; - if (GetNationalPokedexFlag(vars[2], 0)) - r10 = 1; - if (r10) - { - asm(""); //Needed to match for some reason - gPokedexView->unk0[r5].dexNum = vars[2]; - gPokedexView->unk0[r5].seen = GetNationalPokedexFlag(vars[2], 0); - gPokedexView->unk0[r5].owned = GetNationalPokedexFlag(vars[2], 1); - if (gPokedexView->unk0[r5].seen) - gPokedexView->pokemonListCount = r5 + 1; - r5++; - } - } - } - break; - case 1: - for (i = 0; i < 411; i++) - { - vars[2] = gPokedexOrder_Alphabetical[i]; - - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 0)) - { - gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; - gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; - gPokedexView->unk0[gPokedexView->pokemonListCount].owned = GetNationalPokedexFlag(vars[2], 1); - gPokedexView->pokemonListCount++; - } - } - break; - case 2: - for (i = NATIONAL_DEX_COUNT - 1; i >= 0; i--) - { - vars[2] = gPokedexOrder_Weight[i]; - - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) - { - gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; - gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; - gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; - gPokedexView->pokemonListCount++; - } - } - break; - case 3: - for (i = 0; i < NATIONAL_DEX_COUNT; i++) - { - vars[2] = gPokedexOrder_Weight[i]; - - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) - { - gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; - gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; - gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; - gPokedexView->pokemonListCount++; - } - } - break; - case 4: - for (i = NATIONAL_DEX_COUNT - 1; i >=0; i--) - { - vars[2] = gPokedexOrder_Height[i]; - - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) - { - gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; - gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; - gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; - gPokedexView->pokemonListCount++; - } - } - break; - case 5: - for (i = 0; i < NATIONAL_DEX_COUNT; i++) - { - vars[2] = gPokedexOrder_Height[i]; - - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) - { - gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; - gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; - gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; - gPokedexView->pokemonListCount++; - } - } - break; - } - - for (i = gPokedexView->pokemonListCount; i < NATIONAL_DEX_COUNT; i++) - { - gPokedexView->unk0[i].dexNum |= 0xFFFF; - gPokedexView->unk0[i].seen = 0; - gPokedexView->unk0[i].owned = 0; - } -} - -static void sub_808DBE8(u8 a, u16 b, u16 c) -{ - s16 _b; - u16 i; - u16 r2; - - switch (a) - { - case 0: - default: - _b = b - 5; - for (i = 0; i <= 10; i++) - { - if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gPokedexView->unk0[_b].dexNum == 0xFFFF) - { - sub_808E090(0x11, i * 2, c); - } - else - { - sub_808E090(0x11, i * 2, c); - if (gPokedexView->unk0[_b].seen) - { - sub_808DEB0(_b, 0x12, i * 2, c); - sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, i * 2, c); - sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, i * 2); - } - else - { - sub_808DEB0(_b, 0x12, i * 2, c); - sub_808DF88(0, 0x11, i * 2, c); - sub_808DFE4(0, 0x17, i * 2); - } - } - _b++; - } - break; - case 1: - _b = b - 5; - if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gPokedexView->unk0[_b].dexNum == 0xFFFF) - { - sub_808E090(0x11, gPokedexView->unk630 * 2, c); - } - else - { - sub_808E090(0x11, gPokedexView->unk630 * 2, c); - if (gPokedexView->unk0[_b].seen) - { - sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c); - sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, gPokedexView->unk630 * 2, c); - sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, gPokedexView->unk630 * 2); - } - else - { - sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c); - sub_808DF88(0, 0x11, gPokedexView->unk630 * 2, c); - sub_808DFE4(0, 0x17, gPokedexView->unk630 * 2); - } - } - break; - case 2: - _b = b + 5; - r2 = gPokedexView->unk630 + 10; - if (r2 > 15) - r2 -= 16; - if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gPokedexView->unk0[_b].dexNum == 0xFFFF) - sub_808E090(0x11, r2 * 2, c); - else - { - sub_808E090(0x11, r2 * 2, c); - if (gPokedexView->unk0[_b].seen) - { - sub_808DEB0(_b, 0x12, r2 * 2, c); - sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, r2 * 2, c); - sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, r2 * 2); - } - else - { - sub_808DEB0(_b, 0x12, r2 * 2, c); - sub_808DF88(0, 0x11, r2 * 2, c); - sub_808DFE4(0, 0x17, r2 * 2); - } - } - break; - } -} - -static void sub_808DEB0(u16 a, u8 b, u8 c, u16 d) -{ - u8 text[4]; - u16 unk[2]; - u16 r7 = gPokedexView->unk0[a].dexNum; - - if (gPokedexView->dexMode == DEX_MODE_HOENN) - r7 = NationalToHoennOrder(r7); - unk[0] = 0x3FC; - unk[1] = 0x3FD; - text[0] = CHAR_0 + r7 / 100; - text[1] = CHAR_0 + (r7 % 100) / 10; - text[2] = CHAR_0 + (r7 % 100) % 10; - text[3] = EOS; - *(u16 *)(VRAM + d * 0x800 + c * 0x40 + b * 2) = unk[0]; - *(u16 *)(VRAM + d * 0x800 + (c + 1) * 0x40 + b * 2) = unk[1]; - MenuPrint(text, b - 15, c); -} - -static void sub_808DF88(u16 a, u8 b, u8 c, u16 d) -{ - u16 unk[2]; - - if (a) - { - unk[0] = 0x3FE; - unk[1] = 0x3FF; - } - else - { - unk[0] = 0; - unk[1] = 0; - } - *(u16 *)(VRAM + d * 0x800 + c * 0x40 + b * 2) = unk[0]; - *(u16 *)(VRAM + d * 0x800 + (c + 1) * 0x40 + b * 2) = unk[1]; -} - -static u8 sub_808DFE4(u16 num, u8 b, u8 c) -{ - u8 text[10]; - u8 i; - - for (i = 0; i < 10; i++) - text[i] = CHAR_SPACE; - text[i] = EOS; - - num = NationalPokedexNumToSpecies(num); - switch (num) - { - default: - for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) - text[i] = gSpeciesNames[num][i]; - break; - case 0: - for (i = 0; i < 10; i++) - text[i] = CHAR_HYPHEN; - break; - } - MenuPrint_PixelCoords(text, (b - 0x11) * 8 + 0xFC, c * 8, 0); - return i; -} - -static void sub_808E090(u8 a, u8 b, u16 c) -{ - u8 i; - - for (i = 0; i < 12; i++) - { - *(u16 *)(VRAM + c * 0x800 + b * 64 + (a + i) * 2) = 0; - *(u16 *)(VRAM + c * 0x800 + (b + 1) * 64 + (a + i) * 2) = 0; - } -} - -static void sub_808E0CC(u16 a, u16 b) -{ - u8 i; - u16 unk; - u8 spriteId; - - for (i = 0; i < 4; i++) - gPokedexView->unk61E[i] = 0xFFFF; - gPokedexView->selectedMonSpriteId = 0xFFFF; - sub_808DBE8(0, a, b); - REG_BG2VOFS = gPokedexView->unk62D; - - unk = sub_808E888(a - 1); - if (unk != 0xFFFF) - { - spriteId = sub_808E8C8(unk, 0x60, 0x50); - gSprites[spriteId].callback = sub_808EE28; - gSprites[spriteId].data5 = -32; - } - - unk = sub_808E888(a); - if (unk != 0xFFFF) - { - spriteId = sub_808E8C8(unk, 0x60, 0x50); - gSprites[spriteId].callback = sub_808EE28; - gSprites[spriteId].data5 = 0; - } - - unk = sub_808E888(a + 1); - if (unk != 0xFFFF) - { - spriteId = sub_808E8C8(unk, 0x60, 0x50); - gSprites[spriteId].callback = sub_808EE28; - gSprites[spriteId].data5 = 32; - } - - gPokedexView->unk630 = 0; - gPokedexView->unk632 = 0; -} - -static bool8 sub_808E208(u8 a, u8 b, u8 c) -{ - u16 i; - u8 foo; - - if (gPokedexView->unk62E) - { - gPokedexView->unk62E--; - switch (a) - { - case 1: - for (i = 0; i < 4; i++) - { - if (gPokedexView->unk61E[i] != 0xFFFF) - gSprites[gPokedexView->unk61E[i]].data5 += b; - } - foo = 16 * (c - gPokedexView->unk62E) / c; - REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 - foo; - gPokedexView->unk62C -= gPokedexView->unk628; - break; - case 2: - for (i = 0; i < 4; i++) - { - if (gPokedexView->unk61E[i] != 0xFFFF) - gSprites[gPokedexView->unk61E[i]].data5 -= b; - } - foo = 16 * (c - gPokedexView->unk62E) / c; - REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 + foo; - gPokedexView->unk62C += gPokedexView->unk628; - break; - } - return FALSE; - } - else - { - REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk630 * 16; - return TRUE; - } -} - -static void sub_808E398(u8 a, u16 b) -{ - u16 unk; - u8 spriteId; - - gPokedexView->unk632 = gPokedexView->unk630; - switch (a) - { - case 1: - unk = sub_808E888(b - 1); - if (unk != 0xFFFF) - { - spriteId = sub_808E8C8(unk, 0x60, 0x50); - gSprites[spriteId].callback = sub_808EE28; - gSprites[spriteId].data5 = -64; - } - if (gPokedexView->unk630 > 0) - gPokedexView->unk630--; - else - gPokedexView->unk630 = 15; - break; - case 2: - unk = sub_808E888(b + 1); - if (unk != 0xFFFF) - { - spriteId = sub_808E8C8(unk, 0x60, 0x50); - gSprites[spriteId].callback = sub_808EE28; - gSprites[spriteId].data5 = 0x40; - } - if (gPokedexView->unk630 <= 0xE) - gPokedexView->unk630++; - else - gPokedexView->unk630 = 0; - break; - } -} - -// Ugly, ugly, ugly. I couldn't get it to match otherwise. -static u16 sub_808E48C(u16 a, u16 b) -{ - u8 r3; - u8 r5; - u8 i; - u16 r6; - u8 r10 = 0; - - if (!((gMain.heldKeys & 0x40) && (a > 0))) - { - //_0808E4B6 - if (!((gMain.heldKeys & 0x80) && (a < gPokedexView->pokemonListCount - 1))) - //_0808E4CE - { - if ((gMain.newKeys & 0x20) && (a > 0)) - { - r6 = a; - //_0808E4E0 - for (i = 0; i < 7; i++) - a = sub_8091818(1, a, 0, gPokedexView->pokemonListCount - 1); - gPokedexView->unk62C += 16 * (a - r6); - sub_808E82C(); - sub_808E0CC(a, 0xE); - PlaySE(0x6D); - } - //_0808E53C - else if ((gMain.newKeys & 0x10) && (a < gPokedexView->pokemonListCount - 1)) - { - r6 = a; - for (i = 0; i < 7; i++) - a = sub_8091818(0, a, 0, gPokedexView->pokemonListCount - 1); - gPokedexView->unk62C += (a - r6) * 16; - sub_808E82C(); - sub_808E0CC(a, 0xE); - PlaySE(0x6D); - } - _0808E5A2: - if (r10 == 0) - { - gPokedexView->unk638 = 0; - return a; - } - } - else - { - // to _0808E5C4 - r10 = 2; - a = sub_8091818(0, a, 0, gPokedexView->pokemonListCount - 1); - sub_808E398(2, a); - //goto _0808E60E - sub_808DBE8(2, a, b); - PlaySE(0x6C); - goto _0808E5A2; - } - } - else - { - //to _0808E5E4 - r10 = 1; - a = sub_8091818(1, a, 0, gPokedexView->pokemonListCount - 1); - sub_808E398(1, a); - //_0808E60E - sub_808DBE8(1, a, b); - PlaySE(0x6C); - goto _0808E5A2; - } - //_0808E628 - r5 = gUnknown_083A05EC[gPokedexView->unk638 / 4]; - r3 = gUnknown_083A05F1[gPokedexView->unk638 / 4]; - gPokedexView->unk62E = r3; - gPokedexView->unk636 = r3; - gPokedexView->unk634 = r5; - gPokedexView->unk62F = r10; - gPokedexView->unk628 = r5 / 2; - sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636); - if (gPokedexView->unk638 <= 0xB) - gPokedexView->unk638++; - return a; -} - -static void sub_808E6BC(void) -{ - u16 i; - - for (i = 0; i < 4; i++) - { - u16 spriteId = gPokedexView->unk61E[i]; - - if (gSprites[spriteId].pos2.x == 0 && gSprites[spriteId].pos2.y == 0 && spriteId != 0xFFFF) - gPokedexView->selectedMonSpriteId = spriteId; - } -} - -static u8 sub_808E71C(void) -{ - u16 r2; - u16 r4 = gPokedexView->selectedPokemon; - - if ((gMain.newKeys & DPAD_UP) && r4) - { - r2 = r4; - while (r2 != 0) - { - r2 = sub_8091818(1, r2, 0, gPokedexView->pokemonListCount - 1); - - if (gPokedexView->unk0[r2].seen) - { - r4 = r2; - break; - } - } - - if (gPokedexView->selectedPokemon == r4) - return 0; - else - { - gPokedexView->selectedPokemon = r4; - gPokedexView->unk62C -= 16; - return 1; - } - } - else if ((gMain.newKeys & DPAD_DOWN) && r4 < gPokedexView->pokemonListCount - 1) - { - r2 = r4; - while (r2 < gPokedexView->pokemonListCount - 1) - { - r2 = sub_8091818(0, r2, 0, gPokedexView->pokemonListCount - 1); - - if (gPokedexView->unk0[r2].seen) - { - r4 = r2; - break; - } - } - - if (gPokedexView->selectedPokemon == r4) - return 0; - else - { - gPokedexView->selectedPokemon = r4; - gPokedexView->unk62C += 16; - return 1; - } - } - return 0; -} - -static u8 sub_808E82C(void) -{ - u16 i; - - for (i = 0; i < 4; i++) - { - if (gPokedexView->unk61E[i] != 0xFFFF) - { - DestroySprite(&gSprites[gPokedexView->unk61E[i]]); - gPokedexView->unk61E[i] |= 0xFFFF; - } - } - return 0; -} - -static u16 sub_808E888(u16 a1) -{ - if (a1 >= NATIONAL_DEX_COUNT || gPokedexView->unk0[a1].dexNum == 0xFFFF) - return 0xFFFF; - else if (gPokedexView->unk0[a1].seen) - return gPokedexView->unk0[a1].dexNum; - else - return 0; -} - -static u32 sub_808E8C8(u16 a, s16 b, s16 c) -{ - u8 i; - - for (i = 0; i < 4; i++) - { - if (gPokedexView->unk61E[i] == 0xFFFF) - { - u8 spriteId = sub_80918EC(a, b, c, i); - - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].oam.priority = 3; - gSprites[spriteId].data0 = 0; - gSprites[spriteId].data1 = i; - gSprites[spriteId].data2 = NationalPokedexNumToSpecies(a); - gPokedexView->unk61E[i] = spriteId; - return spriteId; - } - } - return 0xFFFF; -} - -static void sub_808E978(u8 a) -{ - u8 spriteId; - u16 r5; - - spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 4, 0); - gSprites[spriteId].data1 = 0; - - spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 156, 0); - gSprites[spriteId].data1 = 1; - gSprites[spriteId].vFlip = TRUE; - - CreateSprite(&gSpriteTemplate_83A0524, 234, 20, 0); - CreateSprite(&gSpriteTemplate_83A0554, 16, 138, 0); - - spriteId = CreateSprite(&gSpriteTemplate_83A0554, 48, 138, 0); - StartSpriteAnim(&gSprites[spriteId], 3); - - spriteId = CreateSprite(&gSpriteTemplate_83A0554, 16, 158, 0); - StartSpriteAnim(&gSprites[spriteId], 2); - gSprites[spriteId].data2 = 0x80; - - spriteId = CreateSprite(&gSpriteTemplate_83A0554, 48, 158, 0); - StartSpriteAnim(&gSprites[spriteId], 1); - - spriteId = CreateSprite(&gSpriteTemplate_83A056C, 0, 80, 2); - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].oam.matrixNum = 30; - gSprites[spriteId].data0 = 0x1E; - gSprites[spriteId].data1 = 0; - - spriteId = CreateSprite(&gSpriteTemplate_83A056C, 0, 80, 2); - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].oam.matrixNum = 31; - gSprites[spriteId].data0 = 0x1F; - gSprites[spriteId].data1 = 0x80; - - if (a == 0) - { - u32 _a; - - CreateSprite(&gSpriteTemplate_83A0584, 32, 40, 1); - - spriteId = CreateSprite(&gSpriteTemplate_83A0584, 32, 72, 1); - StartSpriteAnim(&gSprites[spriteId], 1); - _a = 0; - - spriteId = CreateSprite(&gSpriteTemplate_83A059C, 28, 48, 1); - r5 = gPokedexView->unk61A / 100; - StartSpriteAnim(&gSprites[spriteId], r5); - if (r5 != 0) - _a = 1; - else - gSprites[spriteId].invisible = TRUE; - - spriteId = CreateSprite(&gSpriteTemplate_83A059C, 34, 48, 1); - r5 = (gPokedexView->unk61A % 100) / 10; - if (r5 != 0 || _a != 0) - StartSpriteAnim(&gSprites[spriteId], r5); - else - gSprites[spriteId].invisible = TRUE; - - spriteId = CreateSprite(&gSpriteTemplate_83A059C, 40, 48, 1); - r5 = (gPokedexView->unk61A % 100) % 10; - StartSpriteAnim(&gSprites[spriteId], r5); - _a = 0; - - spriteId = CreateSprite(&gSpriteTemplate_83A059C, 28, 80, 1); - r5 = gPokedexView->unk61C / 100; - StartSpriteAnim(&gSprites[spriteId], r5); - if (r5 != 0) - _a = 1; - else - gSprites[spriteId].invisible = TRUE; - - spriteId = CreateSprite(&gSpriteTemplate_83A059C, 34, 80, 1); - r5 = (gPokedexView->unk61C % 100) / 10; - if (r5 != 0 || _a != 0) - StartSpriteAnim(&gSprites[spriteId], r5); - else - gSprites[spriteId].invisible = TRUE; - - spriteId = CreateSprite(&gSpriteTemplate_83A059C, 40, 80, 1); - r5 = (gPokedexView->unk61C % 100) % 10; - StartSpriteAnim(&gSprites[spriteId], r5); - - spriteId = CreateSprite(&gSpriteTemplate_83A05B4, 140, 96, 1); - gSprites[spriteId].invisible = TRUE; - } - else - { - spriteId = CreateSprite(&gSpriteTemplate_83A05B4, 140, 80, 1); - gSprites[spriteId].invisible = TRUE; - } -} - -static void nullsub_58(struct Sprite *sprite) -{ -} - -static void sub_808ED94(struct Sprite *sprite) -{ - if (gPokedexView->unk64A != 0) - DestroySprite(sprite); -} - -//Move Pokemon into position for description page -static void sub_808EDB8(struct Sprite *sprite) -{ - sprite->oam.priority = 0; - sprite->oam.affineMode = 0; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - if (sprite->pos1.x != 48 || sprite->pos1.y != 56) - { - if (sprite->pos1.x > 48) - sprite->pos1.x--; - if (sprite->pos1.x < 48) - sprite->pos1.x++; - - if (sprite->pos1.y > 56) - sprite->pos1.y--; - if (sprite->pos1.y < 56) - sprite->pos1.y++; - } - else - { - sprite->callback = nullsub_58; - } -} - -static void sub_808EE28(struct Sprite *sprite) -{ - u8 data1 = sprite->data1; - - if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) - { - DestroySprite(sprite); - gPokedexView->unk61E[data1] = 0xFFFF; - } - else - { - u32 var; - - sprite->pos2.y = gSineTable[(u8)sprite->data5] * 76 / 256; - var = 0x10000 / gSineTable[sprite->data5 + 0x40]; - if (var > 0xFFFF) - var = 0xFFFF; - SetOamMatrix(sprite->data1 + 1, 0x100, 0, 0, var); - sprite->oam.matrixNum = data1 + 1; - - if (sprite->data5 > -64 && sprite->data5 < 64) - { - sprite->invisible = FALSE; - sprite->data0 = 1; - } - else - { - sprite->invisible = TRUE; - } - - if ((sprite->data5 <= -64 || sprite->data5 >= 64) && sprite->data0 != 0) - { - DestroySprite(sprite); - gPokedexView->unk61E[data1] = 0xFFFF; - } - } -} - -static void sub_808EF38(struct Sprite *sprite) -{ - if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) - DestroySprite(sprite); - else - sprite->pos2.y = gPokedexView->selectedPokemon * 120 / (gPokedexView->pokemonListCount - 1); -} - -static void sub_808EF8C(struct Sprite *sprite) -{ - if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) - { - DestroySprite(sprite); - } - else - { - u8 r0; - - if (sprite->data1 != 0) - { - if (gPokedexView->selectedPokemon == gPokedexView->pokemonListCount - 1) - sprite->invisible = TRUE; - else - sprite->invisible = FALSE; - r0 = sprite->data2; - } - else - { - if (gPokedexView->selectedPokemon == 0) - sprite->invisible = TRUE; - else - sprite->invisible = FALSE; - r0 = sprite->data2 - 128; - } - sprite->pos2.y = gSineTable[r0] / 64; - sprite->data2 = sprite->data2 + 8; - if (gPokedexView->menuIsOpen == 0 && gPokedexView->menuY == 0 && sprite->invisible == 0) - sprite->invisible = FALSE; - else - sprite->invisible = TRUE; - } -} - -static void sub_808F08C(struct Sprite *sprite) -{ - if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) - DestroySprite(sprite); -} - -static void sub_808F0B4(struct Sprite *sprite) -{ - if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) - { - DestroySprite(sprite); - } - else - { - u8 val; - s16 r3; - s16 r0; - - val = gPokedexView->unk62C + sprite->data1; - r3 = gSineTable[val]; - r0 = gSineTable[val + 0x40]; - SetOamMatrix(sprite->data0, r0, r3, -r3, r0); - - val = gPokedexView->unk62C + (sprite->data1 + 0x40); - r3 = gSineTable[val]; - r0 = gSineTable[val + 0x40]; - sprite->pos2.x = r0 * 40 / 256; - sprite->pos2.y = r3 * 40 / 256; - } -} - -static void sub_808F168(struct Sprite *sprite) -{ - if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) - { - DestroySprite(sprite); - } - else - { - u16 r1 = gPokedexView->unk64A == 0 ? 80 : 96; - - if (gPokedexView->menuIsOpen != 0 && gPokedexView->menuY == r1) - { - sprite->invisible = FALSE; - sprite->pos2.y = gPokedexView->menuCursorPos * 16; - sprite->pos2.x = gSineTable[(u8)sprite->data2] / 64; - sprite->data2 += 8; - } - else - { - sprite->invisible = TRUE; - } - } -} - -static u8 sub_808F210(struct PokedexListItem *item, u8 b) -{ - u8 taskId; - - gUnknown_0202FFBC = item; - taskId = CreateTask(Task_InitPageScreenMultistep, 0); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 1; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = b; - return taskId; -} - -static bool8 sub_808F250(u8 taskId) -{ - if (gTasks[taskId].data[0] == 0 && gTasks[taskId].func == Task_PageScreenProcessInput) - return FALSE; - else - return TRUE; -} - -static u8 sub_808F284(struct PokedexListItem *item, u8 b) -{ - gUnknown_0202FFBC = item; - gTasks[b].data[0] = 1; - gTasks[b].data[1] = 0; - gTasks[b].data[2] = 0; - gTasks[b].data[3] = 0; - return b; -} - -#if ENGLISH -#define CATEGORY_LEFT (11) -#elif GERMAN -#define CATEGORY_LEFT (16) -#endif - -static void Task_InitPageScreenMultistep(u8 taskId) -{ - switch (gMain.state) - { - case 0: - default: - if (!gPaletteFade.active) - { - u16 r2; - - gPokedexView->unk64A = 1; - gPokedexView->descriptionPageNum = 0; - gUnknown_03005CEC = gMain.vblankCallback; - SetVBlankCallback(NULL); - r2 = 0; - if (gTasks[taskId].data[1] != 0) - r2 += 0x1000; - if (gTasks[taskId].data[2] != 0) - r2 |= 0x200; - sub_8091060(r2); - gMain.state = 1; - } - break; - case 1: - LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM); - LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800)); - sub_8091738(gUnknown_0202FFBC->dexNum, 2, 0x3FC); - gMain.state++; - break; - case 2: - sub_80904FC(0xD); - sub_8090584(gPokedexView->selectedScreen, 0xD); - sub_808D640(); - gMain.state++; - break; - case 3: - SetUpWindowConfig(&gWindowConfig_81E7064); - InitMenuWindow(&gWindowConfig_81E7064); - gMain.state++; - break; - case 4: - if (gPokedexView->dexMode == DEX_MODE_HOENN) - sub_8091154(NationalToHoennOrder(gUnknown_0202FFBC->dexNum), 0xD, 3); - else - sub_8091154(gUnknown_0202FFBC->dexNum, 0xD, 3); - sub_80911C8(gUnknown_0202FFBC->dexNum, 0x10, 3); - MenuPrint(gDexText_UnknownPoke, CATEGORY_LEFT, 5); - MenuPrint(gDexText_UnknownHeight, 16, 7); - MenuPrint(gDexText_UnknownWeight, 16, 9); - if (gUnknown_0202FFBC->owned) - { - sub_8091304(gPokedexEntries[gUnknown_0202FFBC->dexNum].categoryName, CATEGORY_LEFT, 5); - sub_8091458(gPokedexEntries[gUnknown_0202FFBC->dexNum].height, 16, 7); - sub_8091564(gPokedexEntries[gUnknown_0202FFBC->dexNum].weight, 16, 9); - MenuPrint(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); - sub_80917CC(14, 0x3FC); - } - else - { - MenuPrint(gUnknown_083A05F8, 2, 13); - LoadPalette(gPlttBufferUnfaded + 1, 0x31, 0x1E); - } - gMain.state++; - break; - case 5: - if (gTasks[taskId].data[1] == 0) - { - gTasks[taskId].data[4] = (u16)sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0); - gSprites[gTasks[taskId].data[4]].oam.priority = 0; - } - gMain.state++; - break; - case 6: - { - u32 r3 = 0; - - if (gTasks[taskId].data[2] != 0) - r3 = 0x14; - if (gTasks[taskId].data[1] != 0) - r3 |= (1 << (gSprites[gTasks[taskId].data[4]].oam.paletteNum + 16)); - BeginNormalPaletteFade(~r3, 0, 16, 0, 0); - SetVBlankCallback(gUnknown_03005CEC); - gMain.state++; - } - break; - case 7: - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - gMain.state++; - break; - case 8: - if (!gPaletteFade.active) - { - gMain.state++; - if (gTasks[taskId].data[3] == 0) - { - StopCryAndClearCrySongs(); - PlayCry2(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum), 0, 0x7D, 0xA); - } - else - { - gMain.state++; - } - } - break; - case 9: - if (!IsCryPlayingOrClearCrySongs()) - gMain.state++; - break; - case 10: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 1; - gTasks[taskId].data[3] = 1; - gTasks[taskId].func = Task_PageScreenProcessInput; - gMain.state = 0; - break; - } -} - -static void Task_PageScreenProcessInput(u8 taskId) -{ - if (gTasks[taskId].data[0] != 0) - { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = sub_808F888; - PlaySE(SE_Z_SCROLL); - return; - } - if (gMain.newKeys & B_BUTTON) - { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = Task_ClosePageScreen; - PlaySE(SE_PC_OFF); - return; - } - if (gMain.newKeys & A_BUTTON) - { - switch (gPokedexView->selectedScreen) - { - case PAGE_SCREEN: - sub_8090C68(); - break; - case AREA_SCREEN: - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_InitAreaScreenMultistep; - PlaySE(SE_PIN); - break; - case CRY_SCREEN: - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_InitCryScreenMultistep; - PlaySE(SE_PIN); - break; - case SIZE_SCREEN: - if (!gUnknown_0202FFBC->owned) - { - PlaySE(SE_HAZURE); - } - else - { - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_InitSizeScreenMultistep; - PlaySE(SE_PIN); - } - break; - } - return; - } - if (((gMain.newKeys & DPAD_LEFT) - || ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) - && gPokedexView->selectedScreen > 0) - { - gPokedexView->selectedScreen--; - sub_8090584(gPokedexView->selectedScreen, 0xD); - PlaySE(SE_Z_PAGE); - return; - } - if (((gMain.newKeys & DPAD_RIGHT) - || ((gMain.newKeys & R_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) - && gPokedexView->selectedScreen < 3) - { - gPokedexView->selectedScreen++; - sub_8090584(gPokedexView->selectedScreen, 0xD); - PlaySE(SE_Z_PAGE); - return; - } -} - -static void sub_808F888(u8 taskId) -{ - if (!gPaletteFade.active) - gTasks[taskId].func = Task_InitPageScreenMultistep; -} - -static void Task_ClosePageScreen(u8 taskId) -{ - if (!gPaletteFade.active) - DestroyTask(taskId); -} - -static void Task_InitAreaScreenMultistep(u8 taskId) -{ - switch (gMain.state) - { - case 0: - default: - if (!gPaletteFade.active) - { - gPokedexView->unk64A = 5; - gUnknown_03005CEC = gMain.vblankCallback; - SetVBlankCallback(NULL); - sub_8091060(0x200); - gPokedexView->selectedScreen = AREA_SCREEN; - gMain.state = 1; - } - break; - case 1: - sub_8090540(0xD); - sub_8090644(1, 0xD); - sub_808D640(); - REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; - gMain.state++; - break; - case 2: - ShowPokedexAreaScreen(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum), &gPokedexView->unk64F); - SetVBlankCallback(gUnknown_03005CEC); - gPokedexView->unk64F = 0; - gMain.state = 0; - gTasks[taskId].func = Task_AreaScreenProcessInput; - break; - } -} - -static void Task_AreaScreenProcessInput(u8 taskId) -{ - if (gPokedexView->unk64F != 0) - gTasks[taskId].func = sub_808FA00; -} - -static void sub_808FA00(u8 taskId) -{ - if (!gPaletteFade.active) - { - switch (gPokedexView->unk64F) - { - case 1: - default: - gTasks[taskId].func = Task_InitPageScreenMultistep; - break; - case 2: - gTasks[taskId].func = Task_InitCryScreenMultistep; - break; - } - } -} - -static void Task_InitCryScreenMultistep(u8 taskId) -{ - switch (gMain.state) - { - case 0: - default: - if (!gPaletteFade.active) - { - m4aMPlayStop(&gMPlay_BGM); - gPokedexView->unk64A = 6; - gUnknown_03005CEC = gMain.vblankCallback; - SetVBlankCallback(NULL); - sub_8091060(0x200); - gPokedexView->selectedScreen = CRY_SCREEN; - gMain.state = 1; - } - break; - case 1: - LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM); - LZ77UnCompVram(gUnknown_0839F8A0, (void *)(VRAM + 0x7000)); - gMain.state++; - break; - case 2: - sub_8090540(0xD); - sub_8090644(2, 0xD); - sub_808D640(); - DmaClear16(3, (void *)(VRAM + 0xF800), 0x500); - gMain.state++; - break; - case 3: - SetUpWindowConfig(&gWindowConfig_81E702C); - InitMenuWindow(&gWindowConfig_81E702C); - ResetPaletteFade(); - gMain.state++; - break; - case 4: - MenuPrint(gDexText_CryOf, 10, 4); - sub_8091260(gUnknown_0202FFBC->dexNum, 10, 6, 2); - gMain.state++; - break; - case 5: - gTasks[taskId].data[4] = sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0); - gSprites[gTasks[taskId].data[4]].oam.priority = 0; - gUnknown_03005E98 = 0; - gMain.state++; - break; - case 6: - { - struct CryRelatedStruct sp8; - - sp8.unk0 = 0x4020; - sp8.unk2 = 0x1F; - sp8.paletteNo = 8; - sp8.yPos = 0x1E; - sp8.xPos = 0xC; - if (sub_8119E3C(&sp8, 0) != 0) - { - gMain.state++; - gUnknown_03005E98 = 0; - } - } - break; - case 7: - { - struct CryRelatedStruct sp10; - - sp10.unk0 = 0x3000; - sp10.unk2 = 0xE; - sp10.paletteNo = 9; - sp10.xPos = 0x12; - sp10.yPos = 3; - if (ShowPokedexCryScreen(&sp10, 1) != 0) - gMain.state++; - } - break; - case 8: - BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0); - SetVBlankCallback(gUnknown_03005CEC); - gMain.state++; - break; - case 9: - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG0CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; - gMain.state++; - break; - case 10: - gPokedexView->unk64F = 0; - gMain.state = 0; - gTasks[taskId].func = Task_CryScreenProcessInput; - break; - } -} - -static void Task_CryScreenProcessInput(u8 taskId) -{ - sub_8119F88(0); - - if (IsCryPlaying()) - sub_8090040(1); - else - sub_8090040(0); - - if (gMain.newKeys & A_BUTTON) - { - sub_8090040(1); - sub_811A050(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum)); - return; - } - else if (!gPaletteFade.active) - { - if (gMain.newKeys & B_BUTTON) - { - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - m4aMPlayContinue(&gMPlay_BGM); - gPokedexView->unk64F = 1; - gTasks[taskId].func = sub_808FFBC; - PlaySE(SE_PC_OFF); - return; - } - if ((gMain.newKeys & DPAD_LEFT) - || ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) - { - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - m4aMPlayContinue(&gMPlay_BGM); - gPokedexView->unk64F = 2; - gTasks[taskId].func = sub_808FFBC; - PlaySE(SE_Z_PAGE); - return; - } - if ((gMain.newKeys & DPAD_RIGHT) - || ((gMain.newKeys & R_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) - { - if (!gUnknown_0202FFBC->owned) - { - PlaySE(SE_HAZURE); - } - else - { - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - m4aMPlayContinue(&gMPlay_BGM); - gPokedexView->unk64F = 3; - gTasks[taskId].func = sub_808FFBC; - PlaySE(SE_Z_PAGE); - } - return; - } - } -} - -static void sub_808FFBC(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyCryMeterNeedleSprite(); - switch (gPokedexView->unk64F) - { - default: - case 1: - gTasks[taskId].func = Task_InitPageScreenMultistep; - break; - case 2: - gTasks[taskId].func = Task_InitAreaScreenMultistep; - break; - case 3: - gTasks[taskId].func = Task_InitSizeScreenMultistep; - break; - } - } -} - -static void sub_8090040(u8 a) -{ - u16 unk; - - if (a != 0) - unk = 0x392; - else - unk = 0x2AF; - LoadPalette(&unk, 0x5D, 2); -} - -static void Task_InitSizeScreenMultistep(u8 taskId) -{ - u8 spriteId; - - switch (gMain.state) - { - default: - case 0: - if (!gPaletteFade.active) - { - gPokedexView->unk64A = 7; - gUnknown_03005CEC = gMain.vblankCallback; - SetVBlankCallback(NULL); - sub_8091060(0x200); - gPokedexView->selectedScreen = SIZE_SCREEN; - gMain.state = 1; - } - break; - case 1: - LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM); - LZ77UnCompVram(gUnknown_0839F988, (void *)(VRAM + 0x7000)); - gMain.state++; - break; - case 2: - sub_8090540(0xD); - sub_8090644(3, 0xD); - sub_808D640(); - gMain.state++; - break; - case 3: - { - u8 string[40]; //I hope this is the correct size - - SetUpWindowConfig(&gWindowConfig_81E702C); - InitMenuWindow(&gWindowConfig_81E702C); - string[0] = EOS; - StringAppend(string, gDexText_SizeComparedTo); - StringAppend(string, gSaveBlock2.playerName); - sub_8072BD8(string, 3, 15, 0xC0); - gMain.state++; - } - break; - case 4: - ResetPaletteFade(); - gMain.state++; - break; - case 5: - spriteId = sub_8091A4C(gSaveBlock2.playerGender, 152, 56, 0); - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].oam.matrixNum = 1; - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerOffset; - SetOamMatrix(1, gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerScale, 0, 0, gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerScale); - LoadPalette(gUnknown_083B4EC4, (gSprites[spriteId].oam.paletteNum + 16) * 16, sizeof(gUnknown_083B4EC4)); - gMain.state++; - break; - case 6: - spriteId = sub_80918EC(gUnknown_0202FFBC->dexNum, 88, 56, 1); - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].oam.matrixNum = 2; - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonOffset; - SetOamMatrix(2, gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonScale, 0, 0, gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonScale); - LoadPalette(gUnknown_083B4EC4, (gSprites[spriteId].oam.paletteNum + 16) * 16, sizeof(gUnknown_083B4EC4)); - gMain.state++; - break; - case 7: - BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0); - SetVBlankCallback(gUnknown_03005CEC); - gMain.state++; - break; - case 8: - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - gMain.state++; - break; - case 9: - if (!gPaletteFade.active) - { - gPokedexView->unk64F = 0; - gMain.state = 0; - gTasks[taskId].func = Task_SizeScreenProcessInput; - } - break; - } -} - -static void Task_SizeScreenProcessInput(u8 taskId) -{ - if (gMain.newKeys & B_BUTTON) - { - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - gPokedexView->unk64F = 1; - gTasks[taskId].func = sub_8090498; - PlaySE(SE_PC_OFF); - } - else if ((gMain.newKeys & DPAD_LEFT) - || ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) - { - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - gPokedexView->unk64F = 2; - gTasks[taskId].func = sub_8090498; - PlaySE(SE_Z_PAGE); - } -} - -static void sub_8090498(u8 taskId) -{ - if (!gPaletteFade.active) - { - switch (gPokedexView->unk64F) - { - default: - case 1: - gTasks[taskId].func = Task_InitPageScreenMultistep; - break; - case 2: - gTasks[taskId].func = Task_InitCryScreenMultistep; - break; - } - } -} - -static void sub_80904FC(u16 a) -{ - LZ77UnCompVram(gUnknown_08E96ACC, (void *)(VRAM + a * 0x800)); - DmaClear16(3, (void *)(VRAM + a * 0x800 + 0xC0), 0x440); -} - -static void sub_8090540(u16 a) -{ - LZ77UnCompVram(gUnknown_08E96B58, (void *)(VRAM + a * 0x800)); - DmaClear16(3, (void *)(VRAM + a * 0x800 + 0xC0), 0x440); -} - -#ifdef NONMATCHING -static void sub_8090584(u8 a, u16 b) -{ - u8 i; //r1 - u8 j; //r3 - u32 r6; - register u8 r7; - - for (i = 0; i < 4; i++) - { - r7 = i * 5 + 1; - r6 = 0x4000; - - if (i == a) - r6 = 0x2000; - - for (j = 0; j < 5; j++) - { - u32 r0 = b * 0x800 + (r7 + j) * 2; - u8 *ptr; - - ptr = VRAM; - *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; - ptr = VRAM + 0x40; - *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; - } - } - r6 = 0x4000; - for (j = 0; j < 5; j++) - { - u32 r0 = b * 0x800 + j * 2; - u8 *ptr; - - ptr = VRAM + 0x32; - *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; - ptr = VRAM + 0x72; - *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; - } -} -#else -__attribute__((naked)) -static void sub_8090584(u8 a, u16 b) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - mov r9, r1\n\ - movs r1, 0\n\ -_0809059C:\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - movs r6, 0x80\n\ - lsls r6, 7\n\ - cmp r1, r10\n\ - bne _080905B2\n\ - movs r6, 0x80\n\ - lsls r6, 6\n\ -_080905B2:\n\ - movs r3, 0\n\ - mov r0, r9\n\ - lsls r0, 11\n\ - mov r12, r0\n\ - adds r1, 0x1\n\ - mov r8, r1\n\ - mov r5, r12\n\ - ldr r4, _08090634 @ =0x00000fff\n\ -_080905C2:\n\ - adds r0, r7, r3\n\ - lsls r0, 1\n\ - adds r0, r5, r0\n\ - movs r2, 0xC0\n\ - lsls r2, 19\n\ - adds r1, r0, r2\n\ - ldrh r2, [r1]\n\ - ands r2, r4\n\ - orrs r2, r6\n\ - strh r2, [r1]\n\ - ldr r1, _08090638 @ =0x06000040\n\ - adds r0, r1\n\ - ldrh r2, [r0]\n\ - ands r2, r4\n\ - orrs r2, r6\n\ - strh r2, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0x4\n\ - bls _080905C2\n\ - mov r2, r8\n\ - lsls r0, r2, 24\n\ - lsrs r1, r0, 24\n\ - cmp r1, 0x3\n\ - bls _0809059C\n\ - movs r6, 0x80\n\ - lsls r6, 7\n\ - movs r3, 0\n\ - mov r5, r12\n\ - ldr r4, _08090634 @ =0x00000fff\n\ -_08090600:\n\ - lsls r0, r3, 1\n\ - adds r0, r5, r0\n\ - ldr r2, _0809063C @ =0x06000032\n\ - adds r1, r0, r2\n\ - ldrh r2, [r1]\n\ - ands r2, r4\n\ - orrs r2, r6\n\ - strh r2, [r1]\n\ - ldr r1, _08090640 @ =0x06000072\n\ - adds r0, r1\n\ - ldrh r2, [r0]\n\ - ands r2, r4\n\ - orrs r2, r6\n\ - strh r2, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0x4\n\ - bls _08090600\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08090634: .4byte 0x00000fff\n\ -_08090638: .4byte 0x06000040\n\ -_0809063C: .4byte 0x06000032\n\ -_08090640: .4byte 0x06000072\n\ - .syntax divided\n"); -} -#endif - -//Nope, can't get this one to match, either. -#ifdef NONMATCHING -static void sub_8090644(u8 a, u16 b) -{ - u8 i; - u8 j; - - for (i = 0; i < 4; i++) - { - u8 r8 = i * 5 + 1; - u32 r5; - - if (i == a || i == 0) - r5 = 0x2000; - else if (a != 0) - r5 = 0x4000; - - for (j = 0; j < 5; j++) - { - u16 (*vramData)[0x400]; - - vramData = (u16 (*)[])VRAM; - vramData[b][r8 + j] = vramData[b][r8 + j] & 0xFFF | r5; - vramData = (u16 (*)[])(VRAM + 0x40); - vramData[b][r8 + j] = vramData[b][r8 + j] & 0xFFF | r5; - } - } - - for (j = 0; j < 5; j++) - { - u16 (*vramData)[0x400]; - - vramData = (u16 (*)[])(VRAM + 0x32); - vramData[b][j] = vramData[b][j] & 0xFFF | 0x4000; - vramData = (u16 (*)[])(VRAM + 0x72); - vramData[b][j] = vramData[b][j] & 0xFFF | 0x4000; - } -} -#else -__attribute__((naked)) -static void sub_8090644(u8 a, u16 b) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - mov r9, r1\n\ - movs r1, 0\n\ -_0809065C:\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - cmp r1, r10\n\ - beq _08090670\n\ - cmp r1, 0\n\ - bne _08090676\n\ -_08090670:\n\ - movs r5, 0x80\n\ - lsls r5, 6\n\ - b _0809067A\n\ -_08090676:\n\ - movs r5, 0x80\n\ - lsls r5, 7\n\ -_0809067A:\n\ - movs r3, 0\n\ - mov r0, r9\n\ - lsls r7, r0, 11\n\ - adds r1, 0x1\n\ - mov r12, r1\n\ - adds r6, r7, 0\n\ - ldr r4, _080906FC @ =0x00000fff\n\ -_08090688:\n\ - mov r1, r8\n\ - adds r0, r1, r3\n\ - lsls r0, 1\n\ - adds r0, r6, r0\n\ - movs r2, 0xC0\n\ - lsls r2, 19\n\ - adds r1, r0, r2\n\ - ldrh r2, [r1]\n\ - ands r2, r4\n\ - orrs r2, r5\n\ - strh r2, [r1]\n\ - ldr r1, _08090700 @ =0x06000040\n\ - adds r0, r1\n\ - ldrh r2, [r0]\n\ - ands r2, r4\n\ - orrs r2, r5\n\ - strh r2, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0x4\n\ - bls _08090688\n\ - mov r2, r12\n\ - lsls r0, r2, 24\n\ - lsrs r1, r0, 24\n\ - cmp r1, 0x3\n\ - bls _0809065C\n\ - movs r5, 0x80\n\ - lsls r5, 7\n\ - movs r3, 0\n\ - adds r6, r7, 0\n\ - ldr r4, _080906FC @ =0x00000fff\n\ -_080906C8:\n\ - lsls r0, r3, 1\n\ - adds r0, r6, r0\n\ - ldr r2, _08090704 @ =0x06000032\n\ - adds r1, r0, r2\n\ - ldrh r2, [r1]\n\ - ands r2, r4\n\ - orrs r2, r5\n\ - strh r2, [r1]\n\ - ldr r1, _08090708 @ =0x06000072\n\ - adds r0, r1\n\ - ldrh r2, [r0]\n\ - ands r2, r4\n\ - orrs r2, r5\n\ - strh r2, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0x4\n\ - bls _080906C8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080906FC: .4byte 0x00000fff\n\ -_08090700: .4byte 0x06000040\n\ -_08090704: .4byte 0x06000032\n\ -_08090708: .4byte 0x06000072\n\ - .syntax divided\n"); -} -#endif - -u8 sub_809070C(u16 dexNum, u32 b, u32 c) -{ - u8 taskId = CreateTask(sub_8090750, 0); - - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = dexNum; - gTasks[taskId].data[12] = b; - gTasks[taskId].data[13] = b >> 16; - gTasks[taskId].data[14] = c; - gTasks[taskId].data[15] = c >> 16; - return taskId; -} - -static void sub_8090750(u8 taskId) -{ - u8 spriteId; - u16 dexNum = gTasks[taskId].data[1]; - u16 i; - - switch (gTasks[taskId].data[0]) - { - case 0: - default: - if (!gPaletteFade.active) - { - gUnknown_03005CEC = gMain.vblankCallback; - SetVBlankCallback(NULL); - sub_8091060(0x100); - gTasks[taskId].data[0] = 1; - } - break; - case 1: - LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM + 0x4000)); - LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800)); - for (i = 0; i < 0x280; i++) - { -#ifndef NONMATCHING - asm(""); -#endif - *(u16 *)(VRAM + 0x7800 + 2 * i) += 0x2000; - } - sub_8091738(gTasks[taskId].data[1], 2, 0x3FC); - ResetPaletteFade(); - LoadPalette(gPokedexMenu_Pal + 1, 0x21, 0x9E); - gTasks[taskId].data[0]++; - break; - case 2: - SetUpWindowConfig(&gWindowConfig_81E7064); - InitMenuWindow(&gWindowConfig_81E7064); - DmaClear16(3, (void *)(VRAM + 0xC000), 0x200); - gTasks[taskId].data[0]++; - break; - case 3: - sub_8072BD8(gDexText_RegisterComplete, 2, 0, 0xD0); - if (!IsNationalPokedexEnabled()) - sub_8091154(NationalToHoennOrder(dexNum), 13, 3); - else - sub_8091154(dexNum, 13, 3); - sub_80911C8(dexNum, 16, 3); - MenuPrint(gDexText_UnknownPoke, CATEGORY_LEFT, 5); - MenuPrint(gDexText_UnknownHeight, 16, 7); - MenuPrint(gDexText_UnknownWeight, 16, 9); - sub_8091304(gPokedexEntries[dexNum].categoryName, CATEGORY_LEFT, 5); - sub_8091458(gPokedexEntries[dexNum].height, 16, 7); - sub_8091564(gPokedexEntries[dexNum].weight, 16, 9); - MenuPrint(gPokedexEntries[dexNum].descriptionPage1, 2, 13); - sub_80917CC(14, 0x3FC); - gTasks[taskId].data[0]++; - break; - case 4: - spriteId = sub_80918EC(dexNum, 0x30, 0x38, 0); - gSprites[spriteId].oam.priority = 0; - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - SetVBlankCallback(gUnknown_03005CEC); - gTasks[taskId].data[3] = spriteId; - gTasks[taskId].data[0]++; - break; - case 5: - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - gTasks[taskId].data[0]++; - break; - case 6: - if (!gPaletteFade.active) - { - PlayCry1(NationalPokedexNumToSpecies(dexNum), 0); - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[4] = 0; - gTasks[taskId].func = sub_8090A3C; - } - break; - } -} - -static void sub_8090A3C(u8 taskId) -{ - if (gMain.newKeys & B_BUTTON) - { - BeginNormalPaletteFade(0x0000FFFC, 0, 0, 16, 0); - gSprites[gTasks[taskId].data[3]].callback = sub_8090C28; - gTasks[taskId].func = sub_8090B8C; - return; - } - else if (gMain.newKeys & A_BUTTON) - { - if (gTasks[taskId].data[4] == 0) - { - u16 r4 = gTasks[taskId].data[1]; - - MenuZeroFillWindowRect(2, 13, 27, 19); - MenuPrint(gPokedexEntries[r4].descriptionPage2, 2, 13); - (*(u16 *)(VRAM + 0x7ACA))++; - (*(u16 *)(VRAM + 0x7B0A))++; - gTasks[taskId].data[4] = 1; - PlaySE(SE_PIN); - } - else - { - BeginNormalPaletteFade(0x0000FFFC, 0, 0, 16, 0); - gSprites[gTasks[taskId].data[3]].callback = sub_8090C28; - gTasks[taskId].func = sub_8090B8C; - return; - } - } - gTasks[taskId].data[2]++; - if (gTasks[taskId].data[2] & 0x10) - LoadPalette(gPokedexMenu_Pal + 1, 0x51, 14); - else - LoadPalette(gPokedexMenu2_Pal + 1, 0x51, 14); -} - -static void sub_8090B8C(u8 taskId) -{ - if (!gPaletteFade.active) - { - u16 species; - u32 otId; - u32 personality; - u8 paletteNum; - const u8 *lzPaletteData; - - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - CpuCopy16(gUnknown_08D00524, (void *)(VRAM + 0xC000), 0x1000); - sub_800D74C(); - species = NationalPokedexNumToSpecies(gTasks[taskId].data[1]); - otId = ((u16)gTasks[taskId].data[13] << 16) | (u16)gTasks[taskId].data[12]; - personality = ((u16)gTasks[taskId].data[15] << 16) | (u16)gTasks[taskId].data[14]; - paletteNum = gSprites[gTasks[taskId].data[3]].oam.paletteNum; - lzPaletteData = species_and_otid_get_pal(species, otId, personality); - LoadCompressedPalette(lzPaletteData, 0x100 | paletteNum * 16, 32); - DestroyTask(taskId); - } -} - -static void sub_8090C28(struct Sprite *sprite) -{ - if (sprite->pos1.x < 0x78) - sprite->pos1.x += 2; - if (sprite->pos1.x > 0x78) - sprite->pos1.x -= 2; - - if (sprite->pos1.y < 0x50) - sprite->pos1.y += 1; - if (sprite->pos1.y > 0x50) - sprite->pos1.y -= 1; -} - -static void sub_8090C68(void) -{ - if (gUnknown_0202FFBC->owned) - { - if (gPokedexView->descriptionPageNum == 0) - { - MenuZeroFillWindowRect(2, 13, 27, 19); - MenuPrint(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage2, 2, 13); - gPokedexView->descriptionPageNum = 1; - (*(u16 *)(VRAM + 0x7ACA))++; - (*(u16 *)(VRAM + 0x7B0A))++; - PlaySE(SE_PIN); - } - else - { - MenuZeroFillWindowRect(2, 13, 27, 19); - MenuPrint(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); - gPokedexView->descriptionPageNum = 0; - (*(u16 *)(VRAM + 0x7ACA))--; - (*(u16 *)(VRAM + 0x7B0A))--; - PlaySE(SE_PIN); - } - } -} - -const u8 *GetPokemonCategory(u16 dexNum) -{ - return gPokedexEntries[dexNum].categoryName; -} - -u16 GetPokedexHeightWeight(u16 dexNum, u8 data) -{ - switch (data) - { - case 0: // height - return gPokedexEntries[dexNum].height; - case 1: // weight - return gPokedexEntries[dexNum].weight; - default: - return 1; - } -} - -s8 GetNationalPokedexFlag(u16 a, u8 b) -{ - u8 index; - u8 bit; - u8 mask; - s8 retVal; - - a--; - index = a / 8; - bit = a % 8; - mask = 1 << bit; - retVal = 0; - switch (b) - { - case 0: - if (gSaveBlock2.pokedex.seen[index] & mask) - { - if ((gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.unk938[index] & mask) - && (gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.unk3A8C[index] & mask)) - retVal = 1; - else - { - gSaveBlock2.pokedex.seen[index] &= ~mask; - gSaveBlock1.unk938[index] &= ~mask; - gSaveBlock1.unk3A8C[index] &= ~mask; - retVal = 0; - } - } - break; - case 1: - if (gSaveBlock2.pokedex.owned[index] & mask) - { - if ((gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock2.pokedex.seen[index] & mask) - && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.unk938[index] & mask) - && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.unk3A8C[index] & mask)) - retVal = 1; - else - { - gSaveBlock2.pokedex.owned[index] &= ~mask; - gSaveBlock2.pokedex.seen[index] &= ~mask; - gSaveBlock1.unk938[index] &= ~mask; - gSaveBlock1.unk3A8C[index] &= ~mask; - retVal = 0; - } - } - break; - case 2: - gSaveBlock2.pokedex.seen[index] |= mask; - gSaveBlock1.unk938[index] |= mask; - gSaveBlock1.unk3A8C[index] |= mask; - break; - case 3: - gSaveBlock2.pokedex.owned[index] |= mask; - break; - } - return retVal; -} - -u16 GetNationalPokedexCount(u8 a) -{ - u16 count = 0; - u16 i; - - for (i = 0; i < NATIONAL_DEX_COUNT; i++) - { - switch (a) - { - case 0: - if (GetNationalPokedexFlag(i + 1, 0) != 0) - count++; - break; - case 1: - if (GetNationalPokedexFlag(i + 1, 1) != 0) - count++; - break; - } - } - return count; -} - -u16 GetHoennPokedexCount(u8 a) -{ - u16 count = 0; - u16 i; - - for (i = 0; i < 202; i++) - { - switch (a) - { - case 0: - if (GetNationalPokedexFlag(HoennToNationalOrder(i + 1), 0) != 0) - count++; - break; - case 1: - if (GetNationalPokedexFlag(HoennToNationalOrder(i + 1), 1) != 0) - count++; - break; - } - } - return count; -} - -bool8 sub_8090FC0(void) -{ - u16 i; - - for (i = 0; i < 200; i++) - { - if (GetNationalPokedexFlag(HoennToNationalOrder(i + 1), 1) == 0) - return FALSE; - } - return TRUE; -} - -u16 sub_8090FF4(void) -{ - u16 i; - - for (i = 0; i < 150; i++) - { - if (GetNationalPokedexFlag(i + 1, 1) == 0) - return 0; - } - for (i = 152; i < 250; i++) - { - if (GetNationalPokedexFlag(i + 1, 1) == 0) - return 0; - } - for (i = 252; i < 384; i++) - { - if (GetNationalPokedexFlag(i + 1, 1) == 0) - return 0; - } - return 1; -} - -static void sub_8091060(u16 a) -{ - if (!(a & 0x100)) - { - REG_DISPCNT &= 0xFEFF; - REG_BG0CNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - } - if (!(a & 0x200)) - { - REG_DISPCNT &= 0xFDFF; - REG_BG1CNT = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - } - if (!(a & 0x400)) - { - REG_DISPCNT &= 0xFBFF; - REG_BG2CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - } - if (!(a & 0x800)) - { - REG_DISPCNT &= 0xF7FF; - REG_BG3CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - } - if (!(a & 0x1000)) - { - REG_DISPCNT &= 0xEFFF; - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 8; - } -} - -static void sub_8091154(u16 order, u8 b, u8 c) -{ - u8 str[4]; - - str[0] = CHAR_0 + order / 100; - str[1] = CHAR_0 + (order % 100) / 10; - str[2] = CHAR_0 + (order % 100) % 10; - str[3] = EOS; - MenuPrint(str, b, c); -} - -static u8 sub_80911C8(u16 num, u8 b, u8 c) -{ - u8 str[11]; - u8 i; - - for (i = 0; i < 11; i++) - str[i] = EOS; - num = NationalPokedexNumToSpecies(num); - switch (num) - { - default: - for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) - str[i] = gSpeciesNames[num][i]; - break; - case 0: - for (i = 0; i < 10; i++) - str[i] = 0xAE; - break; - } - MenuPrint(str, b, c); - return i; -} - -static u8 sub_8091260(u16 num, u8 b, u8 c, u8 d) -{ - u8 str[40]; - u8 *end; - u8 i; - - end = StringCopy(str, gUnknown_083B5558); - str[2] = d; - num = NationalPokedexNumToSpecies(num); - switch (num) - { - default: - for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) - end[i] = gSpeciesNames[num][i]; - break; - case 0: - for (i = 0; i < 10; i++) - end[i] = 0xAE; - break; - } - end[i] = EOS; - MenuPrint(str, b, c); - return i; -} - -static void sub_8091304(const u8 *name, u8 left, u8 top) -{ - u8 str[32]; - u8 i; -#if ENGLISH - u8 j; -#endif - - for (i = 0; name[i] != EOS && i < 11; i++) - str[i] = name[i]; -#if ENGLISH - for (j = 0; gDexText_UnknownPoke[j] == 0xAC || gDexText_UnknownPoke[j] == 0; j++) - ; - j--; - while (gDexText_UnknownPoke[j] != EOS) - str[i++] = gDexText_UnknownPoke[j++]; -#endif - str[i] = EOS; - sub_8072B80(str, left, top, gDexText_UnknownPoke); -} - -#if ENGLISH -void unref_sub_80913A4(u16 a, u8 left, u8 top) -{ - u8 str[6]; - bool8 outputted = FALSE; - u8 result; - - result = a / 1000; - if (result == 0) - { - str[0] = CHAR_SPACE; - outputted = FALSE; - } - else - { - str[0] = CHAR_0 + result; - outputted = TRUE; - } - - result = (a % 1000) / 100; - if (result == 0 && !outputted) - { - str[1] = CHAR_SPACE; - outputted = FALSE; - } - else - { - str[1] = CHAR_0 + result; - outputted = TRUE; - } - - str[2] = CHAR_0 + ((a % 1000) % 100) / 10; - str[3] = CHAR_PERIOD; - str[4] = CHAR_0 + ((a % 1000) % 100) % 10; - str[5] = EOS; - MenuPrint(str, left, top); -} -#elif GERMAN -void unref_sub_80913A4(u16 arg0, u8 left, u8 top) { - u8 buffer[8]; - int offset; - u8 result; - - u8 r6 = 0; - offset = 0; - - - buffer[r6++] = 0xFC; - buffer[r6++] = 0x13; - r6++; - - result = (arg0 / 1000); - if (result == 0) - { - offset = 6; - } - else - { - buffer[r6++] = result + CHAR_0; - } - - - result = (arg0 % 1000) / 100; - - if (result == 0 && offset != 0) - { - offset += 6; - } - else - { - buffer[r6++] = result + CHAR_0; - } - - buffer[r6++] = (((arg0 % 1000) % 100) / 10) + CHAR_0; - buffer[r6++] = CHAR_COMMA; - buffer[r6++] = (((arg0 % 1000) % 100) % 10) + CHAR_0; - - buffer[r6++] = EOS; - buffer[2] = offset; - MenuPrint(buffer, left, top); -} -#endif - -#ifdef UNITS_IMPERIAL -#define CHAR_PRIME (0xB4) -#define CHAR_DOUBLE_PRIME (0xB2) -static void sub_8091458(u16 height, u8 left, u8 top) -{ - u8 buffer[16]; - u32 inches, feet; - u8 i = 0; - - inches = (height * 10000) / 254; - if (inches % 10 >= 5) - inches += 10; - feet = inches / 120; - inches = (inches - (feet * 120)) / 10; - - buffer[i++] = EXT_CTRL_CODE_BEGIN; - buffer[i++] = 0x13; - if (feet / 10 == 0) - { - buffer[i++] = 18; - buffer[i++] = feet + CHAR_0; - } - else - { - buffer[i++] = 12; - buffer[i++] = feet / 10 + CHAR_0; - buffer[i++] = (feet % 10) + CHAR_0; - } - buffer[i++] = CHAR_PRIME; - buffer[i++] = (inches / 10) + CHAR_0; - buffer[i++] = (inches % 10) + CHAR_0; - buffer[i++] = CHAR_DOUBLE_PRIME; - buffer[i++] = EOS; - MenuPrint(buffer, left, top); -} -#else -static void sub_8091458(u16 height, u8 left, u8 top) -{ - unref_sub_80913A4(height, left, top); -} -#endif - -#ifdef UNITS_IMPERIAL -static void sub_8091564(u16 weight, u8 left, u8 top) -{ - u8 buffer[16]; - u32 lbs; - u8 i = 0; - bool8 output; - - lbs = (weight * 100000) / 4536; - if (lbs % 10 >= 5) - lbs += 10; - output = FALSE; - - buffer[i] = (lbs / 100000) + CHAR_0; - if (buffer[i] == CHAR_0 && output == FALSE) - { - buffer[i++] = CHAR_SPACE; - buffer[i++] = CHAR_SPACE; - } - else - { - output = TRUE; - i++; - } - - lbs = (lbs % 100000); - buffer[i] = (lbs / 10000) + CHAR_0; - if (buffer[i] == CHAR_0 && output == FALSE) - { - buffer[i++] = CHAR_SPACE; - buffer[i++] = CHAR_SPACE; - } - else - { - output = TRUE; - i++; - } - - lbs = (lbs % 10000); - buffer[i] = (lbs / 1000) + CHAR_0; - if (buffer[i] == CHAR_0 && output == FALSE) - { - buffer[i++] = CHAR_SPACE; - buffer[i++] = CHAR_SPACE; - } - else - { - output = TRUE; - i++; - } - lbs = (lbs % 1000); - buffer[i++] = (lbs / 100) + CHAR_0; - lbs = (lbs % 100); - buffer[i++] = CHAR_PERIOD; - buffer[i++] = (lbs / 10) + CHAR_0; - buffer[i++] = CHAR_SPACE; - buffer[i++] = CHAR_l; - buffer[i++] = CHAR_b; - buffer[i++] = CHAR_s; - buffer[i++] = CHAR_PERIOD; - buffer[i++] = EOS; - MenuPrint(buffer, left, top); -} -#else -static void sub_8091564(u16 arg0, u8 left, u8 top) -{ - unref_sub_80913A4(arg0, left, top); -} -#endif - -static void sub_8091738(u16 num, u16 b, u16 c) -{ - u8 arr[0x80]; - u16 i; - u16 j; - const u8 *r12; - u16 r7; - u8 r3; - - r12 = sMonFootprintTable[NationalPokedexNumToSpecies(num)]; - for (r7 = 0, i = 0; i < 32; i++) - { - r3 = r12[i]; - for (j = 0; j < 4; j++) - { - u32 r1 = j * 2; - s32 r2 = (r3 >> r1) & 1; - - if (r3 & (2 << r1)) - r2 |= 0x10; - -// Needed to match -#ifndef NONMATCHING - asm("");asm("");asm("");asm("");asm(""); -#endif - - arr[r7] = r2; - r7++; - } - } - CpuCopy16(arr, (u16 *)(VRAM + b * 0x4000 + c * 0x20), 0x80); -} - -static void sub_80917CC(u16 a, u16 b) -{ - *(u16 *)(VRAM + a * 0x800 + 0x232) = 0xF000 + b + 0; - *(u16 *)(VRAM + a * 0x800 + 0x234) = 0xF000 + b + 1; - *(u16 *)(VRAM + a * 0x800 + 0x272) = 0xF000 + b + 2; - *(u16 *)(VRAM + a * 0x800 + 0x274) = 0xF000 + b + 3; -} - -static u16 sub_8091818(u8 a, u16 b, u16 c, u16 d) -{ - switch (a) - { - case 1: - if (b > c) - b--; - break; - case 0: - if (b < d) - b++; - break; - case 3: - if (b > c) - b--; - else - b = d; - break; - case 2: - if (b < d) - b++; - else - b = c; - break; - } - return b; -} - -static void nullsub_59(struct Sprite *sprite) -{ -} - -static void sub_8091878(u16 a, u8 b) -{ - gUnknown_02024E8C = gUnknown_083B57A4; - gUnknown_02024E8C.paletteTag = a; - gUnknown_02024E8C.images = gUnknown_083B5794[b]; - gUnknown_02024E8C.anims = gSpriteAnimTable_81E7C64; -} - -static void sub_80918B0(u16 a, u8 b) -{ - gUnknown_02024E8C = gUnknown_083B57A4; - gUnknown_02024E8C.paletteTag = a; - gUnknown_02024E8C.images = gUnknown_083B5794[b]; - gUnknown_02024E8C.anims = gUnknown_081EC2A4[0]; -} - -u16 sub_80918EC(u16 num, s16 x, s16 y, u16 paletteNum) -{ - u8 spriteId; - - num = NationalPokedexNumToSpecies(num); - switch (num) - { - default: - DecompressPicFromTable_2( - &gMonFrontPicTable[num], - gMonFrontPicCoords[num].coords, - gMonFrontPicCoords[num].y_offset, - (void *)0x02000000, - gUnknown_083B5584[paletteNum], - num); - break; - case SPECIES_SPINDA: - LoadSpecialPokePic( - &gMonFrontPicTable[num], - gMonFrontPicCoords[num].coords, - gMonFrontPicCoords[num].y_offset, - 0x02000000, - gUnknown_083B5584[paletteNum], - num, - gSaveBlock2.pokedex.spindaPersonality, - 1); - break; - case SPECIES_UNOWN: - LoadSpecialPokePic( - &gMonFrontPicTable[num], - gMonFrontPicCoords[num].coords, - gMonFrontPicCoords[num].y_offset, - 0x02000000, - gUnknown_083B5584[paletteNum], - num, - gSaveBlock2.pokedex.unownPersonality, - 1); - break; - } - LoadCompressedPalette(gMonPaletteTable[num].data, 0x100 + paletteNum * 16, 32); - sub_8091878(paletteNum, paletteNum); - spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); - gSprites[spriteId].oam.paletteNum = paletteNum; - return spriteId; -} - -static u8 sub_8091A4C(u16 gender, s16 x, s16 y, u16 paletteNum) -{ - u8 spriteId; - - DecompressPicFromTable_2( - &gTrainerFrontPicTable[gender], - gTrainerFrontPicCoords[gender].coords, - gTrainerFrontPicCoords[gender].y_offset, - (void *)0x02000000, - gUnknown_083B5584[0], - gender); - sub_80918B0(gender, 0); - spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); - gSprites[spriteId].oam.paletteNum = paletteNum; - return spriteId; -} - -int sub_8091AF8(u8 a, u8 b, u8 abcGroup, u8 bodyColor, u8 type1, u8 type2) -{ - u16 species; - u16 i; - u16 resultsCount; - u8 types[2]; - - SortPokedex(a, b); - - for (i = 0, resultsCount = 0; i < NATIONAL_DEX_COUNT; i++) - { - if (gPokedexView->unk0[i].seen) - { - gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; - resultsCount++; - } - } - gPokedexView->pokemonListCount = resultsCount; - - // Search by name - if (abcGroup != 0xFF) - { - for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) - { - u8 r3; - - species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); - r3 = gSpeciesNames[species][0]; - if ((r3 >= gUnknown_083B57BC[abcGroup][0] && r3 < gUnknown_083B57BC[abcGroup][0] + gUnknown_083B57BC[abcGroup][1]) - || (r3 >= gUnknown_083B57BC[abcGroup][2] && r3 < gUnknown_083B57BC[abcGroup][2] + gUnknown_083B57BC[abcGroup][3])) - { - gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; - resultsCount++; - } - } - gPokedexView->pokemonListCount = resultsCount; - } - - // Search by body color - if (bodyColor != 0xFF) - { - for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) - { - species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); - - if (bodyColor == gBaseStats[species].bodyColor) - { - gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; - resultsCount++; - } - } - gPokedexView->pokemonListCount = resultsCount; - } - - // Search by type - if (type1 != 0xFF || type2 != 0xFF) - { - if (type1 == 0xFF) - { - type1 = type2; - type2 = 0xFF; - } - - if (type2 == 0xFF) - { - for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) - { - if (gPokedexView->unk0[i].owned) - { - species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); - - types[0] = gBaseStats[species].type1; - types[1] = gBaseStats[species].type2; - if (types[0] == type1 || types[1] == type1) - { - gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; - resultsCount++; - } - } - } - } - else - { - for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) - { - if (gPokedexView->unk0[i].owned) - { - species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); - - types[0] = gBaseStats[species].type1; - types[1] = gBaseStats[species].type2; - if ((types[0] == type1 && types[1] == type2) || (types[0] == type2 && types[1] == type1)) - { - gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; - resultsCount++; - } - } - } - } - gPokedexView->pokemonListCount = resultsCount; - } - - if (gPokedexView->pokemonListCount != 0) - { - for (i = gPokedexView->pokemonListCount; i < NATIONAL_DEX_COUNT; i++) - { - gPokedexView->unk0[i].dexNum = 0xFFFF; - gPokedexView->unk0[i].seen = FALSE; - gPokedexView->unk0[i].owned = FALSE; - - } - } - - return resultsCount; -} - -#if ENGLISH -#define SUB_8091E20_WIDTH (208) -#elif GERMAN -#define SUB_8091E20_WIDTH (216) -#endif - -void sub_8091E20(const u8 *str) -{ - sub_8072AB0(str, 9, 120, SUB_8091E20_WIDTH, 32, 1); -} - -u8 sub_8091E3C(void) -{ - return CreateTask(sub_8091E54, 0); -} - -static void sub_8091E54(u8 taskId) -{ - u16 i; - - switch (gMain.state) - { - default: - case 0: - if (!gPaletteFade.active) - { - gPokedexView->unk64A = 2; - sub_8091060(0); - LZ77UnCompVram(gPokedexMenuSearch_Gfx, (void *)VRAM); - LZ77UnCompVram(gUnknown_08E96D2C, (void *)(VRAM + 0x7800)); - LoadPalette(gPokedexMenuSearch_Pal + 1, 1, 0x7E); - if (!IsNationalPokedexEnabled()) - { - for (i = 0; i < 17; i++) - { - ((u16 *)(VRAM + 0x7A80))[i] = ((u16 *)(VRAM + 0x7B00))[i]; - ((u16 *)(VRAM + 0x7AC0))[i] = ((u16 *)(VRAM + 0x7B40))[i]; - ((u16 *)(VRAM + 0x7B00))[i] = 1; - ((u16 *)(VRAM + 0x7B40))[i] = 1; - } - } - gMain.state = 1; - } - break; - case 1: - SetUpWindowConfig(&gWindowConfig_81E7064); - InitMenuWindow(&gWindowConfig_81E7064); - LoadCompressedObjectPic(&gUnknown_083A05CC[0]); - LoadSpritePalettes(gUnknown_083A05DC); - sub_809308C(taskId); - for (i = 0; i < 16; i++) - gTasks[taskId].data[i] = 0; - sub_8092EB0(taskId); - sub_8092AB0(0); - sub_8092B68(taskId); - gMain.state++; - break; - case 2: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - gMain.state++; - break; - case 3: - REG_BG3CNT = 0x0F03; - REG_DISPCNT = 0x1C40; - gMain.state++; - break; - case 4: - if (!gPaletteFade.active) - { - gTasks[taskId].func = sub_809204C; - gMain.state = 0; - } - break; - } -} - -static void sub_809204C(u8 taskId) -{ - sub_8092AB0(gTasks[taskId].data[0]); - sub_8092B68(taskId); - gTasks[taskId].func = sub_809207C; -} - -static void sub_809207C(u8 taskId) -{ - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_PC_OFF); - gTasks[taskId].func = sub_80927B8; - return; - } - if (gMain.newKeys & A_BUTTON) - { - switch (gTasks[taskId].data[0]) - { - case 0: - PlaySE(SE_PIN); - gTasks[taskId].data[1] = 0; - gTasks[taskId].func = sub_809217C; - break; - case 1: - PlaySE(SE_PIN); - gTasks[taskId].data[1] = 4; - gTasks[taskId].func = sub_809217C; - break; - case 2: - PlaySE(SE_PC_OFF); - gTasks[taskId].func = sub_80927B8; - break; - } - return; - } - if ((gMain.newKeys & DPAD_LEFT) && gTasks[taskId].data[0] > 0) - { - PlaySE(SE_Z_PAGE); - gTasks[taskId].data[0]--; - sub_8092AB0(gTasks[taskId].data[0]); - } - if ((gMain.newKeys & DPAD_RIGHT) && gTasks[taskId].data[0] < 2) - { - PlaySE(SE_Z_PAGE); - gTasks[taskId].data[0]++; - sub_8092AB0(gTasks[taskId].data[0]); - } -} - -static void sub_809217C(u8 taskId) -{ - sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); - sub_8092B68(taskId); - gTasks[taskId].func = sub_80921B0; -} - -static void sub_80921B0(u8 taskId) -{ - const u8 (*r6)[4]; - - if (gTasks[taskId].data[0] != 0) - { - if (!IsNationalPokedexEnabled()) - r6 = gUnknown_083B58A4; - else - r6 = gUnknown_083B586C; - } - else - { - if (!IsNationalPokedexEnabled()) - r6 = gUnknown_083B5888; - else - r6 = gUnknown_083B5850; - } - - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_BOWA); - sub_8092EB0(taskId); - gTasks[taskId].func = sub_809204C; - return; - } - if (gMain.newKeys & A_BUTTON) - { - if (gTasks[taskId].data[1] == 6) - { - if (gTasks[taskId].data[0] != 0) - { - gUnknown_0202FFBA = 0x40; - gPokedexView->unk62A = 0x40; - gUnknown_0202FFB8 = 0; - gPokedexView->unk610 = 0; - gSaveBlock2.pokedex.unknown1 = sub_8092E10(taskId, 5); - if (!IsNationalPokedexEnabled()) - gSaveBlock2.pokedex.unknown1 = 0; - gPokedexView->unk614 = gSaveBlock2.pokedex.unknown1; - gSaveBlock2.pokedex.order = sub_8092E10(taskId, 4); - gPokedexView->unk618 = gSaveBlock2.pokedex.order; - PlaySE(SE_PC_OFF); - gTasks[taskId].func = sub_80927B8; - } - else - { - sub_8091E20(gDexText_Searching); - gTasks[taskId].func = sub_80923FC; - PlaySE(SE_Z_SEARCH); - } - } - else - { - PlaySE(SE_PIN); - gTasks[taskId].func = sub_80925CC; - } - return; - } - - if ((gMain.newKeys & DPAD_LEFT) && r6[gTasks[taskId].data[1]][0] != 0xFF) - { - PlaySE(SE_SELECT); - gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][0]; - sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); - } - if ((gMain.newKeys & DPAD_RIGHT) && r6[gTasks[taskId].data[1]][1] != 0xFF) - { - PlaySE(SE_SELECT); - gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][1]; - sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); - } - if ((gMain.newKeys & DPAD_UP) && r6[gTasks[taskId].data[1]][2] != 0xFF) - { - PlaySE(SE_SELECT); - gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][2]; - sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); - } - if ((gMain.newKeys & DPAD_DOWN) && r6[gTasks[taskId].data[1]][3] != 0xFF) - { - PlaySE(SE_SELECT); - gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][3]; - sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); - } -} - -static void sub_80923FC(u8 taskId) -{ - u8 r10 = sub_8092E10(taskId, 5); - u8 r9 = sub_8092E10(taskId, 4); - u8 r8 = sub_8092E10(taskId, 0); - u8 r6 = sub_8092E10(taskId, 1); - u8 r4 = sub_8092E10(taskId, 2); - u8 r0 = sub_8092E10(taskId, 3); - - sub_8091AF8(r10, r9, r8, r6, r4, r0); - gTasks[taskId].func = sub_80924A4; -} - -static void sub_80924A4(u8 taskId) -{ - if (!IsSEPlaying()) - { - if (gPokedexView->pokemonListCount != 0) - { - PlaySE(SE_SEIKAI); - sub_8091E20(gDexText_SearchComplete); - } - else - { - PlaySE(SE_HAZURE); - sub_8091E20(gDexText_NoMatching); - } - gTasks[taskId].func = sub_8092508; - } -} - -static void sub_8092508(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON) - { - if (gPokedexView->pokemonListCount != 0) - { - gPokedexView->unk64F = 1; - gPokedexView->dexMode = sub_8092E10(taskId, 5); - gPokedexView->dexOrder = sub_8092E10(taskId, 4); - gTasks[taskId].func = sub_80927B8; - PlaySE(SE_PC_OFF); - } - else - { - gTasks[taskId].func = sub_809217C; - PlaySE(SE_BOWA); - } - } -} - -static void sub_80925B4(u16 a, int unused) -{ - sub_814AD7C(0x90, (a * 2 + 1) * 8); -} - -static void sub_80925CC(u8 taskId) -{ - u8 r0; - u16 *p1; - u16 *p2; - - sub_8092C8C(0); - r0 = gTasks[taskId].data[1]; - p1 = &gTasks[taskId].data[gUnknown_083B5A7C[r0].unk4]; - p2 = &gTasks[taskId].data[gUnknown_083B5A7C[r0].unk5]; - gTasks[taskId].data[14] = *p1; - gTasks[taskId].data[15] = *p2; - sub_8092D78(taskId); - CreateBlendedOutlineCursor(16, 0xFFFF, 12, 0x2D9F, 11); - sub_80925B4(*p1, 1); - gTasks[taskId].func = sub_8092644; -} - -static void sub_8092644(u8 taskId) -{ - u8 r1; - const struct UnknownStruct2 *r8; - u16 *p1; - u16 *p2; - u16 r2; - bool8 r3; - - r1 = gTasks[taskId].data[1]; - r8 = gUnknown_083B5A7C[r1].unk0; - p1 = &gTasks[taskId].data[gUnknown_083B5A7C[r1].unk4]; - p2 = &gTasks[taskId].data[gUnknown_083B5A7C[r1].unk5]; - r2 = gUnknown_083B5A7C[r1].unk6 - 1; - if (gMain.newKeys & A_BUTTON) - { - sub_814ADC8(); - PlaySE(SE_PIN); - MenuZeroFillWindowRect(18, 1, 28, 12); - sub_8092C8C(1); - gTasks[taskId].func = sub_809217C; - return; - } - if (gMain.newKeys & B_BUTTON) - { - sub_814ADC8(); - PlaySE(SE_BOWA); - MenuZeroFillWindowRect(18, 1, 28, 12); - sub_8092C8C(1); - *p1 = gTasks[taskId].data[14]; - *p2 = gTasks[taskId].data[15]; - gTasks[taskId].func = sub_809217C; - return; - } - r3 = FALSE; - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (*p1 != 0) - { - sub_80925B4(*p1, 0); - (*p1)--; - sub_80925B4(*p1, 1); - r3 = TRUE; - } - else if (*p2 != 0) - { - (*p2)--; - sub_8092D78(taskId); - sub_80925B4(*p1, 1); - r3 = TRUE; - } - if (r3) - { - PlaySE(SE_SELECT); - sub_8091E20(r8[*p1 + *p2].text1); - } - return; - } - if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (*p1 < 5 && *p1 < r2) - { - sub_80925B4(*p1, 0); - (*p1)++; - sub_80925B4(*p1, 1); - r3 = TRUE; - } - else if (r2 > 5 && *p2 < r2 - 5) - { - (*p2)++; - sub_8092D78(taskId); - sub_80925B4(5, 1); - r3 = TRUE; - } - if (r3) - { - PlaySE(SE_SELECT); - sub_8091E20(r8[*p1 + *p2].text1); - } - return; - } -} - -static void sub_80927B8(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_80927F0; -} - -static void sub_80927F0(u8 taskId) -{ - if (!gPaletteFade.active) - DestroyTask(taskId); -} - -#ifdef NONMATCHING -void sub_8092810(u8 a, u8 b, u8 c, u8 d) -{ - u16 i; - - for (i = 0; i < d; i++) - { - ((u16 *)VRAM)[15 * 0x400 + c * 32 + i + b] &= 0xFFF; - ((u16 *)VRAM)[15 * 0x400 + c * 32 + i + b] |= a << 12; - - ((u16 *)VRAM)[15 * 0x400 + (c + 1) * 32 + i + b] &= 0xFFF; - ((u16 *)VRAM)[15 * 0x400 + (c + 1) * 32 + i + b] |= a << 12; - } -} -#else -__attribute__((naked)) -void sub_8092810(u8 a, u8 b, u8 c, u8 d) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r12, r1\n\ - lsls r2, 24\n\ - lsrs r1, r2, 24\n\ - lsls r3, 24\n\ - lsrs r5, r3, 8\n\ - movs r3, 0\n\ - cmp r5, 0\n\ - beq _0809285A\n\ - lsls r7, r1, 6\n\ - ldr r6, _08092860 @ =0x00000fff\n\ - lsls r4, r0, 12\n\ -_08092830:\n\ - mov r0, r12\n\ - adds r1, r0, r3\n\ - lsls r1, 1\n\ - adds r1, r7, r1\n\ - ldr r0, _08092864 @ =0x06007800\n\ - adds r2, r1, r0\n\ - ldrh r0, [r2]\n\ - ands r0, r6\n\ - orrs r0, r4\n\ - strh r0, [r2]\n\ - ldr r0, _08092868 @ =0x06007840\n\ - adds r1, r0\n\ - ldrh r0, [r1]\n\ - ands r0, r6\n\ - orrs r0, r4\n\ - strh r0, [r1]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r0, r5\n\ - bcc _08092830\n\ -_0809285A:\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08092860: .4byte 0x00000fff\n\ -_08092864: .4byte 0x06007800\n\ -_08092868: .4byte 0x06007840\n\ - .syntax divided\n"); -} -#endif - -static void sub_809286C(u8 a, u8 b, u8 c) -{ - u8 r5 = (b & 1) | ((c & 1) << 1); - - switch (a) - { - case 0: - case 1: - case 2: - sub_8092810(r5, gUnknown_083B57E4[a].unk4, gUnknown_083B57E4[a].unk5, gUnknown_083B57E4[a].unk6); - break; - case 3: - case 4: - case 7: - case 8: - sub_8092810(r5, gUnknown_083B57FC[a - 3].unk4, gUnknown_083B57FC[a - 3].unk5, gUnknown_083B57FC[a - 3].unk6); - // fall through - case 5: - case 6: - sub_8092810(r5, gUnknown_083B57FC[a - 3].unk7, gUnknown_083B57FC[a - 3].unk8, gUnknown_083B57FC[a - 3].unk9); - break; - case 10: - sub_8092810(r5, gUnknown_083B57FC[2].unk4, gUnknown_083B57FC[2].unk5, gUnknown_083B57FC[2].unk6); - break; - case 9: - if (!IsNationalPokedexEnabled()) - sub_8092810(r5, gUnknown_083B57FC[a - 3].unk4, gUnknown_083B57FC[a - 3].unk5 - 2, gUnknown_083B57FC[a - 3].unk6); - else - sub_8092810(r5, gUnknown_083B57FC[a - 3].unk4, gUnknown_083B57FC[a - 3].unk5, gUnknown_083B57FC[a - 3].unk6); - break; - } -} - -static void sub_8092964(u8 a) -{ - switch (a) - { - case 0: - sub_809286C(0, 0, 0); - sub_809286C(1, 1, 0); - sub_809286C(2, 1, 0); - sub_809286C(3, 1, 0); - sub_809286C(4, 1, 0); - sub_809286C(10, 1, 0); - sub_809286C(5, 1, 0); - sub_809286C(6, 1, 0); - sub_809286C(7, 1, 0); - sub_809286C(8, 1, 0); - sub_809286C(9, 1, 0); - break; - case 1: - sub_809286C(0, 1, 0); - sub_809286C(1, 0, 0); - sub_809286C(2, 1, 0); - sub_809286C(3, 1, 1); - sub_809286C(4, 1, 1); - sub_809286C(10, 1, 1); - sub_809286C(5, 1, 1); - sub_809286C(6, 1, 1); - sub_809286C(7, 1, 0); - sub_809286C(8, 1, 0); - sub_809286C(9, 1, 0); - break; - case 2: - sub_809286C(0, 1, 0); - sub_809286C(1, 1, 0); - sub_809286C(2, 0, 0); - sub_809286C(3, 1, 1); - sub_809286C(4, 1, 1); - sub_809286C(10, 1, 1); - sub_809286C(5, 1, 1); - sub_809286C(6, 1, 1); - sub_809286C(7, 1, 1); - sub_809286C(8, 1, 1); - sub_809286C(9, 1, 1); - break; - } -} - -static void sub_8092AB0(u8 a) -{ - sub_8092964(a); - sub_8091E20(gUnknown_083B57E4[a].text); -} - -static void sub_8092AD4(u8 a, u8 b) -{ - sub_8092964(a); - switch (b) - { - case 0: - sub_809286C(3, 0, 0); - break; - case 1: - sub_809286C(4, 0, 0); - break; - case 2: - sub_809286C(10, 0, 0); - sub_809286C(5, 0, 0); - break; - case 3: - sub_809286C(10, 0, 0); - sub_809286C(6, 0, 0); - break; - case 4: - sub_809286C(7, 0, 0); - break; - case 5: - sub_809286C(8, 0, 0); - break; - case 6: - sub_809286C(9, 0, 0); - break; - } - sub_8091E20(gUnknown_083B57FC[b].text); -} - -static void sub_8092B68(u8 taskId) -{ - u16 var; - - var = gTasks[taskId].data[6] + gTasks[taskId].data[7]; - StringCopy(gStringVar1, gUnknown_083B5910[var].text2); - MenuPrint_PixelCoords(gUnknown_083B5AB2, 45, 16, 1); - - var = gTasks[taskId].data[8] + gTasks[taskId].data[9]; - StringCopy(gStringVar1, gUnknown_083B5968[var].text2); - MenuPrint_PixelCoords(gUnknown_083B5AB2, 45, 32, 1); - - var = gTasks[taskId].data[10] + gTasks[taskId].data[11]; - StringCopy(gStringVar1, gUnknown_083B59C8[var].text2); - MenuPrint_PixelCoords(gUnknown_083B5AAC, 45, 48, 1); - - var = gTasks[taskId].data[12] + gTasks[taskId].data[13]; - StringCopy(gStringVar1, gUnknown_083B59C8[var].text2); - MenuPrint_PixelCoords(gUnknown_083B5AAC, 93, 48, 1); - - var = gTasks[taskId].data[4] + gTasks[taskId].data[5]; - StringCopy(gStringVar1, gUnknown_083B58D8[var].text2); - MenuPrint_PixelCoords(gUnknown_083B5AB2, 45, 64, 1); - - if (IsNationalPokedexEnabled()) - { - var = gTasks[taskId].data[2] + gTasks[taskId].data[3]; - StringCopy(gStringVar1, gUnknown_083B58C0[var].text2); - MenuPrint_PixelCoords(gUnknown_083B5AB2, 45, 80, 1); - } -} - -static void sub_8092C8C(u8 a) -{ - u16 i; - u16 j; - - if (a == 0) - { - *((u16 *)(VRAM + 0x7800 + 0x22)) = 0xC0B; - for (i = 0x12; i < 0x1D; i++) - *((u16 *)(VRAM + 0x7800 + i * 2)) = 0x80D; - *((u16 *)(VRAM + 0x7800 + 0x3A)) = 0x80B; - for (j = 1; j < 13; j++) - { - *((u16 *)(VRAM + 0x7800 + 0x22 + j * 64)) = 0x40A; - for (i = 0x12; i < 0x1D; i++) - *((u16 *)(VRAM + 0x7800 + j * 64 + i * 2)) = 2; - *((u16 *)(VRAM + 0x7800 + 0x3A + j * 64)) = 0xA; - } - *((u16 *)(VRAM + 0x7800 + 0x362)) = 0x40B; - for (i = 0x12; i < 0x1D; i++) - *((u16 *)(VRAM + 0x7800 + 0x340 + i * 2)) = 0xD; - *((u16 *)(VRAM + 0x7800 + 0x37A)) = 0xB; - } - else - { - for (j = 0; j < 14; j++) - { - for (i = 0x11; i < 0x1E; i++) - { - *((u16 *)(VRAM + 0x7800 + j * 64 + i * 2)) = 0x4F; - } - } - } -} - -static void sub_8092D78(u8 taskId) -{ - const struct UnknownStruct2 *r6 = gUnknown_083B5A7C[gTasks[taskId].data[1]].unk0; - const u16 *r8 = &gTasks[taskId].data[gUnknown_083B5A7C[gTasks[taskId].data[1]].unk4]; - const u16 *r7 = &gTasks[taskId].data[gUnknown_083B5A7C[gTasks[taskId].data[1]].unk5]; - u16 i; - u16 j; - - MenuZeroFillWindowRect(18, 1, 28, 12); - for (i = 0, j = *r7; i < 6 && r6[j].text2 != NULL; i++, j++) - { -#ifndef NONMATCHING - j += 0; // Useless statement needed to match -#endif - MenuPrint(r6[j].text2, 18, i * 2 + 1); - } - sub_8091E20(r6[*r8 + *r7].text1); -} - -static u8 sub_8092E10(u8 taskId, u8 b) -{ - const u16 *ptr1 = &gTasks[taskId].data[gUnknown_083B5A7C[b].unk4]; - const u16 *ptr2 = &gTasks[taskId].data[gUnknown_083B5A7C[b].unk5]; - u16 r2 = *ptr1 + *ptr2; - - switch (b) - { - default: - return 0; - case 5: - return gUnknown_083B5A60[r2]; - case 4: - return gUnknown_083B5A62[r2]; - case 0: - if (r2 == 0) - return 0xFF; - else - return r2; - case 1: - if (r2 == 0) - return 0xFF; - else - return r2 - 1; - case 2: - case 3: - return gUnknown_083B5A68[r2]; - } -} - -static void sub_8092EB0(u8 taskId) -{ - u16 r3; - - switch (gPokedexView->unk614) - { - default: - case 0: - r3 = 0; - break; - case 1: - r3 = 1; - break; - } - gTasks[taskId].data[2] = r3; - - switch (gPokedexView->unk618) - { - default: - case 0: - r3 = 0; - break; - case 1: - r3 = 1; - break; - case 2: - r3 = 2; - break; - case 3: - r3 = 3; - break; - case 4: - r3 = 4; - break; - case 5: - r3 = 5; - break; - } - gTasks[taskId].data[4] = r3; -} - -static bool8 sub_8092F44(u8 taskId) -{ - u8 val1 = gTasks[taskId].data[1]; - const u16 *ptr = &gTasks[taskId].data[gUnknown_083B5A7C[val1].unk5]; - u16 val2 = gUnknown_083B5A7C[val1].unk6 - 1; - - if (val2 > 5 && *ptr != 0) - return FALSE; - else - return TRUE; -} - -static bool8 sub_8092F8C(u8 taskId) -{ - u8 val1 = gTasks[taskId].data[1]; - const u16 *ptr = &gTasks[taskId].data[gUnknown_083B5A7C[val1].unk5]; - u16 val2 = gUnknown_083B5A7C[val1].unk6 - 1; - - if (val2 > 5 && *ptr < val2 - 5) - return FALSE; - else - return TRUE; -} - -static void sub_8092FD8(struct Sprite *sprite) -{ - if (gTasks[sprite->data0].func == sub_8092644) - { - u8 val; - - if (sprite->data1 != 0) - { - if (sub_8092F8C(sprite->data0)) - sprite->invisible = TRUE; - else - sprite->invisible = FALSE; - } - else - { - if (sub_8092F44(sprite->data0)) - sprite->invisible = TRUE; - else - sprite->invisible = FALSE; - } - val = sprite->data2 + sprite->data1 * 128; - sprite->pos2.y = gSineTable[val] / 128; - sprite->data2 += 8; - } - else - { - sprite->invisible = TRUE; - } -} - -static void sub_809308C(u8 taskId) -{ - u8 spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 4, 0); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = 0; - gSprites[spriteId].callback = sub_8092FD8; - - spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 108, 0); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = 1; - gSprites[spriteId].vFlip = TRUE; - gSprites[spriteId].callback = sub_8092FD8; -} diff --git a/src/pokedex_cry_screen.c b/src/pokedex_cry_screen.c deleted file mode 100644 index 92fd832fc..000000000 --- a/src/pokedex_cry_screen.c +++ /dev/null @@ -1,85 +0,0 @@ -#include "global.h" -#include "pokedex_cry_screen.h" -#include "palette.h" -#include "sprite.h" - -struct Unk201C800 { - u8 unk_0; - u8 unk_1; - u8 unk_2; - u8 filler_3; - u16 unk_4; -}; - -#define EWRAM_1C800 (*(struct Unk201C800 *)(unk_201C000 + 0x800)) - -extern u8 unk_201C000[]; - -extern u8 gUnknown_03005E98; - -// data/pokedex_cry_screen.o -extern const u16 gUnknown_083FAE7C[]; -extern const u16 gUnknown_083FAF1C[]; -extern const u8 gUnknown_083FAF3C[]; -extern struct SpriteTemplate gSpriteTemplate_83FB774; -extern const struct SpriteSheet gCryMeterNeedleSpriteSheets[]; -extern const struct SpritePalette gCryMeterNeedleSpritePalettes[]; - -#if ENGLISH -#define CRY_METER_MAP_WIDTH 10 -#elif GERMAN -#define CRY_METER_MAP_WIDTH 32 -#endif - -u8 ShowPokedexCryScreen(struct CryRelatedStruct *cry, u8 arg1) { - int returnVal = FALSE; - - switch (gUnknown_03005E98) - { - case 0: - LZ77UnCompVram(gUnknown_083FAF3C, (void *) (VRAM + cry->unk0)); - LoadPalette(&gUnknown_083FAF1C, cry->paletteNo * 16, 0x20); - gUnknown_03005E98 += 1; - break; - - case 1: - { - void *vram; - u8 row, col; - u32 r12; - int x, y; - - vram = (void *) BG_SCREEN_ADDR(cry->unk2); - - r12 = (u32) (cry->unk0 << 18) >> 23; - - for (row = 0; row < 8; row++) - { - for (col = 0; col < 10; col++) - { - y = row + cry->yPos; - x = col + cry->xPos; - *(u16 *) (vram + (y * 64 + x * 2)) = (gUnknown_083FAE7C[row * CRY_METER_MAP_WIDTH + col] | (cry->paletteNo << 12)) + r12; - } - } - - gUnknown_03005E98 += 1; - break; - } - - case 2: - { - LoadSpriteSheets(gCryMeterNeedleSpriteSheets); - LoadSpritePalettes(gCryMeterNeedleSpritePalettes); - EWRAM_1C800.unk_4 = CreateSprite(&gSpriteTemplate_83FB774, 40 + cry->xPos * 8, 56 + cry->yPos * 8, 1); - EWRAM_1C800.unk_0 = 0x20; - EWRAM_1C800.unk_1 = 0x20; - EWRAM_1C800.unk_2 = 0; - - returnVal = TRUE; - break; - } - } - - return returnVal; -} diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c new file mode 100644 index 000000000..658d37976 --- /dev/null +++ b/src/pokemon/mail.c @@ -0,0 +1,437 @@ +#include "global.h" +#include "mail.h" +#include "easy_chat.h" +#include "items.h" +#include "mail_data.h" +#include "menu.h" +#include "menu_helpers.h" +#include "name_string_util.h" +#include "palette.h" +#include "pokemon_icon.h" +#include "rom4.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "text.h" +#include "unknown_task.h" + +struct UnkMailStruct +{ + u8 unk_0_0:2; + u8 unk_0_2:2; + u8 unk_0_4:4; +}; + +struct MailLayout +{ + u8 var0; + u8 var1; + u8 var2; + u8 var3_0:4; + u8 var3_4:4; + struct UnkMailStruct *var4; +}; + +struct Unk2000000 +{ + /* 0x00*/ u8 words[8][27]; + /* 0xD8*/ u8 varD8[20]; + /* 0xEC*/ MainCallback varEC; + /* 0xF0*/ MainCallback varF0; + /* 0xF4*/ struct MailStruct *varF4; + /* 0xF8*/ u8 varF8; + /* 0xF9*/ u8 varF9; + /* 0xFA*/ u8 varFA; + /* 0xFB*/ u8 varFB; + /* 0xFC*/ u8 varFC; + u8 padFD[1]; + /* 0xFE*/ u8 varFE; + /* 0xFF*/ u8 varFF; + /*0x100*/ u8 var100; + u8 pad101[3]; + /*0x104*/ MainCallback var104; + /*0x108*/ MainCallback var108; + /*0x10C*/ struct MailLayout *var10C; +}; + +struct MailGraphics +{ + u16 (*palette)[]; + u8 (*tiles)[]; + u8 (*tileMap)[]; + u16 var0C; + u16 var0E; + u16 color10; + u16 color12; +}; + +extern u8 ewram[]; +#define ewram0 (*(struct Unk2000000 *)(ewram)) + +extern struct MailGraphics gMailGraphicsTable[]; +extern u16 gUnknown_083E562C[][2]; + +extern struct MailLayout gUnknown_083E5730[]; +extern struct MailLayout gUnknown_083E57A4[]; + +static u8 sub_80F8A28(void); +static void sub_80F8D50(void); +static void sub_80F8DA0(void); +static void sub_80F8E80(void); +static void sub_80F8F18(void); +static void sub_80F8F2C(void); +static void sub_80F8F58(void); +static void sub_80F8F78(void); +static void sub_80F8FB4(void); + +void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) +{ + u16 mailDesign; + u16 buffer[2]; + + ewram0.varFF = GAME_LANGUAGE; + ewram0.var100 = 1; + ewram0.var104 = (MainCallback)sub_80EB3FC; + ewram0.var108 = (MainCallback)ConvertEasyChatWordsToString; + + mailDesign = arg0->itemId - ITEM_ORANGE_MAIL; + + if (mailDesign <= 11) + { + ewram0.varFA = arg0->itemId - ITEM_ORANGE_MAIL; + } + else + { + ewram0.varFA = 0; + arg2 = FALSE; + } + + switch (ewram0.var100) + { + case 0: + default: + ewram0.var10C = &gUnknown_083E5730[ewram0.varFA]; + break; + + case 1: + ewram0.var10C = &gUnknown_083E57A4[ewram0.varFA]; + break; + } + + if (((MailSpeciesToSpecies(arg0->species, buffer) << 16) + 0xFFFF0000) <= (410 << 16)) + { + switch (ewram0.varFA) + { + case 6: + ewram0.varFB = 1; + break; + + case 9: + ewram0.varFB = 2; + break; + + default: + ewram0.varFB = 0; + break; + } + } + else + { + ewram0.varFB = 0; + } + + + ewram0.varF4 = arg0; + ewram0.varEC = arg1; + ewram0.varF8 = arg2; + + SetMainCallback2(sub_80F8D50); +} + +#define RETURN_UP_STATE break +#define RETURN_SKIP_STATE return FALSE + +static u8 sub_80F8A28(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + remove_some_task(); + REG_DISPCNT = 0; + RETURN_UP_STATE; + + case 1: CpuFill16(0, (void *)OAM, OAM_SIZE); + RETURN_UP_STATE; + + case 2: + ResetPaletteFade(); + RETURN_UP_STATE; + + case 3: + ResetTasks(); + RETURN_UP_STATE; + + case 4: + ResetSpriteData(); + RETURN_UP_STATE; + + case 5: + FreeAllSpritePalettes(); + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + RETURN_UP_STATE; + + case 6: + SetUpWindowConfig(&gWindowConfig_81E6DFC); + RETURN_UP_STATE; + + case 7: + MultistepInitMenuWindowBegin(&gWindowConfig_81E6DFC); + RETURN_UP_STATE; + + case 8: + if (MultistepInitMenuWindowContinue() == 0) + { + return FALSE; + } + RETURN_UP_STATE; + + case 9: + MenuZeroFillScreen(); + RETURN_UP_STATE; + + case 10: CpuFill16(1, (void *)(VRAM + 0x4800), 0x800); + RETURN_UP_STATE; + + case 11: + LoadPalette(gMailGraphicsTable[ewram0.varFA].palette, 0, 16 * 2); + RETURN_UP_STATE; + + case 12: + LZ77UnCompVram(gMailGraphicsTable[ewram0.varFA].tileMap, (void *)(VRAM + 0x4000)); + RETURN_UP_STATE; + + case 13: + LZ77UnCompVram(gMailGraphicsTable[ewram0.varFA].tiles, (void *)(VRAM)); + + gPlttBufferUnfaded[241] = gMailGraphicsTable[ewram0.varFA].color10; + gPlttBufferUnfaded[248] = gMailGraphicsTable[ewram0.varFA].color12; + gPlttBufferUnfaded[10] = gUnknown_083E562C[gSaveBlock2.playerGender][0]; + gPlttBufferUnfaded[11] = gUnknown_083E562C[gSaveBlock2.playerGender][1]; + RETURN_UP_STATE; + + case 14: + if (ewram0.varF8 != 0) + { + sub_80F8DA0(); + } + RETURN_UP_STATE; + + case 15: + if (ewram0.varF8 != 0) + { + sub_80F8E80(); + } + + SetVBlankCallback(sub_80F8F18); + gPaletteFade.bufferTransferDisabled = 1; + RETURN_UP_STATE; + + case 16: + { + u16 local1; + + local1 = sub_809D4A8(ewram0.varF4->species); + + switch (ewram0.varFB) + { + case 1: + sub_809D580(local1); + ewram0.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 96, 128, 0); + break; + + case 2: + sub_809D580(local1); + ewram0.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 40, 128, 0); + break; + } + RETURN_UP_STATE; + } + + case 17: + if (sub_8055870() != TRUE) + { + RETURN_UP_STATE; + } + RETURN_SKIP_STATE; + + case 18: + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x512; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BLDCNT = 0; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gPaletteFade.bufferTransferDisabled = 0; + ewram0.varF0 = sub_80F8F58; + return TRUE; + + default: + return FALSE; + } + + gMain.state += 1; + return FALSE; +} + +static void sub_80F8D50(void) +{ + do + { + if (sub_80F8A28() == 1) + { + SetMainCallback2(sub_80F8F2C); + return; + } + } while (sub_80F9344() != 1); +} + +static u8 *sub_80F8D7C(u8 *dest, u8 *src) +{ + u16 length; + + StringCopy(dest, src); + SanitizeNameString(dest); + + length = StringLength(dest); + + return dest + length; +} + +static void sub_80F8DA0(void) +{ + u16 i; + u8 r6; + u8 *ptr; + + r6 = 0; + for (i = 0; i < ewram0.var10C->var0; i++) + { + ConvertEasyChatWordsToString(ewram0.words[i], &ewram0.varF4->words[r6], ewram0.var10C->var4[i].unk_0_2, 1); + r6 += ewram0.var10C->var4[i].unk_0_2; + } + ptr = ewram0.varD8; + if (ewram0.var100 == 0) + { + ptr = sub_80F8D7C(ptr, ewram0.varF4->playerName); + StringCopy(ptr, gOtherText_From); + ewram0.varF9 = ewram0.var10C->var2 - StringLength(ewram0.varD8); + + } + else + { + ptr = StringCopy(ptr, gOtherText_From); + sub_80F8D7C(ptr, ewram0.varF4->playerName); + ewram0.varF9 = ewram0.var10C->var2; + } +} + +static void sub_80F8E80(void) +{ + u16 pos; + u8 x; + u8 y = 0; + + for (pos = 0; pos < ewram0.var10C->var0; pos++) + { + if (ewram0.words[pos][0] == 0xFF) + { + continue; + } + + if (ewram0.words[pos][0] == 0x00) + { + continue; + } + + x = ewram0.var10C->var4[pos].unk_0_4; + y += ewram0.var10C->var4[pos].unk_0_0; + MenuPrint(ewram0.words[pos], ewram0.var10C->var3_4 + x, ewram0.var10C->var3_0 + y); + y += 2; + } + + MenuPrint(ewram0.varD8, ewram0.varF9, ewram0.var10C->var1); +} + +static void sub_80F8F18(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void sub_80F8F2C(void) +{ + if (ewram0.varFB != 0) + { + AnimateSprites(); + BuildOamBuffer(); + } + + ewram0.varF0(); +} + +static void sub_80F8F58(void) +{ + u8 local0; + + local0 = UpdatePaletteFade(); + if (local0 == 0) + { + ewram0.varF0 = sub_80F8F78; + } +} + +static void sub_80F8F78(void) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + ewram0.varF0 = sub_80F8FB4; + } +} + +static void sub_80F8FB4(void) +{ + u16 local1; + + if (UpdatePaletteFade()) + { + return; + } + + SetMainCallback2(ewram0.varEC); + switch (ewram0.varFB) + { + case 2: + case 1: + local1 = sub_809D4A8(ewram0.varF4->species); + sub_809D608(local1); + + sub_809D510(&gSprites[ewram0.varFC]); + break; + } + + memset(&ewram0, 0, 0x110); + ResetPaletteFade(); +} diff --git a/src/pokemon/mail_data.c b/src/pokemon/mail_data.c new file mode 100644 index 000000000..ae3f4b3e8 --- /dev/null +++ b/src/pokemon/mail_data.c @@ -0,0 +1,208 @@ +#include "global.h" +#include "mail_data.h" +#include "items.h" +#include "name_string_util.h" +#include "pokemon.h" +#include "pokemon_icon.h" +#include "species.h" +#include "text.h" + +void ClearMailData(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + ClearMailStruct(&gSaveBlock1.mail[i]); +} + +void ClearMailStruct(struct MailStruct *mail) +{ + int i; + + for (i = 0; i < 9; i++) + mail->words[i] = -1; + + for (i = 0; i < 8; i++) + mail->playerName[i] = -1; + + for (i = 0; i < 4; i++) + mail->trainerId[i] = 0; + + mail->species = 1; + mail->itemId = 0; +} + +bool8 MonHasMail(struct Pokemon *mon) +{ + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); + if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF) + return TRUE; + else + return FALSE; +} + +u8 GiveMailToMon(struct Pokemon *mon, u16 itemId) +{ + u16 _itemId; + u8 heldItem[2]; + u8 id; + u8 i; + u16 species; + u32 personality; + + _itemId = itemId; + heldItem[0] = _itemId; + heldItem[1] = _itemId >> 8; + id = 0; + + while (id < 6) + { + if (gSaveBlock1.mail[id].itemId == 0) + { + for (i = 0; i < 9; i++) + gSaveBlock1.mail[id].words[i] = -1; + + for (i = 0; i < 7; i++) + gSaveBlock1.mail[id].playerName[i] = gSaveBlock2.playerName[i]; + gSaveBlock1.mail[id].playerName[i] = EOS; + PadNameString(gSaveBlock1.mail[id].playerName, 0); + + for (i = 0; i < 4; i++) + gSaveBlock1.mail[id].trainerId[i] = gSaveBlock2.playerTrainerId[i]; + + species = GetBoxMonData(&mon->box, MON_DATA_SPECIES); + personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY); + gSaveBlock1.mail[id].species = SpeciesToMailSpecies(species, personality); + gSaveBlock1.mail[id].itemId = _itemId; + SetMonData(mon, MON_DATA_MAIL, &id); + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + return id; + } + id++; + } + + return -1; +} + +u16 SpeciesToMailSpecies(u16 species, u32 personality) +{ + if (species == SPECIES_UNOWN) + { + int mailSpecies = GetUnownLetterByPersonality(personality) + 30000; + return mailSpecies; + } + + return species; +} + +u16 MailSpeciesToSpecies(u16 a1, u16 *a2) +{ + u16 result; + + if (a1 >= 30000 && a1 < (30000 + UNOWN_FORM_COUNT)) + { + result = SPECIES_UNOWN; + *a2 = a1 - 30000; + } + else + { + result = a1; + } + + return result; +} + +u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail) +{ + u8 heldItem[2]; + u16 itemId = mail->itemId; + u8 mailId = GiveMailToMon(mon, itemId); + + if (mailId == 0xFF) + return 0xFF; + + gSaveBlock1.mail[mailId] = *mail; + + SetMonData(mon, MON_DATA_MAIL, &mailId); + + heldItem[0] = itemId; + heldItem[1] = itemId >> 8; + + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + + return mailId; +} + +int unref_sub_80A2DF4(void) +{ + return 0; +} + +void TakeMailFromMon(struct Pokemon *mon) +{ + u8 heldItem[2]; + u8 mailId; + + if (MonHasMail(mon)) + { + mailId = GetMonData(mon, MON_DATA_MAIL); + gSaveBlock1.mail[mailId].itemId = 0; + mailId = 0xFF; + heldItem[0] = 0; + heldItem[1] = 0; + SetMonData(mon, MON_DATA_MAIL, &mailId); + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + } +} + +void DeleteMail(u8 mailId) +{ + gSaveBlock1.mail[mailId].itemId = 0; +} + +u8 TakeMailFromMon2(struct Pokemon *mon) +{ + u8 i; + u8 newHeldItem[2]; + u8 newMailId; + + newHeldItem[0] = 0; + newHeldItem[1] = 0; + newMailId = 0xFF; + + for (i = 6; i < 16; i++) + { + if (gSaveBlock1.mail[i].itemId == 0) + { + memcpy(&gSaveBlock1.mail[i], &gSaveBlock1.mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct)); + gSaveBlock1.mail[GetMonData(mon, MON_DATA_MAIL)].itemId = 0; + SetMonData(mon, MON_DATA_MAIL, &newMailId); + SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem); + return i; + } + } + + return 0xFF; +} + +bool8 ItemIsMail(u16 itemId) +{ + switch (itemId) + { + case ITEM_ORANGE_MAIL: + case ITEM_HARBOR_MAIL: + case ITEM_GLITTER_MAIL: + case ITEM_MECH_MAIL: + case ITEM_WOOD_MAIL: + case ITEM_WAVE_MAIL: + case ITEM_BEAD_MAIL: + case ITEM_SHADOW_MAIL: + case ITEM_TROPIC_MAIL: + case ITEM_DREAM_MAIL: + case ITEM_FAB_MAIL: + case ITEM_RETRO_MAIL: + return TRUE; + default: + return FALSE; + } +} diff --git a/src/pokemon/mon_markings.c b/src/pokemon/mon_markings.c new file mode 100644 index 000000000..0cad8db59 --- /dev/null +++ b/src/pokemon/mon_markings.c @@ -0,0 +1,383 @@ +#include "global.h" +#include "main.h" +#include "menu_cursor.h" +#include "text_window.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" + +#ifdef GERMAN +#define MENU_TEXT_SPRITE_X_OFFSET 24 +#else +#define MENU_TEXT_SPRITE_X_OFFSET 32 +#endif + +struct PokemonMarkMenu +{ + /*0x0000*/ u16 baseTileTag; + /*0x0002*/ u16 basePaletteTag; + /*0x0004*/ u8 markings; // bit flags + /*0x0005*/ s8 cursorPos; + /*0x0006*/ bool8 markingsArray[4]; + /*0x000A*/ u8 cursorBaseY; + /*0x000B*/ bool8 spriteSheetLoadRequired; + /*0x000C*/ struct Sprite *menuWindowSprites[2]; // upper and lower halves of menu window + /*0x0014*/ struct Sprite *menuMarkingSprites[4]; + /*0x0024*/ struct Sprite *menuTextSprite; + /*0x0028*/ u8 *frameTiles; + /*0x002C*/ u16 *framePalette; + /*0x0030*/ u8 menuWindowSpriteTiles[0x1000]; + /*0x1030*/ u8 filler1030[0x80]; + /*0x10B0*/ u8 tileLoadState; +}; + +extern u8 gPokenavConditionMenuMisc_Gfx[]; +extern u16 gUnknown_08E966B8[]; + +extern u16 gUnknown_083E49F4[]; +extern u8 gUnknown_083E4A14[]; +extern struct OamData gOamData_83E5214; +extern struct OamData gOamData_83E521C; +extern const union AnimCmd *const gSpriteAnimTable_83E5274[]; +extern const union AnimCmd *const gSpriteAnimTable_83E52AC[]; +extern struct OamData gOamData_83E52B4; +extern const union AnimCmd *const gSpriteAnimTable_83E533C[]; + +static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL; + +void sub_80F761C(s16, s16, u16, u16); +void nullsub_65(struct Sprite *); +void sub_80F78CC(struct Sprite *); +void sub_80F7908(struct Sprite *); +struct Sprite *sub_80F7960(u16, u16, u16 *, u16); + +void sub_80F727C(struct PokemonMarkMenu *ptr) +{ + sMenu = ptr; + sMenu->spriteSheetLoadRequired = FALSE; +} + +void sub_80F728C(void) +{ + const struct FrameGraphics *frame = GetTextWindowFrameGraphics(gSaveBlock2.optionsWindowFrameType); + sMenu->frameTiles = frame->tiles; + sMenu->framePalette = frame->palette; + sMenu->tileLoadState = 0; + CpuFill16(0, sMenu->menuWindowSpriteTiles, sizeof(sMenu->menuWindowSpriteTiles)); +} + +bool8 sub_80F72D4(void) +{ + u16 i; + u8 *dest = sMenu->menuWindowSpriteTiles + sMenu->tileLoadState * 0x100; + + switch (sMenu->tileLoadState) + { + case 0: + CpuFastCopy(sMenu->frameTiles, dest, TILE_SIZE_4BPP); + for (i = 0; i < 6; i++) + { + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); + } + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 2, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); + sMenu->tileLoadState++; + break; + default: + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 3, dest, TILE_SIZE_4BPP); + for (i = 0; i < 6; i++) + { + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 4, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); + } + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 5, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); + sMenu->tileLoadState++; + break; + case 13: + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 6, dest, TILE_SIZE_4BPP); + for (i = 0; i < 6; i++) + { + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 7, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); + } + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 8, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); + sMenu->tileLoadState++; + return FALSE; + case 14: + return FALSE; + } + + return TRUE; +} + +void sub_80F7404(void) +{ + sub_80F728C(); + while (sub_80F72D4()) + ; +} + +void sub_80F7418(u8 markings, s16 x, s16 y) +{ + u16 i; + sMenu->cursorPos = 0; + sMenu->markings = markings; + for (i = 0; i < 4; i++) + sMenu->markingsArray[i] = (sMenu->markings >> i) & 1; + DestroyMenuCursor(); + sub_80F761C(x, y, sMenu->baseTileTag, sMenu->basePaletteTag); +} + +void sub_80F7470(void) +{ + u16 i; + + for (i = 0; i < 3; i++) + { + FreeSpriteTilesByTag(sMenu->baseTileTag + i); + } + + FreeSpritePaletteByTag(sMenu->basePaletteTag); + FreeSpritePaletteByTag(sMenu->basePaletteTag + 1); + + for (i = 0; i < 2; i++) + { + if (!sMenu->menuWindowSprites[i]) + return; + DestroySprite(sMenu->menuWindowSprites[i]); + } + + for (i = 0; i < 4; i++) + { + if (!sMenu->menuMarkingSprites[i]) + return; + DestroySprite(sMenu->menuMarkingSprites[i]); + } + + DestroyMenuCursor(); + + if (sMenu->menuTextSprite) + DestroySprite(sMenu->menuTextSprite); +} + +bool8 sub_80F7500(void) +{ + u16 i; + struct SpriteSheet sheets[3] = + { + { sMenu->menuWindowSpriteTiles, 0x1000, sMenu->baseTileTag }, + { gPokenavConditionMenuMisc_Gfx, 0x520, sMenu->baseTileTag + 1 }, + { NULL, 0, 0 } + }; + + if (sMenu->spriteSheetLoadRequired) + { + LoadTilesForSpriteSheets(sheets); + sMenu->spriteSheetLoadRequired = FALSE; + } + + if (gMain.newKeys & DPAD_UP) + { + s8 pos; + PlaySE(SE_SELECT); + pos = --sMenu->cursorPos; + if (pos < 0) + sMenu->cursorPos = 5; + return TRUE; + } + + if (gMain.newKeys & DPAD_DOWN) + { + s8 pos; + PlaySE(SE_SELECT); + pos = ++sMenu->cursorPos; + if (pos > 5) + sMenu->cursorPos = 0; + return TRUE; + } + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + + switch (sMenu->cursorPos) + { + case 4: + sMenu->markings = 0; + for (i = 0; i < 4; i++) + sMenu->markings |= sMenu->markingsArray[i] << i; + return FALSE; + case 5: + return FALSE; + } + + sMenu->markingsArray[sMenu->cursorPos] = !sMenu->markingsArray[sMenu->cursorPos]; + return TRUE; + } + + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + return FALSE; + } + + return TRUE; +} + +void sub_80F761C(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag) +{ + u16 i; + u8 spriteId; + + struct SpriteSheet sheets[] = + { + { sMenu->menuWindowSpriteTiles, 0x1000, baseTileTag }, + { gPokenavConditionMenuMisc_Gfx, 0x520, baseTileTag + 1 }, + { NULL, 0 } + }; + + struct SpritePalette palettes[] = + { + { sMenu->framePalette, basePaletteTag }, + { gUnknown_08E966B8, basePaletteTag + 1}, + { NULL, 0 } + }; + + struct SpriteTemplate sprTemplate = + { + baseTileTag, + basePaletteTag, + &gOamData_83E5214, + gSpriteAnimTable_83E52AC, + NULL, + gDummySpriteAffineAnimTable, + nullsub_65, + }; + + sMenu->spriteSheetLoadRequired = TRUE; + AllocTilesForSpriteSheets(sheets); + LoadSpritePalettes(palettes); + + for (i = 0; i < 2; i++) + { + spriteId = CreateSprite(&sprTemplate, x + 32, y + 32, 2); + if (spriteId != 64) + { + sMenu->menuWindowSprites[i] = &gSprites[spriteId]; + StartSpriteAnim(&gSprites[spriteId], i); + } + else + { + sMenu->menuWindowSprites[i] = NULL; + return; + } + } + + sMenu->menuWindowSprites[1]->pos1.y = y + 96; + + sprTemplate.tileTag++; + sprTemplate.paletteTag++; + sprTemplate.anims = gSpriteAnimTable_83E5274; + sprTemplate.callback = sub_80F78CC; + sprTemplate.oam = &gOamData_83E521C; + + for (i = 0; i < 4; i++) + { + spriteId = CreateSprite(&sprTemplate, x + 32, y + 16 + 16 * i, 1); + if (spriteId != 64) + { + sMenu->menuMarkingSprites[i] = &gSprites[spriteId]; + gSprites[spriteId].data0 = i; + } + else + { + sMenu->menuMarkingSprites[i] = NULL; + return; + } + } + + sprTemplate.callback = SpriteCallbackDummy; + + spriteId = CreateSprite(&sprTemplate, 0, 0, 1); + + if (spriteId != 64) + { + sMenu->menuTextSprite = &gSprites[spriteId]; + sMenu->menuTextSprite->oam.shape = ST_OAM_H_RECTANGLE; + sMenu->menuTextSprite->oam.size = 3; + StartSpriteAnim(sMenu->menuTextSprite, 9); + sMenu->menuTextSprite->pos1.x = x + MENU_TEXT_SPRITE_X_OFFSET; + sMenu->menuTextSprite->pos1.y = y + 80; + CalcCenterToCornerVec(sMenu->menuTextSprite, 1, 2, 0); + } + else + { + sMenu->menuTextSprite = NULL; + } + + sMenu->cursorBaseY = y + 8; + sub_814A5C0(0, basePaletteTag + 1, 15, 0, 0x30); + sub_814A880(x + 8, sMenu->cursorBaseY); + sub_814AABC(sub_80F7908); +} + +void nullsub_65(struct Sprite *sprite) +{ +} + +void sub_80F78CC(struct Sprite *sprite) +{ + if (sMenu->markingsArray[sprite->data0]) + StartSpriteAnim(sprite, 2 * sprite->data0 + 1); + else + StartSpriteAnim(sprite, 2 * sprite->data0); +} + +void sub_80F7908(struct Sprite *sprite) +{ + sprite->pos1.y = 16 * sMenu->cursorPos + sMenu->cursorBaseY; +} + +struct Sprite *sub_80F7920(u16 tileTag, u16 paletteTag, u16 *palette) +{ + if (!palette) + palette = gUnknown_083E49F4; + return sub_80F7960(tileTag, paletteTag, palette, 16); +} + +struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, u16 *palette) +{ + if (!palette) + palette = gUnknown_083E49F4; + return sub_80F7960(tileTag, paletteTag, palette, 1); +} + +struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, u16 *palette, u16 size) +{ + u8 spriteId; + struct SpriteTemplate sprTemplate; + struct SpriteSheet sheet = { gUnknown_083E4A14, 0x80, tileTag }; + struct SpritePalette sprPalette = { palette, paletteTag }; + + sprTemplate.tileTag = tileTag; + sprTemplate.paletteTag = paletteTag; + sprTemplate.oam = &gOamData_83E52B4; + sprTemplate.anims = gSpriteAnimTable_83E533C; + sprTemplate.images = NULL; + sprTemplate.affineAnims = gDummySpriteAffineAnimTable; + sprTemplate.callback = nullsub_65; + + sheet.size = size * 0x80; + + LoadSpriteSheet(&sheet); + LoadSpritePalette(&sprPalette); + + spriteId = CreateSprite(&sprTemplate, 0, 0, 0); + if (spriteId != 64) + return &gSprites[spriteId]; + else + return NULL; +} + +void sub_80F7A10(u8 markings, void *dest) +{ + void *src = gUnknown_083E4A14 + markings * 0x80; + DmaCopy16(3, src, dest, 0x80); +} diff --git a/src/pokemon/pokedex.c b/src/pokemon/pokedex.c new file mode 100644 index 000000000..6a17a89e0 --- /dev/null +++ b/src/pokemon/pokedex.c @@ -0,0 +1,5528 @@ + +#include "global.h" +#include "gba/m4a_internal.h" +#include "pokedex.h" +#include "battle.h" +#include "data2.h" +#include "decompress.h" +#include "event_data.h" +#include "graphics.h" +#include "m4a.h" +#include "main.h" +#include "menu.h" +#include "menu_cursor.h" +#include "palette.h" +#include "pokedex_area_screen.h" +#include "pokedex_cry_screen.h" +#include "pokemon.h" +#include "rng.h" +#include "rom4.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "trig.h" +#include "unknown_task.h" + +#define NATIONAL_DEX_COUNT 386 + +struct PokedexListItem +{ + u16 dexNum; + u16 seen:1; + u16 owned:1; +}; + +struct PokedexView +{ + struct PokedexListItem unk0[NATIONAL_DEX_COUNT]; + u16 unk608; + u8 unk60A_1:1; + u8 unk60A_2:1; + u8 unk60B; + u16 pokemonListCount; + u16 selectedPokemon; + u16 unk610; + u16 dexMode; + u16 unk614; + u16 dexOrder; + u16 unk618; + u16 unk61A; + u16 unk61C; + u16 unk61E[4]; + u16 selectedMonSpriteId; + u16 unk628; + u16 unk62A; + u8 unk62C; + u8 unk62D; + u8 unk62E; + u8 unk62F; + s16 unk630; + s16 unk632; + u16 unk634; + u16 unk636; + u16 unk638; + u16 unk63A[4]; + u8 filler642[8]; + u8 unk64A; + u8 unk64B; + u8 unk64C_1:1; + u8 selectedScreen; + u8 descriptionPageNum; + u8 unk64F; + u8 menuIsOpen; //menuIsOpen + u8 unk651; + u16 menuCursorPos; //Menu cursor position + s16 menuY; //Menu Y position (inverted because we use REG_BG0VOFS for this) + u8 unk656[8]; + u8 unk65E[8]; +}; + +enum +{ + DEX_MODE_HOENN, + DEX_MODE_NATIONAL +}; + +enum +{ + PAGE_SCREEN, + AREA_SCREEN, + CRY_SCREEN, + SIZE_SCREEN +}; + +struct PokedexEntry +{ + /*0x00*/ u8 categoryName[12]; + /*0x0C*/ u16 height; //in decimeters + /*0x0E*/ u16 weight; //in hectograms + /*0x10*/ const u8 *descriptionPage1; + /*0x14*/ const u8 *descriptionPage2; + /*0x18*/ u16 unused; + /*0x1A*/ u16 pokemonScale; + /*0x1C*/ u16 pokemonOffset; + /*0x1E*/ u16 trainerScale; + /*0x20*/ u16 trainerOffset; +}; /*size = 0x24*/ + +struct UnknownStruct2 +{ + const u8 *text1; + const u8 *text2; +}; + +struct UnknownStruct1 +{ + const struct UnknownStruct2 *unk0; + u8 unk4; + u8 unk5; + u16 unk6; +}; + +struct UnknownStruct3 +{ + const u8 *text; + u8 unk4; + u8 unk5; + u8 unk6; +}; + +struct UnknownStruct4 +{ + const u8 *text; + u8 unk4; + u8 unk5; + u8 unk6; + u8 unk7; + u8 unk8; + u8 unk9; +}; + +extern struct MusicPlayerInfo gMPlay_BGM; +extern u8 gReservedSpritePaletteCount; +extern struct SpriteTemplate gUnknown_02024E8C; +extern u8 gUnknown_03005E98; +extern const u8 gPokedexMenu_Gfx[]; +extern const u8 gUnknown_08E96738[]; +extern const u8 gUnknown_08E96888[]; +extern const u8 gUnknown_08E96994[]; +extern const u8 gUnknown_08E9C6DC[]; +extern const u8 gUnknown_08D00524[]; +extern const u8 gUnknown_08E96BD4[]; +extern const u8 gUnknown_08E96ACC[]; +extern const u8 gUnknown_08E96B58[]; +extern const u16 gPokedexMenu_Pal[]; +extern const u16 gPokedexMenu2_Pal[]; +extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; +extern const struct MonCoords gTrainerFrontPicCoords[]; +extern const struct PokedexEntry gPokedexEntries[]; +extern const u8 gPokedexMenuSearch_Gfx[]; +extern const u8 gUnknown_08E96D2C[]; +extern const u16 gPokedexMenuSearch_Pal[]; +extern const u8 gTypeNames[][7]; +extern const u8 gPokedexMenu2_Gfx[]; + +static EWRAM_DATA struct PokedexView *gPokedexView = NULL; +static EWRAM_DATA u16 gUnknown_0202FFB8 = 0; +static EWRAM_DATA u8 gUnknown_0202FFBA = 0; +static EWRAM_DATA struct PokedexListItem *gUnknown_0202FFBC = NULL; + +u8 gUnknown_03005CE8; +IntrCallback gUnknown_03005CEC; + +static u8 sub_8091E3C(void); + +static const u16 sPokedexSearchPalette[] = INCBIN_U16("graphics/pokedex/search.gbapal"); +static const u16 sNationalPokedexPalette[] = INCBIN_U16("graphics/pokedex/national.gbapal"); +const u8 gEmptySpacce_839F7FC[0xA4] = {0}; +static const u8 gUnknown_0839F8A0[] = INCBIN_U8("graphics/pokedex/pokedex_cry_layout.bin.lz"); +static const u8 gUnknown_0839F988[] = INCBIN_U8("graphics/pokedex/pokedex_size_layout.bin.lz"); +#if ENGLISH +static const u8 gUnknown_0839FA7C[] = INCBIN_U8("graphics/pokedex/noball.4bpp.lz"); +#elif GERMAN +extern const u8 gUnknown_0839FA7C[]; +#endif + +#include "../data/pokedex_orders.h" +static const struct OamData gOamData_83A0404 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83A040C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83A0414 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83A041C = +{ + .y = 160, + .affineMode = 0, + .objMode = 2, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83A0424 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83A042C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 2, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_83A0434[] = +{ + ANIMCMD_FRAME(3, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A043C[] = +{ + ANIMCMD_FRAME(1, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A0444[] = +{ + ANIMCMD_FRAME(16, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A044C[] = +{ + ANIMCMD_FRAME(32, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A0454[] = +{ + ANIMCMD_FRAME(64, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A045C[] = +{ + ANIMCMD_FRAME(96, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A0464[] = +{ + ANIMCMD_FRAME(128, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A046C[] = +{ + ANIMCMD_FRAME(160, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A0474[] = +{ + ANIMCMD_FRAME(192, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A047C[] = +{ + ANIMCMD_FRAME(224, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A0484[] = +{ + ANIMCMD_FRAME(226, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A048C[] = +{ + ANIMCMD_FRAME(228, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A0494[] = +{ + ANIMCMD_FRAME(230, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A049C[] = +{ + ANIMCMD_FRAME(232, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A04A4[] = +{ + ANIMCMD_FRAME(234, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A04AC[] = +{ + ANIMCMD_FRAME(236, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A04B4[] = +{ + ANIMCMD_FRAME(238, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A04BC[] = +{ + ANIMCMD_FRAME(240, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A04C4[] = +{ + ANIMCMD_FRAME(242, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A04CC[] = +{ + ANIMCMD_FRAME(4, 30), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_83A04D4[] = +{ + gSpriteAnim_83A0434, +}; +static const union AnimCmd *const gSpriteAnimTable_83A04D8[] = +{ + gSpriteAnim_83A043C, +}; +static const union AnimCmd *const gSpriteAnimTable_83A04DC[] = +{ + gSpriteAnim_83A0444, +}; +static const union AnimCmd *const gSpriteAnimTable_83A04E0[] = +{ + gSpriteAnim_83A044C, + gSpriteAnim_83A0454, + gSpriteAnim_83A045C, + gSpriteAnim_83A0464, +}; +static const union AnimCmd *const gSpriteAnimTable_83A04F0[] = +{ + gSpriteAnim_83A046C, + gSpriteAnim_83A0474, +}; +static const union AnimCmd *const gSpriteAnimTable_83A04F8[] = +{ + gSpriteAnim_83A047C, + gSpriteAnim_83A0484, + gSpriteAnim_83A048C, + gSpriteAnim_83A0494, + gSpriteAnim_83A049C, + gSpriteAnim_83A04A4, + gSpriteAnim_83A04AC, + gSpriteAnim_83A04B4, + gSpriteAnim_83A04BC, + gSpriteAnim_83A04C4, +}; +static const union AnimCmd *const gSpriteAnimTable_83A0520[] = +{ + gSpriteAnim_83A04CC, +}; +static void sub_808EF38(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_83A0524 = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A0404, + .anims = gSpriteAnimTable_83A04D4, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808EF38, +}; +static void sub_808EF8C(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_83A053C = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A040C, + .anims = gSpriteAnimTable_83A04D8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808EF8C, +}; +static void sub_808F08C(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_83A0554 = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A0414, + .anims = gSpriteAnimTable_83A04E0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808F08C, +}; +static void sub_808F0B4(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_83A056C = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A041C, + .anims = gSpriteAnimTable_83A04DC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808F0B4, +}; +static void sub_808ED94(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_83A0584 = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A0424, + .anims = gSpriteAnimTable_83A04F0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808ED94, +}; +static const struct SpriteTemplate gSpriteTemplate_83A059C = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A042C, + .anims = gSpriteAnimTable_83A04F8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808ED94, +}; +static void sub_808F168(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_83A05B4 = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A042C, + .anims = gSpriteAnimTable_83A0520, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808F168, +}; +static const struct CompressedSpriteSheet gUnknown_083A05CC[] = +{ + {gPokedexMenu2_Gfx, 0x1F00, 0x1000}, + {NULL, 0, 0}, +}; +static const struct SpritePalette gUnknown_083A05DC[] = +{ + {gPokedexMenu_Pal, 0x1000}, + {NULL, 0}, +}; +static const u8 gUnknown_083A05EC[] = {2, 4, 8, 16, 32}; +static const u8 gUnknown_083A05F1[] = {16, 8, 4, 2, 1}; +const u8 gEmptySpacce_83A05F6[] = {0, 0}; // Padding, maybe? +static const u8 gUnknown_083A05F8[] = _(""); +#if ENGLISH +#include "../data/pokedex_entries_en.h" +#elif GERMAN +#include "../data/pokedex_entries_de.h" +#endif +static const u16 gUnknown_083B4EC4[16] = {0}; +static const u8 *const sMonFootprintTable[] = +{ + gMonFootprint_Bulbasaur, + gMonFootprint_Bulbasaur, + gMonFootprint_Ivysaur, + gMonFootprint_Venusaur, + gMonFootprint_Charmander, + gMonFootprint_Charmeleon, + gMonFootprint_Charizard, + gMonFootprint_Squirtle, + gMonFootprint_Wartortle, + gMonFootprint_Blastoise, + gMonFootprint_Caterpie, + gMonFootprint_Metapod, + gMonFootprint_Butterfree, + gMonFootprint_Weedle, + gMonFootprint_Kakuna, + gMonFootprint_Beedrill, + gMonFootprint_Pidgey, + gMonFootprint_Pidgeotto, + gMonFootprint_Pidgeot, + gMonFootprint_Rattata, + gMonFootprint_Raticate, + gMonFootprint_Spearow, + gMonFootprint_Fearow, + gMonFootprint_Ekans, + gMonFootprint_Arbok, + gMonFootprint_Pikachu, + gMonFootprint_Raichu, + gMonFootprint_Sandshrew, + gMonFootprint_Sandslash, + gMonFootprint_NidoranF, + gMonFootprint_Nidorina, + gMonFootprint_Nidoqueen, + gMonFootprint_NidoranM, + gMonFootprint_Nidorino, + gMonFootprint_Nidoking, + gMonFootprint_Clefairy, + gMonFootprint_Clefable, + gMonFootprint_Vulpix, + gMonFootprint_Ninetales, + gMonFootprint_Jigglypuff, + gMonFootprint_Wigglytuff, + gMonFootprint_Zubat, + gMonFootprint_Golbat, + gMonFootprint_Oddish, + gMonFootprint_Gloom, + gMonFootprint_Vileplume, + gMonFootprint_Paras, + gMonFootprint_Parasect, + gMonFootprint_Venonat, + gMonFootprint_Venomoth, + gMonFootprint_Diglett, + gMonFootprint_Dugtrio, + gMonFootprint_Meowth, + gMonFootprint_Persian, + gMonFootprint_Psyduck, + gMonFootprint_Golduck, + gMonFootprint_Mankey, + gMonFootprint_Primeape, + gMonFootprint_Growlithe, + gMonFootprint_Arcanine, + gMonFootprint_Poliwag, + gMonFootprint_Poliwhirl, + gMonFootprint_Poliwrath, + gMonFootprint_Abra, + gMonFootprint_Kadabra, + gMonFootprint_Alakazam, + gMonFootprint_Machop, + gMonFootprint_Machoke, + gMonFootprint_Machamp, + gMonFootprint_Bellsprout, + gMonFootprint_Weepinbell, + gMonFootprint_Victreebel, + gMonFootprint_Tentacool, + gMonFootprint_Tentacruel, + gMonFootprint_Geodude, + gMonFootprint_Graveler, + gMonFootprint_Golem, + gMonFootprint_Ponyta, + gMonFootprint_Rapidash, + gMonFootprint_Slowpoke, + gMonFootprint_Slowbro, + gMonFootprint_Magnemite, + gMonFootprint_Magneton, + gMonFootprint_Farfetchd, + gMonFootprint_Doduo, + gMonFootprint_Dodrio, + gMonFootprint_Seel, + gMonFootprint_Dewgong, + gMonFootprint_Grimer, + gMonFootprint_Muk, + gMonFootprint_Shellder, + gMonFootprint_Cloyster, + gMonFootprint_Gastly, + gMonFootprint_Haunter, + gMonFootprint_Gengar, + gMonFootprint_Onix, + gMonFootprint_Drowzee, + gMonFootprint_Hypno, + gMonFootprint_Krabby, + gMonFootprint_Kingler, + gMonFootprint_Voltorb, + gMonFootprint_Electrode, + gMonFootprint_Exeggcute, + gMonFootprint_Exeggutor, + gMonFootprint_Cubone, + gMonFootprint_Marowak, + gMonFootprint_Hitmonlee, + gMonFootprint_Hitmonchan, + gMonFootprint_Lickitung, + gMonFootprint_Koffing, + gMonFootprint_Weezing, + gMonFootprint_Rhyhorn, + gMonFootprint_Rhydon, + gMonFootprint_Chansey, + gMonFootprint_Tangela, + gMonFootprint_Kangaskhan, + gMonFootprint_Horsea, + gMonFootprint_Seadra, + gMonFootprint_Goldeen, + gMonFootprint_Seaking, + gMonFootprint_Staryu, + gMonFootprint_Starmie, + gMonFootprint_Mrmime, + gMonFootprint_Scyther, + gMonFootprint_Jynx, + gMonFootprint_Electabuzz, + gMonFootprint_Magmar, + gMonFootprint_Pinsir, + gMonFootprint_Tauros, + gMonFootprint_Magikarp, + gMonFootprint_Gyarados, + gMonFootprint_Lapras, + gMonFootprint_Ditto, + gMonFootprint_Eevee, + gMonFootprint_Vaporeon, + gMonFootprint_Jolteon, + gMonFootprint_Flareon, + gMonFootprint_Porygon, + gMonFootprint_Omanyte, + gMonFootprint_Omastar, + gMonFootprint_Kabuto, + gMonFootprint_Kabutops, + gMonFootprint_Aerodactyl, + gMonFootprint_Snorlax, + gMonFootprint_Articuno, + gMonFootprint_Zapdos, + gMonFootprint_Moltres, + gMonFootprint_Dratini, + gMonFootprint_Dragonair, + gMonFootprint_Dragonite, + gMonFootprint_Mewtwo, + gMonFootprint_Mew, + gMonFootprint_Chikorita, + gMonFootprint_Bayleef, + gMonFootprint_Meganium, + gMonFootprint_Cyndaquil, + gMonFootprint_Quilava, + gMonFootprint_Typhlosion, + gMonFootprint_Totodile, + gMonFootprint_Croconaw, + gMonFootprint_Feraligatr, + gMonFootprint_Sentret, + gMonFootprint_Furret, + gMonFootprint_Hoothoot, + gMonFootprint_Noctowl, + gMonFootprint_Ledyba, + gMonFootprint_Ledian, + gMonFootprint_Spinarak, + gMonFootprint_Ariados, + gMonFootprint_Crobat, + gMonFootprint_Chinchou, + gMonFootprint_Lanturn, + gMonFootprint_Pichu, + gMonFootprint_Cleffa, + gMonFootprint_Igglybuff, + gMonFootprint_Togepi, + gMonFootprint_Togetic, + gMonFootprint_Natu, + gMonFootprint_Xatu, + gMonFootprint_Mareep, + gMonFootprint_Flaaffy, + gMonFootprint_Ampharos, + gMonFootprint_Bellossom, + gMonFootprint_Marill, + gMonFootprint_Azumarill, + gMonFootprint_Sudowoodo, + gMonFootprint_Politoed, + gMonFootprint_Hoppip, + gMonFootprint_Skiploom, + gMonFootprint_Jumpluff, + gMonFootprint_Aipom, + gMonFootprint_Sunkern, + gMonFootprint_Sunflora, + gMonFootprint_Yanma, + gMonFootprint_Wooper, + gMonFootprint_Quagsire, + gMonFootprint_Espeon, + gMonFootprint_Umbreon, + gMonFootprint_Murkrow, + gMonFootprint_Slowking, + gMonFootprint_Misdreavus, + gMonFootprint_Unown, + gMonFootprint_Wobbuffet, + gMonFootprint_Girafarig, + gMonFootprint_Pineco, + gMonFootprint_Forretress, + gMonFootprint_Dunsparce, + gMonFootprint_Gligar, + gMonFootprint_Steelix, + gMonFootprint_Snubbull, + gMonFootprint_Granbull, + gMonFootprint_Qwilfish, + gMonFootprint_Scizor, + gMonFootprint_Shuckle, + gMonFootprint_Heracross, + gMonFootprint_Sneasel, + gMonFootprint_Teddiursa, + gMonFootprint_Ursaring, + gMonFootprint_Slugma, + gMonFootprint_Magcargo, + gMonFootprint_Swinub, + gMonFootprint_Piloswine, + gMonFootprint_Corsola, + gMonFootprint_Remoraid, + gMonFootprint_Octillery, + gMonFootprint_Delibird, + gMonFootprint_Mantine, + gMonFootprint_Skarmory, + gMonFootprint_Houndour, + gMonFootprint_Houndoom, + gMonFootprint_Kingdra, + gMonFootprint_Phanpy, + gMonFootprint_Donphan, + gMonFootprint_Porygon2, + gMonFootprint_Stantler, + gMonFootprint_Smeargle, + gMonFootprint_Tyrogue, + gMonFootprint_Hitmontop, + gMonFootprint_Smoochum, + gMonFootprint_Elekid, + gMonFootprint_Magby, + gMonFootprint_Miltank, + gMonFootprint_Blissey, + gMonFootprint_Raikou, + gMonFootprint_Entei, + gMonFootprint_Suicune, + gMonFootprint_Larvitar, + gMonFootprint_Pupitar, + gMonFootprint_Tyranitar, + gMonFootprint_Lugia, + gMonFootprint_HoOh, + gMonFootprint_Celebi, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_Treecko, + gMonFootprint_Grovyle, + gMonFootprint_Sceptile, + gMonFootprint_Torchic, + gMonFootprint_Combusken, + gMonFootprint_Blaziken, + gMonFootprint_Mudkip, + gMonFootprint_Marshtomp, + gMonFootprint_Swampert, + gMonFootprint_Poochyena, + gMonFootprint_Mightyena, + gMonFootprint_Zigzagoon, + gMonFootprint_Linoone, + gMonFootprint_Wurmple, + gMonFootprint_Silcoon, + gMonFootprint_Beautifly, + gMonFootprint_Cascoon, + gMonFootprint_Dustox, + gMonFootprint_Lotad, + gMonFootprint_Lombre, + gMonFootprint_Ludicolo, + gMonFootprint_Seedot, + gMonFootprint_Nuzleaf, + gMonFootprint_Shiftry, + gMonFootprint_Nincada, + gMonFootprint_Ninjask, + gMonFootprint_Shedinja, + gMonFootprint_Taillow, + gMonFootprint_Swellow, + gMonFootprint_Shroomish, + gMonFootprint_Breloom, + gMonFootprint_Spinda, + gMonFootprint_Wingull, + gMonFootprint_Pelipper, + gMonFootprint_Surskit, + gMonFootprint_Masquerain, + gMonFootprint_Wailmer, + gMonFootprint_Wailord, + gMonFootprint_Skitty, + gMonFootprint_Delcatty, + gMonFootprint_Kecleon, + gMonFootprint_Baltoy, + gMonFootprint_Claydol, + gMonFootprint_Nosepass, + gMonFootprint_Torkoal, + gMonFootprint_Sableye, + gMonFootprint_Barboach, + gMonFootprint_Whiscash, + gMonFootprint_Luvdisc, + gMonFootprint_Corphish, + gMonFootprint_Crawdaunt, + gMonFootprint_Feebas, + gMonFootprint_Milotic, + gMonFootprint_Carvanha, + gMonFootprint_Sharpedo, + gMonFootprint_Trapinch, + gMonFootprint_Vibrava, + gMonFootprint_Flygon, + gMonFootprint_Makuhita, + gMonFootprint_Hariyama, + gMonFootprint_Electrike, + gMonFootprint_Manectric, + gMonFootprint_Numel, + gMonFootprint_Camerupt, + gMonFootprint_Spheal, + gMonFootprint_Sealeo, + gMonFootprint_Walrein, + gMonFootprint_Cacnea, + gMonFootprint_Cacturne, + gMonFootprint_Snorunt, + gMonFootprint_Glalie, + gMonFootprint_Lunatone, + gMonFootprint_Solrock, + gMonFootprint_Azurill, + gMonFootprint_Spoink, + gMonFootprint_Grumpig, + gMonFootprint_Plusle, + gMonFootprint_Minun, + gMonFootprint_Mawile, + gMonFootprint_Meditite, + gMonFootprint_Medicham, + gMonFootprint_Swablu, + gMonFootprint_Altaria, + gMonFootprint_Wynaut, + gMonFootprint_Duskull, + gMonFootprint_Dusclops, + gMonFootprint_Roselia, + gMonFootprint_Slakoth, + gMonFootprint_Vigoroth, + gMonFootprint_Slaking, + gMonFootprint_Gulpin, + gMonFootprint_Swalot, + gMonFootprint_Tropius, + gMonFootprint_Whismur, + gMonFootprint_Loudred, + gMonFootprint_Exploud, + gMonFootprint_Clamperl, + gMonFootprint_Huntail, + gMonFootprint_Gorebyss, + gMonFootprint_Absol, + gMonFootprint_Shuppet, + gMonFootprint_Banette, + gMonFootprint_Seviper, + gMonFootprint_Zangoose, + gMonFootprint_Relicanth, + gMonFootprint_Aron, + gMonFootprint_Lairon, + gMonFootprint_Aggron, + gMonFootprint_Castform, + gMonFootprint_Volbeat, + gMonFootprint_Illumise, + gMonFootprint_Lileep, + gMonFootprint_Cradily, + gMonFootprint_Anorith, + gMonFootprint_Armaldo, + gMonFootprint_Ralts, + gMonFootprint_Kirlia, + gMonFootprint_Gardevoir, + gMonFootprint_Bagon, + gMonFootprint_Shelgon, + gMonFootprint_Salamence, + gMonFootprint_Beldum, + gMonFootprint_Metang, + gMonFootprint_Metagross, + gMonFootprint_Regirock, + gMonFootprint_Regice, + gMonFootprint_Registeel, + gMonFootprint_Kyogre, + gMonFootprint_Groudon, + gMonFootprint_Rayquaza, + gMonFootprint_Latias, + gMonFootprint_Latios, + gMonFootprint_Jirachi, + gMonFootprint_Deoxys, + gMonFootprint_Chimecho, + gMonFootprint_Bulbasaur, +}; +static const u8 gUnknown_083B5558[] = _("{CLEAR_TO 0}"); +const u8 gUnknown_083B555C[] = INCBIN_U8("graphics/unknown/unknown_3B555C.bin"); +static const struct OamData gOamData_83B557C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static void *const gUnknown_083B5584[] = +{ + (void *)0x02008000, + (void *)0x0200C000, + (void *)0x02010000, + (void *)0x02014000, +}; +static const struct SpriteFrameImage gSpriteImageTable_83B5594[] = +{ + {(u8 *)0x02008000, 0x800}, + {(u8 *)0x02008800, 0x800}, + {(u8 *)0x02009000, 0x800}, + {(u8 *)0x02009800, 0x800}, + {(u8 *)0x0200A000, 0x800}, + {(u8 *)0x0200A800, 0x800}, + {(u8 *)0x0200B000, 0x800}, + {(u8 *)0x0200B800, 0x800}, + {(u8 *)0x0200C000, 0x800}, + {(u8 *)0x0200C800, 0x800}, + {(u8 *)0x0200D000, 0x800}, + {(u8 *)0x0200D800, 0x800}, + {(u8 *)0x0200E000, 0x800}, + {(u8 *)0x0200E800, 0x800}, + {(u8 *)0x0200F000, 0x800}, + {(u8 *)0x0200F800, 0x800}, +}; +static const struct SpriteFrameImage gSpriteImageTable_83B5614[] = +{ + {(u8 *)0x0200C000, 0x800}, + {(u8 *)0x0200C800, 0x800}, + {(u8 *)0x0200D000, 0x800}, + {(u8 *)0x0200D800, 0x800}, + {(u8 *)0x0200E000, 0x800}, + {(u8 *)0x0200E800, 0x800}, + {(u8 *)0x0200F000, 0x800}, + {(u8 *)0x0200F800, 0x800}, + {(u8 *)0x02010000, 0x800}, + {(u8 *)0x02010800, 0x800}, + {(u8 *)0x02011000, 0x800}, + {(u8 *)0x02011800, 0x800}, + {(u8 *)0x02012000, 0x800}, + {(u8 *)0x02012800, 0x800}, + {(u8 *)0x02013000, 0x800}, + {(u8 *)0x02013800, 0x800}, +}; +static const struct SpriteFrameImage gSpriteImageTable_83B5694[] = +{ + {(u8 *)0x02010000, 0x800}, + {(u8 *)0x02010800, 0x800}, + {(u8 *)0x02011000, 0x800}, + {(u8 *)0x02011800, 0x800}, + {(u8 *)0x02012000, 0x800}, + {(u8 *)0x02012800, 0x800}, + {(u8 *)0x02013000, 0x800}, + {(u8 *)0x02013800, 0x800}, + {(u8 *)0x02014000, 0x800}, + {(u8 *)0x02014800, 0x800}, + {(u8 *)0x02015000, 0x800}, + {(u8 *)0x02015800, 0x800}, + {(u8 *)0x02016000, 0x800}, + {(u8 *)0x02016800, 0x800}, + {(u8 *)0x02017000, 0x800}, + {(u8 *)0x02017800, 0x800}, +}; +static const struct SpriteFrameImage gSpriteImageTable_83B5714[] = +{ + {(u8 *)0x02014000, 0x800}, + {(u8 *)0x02014800, 0x800}, + {(u8 *)0x02015000, 0x800}, + {(u8 *)0x02015800, 0x800}, + {(u8 *)0x02016000, 0x800}, + {(u8 *)0x02016800, 0x800}, + {(u8 *)0x02017000, 0x800}, + {(u8 *)0x02017800, 0x800}, + {(u8 *)0x02018000, 0x800}, + {(u8 *)0x02018800, 0x800}, + {(u8 *)0x02019000, 0x800}, + {(u8 *)0x02019800, 0x800}, + {(u8 *)0x0201A000, 0x800}, + {(u8 *)0x0201A800, 0x800}, + {(u8 *)0x0201B000, 0x800}, + {(u8 *)0x0201B800, 0x800}, +}; +static const struct SpriteFrameImage *const gUnknown_083B5794[] = +{ + gSpriteImageTable_83B5594, + gSpriteImageTable_83B5614, + gSpriteImageTable_83B5694, + gSpriteImageTable_83B5714, +}; +static void nullsub_59(struct Sprite *); +static const struct SpriteTemplate gUnknown_083B57A4 = +{ + .tileTag = 0xFFFF, + .paletteTag = 0, + .oam = &gOamData_83B557C, + .anims = NULL, + .images = gSpriteImageTable_83B5594, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = nullsub_59, +}; +static const u8 gUnknown_083B57BC[][4] = +{ + {0, 0, 0, 0}, + {CHAR_A, 3, CHAR_a, 3}, + {CHAR_D, 3, CHAR_d, 3}, + {CHAR_G, 3, CHAR_g, 3}, + {CHAR_J, 3, CHAR_j, 3}, + {CHAR_M, 3, CHAR_m, 3}, + {CHAR_P, 3, CHAR_p, 3}, + {CHAR_S, 3, CHAR_s, 3}, + {CHAR_V, 3, CHAR_v, 3}, + {CHAR_Y, 2, CHAR_y, 2}, +}; +static const struct UnknownStruct3 gUnknown_083B57E4[] = +{ + {DexText_SearchForPoke, 0, 0, 5}, + {DexText_SwitchDex, 6, 0, 5}, + {DexText_ReturnToDex, 12, 0, 5}, +}; +static const struct UnknownStruct4 gUnknown_083B57FC[] = +{ + {DexText_ListByABC, 0, 2, 5, 5, 2, 12}, + {DexText_ListByColor, 0, 4, 5, 5, 4, 12}, + {DexText_ListByType, 0, 6, 5, 5, 6, 6}, + {DexText_ListByType, 0, 6, 5, 11, 6, 6}, + {DexText_SelectDexList, 0, 8, 5, 5, 8, 12}, + {DexText_SelectDexMode, 0, 10, 5, 5, 10, 12}, + {DexText_ExecuteSearchSwitch, 0, 12, 5, 0, 0, 0}, +}; +static const u8 gUnknown_083B5850[][4] = +{ + {0xFF, 0xFF, 0xFF, 1}, + {0xFF, 0xFF, 0, 2}, + {0xFF, 3, 1, 4}, + { 2, 0xFF, 1, 4}, + {0xFF, 0xFF, 2, 5}, + {0xFF, 0xFF, 4, 6}, + {0xFF, 0xFF, 5, 0xFF}, +}; +static const u8 gUnknown_083B586C[][4] = +{ + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 5}, + {0xFF, 0xFF, 4, 6}, + {0xFF, 0xFF, 5, 0xFF}, +}; +static const u8 gUnknown_083B5888[][4] = +{ + {0xFF, 0xFF, 0xFF, 1}, + {0xFF, 0xFF, 0, 2}, + {0xFF, 3, 1, 4}, + { 2, 0xFF, 1, 4}, + {0xFF, 0xFF, 2, 6}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 4, 0xFF}, +}; +static const u8 gUnknown_083B58A4[][4] = +{ + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 6}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 4, 0xFF}, +}; +static const struct UnknownStruct2 gUnknown_083B58C0[] = +{ + {DexText_HoennDex2, DexText_HoennDex}, + {DexText_NationalDex2, DexText_NationalDex}, + {NULL, NULL}, +}; +static const struct UnknownStruct2 gUnknown_083B58D8[] = +{ + {DexText_ListByNumber, DexText_NumericalMode}, + {DexText_ListByABC2, DexText_ABCMode}, + {DexText_ListByHeavyToLightest, DexText_HeaviestMode}, + {DexText_ListByLightToHeaviest, DexText_LightestMode}, + {DexText_ListByTallToSmallest, DexText_TallestMode}, + {DexText_ListBySmallToTallest, DexText_SmallestMode}, + {NULL, NULL}, +}; +static const struct UnknownStruct2 gUnknown_083B5910[] = +{ + {DexText_Terminator5, DexText_DontSpecify}, + {DexText_Terminator5, DexText_ABC}, + {DexText_Terminator5, DexText_DEF}, + {DexText_Terminator5, DexText_GHI}, + {DexText_Terminator5, DexText_JKL}, + {DexText_Terminator5, DexText_MNO}, + {DexText_Terminator5, DexText_PQR}, + {DexText_Terminator5, DexText_STU}, + {DexText_Terminator5, DexText_VWX}, + {DexText_Terminator5, DexText_YZ}, + {NULL, NULL}, +}; +static const struct UnknownStruct2 gUnknown_083B5968[] = +{ + {DexText_Terminator5, DexText_DontSpecify}, + {DexText_Terminator5, DexText_Red}, + {DexText_Terminator5, DexText_Blue}, + {DexText_Terminator5, DexText_Yellow}, + {DexText_Terminator5, DexText_Green}, + {DexText_Terminator5, DexText_Black}, + {DexText_Terminator5, DexText_Brown}, + {DexText_Terminator5, DexText_Purple}, + {DexText_Terminator5, DexText_Gray}, + {DexText_Terminator5, DexText_White}, + {DexText_Terminator5, DexText_Pink}, + {NULL, NULL}, +}; +static const struct UnknownStruct2 gUnknown_083B59C8[] = +{ + {DexText_Terminator5, DexText_None}, + {DexText_Terminator5, gTypeNames[TYPE_NORMAL]}, + {DexText_Terminator5, gTypeNames[TYPE_FIGHTING]}, + {DexText_Terminator5, gTypeNames[TYPE_FLYING]}, + {DexText_Terminator5, gTypeNames[TYPE_POISON]}, + {DexText_Terminator5, gTypeNames[TYPE_GROUND]}, + {DexText_Terminator5, gTypeNames[TYPE_ROCK]}, + {DexText_Terminator5, gTypeNames[TYPE_BUG]}, + {DexText_Terminator5, gTypeNames[TYPE_GHOST]}, + {DexText_Terminator5, gTypeNames[TYPE_STEEL]}, + {DexText_Terminator5, gTypeNames[TYPE_FIRE]}, + {DexText_Terminator5, gTypeNames[TYPE_WATER]}, + {DexText_Terminator5, gTypeNames[TYPE_GRASS]}, + {DexText_Terminator5, gTypeNames[TYPE_ELECTRIC]}, + {DexText_Terminator5, gTypeNames[TYPE_PSYCHIC]}, + {DexText_Terminator5, gTypeNames[TYPE_ICE]}, + {DexText_Terminator5, gTypeNames[TYPE_DRAGON]}, + {DexText_Terminator5, gTypeNames[TYPE_DARK]}, + {NULL, NULL}, +}; +static const u8 gUnknown_083B5A60[] = {0, 1}; +static const u8 gUnknown_083B5A62[] = {0, 1, 2, 3, 4, 5}; +static const u8 gUnknown_083B5A68[] = {0xFF, 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17}; +static const struct UnknownStruct1 gUnknown_083B5A7C[] = +{ + {gUnknown_083B5910, 6, 7, 10}, + {gUnknown_083B5968, 8, 9, 11}, + {gUnknown_083B59C8, 10, 11, 18}, + {gUnknown_083B59C8, 12, 13, 18}, + {gUnknown_083B58D8, 4, 5, 6}, + {gUnknown_083B58C0, 2, 3, 2}, +}; +static const u8 gUnknown_083B5AAC[] = _("{STR_VAR_1}{CLEAR_TO 43}"); +static const u8 gUnknown_083B5AB2[] = _("{STR_VAR_1}{CLEAR_TO 96}"); + +static void MainCB(void); +static void Task_PokedexShowMainScreen(u8 taskId); +static void Task_PokedexMainScreen(u8 taskId); +static void sub_808C898(u8 taskId); +static void Task_PokedexMainScreenMenu(u8 taskId); +static void sub_808CA64(u8 taskId); +static void sub_808CAE4(u8 taskId); +static void sub_808CB8C(u8 taskId); +static void Task_ClosePokedex(u8 taskId); +static void sub_808CCC4(u8 taskId); +static void Task_PokedexResultsScreen(u8 taskId); +static void sub_808CEF8(u8 taskId); +static void Task_PokedexResultsScreenMenu(u8 taskId); +static void sub_808D118(u8 taskId); +static void sub_808D198(u8 taskId); +static void Task_PokedexResultsScreenReturnToMainScreen(u8 taskId); +static void Task_PokedexResultsScreenExitPokedex(u8 taskId); +static bool8 sub_808D344(u8 a); +static void sub_808D640(void); +static void SortPokedex(u8 dexMode, u8 sortMode); +static void sub_808DEB0(u16 a, u8 b, u8 c, u16 d); +static void sub_808DF88(u16 a, u8 b, u8 c, u16 d); +static u8 sub_808DFE4(u16 num, u8 b, u8 c); +static void sub_808E090(u8 a, u8 b, u16 c); +static void sub_808E0CC(u16 a, u16 b); +static bool8 sub_808E208(u8 a, u8 b, u8 c); +static u16 sub_808E48C(u16 a, u16 b); +static void sub_808E6BC(void); +static u8 sub_808E71C(void); +static u8 sub_808E82C(void); +static u16 sub_808E888(u16 a1); +static u32 sub_808E8C8(u16 a, s16 b, s16 c); +static void sub_808E978(u8 a); +static void sub_808EDB8(struct Sprite *sprite); +static void sub_808EE28(struct Sprite *sprite); +static u8 sub_808F210(struct PokedexListItem *, u8); +static bool8 sub_808F250(u8 taskId); +static u8 sub_808F284(struct PokedexListItem *, u8); +static void Task_InitPageScreenMultistep(u8 taskId); +static void Task_PageScreenProcessInput(u8 taskId); +static void sub_808F888(u8 taskId); +static void Task_ClosePageScreen(u8 taskId); +static void Task_InitAreaScreenMultistep(u8 taskId); +static void Task_AreaScreenProcessInput(u8 taskId); +static void sub_808FA00(u8 taskId); +static void Task_InitCryScreenMultistep(u8 taskId); +static void Task_CryScreenProcessInput(u8 taskId); +static void sub_808FFBC(u8 taskId); +static void sub_8090040(u8 a); +static void Task_InitSizeScreenMultistep(u8 taskId); +static void Task_SizeScreenProcessInput(u8 taskId); +static void sub_8090498(u8 taskId); +static void sub_80904FC(u16 a); +static void sub_8090540(u16 a); +static void sub_8090584(u8 a, u16 b); +static void sub_8090644(u8 a, u16 b); +static void sub_8090750(u8); +static void sub_8090A3C(u8); +static void sub_8090B8C(u8); +static void sub_8090C28(struct Sprite *); +static void sub_8090C68(void); +static void sub_8091060(u16); +static void sub_8091154(u16 order, u8, u8); +static u8 sub_80911C8(u16 num, u8, u8); +static u8 sub_8091260(u16 num, u8, u8, u8); +static void sub_8091304(const u8 *name, u8, u8); +static void sub_8091458(u16 height, u8 i, u8 i1); +static void sub_8091564(u16 weight, u8 i, u8 i1); +static void sub_8091738(u16, u16, u16); +static void sub_80917CC(u16 i, u16 i1); +static u16 sub_8091818(u8, u16, u16, u16); +static u16 sub_80918EC(u16 a, s16 b, s16 c, u16 d); +static u8 sub_8091A4C(u16 gender, s16, s16, u16); +static void sub_8091E54(u8); +static void sub_809204C(u8); +static void sub_809207C(u8); +static void sub_809217C(u8); +static void sub_80921B0(u8); +static void sub_80923FC(u8); +static void sub_80924A4(u8); +static void sub_8092508(u8); +static void sub_80925CC(u8); +static void sub_8092644(u8); +static void sub_80927B8(u8); +static void sub_80927F0(u8); +static void sub_8092AB0(u8); +static void sub_8092AD4(u8, u8); +static void sub_8092B68(u8); +static void sub_8092C8C(u8); +static void sub_8092D78(u8); +static u8 sub_8092E10(u8, u8); +static void sub_8092EB0(u8); +static void sub_809308C(u8); + + +void ResetPokedex(void) +{ + u16 i; + + gUnknown_0202FFB8 = 0; + gUnknown_0202FFBA = 0x40; + gUnknown_03005CE8 = 0; + gSaveBlock2.pokedex.unknown1 = 0; + gSaveBlock2.pokedex.order = 0; + gSaveBlock2.pokedex.nationalMagic = 0; + gSaveBlock2.pokedex.unknown2 = 0; + gSaveBlock2.pokedex.unownPersonality = 0; + gSaveBlock2.pokedex.spindaPersonality = 0; + gSaveBlock2.pokedex.unknown3 = 0; + DisableNationalPokedex(); + for (i = 0; i <= 51; i++) + { + gSaveBlock2.pokedex.owned[i] = 0; + gSaveBlock2.pokedex.seen[i] = 0; + gSaveBlock1.unk938[i] = 0; + gSaveBlock1.unk3A8C[i] = 0; + } +} + +void sub_808C0A0(void) +{ + gUnknown_0202FFB8 = 0; + gUnknown_0202FFBA = 0x40; +} + +static void sub_808C0B8(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void ClearPokedexView(struct PokedexView *pokedexView) +{ + u16 i; + + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + pokedexView->unk0[i].dexNum |= 0xFFFF; + pokedexView->unk0[i].seen = 0; + pokedexView->unk0[i].owned = 0; + } + pokedexView->unk608 = 0; + pokedexView->unk60A_1 = 0; + pokedexView->unk60A_2 = 0; + pokedexView->pokemonListCount = 0; + pokedexView->selectedPokemon = 0; + pokedexView->unk610 = 0; + pokedexView->dexMode = 0; + pokedexView->unk614 = 0; + pokedexView->dexOrder = 0; + pokedexView->unk618 = 0; + pokedexView->unk61A = 0; + pokedexView->unk61C = 0; + for (i = 0; i <= 3; i++) + pokedexView->unk61E[i] |= 0xFFFF; + pokedexView->unk628 = 0; + pokedexView->unk62A = 0; + pokedexView->unk62C = 0; + pokedexView->unk62D = 0; + pokedexView->unk62E = 0; + pokedexView->unk62F = 0; + pokedexView->unk630 = 0; + pokedexView->unk632 = 0; + pokedexView->unk634 = 0; + pokedexView->unk636 = 0; + pokedexView->unk638 = 0; + for (i = 0; i <= 3; i++) + pokedexView->unk63A[i] = 0; + pokedexView->unk64A = 0; + pokedexView->unk64B = 0; + pokedexView->unk64C_1 = 0; + pokedexView->selectedScreen = 0; + pokedexView->unk64F = 0; + pokedexView->menuIsOpen = 0; + pokedexView->menuCursorPos = 0; + pokedexView->menuY = 0; + for (i = 0; i <= 7; i++) + pokedexView->unk656[i] = 0; + for (i = 0; i <= 7; i++) + pokedexView->unk65E[i] = 0; +} + +void CB2_InitPokedex(void) +{ + switch (gMain.state) + { + case 0: + default: + { + u8 *addr; + u32 size; + + SetVBlankCallback(NULL); + sub_8091060(0); + 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; + } + } + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + gMain.state = 1; + } + break; + case 1: + remove_some_task(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + SetUpWindowConfig(&gWindowConfig_81E7048); + InitMenuWindow(&gWindowConfig_81E7048); + gMain.state++; + break; + case 2: + switch (Random() & 3) + { + case 0: + default: + gPokedexView = (struct PokedexView *)0x02018000; + break; + case 1: + gPokedexView = (struct PokedexView *)0x02018800; + break; + case 2: + gPokedexView = (struct PokedexView *)0x02019000; + break; + case 3: + gPokedexView = (struct PokedexView *)0x02019800; + break; + } + ClearPokedexView(gPokedexView); + CreateTask(Task_PokedexShowMainScreen, 0); + gPokedexView->dexMode = gSaveBlock2.pokedex.unknown1; + if (!IsNationalPokedexEnabled()) + gPokedexView->dexMode = DEX_MODE_HOENN; + gPokedexView->dexOrder = gSaveBlock2.pokedex.order; + gPokedexView->selectedPokemon = gUnknown_0202FFB8; + gPokedexView->unk62C = gUnknown_0202FFBA; + gPokedexView->selectedScreen = PAGE_SCREEN; + gPokedexView->descriptionPageNum = 0; + if (!IsNationalPokedexEnabled()) + { + gPokedexView->unk61A = GetHoennPokedexCount(0); + gPokedexView->unk61C = GetHoennPokedexCount(1); + } + else + { + gPokedexView->unk61A = GetNationalPokedexCount(0); + gPokedexView->unk61C = GetNationalPokedexCount(1); + } + gPokedexView->unk62D = 8; + gMain.state++; + break; + case 3: + { + u16 savedIme; + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= 1; + REG_IME = savedIme; + REG_DISPSTAT |= 8; + SetVBlankCallback(sub_808C0B8); + SetMainCallback2(MainCB); + SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x80); + } + break; + } +} + +u8 unref_sub_808C540(void (*func)(u8)) +{ + u16 savedIme; + u8 taskId; + + SetVBlankCallback(NULL); + sub_8091060(0x200); + remove_some_task(); + ResetTasks(); + ResetPaletteFade(); + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= 1; + REG_IME = savedIme; + REG_DISPSTAT |= 0x8; + SetVBlankCallback(sub_808C0B8); + SetMainCallback2(MainCB); + if (!gPokedexView->unk64B) + taskId = CreateTask(sub_808CAE4, 0); + else + taskId = CreateTask(sub_808D198, 0); + gTasks[taskId].data[0] = CreateTask(func, 0); + return gTasks[taskId].data[0]; +} + +static void MainCB(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void Task_PokedexShowMainScreen(u8 taskId) +{ + gPokedexView->unk64C_1 = 0; + if (sub_808D344(0)) + gTasks[taskId].func = Task_PokedexMainScreen; +} + +//Hide menu and process input on main screen +void Task_PokedexMainScreen(u8 taskId) +{ + REG_BG0VOFS = gPokedexView->menuY; + + //If menu is open, slide it down, off screen + if (gPokedexView->menuY) + gPokedexView->menuY -= 8; + else + { + if ((gMain.newKeys & A_BUTTON) && gPokedexView->unk0[gPokedexView->selectedPokemon].seen) + { + sub_808E6BC(); + BeginNormalPaletteFade( + ~(1 << (gSprites[gPokedexView->selectedMonSpriteId].oam.paletteNum + 16)), + 0, 0, 0x10, 0); + gSprites[gPokedexView->selectedMonSpriteId].callback = sub_808EDB8; + gTasks[taskId].func = sub_808CA64; + PlaySE(SE_PIN); + } + else if (gMain.newKeys & START_BUTTON) + { + //Open menu + gPokedexView->menuY = 0; + gPokedexView->menuIsOpen = 1; + gPokedexView->menuCursorPos = 0; + gTasks[taskId].func = Task_PokedexMainScreenMenu; + PlaySE(SE_SELECT); + } + else if (gMain.newKeys & SELECT_BUTTON) + { + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].data[0] = sub_8091E3C(); + gPokedexView->unk64F = 0; + gPokedexView->unk62A = gPokedexView->unk62C; + gPokedexView->unk610 = gPokedexView->selectedPokemon; + gPokedexView->unk614 = gPokedexView->dexMode; + gPokedexView->unk618 = gPokedexView->dexOrder; + gTasks[taskId].func = sub_808CB8C; + PlaySE(SE_PC_LOGON); + } + else if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_ClosePokedex; + PlaySE(SE_PC_OFF); + } + else + { + //Handle D-pad + gPokedexView->selectedPokemon = sub_808E48C(gPokedexView->selectedPokemon, 0xE); + if (gPokedexView->unk62E) + gTasks[taskId].func = sub_808C898; + } + } +} + +static void sub_808C898(u8 taskId) +{ + if (sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636)) + gTasks[taskId].func = Task_PokedexMainScreen; +} + +//Bring up menu and process menu input +static void Task_PokedexMainScreenMenu(u8 taskId) +{ + REG_BG0VOFS = gPokedexView->menuY; + + //If menu is not open, slide it up, on screen + if (gPokedexView->menuY != 80) + gPokedexView->menuY += 8; + else + { + if (gMain.newKeys & A_BUTTON) + { + switch (gPokedexView->menuCursorPos) + { + case 0: //BACK TO LIST + default: + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 1: //LIST TOP + gPokedexView->selectedPokemon = 0; + gPokedexView->unk62C = 0x40; + sub_808E82C(); + sub_808E0CC(gPokedexView->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 2: //LIST BOTTOM + gPokedexView->selectedPokemon = gPokedexView->pokemonListCount - 1; + gPokedexView->unk62C = gPokedexView->pokemonListCount * 16 + 0x30; + sub_808E82C(); + sub_808E0CC(gPokedexView->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 3: //CLOSE POKEDEX + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_ClosePokedex; + PlaySE(SE_PC_OFF); + break; + } + } + + //Exit menu when Start or B is pressed + if (gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + gPokedexView->menuIsOpen = 0; + gTasks[taskId].func = Task_PokedexMainScreen; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gPokedexView->menuCursorPos != 0) + { + gPokedexView->menuCursorPos--; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gPokedexView->menuCursorPos <= 2) + { + gPokedexView->menuCursorPos++; + PlaySE(SE_SELECT); + } + } +} + +static void sub_808CA64(u8 taskId) +{ + if (gSprites[gPokedexView->selectedMonSpriteId].pos1.x == 48 + && gSprites[gPokedexView->selectedMonSpriteId].pos1.y == 56) + { + gPokedexView->unk64B = gPokedexView->unk64A; + gTasks[taskId].data[0] = sub_808F210(&gPokedexView->unk0[gPokedexView->selectedPokemon], gPokedexView->selectedMonSpriteId); + gTasks[taskId].func = sub_808CAE4; + } +} + +static void sub_808CAE4(u8 taskId) +{ + if (gTasks[gTasks[taskId].data[0]].isActive) + { + if (gPokedexView->unk64A == 1 && !sub_808F250(gTasks[taskId].data[0]) && sub_808E71C()) + sub_808F284(&gPokedexView->unk0[gPokedexView->selectedPokemon], gTasks[taskId].data[0]); + } + else + { + gUnknown_0202FFB8 = gPokedexView->selectedPokemon; + gUnknown_0202FFBA = gPokedexView->unk62C; + gTasks[taskId].func = Task_PokedexShowMainScreen; + } +} + +static void sub_808CB8C(u8 taskId) +{ + bool8 isActive = gTasks[gTasks[taskId].data[0]].isActive; + + if (!isActive) + { + if (gPokedexView->unk64F != 0) + { + gPokedexView->selectedPokemon = isActive; + gPokedexView->unk62C = 0x40; + gTasks[taskId].func = sub_808CCC4; + } + else + { + gPokedexView->unk62C = gPokedexView->unk62A; + gPokedexView->selectedPokemon = gPokedexView->unk610; + gPokedexView->dexMode = gPokedexView->unk614; + if (!IsNationalPokedexEnabled()) + gPokedexView->dexMode = DEX_MODE_HOENN; + gPokedexView->dexOrder = gPokedexView->unk618; + gTasks[taskId].func = Task_PokedexShowMainScreen; + } + } +} + +static void Task_ClosePokedex(u8 taskId) +{ + if (!gPaletteFade.active) + { + gSaveBlock2.pokedex.unknown1 = gPokedexView->dexMode; + if (!IsNationalPokedexEnabled()) + gSaveBlock2.pokedex.unknown1 = 0; + gSaveBlock2.pokedex.order = gPokedexView->dexOrder; + DestroyTask(taskId); + SetMainCallback2(sub_805469C); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); + } +} + +static void sub_808CCC4(u8 taskId) +{ + gPokedexView->unk64C_1 = 1; + if (sub_808D344(3)) + gTasks[taskId].func = Task_PokedexResultsScreen; +} + +static void Task_PokedexResultsScreen(u8 taskId) +{ + REG_BG0VOFS = gPokedexView->menuY; + + if (gPokedexView->menuY) + { + gPokedexView->menuY -= 8; + } + else + { + if ((gMain.newKeys & A_BUTTON) && gPokedexView->unk0[gPokedexView->selectedPokemon].seen) + { + u32 a; + + sub_808E6BC(); + a = (1 << (gSprites[gPokedexView->selectedMonSpriteId].oam.paletteNum + 16)); + gSprites[gPokedexView->selectedMonSpriteId].callback = sub_808EDB8; + BeginNormalPaletteFade(~a, 0, 0, 0x10, 0); + gTasks[taskId].func = sub_808D118; + PlaySE(SE_PIN); + } + else if (gMain.newKeys & START_BUTTON) + { + gPokedexView->menuY = 0; + gPokedexView->menuIsOpen = 1; + gPokedexView->menuCursorPos = 0; + gTasks[taskId].func = Task_PokedexResultsScreenMenu; + PlaySE(SE_SELECT); + } + else if (gMain.newKeys & SELECT_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].data[0] = sub_8091E3C(); + gPokedexView->unk64F = 0; + gTasks[taskId].func = sub_808CB8C; + PlaySE(SE_PC_LOGON); + } + else if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen; + PlaySE(SE_PC_OFF); + } + else + { + //Handle D-pad + gPokedexView->selectedPokemon = sub_808E48C(gPokedexView->selectedPokemon, 0xE); + if (gPokedexView->unk62E) + gTasks[taskId].func = sub_808CEF8; + } + } +} + +static void sub_808CEF8(u8 taskId) +{ + if (sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636)) + gTasks[taskId].func = Task_PokedexResultsScreen; +} + +static void Task_PokedexResultsScreenMenu(u8 taskId) +{ + REG_BG0VOFS = gPokedexView->menuY; + + if (gPokedexView->menuY != 96) + { + gPokedexView->menuY += 8; + } + else + { + if (gMain.newKeys & A_BUTTON) + { + switch (gPokedexView->menuCursorPos) + { + case 0: //BACK TO LIST + default: + gMain.newKeys |= START_BUTTON; + break; + case 1: //LIST TOP + gPokedexView->selectedPokemon = 0; + gPokedexView->unk62C = 0x40; + sub_808E82C(); + sub_808E0CC(gPokedexView->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; + break; + case 2: //LIST BOTTOM + gPokedexView->selectedPokemon = gPokedexView->pokemonListCount - 1; + gPokedexView->unk62C = gPokedexView->pokemonListCount * 16 + 0x30; + sub_808E82C(); + sub_808E0CC(gPokedexView->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; + break; + case 3: //BACK TO POKEDEX + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen; + PlaySE(SE_TRACK_DOOR); + break; + case 4: //CLOSE POKEDEX + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_PokedexResultsScreenExitPokedex; + PlaySE(SE_PC_OFF); + break; + } + } + + //Exit menu when Start or B is pressed + if (gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + gPokedexView->menuIsOpen = 0; + gTasks[taskId].func = Task_PokedexResultsScreen; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gPokedexView->menuCursorPos) + { + gPokedexView->menuCursorPos--; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gPokedexView->menuCursorPos <= 3) + { + gPokedexView->menuCursorPos++; + PlaySE(SE_SELECT); + } + } +} + +static void sub_808D118(u8 taskId) +{ + if (gSprites[gPokedexView->selectedMonSpriteId].pos1.x == 48 + && gSprites[gPokedexView->selectedMonSpriteId].pos1.y == 56) + { + gPokedexView->unk64B = gPokedexView->unk64A; + gTasks[taskId].data[0] = sub_808F210(&gPokedexView->unk0[gPokedexView->selectedPokemon], gPokedexView->selectedMonSpriteId); + gTasks[taskId].func = sub_808D198; + } +} + +static void sub_808D198(u8 taskId) +{ + if (gTasks[gTasks[taskId].data[0]].isActive) + { + if (gPokedexView->unk64A == 1 && !sub_808F250(gTasks[taskId].data[0]) && sub_808E71C()) + sub_808F284(&gPokedexView->unk0[gPokedexView->selectedPokemon], gTasks[taskId].data[0]); + } + else + { + gTasks[taskId].func = sub_808CCC4; + } +} + +static void Task_PokedexResultsScreenReturnToMainScreen(u8 taskId) +{ + if (!gPaletteFade.active) + { + gPokedexView->unk62C = gPokedexView->unk62A; + gPokedexView->selectedPokemon = gPokedexView->unk610; + gPokedexView->dexMode = gPokedexView->unk614; + if (!IsNationalPokedexEnabled()) + gPokedexView->dexMode = DEX_MODE_HOENN; + gPokedexView->dexOrder = gPokedexView->unk618; + gTasks[taskId].func = Task_PokedexShowMainScreen; + } +} + +static void Task_PokedexResultsScreenExitPokedex(u8 taskId) +{ + if (!gPaletteFade.active) + { + gPokedexView->unk62C = gPokedexView->unk62A; + gPokedexView->selectedPokemon = gPokedexView->unk610; + gPokedexView->dexMode = gPokedexView->unk614; + if (!IsNationalPokedexEnabled()) + gPokedexView->dexMode = DEX_MODE_HOENN; + gPokedexView->dexOrder = gPokedexView->unk618; + gTasks[taskId].func = Task_ClosePokedex; + } +} + +static bool8 sub_808D344(u8 a) +{ + switch (gMain.state) + { + case 0: + default: + if (gPaletteFade.active) + return 0; + SetVBlankCallback(NULL); + gPokedexView->unk64A = a; + sub_8091060(0); + REG_BG2VOFS = gPokedexView->unk62D; + LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM)); + LZ77UnCompVram(gUnknown_08E96738, (void *)(VRAM + 0x6800)); + LZ77UnCompVram(gUnknown_08E9C6DC, (void *)(VRAM + 0x7800)); + DmaClear16(3, VRAM + 0x6000, 0x500); + if (a == 0) + LZ77UnCompVram(gUnknown_08E96888, (void *)(VRAM + 0x6500)); + else + LZ77UnCompVram(gUnknown_08E96994, (void *)(VRAM + 0x6500)); + ResetPaletteFade(); + if (a == 0) + gPokedexView->unk64C_1 = 0; + else + gPokedexView->unk64C_1 = 1; + sub_808D640(); + gMain.state = 1; + break; + case 1: + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + LoadCompressedObjectPic(&gUnknown_083A05CC[0]); + LoadSpritePalettes(gUnknown_083A05DC); + sub_808E978(a); + gMain.state++; + break; + case 2: + SetUpWindowConfig(&gWindowConfig_81E7048); + InitMenuWindow(&gWindowConfig_81E7048); + LZ77UnCompVram(gUnknown_0839FA7C, (void *)(VRAM + 0xFF80)); + gMain.state++; + break; + case 3: + if (a == 0) + SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder); + sub_808E0CC(gPokedexView->selectedPokemon, 0xE); + gPokedexView->menuIsOpen = 0; + gPokedexView->menuY = 0; + gMain.state++; + break; + case 4: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + SetVBlankCallback(sub_808C0B8); + gMain.state++; + break; + case 5: + REG_WININ = 0x3F3F; + REG_WINOUT = 0x1D3F; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(12) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_OBJWIN_ON; + gMain.state++; + break; + case 6: + if (!gPaletteFade.active) + { + gMain.state = 0; + return TRUE; + } + break; + } + return FALSE; +} + +static void sub_808D640(void) +{ + if (gPokedexView->unk64C_1) + LoadPalette(sPokedexSearchPalette + 1, 1, sizeof(sPokedexSearchPalette) - sizeof(u16)); + else if (!IsNationalPokedexEnabled()) + LoadPalette(gPokedexMenu_Pal + 1, 1, 0xBE); + else + LoadPalette(sNationalPokedexPalette + 1, 1, sizeof(sNationalPokedexPalette) - sizeof(u16)); +} + +static void SortPokedex(u8 dexMode, u8 sortMode) +{ + u16 vars[3]; //I have no idea why three regular variables are stored in an array, but whatever. + s16 i; + + gPokedexView->pokemonListCount = 0; + + switch (dexMode) + { + default: + case DEX_MODE_HOENN: + vars[0] = 202; + vars[1] = 1; + break; + case DEX_MODE_NATIONAL: + if (IsNationalPokedexEnabled()) + { + vars[0] = NATIONAL_DEX_COUNT; + vars[1] = 0; + } + else + { + vars[0] = 202; + vars[1] = 1; + } + break; + } + + switch (sortMode) + { + case 0: + if (vars[1]) + { + for (i = 0; i < vars[0]; i++) + { + vars[2] = HoennToNationalOrder(i + 1); + gPokedexView->unk0[i].dexNum = vars[2]; + gPokedexView->unk0[i].seen = GetNationalPokedexFlag(vars[2], 0); + gPokedexView->unk0[i].owned = GetNationalPokedexFlag(vars[2], 1); + if (gPokedexView->unk0[i].seen) + gPokedexView->pokemonListCount = i + 1; + } + } + else + { + bool32 r10; + s16 r5; + + r10 = r5 = i = 0; + for (i = 0; i < vars[0]; i++) + { + vars[2] = i + 1; + if (GetNationalPokedexFlag(vars[2], 0)) + r10 = 1; + if (r10) + { + asm(""); //Needed to match for some reason + gPokedexView->unk0[r5].dexNum = vars[2]; + gPokedexView->unk0[r5].seen = GetNationalPokedexFlag(vars[2], 0); + gPokedexView->unk0[r5].owned = GetNationalPokedexFlag(vars[2], 1); + if (gPokedexView->unk0[r5].seen) + gPokedexView->pokemonListCount = r5 + 1; + r5++; + } + } + } + break; + case 1: + for (i = 0; i < 411; i++) + { + vars[2] = gPokedexOrder_Alphabetical[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 0)) + { + gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; + gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; + gPokedexView->unk0[gPokedexView->pokemonListCount].owned = GetNationalPokedexFlag(vars[2], 1); + gPokedexView->pokemonListCount++; + } + } + break; + case 2: + for (i = NATIONAL_DEX_COUNT - 1; i >= 0; i--) + { + vars[2] = gPokedexOrder_Weight[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) + { + gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; + gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; + gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; + gPokedexView->pokemonListCount++; + } + } + break; + case 3: + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + vars[2] = gPokedexOrder_Weight[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) + { + gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; + gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; + gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; + gPokedexView->pokemonListCount++; + } + } + break; + case 4: + for (i = NATIONAL_DEX_COUNT - 1; i >=0; i--) + { + vars[2] = gPokedexOrder_Height[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) + { + gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; + gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; + gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; + gPokedexView->pokemonListCount++; + } + } + break; + case 5: + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + vars[2] = gPokedexOrder_Height[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) + { + gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; + gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; + gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; + gPokedexView->pokemonListCount++; + } + } + break; + } + + for (i = gPokedexView->pokemonListCount; i < NATIONAL_DEX_COUNT; i++) + { + gPokedexView->unk0[i].dexNum |= 0xFFFF; + gPokedexView->unk0[i].seen = 0; + gPokedexView->unk0[i].owned = 0; + } +} + +static void sub_808DBE8(u8 a, u16 b, u16 c) +{ + s16 _b; + u16 i; + u16 r2; + + switch (a) + { + case 0: + default: + _b = b - 5; + for (i = 0; i <= 10; i++) + { + if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gPokedexView->unk0[_b].dexNum == 0xFFFF) + { + sub_808E090(0x11, i * 2, c); + } + else + { + sub_808E090(0x11, i * 2, c); + if (gPokedexView->unk0[_b].seen) + { + sub_808DEB0(_b, 0x12, i * 2, c); + sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, i * 2, c); + sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, i * 2); + } + else + { + sub_808DEB0(_b, 0x12, i * 2, c); + sub_808DF88(0, 0x11, i * 2, c); + sub_808DFE4(0, 0x17, i * 2); + } + } + _b++; + } + break; + case 1: + _b = b - 5; + if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gPokedexView->unk0[_b].dexNum == 0xFFFF) + { + sub_808E090(0x11, gPokedexView->unk630 * 2, c); + } + else + { + sub_808E090(0x11, gPokedexView->unk630 * 2, c); + if (gPokedexView->unk0[_b].seen) + { + sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c); + sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, gPokedexView->unk630 * 2, c); + sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, gPokedexView->unk630 * 2); + } + else + { + sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c); + sub_808DF88(0, 0x11, gPokedexView->unk630 * 2, c); + sub_808DFE4(0, 0x17, gPokedexView->unk630 * 2); + } + } + break; + case 2: + _b = b + 5; + r2 = gPokedexView->unk630 + 10; + if (r2 > 15) + r2 -= 16; + if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gPokedexView->unk0[_b].dexNum == 0xFFFF) + sub_808E090(0x11, r2 * 2, c); + else + { + sub_808E090(0x11, r2 * 2, c); + if (gPokedexView->unk0[_b].seen) + { + sub_808DEB0(_b, 0x12, r2 * 2, c); + sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, r2 * 2, c); + sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, r2 * 2); + } + else + { + sub_808DEB0(_b, 0x12, r2 * 2, c); + sub_808DF88(0, 0x11, r2 * 2, c); + sub_808DFE4(0, 0x17, r2 * 2); + } + } + break; + } +} + +static void sub_808DEB0(u16 a, u8 b, u8 c, u16 d) +{ + u8 text[4]; + u16 unk[2]; + u16 r7 = gPokedexView->unk0[a].dexNum; + + if (gPokedexView->dexMode == DEX_MODE_HOENN) + r7 = NationalToHoennOrder(r7); + unk[0] = 0x3FC; + unk[1] = 0x3FD; + text[0] = CHAR_0 + r7 / 100; + text[1] = CHAR_0 + (r7 % 100) / 10; + text[2] = CHAR_0 + (r7 % 100) % 10; + text[3] = EOS; + *(u16 *)(VRAM + d * 0x800 + c * 0x40 + b * 2) = unk[0]; + *(u16 *)(VRAM + d * 0x800 + (c + 1) * 0x40 + b * 2) = unk[1]; + MenuPrint(text, b - 15, c); +} + +static void sub_808DF88(u16 a, u8 b, u8 c, u16 d) +{ + u16 unk[2]; + + if (a) + { + unk[0] = 0x3FE; + unk[1] = 0x3FF; + } + else + { + unk[0] = 0; + unk[1] = 0; + } + *(u16 *)(VRAM + d * 0x800 + c * 0x40 + b * 2) = unk[0]; + *(u16 *)(VRAM + d * 0x800 + (c + 1) * 0x40 + b * 2) = unk[1]; +} + +static u8 sub_808DFE4(u16 num, u8 b, u8 c) +{ + u8 text[10]; + u8 i; + + for (i = 0; i < 10; i++) + text[i] = CHAR_SPACE; + text[i] = EOS; + + num = NationalPokedexNumToSpecies(num); + switch (num) + { + default: + for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) + text[i] = gSpeciesNames[num][i]; + break; + case 0: + for (i = 0; i < 10; i++) + text[i] = CHAR_HYPHEN; + break; + } + MenuPrint_PixelCoords(text, (b - 0x11) * 8 + 0xFC, c * 8, 0); + return i; +} + +static void sub_808E090(u8 a, u8 b, u16 c) +{ + u8 i; + + for (i = 0; i < 12; i++) + { + *(u16 *)(VRAM + c * 0x800 + b * 64 + (a + i) * 2) = 0; + *(u16 *)(VRAM + c * 0x800 + (b + 1) * 64 + (a + i) * 2) = 0; + } +} + +static void sub_808E0CC(u16 a, u16 b) +{ + u8 i; + u16 unk; + u8 spriteId; + + for (i = 0; i < 4; i++) + gPokedexView->unk61E[i] = 0xFFFF; + gPokedexView->selectedMonSpriteId = 0xFFFF; + sub_808DBE8(0, a, b); + REG_BG2VOFS = gPokedexView->unk62D; + + unk = sub_808E888(a - 1); + if (unk != 0xFFFF) + { + spriteId = sub_808E8C8(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_808EE28; + gSprites[spriteId].data5 = -32; + } + + unk = sub_808E888(a); + if (unk != 0xFFFF) + { + spriteId = sub_808E8C8(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_808EE28; + gSprites[spriteId].data5 = 0; + } + + unk = sub_808E888(a + 1); + if (unk != 0xFFFF) + { + spriteId = sub_808E8C8(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_808EE28; + gSprites[spriteId].data5 = 32; + } + + gPokedexView->unk630 = 0; + gPokedexView->unk632 = 0; +} + +static bool8 sub_808E208(u8 a, u8 b, u8 c) +{ + u16 i; + u8 foo; + + if (gPokedexView->unk62E) + { + gPokedexView->unk62E--; + switch (a) + { + case 1: + for (i = 0; i < 4; i++) + { + if (gPokedexView->unk61E[i] != 0xFFFF) + gSprites[gPokedexView->unk61E[i]].data5 += b; + } + foo = 16 * (c - gPokedexView->unk62E) / c; + REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 - foo; + gPokedexView->unk62C -= gPokedexView->unk628; + break; + case 2: + for (i = 0; i < 4; i++) + { + if (gPokedexView->unk61E[i] != 0xFFFF) + gSprites[gPokedexView->unk61E[i]].data5 -= b; + } + foo = 16 * (c - gPokedexView->unk62E) / c; + REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 + foo; + gPokedexView->unk62C += gPokedexView->unk628; + break; + } + return FALSE; + } + else + { + REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk630 * 16; + return TRUE; + } +} + +static void sub_808E398(u8 a, u16 b) +{ + u16 unk; + u8 spriteId; + + gPokedexView->unk632 = gPokedexView->unk630; + switch (a) + { + case 1: + unk = sub_808E888(b - 1); + if (unk != 0xFFFF) + { + spriteId = sub_808E8C8(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_808EE28; + gSprites[spriteId].data5 = -64; + } + if (gPokedexView->unk630 > 0) + gPokedexView->unk630--; + else + gPokedexView->unk630 = 15; + break; + case 2: + unk = sub_808E888(b + 1); + if (unk != 0xFFFF) + { + spriteId = sub_808E8C8(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_808EE28; + gSprites[spriteId].data5 = 0x40; + } + if (gPokedexView->unk630 <= 0xE) + gPokedexView->unk630++; + else + gPokedexView->unk630 = 0; + break; + } +} + +// Ugly, ugly, ugly. I couldn't get it to match otherwise. +static u16 sub_808E48C(u16 a, u16 b) +{ + u8 r3; + u8 r5; + u8 i; + u16 r6; + u8 r10 = 0; + + if (!((gMain.heldKeys & 0x40) && (a > 0))) + { + //_0808E4B6 + if (!((gMain.heldKeys & 0x80) && (a < gPokedexView->pokemonListCount - 1))) + //_0808E4CE + { + if ((gMain.newKeys & 0x20) && (a > 0)) + { + r6 = a; + //_0808E4E0 + for (i = 0; i < 7; i++) + a = sub_8091818(1, a, 0, gPokedexView->pokemonListCount - 1); + gPokedexView->unk62C += 16 * (a - r6); + sub_808E82C(); + sub_808E0CC(a, 0xE); + PlaySE(0x6D); + } + //_0808E53C + else if ((gMain.newKeys & 0x10) && (a < gPokedexView->pokemonListCount - 1)) + { + r6 = a; + for (i = 0; i < 7; i++) + a = sub_8091818(0, a, 0, gPokedexView->pokemonListCount - 1); + gPokedexView->unk62C += (a - r6) * 16; + sub_808E82C(); + sub_808E0CC(a, 0xE); + PlaySE(0x6D); + } + _0808E5A2: + if (r10 == 0) + { + gPokedexView->unk638 = 0; + return a; + } + } + else + { + // to _0808E5C4 + r10 = 2; + a = sub_8091818(0, a, 0, gPokedexView->pokemonListCount - 1); + sub_808E398(2, a); + //goto _0808E60E + sub_808DBE8(2, a, b); + PlaySE(0x6C); + goto _0808E5A2; + } + } + else + { + //to _0808E5E4 + r10 = 1; + a = sub_8091818(1, a, 0, gPokedexView->pokemonListCount - 1); + sub_808E398(1, a); + //_0808E60E + sub_808DBE8(1, a, b); + PlaySE(0x6C); + goto _0808E5A2; + } + //_0808E628 + r5 = gUnknown_083A05EC[gPokedexView->unk638 / 4]; + r3 = gUnknown_083A05F1[gPokedexView->unk638 / 4]; + gPokedexView->unk62E = r3; + gPokedexView->unk636 = r3; + gPokedexView->unk634 = r5; + gPokedexView->unk62F = r10; + gPokedexView->unk628 = r5 / 2; + sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636); + if (gPokedexView->unk638 <= 0xB) + gPokedexView->unk638++; + return a; +} + +static void sub_808E6BC(void) +{ + u16 i; + + for (i = 0; i < 4; i++) + { + u16 spriteId = gPokedexView->unk61E[i]; + + if (gSprites[spriteId].pos2.x == 0 && gSprites[spriteId].pos2.y == 0 && spriteId != 0xFFFF) + gPokedexView->selectedMonSpriteId = spriteId; + } +} + +static u8 sub_808E71C(void) +{ + u16 r2; + u16 r4 = gPokedexView->selectedPokemon; + + if ((gMain.newKeys & DPAD_UP) && r4) + { + r2 = r4; + while (r2 != 0) + { + r2 = sub_8091818(1, r2, 0, gPokedexView->pokemonListCount - 1); + + if (gPokedexView->unk0[r2].seen) + { + r4 = r2; + break; + } + } + + if (gPokedexView->selectedPokemon == r4) + return 0; + else + { + gPokedexView->selectedPokemon = r4; + gPokedexView->unk62C -= 16; + return 1; + } + } + else if ((gMain.newKeys & DPAD_DOWN) && r4 < gPokedexView->pokemonListCount - 1) + { + r2 = r4; + while (r2 < gPokedexView->pokemonListCount - 1) + { + r2 = sub_8091818(0, r2, 0, gPokedexView->pokemonListCount - 1); + + if (gPokedexView->unk0[r2].seen) + { + r4 = r2; + break; + } + } + + if (gPokedexView->selectedPokemon == r4) + return 0; + else + { + gPokedexView->selectedPokemon = r4; + gPokedexView->unk62C += 16; + return 1; + } + } + return 0; +} + +static u8 sub_808E82C(void) +{ + u16 i; + + for (i = 0; i < 4; i++) + { + if (gPokedexView->unk61E[i] != 0xFFFF) + { + DestroySprite(&gSprites[gPokedexView->unk61E[i]]); + gPokedexView->unk61E[i] |= 0xFFFF; + } + } + return 0; +} + +static u16 sub_808E888(u16 a1) +{ + if (a1 >= NATIONAL_DEX_COUNT || gPokedexView->unk0[a1].dexNum == 0xFFFF) + return 0xFFFF; + else if (gPokedexView->unk0[a1].seen) + return gPokedexView->unk0[a1].dexNum; + else + return 0; +} + +static u32 sub_808E8C8(u16 a, s16 b, s16 c) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (gPokedexView->unk61E[i] == 0xFFFF) + { + u8 spriteId = sub_80918EC(a, b, c, i); + + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.priority = 3; + gSprites[spriteId].data0 = 0; + gSprites[spriteId].data1 = i; + gSprites[spriteId].data2 = NationalPokedexNumToSpecies(a); + gPokedexView->unk61E[i] = spriteId; + return spriteId; + } + } + return 0xFFFF; +} + +static void sub_808E978(u8 a) +{ + u8 spriteId; + u16 r5; + + spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 4, 0); + gSprites[spriteId].data1 = 0; + + spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 156, 0); + gSprites[spriteId].data1 = 1; + gSprites[spriteId].vFlip = TRUE; + + CreateSprite(&gSpriteTemplate_83A0524, 234, 20, 0); + CreateSprite(&gSpriteTemplate_83A0554, 16, 138, 0); + + spriteId = CreateSprite(&gSpriteTemplate_83A0554, 48, 138, 0); + StartSpriteAnim(&gSprites[spriteId], 3); + + spriteId = CreateSprite(&gSpriteTemplate_83A0554, 16, 158, 0); + StartSpriteAnim(&gSprites[spriteId], 2); + gSprites[spriteId].data2 = 0x80; + + spriteId = CreateSprite(&gSpriteTemplate_83A0554, 48, 158, 0); + StartSpriteAnim(&gSprites[spriteId], 1); + + spriteId = CreateSprite(&gSpriteTemplate_83A056C, 0, 80, 2); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 30; + gSprites[spriteId].data0 = 0x1E; + gSprites[spriteId].data1 = 0; + + spriteId = CreateSprite(&gSpriteTemplate_83A056C, 0, 80, 2); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 31; + gSprites[spriteId].data0 = 0x1F; + gSprites[spriteId].data1 = 0x80; + + if (a == 0) + { + u32 _a; + + CreateSprite(&gSpriteTemplate_83A0584, 32, 40, 1); + + spriteId = CreateSprite(&gSpriteTemplate_83A0584, 32, 72, 1); + StartSpriteAnim(&gSprites[spriteId], 1); + _a = 0; + + spriteId = CreateSprite(&gSpriteTemplate_83A059C, 28, 48, 1); + r5 = gPokedexView->unk61A / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gSpriteTemplate_83A059C, 34, 48, 1); + r5 = (gPokedexView->unk61A % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gSpriteTemplate_83A059C, 40, 48, 1); + r5 = (gPokedexView->unk61A % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + _a = 0; + + spriteId = CreateSprite(&gSpriteTemplate_83A059C, 28, 80, 1); + r5 = gPokedexView->unk61C / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gSpriteTemplate_83A059C, 34, 80, 1); + r5 = (gPokedexView->unk61C % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gSpriteTemplate_83A059C, 40, 80, 1); + r5 = (gPokedexView->unk61C % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + + spriteId = CreateSprite(&gSpriteTemplate_83A05B4, 140, 96, 1); + gSprites[spriteId].invisible = TRUE; + } + else + { + spriteId = CreateSprite(&gSpriteTemplate_83A05B4, 140, 80, 1); + gSprites[spriteId].invisible = TRUE; + } +} + +static void nullsub_58(struct Sprite *sprite) +{ +} + +static void sub_808ED94(struct Sprite *sprite) +{ + if (gPokedexView->unk64A != 0) + DestroySprite(sprite); +} + +//Move Pokemon into position for description page +static void sub_808EDB8(struct Sprite *sprite) +{ + sprite->oam.priority = 0; + sprite->oam.affineMode = 0; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + if (sprite->pos1.x != 48 || sprite->pos1.y != 56) + { + if (sprite->pos1.x > 48) + sprite->pos1.x--; + if (sprite->pos1.x < 48) + sprite->pos1.x++; + + if (sprite->pos1.y > 56) + sprite->pos1.y--; + if (sprite->pos1.y < 56) + sprite->pos1.y++; + } + else + { + sprite->callback = nullsub_58; + } +} + +static void sub_808EE28(struct Sprite *sprite) +{ + u8 data1 = sprite->data1; + + if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) + { + DestroySprite(sprite); + gPokedexView->unk61E[data1] = 0xFFFF; + } + else + { + u32 var; + + sprite->pos2.y = gSineTable[(u8)sprite->data5] * 76 / 256; + var = 0x10000 / gSineTable[sprite->data5 + 0x40]; + if (var > 0xFFFF) + var = 0xFFFF; + SetOamMatrix(sprite->data1 + 1, 0x100, 0, 0, var); + sprite->oam.matrixNum = data1 + 1; + + if (sprite->data5 > -64 && sprite->data5 < 64) + { + sprite->invisible = FALSE; + sprite->data0 = 1; + } + else + { + sprite->invisible = TRUE; + } + + if ((sprite->data5 <= -64 || sprite->data5 >= 64) && sprite->data0 != 0) + { + DestroySprite(sprite); + gPokedexView->unk61E[data1] = 0xFFFF; + } + } +} + +static void sub_808EF38(struct Sprite *sprite) +{ + if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) + DestroySprite(sprite); + else + sprite->pos2.y = gPokedexView->selectedPokemon * 120 / (gPokedexView->pokemonListCount - 1); +} + +static void sub_808EF8C(struct Sprite *sprite) +{ + if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) + { + DestroySprite(sprite); + } + else + { + u8 r0; + + if (sprite->data1 != 0) + { + if (gPokedexView->selectedPokemon == gPokedexView->pokemonListCount - 1) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + r0 = sprite->data2; + } + else + { + if (gPokedexView->selectedPokemon == 0) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + r0 = sprite->data2 - 128; + } + sprite->pos2.y = gSineTable[r0] / 64; + sprite->data2 = sprite->data2 + 8; + if (gPokedexView->menuIsOpen == 0 && gPokedexView->menuY == 0 && sprite->invisible == 0) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + } +} + +static void sub_808F08C(struct Sprite *sprite) +{ + if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) + DestroySprite(sprite); +} + +static void sub_808F0B4(struct Sprite *sprite) +{ + if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) + { + DestroySprite(sprite); + } + else + { + u8 val; + s16 r3; + s16 r0; + + val = gPokedexView->unk62C + sprite->data1; + r3 = gSineTable[val]; + r0 = gSineTable[val + 0x40]; + SetOamMatrix(sprite->data0, r0, r3, -r3, r0); + + val = gPokedexView->unk62C + (sprite->data1 + 0x40); + r3 = gSineTable[val]; + r0 = gSineTable[val + 0x40]; + sprite->pos2.x = r0 * 40 / 256; + sprite->pos2.y = r3 * 40 / 256; + } +} + +static void sub_808F168(struct Sprite *sprite) +{ + if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) + { + DestroySprite(sprite); + } + else + { + u16 r1 = gPokedexView->unk64A == 0 ? 80 : 96; + + if (gPokedexView->menuIsOpen != 0 && gPokedexView->menuY == r1) + { + sprite->invisible = FALSE; + sprite->pos2.y = gPokedexView->menuCursorPos * 16; + sprite->pos2.x = gSineTable[(u8)sprite->data2] / 64; + sprite->data2 += 8; + } + else + { + sprite->invisible = TRUE; + } + } +} + +static u8 sub_808F210(struct PokedexListItem *item, u8 b) +{ + u8 taskId; + + gUnknown_0202FFBC = item; + taskId = CreateTask(Task_InitPageScreenMultistep, 0); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = b; + return taskId; +} + +static bool8 sub_808F250(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0 && gTasks[taskId].func == Task_PageScreenProcessInput) + return FALSE; + else + return TRUE; +} + +static u8 sub_808F284(struct PokedexListItem *item, u8 b) +{ + gUnknown_0202FFBC = item; + gTasks[b].data[0] = 1; + gTasks[b].data[1] = 0; + gTasks[b].data[2] = 0; + gTasks[b].data[3] = 0; + return b; +} + +#if ENGLISH +#define CATEGORY_LEFT (11) +#elif GERMAN +#define CATEGORY_LEFT (16) +#endif + +static void Task_InitPageScreenMultistep(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + u16 r2; + + gPokedexView->unk64A = 1; + gPokedexView->descriptionPageNum = 0; + gUnknown_03005CEC = gMain.vblankCallback; + SetVBlankCallback(NULL); + r2 = 0; + if (gTasks[taskId].data[1] != 0) + r2 += 0x1000; + if (gTasks[taskId].data[2] != 0) + r2 |= 0x200; + sub_8091060(r2); + gMain.state = 1; + } + break; + case 1: + LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM); + LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800)); + sub_8091738(gUnknown_0202FFBC->dexNum, 2, 0x3FC); + gMain.state++; + break; + case 2: + sub_80904FC(0xD); + sub_8090584(gPokedexView->selectedScreen, 0xD); + sub_808D640(); + gMain.state++; + break; + case 3: + SetUpWindowConfig(&gWindowConfig_81E7064); + InitMenuWindow(&gWindowConfig_81E7064); + gMain.state++; + break; + case 4: + if (gPokedexView->dexMode == DEX_MODE_HOENN) + sub_8091154(NationalToHoennOrder(gUnknown_0202FFBC->dexNum), 0xD, 3); + else + sub_8091154(gUnknown_0202FFBC->dexNum, 0xD, 3); + sub_80911C8(gUnknown_0202FFBC->dexNum, 0x10, 3); + MenuPrint(gDexText_UnknownPoke, CATEGORY_LEFT, 5); + MenuPrint(gDexText_UnknownHeight, 16, 7); + MenuPrint(gDexText_UnknownWeight, 16, 9); + if (gUnknown_0202FFBC->owned) + { + sub_8091304(gPokedexEntries[gUnknown_0202FFBC->dexNum].categoryName, CATEGORY_LEFT, 5); + sub_8091458(gPokedexEntries[gUnknown_0202FFBC->dexNum].height, 16, 7); + sub_8091564(gPokedexEntries[gUnknown_0202FFBC->dexNum].weight, 16, 9); + MenuPrint(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); + sub_80917CC(14, 0x3FC); + } + else + { + MenuPrint(gUnknown_083A05F8, 2, 13); + LoadPalette(gPlttBufferUnfaded + 1, 0x31, 0x1E); + } + gMain.state++; + break; + case 5: + if (gTasks[taskId].data[1] == 0) + { + gTasks[taskId].data[4] = (u16)sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0); + gSprites[gTasks[taskId].data[4]].oam.priority = 0; + } + gMain.state++; + break; + case 6: + { + u32 r3 = 0; + + if (gTasks[taskId].data[2] != 0) + r3 = 0x14; + if (gTasks[taskId].data[1] != 0) + r3 |= (1 << (gSprites[gTasks[taskId].data[4]].oam.paletteNum + 16)); + BeginNormalPaletteFade(~r3, 0, 16, 0, 0); + SetVBlankCallback(gUnknown_03005CEC); + gMain.state++; + } + break; + case 7: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + gMain.state++; + break; + case 8: + if (!gPaletteFade.active) + { + gMain.state++; + if (gTasks[taskId].data[3] == 0) + { + StopCryAndClearCrySongs(); + PlayCry2(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum), 0, 0x7D, 0xA); + } + else + { + gMain.state++; + } + } + break; + case 9: + if (!IsCryPlayingOrClearCrySongs()) + gMain.state++; + break; + case 10: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 1; + gTasks[taskId].data[3] = 1; + gTasks[taskId].func = Task_PageScreenProcessInput; + gMain.state = 0; + break; + } +} + +static void Task_PageScreenProcessInput(u8 taskId) +{ + if (gTasks[taskId].data[0] != 0) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_808F888; + PlaySE(SE_Z_SCROLL); + return; + } + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = Task_ClosePageScreen; + PlaySE(SE_PC_OFF); + return; + } + if (gMain.newKeys & A_BUTTON) + { + switch (gPokedexView->selectedScreen) + { + case PAGE_SCREEN: + sub_8090C68(); + break; + case AREA_SCREEN: + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_InitAreaScreenMultistep; + PlaySE(SE_PIN); + break; + case CRY_SCREEN: + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_InitCryScreenMultistep; + PlaySE(SE_PIN); + break; + case SIZE_SCREEN: + if (!gUnknown_0202FFBC->owned) + { + PlaySE(SE_HAZURE); + } + else + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_InitSizeScreenMultistep; + PlaySE(SE_PIN); + } + break; + } + return; + } + if (((gMain.newKeys & DPAD_LEFT) + || ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + && gPokedexView->selectedScreen > 0) + { + gPokedexView->selectedScreen--; + sub_8090584(gPokedexView->selectedScreen, 0xD); + PlaySE(SE_Z_PAGE); + return; + } + if (((gMain.newKeys & DPAD_RIGHT) + || ((gMain.newKeys & R_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + && gPokedexView->selectedScreen < 3) + { + gPokedexView->selectedScreen++; + sub_8090584(gPokedexView->selectedScreen, 0xD); + PlaySE(SE_Z_PAGE); + return; + } +} + +static void sub_808F888(u8 taskId) +{ + if (!gPaletteFade.active) + gTasks[taskId].func = Task_InitPageScreenMultistep; +} + +static void Task_ClosePageScreen(u8 taskId) +{ + if (!gPaletteFade.active) + DestroyTask(taskId); +} + +static void Task_InitAreaScreenMultistep(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + gPokedexView->unk64A = 5; + gUnknown_03005CEC = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_8091060(0x200); + gPokedexView->selectedScreen = AREA_SCREEN; + gMain.state = 1; + } + break; + case 1: + sub_8090540(0xD); + sub_8090644(1, 0xD); + sub_808D640(); + REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; + gMain.state++; + break; + case 2: + ShowPokedexAreaScreen(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum), &gPokedexView->unk64F); + SetVBlankCallback(gUnknown_03005CEC); + gPokedexView->unk64F = 0; + gMain.state = 0; + gTasks[taskId].func = Task_AreaScreenProcessInput; + break; + } +} + +static void Task_AreaScreenProcessInput(u8 taskId) +{ + if (gPokedexView->unk64F != 0) + gTasks[taskId].func = sub_808FA00; +} + +static void sub_808FA00(u8 taskId) +{ + if (!gPaletteFade.active) + { + switch (gPokedexView->unk64F) + { + case 1: + default: + gTasks[taskId].func = Task_InitPageScreenMultistep; + break; + case 2: + gTasks[taskId].func = Task_InitCryScreenMultistep; + break; + } + } +} + +static void Task_InitCryScreenMultistep(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + m4aMPlayStop(&gMPlay_BGM); + gPokedexView->unk64A = 6; + gUnknown_03005CEC = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_8091060(0x200); + gPokedexView->selectedScreen = CRY_SCREEN; + gMain.state = 1; + } + break; + case 1: + LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM); + LZ77UnCompVram(gUnknown_0839F8A0, (void *)(VRAM + 0x7000)); + gMain.state++; + break; + case 2: + sub_8090540(0xD); + sub_8090644(2, 0xD); + sub_808D640(); + DmaClear16(3, (void *)(VRAM + 0xF800), 0x500); + gMain.state++; + break; + case 3: + SetUpWindowConfig(&gWindowConfig_81E702C); + InitMenuWindow(&gWindowConfig_81E702C); + ResetPaletteFade(); + gMain.state++; + break; + case 4: + MenuPrint(gDexText_CryOf, 10, 4); + sub_8091260(gUnknown_0202FFBC->dexNum, 10, 6, 2); + gMain.state++; + break; + case 5: + gTasks[taskId].data[4] = sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0); + gSprites[gTasks[taskId].data[4]].oam.priority = 0; + gUnknown_03005E98 = 0; + gMain.state++; + break; + case 6: + { + struct CryRelatedStruct sp8; + + sp8.unk0 = 0x4020; + sp8.unk2 = 0x1F; + sp8.paletteNo = 8; + sp8.yPos = 0x1E; + sp8.xPos = 0xC; + if (sub_8119E3C(&sp8, 0) != 0) + { + gMain.state++; + gUnknown_03005E98 = 0; + } + } + break; + case 7: + { + struct CryRelatedStruct sp10; + + sp10.unk0 = 0x3000; + sp10.unk2 = 0xE; + sp10.paletteNo = 9; + sp10.xPos = 0x12; + sp10.yPos = 3; + if (ShowPokedexCryScreen(&sp10, 1) != 0) + gMain.state++; + } + break; + case 8: + BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0); + SetVBlankCallback(gUnknown_03005CEC); + gMain.state++; + break; + case 9: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG0CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + gMain.state++; + break; + case 10: + gPokedexView->unk64F = 0; + gMain.state = 0; + gTasks[taskId].func = Task_CryScreenProcessInput; + break; + } +} + +static void Task_CryScreenProcessInput(u8 taskId) +{ + sub_8119F88(0); + + if (IsCryPlaying()) + sub_8090040(1); + else + sub_8090040(0); + + if (gMain.newKeys & A_BUTTON) + { + sub_8090040(1); + sub_811A050(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum)); + return; + } + else if (!gPaletteFade.active) + { + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + m4aMPlayContinue(&gMPlay_BGM); + gPokedexView->unk64F = 1; + gTasks[taskId].func = sub_808FFBC; + PlaySE(SE_PC_OFF); + return; + } + if ((gMain.newKeys & DPAD_LEFT) + || ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + m4aMPlayContinue(&gMPlay_BGM); + gPokedexView->unk64F = 2; + gTasks[taskId].func = sub_808FFBC; + PlaySE(SE_Z_PAGE); + return; + } + if ((gMain.newKeys & DPAD_RIGHT) + || ((gMain.newKeys & R_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + { + if (!gUnknown_0202FFBC->owned) + { + PlaySE(SE_HAZURE); + } + else + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + m4aMPlayContinue(&gMPlay_BGM); + gPokedexView->unk64F = 3; + gTasks[taskId].func = sub_808FFBC; + PlaySE(SE_Z_PAGE); + } + return; + } + } +} + +static void sub_808FFBC(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyCryMeterNeedleSprite(); + switch (gPokedexView->unk64F) + { + default: + case 1: + gTasks[taskId].func = Task_InitPageScreenMultistep; + break; + case 2: + gTasks[taskId].func = Task_InitAreaScreenMultistep; + break; + case 3: + gTasks[taskId].func = Task_InitSizeScreenMultistep; + break; + } + } +} + +static void sub_8090040(u8 a) +{ + u16 unk; + + if (a != 0) + unk = 0x392; + else + unk = 0x2AF; + LoadPalette(&unk, 0x5D, 2); +} + +static void Task_InitSizeScreenMultistep(u8 taskId) +{ + u8 spriteId; + + switch (gMain.state) + { + default: + case 0: + if (!gPaletteFade.active) + { + gPokedexView->unk64A = 7; + gUnknown_03005CEC = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_8091060(0x200); + gPokedexView->selectedScreen = SIZE_SCREEN; + gMain.state = 1; + } + break; + case 1: + LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM); + LZ77UnCompVram(gUnknown_0839F988, (void *)(VRAM + 0x7000)); + gMain.state++; + break; + case 2: + sub_8090540(0xD); + sub_8090644(3, 0xD); + sub_808D640(); + gMain.state++; + break; + case 3: + { + u8 string[40]; //I hope this is the correct size + + SetUpWindowConfig(&gWindowConfig_81E702C); + InitMenuWindow(&gWindowConfig_81E702C); + string[0] = EOS; + StringAppend(string, gDexText_SizeComparedTo); + StringAppend(string, gSaveBlock2.playerName); + sub_8072BD8(string, 3, 15, 0xC0); + gMain.state++; + } + break; + case 4: + ResetPaletteFade(); + gMain.state++; + break; + case 5: + spriteId = sub_8091A4C(gSaveBlock2.playerGender, 152, 56, 0); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 1; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerOffset; + SetOamMatrix(1, gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerScale, 0, 0, gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerScale); + LoadPalette(gUnknown_083B4EC4, (gSprites[spriteId].oam.paletteNum + 16) * 16, sizeof(gUnknown_083B4EC4)); + gMain.state++; + break; + case 6: + spriteId = sub_80918EC(gUnknown_0202FFBC->dexNum, 88, 56, 1); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 2; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonOffset; + SetOamMatrix(2, gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonScale, 0, 0, gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonScale); + LoadPalette(gUnknown_083B4EC4, (gSprites[spriteId].oam.paletteNum + 16) * 16, sizeof(gUnknown_083B4EC4)); + gMain.state++; + break; + case 7: + BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0); + SetVBlankCallback(gUnknown_03005CEC); + gMain.state++; + break; + case 8: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + gMain.state++; + break; + case 9: + if (!gPaletteFade.active) + { + gPokedexView->unk64F = 0; + gMain.state = 0; + gTasks[taskId].func = Task_SizeScreenProcessInput; + } + break; + } +} + +static void Task_SizeScreenProcessInput(u8 taskId) +{ + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gPokedexView->unk64F = 1; + gTasks[taskId].func = sub_8090498; + PlaySE(SE_PC_OFF); + } + else if ((gMain.newKeys & DPAD_LEFT) + || ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gPokedexView->unk64F = 2; + gTasks[taskId].func = sub_8090498; + PlaySE(SE_Z_PAGE); + } +} + +static void sub_8090498(u8 taskId) +{ + if (!gPaletteFade.active) + { + switch (gPokedexView->unk64F) + { + default: + case 1: + gTasks[taskId].func = Task_InitPageScreenMultistep; + break; + case 2: + gTasks[taskId].func = Task_InitCryScreenMultistep; + break; + } + } +} + +static void sub_80904FC(u16 a) +{ + LZ77UnCompVram(gUnknown_08E96ACC, (void *)(VRAM + a * 0x800)); + DmaClear16(3, (void *)(VRAM + a * 0x800 + 0xC0), 0x440); +} + +static void sub_8090540(u16 a) +{ + LZ77UnCompVram(gUnknown_08E96B58, (void *)(VRAM + a * 0x800)); + DmaClear16(3, (void *)(VRAM + a * 0x800 + 0xC0), 0x440); +} + +#ifdef NONMATCHING +static void sub_8090584(u8 a, u16 b) +{ + u8 i; //r1 + u8 j; //r3 + u32 r6; + register u8 r7; + + for (i = 0; i < 4; i++) + { + r7 = i * 5 + 1; + r6 = 0x4000; + + if (i == a) + r6 = 0x2000; + + for (j = 0; j < 5; j++) + { + u32 r0 = b * 0x800 + (r7 + j) * 2; + u8 *ptr; + + ptr = VRAM; + *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; + ptr = VRAM + 0x40; + *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; + } + } + r6 = 0x4000; + for (j = 0; j < 5; j++) + { + u32 r0 = b * 0x800 + j * 2; + u8 *ptr; + + ptr = VRAM + 0x32; + *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; + ptr = VRAM + 0x72; + *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; + } +} +#else +__attribute__((naked)) +static void sub_8090584(u8 a, u16 b) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + mov r9, r1\n\ + movs r1, 0\n\ +_0809059C:\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + movs r6, 0x80\n\ + lsls r6, 7\n\ + cmp r1, r10\n\ + bne _080905B2\n\ + movs r6, 0x80\n\ + lsls r6, 6\n\ +_080905B2:\n\ + movs r3, 0\n\ + mov r0, r9\n\ + lsls r0, 11\n\ + mov r12, r0\n\ + adds r1, 0x1\n\ + mov r8, r1\n\ + mov r5, r12\n\ + ldr r4, _08090634 @ =0x00000fff\n\ +_080905C2:\n\ + adds r0, r7, r3\n\ + lsls r0, 1\n\ + adds r0, r5, r0\n\ + movs r2, 0xC0\n\ + lsls r2, 19\n\ + adds r1, r0, r2\n\ + ldrh r2, [r1]\n\ + ands r2, r4\n\ + orrs r2, r6\n\ + strh r2, [r1]\n\ + ldr r1, _08090638 @ =0x06000040\n\ + adds r0, r1\n\ + ldrh r2, [r0]\n\ + ands r2, r4\n\ + orrs r2, r6\n\ + strh r2, [r0]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x4\n\ + bls _080905C2\n\ + mov r2, r8\n\ + lsls r0, r2, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0x3\n\ + bls _0809059C\n\ + movs r6, 0x80\n\ + lsls r6, 7\n\ + movs r3, 0\n\ + mov r5, r12\n\ + ldr r4, _08090634 @ =0x00000fff\n\ +_08090600:\n\ + lsls r0, r3, 1\n\ + adds r0, r5, r0\n\ + ldr r2, _0809063C @ =0x06000032\n\ + adds r1, r0, r2\n\ + ldrh r2, [r1]\n\ + ands r2, r4\n\ + orrs r2, r6\n\ + strh r2, [r1]\n\ + ldr r1, _08090640 @ =0x06000072\n\ + adds r0, r1\n\ + ldrh r2, [r0]\n\ + ands r2, r4\n\ + orrs r2, r6\n\ + strh r2, [r0]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x4\n\ + bls _08090600\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08090634: .4byte 0x00000fff\n\ +_08090638: .4byte 0x06000040\n\ +_0809063C: .4byte 0x06000032\n\ +_08090640: .4byte 0x06000072\n\ + .syntax divided\n"); +} +#endif + +//Nope, can't get this one to match, either. +#ifdef NONMATCHING +static void sub_8090644(u8 a, u16 b) +{ + u8 i; + u8 j; + + for (i = 0; i < 4; i++) + { + u8 r8 = i * 5 + 1; + u32 r5; + + if (i == a || i == 0) + r5 = 0x2000; + else if (a != 0) + r5 = 0x4000; + + for (j = 0; j < 5; j++) + { + u16 (*vramData)[0x400]; + + vramData = (u16 (*)[])VRAM; + vramData[b][r8 + j] = vramData[b][r8 + j] & 0xFFF | r5; + vramData = (u16 (*)[])(VRAM + 0x40); + vramData[b][r8 + j] = vramData[b][r8 + j] & 0xFFF | r5; + } + } + + for (j = 0; j < 5; j++) + { + u16 (*vramData)[0x400]; + + vramData = (u16 (*)[])(VRAM + 0x32); + vramData[b][j] = vramData[b][j] & 0xFFF | 0x4000; + vramData = (u16 (*)[])(VRAM + 0x72); + vramData[b][j] = vramData[b][j] & 0xFFF | 0x4000; + } +} +#else +__attribute__((naked)) +static void sub_8090644(u8 a, u16 b) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + mov r9, r1\n\ + movs r1, 0\n\ +_0809065C:\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + cmp r1, r10\n\ + beq _08090670\n\ + cmp r1, 0\n\ + bne _08090676\n\ +_08090670:\n\ + movs r5, 0x80\n\ + lsls r5, 6\n\ + b _0809067A\n\ +_08090676:\n\ + movs r5, 0x80\n\ + lsls r5, 7\n\ +_0809067A:\n\ + movs r3, 0\n\ + mov r0, r9\n\ + lsls r7, r0, 11\n\ + adds r1, 0x1\n\ + mov r12, r1\n\ + adds r6, r7, 0\n\ + ldr r4, _080906FC @ =0x00000fff\n\ +_08090688:\n\ + mov r1, r8\n\ + adds r0, r1, r3\n\ + lsls r0, 1\n\ + adds r0, r6, r0\n\ + movs r2, 0xC0\n\ + lsls r2, 19\n\ + adds r1, r0, r2\n\ + ldrh r2, [r1]\n\ + ands r2, r4\n\ + orrs r2, r5\n\ + strh r2, [r1]\n\ + ldr r1, _08090700 @ =0x06000040\n\ + adds r0, r1\n\ + ldrh r2, [r0]\n\ + ands r2, r4\n\ + orrs r2, r5\n\ + strh r2, [r0]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x4\n\ + bls _08090688\n\ + mov r2, r12\n\ + lsls r0, r2, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0x3\n\ + bls _0809065C\n\ + movs r5, 0x80\n\ + lsls r5, 7\n\ + movs r3, 0\n\ + adds r6, r7, 0\n\ + ldr r4, _080906FC @ =0x00000fff\n\ +_080906C8:\n\ + lsls r0, r3, 1\n\ + adds r0, r6, r0\n\ + ldr r2, _08090704 @ =0x06000032\n\ + adds r1, r0, r2\n\ + ldrh r2, [r1]\n\ + ands r2, r4\n\ + orrs r2, r5\n\ + strh r2, [r1]\n\ + ldr r1, _08090708 @ =0x06000072\n\ + adds r0, r1\n\ + ldrh r2, [r0]\n\ + ands r2, r4\n\ + orrs r2, r5\n\ + strh r2, [r0]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x4\n\ + bls _080906C8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080906FC: .4byte 0x00000fff\n\ +_08090700: .4byte 0x06000040\n\ +_08090704: .4byte 0x06000032\n\ +_08090708: .4byte 0x06000072\n\ + .syntax divided\n"); +} +#endif + +u8 sub_809070C(u16 dexNum, u32 b, u32 c) +{ + u8 taskId = CreateTask(sub_8090750, 0); + + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = dexNum; + gTasks[taskId].data[12] = b; + gTasks[taskId].data[13] = b >> 16; + gTasks[taskId].data[14] = c; + gTasks[taskId].data[15] = c >> 16; + return taskId; +} + +static void sub_8090750(u8 taskId) +{ + u8 spriteId; + u16 dexNum = gTasks[taskId].data[1]; + u16 i; + + switch (gTasks[taskId].data[0]) + { + case 0: + default: + if (!gPaletteFade.active) + { + gUnknown_03005CEC = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_8091060(0x100); + gTasks[taskId].data[0] = 1; + } + break; + case 1: + LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM + 0x4000)); + LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800)); + for (i = 0; i < 0x280; i++) + { +#ifndef NONMATCHING + asm(""); +#endif + *(u16 *)(VRAM + 0x7800 + 2 * i) += 0x2000; + } + sub_8091738(gTasks[taskId].data[1], 2, 0x3FC); + ResetPaletteFade(); + LoadPalette(gPokedexMenu_Pal + 1, 0x21, 0x9E); + gTasks[taskId].data[0]++; + break; + case 2: + SetUpWindowConfig(&gWindowConfig_81E7064); + InitMenuWindow(&gWindowConfig_81E7064); + DmaClear16(3, (void *)(VRAM + 0xC000), 0x200); + gTasks[taskId].data[0]++; + break; + case 3: + sub_8072BD8(gDexText_RegisterComplete, 2, 0, 0xD0); + if (!IsNationalPokedexEnabled()) + sub_8091154(NationalToHoennOrder(dexNum), 13, 3); + else + sub_8091154(dexNum, 13, 3); + sub_80911C8(dexNum, 16, 3); + MenuPrint(gDexText_UnknownPoke, CATEGORY_LEFT, 5); + MenuPrint(gDexText_UnknownHeight, 16, 7); + MenuPrint(gDexText_UnknownWeight, 16, 9); + sub_8091304(gPokedexEntries[dexNum].categoryName, CATEGORY_LEFT, 5); + sub_8091458(gPokedexEntries[dexNum].height, 16, 7); + sub_8091564(gPokedexEntries[dexNum].weight, 16, 9); + MenuPrint(gPokedexEntries[dexNum].descriptionPage1, 2, 13); + sub_80917CC(14, 0x3FC); + gTasks[taskId].data[0]++; + break; + case 4: + spriteId = sub_80918EC(dexNum, 0x30, 0x38, 0); + gSprites[spriteId].oam.priority = 0; + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + SetVBlankCallback(gUnknown_03005CEC); + gTasks[taskId].data[3] = spriteId; + gTasks[taskId].data[0]++; + break; + case 5: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + gTasks[taskId].data[0]++; + break; + case 6: + if (!gPaletteFade.active) + { + PlayCry1(NationalPokedexNumToSpecies(dexNum), 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[4] = 0; + gTasks[taskId].func = sub_8090A3C; + } + break; + } +} + +static void sub_8090A3C(u8 taskId) +{ + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(0x0000FFFC, 0, 0, 16, 0); + gSprites[gTasks[taskId].data[3]].callback = sub_8090C28; + gTasks[taskId].func = sub_8090B8C; + return; + } + else if (gMain.newKeys & A_BUTTON) + { + if (gTasks[taskId].data[4] == 0) + { + u16 r4 = gTasks[taskId].data[1]; + + MenuZeroFillWindowRect(2, 13, 27, 19); + MenuPrint(gPokedexEntries[r4].descriptionPage2, 2, 13); + (*(u16 *)(VRAM + 0x7ACA))++; + (*(u16 *)(VRAM + 0x7B0A))++; + gTasks[taskId].data[4] = 1; + PlaySE(SE_PIN); + } + else + { + BeginNormalPaletteFade(0x0000FFFC, 0, 0, 16, 0); + gSprites[gTasks[taskId].data[3]].callback = sub_8090C28; + gTasks[taskId].func = sub_8090B8C; + return; + } + } + gTasks[taskId].data[2]++; + if (gTasks[taskId].data[2] & 0x10) + LoadPalette(gPokedexMenu_Pal + 1, 0x51, 14); + else + LoadPalette(gPokedexMenu2_Pal + 1, 0x51, 14); +} + +static void sub_8090B8C(u8 taskId) +{ + if (!gPaletteFade.active) + { + u16 species; + u32 otId; + u32 personality; + u8 paletteNum; + const u8 *lzPaletteData; + + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + CpuCopy16(gUnknown_08D00524, (void *)(VRAM + 0xC000), 0x1000); + sub_800D74C(); + species = NationalPokedexNumToSpecies(gTasks[taskId].data[1]); + otId = ((u16)gTasks[taskId].data[13] << 16) | (u16)gTasks[taskId].data[12]; + personality = ((u16)gTasks[taskId].data[15] << 16) | (u16)gTasks[taskId].data[14]; + paletteNum = gSprites[gTasks[taskId].data[3]].oam.paletteNum; + lzPaletteData = species_and_otid_get_pal(species, otId, personality); + LoadCompressedPalette(lzPaletteData, 0x100 | paletteNum * 16, 32); + DestroyTask(taskId); + } +} + +static void sub_8090C28(struct Sprite *sprite) +{ + if (sprite->pos1.x < 0x78) + sprite->pos1.x += 2; + if (sprite->pos1.x > 0x78) + sprite->pos1.x -= 2; + + if (sprite->pos1.y < 0x50) + sprite->pos1.y += 1; + if (sprite->pos1.y > 0x50) + sprite->pos1.y -= 1; +} + +static void sub_8090C68(void) +{ + if (gUnknown_0202FFBC->owned) + { + if (gPokedexView->descriptionPageNum == 0) + { + MenuZeroFillWindowRect(2, 13, 27, 19); + MenuPrint(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage2, 2, 13); + gPokedexView->descriptionPageNum = 1; + (*(u16 *)(VRAM + 0x7ACA))++; + (*(u16 *)(VRAM + 0x7B0A))++; + PlaySE(SE_PIN); + } + else + { + MenuZeroFillWindowRect(2, 13, 27, 19); + MenuPrint(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); + gPokedexView->descriptionPageNum = 0; + (*(u16 *)(VRAM + 0x7ACA))--; + (*(u16 *)(VRAM + 0x7B0A))--; + PlaySE(SE_PIN); + } + } +} + +const u8 *GetPokemonCategory(u16 dexNum) +{ + return gPokedexEntries[dexNum].categoryName; +} + +u16 GetPokedexHeightWeight(u16 dexNum, u8 data) +{ + switch (data) + { + case 0: // height + return gPokedexEntries[dexNum].height; + case 1: // weight + return gPokedexEntries[dexNum].weight; + default: + return 1; + } +} + +s8 GetNationalPokedexFlag(u16 a, u8 b) +{ + u8 index; + u8 bit; + u8 mask; + s8 retVal; + + a--; + index = a / 8; + bit = a % 8; + mask = 1 << bit; + retVal = 0; + switch (b) + { + case 0: + if (gSaveBlock2.pokedex.seen[index] & mask) + { + if ((gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.unk938[index] & mask) + && (gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.unk3A8C[index] & mask)) + retVal = 1; + else + { + gSaveBlock2.pokedex.seen[index] &= ~mask; + gSaveBlock1.unk938[index] &= ~mask; + gSaveBlock1.unk3A8C[index] &= ~mask; + retVal = 0; + } + } + break; + case 1: + if (gSaveBlock2.pokedex.owned[index] & mask) + { + if ((gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock2.pokedex.seen[index] & mask) + && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.unk938[index] & mask) + && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.unk3A8C[index] & mask)) + retVal = 1; + else + { + gSaveBlock2.pokedex.owned[index] &= ~mask; + gSaveBlock2.pokedex.seen[index] &= ~mask; + gSaveBlock1.unk938[index] &= ~mask; + gSaveBlock1.unk3A8C[index] &= ~mask; + retVal = 0; + } + } + break; + case 2: + gSaveBlock2.pokedex.seen[index] |= mask; + gSaveBlock1.unk938[index] |= mask; + gSaveBlock1.unk3A8C[index] |= mask; + break; + case 3: + gSaveBlock2.pokedex.owned[index] |= mask; + break; + } + return retVal; +} + +u16 GetNationalPokedexCount(u8 a) +{ + u16 count = 0; + u16 i; + + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + switch (a) + { + case 0: + if (GetNationalPokedexFlag(i + 1, 0) != 0) + count++; + break; + case 1: + if (GetNationalPokedexFlag(i + 1, 1) != 0) + count++; + break; + } + } + return count; +} + +u16 GetHoennPokedexCount(u8 a) +{ + u16 count = 0; + u16 i; + + for (i = 0; i < 202; i++) + { + switch (a) + { + case 0: + if (GetNationalPokedexFlag(HoennToNationalOrder(i + 1), 0) != 0) + count++; + break; + case 1: + if (GetNationalPokedexFlag(HoennToNationalOrder(i + 1), 1) != 0) + count++; + break; + } + } + return count; +} + +bool8 sub_8090FC0(void) +{ + u16 i; + + for (i = 0; i < 200; i++) + { + if (GetNationalPokedexFlag(HoennToNationalOrder(i + 1), 1) == 0) + return FALSE; + } + return TRUE; +} + +u16 sub_8090FF4(void) +{ + u16 i; + + for (i = 0; i < 150; i++) + { + if (GetNationalPokedexFlag(i + 1, 1) == 0) + return 0; + } + for (i = 152; i < 250; i++) + { + if (GetNationalPokedexFlag(i + 1, 1) == 0) + return 0; + } + for (i = 252; i < 384; i++) + { + if (GetNationalPokedexFlag(i + 1, 1) == 0) + return 0; + } + return 1; +} + +static void sub_8091060(u16 a) +{ + if (!(a & 0x100)) + { + REG_DISPCNT &= 0xFEFF; + REG_BG0CNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + } + if (!(a & 0x200)) + { + REG_DISPCNT &= 0xFDFF; + REG_BG1CNT = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + } + if (!(a & 0x400)) + { + REG_DISPCNT &= 0xFBFF; + REG_BG2CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + } + if (!(a & 0x800)) + { + REG_DISPCNT &= 0xF7FF; + REG_BG3CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + } + if (!(a & 0x1000)) + { + REG_DISPCNT &= 0xEFFF; + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + } +} + +static void sub_8091154(u16 order, u8 b, u8 c) +{ + u8 str[4]; + + str[0] = CHAR_0 + order / 100; + str[1] = CHAR_0 + (order % 100) / 10; + str[2] = CHAR_0 + (order % 100) % 10; + str[3] = EOS; + MenuPrint(str, b, c); +} + +static u8 sub_80911C8(u16 num, u8 b, u8 c) +{ + u8 str[11]; + u8 i; + + for (i = 0; i < 11; i++) + str[i] = EOS; + num = NationalPokedexNumToSpecies(num); + switch (num) + { + default: + for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) + str[i] = gSpeciesNames[num][i]; + break; + case 0: + for (i = 0; i < 10; i++) + str[i] = 0xAE; + break; + } + MenuPrint(str, b, c); + return i; +} + +static u8 sub_8091260(u16 num, u8 b, u8 c, u8 d) +{ + u8 str[40]; + u8 *end; + u8 i; + + end = StringCopy(str, gUnknown_083B5558); + str[2] = d; + num = NationalPokedexNumToSpecies(num); + switch (num) + { + default: + for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) + end[i] = gSpeciesNames[num][i]; + break; + case 0: + for (i = 0; i < 10; i++) + end[i] = 0xAE; + break; + } + end[i] = EOS; + MenuPrint(str, b, c); + return i; +} + +static void sub_8091304(const u8 *name, u8 left, u8 top) +{ + u8 str[32]; + u8 i; +#if ENGLISH + u8 j; +#endif + + for (i = 0; name[i] != EOS && i < 11; i++) + str[i] = name[i]; +#if ENGLISH + for (j = 0; gDexText_UnknownPoke[j] == 0xAC || gDexText_UnknownPoke[j] == 0; j++) + ; + j--; + while (gDexText_UnknownPoke[j] != EOS) + str[i++] = gDexText_UnknownPoke[j++]; +#endif + str[i] = EOS; + sub_8072B80(str, left, top, gDexText_UnknownPoke); +} + +#if ENGLISH +void unref_sub_80913A4(u16 a, u8 left, u8 top) +{ + u8 str[6]; + bool8 outputted = FALSE; + u8 result; + + result = a / 1000; + if (result == 0) + { + str[0] = CHAR_SPACE; + outputted = FALSE; + } + else + { + str[0] = CHAR_0 + result; + outputted = TRUE; + } + + result = (a % 1000) / 100; + if (result == 0 && !outputted) + { + str[1] = CHAR_SPACE; + outputted = FALSE; + } + else + { + str[1] = CHAR_0 + result; + outputted = TRUE; + } + + str[2] = CHAR_0 + ((a % 1000) % 100) / 10; + str[3] = CHAR_PERIOD; + str[4] = CHAR_0 + ((a % 1000) % 100) % 10; + str[5] = EOS; + MenuPrint(str, left, top); +} +#elif GERMAN +void unref_sub_80913A4(u16 arg0, u8 left, u8 top) { + u8 buffer[8]; + int offset; + u8 result; + + u8 r6 = 0; + offset = 0; + + + buffer[r6++] = 0xFC; + buffer[r6++] = 0x13; + r6++; + + result = (arg0 / 1000); + if (result == 0) + { + offset = 6; + } + else + { + buffer[r6++] = result + CHAR_0; + } + + + result = (arg0 % 1000) / 100; + + if (result == 0 && offset != 0) + { + offset += 6; + } + else + { + buffer[r6++] = result + CHAR_0; + } + + buffer[r6++] = (((arg0 % 1000) % 100) / 10) + CHAR_0; + buffer[r6++] = CHAR_COMMA; + buffer[r6++] = (((arg0 % 1000) % 100) % 10) + CHAR_0; + + buffer[r6++] = EOS; + buffer[2] = offset; + MenuPrint(buffer, left, top); +} +#endif + +#ifdef UNITS_IMPERIAL +#define CHAR_PRIME (0xB4) +#define CHAR_DOUBLE_PRIME (0xB2) +static void sub_8091458(u16 height, u8 left, u8 top) +{ + u8 buffer[16]; + u32 inches, feet; + u8 i = 0; + + inches = (height * 10000) / 254; + if (inches % 10 >= 5) + inches += 10; + feet = inches / 120; + inches = (inches - (feet * 120)) / 10; + + buffer[i++] = EXT_CTRL_CODE_BEGIN; + buffer[i++] = 0x13; + if (feet / 10 == 0) + { + buffer[i++] = 18; + buffer[i++] = feet + CHAR_0; + } + else + { + buffer[i++] = 12; + buffer[i++] = feet / 10 + CHAR_0; + buffer[i++] = (feet % 10) + CHAR_0; + } + buffer[i++] = CHAR_PRIME; + buffer[i++] = (inches / 10) + CHAR_0; + buffer[i++] = (inches % 10) + CHAR_0; + buffer[i++] = CHAR_DOUBLE_PRIME; + buffer[i++] = EOS; + MenuPrint(buffer, left, top); +} +#else +static void sub_8091458(u16 height, u8 left, u8 top) +{ + unref_sub_80913A4(height, left, top); +} +#endif + +#ifdef UNITS_IMPERIAL +static void sub_8091564(u16 weight, u8 left, u8 top) +{ + u8 buffer[16]; + u32 lbs; + u8 i = 0; + bool8 output; + + lbs = (weight * 100000) / 4536; + if (lbs % 10 >= 5) + lbs += 10; + output = FALSE; + + buffer[i] = (lbs / 100000) + CHAR_0; + if (buffer[i] == CHAR_0 && output == FALSE) + { + buffer[i++] = CHAR_SPACE; + buffer[i++] = CHAR_SPACE; + } + else + { + output = TRUE; + i++; + } + + lbs = (lbs % 100000); + buffer[i] = (lbs / 10000) + CHAR_0; + if (buffer[i] == CHAR_0 && output == FALSE) + { + buffer[i++] = CHAR_SPACE; + buffer[i++] = CHAR_SPACE; + } + else + { + output = TRUE; + i++; + } + + lbs = (lbs % 10000); + buffer[i] = (lbs / 1000) + CHAR_0; + if (buffer[i] == CHAR_0 && output == FALSE) + { + buffer[i++] = CHAR_SPACE; + buffer[i++] = CHAR_SPACE; + } + else + { + output = TRUE; + i++; + } + lbs = (lbs % 1000); + buffer[i++] = (lbs / 100) + CHAR_0; + lbs = (lbs % 100); + buffer[i++] = CHAR_PERIOD; + buffer[i++] = (lbs / 10) + CHAR_0; + buffer[i++] = CHAR_SPACE; + buffer[i++] = CHAR_l; + buffer[i++] = CHAR_b; + buffer[i++] = CHAR_s; + buffer[i++] = CHAR_PERIOD; + buffer[i++] = EOS; + MenuPrint(buffer, left, top); +} +#else +static void sub_8091564(u16 arg0, u8 left, u8 top) +{ + unref_sub_80913A4(arg0, left, top); +} +#endif + +static void sub_8091738(u16 num, u16 b, u16 c) +{ + u8 arr[0x80]; + u16 i; + u16 j; + const u8 *r12; + u16 r7; + u8 r3; + + r12 = sMonFootprintTable[NationalPokedexNumToSpecies(num)]; + for (r7 = 0, i = 0; i < 32; i++) + { + r3 = r12[i]; + for (j = 0; j < 4; j++) + { + u32 r1 = j * 2; + s32 r2 = (r3 >> r1) & 1; + + if (r3 & (2 << r1)) + r2 |= 0x10; + +// Needed to match +#ifndef NONMATCHING + asm("");asm("");asm("");asm("");asm(""); +#endif + + arr[r7] = r2; + r7++; + } + } + CpuCopy16(arr, (u16 *)(VRAM + b * 0x4000 + c * 0x20), 0x80); +} + +static void sub_80917CC(u16 a, u16 b) +{ + *(u16 *)(VRAM + a * 0x800 + 0x232) = 0xF000 + b + 0; + *(u16 *)(VRAM + a * 0x800 + 0x234) = 0xF000 + b + 1; + *(u16 *)(VRAM + a * 0x800 + 0x272) = 0xF000 + b + 2; + *(u16 *)(VRAM + a * 0x800 + 0x274) = 0xF000 + b + 3; +} + +static u16 sub_8091818(u8 a, u16 b, u16 c, u16 d) +{ + switch (a) + { + case 1: + if (b > c) + b--; + break; + case 0: + if (b < d) + b++; + break; + case 3: + if (b > c) + b--; + else + b = d; + break; + case 2: + if (b < d) + b++; + else + b = c; + break; + } + return b; +} + +static void nullsub_59(struct Sprite *sprite) +{ +} + +static void sub_8091878(u16 a, u8 b) +{ + gUnknown_02024E8C = gUnknown_083B57A4; + gUnknown_02024E8C.paletteTag = a; + gUnknown_02024E8C.images = gUnknown_083B5794[b]; + gUnknown_02024E8C.anims = gSpriteAnimTable_81E7C64; +} + +static void sub_80918B0(u16 a, u8 b) +{ + gUnknown_02024E8C = gUnknown_083B57A4; + gUnknown_02024E8C.paletteTag = a; + gUnknown_02024E8C.images = gUnknown_083B5794[b]; + gUnknown_02024E8C.anims = gUnknown_081EC2A4[0]; +} + +u16 sub_80918EC(u16 num, s16 x, s16 y, u16 paletteNum) +{ + u8 spriteId; + + num = NationalPokedexNumToSpecies(num); + switch (num) + { + default: + DecompressPicFromTable_2( + &gMonFrontPicTable[num], + gMonFrontPicCoords[num].coords, + gMonFrontPicCoords[num].y_offset, + (void *)0x02000000, + gUnknown_083B5584[paletteNum], + num); + break; + case SPECIES_SPINDA: + LoadSpecialPokePic( + &gMonFrontPicTable[num], + gMonFrontPicCoords[num].coords, + gMonFrontPicCoords[num].y_offset, + 0x02000000, + gUnknown_083B5584[paletteNum], + num, + gSaveBlock2.pokedex.spindaPersonality, + 1); + break; + case SPECIES_UNOWN: + LoadSpecialPokePic( + &gMonFrontPicTable[num], + gMonFrontPicCoords[num].coords, + gMonFrontPicCoords[num].y_offset, + 0x02000000, + gUnknown_083B5584[paletteNum], + num, + gSaveBlock2.pokedex.unownPersonality, + 1); + break; + } + LoadCompressedPalette(gMonPaletteTable[num].data, 0x100 + paletteNum * 16, 32); + sub_8091878(paletteNum, paletteNum); + spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); + gSprites[spriteId].oam.paletteNum = paletteNum; + return spriteId; +} + +static u8 sub_8091A4C(u16 gender, s16 x, s16 y, u16 paletteNum) +{ + u8 spriteId; + + DecompressPicFromTable_2( + &gTrainerFrontPicTable[gender], + gTrainerFrontPicCoords[gender].coords, + gTrainerFrontPicCoords[gender].y_offset, + (void *)0x02000000, + gUnknown_083B5584[0], + gender); + sub_80918B0(gender, 0); + spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); + gSprites[spriteId].oam.paletteNum = paletteNum; + return spriteId; +} + +int sub_8091AF8(u8 a, u8 b, u8 abcGroup, u8 bodyColor, u8 type1, u8 type2) +{ + u16 species; + u16 i; + u16 resultsCount; + u8 types[2]; + + SortPokedex(a, b); + + for (i = 0, resultsCount = 0; i < NATIONAL_DEX_COUNT; i++) + { + if (gPokedexView->unk0[i].seen) + { + gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; + resultsCount++; + } + } + gPokedexView->pokemonListCount = resultsCount; + + // Search by name + if (abcGroup != 0xFF) + { + for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) + { + u8 r3; + + species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); + r3 = gSpeciesNames[species][0]; + if ((r3 >= gUnknown_083B57BC[abcGroup][0] && r3 < gUnknown_083B57BC[abcGroup][0] + gUnknown_083B57BC[abcGroup][1]) + || (r3 >= gUnknown_083B57BC[abcGroup][2] && r3 < gUnknown_083B57BC[abcGroup][2] + gUnknown_083B57BC[abcGroup][3])) + { + gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; + resultsCount++; + } + } + gPokedexView->pokemonListCount = resultsCount; + } + + // Search by body color + if (bodyColor != 0xFF) + { + for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) + { + species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); + + if (bodyColor == gBaseStats[species].bodyColor) + { + gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; + resultsCount++; + } + } + gPokedexView->pokemonListCount = resultsCount; + } + + // Search by type + if (type1 != 0xFF || type2 != 0xFF) + { + if (type1 == 0xFF) + { + type1 = type2; + type2 = 0xFF; + } + + if (type2 == 0xFF) + { + for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) + { + if (gPokedexView->unk0[i].owned) + { + species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); + + types[0] = gBaseStats[species].type1; + types[1] = gBaseStats[species].type2; + if (types[0] == type1 || types[1] == type1) + { + gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; + resultsCount++; + } + } + } + } + else + { + for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) + { + if (gPokedexView->unk0[i].owned) + { + species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); + + types[0] = gBaseStats[species].type1; + types[1] = gBaseStats[species].type2; + if ((types[0] == type1 && types[1] == type2) || (types[0] == type2 && types[1] == type1)) + { + gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; + resultsCount++; + } + } + } + } + gPokedexView->pokemonListCount = resultsCount; + } + + if (gPokedexView->pokemonListCount != 0) + { + for (i = gPokedexView->pokemonListCount; i < NATIONAL_DEX_COUNT; i++) + { + gPokedexView->unk0[i].dexNum = 0xFFFF; + gPokedexView->unk0[i].seen = FALSE; + gPokedexView->unk0[i].owned = FALSE; + + } + } + + return resultsCount; +} + +#if ENGLISH +#define SUB_8091E20_WIDTH (208) +#elif GERMAN +#define SUB_8091E20_WIDTH (216) +#endif + +void sub_8091E20(const u8 *str) +{ + sub_8072AB0(str, 9, 120, SUB_8091E20_WIDTH, 32, 1); +} + +u8 sub_8091E3C(void) +{ + return CreateTask(sub_8091E54, 0); +} + +static void sub_8091E54(u8 taskId) +{ + u16 i; + + switch (gMain.state) + { + default: + case 0: + if (!gPaletteFade.active) + { + gPokedexView->unk64A = 2; + sub_8091060(0); + LZ77UnCompVram(gPokedexMenuSearch_Gfx, (void *)VRAM); + LZ77UnCompVram(gUnknown_08E96D2C, (void *)(VRAM + 0x7800)); + LoadPalette(gPokedexMenuSearch_Pal + 1, 1, 0x7E); + if (!IsNationalPokedexEnabled()) + { + for (i = 0; i < 17; i++) + { + ((u16 *)(VRAM + 0x7A80))[i] = ((u16 *)(VRAM + 0x7B00))[i]; + ((u16 *)(VRAM + 0x7AC0))[i] = ((u16 *)(VRAM + 0x7B40))[i]; + ((u16 *)(VRAM + 0x7B00))[i] = 1; + ((u16 *)(VRAM + 0x7B40))[i] = 1; + } + } + gMain.state = 1; + } + break; + case 1: + SetUpWindowConfig(&gWindowConfig_81E7064); + InitMenuWindow(&gWindowConfig_81E7064); + LoadCompressedObjectPic(&gUnknown_083A05CC[0]); + LoadSpritePalettes(gUnknown_083A05DC); + sub_809308C(taskId); + for (i = 0; i < 16; i++) + gTasks[taskId].data[i] = 0; + sub_8092EB0(taskId); + sub_8092AB0(0); + sub_8092B68(taskId); + gMain.state++; + break; + case 2: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + gMain.state++; + break; + case 3: + REG_BG3CNT = 0x0F03; + REG_DISPCNT = 0x1C40; + gMain.state++; + break; + case 4: + if (!gPaletteFade.active) + { + gTasks[taskId].func = sub_809204C; + gMain.state = 0; + } + break; + } +} + +static void sub_809204C(u8 taskId) +{ + sub_8092AB0(gTasks[taskId].data[0]); + sub_8092B68(taskId); + gTasks[taskId].func = sub_809207C; +} + +static void sub_809207C(u8 taskId) +{ + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_PC_OFF); + gTasks[taskId].func = sub_80927B8; + return; + } + if (gMain.newKeys & A_BUTTON) + { + switch (gTasks[taskId].data[0]) + { + case 0: + PlaySE(SE_PIN); + gTasks[taskId].data[1] = 0; + gTasks[taskId].func = sub_809217C; + break; + case 1: + PlaySE(SE_PIN); + gTasks[taskId].data[1] = 4; + gTasks[taskId].func = sub_809217C; + break; + case 2: + PlaySE(SE_PC_OFF); + gTasks[taskId].func = sub_80927B8; + break; + } + return; + } + if ((gMain.newKeys & DPAD_LEFT) && gTasks[taskId].data[0] > 0) + { + PlaySE(SE_Z_PAGE); + gTasks[taskId].data[0]--; + sub_8092AB0(gTasks[taskId].data[0]); + } + if ((gMain.newKeys & DPAD_RIGHT) && gTasks[taskId].data[0] < 2) + { + PlaySE(SE_Z_PAGE); + gTasks[taskId].data[0]++; + sub_8092AB0(gTasks[taskId].data[0]); + } +} + +static void sub_809217C(u8 taskId) +{ + sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); + sub_8092B68(taskId); + gTasks[taskId].func = sub_80921B0; +} + +static void sub_80921B0(u8 taskId) +{ + const u8 (*r6)[4]; + + if (gTasks[taskId].data[0] != 0) + { + if (!IsNationalPokedexEnabled()) + r6 = gUnknown_083B58A4; + else + r6 = gUnknown_083B586C; + } + else + { + if (!IsNationalPokedexEnabled()) + r6 = gUnknown_083B5888; + else + r6 = gUnknown_083B5850; + } + + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_BOWA); + sub_8092EB0(taskId); + gTasks[taskId].func = sub_809204C; + return; + } + if (gMain.newKeys & A_BUTTON) + { + if (gTasks[taskId].data[1] == 6) + { + if (gTasks[taskId].data[0] != 0) + { + gUnknown_0202FFBA = 0x40; + gPokedexView->unk62A = 0x40; + gUnknown_0202FFB8 = 0; + gPokedexView->unk610 = 0; + gSaveBlock2.pokedex.unknown1 = sub_8092E10(taskId, 5); + if (!IsNationalPokedexEnabled()) + gSaveBlock2.pokedex.unknown1 = 0; + gPokedexView->unk614 = gSaveBlock2.pokedex.unknown1; + gSaveBlock2.pokedex.order = sub_8092E10(taskId, 4); + gPokedexView->unk618 = gSaveBlock2.pokedex.order; + PlaySE(SE_PC_OFF); + gTasks[taskId].func = sub_80927B8; + } + else + { + sub_8091E20(gDexText_Searching); + gTasks[taskId].func = sub_80923FC; + PlaySE(SE_Z_SEARCH); + } + } + else + { + PlaySE(SE_PIN); + gTasks[taskId].func = sub_80925CC; + } + return; + } + + if ((gMain.newKeys & DPAD_LEFT) && r6[gTasks[taskId].data[1]][0] != 0xFF) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][0]; + sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); + } + if ((gMain.newKeys & DPAD_RIGHT) && r6[gTasks[taskId].data[1]][1] != 0xFF) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][1]; + sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); + } + if ((gMain.newKeys & DPAD_UP) && r6[gTasks[taskId].data[1]][2] != 0xFF) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][2]; + sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); + } + if ((gMain.newKeys & DPAD_DOWN) && r6[gTasks[taskId].data[1]][3] != 0xFF) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][3]; + sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); + } +} + +static void sub_80923FC(u8 taskId) +{ + u8 r10 = sub_8092E10(taskId, 5); + u8 r9 = sub_8092E10(taskId, 4); + u8 r8 = sub_8092E10(taskId, 0); + u8 r6 = sub_8092E10(taskId, 1); + u8 r4 = sub_8092E10(taskId, 2); + u8 r0 = sub_8092E10(taskId, 3); + + sub_8091AF8(r10, r9, r8, r6, r4, r0); + gTasks[taskId].func = sub_80924A4; +} + +static void sub_80924A4(u8 taskId) +{ + if (!IsSEPlaying()) + { + if (gPokedexView->pokemonListCount != 0) + { + PlaySE(SE_SEIKAI); + sub_8091E20(gDexText_SearchComplete); + } + else + { + PlaySE(SE_HAZURE); + sub_8091E20(gDexText_NoMatching); + } + gTasks[taskId].func = sub_8092508; + } +} + +static void sub_8092508(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + if (gPokedexView->pokemonListCount != 0) + { + gPokedexView->unk64F = 1; + gPokedexView->dexMode = sub_8092E10(taskId, 5); + gPokedexView->dexOrder = sub_8092E10(taskId, 4); + gTasks[taskId].func = sub_80927B8; + PlaySE(SE_PC_OFF); + } + else + { + gTasks[taskId].func = sub_809217C; + PlaySE(SE_BOWA); + } + } +} + +static void sub_80925B4(u16 a, int unused) +{ + sub_814AD7C(0x90, (a * 2 + 1) * 8); +} + +static void sub_80925CC(u8 taskId) +{ + u8 r0; + u16 *p1; + u16 *p2; + + sub_8092C8C(0); + r0 = gTasks[taskId].data[1]; + p1 = &gTasks[taskId].data[gUnknown_083B5A7C[r0].unk4]; + p2 = &gTasks[taskId].data[gUnknown_083B5A7C[r0].unk5]; + gTasks[taskId].data[14] = *p1; + gTasks[taskId].data[15] = *p2; + sub_8092D78(taskId); + CreateBlendedOutlineCursor(16, 0xFFFF, 12, 0x2D9F, 11); + sub_80925B4(*p1, 1); + gTasks[taskId].func = sub_8092644; +} + +static void sub_8092644(u8 taskId) +{ + u8 r1; + const struct UnknownStruct2 *r8; + u16 *p1; + u16 *p2; + u16 r2; + bool8 r3; + + r1 = gTasks[taskId].data[1]; + r8 = gUnknown_083B5A7C[r1].unk0; + p1 = &gTasks[taskId].data[gUnknown_083B5A7C[r1].unk4]; + p2 = &gTasks[taskId].data[gUnknown_083B5A7C[r1].unk5]; + r2 = gUnknown_083B5A7C[r1].unk6 - 1; + if (gMain.newKeys & A_BUTTON) + { + sub_814ADC8(); + PlaySE(SE_PIN); + MenuZeroFillWindowRect(18, 1, 28, 12); + sub_8092C8C(1); + gTasks[taskId].func = sub_809217C; + return; + } + if (gMain.newKeys & B_BUTTON) + { + sub_814ADC8(); + PlaySE(SE_BOWA); + MenuZeroFillWindowRect(18, 1, 28, 12); + sub_8092C8C(1); + *p1 = gTasks[taskId].data[14]; + *p2 = gTasks[taskId].data[15]; + gTasks[taskId].func = sub_809217C; + return; + } + r3 = FALSE; + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (*p1 != 0) + { + sub_80925B4(*p1, 0); + (*p1)--; + sub_80925B4(*p1, 1); + r3 = TRUE; + } + else if (*p2 != 0) + { + (*p2)--; + sub_8092D78(taskId); + sub_80925B4(*p1, 1); + r3 = TRUE; + } + if (r3) + { + PlaySE(SE_SELECT); + sub_8091E20(r8[*p1 + *p2].text1); + } + return; + } + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (*p1 < 5 && *p1 < r2) + { + sub_80925B4(*p1, 0); + (*p1)++; + sub_80925B4(*p1, 1); + r3 = TRUE; + } + else if (r2 > 5 && *p2 < r2 - 5) + { + (*p2)++; + sub_8092D78(taskId); + sub_80925B4(5, 1); + r3 = TRUE; + } + if (r3) + { + PlaySE(SE_SELECT); + sub_8091E20(r8[*p1 + *p2].text1); + } + return; + } +} + +static void sub_80927B8(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_80927F0; +} + +static void sub_80927F0(u8 taskId) +{ + if (!gPaletteFade.active) + DestroyTask(taskId); +} + +#ifdef NONMATCHING +void sub_8092810(u8 a, u8 b, u8 c, u8 d) +{ + u16 i; + + for (i = 0; i < d; i++) + { + ((u16 *)VRAM)[15 * 0x400 + c * 32 + i + b] &= 0xFFF; + ((u16 *)VRAM)[15 * 0x400 + c * 32 + i + b] |= a << 12; + + ((u16 *)VRAM)[15 * 0x400 + (c + 1) * 32 + i + b] &= 0xFFF; + ((u16 *)VRAM)[15 * 0x400 + (c + 1) * 32 + i + b] |= a << 12; + } +} +#else +__attribute__((naked)) +void sub_8092810(u8 a, u8 b, u8 c, u8 d) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r12, r1\n\ + lsls r2, 24\n\ + lsrs r1, r2, 24\n\ + lsls r3, 24\n\ + lsrs r5, r3, 8\n\ + movs r3, 0\n\ + cmp r5, 0\n\ + beq _0809285A\n\ + lsls r7, r1, 6\n\ + ldr r6, _08092860 @ =0x00000fff\n\ + lsls r4, r0, 12\n\ +_08092830:\n\ + mov r0, r12\n\ + adds r1, r0, r3\n\ + lsls r1, 1\n\ + adds r1, r7, r1\n\ + ldr r0, _08092864 @ =0x06007800\n\ + adds r2, r1, r0\n\ + ldrh r0, [r2]\n\ + ands r0, r6\n\ + orrs r0, r4\n\ + strh r0, [r2]\n\ + ldr r0, _08092868 @ =0x06007840\n\ + adds r1, r0\n\ + ldrh r0, [r1]\n\ + ands r0, r6\n\ + orrs r0, r4\n\ + strh r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r0, r5\n\ + bcc _08092830\n\ +_0809285A:\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08092860: .4byte 0x00000fff\n\ +_08092864: .4byte 0x06007800\n\ +_08092868: .4byte 0x06007840\n\ + .syntax divided\n"); +} +#endif + +static void sub_809286C(u8 a, u8 b, u8 c) +{ + u8 r5 = (b & 1) | ((c & 1) << 1); + + switch (a) + { + case 0: + case 1: + case 2: + sub_8092810(r5, gUnknown_083B57E4[a].unk4, gUnknown_083B57E4[a].unk5, gUnknown_083B57E4[a].unk6); + break; + case 3: + case 4: + case 7: + case 8: + sub_8092810(r5, gUnknown_083B57FC[a - 3].unk4, gUnknown_083B57FC[a - 3].unk5, gUnknown_083B57FC[a - 3].unk6); + // fall through + case 5: + case 6: + sub_8092810(r5, gUnknown_083B57FC[a - 3].unk7, gUnknown_083B57FC[a - 3].unk8, gUnknown_083B57FC[a - 3].unk9); + break; + case 10: + sub_8092810(r5, gUnknown_083B57FC[2].unk4, gUnknown_083B57FC[2].unk5, gUnknown_083B57FC[2].unk6); + break; + case 9: + if (!IsNationalPokedexEnabled()) + sub_8092810(r5, gUnknown_083B57FC[a - 3].unk4, gUnknown_083B57FC[a - 3].unk5 - 2, gUnknown_083B57FC[a - 3].unk6); + else + sub_8092810(r5, gUnknown_083B57FC[a - 3].unk4, gUnknown_083B57FC[a - 3].unk5, gUnknown_083B57FC[a - 3].unk6); + break; + } +} + +static void sub_8092964(u8 a) +{ + switch (a) + { + case 0: + sub_809286C(0, 0, 0); + sub_809286C(1, 1, 0); + sub_809286C(2, 1, 0); + sub_809286C(3, 1, 0); + sub_809286C(4, 1, 0); + sub_809286C(10, 1, 0); + sub_809286C(5, 1, 0); + sub_809286C(6, 1, 0); + sub_809286C(7, 1, 0); + sub_809286C(8, 1, 0); + sub_809286C(9, 1, 0); + break; + case 1: + sub_809286C(0, 1, 0); + sub_809286C(1, 0, 0); + sub_809286C(2, 1, 0); + sub_809286C(3, 1, 1); + sub_809286C(4, 1, 1); + sub_809286C(10, 1, 1); + sub_809286C(5, 1, 1); + sub_809286C(6, 1, 1); + sub_809286C(7, 1, 0); + sub_809286C(8, 1, 0); + sub_809286C(9, 1, 0); + break; + case 2: + sub_809286C(0, 1, 0); + sub_809286C(1, 1, 0); + sub_809286C(2, 0, 0); + sub_809286C(3, 1, 1); + sub_809286C(4, 1, 1); + sub_809286C(10, 1, 1); + sub_809286C(5, 1, 1); + sub_809286C(6, 1, 1); + sub_809286C(7, 1, 1); + sub_809286C(8, 1, 1); + sub_809286C(9, 1, 1); + break; + } +} + +static void sub_8092AB0(u8 a) +{ + sub_8092964(a); + sub_8091E20(gUnknown_083B57E4[a].text); +} + +static void sub_8092AD4(u8 a, u8 b) +{ + sub_8092964(a); + switch (b) + { + case 0: + sub_809286C(3, 0, 0); + break; + case 1: + sub_809286C(4, 0, 0); + break; + case 2: + sub_809286C(10, 0, 0); + sub_809286C(5, 0, 0); + break; + case 3: + sub_809286C(10, 0, 0); + sub_809286C(6, 0, 0); + break; + case 4: + sub_809286C(7, 0, 0); + break; + case 5: + sub_809286C(8, 0, 0); + break; + case 6: + sub_809286C(9, 0, 0); + break; + } + sub_8091E20(gUnknown_083B57FC[b].text); +} + +static void sub_8092B68(u8 taskId) +{ + u16 var; + + var = gTasks[taskId].data[6] + gTasks[taskId].data[7]; + StringCopy(gStringVar1, gUnknown_083B5910[var].text2); + MenuPrint_PixelCoords(gUnknown_083B5AB2, 45, 16, 1); + + var = gTasks[taskId].data[8] + gTasks[taskId].data[9]; + StringCopy(gStringVar1, gUnknown_083B5968[var].text2); + MenuPrint_PixelCoords(gUnknown_083B5AB2, 45, 32, 1); + + var = gTasks[taskId].data[10] + gTasks[taskId].data[11]; + StringCopy(gStringVar1, gUnknown_083B59C8[var].text2); + MenuPrint_PixelCoords(gUnknown_083B5AAC, 45, 48, 1); + + var = gTasks[taskId].data[12] + gTasks[taskId].data[13]; + StringCopy(gStringVar1, gUnknown_083B59C8[var].text2); + MenuPrint_PixelCoords(gUnknown_083B5AAC, 93, 48, 1); + + var = gTasks[taskId].data[4] + gTasks[taskId].data[5]; + StringCopy(gStringVar1, gUnknown_083B58D8[var].text2); + MenuPrint_PixelCoords(gUnknown_083B5AB2, 45, 64, 1); + + if (IsNationalPokedexEnabled()) + { + var = gTasks[taskId].data[2] + gTasks[taskId].data[3]; + StringCopy(gStringVar1, gUnknown_083B58C0[var].text2); + MenuPrint_PixelCoords(gUnknown_083B5AB2, 45, 80, 1); + } +} + +static void sub_8092C8C(u8 a) +{ + u16 i; + u16 j; + + if (a == 0) + { + *((u16 *)(VRAM + 0x7800 + 0x22)) = 0xC0B; + for (i = 0x12; i < 0x1D; i++) + *((u16 *)(VRAM + 0x7800 + i * 2)) = 0x80D; + *((u16 *)(VRAM + 0x7800 + 0x3A)) = 0x80B; + for (j = 1; j < 13; j++) + { + *((u16 *)(VRAM + 0x7800 + 0x22 + j * 64)) = 0x40A; + for (i = 0x12; i < 0x1D; i++) + *((u16 *)(VRAM + 0x7800 + j * 64 + i * 2)) = 2; + *((u16 *)(VRAM + 0x7800 + 0x3A + j * 64)) = 0xA; + } + *((u16 *)(VRAM + 0x7800 + 0x362)) = 0x40B; + for (i = 0x12; i < 0x1D; i++) + *((u16 *)(VRAM + 0x7800 + 0x340 + i * 2)) = 0xD; + *((u16 *)(VRAM + 0x7800 + 0x37A)) = 0xB; + } + else + { + for (j = 0; j < 14; j++) + { + for (i = 0x11; i < 0x1E; i++) + { + *((u16 *)(VRAM + 0x7800 + j * 64 + i * 2)) = 0x4F; + } + } + } +} + +static void sub_8092D78(u8 taskId) +{ + const struct UnknownStruct2 *r6 = gUnknown_083B5A7C[gTasks[taskId].data[1]].unk0; + const u16 *r8 = &gTasks[taskId].data[gUnknown_083B5A7C[gTasks[taskId].data[1]].unk4]; + const u16 *r7 = &gTasks[taskId].data[gUnknown_083B5A7C[gTasks[taskId].data[1]].unk5]; + u16 i; + u16 j; + + MenuZeroFillWindowRect(18, 1, 28, 12); + for (i = 0, j = *r7; i < 6 && r6[j].text2 != NULL; i++, j++) + { +#ifndef NONMATCHING + j += 0; // Useless statement needed to match +#endif + MenuPrint(r6[j].text2, 18, i * 2 + 1); + } + sub_8091E20(r6[*r8 + *r7].text1); +} + +static u8 sub_8092E10(u8 taskId, u8 b) +{ + const u16 *ptr1 = &gTasks[taskId].data[gUnknown_083B5A7C[b].unk4]; + const u16 *ptr2 = &gTasks[taskId].data[gUnknown_083B5A7C[b].unk5]; + u16 r2 = *ptr1 + *ptr2; + + switch (b) + { + default: + return 0; + case 5: + return gUnknown_083B5A60[r2]; + case 4: + return gUnknown_083B5A62[r2]; + case 0: + if (r2 == 0) + return 0xFF; + else + return r2; + case 1: + if (r2 == 0) + return 0xFF; + else + return r2 - 1; + case 2: + case 3: + return gUnknown_083B5A68[r2]; + } +} + +static void sub_8092EB0(u8 taskId) +{ + u16 r3; + + switch (gPokedexView->unk614) + { + default: + case 0: + r3 = 0; + break; + case 1: + r3 = 1; + break; + } + gTasks[taskId].data[2] = r3; + + switch (gPokedexView->unk618) + { + default: + case 0: + r3 = 0; + break; + case 1: + r3 = 1; + break; + case 2: + r3 = 2; + break; + case 3: + r3 = 3; + break; + case 4: + r3 = 4; + break; + case 5: + r3 = 5; + break; + } + gTasks[taskId].data[4] = r3; +} + +static bool8 sub_8092F44(u8 taskId) +{ + u8 val1 = gTasks[taskId].data[1]; + const u16 *ptr = &gTasks[taskId].data[gUnknown_083B5A7C[val1].unk5]; + u16 val2 = gUnknown_083B5A7C[val1].unk6 - 1; + + if (val2 > 5 && *ptr != 0) + return FALSE; + else + return TRUE; +} + +static bool8 sub_8092F8C(u8 taskId) +{ + u8 val1 = gTasks[taskId].data[1]; + const u16 *ptr = &gTasks[taskId].data[gUnknown_083B5A7C[val1].unk5]; + u16 val2 = gUnknown_083B5A7C[val1].unk6 - 1; + + if (val2 > 5 && *ptr < val2 - 5) + return FALSE; + else + return TRUE; +} + +static void sub_8092FD8(struct Sprite *sprite) +{ + if (gTasks[sprite->data0].func == sub_8092644) + { + u8 val; + + if (sprite->data1 != 0) + { + if (sub_8092F8C(sprite->data0)) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + } + else + { + if (sub_8092F44(sprite->data0)) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + } + val = sprite->data2 + sprite->data1 * 128; + sprite->pos2.y = gSineTable[val] / 128; + sprite->data2 += 8; + } + else + { + sprite->invisible = TRUE; + } +} + +static void sub_809308C(u8 taskId) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 4, 0); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].data1 = 0; + gSprites[spriteId].callback = sub_8092FD8; + + spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 108, 0); + gSprites[spriteId].data0 = taskId; + gSprites[spriteId].data1 = 1; + gSprites[spriteId].vFlip = TRUE; + gSprites[spriteId].callback = sub_8092FD8; +} diff --git a/src/pokemon/pokedex_cry_screen.c b/src/pokemon/pokedex_cry_screen.c new file mode 100644 index 000000000..92fd832fc --- /dev/null +++ b/src/pokemon/pokedex_cry_screen.c @@ -0,0 +1,85 @@ +#include "global.h" +#include "pokedex_cry_screen.h" +#include "palette.h" +#include "sprite.h" + +struct Unk201C800 { + u8 unk_0; + u8 unk_1; + u8 unk_2; + u8 filler_3; + u16 unk_4; +}; + +#define EWRAM_1C800 (*(struct Unk201C800 *)(unk_201C000 + 0x800)) + +extern u8 unk_201C000[]; + +extern u8 gUnknown_03005E98; + +// data/pokedex_cry_screen.o +extern const u16 gUnknown_083FAE7C[]; +extern const u16 gUnknown_083FAF1C[]; +extern const u8 gUnknown_083FAF3C[]; +extern struct SpriteTemplate gSpriteTemplate_83FB774; +extern const struct SpriteSheet gCryMeterNeedleSpriteSheets[]; +extern const struct SpritePalette gCryMeterNeedleSpritePalettes[]; + +#if ENGLISH +#define CRY_METER_MAP_WIDTH 10 +#elif GERMAN +#define CRY_METER_MAP_WIDTH 32 +#endif + +u8 ShowPokedexCryScreen(struct CryRelatedStruct *cry, u8 arg1) { + int returnVal = FALSE; + + switch (gUnknown_03005E98) + { + case 0: + LZ77UnCompVram(gUnknown_083FAF3C, (void *) (VRAM + cry->unk0)); + LoadPalette(&gUnknown_083FAF1C, cry->paletteNo * 16, 0x20); + gUnknown_03005E98 += 1; + break; + + case 1: + { + void *vram; + u8 row, col; + u32 r12; + int x, y; + + vram = (void *) BG_SCREEN_ADDR(cry->unk2); + + r12 = (u32) (cry->unk0 << 18) >> 23; + + for (row = 0; row < 8; row++) + { + for (col = 0; col < 10; col++) + { + y = row + cry->yPos; + x = col + cry->xPos; + *(u16 *) (vram + (y * 64 + x * 2)) = (gUnknown_083FAE7C[row * CRY_METER_MAP_WIDTH + col] | (cry->paletteNo << 12)) + r12; + } + } + + gUnknown_03005E98 += 1; + break; + } + + case 2: + { + LoadSpriteSheets(gCryMeterNeedleSpriteSheets); + LoadSpritePalettes(gCryMeterNeedleSpritePalettes); + EWRAM_1C800.unk_4 = CreateSprite(&gSpriteTemplate_83FB774, 40 + cry->xPos * 8, 56 + cry->yPos * 8, 1); + EWRAM_1C800.unk_0 = 0x20; + EWRAM_1C800.unk_1 = 0x20; + EWRAM_1C800.unk_2 = 0; + + returnVal = TRUE; + break; + } + } + + return returnVal; +} diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c new file mode 100644 index 000000000..c65bfa185 --- /dev/null +++ b/src/pokemon/pokemon_1.c @@ -0,0 +1,666 @@ +#include "global.h" +#include "data2.h" +#include "items.h" +#include "main.h" +#include "pokemon.h" +#include "rng.h" +#include "rom4.h" +#include "species.h" +#include "sprite.h" +#include "string_util.h" +#include "text.h" + +//Extracts the upper 16 bits of a 32-bit number +#define HIHALF(n) (((n) & 0xFFFF0000) >> 16) + +//Extracts the lower 16 bits of a 32-bit number +#define LOHALF(n) ((n) & 0xFFFF) + +extern u8 unk_2000000[]; +extern u16 word_2024E82; + +static EWRAM_DATA u8 byte_2024E88 = 0; + +u8 gPlayerPartyCount; +struct Pokemon gPlayerParty[6]; +u8 gEnemyPartyCount; +struct Pokemon gEnemyParty[6]; + +void ZeroBoxMonData(struct BoxPokemon *boxMon) +{ + u8 *raw = (u8 *)boxMon; + u32 i; + for (i = 0; i < sizeof(struct BoxPokemon); i++) + raw[i] = 0; +} + +void ZeroMonData(struct Pokemon *mon) +{ + u32 arg; + ZeroBoxMonData(&mon->box); + arg = 0; + SetMonData(mon, MON_DATA_STATUS, (u8 *)&arg); + SetMonData(mon, MON_DATA_LEVEL, (u8 *)&arg); + SetMonData(mon, MON_DATA_HP, (u8 *)&arg); + SetMonData(mon, MON_DATA_MAX_HP, (u8 *)&arg); + SetMonData(mon, MON_DATA_ATK, (u8 *)&arg); + SetMonData(mon, MON_DATA_DEF, (u8 *)&arg); + SetMonData(mon, MON_DATA_SPD, (u8 *)&arg); + SetMonData(mon, MON_DATA_SPATK, (u8 *)&arg); + SetMonData(mon, MON_DATA_SPDEF, (u8 *)&arg); + arg = 255; + SetMonData(mon, MON_DATA_MAIL, (u8 *)&arg); +} + +void ZeroPlayerPartyMons(void) +{ + s32 i; + for (i = 0; i < 6; i++) + ZeroMonData(&gPlayerParty[i]); +} + +void ZeroEnemyPartyMons(void) +{ + s32 i; + for (i = 0; i < 6; i++) + ZeroMonData(&gEnemyParty[i]); +} + +void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) +{ + u32 arg; + ZeroMonData(mon); + CreateBoxMon(&mon->box, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId); + SetMonData(mon, MON_DATA_LEVEL, &level); + arg = 255; + SetMonData(mon, MON_DATA_MAIL, (u8 *)&arg); + CalculateMonStats(mon); +} + +void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) +{ + u8 speciesName[POKEMON_NAME_LENGTH + 1]; + u32 personality; + u32 value; + u16 checksum; + + ZeroBoxMonData(boxMon); + + if (hasFixedPersonality) + personality = fixedPersonality; + else + personality = Random32(); + + SetBoxMonData(boxMon, MON_DATA_PERSONALITY, (u8 *)&personality); + + //Determine original trainer ID + if (otIdType == 2) //Pokemon cannot be shiny + { + u32 shinyValue; + do + { + value = Random32(); + shinyValue = HIHALF(value) ^ LOHALF(value) ^ HIHALF(personality) ^ LOHALF(personality); + } while (shinyValue < 8); + } + else if (otIdType == 1) //Pokemon has a preset OT ID + { + value = fixedOtId; + } + else //Player is the OT + { + value = gSaveBlock2.playerTrainerId[0] + | (gSaveBlock2.playerTrainerId[1] << 8) + | (gSaveBlock2.playerTrainerId[2] << 16) + | (gSaveBlock2.playerTrainerId[3] << 24); + } + + SetBoxMonData(boxMon, MON_DATA_OT_ID, (u8 *)&value); + + checksum = CalculateBoxMonChecksum(boxMon); + SetBoxMonData(boxMon, MON_DATA_CHECKSUM, (u8 *)&checksum); + EncryptBoxMon(boxMon); + GetSpeciesName(speciesName, species); + SetBoxMonData(boxMon, MON_DATA_NICKNAME, speciesName); + SetBoxMonData(boxMon, MON_DATA_LANGUAGE, &gGameLanguage); + SetBoxMonData(boxMon, MON_DATA_OT_NAME, gSaveBlock2.playerName); + SetBoxMonData(boxMon, MON_DATA_SPECIES, (u8 *)&species); + SetBoxMonData(boxMon, MON_DATA_EXP, (u8 *)&gExperienceTables[gBaseStats[species].growthRate][level]); + SetBoxMonData(boxMon, MON_DATA_FRIENDSHIP, &gBaseStats[species].friendship); + value = sav1_map_get_name(); + SetBoxMonData(boxMon, MON_DATA_MET_LOCATION, (u8 *)&value); + SetBoxMonData(boxMon, MON_DATA_MET_LEVEL, &level); + SetBoxMonData(boxMon, MON_DATA_MET_GAME, &gGameVersion); + value = 4; + SetBoxMonData(boxMon, MON_DATA_POKEBALL, (u8 *)&value); + SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2.playerGender); + + if (fixedIV < 32) + { + SetBoxMonData(boxMon, MON_DATA_HP_IV, &fixedIV); + SetBoxMonData(boxMon, MON_DATA_ATK_IV, &fixedIV); + SetBoxMonData(boxMon, MON_DATA_DEF_IV, &fixedIV); + SetBoxMonData(boxMon, MON_DATA_SPD_IV, &fixedIV); + SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &fixedIV); + SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &fixedIV); + } + else + { + u32 iv; + value = Random(); + + iv = value & 0x1F; + SetBoxMonData(boxMon, MON_DATA_HP_IV, (u8 *)&iv); + iv = (value & 0x3E0) >> 5; + SetBoxMonData(boxMon, MON_DATA_ATK_IV, (u8 *)&iv); + iv = (value & 0x7C00) >> 10; + SetBoxMonData(boxMon, MON_DATA_DEF_IV, (u8 *)&iv); + + value = Random(); + + iv = value & 0x1F; + SetBoxMonData(boxMon, MON_DATA_SPD_IV, (u8 *)&iv); + iv = (value & 0x3E0) >> 5; + SetBoxMonData(boxMon, MON_DATA_SPATK_IV, (u8 *)&iv); + iv = (value & 0x7C00) >> 10; + SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, (u8 *)&iv); + } + + if (gBaseStats[species].ability2) + { + value = personality & 1; + SetBoxMonData(boxMon, MON_DATA_ALT_ABILITY, (u8 *)&value); + } + + GiveBoxMonInitialMoveset(boxMon); +} + +void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature) +{ + u32 personality; + + do + { + personality = Random32(); + } + while (nature != GetNatureFromPersonality(personality)); + + CreateMon(mon, species, level, fixedIV, 1, personality, 0, 0); +} + +void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter) +{ + u32 personality; + + if ((u8)(unownLetter - 1) < 28) + { + u16 actualLetter; + + do + { + personality = Random32(); + actualLetter = ((((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 28); + } + while (nature != GetNatureFromPersonality(personality) + || gender != GetGenderFromSpeciesAndPersonality(species, personality) + || actualLetter != unownLetter - 1); + } + else + { + do + { + personality = Random32(); + } + while (nature != GetNatureFromPersonality(personality) + || gender != GetGenderFromSpeciesAndPersonality(species, personality)); + } + + CreateMon(mon, species, level, fixedIV, 1, personality, 0, 0); +} + +// This is only used to create Wally's Ralts. +void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level) +{ + u32 personality; + u32 otId; + + do + { + otId = Random32(); + personality = Random32(); + } + while (GetGenderFromSpeciesAndPersonality(species, personality) != MON_MALE); + CreateMon(mon, species, level, 32, 1, personality, 1, otId); +} + +void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality) +{ + CreateMon(mon, species, level, 0, 1, personality, 0, 0); + SetMonData(mon, MON_DATA_IVS, (u8 *)&ivs); + CalculateMonStats(mon); +} + +void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId) +{ + CreateMon(mon, species, level, 0, 0, 0, 1, otId); + SetMonData(mon, MON_DATA_HP_IV, &ivs[0]); + SetMonData(mon, MON_DATA_ATK_IV, &ivs[1]); + SetMonData(mon, MON_DATA_DEF_IV, &ivs[2]); + SetMonData(mon, MON_DATA_SPD_IV, &ivs[3]); + SetMonData(mon, MON_DATA_SPATK_IV, &ivs[4]); + SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[5]); + CalculateMonStats(mon); +} + +void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread) +{ + s32 i; + s32 statCount = 0; + u16 evAmount; + u8 temp; + + CreateMon(mon, species, level, fixedIV, 0, 0, 0, 0); + + temp = evSpread; + + for (i = 0; i < 6; i++) + { + if (temp & 1) + statCount++; + temp >>= 1; + } + + evAmount = 510 / statCount; + + temp = 1; + + for (i = 0; i < 6; i++) + { + if (evSpread & temp) + SetMonData(mon, MON_DATA_HP_EV + i, (u8 *)&evAmount); + temp <<= 1; + } + + CalculateMonStats(mon); +} + +void sub_803ADE8(struct Pokemon *mon, struct UnknownPokemonStruct *src) +{ + s32 i; + u8 nickname[POKEMON_NAME_LENGTH + 1]; + u8 language; + u8 value; + + CreateMon(mon, src->species, src->level, 0, 1, src->personality, 1, src->otId); + + for (i = 0; i < 4; i++) + SetMonMoveSlot(mon, src->moves[i], i); + + SetMonData(mon, MON_DATA_PP_BONUSES, (u8 *)&src->ppBonuses); + SetMonData(mon, MON_DATA_HELD_ITEM, (u8 *)&src->heldItem); + + StringCopy(nickname, src->nickname); + + if (nickname[0] == 0xFC && nickname[1] == 0x15) + language = LANGUAGE_JAPANESE; + else + language = GAME_LANGUAGE; + + SetMonData(mon, MON_DATA_LANGUAGE, &language); + StripExtCtrlCodes(nickname); + SetMonData(mon, MON_DATA_NICKNAME, nickname); + SetMonData(mon, MON_DATA_FRIENDSHIP, (u8 *)&src->friendship); + SetMonData(mon, MON_DATA_HP_EV, (u8 *)&src->hpEV); + SetMonData(mon, MON_DATA_ATK_EV, (u8 *)&src->attackEV); + SetMonData(mon, MON_DATA_DEF_EV, (u8 *)&src->defenseEV); + SetMonData(mon, MON_DATA_SPD_EV, (u8 *)&src->speedEV); + SetMonData(mon, MON_DATA_SPATK_EV, (u8 *)&src->spAttackEV); + SetMonData(mon, MON_DATA_SPDEF_EV, (u8 *)&src->spDefenseEV); + value = src->altAbility; + SetMonData(mon, MON_DATA_ALT_ABILITY, &value); + value = src->hpIV; + SetMonData(mon, MON_DATA_HP_IV, &value); + value = src->attackIV; + SetMonData(mon, MON_DATA_ATK_IV, &value); + value = src->defenseIV; + SetMonData(mon, MON_DATA_DEF_IV, &value); + value = src->speedIV; + SetMonData(mon, MON_DATA_SPD_IV, &value); + value = src->spAttackIV; + SetMonData(mon, MON_DATA_SPATK_IV, &value); + value = src->spDefenseIV; + SetMonData(mon, MON_DATA_SPDEF_IV, &value); + CalculateMonStats(mon); +} + +void sub_803AF78(struct Pokemon *mon, struct UnknownPokemonStruct *dest) +{ + s32 i; + u16 heldItem; + + dest->species = GetMonData(mon, MON_DATA_SPECIES, NULL); + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); + + if (heldItem == ITEM_ENIGMA_BERRY) + heldItem = 0; + + dest->heldItem = heldItem; + + for (i = 0; i < 4; i++) + dest->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); + + dest->level = GetMonData(mon, MON_DATA_LEVEL, NULL); + dest->ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + dest->otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + dest->hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); + dest->attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); + dest->defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); + dest->speedEV = GetMonData(mon, MON_DATA_SPD_EV, NULL); + dest->spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); + dest->spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); + dest->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); + dest->hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); + dest->attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); + dest->defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); + dest->speedIV = GetMonData(mon, MON_DATA_SPD_IV, NULL); + dest->spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); + dest->spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); + dest->altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL); + dest->personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + GetMonData(mon, MON_DATA_NICKNAME, dest->nickname); +} + +u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon) +{ + u16 checksum = 0; + union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0); + union PokemonSubstruct *substruct1 = GetSubstruct(boxMon, boxMon->personality, 1); + union PokemonSubstruct *substruct2 = GetSubstruct(boxMon, boxMon->personality, 2); + union PokemonSubstruct *substruct3 = GetSubstruct(boxMon, boxMon->personality, 3); + s32 i; + + for (i = 0; i < 6; i++) + checksum += substruct0->raw[i]; + + for (i = 0; i < 6; i++) + checksum += substruct1->raw[i]; + + for (i = 0; i < 6; i++) + checksum += substruct2->raw[i]; + + for (i = 0; i < 6; i++) + checksum += substruct3->raw[i]; + + return checksum; +} + +#define CALC_STAT(base, iv, ev, statIndex, field) \ +{ \ + u8 baseStat = gBaseStats[species].base; \ + s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \ + u8 nature = GetNature(mon); \ + n = nature_stat_mod(nature, n, statIndex); \ + SetMonData(mon, field, (u8 *)&n); \ +} + +void CalculateMonStats(struct Pokemon *mon) +{ + s32 oldMaxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL); + s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); + s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); + s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); + s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); + s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); + s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); + s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); + s32 speedIV = GetMonData(mon, MON_DATA_SPD_IV, NULL); + s32 speedEV = GetMonData(mon, MON_DATA_SPD_EV, NULL); + s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); + s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); + s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); + s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + s32 level = GetLevelFromMonExp(mon); + s32 newMaxHP; + + SetMonData(mon, MON_DATA_LEVEL, (u8 *)&level); + + if (species == SPECIES_SHEDINJA) + { + newMaxHP = 1; + } + else + { + s32 n = 2 * gBaseStats[species].baseHP + hpIV; + newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10; + } + + unk_2000000[0x160FA] = newMaxHP - oldMaxHP; + if (unk_2000000[0x160FA] == 0) + unk_2000000[0x160FA] = 1; + + SetMonData(mon, MON_DATA_MAX_HP, (u8 *)&newMaxHP); + + CALC_STAT(baseAttack, attackIV, attackEV, 1, MON_DATA_ATK) + CALC_STAT(baseDefense, defenseIV, defenseEV, 2, MON_DATA_DEF) + CALC_STAT(baseSpeed, speedIV, speedEV, 3, MON_DATA_SPD) + CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK) + CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF) + + if (species == SPECIES_SHEDINJA) + { + if (currentHP != 0 || oldMaxHP == 0) + currentHP = 1; + else + return; + } + else + { + if (currentHP == 0 && oldMaxHP == 0) + currentHP = newMaxHP; + else if (currentHP != 0) + currentHP += newMaxHP - oldMaxHP; + else + return; + } + + SetMonData(mon, MON_DATA_HP, (u8 *)¤tHP); +} + +void sub_803B4B4(struct Pokemon *src, struct Pokemon *dest) +{ + u32 value = 0; + memcpy(&dest->box, &src->box, sizeof(struct BoxPokemon)); + SetMonData(dest, MON_DATA_STATUS, (u8 *)&value); + SetMonData(dest, MON_DATA_HP, (u8 *)&value); + SetMonData(dest, MON_DATA_MAX_HP, (u8 *)&value); + value = 255; + SetMonData(dest, MON_DATA_MAIL, (u8 *)&value); + CalculateMonStats(dest); +} + +u8 GetLevelFromMonExp(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u32 exp = GetMonData(mon, MON_DATA_EXP, NULL); + s32 level = 1; + + while (level <= 100 && gExperienceTables[gBaseStats[species].growthRate][level] <= exp) + level++; + + return level - 1; +} + +u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon) +{ + u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); + u32 exp = GetBoxMonData(boxMon, MON_DATA_EXP, NULL); + s32 level = 1; + + while (level <= 100 && gExperienceTables[gBaseStats[species].growthRate][level] <= exp) + level++; + + return level - 1; +} + +u16 GiveMoveToMon(struct Pokemon *mon, u16 move) +{ + return GiveMoveToBoxMon(&mon->box, move); +} + +u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) +{ + s32 i; + for (i = 0; i < 4; i++) + { + u16 existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, NULL); + if (!existingMove) + { + SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, (u8 *)&move); + SetBoxMonData(boxMon, MON_DATA_PP1 + i, &gBattleMoves[move].pp); + return move; + } + if (existingMove == move) + return -2; + } + return -1; +} + +u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + if (!mon->moves[i]) + { + mon->moves[i] = move; + mon->pp[i] = gBattleMoves[move].pp; + return move; + } + } + + return -1; +} + +void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot) +{ + SetMonData(mon, MON_DATA_MOVE1 + slot, (u8 *)&move); + SetMonData(mon, MON_DATA_PP1 + slot, &gBattleMoves[move].pp); +} + +void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot) +{ + mon->moves[slot] = move; + mon->pp[slot] = gBattleMoves[move].pp; +} + +void GiveMonInitialMoveset(struct Pokemon *mon) +{ + GiveBoxMonInitialMoveset(&mon->box); +} + +void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) +{ + u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); + s32 level = GetLevelFromBoxMonExp(boxMon); + s32 i; + + for (i = 0; gLevelUpLearnsets[species][i] != (u16)-1; i++) + { + u16 moveLevel; + u16 move; + + moveLevel = (gLevelUpLearnsets[species][i] & 0xFE00); + + if (moveLevel > (level << 9)) + break; + + move = (gLevelUpLearnsets[species][i] & 0x1FF); + + if (GiveMoveToBoxMon(boxMon, move) == (u16)-1) + DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, move); + } +} + +u16 sub_803B7C8(struct Pokemon *mon, u8 a2) +{ + u32 retVal = 0; + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); + + if (a2) + { + byte_2024E88 = retVal; + + while ((gLevelUpLearnsets[species][byte_2024E88] & 0xFE00) != (level << 9)) + { + byte_2024E88++; + if (gLevelUpLearnsets[species][byte_2024E88] == (u16)-1) + return 0; + } + } + + if ((gLevelUpLearnsets[species][byte_2024E88] & 0xFE00) == (level << 9)) + { + word_2024E82 = (gLevelUpLearnsets[species][byte_2024E88] & 0x1FF); + byte_2024E88++; + retVal = GiveMoveToMon(mon, word_2024E82); + } + + return retVal; +} + +void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move) +{ + s32 i; + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; + + for (i = 0; i < 3; i++) + { + moves[i] = GetMonData(mon, MON_DATA_MOVE2 + i, NULL); + pp[i] = GetMonData(mon, MON_DATA_PP2 + i, NULL); + } + + ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + ppBonuses >>= 2; + moves[3] = move; + pp[3] = gBattleMoves[move].pp; + + for (i = 0; i < 4; i++) + { + SetMonData(mon, MON_DATA_MOVE1 + i, (u8 *)&moves[i]); + SetMonData(mon, MON_DATA_PP1 + i, &pp[i]); + } + + SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); +} + +void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) +{ + s32 i; + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; + + for (i = 0; i < 3; i++) + { + moves[i] = GetBoxMonData(boxMon, MON_DATA_MOVE2 + i, NULL); + pp[i] = GetBoxMonData(boxMon, MON_DATA_PP2 + i, NULL); + } + + ppBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, NULL); + ppBonuses >>= 2; + moves[3] = move; + pp[3] = gBattleMoves[move].pp; + + for (i = 0; i < 4; i++) + { + SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, (u8 *)&moves[i]); + SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp[i]); + } + + SetBoxMonData(boxMon, MON_DATA_PP_BONUSES, &ppBonuses); +} diff --git a/src/pokemon/pokemon_2.c b/src/pokemon/pokemon_2.c new file mode 100644 index 000000000..a77edbdb2 --- /dev/null +++ b/src/pokemon/pokemon_2.c @@ -0,0 +1,1312 @@ +#include "global.h" +#include "battle.h" +#include "data2.h" +#include "event_data.h" +#include "main.h" +#include "pokemon.h" +#include "rng.h" +#include "rom_8077ABC.h" +#include "species.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "text.h" +#include "util.h" + +extern u8 gPlayerPartyCount; +extern u8 gEnemyPartyCount; + +extern u16 unk_20160BC[]; +extern struct SecretBaseRecord gSecretBaseRecord; +extern u32 dword_2017100[]; +extern u16 gBattleTypeFlags; +extern u8 gActiveBank; +extern struct BattlePokemon gBattleMons[4]; +extern u16 gCurrentMove; +extern u8 gLastUsedAbility; +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u8 gAbsentBankFlags; +extern u8 gXXX_CritRelated; +extern u16 gBattleWeather; +extern struct BattleEnigmaBerry gEnigmaBerries[]; +extern u16 gBattleMovePower; +extern u16 gTrainerBattleOpponent; +extern struct PokemonStorage gPokemonStorage; + +EWRAM_DATA struct SpriteTemplate gUnknown_02024E8C = {0}; + +extern u8 gBadEggNickname[]; +extern const struct SpriteTemplate gSpriteTemplate_8208288[]; +//array of pointers to arrays of pointers to union AnimCmd (We probably need to typedef this.) +extern u8 gTrainerClassToPicIndex[]; +extern u8 gTrainerClassToNameIndex[]; +extern u8 gSecretBaseTrainerClasses[][5]; +extern u8 gUnknown_08208238[]; +extern u8 gUnknown_0820823C[]; +extern u8 gStatStageRatios[][2]; +extern u8 gHoldEffectToType[][2]; + +u8 CountAliveMons(u8 a1) +{ + s32 i; + u8 retVal = 0; + + switch (a1) + { + case 0: + for (i = 0; i < 4; i++) + { + if (i != gActiveBank && !(gAbsentBankFlags & gBitTable[i])) + retVal++; + } + break; + case 1: + for (i = 0; i < 4; i++) + { + if (GetBankSide(i) == GetBankSide(gBankAttacker) && !(gAbsentBankFlags & gBitTable[i])) + retVal++; + } + break; + case 2: + for (i = 0; i < 4; i++) + { + if (GetBankSide(i) == GetBankSide(gBankTarget) && !(gAbsentBankFlags & gBitTable[i])) + retVal++; + } + break; + } + + return retVal; +} + +#ifdef NONMATCHING +u8 sub_803C434(u8 a1) +{ + u32 status0 = GetBankIdentity(a1); + register u8 status_ asm("r4"); + u8 status; + register u32 mask1 asm("r1") = 1; + register u32 mask2 asm("r6") = 1; + + status_ = mask2; + status_ &= status0; + status = status_ ^ mask1; + + { + register u16 val_ asm("r1") = gBattleTypeFlags; + u32 val = mask2; + val &= val_; + if (!val) + { + return GetBankByPlayerAI(status); + } + } + + if (CountAliveMons(0) > 1) + { + u16 r = Random(); + register u32 val asm("r1") = mask2; + val &= r; + if (!val) + { + u32 status2 = 2; + status2 ^= status; + return GetBankByPlayerAI(status2); + } + else + { + return GetBankByPlayerAI(status); + } + } + else + { + if (gAbsentBankFlags & gBitTable[status]) + return GetBankByPlayerAI(status ^ 2); + else + return GetBankByPlayerAI(status); + } +} +#else +__attribute__((naked)) +u8 sub_803C434(u8 a1) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetBankIdentity\n\ + movs r1, 0x1\n\ + movs r6, 0x1\n\ + adds r4, r6, 0\n\ + ands r4, r0\n\ + eors r4, r1\n\ + adds r5, r4, 0\n\ + ldr r0, _0803C45C\n\ + ldrh r1, [r0]\n\ + adds r0, r6, 0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0803C460\n\ + adds r0, r4, 0\n\ + b _0803C4AA\n\ + .align 2, 0\n\ +_0803C45C: .4byte gBattleTypeFlags\n\ +_0803C460:\n\ + movs r0, 0\n\ + bl CountAliveMons\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bls _0803C484\n\ + bl Random\n\ + adds r1, r6, 0\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + bne _0803C480\n\ + movs r0, 0x2\n\ + eors r0, r4\n\ + b _0803C4AA\n\ +_0803C480:\n\ + adds r0, r4, 0\n\ + b _0803C4AA\n\ +_0803C484:\n\ + ldr r0, _0803C49C\n\ + ldrb r1, [r0]\n\ + ldr r2, _0803C4A0\n\ + lsls r0, r4, 2\n\ + adds r0, r2\n\ + ldr r0, [r0]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + bne _0803C4A4\n\ + adds r0, r4, 0\n\ + b _0803C4AA\n\ + .align 2, 0\n\ +_0803C49C: .4byte gAbsentBankFlags\n\ +_0803C4A0: .4byte gBitTable\n\ +_0803C4A4:\n\ + movs r0, 0x2\n\ + eors r5, r0\n\ + adds r0, r5, 0\n\ +_0803C4AA:\n\ + bl GetBankByPlayerAI\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif + +u8 GetMonGender(struct Pokemon *mon) +{ + return GetBoxMonGender(&mon->box); +} + +u8 GetBoxMonGender(struct BoxPokemon *boxMon) +{ + u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); + u32 personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY, NULL); + + switch (gBaseStats[species].genderRatio) + { + case MON_MALE: + case MON_FEMALE: + case MON_GENDERLESS: + return gBaseStats[species].genderRatio; + } + + if (gBaseStats[species].genderRatio > (personality & 0xFF)) + return MON_FEMALE; + else + return MON_MALE; +} + +u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality) +{ + switch (gBaseStats[species].genderRatio) + { + case MON_MALE: + case MON_FEMALE: + case MON_GENDERLESS: + return gBaseStats[species].genderRatio; + } + + if (gBaseStats[species].genderRatio > (personality & 0xFF)) + return MON_FEMALE; + else + return MON_MALE; +} + +void GetMonSpriteTemplate_803C56C(u16 species, u8 a2) +{ + gUnknown_02024E8C = gSpriteTemplate_8208288[a2]; + gUnknown_02024E8C.paletteTag = species; + gUnknown_02024E8C.anims = (const union AnimCmd *const *)gSpriteAnimTable_81E7C64; //Why do I have to cast this? +} + +void GetMonSpriteTemplate_803C5A0(u16 species, u8 a2) +{ + gUnknown_02024E8C = gSpriteTemplate_8208288[a2]; + gUnknown_02024E8C.paletteTag = species; + if (a2 == 0 || a2 == 2) + gUnknown_02024E8C.anims = gUnknown_081ECACC[species]; + else + gUnknown_02024E8C.anims = gUnknown_081EC2A4[species]; +} + +void EncryptBoxMon(struct BoxPokemon *boxMon) +{ + u32 i; + for (i = 0; i < 12; i++) + { + boxMon->secure.raw[i] ^= boxMon->personality; + boxMon->secure.raw[i] ^= boxMon->otId; + } +} + +void DecryptBoxMon(struct BoxPokemon *boxMon) +{ + u32 i; + for (i = 0; i < 12; i++) + { + boxMon->secure.raw[i] ^= boxMon->otId; + boxMon->secure.raw[i] ^= boxMon->personality; + } +} + +#define SUBSTRUCT_CASE(n, v1, v2, v3, v4) \ +case n: \ + switch (substructType) \ + { \ + case 0: \ + substruct = &substructs ## n [v1]; \ + break; \ + case 1: \ + substruct = &substructs ## n [v2]; \ + break; \ + case 2: \ + substruct = &substructs ## n [v3]; \ + break; \ + case 3: \ + substruct = &substructs ## n [v4]; \ + break; \ + } \ + break; + +union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType) +{ + union PokemonSubstruct *substruct = NULL; + + union PokemonSubstruct *substructs0 = boxMon->secure.substructs; + union PokemonSubstruct *substructs1 = boxMon->secure.substructs; + union PokemonSubstruct *substructs2 = boxMon->secure.substructs; + union PokemonSubstruct *substructs3 = boxMon->secure.substructs; + union PokemonSubstruct *substructs4 = boxMon->secure.substructs; + union PokemonSubstruct *substructs5 = boxMon->secure.substructs; + union PokemonSubstruct *substructs6 = boxMon->secure.substructs; + union PokemonSubstruct *substructs7 = boxMon->secure.substructs; + union PokemonSubstruct *substructs8 = boxMon->secure.substructs; + union PokemonSubstruct *substructs9 = boxMon->secure.substructs; + union PokemonSubstruct *substructs10 = boxMon->secure.substructs; + union PokemonSubstruct *substructs11 = boxMon->secure.substructs; + union PokemonSubstruct *substructs12 = boxMon->secure.substructs; + union PokemonSubstruct *substructs13 = boxMon->secure.substructs; + union PokemonSubstruct *substructs14 = boxMon->secure.substructs; + union PokemonSubstruct *substructs15 = boxMon->secure.substructs; + union PokemonSubstruct *substructs16 = boxMon->secure.substructs; + union PokemonSubstruct *substructs17 = boxMon->secure.substructs; + union PokemonSubstruct *substructs18 = boxMon->secure.substructs; + union PokemonSubstruct *substructs19 = boxMon->secure.substructs; + union PokemonSubstruct *substructs20 = boxMon->secure.substructs; + union PokemonSubstruct *substructs21 = boxMon->secure.substructs; + union PokemonSubstruct *substructs22 = boxMon->secure.substructs; + union PokemonSubstruct *substructs23 = boxMon->secure.substructs; + + switch (personality % 24) + { + SUBSTRUCT_CASE( 0,0,1,2,3) + SUBSTRUCT_CASE( 1,0,1,3,2) + SUBSTRUCT_CASE( 2,0,2,1,3) + SUBSTRUCT_CASE( 3,0,3,1,2) + SUBSTRUCT_CASE( 4,0,2,3,1) + SUBSTRUCT_CASE( 5,0,3,2,1) + SUBSTRUCT_CASE( 6,1,0,2,3) + SUBSTRUCT_CASE( 7,1,0,3,2) + SUBSTRUCT_CASE( 8,2,0,1,3) + SUBSTRUCT_CASE( 9,3,0,1,2) + SUBSTRUCT_CASE(10,2,0,3,1) + SUBSTRUCT_CASE(11,3,0,2,1) + SUBSTRUCT_CASE(12,1,2,0,3) + SUBSTRUCT_CASE(13,1,3,0,2) + SUBSTRUCT_CASE(14,2,1,0,3) + SUBSTRUCT_CASE(15,3,1,0,2) + SUBSTRUCT_CASE(16,2,3,0,1) + SUBSTRUCT_CASE(17,3,2,0,1) + SUBSTRUCT_CASE(18,1,2,3,0) + SUBSTRUCT_CASE(19,1,3,2,0) + SUBSTRUCT_CASE(20,2,1,3,0) + SUBSTRUCT_CASE(21,3,1,2,0) + SUBSTRUCT_CASE(22,2,3,1,0) + SUBSTRUCT_CASE(23,3,2,1,0) + } + + return substruct; +} + +u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data) +{ + switch (field) + { + case MON_DATA_STATUS: + return mon->status; + case MON_DATA_LEVEL: + return mon->level; + case MON_DATA_HP: + return mon->hp; + case MON_DATA_MAX_HP: + return mon->maxHP; + case MON_DATA_ATK: + return mon->attack; + case MON_DATA_DEF: + return mon->defense; + case MON_DATA_SPD: + return mon->speed; + case MON_DATA_SPATK: + return mon->spAttack; + case MON_DATA_SPDEF: + return mon->spDefense; + case MON_DATA_MAIL: + return mon->mail; + default: + return GetBoxMonData(&mon->box, field, data); + } +} + +u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) +{ + u32 retVal = 0; + struct PokemonSubstruct0 *substruct0 = NULL; + struct PokemonSubstruct1 *substruct1 = NULL; + struct PokemonSubstruct2 *substruct2 = NULL; + struct PokemonSubstruct3 *substruct3 = NULL; + + if (field > MON_DATA_10) + { + substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); + substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); + substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); + substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); + + DecryptBoxMon(boxMon); + + if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) + { + boxMon->isBadEgg = 1; + boxMon->isEgg = 1; + substruct3->isEgg = 1; + } + } + + switch (field) + { + case MON_DATA_PERSONALITY: + retVal = boxMon->personality; + break; + case MON_DATA_OT_ID: + retVal = boxMon->otId; + break; + case MON_DATA_NICKNAME: + { + if (boxMon->isBadEgg) + { + StringCopy(data, gBadEggNickname); + retVal = StringLength(data); + } + else if (boxMon->isEgg) + { + StringCopy(data, gEggNickname); + retVal = StringLength(data); + } + else + { + retVal = 0; + + while (retVal < POKEMON_NAME_LENGTH && boxMon->nickname[retVal] != EOS) + { + data[retVal] = boxMon->nickname[retVal]; + retVal++; + } + + data[retVal] = EOS; + ConvertInternationalString(data, boxMon->language); + retVal = StringLength(data); + } + break; + } + case MON_DATA_LANGUAGE: + retVal = boxMon->language; + break; + case MON_DATA_SANITY_BIT1: + retVal = boxMon->isBadEgg; + break; + case MON_DATA_SANITY_BIT2: + retVal = boxMon->hasSpecies; + break; + case MON_DATA_SANITY_BIT3: + retVal = boxMon->isEgg; + break; + case MON_DATA_OT_NAME: + { + retVal = 0; + + while (retVal < OT_NAME_LENGTH && boxMon->otName[retVal] != EOS) + { + data[retVal] = boxMon->otName[retVal]; + retVal++; + } + + data[retVal] = EOS; + break; + } + case MON_DATA_MARKINGS: + retVal = boxMon->markings; + break; + case MON_DATA_CHECKSUM: + retVal = boxMon->checksum; + break; + case MON_DATA_10: + retVal = boxMon->unknown; + break; + case MON_DATA_SPECIES: + retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species; + break; + case MON_DATA_HELD_ITEM: + retVal = substruct0->heldItem; + break; + case MON_DATA_EXP: + retVal = substruct0->experience; + break; + case MON_DATA_PP_BONUSES: + retVal = substruct0->ppBonuses; + break; + case MON_DATA_FRIENDSHIP: + retVal = substruct0->friendship; + break; + case MON_DATA_MOVE1: + case MON_DATA_MOVE2: + case MON_DATA_MOVE3: + case MON_DATA_MOVE4: + retVal = substruct1->moves[field - MON_DATA_MOVE1]; + break; + case MON_DATA_PP1: + case MON_DATA_PP2: + case MON_DATA_PP3: + case MON_DATA_PP4: + retVal = substruct1->pp[field - MON_DATA_PP1]; + break; + case MON_DATA_HP_EV: + retVal = substruct2->hpEV; + break; + case MON_DATA_ATK_EV: + retVal = substruct2->attackEV; + break; + case MON_DATA_DEF_EV: + retVal = substruct2->defenseEV; + break; + case MON_DATA_SPD_EV: + retVal = substruct2->speedEV; + break; + case MON_DATA_SPATK_EV: + retVal = substruct2->spAttackEV; + break; + case MON_DATA_SPDEF_EV: + retVal = substruct2->spDefenseEV; + break; + case MON_DATA_COOL: + retVal = substruct2->cool; + break; + case MON_DATA_BEAUTY: + retVal = substruct2->beauty; + break; + case MON_DATA_CUTE: + retVal = substruct2->cute; + break; + case MON_DATA_SMART: + retVal = substruct2->smart; + break; + case MON_DATA_TOUGH: + retVal = substruct2->tough; + break; + case MON_DATA_SHEEN: + retVal = substruct2->sheen; + break; + case MON_DATA_POKERUS: + retVal = substruct3->pokerus; + break; + case MON_DATA_MET_LOCATION: + retVal = substruct3->metLocation; + break; + case MON_DATA_MET_LEVEL: + retVal = substruct3->metLevel; + break; + case MON_DATA_MET_GAME: + retVal = substruct3->metGame; + break; + case MON_DATA_POKEBALL: + retVal = substruct3->pokeball; + break; + case MON_DATA_OT_GENDER: + retVal = substruct3->otGender; + break; + case MON_DATA_HP_IV: + retVal = substruct3->hpIV; + break; + case MON_DATA_ATK_IV: + retVal = substruct3->attackIV; + break; + case MON_DATA_DEF_IV: + retVal = substruct3->defenseIV; + break; + case MON_DATA_SPD_IV: + retVal = substruct3->speedIV; + break; + case MON_DATA_SPATK_IV: + retVal = substruct3->spAttackIV; + break; + case MON_DATA_SPDEF_IV: + retVal = substruct3->spDefenseIV; + break; + case MON_DATA_IS_EGG: + retVal = substruct3->isEgg; + break; + case MON_DATA_ALT_ABILITY: + retVal = substruct3->altAbility; + break; + case MON_DATA_COOL_RIBBON: + retVal = substruct3->coolRibbon; + break; + case MON_DATA_BEAUTY_RIBBON: + retVal = substruct3->beautyRibbon; + break; + case MON_DATA_CUTE_RIBBON: + retVal = substruct3->cuteRibbon; + break; + case MON_DATA_SMART_RIBBON: + retVal = substruct3->smartRibbon; + break; + case MON_DATA_TOUGH_RIBBON: + retVal = substruct3->toughRibbon; + break; + case MON_DATA_CHAMPION_RIBBON: + retVal = substruct3->championRibbon; + break; + case MON_DATA_WINNING_RIBBON: + retVal = substruct3->winningRibbon; + break; + case MON_DATA_VICTORY_RIBBON: + retVal = substruct3->victoryRibbon; + break; + case MON_DATA_ARTIST_RIBBON: + retVal = substruct3->artistRibbon; + break; + case MON_DATA_EFFORT_RIBBON: + retVal = substruct3->effortRibbon; + break; + case MON_DATA_GIFT_RIBBON_1: + retVal = substruct3->giftRibbon1; + break; + case MON_DATA_GIFT_RIBBON_2: + retVal = substruct3->giftRibbon2; + break; + case MON_DATA_GIFT_RIBBON_3: + retVal = substruct3->giftRibbon3; + break; + case MON_DATA_GIFT_RIBBON_4: + retVal = substruct3->giftRibbon4; + break; + case MON_DATA_GIFT_RIBBON_5: + retVal = substruct3->giftRibbon5; + break; + case MON_DATA_GIFT_RIBBON_6: + retVal = substruct3->giftRibbon6; + break; + case MON_DATA_GIFT_RIBBON_7: + retVal = substruct3->giftRibbon7; + break; + case MON_DATA_FATEFUL_ENCOUNTER: + retVal = substruct3->fatefulEncounter; + break; + case MON_DATA_SPECIES2: + retVal = substruct0->species; + if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg)) + retVal = SPECIES_EGG; + break; + case MON_DATA_IVS: + retVal = substruct3->hpIV | (substruct3->attackIV << 5) | (substruct3->defenseIV << 10) | (substruct3->speedIV << 15) | (substruct3->spAttackIV << 20) | (substruct3->spDefenseIV << 25); + break; + case MON_DATA_KNOWN_MOVES: + if (substruct0->species && !substruct3->isEgg) + { + u16 *moves = (u16 *)data; + s32 i = 0; + + while (moves[i] != 355) + { + u16 move = moves[i]; + if (substruct1->moves[0] == move + || substruct1->moves[1] == move + || substruct1->moves[2] == move + || substruct1->moves[3] == move) + retVal |= gBitTable[i]; + i++; + } + } + break; + case MON_DATA_RIBBON_COUNT: + retVal = 0; + if (substruct0->species && !substruct3->isEgg) + { + retVal += substruct3->coolRibbon; + retVal += substruct3->beautyRibbon; + retVal += substruct3->cuteRibbon; + retVal += substruct3->smartRibbon; + retVal += substruct3->toughRibbon; + retVal += substruct3->championRibbon; + retVal += substruct3->winningRibbon; + retVal += substruct3->victoryRibbon; + retVal += substruct3->artistRibbon; + retVal += substruct3->effortRibbon; + retVal += substruct3->giftRibbon1; + retVal += substruct3->giftRibbon2; + retVal += substruct3->giftRibbon3; + retVal += substruct3->giftRibbon4; + retVal += substruct3->giftRibbon5; + retVal += substruct3->giftRibbon6; + retVal += substruct3->giftRibbon7; + } + break; + case MON_DATA_RIBBONS: + retVal = 0; + if (substruct0->species && !substruct3->isEgg) + { + retVal = substruct3->championRibbon + | (substruct3->coolRibbon << 1) + | (substruct3->beautyRibbon << 4) + | (substruct3->cuteRibbon << 7) + | (substruct3->smartRibbon << 10) + | (substruct3->toughRibbon << 13) + | (substruct3->winningRibbon << 16) + | (substruct3->victoryRibbon << 17) + | (substruct3->artistRibbon << 18) + | (substruct3->effortRibbon << 19) + | (substruct3->giftRibbon1 << 20) + | (substruct3->giftRibbon2 << 21) + | (substruct3->giftRibbon3 << 22) + | (substruct3->giftRibbon4 << 23) + | (substruct3->giftRibbon5 << 24) + | (substruct3->giftRibbon6 << 25) + | (substruct3->giftRibbon7 << 26); + } + break; + default: + break; + } + + if (field > MON_DATA_10) + EncryptBoxMon(boxMon); + + return retVal; +} + +#define SET8(lhs) (lhs) = *data +#define SET16(lhs) (lhs) = data[0] + (data[1] << 8) +#define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24) + +void SetMonData(struct Pokemon *mon, s32 field, const u8 *data) +{ + switch (field) + { + case MON_DATA_STATUS: + SET32(mon->status); + break; + case MON_DATA_LEVEL: + SET8(mon->level); + break; + case MON_DATA_HP: + SET16(mon->hp); + break; + case MON_DATA_MAX_HP: + SET16(mon->maxHP); + break; + case MON_DATA_ATK: + SET16(mon->attack); + break; + case MON_DATA_DEF: + SET16(mon->defense); + break; + case MON_DATA_SPD: + SET16(mon->speed); + break; + case MON_DATA_SPATK: + SET16(mon->spAttack); + break; + case MON_DATA_SPDEF: + SET16(mon->spDefense); + break; + case MON_DATA_MAIL: + SET8(mon->mail); + break; + case MON_DATA_SPECIES2: + break; + default: + SetBoxMonData(&mon->box, field, data); + break; + } +} + +void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const u8 *data) +{ + struct PokemonSubstruct0 *substruct0 = NULL; + struct PokemonSubstruct1 *substruct1 = NULL; + struct PokemonSubstruct2 *substruct2 = NULL; + struct PokemonSubstruct3 *substruct3 = NULL; + + if (field > MON_DATA_10) + { + substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); + substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); + substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); + substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); + + DecryptBoxMon(boxMon); + + if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) + { + boxMon->isBadEgg = 1; + boxMon->isEgg = 1; + substruct3->isEgg = 1; + EncryptBoxMon(boxMon); + return; + } + } + + switch (field) + { + case MON_DATA_PERSONALITY: + SET32(boxMon->personality); + break; + case MON_DATA_OT_ID: + SET32(boxMon->otId); + break; + case MON_DATA_NICKNAME: + { + s32 i; + for (i = 0; i < POKEMON_NAME_LENGTH; i++) + boxMon->nickname[i] = data[i]; + break; + } + case MON_DATA_LANGUAGE: + SET8(boxMon->language); + break; + case MON_DATA_SANITY_BIT1: + SET8(boxMon->isBadEgg); + break; + case MON_DATA_SANITY_BIT2: + SET8(boxMon->hasSpecies); + break; + case MON_DATA_SANITY_BIT3: + SET8(boxMon->isEgg); + break; + case MON_DATA_OT_NAME: + { + s32 i; + for (i = 0; i < OT_NAME_LENGTH; i++) + boxMon->otName[i] = data[i]; + break; + } + case MON_DATA_MARKINGS: + SET8(boxMon->markings); + break; + case MON_DATA_CHECKSUM: + SET16(boxMon->checksum); + break; + case MON_DATA_10: + SET16(boxMon->unknown); + break; + case MON_DATA_SPECIES: + { + SET16(substruct0->species); + if (substruct0->species) + boxMon->hasSpecies = 1; + else + boxMon->hasSpecies = 0; + break; + } + case MON_DATA_HELD_ITEM: + SET16(substruct0->heldItem); + break; + case MON_DATA_EXP: + SET32(substruct0->experience); + break; + case MON_DATA_PP_BONUSES: + SET8(substruct0->ppBonuses); + break; + case MON_DATA_FRIENDSHIP: + SET8(substruct0->friendship); + break; + case MON_DATA_MOVE1: + case MON_DATA_MOVE2: + case MON_DATA_MOVE3: + case MON_DATA_MOVE4: + SET16(substruct1->moves[field - MON_DATA_MOVE1]); + break; + case MON_DATA_PP1: + case MON_DATA_PP2: + case MON_DATA_PP3: + case MON_DATA_PP4: + SET8(substruct1->pp[field - MON_DATA_PP1]); + break; + case MON_DATA_HP_EV: + SET8(substruct2->hpEV); + break; + case MON_DATA_ATK_EV: + SET8(substruct2->attackEV); + break; + case MON_DATA_DEF_EV: + SET8(substruct2->defenseEV); + break; + case MON_DATA_SPD_EV: + SET8(substruct2->speedEV); + break; + case MON_DATA_SPATK_EV: + SET8(substruct2->spAttackEV); + break; + case MON_DATA_SPDEF_EV: + SET8(substruct2->spDefenseEV); + break; + case MON_DATA_COOL: + SET8(substruct2->cool); + break; + case MON_DATA_BEAUTY: + SET8(substruct2->beauty); + break; + case MON_DATA_CUTE: + SET8(substruct2->cute); + break; + case MON_DATA_SMART: + SET8(substruct2->smart); + break; + case MON_DATA_TOUGH: + SET8(substruct2->tough); + break; + case MON_DATA_SHEEN: + SET8(substruct2->sheen); + break; + case MON_DATA_POKERUS: + SET8(substruct3->pokerus); + break; + case MON_DATA_MET_LOCATION: + SET8(substruct3->metLocation); + break; + case MON_DATA_MET_LEVEL: + { + u8 metLevel = *data; + substruct3->metLevel = metLevel; + break; + } + case MON_DATA_MET_GAME: + SET8(substruct3->metGame); + break; + case MON_DATA_POKEBALL: + { + u8 pokeball = *data; + substruct3->pokeball = pokeball; + break; + } + case MON_DATA_OT_GENDER: + SET8(substruct3->otGender); + break; + case MON_DATA_HP_IV: + SET8(substruct3->hpIV); + break; + case MON_DATA_ATK_IV: + SET8(substruct3->attackIV); + break; + case MON_DATA_DEF_IV: + SET8(substruct3->defenseIV); + break; + case MON_DATA_SPD_IV: + SET8(substruct3->speedIV); + break; + case MON_DATA_SPATK_IV: + SET8(substruct3->spAttackIV); + break; + case MON_DATA_SPDEF_IV: + SET8(substruct3->spDefenseIV); + break; + case MON_DATA_IS_EGG: + SET8(substruct3->isEgg); + if (substruct3->isEgg) + boxMon->isEgg = 1; + else + boxMon->isEgg = 0; + break; + case MON_DATA_ALT_ABILITY: + SET8(substruct3->altAbility); + break; + case MON_DATA_COOL_RIBBON: + SET8(substruct3->coolRibbon); + break; + case MON_DATA_BEAUTY_RIBBON: + SET8(substruct3->beautyRibbon); + break; + case MON_DATA_CUTE_RIBBON: + SET8(substruct3->cuteRibbon); + break; + case MON_DATA_SMART_RIBBON: + SET8(substruct3->smartRibbon); + break; + case MON_DATA_TOUGH_RIBBON: + SET8(substruct3->toughRibbon); + break; + case MON_DATA_CHAMPION_RIBBON: + SET8(substruct3->championRibbon); + break; + case MON_DATA_WINNING_RIBBON: + SET8(substruct3->winningRibbon); + break; + case MON_DATA_VICTORY_RIBBON: + SET8(substruct3->victoryRibbon); + break; + case MON_DATA_ARTIST_RIBBON: + SET8(substruct3->artistRibbon); + break; + case MON_DATA_EFFORT_RIBBON: + SET8(substruct3->effortRibbon); + break; + case MON_DATA_GIFT_RIBBON_1: + SET8(substruct3->giftRibbon1); + break; + case MON_DATA_GIFT_RIBBON_2: + SET8(substruct3->giftRibbon2); + break; + case MON_DATA_GIFT_RIBBON_3: + SET8(substruct3->giftRibbon3); + break; + case MON_DATA_GIFT_RIBBON_4: + SET8(substruct3->giftRibbon4); + break; + case MON_DATA_GIFT_RIBBON_5: + SET8(substruct3->giftRibbon5); + break; + case MON_DATA_GIFT_RIBBON_6: + SET8(substruct3->giftRibbon6); + break; + case MON_DATA_GIFT_RIBBON_7: + SET8(substruct3->giftRibbon7); + break; + case MON_DATA_FATEFUL_ENCOUNTER: + SET8(substruct3->fatefulEncounter); + break; + case MON_DATA_IVS: + { +#ifdef BUGFIX_SETMONIVS + u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); +#else + u32 ivs = *data; // Bug: Only the HP IV and the lower 3 bits of the Attack IV are read. The rest become 0. +#endif + substruct3->hpIV = ivs & 0x1F; + substruct3->attackIV = (ivs >> 5) & 0x1F; + substruct3->defenseIV = (ivs >> 10) & 0x1F; + substruct3->speedIV = (ivs >> 15) & 0x1F; + substruct3->spAttackIV = (ivs >> 20) & 0x1F; + substruct3->spDefenseIV = (ivs >> 25) & 0x1F; + break; + } + default: + break; + } + + if (field > MON_DATA_10) + { + boxMon->checksum = CalculateBoxMonChecksum(boxMon); + EncryptBoxMon(boxMon); + } +} + +void CopyMon(void *dest, void *src, size_t size) +{ + memcpy(dest, src, size); +} + +u8 GiveMonToPlayer(struct Pokemon *mon) +{ + s32 i; + + SetMonData(mon, MON_DATA_OT_NAME, gSaveBlock2.playerName); + SetMonData(mon, MON_DATA_OT_GENDER, &gSaveBlock2.playerGender); + SetMonData(mon, MON_DATA_OT_ID, gSaveBlock2.playerTrainerId); + + i = 0; + + while (i < 6 && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + i++; + + if (i >= 6) + return SendMonToPC(mon); + + CopyMon(&gPlayerParty[i], mon, sizeof(*mon)); + gPlayerPartyCount = i + 1; + return 0; +} + +u8 SendMonToPC(struct Pokemon *mon) +{ + s32 i = gPokemonStorage.currentBox; + + do + { + s32 j; + for (j = 0; j < 30; j++) + { + if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) + { + MonRestorePP(mon); + CopyMon(&gPokemonStorage.boxes[i][j], &mon->box, sizeof(mon->box)); + return 1; + } + } + + i++; + if (i == 14) + i = 0; + } while (i != gPokemonStorage.currentBox); + + return 2; +} + +u8 CalculatePlayerPartyCount(void) +{ + gPlayerPartyCount = 0; + + while (gPlayerPartyCount < 6 + && GetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + gPlayerPartyCount++; + } + + return gPlayerPartyCount; +} + +u8 CalculateEnemyPartyCount(void) +{ + gEnemyPartyCount = 0; + + while (gEnemyPartyCount < 6 + && GetMonData(&gEnemyParty[gEnemyPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + gEnemyPartyCount++; + } + + return gEnemyPartyCount; +} + +u8 sub_803DAA0(void) +{ + s32 aliveCount = 0; + s32 i; + CalculatePlayerPartyCount(); + + if (gPlayerPartyCount == 1) + return gPlayerPartyCount; + + for (i = 0; i < gPlayerPartyCount; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0 + && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_NONE + && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_EGG) + aliveCount++; + } + + return (aliveCount > 1) ? 0 : 2; +} + +u8 GetAbilityBySpecies(u16 species, bool8 altAbility) +{ + if (altAbility) + gLastUsedAbility = gBaseStats[species].ability2; + else + gLastUsedAbility = gBaseStats[species].ability1; + + return gLastUsedAbility; +} + +u8 GetMonAbility(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u8 altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL); + return GetAbilityBySpecies(species, altAbility); +} + +void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord) +{ + s32 i, j; + + ZeroEnemyPartyMons(); + memcpy(&gSecretBaseRecord, secretBaseRecord, sizeof(*secretBaseRecord)); + + for (i = 0; i < 6; i++) + { + if (gSecretBaseRecord.partySpecies[i]) + { + CreateMon(&gEnemyParty[i], + gSecretBaseRecord.partySpecies[i], + gSecretBaseRecord.partyLevels[i], + 15, + 1, + gSecretBaseRecord.partyPersonality[i], + 2, + 0); + + SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, (u8 *)&gSecretBaseRecord.partyHeldItems[i]); + + for (j = 0; j < 6; j++) + SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gSecretBaseRecord.partyEVs[i]); + + for (j = 0; j < 4; j++) + { + SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, (u8 *)&gSecretBaseRecord.partyMoves[i * 4 + j]); + SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gSecretBaseRecord.partyMoves[i * 4 + j]].pp); + } + } + } + + gBattleTypeFlags = 8; + gTrainerBattleOpponent = 1024; +} + +u8 GetSecretBaseTrainerPicIndex(void) +{ + u8 trainerClass = gSecretBaseTrainerClasses[gSecretBaseRecord.gender][gSecretBaseRecord.trainerId[0] % 5]; + return gTrainerClassToPicIndex[trainerClass]; +} + +u8 GetSecretBaseTrainerNameIndex(void) +{ + u8 trainerClass = gSecretBaseTrainerClasses[gSecretBaseRecord.gender][gSecretBaseRecord.trainerId[0] % 5]; + return gTrainerClassToNameIndex[trainerClass]; +} + +u8 PlayerPartyAndPokemonStorageFull(void) +{ + s32 i; + + for (i = 0; i < 6; i++) + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE) + return 0; + + return PokemonStorageFull(); +} + +u8 PokemonStorageFull(void) +{ + s32 i, j; + + for (i = 0; i < 14; i++) + for (j = 0; j < 30; j++) + if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) + return 0; + + return 1; +} + +void GetSpeciesName(u8 *name, u16 species) +{ + s32 i; + + for (i = 0; i <= POKEMON_NAME_LENGTH; i++) + { + if (species > NUM_SPECIES) + name[i] = gSpeciesNames[0][i]; + else + name[i] = gSpeciesNames[species][i]; + + if (name[i] == EOS) + break; + } + + name[i] = EOS; +} + +u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex) +{ + u8 basePP = gBattleMoves[move].pp; + return basePP + ((basePP * 20 * ((gUnknown_08208238[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100); +} + +void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex) +{ + u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + ppBonuses &= gUnknown_0820823C[moveIndex]; + SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); +} + +void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex) +{ + mon->ppBonuses &= gUnknown_0820823C[moveIndex]; +} + +void CopyPlayerPartyMonToBattleData(u8 battleIndex, u8 partyIndex) +{ + s32 i; + s8 nickname[POKEMON_NAME_LENGTH * 2]; + + gBattleMons[battleIndex].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); + gBattleMons[battleIndex].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL); + + for (i = 0; i < 4; i++) + { + gBattleMons[battleIndex].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL); + gBattleMons[battleIndex].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL); + } + + gBattleMons[battleIndex].ppBonuses = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP_BONUSES, NULL); + gBattleMons[battleIndex].friendship = GetMonData(&gPlayerParty[partyIndex], MON_DATA_FRIENDSHIP, NULL); + gBattleMons[battleIndex].experience = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EXP, NULL); + gBattleMons[battleIndex].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL); + gBattleMons[battleIndex].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL); + gBattleMons[battleIndex].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL); + gBattleMons[battleIndex].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPD_IV, NULL); + gBattleMons[battleIndex].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL); + gBattleMons[battleIndex].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL); + gBattleMons[battleIndex].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL); + gBattleMons[battleIndex].status1 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_STATUS, NULL); + gBattleMons[battleIndex].level = GetMonData(&gPlayerParty[partyIndex], MON_DATA_LEVEL, NULL); + gBattleMons[battleIndex].hp = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL); + gBattleMons[battleIndex].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL); + gBattleMons[battleIndex].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL); + gBattleMons[battleIndex].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL); + gBattleMons[battleIndex].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPD, NULL); + gBattleMons[battleIndex].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL); + gBattleMons[battleIndex].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL); + gBattleMons[battleIndex].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL); + gBattleMons[battleIndex].altAbility = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ALT_ABILITY, NULL); + gBattleMons[battleIndex].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL); + gBattleMons[battleIndex].type1 = gBaseStats[gBattleMons[battleIndex].species].type1; + gBattleMons[battleIndex].type2 = gBaseStats[gBattleMons[battleIndex].species].type2; + gBattleMons[battleIndex].ability = GetAbilityBySpecies(gBattleMons[battleIndex].species, gBattleMons[battleIndex].altAbility); + GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname); + StringCopy10(gBattleMons[battleIndex].nickname, nickname); + GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battleIndex].otName); + *(unk_20160BC + GetBankSide(battleIndex)) = gBattleMons[battleIndex].hp; + + for (i = 0; i < 8; i++) + gBattleMons[battleIndex].statStages[i] = 6; + + gBattleMons[battleIndex].status2 = 0; + sub_80157C4(battleIndex); + sub_8032AA8(battleIndex, 0); +} diff --git a/src/pokemon/pokemon_3.c b/src/pokemon/pokemon_3.c new file mode 100644 index 000000000..3d85a1c8f --- /dev/null +++ b/src/pokemon/pokemon_3.c @@ -0,0 +1,1380 @@ +#include "global.h" +#include "battle.h" +#include "battle_message.h" +#include "data2.h" +#include "event_data.h" +#include "hold_effects.h" +#include "item.h" +#include "items.h" +#include "link.h" +#include "m4a.h" +#include "main.h" +#include "pokemon.h" +#include "rng.h" +#include "rom4.h" +#include "rom_8077ABC.h" +#include "rom_8094928.h" +#include "rtc.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "sprite.h" +#include "string_util.h" +#include "text.h" +#include "util.h" + +extern u8 gPlayerPartyCount; +extern u8 gEnemyPartyCount; +extern struct BattlePokemon gBattleMons[4]; +extern u8 gActiveBank; +extern struct BattleEnigmaBerry gEnigmaBerries[]; +extern u16 gSpeciesToHoennPokedexNum[]; +extern u16 gSpeciesToNationalPokedexNum[]; +extern u16 gHoennToNationalOrder[]; +extern u16 gSpeciesIdToCryId[]; +extern u8 gBattleTextBuff1[]; +extern u8 gBattleTextBuff2[]; +extern u8 gDisplayedStringBattle[]; +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u8 gStringBank; +extern u8 gBankInMenu; +extern struct SpindaSpot gSpindaSpotGraphics[]; +extern s8 gNatureStatTable[][5]; +extern s8 gUnknown_082082FE[][3]; +extern u16 gTrainerBattleOpponent; +extern u16 gBattleTypeFlags; +extern u32 gTMHMLearnsets[][2]; +extern u8 gBattleMonForms[]; +extern const u8 BattleText_Wally[]; +extern const u16 gHMMoves[]; +extern s8 gPokeblockFlavorCompatibilityTable[]; +extern u8 gLastUsedAbility; +extern const u8 BattleText_PreventedSwitch[]; +extern u16 gBattlePartyID[]; +extern u8 gJapaneseNidoranNames[][11]; + +extern u8 gUnknown_082082F8[]; +extern u8 gUnknown_083FFDB3[]; +extern u8 gUnknown_083FFDD3[]; +extern u8 gUnknown_083FEE5D[]; +extern u8 gUnknown_083FEE92[]; +extern u8 *gUnknown_08400F58[]; + +bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) +{ + u32 status = GetMonData(mon, MON_DATA_STATUS, 0); + + if (status & healMask) + { + status &= ~healMask; + SetMonData(mon, MON_DATA_STATUS, (u8 *)&status); + if (gMain.inBattle && battleId != 4) + gBattleMons[battleId].status1 &= ~healMask; + return FALSE; + } + else + { + return TRUE; + } +} + +u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit) +{ + const u8 *temp; + const u8 *itemEffect; + u8 offset; + int i; + u8 j; + u8 val; + + offset = 6; + + temp = gItemEffectTable[itemId - 13]; + + if (!temp && itemId != ITEM_ENIGMA_BERRY) + return 0; + + if (itemId == ITEM_ENIGMA_BERRY) + { + temp = gEnigmaBerries[gActiveBank].itemEffect; + } + + itemEffect = temp; + + for (i = 0; i < 6; i++) + { + switch (i) + { + case 0: + case 1: + case 2: + case 3: + if (i == effectByte) + return 0; + break; + case 4: + val = itemEffect[4]; + if (val & 0x20) + val &= 0xDF; + j = 0; + while (val) + { + if (val & 1) + { + switch (j) + { + case 2: + if (val & 0x10) + val &= 0xEF; + case 0: + if (i == effectByte && (val & effectBit)) + return offset; + offset++; + break; + case 1: + if (i == effectByte && (val & effectBit)) + return offset; + offset++; + break; + case 3: + if (i == effectByte && (val & effectBit)) + return offset; + offset++; + break; + case 7: + if (i == effectByte) + return 0; + break; + } + } + j++; + val >>= 1; + if (i == effectByte) + effectBit >>= 1; + } + break; + case 5: + val = itemEffect[5]; + j = 0; + while (val) + { + if (val & 1) + { + switch (j) + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + if (i == effectByte && (val & effectBit)) + return offset; + offset++; + break; + case 7: + if (i == effectByte) + return 0; + break; + } + } + j++; + val >>= 1; + if (i == effectByte) + effectBit >>= 1; + } + break; + } + } + + return offset; +} + +void sub_803F324(int stat) +{ + gBankTarget = gBankInMenu; + StringCopy(gBattleTextBuff1, gUnknown_08400F58[gUnknown_082082F8[stat]]); + StringCopy(gBattleTextBuff2, gUnknown_083FFDB3); + StrCpyDecodeToDisplayedStringBattle(gUnknown_083FFDD3); +} + +u8 *sub_803F378(u16 itemId) +{ + int i; + u8 *itemEffect; + + if (itemId == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + { + itemEffect = gEnigmaBerries[gBankInMenu].itemEffect; + } + else + { + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; + } + } + else + { + itemEffect = (u8 *) gItemEffectTable[itemId - 13]; + } + + gStringBank = gBankInMenu; + + for (i = 0; i < 3; i++) + { + if (itemEffect[i] & 0xF) + sub_803F324(i * 2); + if (itemEffect[i] & 0xF0) + { + if (i) + { + sub_803F324(i * 2 + 1); + } + else + { + gBankAttacker = gBankInMenu; + StrCpyDecodeToDisplayedStringBattle(gUnknown_083FEE92); + } + } + } + + if (itemEffect[3] & 0x80) + { + gBankAttacker = gBankInMenu; + StrCpyDecodeToDisplayedStringBattle(gUnknown_083FEE5D); + } + + return gDisplayedStringBattle; +} + +u8 GetNature(struct Pokemon *mon) +{ + return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25; +} + +u8 GetNatureFromPersonality(u32 personality) +{ + return personality % 25; +} + +u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) +{ + int i; + u16 targetSpecies = 0; + u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + u8 level; + u16 friendship; + u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); + u16 upperPersonality = personality >> 16; + u8 holdEffect; + + if (heldItem == ITEM_ENIGMA_BERRY) + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; + else + holdEffect = ItemId_GetHoldEffect(heldItem); + + if (holdEffect == 38 && type != 3) + return 0; + + switch (type) + { + case 0: + level = GetMonData(mon, MON_DATA_LEVEL, 0); + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + + for (i = 0; i < 5; i++) + { + switch (gEvolutionTable[species].evolutions[i].method) + { + case EVO_FRIENDSHIP: + if (friendship >= 220) + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + case EVO_FRIENDSHIP_DAY: + RtcCalcLocalTime(); + if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220) + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + case EVO_FRIENDSHIP_NIGHT: + RtcCalcLocalTime(); + if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220) + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + case EVO_LEVEL: + if (gEvolutionTable[species].evolutions[i].param <= level) + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + case EVO_LEVEL_ATK_GT_DEF: + if (gEvolutionTable[species].evolutions[i].param <= level) + if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0)) + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + case EVO_LEVEL_ATK_EQ_DEF: + if (gEvolutionTable[species].evolutions[i].param <= level) + if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0)) + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + case EVO_LEVEL_ATK_LT_DEF: + if (gEvolutionTable[species].evolutions[i].param <= level) + if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0)) + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + case EVO_LEVEL_SILCOON: + if (gEvolutionTable[species].evolutions[i].param <= level && (upperPersonality % 10) <= 4) + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + case EVO_LEVEL_CASCOON: + if (gEvolutionTable[species].evolutions[i].param <= level && (upperPersonality % 10) > 4) + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + case EVO_LEVEL_NINJASK: + if (gEvolutionTable[species].evolutions[i].param <= level) + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + case EVO_BEAUTY: + if (gEvolutionTable[species].evolutions[i].param <= beauty) + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + } + } + break; + case 1: + for (i = 0; i < 5; i++) + { + switch (gEvolutionTable[species].evolutions[i].method) + { + case EVO_TRADE: + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + case EVO_TRADE_ITEM: + if (gEvolutionTable[species].evolutions[i].param == heldItem) + { + heldItem = 0; + SetMonData(mon, MON_DATA_HELD_ITEM, (u8 *)&heldItem); + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + } + break; + } + } + break; + case 2: + case 3: + for (i = 0; i < 5; i++) + { + if (gEvolutionTable[species].evolutions[i].method == EVO_ITEM + && gEvolutionTable[species].evolutions[i].param == evolutionItem) + { + targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; + break; + } + } + break; + } + + return targetSpecies; +} + +u16 HoennPokedexNumToSpecies(u16 hoennNum) +{ + u16 species; + + if (!hoennNum) + return 0; + + species = 0; + + while (species < 411 && gSpeciesToHoennPokedexNum[species] != hoennNum) + species++; + + if (species == 411) + return 0; + + return species + 1; +} + +u16 NationalPokedexNumToSpecies(u16 nationalNum) +{ + u16 species; + + if (!nationalNum) + return 0; + + species = 0; + + while (species < 411 && gSpeciesToNationalPokedexNum[species] != nationalNum) + species++; + + if (species == 411) + return 0; + + return species + 1; +} + +u16 NationalToHoennOrder(u16 nationalNum) +{ + u16 hoennNum; + + if (!nationalNum) + return 0; + + hoennNum = 0; + + while (hoennNum < 411 && gHoennToNationalOrder[hoennNum] != nationalNum) + hoennNum++; + + if (hoennNum == 411) + return 0; + + return hoennNum + 1; +} + +u16 SpeciesToNationalPokedexNum(u16 species) +{ + if (!species) + return 0; + + return gSpeciesToNationalPokedexNum[species - 1]; +} + +u16 SpeciesToHoennPokedexNum(u16 species) +{ + if (!species) + return 0; + + return gSpeciesToHoennPokedexNum[species - 1]; +} + +u16 HoennToNationalOrder(u16 hoennNum) +{ + if (!hoennNum) + return 0; + + return gHoennToNationalOrder[hoennNum - 1]; +} + +u32 SpeciesToCryId(u16 species) +{ + if (species <= 250) + return species; + + if (species < 276) + return 200; + + return gSpeciesIdToCryId[species - 276]; +} + +void unref_sub_803F938(u16 species, u32 personality, u8 *dest) +{ + if (species == SPECIES_SPINDA && dest != gUnknown_081FAF4C[0] && dest != gUnknown_081FAF4C[2]) + { + int i; + for (i = 0; i < 4; i++) + { + int j; + u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); + u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); + + for (j = 0; j < 16; j++) + { + int k; + s32 row = gSpindaSpotGraphics[i].image[j]; + + for (k = x; k < x + 16; k++) + { + u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2); + + if (row & 1) + { + if (k & 1) + { + if ((u8)((*val & 0xF0) - 0x10) <= 0x20) + *val += 0x40; + } + else + { + if ((u8)((*val & 0xF) - 0x01) <= 0x02) + *val += 0x04; + } + } + + row >>= 1; + } + + y++; + } + + personality >>= 8; + } + } +} + +void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4) +{ + if (species == SPECIES_SPINDA && a4) + { + int i; + for (i = 0; i < 4; i++) + { + int j; + u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); + u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); + + for (j = 0; j < 16; j++) + { + int k; + s32 row = gSpindaSpotGraphics[i].image[j]; + + for (k = x; k < x + 16; k++) + { + u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2); + + if (row & 1) + { + if (k & 1) + { + if ((u8)((*val & 0xF0) - 0x10) <= 0x20) + *val += 0x40; + } + else + { + if ((u8)((*val & 0xF) - 0x01) <= 0x02) + *val += 0x04; + } + } + + row >>= 1; + } + + y++; + } + + personality >>= 8; + } + } +} + +void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies) +{ +#ifdef BUGFIX_EVO_NAME + u8 language; + GetMonData(mon, MON_DATA_NICKNAME, gStringVar1); + language = GetMonData(mon, MON_DATA_LANGUAGE, &language); + if (language == GAME_LANGUAGE && !StringCompareWithoutExtCtrlCodes(gSpeciesNames[oldSpecies], gStringVar1)) + SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]); +#else + GetMonData(mon, MON_DATA_NICKNAME, gStringVar1); + if (!StringCompareWithoutExtCtrlCodes(gSpeciesNames[oldSpecies], gStringVar1)) + SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]); +#endif +} + +bool8 sub_803FBBC(void) +{ + bool8 retVal = FALSE; + switch (gLinkPlayers[GetMultiplayerId()].lp_field_18) + { + case 0: + case 3: + retVal = FALSE; + break; + case 1: + case 2: + retVal = TRUE; + break; + } + return retVal; +} + +bool8 sub_803FBFC(u8 id) +{ + bool8 retVal = FALSE; + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + retVal = FALSE; + break; + case 1: + case 2: + retVal = TRUE; + break; + } + return retVal; +} + +s32 sub_803FC34(u16 a1) +{ + s32 id; + for (id = 0; id < MAX_LINK_PLAYERS; id++) + if (gLinkPlayers[id].lp_field_18 == a1) + break; + return id; +} + +u8 sub_803FC58(u16 trainer) +{ + return gTrainers[trainer].encounterMusic_gender & 0x7F; +} + +u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex) +{ + if (statIndex < 1 || statIndex > 5) + { + // should just be "return n", but it wouldn't match without this + u16 retVal = n; + retVal++; + retVal--; + return retVal; + } + + switch (gNatureStatTable[nature][statIndex - 1]) + { + case 1: + return (u16)(n * 110) / 100; + case -1: + return (u16)(n * 90) / 100; + } + + return n; +} + +void AdjustFriendship(struct Pokemon *mon, u8 event) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + u8 holdEffect; + + if (heldItem == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + { + holdEffect = gEnigmaBerries[0].holdEffect; + } + else + { + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; + } + } + else + { + holdEffect = ItemId_GetHoldEffect(heldItem); + } + + if (species && species != SPECIES_EGG) + { + u8 friendshipLevel = 0; + s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + if (friendship > 99) + friendshipLevel++; + if (friendship > 199) + friendshipLevel++; + if ((event != 5 || !(Random() & 1)) + && (event != 3 + || ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) + && (gTrainers[gTrainerBattleOpponent].trainerClass == 24 + || gTrainers[gTrainerBattleOpponent].trainerClass == 25 + || gTrainers[gTrainerBattleOpponent].trainerClass == 32)))) + { + s8 mod = gUnknown_082082FE[event][friendshipLevel]; + if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + mod = (150 * mod) / 100; + friendship += mod; + if (mod > 0) + { + if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL) + friendship++; + if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == sav1_map_get_name()) + friendship++; + } + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + SetMonData(mon, MON_DATA_FRIENDSHIP, (u8 *)&friendship); + } + } +} + +void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) +{ + u8 evs[NUM_STATS]; + u16 evIncrease = 0; + u16 totalEVs = 0; + u16 heldItem; + u8 holdEffect; + int i; + + for (i = 0; i < NUM_STATS; i++) + { + evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, 0); + totalEVs += evs[i]; + } + + for (i = 0; i < NUM_STATS; i++) + { + u8 hasHadPokerus; + int multiplier; + + if (totalEVs >= MAX_TOTAL_EVS) + break; + + hasHadPokerus = CheckPartyHasHadPokerus(mon, 0); + + if (hasHadPokerus) + multiplier = 2; + else + multiplier = 1; + + switch (i) + { + case 0: + evIncrease = gBaseStats[defeatedSpecies].evYield_HP * multiplier; + break; + case 1: + evIncrease = gBaseStats[defeatedSpecies].evYield_Attack * multiplier; + break; + case 2: + evIncrease = gBaseStats[defeatedSpecies].evYield_Defense * multiplier; + break; + case 3: + evIncrease = gBaseStats[defeatedSpecies].evYield_Speed * multiplier; + break; + case 4: + evIncrease = gBaseStats[defeatedSpecies].evYield_SpAttack * multiplier; + break; + case 5: + evIncrease = gBaseStats[defeatedSpecies].evYield_SpDefense * multiplier; + break; + } + + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + + if (heldItem == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + { + holdEffect = gEnigmaBerries[0].holdEffect; + } + else + { + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; + } + } + else + { + holdEffect = ItemId_GetHoldEffect(heldItem); + } + + if (holdEffect == HOLD_EFFECT_MACHO_BRACE) + evIncrease *= 2; + + if (totalEVs + (s16)evIncrease > MAX_TOTAL_EVS) + evIncrease = ((s16)evIncrease + MAX_TOTAL_EVS) - (totalEVs + evIncrease); + + if (evs[i] + (s16)evIncrease > 255) + { + int val1 = (s16)evIncrease + 255; + int val2 = evs[i] + evIncrease; + evIncrease = val1 - val2; + } + + evs[i] += evIncrease; + totalEVs += evIncrease; + SetMonData(mon, MON_DATA_HP_EV + i, &evs[i]); + } +} + +u16 GetMonEVCount(struct Pokemon *mon) +{ + int i; + u16 count = 0; + + for (i = 0; i < NUM_STATS; i++) + count += GetMonData(mon, MON_DATA_HP_EV + i, 0); + + return count; +} + +void RandomlyGivePartyPokerus(struct Pokemon *party) +{ + u16 rnd = Random(); + if (rnd == 0x4000 || rnd == 0x8000 || rnd == 0xC000) + { + struct Pokemon *mon; + + do + { + do + { + rnd = Random() % PARTY_SIZE; + mon = &party[rnd]; + } + while (!GetMonData(mon, MON_DATA_SPECIES, 0)); + } + while (GetMonData(mon, MON_DATA_IS_EGG, 0)); + + if (!(CheckPartyHasHadPokerus(party, gBitTable[rnd]))) + { + u8 rnd2; + + do + { + rnd2 = Random(); + } + while (rnd2 == 0); + + if (rnd2 & 0xF0) + rnd2 &= 0x07; + + rnd2 |= (rnd2 << 4); + rnd2 &= 0xF3; + rnd2++; + + SetMonData(&party[rnd], MON_DATA_POKERUS, &rnd2); + } + } +} + +u8 CheckPartyPokerus(struct Pokemon *party, u8 selection) +{ + u8 retVal; + + int partyIndex = 0; + unsigned curBit = 1; + retVal = 0; + + if (selection) + { + do + { + if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0) & 0xF)) + retVal |= curBit; + partyIndex++; + curBit <<= 1; + selection >>= 1; + } + while (selection); + } + else if (GetMonData(&party[0], MON_DATA_POKERUS, 0) & 0xF) + { + retVal = 1; + } + + return retVal; +} + +u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection) +{ + u8 retVal; + + int partyIndex = 0; + unsigned curBit = 1; + retVal = 0; + + if (selection) + { + do + { + if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0)) + retVal |= curBit; + partyIndex++; + curBit <<= 1; + selection >>= 1; + } + while (selection); + } + else if (GetMonData(&party[0], MON_DATA_POKERUS, 0)) + { + retVal = 1; + } + + return retVal; +} + +void UpdatePartyPokerusTime(u16 days) +{ + int i; + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, 0)) + { + u8 pokerus = GetMonData(&gPlayerParty[i], MON_DATA_POKERUS, 0); + if (pokerus & 0xF) + { + if ((pokerus & 0xF) < days || days > 4) + pokerus &= 0xF0; + else + pokerus -= days; + + SetMonData(&gPlayerParty[i], MON_DATA_POKERUS, &pokerus); + } + } + } +} + +void PartySpreadPokerus(struct Pokemon *party) +{ + if ((Random() % 3) == 0) + { + int i; + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&party[i], MON_DATA_SPECIES, 0)) + { + u8 pokerus = GetMonData(&party[i], MON_DATA_POKERUS, 0); + u8 curPokerus = pokerus; + if (pokerus) + { + if (pokerus & 0xF) + { + // spread to adjacent party members + if (i != 0 && !(GetMonData(&party[i - 1], MON_DATA_POKERUS, 0) & 0xF0)) + SetMonData(&party[i - 1], MON_DATA_POKERUS, &curPokerus); + if (i != (PARTY_SIZE - 1) && !(GetMonData(&party[i + 1], MON_DATA_POKERUS, 0) & 0xF0)) + { + SetMonData(&party[i + 1], MON_DATA_POKERUS, &curPokerus); + i++; + } + } + } + } + } + } +} + +bool8 TryIncrementMonLevel(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u8 nextLevel = GetMonData(mon, MON_DATA_LEVEL, 0) + 1; + if (GetMonData(mon, MON_DATA_EXP, 0) > gExperienceTables[gBaseStats[species].growthRate][nextLevel]) + { + SetMonData(mon, MON_DATA_LEVEL, &nextLevel); + return TRUE; + } + else + { + return FALSE; + } +} + +u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + if (species == SPECIES_EGG) + { + return 0; + } + else if (tm < 32) + { + u32 mask = 1 << tm; + return gTMHMLearnsets[species][0] & mask; + } + else + { + u32 mask = 1 << (tm - 32); + return gTMHMLearnsets[species][1] & mask; + } +} + +u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) +{ + u16 learnedMoves[4]; + u8 numMoves = 0; + u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); + int i, j, k; + + for (i = 0; i < 4; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + for (i = 0; i < 20; i++) + { + u16 moveLevel; + + if (gLevelUpLearnsets[species][i] == 0xFFFF) + break; + + moveLevel = gLevelUpLearnsets[species][i] & 0xFE00; + + if (moveLevel <= (level << 9)) + { + for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) + ; + + if (j == 4) + { + for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) + ; + + if (k == numMoves) + moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; + } + } + } + + return numMoves; +} + +u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) +{ + u8 numMoves = 0; + int i; + + for (i = 0; i < 20 && gLevelUpLearnsets[species][i] != 0xFFFF; i++) + moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; + + return numMoves; +} + +u8 sub_8040574(struct Pokemon *mon) +{ + u16 learnedMoves[4]; + u16 moves[20]; + u8 numMoves = 0; + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); + int i, j, k; + + if (species == SPECIES_EGG) + return 0; + + for (i = 0; i < 4; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + for (i = 0; i < 20; i++) + { + u16 moveLevel; + + if (gLevelUpLearnsets[species][i] == 0xFFFF) + break; + + moveLevel = gLevelUpLearnsets[species][i] & 0xFE00; + + if (moveLevel <= (level << 9)) + { + for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) + ; + + if (j == 4) + { + for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) + ; + + if (k == numMoves) + moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; + } + } + } + + return numMoves; +} + +u16 SpeciesToPokedexNum(u16 species) +{ + if (IsNationalPokedexEnabled()) + { + return SpeciesToNationalPokedexNum(species); + } + else + { + species = SpeciesToHoennPokedexNum(species); + if (species <= 202) + return species; + return 0xFFFF; + } +} + +void ClearBattleMonForms(void) +{ + int i; + for (i = 0; i < 4; i++) + gBattleMonForms[i] = 0; +} + +u16 sub_8040728(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) + return BGM_BATTLE34; + if (gBattleTypeFlags & BATTLE_TYPE_REGI) + return BGM_BATTLE36; + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + return BGM_BATTLE20; + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + switch (gTrainers[gTrainerBattleOpponent].trainerClass) + { + case 2: + case 0x31: + return BGM_BATTLE30; + case 3: + case 4: + case 0x32: + case 0x33: + return BGM_BATTLE31; + case 0x19: + return BGM_BATTLE32; + case 0x20: + return BGM_BATTLE33; + case 0x2E: + if (!StringCompare(gTrainers[gTrainerBattleOpponent].trainerName, BattleText_Wally)) + return BGM_BATTLE20; + return BGM_BATTLE35; + case 0x18: + return BGM_BATTLE38; + default: + return BGM_BATTLE20; + } + } + return BGM_BATTLE27; +} + +void sub_80408BC(void) +{ + ResetMapMusic(); + m4aMPlayAllStop(); + PlayBGM(sub_8040728()); +} + +void current_map_music_set__default_for_battle(u16 song) +{ + ResetMapMusic(); + m4aMPlayAllStop(); + if (song) + PlayNewMapMusic(song); + else + PlayNewMapMusic(sub_8040728()); +} + +const u8 *pokemon_get_pal(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + return species_and_otid_get_pal(species, otId, personality); +} + +//Extracts the upper 16 bits of a 32-bit number +#define HIHALF(n) (((n) & 0xFFFF0000) >> 16) + +//Extracts the lower 16 bits of a 32-bit number +#define LOHALF(n) ((n) & 0xFFFF) + +const u8 *species_and_otid_get_pal(u16 species, u32 otId, u32 personality) +{ + u32 shinyValue; + + if (species > SPECIES_EGG) + return gMonPaletteTable[0].data; + + shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); + if (shinyValue < 8) + return gMonShinyPaletteTable[species].data; + else + return gMonPaletteTable[species].data; +} + +const struct CompressedSpritePalette *sub_8040990(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + return sub_80409C8(species, otId, personality); +} + +const struct CompressedSpritePalette *sub_80409C8(u16 species, u32 otId , u32 personality) +{ + u32 shinyValue; + + shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); + if (shinyValue < 8) + return &gMonShinyPaletteTable[species]; + else + return &gMonPaletteTable[species]; +} + +bool8 IsHMMove2(u16 move) +{ + int i = 0; + while (gHMMoves[i] != 0xFFFF) + { + if (gHMMoves[i++] == move) + return TRUE; + } + return FALSE; +} + +bool8 sub_8040A3C(u16 species) +{ + return gBaseStats[species].unk19_7; +} + +s8 sub_8040A54(struct Pokemon *mon, u8 a2) +{ + u8 nature = GetNature(mon); + return gPokeblockFlavorCompatibilityTable[nature * 5 + a2]; +} + +s8 sub_8040A7C(u32 personality, u8 a2) +{ + u8 nature = GetNatureFromPersonality(personality); + return gPokeblockFlavorCompatibilityTable[nature * 5 + a2]; +} + +bool8 IsTradedMon(struct Pokemon *mon) +{ + u8 otName[8]; + u32 otId; + GetMonData(mon, MON_DATA_OT_NAME, otName); + otId = GetMonData(mon, MON_DATA_OT_ID, 0); + return IsOtherTrainer(otId, otName); +} + +bool8 IsOtherTrainer(u32 otId, u8 *otName) +{ + if (otId == (gSaveBlock2.playerTrainerId[0] | (gSaveBlock2.playerTrainerId[1] << 8) | (gSaveBlock2.playerTrainerId[2] << 16) | (gSaveBlock2.playerTrainerId[3] << 24))) + { + int i; + + for (i = 0; otName[i] != EOS; i++) + if (otName[i] != gSaveBlock2.playerName[i]) + return TRUE; + return FALSE; + } + + return TRUE; +} + +void BoxMonRestorePP(struct BoxPokemon *); + +void MonRestorePP(struct Pokemon *mon) +{ + BoxMonRestorePP(&mon->box); +} + +void BoxMonRestorePP(struct BoxPokemon *boxMon) +{ + int i; + + for (i = 0; i < 4; i++) + { + if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0)) + { + u16 move = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0); + u16 bonus = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, 0); + u8 pp = CalculatePPWithBonus(move, bonus, i); + SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp); + } + } +} + +void sub_8040B8C(void) +{ + gLastUsedAbility = BATTLE_STRUCT->unk160C0;; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 4; + gBattleTextBuff1[2] = BATTLE_STRUCT->unk16054; + gBattleTextBuff1[4] = EOS; + if (!GetBankSide(BATTLE_STRUCT->unk16054)) + gBattleTextBuff1[3] = pokemon_order_func(gBattlePartyID[BATTLE_STRUCT->unk16054]); + else + gBattleTextBuff1[3] = gBattlePartyID[BATTLE_STRUCT->unk16054]; + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 4; + gBattleTextBuff2[2] = gBankInMenu; + gBattleTextBuff2[3] = pokemon_order_func(gBattlePartyID[gBankInMenu]); + gBattleTextBuff2[4] = EOS; + StrCpyDecodeBattle(BattleText_PreventedSwitch, gStringVar4); +} + +void SetWildMonHeldItem(void) +{ + if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER))) + { + u16 rnd = Random() % 100; + u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0); + if (gBaseStats[species].item1 == gBaseStats[species].item2) + { + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&gBaseStats[species].item1); + return; + } + + if (rnd > 44) + { + if (rnd <= 94) + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&gBaseStats[species].item1); + else + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&gBaseStats[species].item2); + } + } +} + +bool8 IsShinyOtIdPersonality(u32, u32); + +bool8 IsShiny(struct Pokemon *mon) +{ + u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + return IsShinyOtIdPersonality(otId, personality); +} + +bool8 IsShinyOtIdPersonality(u32 otId, u32 personality) +{ + bool8 retVal = FALSE; + u32 shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); + if (shinyValue < 8) + retVal = TRUE; + return retVal; +} + +u8 *sub_8040D08(void) +{ + u8 id = GetMultiplayerId(); + return gLinkPlayers[sub_803FC34(gLinkPlayers[id].lp_field_18 ^ 2)].name; +} + +bool32 sub_8040D3C(u16 species, u8 *name, u8 language) +{ + bool32 retVal = FALSE; + if (species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) + { + u8 *speciesName; + if (language == GAME_LANGUAGE) + { + speciesName = gSpeciesNames[species]; + } + else + { + if (species == SPECIES_NIDORAN_M) + speciesName = gJapaneseNidoranNames[0]; + else + speciesName = gJapaneseNidoranNames[1]; + } + if (!StringCompareWithoutExtCtrlCodes(name, speciesName)) + retVal = TRUE; + else + retVal = FALSE; + } + return retVal; +} + +bool32 sub_8040D8C(u16 species, u8 *name) +{ + u8 language = GAME_LANGUAGE; + if (name[0] == 0xFC && name[1] == 21) + language = LANGUAGE_JAPANESE; + return sub_8040D3C(species, name, language); +} + +bool32 unref_sub_8040DAC(struct Pokemon *mon) +{ + u8 name[12]; + u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u8 language = GetMonData(mon, MON_DATA_LANGUAGE, 0); + GetMonData(mon, MON_DATA_NICKNAME, name); + return sub_8040D3C(species, name, language); +} diff --git a/src/pokemon/pokemon_data.c b/src/pokemon/pokemon_data.c new file mode 100644 index 000000000..6414134fb --- /dev/null +++ b/src/pokemon/pokemon_data.c @@ -0,0 +1,128 @@ +#include "global.h" +#include "pokemon.h" +#include "species.h" +#include "trainer.h" +#include "abilities.h" +#include "moves.h" +#include "hold_effects.h" +#include "items.h" +#include "sprite.h" +#include "data2.h" + +#include "data/pokemon/dex_order.h" +#include "data/pokemon/spinda_spots.h" +#include "data/pokemon/item_effects.h" +#include "data/pokemon/nature_stats.h" +#include "data/pokemon/tmhm_learnsets.h" +#include "data/pokemon/trainer_class_lookups.h" +#include "data/pokemon/cry_ids.h" +#include "data/pokemon/experience_tables.h" +#include "data/pokemon/base_stats.h" +#include "data/pokemon/level_up_learnsets.h" +#include "data/pokemon/evolution.h" +#include "data/pokemon/level_up_learnset_pointers.h" + +const u8 gUnknown_08208238[] = { // Masks for getting PP Up count, also PP Max values + 0x03, 0x0c, 0x30, 0xc0 +}; + +const u8 gUnknown_0820823C[] = { // Masks for setting PP Up count + 0xFC, 0xF3, 0xCF, 0x3F +}; + +const u8 gUnknown_08208240[] = { // Values added to PP Up count + 0x01, 0x04, 0x10, 0x40 +}; + +const u8 gStatStageRatios[][2] = { + {10, 40}, // -6 + {10, 35}, // -5 + {10, 30}, // -4 + {10, 25}, // -3 + {10, 20}, // -2 + {10, 15}, // -1 + {10, 10}, // 0 + {15, 10}, // 1 + {20, 10}, // 2 + {25, 10}, // 3 + {30, 10}, // 4 + {35, 10}, // 5 + {40, 10} // 6 +}; + +const u8 unknownGameFreakAbbrev_820825E[] = _("ゲーフリ"); + +const u8 gHoldEffectToType[][2] = { + {HOLD_EFFECT_BUG_POWER, TYPE_BUG}, + {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL}, + {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND}, + {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK}, + {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS}, + {HOLD_EFFECT_DARK_POWER, TYPE_DARK}, + {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING}, + {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC}, + {HOLD_EFFECT_WATER_POWER, TYPE_WATER}, + {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING}, + {HOLD_EFFECT_POISON_POWER, TYPE_POISON}, + {HOLD_EFFECT_ICE_POWER, TYPE_ICE}, + {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST}, + {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC}, + {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE}, + {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON}, + {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL} +}; + +extern void sub_80105A0(struct Sprite *); +extern void oac_poke_opponent(struct Sprite *); + +const struct SpriteTemplate gSpriteTemplate_8208288[] = { + {0xFFFF, 0, &gOamData_81F96F0, NULL, gSpriteImageTable_81E7A10, gSpriteAffineAnimTable_81E7B70, sub_80105A0}, + {0xFFFF, 0, &gOamData_81F96E8, NULL, gSpriteImageTable_81E7A30, gSpriteAffineAnimTable_81E7BEC, oac_poke_opponent}, + {0xFFFF, 0, &gOamData_81F96F0, NULL, gSpriteImageTable_81E7A50, gSpriteAffineAnimTable_81E7B70, sub_80105A0}, + {0xFFFF, 0, &gOamData_81F96E8, NULL, gSpriteImageTable_81E7A70, gSpriteAffineAnimTable_81E7BEC, oac_poke_opponent}, +}; + +const u8 gSecretBaseTrainerClasses[][5] = { + // male + {TRAINER_CLASS_YOUNGSTER, TRAINER_CLASS_BUG_CATCHER, TRAINER_CLASS_RICH_BOY, TRAINER_CLASS_CAMPER, TRAINER_CLASS_COOL_TRAINER_M}, + // female + {TRAINER_CLASS_LASS, TRAINER_CLASS_SCHOOL_KID_F, TRAINER_CLASS_LADY, TRAINER_CLASS_PICNICKER, TRAINER_CLASS_COOL_TRAINER_F} +}; + +const u8 gUnknown_082082F2[] = { + MON_DATA_HP_EV, + MON_DATA_ATK_EV, + MON_DATA_DEF_EV, + MON_DATA_SPD_EV, + MON_DATA_SPDEF_EV, + MON_DATA_SPATK_EV +}; + +const u8 gUnknown_082082F8[] = {1, 1, 3, 2, 4, 6}; + +const s8 gUnknown_082082FE[][3] = { + // Happiness deltas + { 5, 3, 2}, + { 5, 3, 2}, + { 1, 1, 0}, + { 3, 2, 1}, + { 1, 1, 0}, + { 1, 1, 1}, + {-1, -1, -1}, + {-5, -5, -10}, + {-5, -5, -10} +}; + +const u16 gHMMoves[] = { + MOVE_CUT, + MOVE_FLY, + MOVE_SURF, + MOVE_STRENGTH, + MOVE_FLASH, + MOVE_ROCK_SMASH, + MOVE_WATERFALL, + MOVE_DIVE, + 0xffff +}; + +const u8 gJapaneseNidoranNames[][11] = {_("ニドラン♂"), _("ニドラン♀")}; diff --git a/src/pokemon/pokemon_icon.c b/src/pokemon/pokemon_icon.c new file mode 100644 index 000000000..8994ea49e --- /dev/null +++ b/src/pokemon/pokemon_icon.c @@ -0,0 +1,1276 @@ +#include "global.h" +#include "graphics.h" +#include "mail_data.h" +#include "species.h" +#include "sprite.h" + +#define POKE_ICON_BASE_PAL_TAG 56000 + +struct MonIconSpriteTemplate +{ + const struct OamData *oam; + const u8 *image; + const union AnimCmd *const *anims; + const union AffineAnimCmd *const *affineAnims; + void (*callback)(struct Sprite *); + u16 paletteTag; +}; + +const u8 * const gMonIconTable[] = +{ + gMonIcon_Bulbasaur, + gMonIcon_Bulbasaur, + gMonIcon_Ivysaur, + gMonIcon_Venusaur, + gMonIcon_Charmander, + gMonIcon_Charmeleon, + gMonIcon_Charizard, + gMonIcon_Squirtle, + gMonIcon_Wartortle, + gMonIcon_Blastoise, + gMonIcon_Caterpie, + gMonIcon_Metapod, + gMonIcon_Butterfree, + gMonIcon_Weedle, + gMonIcon_Kakuna, + gMonIcon_Beedrill, + gMonIcon_Pidgey, + gMonIcon_Pidgeotto, + gMonIcon_Pidgeot, + gMonIcon_Rattata, + gMonIcon_Raticate, + gMonIcon_Spearow, + gMonIcon_Fearow, + gMonIcon_Ekans, + gMonIcon_Arbok, + gMonIcon_Pikachu, + gMonIcon_Raichu, + gMonIcon_Sandshrew, + gMonIcon_Sandslash, + gMonIcon_NidoranF, + gMonIcon_Nidorina, + gMonIcon_Nidoqueen, + gMonIcon_NidoranM, + gMonIcon_Nidorino, + gMonIcon_Nidoking, + gMonIcon_Clefairy, + gMonIcon_Clefable, + gMonIcon_Vulpix, + gMonIcon_Ninetales, + gMonIcon_Jigglypuff, + gMonIcon_Wigglytuff, + gMonIcon_Zubat, + gMonIcon_Golbat, + gMonIcon_Oddish, + gMonIcon_Gloom, + gMonIcon_Vileplume, + gMonIcon_Paras, + gMonIcon_Parasect, + gMonIcon_Venonat, + gMonIcon_Venomoth, + gMonIcon_Diglett, + gMonIcon_Dugtrio, + gMonIcon_Meowth, + gMonIcon_Persian, + gMonIcon_Psyduck, + gMonIcon_Golduck, + gMonIcon_Mankey, + gMonIcon_Primeape, + gMonIcon_Growlithe, + gMonIcon_Arcanine, + gMonIcon_Poliwag, + gMonIcon_Poliwhirl, + gMonIcon_Poliwrath, + gMonIcon_Abra, + gMonIcon_Kadabra, + gMonIcon_Alakazam, + gMonIcon_Machop, + gMonIcon_Machoke, + gMonIcon_Machamp, + gMonIcon_Bellsprout, + gMonIcon_Weepinbell, + gMonIcon_Victreebel, + gMonIcon_Tentacool, + gMonIcon_Tentacruel, + gMonIcon_Geodude, + gMonIcon_Graveler, + gMonIcon_Golem, + gMonIcon_Ponyta, + gMonIcon_Rapidash, + gMonIcon_Slowpoke, + gMonIcon_Slowbro, + gMonIcon_Magnemite, + gMonIcon_Magneton, + gMonIcon_Farfetchd, + gMonIcon_Doduo, + gMonIcon_Dodrio, + gMonIcon_Seel, + gMonIcon_Dewgong, + gMonIcon_Grimer, + gMonIcon_Muk, + gMonIcon_Shellder, + gMonIcon_Cloyster, + gMonIcon_Gastly, + gMonIcon_Haunter, + gMonIcon_Gengar, + gMonIcon_Onix, + gMonIcon_Drowzee, + gMonIcon_Hypno, + gMonIcon_Krabby, + gMonIcon_Kingler, + gMonIcon_Voltorb, + gMonIcon_Electrode, + gMonIcon_Exeggcute, + gMonIcon_Exeggutor, + gMonIcon_Cubone, + gMonIcon_Marowak, + gMonIcon_Hitmonlee, + gMonIcon_Hitmonchan, + gMonIcon_Lickitung, + gMonIcon_Koffing, + gMonIcon_Weezing, + gMonIcon_Rhyhorn, + gMonIcon_Rhydon, + gMonIcon_Chansey, + gMonIcon_Tangela, + gMonIcon_Kangaskhan, + gMonIcon_Horsea, + gMonIcon_Seadra, + gMonIcon_Goldeen, + gMonIcon_Seaking, + gMonIcon_Staryu, + gMonIcon_Starmie, + gMonIcon_Mrmime, + gMonIcon_Scyther, + gMonIcon_Jynx, + gMonIcon_Electabuzz, + gMonIcon_Magmar, + gMonIcon_Pinsir, + gMonIcon_Tauros, + gMonIcon_Magikarp, + gMonIcon_Gyarados, + gMonIcon_Lapras, + gMonIcon_Ditto, + gMonIcon_Eevee, + gMonIcon_Vaporeon, + gMonIcon_Jolteon, + gMonIcon_Flareon, + gMonIcon_Porygon, + gMonIcon_Omanyte, + gMonIcon_Omastar, + gMonIcon_Kabuto, + gMonIcon_Kabutops, + gMonIcon_Aerodactyl, + gMonIcon_Snorlax, + gMonIcon_Articuno, + gMonIcon_Zapdos, + gMonIcon_Moltres, + gMonIcon_Dratini, + gMonIcon_Dragonair, + gMonIcon_Dragonite, + gMonIcon_Mewtwo, + gMonIcon_Mew, + gMonIcon_Chikorita, + gMonIcon_Bayleef, + gMonIcon_Meganium, + gMonIcon_Cyndaquil, + gMonIcon_Quilava, + gMonIcon_Typhlosion, + gMonIcon_Totodile, + gMonIcon_Croconaw, + gMonIcon_Feraligatr, + gMonIcon_Sentret, + gMonIcon_Furret, + gMonIcon_Hoothoot, + gMonIcon_Noctowl, + gMonIcon_Ledyba, + gMonIcon_Ledian, + gMonIcon_Spinarak, + gMonIcon_Ariados, + gMonIcon_Crobat, + gMonIcon_Chinchou, + gMonIcon_Lanturn, + gMonIcon_Pichu, + gMonIcon_Cleffa, + gMonIcon_Igglybuff, + gMonIcon_Togepi, + gMonIcon_Togetic, + gMonIcon_Natu, + gMonIcon_Xatu, + gMonIcon_Mareep, + gMonIcon_Flaaffy, + gMonIcon_Ampharos, + gMonIcon_Bellossom, + gMonIcon_Marill, + gMonIcon_Azumarill, + gMonIcon_Sudowoodo, + gMonIcon_Politoed, + gMonIcon_Hoppip, + gMonIcon_Skiploom, + gMonIcon_Jumpluff, + gMonIcon_Aipom, + gMonIcon_Sunkern, + gMonIcon_Sunflora, + gMonIcon_Yanma, + gMonIcon_Wooper, + gMonIcon_Quagsire, + gMonIcon_Espeon, + gMonIcon_Umbreon, + gMonIcon_Murkrow, + gMonIcon_Slowking, + gMonIcon_Misdreavus, + gMonIcon_UnownA, + gMonIcon_Wobbuffet, + gMonIcon_Girafarig, + gMonIcon_Pineco, + gMonIcon_Forretress, + gMonIcon_Dunsparce, + gMonIcon_Gligar, + gMonIcon_Steelix, + gMonIcon_Snubbull, + gMonIcon_Granbull, + gMonIcon_Qwilfish, + gMonIcon_Scizor, + gMonIcon_Shuckle, + gMonIcon_Heracross, + gMonIcon_Sneasel, + gMonIcon_Teddiursa, + gMonIcon_Ursaring, + gMonIcon_Slugma, + gMonIcon_Magcargo, + gMonIcon_Swinub, + gMonIcon_Piloswine, + gMonIcon_Corsola, + gMonIcon_Remoraid, + gMonIcon_Octillery, + gMonIcon_Delibird, + gMonIcon_Mantine, + gMonIcon_Skarmory, + gMonIcon_Houndour, + gMonIcon_Houndoom, + gMonIcon_Kingdra, + gMonIcon_Phanpy, + gMonIcon_Donphan, + gMonIcon_Porygon2, + gMonIcon_Stantler, + gMonIcon_Smeargle, + gMonIcon_Tyrogue, + gMonIcon_Hitmontop, + gMonIcon_Smoochum, + gMonIcon_Elekid, + gMonIcon_Magby, + gMonIcon_Miltank, + gMonIcon_Blissey, + gMonIcon_Raikou, + gMonIcon_Entei, + gMonIcon_Suicune, + gMonIcon_Larvitar, + gMonIcon_Pupitar, + gMonIcon_Tyranitar, + gMonIcon_Lugia, + gMonIcon_HoOh, + gMonIcon_Celebi, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_Treecko, + gMonIcon_Grovyle, + gMonIcon_Sceptile, + gMonIcon_Torchic, + gMonIcon_Combusken, + gMonIcon_Blaziken, + gMonIcon_Mudkip, + gMonIcon_Marshtomp, + gMonIcon_Swampert, + gMonIcon_Poochyena, + gMonIcon_Mightyena, + gMonIcon_Zigzagoon, + gMonIcon_Linoone, + gMonIcon_Wurmple, + gMonIcon_Silcoon, + gMonIcon_Beautifly, + gMonIcon_Cascoon, + gMonIcon_Dustox, + gMonIcon_Lotad, + gMonIcon_Lombre, + gMonIcon_Ludicolo, + gMonIcon_Seedot, + gMonIcon_Nuzleaf, + gMonIcon_Shiftry, + gMonIcon_Nincada, + gMonIcon_Ninjask, + gMonIcon_Shedinja, + gMonIcon_Taillow, + gMonIcon_Swellow, + gMonIcon_Shroomish, + gMonIcon_Breloom, + gMonIcon_Spinda, + gMonIcon_Wingull, + gMonIcon_Pelipper, + gMonIcon_Surskit, + gMonIcon_Masquerain, + gMonIcon_Wailmer, + gMonIcon_Wailord, + gMonIcon_Skitty, + gMonIcon_Delcatty, + gMonIcon_Kecleon, + gMonIcon_Baltoy, + gMonIcon_Claydol, + gMonIcon_Nosepass, + gMonIcon_Torkoal, + gMonIcon_Sableye, + gMonIcon_Barboach, + gMonIcon_Whiscash, + gMonIcon_Luvdisc, + gMonIcon_Corphish, + gMonIcon_Crawdaunt, + gMonIcon_Feebas, + gMonIcon_Milotic, + gMonIcon_Carvanha, + gMonIcon_Sharpedo, + gMonIcon_Trapinch, + gMonIcon_Vibrava, + gMonIcon_Flygon, + gMonIcon_Makuhita, + gMonIcon_Hariyama, + gMonIcon_Electrike, + gMonIcon_Manectric, + gMonIcon_Numel, + gMonIcon_Camerupt, + gMonIcon_Spheal, + gMonIcon_Sealeo, + gMonIcon_Walrein, + gMonIcon_Cacnea, + gMonIcon_Cacturne, + gMonIcon_Snorunt, + gMonIcon_Glalie, + gMonIcon_Lunatone, + gMonIcon_Solrock, + gMonIcon_Azurill, + gMonIcon_Spoink, + gMonIcon_Grumpig, + gMonIcon_Plusle, + gMonIcon_Minun, + gMonIcon_Mawile, + gMonIcon_Meditite, + gMonIcon_Medicham, + gMonIcon_Swablu, + gMonIcon_Altaria, + gMonIcon_Wynaut, + gMonIcon_Duskull, + gMonIcon_Dusclops, + gMonIcon_Roselia, + gMonIcon_Slakoth, + gMonIcon_Vigoroth, + gMonIcon_Slaking, + gMonIcon_Gulpin, + gMonIcon_Swalot, + gMonIcon_Tropius, + gMonIcon_Whismur, + gMonIcon_Loudred, + gMonIcon_Exploud, + gMonIcon_Clamperl, + gMonIcon_Huntail, + gMonIcon_Gorebyss, + gMonIcon_Absol, + gMonIcon_Shuppet, + gMonIcon_Banette, + gMonIcon_Seviper, + gMonIcon_Zangoose, + gMonIcon_Relicanth, + gMonIcon_Aron, + gMonIcon_Lairon, + gMonIcon_Aggron, + gMonIcon_Castform, + gMonIcon_Volbeat, + gMonIcon_Illumise, + gMonIcon_Lileep, + gMonIcon_Cradily, + gMonIcon_Anorith, + gMonIcon_Armaldo, + gMonIcon_Ralts, + gMonIcon_Kirlia, + gMonIcon_Gardevoir, + gMonIcon_Bagon, + gMonIcon_Shelgon, + gMonIcon_Salamence, + gMonIcon_Beldum, + gMonIcon_Metang, + gMonIcon_Metagross, + gMonIcon_Regirock, + gMonIcon_Regice, + gMonIcon_Registeel, + gMonIcon_Kyogre, + gMonIcon_Groudon, + gMonIcon_Rayquaza, + gMonIcon_Latias, + gMonIcon_Latios, + gMonIcon_Jirachi, + gMonIcon_Deoxys, + gMonIcon_Chimecho, + gMonIcon_Egg, + gMonIcon_UnownB, + gMonIcon_UnownC, + gMonIcon_UnownD, + gMonIcon_UnownE, + gMonIcon_UnownF, + gMonIcon_UnownG, + gMonIcon_UnownH, + gMonIcon_UnownI, + gMonIcon_UnownJ, + gMonIcon_UnownK, + gMonIcon_UnownL, + gMonIcon_UnownM, + gMonIcon_UnownN, + gMonIcon_UnownO, + gMonIcon_UnownP, + gMonIcon_UnownQ, + gMonIcon_UnownR, + gMonIcon_UnownS, + gMonIcon_UnownT, + gMonIcon_UnownU, + gMonIcon_UnownV, + gMonIcon_UnownW, + gMonIcon_UnownX, + gMonIcon_UnownY, + gMonIcon_UnownZ, + gMonIcon_UnownExclamationMark, + gMonIcon_UnownQuestionMark, +}; + +const u8 gMonIconPaletteIndices[] = +{ + 0, // ?????????? + 1, // Bulbasaur + 1, // Ivysaur + 1, // Venusaur + 0, // Charmander + 0, // Charmeleon + 0, // Charizard + 0, // Squirtle + 2, // Wartortle + 2, // Blastoise + 1, // Caterpie + 1, // Metapod + 0, // Butterfree + 1, // Weedle + 2, // Kakuna + 2, // Beedrill + 0, // Pidgey + 0, // Pidgeotto + 0, // Pidgeot + 2, // Rattata + 1, // Raticate + 0, // Spearow + 0, // Fearow + 2, // Ekans + 2, // Arbok + 2, // Pikachu + 0, // Raichu + 2, // Sandshrew + 2, // Sandslash + 2, // Nidoran♀ + 2, // Nidorina + 2, // Nidoqueen + 2, // Nidoran♂ + 2, // Nidorino + 2, // Nidoking + 0, // Clefairy + 0, // Clefable + 2, // Vulpix + 1, // Ninetales + 0, // Jigglypuff + 0, // Wigglytuff + 2, // Zubat + 2, // Golbat + 1, // Oddish + 0, // Gloom + 0, // Vileplume + 0, // Paras + 0, // Parasect + 0, // Venonat + 2, // Venomoth + 2, // Diglett + 2, // Dugtrio + 1, // Meowth + 1, // Persian + 1, // Psyduck + 2, // Golduck + 1, // Mankey + 2, // Primeape + 0, // Growlithe + 0, // Arcanine + 0, // Poliwag + 0, // Poliwhirl + 0, // Poliwrath + 2, // Abra + 2, // Kadabra + 2, // Alakazam + 0, // Machop + 2, // Machoke + 0, // Machamp + 1, // Bellsprout + 1, // Weepinbell + 1, // Victreebel + 2, // Tentacool + 2, // Tentacruel + 1, // Geodude + 1, // Graveler + 1, // Golem + 0, // Ponyta + 0, // Rapidash + 0, // Slowpoke + 0, // Slowbro + 0, // Magnemite + 0, // Magneton + 1, // Farfetch'd + 2, // Doduo + 2, // Dodrio + 2, // Seel + 2, // Dewgong + 2, // Grimer + 2, // Muk + 2, // Shellder + 2, // Cloyster + 2, // Gastly + 2, // Haunter + 2, // Gengar + 2, // Onix + 2, // Drowzee + 1, // Hypno + 2, // Krabby + 2, // Kingler + 0, // Voltorb + 0, // Electrode + 0, // Exeggcute + 1, // Exeggutor + 1, // Cubone + 1, // Marowak + 2, // Hitmonlee + 2, // Hitmonchan + 1, // Lickitung + 2, // Koffing + 2, // Weezing + 1, // Rhyhorn + 1, // Rhydon + 0, // Chansey + 0, // Tangela + 1, // Kangaskhan + 0, // Horsea + 0, // Seadra + 0, // Goldeen + 0, // Seaking + 2, // Staryu + 2, // Starmie + 0, // Mr. mime + 1, // Scyther + 2, // Jynx + 1, // Electabuzz + 0, // Magmar + 2, // Pinsir + 2, // Tauros + 0, // Magikarp + 0, // Gyarados + 2, // Lapras + 2, // Ditto + 2, // Eevee + 0, // Vaporeon + 0, // Jolteon + 0, // Flareon + 0, // Porygon + 0, // Omanyte + 0, // Omastar + 2, // Kabuto + 2, // Kabutops + 0, // Aerodactyl + 1, // Snorlax + 0, // Articuno + 0, // Zapdos + 0, // Moltres + 0, // Dratini + 0, // Dragonair + 2, // Dragonite + 2, // Mewtwo + 0, // Mew + 1, // Chikorita + 1, // Bayleef + 1, // Meganium + 1, // Cyndaquil + 1, // Quilava + 1, // Typhlosion + 2, // Totodile + 2, // Croconaw + 2, // Feraligatr + 2, // Sentret + 2, // Furret + 2, // Hoothoot + 2, // Noctowl + 0, // Ledyba + 0, // Ledian + 1, // Spinarak + 0, // Ariados + 2, // Crobat + 2, // Chinchou + 0, // Lanturn + 0, // Pichu + 0, // Cleffa + 1, // Igglybuff + 2, // Togepi + 2, // Togetic + 0, // Natu + 0, // Xatu + 2, // Mareep + 0, // Flaaffy + 0, // Ampharos + 1, // Bellossom + 2, // Marill + 2, // Azumarill + 1, // Sudowoodo + 1, // Politoed + 1, // Hoppip + 1, // Skiploom + 2, // Jumpluff + 2, // Aipom + 1, // Sunkern + 1, // Sunflora + 1, // Yanma + 0, // Wooper + 0, // Quagsire + 2, // Espeon + 2, // Umbreon + 2, // Murkrow + 0, // Slowking + 0, // Misdreavus + 0, // Unown A + 0, // Wobbuffet + 1, // Girafarig + 0, // Pineco + 2, // Forretress + 2, // Dunsparce + 2, // Gligar + 0, // Steelix + 0, // Snubbull + 2, // Granbull + 0, // Qwilfish + 0, // Scizor + 1, // Shuckle + 2, // Heracross + 0, // Sneasel + 0, // Teddiursa + 2, // Ursaring + 0, // Slugma + 0, // Magcargo + 2, // Swinub + 2, // Piloswine + 0, // Corsola + 0, // Remoraid + 0, // Octillery + 0, // Delibird + 2, // Mantine + 0, // Skarmory + 0, // Houndour + 0, // Houndoom + 0, // Kingdra + 0, // Phanpy + 0, // Donphan + 0, // Porygon2 + 2, // Stantler + 1, // Smeargle + 2, // Tyrogue + 2, // Hitmontop + 1, // Smoochum + 1, // Elekid + 1, // Magby + 1, // Miltank + 1, // Blissey + 0, // Raikou + 2, // Entei + 0, // Suicune + 1, // Larvitar + 0, // Pupitar + 1, // Tyranitar + 0, // Lugia + 1, // Ho-Oh + 1, // Celebi + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 1, // Treecko + 0, // Grovyle + 1, // Sceptile + 0, // Torchic + 0, // Combusken + 0, // Blaziken + 0, // Mudkip + 0, // Marshtomp + 0, // Swampert + 2, // Poochyena + 2, // Mightyena + 2, // Zigzagoon + 2, // Linoone + 0, // Wurmple + 2, // Silcoon + 0, // Beautifly + 2, // Cascoon + 1, // Dustox + 1, // Lotad + 1, // Lombre + 1, // Ludicolo + 1, // Seedot + 1, // Nuzleaf + 0, // Shiftry + 1, // Nincada + 1, // Ninjask + 1, // Shedinja + 2, // Taillow + 2, // Swellow + 1, // Shroomish + 1, // Breloom + 1, // Spinda + 0, // Wingull + 0, // Pelipper + 2, // Surskit + 0, // Masquerain + 2, // Wailmer + 0, // Wailord + 0, // Skitty + 2, // Delcatty + 1, // Kecleon + 1, // Baltoy + 0, // Claydol + 0, // Nosepass + 1, // Torkoal + 2, // Sableye + 0, // Barboach + 0, // Whiscash + 0, // Luvdisc + 0, // Corphish + 0, // Crawdaunt + 2, // Feebas + 0, // Milotic + 0, // Carvanha + 0, // Sharpedo + 1, // Trapinch + 1, // Vibrava + 1, // Flygon + 2, // Makuhita + 1, // Hariyama + 1, // Electrike + 0, // Manectric + 1, // Numel + 0, // Camerupt + 2, // Spheal + 2, // Sealeo + 0, // Walrein + 1, // Cacnea + 1, // Cacturne + 2, // Snorunt + 0, // Glalie + 1, // Lunatone + 0, // Solrock + 2, // Azurill + 0, // Spoink + 2, // Grumpig + 0, // Plusle + 0, // Minun + 2, // Mawile + 0, // Meditite + 0, // Medicham + 0, // Swablu + 0, // Altaria + 0, // Wynaut + 0, // Duskull + 0, // Dusclops + 0, // Roselia + 2, // Slakoth + 2, // Vigoroth + 1, // Slaking + 1, // Gulpin + 2, // Swalot + 1, // Tropius + 0, // Whismur + 2, // Loudred + 2, // Exploud + 0, // Clamperl + 0, // Huntail + 0, // Gorebyss + 0, // Absol + 0, // Shuppet + 0, // Banette + 2, // Seviper + 0, // Zangoose + 1, // Relicanth + 2, // Aron + 2, // Lairon + 2, // Aggron + 0, // Castform + 0, // Volbeat + 2, // Illumise + 2, // Lileep + 0, // Cradily + 0, // Anorith + 0, // Armaldo + 1, // Ralts + 1, // Kirlia + 1, // Gardevoir + 2, // Bagon + 2, // Shelgon + 0, // Salamence + 0, // Beldum + 0, // Metang + 0, // Metagross + 2, // Regirock + 2, // Regice + 2, // Registeel + 2, // Kyogre + 0, // Groudon + 1, // Rayquaza + 0, // Latias + 2, // Latios + 0, // Jirachi + 0, // Deoxys + 0, // Chimecho + 1, // Egg + 0, // Unown B + 0, // Unown C + 0, // Unown D + 0, // Unown E + 0, // Unown F + 0, // Unown G + 0, // Unown H + 0, // Unown I + 0, // Unown J + 0, // Unown K + 0, // Unown L + 0, // Unown M + 0, // Unown N + 0, // Unown O + 0, // Unown P + 0, // Unown Q + 0, // Unown R + 0, // Unown S + 0, // Unown T + 0, // Unown U + 0, // Unown V + 0, // Unown W + 0, // Unown X + 0, // Unown Y + 0, // Unown Z + 0, // Unown Exclamation Mark + 0, // Unown Question Mark +}; + +const struct SpritePalette gMonIconPaletteTable[] = +{ + { gMonIconPalettes[0], POKE_ICON_BASE_PAL_TAG + 0 }, + { gMonIconPalettes[1], POKE_ICON_BASE_PAL_TAG + 1 }, + { gMonIconPalettes[2], POKE_ICON_BASE_PAL_TAG + 2 }, + +// There are only 3 actual palettes. The following are unused +// and don't point to valid data. + { gMonIconPalettes[3], POKE_ICON_BASE_PAL_TAG + 3 }, + { gMonIconPalettes[4], POKE_ICON_BASE_PAL_TAG + 4 }, + { gMonIconPalettes[5], POKE_ICON_BASE_PAL_TAG + 5 }, +}; + +static const struct OamData sMonIconOamData = +{ + .size = 2, + .priority = 1, +}; + +// fastest to slowest + +static const union AnimCmd sAnim_0[] = +{ + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_1[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_2[] = +{ + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_3[] = +{ + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_4[] = +{ + ANIMCMD_FRAME(0, 29), + ANIMCMD_FRAME(0, 29), // frame 0 is repeated + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd *const sMonIconAnims[] = +{ + sAnim_0, + sAnim_1, + sAnim_2, + sAnim_3, + sAnim_4, +}; + +static const union AffineAnimCmd sAffineAnim_0[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 0, 10), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sAffineAnim_1[] = +{ + AFFINEANIMCMD_FRAME(-2, -2, 0, 122), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const sMonIconAffineAnims[] = +{ + sAffineAnim_0, + sAffineAnim_1, +}; + +const u16 sSpriteImageSizes[3][4] = +{ + // square + { + 0x20, // 1×1 + 0x80, // 2×2 + 0x200, // 4×4 + 0x800, // 8×8 + }, + + // horizontal rectangle + { + 0x40, // 2×1 + 0x80, // 4×1 + 0x100, // 4×2 + 0x400, // 8×4 + }, + + // vertical rectangle + { + 0x40, // 1×2 + 0x80, // 1×4 + 0x100, // 2×4 + 0x400, // 4×8 + }, +}; + +u16 GetUnownLetterByPersonality(u32); +const u8 *GetMonIconPtr(u16, u32 personality); +u8 UpdateMonIconFrame(struct Sprite *); +u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8); +void sub_809D7E8(struct Sprite *); + +// duplicate of sub_809D3A4 +u8 unref_sub_809D26C(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) +{ + u8 spriteId; + struct MonIconSpriteTemplate iconTemplate; + struct MonIconSpriteTemplate *iconTemplatePtr = &iconTemplate; // needed to match + + iconTemplatePtr->oam = &sMonIconOamData; + iconTemplatePtr->image = gMonIconTable[species]; + iconTemplatePtr->anims = sMonIconAnims; + iconTemplatePtr->affineAnims = sMonIconAffineAnims; + iconTemplatePtr->callback = callback; + iconTemplatePtr->paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species]; + + spriteId = CreateMonIconSprite(iconTemplatePtr, x, y, subpriority); + + UpdateMonIconFrame(&gSprites[spriteId]); + + return spriteId; +} + +u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality) +{ + u8 spriteId; + struct MonIconSpriteTemplate iconTemplate = + { + .oam = &sMonIconOamData, + .image = GetMonIconPtr(species, personality), + .anims = sMonIconAnims, + .affineAnims = sMonIconAffineAnims, + .callback = callback, + .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], + }; + + if (species > SPECIES_EGG) + iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG; + + spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); + + UpdateMonIconFrame(&gSprites[spriteId]); + + return spriteId; +} + +u8 sub_809D3A4(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) +{ + u8 spriteId; + struct MonIconSpriteTemplate iconTemplate; + struct MonIconSpriteTemplate *iconTemplatePtr = &iconTemplate; // needed to match + + iconTemplatePtr->oam = &sMonIconOamData; + iconTemplatePtr->image = gMonIconTable[species]; + iconTemplatePtr->anims = sMonIconAnims; + iconTemplatePtr->affineAnims = sMonIconAffineAnims; + iconTemplatePtr->callback = callback; + iconTemplatePtr->paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species]; + + spriteId = CreateMonIconSprite(iconTemplatePtr, x, y, subpriority); + + UpdateMonIconFrame(&gSprites[spriteId]); + + return spriteId; +} + +u16 mon_icon_convert_unown_species_id(u16 species, u32 personality) +{ + u16 result; + + if (species == SPECIES_UNOWN) + { + u16 letter = GetUnownLetterByPersonality(personality); + if (letter == 0) + letter = SPECIES_UNOWN; + else + letter += (SPECIES_UNOWN_B - 1); + result = letter; + } + else + { + if (species > SPECIES_EGG) + result = 260; + else + result = species; + } + + return result; +} + +u16 GetUnownLetterByPersonality(u32 personality) +{ + return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C; +} + +u16 sub_809D4A8(u16 species) +{ + u16 value; + + if (MailSpeciesToSpecies(species, &value) == SPECIES_UNOWN) + { + if (value == 0) + value += SPECIES_UNOWN; + else + value += (SPECIES_UNOWN_B - 1); + return value; + } + else + { + return mon_icon_convert_unown_species_id(species, 0); + } +} + +const u8 *GetMonIconPtr(u16 species, u32 personality) +{ + u16 convertedSpecies = mon_icon_convert_unown_species_id(species, personality); + return gMonIconTable[convertedSpecies]; +} + +void sub_809D510(struct Sprite *sprite) +{ + sub_809D7E8(sprite); +} + +void sub_809D51C(void) +{ + u8 i; + for (i = 0; i < 6; i++) + LoadSpritePalette(&gMonIconPaletteTable[i]); +} + +// unused +void SafeLoadMonIconPalette(u16 species) +{ + u8 palIndex; + if (species > SPECIES_EGG) + species = 260; + palIndex = gMonIconPaletteIndices[species]; + if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) + LoadSpritePalette(&gMonIconPaletteTable[palIndex]); +} + +void sub_809D580(u16 species) +{ + u8 palIndex = gMonIconPaletteIndices[species]; + if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) + LoadSpritePalette(&gMonIconPaletteTable[palIndex]); +} + +// unused +void FreeMonIconPalettes(void) +{ + u8 i; + for (i = 0; i < 6; i++) + FreeSpritePaletteByTag(gMonIconPaletteTable[i].tag); +} + +// unused +void SafeFreeMonIconPalette(u16 species) +{ + u8 palIndex; + if (species > SPECIES_EGG) + species = 260; + palIndex = gMonIconPaletteIndices[species]; + FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); +} + +void sub_809D608(u16 species) +{ + u8 palIndex; + palIndex = gMonIconPaletteIndices[species]; + FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); +} + +void sub_809D62C(struct Sprite *sprite) +{ + UpdateMonIconFrame(sprite); +} + +// TODO: try to find a way to avoid using goto and asm statement +u8 UpdateMonIconFrame(struct Sprite *sprite) +{ + u8 result = 0; + + if (sprite->animDelayCounter == 0) + { + s16 frame = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; + + if (frame != -2) + { + if (frame != -1) + goto copy; + goto end; + } + + sprite->animCmdIndex = 0; + goto end; + + copy: + RequestSpriteCopy( + (u8 *)sprite->images + sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame, + (u8 *)OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP, + sSpriteImageSizes[sprite->oam.shape][sprite->oam.size]); + { + register u8 duration asm("r0") = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; + sprite->animDelayCounter = duration; + } + sprite->animCmdIndex++; + result = sprite->animCmdIndex; + } + else + { + sprite->animDelayCounter--; + } + +end: + return result; +} + +u8 CreateMonIconSprite(struct MonIconSpriteTemplate *iconTemplate, s16 x, s16 y, u8 subpriority) +{ + u8 spriteId; + + struct SpriteFrameImage image = { NULL, sSpriteImageSizes[iconTemplate->oam->shape][iconTemplate->oam->size] }; + + struct SpriteTemplate spriteTemplate = + { + .tileTag = 0xFFFF, + .paletteTag = iconTemplate->paletteTag, + .oam = iconTemplate->oam, + .anims = iconTemplate->anims, + .images = &image, + .affineAnims = iconTemplate->affineAnims, + .callback = iconTemplate->callback, + }; + + spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); + gSprites[spriteId].animPaused = TRUE; + gSprites[spriteId].animBeginning = FALSE; + gSprites[spriteId].images = (const struct SpriteFrameImage *)iconTemplate->image; + return spriteId; +} + +void sub_809D7E8(struct Sprite *sprite) +{ + struct SpriteFrameImage image = { NULL, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] }; + sprite->images = ℑ + DestroySprite(sprite); +} + +void sub_809D824(struct Sprite *sprite, u8 animNum) +{ + sprite->animNum = animNum; + sprite->animDelayCounter = 0; + sprite->animCmdIndex = 0; +} diff --git a/src/pokemon/pokemon_size_record.c b/src/pokemon/pokemon_size_record.c new file mode 100644 index 000000000..f2222bd3b --- /dev/null +++ b/src/pokemon/pokemon_size_record.c @@ -0,0 +1,217 @@ +#include "global.h" +#include "pokemon_size_record.h" +#include "data2.h" +#include "event_data.h" +#include "pokedex.h" +#include "species.h" +#include "string_util.h" +#include "strings2.h" +#include "text.h" + +struct UnknownStruct +{ + u16 unk0; + u8 unk2; + u16 unk4; +}; + +extern u16 gScriptResult; + +static const struct UnknownStruct sBigMonSizeTable[] = +{ + { 290, 1, 0 }, + { 300, 1, 10 }, + { 400, 2, 110 }, + { 500, 4, 310 }, + { 600, 20, 710 }, + { 700, 50, 2710 }, + { 800, 100, 7710 }, + { 900, 150, 17710 }, + { 1000, 150, 32710 }, + { 1100, 100, -17826 }, + { 1200, 50, -7826 }, + { 1300, 20, -2826 }, + { 1400, 5, -826 }, + { 1500, 2, -326 }, + { 1600, 1, -126 }, + { 1700, 1, -26 }, +}; + +#define CM_PER_INCH 2.54 + +static u32 GetMonSizeHash(struct Pokemon *pkmn) +{ + // UB: Too few arguments for function 'GetMonData' + u16 personality = GetMonData(pkmn, MON_DATA_PERSONALITY); + u16 hpIV = GetMonData(pkmn, MON_DATA_HP_IV) & 0xF; + u16 attackIV = GetMonData(pkmn, MON_DATA_ATK_IV) & 0xF; + u16 defenseIV = GetMonData(pkmn, MON_DATA_DEF_IV) & 0xF; + u16 speedIV = GetMonData(pkmn, MON_DATA_SPD_IV) & 0xF; + u16 spAtkIV = GetMonData(pkmn, MON_DATA_SPATK_IV) & 0xF; + u16 spDefIV = GetMonData(pkmn, MON_DATA_SPDEF_IV) & 0xF; + u32 hibyte = ((attackIV ^ defenseIV) * hpIV) ^ (personality & 0xFF); + u32 lobyte = ((spAtkIV ^ spDefIV) * speedIV) ^ (personality >> 8); + + return (hibyte << 8) + lobyte; +} + +static u8 TranslateBigMonSizeTableIndex(u16 a) +{ + u8 i; + + for (i = 1; i < 15; i++) + { + if (a < sBigMonSizeTable[i].unk4) + return i - 1; + } + return i; +} + +static u32 GetMonSize(u16 species, u16 b) +{ + u64 unk2; + u64 unk4; + u64 unk0; + u32 height; + u32 var; + + height = GetPokedexHeightWeight(SpeciesToNationalPokedexNum(species), 0); + var = TranslateBigMonSizeTableIndex(b); + unk0 = sBigMonSizeTable[var].unk0; + unk2 = sBigMonSizeTable[var].unk2; + unk4 = sBigMonSizeTable[var].unk4; + unk0 += (b - unk4) / unk2; + return height * unk0 / 10; +} + +static void FormatMonSizeRecord(u8 *string, u32 size) +{ +#if ENGLISH + u8 decimalPoint[] = _("."); +#elif GERMAN + u8 decimalPoint[] = _(","); +#endif + +#ifdef UNITS_IMPERIAL + //Convert size from centimeters to inches + size = (double)(size * 10) / (CM_PER_INCH * 10); +#endif + + string = ConvertIntToDecimalStringN(string, size / 10, 0, 8); + string = StringAppend(string, decimalPoint); + ConvertIntToDecimalStringN(string, size % 10, 0, 1); +} + +static u8 CompareMonSize(u16 species, u16 *sizeRecord) +{ + if (gScriptResult == 0xFF) + { + return 0; + } + else + { + struct Pokemon *pkmn = &gPlayerParty[gScriptResult]; + + // UB: Too few arguments for function 'GetMonData' + if (GetMonData(pkmn, MON_DATA_IS_EGG) == TRUE || GetMonData(pkmn, MON_DATA_SPECIES) != species) + { + return 1; + } + else + { + u32 oldSize; + u32 newSize; + u16 sizeParams; + + *(&sizeParams) = GetMonSizeHash(pkmn); + newSize = GetMonSize(species, sizeParams); + oldSize = GetMonSize(species, *sizeRecord); + FormatMonSizeRecord(gStringVar2, newSize); + if (newSize <= oldSize) + { + return 2; + } + else + { + *sizeRecord = sizeParams; + return 3; + } + } + } +} + +//Stores species name in gStringVar1, trainer's name in gStringVar2, and size in gStringVar3 +static void GetMonSizeRecordInfo(u16 species, u16 *sizeRecord) +{ + u32 size = GetMonSize(species, *sizeRecord); + + FormatMonSizeRecord(gStringVar3, size); + StringCopy(gStringVar1, gSpeciesNames[species]); + if (*sizeRecord == 0x8100) + StringCopy(gStringVar2, gOtherText_Marco); + else + StringCopy(gStringVar2, gSaveBlock2.playerName); +} + +void InitShroomishSizeRecord(void) +{ + VarSet(VAR_SHROOMISH_SIZE_RECORD, 0x8100); +} + +void GetShroomishSizeRecordInfo(void) +{ + u16 *sizeRecord = GetVarPointer(VAR_SHROOMISH_SIZE_RECORD); + + GetMonSizeRecordInfo(SPECIES_SHROOMISH, sizeRecord); +} + +void CompareShroomishSize(void) +{ + u16 *sizeRecord = GetVarPointer(VAR_SHROOMISH_SIZE_RECORD); + + gScriptResult = CompareMonSize(SPECIES_SHROOMISH, sizeRecord); +} + +void InitBarboachSizeRecord(void) +{ + VarSet(VAR_BARBOACH_SIZE_RECORD, 0x8100); +} + +void GetBarboachSizeRecordInfo(void) +{ + u16 *sizeRecord = GetVarPointer(VAR_BARBOACH_SIZE_RECORD); + + GetMonSizeRecordInfo(SPECIES_BARBOACH, sizeRecord); +} + +void CompareBarboachSize(void) +{ + u16 *sizeRecord = GetVarPointer(VAR_BARBOACH_SIZE_RECORD); + + gScriptResult = CompareMonSize(SPECIES_BARBOACH, sizeRecord); +} + +void GiveGiftRibbonToParty(u8 index, u8 ribbonId) +{ + s32 i; + bool32 gotRibbon = FALSE; + u8 data = 1; + u8 arr[] = { 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E }; + + if (index < 11 && ribbonId < 65) + { + gSaveBlock1.giftRibbons[index] = ribbonId; + for (i = 0; i < 6; i++) + { + struct Pokemon *pkmn = &gPlayerParty[i]; + + if (GetMonData(pkmn, MON_DATA_SPECIES) != 0 && GetMonData(pkmn, MON_DATA_SANITY_BIT3) == 0) + { + SetMonData(pkmn, arr[index], &data); + gotRibbon = TRUE; + } + } + if (gotRibbon) + FlagSet(SYS_RIBBON_GET); + } +} diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c new file mode 100644 index 000000000..5e97523e2 --- /dev/null +++ b/src/pokemon/pokemon_storage_system.c @@ -0,0 +1,99 @@ +#include "global.h" +#include "pokemon_storage_system.h" +#include "menu.h" +#include "string_util.h" + +struct StorageAction { + u8 *text; + u8 format; +}; + +extern const struct StorageAction gUnknown_083B6DF4[]; + +extern const u8 unk_2000000[]; + +EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; + +#define gUnk2002694 (u8 *)(&unk_2000000[0x2694]) +#define gUnk20026A6 (u8 *)(&unk_2000000[0x26a6]) +#define gUnk20011fa (u8 *)(&unk_2000000[0x11fa]) +#define gUnk20026e4 (u8 *)(&unk_2000000[0x26e4]) + +void sub_8098898(u8 index) { + u8 *ptr; + + MenuDrawTextWindow(10, 16, 29, 19); + + switch (gUnknown_083B6DF4[index].format) + { + + case 2: + ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); + ptr = StringCopy(ptr, gUnk20011fa); + break; + + case 5: + ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); + ptr = StringCopy(ptr, gUnk20026e4); + break; + + case 1: + // {var} + " is selected." + ptr = StringCopy(gUnk2002694, gUnk20011fa); + ptr = StringCopy(ptr, gUnknown_083B6DF4[index].text); + break; + + case 4: + // {var} + " was released." + ptr = StringCopy(gUnk2002694, gUnk20026e4); +#if ENGLISH + ptr = StringCopy(ptr, gUnknown_083B6DF4[index].text); +#elif GERMAN + ptr = de_sub_8073174(gUnk2002694, gUnknown_083B6DF4[index].text); +#endif + break; + + case 3: + { + u8 *stringLength; + u8 *text; + + text = gUnknown_083B6DF4[index].text; + stringLength = &text[StringLength(text)] + 1; + + ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); + ptr = StringCopy(ptr, gUnk20011fa); + ptr = StringCopy(ptr, stringLength); + } + break; + + case 6: + // "Bye-bye, ".substr(0, -1) + {var} + "Bye-bye, !".substr(-1, 1) + { + u8 *stringLength; + u8 *text; + + text = gUnknown_083B6DF4[index].text; + stringLength = &text[StringLength(text)] - 1; + + ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); + ptr = StringCopy(ptr - 1, gUnk20026e4); + ptr = StringCopy(ptr, stringLength); + } + break; + + case 0: + default: + ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); + break; + } + + while (ptr < gUnk20026A6) + { + ptr[0] = CHAR_SPACE; + ptr++; + } + + ptr[0] = EOS; + MenuPrint(gUnk2002694, 11, 17); +} diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c new file mode 100644 index 000000000..00a0bea29 --- /dev/null +++ b/src/pokemon/pokemon_summary_screen.c @@ -0,0 +1,180 @@ +#include "global.h" +#include "pokemon_summary_screen.h" +#include "link.h" +#include "menu.h" +#include "pokemon.h" +#include "region_map.h" +#include "string_util.h" +#include "strings2.h" +#include "tv.h" + +extern struct Pokemon *unk_2018000; + +bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon) +{ + u32 trainerId; + + if (unk_2018000 == gEnemyParty) + { + u8 enemyId = GetMultiplayerId() ^ 1; + trainerId = gLinkPlayers[enemyId].trainerId & 0xFFFF; + StringCopy(gStringVar1, gLinkPlayers[enemyId].name); + StripExtCtrlCodes(gStringVar1); + } + else + { + trainerId = GetPlayerTrainerId() & 0xFFFF; + StringCopy(gStringVar1, gSaveBlock2.playerName); + } + + if (trainerId != (GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF)) + return FALSE; + + GetMonData(mon, MON_DATA_OT_NAME, gStringVar2); + + if (!StringCompareWithoutExtCtrlCodes(gStringVar1, gStringVar2)) + return TRUE; + + return FALSE; +} + +void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 top) +{ + u8 locationMet; + u8 gameMet = GetMonData(mon, MON_DATA_MET_GAME); + + if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD)) + { + MenuPrint(gOtherText_EggObtainedInTrade, left, top); + return; + } + + locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); + + if (locationMet == 255) + { + MenuPrint(gOtherText_EggNicePlace, left, top); + return; + } + + if (!PokemonSummaryScreen_CheckOT(mon)) + { + MenuPrint(gOtherText_EggObtainedInTrade, left, top); + return; + } + + asm(""); // needed to match for some reason + + if (locationMet == 253) + { + MenuPrint(gOtherText_EggHotSprings, left, top); + return; + } + + MenuPrint(gOtherText_EggDayCare, left, top); +} + +void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 top) +{ + u8 locationMet; + u8 gameMet; + u8 *ptr = gStringVar4; + u8 nature = GetNature(pokemon); + +#if ENGLISH + ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14); + + if (nature != NATURE_BOLD && nature != NATURE_GENTLE) + { + ptr = StringCopy(ptr, gOtherText_Terminator4); + } + + ptr = StringCopy(ptr, gOtherText_Nature); +#elif GERMAN + ptr = StringCopy(gStringVar4, gOtherText_Nature); + ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14); + ptr = StringCopy(ptr, gOtherText_Terminator4); +#endif + + if (PokemonSummaryScreen_CheckOT(pokemon) == TRUE) + { + locationMet = GetMonData(pokemon, MON_DATA_MET_LOCATION); + + if (GetMonData(pokemon, MON_DATA_MET_LEVEL) == 0) + { + ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, 5); + *ptr = CHAR_NEWLINE; + ptr++; + + CopyLocationName(gStringVar1, locationMet); + ptr = sub_80A1E9C(ptr, gStringVar1, 14); + StringCopy(ptr, gOtherText_Egg2); + } + else if (locationMet >= 88) + { + *ptr = CHAR_NEWLINE; + ptr++; + + StringCopy(ptr, gOtherText_ObtainedInTrade); + } + else + { + u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL); + + ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); + *ptr = CHAR_NEWLINE; + ptr++; + + CopyLocationName(gStringVar1, locationMet); + ptr = sub_80A1E9C(ptr, gStringVar1, 14); + StringCopy(ptr, gOtherText_Met); + } + } + else + { + gameMet = GetMonData(pokemon, MON_DATA_MET_GAME); + + if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD)) + { + *ptr = CHAR_NEWLINE; + ptr++; + + StringCopy(ptr, gOtherText_ObtainedInTrade); + } + else + { + locationMet = GetMonData(pokemon, MON_DATA_MET_LOCATION); + if (locationMet == 0xFF) + { + u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL); + + ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); + *ptr = CHAR_NEWLINE; + ptr++; + + StringCopy(ptr, gOtherText_FatefulEncounter); + } + else if (locationMet >= 88) + { + *ptr = CHAR_NEWLINE; + ptr++; + + StringCopy(ptr, gOtherText_ObtainedInTrade); + } + else + { + u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL); + + ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); + *ptr = CHAR_NEWLINE; + ptr++; + + CopyLocationName(gStringVar1, locationMet); + ptr = sub_80A1E9C(ptr, gStringVar1, 14); + StringCopy(ptr, gOtherText_Met2); + } + } + } + + MenuPrint(gStringVar4, left++, top++); +} diff --git a/src/pokemon_1.c b/src/pokemon_1.c deleted file mode 100644 index c65bfa185..000000000 --- a/src/pokemon_1.c +++ /dev/null @@ -1,666 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "items.h" -#include "main.h" -#include "pokemon.h" -#include "rng.h" -#include "rom4.h" -#include "species.h" -#include "sprite.h" -#include "string_util.h" -#include "text.h" - -//Extracts the upper 16 bits of a 32-bit number -#define HIHALF(n) (((n) & 0xFFFF0000) >> 16) - -//Extracts the lower 16 bits of a 32-bit number -#define LOHALF(n) ((n) & 0xFFFF) - -extern u8 unk_2000000[]; -extern u16 word_2024E82; - -static EWRAM_DATA u8 byte_2024E88 = 0; - -u8 gPlayerPartyCount; -struct Pokemon gPlayerParty[6]; -u8 gEnemyPartyCount; -struct Pokemon gEnemyParty[6]; - -void ZeroBoxMonData(struct BoxPokemon *boxMon) -{ - u8 *raw = (u8 *)boxMon; - u32 i; - for (i = 0; i < sizeof(struct BoxPokemon); i++) - raw[i] = 0; -} - -void ZeroMonData(struct Pokemon *mon) -{ - u32 arg; - ZeroBoxMonData(&mon->box); - arg = 0; - SetMonData(mon, MON_DATA_STATUS, (u8 *)&arg); - SetMonData(mon, MON_DATA_LEVEL, (u8 *)&arg); - SetMonData(mon, MON_DATA_HP, (u8 *)&arg); - SetMonData(mon, MON_DATA_MAX_HP, (u8 *)&arg); - SetMonData(mon, MON_DATA_ATK, (u8 *)&arg); - SetMonData(mon, MON_DATA_DEF, (u8 *)&arg); - SetMonData(mon, MON_DATA_SPD, (u8 *)&arg); - SetMonData(mon, MON_DATA_SPATK, (u8 *)&arg); - SetMonData(mon, MON_DATA_SPDEF, (u8 *)&arg); - arg = 255; - SetMonData(mon, MON_DATA_MAIL, (u8 *)&arg); -} - -void ZeroPlayerPartyMons(void) -{ - s32 i; - for (i = 0; i < 6; i++) - ZeroMonData(&gPlayerParty[i]); -} - -void ZeroEnemyPartyMons(void) -{ - s32 i; - for (i = 0; i < 6; i++) - ZeroMonData(&gEnemyParty[i]); -} - -void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) -{ - u32 arg; - ZeroMonData(mon); - CreateBoxMon(&mon->box, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId); - SetMonData(mon, MON_DATA_LEVEL, &level); - arg = 255; - SetMonData(mon, MON_DATA_MAIL, (u8 *)&arg); - CalculateMonStats(mon); -} - -void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) -{ - u8 speciesName[POKEMON_NAME_LENGTH + 1]; - u32 personality; - u32 value; - u16 checksum; - - ZeroBoxMonData(boxMon); - - if (hasFixedPersonality) - personality = fixedPersonality; - else - personality = Random32(); - - SetBoxMonData(boxMon, MON_DATA_PERSONALITY, (u8 *)&personality); - - //Determine original trainer ID - if (otIdType == 2) //Pokemon cannot be shiny - { - u32 shinyValue; - do - { - value = Random32(); - shinyValue = HIHALF(value) ^ LOHALF(value) ^ HIHALF(personality) ^ LOHALF(personality); - } while (shinyValue < 8); - } - else if (otIdType == 1) //Pokemon has a preset OT ID - { - value = fixedOtId; - } - else //Player is the OT - { - value = gSaveBlock2.playerTrainerId[0] - | (gSaveBlock2.playerTrainerId[1] << 8) - | (gSaveBlock2.playerTrainerId[2] << 16) - | (gSaveBlock2.playerTrainerId[3] << 24); - } - - SetBoxMonData(boxMon, MON_DATA_OT_ID, (u8 *)&value); - - checksum = CalculateBoxMonChecksum(boxMon); - SetBoxMonData(boxMon, MON_DATA_CHECKSUM, (u8 *)&checksum); - EncryptBoxMon(boxMon); - GetSpeciesName(speciesName, species); - SetBoxMonData(boxMon, MON_DATA_NICKNAME, speciesName); - SetBoxMonData(boxMon, MON_DATA_LANGUAGE, &gGameLanguage); - SetBoxMonData(boxMon, MON_DATA_OT_NAME, gSaveBlock2.playerName); - SetBoxMonData(boxMon, MON_DATA_SPECIES, (u8 *)&species); - SetBoxMonData(boxMon, MON_DATA_EXP, (u8 *)&gExperienceTables[gBaseStats[species].growthRate][level]); - SetBoxMonData(boxMon, MON_DATA_FRIENDSHIP, &gBaseStats[species].friendship); - value = sav1_map_get_name(); - SetBoxMonData(boxMon, MON_DATA_MET_LOCATION, (u8 *)&value); - SetBoxMonData(boxMon, MON_DATA_MET_LEVEL, &level); - SetBoxMonData(boxMon, MON_DATA_MET_GAME, &gGameVersion); - value = 4; - SetBoxMonData(boxMon, MON_DATA_POKEBALL, (u8 *)&value); - SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2.playerGender); - - if (fixedIV < 32) - { - SetBoxMonData(boxMon, MON_DATA_HP_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_ATK_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_DEF_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_SPD_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &fixedIV); - } - else - { - u32 iv; - value = Random(); - - iv = value & 0x1F; - SetBoxMonData(boxMon, MON_DATA_HP_IV, (u8 *)&iv); - iv = (value & 0x3E0) >> 5; - SetBoxMonData(boxMon, MON_DATA_ATK_IV, (u8 *)&iv); - iv = (value & 0x7C00) >> 10; - SetBoxMonData(boxMon, MON_DATA_DEF_IV, (u8 *)&iv); - - value = Random(); - - iv = value & 0x1F; - SetBoxMonData(boxMon, MON_DATA_SPD_IV, (u8 *)&iv); - iv = (value & 0x3E0) >> 5; - SetBoxMonData(boxMon, MON_DATA_SPATK_IV, (u8 *)&iv); - iv = (value & 0x7C00) >> 10; - SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, (u8 *)&iv); - } - - if (gBaseStats[species].ability2) - { - value = personality & 1; - SetBoxMonData(boxMon, MON_DATA_ALT_ABILITY, (u8 *)&value); - } - - GiveBoxMonInitialMoveset(boxMon); -} - -void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature) -{ - u32 personality; - - do - { - personality = Random32(); - } - while (nature != GetNatureFromPersonality(personality)); - - CreateMon(mon, species, level, fixedIV, 1, personality, 0, 0); -} - -void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter) -{ - u32 personality; - - if ((u8)(unownLetter - 1) < 28) - { - u16 actualLetter; - - do - { - personality = Random32(); - actualLetter = ((((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 28); - } - while (nature != GetNatureFromPersonality(personality) - || gender != GetGenderFromSpeciesAndPersonality(species, personality) - || actualLetter != unownLetter - 1); - } - else - { - do - { - personality = Random32(); - } - while (nature != GetNatureFromPersonality(personality) - || gender != GetGenderFromSpeciesAndPersonality(species, personality)); - } - - CreateMon(mon, species, level, fixedIV, 1, personality, 0, 0); -} - -// This is only used to create Wally's Ralts. -void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level) -{ - u32 personality; - u32 otId; - - do - { - otId = Random32(); - personality = Random32(); - } - while (GetGenderFromSpeciesAndPersonality(species, personality) != MON_MALE); - CreateMon(mon, species, level, 32, 1, personality, 1, otId); -} - -void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality) -{ - CreateMon(mon, species, level, 0, 1, personality, 0, 0); - SetMonData(mon, MON_DATA_IVS, (u8 *)&ivs); - CalculateMonStats(mon); -} - -void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId) -{ - CreateMon(mon, species, level, 0, 0, 0, 1, otId); - SetMonData(mon, MON_DATA_HP_IV, &ivs[0]); - SetMonData(mon, MON_DATA_ATK_IV, &ivs[1]); - SetMonData(mon, MON_DATA_DEF_IV, &ivs[2]); - SetMonData(mon, MON_DATA_SPD_IV, &ivs[3]); - SetMonData(mon, MON_DATA_SPATK_IV, &ivs[4]); - SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[5]); - CalculateMonStats(mon); -} - -void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread) -{ - s32 i; - s32 statCount = 0; - u16 evAmount; - u8 temp; - - CreateMon(mon, species, level, fixedIV, 0, 0, 0, 0); - - temp = evSpread; - - for (i = 0; i < 6; i++) - { - if (temp & 1) - statCount++; - temp >>= 1; - } - - evAmount = 510 / statCount; - - temp = 1; - - for (i = 0; i < 6; i++) - { - if (evSpread & temp) - SetMonData(mon, MON_DATA_HP_EV + i, (u8 *)&evAmount); - temp <<= 1; - } - - CalculateMonStats(mon); -} - -void sub_803ADE8(struct Pokemon *mon, struct UnknownPokemonStruct *src) -{ - s32 i; - u8 nickname[POKEMON_NAME_LENGTH + 1]; - u8 language; - u8 value; - - CreateMon(mon, src->species, src->level, 0, 1, src->personality, 1, src->otId); - - for (i = 0; i < 4; i++) - SetMonMoveSlot(mon, src->moves[i], i); - - SetMonData(mon, MON_DATA_PP_BONUSES, (u8 *)&src->ppBonuses); - SetMonData(mon, MON_DATA_HELD_ITEM, (u8 *)&src->heldItem); - - StringCopy(nickname, src->nickname); - - if (nickname[0] == 0xFC && nickname[1] == 0x15) - language = LANGUAGE_JAPANESE; - else - language = GAME_LANGUAGE; - - SetMonData(mon, MON_DATA_LANGUAGE, &language); - StripExtCtrlCodes(nickname); - SetMonData(mon, MON_DATA_NICKNAME, nickname); - SetMonData(mon, MON_DATA_FRIENDSHIP, (u8 *)&src->friendship); - SetMonData(mon, MON_DATA_HP_EV, (u8 *)&src->hpEV); - SetMonData(mon, MON_DATA_ATK_EV, (u8 *)&src->attackEV); - SetMonData(mon, MON_DATA_DEF_EV, (u8 *)&src->defenseEV); - SetMonData(mon, MON_DATA_SPD_EV, (u8 *)&src->speedEV); - SetMonData(mon, MON_DATA_SPATK_EV, (u8 *)&src->spAttackEV); - SetMonData(mon, MON_DATA_SPDEF_EV, (u8 *)&src->spDefenseEV); - value = src->altAbility; - SetMonData(mon, MON_DATA_ALT_ABILITY, &value); - value = src->hpIV; - SetMonData(mon, MON_DATA_HP_IV, &value); - value = src->attackIV; - SetMonData(mon, MON_DATA_ATK_IV, &value); - value = src->defenseIV; - SetMonData(mon, MON_DATA_DEF_IV, &value); - value = src->speedIV; - SetMonData(mon, MON_DATA_SPD_IV, &value); - value = src->spAttackIV; - SetMonData(mon, MON_DATA_SPATK_IV, &value); - value = src->spDefenseIV; - SetMonData(mon, MON_DATA_SPDEF_IV, &value); - CalculateMonStats(mon); -} - -void sub_803AF78(struct Pokemon *mon, struct UnknownPokemonStruct *dest) -{ - s32 i; - u16 heldItem; - - dest->species = GetMonData(mon, MON_DATA_SPECIES, NULL); - heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); - - if (heldItem == ITEM_ENIGMA_BERRY) - heldItem = 0; - - dest->heldItem = heldItem; - - for (i = 0; i < 4; i++) - dest->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); - - dest->level = GetMonData(mon, MON_DATA_LEVEL, NULL); - dest->ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); - dest->otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - dest->hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); - dest->attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); - dest->defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); - dest->speedEV = GetMonData(mon, MON_DATA_SPD_EV, NULL); - dest->spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); - dest->spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); - dest->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); - dest->hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); - dest->attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); - dest->defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); - dest->speedIV = GetMonData(mon, MON_DATA_SPD_IV, NULL); - dest->spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); - dest->spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); - dest->altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL); - dest->personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - GetMonData(mon, MON_DATA_NICKNAME, dest->nickname); -} - -u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon) -{ - u16 checksum = 0; - union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0); - union PokemonSubstruct *substruct1 = GetSubstruct(boxMon, boxMon->personality, 1); - union PokemonSubstruct *substruct2 = GetSubstruct(boxMon, boxMon->personality, 2); - union PokemonSubstruct *substruct3 = GetSubstruct(boxMon, boxMon->personality, 3); - s32 i; - - for (i = 0; i < 6; i++) - checksum += substruct0->raw[i]; - - for (i = 0; i < 6; i++) - checksum += substruct1->raw[i]; - - for (i = 0; i < 6; i++) - checksum += substruct2->raw[i]; - - for (i = 0; i < 6; i++) - checksum += substruct3->raw[i]; - - return checksum; -} - -#define CALC_STAT(base, iv, ev, statIndex, field) \ -{ \ - u8 baseStat = gBaseStats[species].base; \ - s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \ - u8 nature = GetNature(mon); \ - n = nature_stat_mod(nature, n, statIndex); \ - SetMonData(mon, field, (u8 *)&n); \ -} - -void CalculateMonStats(struct Pokemon *mon) -{ - s32 oldMaxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL); - s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); - s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); - s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); - s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); - s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); - s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); - s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); - s32 speedIV = GetMonData(mon, MON_DATA_SPD_IV, NULL); - s32 speedEV = GetMonData(mon, MON_DATA_SPD_EV, NULL); - s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); - s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); - s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); - s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - s32 level = GetLevelFromMonExp(mon); - s32 newMaxHP; - - SetMonData(mon, MON_DATA_LEVEL, (u8 *)&level); - - if (species == SPECIES_SHEDINJA) - { - newMaxHP = 1; - } - else - { - s32 n = 2 * gBaseStats[species].baseHP + hpIV; - newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10; - } - - unk_2000000[0x160FA] = newMaxHP - oldMaxHP; - if (unk_2000000[0x160FA] == 0) - unk_2000000[0x160FA] = 1; - - SetMonData(mon, MON_DATA_MAX_HP, (u8 *)&newMaxHP); - - CALC_STAT(baseAttack, attackIV, attackEV, 1, MON_DATA_ATK) - CALC_STAT(baseDefense, defenseIV, defenseEV, 2, MON_DATA_DEF) - CALC_STAT(baseSpeed, speedIV, speedEV, 3, MON_DATA_SPD) - CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK) - CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF) - - if (species == SPECIES_SHEDINJA) - { - if (currentHP != 0 || oldMaxHP == 0) - currentHP = 1; - else - return; - } - else - { - if (currentHP == 0 && oldMaxHP == 0) - currentHP = newMaxHP; - else if (currentHP != 0) - currentHP += newMaxHP - oldMaxHP; - else - return; - } - - SetMonData(mon, MON_DATA_HP, (u8 *)¤tHP); -} - -void sub_803B4B4(struct Pokemon *src, struct Pokemon *dest) -{ - u32 value = 0; - memcpy(&dest->box, &src->box, sizeof(struct BoxPokemon)); - SetMonData(dest, MON_DATA_STATUS, (u8 *)&value); - SetMonData(dest, MON_DATA_HP, (u8 *)&value); - SetMonData(dest, MON_DATA_MAX_HP, (u8 *)&value); - value = 255; - SetMonData(dest, MON_DATA_MAIL, (u8 *)&value); - CalculateMonStats(dest); -} - -u8 GetLevelFromMonExp(struct Pokemon *mon) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u32 exp = GetMonData(mon, MON_DATA_EXP, NULL); - s32 level = 1; - - while (level <= 100 && gExperienceTables[gBaseStats[species].growthRate][level] <= exp) - level++; - - return level - 1; -} - -u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon) -{ - u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); - u32 exp = GetBoxMonData(boxMon, MON_DATA_EXP, NULL); - s32 level = 1; - - while (level <= 100 && gExperienceTables[gBaseStats[species].growthRate][level] <= exp) - level++; - - return level - 1; -} - -u16 GiveMoveToMon(struct Pokemon *mon, u16 move) -{ - return GiveMoveToBoxMon(&mon->box, move); -} - -u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) -{ - s32 i; - for (i = 0; i < 4; i++) - { - u16 existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, NULL); - if (!existingMove) - { - SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, (u8 *)&move); - SetBoxMonData(boxMon, MON_DATA_PP1 + i, &gBattleMoves[move].pp); - return move; - } - if (existingMove == move) - return -2; - } - return -1; -} - -u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move) -{ - s32 i; - - for (i = 0; i < 4; i++) - { - if (!mon->moves[i]) - { - mon->moves[i] = move; - mon->pp[i] = gBattleMoves[move].pp; - return move; - } - } - - return -1; -} - -void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot) -{ - SetMonData(mon, MON_DATA_MOVE1 + slot, (u8 *)&move); - SetMonData(mon, MON_DATA_PP1 + slot, &gBattleMoves[move].pp); -} - -void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot) -{ - mon->moves[slot] = move; - mon->pp[slot] = gBattleMoves[move].pp; -} - -void GiveMonInitialMoveset(struct Pokemon *mon) -{ - GiveBoxMonInitialMoveset(&mon->box); -} - -void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) -{ - u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); - s32 level = GetLevelFromBoxMonExp(boxMon); - s32 i; - - for (i = 0; gLevelUpLearnsets[species][i] != (u16)-1; i++) - { - u16 moveLevel; - u16 move; - - moveLevel = (gLevelUpLearnsets[species][i] & 0xFE00); - - if (moveLevel > (level << 9)) - break; - - move = (gLevelUpLearnsets[species][i] & 0x1FF); - - if (GiveMoveToBoxMon(boxMon, move) == (u16)-1) - DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, move); - } -} - -u16 sub_803B7C8(struct Pokemon *mon, u8 a2) -{ - u32 retVal = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); - - if (a2) - { - byte_2024E88 = retVal; - - while ((gLevelUpLearnsets[species][byte_2024E88] & 0xFE00) != (level << 9)) - { - byte_2024E88++; - if (gLevelUpLearnsets[species][byte_2024E88] == (u16)-1) - return 0; - } - } - - if ((gLevelUpLearnsets[species][byte_2024E88] & 0xFE00) == (level << 9)) - { - word_2024E82 = (gLevelUpLearnsets[species][byte_2024E88] & 0x1FF); - byte_2024E88++; - retVal = GiveMoveToMon(mon, word_2024E82); - } - - return retVal; -} - -void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move) -{ - s32 i; - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; - - for (i = 0; i < 3; i++) - { - moves[i] = GetMonData(mon, MON_DATA_MOVE2 + i, NULL); - pp[i] = GetMonData(mon, MON_DATA_PP2 + i, NULL); - } - - ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); - ppBonuses >>= 2; - moves[3] = move; - pp[3] = gBattleMoves[move].pp; - - for (i = 0; i < 4; i++) - { - SetMonData(mon, MON_DATA_MOVE1 + i, (u8 *)&moves[i]); - SetMonData(mon, MON_DATA_PP1 + i, &pp[i]); - } - - SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); -} - -void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) -{ - s32 i; - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; - - for (i = 0; i < 3; i++) - { - moves[i] = GetBoxMonData(boxMon, MON_DATA_MOVE2 + i, NULL); - pp[i] = GetBoxMonData(boxMon, MON_DATA_PP2 + i, NULL); - } - - ppBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, NULL); - ppBonuses >>= 2; - moves[3] = move; - pp[3] = gBattleMoves[move].pp; - - for (i = 0; i < 4; i++) - { - SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, (u8 *)&moves[i]); - SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp[i]); - } - - SetBoxMonData(boxMon, MON_DATA_PP_BONUSES, &ppBonuses); -} diff --git a/src/pokemon_2.c b/src/pokemon_2.c deleted file mode 100644 index a77edbdb2..000000000 --- a/src/pokemon_2.c +++ /dev/null @@ -1,1312 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "data2.h" -#include "event_data.h" -#include "main.h" -#include "pokemon.h" -#include "rng.h" -#include "rom_8077ABC.h" -#include "species.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "text.h" -#include "util.h" - -extern u8 gPlayerPartyCount; -extern u8 gEnemyPartyCount; - -extern u16 unk_20160BC[]; -extern struct SecretBaseRecord gSecretBaseRecord; -extern u32 dword_2017100[]; -extern u16 gBattleTypeFlags; -extern u8 gActiveBank; -extern struct BattlePokemon gBattleMons[4]; -extern u16 gCurrentMove; -extern u8 gLastUsedAbility; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u8 gAbsentBankFlags; -extern u8 gXXX_CritRelated; -extern u16 gBattleWeather; -extern struct BattleEnigmaBerry gEnigmaBerries[]; -extern u16 gBattleMovePower; -extern u16 gTrainerBattleOpponent; -extern struct PokemonStorage gPokemonStorage; - -EWRAM_DATA struct SpriteTemplate gUnknown_02024E8C = {0}; - -extern u8 gBadEggNickname[]; -extern const struct SpriteTemplate gSpriteTemplate_8208288[]; -//array of pointers to arrays of pointers to union AnimCmd (We probably need to typedef this.) -extern u8 gTrainerClassToPicIndex[]; -extern u8 gTrainerClassToNameIndex[]; -extern u8 gSecretBaseTrainerClasses[][5]; -extern u8 gUnknown_08208238[]; -extern u8 gUnknown_0820823C[]; -extern u8 gStatStageRatios[][2]; -extern u8 gHoldEffectToType[][2]; - -u8 CountAliveMons(u8 a1) -{ - s32 i; - u8 retVal = 0; - - switch (a1) - { - case 0: - for (i = 0; i < 4; i++) - { - if (i != gActiveBank && !(gAbsentBankFlags & gBitTable[i])) - retVal++; - } - break; - case 1: - for (i = 0; i < 4; i++) - { - if (GetBankSide(i) == GetBankSide(gBankAttacker) && !(gAbsentBankFlags & gBitTable[i])) - retVal++; - } - break; - case 2: - for (i = 0; i < 4; i++) - { - if (GetBankSide(i) == GetBankSide(gBankTarget) && !(gAbsentBankFlags & gBitTable[i])) - retVal++; - } - break; - } - - return retVal; -} - -#ifdef NONMATCHING -u8 sub_803C434(u8 a1) -{ - u32 status0 = GetBankIdentity(a1); - register u8 status_ asm("r4"); - u8 status; - register u32 mask1 asm("r1") = 1; - register u32 mask2 asm("r6") = 1; - - status_ = mask2; - status_ &= status0; - status = status_ ^ mask1; - - { - register u16 val_ asm("r1") = gBattleTypeFlags; - u32 val = mask2; - val &= val_; - if (!val) - { - return GetBankByPlayerAI(status); - } - } - - if (CountAliveMons(0) > 1) - { - u16 r = Random(); - register u32 val asm("r1") = mask2; - val &= r; - if (!val) - { - u32 status2 = 2; - status2 ^= status; - return GetBankByPlayerAI(status2); - } - else - { - return GetBankByPlayerAI(status); - } - } - else - { - if (gAbsentBankFlags & gBitTable[status]) - return GetBankByPlayerAI(status ^ 2); - else - return GetBankByPlayerAI(status); - } -} -#else -__attribute__((naked)) -u8 sub_803C434(u8 a1) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetBankIdentity\n\ - movs r1, 0x1\n\ - movs r6, 0x1\n\ - adds r4, r6, 0\n\ - ands r4, r0\n\ - eors r4, r1\n\ - adds r5, r4, 0\n\ - ldr r0, _0803C45C\n\ - ldrh r1, [r0]\n\ - adds r0, r6, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0803C460\n\ - adds r0, r4, 0\n\ - b _0803C4AA\n\ - .align 2, 0\n\ -_0803C45C: .4byte gBattleTypeFlags\n\ -_0803C460:\n\ - movs r0, 0\n\ - bl CountAliveMons\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bls _0803C484\n\ - bl Random\n\ - adds r1, r6, 0\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _0803C480\n\ - movs r0, 0x2\n\ - eors r0, r4\n\ - b _0803C4AA\n\ -_0803C480:\n\ - adds r0, r4, 0\n\ - b _0803C4AA\n\ -_0803C484:\n\ - ldr r0, _0803C49C\n\ - ldrb r1, [r0]\n\ - ldr r2, _0803C4A0\n\ - lsls r0, r4, 2\n\ - adds r0, r2\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _0803C4A4\n\ - adds r0, r4, 0\n\ - b _0803C4AA\n\ - .align 2, 0\n\ -_0803C49C: .4byte gAbsentBankFlags\n\ -_0803C4A0: .4byte gBitTable\n\ -_0803C4A4:\n\ - movs r0, 0x2\n\ - eors r5, r0\n\ - adds r0, r5, 0\n\ -_0803C4AA:\n\ - bl GetBankByPlayerAI\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - pop {r4-r6}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} -#endif - -u8 GetMonGender(struct Pokemon *mon) -{ - return GetBoxMonGender(&mon->box); -} - -u8 GetBoxMonGender(struct BoxPokemon *boxMon) -{ - u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); - u32 personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY, NULL); - - switch (gBaseStats[species].genderRatio) - { - case MON_MALE: - case MON_FEMALE: - case MON_GENDERLESS: - return gBaseStats[species].genderRatio; - } - - if (gBaseStats[species].genderRatio > (personality & 0xFF)) - return MON_FEMALE; - else - return MON_MALE; -} - -u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality) -{ - switch (gBaseStats[species].genderRatio) - { - case MON_MALE: - case MON_FEMALE: - case MON_GENDERLESS: - return gBaseStats[species].genderRatio; - } - - if (gBaseStats[species].genderRatio > (personality & 0xFF)) - return MON_FEMALE; - else - return MON_MALE; -} - -void GetMonSpriteTemplate_803C56C(u16 species, u8 a2) -{ - gUnknown_02024E8C = gSpriteTemplate_8208288[a2]; - gUnknown_02024E8C.paletteTag = species; - gUnknown_02024E8C.anims = (const union AnimCmd *const *)gSpriteAnimTable_81E7C64; //Why do I have to cast this? -} - -void GetMonSpriteTemplate_803C5A0(u16 species, u8 a2) -{ - gUnknown_02024E8C = gSpriteTemplate_8208288[a2]; - gUnknown_02024E8C.paletteTag = species; - if (a2 == 0 || a2 == 2) - gUnknown_02024E8C.anims = gUnknown_081ECACC[species]; - else - gUnknown_02024E8C.anims = gUnknown_081EC2A4[species]; -} - -void EncryptBoxMon(struct BoxPokemon *boxMon) -{ - u32 i; - for (i = 0; i < 12; i++) - { - boxMon->secure.raw[i] ^= boxMon->personality; - boxMon->secure.raw[i] ^= boxMon->otId; - } -} - -void DecryptBoxMon(struct BoxPokemon *boxMon) -{ - u32 i; - for (i = 0; i < 12; i++) - { - boxMon->secure.raw[i] ^= boxMon->otId; - boxMon->secure.raw[i] ^= boxMon->personality; - } -} - -#define SUBSTRUCT_CASE(n, v1, v2, v3, v4) \ -case n: \ - switch (substructType) \ - { \ - case 0: \ - substruct = &substructs ## n [v1]; \ - break; \ - case 1: \ - substruct = &substructs ## n [v2]; \ - break; \ - case 2: \ - substruct = &substructs ## n [v3]; \ - break; \ - case 3: \ - substruct = &substructs ## n [v4]; \ - break; \ - } \ - break; - -union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType) -{ - union PokemonSubstruct *substruct = NULL; - - union PokemonSubstruct *substructs0 = boxMon->secure.substructs; - union PokemonSubstruct *substructs1 = boxMon->secure.substructs; - union PokemonSubstruct *substructs2 = boxMon->secure.substructs; - union PokemonSubstruct *substructs3 = boxMon->secure.substructs; - union PokemonSubstruct *substructs4 = boxMon->secure.substructs; - union PokemonSubstruct *substructs5 = boxMon->secure.substructs; - union PokemonSubstruct *substructs6 = boxMon->secure.substructs; - union PokemonSubstruct *substructs7 = boxMon->secure.substructs; - union PokemonSubstruct *substructs8 = boxMon->secure.substructs; - union PokemonSubstruct *substructs9 = boxMon->secure.substructs; - union PokemonSubstruct *substructs10 = boxMon->secure.substructs; - union PokemonSubstruct *substructs11 = boxMon->secure.substructs; - union PokemonSubstruct *substructs12 = boxMon->secure.substructs; - union PokemonSubstruct *substructs13 = boxMon->secure.substructs; - union PokemonSubstruct *substructs14 = boxMon->secure.substructs; - union PokemonSubstruct *substructs15 = boxMon->secure.substructs; - union PokemonSubstruct *substructs16 = boxMon->secure.substructs; - union PokemonSubstruct *substructs17 = boxMon->secure.substructs; - union PokemonSubstruct *substructs18 = boxMon->secure.substructs; - union PokemonSubstruct *substructs19 = boxMon->secure.substructs; - union PokemonSubstruct *substructs20 = boxMon->secure.substructs; - union PokemonSubstruct *substructs21 = boxMon->secure.substructs; - union PokemonSubstruct *substructs22 = boxMon->secure.substructs; - union PokemonSubstruct *substructs23 = boxMon->secure.substructs; - - switch (personality % 24) - { - SUBSTRUCT_CASE( 0,0,1,2,3) - SUBSTRUCT_CASE( 1,0,1,3,2) - SUBSTRUCT_CASE( 2,0,2,1,3) - SUBSTRUCT_CASE( 3,0,3,1,2) - SUBSTRUCT_CASE( 4,0,2,3,1) - SUBSTRUCT_CASE( 5,0,3,2,1) - SUBSTRUCT_CASE( 6,1,0,2,3) - SUBSTRUCT_CASE( 7,1,0,3,2) - SUBSTRUCT_CASE( 8,2,0,1,3) - SUBSTRUCT_CASE( 9,3,0,1,2) - SUBSTRUCT_CASE(10,2,0,3,1) - SUBSTRUCT_CASE(11,3,0,2,1) - SUBSTRUCT_CASE(12,1,2,0,3) - SUBSTRUCT_CASE(13,1,3,0,2) - SUBSTRUCT_CASE(14,2,1,0,3) - SUBSTRUCT_CASE(15,3,1,0,2) - SUBSTRUCT_CASE(16,2,3,0,1) - SUBSTRUCT_CASE(17,3,2,0,1) - SUBSTRUCT_CASE(18,1,2,3,0) - SUBSTRUCT_CASE(19,1,3,2,0) - SUBSTRUCT_CASE(20,2,1,3,0) - SUBSTRUCT_CASE(21,3,1,2,0) - SUBSTRUCT_CASE(22,2,3,1,0) - SUBSTRUCT_CASE(23,3,2,1,0) - } - - return substruct; -} - -u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data) -{ - switch (field) - { - case MON_DATA_STATUS: - return mon->status; - case MON_DATA_LEVEL: - return mon->level; - case MON_DATA_HP: - return mon->hp; - case MON_DATA_MAX_HP: - return mon->maxHP; - case MON_DATA_ATK: - return mon->attack; - case MON_DATA_DEF: - return mon->defense; - case MON_DATA_SPD: - return mon->speed; - case MON_DATA_SPATK: - return mon->spAttack; - case MON_DATA_SPDEF: - return mon->spDefense; - case MON_DATA_MAIL: - return mon->mail; - default: - return GetBoxMonData(&mon->box, field, data); - } -} - -u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) -{ - u32 retVal = 0; - struct PokemonSubstruct0 *substruct0 = NULL; - struct PokemonSubstruct1 *substruct1 = NULL; - struct PokemonSubstruct2 *substruct2 = NULL; - struct PokemonSubstruct3 *substruct3 = NULL; - - if (field > MON_DATA_10) - { - substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); - substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); - substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); - substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); - - DecryptBoxMon(boxMon); - - if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) - { - boxMon->isBadEgg = 1; - boxMon->isEgg = 1; - substruct3->isEgg = 1; - } - } - - switch (field) - { - case MON_DATA_PERSONALITY: - retVal = boxMon->personality; - break; - case MON_DATA_OT_ID: - retVal = boxMon->otId; - break; - case MON_DATA_NICKNAME: - { - if (boxMon->isBadEgg) - { - StringCopy(data, gBadEggNickname); - retVal = StringLength(data); - } - else if (boxMon->isEgg) - { - StringCopy(data, gEggNickname); - retVal = StringLength(data); - } - else - { - retVal = 0; - - while (retVal < POKEMON_NAME_LENGTH && boxMon->nickname[retVal] != EOS) - { - data[retVal] = boxMon->nickname[retVal]; - retVal++; - } - - data[retVal] = EOS; - ConvertInternationalString(data, boxMon->language); - retVal = StringLength(data); - } - break; - } - case MON_DATA_LANGUAGE: - retVal = boxMon->language; - break; - case MON_DATA_SANITY_BIT1: - retVal = boxMon->isBadEgg; - break; - case MON_DATA_SANITY_BIT2: - retVal = boxMon->hasSpecies; - break; - case MON_DATA_SANITY_BIT3: - retVal = boxMon->isEgg; - break; - case MON_DATA_OT_NAME: - { - retVal = 0; - - while (retVal < OT_NAME_LENGTH && boxMon->otName[retVal] != EOS) - { - data[retVal] = boxMon->otName[retVal]; - retVal++; - } - - data[retVal] = EOS; - break; - } - case MON_DATA_MARKINGS: - retVal = boxMon->markings; - break; - case MON_DATA_CHECKSUM: - retVal = boxMon->checksum; - break; - case MON_DATA_10: - retVal = boxMon->unknown; - break; - case MON_DATA_SPECIES: - retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species; - break; - case MON_DATA_HELD_ITEM: - retVal = substruct0->heldItem; - break; - case MON_DATA_EXP: - retVal = substruct0->experience; - break; - case MON_DATA_PP_BONUSES: - retVal = substruct0->ppBonuses; - break; - case MON_DATA_FRIENDSHIP: - retVal = substruct0->friendship; - break; - case MON_DATA_MOVE1: - case MON_DATA_MOVE2: - case MON_DATA_MOVE3: - case MON_DATA_MOVE4: - retVal = substruct1->moves[field - MON_DATA_MOVE1]; - break; - case MON_DATA_PP1: - case MON_DATA_PP2: - case MON_DATA_PP3: - case MON_DATA_PP4: - retVal = substruct1->pp[field - MON_DATA_PP1]; - break; - case MON_DATA_HP_EV: - retVal = substruct2->hpEV; - break; - case MON_DATA_ATK_EV: - retVal = substruct2->attackEV; - break; - case MON_DATA_DEF_EV: - retVal = substruct2->defenseEV; - break; - case MON_DATA_SPD_EV: - retVal = substruct2->speedEV; - break; - case MON_DATA_SPATK_EV: - retVal = substruct2->spAttackEV; - break; - case MON_DATA_SPDEF_EV: - retVal = substruct2->spDefenseEV; - break; - case MON_DATA_COOL: - retVal = substruct2->cool; - break; - case MON_DATA_BEAUTY: - retVal = substruct2->beauty; - break; - case MON_DATA_CUTE: - retVal = substruct2->cute; - break; - case MON_DATA_SMART: - retVal = substruct2->smart; - break; - case MON_DATA_TOUGH: - retVal = substruct2->tough; - break; - case MON_DATA_SHEEN: - retVal = substruct2->sheen; - break; - case MON_DATA_POKERUS: - retVal = substruct3->pokerus; - break; - case MON_DATA_MET_LOCATION: - retVal = substruct3->metLocation; - break; - case MON_DATA_MET_LEVEL: - retVal = substruct3->metLevel; - break; - case MON_DATA_MET_GAME: - retVal = substruct3->metGame; - break; - case MON_DATA_POKEBALL: - retVal = substruct3->pokeball; - break; - case MON_DATA_OT_GENDER: - retVal = substruct3->otGender; - break; - case MON_DATA_HP_IV: - retVal = substruct3->hpIV; - break; - case MON_DATA_ATK_IV: - retVal = substruct3->attackIV; - break; - case MON_DATA_DEF_IV: - retVal = substruct3->defenseIV; - break; - case MON_DATA_SPD_IV: - retVal = substruct3->speedIV; - break; - case MON_DATA_SPATK_IV: - retVal = substruct3->spAttackIV; - break; - case MON_DATA_SPDEF_IV: - retVal = substruct3->spDefenseIV; - break; - case MON_DATA_IS_EGG: - retVal = substruct3->isEgg; - break; - case MON_DATA_ALT_ABILITY: - retVal = substruct3->altAbility; - break; - case MON_DATA_COOL_RIBBON: - retVal = substruct3->coolRibbon; - break; - case MON_DATA_BEAUTY_RIBBON: - retVal = substruct3->beautyRibbon; - break; - case MON_DATA_CUTE_RIBBON: - retVal = substruct3->cuteRibbon; - break; - case MON_DATA_SMART_RIBBON: - retVal = substruct3->smartRibbon; - break; - case MON_DATA_TOUGH_RIBBON: - retVal = substruct3->toughRibbon; - break; - case MON_DATA_CHAMPION_RIBBON: - retVal = substruct3->championRibbon; - break; - case MON_DATA_WINNING_RIBBON: - retVal = substruct3->winningRibbon; - break; - case MON_DATA_VICTORY_RIBBON: - retVal = substruct3->victoryRibbon; - break; - case MON_DATA_ARTIST_RIBBON: - retVal = substruct3->artistRibbon; - break; - case MON_DATA_EFFORT_RIBBON: - retVal = substruct3->effortRibbon; - break; - case MON_DATA_GIFT_RIBBON_1: - retVal = substruct3->giftRibbon1; - break; - case MON_DATA_GIFT_RIBBON_2: - retVal = substruct3->giftRibbon2; - break; - case MON_DATA_GIFT_RIBBON_3: - retVal = substruct3->giftRibbon3; - break; - case MON_DATA_GIFT_RIBBON_4: - retVal = substruct3->giftRibbon4; - break; - case MON_DATA_GIFT_RIBBON_5: - retVal = substruct3->giftRibbon5; - break; - case MON_DATA_GIFT_RIBBON_6: - retVal = substruct3->giftRibbon6; - break; - case MON_DATA_GIFT_RIBBON_7: - retVal = substruct3->giftRibbon7; - break; - case MON_DATA_FATEFUL_ENCOUNTER: - retVal = substruct3->fatefulEncounter; - break; - case MON_DATA_SPECIES2: - retVal = substruct0->species; - if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg)) - retVal = SPECIES_EGG; - break; - case MON_DATA_IVS: - retVal = substruct3->hpIV | (substruct3->attackIV << 5) | (substruct3->defenseIV << 10) | (substruct3->speedIV << 15) | (substruct3->spAttackIV << 20) | (substruct3->spDefenseIV << 25); - break; - case MON_DATA_KNOWN_MOVES: - if (substruct0->species && !substruct3->isEgg) - { - u16 *moves = (u16 *)data; - s32 i = 0; - - while (moves[i] != 355) - { - u16 move = moves[i]; - if (substruct1->moves[0] == move - || substruct1->moves[1] == move - || substruct1->moves[2] == move - || substruct1->moves[3] == move) - retVal |= gBitTable[i]; - i++; - } - } - break; - case MON_DATA_RIBBON_COUNT: - retVal = 0; - if (substruct0->species && !substruct3->isEgg) - { - retVal += substruct3->coolRibbon; - retVal += substruct3->beautyRibbon; - retVal += substruct3->cuteRibbon; - retVal += substruct3->smartRibbon; - retVal += substruct3->toughRibbon; - retVal += substruct3->championRibbon; - retVal += substruct3->winningRibbon; - retVal += substruct3->victoryRibbon; - retVal += substruct3->artistRibbon; - retVal += substruct3->effortRibbon; - retVal += substruct3->giftRibbon1; - retVal += substruct3->giftRibbon2; - retVal += substruct3->giftRibbon3; - retVal += substruct3->giftRibbon4; - retVal += substruct3->giftRibbon5; - retVal += substruct3->giftRibbon6; - retVal += substruct3->giftRibbon7; - } - break; - case MON_DATA_RIBBONS: - retVal = 0; - if (substruct0->species && !substruct3->isEgg) - { - retVal = substruct3->championRibbon - | (substruct3->coolRibbon << 1) - | (substruct3->beautyRibbon << 4) - | (substruct3->cuteRibbon << 7) - | (substruct3->smartRibbon << 10) - | (substruct3->toughRibbon << 13) - | (substruct3->winningRibbon << 16) - | (substruct3->victoryRibbon << 17) - | (substruct3->artistRibbon << 18) - | (substruct3->effortRibbon << 19) - | (substruct3->giftRibbon1 << 20) - | (substruct3->giftRibbon2 << 21) - | (substruct3->giftRibbon3 << 22) - | (substruct3->giftRibbon4 << 23) - | (substruct3->giftRibbon5 << 24) - | (substruct3->giftRibbon6 << 25) - | (substruct3->giftRibbon7 << 26); - } - break; - default: - break; - } - - if (field > MON_DATA_10) - EncryptBoxMon(boxMon); - - return retVal; -} - -#define SET8(lhs) (lhs) = *data -#define SET16(lhs) (lhs) = data[0] + (data[1] << 8) -#define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24) - -void SetMonData(struct Pokemon *mon, s32 field, const u8 *data) -{ - switch (field) - { - case MON_DATA_STATUS: - SET32(mon->status); - break; - case MON_DATA_LEVEL: - SET8(mon->level); - break; - case MON_DATA_HP: - SET16(mon->hp); - break; - case MON_DATA_MAX_HP: - SET16(mon->maxHP); - break; - case MON_DATA_ATK: - SET16(mon->attack); - break; - case MON_DATA_DEF: - SET16(mon->defense); - break; - case MON_DATA_SPD: - SET16(mon->speed); - break; - case MON_DATA_SPATK: - SET16(mon->spAttack); - break; - case MON_DATA_SPDEF: - SET16(mon->spDefense); - break; - case MON_DATA_MAIL: - SET8(mon->mail); - break; - case MON_DATA_SPECIES2: - break; - default: - SetBoxMonData(&mon->box, field, data); - break; - } -} - -void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const u8 *data) -{ - struct PokemonSubstruct0 *substruct0 = NULL; - struct PokemonSubstruct1 *substruct1 = NULL; - struct PokemonSubstruct2 *substruct2 = NULL; - struct PokemonSubstruct3 *substruct3 = NULL; - - if (field > MON_DATA_10) - { - substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); - substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); - substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); - substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); - - DecryptBoxMon(boxMon); - - if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) - { - boxMon->isBadEgg = 1; - boxMon->isEgg = 1; - substruct3->isEgg = 1; - EncryptBoxMon(boxMon); - return; - } - } - - switch (field) - { - case MON_DATA_PERSONALITY: - SET32(boxMon->personality); - break; - case MON_DATA_OT_ID: - SET32(boxMon->otId); - break; - case MON_DATA_NICKNAME: - { - s32 i; - for (i = 0; i < POKEMON_NAME_LENGTH; i++) - boxMon->nickname[i] = data[i]; - break; - } - case MON_DATA_LANGUAGE: - SET8(boxMon->language); - break; - case MON_DATA_SANITY_BIT1: - SET8(boxMon->isBadEgg); - break; - case MON_DATA_SANITY_BIT2: - SET8(boxMon->hasSpecies); - break; - case MON_DATA_SANITY_BIT3: - SET8(boxMon->isEgg); - break; - case MON_DATA_OT_NAME: - { - s32 i; - for (i = 0; i < OT_NAME_LENGTH; i++) - boxMon->otName[i] = data[i]; - break; - } - case MON_DATA_MARKINGS: - SET8(boxMon->markings); - break; - case MON_DATA_CHECKSUM: - SET16(boxMon->checksum); - break; - case MON_DATA_10: - SET16(boxMon->unknown); - break; - case MON_DATA_SPECIES: - { - SET16(substruct0->species); - if (substruct0->species) - boxMon->hasSpecies = 1; - else - boxMon->hasSpecies = 0; - break; - } - case MON_DATA_HELD_ITEM: - SET16(substruct0->heldItem); - break; - case MON_DATA_EXP: - SET32(substruct0->experience); - break; - case MON_DATA_PP_BONUSES: - SET8(substruct0->ppBonuses); - break; - case MON_DATA_FRIENDSHIP: - SET8(substruct0->friendship); - break; - case MON_DATA_MOVE1: - case MON_DATA_MOVE2: - case MON_DATA_MOVE3: - case MON_DATA_MOVE4: - SET16(substruct1->moves[field - MON_DATA_MOVE1]); - break; - case MON_DATA_PP1: - case MON_DATA_PP2: - case MON_DATA_PP3: - case MON_DATA_PP4: - SET8(substruct1->pp[field - MON_DATA_PP1]); - break; - case MON_DATA_HP_EV: - SET8(substruct2->hpEV); - break; - case MON_DATA_ATK_EV: - SET8(substruct2->attackEV); - break; - case MON_DATA_DEF_EV: - SET8(substruct2->defenseEV); - break; - case MON_DATA_SPD_EV: - SET8(substruct2->speedEV); - break; - case MON_DATA_SPATK_EV: - SET8(substruct2->spAttackEV); - break; - case MON_DATA_SPDEF_EV: - SET8(substruct2->spDefenseEV); - break; - case MON_DATA_COOL: - SET8(substruct2->cool); - break; - case MON_DATA_BEAUTY: - SET8(substruct2->beauty); - break; - case MON_DATA_CUTE: - SET8(substruct2->cute); - break; - case MON_DATA_SMART: - SET8(substruct2->smart); - break; - case MON_DATA_TOUGH: - SET8(substruct2->tough); - break; - case MON_DATA_SHEEN: - SET8(substruct2->sheen); - break; - case MON_DATA_POKERUS: - SET8(substruct3->pokerus); - break; - case MON_DATA_MET_LOCATION: - SET8(substruct3->metLocation); - break; - case MON_DATA_MET_LEVEL: - { - u8 metLevel = *data; - substruct3->metLevel = metLevel; - break; - } - case MON_DATA_MET_GAME: - SET8(substruct3->metGame); - break; - case MON_DATA_POKEBALL: - { - u8 pokeball = *data; - substruct3->pokeball = pokeball; - break; - } - case MON_DATA_OT_GENDER: - SET8(substruct3->otGender); - break; - case MON_DATA_HP_IV: - SET8(substruct3->hpIV); - break; - case MON_DATA_ATK_IV: - SET8(substruct3->attackIV); - break; - case MON_DATA_DEF_IV: - SET8(substruct3->defenseIV); - break; - case MON_DATA_SPD_IV: - SET8(substruct3->speedIV); - break; - case MON_DATA_SPATK_IV: - SET8(substruct3->spAttackIV); - break; - case MON_DATA_SPDEF_IV: - SET8(substruct3->spDefenseIV); - break; - case MON_DATA_IS_EGG: - SET8(substruct3->isEgg); - if (substruct3->isEgg) - boxMon->isEgg = 1; - else - boxMon->isEgg = 0; - break; - case MON_DATA_ALT_ABILITY: - SET8(substruct3->altAbility); - break; - case MON_DATA_COOL_RIBBON: - SET8(substruct3->coolRibbon); - break; - case MON_DATA_BEAUTY_RIBBON: - SET8(substruct3->beautyRibbon); - break; - case MON_DATA_CUTE_RIBBON: - SET8(substruct3->cuteRibbon); - break; - case MON_DATA_SMART_RIBBON: - SET8(substruct3->smartRibbon); - break; - case MON_DATA_TOUGH_RIBBON: - SET8(substruct3->toughRibbon); - break; - case MON_DATA_CHAMPION_RIBBON: - SET8(substruct3->championRibbon); - break; - case MON_DATA_WINNING_RIBBON: - SET8(substruct3->winningRibbon); - break; - case MON_DATA_VICTORY_RIBBON: - SET8(substruct3->victoryRibbon); - break; - case MON_DATA_ARTIST_RIBBON: - SET8(substruct3->artistRibbon); - break; - case MON_DATA_EFFORT_RIBBON: - SET8(substruct3->effortRibbon); - break; - case MON_DATA_GIFT_RIBBON_1: - SET8(substruct3->giftRibbon1); - break; - case MON_DATA_GIFT_RIBBON_2: - SET8(substruct3->giftRibbon2); - break; - case MON_DATA_GIFT_RIBBON_3: - SET8(substruct3->giftRibbon3); - break; - case MON_DATA_GIFT_RIBBON_4: - SET8(substruct3->giftRibbon4); - break; - case MON_DATA_GIFT_RIBBON_5: - SET8(substruct3->giftRibbon5); - break; - case MON_DATA_GIFT_RIBBON_6: - SET8(substruct3->giftRibbon6); - break; - case MON_DATA_GIFT_RIBBON_7: - SET8(substruct3->giftRibbon7); - break; - case MON_DATA_FATEFUL_ENCOUNTER: - SET8(substruct3->fatefulEncounter); - break; - case MON_DATA_IVS: - { -#ifdef BUGFIX_SETMONIVS - u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); -#else - u32 ivs = *data; // Bug: Only the HP IV and the lower 3 bits of the Attack IV are read. The rest become 0. -#endif - substruct3->hpIV = ivs & 0x1F; - substruct3->attackIV = (ivs >> 5) & 0x1F; - substruct3->defenseIV = (ivs >> 10) & 0x1F; - substruct3->speedIV = (ivs >> 15) & 0x1F; - substruct3->spAttackIV = (ivs >> 20) & 0x1F; - substruct3->spDefenseIV = (ivs >> 25) & 0x1F; - break; - } - default: - break; - } - - if (field > MON_DATA_10) - { - boxMon->checksum = CalculateBoxMonChecksum(boxMon); - EncryptBoxMon(boxMon); - } -} - -void CopyMon(void *dest, void *src, size_t size) -{ - memcpy(dest, src, size); -} - -u8 GiveMonToPlayer(struct Pokemon *mon) -{ - s32 i; - - SetMonData(mon, MON_DATA_OT_NAME, gSaveBlock2.playerName); - SetMonData(mon, MON_DATA_OT_GENDER, &gSaveBlock2.playerGender); - SetMonData(mon, MON_DATA_OT_ID, gSaveBlock2.playerTrainerId); - - i = 0; - - while (i < 6 && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) - i++; - - if (i >= 6) - return SendMonToPC(mon); - - CopyMon(&gPlayerParty[i], mon, sizeof(*mon)); - gPlayerPartyCount = i + 1; - return 0; -} - -u8 SendMonToPC(struct Pokemon *mon) -{ - s32 i = gPokemonStorage.currentBox; - - do - { - s32 j; - for (j = 0; j < 30; j++) - { - if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) - { - MonRestorePP(mon); - CopyMon(&gPokemonStorage.boxes[i][j], &mon->box, sizeof(mon->box)); - return 1; - } - } - - i++; - if (i == 14) - i = 0; - } while (i != gPokemonStorage.currentBox); - - return 2; -} - -u8 CalculatePlayerPartyCount(void) -{ - gPlayerPartyCount = 0; - - while (gPlayerPartyCount < 6 - && GetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) - { - gPlayerPartyCount++; - } - - return gPlayerPartyCount; -} - -u8 CalculateEnemyPartyCount(void) -{ - gEnemyPartyCount = 0; - - while (gEnemyPartyCount < 6 - && GetMonData(&gEnemyParty[gEnemyPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) - { - gEnemyPartyCount++; - } - - return gEnemyPartyCount; -} - -u8 sub_803DAA0(void) -{ - s32 aliveCount = 0; - s32 i; - CalculatePlayerPartyCount(); - - if (gPlayerPartyCount == 1) - return gPlayerPartyCount; - - for (i = 0; i < gPlayerPartyCount; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0 - && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_NONE - && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_EGG) - aliveCount++; - } - - return (aliveCount > 1) ? 0 : 2; -} - -u8 GetAbilityBySpecies(u16 species, bool8 altAbility) -{ - if (altAbility) - gLastUsedAbility = gBaseStats[species].ability2; - else - gLastUsedAbility = gBaseStats[species].ability1; - - return gLastUsedAbility; -} - -u8 GetMonAbility(struct Pokemon *mon) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u8 altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL); - return GetAbilityBySpecies(species, altAbility); -} - -void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord) -{ - s32 i, j; - - ZeroEnemyPartyMons(); - memcpy(&gSecretBaseRecord, secretBaseRecord, sizeof(*secretBaseRecord)); - - for (i = 0; i < 6; i++) - { - if (gSecretBaseRecord.partySpecies[i]) - { - CreateMon(&gEnemyParty[i], - gSecretBaseRecord.partySpecies[i], - gSecretBaseRecord.partyLevels[i], - 15, - 1, - gSecretBaseRecord.partyPersonality[i], - 2, - 0); - - SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, (u8 *)&gSecretBaseRecord.partyHeldItems[i]); - - for (j = 0; j < 6; j++) - SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gSecretBaseRecord.partyEVs[i]); - - for (j = 0; j < 4; j++) - { - SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, (u8 *)&gSecretBaseRecord.partyMoves[i * 4 + j]); - SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gSecretBaseRecord.partyMoves[i * 4 + j]].pp); - } - } - } - - gBattleTypeFlags = 8; - gTrainerBattleOpponent = 1024; -} - -u8 GetSecretBaseTrainerPicIndex(void) -{ - u8 trainerClass = gSecretBaseTrainerClasses[gSecretBaseRecord.gender][gSecretBaseRecord.trainerId[0] % 5]; - return gTrainerClassToPicIndex[trainerClass]; -} - -u8 GetSecretBaseTrainerNameIndex(void) -{ - u8 trainerClass = gSecretBaseTrainerClasses[gSecretBaseRecord.gender][gSecretBaseRecord.trainerId[0] % 5]; - return gTrainerClassToNameIndex[trainerClass]; -} - -u8 PlayerPartyAndPokemonStorageFull(void) -{ - s32 i; - - for (i = 0; i < 6; i++) - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE) - return 0; - - return PokemonStorageFull(); -} - -u8 PokemonStorageFull(void) -{ - s32 i, j; - - for (i = 0; i < 14; i++) - for (j = 0; j < 30; j++) - if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) - return 0; - - return 1; -} - -void GetSpeciesName(u8 *name, u16 species) -{ - s32 i; - - for (i = 0; i <= POKEMON_NAME_LENGTH; i++) - { - if (species > NUM_SPECIES) - name[i] = gSpeciesNames[0][i]; - else - name[i] = gSpeciesNames[species][i]; - - if (name[i] == EOS) - break; - } - - name[i] = EOS; -} - -u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex) -{ - u8 basePP = gBattleMoves[move].pp; - return basePP + ((basePP * 20 * ((gUnknown_08208238[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100); -} - -void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex) -{ - u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); - ppBonuses &= gUnknown_0820823C[moveIndex]; - SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); -} - -void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex) -{ - mon->ppBonuses &= gUnknown_0820823C[moveIndex]; -} - -void CopyPlayerPartyMonToBattleData(u8 battleIndex, u8 partyIndex) -{ - s32 i; - s8 nickname[POKEMON_NAME_LENGTH * 2]; - - gBattleMons[battleIndex].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); - gBattleMons[battleIndex].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL); - - for (i = 0; i < 4; i++) - { - gBattleMons[battleIndex].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL); - gBattleMons[battleIndex].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL); - } - - gBattleMons[battleIndex].ppBonuses = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP_BONUSES, NULL); - gBattleMons[battleIndex].friendship = GetMonData(&gPlayerParty[partyIndex], MON_DATA_FRIENDSHIP, NULL); - gBattleMons[battleIndex].experience = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EXP, NULL); - gBattleMons[battleIndex].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL); - gBattleMons[battleIndex].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL); - gBattleMons[battleIndex].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL); - gBattleMons[battleIndex].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPD_IV, NULL); - gBattleMons[battleIndex].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL); - gBattleMons[battleIndex].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL); - gBattleMons[battleIndex].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL); - gBattleMons[battleIndex].status1 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_STATUS, NULL); - gBattleMons[battleIndex].level = GetMonData(&gPlayerParty[partyIndex], MON_DATA_LEVEL, NULL); - gBattleMons[battleIndex].hp = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL); - gBattleMons[battleIndex].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL); - gBattleMons[battleIndex].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL); - gBattleMons[battleIndex].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL); - gBattleMons[battleIndex].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPD, NULL); - gBattleMons[battleIndex].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL); - gBattleMons[battleIndex].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL); - gBattleMons[battleIndex].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL); - gBattleMons[battleIndex].altAbility = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ALT_ABILITY, NULL); - gBattleMons[battleIndex].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL); - gBattleMons[battleIndex].type1 = gBaseStats[gBattleMons[battleIndex].species].type1; - gBattleMons[battleIndex].type2 = gBaseStats[gBattleMons[battleIndex].species].type2; - gBattleMons[battleIndex].ability = GetAbilityBySpecies(gBattleMons[battleIndex].species, gBattleMons[battleIndex].altAbility); - GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname); - StringCopy10(gBattleMons[battleIndex].nickname, nickname); - GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battleIndex].otName); - *(unk_20160BC + GetBankSide(battleIndex)) = gBattleMons[battleIndex].hp; - - for (i = 0; i < 8; i++) - gBattleMons[battleIndex].statStages[i] = 6; - - gBattleMons[battleIndex].status2 = 0; - sub_80157C4(battleIndex); - sub_8032AA8(battleIndex, 0); -} diff --git a/src/pokemon_3.c b/src/pokemon_3.c deleted file mode 100644 index 3d85a1c8f..000000000 --- a/src/pokemon_3.c +++ /dev/null @@ -1,1380 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_message.h" -#include "data2.h" -#include "event_data.h" -#include "hold_effects.h" -#include "item.h" -#include "items.h" -#include "link.h" -#include "m4a.h" -#include "main.h" -#include "pokemon.h" -#include "rng.h" -#include "rom4.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "rtc.h" -#include "songs.h" -#include "sound.h" -#include "species.h" -#include "sprite.h" -#include "string_util.h" -#include "text.h" -#include "util.h" - -extern u8 gPlayerPartyCount; -extern u8 gEnemyPartyCount; -extern struct BattlePokemon gBattleMons[4]; -extern u8 gActiveBank; -extern struct BattleEnigmaBerry gEnigmaBerries[]; -extern u16 gSpeciesToHoennPokedexNum[]; -extern u16 gSpeciesToNationalPokedexNum[]; -extern u16 gHoennToNationalOrder[]; -extern u16 gSpeciesIdToCryId[]; -extern u8 gBattleTextBuff1[]; -extern u8 gBattleTextBuff2[]; -extern u8 gDisplayedStringBattle[]; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u8 gStringBank; -extern u8 gBankInMenu; -extern struct SpindaSpot gSpindaSpotGraphics[]; -extern s8 gNatureStatTable[][5]; -extern s8 gUnknown_082082FE[][3]; -extern u16 gTrainerBattleOpponent; -extern u16 gBattleTypeFlags; -extern u32 gTMHMLearnsets[][2]; -extern u8 gBattleMonForms[]; -extern const u8 BattleText_Wally[]; -extern const u16 gHMMoves[]; -extern s8 gPokeblockFlavorCompatibilityTable[]; -extern u8 gLastUsedAbility; -extern const u8 BattleText_PreventedSwitch[]; -extern u16 gBattlePartyID[]; -extern u8 gJapaneseNidoranNames[][11]; - -extern u8 gUnknown_082082F8[]; -extern u8 gUnknown_083FFDB3[]; -extern u8 gUnknown_083FFDD3[]; -extern u8 gUnknown_083FEE5D[]; -extern u8 gUnknown_083FEE92[]; -extern u8 *gUnknown_08400F58[]; - -bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) -{ - u32 status = GetMonData(mon, MON_DATA_STATUS, 0); - - if (status & healMask) - { - status &= ~healMask; - SetMonData(mon, MON_DATA_STATUS, (u8 *)&status); - if (gMain.inBattle && battleId != 4) - gBattleMons[battleId].status1 &= ~healMask; - return FALSE; - } - else - { - return TRUE; - } -} - -u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit) -{ - const u8 *temp; - const u8 *itemEffect; - u8 offset; - int i; - u8 j; - u8 val; - - offset = 6; - - temp = gItemEffectTable[itemId - 13]; - - if (!temp && itemId != ITEM_ENIGMA_BERRY) - return 0; - - if (itemId == ITEM_ENIGMA_BERRY) - { - temp = gEnigmaBerries[gActiveBank].itemEffect; - } - - itemEffect = temp; - - for (i = 0; i < 6; i++) - { - switch (i) - { - case 0: - case 1: - case 2: - case 3: - if (i == effectByte) - return 0; - break; - case 4: - val = itemEffect[4]; - if (val & 0x20) - val &= 0xDF; - j = 0; - while (val) - { - if (val & 1) - { - switch (j) - { - case 2: - if (val & 0x10) - val &= 0xEF; - case 0: - if (i == effectByte && (val & effectBit)) - return offset; - offset++; - break; - case 1: - if (i == effectByte && (val & effectBit)) - return offset; - offset++; - break; - case 3: - if (i == effectByte && (val & effectBit)) - return offset; - offset++; - break; - case 7: - if (i == effectByte) - return 0; - break; - } - } - j++; - val >>= 1; - if (i == effectByte) - effectBit >>= 1; - } - break; - case 5: - val = itemEffect[5]; - j = 0; - while (val) - { - if (val & 1) - { - switch (j) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - if (i == effectByte && (val & effectBit)) - return offset; - offset++; - break; - case 7: - if (i == effectByte) - return 0; - break; - } - } - j++; - val >>= 1; - if (i == effectByte) - effectBit >>= 1; - } - break; - } - } - - return offset; -} - -void sub_803F324(int stat) -{ - gBankTarget = gBankInMenu; - StringCopy(gBattleTextBuff1, gUnknown_08400F58[gUnknown_082082F8[stat]]); - StringCopy(gBattleTextBuff2, gUnknown_083FFDB3); - StrCpyDecodeToDisplayedStringBattle(gUnknown_083FFDD3); -} - -u8 *sub_803F378(u16 itemId) -{ - int i; - u8 *itemEffect; - - if (itemId == ITEM_ENIGMA_BERRY) - { - if (gMain.inBattle) - { - itemEffect = gEnigmaBerries[gBankInMenu].itemEffect; - } - else - { - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - } - } - else - { - itemEffect = (u8 *) gItemEffectTable[itemId - 13]; - } - - gStringBank = gBankInMenu; - - for (i = 0; i < 3; i++) - { - if (itemEffect[i] & 0xF) - sub_803F324(i * 2); - if (itemEffect[i] & 0xF0) - { - if (i) - { - sub_803F324(i * 2 + 1); - } - else - { - gBankAttacker = gBankInMenu; - StrCpyDecodeToDisplayedStringBattle(gUnknown_083FEE92); - } - } - } - - if (itemEffect[3] & 0x80) - { - gBankAttacker = gBankInMenu; - StrCpyDecodeToDisplayedStringBattle(gUnknown_083FEE5D); - } - - return gDisplayedStringBattle; -} - -u8 GetNature(struct Pokemon *mon) -{ - return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25; -} - -u8 GetNatureFromPersonality(u32 personality) -{ - return personality % 25; -} - -u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) -{ - int i; - u16 targetSpecies = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - u8 level; - u16 friendship; - u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); - u16 upperPersonality = personality >> 16; - u8 holdEffect; - - if (heldItem == ITEM_ENIGMA_BERRY) - holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - else - holdEffect = ItemId_GetHoldEffect(heldItem); - - if (holdEffect == 38 && type != 3) - return 0; - - switch (type) - { - case 0: - level = GetMonData(mon, MON_DATA_LEVEL, 0); - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - - for (i = 0; i < 5; i++) - { - switch (gEvolutionTable[species].evolutions[i].method) - { - case EVO_FRIENDSHIP: - if (friendship >= 220) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - case EVO_FRIENDSHIP_DAY: - RtcCalcLocalTime(); - if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - case EVO_FRIENDSHIP_NIGHT: - RtcCalcLocalTime(); - if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - case EVO_LEVEL: - if (gEvolutionTable[species].evolutions[i].param <= level) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - case EVO_LEVEL_ATK_GT_DEF: - if (gEvolutionTable[species].evolutions[i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0)) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - case EVO_LEVEL_ATK_EQ_DEF: - if (gEvolutionTable[species].evolutions[i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0)) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - case EVO_LEVEL_ATK_LT_DEF: - if (gEvolutionTable[species].evolutions[i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0)) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - case EVO_LEVEL_SILCOON: - if (gEvolutionTable[species].evolutions[i].param <= level && (upperPersonality % 10) <= 4) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - case EVO_LEVEL_CASCOON: - if (gEvolutionTable[species].evolutions[i].param <= level && (upperPersonality % 10) > 4) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - case EVO_LEVEL_NINJASK: - if (gEvolutionTable[species].evolutions[i].param <= level) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - case EVO_BEAUTY: - if (gEvolutionTable[species].evolutions[i].param <= beauty) - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - } - } - break; - case 1: - for (i = 0; i < 5; i++) - { - switch (gEvolutionTable[species].evolutions[i].method) - { - case EVO_TRADE: - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - case EVO_TRADE_ITEM: - if (gEvolutionTable[species].evolutions[i].param == heldItem) - { - heldItem = 0; - SetMonData(mon, MON_DATA_HELD_ITEM, (u8 *)&heldItem); - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - } - break; - } - } - break; - case 2: - case 3: - for (i = 0; i < 5; i++) - { - if (gEvolutionTable[species].evolutions[i].method == EVO_ITEM - && gEvolutionTable[species].evolutions[i].param == evolutionItem) - { - targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; - break; - } - } - break; - } - - return targetSpecies; -} - -u16 HoennPokedexNumToSpecies(u16 hoennNum) -{ - u16 species; - - if (!hoennNum) - return 0; - - species = 0; - - while (species < 411 && gSpeciesToHoennPokedexNum[species] != hoennNum) - species++; - - if (species == 411) - return 0; - - return species + 1; -} - -u16 NationalPokedexNumToSpecies(u16 nationalNum) -{ - u16 species; - - if (!nationalNum) - return 0; - - species = 0; - - while (species < 411 && gSpeciesToNationalPokedexNum[species] != nationalNum) - species++; - - if (species == 411) - return 0; - - return species + 1; -} - -u16 NationalToHoennOrder(u16 nationalNum) -{ - u16 hoennNum; - - if (!nationalNum) - return 0; - - hoennNum = 0; - - while (hoennNum < 411 && gHoennToNationalOrder[hoennNum] != nationalNum) - hoennNum++; - - if (hoennNum == 411) - return 0; - - return hoennNum + 1; -} - -u16 SpeciesToNationalPokedexNum(u16 species) -{ - if (!species) - return 0; - - return gSpeciesToNationalPokedexNum[species - 1]; -} - -u16 SpeciesToHoennPokedexNum(u16 species) -{ - if (!species) - return 0; - - return gSpeciesToHoennPokedexNum[species - 1]; -} - -u16 HoennToNationalOrder(u16 hoennNum) -{ - if (!hoennNum) - return 0; - - return gHoennToNationalOrder[hoennNum - 1]; -} - -u32 SpeciesToCryId(u16 species) -{ - if (species <= 250) - return species; - - if (species < 276) - return 200; - - return gSpeciesIdToCryId[species - 276]; -} - -void unref_sub_803F938(u16 species, u32 personality, u8 *dest) -{ - if (species == SPECIES_SPINDA && dest != gUnknown_081FAF4C[0] && dest != gUnknown_081FAF4C[2]) - { - int i; - for (i = 0; i < 4; i++) - { - int j; - u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); - u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); - - for (j = 0; j < 16; j++) - { - int k; - s32 row = gSpindaSpotGraphics[i].image[j]; - - for (k = x; k < x + 16; k++) - { - u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2); - - if (row & 1) - { - if (k & 1) - { - if ((u8)((*val & 0xF0) - 0x10) <= 0x20) - *val += 0x40; - } - else - { - if ((u8)((*val & 0xF) - 0x01) <= 0x02) - *val += 0x04; - } - } - - row >>= 1; - } - - y++; - } - - personality >>= 8; - } - } -} - -void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4) -{ - if (species == SPECIES_SPINDA && a4) - { - int i; - for (i = 0; i < 4; i++) - { - int j; - u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); - u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); - - for (j = 0; j < 16; j++) - { - int k; - s32 row = gSpindaSpotGraphics[i].image[j]; - - for (k = x; k < x + 16; k++) - { - u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2); - - if (row & 1) - { - if (k & 1) - { - if ((u8)((*val & 0xF0) - 0x10) <= 0x20) - *val += 0x40; - } - else - { - if ((u8)((*val & 0xF) - 0x01) <= 0x02) - *val += 0x04; - } - } - - row >>= 1; - } - - y++; - } - - personality >>= 8; - } - } -} - -void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies) -{ -#ifdef BUGFIX_EVO_NAME - u8 language; - GetMonData(mon, MON_DATA_NICKNAME, gStringVar1); - language = GetMonData(mon, MON_DATA_LANGUAGE, &language); - if (language == GAME_LANGUAGE && !StringCompareWithoutExtCtrlCodes(gSpeciesNames[oldSpecies], gStringVar1)) - SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]); -#else - GetMonData(mon, MON_DATA_NICKNAME, gStringVar1); - if (!StringCompareWithoutExtCtrlCodes(gSpeciesNames[oldSpecies], gStringVar1)) - SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]); -#endif -} - -bool8 sub_803FBBC(void) -{ - bool8 retVal = FALSE; - switch (gLinkPlayers[GetMultiplayerId()].lp_field_18) - { - case 0: - case 3: - retVal = FALSE; - break; - case 1: - case 2: - retVal = TRUE; - break; - } - return retVal; -} - -bool8 sub_803FBFC(u8 id) -{ - bool8 retVal = FALSE; - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - retVal = FALSE; - break; - case 1: - case 2: - retVal = TRUE; - break; - } - return retVal; -} - -s32 sub_803FC34(u16 a1) -{ - s32 id; - for (id = 0; id < MAX_LINK_PLAYERS; id++) - if (gLinkPlayers[id].lp_field_18 == a1) - break; - return id; -} - -u8 sub_803FC58(u16 trainer) -{ - return gTrainers[trainer].encounterMusic_gender & 0x7F; -} - -u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex) -{ - if (statIndex < 1 || statIndex > 5) - { - // should just be "return n", but it wouldn't match without this - u16 retVal = n; - retVal++; - retVal--; - return retVal; - } - - switch (gNatureStatTable[nature][statIndex - 1]) - { - case 1: - return (u16)(n * 110) / 100; - case -1: - return (u16)(n * 90) / 100; - } - - return n; -} - -void AdjustFriendship(struct Pokemon *mon, u8 event) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); - u8 holdEffect; - - if (heldItem == ITEM_ENIGMA_BERRY) - { - if (gMain.inBattle) - { - holdEffect = gEnigmaBerries[0].holdEffect; - } - else - { - holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - } - } - else - { - holdEffect = ItemId_GetHoldEffect(heldItem); - } - - if (species && species != SPECIES_EGG) - { - u8 friendshipLevel = 0; - s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - if (friendship > 99) - friendshipLevel++; - if (friendship > 199) - friendshipLevel++; - if ((event != 5 || !(Random() & 1)) - && (event != 3 - || ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && (gTrainers[gTrainerBattleOpponent].trainerClass == 24 - || gTrainers[gTrainerBattleOpponent].trainerClass == 25 - || gTrainers[gTrainerBattleOpponent].trainerClass == 32)))) - { - s8 mod = gUnknown_082082FE[event][friendshipLevel]; - if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - mod = (150 * mod) / 100; - friendship += mod; - if (mod > 0) - { - if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL) - friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == sav1_map_get_name()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > 255) - friendship = 255; - SetMonData(mon, MON_DATA_FRIENDSHIP, (u8 *)&friendship); - } - } -} - -void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) -{ - u8 evs[NUM_STATS]; - u16 evIncrease = 0; - u16 totalEVs = 0; - u16 heldItem; - u8 holdEffect; - int i; - - for (i = 0; i < NUM_STATS; i++) - { - evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, 0); - totalEVs += evs[i]; - } - - for (i = 0; i < NUM_STATS; i++) - { - u8 hasHadPokerus; - int multiplier; - - if (totalEVs >= MAX_TOTAL_EVS) - break; - - hasHadPokerus = CheckPartyHasHadPokerus(mon, 0); - - if (hasHadPokerus) - multiplier = 2; - else - multiplier = 1; - - switch (i) - { - case 0: - evIncrease = gBaseStats[defeatedSpecies].evYield_HP * multiplier; - break; - case 1: - evIncrease = gBaseStats[defeatedSpecies].evYield_Attack * multiplier; - break; - case 2: - evIncrease = gBaseStats[defeatedSpecies].evYield_Defense * multiplier; - break; - case 3: - evIncrease = gBaseStats[defeatedSpecies].evYield_Speed * multiplier; - break; - case 4: - evIncrease = gBaseStats[defeatedSpecies].evYield_SpAttack * multiplier; - break; - case 5: - evIncrease = gBaseStats[defeatedSpecies].evYield_SpDefense * multiplier; - break; - } - - heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); - - if (heldItem == ITEM_ENIGMA_BERRY) - { - if (gMain.inBattle) - { - holdEffect = gEnigmaBerries[0].holdEffect; - } - else - { - holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - } - } - else - { - holdEffect = ItemId_GetHoldEffect(heldItem); - } - - if (holdEffect == HOLD_EFFECT_MACHO_BRACE) - evIncrease *= 2; - - if (totalEVs + (s16)evIncrease > MAX_TOTAL_EVS) - evIncrease = ((s16)evIncrease + MAX_TOTAL_EVS) - (totalEVs + evIncrease); - - if (evs[i] + (s16)evIncrease > 255) - { - int val1 = (s16)evIncrease + 255; - int val2 = evs[i] + evIncrease; - evIncrease = val1 - val2; - } - - evs[i] += evIncrease; - totalEVs += evIncrease; - SetMonData(mon, MON_DATA_HP_EV + i, &evs[i]); - } -} - -u16 GetMonEVCount(struct Pokemon *mon) -{ - int i; - u16 count = 0; - - for (i = 0; i < NUM_STATS; i++) - count += GetMonData(mon, MON_DATA_HP_EV + i, 0); - - return count; -} - -void RandomlyGivePartyPokerus(struct Pokemon *party) -{ - u16 rnd = Random(); - if (rnd == 0x4000 || rnd == 0x8000 || rnd == 0xC000) - { - struct Pokemon *mon; - - do - { - do - { - rnd = Random() % PARTY_SIZE; - mon = &party[rnd]; - } - while (!GetMonData(mon, MON_DATA_SPECIES, 0)); - } - while (GetMonData(mon, MON_DATA_IS_EGG, 0)); - - if (!(CheckPartyHasHadPokerus(party, gBitTable[rnd]))) - { - u8 rnd2; - - do - { - rnd2 = Random(); - } - while (rnd2 == 0); - - if (rnd2 & 0xF0) - rnd2 &= 0x07; - - rnd2 |= (rnd2 << 4); - rnd2 &= 0xF3; - rnd2++; - - SetMonData(&party[rnd], MON_DATA_POKERUS, &rnd2); - } - } -} - -u8 CheckPartyPokerus(struct Pokemon *party, u8 selection) -{ - u8 retVal; - - int partyIndex = 0; - unsigned curBit = 1; - retVal = 0; - - if (selection) - { - do - { - if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0) & 0xF)) - retVal |= curBit; - partyIndex++; - curBit <<= 1; - selection >>= 1; - } - while (selection); - } - else if (GetMonData(&party[0], MON_DATA_POKERUS, 0) & 0xF) - { - retVal = 1; - } - - return retVal; -} - -u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection) -{ - u8 retVal; - - int partyIndex = 0; - unsigned curBit = 1; - retVal = 0; - - if (selection) - { - do - { - if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0)) - retVal |= curBit; - partyIndex++; - curBit <<= 1; - selection >>= 1; - } - while (selection); - } - else if (GetMonData(&party[0], MON_DATA_POKERUS, 0)) - { - retVal = 1; - } - - return retVal; -} - -void UpdatePartyPokerusTime(u16 days) -{ - int i; - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, 0)) - { - u8 pokerus = GetMonData(&gPlayerParty[i], MON_DATA_POKERUS, 0); - if (pokerus & 0xF) - { - if ((pokerus & 0xF) < days || days > 4) - pokerus &= 0xF0; - else - pokerus -= days; - - SetMonData(&gPlayerParty[i], MON_DATA_POKERUS, &pokerus); - } - } - } -} - -void PartySpreadPokerus(struct Pokemon *party) -{ - if ((Random() % 3) == 0) - { - int i; - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES, 0)) - { - u8 pokerus = GetMonData(&party[i], MON_DATA_POKERUS, 0); - u8 curPokerus = pokerus; - if (pokerus) - { - if (pokerus & 0xF) - { - // spread to adjacent party members - if (i != 0 && !(GetMonData(&party[i - 1], MON_DATA_POKERUS, 0) & 0xF0)) - SetMonData(&party[i - 1], MON_DATA_POKERUS, &curPokerus); - if (i != (PARTY_SIZE - 1) && !(GetMonData(&party[i + 1], MON_DATA_POKERUS, 0) & 0xF0)) - { - SetMonData(&party[i + 1], MON_DATA_POKERUS, &curPokerus); - i++; - } - } - } - } - } - } -} - -bool8 TryIncrementMonLevel(struct Pokemon *mon) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u8 nextLevel = GetMonData(mon, MON_DATA_LEVEL, 0) + 1; - if (GetMonData(mon, MON_DATA_EXP, 0) > gExperienceTables[gBaseStats[species].growthRate][nextLevel]) - { - SetMonData(mon, MON_DATA_LEVEL, &nextLevel); - return TRUE; - } - else - { - return FALSE; - } -} - -u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - if (species == SPECIES_EGG) - { - return 0; - } - else if (tm < 32) - { - u32 mask = 1 << tm; - return gTMHMLearnsets[species][0] & mask; - } - else - { - u32 mask = 1 << (tm - 32); - return gTMHMLearnsets[species][1] & mask; - } -} - -u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) -{ - u16 learnedMoves[4]; - u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); - int i, j, k; - - for (i = 0; i < 4; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); - - for (i = 0; i < 20; i++) - { - u16 moveLevel; - - if (gLevelUpLearnsets[species][i] == 0xFFFF) - break; - - moveLevel = gLevelUpLearnsets[species][i] & 0xFE00; - - if (moveLevel <= (level << 9)) - { - for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) - ; - - if (j == 4) - { - for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) - ; - - if (k == numMoves) - moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; - } - } - } - - return numMoves; -} - -u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) -{ - u8 numMoves = 0; - int i; - - for (i = 0; i < 20 && gLevelUpLearnsets[species][i] != 0xFFFF; i++) - moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; - - return numMoves; -} - -u8 sub_8040574(struct Pokemon *mon) -{ - u16 learnedMoves[4]; - u16 moves[20]; - u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); - int i, j, k; - - if (species == SPECIES_EGG) - return 0; - - for (i = 0; i < 4; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); - - for (i = 0; i < 20; i++) - { - u16 moveLevel; - - if (gLevelUpLearnsets[species][i] == 0xFFFF) - break; - - moveLevel = gLevelUpLearnsets[species][i] & 0xFE00; - - if (moveLevel <= (level << 9)) - { - for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) - ; - - if (j == 4) - { - for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) - ; - - if (k == numMoves) - moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; - } - } - } - - return numMoves; -} - -u16 SpeciesToPokedexNum(u16 species) -{ - if (IsNationalPokedexEnabled()) - { - return SpeciesToNationalPokedexNum(species); - } - else - { - species = SpeciesToHoennPokedexNum(species); - if (species <= 202) - return species; - return 0xFFFF; - } -} - -void ClearBattleMonForms(void) -{ - int i; - for (i = 0; i < 4; i++) - gBattleMonForms[i] = 0; -} - -u16 sub_8040728(void) -{ - if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) - return BGM_BATTLE34; - if (gBattleTypeFlags & BATTLE_TYPE_REGI) - return BGM_BATTLE36; - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - return BGM_BATTLE20; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - switch (gTrainers[gTrainerBattleOpponent].trainerClass) - { - case 2: - case 0x31: - return BGM_BATTLE30; - case 3: - case 4: - case 0x32: - case 0x33: - return BGM_BATTLE31; - case 0x19: - return BGM_BATTLE32; - case 0x20: - return BGM_BATTLE33; - case 0x2E: - if (!StringCompare(gTrainers[gTrainerBattleOpponent].trainerName, BattleText_Wally)) - return BGM_BATTLE20; - return BGM_BATTLE35; - case 0x18: - return BGM_BATTLE38; - default: - return BGM_BATTLE20; - } - } - return BGM_BATTLE27; -} - -void sub_80408BC(void) -{ - ResetMapMusic(); - m4aMPlayAllStop(); - PlayBGM(sub_8040728()); -} - -void current_map_music_set__default_for_battle(u16 song) -{ - ResetMapMusic(); - m4aMPlayAllStop(); - if (song) - PlayNewMapMusic(song); - else - PlayNewMapMusic(sub_8040728()); -} - -const u8 *pokemon_get_pal(struct Pokemon *mon) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - return species_and_otid_get_pal(species, otId, personality); -} - -//Extracts the upper 16 bits of a 32-bit number -#define HIHALF(n) (((n) & 0xFFFF0000) >> 16) - -//Extracts the lower 16 bits of a 32-bit number -#define LOHALF(n) ((n) & 0xFFFF) - -const u8 *species_and_otid_get_pal(u16 species, u32 otId, u32 personality) -{ - u32 shinyValue; - - if (species > SPECIES_EGG) - return gMonPaletteTable[0].data; - - shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); - if (shinyValue < 8) - return gMonShinyPaletteTable[species].data; - else - return gMonPaletteTable[species].data; -} - -const struct CompressedSpritePalette *sub_8040990(struct Pokemon *mon) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - return sub_80409C8(species, otId, personality); -} - -const struct CompressedSpritePalette *sub_80409C8(u16 species, u32 otId , u32 personality) -{ - u32 shinyValue; - - shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); - if (shinyValue < 8) - return &gMonShinyPaletteTable[species]; - else - return &gMonPaletteTable[species]; -} - -bool8 IsHMMove2(u16 move) -{ - int i = 0; - while (gHMMoves[i] != 0xFFFF) - { - if (gHMMoves[i++] == move) - return TRUE; - } - return FALSE; -} - -bool8 sub_8040A3C(u16 species) -{ - return gBaseStats[species].unk19_7; -} - -s8 sub_8040A54(struct Pokemon *mon, u8 a2) -{ - u8 nature = GetNature(mon); - return gPokeblockFlavorCompatibilityTable[nature * 5 + a2]; -} - -s8 sub_8040A7C(u32 personality, u8 a2) -{ - u8 nature = GetNatureFromPersonality(personality); - return gPokeblockFlavorCompatibilityTable[nature * 5 + a2]; -} - -bool8 IsTradedMon(struct Pokemon *mon) -{ - u8 otName[8]; - u32 otId; - GetMonData(mon, MON_DATA_OT_NAME, otName); - otId = GetMonData(mon, MON_DATA_OT_ID, 0); - return IsOtherTrainer(otId, otName); -} - -bool8 IsOtherTrainer(u32 otId, u8 *otName) -{ - if (otId == (gSaveBlock2.playerTrainerId[0] | (gSaveBlock2.playerTrainerId[1] << 8) | (gSaveBlock2.playerTrainerId[2] << 16) | (gSaveBlock2.playerTrainerId[3] << 24))) - { - int i; - - for (i = 0; otName[i] != EOS; i++) - if (otName[i] != gSaveBlock2.playerName[i]) - return TRUE; - return FALSE; - } - - return TRUE; -} - -void BoxMonRestorePP(struct BoxPokemon *); - -void MonRestorePP(struct Pokemon *mon) -{ - BoxMonRestorePP(&mon->box); -} - -void BoxMonRestorePP(struct BoxPokemon *boxMon) -{ - int i; - - for (i = 0; i < 4; i++) - { - if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0)) - { - u16 move = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0); - u16 bonus = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, 0); - u8 pp = CalculatePPWithBonus(move, bonus, i); - SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp); - } - } -} - -void sub_8040B8C(void) -{ - gLastUsedAbility = BATTLE_STRUCT->unk160C0;; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = BATTLE_STRUCT->unk16054; - gBattleTextBuff1[4] = EOS; - if (!GetBankSide(BATTLE_STRUCT->unk16054)) - gBattleTextBuff1[3] = pokemon_order_func(gBattlePartyID[BATTLE_STRUCT->unk16054]); - else - gBattleTextBuff1[3] = gBattlePartyID[BATTLE_STRUCT->unk16054]; - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 4; - gBattleTextBuff2[2] = gBankInMenu; - gBattleTextBuff2[3] = pokemon_order_func(gBattlePartyID[gBankInMenu]); - gBattleTextBuff2[4] = EOS; - StrCpyDecodeBattle(BattleText_PreventedSwitch, gStringVar4); -} - -void SetWildMonHeldItem(void) -{ - if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER))) - { - u16 rnd = Random() % 100; - u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0); - if (gBaseStats[species].item1 == gBaseStats[species].item2) - { - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&gBaseStats[species].item1); - return; - } - - if (rnd > 44) - { - if (rnd <= 94) - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&gBaseStats[species].item1); - else - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&gBaseStats[species].item2); - } - } -} - -bool8 IsShinyOtIdPersonality(u32, u32); - -bool8 IsShiny(struct Pokemon *mon) -{ - u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - return IsShinyOtIdPersonality(otId, personality); -} - -bool8 IsShinyOtIdPersonality(u32 otId, u32 personality) -{ - bool8 retVal = FALSE; - u32 shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); - if (shinyValue < 8) - retVal = TRUE; - return retVal; -} - -u8 *sub_8040D08(void) -{ - u8 id = GetMultiplayerId(); - return gLinkPlayers[sub_803FC34(gLinkPlayers[id].lp_field_18 ^ 2)].name; -} - -bool32 sub_8040D3C(u16 species, u8 *name, u8 language) -{ - bool32 retVal = FALSE; - if (species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) - { - u8 *speciesName; - if (language == GAME_LANGUAGE) - { - speciesName = gSpeciesNames[species]; - } - else - { - if (species == SPECIES_NIDORAN_M) - speciesName = gJapaneseNidoranNames[0]; - else - speciesName = gJapaneseNidoranNames[1]; - } - if (!StringCompareWithoutExtCtrlCodes(name, speciesName)) - retVal = TRUE; - else - retVal = FALSE; - } - return retVal; -} - -bool32 sub_8040D8C(u16 species, u8 *name) -{ - u8 language = GAME_LANGUAGE; - if (name[0] == 0xFC && name[1] == 21) - language = LANGUAGE_JAPANESE; - return sub_8040D3C(species, name, language); -} - -bool32 unref_sub_8040DAC(struct Pokemon *mon) -{ - u8 name[12]; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u8 language = GetMonData(mon, MON_DATA_LANGUAGE, 0); - GetMonData(mon, MON_DATA_NICKNAME, name); - return sub_8040D3C(species, name, language); -} diff --git a/src/pokemon_data.c b/src/pokemon_data.c deleted file mode 100644 index 6414134fb..000000000 --- a/src/pokemon_data.c +++ /dev/null @@ -1,128 +0,0 @@ -#include "global.h" -#include "pokemon.h" -#include "species.h" -#include "trainer.h" -#include "abilities.h" -#include "moves.h" -#include "hold_effects.h" -#include "items.h" -#include "sprite.h" -#include "data2.h" - -#include "data/pokemon/dex_order.h" -#include "data/pokemon/spinda_spots.h" -#include "data/pokemon/item_effects.h" -#include "data/pokemon/nature_stats.h" -#include "data/pokemon/tmhm_learnsets.h" -#include "data/pokemon/trainer_class_lookups.h" -#include "data/pokemon/cry_ids.h" -#include "data/pokemon/experience_tables.h" -#include "data/pokemon/base_stats.h" -#include "data/pokemon/level_up_learnsets.h" -#include "data/pokemon/evolution.h" -#include "data/pokemon/level_up_learnset_pointers.h" - -const u8 gUnknown_08208238[] = { // Masks for getting PP Up count, also PP Max values - 0x03, 0x0c, 0x30, 0xc0 -}; - -const u8 gUnknown_0820823C[] = { // Masks for setting PP Up count - 0xFC, 0xF3, 0xCF, 0x3F -}; - -const u8 gUnknown_08208240[] = { // Values added to PP Up count - 0x01, 0x04, 0x10, 0x40 -}; - -const u8 gStatStageRatios[][2] = { - {10, 40}, // -6 - {10, 35}, // -5 - {10, 30}, // -4 - {10, 25}, // -3 - {10, 20}, // -2 - {10, 15}, // -1 - {10, 10}, // 0 - {15, 10}, // 1 - {20, 10}, // 2 - {25, 10}, // 3 - {30, 10}, // 4 - {35, 10}, // 5 - {40, 10} // 6 -}; - -const u8 unknownGameFreakAbbrev_820825E[] = _("ゲーフリ"); - -const u8 gHoldEffectToType[][2] = { - {HOLD_EFFECT_BUG_POWER, TYPE_BUG}, - {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL}, - {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND}, - {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK}, - {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS}, - {HOLD_EFFECT_DARK_POWER, TYPE_DARK}, - {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING}, - {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC}, - {HOLD_EFFECT_WATER_POWER, TYPE_WATER}, - {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING}, - {HOLD_EFFECT_POISON_POWER, TYPE_POISON}, - {HOLD_EFFECT_ICE_POWER, TYPE_ICE}, - {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST}, - {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC}, - {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE}, - {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON}, - {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL} -}; - -extern void sub_80105A0(struct Sprite *); -extern void oac_poke_opponent(struct Sprite *); - -const struct SpriteTemplate gSpriteTemplate_8208288[] = { - {0xFFFF, 0, &gOamData_81F96F0, NULL, gSpriteImageTable_81E7A10, gSpriteAffineAnimTable_81E7B70, sub_80105A0}, - {0xFFFF, 0, &gOamData_81F96E8, NULL, gSpriteImageTable_81E7A30, gSpriteAffineAnimTable_81E7BEC, oac_poke_opponent}, - {0xFFFF, 0, &gOamData_81F96F0, NULL, gSpriteImageTable_81E7A50, gSpriteAffineAnimTable_81E7B70, sub_80105A0}, - {0xFFFF, 0, &gOamData_81F96E8, NULL, gSpriteImageTable_81E7A70, gSpriteAffineAnimTable_81E7BEC, oac_poke_opponent}, -}; - -const u8 gSecretBaseTrainerClasses[][5] = { - // male - {TRAINER_CLASS_YOUNGSTER, TRAINER_CLASS_BUG_CATCHER, TRAINER_CLASS_RICH_BOY, TRAINER_CLASS_CAMPER, TRAINER_CLASS_COOL_TRAINER_M}, - // female - {TRAINER_CLASS_LASS, TRAINER_CLASS_SCHOOL_KID_F, TRAINER_CLASS_LADY, TRAINER_CLASS_PICNICKER, TRAINER_CLASS_COOL_TRAINER_F} -}; - -const u8 gUnknown_082082F2[] = { - MON_DATA_HP_EV, - MON_DATA_ATK_EV, - MON_DATA_DEF_EV, - MON_DATA_SPD_EV, - MON_DATA_SPDEF_EV, - MON_DATA_SPATK_EV -}; - -const u8 gUnknown_082082F8[] = {1, 1, 3, 2, 4, 6}; - -const s8 gUnknown_082082FE[][3] = { - // Happiness deltas - { 5, 3, 2}, - { 5, 3, 2}, - { 1, 1, 0}, - { 3, 2, 1}, - { 1, 1, 0}, - { 1, 1, 1}, - {-1, -1, -1}, - {-5, -5, -10}, - {-5, -5, -10} -}; - -const u16 gHMMoves[] = { - MOVE_CUT, - MOVE_FLY, - MOVE_SURF, - MOVE_STRENGTH, - MOVE_FLASH, - MOVE_ROCK_SMASH, - MOVE_WATERFALL, - MOVE_DIVE, - 0xffff -}; - -const u8 gJapaneseNidoranNames[][11] = {_("ニドラン♂"), _("ニドラン♀")}; diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c deleted file mode 100644 index 8994ea49e..000000000 --- a/src/pokemon_icon.c +++ /dev/null @@ -1,1276 +0,0 @@ -#include "global.h" -#include "graphics.h" -#include "mail_data.h" -#include "species.h" -#include "sprite.h" - -#define POKE_ICON_BASE_PAL_TAG 56000 - -struct MonIconSpriteTemplate -{ - const struct OamData *oam; - const u8 *image; - const union AnimCmd *const *anims; - const union AffineAnimCmd *const *affineAnims; - void (*callback)(struct Sprite *); - u16 paletteTag; -}; - -const u8 * const gMonIconTable[] = -{ - gMonIcon_Bulbasaur, - gMonIcon_Bulbasaur, - gMonIcon_Ivysaur, - gMonIcon_Venusaur, - gMonIcon_Charmander, - gMonIcon_Charmeleon, - gMonIcon_Charizard, - gMonIcon_Squirtle, - gMonIcon_Wartortle, - gMonIcon_Blastoise, - gMonIcon_Caterpie, - gMonIcon_Metapod, - gMonIcon_Butterfree, - gMonIcon_Weedle, - gMonIcon_Kakuna, - gMonIcon_Beedrill, - gMonIcon_Pidgey, - gMonIcon_Pidgeotto, - gMonIcon_Pidgeot, - gMonIcon_Rattata, - gMonIcon_Raticate, - gMonIcon_Spearow, - gMonIcon_Fearow, - gMonIcon_Ekans, - gMonIcon_Arbok, - gMonIcon_Pikachu, - gMonIcon_Raichu, - gMonIcon_Sandshrew, - gMonIcon_Sandslash, - gMonIcon_NidoranF, - gMonIcon_Nidorina, - gMonIcon_Nidoqueen, - gMonIcon_NidoranM, - gMonIcon_Nidorino, - gMonIcon_Nidoking, - gMonIcon_Clefairy, - gMonIcon_Clefable, - gMonIcon_Vulpix, - gMonIcon_Ninetales, - gMonIcon_Jigglypuff, - gMonIcon_Wigglytuff, - gMonIcon_Zubat, - gMonIcon_Golbat, - gMonIcon_Oddish, - gMonIcon_Gloom, - gMonIcon_Vileplume, - gMonIcon_Paras, - gMonIcon_Parasect, - gMonIcon_Venonat, - gMonIcon_Venomoth, - gMonIcon_Diglett, - gMonIcon_Dugtrio, - gMonIcon_Meowth, - gMonIcon_Persian, - gMonIcon_Psyduck, - gMonIcon_Golduck, - gMonIcon_Mankey, - gMonIcon_Primeape, - gMonIcon_Growlithe, - gMonIcon_Arcanine, - gMonIcon_Poliwag, - gMonIcon_Poliwhirl, - gMonIcon_Poliwrath, - gMonIcon_Abra, - gMonIcon_Kadabra, - gMonIcon_Alakazam, - gMonIcon_Machop, - gMonIcon_Machoke, - gMonIcon_Machamp, - gMonIcon_Bellsprout, - gMonIcon_Weepinbell, - gMonIcon_Victreebel, - gMonIcon_Tentacool, - gMonIcon_Tentacruel, - gMonIcon_Geodude, - gMonIcon_Graveler, - gMonIcon_Golem, - gMonIcon_Ponyta, - gMonIcon_Rapidash, - gMonIcon_Slowpoke, - gMonIcon_Slowbro, - gMonIcon_Magnemite, - gMonIcon_Magneton, - gMonIcon_Farfetchd, - gMonIcon_Doduo, - gMonIcon_Dodrio, - gMonIcon_Seel, - gMonIcon_Dewgong, - gMonIcon_Grimer, - gMonIcon_Muk, - gMonIcon_Shellder, - gMonIcon_Cloyster, - gMonIcon_Gastly, - gMonIcon_Haunter, - gMonIcon_Gengar, - gMonIcon_Onix, - gMonIcon_Drowzee, - gMonIcon_Hypno, - gMonIcon_Krabby, - gMonIcon_Kingler, - gMonIcon_Voltorb, - gMonIcon_Electrode, - gMonIcon_Exeggcute, - gMonIcon_Exeggutor, - gMonIcon_Cubone, - gMonIcon_Marowak, - gMonIcon_Hitmonlee, - gMonIcon_Hitmonchan, - gMonIcon_Lickitung, - gMonIcon_Koffing, - gMonIcon_Weezing, - gMonIcon_Rhyhorn, - gMonIcon_Rhydon, - gMonIcon_Chansey, - gMonIcon_Tangela, - gMonIcon_Kangaskhan, - gMonIcon_Horsea, - gMonIcon_Seadra, - gMonIcon_Goldeen, - gMonIcon_Seaking, - gMonIcon_Staryu, - gMonIcon_Starmie, - gMonIcon_Mrmime, - gMonIcon_Scyther, - gMonIcon_Jynx, - gMonIcon_Electabuzz, - gMonIcon_Magmar, - gMonIcon_Pinsir, - gMonIcon_Tauros, - gMonIcon_Magikarp, - gMonIcon_Gyarados, - gMonIcon_Lapras, - gMonIcon_Ditto, - gMonIcon_Eevee, - gMonIcon_Vaporeon, - gMonIcon_Jolteon, - gMonIcon_Flareon, - gMonIcon_Porygon, - gMonIcon_Omanyte, - gMonIcon_Omastar, - gMonIcon_Kabuto, - gMonIcon_Kabutops, - gMonIcon_Aerodactyl, - gMonIcon_Snorlax, - gMonIcon_Articuno, - gMonIcon_Zapdos, - gMonIcon_Moltres, - gMonIcon_Dratini, - gMonIcon_Dragonair, - gMonIcon_Dragonite, - gMonIcon_Mewtwo, - gMonIcon_Mew, - gMonIcon_Chikorita, - gMonIcon_Bayleef, - gMonIcon_Meganium, - gMonIcon_Cyndaquil, - gMonIcon_Quilava, - gMonIcon_Typhlosion, - gMonIcon_Totodile, - gMonIcon_Croconaw, - gMonIcon_Feraligatr, - gMonIcon_Sentret, - gMonIcon_Furret, - gMonIcon_Hoothoot, - gMonIcon_Noctowl, - gMonIcon_Ledyba, - gMonIcon_Ledian, - gMonIcon_Spinarak, - gMonIcon_Ariados, - gMonIcon_Crobat, - gMonIcon_Chinchou, - gMonIcon_Lanturn, - gMonIcon_Pichu, - gMonIcon_Cleffa, - gMonIcon_Igglybuff, - gMonIcon_Togepi, - gMonIcon_Togetic, - gMonIcon_Natu, - gMonIcon_Xatu, - gMonIcon_Mareep, - gMonIcon_Flaaffy, - gMonIcon_Ampharos, - gMonIcon_Bellossom, - gMonIcon_Marill, - gMonIcon_Azumarill, - gMonIcon_Sudowoodo, - gMonIcon_Politoed, - gMonIcon_Hoppip, - gMonIcon_Skiploom, - gMonIcon_Jumpluff, - gMonIcon_Aipom, - gMonIcon_Sunkern, - gMonIcon_Sunflora, - gMonIcon_Yanma, - gMonIcon_Wooper, - gMonIcon_Quagsire, - gMonIcon_Espeon, - gMonIcon_Umbreon, - gMonIcon_Murkrow, - gMonIcon_Slowking, - gMonIcon_Misdreavus, - gMonIcon_UnownA, - gMonIcon_Wobbuffet, - gMonIcon_Girafarig, - gMonIcon_Pineco, - gMonIcon_Forretress, - gMonIcon_Dunsparce, - gMonIcon_Gligar, - gMonIcon_Steelix, - gMonIcon_Snubbull, - gMonIcon_Granbull, - gMonIcon_Qwilfish, - gMonIcon_Scizor, - gMonIcon_Shuckle, - gMonIcon_Heracross, - gMonIcon_Sneasel, - gMonIcon_Teddiursa, - gMonIcon_Ursaring, - gMonIcon_Slugma, - gMonIcon_Magcargo, - gMonIcon_Swinub, - gMonIcon_Piloswine, - gMonIcon_Corsola, - gMonIcon_Remoraid, - gMonIcon_Octillery, - gMonIcon_Delibird, - gMonIcon_Mantine, - gMonIcon_Skarmory, - gMonIcon_Houndour, - gMonIcon_Houndoom, - gMonIcon_Kingdra, - gMonIcon_Phanpy, - gMonIcon_Donphan, - gMonIcon_Porygon2, - gMonIcon_Stantler, - gMonIcon_Smeargle, - gMonIcon_Tyrogue, - gMonIcon_Hitmontop, - gMonIcon_Smoochum, - gMonIcon_Elekid, - gMonIcon_Magby, - gMonIcon_Miltank, - gMonIcon_Blissey, - gMonIcon_Raikou, - gMonIcon_Entei, - gMonIcon_Suicune, - gMonIcon_Larvitar, - gMonIcon_Pupitar, - gMonIcon_Tyranitar, - gMonIcon_Lugia, - gMonIcon_HoOh, - gMonIcon_Celebi, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_Treecko, - gMonIcon_Grovyle, - gMonIcon_Sceptile, - gMonIcon_Torchic, - gMonIcon_Combusken, - gMonIcon_Blaziken, - gMonIcon_Mudkip, - gMonIcon_Marshtomp, - gMonIcon_Swampert, - gMonIcon_Poochyena, - gMonIcon_Mightyena, - gMonIcon_Zigzagoon, - gMonIcon_Linoone, - gMonIcon_Wurmple, - gMonIcon_Silcoon, - gMonIcon_Beautifly, - gMonIcon_Cascoon, - gMonIcon_Dustox, - gMonIcon_Lotad, - gMonIcon_Lombre, - gMonIcon_Ludicolo, - gMonIcon_Seedot, - gMonIcon_Nuzleaf, - gMonIcon_Shiftry, - gMonIcon_Nincada, - gMonIcon_Ninjask, - gMonIcon_Shedinja, - gMonIcon_Taillow, - gMonIcon_Swellow, - gMonIcon_Shroomish, - gMonIcon_Breloom, - gMonIcon_Spinda, - gMonIcon_Wingull, - gMonIcon_Pelipper, - gMonIcon_Surskit, - gMonIcon_Masquerain, - gMonIcon_Wailmer, - gMonIcon_Wailord, - gMonIcon_Skitty, - gMonIcon_Delcatty, - gMonIcon_Kecleon, - gMonIcon_Baltoy, - gMonIcon_Claydol, - gMonIcon_Nosepass, - gMonIcon_Torkoal, - gMonIcon_Sableye, - gMonIcon_Barboach, - gMonIcon_Whiscash, - gMonIcon_Luvdisc, - gMonIcon_Corphish, - gMonIcon_Crawdaunt, - gMonIcon_Feebas, - gMonIcon_Milotic, - gMonIcon_Carvanha, - gMonIcon_Sharpedo, - gMonIcon_Trapinch, - gMonIcon_Vibrava, - gMonIcon_Flygon, - gMonIcon_Makuhita, - gMonIcon_Hariyama, - gMonIcon_Electrike, - gMonIcon_Manectric, - gMonIcon_Numel, - gMonIcon_Camerupt, - gMonIcon_Spheal, - gMonIcon_Sealeo, - gMonIcon_Walrein, - gMonIcon_Cacnea, - gMonIcon_Cacturne, - gMonIcon_Snorunt, - gMonIcon_Glalie, - gMonIcon_Lunatone, - gMonIcon_Solrock, - gMonIcon_Azurill, - gMonIcon_Spoink, - gMonIcon_Grumpig, - gMonIcon_Plusle, - gMonIcon_Minun, - gMonIcon_Mawile, - gMonIcon_Meditite, - gMonIcon_Medicham, - gMonIcon_Swablu, - gMonIcon_Altaria, - gMonIcon_Wynaut, - gMonIcon_Duskull, - gMonIcon_Dusclops, - gMonIcon_Roselia, - gMonIcon_Slakoth, - gMonIcon_Vigoroth, - gMonIcon_Slaking, - gMonIcon_Gulpin, - gMonIcon_Swalot, - gMonIcon_Tropius, - gMonIcon_Whismur, - gMonIcon_Loudred, - gMonIcon_Exploud, - gMonIcon_Clamperl, - gMonIcon_Huntail, - gMonIcon_Gorebyss, - gMonIcon_Absol, - gMonIcon_Shuppet, - gMonIcon_Banette, - gMonIcon_Seviper, - gMonIcon_Zangoose, - gMonIcon_Relicanth, - gMonIcon_Aron, - gMonIcon_Lairon, - gMonIcon_Aggron, - gMonIcon_Castform, - gMonIcon_Volbeat, - gMonIcon_Illumise, - gMonIcon_Lileep, - gMonIcon_Cradily, - gMonIcon_Anorith, - gMonIcon_Armaldo, - gMonIcon_Ralts, - gMonIcon_Kirlia, - gMonIcon_Gardevoir, - gMonIcon_Bagon, - gMonIcon_Shelgon, - gMonIcon_Salamence, - gMonIcon_Beldum, - gMonIcon_Metang, - gMonIcon_Metagross, - gMonIcon_Regirock, - gMonIcon_Regice, - gMonIcon_Registeel, - gMonIcon_Kyogre, - gMonIcon_Groudon, - gMonIcon_Rayquaza, - gMonIcon_Latias, - gMonIcon_Latios, - gMonIcon_Jirachi, - gMonIcon_Deoxys, - gMonIcon_Chimecho, - gMonIcon_Egg, - gMonIcon_UnownB, - gMonIcon_UnownC, - gMonIcon_UnownD, - gMonIcon_UnownE, - gMonIcon_UnownF, - gMonIcon_UnownG, - gMonIcon_UnownH, - gMonIcon_UnownI, - gMonIcon_UnownJ, - gMonIcon_UnownK, - gMonIcon_UnownL, - gMonIcon_UnownM, - gMonIcon_UnownN, - gMonIcon_UnownO, - gMonIcon_UnownP, - gMonIcon_UnownQ, - gMonIcon_UnownR, - gMonIcon_UnownS, - gMonIcon_UnownT, - gMonIcon_UnownU, - gMonIcon_UnownV, - gMonIcon_UnownW, - gMonIcon_UnownX, - gMonIcon_UnownY, - gMonIcon_UnownZ, - gMonIcon_UnownExclamationMark, - gMonIcon_UnownQuestionMark, -}; - -const u8 gMonIconPaletteIndices[] = -{ - 0, // ?????????? - 1, // Bulbasaur - 1, // Ivysaur - 1, // Venusaur - 0, // Charmander - 0, // Charmeleon - 0, // Charizard - 0, // Squirtle - 2, // Wartortle - 2, // Blastoise - 1, // Caterpie - 1, // Metapod - 0, // Butterfree - 1, // Weedle - 2, // Kakuna - 2, // Beedrill - 0, // Pidgey - 0, // Pidgeotto - 0, // Pidgeot - 2, // Rattata - 1, // Raticate - 0, // Spearow - 0, // Fearow - 2, // Ekans - 2, // Arbok - 2, // Pikachu - 0, // Raichu - 2, // Sandshrew - 2, // Sandslash - 2, // Nidoran♀ - 2, // Nidorina - 2, // Nidoqueen - 2, // Nidoran♂ - 2, // Nidorino - 2, // Nidoking - 0, // Clefairy - 0, // Clefable - 2, // Vulpix - 1, // Ninetales - 0, // Jigglypuff - 0, // Wigglytuff - 2, // Zubat - 2, // Golbat - 1, // Oddish - 0, // Gloom - 0, // Vileplume - 0, // Paras - 0, // Parasect - 0, // Venonat - 2, // Venomoth - 2, // Diglett - 2, // Dugtrio - 1, // Meowth - 1, // Persian - 1, // Psyduck - 2, // Golduck - 1, // Mankey - 2, // Primeape - 0, // Growlithe - 0, // Arcanine - 0, // Poliwag - 0, // Poliwhirl - 0, // Poliwrath - 2, // Abra - 2, // Kadabra - 2, // Alakazam - 0, // Machop - 2, // Machoke - 0, // Machamp - 1, // Bellsprout - 1, // Weepinbell - 1, // Victreebel - 2, // Tentacool - 2, // Tentacruel - 1, // Geodude - 1, // Graveler - 1, // Golem - 0, // Ponyta - 0, // Rapidash - 0, // Slowpoke - 0, // Slowbro - 0, // Magnemite - 0, // Magneton - 1, // Farfetch'd - 2, // Doduo - 2, // Dodrio - 2, // Seel - 2, // Dewgong - 2, // Grimer - 2, // Muk - 2, // Shellder - 2, // Cloyster - 2, // Gastly - 2, // Haunter - 2, // Gengar - 2, // Onix - 2, // Drowzee - 1, // Hypno - 2, // Krabby - 2, // Kingler - 0, // Voltorb - 0, // Electrode - 0, // Exeggcute - 1, // Exeggutor - 1, // Cubone - 1, // Marowak - 2, // Hitmonlee - 2, // Hitmonchan - 1, // Lickitung - 2, // Koffing - 2, // Weezing - 1, // Rhyhorn - 1, // Rhydon - 0, // Chansey - 0, // Tangela - 1, // Kangaskhan - 0, // Horsea - 0, // Seadra - 0, // Goldeen - 0, // Seaking - 2, // Staryu - 2, // Starmie - 0, // Mr. mime - 1, // Scyther - 2, // Jynx - 1, // Electabuzz - 0, // Magmar - 2, // Pinsir - 2, // Tauros - 0, // Magikarp - 0, // Gyarados - 2, // Lapras - 2, // Ditto - 2, // Eevee - 0, // Vaporeon - 0, // Jolteon - 0, // Flareon - 0, // Porygon - 0, // Omanyte - 0, // Omastar - 2, // Kabuto - 2, // Kabutops - 0, // Aerodactyl - 1, // Snorlax - 0, // Articuno - 0, // Zapdos - 0, // Moltres - 0, // Dratini - 0, // Dragonair - 2, // Dragonite - 2, // Mewtwo - 0, // Mew - 1, // Chikorita - 1, // Bayleef - 1, // Meganium - 1, // Cyndaquil - 1, // Quilava - 1, // Typhlosion - 2, // Totodile - 2, // Croconaw - 2, // Feraligatr - 2, // Sentret - 2, // Furret - 2, // Hoothoot - 2, // Noctowl - 0, // Ledyba - 0, // Ledian - 1, // Spinarak - 0, // Ariados - 2, // Crobat - 2, // Chinchou - 0, // Lanturn - 0, // Pichu - 0, // Cleffa - 1, // Igglybuff - 2, // Togepi - 2, // Togetic - 0, // Natu - 0, // Xatu - 2, // Mareep - 0, // Flaaffy - 0, // Ampharos - 1, // Bellossom - 2, // Marill - 2, // Azumarill - 1, // Sudowoodo - 1, // Politoed - 1, // Hoppip - 1, // Skiploom - 2, // Jumpluff - 2, // Aipom - 1, // Sunkern - 1, // Sunflora - 1, // Yanma - 0, // Wooper - 0, // Quagsire - 2, // Espeon - 2, // Umbreon - 2, // Murkrow - 0, // Slowking - 0, // Misdreavus - 0, // Unown A - 0, // Wobbuffet - 1, // Girafarig - 0, // Pineco - 2, // Forretress - 2, // Dunsparce - 2, // Gligar - 0, // Steelix - 0, // Snubbull - 2, // Granbull - 0, // Qwilfish - 0, // Scizor - 1, // Shuckle - 2, // Heracross - 0, // Sneasel - 0, // Teddiursa - 2, // Ursaring - 0, // Slugma - 0, // Magcargo - 2, // Swinub - 2, // Piloswine - 0, // Corsola - 0, // Remoraid - 0, // Octillery - 0, // Delibird - 2, // Mantine - 0, // Skarmory - 0, // Houndour - 0, // Houndoom - 0, // Kingdra - 0, // Phanpy - 0, // Donphan - 0, // Porygon2 - 2, // Stantler - 1, // Smeargle - 2, // Tyrogue - 2, // Hitmontop - 1, // Smoochum - 1, // Elekid - 1, // Magby - 1, // Miltank - 1, // Blissey - 0, // Raikou - 2, // Entei - 0, // Suicune - 1, // Larvitar - 0, // Pupitar - 1, // Tyranitar - 0, // Lugia - 1, // Ho-Oh - 1, // Celebi - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 1, // Treecko - 0, // Grovyle - 1, // Sceptile - 0, // Torchic - 0, // Combusken - 0, // Blaziken - 0, // Mudkip - 0, // Marshtomp - 0, // Swampert - 2, // Poochyena - 2, // Mightyena - 2, // Zigzagoon - 2, // Linoone - 0, // Wurmple - 2, // Silcoon - 0, // Beautifly - 2, // Cascoon - 1, // Dustox - 1, // Lotad - 1, // Lombre - 1, // Ludicolo - 1, // Seedot - 1, // Nuzleaf - 0, // Shiftry - 1, // Nincada - 1, // Ninjask - 1, // Shedinja - 2, // Taillow - 2, // Swellow - 1, // Shroomish - 1, // Breloom - 1, // Spinda - 0, // Wingull - 0, // Pelipper - 2, // Surskit - 0, // Masquerain - 2, // Wailmer - 0, // Wailord - 0, // Skitty - 2, // Delcatty - 1, // Kecleon - 1, // Baltoy - 0, // Claydol - 0, // Nosepass - 1, // Torkoal - 2, // Sableye - 0, // Barboach - 0, // Whiscash - 0, // Luvdisc - 0, // Corphish - 0, // Crawdaunt - 2, // Feebas - 0, // Milotic - 0, // Carvanha - 0, // Sharpedo - 1, // Trapinch - 1, // Vibrava - 1, // Flygon - 2, // Makuhita - 1, // Hariyama - 1, // Electrike - 0, // Manectric - 1, // Numel - 0, // Camerupt - 2, // Spheal - 2, // Sealeo - 0, // Walrein - 1, // Cacnea - 1, // Cacturne - 2, // Snorunt - 0, // Glalie - 1, // Lunatone - 0, // Solrock - 2, // Azurill - 0, // Spoink - 2, // Grumpig - 0, // Plusle - 0, // Minun - 2, // Mawile - 0, // Meditite - 0, // Medicham - 0, // Swablu - 0, // Altaria - 0, // Wynaut - 0, // Duskull - 0, // Dusclops - 0, // Roselia - 2, // Slakoth - 2, // Vigoroth - 1, // Slaking - 1, // Gulpin - 2, // Swalot - 1, // Tropius - 0, // Whismur - 2, // Loudred - 2, // Exploud - 0, // Clamperl - 0, // Huntail - 0, // Gorebyss - 0, // Absol - 0, // Shuppet - 0, // Banette - 2, // Seviper - 0, // Zangoose - 1, // Relicanth - 2, // Aron - 2, // Lairon - 2, // Aggron - 0, // Castform - 0, // Volbeat - 2, // Illumise - 2, // Lileep - 0, // Cradily - 0, // Anorith - 0, // Armaldo - 1, // Ralts - 1, // Kirlia - 1, // Gardevoir - 2, // Bagon - 2, // Shelgon - 0, // Salamence - 0, // Beldum - 0, // Metang - 0, // Metagross - 2, // Regirock - 2, // Regice - 2, // Registeel - 2, // Kyogre - 0, // Groudon - 1, // Rayquaza - 0, // Latias - 2, // Latios - 0, // Jirachi - 0, // Deoxys - 0, // Chimecho - 1, // Egg - 0, // Unown B - 0, // Unown C - 0, // Unown D - 0, // Unown E - 0, // Unown F - 0, // Unown G - 0, // Unown H - 0, // Unown I - 0, // Unown J - 0, // Unown K - 0, // Unown L - 0, // Unown M - 0, // Unown N - 0, // Unown O - 0, // Unown P - 0, // Unown Q - 0, // Unown R - 0, // Unown S - 0, // Unown T - 0, // Unown U - 0, // Unown V - 0, // Unown W - 0, // Unown X - 0, // Unown Y - 0, // Unown Z - 0, // Unown Exclamation Mark - 0, // Unown Question Mark -}; - -const struct SpritePalette gMonIconPaletteTable[] = -{ - { gMonIconPalettes[0], POKE_ICON_BASE_PAL_TAG + 0 }, - { gMonIconPalettes[1], POKE_ICON_BASE_PAL_TAG + 1 }, - { gMonIconPalettes[2], POKE_ICON_BASE_PAL_TAG + 2 }, - -// There are only 3 actual palettes. The following are unused -// and don't point to valid data. - { gMonIconPalettes[3], POKE_ICON_BASE_PAL_TAG + 3 }, - { gMonIconPalettes[4], POKE_ICON_BASE_PAL_TAG + 4 }, - { gMonIconPalettes[5], POKE_ICON_BASE_PAL_TAG + 5 }, -}; - -static const struct OamData sMonIconOamData = -{ - .size = 2, - .priority = 1, -}; - -// fastest to slowest - -static const union AnimCmd sAnim_0[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sAnim_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sAnim_2[] = -{ - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sAnim_3[] = -{ - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sAnim_4[] = -{ - ANIMCMD_FRAME(0, 29), - ANIMCMD_FRAME(0, 29), // frame 0 is repeated - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd *const sMonIconAnims[] = -{ - sAnim_0, - sAnim_1, - sAnim_2, - sAnim_3, - sAnim_4, -}; - -static const union AffineAnimCmd sAffineAnim_0[] = -{ - AFFINEANIMCMD_FRAME(0, 0, 0, 10), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sAffineAnim_1[] = -{ - AFFINEANIMCMD_FRAME(-2, -2, 0, 122), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd *const sMonIconAffineAnims[] = -{ - sAffineAnim_0, - sAffineAnim_1, -}; - -const u16 sSpriteImageSizes[3][4] = -{ - // square - { - 0x20, // 1×1 - 0x80, // 2×2 - 0x200, // 4×4 - 0x800, // 8×8 - }, - - // horizontal rectangle - { - 0x40, // 2×1 - 0x80, // 4×1 - 0x100, // 4×2 - 0x400, // 8×4 - }, - - // vertical rectangle - { - 0x40, // 1×2 - 0x80, // 1×4 - 0x100, // 2×4 - 0x400, // 4×8 - }, -}; - -u16 GetUnownLetterByPersonality(u32); -const u8 *GetMonIconPtr(u16, u32 personality); -u8 UpdateMonIconFrame(struct Sprite *); -u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8); -void sub_809D7E8(struct Sprite *); - -// duplicate of sub_809D3A4 -u8 unref_sub_809D26C(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) -{ - u8 spriteId; - struct MonIconSpriteTemplate iconTemplate; - struct MonIconSpriteTemplate *iconTemplatePtr = &iconTemplate; // needed to match - - iconTemplatePtr->oam = &sMonIconOamData; - iconTemplatePtr->image = gMonIconTable[species]; - iconTemplatePtr->anims = sMonIconAnims; - iconTemplatePtr->affineAnims = sMonIconAffineAnims; - iconTemplatePtr->callback = callback; - iconTemplatePtr->paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species]; - - spriteId = CreateMonIconSprite(iconTemplatePtr, x, y, subpriority); - - UpdateMonIconFrame(&gSprites[spriteId]); - - return spriteId; -} - -u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality) -{ - u8 spriteId; - struct MonIconSpriteTemplate iconTemplate = - { - .oam = &sMonIconOamData, - .image = GetMonIconPtr(species, personality), - .anims = sMonIconAnims, - .affineAnims = sMonIconAffineAnims, - .callback = callback, - .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], - }; - - if (species > SPECIES_EGG) - iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG; - - spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); - - UpdateMonIconFrame(&gSprites[spriteId]); - - return spriteId; -} - -u8 sub_809D3A4(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) -{ - u8 spriteId; - struct MonIconSpriteTemplate iconTemplate; - struct MonIconSpriteTemplate *iconTemplatePtr = &iconTemplate; // needed to match - - iconTemplatePtr->oam = &sMonIconOamData; - iconTemplatePtr->image = gMonIconTable[species]; - iconTemplatePtr->anims = sMonIconAnims; - iconTemplatePtr->affineAnims = sMonIconAffineAnims; - iconTemplatePtr->callback = callback; - iconTemplatePtr->paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species]; - - spriteId = CreateMonIconSprite(iconTemplatePtr, x, y, subpriority); - - UpdateMonIconFrame(&gSprites[spriteId]); - - return spriteId; -} - -u16 mon_icon_convert_unown_species_id(u16 species, u32 personality) -{ - u16 result; - - if (species == SPECIES_UNOWN) - { - u16 letter = GetUnownLetterByPersonality(personality); - if (letter == 0) - letter = SPECIES_UNOWN; - else - letter += (SPECIES_UNOWN_B - 1); - result = letter; - } - else - { - if (species > SPECIES_EGG) - result = 260; - else - result = species; - } - - return result; -} - -u16 GetUnownLetterByPersonality(u32 personality) -{ - return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C; -} - -u16 sub_809D4A8(u16 species) -{ - u16 value; - - if (MailSpeciesToSpecies(species, &value) == SPECIES_UNOWN) - { - if (value == 0) - value += SPECIES_UNOWN; - else - value += (SPECIES_UNOWN_B - 1); - return value; - } - else - { - return mon_icon_convert_unown_species_id(species, 0); - } -} - -const u8 *GetMonIconPtr(u16 species, u32 personality) -{ - u16 convertedSpecies = mon_icon_convert_unown_species_id(species, personality); - return gMonIconTable[convertedSpecies]; -} - -void sub_809D510(struct Sprite *sprite) -{ - sub_809D7E8(sprite); -} - -void sub_809D51C(void) -{ - u8 i; - for (i = 0; i < 6; i++) - LoadSpritePalette(&gMonIconPaletteTable[i]); -} - -// unused -void SafeLoadMonIconPalette(u16 species) -{ - u8 palIndex; - if (species > SPECIES_EGG) - species = 260; - palIndex = gMonIconPaletteIndices[species]; - if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) - LoadSpritePalette(&gMonIconPaletteTable[palIndex]); -} - -void sub_809D580(u16 species) -{ - u8 palIndex = gMonIconPaletteIndices[species]; - if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) - LoadSpritePalette(&gMonIconPaletteTable[palIndex]); -} - -// unused -void FreeMonIconPalettes(void) -{ - u8 i; - for (i = 0; i < 6; i++) - FreeSpritePaletteByTag(gMonIconPaletteTable[i].tag); -} - -// unused -void SafeFreeMonIconPalette(u16 species) -{ - u8 palIndex; - if (species > SPECIES_EGG) - species = 260; - palIndex = gMonIconPaletteIndices[species]; - FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); -} - -void sub_809D608(u16 species) -{ - u8 palIndex; - palIndex = gMonIconPaletteIndices[species]; - FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); -} - -void sub_809D62C(struct Sprite *sprite) -{ - UpdateMonIconFrame(sprite); -} - -// TODO: try to find a way to avoid using goto and asm statement -u8 UpdateMonIconFrame(struct Sprite *sprite) -{ - u8 result = 0; - - if (sprite->animDelayCounter == 0) - { - s16 frame = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; - - if (frame != -2) - { - if (frame != -1) - goto copy; - goto end; - } - - sprite->animCmdIndex = 0; - goto end; - - copy: - RequestSpriteCopy( - (u8 *)sprite->images + sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame, - (u8 *)OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP, - sSpriteImageSizes[sprite->oam.shape][sprite->oam.size]); - { - register u8 duration asm("r0") = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; - sprite->animDelayCounter = duration; - } - sprite->animCmdIndex++; - result = sprite->animCmdIndex; - } - else - { - sprite->animDelayCounter--; - } - -end: - return result; -} - -u8 CreateMonIconSprite(struct MonIconSpriteTemplate *iconTemplate, s16 x, s16 y, u8 subpriority) -{ - u8 spriteId; - - struct SpriteFrameImage image = { NULL, sSpriteImageSizes[iconTemplate->oam->shape][iconTemplate->oam->size] }; - - struct SpriteTemplate spriteTemplate = - { - .tileTag = 0xFFFF, - .paletteTag = iconTemplate->paletteTag, - .oam = iconTemplate->oam, - .anims = iconTemplate->anims, - .images = &image, - .affineAnims = iconTemplate->affineAnims, - .callback = iconTemplate->callback, - }; - - spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); - gSprites[spriteId].animPaused = TRUE; - gSprites[spriteId].animBeginning = FALSE; - gSprites[spriteId].images = (const struct SpriteFrameImage *)iconTemplate->image; - return spriteId; -} - -void sub_809D7E8(struct Sprite *sprite) -{ - struct SpriteFrameImage image = { NULL, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] }; - sprite->images = ℑ - DestroySprite(sprite); -} - -void sub_809D824(struct Sprite *sprite, u8 animNum) -{ - sprite->animNum = animNum; - sprite->animDelayCounter = 0; - sprite->animCmdIndex = 0; -} diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c deleted file mode 100644 index f2222bd3b..000000000 --- a/src/pokemon_size_record.c +++ /dev/null @@ -1,217 +0,0 @@ -#include "global.h" -#include "pokemon_size_record.h" -#include "data2.h" -#include "event_data.h" -#include "pokedex.h" -#include "species.h" -#include "string_util.h" -#include "strings2.h" -#include "text.h" - -struct UnknownStruct -{ - u16 unk0; - u8 unk2; - u16 unk4; -}; - -extern u16 gScriptResult; - -static const struct UnknownStruct sBigMonSizeTable[] = -{ - { 290, 1, 0 }, - { 300, 1, 10 }, - { 400, 2, 110 }, - { 500, 4, 310 }, - { 600, 20, 710 }, - { 700, 50, 2710 }, - { 800, 100, 7710 }, - { 900, 150, 17710 }, - { 1000, 150, 32710 }, - { 1100, 100, -17826 }, - { 1200, 50, -7826 }, - { 1300, 20, -2826 }, - { 1400, 5, -826 }, - { 1500, 2, -326 }, - { 1600, 1, -126 }, - { 1700, 1, -26 }, -}; - -#define CM_PER_INCH 2.54 - -static u32 GetMonSizeHash(struct Pokemon *pkmn) -{ - // UB: Too few arguments for function 'GetMonData' - u16 personality = GetMonData(pkmn, MON_DATA_PERSONALITY); - u16 hpIV = GetMonData(pkmn, MON_DATA_HP_IV) & 0xF; - u16 attackIV = GetMonData(pkmn, MON_DATA_ATK_IV) & 0xF; - u16 defenseIV = GetMonData(pkmn, MON_DATA_DEF_IV) & 0xF; - u16 speedIV = GetMonData(pkmn, MON_DATA_SPD_IV) & 0xF; - u16 spAtkIV = GetMonData(pkmn, MON_DATA_SPATK_IV) & 0xF; - u16 spDefIV = GetMonData(pkmn, MON_DATA_SPDEF_IV) & 0xF; - u32 hibyte = ((attackIV ^ defenseIV) * hpIV) ^ (personality & 0xFF); - u32 lobyte = ((spAtkIV ^ spDefIV) * speedIV) ^ (personality >> 8); - - return (hibyte << 8) + lobyte; -} - -static u8 TranslateBigMonSizeTableIndex(u16 a) -{ - u8 i; - - for (i = 1; i < 15; i++) - { - if (a < sBigMonSizeTable[i].unk4) - return i - 1; - } - return i; -} - -static u32 GetMonSize(u16 species, u16 b) -{ - u64 unk2; - u64 unk4; - u64 unk0; - u32 height; - u32 var; - - height = GetPokedexHeightWeight(SpeciesToNationalPokedexNum(species), 0); - var = TranslateBigMonSizeTableIndex(b); - unk0 = sBigMonSizeTable[var].unk0; - unk2 = sBigMonSizeTable[var].unk2; - unk4 = sBigMonSizeTable[var].unk4; - unk0 += (b - unk4) / unk2; - return height * unk0 / 10; -} - -static void FormatMonSizeRecord(u8 *string, u32 size) -{ -#if ENGLISH - u8 decimalPoint[] = _("."); -#elif GERMAN - u8 decimalPoint[] = _(","); -#endif - -#ifdef UNITS_IMPERIAL - //Convert size from centimeters to inches - size = (double)(size * 10) / (CM_PER_INCH * 10); -#endif - - string = ConvertIntToDecimalStringN(string, size / 10, 0, 8); - string = StringAppend(string, decimalPoint); - ConvertIntToDecimalStringN(string, size % 10, 0, 1); -} - -static u8 CompareMonSize(u16 species, u16 *sizeRecord) -{ - if (gScriptResult == 0xFF) - { - return 0; - } - else - { - struct Pokemon *pkmn = &gPlayerParty[gScriptResult]; - - // UB: Too few arguments for function 'GetMonData' - if (GetMonData(pkmn, MON_DATA_IS_EGG) == TRUE || GetMonData(pkmn, MON_DATA_SPECIES) != species) - { - return 1; - } - else - { - u32 oldSize; - u32 newSize; - u16 sizeParams; - - *(&sizeParams) = GetMonSizeHash(pkmn); - newSize = GetMonSize(species, sizeParams); - oldSize = GetMonSize(species, *sizeRecord); - FormatMonSizeRecord(gStringVar2, newSize); - if (newSize <= oldSize) - { - return 2; - } - else - { - *sizeRecord = sizeParams; - return 3; - } - } - } -} - -//Stores species name in gStringVar1, trainer's name in gStringVar2, and size in gStringVar3 -static void GetMonSizeRecordInfo(u16 species, u16 *sizeRecord) -{ - u32 size = GetMonSize(species, *sizeRecord); - - FormatMonSizeRecord(gStringVar3, size); - StringCopy(gStringVar1, gSpeciesNames[species]); - if (*sizeRecord == 0x8100) - StringCopy(gStringVar2, gOtherText_Marco); - else - StringCopy(gStringVar2, gSaveBlock2.playerName); -} - -void InitShroomishSizeRecord(void) -{ - VarSet(VAR_SHROOMISH_SIZE_RECORD, 0x8100); -} - -void GetShroomishSizeRecordInfo(void) -{ - u16 *sizeRecord = GetVarPointer(VAR_SHROOMISH_SIZE_RECORD); - - GetMonSizeRecordInfo(SPECIES_SHROOMISH, sizeRecord); -} - -void CompareShroomishSize(void) -{ - u16 *sizeRecord = GetVarPointer(VAR_SHROOMISH_SIZE_RECORD); - - gScriptResult = CompareMonSize(SPECIES_SHROOMISH, sizeRecord); -} - -void InitBarboachSizeRecord(void) -{ - VarSet(VAR_BARBOACH_SIZE_RECORD, 0x8100); -} - -void GetBarboachSizeRecordInfo(void) -{ - u16 *sizeRecord = GetVarPointer(VAR_BARBOACH_SIZE_RECORD); - - GetMonSizeRecordInfo(SPECIES_BARBOACH, sizeRecord); -} - -void CompareBarboachSize(void) -{ - u16 *sizeRecord = GetVarPointer(VAR_BARBOACH_SIZE_RECORD); - - gScriptResult = CompareMonSize(SPECIES_BARBOACH, sizeRecord); -} - -void GiveGiftRibbonToParty(u8 index, u8 ribbonId) -{ - s32 i; - bool32 gotRibbon = FALSE; - u8 data = 1; - u8 arr[] = { 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E }; - - if (index < 11 && ribbonId < 65) - { - gSaveBlock1.giftRibbons[index] = ribbonId; - for (i = 0; i < 6; i++) - { - struct Pokemon *pkmn = &gPlayerParty[i]; - - if (GetMonData(pkmn, MON_DATA_SPECIES) != 0 && GetMonData(pkmn, MON_DATA_SANITY_BIT3) == 0) - { - SetMonData(pkmn, arr[index], &data); - gotRibbon = TRUE; - } - } - if (gotRibbon) - FlagSet(SYS_RIBBON_GET); - } -} diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c deleted file mode 100644 index 5e97523e2..000000000 --- a/src/pokemon_storage_system.c +++ /dev/null @@ -1,99 +0,0 @@ -#include "global.h" -#include "pokemon_storage_system.h" -#include "menu.h" -#include "string_util.h" - -struct StorageAction { - u8 *text; - u8 format; -}; - -extern const struct StorageAction gUnknown_083B6DF4[]; - -extern const u8 unk_2000000[]; - -EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; - -#define gUnk2002694 (u8 *)(&unk_2000000[0x2694]) -#define gUnk20026A6 (u8 *)(&unk_2000000[0x26a6]) -#define gUnk20011fa (u8 *)(&unk_2000000[0x11fa]) -#define gUnk20026e4 (u8 *)(&unk_2000000[0x26e4]) - -void sub_8098898(u8 index) { - u8 *ptr; - - MenuDrawTextWindow(10, 16, 29, 19); - - switch (gUnknown_083B6DF4[index].format) - { - - case 2: - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - ptr = StringCopy(ptr, gUnk20011fa); - break; - - case 5: - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - ptr = StringCopy(ptr, gUnk20026e4); - break; - - case 1: - // {var} + " is selected." - ptr = StringCopy(gUnk2002694, gUnk20011fa); - ptr = StringCopy(ptr, gUnknown_083B6DF4[index].text); - break; - - case 4: - // {var} + " was released." - ptr = StringCopy(gUnk2002694, gUnk20026e4); -#if ENGLISH - ptr = StringCopy(ptr, gUnknown_083B6DF4[index].text); -#elif GERMAN - ptr = de_sub_8073174(gUnk2002694, gUnknown_083B6DF4[index].text); -#endif - break; - - case 3: - { - u8 *stringLength; - u8 *text; - - text = gUnknown_083B6DF4[index].text; - stringLength = &text[StringLength(text)] + 1; - - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - ptr = StringCopy(ptr, gUnk20011fa); - ptr = StringCopy(ptr, stringLength); - } - break; - - case 6: - // "Bye-bye, ".substr(0, -1) + {var} + "Bye-bye, !".substr(-1, 1) - { - u8 *stringLength; - u8 *text; - - text = gUnknown_083B6DF4[index].text; - stringLength = &text[StringLength(text)] - 1; - - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - ptr = StringCopy(ptr - 1, gUnk20026e4); - ptr = StringCopy(ptr, stringLength); - } - break; - - case 0: - default: - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - break; - } - - while (ptr < gUnk20026A6) - { - ptr[0] = CHAR_SPACE; - ptr++; - } - - ptr[0] = EOS; - MenuPrint(gUnk2002694, 11, 17); -} diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c deleted file mode 100644 index 00a0bea29..000000000 --- a/src/pokemon_summary_screen.c +++ /dev/null @@ -1,180 +0,0 @@ -#include "global.h" -#include "pokemon_summary_screen.h" -#include "link.h" -#include "menu.h" -#include "pokemon.h" -#include "region_map.h" -#include "string_util.h" -#include "strings2.h" -#include "tv.h" - -extern struct Pokemon *unk_2018000; - -bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon) -{ - u32 trainerId; - - if (unk_2018000 == gEnemyParty) - { - u8 enemyId = GetMultiplayerId() ^ 1; - trainerId = gLinkPlayers[enemyId].trainerId & 0xFFFF; - StringCopy(gStringVar1, gLinkPlayers[enemyId].name); - StripExtCtrlCodes(gStringVar1); - } - else - { - trainerId = GetPlayerTrainerId() & 0xFFFF; - StringCopy(gStringVar1, gSaveBlock2.playerName); - } - - if (trainerId != (GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF)) - return FALSE; - - GetMonData(mon, MON_DATA_OT_NAME, gStringVar2); - - if (!StringCompareWithoutExtCtrlCodes(gStringVar1, gStringVar2)) - return TRUE; - - return FALSE; -} - -void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 top) -{ - u8 locationMet; - u8 gameMet = GetMonData(mon, MON_DATA_MET_GAME); - - if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD)) - { - MenuPrint(gOtherText_EggObtainedInTrade, left, top); - return; - } - - locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); - - if (locationMet == 255) - { - MenuPrint(gOtherText_EggNicePlace, left, top); - return; - } - - if (!PokemonSummaryScreen_CheckOT(mon)) - { - MenuPrint(gOtherText_EggObtainedInTrade, left, top); - return; - } - - asm(""); // needed to match for some reason - - if (locationMet == 253) - { - MenuPrint(gOtherText_EggHotSprings, left, top); - return; - } - - MenuPrint(gOtherText_EggDayCare, left, top); -} - -void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 top) -{ - u8 locationMet; - u8 gameMet; - u8 *ptr = gStringVar4; - u8 nature = GetNature(pokemon); - -#if ENGLISH - ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14); - - if (nature != NATURE_BOLD && nature != NATURE_GENTLE) - { - ptr = StringCopy(ptr, gOtherText_Terminator4); - } - - ptr = StringCopy(ptr, gOtherText_Nature); -#elif GERMAN - ptr = StringCopy(gStringVar4, gOtherText_Nature); - ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14); - ptr = StringCopy(ptr, gOtherText_Terminator4); -#endif - - if (PokemonSummaryScreen_CheckOT(pokemon) == TRUE) - { - locationMet = GetMonData(pokemon, MON_DATA_MET_LOCATION); - - if (GetMonData(pokemon, MON_DATA_MET_LEVEL) == 0) - { - ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, 5); - *ptr = CHAR_NEWLINE; - ptr++; - - CopyLocationName(gStringVar1, locationMet); - ptr = sub_80A1E9C(ptr, gStringVar1, 14); - StringCopy(ptr, gOtherText_Egg2); - } - else if (locationMet >= 88) - { - *ptr = CHAR_NEWLINE; - ptr++; - - StringCopy(ptr, gOtherText_ObtainedInTrade); - } - else - { - u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL); - - ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); - *ptr = CHAR_NEWLINE; - ptr++; - - CopyLocationName(gStringVar1, locationMet); - ptr = sub_80A1E9C(ptr, gStringVar1, 14); - StringCopy(ptr, gOtherText_Met); - } - } - else - { - gameMet = GetMonData(pokemon, MON_DATA_MET_GAME); - - if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD)) - { - *ptr = CHAR_NEWLINE; - ptr++; - - StringCopy(ptr, gOtherText_ObtainedInTrade); - } - else - { - locationMet = GetMonData(pokemon, MON_DATA_MET_LOCATION); - if (locationMet == 0xFF) - { - u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL); - - ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); - *ptr = CHAR_NEWLINE; - ptr++; - - StringCopy(ptr, gOtherText_FatefulEncounter); - } - else if (locationMet >= 88) - { - *ptr = CHAR_NEWLINE; - ptr++; - - StringCopy(ptr, gOtherText_ObtainedInTrade); - } - else - { - u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL); - - ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); - *ptr = CHAR_NEWLINE; - ptr++; - - CopyLocationName(gStringVar1, locationMet); - ptr = sub_80A1E9C(ptr, gStringVar1, 14); - StringCopy(ptr, gOtherText_Met2); - } - } - } - - MenuPrint(gStringVar4, left++, top++); -} diff --git a/src/pokenav.c b/src/pokenav.c deleted file mode 100644 index 84ed7b14b..000000000 --- a/src/pokenav.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "global.h" -#include "main.h" -#include "pokenav.h" -#include "battle.h" -#include "data2.h" -#include "de_rom_8040FE0.h" -#include "string_util.h" - -void sub_80F700C(u8 *arg0, u16 arg1) { - struct Trainer *trainer; - u8 *ptr; - -#if ENGLISH - trainer = (struct Trainer *) &gTrainers[gUnknown_083DFEC4->unkCEE8[arg1].unk0]; -#elif GERMAN - const u16 trainerIndex = gUnknown_083DFEC4->unkCEE8[arg1].unk0; - trainer = (struct Trainer *) &gTrainers[trainerIndex]; -#endif - - ptr = arg0; - if (arg1 < gUnknown_083DFEC4->unkD158) - { -#if ENGLISH - ptr = StringCopy(ptr, gTrainerClassNames[trainer->trainerClass]); -#elif GERMAN - ptr = StringCopy(ptr, de_sub_8041024(0, trainerIndex)); -#endif - - ptr[0] = 0xFC; - ptr[1] = 0x13; - ptr[2] = 0x4B; - ptr += 3; - ptr = StringCopy(ptr, trainer->trainerName); - } - - ptr[0] = 0xFC; - ptr[1] = 0x13; - ptr[2] = 0x80; - ptr[3] = 0xFF; -} diff --git a/src/post_battle_event_funcs.c b/src/post_battle_event_funcs.c deleted file mode 100644 index 8d85705c8..000000000 --- a/src/post_battle_event_funcs.c +++ /dev/null @@ -1,69 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "hall_of_fame.h" -#include "load_save.h" -#include "main.h" -#include "pokemon.h" -#include "rom4.h" -#include "script_pokemon_80C4.h" - -extern u8 gUnknown_02039324; - -int GameClear(void) -{ - int i; - bool32 ribbonGet; - - HealPlayerParty(); - - if (FlagGet(SYS_GAME_CLEAR) == TRUE) - { - gUnknown_02039324 = 1; - } - else - { - gUnknown_02039324 = 0; - FlagSet(SYS_GAME_CLEAR); - } - - if (!GetGameStat(1)) - SetGameStat(1, (gSaveBlock2.playTimeHours << 16) | (gSaveBlock2.playTimeMinutes << 8) | gSaveBlock2.playTimeSeconds); - - SetSecretBase2Field_9(); - - if (gSaveBlock2.playerGender == MALE) - sub_80537CC(1); - else - sub_80537CC(2); - - ribbonGet = FALSE; - - for (i = 0; i < 6; i++) - { - u8 val; - u8 *ptr = &val; - if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT2) - && !GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT3) - && !GetMonData(&gPlayerParty[i], MON_DATA_CHAMPION_RIBBON)) - { - *ptr = 1; - SetMonData(&gPlayerParty[i], MON_DATA_CHAMPION_RIBBON, ptr); - ribbonGet = TRUE; - } - } - - if (ribbonGet == TRUE) - { - IncrementGameStat(42); - FlagSet(SYS_RIBBON_GET); - } - - SetMainCallback2(sub_8141F90); - return 0; -} - -int sp0C8_whiteout_maybe(void) -{ - SetMainCallback2(CB2_WhiteOut); - return 0; -} diff --git a/src/record_mixing.c b/src/record_mixing.c deleted file mode 100644 index d1083910c..000000000 --- a/src/record_mixing.c +++ /dev/null @@ -1,1085 +0,0 @@ -#include "global.h" -#include "record_mixing.h" -#include "battle_tower.h" -#include "cable_club.h" -#include "daycare.h" -#include "dewford_trend.h" -#include "event_data.h" -#include "fldeff_80C5CD4.h" -#include "item.h" -#include "items.h" -#include "load_save.h" -#include "link.h" -#include "mauville_old_man.h" -#include "menu.h" -#include "mystery_event_script.h" -#include "rng.h" -#include "rom4.h" -#include "save.h" -#include "script.h" -#include "secret_base.h" -#include "songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "tv.h" - -extern u8 ewram[]; -#define unk_2018000 (*(struct PlayerRecords *)(ewram + 0x18000)) -#define unk_2008000 (*(struct PlayerRecords *)(ewram + 0x08000)) - -extern struct RecordMixing_UnknownStruct gUnknown_02038738; -extern u16 gSpecialVar_0x8005; - -u32 gUnknown_03005D2C; - -static u8 gUnknown_03000718; -static u8 gUnknown_0300071C[4]; - -void *recordMixingSecretBases = &gSaveBlock1.secretBases; -void *recordMixingTvShows = &gSaveBlock1.tvShows; -void *gUnknown_083D0274 = &gSaveBlock1.unknown_2ABC; -void *gUnknown_083D0278 = &gSaveBlock1.oldMan; -void *recordMixingEasyChatPairs = &gSaveBlock1.easyChatPairs; -struct RecordMixing_UnknownStruct *gUnknown_083D0280 = &gUnknown_02038738; -void *gUnknown_083D0284 = &gSaveBlock2.filler_A8; - -#define BUFFER_CHUNK_SIZE 200 - -void sub_80B929C(void) -{ - sub_8083A84(Task_RecordMixing_Main); -} - -struct PlayerRecords -{ - struct SecretBaseRecord secretBases[20]; - TVShow tvShows[25]; - u8 filler1004[0x40]; - u8 filler1044[0x40]; - struct EasyChatPair easyChatPairs[5]; - struct RecordMixing_UnknownStruct filler10AC; - u8 filler1124[0xA4]; - u16 filler11C8[0x34]; -}; - -void RecordMixing_PrepareExchangePacket(void) -{ - sub_80BC300(); - sub_80C045C(); - - memcpy(unk_2018000.secretBases, recordMixingSecretBases, sizeof(unk_2018000.secretBases)); - memcpy(unk_2018000.tvShows, recordMixingTvShows, sizeof(unk_2018000.tvShows)); - memcpy(unk_2018000.filler1004, gUnknown_083D0274, sizeof(unk_2008000.filler1004)); - memcpy(unk_2018000.filler1044, gUnknown_083D0278, sizeof(unk_2008000.filler1044)); - memcpy(unk_2018000.easyChatPairs, recordMixingEasyChatPairs, sizeof(unk_2018000.easyChatPairs)); - gUnknown_02038738.data[0] = gSaveBlock1.filler_303C.data[0]; - gUnknown_02038738.data[1] = gSaveBlock1.filler_303C.data[1]; - sub_8041324(gSaveBlock1.daycareData, &gUnknown_02038738); - memcpy(&unk_2018000.filler10AC, gUnknown_083D0280, sizeof(struct RecordMixing_UnknownStruct)); - memcpy(unk_2018000.filler1124, gUnknown_083D0284, sizeof(unk_2018000.filler1124)); - - if (GetMultiplayerId() == 0) - unk_2018000.filler11C8[0] = GetRecordMixingGift(); -} - -void RecordMixing_ReceiveExchangePacket(u32 a) -{ - sub_80BD674(unk_2008000.secretBases, sizeof(struct PlayerRecords), a); - sub_80BFD44((u8 *)unk_2008000.tvShows, sizeof(struct PlayerRecords), a); - sub_80C0514(unk_2008000.filler1004, sizeof(struct PlayerRecords), a); - sub_80B9B1C(unk_2008000.filler1044, sizeof(struct PlayerRecords), a); - sub_80FA4E4(unk_2008000.easyChatPairs, sizeof(struct PlayerRecords), a); - sub_80B9C6C((u8 *)&unk_2008000.filler10AC, sizeof(struct PlayerRecords), a, unk_2008000.tvShows); - sub_80B9B70(unk_2008000.filler1124, sizeof(struct PlayerRecords), a); - sub_80B9F3C(unk_2008000.filler11C8, a); -} - -#define tCounter data[0] - -void Task_RecordMixing_SoundEffect(u8 taskId) -{ - gTasks[taskId].tCounter++; - if (gTasks[taskId].tCounter == 50) - { - PlaySE(SE_W213); - gTasks[taskId].tCounter = 0; - } -} - -#undef tCounter - - -#define tState data[0] -#define tSndEffTaskId data[15] - -void Task_RecordMixing_Main(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (tState) - { - case 0: // init - sub_8007270(gSpecialVar_0x8005); - VarSet(VAR_0x4000, 1); - gUnknown_03000718 = 0; - RecordMixing_PrepareExchangePacket(); - CreateRecordMixingSprite(); - tState = 1; - data[10] = CreateTask(sub_80B95F0, 0x50); - tSndEffTaskId = CreateTask(Task_RecordMixing_SoundEffect, 0x51); - break; - case 1: // wait for sub_80B95F0 - if (!gTasks[data[10]].isActive) - { - tState = 2; - FlagSet(SYS_MIX_RECORD); - DestroyRecordMixingSprite(); - DestroyTask(tSndEffTaskId); - } - break; - case 2: - data[10] = CreateTask(sub_80BA00C, 10); - tState = 3; - PlaySE(SE_W226); - break; - case 3: // wait for sub_80BA00C - if (!gTasks[data[10]].isActive) - { - tState = 4; - data[10] = sub_8083664(); - sub_80720B0(); - MenuPrint(gOtherText_MixingComplete, 2, 15); - data[8] = 0; - } - break; - case 4: // wait 60 frames - data[8]++; - if (data[8] > 60) - tState = 5; - break; - case 5: - if (!gTasks[data[10]].isActive) - { - sub_8055588(); - MenuZeroFillScreen(); - DestroyTask(taskId); - EnableBothScriptContexts(); - } - break; - } -} - -void sub_80B95F0(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->tState) - { - case 0: - sub_80B9A78(); - MenuDisplayMessageBox(); - MenuPrint(gOtherText_MixingRecordsWithFriend, 2, 15); - task->data[8] = 0x708; - task->tState = 400; - ClearLinkCallback_2(); - break; - case 100: // wait 20 frames - task->data[12]++; - if (task->data[12] > 20) - { - task->data[12] = 0; - task->tState = 101; - } - break; - case 101: - { - u8 players = GetLinkPlayerCount_2(); - - if (IsLinkMaster() == 1) - { - if (players == sub_800820C()) - { - PlaySE(SE_PIN); - task->tState = 201; - task->data[12] = 0; - } - } - else - { - PlaySE(SE_BOO); - task->tState = 301; - } - } - break; - case 201: - if (sub_800820C() == GetLinkPlayerCount_2()) - { - if (++task->data[12] > GetLinkPlayerCount_2() * 30) - { - sub_8007F4C(); - task->tState = 1; - } - } - break; - case 301: - if (sub_800820C() == GetLinkPlayerCount_2()) - task->tState = 1; - break; - case 400: // wait 20 frames - task->data[12]++; - if (task->data[12] > 20) - { - task->tState = 1; - task->data[12] = 0; - } - break; - case 1: // wait for handshake - if (gReceivedRemoteLinkPlayers) - { - ConvertIntToDecimalStringN(gStringVar1, GetMultiplayerId_(), 2, 2); - task->tState = 5; - } - break; - case 2: - { - u8 subTaskId; - - task->data[6] = GetLinkPlayerCount_2(); - task->tState = 0; - task->data[5] = GetMultiplayerId_(); - task->func = Task_RecordMixing_SendPacket; - StorePtrInTaskData(&unk_2018000, &task->data[2]); - subTaskId = CreateTask(Task_RecordMixing_CopyReceiveBuffer, 0x50); - task->data[10] = subTaskId; - gTasks[subTaskId].data[0] = taskId; - StorePtrInTaskData((u8 *)&unk_2008000, &gTasks[subTaskId].data[5]); - } - break; - case 5: // wait 60 frames - task->data[10]++; - if (task->data[10] > 60) - { - task->data[10] = 0; - task->tState = 2; - } - break; - } -} - -void Task_RecordMixing_SendPacket(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - // does this send the data 24 times? - - switch (task->tState) - { - case 0: //Copy record data to send buffer - { - void *recordData = (u8 *)LoadPtrFromTaskData(&task->data[2]) + BUFFER_CHUNK_SIZE * task->data[4]; - - memcpy(gBlockSendBuffer, recordData, BUFFER_CHUNK_SIZE); - task->tState++; - } - break; - case 1: - if (GetMultiplayerId() == 0) - sub_8007E9C(1); - task->tState++; - break; - case 2: - break; - case 3: - task->data[4]++; - if ((u16)task->data[4] == 24) - task->tState++; - else - task->tState = 0; - break; - case 4: - if (!gTasks[task->data[10]].isActive) - task->func = Task_RecordMixing_SendPacket_SwitchToReceive; - } -} - -void Task_RecordMixing_CopyReceiveBuffer(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - s32 recvStatus = GetBlockReceivedStatus(); - u8 handledPlayers = 0; - - if (recvStatus == sub_8008198()) - { - u8 player; - - for (player = 0; player < GetLinkPlayerCount(); player++) - { - void *src; - u8 *dst; - - if ((recvStatus >> player) & 1) - { - dst = LoadPtrFromTaskData(&task->data[5]) + task->data[player + 1] * BUFFER_CHUNK_SIZE + player * sizeof(struct PlayerRecords); - src = GetPlayerRecvBuffer(player); - if ((task->data[player + 1] + 1) * BUFFER_CHUNK_SIZE > sizeof(struct PlayerRecords)) - memcpy(dst, src, sizeof(struct PlayerRecords) - task->data[player + 1] * BUFFER_CHUNK_SIZE); - else - memcpy(dst, src, BUFFER_CHUNK_SIZE); - ResetBlockReceivedFlag(player); - task->data[player + 1]++; - if ((u16)task->data[player + 1] == 0x18) - handledPlayers++; - } - } - gTasks[task->data[0]].data[0]++; - } - if (handledPlayers == GetLinkPlayerCount()) - DestroyTask(taskId); -} - -void sub_80B99B4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - if (!gTasks[task->data[10]].isActive) - DestroyTask(taskId); -} - -void Task_RecordMixing_ReceivePacket(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - task->func = sub_80B99B4; - if (gUnknown_03000718 == 1) - RecordMixing_ReceiveExchangePacket(task->data[5]); -} - -void Task_RecordMixing_SendPacket_SwitchToReceive(u8 taskId) -{ - gTasks[taskId].func = Task_RecordMixing_ReceivePacket; - gUnknown_03000718 = 1; -} - -void *LoadPtrFromTaskData(u16 *taskData) -{ - return (void *)(taskData[0] | (taskData[1] << 16)); -} - -void StorePtrInTaskData(void *ptr, u16 *taskData) -{ - taskData[0] = (u32)ptr; - taskData[1] = (u32)ptr >> 16; -} - -u8 GetMultiplayerId_(void) -{ - return GetMultiplayerId(); -} - -u16 *GetPlayerRecvBuffer(u8 player) -{ - return gBlockRecvBuffer[player]; -} - -void sub_80B9A78(void) -{ - gUnknown_03005D2C = sizeof(struct PlayerRecords); -} - -const u8 gUnknown_083D0288[2] = {1, 0}; - -const u8 gUnknown_083D028A[2][3] = -{ - {1, 2, 0}, - {2, 0, 1}, -}; - -const u8 gUnknown_083D0290[9][4] = -{ - {1, 0, 3, 2}, - {3, 0, 1, 2}, - {2, 0, 3, 1}, - {1, 3, 0, 2}, - {2, 3, 0, 1}, - {3, 2, 0, 1}, - {1, 2, 3, 0}, - {2, 3, 1, 0}, - {3, 2, 1, 0}, -}; - -void sub_80B9A88(u8 *a) -{ - u32 i; - u32 id; - u32 players = GetLinkPlayerCount(); - - switch (players) - { - case 2: - for (i = 0; i < 2; i++) - a[i] = gUnknown_083D0288[i]; - break; - case 3: - id = GetLinkPlayerTrainerId(0) % 2; - for (i = 0; i < 3; i++) - a[i] = gUnknown_083D028A[id][i]; - break; - case 4: - id = GetLinkPlayerTrainerId(0) % 9; - for (i = 0; i < 4; i++) - a[i] = gUnknown_083D0290[id][i]; - break; - default: - break; - } -} - -void sub_80B9B1C(u8 *a, size_t size, u8 index) -{ - u8 arr[4]; - u8 *ptr; - - sub_80B9A88(arr); - //Probably not how it was originally written, but this matches. - memcpy(a + index * size, (ptr = gUnknown_083D0278), 0x40); - memcpy(ptr, a + arr[index] * size, 0x40); - sub_80F7F30(); -} - -void sub_80B9B70(u8 *a, size_t size, u8 index) -{ - sub_80B9A88(gUnknown_0300071C); - memcpy(a + size * index, a + size * gUnknown_0300071C[index], 0xA4); - sub_8134AC0(a + size * index); -} - -u8 sub_80B9BBC(u16 *a) -{ - return a[16]; -} - -void sub_80B9BC4(u8 *a, size_t b, u8 c[][2], u8 d, u8 e) -{ - struct RecordMixing_UnknownStructSub *r6 = (struct RecordMixing_UnknownStructSub *)(a + b * c[d][0]); - struct RecordMixing_UnknownStructSub *src = r6 + c[d][1]; - struct RecordMixing_UnknownStructSub sp0 = *src; - struct RecordMixing_UnknownStructSub *r8 = (struct RecordMixing_UnknownStructSub *)(a + b * c[e][0]); - - r6 += c[d][1]; - *r6 = *(r8 + c[e][1]); - - r8 += c[e][1]; - *r8 = sp0; -} - -u8 sub_80B9C4C(u8 *a) -{ - int i; - u8 r2 = 0; - - for (i = 0; i < 0x100; i++) - r2 += a[i]; - return r2; -} - -const u8 gUnknown_083D02B4[][2] = -{ - {0, 1}, - {1, 2}, - {2, 0}, -}; - -const u8 gUnknown_083D02BA[3][4] = -{ - {0, 1, 2, 3}, - {0, 2, 1, 3}, - {0, 3, 2, 1}, -}; - -#ifdef NONMATCHING -void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) -{ - u8 r8; - u8 sp4[4]; - u8 sp8[4]; - void *spC[4]; - u8 sp1C[4][2]; - u8 sp24[4][2]; - u8 sp3C; - u16 sp40 = Random(); - u16 i; // r3 - u16 r7; - u8 r1; - struct RecordMixing_UnknownStruct *r6; - - //asm("":::"r8"); - SeedRng(gLinkPlayers[0].trainerId); - r8 = GetLinkPlayerCount(); - for (i = 0; i < 4; i++) - { - sp4[i] = 0xFF; - sp8[i] = 0; - sp1C[i][0] = 0; - sp1C[i][1] = 0; - } - sp3C = 0; - for (i = 0; i < r8; i++) - { - r6 = (struct RecordMixing_UnknownStruct *)(a + b * i); - if (r6->unk70 != 0) - { - for (r7 = 0; r7 < r6->unk70; r7++) - { - if (r6->unk74[r7] == 0) - sp1C[i][r7] = 1; - } - } - //_080B9D3C - } - //_080B9D46 - for (r7 = 0, i = 0; i < r8; i++) - { - r6 = (struct RecordMixing_UnknownStruct *)(a + b * i); - if (sp1C[i][0] == 1 || sp1C[i][1] == 1) - sp3C++; - if (sp1C[i][0] == 1 && sp1C[i][1] == 0) - { - sp24[r7][0] = i; - sp24[r7][1] = 0; - r7++; - } - else if (sp1C[i][0] == 0 && sp1C[i][1] == 1) - { - sp24[r7][0] = i; - sp24[r7][1] = 0; - r7++; - } - //else if (sp1C[i][0] == 1 + 1 && sp1C[i][1] + 1 == 1 + 1) - else if (sp1C[i][0] == 1 && sp1C[i][1] == 1) - { - u8 r4, r1; - - sp24[r7][0] = i; - r4 = sub_80B9BBC((u16 *)&r6->data[0]); - r1 = sub_80B9BBC((u16 *)&r6->data[1]); - - asm(""); - if (r4 == 0 && r1 != 0) - sp24[r7][1] = 1; - else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0)) - sp24[r7][1] = Random() % 2; - else - sp24[r7][1] = 0; - /* - if (r4 == 0 && r1 != 0) - sp24[r7][1] = 1; - else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0)) - sp24[r7][1] = Random() % 2; - else - sp24[r7][1] = 0; - */ - - /* - if (r4 == 0 && r1 != 0) - sp24[r7][1] = 1; - else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0)) - //sp24[r7][1] = ((Random() << 16) >> 16) % 2; - sp24[r7][1] = Random() % 2; - else - sp24[r7][1] = 0; - */ - //_080B9E2C: - r7++; - } - } - //_080B9E3E - for (i = 0; i < 4; i++) - { - r6 = (struct RecordMixing_UnknownStruct *)a + b * c; - spC[i] = r6; - } - r1 = sub_80B9C4C(d) % 3; - switch (sp3C) - { - case 2: - sub_80B9BC4(a, b, (u8 *)sp24, 0, 1); - break; - case 3: - { - u8 var1 = gUnknown_083D02B4[r1][0]; - u8 var2 = gUnknown_083D02B4[r1][1]; - sub_80B9BC4(a, b, (u8 *)sp24, var1, var2); - } - break; - case 4: - { - u8 *r6 = (u8 *)sp24; - u8 var1 = gUnknown_083D02BA[r1][0]; - u8 var2 = gUnknown_083D02BA[r1][1]; - sub_80B9BC4(a, b, r6, var1, var2); - } - { - u8 *r6 = (u8 *)sp24; - u8 var1 = gUnknown_083D02BA[r1][2]; - u8 var2 = gUnknown_083D02BA[r1][3]; - sub_80B9BC4(a, b, r6, var1, var2); - } - break; - } - //_080B9EF0 - //memcpy(&gSaveBlock1.filler_303C.data[0], a + b * c, 0x38); - //memcpy(&gSaveBlock1.filler_303C.data[1], a + b * c + 0x38, 0x38); - r6 = (struct RecordMixing_UnknownStruct *)(a + b * c); - gSaveBlock1.filler_303C.data[0] = r6->data[0]; - gSaveBlock1.filler_303C.data[1] = r6->data[1]; - //memcpy(&gSaveBlock1.filler_303C.data[0], &r6->data[0], 0x38); - //memcpy(&gSaveBlock1.filler_303C.data[1], &r6->data[1], 0x38); - SeedRng(sp40); -} -#else -__attribute__((naked)) -void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x58\n\ - str r0, [sp, 0x2C]\n\ - str r1, [sp, 0x30]\n\ - str r3, [sp, 0x38]\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - str r2, [sp, 0x34]\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x40]\n\ - ldr r0, _080B9DA8 @ =gLinkPlayers\n\ - ldrh r0, [r0, 0x4]\n\ - bl SeedRng\n\ - bl GetLinkPlayerCount\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - movs r3, 0\n\ - add r0, sp, 0x1C\n\ - mov r9, r0\n\ - movs r1, 0x1D\n\ - add r1, sp\n\ - mov r10, r1\n\ - mov r2, sp\n\ - adds r2, 0xC\n\ - str r2, [sp, 0x4C]\n\ - movs r7, 0xFF\n\ - add r4, sp, 0x8\n\ - movs r2, 0\n\ - mov r6, r9\n\ - mov r5, r10\n\ -_080B9CBC:\n\ - mov r1, sp\n\ - adds r1, r3\n\ - adds r1, 0x4\n\ - ldrb r0, [r1]\n\ - orrs r0, r7\n\ - strb r0, [r1]\n\ - adds r0, r4, r3\n\ - strb r2, [r0]\n\ - lsls r1, r3, 1\n\ - adds r0, r6, r1\n\ - strb r2, [r0]\n\ - adds r1, r5, r1\n\ - strb r2, [r1]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x3\n\ - bls _080B9CBC\n\ - movs r4, 0\n\ - str r4, [sp, 0x3C]\n\ - movs r3, 0\n\ - mov r1, r8\n\ - lsls r0, r1, 16\n\ - lsrs r1, r0, 16\n\ - str r0, [sp, 0x50]\n\ - ldr r4, [sp, 0x30]\n\ - ldr r0, [sp, 0x34]\n\ - adds r2, r4, 0\n\ - muls r2, r0\n\ - str r2, [sp, 0x48]\n\ - ldr r2, [sp, 0x3C]\n\ - cmp r2, r1\n\ - bcs _080B9D46\n\ - mov r8, r1\n\ -_080B9D00:\n\ - ldr r4, [sp, 0x30]\n\ - adds r0, r4, 0\n\ - muls r0, r3\n\ - ldr r1, [sp, 0x2C]\n\ - adds r6, r1, r0\n\ - ldr r0, [r6, 0x70]\n\ - cmp r0, 0\n\ - beq _080B9D3C\n\ - movs r7, 0\n\ - cmp r7, r0\n\ - bcs _080B9D3C\n\ - adds r4, r6, 0\n\ - adds r4, 0x74\n\ - mov r2, r9\n\ - lsls r1, r3, 1\n\ - movs r5, 0x1\n\ -_080B9D20:\n\ - lsls r0, r7, 1\n\ - adds r0, r4, r0\n\ - ldrh r0, [r0]\n\ - cmp r0, 0\n\ - bne _080B9D30\n\ - adds r0, r7, r1\n\ - adds r0, r2, r0\n\ - strb r5, [r0]\n\ -_080B9D30:\n\ - adds r0, r7, 0x1\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ - ldr r0, [r6, 0x70]\n\ - cmp r7, r0\n\ - bcc _080B9D20\n\ -_080B9D3C:\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, r8\n\ - bcc _080B9D00\n\ -_080B9D46:\n\ - movs r7, 0\n\ - movs r3, 0\n\ - ldr r2, [sp, 0x50]\n\ - cmp r2, 0\n\ - beq _080B9E3E\n\ - mov r4, sp\n\ - adds r4, 0x24\n\ - str r4, [sp, 0x44]\n\ - movs r0, 0x25\n\ - add r0, sp\n\ - mov r8, r0\n\ -_080B9D5C:\n\ - ldr r1, [sp, 0x30]\n\ - adds r0, r1, 0\n\ - muls r0, r3\n\ - ldr r2, [sp, 0x2C]\n\ - adds r6, r2, r0\n\ - lsls r1, r3, 1\n\ - mov r4, r9\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - beq _080B9D7C\n\ - mov r2, r10\n\ - adds r0, r2, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - bne _080B9D86\n\ -_080B9D7C:\n\ - ldr r0, [sp, 0x3C]\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x3C]\n\ -_080B9D86:\n\ - mov r4, r9\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - bne _080B9DAC\n\ - mov r2, r10\n\ - adds r0, r2, r1\n\ - ldrb r2, [r0]\n\ - cmp r2, 0\n\ - bne _080B9DAC\n\ -_080B9D9A:\n\ - lsls r1, r7, 1\n\ - ldr r4, [sp, 0x44]\n\ - adds r0, r4, r1\n\ - strb r3, [r0]\n\ - add r1, r8\n\ - strb r2, [r1]\n\ - b _080B9E2C\n\ - .align 2, 0\n\ -_080B9DA8: .4byte gLinkPlayers\n\ -_080B9DAC:\n\ - mov r2, r9\n\ - adds r0, r2, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _080B9DC0\n\ - mov r4, r10\n\ - adds r0, r4, r1\n\ - ldrb r2, [r0]\n\ - cmp r2, 0x1\n\ - beq _080B9D9A\n\ -_080B9DC0:\n\ - mov r2, r9\n\ - adds r0, r2, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - bne _080B9E32\n\ - mov r4, r10\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - bne _080B9E32\n\ - lsls r5, r7, 1\n\ - ldr r1, [sp, 0x44]\n\ - adds r0, r1, r5\n\ - strb r3, [r0]\n\ - adds r0, r6, 0\n\ - str r3, [sp, 0x54]\n\ - bl sub_80B9BBC\n\ - adds r4, r0, 0\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - adds r0, r6, 0\n\ - adds r0, 0x38\n\ - bl sub_80B9BBC\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - ldr r3, [sp, 0x54]\n\ - cmp r4, 0\n\ - bne _080B9E0A\n\ - cmp r1, 0\n\ - beq _080B9E0E\n\ - mov r2, r8\n\ - adds r1, r2, r5\n\ - movs r0, 0x1\n\ - strb r0, [r1]\n\ - b _080B9E2C\n\ -_080B9E0A:\n\ - cmp r1, 0\n\ - beq _080B9E26\n\ -_080B9E0E:\n\ - str r3, [sp, 0x54]\n\ - bl Random\n\ - mov r4, r8\n\ - adds r2, r4, r5\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x1\n\ - ands r0, r1\n\ - strb r0, [r2]\n\ - ldr r3, [sp, 0x54]\n\ - b _080B9E2C\n\ -_080B9E26:\n\ - mov r2, r8\n\ - adds r0, r2, r5\n\ - strb r1, [r0]\n\ -_080B9E2C:\n\ - adds r0, r7, 0x1\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ -_080B9E32:\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - ldr r4, [sp, 0x50]\n\ - cmp r0, r4\n\ - bcc _080B9D5C\n\ -_080B9E3E:\n\ - movs r3, 0\n\ - ldr r1, [sp, 0x48]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 3\n\ - ldr r2, [sp, 0x2C]\n\ - adds r6, r2, r0\n\ - ldr r1, [sp, 0x4C]\n\ -_080B9E4E:\n\ - lsls r0, r3, 2\n\ - adds r0, r1, r0\n\ - str r6, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x3\n\ - bls _080B9E4E\n\ - ldr r0, [sp, 0x38]\n\ - bl sub_80B9C4C\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - ldr r4, [sp, 0x3C]\n\ - cmp r4, 0x3\n\ - beq _080B9E9C\n\ - cmp r4, 0x3\n\ - bgt _080B9E82\n\ - cmp r4, 0x2\n\ - beq _080B9E8A\n\ - b _080B9EF0\n\ -_080B9E82:\n\ - ldr r0, [sp, 0x3C]\n\ - cmp r0, 0x4\n\ - beq _080B9EBC\n\ - b _080B9EF0\n\ -_080B9E8A:\n\ - add r2, sp, 0x24\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - ldr r0, [sp, 0x2C]\n\ - ldr r1, [sp, 0x30]\n\ - movs r3, 0\n\ - bl sub_80B9BC4\n\ - b _080B9EF0\n\ -_080B9E9C:\n\ - ldr r0, _080B9EB8 @ =gUnknown_083D02B4\n\ - lsls r1, 1\n\ - adds r2, r1, r0\n\ - ldrb r3, [r2]\n\ - adds r0, 0x1\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - add r2, sp, 0x24\n\ - str r0, [sp]\n\ - ldr r0, [sp, 0x2C]\n\ - ldr r1, [sp, 0x30]\n\ - bl sub_80B9BC4\n\ - b _080B9EF0\n\ - .align 2, 0\n\ -_080B9EB8: .4byte gUnknown_083D02B4\n\ -_080B9EBC:\n\ - add r6, sp, 0x24\n\ - ldr r4, _080B9F2C @ =gUnknown_083D02BA\n\ - lsls r5, r1, 2\n\ - adds r0, r5, r4\n\ - ldrb r3, [r0]\n\ - adds r0, r4, 0x1\n\ - adds r0, r5, r0\n\ - ldrb r0, [r0]\n\ - str r0, [sp]\n\ - ldr r0, [sp, 0x2C]\n\ - ldr r1, [sp, 0x30]\n\ - adds r2, r6, 0\n\ - bl sub_80B9BC4\n\ - adds r0, r4, 0x2\n\ - adds r0, r5, r0\n\ - ldrb r3, [r0]\n\ - adds r4, 0x3\n\ - adds r5, r4\n\ - ldrb r0, [r5]\n\ - str r0, [sp]\n\ - ldr r0, [sp, 0x2C]\n\ - ldr r1, [sp, 0x30]\n\ - adds r2, r6, 0\n\ - bl sub_80B9BC4\n\ -_080B9EF0:\n\ - ldr r1, [sp, 0x2C]\n\ - ldr r2, [sp, 0x48]\n\ - adds r6, r1, r2\n\ - ldr r4, _080B9F30 @ =gSaveBlock1\n\ - ldr r1, _080B9F34 @ =0x0000303c\n\ - adds r0, r4, r1\n\ - adds r1, r6, 0\n\ - movs r2, 0x38\n\ - bl memcpy\n\ - ldr r2, _080B9F38 @ =0x00003074\n\ - adds r4, r2\n\ - adds r1, r6, 0\n\ - adds r1, 0x38\n\ - adds r0, r4, 0\n\ - movs r2, 0x38\n\ - bl memcpy\n\ - ldr r0, [sp, 0x40]\n\ - bl SeedRng\n\ - add sp, 0x58\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B9F2C: .4byte gUnknown_083D02BA\n\ -_080B9F30: .4byte gSaveBlock1\n\ -_080B9F34: .4byte 0x0000303c\n\ -_080B9F38: .4byte 0x00003074\n\ - .syntax divided\n"); -} -#endif - -void sub_80B9F3C(u16 *a, u8 b) -{ - if (b != 0 && *a != 0) - { - if (GetPocketByItemId(*a) == 5) - { - if (!CheckBagHasItem(*a, 1) && !CheckPCHasItem(*a, 1) && AddBagItem(*a, 1)) - { - VarSet(VAR_0x4001, *a); - StringCopy(gStringVar1, gLinkPlayers[0].name); - if (*a == ITEM_EON_TICKET) - FlagSet(SYS_HAS_EON_TICKET); - } - else - { - VarSet(VAR_0x4001, ITEM_NONE); - } - } - else - { - if (AddBagItem(*a, 1) == TRUE) - { - VarSet(VAR_0x4001, *a); - StringCopy(gStringVar1, gLinkPlayers[0].name); - } - else - { - VarSet(VAR_0x4001, ITEM_NONE); - } - } - } -} - -void sub_80BA00C(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - task->data[0]++; - break; - case 1: - task->data[0]++; - break; - case 2: - SetSecretBase2Field_9_AndHideBG(); - sub_8125E2C(); - task->data[0]++; - break; - case 3: - if (sub_8125E6C() != 0) - { - ClearSecretBase2Field_9_2(); - task->data[0]++; - task->data[1] = 0; - } - break; - case 4: - task->data[1]++; - if (task->data[1] > 10) - { - sub_800832C(); - task->data[0]++; - } - break; - case 5: - if (!gReceivedRemoteLinkPlayers) - DestroyTask(taskId); - break; - } -} diff --git a/src/region_map.c b/src/region_map.c deleted file mode 100644 index 076dfecec..000000000 --- a/src/region_map.c +++ /dev/null @@ -1,1847 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "field_effect.h" -#include "field_specials.h" -#include "m4a.h" -#include "main.h" -#include "map_constants.h" -#include "menu.h" -#include "palette.h" -#include "pokemon_menu.h" -#include "region_map.h" -#include "rom4.h" -#include "secret_base.h" -#include "songs.h" -#include "sprite.h" -#include "strings.h" -#include "string_util.h" -#include "text.h" -#include "trig.h" - -// Map Section IDs -#define MAPSEC_LITTLEROOT_TOWN 0 -#define MAPSEC_OLDALE_TOWN 1 -#define MAPSEC_DEWFORD_TOWN 2 -#define MAPSEC_LAVARIDGE_TOWN 3 -#define MAPSEC_FALLARBOR_TOWN 4 -#define MAPSEC_VERDANTURF_TOWN 5 -#define MAPSEC_PACIFIDLOG_TOWN 6 -#define MAPSEC_PETALBURG_CITY 7 -#define MAPSEC_SLATEPORT_CITY 8 -#define MAPSEC_MAUVILLE_CITY 9 -#define MAPSEC_RUSTBORO_CITY 10 -#define MAPSEC_FORTREE_CITY 11 -#define MAPSEC_LILYCOVE_CITY 12 -#define MAPSEC_MOSSDEEP_CITY 13 -#define MAPSEC_SOOTOPOLIS_CITY 14 -#define MAPSEC_EVER_GRANDE_CITY 15 -#define MAPSEC_ROUTE_101 0x10 -#define MAPSEC_ROUTE_102 0x11 -#define MAPSEC_ROUTE_103 0x12 -#define MAPSEC_ROUTE_104 0x13 -#define MAPSEC_ROUTE_105 0x14 -#define MAPSEC_ROUTE_106 0x15 -#define MAPSEC_ROUTE_107 0x16 -#define MAPSEC_ROUTE_108 0x17 -#define MAPSEC_ROUTE_109 0x18 -#define MAPSEC_ROUTE_110 0x19 -#define MAPSEC_ROUTE_111 0x1A -#define MAPSEC_ROUTE_112 0x1B -#define MAPSEC_ROUTE_113 0x1C -#define MAPSEC_ROUTE_114 0x1D -#define MAPSEC_ROUTE_115 0x1E -#define MAPSEC_ROUTE_116 0x1F -#define MAPSEC_ROUTE_117 0x20 -#define MAPSEC_ROUTE_118 0x21 -#define MAPSEC_ROUTE_119 0x22 -#define MAPSEC_ROUTE_120 0x23 -#define MAPSEC_ROUTE_121 0x24 -#define MAPSEC_ROUTE_122 0x25 -#define MAPSEC_ROUTE_123 0x26 -#define MAPSEC_ROUTE_124 0x27 -#define MAPSEC_ROUTE_125 0x28 -#define MAPSEC_ROUTE_126 0x29 -#define MAPSEC_ROUTE_127 0x2A -#define MAPSEC_ROUTE_128 0x2B -#define MAPSEC_ROUTE_129 0x2C -#define MAPSEC_ROUTE_130 0x2D -#define MAPSEC_ROUTE_131 0x2E -#define MAPSEC_ROUTE_132 0x2F -#define MAPSEC_ROUTE_133 0x30 -#define MAPSEC_ROUTE_134 0x31 -#define MAPSEC_UNDERWATER1 0x32 -#define MAPSEC_UNDERWATER2 0x33 -#define MAPSEC_UNDERWATER3 0x34 -#define MAPSEC_UNDERWATER4 0x35 -#define MAPSEC_UNDERWATER5 0x36 -#define MAPSEC_GRANITE_CAVE 0x37 -#define MAPSEC_MT_CHIMNEY 0x38 -#define MAPSEC_SAFARI_ZONE 0x39 -#define MAPSEC_BATTLE_TOWER 0x3A -#define MAPSEC_PETALBURG_WOODS 0x3B -#define MAPSEC_RUSTURF_TUNNEL 0x3C -#define MAPSEC_ABANDONED_SHIP 0x3D -#define MAPSEC_NEW_MAUVILLE 0x3E -#define MAPSEC_METEOR_FALLS_1 0x3F -#define MAPSEC_METEOR_FALLS_2 0x40 -#define MAPSEC_MT_PYRE 0x41 -#define MAPSEC_EVIL_TEAM_HIDEOUT 0x42 -#define MAPSEC_SHOAL_CAVE 0x43 -#define MAPSEC_SEAFLOOR_CAVERN 0x44 -#define MAPSEC_UNDERWATER6 0x45 -#define MAPSEC_VICTORY_ROAD 0x46 -#define MAPSEC_MIRAGE_ISLAND 0x47 -#define MAPSEC_CAVE_OF_ORIGIN 0x48 -#define MAPSEC_SOUTHERN_ISLAND 0x49 -#define MAPSEC_FIERY_PATH_1 0x4A -#define MAPSEC_FIERY_PATH_2 0x4B -#define MAPSEC_JAGGED_PASS_1 0x4C -#define MAPSEC_JAGGED_PASS_2 0x4D -#define MAPSEC_SEALED_CHAMBER 0x4E -#define MAPSEC_UNDERWATER7 0x4F -#define MAPSEC_SCORCHED_SLAB 0x50 -#define MAPSEC_ISLAND_CAVE 0x51 -#define MAPSEC_DESERT_RUINS 0x52 -#define MAPSEC_ANCIENT_TOMB 0x53 -#define MAPSEC_INSIDE_OF_TRUCK 0x54 -#define MAPSEC_SKY_PILLAR 0x55 -#define MAPSEC_SECRET_BASE 0x56 -#define MAPSEC_UNK_0x57 0x57 -#define MAPSEC_NONE 0x58 - -#define MAP_WIDTH 28 -#define MAP_HEIGHT 15 -#define MAPCURSOR_X_MIN 1 -#define MAPCURSOR_Y_MIN 2 -#define MAPCURSOR_X_MAX (MAPCURSOR_X_MIN + MAP_WIDTH - 1) -#define MAPCURSOR_Y_MAX (MAPCURSOR_Y_MIN + MAP_HEIGHT - 1) - -// Input events -enum -{ - INPUT_EVENT_NONE, - INPUT_EVENT_DPAD, - INPUT_EVENT_2, - INPUT_EVENT_3, - INPUT_EVENT_A_BUTTON, - INPUT_EVENT_B_BUTTON, -}; - -static EWRAM_DATA struct RegionMap *gRegionMap = NULL; - -static const u16 sRegionMapCursor_Pal[] = INCBIN_U16("graphics/pokenav/cursor.gbapal"); -static const u8 sRegionMapCursorSmall_ImageLZ[] = INCBIN_U8("graphics/pokenav/cursor_small.4bpp.lz"); -static const u8 sRegionMapCursorLarge_ImageLZ[] = INCBIN_U8("graphics/pokenav/cursor_large.4bpp.lz"); -static const u16 sRegionMapBrendanIcon_Pal[] = INCBIN_U16("graphics/pokenav/brendan_icon.gbapal"); -static const u8 sRegionMapBrendanIcon_Image[] = INCBIN_U8("graphics/pokenav/brendan_icon.4bpp"); -static const u16 sRegionMapMayIcon_Pal[] = INCBIN_U16("graphics/pokenav/may_icon.gbapal"); -static const u8 sRegionMapMayIcon_Image[] = INCBIN_U8("graphics/pokenav/may_icon.4bpp"); -static const u16 sRegionMapBkgnd_Pal[] = INCBIN_U16("graphics/pokenav/region_map.gbapal"); -static const u8 sRegionMapBkgnd_ImageLZ[] = INCBIN_U8("graphics/pokenav/region_map.8bpp.lz"); -static const u8 sRegionMapBkgnd_TilemapLZ[] = INCBIN_U8("graphics/pokenav/region_map_map.bin.lz"); - -#include "data/region_map_layout.h" - -#if ENGLISH -#include "data/region_map_names_en.h" -#elif GERMAN -#include "data/region_map_names_de.h" -#endif - -struct RegionMapLocation -{ - u8 x, y; - u8 width, height; - const u8 *regionMapSectionId; -}; - -const struct RegionMapLocation gRegionMapLocations[] = -{ - { 4, 11, 1, 1, gMapName_LittlerootTown}, - { 4, 9, 1, 1, gMapName_OldaleTown}, - { 2, 14, 1, 1, gMapName_DewfordTown}, - { 5, 3, 1, 1, gMapName_LavaridgeTown}, - { 3, 0, 1, 1, gMapName_FallarborTown}, - { 4, 6, 1, 1, gMapName_VerdanturfTown}, - {17, 10, 1, 1, gMapName_PacifidlogTown}, - { 1, 9, 1, 1, gMapName_PetalburgCity}, - { 8, 10, 1, 2, gMapName_SlateportCity}, - { 8, 6, 2, 1, gMapName_MauvilleCity}, - { 0, 5, 1, 2, gMapName_RustboroCity}, - {12, 0, 1, 1, gMapName_FortreeCity}, - {18, 3, 2, 1, gMapName_LilycoveCity}, - {24, 5, 2, 1, gMapName_MossdeepCity}, - {21, 7, 1, 1, gMapName_SootopolisCity}, - {27, 8, 1, 2, gMapName_EverGrandeCity}, - { 4, 10, 1, 1, gMapName_Route101}, - { 2, 9, 2, 1, gMapName_Route102}, - { 4, 8, 4, 1, gMapName_Route103}, - { 0, 7, 1, 3, gMapName_Route104}, - { 0, 10, 1, 3, gMapName_Route105}, - { 0, 13, 2, 1, gMapName_Route106}, - { 3, 14, 3, 1, gMapName_Route107}, - { 6, 14, 2, 1, gMapName_Route108}, - { 8, 12, 1, 3, gMapName_Route109}, - { 8, 7, 1, 3, gMapName_Route110}, - { 8, 0, 1, 6, gMapName_Route111}, - { 6, 3, 2, 1, gMapName_Route112}, - { 4, 0, 4, 1, gMapName_Route113}, - { 1, 0, 2, 3, gMapName_Route114}, - { 0, 2, 1, 3, gMapName_Route115}, - { 1, 5, 4, 1, gMapName_Route116}, - { 5, 6, 3, 1, gMapName_Route117}, - {10, 6, 2, 1, gMapName_Route118}, - {11, 0, 1, 6, gMapName_Route119}, - {13, 0, 1, 4, gMapName_Route120}, - {14, 3, 4, 1, gMapName_Route121}, - {16, 4, 1, 2, gMapName_Route122}, - {12, 6, 5, 1, gMapName_Route123}, - {20, 3, 4, 3, gMapName_Route124}, - {24, 3, 2, 2, gMapName_Route125}, - {20, 6, 3, 3, gMapName_Route126}, - {23, 6, 3, 3, gMapName_Route127}, - {23, 9, 4, 1, gMapName_Route128}, - {24, 10, 2, 1, gMapName_Route129}, - {21, 10, 3, 1, gMapName_Route130}, - {18, 10, 3, 1, gMapName_Route131}, - {15, 10, 2, 1, gMapName_Route132}, - {12, 10, 3, 1, gMapName_Route133}, - { 9, 10, 3, 1, gMapName_Route134}, - {20, 3, 4, 3, gMapName_Underwater}, - {20, 6, 3, 3, gMapName_Underwater}, - {23, 6, 3, 3, gMapName_Underwater}, - {23, 9, 4, 1, gMapName_Underwater}, - {21, 7, 1, 1, gMapName_Underwater}, - { 1, 13, 1, 1, gMapName_GraniteCave}, - { 6, 2, 1, 1, gMapName_MtChimney}, - {16, 2, 1, 1, gMapName_SafariZone}, - {22, 12, 1, 1, gMapName_BattleTower}, - { 0, 8, 1, 1, gMapName_PetalburgWoods}, - { 2, 5, 1, 1, gMapName_RusturfTunnel}, - { 6, 14, 1, 1, gMapName_AbandonedShip}, - { 8, 7, 1, 1, gMapName_NewMauville}, - { 0, 3, 1, 1, gMapName_MeteorFalls}, - { 1, 2, 1, 1, gMapName_MeteorFalls}, - {16, 4, 1, 1, gMapName_MtPyre}, - {19, 3, 1, 1, gMapName_EvilTeamHideout}, - {24, 4, 1, 1, gMapName_ShoalCave}, - {24, 9, 1, 1, gMapName_SeafloorCavern}, - {24, 9, 1, 1, gMapName_Underwater}, - {27, 9, 1, 1, gMapName_VictoryRoad}, - {17, 10, 1, 1, gMapName_MirageIsland}, - {21, 7, 1, 1, gMapName_CaveOfOrigin}, - {12, 14, 1, 1, gMapName_SouthernIsland}, - { 6, 3, 1, 1, gMapName_FieryPath}, - { 7, 3, 1, 1, gMapName_FieryPath}, - { 6, 3, 1, 1, gMapName_JaggedPass}, - { 7, 2, 1, 1, gMapName_JaggedPass}, - {11, 10, 1, 1, gMapName_SealedChamber}, - {11, 10, 1, 1, gMapName_Underwater}, - {13, 0, 1, 1, gMapName_ScorchedSlab}, - {0, 10, 1, 1, gMapName_IslandCave}, - { 8, 3, 1, 1, gMapName_DesertRuins}, - {13, 2, 1, 1, gMapName_AncientTomb}, - { 0, 0, 1, 1, gMapName_InsideOfTruck}, - {19, 10, 1, 1, gMapName_SkyPillar}, - { 0, 0, 1, 1, gMapName_SecretBase}, - { 0, 0, 1, 1, gMapName_None}, -}; - -static const u16 gUnknown_083E7684[][2] = -{ - {MAPSEC_UNDERWATER1, MAPSEC_ROUTE_124}, - {MAPSEC_UNDERWATER2, MAPSEC_ROUTE_126}, - {MAPSEC_UNDERWATER3, MAPSEC_ROUTE_127}, - {MAPSEC_UNDERWATER4, MAPSEC_ROUTE_128}, - {MAPSEC_UNDERWATER5, MAPSEC_SOOTOPOLIS_CITY}, - {MAPSEC_UNDERWATER6, MAPSEC_ROUTE_128}, - {MAPSEC_EVIL_TEAM_HIDEOUT, MAPSEC_LILYCOVE_CITY}, - {MAPSEC_UNDERWATER7, MAPSEC_ROUTE_134}, - {MAPSEC_PETALBURG_WOODS, MAPSEC_ROUTE_104}, - {MAPSEC_JAGGED_PASS_1, MAPSEC_ROUTE_112}, - {MAPSEC_MT_PYRE, MAPSEC_ROUTE_122}, - {MAPSEC_SKY_PILLAR, MAPSEC_ROUTE_131}, - {MAPSEC_NONE, MAPSEC_NONE}, -}; - -static u8 sub_80FAB78(void); -static u8 _swiopen(void); -static u8 sub_80FAD04(void); -static u8 sub_80FADE4(void); -static void CalcZoomScrollParams(s16, s16, s16, s16, u16, u16, u8); -static void sub_80FB238(s16, s16); -void UpdateRegionMapVideoRegs(void); -static u16 GetRegionMapSectionAt(u16, u16); -static void InitializeCursorPosition(void); -static void sub_80FB600(void); -static u16 sub_80FB758(u16); -static u16 sub_80FB9C0(u16); -static void sub_80FBA18(void); -static bool8 sub_80FBAA0(u16); -void CreateRegionMapCursor(u16, u16); -static void sub_80FBCA0(void); -static void sub_80FBDF8(void); -static void sub_80FBE24(void); -static void SpriteCB_PlayerIconZoomedOut(struct Sprite *); -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)); -static void PrintFlyTargetName(void); -static void CreateFlyTargetGraphics(void); -static void CreateCityTownFlyTargetIcons(void); -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 InitRegionMap(struct RegionMap *regionMap, bool8 zoomed) -{ - sub_80FA904(regionMap, zoomed); - while (sub_80FA940()) - ; -} - -void sub_80FA904(struct RegionMap *regionMap, bool8 zoomed) -{ - gRegionMap = regionMap; - gRegionMap->initStep = 0; - gRegionMap->zoomed = zoomed; - gRegionMap->inputCallback = (zoomed == 0) ? sub_80FAB78 : sub_80FAD04; -} - -bool8 sub_80FA940(void) -{ - switch (gRegionMap->initStep) - { - case 0: - LZ77UnCompVram(sRegionMapBkgnd_ImageLZ, (void *)(VRAM + 0x8000)); - break; - case 1: - LZ77UnCompVram(sRegionMapBkgnd_TilemapLZ, (void *)(VRAM + 0xE000)); - break; - case 2: - LoadPalette(sRegionMapBkgnd_Pal, 0x70, 0x60); // Why isn't this the right size? - break; - case 3: - LZ77UnCompWram(sRegionMapCursorSmall_ImageLZ, gRegionMap->cursorSmallImage); - break; - case 4: - LZ77UnCompWram(sRegionMapCursorLarge_ImageLZ, gRegionMap->cursorLargeImage); - break; - case 5: - InitializeCursorPosition(); - gRegionMap->unk74 = gRegionMap->cursorPosX; - gRegionMap->unk76 = gRegionMap->cursorPosY; - gRegionMap->unk16 = sub_80FB758(gRegionMap->mapSecId); - gRegionMap->mapSecId = sub_80FB9C0(gRegionMap->mapSecId); - GetMapSectionName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16); - break; - case 6: - if (gRegionMap->zoomed == FALSE) - { - CalcZoomScrollParams(0, 0, 0, 0, 0x100, 0x100, 0); - } - else - { - gRegionMap->scrollX = gRegionMap->cursorPosX * 8 - 52; - gRegionMap->scrollY = gRegionMap->cursorPosY * 8 - 68; - gRegionMap->unk64 = gRegionMap->cursorPosX; - gRegionMap->unk66 = gRegionMap->cursorPosY; - CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, 0x80, 0x80, 0); - } - break; - case 7: - sub_80FBA18(); - UpdateRegionMapVideoRegs(); - gRegionMap->cursorSprite = NULL; - gRegionMap->playerIconSprite = NULL; - gRegionMap->unk7A = 0; - gRegionMap->blinkPlayerIcon = FALSE; - REG_BG2CNT = 0xBC8A; - gRegionMap->initStep++; - default: - return FALSE; - } - gRegionMap->initStep++; - return TRUE; -} - -void FreeRegionMapIconResources(void) -{ - if (gRegionMap->cursorSprite != NULL) - { - DestroySprite(gRegionMap->cursorSprite); - FreeSpriteTilesByTag(gRegionMap->cursorTileTag); - FreeSpritePaletteByTag(gRegionMap->cursorPaletteTag); - } - if (gRegionMap->playerIconSprite != NULL) - { - DestroySprite(gRegionMap->playerIconSprite); - FreeSpriteTilesByTag(gRegionMap->playerIconTileTag); - FreeSpritePaletteByTag(gRegionMap->playerIconPaletteTag); - } -} - -u8 sub_80FAB60(void) -{ - return gRegionMap->inputCallback(); -} - -static u8 sub_80FAB78(void) -{ - u8 event = INPUT_EVENT_NONE; - - gRegionMap->cursorDeltaX = 0; - gRegionMap->cursorDeltaY = 0; - if ((gMain.heldKeys & DPAD_UP) && gRegionMap->cursorPosY > MAPCURSOR_Y_MIN) - { - gRegionMap->cursorDeltaY = -1; - event = INPUT_EVENT_DPAD; - } - if ((gMain.heldKeys & DPAD_DOWN) && gRegionMap->cursorPosY < MAPCURSOR_Y_MAX) - { - gRegionMap->cursorDeltaY = 1; - event = INPUT_EVENT_DPAD; - } - if ((gMain.heldKeys & DPAD_LEFT) && gRegionMap->cursorPosX > MAPCURSOR_X_MIN) - { - gRegionMap->cursorDeltaX = -1; - event = INPUT_EVENT_DPAD; - } - if ((gMain.heldKeys & DPAD_RIGHT) && gRegionMap->cursorPosX < MAPCURSOR_X_MAX) - { - gRegionMap->cursorDeltaX = 1; - event = INPUT_EVENT_DPAD; - } - - if (gMain.newKeys & A_BUTTON) - event = INPUT_EVENT_A_BUTTON; - else if (gMain.newKeys & B_BUTTON) - event = INPUT_EVENT_B_BUTTON; - - if (event == INPUT_EVENT_DPAD) - { - gRegionMap->unk7A = 4; - gRegionMap->inputCallback = _swiopen; - } - return event; -} - -static u8 _swiopen(void) -{ - u16 mapSecId; - - if (gRegionMap->unk7A != 0) - return INPUT_EVENT_2; - - if (gRegionMap->cursorDeltaX > 0) - gRegionMap->cursorPosX++; - - if (gRegionMap->cursorDeltaX < 0) - gRegionMap->cursorPosX--; - - if (gRegionMap->cursorDeltaY > 0) - gRegionMap->cursorPosY++; - - if (gRegionMap->cursorDeltaY < 0) - gRegionMap->cursorPosY--; - - mapSecId = GetRegionMapSectionAt(gRegionMap->cursorPosX, gRegionMap->cursorPosY); - gRegionMap->unk16 = sub_80FB758(mapSecId); - if (mapSecId != gRegionMap->mapSecId) - { - gRegionMap->mapSecId = mapSecId; - GetMapSectionName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16); - } - sub_80FBA18(); - gRegionMap->inputCallback = sub_80FAB78; - return INPUT_EVENT_3; -} - -static u8 sub_80FAD04(void) -{ - u8 event = INPUT_EVENT_NONE; - - gRegionMap->unk6A = 0; - gRegionMap->unk68 = 0; - if ((gMain.heldKeys & DPAD_UP) && gRegionMap->scrollY > -52) - { - gRegionMap->unk68 = -1; - event = INPUT_EVENT_DPAD; - } - if ((gMain.heldKeys & DPAD_DOWN) && gRegionMap->scrollY < 60) - { - gRegionMap->unk68 = 1; - event = INPUT_EVENT_DPAD; - } - if ((gMain.heldKeys & DPAD_LEFT) && gRegionMap->scrollX > -44) - { - gRegionMap->unk6A = -1; - event = INPUT_EVENT_DPAD; - } - if ((gMain.heldKeys & DPAD_RIGHT) && gRegionMap->scrollX < 172) - { - gRegionMap->unk6A = 1; - event = INPUT_EVENT_DPAD; - } - - if (gMain.newKeys & A_BUTTON) - event = INPUT_EVENT_A_BUTTON; - if (gMain.newKeys & B_BUTTON) - event = INPUT_EVENT_B_BUTTON; - - if (event == INPUT_EVENT_DPAD) - { - gRegionMap->inputCallback = sub_80FADE4; - gRegionMap->unk6C = 0; - } - return event; -} - -static u8 sub_80FADE4(void) -{ - gRegionMap->scrollY += gRegionMap->unk68; - gRegionMap->scrollX += gRegionMap->unk6A; - sub_80FB238(gRegionMap->scrollX, gRegionMap->scrollY); - gRegionMap->unk6C++; - if (gRegionMap->unk6C == 8) - { - u16 r3 = (gRegionMap->scrollX + 44) / 8 + 1; - u16 r1 = (gRegionMap->scrollY + 52) / 8 + 2; - - if (r3 != gRegionMap->unk64 || r1 != gRegionMap->unk66) - { - u16 mapSecId; - - gRegionMap->unk64 = r3; - gRegionMap->unk66 = r1; - mapSecId = GetRegionMapSectionAt(r3, r1); - gRegionMap->unk16 = sub_80FB758(mapSecId); - if (mapSecId != gRegionMap->mapSecId) - { - gRegionMap->mapSecId = mapSecId; - GetMapSectionName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16); - } - sub_80FBA18(); - } - gRegionMap->unk6C = 0; - gRegionMap->inputCallback = sub_80FAD04; - return INPUT_EVENT_3; - } - return INPUT_EVENT_2; -} - -void sub_80FAEC4(void) -{ - if (gRegionMap->zoomed == FALSE) - { - gRegionMap->scrollY = 0; - gRegionMap->scrollX = 0; - gRegionMap->unk40 = 0; - gRegionMap->unk3C = 0; - gRegionMap->unk60 = gRegionMap->cursorPosX * 8 - 52; - gRegionMap->unk62 = gRegionMap->cursorPosY * 8 - 68; - gRegionMap->unk44 = (gRegionMap->unk60 << 8) / 16; - gRegionMap->unk48 = (gRegionMap->unk62 << 8) / 16; - gRegionMap->unk64 = gRegionMap->cursorPosX; - gRegionMap->unk66 = gRegionMap->cursorPosY; - gRegionMap->unk4C = (256 << 8); - gRegionMap->unk50 = -0x800; - } - else - { - gRegionMap->unk3C = gRegionMap->scrollX * 256; - gRegionMap->unk40 = gRegionMap->scrollY * 256; - gRegionMap->unk60 = 0; - gRegionMap->unk62 = 0; - gRegionMap->unk44 = -(gRegionMap->unk3C / 16); - gRegionMap->unk48 = -(gRegionMap->unk40 / 16); - gRegionMap->cursorPosX = gRegionMap->unk64; - gRegionMap->cursorPosY = gRegionMap->unk66; - gRegionMap->unk4C = (128 << 8); - gRegionMap->unk50 = 0x800; - } - gRegionMap->unk6E = 0; - sub_80FBCA0(); - sub_80FBDF8(); -} - -u8 sub_80FAFC0(void) -{ - u8 r4; - - if (gRegionMap->unk6E >= 16) - return 0; - gRegionMap->unk6E++; - if (gRegionMap->unk6E == 16) - { - gRegionMap->unk44 = 0; - gRegionMap->unk48 = 0; - gRegionMap->scrollX = gRegionMap->unk60; - gRegionMap->scrollY = gRegionMap->unk62; - gRegionMap->unk4C = (gRegionMap->zoomed == FALSE) ? (128 << 8) : (256 << 8); - gRegionMap->zoomed = !gRegionMap->zoomed; - gRegionMap->inputCallback = (gRegionMap->zoomed == FALSE) ? sub_80FAB78 : sub_80FAD04; - CreateRegionMapCursor(gRegionMap->cursorTileTag, gRegionMap->cursorPaletteTag); - sub_80FBE24(); - r4 = 0; - } - else - { - gRegionMap->unk3C += gRegionMap->unk44; - gRegionMap->unk40 += gRegionMap->unk48; - gRegionMap->scrollX = gRegionMap->unk3C >> 8; - gRegionMap->scrollY = gRegionMap->unk40 >> 8; - gRegionMap->unk4C += gRegionMap->unk50; - if ((gRegionMap->unk44 < 0 && gRegionMap->scrollX < gRegionMap->unk60) - || (gRegionMap->unk44 > 0 && gRegionMap->scrollX > gRegionMap->unk60)) - { - gRegionMap->scrollX = gRegionMap->unk60; - gRegionMap->unk44 = 0; - } - if ((gRegionMap->unk48 < 0 && gRegionMap->scrollY < gRegionMap->unk62) - || (gRegionMap->unk48 > 0 && gRegionMap->scrollY > gRegionMap->unk62)) - { - gRegionMap->scrollY = gRegionMap->unk62; - gRegionMap->unk48 = 0; - } - if (gRegionMap->zoomed == FALSE) - { - if (gRegionMap->unk4C < (128 << 8)) - { - gRegionMap->unk4C = (128 << 8); - gRegionMap->unk50 = 0; - } - } - else - { - if (gRegionMap->unk4C > (256 << 8)) - { - gRegionMap->unk4C = (256 << 8); - gRegionMap->unk50 = 0; - } - } - r4 = 1; - } - CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, gRegionMap->unk4C >> 8, gRegionMap->unk4C >> 8, 0); - return r4; -} - -static void CalcZoomScrollParams(s16 a, s16 b, s16 c, s16 d, u16 e, u16 f, u8 rotation) -{ - s32 var1; - s32 var2; - s32 var3; - s32 var4; - - gRegionMap->unk2C = e * gSineTable[rotation + 64] >> 8; - gRegionMap->unk30 = e * -gSineTable[rotation] >> 8; - gRegionMap->unk34 = f * gSineTable[rotation] >> 8; - gRegionMap->unk38 = f * gSineTable[rotation + 64] >> 8; - - var1 = (a << 8) + (c << 8); - var2 = d * gRegionMap->unk34 + gRegionMap->unk2C * c; - gRegionMap->bg2x = var1 - var2; - - var3 = (b << 8) + (d << 8); - var4 = gRegionMap->unk38 * d + gRegionMap->unk30 * c; - gRegionMap->bg2y = var3 - var4; - - gRegionMap->needUpdateVideoRegs = TRUE; -} - -static void sub_80FB238(s16 x, s16 y) -{ - gRegionMap->bg2x = (0x1C << 8) + (x << 8); - gRegionMap->bg2y = (0x24 << 8) + (y << 8); - gRegionMap->needUpdateVideoRegs = TRUE; -} - -void UpdateRegionMapVideoRegs(void) -{ - if (gRegionMap->needUpdateVideoRegs) - { - REG_BG2PA = gRegionMap->unk2C; - REG_BG2PB = gRegionMap->unk34; - REG_BG2PC = gRegionMap->unk30; - REG_BG2PD = gRegionMap->unk38; - REG_BG2X = gRegionMap->bg2x; - REG_BG2Y = gRegionMap->bg2y; - gRegionMap->needUpdateVideoRegs = FALSE; - } -} - -void sub_80FB2A4(s16 a, s16 b) -{ - CalcZoomScrollParams(a, b, 0x38, 0x48, 0x100, 0x100, 0); - UpdateRegionMapVideoRegs(); - if (gRegionMap->playerIconSprite != NULL) - { - gRegionMap->playerIconSprite->pos2.x = -a; - gRegionMap->playerIconSprite->pos2.y = -b; - } -} - -static u16 GetRegionMapSectionAt(u16 x, u16 y) -{ - if (y < MAPCURSOR_Y_MIN || y > MAPCURSOR_Y_MAX || x < MAPCURSOR_X_MIN || x > MAPCURSOR_X_MAX) - return MAPSEC_NONE; - y -= MAPCURSOR_Y_MIN; - x -= MAPCURSOR_X_MIN; - return sRegionMapLayout[x + y * 28]; -} - -static void InitializeCursorPosition(void) -{ - struct MapHeader *mapHeader; - u16 mapWidth; - u16 mapHeight; - u16 x; - u16 y; - u16 r1; - u16 r9; - - if (gSaveBlock1.location.mapGroup == 25 - && (gSaveBlock1.location.mapNum == MAP_ID_SS_TIDAL_CORRIDOR - || gSaveBlock1.location.mapNum == MAP_ID_SS_TIDAL_LOWER_DECK - || gSaveBlock1.location.mapNum == MAP_ID_SS_TIDAL_ROOMS)) - { - sub_80FB600(); - return; - } - - switch (get_map_light_level_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) - 1) - { - default: - case 0: - case 1: - case 2: - case 4: - case 5: - gRegionMap->mapSecId = gMapHeader.regionMapSectionId; - gRegionMap->playerIsInCave = FALSE; - mapWidth = gMapHeader.mapData->width; - mapHeight = gMapHeader.mapData->height; - x = gSaveBlock1.pos.x; - y = gSaveBlock1.pos.y; - if (gRegionMap->mapSecId == MAPSEC_UNDERWATER6) - gRegionMap->playerIsInCave = TRUE; - break; - case 3: - case 6: - mapHeader = get_mapheader_by_bank_and_number(gSaveBlock1.warp4.mapGroup, gSaveBlock1.warp4.mapNum); - gRegionMap->mapSecId = mapHeader->regionMapSectionId; - gRegionMap->playerIsInCave = TRUE; - mapWidth = mapHeader->mapData->width; - mapHeight = mapHeader->mapData->height; - x = gSaveBlock1.warp4.x; - y = gSaveBlock1.warp4.y; - break; - case 8: - mapHeader = get_mapheader_by_bank_and_number(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum); - gRegionMap->mapSecId = mapHeader->regionMapSectionId; - gRegionMap->playerIsInCave = TRUE; - mapWidth = mapHeader->mapData->width; - mapHeight = mapHeader->mapData->height; - x = gSaveBlock1.warp2.x; - y = gSaveBlock1.warp2.y; - break; - case 7: - { - struct WarpData *r4; - - gRegionMap->mapSecId = gMapHeader.regionMapSectionId; - if (gRegionMap->mapSecId != MAPSEC_UNK_0x57) - { - r4 = &gSaveBlock1.warp4; - mapHeader = get_mapheader_by_bank_and_number(r4->mapGroup, r4->mapNum); - } - else - { - r4 = &gSaveBlock1.warp2; - mapHeader = get_mapheader_by_bank_and_number(r4->mapGroup, r4->mapNum); - gRegionMap->mapSecId = mapHeader->regionMapSectionId; - } - gRegionMap->playerIsInCave = FALSE; - mapWidth = mapHeader->mapData->width; - mapHeight = mapHeader->mapData->height; - x = r4->x; - y = r4->y; - } - break; - } - - r9 = x; - - r1 = mapWidth / gRegionMapLocations[gRegionMap->mapSecId].width; - if (r1 == 0) - r1 = 1; - x /= r1; - if (x >= gRegionMapLocations[gRegionMap->mapSecId].width) - x = gRegionMapLocations[gRegionMap->mapSecId].width - 1; - - r1 = mapHeight / gRegionMapLocations[gRegionMap->mapSecId].height; - if (r1 == 0) - r1 = 1; - y /= r1; - if (y >= gRegionMapLocations[gRegionMap->mapSecId].height) - y = gRegionMapLocations[gRegionMap->mapSecId].height - 1; - - switch (gRegionMap->mapSecId) - { - case MAPSEC_ROUTE_114: - if (y != 0) - x = 0; - break; - case MAPSEC_ROUTE_126: - case MAPSEC_UNDERWATER2: - x = 0; - if (gSaveBlock1.pos.x > 32) - x = 1; - if (gSaveBlock1.pos.x > 0x33) - x++; - y = 0; - if (gSaveBlock1.pos.y > 0x25) - y = 1; - if (gSaveBlock1.pos.y > 0x38) - y++; - break; - case MAPSEC_ROUTE_121: - x = 0; - if (r9 > 14) - x = 1; - if (r9 > 0x1C) - x++; - if (r9 > 0x36) - x++; - break; - } - gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSecId].x + x + MAPCURSOR_X_MIN; - gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSecId].y + y + MAPCURSOR_Y_MIN; -} - -static void sub_80FB600(void) -{ - u16 y = 0; - u16 x = 0; - u8 mapGroup; - u8 mapNum; - s16 sp2; - s16 sp4; - - switch (GetSSTidalLocation(&mapGroup, &mapNum, &sp2, &sp4)) - { - case 1: - gRegionMap->mapSecId = MAPSEC_SLATEPORT_CITY; - break; - case 2: - gRegionMap->mapSecId = MAPSEC_LILYCOVE_CITY; - break; - case 3: - gRegionMap->mapSecId = MAPSEC_ROUTE_124; - break; - case 4: - gRegionMap->mapSecId = MAPSEC_ROUTE_131; - break; - default: - case 0: - { - struct MapHeader *mapHeader = get_mapheader_by_bank_and_number(mapGroup, mapNum); - u16 r1; - - gRegionMap->mapSecId = mapHeader->regionMapSectionId; - r1 = mapHeader->mapData->width / gRegionMapLocations[gRegionMap->mapSecId].width; - if (r1 == 0) - r1 = 1; - x = sp2 / r1; - if (x >= gRegionMapLocations[gRegionMap->mapSecId].width) - x = gRegionMapLocations[gRegionMap->mapSecId].width - 1; - - r1 = mapHeader->mapData->height / gRegionMapLocations[gRegionMap->mapSecId].height; - if (r1 == 0) - r1 = 1; - y = sp4 / r1; - if (y >= gRegionMapLocations[gRegionMap->mapSecId].height) - y = gRegionMapLocations[gRegionMap->mapSecId].height - 1; - } - break; - } - gRegionMap->playerIsInCave = FALSE; - gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSecId].x + x + MAPCURSOR_X_MIN; - gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSecId].y + y + MAPCURSOR_Y_MIN; -} - -static u16 sub_80FB758(u16 mapSecId) -{ - switch (mapSecId) - { - case MAPSEC_NONE: - return 0; - case MAPSEC_LITTLEROOT_TOWN: - return FlagGet(FLAG_VISITED_LITTLEROOT_TOWN) ? 2 : 3; - case MAPSEC_OLDALE_TOWN: - return FlagGet(FLAG_VISITED_OLDALE_TOWN) ? 2 : 3; - case MAPSEC_DEWFORD_TOWN: - return FlagGet(FLAG_VISITED_DEWFORD_TOWN) ? 2 : 3; - case MAPSEC_LAVARIDGE_TOWN: - return FlagGet(FLAG_VISITED_LAVARIDGE_TOWN) ? 2 : 3; - case MAPSEC_FALLARBOR_TOWN: - return FlagGet(FLAG_VISITED_FALLARBOR_TOWN) ? 2 : 3; - case MAPSEC_VERDANTURF_TOWN: - return FlagGet(FLAG_VISITED_VERDANTURF_TOWN) ? 2 : 3; - case MAPSEC_PACIFIDLOG_TOWN: - return FlagGet(FLAG_VISITED_PACIFIDLOG_TOWN) ? 2 : 3; - case MAPSEC_PETALBURG_CITY: - return FlagGet(FLAG_VISITED_PETALBURG_CITY) ? 2 : 3; - case MAPSEC_SLATEPORT_CITY: - return FlagGet(FLAG_VISITED_SLATEPORT_CITY) ? 2 : 3; - case MAPSEC_MAUVILLE_CITY: - return FlagGet(FLAG_VISITED_MAUVILLE_CITY) ? 2 : 3; - case MAPSEC_RUSTBORO_CITY: - return FlagGet(FLAG_VISITED_RUSTBORO_CITY) ? 2 : 3; - case MAPSEC_FORTREE_CITY: - return FlagGet(FLAG_VISITED_FORTREE_CITY) ? 2 : 3; - case MAPSEC_LILYCOVE_CITY: - return FlagGet(FLAG_VISITED_LILYCOVE_CITY) ? 2 : 3; - case MAPSEC_MOSSDEEP_CITY: - return FlagGet(FLAG_VISITED_MOSSDEEP_CITY) ? 2 : 3; - case MAPSEC_SOOTOPOLIS_CITY: - return FlagGet(FLAG_VISITED_SOOTOPOLIS_CITY) ? 2 : 3; - case MAPSEC_EVER_GRANDE_CITY: - return FlagGet(FLAG_VISITED_EVER_GRANDE_CITY) ? 2 : 3; - - case MAPSEC_BATTLE_TOWER: - return FlagGet(FLAG_UNLOCK_BATTLE_TOWER) ? 4 : 0; - case MAPSEC_SOUTHERN_ISLAND: - return FlagGet(FLAG_UNLOCK_SOUTHERN_ISLAND) ? 1 : 0; - default: - return 1; - } -} - -u16 GetRegionMapSectionAt_(u16 x, u16 y) -{ - return GetRegionMapSectionAt(x, y); -} - -static u16 sub_80FB9C0(u16 mapSecId) -{ - u16 i; - - for (i = 0; gUnknown_083E7684[i][0] != MAPSEC_NONE; i++) - { - if (gUnknown_083E7684[i][0] == mapSecId) - return gUnknown_083E7684[i][1]; - } - return mapSecId; -} - -u16 sub_80FBA04(u16 mapSecId) -{ - return sub_80FB9C0(mapSecId); -} - -static void sub_80FBA18(void) -{ - u16 x; - u16 y; - u16 i; - - if (gRegionMap->mapSecId == MAPSEC_NONE) - { - gRegionMap->everGrandeCityArea = 0; - return; - } - - if (gRegionMap->zoomed == FALSE) - { - x = gRegionMap->cursorPosX; - y = gRegionMap->cursorPosY; - } - else - { - x = gRegionMap->unk64; - y = gRegionMap->unk66; - } - - i = 0; - while (1) - { - if (x <= 1) - { - if (sub_80FBAA0(y)) - { - y--; - x = 0x1D; - } - else - { - break; - } - } - else - { - x--; - if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSecId) - i++; - } - } - - gRegionMap->everGrandeCityArea = i; -} - -static bool8 sub_80FBAA0(u16 a) -{ - u16 x; - u16 y; - - y = a - 1; - if (y == 0xFFFF) - return FALSE; - - for (x = MAPCURSOR_X_MIN; x <= MAPCURSOR_X_MAX; x++) - { - if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSecId) - return TRUE; - } - return FALSE; -} - -static const struct OamData sCursorOamData = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sCursorAnimSeq0[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(4, 20), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sCursorAnimSeq1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(16, 10), - ANIMCMD_FRAME(32, 10), - ANIMCMD_FRAME(16, 10), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd *const sCursorAnimTable[] = -{ - sCursorAnimSeq0, - sCursorAnimSeq1, -}; - -static void SpriteCB_Cursor(struct Sprite *sprite) -{ - if (gRegionMap->unk7A != 0) - { - sprite->pos1.x += gRegionMap->cursorDeltaX * 2; - sprite->pos1.y += gRegionMap->cursorDeltaY * 2; - gRegionMap->unk7A--; - } -} - -static void nullsub_66(struct Sprite *sprite) -{ -} - -void CreateRegionMapCursor(u16 tileTag, u16 paletteTag) -{ - u8 spriteId; - struct SpriteSheet spriteSheet; - struct SpritePalette spritePalette = - { - .data = sRegionMapCursor_Pal, - }; - struct SpriteTemplate spriteTemplate = - { - .oam = &sCursorOamData, - .anims = sCursorAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_Cursor, - }; - - spriteSheet.tag = tileTag; - spriteTemplate.tileTag = tileTag; - gRegionMap->cursorTileTag = tileTag; - - spritePalette.tag = paletteTag; - spriteTemplate.paletteTag = paletteTag; - gRegionMap->cursorPaletteTag = paletteTag; - - if (gRegionMap->zoomed == FALSE) - { - spriteSheet.data = gRegionMap->cursorSmallImage; - spriteSheet.size = 0x100; - spriteTemplate.callback = SpriteCB_Cursor; - } - else - { - spriteSheet.data = gRegionMap->cursorLargeImage; - spriteSheet.size = 0x600; - spriteTemplate.callback = nullsub_66; - } - LoadSpriteSheet(&spriteSheet); - LoadSpritePalette(&spritePalette); - spriteId = CreateSprite(&spriteTemplate, 0x38, 0x48, 0); - if (spriteId != 64) - { - gRegionMap->cursorSprite = &gSprites[spriteId]; - if (gRegionMap->zoomed == TRUE) - { - gRegionMap->cursorSprite->oam.size = 2; - gRegionMap->cursorSprite->pos1.x -= 8; - gRegionMap->cursorSprite->pos1.y -= 8; - StartSpriteAnim(gRegionMap->cursorSprite, 1); - } - else - { - gRegionMap->cursorSprite->oam.size = 1; - gRegionMap->cursorSprite->pos1.x = gRegionMap->cursorPosX * 8 + 4; - gRegionMap->cursorSprite->pos1.y = gRegionMap->cursorPosY * 8 + 4; - } - gRegionMap->cursorSprite->data1 = 2; - gRegionMap->cursorSprite->data2 = IndexOfSpritePaletteTag(paletteTag) * 16 + 0x0101; - gRegionMap->cursorSprite->data3 = 1; - } -} - -static void sub_80FBCA0(void) -{ - if (gRegionMap->cursorSprite != NULL) - { - DestroySprite(gRegionMap->cursorSprite); - FreeSpriteTilesByTag(gRegionMap->cursorTileTag); - FreeSpritePaletteByTag(gRegionMap->cursorPaletteTag); - } -} - -void unref_sub_80FBCD0(void) -{ - gRegionMap->cursorSprite->data3 = 1; -} - -void unref_sub_80FBCE0(void) -{ - gRegionMap->cursorSprite->data3 = 0; -} - -static const struct OamData sPlayerIconOamData = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sPlayerIconAnimSeq0[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd *const sPlayerIconAnimTable[] = -{ - sPlayerIconAnimSeq0, -}; - -void CreateRegionMapPlayerIcon(u16 tileTag, u16 paletteTag) -{ - u8 spriteId; - struct SpriteSheet playerIconSpriteSheet = - { - .data = sRegionMapBrendanIcon_Image, - .size = 128, - .tag = tileTag, - }; - struct SpritePalette playerIconSpritePalette = - { - .data = sRegionMapBrendanIcon_Pal, - .tag = paletteTag, - }; - struct SpriteTemplate playerIconSpriteTemplate = - { - .tileTag = tileTag, - .paletteTag = paletteTag, - .oam = &sPlayerIconOamData, - .anims = sPlayerIconAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }; - - if (gSaveBlock2.playerGender == FEMALE) - { - playerIconSpriteSheet.data = sRegionMapMayIcon_Image; - playerIconSpritePalette.data = sRegionMapMayIcon_Pal; - } - LoadSpriteSheet(&playerIconSpriteSheet); - LoadSpritePalette(&playerIconSpritePalette); - spriteId = CreateSprite(&playerIconSpriteTemplate, 0, 0, 1); - gRegionMap->playerIconSprite = &gSprites[spriteId]; - if (gRegionMap->zoomed == FALSE) - { - gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 8 + 4; - gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 8 + 4; - gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedOut; - } - else - { - gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 16 - 48; - gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 16 - 66; - gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedIn; - } -} - -static void sub_80FBDF8(void) -{ - if (gRegionMap->playerIconSprite != NULL) - { - gRegionMap->playerIconSprite->invisible = TRUE; - gRegionMap->playerIconSprite->callback = SpriteCallbackDummy; - } -} - -static void sub_80FBE24(void) -{ - if (gRegionMap->playerIconSprite != NULL) - { - if (gRegionMap->zoomed == TRUE) - { - gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 16 - 48; - gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 16 - 66; - gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedIn; - gRegionMap->playerIconSprite->invisible = FALSE; - } - else - { - gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 8 + 4; - gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 8 + 4; - gRegionMap->playerIconSprite->pos2.x = 0; - gRegionMap->playerIconSprite->pos2.y = 0; - gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedOut; - gRegionMap->playerIconSprite->invisible = FALSE; - } - } -} - -static void SpriteCB_PlayerIconZoomedIn(struct Sprite *sprite) -{ - sprite->pos2.x = -(gRegionMap->scrollX * 2); - sprite->pos2.y = -(gRegionMap->scrollY * 2); - sprite->data0 = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - sprite->data1 = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - - // Determine if sprite is on screen - if (sprite->data0 < -8 || sprite->data0 > 0xA8 || sprite->data1 < -8 || sprite->data1 > 0xF8) - sprite->data2 = FALSE; - else - sprite->data2 = TRUE; - - if (sprite->data2 == TRUE) - UpdateIconBlink(sprite); - else - sprite->invisible = TRUE; -} - -static void SpriteCB_PlayerIconZoomedOut(struct Sprite *sprite) -{ - UpdateIconBlink(sprite); -} - -static void UpdateIconBlink(struct Sprite *sprite) -{ - if (gRegionMap->blinkPlayerIcon) - { - // Toggle visibility every 16 frames - sprite->data7++; - if (sprite->data7 > 16) - { - sprite->data7 = 0; - sprite->invisible = !sprite->invisible; - } - } - else - { - sprite->invisible = FALSE; - } -} - -void sub_80FBF94(void) -{ - if (gRegionMap->playerIsInCave) - gRegionMap->blinkPlayerIcon = TRUE; -} - -const u8 *GetMapSectionName(u8 *dest, u16 mapSecId, u16 length) -{ - if (mapSecId == MAPSEC_SECRET_BASE) - return GetSecretBaseMapName(dest); - if (mapSecId < MAPSEC_NONE) - return StringCopy(dest, gRegionMapLocations[mapSecId].regionMapSectionId); - if (length == 0) - length = 18; - return StringFill(dest, CHAR_SPACE, length); -} - -const u8 *CopyMapName(u8 *dest, u16 mapSecId) -{ - switch (mapSecId) - { - case MAPSEC_UNK_0x57: - return StringCopy(dest, gOtherText_Ferry); - case MAPSEC_SECRET_BASE: - return StringCopy(dest, gOtherText_SecretBase); - default: - return GetMapSectionName(dest, mapSecId, 0); - } -} - -const u8 *CopyLocationName(u8 *dest, u16 mapSecId) -{ - if (mapSecId == MAPSEC_EVIL_TEAM_HIDEOUT) - return StringCopy(dest, gOtherText_Hideout); - else - return CopyMapName(dest, mapSecId); -} - -static void GetRegionMapLocationPosition(u16 mapSecId, u16 *x, u16 *y, u16 *width, u16 *height) -{ - *x = gRegionMapLocations[mapSecId].x; - *y = gRegionMapLocations[mapSecId].y; - *width = gRegionMapLocations[mapSecId].width; - *height = gRegionMapLocations[mapSecId].height; -} - -struct UnknownStruct3 -{ - void (*unk0)(void); - u16 unk4; - u16 unk6; - struct RegionMap regionMap; -}; - -extern u8 ewram[]; -#define ewram0 (*(struct UnknownStruct3 *)(ewram + 0)) -#define ewram888 (ewram + 0x888) -#define ewramA6E (ewram[0xA6E]) -#define ewramBlankMapName (ewram + 0xA48) - -static const u16 sFlyRegionMapFrame_Pal[] = INCBIN_U16("graphics/pokenav/map_frame.gbapal"); -static const u8 sFlyRegionMapFrame_ImageLZ[] = INCBIN_U8("graphics/pokenav/map_frame.4bpp.lz"); -static const u8 sFlyRegionMapFrame_TilemapLZ[] = INCBIN_U8("graphics/pokenav/map_frame.bin.lz"); -static const u16 sFlyTargetIcons_Pal[] = INCBIN_U16("graphics/pokenav/fly_target_icons.gbapal"); -static const u8 sFlyTargetIcons_ImageLZ[] = INCBIN_U8("graphics/pokenav/fly_target_icons.4bpp.lz"); - -static const u8 sUnknown_083E7920[][3] = -{ - {0, 9, 1}, - {0, 10, 14}, - {0, 11, 15}, - {0, 12, 16}, - {0, 13, 17}, - {0, 14, 18}, - {0, 15, 19}, - {0, 0, 3}, - {0, 1, 4}, - {0, 2, 5}, - {0, 3, 6}, - {0, 4, 7}, - {0, 5, 8}, - {0, 6, 9}, - {0, 7, 10}, - {0, 8, 11}, - {0, 16, 0}, - {0, 17, 0}, - {0, 18, 0}, - {0, 19, 0}, - {0, 20, 0}, - {0, 21, 0}, - {0, 22, 0}, - {0, 23, 0}, - {0, 24, 0}, - {0, 25, 0}, - {0, 26, 0}, - {0, 27, 0}, - {0, 28, 0}, - {0, 29, 0}, - {0, 30, 0}, - {0, 31, 0}, - {0, 32, 0}, - {0, 33, 0}, - {0, 34, 0}, - {0, 35, 0}, - {0, 36, 0}, - {0, 37, 0}, - {0, 38, 0}, - {0, 39, 0}, - {0, 40, 0}, - {0, 41, 0}, - {0, 42, 0}, - {0, 43, 0}, - {0, 44, 0}, - {0, 45, 0}, - {0, 46, 0}, - {0, 47, 0}, - {0, 48, 0}, - {0, 49, 0}, -}; - -struct UnknownStruct4 -{ - const u8 *const *unk0; - u16 mapSecId; - u16 flag; -}; - -static const u8 *const sEverGrandeCityAreaNames[] = {OtherText_PokeLeague, OtherText_PokeCenter}; - -static const struct UnknownStruct4 sUnknown_083E79C0[1] = -{ - {sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, SYS_POKEMON_LEAGUE_FLY}, -}; - -// XXX: what is this? -static u8 *const ewram_ = ewram; - -static const struct SpritePalette sFlyTargetIconSpritePalette = {sFlyTargetIcons_Pal, 2}; - -// Fly targets that are not cities or towns -static const u16 sSpecialFlyAreas[][2] = -{ - // flag, mapSecId - {0x848, MAPSEC_BATTLE_TOWER}, - {0xFFFF, MAPSEC_NONE}, -}; - -static const struct OamData sFlyTargetOamData = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sFlyTargetAnimSeq0[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sFlyTargetAnimSeq1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sFlyTargetAnimSeq2[] = -{ - ANIMCMD_FRAME(3, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sFlyTargetAnimSeq3[] = -{ - ANIMCMD_FRAME(5, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sFlyTargetAnimSeq4[] = -{ - ANIMCMD_FRAME(6, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sFlyTargetAnimSeq5[] = -{ - ANIMCMD_FRAME(8, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sFlyTargetAnimSeq6[] = -{ - ANIMCMD_FRAME(10, 5), - ANIMCMD_END, -}; - -static const union AnimCmd *const sFlyTargetAnimTable[] = -{ - sFlyTargetAnimSeq0, - sFlyTargetAnimSeq1, - sFlyTargetAnimSeq2, - sFlyTargetAnimSeq3, - sFlyTargetAnimSeq4, - sFlyTargetAnimSeq5, - sFlyTargetAnimSeq6, -}; - -static const struct SpriteTemplate gFlyTargetSpriteTemplate = -{ - .tileTag = 2, - .paletteTag = 2, - .oam = &sFlyTargetOamData, - .anims = sFlyTargetAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -void CB2_InitFlyRegionMap(void) -{ - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2VOFS = 0; - REG_BG2HOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - ResetPaletteFade(); - ResetSpriteData(); - FreeSpriteTileRanges(); - FreeAllSpritePalettes(); - break; - case 1: - SetUpWindowConfig(&gWindowConfig_81E7224); - break; - case 2: - InitMenuWindow(&gWindowConfig_81E7224); - MenuZeroFillScreen(); - break; - case 3: - InitRegionMap(&ewram0.regionMap, 0); - CreateRegionMapCursor(0, 0); - CreateRegionMapPlayerIcon(1, 1); - ewram0.unk6 = ewram0.regionMap.mapSecId; - StringFill(ewramBlankMapName, CHAR_SPACE, 12); - PrintFlyTargetName(); - break; - case 4: - LZ77UnCompVram(sFlyRegionMapFrame_ImageLZ, (void *)(VRAM + 0xC000)); - break; - case 5: - LZ77UnCompVram(sFlyRegionMapFrame_TilemapLZ, (void *)(VRAM + 0xF000)); - break; - case 6: - LoadPalette(sFlyRegionMapFrame_Pal, 16, 32); - MenuPrint_PixelCoords(gOtherText_FlyToWhere, 1, 0x90, 1); - break; - case 7: - CreateFlyTargetGraphics(); - break; - case 8: - BlendPalettes(0xFFFFFFFF, 16, 0); - SetVBlankCallback(VBlankCB_FlyRegionMap); - break; - case 9: - REG_BLDCNT = 0; - REG_BG1CNT = 0x1E0D; - REG_DISPCNT = 0x1741; - sub_80FC244(sub_80FC5B4); - SetMainCallback2(CB2_FlyRegionMap); - break; - default: - return; - } - gMain.state++; -} - -static void VBlankCB_FlyRegionMap(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void CB2_FlyRegionMap(void) -{ - ewram0.unk0(); - AnimateSprites(); - BuildOamBuffer(); -} - -static void sub_80FC244(void (*func)(void)) -{ - ewram0.unk0 = func; - ewram0.unk4 = 0; -} - -static void PrintFlyTargetName(void) -{ - if (ewram0.regionMap.unk16 == 2 || ewram0.regionMap.unk16 == 4) - { - u16 i = 0; - int zero; - - for (i = 0; i < ARRAY_COUNT(sUnknown_083E79C0); i++) - { - const struct UnknownStruct4 *r4 = &sUnknown_083E79C0[i]; - - if (ewram0.regionMap.mapSecId == r4->mapSecId) - { - if (FlagGet(r4->flag)) - { - MenuDrawTextWindow(16, 14, 29, 19); - MenuPrint(ewram0.regionMap.mapSecName, 17, 15); - MenuPrint_RightAligned(r4->unk0[ewram0.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) - { - MenuDrawTextWindow(16, 16, 29, 19); - MenuPrint(ewram0.regionMap.mapSecName, 17, 17); - MenuZeroFillWindowRect(16, 14, 29, 15); - } - } - else - { - MenuDrawTextWindow(16, 16, 29, 19); - MenuPrint(ewramBlankMapName, 17, 17); - MenuZeroFillWindowRect(16, 14, 29, 15); - } -} - -static void CreateFlyTargetGraphics(void) -{ - struct SpriteSheet spriteSheet; - - LZ77UnCompWram(sFlyTargetIcons_ImageLZ, ewram888); - spriteSheet.data = ewram888; - spriteSheet.size = 0x1C0; - spriteSheet.tag = 2; - LoadSpriteSheet(&spriteSheet); - LoadSpritePalette(&sFlyTargetIconSpritePalette); - CreateCityTownFlyTargetIcons(); - CreateSpecialAreaFlyTargetIcons(); -} - -// Draws a light overlay on cities and towns that the player can fly to -static void CreateCityTownFlyTargetIcons(void) -{ - u16 canFlyFlag = 0x80F; - u16 i; - - for (i = 0; i < 16; i++) - { - u16 x; - u16 y; - u16 width; - u16 height; - u16 r7; - u8 spriteId; - - GetRegionMapLocationPosition(i, &x, &y, &width, &height); - x = (x + 1) * 8 + 4; - y = (y + 2) * 8 + 4; - if (width == 2) - r7 = 1; - else if (height == 2) - r7 = 2; - else - r7 = 0; - spriteId = CreateSprite(&gFlyTargetSpriteTemplate, x, y, 10); - if (spriteId != 64) - { - gSprites[spriteId].oam.shape = r7; - if (FlagGet(canFlyFlag)) - gSprites[spriteId].callback = SpriteCB_FlyTargetIcons; - else - r7 += 3; - StartSpriteAnim(&gSprites[spriteId], r7); - gSprites[spriteId].data0 = i; - } - canFlyFlag++; - } -} - -// Draws a red box on other fly targets -// The Battle Tower is the only one of these -static void CreateSpecialAreaFlyTargetIcons(void) -{ - u16 i; - - for (i = 0; sSpecialFlyAreas[i][1] != MAPSEC_NONE; i++) - { - u16 x; - u16 y; - u16 width; - u16 height; - - if (FlagGet(sSpecialFlyAreas[i][0])) - { - u16 mapSecId = sSpecialFlyAreas[i][1]; - u8 spriteId; - - GetRegionMapLocationPosition(mapSecId, &x, &y, &width, &height); - x = (x + 1) * 8; - y = (y + 2) * 8; - spriteId = CreateSprite(&gFlyTargetSpriteTemplate, x, y, 10); - if (spriteId != 64) - { - gSprites[spriteId].oam.size = 1; - gSprites[spriteId].callback = SpriteCB_FlyTargetIcons; - StartSpriteAnim(&gSprites[spriteId], 6); - gSprites[spriteId].data0 = mapSecId; - } - } - } -} - -static void SpriteCB_FlyTargetIcons(struct Sprite *sprite) -{ - // Blink if our mapSecId is the one selected on the map - if (ewram0.regionMap.mapSecId == sprite->data0) - { - // Toggle visibility every 16 frames - sprite->data1++; - if (sprite->data1 > 16) - { - sprite->data1 = 0; - sprite->invisible = !sprite->invisible; - } - } - else - { - sprite->data1 = 16; - sprite->invisible = FALSE; - } -} - -static void sub_80FC5B4(void) -{ - switch (ewram0.unk4) - { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - ewram0.unk4++; - break; - case 1: - if (UpdatePaletteFade() != 0) - break; - sub_80FC244(sub_80FC600); - break; - } -} - -static void sub_80FC600(void) -{ - if (ewram0.unk4 == 0) - { - switch (sub_80FAB60()) - { - case INPUT_EVENT_NONE: - case INPUT_EVENT_DPAD: - case INPUT_EVENT_2: - break; - case INPUT_EVENT_3: - PrintFlyTargetName(); - break; - case INPUT_EVENT_A_BUTTON: - if (ewram0.regionMap.unk16 == 2 || ewram0.regionMap.unk16 == 4) - { - m4aSongNumStart(SE_SELECT); - ewramA6E = 1; - sub_80FC244(sub_80FC69C); - } - break; - case INPUT_EVENT_B_BUTTON: - m4aSongNumStart(SE_SELECT); - ewramA6E = 0; - sub_80FC244(sub_80FC69C); - break; - } - } -} - -static void sub_80FC69C(void) -{ - switch (ewram0.unk4) - { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - ewram0.unk4++; - break; - case 1: - if (UpdatePaletteFade() != 0) - break; - FreeRegionMapIconResources(); - if (ewramA6E != 0) - { - switch (ewram0.regionMap.mapSecId) - { - case MAPSEC_SOUTHERN_ISLAND: - sub_8053538(22); - break; - case MAPSEC_BATTLE_TOWER: - sub_8053538(21); - break; - case MAPSEC_LITTLEROOT_TOWN: - sub_8053538((gSaveBlock2.playerGender == MALE) ? 12 : 13); - break; - case MAPSEC_EVER_GRANDE_CITY: - sub_8053538((FlagGet(0x854) && ewram0.regionMap.everGrandeCityArea == 0) ? 20 : 11); - break; - default: - if (sUnknown_083E7920[ewram0.regionMap.mapSecId][2] != 0) - sub_8053538(sUnknown_083E7920[ewram0.regionMap.mapSecId][2]); - else - warp1_set_2(sUnknown_083E7920[ewram0.regionMap.mapSecId][0], sUnknown_083E7920[ewram0.regionMap.mapSecId][1], -1); - break; - } - sub_80865BC(); - } - else - { - SetMainCallback2(sub_808AD58); - } - break; - } -} diff --git a/src/reset_rtc_screen.c b/src/reset_rtc_screen.c deleted file mode 100644 index d052992ad..000000000 --- a/src/reset_rtc_screen.c +++ /dev/null @@ -1,496 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "rtc.h" -#include "save.h" -#include "sprite.h" -#include "songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "strings2.h" -#include "task.h" -#include "text.h" -#include "unknown_task.h" - -struct ResetRtcStruct -{ - /*0x0*/ u8 dataIndex; - /*0x2*/ u16 minVal; - /*0x4*/ u16 maxVal; - /*0x6*/ u8 left; - /*0x7*/ u8 right; - /*0x8*/ u8 unk8; -}; - -extern u16 gSaveFileStatus; - -extern struct ResetRtcStruct gUnknown_08376420[]; -extern struct SpritePalette gUnknown_083764BC; -extern struct SpriteTemplate gSpriteTemplate_83764E8; -extern u8 gUnknown_08376500[]; - -void CB2_ResetRtcScreen(void); -void VBlankCB_ResetRtcScreen(void); -void Task_ResetRtcScreen(u8); - -void SpriteCB_ResetRtcCusor0(struct Sprite *sprite) -{ - int state = gTasks[sprite->data0].data[2]; - if (state != sprite->data1) - { - sprite->data1 = state; - switch (state) - { - case 1: - sprite->invisible = FALSE; - sprite->animNum = 1; - sprite->animDelayCounter = 0; - sprite->pos1.x = 53; - sprite->pos1.y = 68; - break; - case 2: - sprite->invisible = FALSE; - sprite->animNum = 1; - sprite->animDelayCounter = 0; - sprite->pos1.x = 86; - sprite->pos1.y = 68; - break; - case 3: - sprite->invisible = FALSE; - sprite->animNum = 1; - sprite->animDelayCounter = 0; - sprite->pos1.x = 107; - sprite->pos1.y = 68; - break; - case 4: - sprite->invisible = FALSE; - sprite->animNum = 1; - sprite->animDelayCounter = 0; - sprite->pos1.x = 128; - sprite->pos1.y = 68; - break; - case 5: - sprite->invisible = FALSE; - sprite->animNum = 2; - sprite->animDelayCounter = 0; - sprite->pos1.x = 155; - sprite->pos1.y = 80; - break; - case 6: - DestroySprite(sprite); - break; - } - } -} - -void SpriteCB_ResetRtcCusor1(struct Sprite *sprite) -{ - int state = gTasks[sprite->data0].data[2]; - if (state != sprite->data1) - { - sprite->data1 = state; - switch (state) - { - case 1: - sprite->invisible = FALSE; - sprite->animNum = 0; - sprite->animDelayCounter = 0; - sprite->pos1.x = 53; - sprite->pos1.y = 92; - break; - case 2: - sprite->invisible = FALSE; - sprite->animNum = 0; - sprite->animDelayCounter = 0; - sprite->pos1.x = 86; - sprite->pos1.y = 92; - break; - case 3: - sprite->invisible = FALSE; - sprite->animNum = 0; - sprite->animDelayCounter = 0; - sprite->pos1.x = 107; - sprite->pos1.y = 92; - break; - case 4: - sprite->invisible = FALSE; - sprite->animNum = 0; - sprite->animDelayCounter = 0; - sprite->pos1.x = 128; - sprite->pos1.y = 92; - break; - case 5: - sprite->invisible = TRUE; - break; - case 6: - DestroySprite(sprite); - break; - } - } -} - -void ResetRtcScreen_CreateCursor(u8 taskId) -{ - int spriteId; - - LoadSpritePalette(&gUnknown_083764BC); - - spriteId = CreateSpriteAtEnd(&gSpriteTemplate_83764E8, 53, 68, 0); - gSprites[spriteId].callback = SpriteCB_ResetRtcCusor0; - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = -1; - - spriteId = CreateSpriteAtEnd(&gSpriteTemplate_83764E8, 53, 68, 0); - gSprites[spriteId].callback = SpriteCB_ResetRtcCusor1; - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = -1; -} - -void ResetRtcScreen_FreeCursorPalette(void) -{ - FreeSpritePaletteByTag(gUnknown_083764BC.tag); -} - -void ResetRtcScreen_HideChooseTimeWindow(void) -{ - MenuZeroFillWindowRect(3, 8, 25, 11); -} - -void ResetRtcScreen_PrintTime(u8 x, u8 y, u16 days, u8 hours, u8 minutes, u8 seconds) -{ - u8 *dest = gStringVar4; - days %= 10000; - hours %= 24; - minutes %= 60; - seconds %= 60; - sub_8072C44(gStringVar1, days, 24, 1); - dest = StringCopy(dest, gStringVar1); - dest = StringCopy(dest, gOtherText_Day); - sub_8072C44(gStringVar1, hours, 18, 1); - dest = StringCopy(dest, gStringVar1); - dest = StringCopy(dest, gUnknown_08376500); - dest = ConvertIntToDecimalStringN(dest, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); - dest = StringCopy(dest, gUnknown_08376500); - ConvertIntToDecimalStringN(dest, seconds, STR_CONV_MODE_LEADING_ZEROS, 2); - MenuPrint(gStringVar4, x, y); -} - -void ResetRtcScreen_ShowChooseTimeWindow(u16 days, u8 hours, u8 minutes, u8 seconds) -{ - MenuDrawTextWindow(3, 8, 25, 11); - MenuPrint(gOtherText_OK, 20, 9); - ResetRtcScreen_PrintTime(4, 9, days, hours, minutes, seconds); -} - -bool32 ResetRtcScreen_MoveTimeUpDown(s16 *val, int minVal, int maxVal, u16 keys) -{ - if (keys & DPAD_DOWN) - { - (*val)--; - if (*val < minVal) - *val = maxVal; - } - else if (keys & DPAD_UP) - { - (*val)++; - if (*val > maxVal) - *val = minVal; - } - else if (keys & DPAD_LEFT) - { - *val -= 10; - if (*val < minVal) - *val = maxVal; - } - else if (keys & DPAD_RIGHT) - { - *val += 10; - if (*val > maxVal) - *val = minVal; - } - else - { - return FALSE; - } - - return TRUE; -} - -void Task_ResetRtc_3(u8 taskId) -{ - gTasks[taskId].data[0] = 1; -} - -void Task_ResetRtc_2(u8 taskId) -{ - ResetRtcScreen_HideChooseTimeWindow(); - ResetRtcScreen_FreeCursorPalette(); - gTasks[taskId].func = Task_ResetRtc_3; -} - -void Task_ResetRtc_1(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - u8 selection = data[2]; - struct ResetRtcStruct *selectionInfo = &gUnknown_08376420[selection - 1]; - - if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].func = Task_ResetRtc_2; - data[1] = 0; - data[2] = 6; - PlaySE(SE_SELECT); - return; - } - - if (gMain.newKeys & DPAD_RIGHT) - { - if (selectionInfo->right) - { - data[2] = selectionInfo->right; - PlaySE(SE_SELECT); - return; - } - } - - if (gMain.newKeys & DPAD_LEFT) - { - if (selectionInfo->left) - { - data[2] = selectionInfo->left; - PlaySE(SE_SELECT); - return; - } - } - - if (selection == 5) - { - if (gMain.newKeys & A_BUTTON) - { - gLocalTime.days = data[3]; - gLocalTime.hours = data[4]; - gLocalTime.minutes = data[5]; - gLocalTime.seconds = data[6]; - PlaySE(SE_SELECT); - gTasks[taskId].func = Task_ResetRtc_2; - data[1] = 1; - data[2] = 6; - } - } - else if (ResetRtcScreen_MoveTimeUpDown(&data[selectionInfo->dataIndex], selectionInfo->minVal, selectionInfo->maxVal, gMain.newAndRepeatedKeys & (DPAD_UP | DPAD_DOWN))) - { - PlaySE(SE_SELECT); - ResetRtcScreen_PrintTime(4, 9, data[3], data[4], data[5], data[6]); - } -} - -void Task_ResetRtc_0(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - data[0] = 0; - data[3] = gLocalTime.days; - data[4] = gLocalTime.hours; - data[5] = gLocalTime.minutes; - data[6] = gLocalTime.seconds; - ResetRtcScreen_ShowChooseTimeWindow(data[3], data[4], data[5], data[6]); - ResetRtcScreen_CreateCursor(taskId); - data[2] = 2; - gTasks[taskId].func = Task_ResetRtc_1; -} - -void CB2_InitResetRtcScreen(void) -{ - u8 *addr; - u32 size; - - REG_DISPCNT = 0; - SetVBlankCallback(NULL); - - DmaClear16(3, PLTT, PLTT_SIZE); - - 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; - } - } - - ResetOamRange(0, 128); - LoadOam(); - remove_some_task(); - dp12_8087EA4(); - ResetSpriteData(); - ResetTasks(); - ResetPaletteFade(); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); - REG_DISPCNT = 4352; - SetVBlankCallback(VBlankCB_ResetRtcScreen); - SetMainCallback2(CB2_ResetRtcScreen); - CreateTask(Task_ResetRtcScreen, 80); -} - -void CB2_ResetRtcScreen(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void VBlankCB_ResetRtcScreen(void) -{ - ProcessSpriteCopyRequests(); - LoadOam(); - TransferPlttBuffer(); -} - -void ResetRtcScreen_ShowMessage(const u8 *str) -{ - MenuDisplayMessageBox(); - MenuPrint(str, 2, 15); -} - -void Task_ShowResetRtcPrompt(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - MenuZeroFillScreen(); - MenuDrawTextWindow(0, 0, 20, 10); - MenuPrint(gSystemText_PresentTime, 1, 1); - ResetRtcScreen_PrintTime( - 1, - 3, - gLocalTime.days, - gLocalTime.hours, - gLocalTime.minutes, - gLocalTime.seconds); - MenuPrint(gSystemText_PreviousTime, 1, 5); - ResetRtcScreen_PrintTime( - 1, - 7, - gSaveBlock2.lastBerryTreeUpdate.days, - gSaveBlock2.lastBerryTreeUpdate.hours, - gSaveBlock2.lastBerryTreeUpdate.minutes, - gSaveBlock2.lastBerryTreeUpdate.seconds); - ResetRtcScreen_ShowMessage(gSystemText_ResetRTCPrompt); - data[0]++; - case 1: - if (gMain.newKeys & B_BUTTON) - { - DestroyTask(taskId); - DoSoftReset(); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - DestroyTask(taskId); - } - break; - } -} - -void Task_ResetRtcScreen(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 1, 0x10, 0, 0xFFFF); - data[0] = 1; - break; - case 1: - if (!gPaletteFade.active) - { - if (gSaveFileStatus == 0 || gSaveFileStatus == 2) - { - ResetRtcScreen_ShowMessage(gSystemText_NoSaveFileNoTime); - data[0] = 5; - } - else - { - RtcCalcLocalTime(); - data[1] = CreateTask(Task_ShowResetRtcPrompt, 80); - data[0] = 2; - } - } - break; - case 2: - if (gTasks[data[1]].isActive != TRUE) - { - MenuZeroFillScreen(); - ResetRtcScreen_ShowMessage(gSystemText_PleaseResetTime); - gLocalTime = gSaveBlock2.lastBerryTreeUpdate; - data[1] = CreateTask(Task_ResetRtc_0, 80); - data[0] = 3; - } - break; - case 3: - if (gTasks[data[1]].data[0]) - { - if (!gTasks[data[1]].data[1]) - { - DestroyTask(data[1]); - data[0] = 2; - } - else - { - DestroyTask(data[1]); - RtcReset(); - RtcCalcLocalTimeOffset( - gLocalTime.days, - gLocalTime.hours, - gLocalTime.minutes, - gLocalTime.seconds); - gSaveBlock2.lastBerryTreeUpdate = gLocalTime; - VarSet(VAR_DAYS, gLocalTime.days); - DisableResetRTC(); - ResetRtcScreen_ShowMessage(gSystemText_ClockResetDataSave); - data[0] = 4; - } - } - break; - case 4: - if (TrySavingData(0) == TRUE) - { - ResetRtcScreen_ShowMessage(gSystemText_SaveCompleted); - PlaySE(SE_PINPON); - } - else - { - ResetRtcScreen_ShowMessage(gSystemText_SaveFailed); - PlaySE(SE_BOO); - } - data[0] = 5; - case 5: - if (gMain.newKeys & A_BUTTON) - { - BeginNormalPaletteFade(0xFFFFFFFF, 1, 0, 0x10, 0xFFFF); - data[0] = 6; - } - else - { - break; - } - case 6: - if (!gPaletteFade.active) - { - DestroyTask(taskId); - DoSoftReset(); - } - } -} diff --git a/src/rng.c b/src/rng.c deleted file mode 100644 index 7d4b5600e..000000000 --- a/src/rng.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "global.h" -#include "rng.h" - -// The number 1103515245 comes from the example implementation of rand and srand -// in the ISO C standard. - -u32 gRngValue; - -u16 Random(void) -{ - gRngValue = 1103515245 * gRngValue + 24691; - return gRngValue >> 16; -} - -void SeedRng(u16 seed) -{ - gRngValue = seed; -} diff --git a/src/roamer.c b/src/roamer.c deleted file mode 100644 index 948828d5e..000000000 --- a/src/roamer.c +++ /dev/null @@ -1,226 +0,0 @@ -#include "global.h" -#include "roamer.h" -#include "pokemon.h" -#include "rng.h" -#include "species.h" - -#ifdef SAPPHIRE -#define ROAMER_SPECIES SPECIES_LATIAS -#else -#define ROAMER_SPECIES SPECIES_LATIOS -#endif - -enum -{ - MAP_GRP = 0, // map group - MAP_NUM = 1, // map number -}; - -EWRAM_DATA static u8 sLocationHistory[3][2] = {0}; -EWRAM_DATA static u8 sRoamerLocation[2] = {0}; - -static const u8 sRoamerLocations[][6] = -{ - { 0x19, 0x1A, 0x20, 0x21, 0x31, 0xFF }, - { 0x1A, 0x19, 0x20, 0x21, 0xFF, 0xFF }, - { 0x20, 0x1A, 0x19, 0x21, 0xFF, 0xFF }, - { 0x21, 0x20, 0x19, 0x1A, 0x22, 0x26 }, - { 0x22, 0x21, 0x23, 0xFF, 0xFF, 0xFF }, - { 0x23, 0x22, 0x24, 0xFF, 0xFF, 0xFF }, - { 0x24, 0x23, 0x25, 0x26, 0xFF, 0xFF }, - { 0x25, 0x24, 0x26, 0xFF, 0xFF, 0xFF }, - { 0x26, 0x25, 0x21, 0xFF, 0xFF, 0xFF }, - { 0x27, 0x24, 0x28, 0x29, 0xFF, 0xFF }, - { 0x28, 0x27, 0x2A, 0xFF, 0xFF, 0xFF }, - { 0x29, 0x27, 0x2A, 0xFF, 0xFF, 0xFF }, - { 0x2A, 0x28, 0x29, 0x2B, 0xFF, 0xFF }, - { 0x2B, 0x2A, 0x2C, 0xFF, 0xFF, 0xFF }, - { 0x2C, 0x2B, 0x2D, 0xFF, 0xFF, 0xFF }, - { 0x2D, 0x2C, 0x2E, 0xFF, 0xFF, 0xFF }, - { 0x2E, 0x2D, 0x2F, 0xFF, 0xFF, 0xFF }, - { 0x2F, 0x2E, 0x30, 0xFF, 0xFF, 0xFF }, - { 0x30, 0x2F, 0x31, 0xFF, 0xFF, 0xFF }, - { 0x31, 0x30, 0x19, 0xFF, 0xFF, 0xFF }, - { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, -}; - -void ClearRoamerData(void) -{ - memset(&gSaveBlock1.roamer, 0, sizeof(gSaveBlock1.roamer)); -} - -void ClearRoamerLocationData(void) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - sLocationHistory[i][MAP_GRP] = 0; - sLocationHistory[i][MAP_NUM] = 0; - } - - sRoamerLocation[MAP_GRP] = 0; - sRoamerLocation[MAP_NUM] = 0; -} - -void CreateInitialRoamerMon(void) -{ - struct Roamer *roamer; - CreateMon(&gEnemyParty[0], ROAMER_SPECIES, 40, 0x20, 0, 0, 0, 0); - roamer = &gSaveBlock1.roamer; - roamer->species = ROAMER_SPECIES; - roamer->level = 40; - roamer->status = 0; - roamer->active = TRUE; - roamer->ivs = GetMonData(&gEnemyParty[0], MON_DATA_IVS); - roamer->personality = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY); - roamer->hp = GetMonData(&gEnemyParty[0], MON_DATA_MAX_HP); - roamer->cool = GetMonData(&gEnemyParty[0], MON_DATA_COOL); - roamer->beauty = GetMonData(&gEnemyParty[0], MON_DATA_BEAUTY); - roamer->cute = GetMonData(&gEnemyParty[0], MON_DATA_CUTE); - roamer->smart = GetMonData(&gEnemyParty[0], MON_DATA_SMART); - roamer->tough = GetMonData(&gEnemyParty[0], MON_DATA_TOUGH); - sRoamerLocation[MAP_GRP] = 0; - sRoamerLocation[MAP_NUM] = sRoamerLocations[Random() % 20][0]; -} - -void InitRoamer(void) -{ - ClearRoamerData(); - ClearRoamerLocationData(); - CreateInitialRoamerMon(); -} - -void UpdateLocationHistoryForRoamer(void) -{ - sLocationHistory[2][MAP_GRP] = sLocationHistory[1][MAP_GRP]; - sLocationHistory[2][MAP_NUM] = sLocationHistory[1][MAP_NUM]; - - sLocationHistory[1][MAP_GRP] = sLocationHistory[0][MAP_GRP]; - sLocationHistory[1][MAP_NUM] = sLocationHistory[0][MAP_NUM]; - - sLocationHistory[0][MAP_GRP] = gSaveBlock1.location.mapGroup; - sLocationHistory[0][MAP_NUM] = gSaveBlock1.location.mapNum; -} - -void RoamerMoveToOtherLocationSet(void) -{ - u8 val = 0; - struct Roamer *roamer = &gSaveBlock1.roamer; - - if (!roamer->active) - return; - - sRoamerLocation[MAP_GRP] = val; - - while (1) - { - val = sRoamerLocations[Random() % 20][0]; - if (sRoamerLocation[MAP_NUM] != val) - { - sRoamerLocation[MAP_NUM] = val; - return; - } - } -} - -void RoamerMove(void) -{ - u8 locSet = 0; - - if ((Random() % 16) == 0) - { - RoamerMoveToOtherLocationSet(); - } - else - { - struct Roamer *roamer = &gSaveBlock1.roamer; - - if (!roamer->active) - return; - - while (locSet < 20) - { - if (sRoamerLocation[MAP_NUM] == sRoamerLocations[locSet][0]) - { - u8 mapNum; - while (1) - { - mapNum = sRoamerLocations[locSet][(Random() % 5) + 1]; - if (!(sLocationHistory[2][MAP_GRP] == 0 && sLocationHistory[2][MAP_NUM] == mapNum) && mapNum != 0xFF) - break; - } - sRoamerLocation[MAP_NUM] = mapNum; - return; - } - locSet++; - } - } -} - -bool8 IsRoamerAt(u8 mapGroup, u8 mapNum) -{ - struct Roamer *roamer = &gSaveBlock1.roamer; - - if (roamer->active && mapGroup == sRoamerLocation[MAP_GRP] && mapNum == sRoamerLocation[MAP_NUM]) - return TRUE; - else - return FALSE; -} - -void CreateRoamerMonInstance(void) -{ - struct Pokemon *mon = &gEnemyParty[0]; - struct Roamer *roamer = &gSaveBlock1.roamer; - CreateMonWithIVsPersonality(mon, roamer->species, roamer->level, roamer->ivs, roamer->personality); - SetMonData(mon, MON_DATA_STATUS, (u8 *)&roamer->status); - SetMonData(mon, MON_DATA_HP, (u8 *)&roamer->hp); - SetMonData(mon, MON_DATA_COOL, (u8 *)&roamer->cool); - SetMonData(mon, MON_DATA_BEAUTY, (u8 *)&roamer->beauty); - SetMonData(mon, MON_DATA_CUTE, (u8 *)&roamer->cute); - SetMonData(mon, MON_DATA_SMART, (u8 *)&roamer->smart); - SetMonData(mon, MON_DATA_TOUGH, (u8 *)&roamer->tough); -} - -bool8 TryStartRoamerEncounter(void) -{ - if (IsRoamerAt(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) == TRUE && (Random() % 4) == 0) - { - CreateRoamerMonInstance(); - return TRUE; - } - else - { - return FALSE; - } -} - -void UpdateRoamerHPStatus(struct Pokemon *mon) -{ - struct Roamer *roamer; - u16 hp; - u8 status; - - hp = GetMonData(mon, MON_DATA_HP); - - roamer = &gSaveBlock1.roamer; - roamer->hp = hp; - - status = GetMonData(mon, MON_DATA_STATUS); - - roamer->status = status; - - RoamerMoveToOtherLocationSet(); -} - -void SetRoamerInactive(void) -{ - struct Roamer *roamer = &gSaveBlock1.roamer; - roamer->active = FALSE; -} - -void GetRoamerLocation(u8 *mapGroup, u8 *mapNum) -{ - *mapGroup = sRoamerLocation[MAP_GRP]; - *mapNum = sRoamerLocation[MAP_NUM]; -} diff --git a/src/rom3.c b/src/rom3.c deleted file mode 100644 index 803bbf943..000000000 --- a/src/rom3.c +++ /dev/null @@ -1,1393 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_811DA74.h" -#include "battle_ai.h" -#include "battle_anim.h" -#include "battle_anim_81258BC.h" -#include "battle_anim_8137220.h" -#include "cable_club.h" -#include "items.h" -#include "link.h" -#include "pokemon.h" -#include "rom3.h" -#include "rom_8094928.h" -#include "species.h" -#include "task.h" -#include "util.h" - -extern u8 unk_2000000[]; - -#define EWRAM_14000 ((u8 *)(unk_2000000 + 0x14000)) -#define EWRAM_15000 ((u8 *)(unk_2000000 + 0x15000)) - -extern u16 gBattleTypeFlags; -extern u16 gBattleWeather; -extern struct BattlePokemon gBattleMons[]; - -static EWRAM_DATA u8 gUnknown_020238C4 = 0; -static EWRAM_DATA u8 gUnknown_020238C5 = 0; -static EWRAM_DATA u8 gUnknown_020238C6 = 0; - -extern u32 gUnknown_020239FC; -extern u8 gBattleBufferA[][0x200]; -extern u8 gBattleBufferB[][0x200]; -extern u8 gActiveBank; -extern u32 gBattleExecBuffer; -extern u8 gNoOfAllBanks; -extern u16 gBattlePartyID[]; -extern u8 gBanksBySide[]; -extern u16 gCurrentMove; -extern u16 gUnknown_02024BE8; -extern u16 gLastUsedItem; -extern u8 gLastUsedAbility; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u8 gEffectBank; -extern u8 gStringBank; -extern u8 gAbsentBankFlags; -extern u8 gMultiHitCounter; -extern u8 gUnknown_02024C78; -extern u8 gBattleOutcome; -extern u8 gActionSelectionCursor[]; -extern u8 gMoveSelectionCursor[]; -extern u8 gBattleTextBuff1[]; -extern u8 gBattleTextBuff2[]; -extern u8 gBattleTextBuff3[]; -extern void (*gBattleMainFunc)(void); -extern void (*gBattleBankFunc[])(void); - -u8 gBattleBuffersTransferData[0x170]; - -void sub_800B858(void) -{ - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - OpenLink(); - CreateTask(sub_8083C50, 0); - sub_800BF28(); - } -} - -void setup_poochyena_battle(void) -{ - s32 i; - - gBattleMainFunc = nullsub_41; - for (i = 0; i < 4; i++) - { - gBattleBankFunc[i] = nullsub_91; - gBanksBySide[i] = 0xFF; - gActionSelectionCursor[i] = 0; - gMoveSelectionCursor[i] = 0; - } - sub_800B858(); - gBattleExecBuffer = 0; - battle_anim_clear_some_data(); - ClearBattleMonForms(); - BattleAI_HandleItemUseBeforeAISetup(); - if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) - { - ZeroEnemyPartyMons(); - CreateMon(&gEnemyParty[0], SPECIES_POOCHYENA, 2, 32, 0, 0, 0, 0); - i = ITEM_NONE; - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&i); - } - gUnknown_020239FC = 0; - gUnknown_02024C78 = 0; -} - -void sub_800B950(void) -{ - s32 i; - - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - sub_800BA78(); - else - sub_800B9A8(); - sub_800BD54(); - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - for (i = 0; i < gNoOfAllBanks; i++) - sub_8094978(i, 0); - } -} - -void sub_800B9A8(void) -{ - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gBattleMainFunc = sub_8010800; - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - gBattleBankFunc[0] = SetBankFuncToSafariBufferRunCommand; - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) - gBattleBankFunc[0] = SetBankFuncToWallyBufferRunCommand; - else - gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[0] = 0; - gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; - gBanksBySide[1] = 1; - gNoOfAllBanks = 2; - } - else - { - gBattleMainFunc = sub_8010800; - gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[0] = 0; - gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; - gBanksBySide[1] = 1; - gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[2] = 2; - gBattleBankFunc[3] = SetBankFuncToOpponentBufferRunCommand; - gBanksBySide[3] = 3; - gNoOfAllBanks = 4; - } -} - -void sub_800BA78(void) -{ - u8 multiplayerId; - int i; - - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - if (gBattleTypeFlags & BATTLE_TYPE_WILD) - { - gBattleMainFunc = sub_8010800; - gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[0] = 0; - gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; - gBanksBySide[1] = 1; - gNoOfAllBanks = 2; - } - else - { - gBattleBankFunc[1] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[1] = 0; - gBattleBankFunc[0] = SetBankFuncToLinkOpponentBufferRunCommand; - gBanksBySide[0] = 1; - gNoOfAllBanks = 2; - } - return; - } - if ((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_DOUBLE)) == BATTLE_TYPE_DOUBLE) - { - if (gBattleTypeFlags & BATTLE_TYPE_WILD) - { - gBattleMainFunc = sub_8010800; - gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[0] = 0; - gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; - gBanksBySide[1] = 1; - gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[2] = 2; - gBattleBankFunc[3] = SetBankFuncToLinkOpponentBufferRunCommand; - gBanksBySide[3] = 3; - gNoOfAllBanks = 4; - } - else - { - gBattleBankFunc[1] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[1] = 0; - gBattleBankFunc[0] = SetBankFuncToLinkOpponentBufferRunCommand; - gBanksBySide[0] = 1; - gBattleBankFunc[3] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[3] = 2; - gBattleBankFunc[2] = SetBankFuncToLinkOpponentBufferRunCommand; - gBanksBySide[2] = 3; - gNoOfAllBanks = 4; - - } - return; - } - multiplayerId = GetMultiplayerId(); - if (gBattleTypeFlags & BATTLE_TYPE_WILD) - gBattleMainFunc = sub_8010800; - for (i = 0; i < 4; i++) - { - switch (gLinkPlayers[i].lp_field_18) - { - case 0: - case 3: - sub_8094978(gLinkPlayers[i].lp_field_18, 0); - break; - case 1: - case 2: - sub_8094978(gLinkPlayers[i].lp_field_18, 1); - break; - } - - if (i == multiplayerId) - { - gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToPlayerBufferRunCommand; - switch (gLinkPlayers[i].lp_field_18) - { - case 0: - case 3: - gBanksBySide[gLinkPlayers[i].lp_field_18] = 0; - gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; - break; - case 1: - case 2: - gBanksBySide[gLinkPlayers[i].lp_field_18] = 2; - gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; - break; - } - } - else - { - if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[multiplayerId].lp_field_18 & 1)) - || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[multiplayerId].lp_field_18 & 1))) - { - gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToLinkPartnerBufferRunCommand; - switch (gLinkPlayers[i].lp_field_18) - { - case 0: - case 3: - gBanksBySide[gLinkPlayers[i].lp_field_18] = 0; - gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; - break; - case 1: - case 2: - gBanksBySide[gLinkPlayers[i].lp_field_18] = 2; - gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; - break; - } - } - else - { - gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToLinkOpponentBufferRunCommand; - switch (gLinkPlayers[i].lp_field_18) - { - case 0: - case 3: - gBanksBySide[gLinkPlayers[i].lp_field_18] = 1; - gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; - break; - case 1: - case 2: - gBanksBySide[gLinkPlayers[i].lp_field_18] = 3; - gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; - break; - } - } - } - } - gNoOfAllBanks = 4; -} - -void sub_800BD54(void) -{ - int i; - int j; - - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - for (i = 0; i < gNoOfAllBanks; i++) - { - for (j = 0; j < 6; j++) - { - if (i < 2) - { - if (!(gBanksBySide[i] & 1)) - { - if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 - && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != 0 - && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG - && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0) - { - gBattlePartyID[i] = j; - break; - } - } - else - { - if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 - && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0 - && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG - && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0) - { - gBattlePartyID[i] = j; - break; - } - } - } - else - { - if (!(gBanksBySide[i] & 1)) - { - if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 - && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != 0 //Probably a typo by Game Freak. The rest use SPECIES2 - && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG - && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0 - && gBattlePartyID[i - 2] != j) - { - gBattlePartyID[i] = j; - break; - } - } - else - { - if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 - && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0 - && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG - && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0 - && gBattlePartyID[i - 2] != j) - { - gBattlePartyID[i] = j; - break; - } - } - } - } - } - } -} - -void dp01_prepare_buffer(u8 a, u8 *b, u16 c) -{ - int i; - - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - dp01_prepare_buffer_wireless_probably(a, c, b); - } - else - { - switch (a) - { - case 0: - for (i = 0; i < c; i++) - { - gBattleBufferA[gActiveBank][i] = *b; - b++; - } - break; - case 1: - for (i = 0; i < c; i++) - { - gBattleBufferB[gActiveBank][i] = *b; - b++; - } - break; - } - } -} - -void sub_800BF28(void) -{ - gUnknown_020238C4 = CreateTask(sub_800C1A8, 0); - gTasks[gUnknown_020238C4].data[11] = 0; - gTasks[gUnknown_020238C4].data[12] = 0; - gTasks[gUnknown_020238C4].data[13] = 0; - gTasks[gUnknown_020238C4].data[14] = 0; - gTasks[gUnknown_020238C4].data[15] = 0; - gUnknown_020238C5 = CreateTask(sub_800C47C, 0); - gTasks[gUnknown_020238C5].data[12] = 0; - gTasks[gUnknown_020238C5].data[13] = 0; - gTasks[gUnknown_020238C5].data[14] = 0; - gTasks[gUnknown_020238C5].data[15] = 0; - gUnknown_020238C6 = 0; - CpuFill16(0, EWRAM_14000, 0x2000); -} - -void dp01_prepare_buffer_wireless_probably(u8 a, u16 b, u8 *c) -{ - s32 r9; - int i; - - r9 = b - b % 4 + 4; - if (gTasks[gUnknown_020238C4].data[14] + r9 + 9 > 0x1000) - { - gTasks[gUnknown_020238C4].data[12] = gTasks[gUnknown_020238C4].data[14]; - gTasks[gUnknown_020238C4].data[14] = 0; - } - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14000] = a; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14001] = gActiveBank; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14002] = gBankAttacker; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14003] = gBankTarget; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14004] = r9; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14005] = (r9 & 0x0000FF00) >> 8; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14006] = gAbsentBankFlags; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14007] = gEffectBank; - for (i = 0; i < b; i++) - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14008 + i] = c[i]; - gTasks[gUnknown_020238C4].data[14] = gTasks[gUnknown_020238C4].data[14] + r9 + 8; -} - -void sub_800C1A8(u8 taskId) -{ - u16 var; - - switch (gTasks[taskId].data[11]) - { - case 0: - gTasks[taskId].data[10] = 100; - gTasks[taskId].data[11]++; - break; - case 1: - gTasks[taskId].data[10]--; - if (gTasks[taskId].data[10] == 0) - gTasks[taskId].data[11]++; - break; - case 2: - GetLinkPlayerCount_2(); - if (IsLinkMaster()) - { - sub_8007F4C(); - gTasks[taskId].data[11]++; - break; - } - gTasks[taskId].data[11]++; - break; - case 3: - if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) - { - if (gTasks[taskId].data[13] == 0) - { - if (gTasks[taskId].data[15] > gTasks[taskId].data[14] - && gTasks[taskId].data[15] == gTasks[taskId].data[12]) - { - gTasks[taskId].data[12] = 0; - gTasks[taskId].data[15] = 0; - } - var = (unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8)) + 8; - SendBlock(bitmask_all_link_players_but_self(), &unk_2000000[gTasks[taskId].data[15] + 0x14000], var); - gTasks[taskId].data[11]++; - } - else - { - gTasks[taskId].data[13]--; - break; - } - } - break; - case 4: - if (sub_8007ECC()) - { - var = unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8); - gTasks[taskId].data[13] = 1; - gTasks[taskId].data[15] = gTasks[taskId].data[15] + var + 8; - gTasks[taskId].data[11] = 3; - } - break; - case 5: - gTasks[taskId].data[13]--; - if (gTasks[taskId].data[13] == 0) - { - gTasks[taskId].data[13] = 1; - gTasks[taskId].data[11] = 3; - } - break; - } -} - -//fix me -void sub_800C35C(void) -{ - u8 i; //r4 - s32 j; //r2 - u16 r6; //r6 - u8 *recvBuffer; //r3 - u8 *dest; //r5 - u8 *src; //r4 - - if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & 0x20) && gLinkPlayers[0].linkType == 0x2211) - { - for (i = 0; i < GetLinkPlayerCount(); i++) - { - if (GetBlockReceivedStatus() & gBitTable[i]) - { - ResetBlockReceivedFlag(i); - recvBuffer = (u8 *)&gBlockRecvBuffer[i]; -#ifndef NONMATCHING - asm(""); - recvBuffer = (u8 *)&gBlockRecvBuffer[i]; -#endif - r6 = gBlockRecvBuffer[i][2]; - if (gTasks[gUnknown_020238C5].data[14] + 9 + r6 > 0x1000) - { - gTasks[gUnknown_020238C5].data[12] = gTasks[gUnknown_020238C5].data[14]; - gTasks[gUnknown_020238C5].data[14] = 0; - } - //_0800C402 - dest = EWRAM_15000 + gTasks[gUnknown_020238C5].data[14]; - src = recvBuffer; - for (j = 0; j < r6 + 8; j++) - dest[j] = src[j]; - gTasks[gUnknown_020238C5].data[14] = gTasks[gUnknown_020238C5].data[14] + r6 + 8; - } - //_0800C446 - } - } -} - -void sub_800C47C(u8 taskId) -{ - u16 r7; - u8 r4; - u8 r2; - - if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) - { - if (gTasks[taskId].data[15] > gTasks[taskId].data[14] - && gTasks[taskId].data[15] == gTasks[taskId].data[12]) - { - gTasks[taskId].data[12] = 0; - gTasks[taskId].data[15] = 0; - } - r4 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 1]; - r7 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 4] | (unk_2000000[0x15000 + gTasks[taskId].data[15] + 5] << 8); - switch (unk_2000000[0x15000 + gTasks[taskId].data[15] + 0]) - { - case 0: - if (gBattleExecBuffer & gBitTable[r4]) - return; - memcpy(gBattleBufferA[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7); - sub_80155A4(r4); - if (!(gBattleTypeFlags & BATTLE_TYPE_WILD)) - { - gBankAttacker = unk_2000000[0x15000 + gTasks[taskId].data[15] + 2]; - gBankTarget = unk_2000000[0x15000 + gTasks[taskId].data[15] + 3]; - gAbsentBankFlags = unk_2000000[0x15000 + gTasks[taskId].data[15] + 6]; - gEffectBank = unk_2000000[0x15000 + gTasks[taskId].data[15] + 7]; - } - break; - case 1: - memcpy(gBattleBufferB[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7); - break; - case 2: - r2 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 8]; - gBattleExecBuffer &= ~(gBitTable[r4] << (r2 * 4)); - break; - } - gTasks[taskId].data[15] = gTasks[taskId].data[15] + r7 + 8; - } -} - -void EmitGetAttributes(u8 a, u8 b, u8 c) -{ - gBattleBuffersTransferData[0] = 0; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = 0; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void dp01_build_cmdbuf_x01_a_b_0(u8 a, u8 b, u8 c) -{ - gBattleBuffersTransferData[0] = 1; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = 0; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitSetAttributes(u8 a, u8 b, u8 c, u8 d, void *e) -{ - int i; - - gBattleBuffersTransferData[0] = 2; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - for (i = 0; i < d; i++) - gBattleBuffersTransferData[3 + i] = *(u8*)(e++); - dp01_prepare_buffer(a, gBattleBuffersTransferData, d + 3); -} - -void unref_sub_800C6A4(u8 a, u8 b, u8 c, u8 *d) -{ - int i; - - gBattleBuffersTransferData[0] = 3; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - for (i = 0; i < c; i++) - gBattleBuffersTransferData[3 + i] = *(d++); - dp01_prepare_buffer(a, gBattleBuffersTransferData, c + 3); -} - -void dp01_build_cmdbuf_x04_4_4_4(u8 a) -{ - gBattleBuffersTransferData[0] = 4; - gBattleBuffersTransferData[1] = 4; - gBattleBuffersTransferData[2] = 4; - gBattleBuffersTransferData[3] = 4; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitSwitchInAnim(u8 a, u8 b, u8 c) -{ - gBattleBuffersTransferData[0] = 5; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = 5; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitReturnPokeToBall(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 6; - gBattleBuffersTransferData[1] = b; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); -} - -void dp01_build_cmdbuf_x07_7_7_7(u8 a) -{ - gBattleBuffersTransferData[0] = 7; - gBattleBuffersTransferData[1] = 7; - gBattleBuffersTransferData[2] = 7; - gBattleBuffersTransferData[3] = 7; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitTrainerSlide(u8 a) -{ - gBattleBuffersTransferData[0] = 8; - gBattleBuffersTransferData[1] = 8; - gBattleBuffersTransferData[2] = 8; - gBattleBuffersTransferData[3] = 8; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void dp01_build_cmdbuf_x09_9_9_9(u8 a) -{ - gBattleBuffersTransferData[0] = 9; - gBattleBuffersTransferData[1] = 9; - gBattleBuffersTransferData[2] = 9; - gBattleBuffersTransferData[3] = 9; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitFaintAnimation(u8 a) -{ - gBattleBuffersTransferData[0] = 10; - gBattleBuffersTransferData[1] = 10; - gBattleBuffersTransferData[2] = 10; - gBattleBuffersTransferData[3] = 10; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void dp01_build_cmdbuf_x0B_B_B_B(u8 a) -{ - gBattleBuffersTransferData[0] = 11; - gBattleBuffersTransferData[1] = 11; - gBattleBuffersTransferData[2] = 11; - gBattleBuffersTransferData[3] = 11; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void dp01_build_cmdbuf_x0C_C_C_C(u8 a) -{ - gBattleBuffersTransferData[0] = 12; - gBattleBuffersTransferData[1] = 12; - gBattleBuffersTransferData[2] = 12; - gBattleBuffersTransferData[3] = 12; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitBallThrowAnim(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 13; - gBattleBuffersTransferData[1] = b; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); -} - -void unref_sub_800C828(u8 a, u8 b, u8 *c) -{ - int i; - - gBattleBuffersTransferData[0] = 14; - gBattleBuffersTransferData[1] = b; - for (i = 0; i < b * 3; i++) - gBattleBuffersTransferData[2 + i] = *(c++); - dp01_prepare_buffer(a, gBattleBuffersTransferData, b * 3 + 2); -} - -void EmitMoveAnimation(u8 a, u16 b, u8 c, u16 d, s32 e, u8 f, struct DisableStruct *g) -{ - gBattleBuffersTransferData[0] = 15; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - gBattleBuffersTransferData[3] = c; - gBattleBuffersTransferData[4] = d; - gBattleBuffersTransferData[5] = (d & 0xFF00) >> 8; - gBattleBuffersTransferData[6] = e; - gBattleBuffersTransferData[7] = (e & 0x0000FF00) >> 8; - gBattleBuffersTransferData[8] = (e & 0x00FF0000) >> 16; - gBattleBuffersTransferData[9] = (e & 0xFF000000) >> 24; - gBattleBuffersTransferData[10] = f; - gBattleBuffersTransferData[11] = gMultiHitCounter; - if (AbilityBattleEffects(14, 0, 13, 0, 0) == 0 && AbilityBattleEffects(14, 0, 0x4D, 0, 0) == 0) - { - gBattleBuffersTransferData[12] = gBattleWeather; - gBattleBuffersTransferData[13] = (gBattleWeather & 0xFF00) >> 8; - } - else - { - gBattleBuffersTransferData[12] = 0; - gBattleBuffersTransferData[13] = 0; - } - gBattleBuffersTransferData[14] = 0; - gBattleBuffersTransferData[15] = 0; - memcpy(&gBattleBuffersTransferData[16], g, sizeof(*g)); - dp01_prepare_buffer(a, gBattleBuffersTransferData, 0x2C); -} - -#ifdef NONMATCHING -void EmitPrintString(u8 a, u16 b) -{ - int i; - //u16 *r12; - - gBattleBuffersTransferData[0] = 16; - gBattleBuffersTransferData[1] = gBattleOutcome; - gBattleBuffersTransferData[2] = b; - gBattleBuffersTransferData[3] = (b & 0xFF00) >> 8; - - *((u16 *)&gBattleBuffersTransferData[4]) = gCurrentMove; - *((u16 *)&gBattleBuffersTransferData[6]) = gUnknown_02024BE8; - *((u16 *)&gBattleBuffersTransferData[8]) = gLastUsedItem; - - gBattleBuffersTransferData[10] = gLastUsedAbility; - gBattleBuffersTransferData[11] = unk_2000000[0x16000 + 3]; - gBattleBuffersTransferData[12] = unk_2000000[0x16000 + 0x5E]; - gBattleBuffersTransferData[13] = unk_2000000[0x16000 + 0xC1]; - gBattleBuffersTransferData[14] = gStringBank; - gBattleBuffersTransferData[15] = gBattleMoves[gCurrentMove].type; - for (i = 0; i < 4; i++) - { - gBattleBuffersTransferData[16 + i] = gBattleMons[i].ability; - } - for (i = 0; i < 16; i++) - { - gBattleBuffersTransferData[20 + i] = gBattleTextBuff1[i]; - gBattleBuffersTransferData[36 + i] = gBattleTextBuff2[i]; - gBattleBuffersTransferData[52 + i] = gBattleTextBuff3[i]; - } - dp01_prepare_buffer(a, gBattleBuffersTransferData, 0x44); -} -#else -__attribute__((naked)) -void EmitPrintString(u8 a, u16 b) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - ldr r2, _0800CA2C @ =gBattleBuffersTransferData\n\ - movs r0, 0x10\n\ - strb r0, [r2]\n\ - ldr r0, _0800CA30 @ =gBattleOutcome\n\ - ldrb r0, [r0]\n\ - strb r0, [r2, 0x1]\n\ - strb r1, [r2, 0x2]\n\ - lsrs r1, 8\n\ - strb r1, [r2, 0x3]\n\ - adds r0, r2, 0x4\n\ - mov r12, r0\n\ - ldr r4, _0800CA34 @ =gCurrentMove\n\ - ldrh r0, [r4]\n\ - strh r0, [r2, 0x4]\n\ - ldr r0, _0800CA38 @ =gUnknown_02024BE8\n\ - ldrh r0, [r0]\n\ - mov r1, r12\n\ - strh r0, [r1, 0x2]\n\ - ldr r0, _0800CA3C @ =gLastUsedItem\n\ - ldrh r0, [r0]\n\ - strh r0, [r1, 0x4]\n\ - ldr r0, _0800CA40 @ =gLastUsedAbility\n\ - ldrb r0, [r0]\n\ - strb r0, [r1, 0x6]\n\ - ldr r1, _0800CA44 @ =0x02000000\n\ - ldr r3, _0800CA48 @ =0x00016003\n\ - adds r0, r1, r3\n\ - ldrb r0, [r0]\n\ - mov r7, r12\n\ - strb r0, [r7, 0x7]\n\ - adds r3, 0x5B\n\ - adds r0, r1, r3\n\ - ldrb r0, [r0]\n\ - strb r0, [r7, 0x8]\n\ - ldr r7, _0800CA4C @ =0x000160c1\n\ - adds r1, r7\n\ - ldrb r0, [r1]\n\ - mov r1, r12\n\ - strb r0, [r1, 0x9]\n\ - ldr r0, _0800CA50 @ =gStringBank\n\ - ldrb r0, [r0]\n\ - strb r0, [r1, 0xA]\n\ - ldr r3, _0800CA54 @ =gBattleMoves\n\ - ldrh r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldrb r0, [r0, 0x2]\n\ - mov r3, r12\n\ - strb r0, [r3, 0xB]\n\ - movs r3, 0\n\ - mov r9, r2\n\ - ldr r7, _0800CA58 @ =gBattleTextBuff3\n\ - mov r8, r7\n\ - adds r2, 0x10\n\ - ldr r0, _0800CA5C @ =gBattleMons\n\ - adds r4, r0, 0\n\ - adds r4, 0x20\n\ -_0800C9D2:\n\ - adds r1, r2, r3\n\ - ldrb r0, [r4]\n\ - strb r0, [r1]\n\ - adds r4, 0x58\n\ - adds r3, 0x1\n\ - cmp r3, 0x3\n\ - ble _0800C9D2\n\ - movs r3, 0\n\ - mov r5, r12\n\ - adds r5, 0x10\n\ - mov r4, r12\n\ - adds r4, 0x20\n\ - ldr r6, _0800CA60 @ =gBattleTextBuff2\n\ - mov r2, r12\n\ - adds r2, 0x30\n\ -_0800C9F0:\n\ - adds r1, r5, r3\n\ - ldr r7, _0800CA64 @ =gBattleTextBuff1\n\ - adds r0, r3, r7\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - adds r1, r4, r3\n\ - adds r0, r3, r6\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - adds r1, r2, r3\n\ - mov r7, r8\n\ - adds r0, r3, r7\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - adds r3, 0x1\n\ - cmp r3, 0xF\n\ - ble _0800C9F0\n\ - mov r0, r10\n\ - mov r1, r9\n\ - movs r2, 0x44\n\ - bl dp01_prepare_buffer\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0800CA2C: .4byte gBattleBuffersTransferData\n\ -_0800CA30: .4byte gBattleOutcome\n\ -_0800CA34: .4byte gCurrentMove\n\ -_0800CA38: .4byte gUnknown_02024BE8\n\ -_0800CA3C: .4byte gLastUsedItem\n\ -_0800CA40: .4byte gLastUsedAbility\n\ -_0800CA44: .4byte 0x02000000\n\ -_0800CA48: .4byte 0x00016003\n\ -_0800CA4C: .4byte 0x000160c1\n\ -_0800CA50: .4byte gStringBank\n\ -_0800CA54: .4byte gBattleMoves\n\ -_0800CA58: .4byte gBattleTextBuff3\n\ -_0800CA5C: .4byte gBattleMons\n\ -_0800CA60: .4byte gBattleTextBuff2\n\ -_0800CA64: .4byte gBattleTextBuff1\n\ - .syntax divided\n"); -} -#endif - -__attribute__((naked)) -void EmitPrintStringPlayerOnly(u8 a, u16 stringID) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - ldr r2, _0800CB28 @ =gBattleBuffersTransferData\n\ - movs r0, 0x11\n\ - strb r0, [r2]\n\ - strb r0, [r2, 0x1]\n\ - strb r1, [r2, 0x2]\n\ - lsrs r1, 8\n\ - strb r1, [r2, 0x3]\n\ - adds r0, r2, 0x4\n\ - mov r12, r0\n\ - ldr r0, _0800CB2C @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - strh r0, [r2, 0x4]\n\ - ldr r0, _0800CB30 @ =gUnknown_02024BE8\n\ - ldrh r0, [r0]\n\ - mov r1, r12\n\ - strh r0, [r1, 0x2]\n\ - ldr r0, _0800CB34 @ =gLastUsedItem\n\ - ldrh r0, [r0]\n\ - strh r0, [r1, 0x4]\n\ - ldr r0, _0800CB38 @ =gLastUsedAbility\n\ - ldrb r0, [r0]\n\ - strb r0, [r1, 0x6]\n\ - ldr r0, _0800CB3C @ =0x02000000\n\ - ldr r3, _0800CB40 @ =0x00016003\n\ - adds r1, r0, r3\n\ - ldrb r1, [r1]\n\ - mov r7, r12\n\ - strb r1, [r7, 0x7]\n\ - ldr r1, _0800CB44 @ =0x0001605e\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - strb r0, [r7, 0x8]\n\ - movs r3, 0\n\ - mov r9, r2\n\ - ldr r7, _0800CB48 @ =gBattleTextBuff3\n\ - mov r8, r7\n\ - mov r4, r9\n\ - adds r4, 0x10\n\ - ldr r0, _0800CB4C @ =gBattleMons\n\ - adds r2, r0, 0\n\ - adds r2, 0x20\n\ -_0800CACE:\n\ - adds r1, r4, r3\n\ - ldrb r0, [r2]\n\ - strb r0, [r1]\n\ - adds r2, 0x58\n\ - adds r3, 0x1\n\ - cmp r3, 0x3\n\ - ble _0800CACE\n\ - movs r3, 0\n\ - mov r5, r12\n\ - adds r5, 0x10\n\ - mov r4, r12\n\ - adds r4, 0x20\n\ - ldr r6, _0800CB50 @ =gBattleTextBuff2\n\ - mov r2, r12\n\ - adds r2, 0x30\n\ -_0800CAEC:\n\ - adds r1, r5, r3\n\ - ldr r7, _0800CB54 @ =gBattleTextBuff1\n\ - adds r0, r3, r7\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - adds r1, r4, r3\n\ - adds r0, r3, r6\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - adds r1, r2, r3\n\ - mov r7, r8\n\ - adds r0, r3, r7\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - adds r3, 0x1\n\ - cmp r3, 0xF\n\ - ble _0800CAEC\n\ - mov r0, r10\n\ - mov r1, r9\n\ - movs r2, 0x44\n\ - bl dp01_prepare_buffer\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0800CB28: .4byte gBattleBuffersTransferData\n\ -_0800CB2C: .4byte gCurrentMove\n\ -_0800CB30: .4byte gUnknown_02024BE8\n\ -_0800CB34: .4byte gLastUsedItem\n\ -_0800CB38: .4byte gLastUsedAbility\n\ -_0800CB3C: .4byte 0x02000000\n\ -_0800CB40: .4byte 0x00016003\n\ -_0800CB44: .4byte 0x0001605e\n\ -_0800CB48: .4byte gBattleTextBuff3\n\ -_0800CB4C: .4byte gBattleMons\n\ -_0800CB50: .4byte gBattleTextBuff2\n\ -_0800CB54: .4byte gBattleTextBuff1\n\ - .syntax divided\n"); -} - -void dp01_build_cmdbuf_x12_a_bb(u8 a, u8 b, u16 c) -{ - gBattleBuffersTransferData[0] = 18; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void unref_sub_800CB84(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 19; - gBattleBuffersTransferData[1] = b; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); -} - -void sub_800CBA4(u8 a, u8 b, u8 c, u8 *d) -{ - u32 i; - - gBattleBuffersTransferData[0] = 20; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = 0; - for (i = 0; i < 20; i++) - gBattleBuffersTransferData[4 + i] = d[i]; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 24); -} - -void sub_800CBE0(u8 a, u8 *b) -{ - int i; - - gBattleBuffersTransferData[0] = 21; - for (i = 0; i < 3; i++) - gBattleBuffersTransferData[1 + i] = b[i]; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitChoosePokemon(u8 a, u8 b, u8 c, u8 d, u8 *e) -{ - int i; - - gBattleBuffersTransferData[0] = 22; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = d; - for (i = 0; i < 3; i++) - gBattleBuffersTransferData[4 + i] = e[i]; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 8); //but only 7 bytes were written -} - -void dp01_build_cmdbuf_x17_17_17_17(u8 a) -{ - gBattleBuffersTransferData[0] = 23; - gBattleBuffersTransferData[1] = 23; - gBattleBuffersTransferData[2] = 23; - gBattleBuffersTransferData[3] = 23; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -// FIXME: I think this function is supposed to take s16 as its second argument, -// but battle_4.c expects u16 -void EmitHealthBarUpdate(u8 a, u16 b) -{ - gBattleBuffersTransferData[0] = 24; - gBattleBuffersTransferData[1] = 0; - gBattleBuffersTransferData[2] = (s16)b; - gBattleBuffersTransferData[3] = ((s16)b & 0xFF00) >> 8; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -// FIXME: I think this function is supposed to take s16 as its third argument, -// but battle_4.c expects u16 -void EmitExpBarUpdate(u8 a, u8 b, u16 c) -{ - gBattleBuffersTransferData[0] = 25; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (s16)c; - gBattleBuffersTransferData[3] = ((s16)c & 0xFF00) >> 8; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitStatusIconUpdate(u8 a, u32 b, u32 c) -{ - gBattleBuffersTransferData[0] = 26; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0x0000FF00) >> 8; - gBattleBuffersTransferData[3] = (b & 0x00FF0000) >> 16; - gBattleBuffersTransferData[4] = (b & 0xFF000000) >> 24; - gBattleBuffersTransferData[5] = c; - gBattleBuffersTransferData[6] = (c & 0x0000FF00) >> 8; - gBattleBuffersTransferData[7] = (c & 0x00FF0000) >> 16; - gBattleBuffersTransferData[8] = (c & 0xFF000000) >> 24; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 9); -} - -void EmitStatusAnimation(u8 a, u8 b, u32 c) -{ - gBattleBuffersTransferData[0] = 27; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = (c & 0x0000FF00) >> 8; - gBattleBuffersTransferData[4] = (c & 0x00FF0000) >> 16; - gBattleBuffersTransferData[5] = (c & 0xFF000000) >> 24; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 6); -} - -void EmitStatusXor(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 28; - gBattleBuffersTransferData[1] = b; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); -} - -void dp01_build_cmdbuf_x1D_1D_numargs_varargs(u8 a, u16 b, u8 *c) -{ - int i; - - gBattleBuffersTransferData[0] = 29; - gBattleBuffersTransferData[1] = 29; - gBattleBuffersTransferData[2] = b; - gBattleBuffersTransferData[3] = (b & 0xFF00) >> 8; - for (i = 0; i < b; i++) - gBattleBuffersTransferData[4 + i] = *(c++); - dp01_prepare_buffer(a, gBattleBuffersTransferData, b + 4); -} - -void unref_sub_800CDD4(u8 a, u32 b, u16 c, u8 *d) -{ - int i; - - gBattleBuffersTransferData[0] = 30; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0x0000FF00) >> 8; - gBattleBuffersTransferData[3] = (b & 0x00FF0000) >> 16; - gBattleBuffersTransferData[4] = (b & 0xFF000000) >> 24; - gBattleBuffersTransferData[5] = c; - gBattleBuffersTransferData[6] = (c & 0xFF00) >> 8; - for (i = 0; i < c; i++) - gBattleBuffersTransferData[7 + i] = *(d++); - dp01_prepare_buffer(a, gBattleBuffersTransferData, c + 7); -} - -void unref_sub_800CE3C(u8 a, u16 b, u8 *c) -{ - int i; - - gBattleBuffersTransferData[0] = 31; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - for (i = 0; i < b; i++) - gBattleBuffersTransferData[3 + i] = *(c++); - dp01_prepare_buffer(a, gBattleBuffersTransferData, b + 3); -} - -void unref_sub_800CE84(u8 a, u16 b, u8 *c) -{ - int i; - - gBattleBuffersTransferData[0] = 32; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - for (i = 0; i < b; i++) - gBattleBuffersTransferData[3 + i] = *(c++); - dp01_prepare_buffer(a, gBattleBuffersTransferData, b + 3); -} - -void dp01_build_cmdbuf_x21_a_bb(u8 a, u8 b, u16 c) -{ - gBattleBuffersTransferData[0] = 33; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void dp01_build_cmdbuf_x22_a_three_bytes(u8 a, u8 b, u8 *c) -{ - int i; - - gBattleBuffersTransferData[0] = 34; - gBattleBuffersTransferData[1] = b; - for (i = 0; i < 3; i++) - gBattleBuffersTransferData[2 + i] = c[i]; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 5); -} - -void dp01_build_cmdbuf_x23_aa_0(u8 a, u16 b) -{ - gBattleBuffersTransferData[0] = 35; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - gBattleBuffersTransferData[3] = 0; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void dp01_build_cmdbuf_x24_aa_0(u8 a, u16 b) -{ - gBattleBuffersTransferData[0] = 36; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - gBattleBuffersTransferData[3] = 0; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void dp01_build_cmdbuf_x25_25_25_25(u8 a) -{ - gBattleBuffersTransferData[0] = 37; - gBattleBuffersTransferData[1] = 37; - gBattleBuffersTransferData[2] = 37; - gBattleBuffersTransferData[3] = 37; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void dp01_build_cmdbuf_x26_a(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 38; - gBattleBuffersTransferData[1] = b; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); -} - -void dp01_build_cmdbuf_x27_27_27_27(u8 a) -{ - gBattleBuffersTransferData[0] = 39; - gBattleBuffersTransferData[1] = 39; - gBattleBuffersTransferData[2] = 39; - gBattleBuffersTransferData[3] = 39; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void dp01_build_cmdbuf_x28_28_28_28(u8 a) -{ - gBattleBuffersTransferData[0] = 40; - gBattleBuffersTransferData[1] = 40; - gBattleBuffersTransferData[2] = 40; - gBattleBuffersTransferData[3] = 40; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitHitAnimation(u8 a) -{ - gBattleBuffersTransferData[0] = 41; - gBattleBuffersTransferData[1] = 41; - gBattleBuffersTransferData[2] = 41; - gBattleBuffersTransferData[3] = 41; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void dp01_build_cmdbuf_x2A_2A_2A_2A(u8 a) -{ - gBattleBuffersTransferData[0] = 42; - gBattleBuffersTransferData[1] = 42; - gBattleBuffersTransferData[2] = 42; - gBattleBuffersTransferData[3] = 42; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitEffectivenessSound(u8 a, u16 b) -{ - gBattleBuffersTransferData[0] = 43; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - gBattleBuffersTransferData[3] = 0; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitPlaySound(u8 a, u16 b) -{ - gBattleBuffersTransferData[0] = 44; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - gBattleBuffersTransferData[3] = 0; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitFaintingCry(u8 a) -{ - gBattleBuffersTransferData[0] = 45; - gBattleBuffersTransferData[1] = 45; - gBattleBuffersTransferData[2] = 45; - gBattleBuffersTransferData[3] = 45; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitBattleIntroSlide(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 46; - gBattleBuffersTransferData[1] = b; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); -} - -void dp01_build_cmdbuf_x2F_2F_2F_2F(u8 a) -{ - gBattleBuffersTransferData[0] = 47; - gBattleBuffersTransferData[1] = 47; - gBattleBuffersTransferData[2] = 47; - gBattleBuffersTransferData[3] = 47; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void dp01_build_cmdbuf_x30_TODO(u8 a, u8 *b, u8 c) -{ - int i; - - gBattleBuffersTransferData[0] = 48; - gBattleBuffersTransferData[1] = c & 0x7F; - gBattleBuffersTransferData[2] = (c & 0x80) >> 7; - gBattleBuffersTransferData[3] = 48; - for (i = 0; i < 48; i++) - gBattleBuffersTransferData[4 + i] = b[i]; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 52); -} - -void dp01_build_cmdbuf_x31_31_31_31(u8 a) -{ - gBattleBuffersTransferData[0] = 49; - gBattleBuffersTransferData[1] = 49; - gBattleBuffersTransferData[2] = 49; - gBattleBuffersTransferData[3] = 49; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void dp01_build_cmdbuf_x32_32_32_32(u8 a) -{ - gBattleBuffersTransferData[0] = 50; - gBattleBuffersTransferData[1] = 50; - gBattleBuffersTransferData[2] = 50; - gBattleBuffersTransferData[3] = 50; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitSpriteInvisibility(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 51; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = 51; - gBattleBuffersTransferData[3] = 51; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitBattleAnimation(u8 a, u8 b, u16 c) -{ - gBattleBuffersTransferData[0] = 52; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 4); -} - -void EmitLinkStandbyMsg(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 53; - gBattleBuffersTransferData[1] = b; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); -} - -void EmitResetActionMoveSelection(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 54; - gBattleBuffersTransferData[1] = b; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); -} - -void dp01_build_cmdbuf_x37_a(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 55; - gBattleBuffersTransferData[1] = b; - dp01_prepare_buffer(a, gBattleBuffersTransferData, 2); -} diff --git a/src/rom4.c b/src/rom4.c deleted file mode 100644 index f9006efba..000000000 --- a/src/rom4.c +++ /dev/null @@ -1,2573 +0,0 @@ -#include "global.h" -#include "rom4.h" -#include "battle_setup.h" -#include "berry.h" -#include "cable_club.h" -#include "clock.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_control_avatar.h" -#include "field_effect.h" -#include "field_fadetransition.h" -#include "field_ground_effect.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" -#include "field_message_box.h" -#include "field_player_avatar.h" -#include "field_screen_effect.h" -#include "field_special_scene.h" -#include "field_specials.h" -#include "field_tasks.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "fldeff_flash.h" -#include "heal_location.h" -#include "link.h" -#include "load_save.h" -#include "main.h" -#include "map_name_popup.h" -#include "menu.h" -#include "metatile_behavior.h" -#include "new_game.h" -#include "palette.h" -#include "play_time.h" -#include "rng.h" -#include "roamer.h" -#include "rotating_gate.h" -#include "safari_zone.h" -#include "script.h" -#include "script_pokemon_80C4.h" -#include "secret_base.h" -#include "songs.h" -#include "sound.h" -#include "start_menu.h" -#include "task.h" -#include "tileset_anim.h" -#include "time_events.h" -#include "tv.h" -#include "unknown_task.h" -#include "wild_encounter.h" - -#ifdef SAPPHIRE -#define LEGENDARY_MUSIC BGM_OOAME // Heavy Rain -#else -#define LEGENDARY_MUSIC BGM_HIDERI // Drought -#endif - -struct UnkTVStruct -{ - u32 tv_field_0; - u32 tv_field_4; -}; - -EWRAM_DATA struct WarpData gUnknown_020297F0 = {0}; -EWRAM_DATA struct WarpData gUnknown_020297F8 = {0}; -EWRAM_DATA struct WarpData gUnknown_02029800 = {0}; -EWRAM_DATA struct WarpData gUnknown_02029808 = {0}; -EWRAM_DATA struct UnkPlayerStruct gUnknown_02029810 = {0}; -EWRAM_DATA u16 gUnknown_02029814 = 0; -EWRAM_DATA bool8 gUnknown_02029816 = FALSE; -EWRAM_DATA struct LinkPlayerMapObject gLinkPlayerMapObjects[4] = {0}; - -static u8 gUnknown_03000580[4]; -static u16 (*gUnknown_03000584)(u32); -static u8 gUnknown_03000588; - -u16 word_3004858; -void (*gFieldCallback)(void); -u8 gUnknown_03004860; -u8 gFieldLinkPlayerCount; - -extern u16 gUnknown_03004898; -extern u16 gUnknown_0300489C; - -extern u8 EventScript_LeagueWhiteOut[]; -extern u8 gUnknown_0819FC9F[]; -extern u8 SingleBattleColosseum_EventScript_1A436F[]; -extern u8 SingleBattleColosseum_EventScript_1A4379[]; -extern u8 DoubleBattleColosseum_EventScript_1A4383[]; -extern u8 DoubleBattleColosseum_EventScript_1A439E[]; -extern u8 DoubleBattleColosseum_EventScript_1A43B9[]; -extern u8 DoubleBattleColosseum_EventScript_1A43D4[]; -extern u8 TradeCenter_EventScript_1A43F0[]; -extern u8 TradeCenter_EventScript_1A43FA[]; -extern u8 RecordCorner_EventScript_1A4418[]; -extern u8 RecordCorner_EventScript_1A442D[]; -extern u8 RecordCorner_EventScript_1A4442[]; -extern u8 RecordCorner_EventScript_1A4457[]; -extern u8 TradeRoom_ReadTrainerCard1[]; -extern u8 TradeRoom_ReadTrainerCard2[]; -extern u8 TradeRoom_TooBusyToNotice[]; -extern u8 TradeRoom_PromptToCancelLink[]; -extern u8 TradeRoom_TerminateLink[]; -extern u8 gUnknown_081A4508[]; - -extern u8 (*gUnknown_082166A0[])(struct LinkPlayerMapObject *, struct MapObject *, u8); -extern u8 (*gUnknown_082166AC[])(struct LinkPlayerMapObject *, struct MapObject *, u8); -extern void (*gUnknown_082166D8[])(struct LinkPlayerMapObject *, struct MapObject *); - -extern struct MapData * const gMapAttributes[]; -extern struct MapHeader * const * const gMapGroups[]; -extern const struct WarpData gDummyWarpData; -extern s32 gUnknown_0839ACE8; -extern u32 gUnknown_08216694[]; - -void DoWhiteOut(void) -{ - ScriptContext2_RunNewScript(EventScript_LeagueWhiteOut); - gSaveBlock1.money /= 2; - HealPlayerParty(); - sub_8053050(); - sub_8053570(); - warp_in(); -} - -void flag_var_implications_of_teleport_(void) -{ - player_avatar_init_params_reset(); - FlagReset(SYS_CYCLING_ROAD); - FlagReset(SYS_CRUISE_MODE); - FlagReset(SYS_SAFARI_MODE); - FlagReset(SYS_USE_STRENGTH); - FlagReset(SYS_USE_FLASH); -} - -void new_game(void) -{ - player_avatar_init_params_reset(); - FlagReset(SYS_CYCLING_ROAD); - FlagReset(SYS_CRUISE_MODE); - FlagReset(SYS_SAFARI_MODE); - FlagReset(SYS_USE_STRENGTH); - FlagReset(SYS_USE_FLASH); - ScriptContext2_RunNewScript(gUnknown_0819FC9F); -} - -void sub_8053014(void) -{ - player_avatar_init_params_reset(); - FlagReset(SYS_CYCLING_ROAD); - FlagReset(SYS_CRUISE_MODE); - FlagReset(SYS_SAFARI_MODE); - FlagReset(SYS_USE_STRENGTH); - FlagReset(SYS_USE_FLASH); -} - -void sub_8053050(void) -{ - player_avatar_init_params_reset(); - FlagReset(SYS_CYCLING_ROAD); - FlagReset(SYS_CRUISE_MODE); - FlagReset(SYS_SAFARI_MODE); - FlagReset(SYS_USE_STRENGTH); - FlagReset(SYS_USE_FLASH); -} - -void sub_805308C(void) -{ - FlagReset(SYS_SAFARI_MODE); - sub_8054164(); - ResetCyclingRoadChallengeData(); - UpdateLocationHistoryForRoamer(); - RoamerMoveToOtherLocationSet(); -} - -void ResetGameStats(void) -{ - s32 i; - - for (i = 0; i < NUM_GAME_STATS; i++) - gSaveBlock1.gameStats[i] = 0; -} - -void IncrementGameStat(u8 index) -{ - if (index < NUM_GAME_STATS) - { - if (gSaveBlock1.gameStats[index] < 0xFFFFFF) - gSaveBlock1.gameStats[index]++; - else - gSaveBlock1.gameStats[index] = 0xFFFFFF; - } -} - -u32 GetGameStat(u8 index) -{ - if (index >= NUM_GAME_STATS) - return 0; - - return gSaveBlock1.gameStats[index]; -} - -void SetGameStat(u8 index, u32 value) -{ - if (index < NUM_GAME_STATS) - gSaveBlock1.gameStats[index] = value; -} - -void sub_8053154(void) -{ - CpuFill32(0, gSaveBlock1.mapObjectTemplates, sizeof(gSaveBlock1.mapObjectTemplates)); - CpuCopy32(gMapHeader.events->mapObjects, - gSaveBlock1.mapObjectTemplates, - gMapHeader.events->mapObjectCount * sizeof(struct MapObjectTemplate)); -} - -void sub_8053198(void) -{ - struct MapObjectTemplate *mapObjectTemplates = gSaveBlock1.mapObjectTemplates; - s32 i; - for (i = 0; i < 64; i++) - mapObjectTemplates[i].script = gMapHeader.events->mapObjects[i].script; -} - -void update_saveblock1_field_object_coords(u8 localId, s16 x, s16 y) -{ - s32 i; - for (i = 0; i < 64; i++) - { - struct MapObjectTemplate *mapObjectTemplate = &gSaveBlock1.mapObjectTemplates[i]; - if (mapObjectTemplate->localId == localId) - { - mapObjectTemplate->x = x; - mapObjectTemplate->y = y; - break; - } - } -} - -void update_saveblock1_field_object_movement_behavior(u8 localId, u8 movementType) -{ - s32 i = 0; - struct MapObjectTemplate *mapObjectTemplate = gSaveBlock1.mapObjectTemplates; - do - { - if (mapObjectTemplate->localId == localId) - { - mapObjectTemplate->movementType = movementType; - break; - } - mapObjectTemplate++; - i++; - } while (i < 64); -} - -void mapdata_load_assets_to_gpu_and_full_redraw(void) -{ - move_tilemap_camera_to_upper_left_corner(); - copy_map_tileset1_tileset2_to_vram(gMapHeader.mapData); - apply_map_tileset1_tileset2_palette(gMapHeader.mapData); - DrawWholeMapView(); - cur_mapheader_run_tileset_funcs_after_some_cpuset(); -} - -struct MapData *get_mapdata_header(void) -{ - u16 mapDataId = gSaveBlock1.mapDataId; - if (mapDataId) - return gMapAttributes[mapDataId - 1]; - return NULL; -} - -void warp_shift(void) -{ - gUnknown_020297F0 = gSaveBlock1.location; - gSaveBlock1.location = gUnknown_020297F8; - gUnknown_02029800 = gDummyWarpData; - gUnknown_02029808 = gDummyWarpData; -} - -void warp_set(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - warp->mapGroup = mapGroup; - warp->mapNum = mapNum; - warp->warpId = warpId; - warp->x = x; - warp->y = y; -} - -bool32 warp_data_is_not_neg_1(struct WarpData *warp) -{ - if (warp->mapGroup != -1) - return FALSE; - if (warp->mapNum != -1) - return FALSE; - if (warp->warpId != -1) - return FALSE; - if (warp->x != -1) - return FALSE; - if (warp->y != -1) - return FALSE; - return TRUE; -} - -struct MapHeader * const get_mapheader_by_bank_and_number(u16 mapGroup, u16 mapNum) -{ - return gMapGroups[mapGroup][mapNum]; -} - -struct MapHeader * const warp1_get_mapheader(void) -{ - return get_mapheader_by_bank_and_number(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum); -} - -void set_current_map_header_from_sav1_save_old_name(void) -{ - struct MapHeader *dest = &gMapHeader; - struct MapHeader *src = get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); - *dest = *src; - gSaveBlock1.mapDataId = dest->mapDataId; - dest->mapData = get_mapdata_header(); -} - -void sub_805338C(void) -{ - struct MapHeader *dest = &gMapHeader; - struct MapHeader *src = get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); - *dest = *src; - dest->mapData = get_mapdata_header(); -} - -void sub_80533CC(void) -{ - if (gSaveBlock1.location.warpId >= 0 && gSaveBlock1.location.warpId < gMapHeader.events->warpCount) - { - gSaveBlock1.pos.x = gMapHeader.events->warps[gSaveBlock1.location.warpId].x; - gSaveBlock1.pos.y = gMapHeader.events->warps[gSaveBlock1.location.warpId].y; - } - else if (gSaveBlock1.location.x >= 0 && gSaveBlock1.location.y >= 0) - { - gSaveBlock1.pos.x = gSaveBlock1.location.x; - gSaveBlock1.pos.y = gSaveBlock1.location.y; - } - else - { - gSaveBlock1.pos.x = gMapHeader.mapData->width / 2; - gSaveBlock1.pos.y = gMapHeader.mapData->height / 2; - } -} - -void warp_in(void) -{ - warp_shift(); - set_current_map_header_from_sav1_save_old_name(); - sub_80533CC(); -} - -void warp1_set(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - warp_set(&gUnknown_020297F8, mapGroup, mapNum, warpId, x, y); -} - -void warp1_set_2(s8 mapGroup, s8 mapNum, s8 warpId) -{ - warp1_set(mapGroup, mapNum, warpId, -1, -1); -} - -void saved_warp2_set(int unused, s8 mapGroup, s8 mapNum, s8 warpId) -{ - warp_set(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, gSaveBlock1.pos.x, gSaveBlock1.pos.y); -} - -void saved_warp2_set_2(int unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - warp_set(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, x, y); -} - -void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused) -{ - gUnknown_020297F8 = gSaveBlock1.warp2; -} - -void sub_8053538(u8 a1) -{ - const struct HealLocation *warp = GetHealLocation(a1); - if (warp) - warp1_set(warp->group, warp->map, -1, warp->x, warp->y); -} - -void sub_8053570(void) -{ - gUnknown_020297F8 = gSaveBlock1.warp3; -} - -void sub_8053588(u8 a1) -{ - const struct HealLocation *warp = GetHealLocation(a1); - if (warp) - warp_set(&gSaveBlock1.warp3, warp->group, warp->map, -1, warp->x, warp->y); -} - -void sub_80535C4(s16 a1, s16 a2) -{ - u8 v4 = sav1_map_get_light_level(); - u8 v5 = get_map_light_level_by_bank_and_number(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum); - if (is_light_level_1_2_3_5_or_6(v4) && is_light_level_1_2_3_5_or_6(v5) != TRUE) - sub_805363C(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, a1 - 7, a2 - 6); -} - -void sub_805363C(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - warp_set(&gSaveBlock1.warp4, mapGroup, mapNum, warpId, x, y); -} - -void sub_8053678(void) -{ - gUnknown_020297F8 = gSaveBlock1.warp4; -} - -void sub_8053690(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - warp_set(&gUnknown_02029800, mapGroup, mapNum, warpId, x, y); -} - -void warp1_set_to_warp2(void) -{ - gUnknown_020297F8 = gUnknown_02029800; -} - -void sub_80536E4(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - warp_set(&gUnknown_02029808, mapGroup, mapNum, warpId, x, y); -} - -void sub_8053720(s16 x, s16 y) -{ - if (warp_data_is_not_neg_1(&gUnknown_02029808) == TRUE) - { - gUnknown_020297F8 = gUnknown_020297F0; - } - else - { - warp1_set(gUnknown_02029808.mapGroup, gUnknown_02029808.mapNum, -1, x, y); - } -} - -void sub_8053778(void) -{ - gUnknown_020297F8 = gSaveBlock1.warp1; -} - -void unref_sub_8053790(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - warp_set(&gSaveBlock1.warp1, mapGroup, mapNum, warpId, x, y); -} - -void sub_80537CC(u8 a1) -{ - const struct HealLocation *warp = GetHealLocation(a1); - if (warp) - warp_set(&gSaveBlock1.warp1, warp->group, warp->map, -1, warp->x, warp->y); -} - -void gpu_sync_bg_hide() -{ - gSaveBlock1.warp1 = gSaveBlock1.warp2; -} - -struct MapConnection *sub_8053818(u8 dir) -{ - s32 i; - s32 count = gMapHeader.connections->count; - struct MapConnection *connection = gMapHeader.connections->connections; - - if (connection == NULL) - return NULL; - - for(i = 0; i < count; i++, connection++) - if (connection->direction == dir) - return connection; - - return NULL; -} - -bool8 sub_8053850(u8 dir, u16 x, u16 y) -{ - struct MapConnection *connection = sub_8053818(dir); - if (connection) - { - warp1_set(connection->mapGroup, connection->mapNum, -1, x, y); - } - else - { - mapheader_run_script_with_tag_x6(); - if (warp_data_is_not_neg_1(&gUnknown_02029800)) - return FALSE; - warp1_set_to_warp2(); - } - return TRUE; -} - -bool8 sub_80538B0(u16 x, u16 y) -{ - return sub_8053850(CONNECTION_EMERGE, x, y); -} - -bool8 sub_80538D0(u16 x, u16 y) -{ - return sub_8053850(CONNECTION_DIVE, x, y); -} - -void sub_80538F0(u8 mapGroup, u8 mapNum) -{ - s32 i; - - warp1_set(mapGroup, mapNum, -1, -1, -1); - sub_8053F0C(); - warp_shift(); - set_current_map_header_from_sav1_save_old_name(); - sub_8053154(); - ClearTempFieldEventData(); - ResetCyclingRoadChallengeData(); - prev_quest_postbuffer_cursor_backup_reset(); - sub_8082BD0(mapGroup, mapNum); - DoTimeBasedEvents(); - sub_80806E4(); - sub_8054164(); - sub_8053C98(); - sav1_reset_battle_music_maybe(); - mapheader_run_script_with_tag_x3(); - not_trainer_hill_battle_pyramid(); - sub_8056D38(gMapHeader.mapData); - apply_map_tileset2_palette(gMapHeader.mapData); - - for (i = 6; i < 12; i++) - sub_807D874(i); - - sub_8072ED0(); - UpdateLocationHistoryForRoamer(); - RoamerMove(); - DoCurrentWeather(); - ResetFieldTasksArgs(); - mapheader_run_script_with_tag_x5(); - ShowMapNamePopup(); -} - -void sub_8053994(u32 a1) -{ - bool8 v2; - bool8 v3; - - set_current_map_header_from_sav1_save_old_name(); - sub_8053154(); - v2 = is_light_level_1_2_3_5_or_6(gMapHeader.mapType); - v3 = is_light_level_8_or_9(gMapHeader.mapType); - ClearTempFieldEventData(); - ResetCyclingRoadChallengeData(); - prev_quest_postbuffer_cursor_backup_reset(); - sub_8082BD0(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); - if (a1 != 1) - DoTimeBasedEvents(); - sub_80806E4(); - sub_8054164(); - if (v2) - FlagReset(SYS_USE_FLASH); - sub_8053C98(); - sav1_reset_battle_music_maybe(); - mapheader_run_script_with_tag_x3(); - UpdateLocationHistoryForRoamer(); - RoamerMoveToOtherLocationSet(); - not_trainer_hill_battle_pyramid(); - if (a1 != 1 && v3) - { - UpdateTVScreensOnMap(gUnknown_03004870.width, gUnknown_03004870.height); - sub_80BBCCC(1); - } -} - -void player_avatar_init_params_reset(void) -{ - gUnknown_02029810.player_field_1 = 1; - gUnknown_02029810.player_field_0 = 1; -} - -void walkrun_find_lowest_active_bit_in_bitfield(void) -{ - gUnknown_02029810.player_field_1 = player_get_direction_lower_nybble(); - - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) - gUnknown_02029810.player_field_0 = 2; - else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) - gUnknown_02029810.player_field_0 = 4; - else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - gUnknown_02029810.player_field_0 = 8; - else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4)) - gUnknown_02029810.player_field_0 = 16; - else - gUnknown_02029810.player_field_0 = 1; -} - -struct UnkPlayerStruct *sub_8053AA8(void) -{ - struct UnkPlayerStruct playerStruct; - u8 light = sav1_map_get_light_level(); - u16 v2 = cur_mapdata_block_role_at_screen_center_acc_to_sav1(); - u8 v4 = sub_8053B00(&gUnknown_02029810, v2, light); - playerStruct.player_field_0 = v4; - playerStruct.player_field_1 = sub_8053B60(&gUnknown_02029810, v4, v2, light); - gUnknown_02029810 = playerStruct; - return &gUnknown_02029810; -} - -u8 sub_8053B00(struct UnkPlayerStruct *playerStruct, u16 a2, u8 a3) -{ - if (a3 != 8 && FlagGet(SYS_CRUISE_MODE)) - return 1; - if (a3 == 5) - return 16; - if (MetatileBehavior_IsSurfableWaterOrUnderwater(a2) == 1) - return 8; - if (IsBikingAllowedByMap() != TRUE) - return 1; - if (playerStruct->player_field_0 == 2) - return 2; - if (playerStruct->player_field_0 != 4) - return 1; - return 4; -} - -u8 sub_8053B60(struct UnkPlayerStruct *playerStruct, u8 a2, u16 a3, u8 a4) -{ - if (FlagGet(SYS_CRUISE_MODE) && a4 == 6) - return 4; - if (MetatileBehavior_IsDeepSouthWarp(a3) == TRUE) - return 2; - if (MetatileBehavior_IsNonAnimDoor(a3) == TRUE || MetatileBehavior_IsDoor(a3) == TRUE) - return 1; - if (MetatileBehavior_IsSouthArrowWarp(a3) == TRUE) - return 2; - if (MetatileBehavior_IsNorthArrowWarp(a3) == TRUE) - return 1; - if (MetatileBehavior_IsWestArrowWarp(a3) == TRUE) - return 4; - if (MetatileBehavior_IsEastArrowWarp(a3) == TRUE) - return 3; - if ((playerStruct->player_field_0 == 16 && a2 == 8) - || (playerStruct->player_field_0 == 8 && a2 == 16)) - return playerStruct->player_field_1; - if (MetatileBehavior_IsLadder(a3) == TRUE) - return playerStruct->player_field_1; - return 1; -} - -u16 cur_mapdata_block_role_at_screen_center_acc_to_sav1(void) -{ - return MapGridGetMetatileBehaviorAt(gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7); -} - -bool32 IsBikingAllowedByMap(void) -{ - // is player in cycling road entrance? - if (gSaveBlock1.location.mapGroup == 29 && (gSaveBlock1.location.mapNum == 11 || gSaveBlock1.location.mapNum == 12)) - return TRUE; - - // is player indoor, in a secret base, or underwater? - if (gMapHeader.mapType == MAP_TYPE_INDOOR) - return FALSE; - if (gMapHeader.mapType == MAP_TYPE_SECRET_BASE) - return FALSE; - if (gMapHeader.mapType == MAP_TYPE_UNDERWATER) - return FALSE; - - // is player in SeafloorCavern_Room9? - if (gSaveBlock1.location.mapGroup == 24 && gSaveBlock1.location.mapNum == 36) - return FALSE; - - // is player in CaveOfOrigin_B4F? - if (gSaveBlock1.location.mapGroup == 24 && gSaveBlock1.location.mapNum == 42) - return FALSE; - - return TRUE; -} - -void sub_8053C98(void) -{ - if (!gMapHeader.cave) - gSaveBlock1.flashUsed = 0; - else if (FlagGet(SYS_USE_FLASH)) - gSaveBlock1.flashUsed = 1; - else - gSaveBlock1.flashUsed = gUnknown_0839ACE8; -} - -void sub_8053CE4(s32 a1) -{ - if (a1 < 0 || a1 > gUnknown_0839ACE8) - a1 = 0; - gSaveBlock1.flashUsed = a1; -} - -u8 sav1_get_flash_used_on_map(void) -{ - return gSaveBlock1.flashUsed; -} - -void sub_8053D14(u16 mapDataId) -{ - gSaveBlock1.mapDataId = mapDataId; - gMapHeader.mapData = get_mapdata_header(); -} - -bool16 sub_8053D30(struct WarpData *warp) -{ - if (!FlagGet(SYS_WEATHER_CTRL)) - return FALSE; - if (warp->mapGroup != 0) - return FALSE; - switch (warp->mapNum) - { - case 5: - case 6: - case 7: - case 8: - return TRUE; - case 39: - case 40: - case 41: - case 42: - case 43: - return TRUE; - } - return FALSE; -} - -bool16 sub_8053D6C(struct WarpData *warp) -{ - if (VarGet(0x40B3)) - return FALSE; - if (warp->mapGroup != 32) - return FALSE; - if (warp->mapNum == 0 || warp->mapNum == 1) - return TRUE; - return FALSE; -} - -u16 sub_8053D9C(struct WarpData *warp) -{ - if (sub_8053D30(warp) == TRUE) - return LEGENDARY_MUSIC; - else if (sub_8053D6C(warp) == TRUE) - return BGM_TOZAN; - else - return get_mapheader_by_bank_and_number(warp->mapGroup, warp->mapNum)->music; -} - -u16 sav1_map_get_music(void) -{ - u16 music; - - if (gSaveBlock1.location.mapGroup == 0 - && gSaveBlock1.location.mapNum == 26 - && GetSav1Weather() == 8) - return BGM_ASHROAD; - - music = sub_8053D9C(&gSaveBlock1.location); - if (music != 0x7FFF) - { - return music; - } - else - { - if (gSaveBlock1.pos.x < 24) - return BGM_DOORO_X1; - else - return BGM_GRANROAD; - } -} - -u16 warp1_target_get_music(void) -{ - u16 music = sub_8053D9C(&gUnknown_020297F8); - if (music != 0x7FFF) - { - return music; - } - else - { - if (gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 2) - return BGM_DOORO_X1; - else - return BGM_GRANROAD; - } -} - -void call_map_music_set_to_zero(void) -{ - ResetMapMusic(); -} - -void sub_8053E90(void) -{ - u16 music = sav1_map_get_music(); - - if (music != LEGENDARY_MUSIC) - { - if (gSaveBlock1.battleMusic) - music = gSaveBlock1.battleMusic; - else if (sav1_map_get_light_level() == 5) - music = BGM_DEEPDEEP; - else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - music = BGM_NAMINORI; - } - - if (music != GetCurrentMapMusic()) - PlayNewMapMusic(music); -} - -void sav1_set_battle_music_maybe(u16 songNum) -{ - gSaveBlock1.battleMusic = songNum; -} - -void sav1_reset_battle_music_maybe(void) -{ - gSaveBlock1.battleMusic = 0; -} - -void sub_8053F0C(void) -{ - if (FlagGet(SPECIAL_FLAG_1) != TRUE) - { - u16 newMusic = warp1_target_get_music(); - u16 currentMusic = GetCurrentMapMusic(); - if (newMusic != LEGENDARY_MUSIC) - { - if (currentMusic == BGM_DEEPDEEP || currentMusic == BGM_NAMINORI) - return; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - newMusic = BGM_NAMINORI; - } - if (newMusic != currentMusic) - { - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) - FadeOutAndFadeInNewMapMusic(newMusic, 4, 4); - else - FadeOutAndPlayNewMapMusic(newMusic, 8); - } - } -} - -void sub_8053F84(void) -{ - u16 currentMusic = GetCurrentMapMusic(); - if (currentMusic != sav1_map_get_music()) - FadeOutAndPlayNewMapMusic(sav1_map_get_music(), 8); -} - -void sub_8053FB0(u16 music) -{ - u16 currentMusic = GetCurrentMapMusic(); - if (currentMusic != music && currentMusic != LEGENDARY_MUSIC) - FadeOutAndPlayNewMapMusic(music, 8); -} - -u8 is_warp1_light_level_8_or_9(void) -{ - struct MapHeader *mapHeader = warp1_get_mapheader(); - if (is_light_level_8_or_9(mapHeader->mapType) == TRUE) - return 2; - else - return 4; -} - -void sub_8053FF8(void) -{ - u16 music = warp1_target_get_music(); - if (FlagGet(SPECIAL_FLAG_1) != TRUE && music != GetCurrentMapMusic()) - { - u8 speed = is_warp1_light_level_8_or_9(); - FadeOutMapMusic(speed); - } -} - -bool8 sub_8054034(void) -{ - return IsNotWaitingForBGMStop(); -} - -void sub_8054044(void) -{ - FadeOutMapMusic(4); -} - -void sub_8054050(void) -{ - s16 x, y; - PlayerGetDestCoords((u16 *)&x, (u16 *)&y); - if (gUnknown_02029816 != TRUE - || MetatileBehavior_IsSurfableWaterOrUnderwater(MapGridGetMetatileBehaviorAt(x, y))) - { - s8 pan = (Random() % 88) + 212; - s8 volume = (Random() % 30) + 50; - PlayCry2(gUnknown_02029814, pan, volume, 1); - } -} - -void sub_80540D0(s16 *a1, u16 *a2) -{ - switch (*a1) - { - case 0: - if (!gUnknown_02029814) - *a1 = 4; - else - *a1 = 1; - break; - case 1: - *a2 = (Random() % 2400) + 1200; - *a1 = 3; - break; - case 2: - *a2 = (Random() % 1200) + 1200; - *a1 = 3; - break; - case 3: - (*a2)--; - if (*a2 == 0) - { - sub_8054050(); - *a1 = 2; - } - break; - case 4: - break; - } -} - -void sub_8054164(void) -{ - if ((gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 45) && !IsMirageIslandPresent()) - { - gUnknown_02029816 = TRUE; - gUnknown_02029814 = GetMirageIslandMon(); - } - else - { - gUnknown_02029814 = GetLocalWildMon(&gUnknown_02029816); - } -} - -u8 get_map_light_level_by_bank_and_number(s8 mapGroup, s8 mapNum) -{ - return get_mapheader_by_bank_and_number(mapGroup, mapNum)->mapType; -} - -u8 get_map_light_level_from_warp(struct WarpData *warp) -{ - return get_map_light_level_by_bank_and_number(warp->mapGroup, warp->mapNum); -} - -u8 sav1_map_get_light_level(void) -{ - return get_map_light_level_from_warp(&gSaveBlock1.location); -} - -u8 get_map_light_from_warp0(void) -{ - return get_map_light_level_from_warp(&gUnknown_020297F0); -} - -bool8 is_light_level_1_2_3_5_or_6(u8 a1) -{ - if (a1 == 3 || a1 == 1 || a1 == 5 || a1 == 2 || a1 == 6) - return TRUE; - else - return FALSE; -} - -bool8 is_light_level_1_2_3_or_6(u8 a1) -{ - if (a1 == 3 || a1 == 1 || a1 == 6 || a1 == 2) - return TRUE; - else - return FALSE; -} - -bool8 is_light_level_8_or_9(u8 a1) -{ - if (a1 == 8 || a1 == 9) - return TRUE; - else - return FALSE; -} - -u8 unref_sub_8054260(void) -{ - return get_mapheader_by_bank_and_number(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum)->regionMapSectionId; -} - -u8 sav1_map_get_name(void) -{ - return get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->regionMapSectionId; -} - -u8 sav1_map_get_battletype(void) -{ - return get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->battleType; -} - -void ResetSafariZoneFlag_(void) -{ - ResetSafariZoneFlag(); -} - -bool32 is_c1_link_related_active(void) -{ - if (gMain.callback1 == sub_8055354) - return TRUE; - else - return FALSE; -} - -void c1_overworld_normal(u16 newKeys, u16 heldKeys) -{ - struct FieldInput inputStruct; - - sub_8059204(); - FieldClearPlayerInput(&inputStruct); - FieldGetPlayerInput(&inputStruct, newKeys, heldKeys); - if (!ScriptContext2_IsEnabled()) - { - if (sub_8068024(&inputStruct) == 1) - { - ScriptContext2_Enable(); - HideMapNamePopup(); - } - else - { - player_step(inputStruct.dpadDirection, newKeys, heldKeys); - } - } -} - -void c1_overworld(void) -{ - if (gMain.callback2 == c2_overworld) - c1_overworld_normal(gMain.newKeys, gMain.heldKeys); -} - -void c2_overworld_basic(void) -{ - ScriptContext2_RunScript(); - RunTasks(); - AnimateSprites(); - CameraUpdate(); - UpdateCameraPanning(); - BuildOamBuffer(); - UpdatePaletteFade(); - sub_8072EDC(); -} - -void sub_8054398(void) -{ - c2_overworld_basic(); -} - -void c2_overworld(void) -{ - int fading = (gPaletteFade.active != 0); - if (fading) - SetVBlankCallback(NULL); - c2_overworld_basic(); - if (fading) - SetFieldVBlankCallback(); -} - -void set_callback1(MainCallback cb) -{ - gMain.callback1 = cb; -} - -void sub_80543DC(u16 (*a1)(u32)) -{ - gUnknown_03000584 = a1; -} - -void sub_80543E8(void) -{ - if (gFieldCallback) - gFieldCallback(); - else - mapldr_default(); - gFieldCallback = NULL; -} - -void CB2_NewGame(void) -{ - FieldClearVBlankHBlankCallbacks(); - StopMapMusic(); - ResetSafariZoneFlag_(); - NewGameInitData(); - player_avatar_init_params_reset(); - PlayTimeCounter_Start(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - gFieldCallback = ExecuteTruckSequence; - do_load_map_stuff_loop(&gMain.state); - SetFieldVBlankCallback(); - set_callback1(c1_overworld); - SetMainCallback2(c2_overworld); -} - -void CB2_WhiteOut(void) -{ - u8 val; - gMain.state++; - if (gMain.state >= 120) - { - FieldClearVBlankHBlankCallbacks(); - StopMapMusic(); - ResetSafariZoneFlag_(); - DoWhiteOut(); - player_avatar_init_params_reset(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - gFieldCallback = sub_8080B60; - val = 0; - do_load_map_stuff_loop(&val); - SetFieldVBlankCallback(); - set_callback1(c1_overworld); - SetMainCallback2(c2_overworld); - } -} - -void CB2_LoadMap(void) -{ - FieldClearVBlankHBlankCallbacks(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - set_callback1(NULL); - SetMainCallback2(sub_810CC80); - gMain.savedCallback = CB2_LoadMap2; -} - -void CB2_LoadMap2(void) -{ - do_load_map_stuff_loop(&gMain.state); - SetFieldVBlankCallback(); - set_callback1(c1_overworld); - SetMainCallback2(c2_overworld); -} - -void sub_8054534(void) -{ - if (!gMain.state) - { - FieldClearVBlankHBlankCallbacks(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - set_callback1(NULL); - } - if (sub_805493C(&gMain.state, 1)) - { - SetFieldVBlankCallback(); - set_callback1(c1_overworld); - SetMainCallback2(c2_overworld); - } -} - -void sub_8054588(void) -{ - FieldClearVBlankHBlankCallbacks(); - gFieldCallback = sub_8080AC4; - SetMainCallback2(c2_80567AC); -} - -void c2_80567AC(void) -{ - if (sub_805483C(&gMain.state)) - { - SetFieldVBlankCallback(); - set_callback1(sub_8055354); - sub_80543DC(sub_8055390); - SetMainCallback2(c2_overworld); - } -} - -void c2_exit_to_overworld_2_switch(void) -{ - if (is_c1_link_related_active() == TRUE) - { - SetMainCallback2(c2_exit_to_overworld_2_link); - } - else - { - FieldClearVBlankHBlankCallbacks(); - SetMainCallback2(c2_exit_to_overworld_2_local); - } -} - -void c2_exit_to_overworld_2_local(void) -{ - if (sub_8054A4C(&gMain.state)) - { - SetFieldVBlankCallback(); - SetMainCallback2(c2_overworld); - } -} - -void c2_exit_to_overworld_2_link(void) -{ - if (!sub_8055870() && sub_8054A9C(&gMain.state)) - SetMainCallback2(c2_overworld); -} - -void sub_805465C(void) -{ - FieldClearVBlankHBlankCallbacks(); - StopMapMusic(); - sub_8054F70(); - set_callback1(sub_8055354); - sub_80543DC(sub_8055390); - gFieldCallback = sub_8080A3C; - ScriptContext1_Init(); - ScriptContext2_Disable(); - c2_exit_to_overworld_2_switch(); -} - -void sub_805469C(void) -{ - FieldClearVBlankHBlankCallbacks(); - gFieldCallback = atk17_seteffectuser; - c2_exit_to_overworld_2_switch(); -} - -void sub_80546B8(void) -{ - FieldClearVBlankHBlankCallbacks(); - gFieldCallback = sub_80809B0; - c2_exit_to_overworld_2_switch(); -} - -void c2_exit_to_overworld_1_continue_scripts_restart_music(void) -{ - FieldClearVBlankHBlankCallbacks(); - gFieldCallback = sub_8080990; - c2_exit_to_overworld_2_switch(); -} - -void sub_80546F0(void) -{ - FieldClearVBlankHBlankCallbacks(); - gFieldCallback = sub_8080B60; - c2_exit_to_overworld_2_switch(); -} - -void sub_805470C(void) -{ - if (gMapHeader.flags == 1 && sub_80BBB24() == 1) - ShowMapNamePopup(); - sub_8080B60(); -} - -void CB2_ContinueSavedGame(void) -{ - FieldClearVBlankHBlankCallbacks(); - StopMapMusic(); - ResetSafariZoneFlag_(); - sub_805338C(); - sub_8053198(); - UnfreezeMapObjects(); - DoTimeBasedEvents(); - sub_805308C(); - sub_8055FC0(); - PlayTimeCounter_Start(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - if (GetSecretBase2Field_9() == 1) - { - ClearSecretBase2Field_9(); - sub_8053778(); - warp_in(); - SetMainCallback2(CB2_LoadMap); - } - else - { - gFieldCallback = sub_805470C; - set_callback1(c1_overworld); - c2_exit_to_overworld_2_switch(); - } -} - -void FieldClearVBlankHBlankCallbacks(void) -{ - u16 savedIme = REG_IME; - REG_IME = 0; - REG_IE &= ~INTR_FLAG_HBLANK; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - SetVBlankCallback(NULL); - SetHBlankCallback(NULL); -} - -void SetFieldVBlankCallback(void) -{ - SetVBlankCallback(VBlankCB_Field); -} - -void VBlankCB_Field(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - sub_8089668(); - sub_8057A58(); - TransferPlttBuffer(); - sub_8072E74(); -} - -void sub_8054814(void) -{ - u8 val = sav1_get_flash_used_on_map(); - if (val) - { - sub_80815E0(val); - sub_80895F8(gUnknown_08216694[0], gUnknown_08216694[1], gUnknown_08216694[2]); - } -} - -bool32 sub_805483C(u8 *a1) -{ - switch (*a1) - { - case 0: - FieldClearVBlankHBlankCallbacks(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - sub_8054F70(); - sub_8054BA8(); - (*a1)++; - break; - case 1: - sub_8053994(1); - (*a1)++; - break; - case 2: - sub_8054D4C(1); - (*a1)++; - break; - case 3: - sub_8054E98(); - sub_8054D90(); - sub_8054EC8(); - sub_8054E60(); - (*a1)++; - break; - case 4: - sub_8054814(); - sub_8054C54(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - (*a1)++; - break; - case 5: - move_tilemap_camera_to_upper_left_corner(); - (*a1)++; - break; - case 6: - sub_8056D28(gMapHeader.mapData); - (*a1)++; - break; - case 7: - sub_8056D38(gMapHeader.mapData); - (*a1)++; - break; - case 8: - apply_map_tileset1_tileset2_palette(gMapHeader.mapData); - (*a1)++; - break; - case 9: - DrawWholeMapView(); - (*a1)++; - break; - case 10: - cur_mapheader_run_tileset_funcs_after_some_cpuset(); - (*a1)++; - break; - case 12: - sub_80543E8(); - (*a1)++; - break; - case 11: - (*a1)++; - break; - case 13: - return 1; - } - return 0; -} - -bool32 sub_805493C(u8 *a1, u32 a2) -{ - switch (*a1) - { - case 0: - FieldClearVBlankHBlankCallbacks(); - sub_8053994(a2); - (*a1)++; - break; - case 1: - sub_8054BA8(); - (*a1)++; - break; - case 2: - sub_8054D4C(a2); - (*a1)++; - break; - case 3: - mli4_mapscripts_and_other(); - sub_8054E34(); - (*a1)++; - break; - case 4: - sub_8054814(); - sub_8054C54(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - (*a1)++; - break; - case 5: - move_tilemap_camera_to_upper_left_corner(); - (*a1)++; - break; - case 6: - sub_8056D28(gMapHeader.mapData); - (*a1)++; - break; - case 7: - sub_8056D38(gMapHeader.mapData); - (*a1)++; - break; - case 8: - apply_map_tileset1_tileset2_palette(gMapHeader.mapData); - (*a1)++; - break; - case 9: - DrawWholeMapView(); - (*a1)++; - break; - case 10: - cur_mapheader_run_tileset_funcs_after_some_cpuset(); - (*a1)++; - break; - case 11: - if (gMapHeader.flags == 1 && sub_80BBB24() == 1) - ShowMapNamePopup(); - (*a1)++; - break; - case 12: - sub_80543E8(); - (*a1)++; - break; - case 13: - return 1; - } - return 0; -} - -bool32 sub_8054A4C(u8 *a1) -{ - switch (*a1) - { - case 0: - sub_8054BA8(); - sub_8054D4C(0); - sub_8054E20(); - sub_8054E34(); - (*a1)++; - break; - case 1: - sub_8054C2C(); - (*a1)++; - break; - case 2: - sub_80543E8(); - (*a1)++; - break; - case 3: - return 1; - } - return 0; -} - -bool32 sub_8054A9C(u8 *a1) -{ - switch (*a1) - { - case 0: - FieldClearVBlankHBlankCallbacks(); - sub_8054BA8(); - (*a1)++; - break; - case 1: - sub_8054D4C(1); - (*a1)++; - break; - case 2: - sub_8054F48(); - sub_8054E20(); - sub_8054E7C(); - (*a1)++; - break; - case 3: - sub_8054814(); - sub_8054C54(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - (*a1)++; - break; - case 4: - move_tilemap_camera_to_upper_left_corner(); - (*a1)++; - break; - case 5: - sub_8056D28(gMapHeader.mapData); - (*a1)++; - break; - case 6: - sub_8056D38(gMapHeader.mapData); - (*a1)++; - break; - case 7: - apply_map_tileset1_tileset2_palette(gMapHeader.mapData); - (*a1)++; - break; - case 8: - DrawWholeMapView(); - (*a1)++; - break; - case 9: - cur_mapheader_run_tileset_funcs_after_some_cpuset(); - (*a1)++; - break; - case 12: - sub_80543E8(); - (*a1)++; - break; - case 10: - case 11: - (*a1)++; - break; - case 13: - SetFieldVBlankCallback(); - (*a1)++; - return 1; - } - return 0; -} - -void do_load_map_stuff_loop(u8 *a1) -{ - while (!sub_805493C(a1, 0)) - ; -} - -void sub_8054BA8(void) -{ - u8 *addr; - u32 size; - - REG_DISPCNT = 0; - - remove_some_task(); - - 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; - } - } - - ResetOamRange(0, 128); - LoadOam(); -} - -void sub_8054C2C(void) -{ - sub_8054814(); - sub_8054C54(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - mapdata_load_assets_to_gpu_and_full_redraw(); -} - -void sub_8054C54(void) -{ - REG_MOSAIC = 0; - REG_WININ = 7967; - REG_WINOUT = 257; - REG_WIN0H = 255; - REG_WIN0V = 255; - REG_WIN1H = -1; - REG_WIN1V = -1; - REG_BLDCNT = gUnknown_081E29E0[1] | gUnknown_081E29E0[2] | gUnknown_081E29E0[3] | 0x1040; - REG_BLDALPHA = 1805; - *gBGHOffsetRegs[0] = 0; - *gBGVOffsetRegs[0] = 0; - *gBGControlRegs[0] = 0; - *gBGHOffsetRegs[1] = 0; - *gBGVOffsetRegs[1] = 0; - *gBGControlRegs[1] = 7489; - *gBGHOffsetRegs[2] = 0; - *gBGVOffsetRegs[2] = 0; - *gBGControlRegs[2] = 7234; - *gBGHOffsetRegs[3] = 0; - *gBGVOffsetRegs[3] = 0; - *gBGControlRegs[3] = 7747; - REG_DISPCNT = gUnknown_081E29D8[1] | 0x7060 | gUnknown_081E29D8[2] | gUnknown_081E29D8[0] | gUnknown_081E29D8[3]; -} - -void sub_8054D4C(u32 a1) -{ - ResetTasks(); - ResetSpriteData(); - ResetPaletteFade(); - dp12_8087EA4(); - ResetCameraUpdateInfo(); - InstallCameraPanAheadCallback(); - sub_805C7C4(0); - FieldEffectActiveListClear(); - InitFieldMessageBox(); - sub_807C828(); - sub_8080750(); - if (!a1) - SetUpFieldTasks(); - mapheader_run_script_with_tag_x5(); -} - -void sub_8054D90(void) -{ - gUnknown_0300489C = 0; - gUnknown_03004898 = 0; - sub_805AA98(); - sub_805B55C(0, 0); - mapheader_run_first_tag4_script_list_match(); -} - -void mli4_mapscripts_and_other(void) -{ - s16 x, y; - struct UnkPlayerStruct *player; - gUnknown_0300489C = 0; - gUnknown_03004898 = 0; - sub_805AA98(); - sav1_camera_get_focus_coords(&x, &y); - player = sub_8053AA8(); - InitPlayerAvatar(x, y, player->player_field_1, gSaveBlock2.playerGender); - SetPlayerAvatarTransitionFlags(player->player_field_0); - player_avatar_init_params_reset(); - sub_805B55C(0, 0); - ResetBerryTreeSparkleFlags(); - mapheader_run_first_tag4_script_list_match(); -} - -void sub_8054E20(void) -{ - sub_805B710(0, 0); - RotatingGate_InitPuzzleAndGraphics(); -} - -void sub_8054E34(void) -{ - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_15 = 1; - InitCameraUpdateCallback(gPlayerAvatar.spriteId); -} - -void sub_8054E60(void) -{ - InitCameraUpdateCallback(sub_8055AE8(gUnknown_03004860)); -} - -void sub_8054E7C(void) -{ - InitCameraUpdateCallback(sub_8055AE8(gUnknown_03004860)); -} - -void sub_8054E98(void) -{ - u16 x, y; - sav1_camera_get_focus_coords(&x, &y); - sub_8056C50(x + gUnknown_03004860, y); -} - -void sub_8054EC8(void) -{ - u16 i; - u16 x, y; - - sav1_camera_get_focus_coords(&x, &y); - x -= gUnknown_03004860; - - for (i = 0; i < gFieldLinkPlayerCount; i++) - { - SpawnLinkPlayerMapObject(i, i + x, y, gLinkPlayers[i].gender); - CreateLinkPlayerSprite(i); - } - - sub_8055340(word_3002910); -} - -void sub_8054F48(void) -{ - u16 i; - for (i = 0; i < gFieldLinkPlayerCount; i++) - CreateLinkPlayerSprite(i); -} - -void sub_8054F70(void) -{ - int i; - for (i = 0; i < 4; i++) - gUnknown_03000580[i] = 0x80; -} - -bool32 sub_8054F88(u16 a1) -{ - int i; - int count = gFieldLinkPlayerCount; - - for (i = 0; i < count; i++) - if (gUnknown_03000580[i] != a1) - return FALSE; - return TRUE; -} - -bool32 sub_8054FC0(u16 a1) -{ - int i; - int count = gFieldLinkPlayerCount; - - for (i = 0; i < count; i++) - if (gUnknown_03000580[i] == a1) - return TRUE; - return FALSE; -} - -void sub_8054FF8(u32 a1, u16 a2, struct UnkStruct_8054FF8 *a3, u16 *a4) -{ - u8 *script; - - if (gUnknown_03000580[a1] == 0x80) - { - script = sub_8055648(a3); - if (script) - { - *a4 = sub_8055758(script); - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_80553E4); - sub_8055808(script); - } - return; - } - if (sub_8054FC0(0x83) == 1) - { - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_80553E4); - sub_805585C(); - } - return; - } - switch (a2) - { - case 24: - if (sub_8055630(a3)) - { - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_80553E4); - sub_80557F4(); - } - } - break; - case 18: - if (sub_8055660(a3) == 1) - { - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_80553E4); - sub_8055824(); - } - } - break; - case 25: - script = sub_805568C(a3); - if (script) - { - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_80553E4); - sub_8055840(script); - } - } - break; - case 27: - if (sub_8055618(a3)) - { - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_8055408); - sub_80557E8(); - } - } - break; - case 28: - if (sub_8055618(a3)) - { - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_8055438); - sub_80557E8(); - } - } - break; - } - } - - switch (a2) - { - case 23: - gUnknown_03000580[a1] = 0x83; - break; - case 22: - gUnknown_03000580[a1] = 0x82; - break; - case 26: - gUnknown_03000580[a1] = 0x80; - if (a3->b) - sub_80543DC(sub_8055390); - break; - case 29: - if (gUnknown_03000580[a1] == 0x82) - gUnknown_03000580[a1] = 0x81; - break; - } -} - -void sub_8055218(u16 *a1, int a2) -{ - struct UnkStruct_8054FF8 st; - int i; - for (i = 0; i < 4; i++) - { - u16 v5 = a1[i]; - u16 v8 = 0; - sub_80555B0(i, a2, &st); - sub_8054FF8(i, v5, &st, &v8); - if (gUnknown_03000580[i] == 0x80) - v8 = sub_805530C(v5); - sub_8055BFC(i, v8); - } -} - -void sub_8055280(u16 a1) -{ - if (a1 >= 17 && a1 < 30) - word_3004858 = a1; - else - word_3004858 = 17; -} - -u16 sub_80552B0(u32 a1) -{ - if (gMain.heldKeys & 0x40) - { - return 19; - } - else if (gMain.heldKeys & 0x80) - { - return 18; - } - else if (gMain.heldKeys & 0x20) - { - return 20; - } - else if (gMain.heldKeys & 0x10) - { - return 21; - } - else if (gMain.newKeys & 8) - { - return 24; - } - else if (gMain.newKeys & 1) - { - return 25; - } - else - { - return 17; - } -} - -u16 sub_805530C(u16 a1) -{ - switch (a1) - { - case 21: - return 4; - case 20: - return 3; - case 19: - return 1; - case 18: - return 2; - default: - return 0; - } -} - -void sub_8055340(u16 *a1) -{ - int i; - for (i = 0; i < 4; i++) - a1[i] = 17; -} - -void sub_8055354(void) -{ - u8 val = gUnknown_03004860; - sub_8055218(word_3002910, val); - sub_8055280(gUnknown_03000584(val)); - sub_8055340(word_3002910); -} - -u16 sub_8055390(u32 a1) -{ - if (ScriptContext2_IsEnabled() == 1) - return 17; - if (gLink.recvQueue.count > 4) - return 27; - if (gLink.sendQueue.count <= 4) - return sub_80552B0(a1); - return 28; -} - -u16 sub_80553E0(u32 a1) -{ - return 17; -} - -u16 sub_80553E4(u32 a1) -{ - u16 retVal; - if (ScriptContext2_IsEnabled() == 1) - { - retVal = 17; - } - else - { - retVal = 26; - sub_80543DC(sub_80553E0); - } - return retVal; -} - -u16 sub_8055408(u32 a1) -{ - u16 retVal; - if (gLink.recvQueue.count > 2) - { - retVal = 17; - } - else - { - retVal = 26; - ScriptContext2_Disable(); - sub_80543DC(sub_80553E0); - } - return retVal; -} - -u16 sub_8055438(u32 a1) -{ - u16 retVal; - if (gLink.sendQueue.count > 2) - { - retVal = 17; - } - else - { - retVal = 26; - ScriptContext2_Disable(); - sub_80543DC(sub_80553E0); - } - return retVal; -} - -u16 sub_8055468(u32 a1) -{ - return 17; -} - -u16 sub_805546C(u32 linkPlayerId) -{ - if (gUnknown_03000580[linkPlayerId] == 0x82 && (gMain.newKeys & B_BUTTON)) - { - sub_80543DC(sub_8055468); - return 29; - } - else - { - return 17; - } -} - -u16 sub_80554A4(u32 a1) -{ - sub_80543DC(sub_805546C); - return 22; -} - -u16 sub_80554B8(u32 a1) -{ - return 17; -} - -u16 sub_80554BC(u32 a1) -{ - if (sub_8054F88(0x83) == TRUE) - { - ScriptContext1_SetupScript(gUnknown_081A4508); - sub_80543DC(sub_80554B8); - } - return 17; -} - -u16 sub_80554E4(u32 a1) -{ - sub_80543DC(sub_80554BC); - return 23; -} - -u32 sub_80554F8(void) -{ - if (sub_8054FC0(0x83) == TRUE) - return 2; - if (gUnknown_03000584 == sub_805546C && gUnknown_03000580[gUnknown_03004860] != 0x82) - return 0; - if (gUnknown_03000584 == sub_8055468 && gUnknown_03000580[gUnknown_03004860] == 0x81) - return 2; - return sub_8054F88(0x82); -} - -bool32 unref_sub_8055568(void) -{ - return sub_8054FC0(0x83); -} - -u16 sub_8055574(void) -{ - sub_80543DC(sub_80554A4); - return 0; -} - -u16 sub_8055588(void) -{ - sub_80543DC(sub_80553E4); - return 0; -} - -u16 sub_805559C(void) -{ - sub_80543DC(sub_80554E4); - return 0; -} - -void sub_80555B0(int linkPlayerId, int a2, struct UnkStruct_8054FF8 *a3) -{ - s16 x, y; - - a3->a = linkPlayerId; - a3->b = (linkPlayerId == a2) ? 1 : 0; - a3->c = gLinkPlayerMapObjects[linkPlayerId].mode; - a3->d = sub_8055B30(linkPlayerId); - sub_8055B08(linkPlayerId, &x, &y); - a3->sub.x = x; - a3->sub.y = y; - a3->sub.height = sub_8055B50(linkPlayerId); - a3->field_C = MapGridGetMetatileBehaviorAt(x, y); -} - -bool32 sub_8055618(struct UnkStruct_8054FF8 *a1) -{ - u8 v1 = a1->c; - if (v1 == 2 || v1 == 0) - return TRUE; - else - return FALSE; -} - -bool32 sub_8055630(struct UnkStruct_8054FF8 *a1) -{ - u8 v1 = a1->c; - if (v1 == 2 || v1 == 0) - return TRUE; - else - return FALSE; -} - -u8 *sub_8055648(struct UnkStruct_8054FF8 *a1) -{ - if (a1->c != 2) - return 0; - return sub_8068E24(&a1->sub); -} - -bool32 sub_8055660(struct UnkStruct_8054FF8 *a1) -{ - if (a1->c != 2 && a1->c != 0) - return FALSE; - if (!MetatileBehavior_IsSouthArrowWarp(a1->field_C)) - return FALSE; - if (a1->d != 1) - return FALSE; - return TRUE; -} - -u8 *sub_805568C(struct UnkStruct_8054FF8 *a1) -{ - struct MapPosition unkStruct; - u8 linkPlayerId; - - if (a1->c && a1->c != 2) - return 0; - - unkStruct = a1->sub; - unkStruct.x += gUnknown_0821664C[a1->d].x; - unkStruct.y += gUnknown_0821664C[a1->d].y; - unkStruct.height = 0; - linkPlayerId = GetLinkPlayerIdAt(unkStruct.x, unkStruct.y); - - if (linkPlayerId != 4) - { - if (!a1->b) - return TradeRoom_TooBusyToNotice; - if (gUnknown_03000580[linkPlayerId] != 0x80) - return TradeRoom_TooBusyToNotice; - if (!sub_8083BF4(linkPlayerId)) - return TradeRoom_ReadTrainerCard1; - else - return TradeRoom_ReadTrainerCard2; - } - - return sub_80682A8(&unkStruct, a1->field_C, a1->d); -} - -u16 sub_8055758(u8 *script) -{ - if (script == DoubleBattleColosseum_EventScript_1A4383) - return 10; - if (script == DoubleBattleColosseum_EventScript_1A439E) - return 9; - if (script == DoubleBattleColosseum_EventScript_1A43B9) - return 10; - if (script == DoubleBattleColosseum_EventScript_1A43D4) - return 9; - if (script == RecordCorner_EventScript_1A4418) - return 10; - if (script == RecordCorner_EventScript_1A442D) - return 9; - if (script == RecordCorner_EventScript_1A4442) - return 10; - if (script == RecordCorner_EventScript_1A4457) - return 9; - if (script == SingleBattleColosseum_EventScript_1A436F) - return 10; - if (script == SingleBattleColosseum_EventScript_1A4379) - return 9; - if (script == TradeCenter_EventScript_1A43F0) - return 10; - if (script == TradeCenter_EventScript_1A43FA) - return 9; - return 0; -} - -void sub_80557E8(void) -{ - ScriptContext2_Enable(); -} - -void sub_80557F4(void) -{ - PlaySE(SE_WIN_OPEN); - sub_8071310(); - ScriptContext2_Enable(); -} - -void sub_8055808(u8 *script) -{ - PlaySE(SE_SELECT); - ScriptContext1_SetupScript(script); - ScriptContext2_Enable(); -} - -void sub_8055824(void) -{ - PlaySE(SE_WIN_OPEN); - ScriptContext1_SetupScript(TradeRoom_PromptToCancelLink); - ScriptContext2_Enable(); -} - -void sub_8055840(u8 *script) -{ - PlaySE(SE_SELECT); - ScriptContext1_SetupScript(script); - ScriptContext2_Enable(); -} - -void sub_805585C(void) -{ - ScriptContext1_SetupScript(TradeRoom_TerminateLink); - ScriptContext2_Enable(); -} - -bool32 sub_8055870(void) -{ - if (!is_c1_link_related_active()) - return 0; - if (gLink.recvQueue.count >= 3) - gUnknown_03000588 = 1; - else - gUnknown_03000588 = 0; - return gUnknown_03000588; -} - -bool32 sub_80558AC(void) -{ - u8 temp; - - if (is_c1_link_related_active() != TRUE) - return FALSE; - - if (sub_8007B24() != TRUE) - return FALSE; - - if (gUnknown_03000584 == sub_8055408) - return TRUE; - - if (gUnknown_03000584 != sub_80553E4) - return FALSE; - - temp = gUnknown_03000588; - gUnknown_03000588 = 0; - - if (temp == TRUE) - return TRUE; - - if (gPaletteFade.active && gPaletteFade.softwareFadeFinishing) - return TRUE; - - return FALSE; -} - -bool32 sub_8055910(void) -{ - if (is_c1_link_related_active() != TRUE) - return FALSE; - - if (sub_8007B24() != TRUE) - return FALSE; - - if (gUnknown_03000584 == sub_8055438) - return TRUE; - - return FALSE; -} - -bool32 sub_8055940(void) -{ - if (!sub_8007B24()) - return FALSE; - return TRUE; -} - -void ZeroLinkPlayerMapObject(struct LinkPlayerMapObject *linkPlayerMapObj) -{ - memset(linkPlayerMapObj, 0, sizeof(struct LinkPlayerMapObject)); -} - -void strange_npc_table_clear(void) -{ - memset(gLinkPlayerMapObjects, 0, sizeof(gLinkPlayerMapObjects)); -} - -void ZeroMapObject(struct MapObject *mapObj) -{ - memset(mapObj, 0, sizeof(struct MapObject)); -} - -void SpawnLinkPlayerMapObject(u8 linkPlayerId, s16 x, s16 y, u8 a4) -{ - u8 mapObjId = sub_805AB54(); - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - - ZeroLinkPlayerMapObject(linkPlayerMapObj); - ZeroMapObject(mapObj); - - linkPlayerMapObj->active = 1; - linkPlayerMapObj->linkPlayerId = linkPlayerId; - linkPlayerMapObj->mapObjId = mapObjId; - linkPlayerMapObj->mode = 0; - - mapObj->active = 1; - mapObj->mapobj_bit_1 = a4; - mapObj->mapobj_unk_19 = 2; - mapObj->spriteId = 64; - - InitLinkPlayerMapObjectPos(mapObj, x, y); -} - -void InitLinkPlayerMapObjectPos(struct MapObject *mapObj, s16 x, s16 y) -{ - mapObj->coords2.x = x; - mapObj->coords2.y = y; - mapObj->coords3.x = x; - mapObj->coords3.y = y; - sub_80603CC(x, y, &mapObj->coords1.x, &mapObj->coords1.y); - mapObj->coords1.x += 8; - FieldObjectUpdateZCoord(mapObj); -} - -void unref_sub_8055A6C(u8 linkPlayerId, u8 a2) -{ - if (gLinkPlayerMapObjects[linkPlayerId].active) - { - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - mapObj->mapobj_unk_19 = a2; - } -} - -void unref_sub_8055A9C(u8 linkPlayerId) -{ - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; - u8 mapObjId = linkPlayerMapObj->mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - if (mapObj->spriteId != 64 ) - DestroySprite(&gSprites[mapObj->spriteId]); - linkPlayerMapObj->active = 0; - mapObj->active = 0; -} - -u8 sub_8055AE8(u8 linkPlayerId) -{ - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - return mapObj->spriteId; -} - -void sub_8055B08(u8 linkPlayerId, u16 *x, u16 *y) -{ - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - *x = mapObj->coords2.x; - *y = mapObj->coords2.y; -} - -u8 sub_8055B30(u8 linkPlayerId) -{ - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - return mapObj->mapobj_unk_19; -} - -u8 sub_8055B50(u8 linkPlayerId) -{ - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - return mapObj->mapobj_unk_0B_0; -} - -s32 unref_sub_8055B74(u8 linkPlayerId) -{ - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - return 16 - (s8)mapObj->mapobj_unk_21; -} - -u8 GetLinkPlayerIdAt(s16 x, s16 y) -{ - u8 i; - for (i = 0; i < 4; i++) - { - if (gLinkPlayerMapObjects[i].active - && (gLinkPlayerMapObjects[i].mode == 0 || gLinkPlayerMapObjects[i].mode == 2)) - { - struct MapObject *mapObj = &gMapObjects[gLinkPlayerMapObjects[i].mapObjId]; - if (mapObj->coords2.x == x && mapObj->coords2.y == y) - return i; - } - } - return 4; -} - -void sub_8055BFC(u8 linkPlayerId, u8 a2) -{ - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; - u8 mapObjId = linkPlayerMapObj->mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - - if (linkPlayerMapObj->active) - { - if (a2 > 10) - mapObj->mapobj_bit_2 = 1; - else - gUnknown_082166D8[gUnknown_082166A0[linkPlayerMapObj->mode](linkPlayerMapObj, mapObj, a2)](linkPlayerMapObj, mapObj); - } -} - -u8 sub_8055C68(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) -{ - return gUnknown_082166AC[a3](linkPlayerMapObj, mapObj, a3); -} - -u8 sub_8055C88(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) -{ - return 1; -} - -u8 sub_8055C8C(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) -{ - return gUnknown_082166AC[a3](linkPlayerMapObj, mapObj, a3); -} - -u8 sub_8055CAC(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) -{ - return 0; -} - -u8 sub_8055CB0(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) -{ - s16 x, y; - - mapObj->mapobj_unk_19 = npc_something3(a3, mapObj->mapobj_unk_19); - FieldObjectMoveDestCoords(mapObj, mapObj->mapobj_unk_19, &x, &y); - - if (LinkPlayerDetectCollision(linkPlayerMapObj->mapObjId, mapObj->mapobj_unk_19, x, y)) - { - return 0; - } - else - { - mapObj->mapobj_unk_21 = 16; - npc_coords_shift(mapObj, x, y); - FieldObjectUpdateZCoord(mapObj); - return 1; - } -} - -u8 sub_8055D18(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) -{ - mapObj->mapobj_unk_19 = npc_something3(a3, mapObj->mapobj_unk_19); - return 0; -} - -void sub_8055D30(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj) -{ - linkPlayerMapObj->mode = 0; -} - -void sub_8055D38(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj) -{ - mapObj->mapobj_unk_21--; - linkPlayerMapObj->mode = 1; - MoveCoords(mapObj->mapobj_unk_19, &mapObj->coords1.x, &mapObj->coords1.y); - if (!mapObj->mapobj_unk_21) - { - npc_coords_shift_still(mapObj); - linkPlayerMapObj->mode = 2; - } -} - -u8 npc_something3(u8 a1, u8 a2) -{ - switch (a1 - 1) - { - case 0: - case 6: - return 2; - case 1: - case 7: - return 1; - case 2: - case 8: - return 3; - case 3: - case 9: - return 4; - } - return a2; -} - -u8 LinkPlayerDetectCollision(u8 selfMapObjId, u8 a2, s16 x, s16 y) -{ - u8 i; - for (i = 0; i < 16; i++) - { - if (i != selfMapObjId) - { - if ((gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) - || (gMapObjects[i].coords3.x == x && gMapObjects[i].coords3.y == y)) - { - return 1; - } - } - } - return MapGridIsImpassableAt(x, y); -} - -void CreateLinkPlayerSprite(u8 linkPlayerId) -{ - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; - u8 mapObjId = linkPlayerMapObj->mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - struct Sprite *sprite; - - if (linkPlayerMapObj->active) - { - u8 val = GetRivalAvatarGraphicsIdByStateIdAndGender(0, mapObj->mapobj_bit_1); - mapObj->spriteId = AddPseudoFieldObject(val, SpriteCB_LinkPlayer, 0, 0, 0); - sprite = &gSprites[mapObj->spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->data0 = linkPlayerId; - mapObj->mapobj_bit_2 = 0; - } -} - -void SpriteCB_LinkPlayer(struct Sprite *sprite) -{ - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[sprite->data0]; - struct MapObject *mapObj = &gMapObjects[linkPlayerMapObj->mapObjId]; - sprite->pos1.x = mapObj->coords1.x; - sprite->pos1.y = mapObj->coords1.y; - SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1); - sprite->oam.priority = ZCoordToPriority(mapObj->elevation); - if (!linkPlayerMapObj->mode) - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObj->mapobj_unk_19)); - else - StartSpriteAnimIfDifferent(sprite, get_go_image_anim_num(mapObj->mapobj_unk_19)); - sub_806487C(sprite, 0); - if (mapObj->mapobj_bit_2) - { - sprite->invisible = ((sprite->data7 & 4) >> 2); - sprite->data7++; - } -} diff --git a/src/rom6.c b/src/rom6.c deleted file mode 100644 index ff032b6c2..000000000 --- a/src/rom6.c +++ /dev/null @@ -1,202 +0,0 @@ -#include "global.h" -#include "rom6.h" -#include "braille_puzzles.h" -#include "field_effect.h" -#include "field_map_obj.h" -#include "field_player_avatar.h" -#include "item_use.h" -#include "pokemon_menu.h" -#include "rom4.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" - -extern u16 gScriptLastTalked; -extern void (*gFieldCallback)(void); -extern u8 gLastFieldPokeMenuOpened; -extern void (*gUnknown_03005CE4)(void); -extern u8 UseRockSmashScript[]; - -EWRAM_DATA struct MapPosition gUnknown_0203923C = {0}; - -static void task08_080C9820(u8); -static void sub_810B3DC(u8); -static void sub_810B428(u8); -static void sub_810B4CC(u8); -static void sub_810B53C(void); -static void sub_810B58C(void); -static void sub_810B5D8(void); -static void sub_810B634(void); - -bool8 npc_before_player_of_type(u8 a) -{ - u8 mapObjId; - - GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); - gUnknown_0203923C.height = PlayerGetZCoord(); - mapObjId = GetFieldObjectIdByXYZ(gUnknown_0203923C.x, gUnknown_0203923C.y, gUnknown_0203923C.height); - if (gMapObjects[mapObjId].graphicsId != a) - { - return FALSE; - } - else - { - gScriptLastTalked = gMapObjects[mapObjId].localId; - return TRUE; - } -} - -u8 oei_task_add(void) -{ - GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); - return CreateTask(task08_080C9820, 8); -} - -static void task08_080C9820(u8 taskId) -{ - u8 mapObjId; - - ScriptContext2_Enable(); - gPlayerAvatar.unk6 = 1; - mapObjId = gPlayerAvatar.mapObjectId; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(&gMapObjects[mapObjId]) - || FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId])) - { - if (gMapHeader.mapType == 5) - { - FieldEffectStart(0x3B); - gTasks[taskId].func = sub_810B428; - } - else - { - sub_8059BF4(); - FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 0x39); - gTasks[taskId].func = sub_810B3DC; - } - } -} - -static void sub_810B3DC(u8 taskId) -{ - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[gPlayerAvatar.mapObjectId]) == TRUE) - { - FieldEffectStart(0x3B); - gTasks[taskId].func = sub_810B428; - } -} - -static void sub_810B428(u8 taskId) -{ - if (!FieldEffectActiveListContains(6)) - { - gUnknown_0202FF84[1] = player_get_direction_lower_nybble(); - if (gUnknown_0202FF84[1] == 1) - gUnknown_0202FF84[2] = 0; - if (gUnknown_0202FF84[1] == 2) - gUnknown_0202FF84[2] = 1; - if (gUnknown_0202FF84[1] == 3) - gUnknown_0202FF84[2] = 2; - if (gUnknown_0202FF84[1] == 4) - gUnknown_0202FF84[2] = 3; - sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByCurrentState()); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gUnknown_0202FF84[2]); - FieldEffectActiveListRemove(6); - gTasks[taskId].func = sub_810B4CC; - } -} - -static void sub_810B4CC(u8 taskId) -{ - void (*func)(void) = (void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]); - - func(); - gPlayerAvatar.unk6 = 0; - DestroyTask(taskId); -} - -bool8 SetUpFieldMove_RockSmash(void) -{ - if (npc_before_player_of_type(0x56) == TRUE) - { - gFieldCallback = sub_808AB90; - gUnknown_03005CE4 = sub_810B53C; - return TRUE; - } - else - { - return FALSE; - } -} - -static void sub_810B53C(void) -{ - gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; - ScriptContext1_SetupScript(UseRockSmashScript); -} - -int FldEff_RockSmash(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_810B58C >> 16; - gTasks[taskId].data[9] = (u32)sub_810B58C; - IncrementGameStat(0x13); - return 0; -} - -static void sub_810B58C(void) -{ - PlaySE(SE_W088); - FieldEffectActiveListRemove(0x25); - EnableBothScriptContexts(); -} - -int SetUpFieldMove_Dig(void) -{ - if (sub_80CA1C8() == TRUE) - { - gFieldCallback = sub_808AB90; - gUnknown_03005CE4 = sub_810B5D8; - return TRUE; - } - else - { - return FALSE; - } -} - -static void sub_810B5D8(void) -{ - sub_8053014(); - FieldEffectStart(0x26); - gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; -} - -int FldEff_UseDig(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_810B634 >> 16; - gTasks[taskId].data[9] = (u32)sub_810B634; - if (!ShouldDoBrailleDigEffect()) - SetPlayerAvatarTransitionFlags(1); - return 0; -} - -static void sub_810B634(void) -{ - u8 taskId; - - FieldEffectActiveListRemove(0x26); - if (ShouldDoBrailleDigEffect()) - { - DoBrailleDigEffect(); - } - else - { - taskId = CreateTask(task08_080A1C44, 8); - gTasks[taskId].data[0] = 0; - } -} diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c deleted file mode 100644 index f51779e65..000000000 --- a/src/rom_800D42C.c +++ /dev/null @@ -1,118 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "link.h" -#include "text.h" - -extern u16 gBattleTypeFlags; -extern u8 gBattleOutcome; - -extern struct Window gUnknown_03004210; - -extern u8 BattleText_Win[]; -extern u8 BattleText_Loss[]; -extern u8 BattleText_Tie[]; - -#if ENGLISH -#define LEFT_MESSAGE_X 6 -#define RIGHT_MESSAGE_X 21 -#define TILE_OFFSET_LOSS 168 -#elif GERMAN -#define LEFT_MESSAGE_X 5 -#define RIGHT_MESSAGE_X 20 -#define TILE_OFFSET_LOSS 172 -#endif -#define TILE_OFFSET_WIN 160 -#define CENTER_MESSAGE_X 13 -#define MESSAGE_Y 2 - -#define PRINT_MESSAGE(text, tileDataStartOffset, x) \ -{ \ - InitWindow(&gUnknown_03004210, text, tileDataStartOffset, x, MESSAGE_Y); \ - sub_8002F44(&gUnknown_03004210); \ -} - -#define PRINT_MESSAGE_LEFT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, LEFT_MESSAGE_X) -#define PRINT_MESSAGE_RIGHT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, RIGHT_MESSAGE_X) - -void PrintLinkBattleWinLossTie(void) -{ - - if (gBattleOutcome == 3) - { - PRINT_MESSAGE(BattleText_Tie, TILE_OFFSET_WIN, CENTER_MESSAGE_X); - return; - } - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - // Double battle? - - if (gBattleOutcome == 1) - { - - // lp_field_18 = player position? - switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18) - { - case 0: - case 2: - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - return; - - case 1: - case 3: - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN) - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS) - return; - } - } - else - { - - switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18) - { - case 1: - case 3: - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - return; - - case 0: - case 2: - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); - return; - } - } - - return; - } - - - if (gBattleOutcome == 1) - { - if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0) - { - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); - } - else - { - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - } - } - else - { - if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0) - { - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - } - else - { - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); - } - } -} diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c deleted file mode 100644 index 249146b37..000000000 --- a/src/rom_8077ABC.c +++ /dev/null @@ -1,2055 +0,0 @@ -#include "global.h" -#include "rom_8077ABC.h" -#include "battle.h" -#include "battle_anim.h" -#include "blend_palette.h" -#include "data2.h" -#include "decompress.h" -#include "palette.h" -#include "pokemon_icon.h" -#include "species.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" -#include "util.h" - -#define GET_UNOWN_LETTER(personality) ((\ - (((personality & 0x03000000) >> 24) << 6) \ - | (((personality & 0x00030000) >> 16) << 4) \ - | (((personality & 0x00000300) >> 8) << 2) \ - | (((personality & 0x00000003) >> 0) << 0) \ -) % 28) - -#define IS_DOUBLE_BATTLE() ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) ? TRUE : FALSE) - -#define NUM_BATTLE_SLOTS 4 - -#define gBattleMonPartyPositions gBattlePartyID -#define gCastformElevations gUnknownCastformData_0837F5A8 -#define gCastformBackSpriteYCoords gUnknown_0837F5AC -#define gTransformPersonalities gPID_perBank -#define gBattleMonSprites gObjectBankIDs - - -struct Struct_unk_2019348 { - u16 field_0; - u16 field_2; - u8 field_4; - u32 field_8; - u32 field_c; - u32 field_10; -}; - -struct TransformStatus { - u16 unknown; - u16 species; -}; - -struct Struct_gUnknown_0837F578 { - u8 field_0; - u8 field_1; -}; - -struct OamMatrix { - s16 a; - s16 b; - s16 c; - s16 d; -}; - -struct Struct_2017810 { - u8 filler_0[6]; - u8 field_6; - u8 filler_7[5]; -}; - -struct Color { - u16 r:5; - u16 g:5; - u16 b:5; -}; - -struct Struct_sub_8078914 { - u8 *field_0; - u8 *field_4; - u8 field_8; -}; - -struct BGCnt { - u16 priority:2; - u16 charBase:2; - u16 unused:2; - u16 mosaic:1; - u16 colorMode:1; - u16 screenBase:5; - u16 overflow:1; - u16 size:2; -}; - -#define BG1CNT (*(volatile struct BGCnt*)REG_ADDR_BG1CNT) -#define BG2CNT (*(volatile struct BGCnt*)REG_ADDR_BG2CNT) -#define BG3CNT (*(volatile struct BGCnt*)REG_ADDR_BG3CNT) - -extern struct OamData gOamData_837DF9C[]; -extern const union AnimCmd *const gDummySpriteAnimTable[]; -extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[]; - -extern struct Struct_unk_2019348 unk_2019348; -extern struct TransformStatus gTransformStatuses[]; -extern u16 gBattleMonPartyPositions[]; -extern u16 gBattleTypeFlags; -extern u32 gTransformPersonalities[NUM_BATTLE_SLOTS]; -extern u8 gBattleMonForms[NUM_BATTLE_SLOTS]; -extern u16 gUnknown_0202F7CA[]; -extern u8 gBattleMonSprites[NUM_BATTLE_SLOTS]; -extern u8 gBattleAnimPlayerMonIndex; -extern u8 gBattleAnimEnemyMonIndex; -extern s16 gBattleAnimArgs[8]; -extern u8 gBanksBySide[NUM_BATTLE_SLOTS]; -extern u8 gNoOfAllBanks; // gNumBattleMons? -extern struct OamMatrix gOamMatrices[]; -extern struct Struct_2017810 unk_2017810[]; -extern u8 gHappinessMoveAnim; - -EWRAM_DATA union AffineAnimCmd *gUnknown_0202F7D4 = NULL; -EWRAM_DATA u32 filler_0202F7D8[3] = {0}; - -const struct Struct_gUnknown_0837F578 gUnknown_0837F578[][4] = { - { - { 72, 80 }, - { 176, 40 }, - { 48, 40 }, - { 112, 80 }, - }, - { - { 32, 80 }, - { 200, 40 }, - { 90, 88 }, - { 152, 32 }, - }, -}; - -// One entry for each of the four Castform forms. -// Coords are probably front pic coords or back pic coords, but this data does not seem to be -// used during battle, party summary, or pokedex screens. -const struct MonCoords gCastformFrontSpriteCoords[] = { - { 0x44, 17 }, // NORMAL - { 0x66, 9 }, // SUN - { 0x46, 9 }, // RAIN - { 0x86, 8 }, // HAIL -}; - -const u8 gCastformElevations[] = { - 13, // NORMAL - 14, // SUN - 13, // RAIN - 13, // HAIL -}; - -// Y position of the backsprite for each of the four Castform forms. -const u8 gCastformBackSpriteYCoords[] = { - 0, // NORMAL - 0, // SUN - 0, // RAIN - 0, // HAIL -}; - -const struct SpriteTemplate gSpriteTemplate_837F5B0[] = { - { - .tileTag = 55125, - .paletteTag = 55125, - .oam = gOamData_837DF9C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, { - .tileTag = 55126, - .paletteTag = 55126, - .oam = gOamData_837DF9C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - } -}; - -const struct SpriteSheet gUnknown_0837F5E0[] = { - { gMiscBlank_Gfx, 0x800, 55125, }, - { gMiscBlank_Gfx, 0x800, 55126, }, -}; - - -u8 sub_8077ABC(u8 slot, u8 a2) { - u8 var; - u16 species; - struct TransformStatus *transform; - - if (IsContest()) { - if (a2 == 3 && slot == 3) { - a2 = 1; - } - } - switch (a2) { - case 0: - case 2: - var = gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_0; - break; - case 1: - var = gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_1; - break; - case 3: - case 4: - default: - if (IsContest()) { - if (unk_2019348.field_4 & 1) { - species = unk_2019348.field_2; - } else { - species = unk_2019348.field_0; - } - } else { - if (GetBankSide(slot)) { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - } else { - species = transform->species; - } - } else { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - } else { - species = transform->species; - } - } - } - if (a2 == 3) { - var = sub_8077E44(slot, species, 1); - } else { - var = sub_8077E44(slot, species, 0); - } - break; - } - return var; -} - -u8 sub_8077BFC(u8 slot, u16 species) { - u16 letter; - u32 personality; - struct TransformStatus *transform; - u8 ret; - u16 var; - - if (!GetBankSide(slot) || IsContest()) { - if (species == SPECIES_UNOWN) { - if (IsContest()) { - if (unk_2019348.field_4 & 1) { - personality = unk_2019348.field_10; - } else { - personality = unk_2019348.field_8; - } - } else { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - personality = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); - } else { - personality = gTransformPersonalities[slot]; - } - } - letter = GET_UNOWN_LETTER(personality); - if (!letter) { - var = species; - } else { - var = letter + SPECIES_UNOWN_B - 1; - } - ret = gMonBackPicCoords[var].y_offset; - } else if (species == SPECIES_CASTFORM) { - ret = gCastformBackSpriteYCoords[gBattleMonForms[slot]]; - } else if (species > NUM_SPECIES) { - ret = gMonBackPicCoords[0].y_offset; - } else { - ret = gMonBackPicCoords[species].y_offset; - } - } else { - if (species == SPECIES_UNOWN) { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - personality = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); - } else { - personality = gTransformPersonalities[slot]; - } - letter = GET_UNOWN_LETTER(personality); - if (!letter) { - var = species; - } else { - var = letter + SPECIES_UNOWN_B - 1; - } - ret = gMonFrontPicCoords[var].y_offset; - } else if (species == SPECIES_CASTFORM) { - ret = gCastformFrontSpriteCoords[gBattleMonForms[slot]].y_offset; - } else if (species > NUM_SPECIES) { - ret = gMonFrontPicCoords[0].y_offset; - } else { - ret = gMonFrontPicCoords[species].y_offset; - } - } - return ret; -} - -u8 sub_8077DD8(u8 slot, u16 species) { - u8 ret = 0; - if (GetBankSide(slot) == 1) { - if (!IsContest()) { - if (species == SPECIES_CASTFORM) { - ret = gCastformElevations[gBattleMonForms[slot]]; - } else if (species > NUM_SPECIES) { - ret = gEnemyMonElevation[0]; - } else { - ret = gEnemyMonElevation[species]; - } - } - } - return ret; -} - -u8 sub_8077E44(u8 slot, u16 species, u8 a3) { - u16 offset; - u8 y; - if (GetBankSide(slot) == 0 || IsContest()) { - offset = sub_8077BFC(slot, species); - } else { - offset = sub_8077BFC(slot, species); - offset -= sub_8077DD8(slot, species); - } - y = offset + gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_1; - if (a3) { - if (GetBankSide(slot) == 0) { - y += 8; - } - if (y > 104) y = 104; - } - return y; -} - -u8 sub_8077EE4(u8 slot, u8 a2) { - u16 species; - struct TransformStatus *transform; - if (a2 == 3 || a2 == 4) { - if (IsContest()) { - if (unk_2019348.field_4 & 1) { - species = unk_2019348.field_2; - } else { - species = unk_2019348.field_0; - } - } else { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = gUnknown_0202F7CA[slot]; - } else { - species = transform->species; - } - } - if (a2 == 3) { - return sub_8077E44(slot, species, 1); - } else { - return sub_8077E44(slot, species, 0); - } - } else { - return sub_8077ABC(slot, a2); - } -} - -u8 sub_8077F68(u8 slot) { - return sub_8077ABC(slot, 4); -} - -u8 sub_8077F7C(u8 slot) { - u16 var; - if (GetBankSide(slot)) { - var = sub_8077ABC(slot, 1) + 16; - } else { - var = sub_8077ABC(slot, 1) + 17; - } - return var; -} - -u8 sub_8077FC0(u8 slot) { - u16 var; - u8 r6; - struct TransformStatus *transform; - r6 = sub_8077ABC(slot, 1); - if (!IsContest()) { - if (GetBankSide(slot)) { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - var = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - } else { - var = transform->species; - } - } else { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - var = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - } else { - var = transform->species; - } - } - if (GetBankSide(slot)) { - r6 -= sub_8077DD8(slot, var); - } - } - return r6; -} - -u8 obj_id_for_side_relative_to_move(u8 a1) { - u8 *sprites; - if (a1 == 0) { - if (sub_8078874(gBattleAnimPlayerMonIndex)) { - sprites = gBattleMonSprites; - return sprites[gBattleAnimPlayerMonIndex]; - } else { - return 0xff; - } - } else if (a1 == 1) { - if (sub_8078874(gBattleAnimEnemyMonIndex)) { - sprites = gBattleMonSprites; - return sprites[gBattleAnimEnemyMonIndex]; - } else { - return 0xff; - } - } else if (a1 == 2) { - if (!b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) { - return 0xff; - } else { - return gBattleMonSprites[gBattleAnimPlayerMonIndex ^ 2]; - } - } else { - if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) { - return gBattleMonSprites[gBattleAnimEnemyMonIndex ^ 2]; - } else { - return 0xff; - } - } -} - -void oamt_set_x3A_32(struct Sprite *sprite, void (*callback)(struct Sprite*)) { - sprite->data6 = (u32)(callback) & 0xffff; - sprite->data7 = (u32)(callback) >> 16; -} - -void sub_8078104(struct Sprite *sprite) { - u32 callback = (u16)sprite->data6 | (sprite->data7 << 16); - sprite->callback = (void (*)(struct Sprite *))callback; -} - -void sub_8078114(struct Sprite *sprite) { - if (sprite->data3) { - sprite->pos2.x = Sin(sprite->data0, sprite->data1); - sprite->pos2.y = Cos(sprite->data0, sprite->data1); - sprite->data0 += sprite->data2; - if (sprite->data0 >= 0x100) { - sprite->data0 -= 0x100; - } else if (sprite->data0 < 0) { - sprite->data0 += 0x100; - } - sprite->data3--; - } else { - sub_8078104(sprite); - } -} - -void sub_8078174(struct Sprite *sprite) { - if (sprite->data3) { - sprite->pos2.x = Sin(sprite->data0, (sprite->data5 >> 8) + sprite->data1); - sprite->pos2.y = Cos(sprite->data0, (sprite->data5 >> 8) + sprite->data1); - sprite->data0 += sprite->data2; - sprite->data5 += sprite->data4; - if (sprite->data0 >= 0x100) { - sprite->data0 -= 0x100; - } else if (sprite->data0 < 0) { - sprite->data0 += 0x100; - } - sprite->data3--; - } else { - sub_8078104(sprite); - } -} - -void unref_sub_80781F0(struct Sprite *sprite) { - if (sprite->data3) { - sprite->pos2.x = Sin(sprite->data0, sprite->data1); - sprite->pos2.y = Cos(sprite->data4, sprite->data1); - sprite->data0 += sprite->data2; - sprite->data4 += sprite->data5; - if (sprite->data0 >= 0x100) { - sprite->data0 -= 0x100; - } else if (sprite->data0 < 0) { - sprite->data0 += 0x100; - } - if (sprite->data4 >= 0x100) { - sprite->data4 -= 0x100; - } else if (sprite->data4 < 0) { - sprite->data4 += 0x100; - } - sprite->data3--; - } else { - sub_8078104(sprite); - } -} - -void sub_8078278(struct Sprite *sprite) { - if (sprite->data3) { - sprite->pos2.x = Sin(sprite->data0, sprite->data1); - sprite->pos2.y = Cos(sprite->data0, sprite->data4); - sprite->data0 += sprite->data2; - if (sprite->data0 >= 0x100) { - sprite->data0 -= 0x100; - } else if (sprite->data0 < 0) { - sprite->data0 += 0x100; - } - sprite->data3--; - } else { - sub_8078104(sprite); - } -} - -void sub_80782D8(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - } else { - sub_8078104(sprite); - } -} - -void sub_80782F8(struct Sprite *sprite) { - sub_8078314(sprite); - sprite->callback = sub_8078364; - sprite->callback(sprite); -} - -void sub_8078314(struct Sprite *sprite) { - s16 old; - int v1; - if (sprite->data1 > sprite->data2) { - sprite->data0 = -sprite->data0; - } - v1 = sprite->data2 - sprite->data1; - old = sprite->data0; - sprite->data0 = abs(v1 / sprite->data0); - sprite->data2 = (sprite->data4 - sprite->data3) / sprite->data0; - sprite->data1 = old; -} - -void sub_8078364(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - sprite->pos2.x += sprite->data1; - sprite->pos2.y += sprite->data2; - } else { - sub_8078104(sprite); - } -} - -void sub_8078394(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - sprite->data3 += sprite->data1; - sprite->data4 += sprite->data2; - sprite->pos2.x = sprite->data3 >> 8; - sprite->pos2.y = sprite->data4 >> 8; - } else { - sub_8078104(sprite); - } -} - -void sub_80783D0(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - sprite->data3 += sprite->data1; - sprite->data4 += sprite->data2; - sprite->pos2.x = sprite->data3 >> 8; - sprite->pos2.y = sprite->data4 >> 8; - } else { - sub_8078104(sprite); - } - UpdateMonIconFrame(sprite); -} - -void unref_sub_8078414(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x + sprite->pos2.x; - sprite->data3 = sprite->pos1.y + sprite->pos2.y; - sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2); - sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3); - sprite->callback = sub_80782F8; -} - -void sub_8078458(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - gSprites[sprite->data3].pos2.x += sprite->data1; - gSprites[sprite->data3].pos2.y += sprite->data2; - } else { - sub_8078104(sprite); - } -} - -void sub_80784A8(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - sprite->data3 += sprite->data1; - sprite->data4 += sprite->data2; - gSprites[sprite->data5].pos2.x = sprite->data3 >> 8; - gSprites[sprite->data5].pos2.y = sprite->data4 >> 8; - } else { - sub_8078104(sprite); - } -} - -void sub_8078504(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - sprite->pos2.x = sprite->data2 >> 8; - sprite->data2 += sprite->data1; - sprite->pos2.y = sprite->data4 >> 8; - sprite->data4 += sprite->data3; - if (sprite->data0 % sprite->data5 == 0) { - if (sprite->data5) { - sprite->invisible ^= 1; - } - } - } else { - sub_8078104(sprite); - } -} - -void move_anim_8074EE0(struct Sprite *sprite) { - FreeSpriteOamMatrix(sprite); - move_anim_8072740(sprite); -} - -void unref_sub_8078588(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x + sprite->pos2.x; - sprite->data3 = sprite->pos1.y + sprite->pos2.y; - sprite->data2 = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); - sprite->data4 = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); - sprite->callback = sub_80782F8; -} - -void unref_sub_80785CC(struct Sprite *sprite) { - ResetPaletteStructByUid(sprite->data5); - move_anim_8074EE0(sprite); -} - -void sub_80785E4(struct Sprite *sprite) { - if (sprite->affineAnimEnded) { - sub_8078104(sprite); - } -} - -void sub_8078600(struct Sprite *sprite) { - if (sprite->animEnded) { - sub_8078104(sprite); - } -} - -void sub_807861C(struct Sprite *sprite) { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - move_anim_8072740(sprite); -} - -void sub_8078634(u8 task) { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroyAnimVisualTask(task); -} - -void sub_8078650(struct Sprite *sprite) { - sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); - sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); -} - -void sub_807867C(struct Sprite *sprite, s16 a2) { - u16 v1 = sub_8077ABC(gBattleAnimPlayerMonIndex, 0); - u16 v2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 0); - if (v1 > v2) { - sprite->pos1.x -= a2; - } else if (v1 < v2) { - sprite->pos1.x += a2; - } else { - if (GetBankSide(gBattleAnimPlayerMonIndex)) { - sprite->pos1.x -= a2; - } else { - sprite->pos1.x += a2; - } - } -} - -void sub_80786EC(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x; - sprite->data3 = sprite->pos1.y; - obj_translate_based_on_private_1_2_3_4(sprite); - sprite->data6 = 0x8000 / sprite->data0; - sprite->data7 = 0; -} - -bool8 sub_8078718(struct Sprite *sprite) { - if (sub_8078B5C(sprite)) { - return TRUE; - } - sprite->data7 += sprite->data6; - sprite->pos2.y += Sin((u8)(sprite->data7 >> 8), sprite->data5); - return FALSE; -} - -void oamt_add_pos2_onto_pos1(struct Sprite *sprite) { - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; -} - -void sub_8078764(struct Sprite *sprite, u8 a2) { - if (!a2) { - sprite->pos1.x = sub_8077EE4(gBattleAnimEnemyMonIndex, 0); - sprite->pos1.y = sub_8077EE4(gBattleAnimEnemyMonIndex, 1); - } - sub_807867C(sprite, gBattleAnimArgs[0]); - sprite->pos1.y += gBattleAnimArgs[1]; -} - -void sub_80787B0(struct Sprite *sprite, u8 a2) { - if (!a2) { - sprite->pos1.x = sub_8077EE4(gBattleAnimPlayerMonIndex, 0); - sprite->pos1.y = sub_8077EE4(gBattleAnimPlayerMonIndex, 1); - } else { - sprite->pos1.x = sub_8077EE4(gBattleAnimPlayerMonIndex, 2); - sprite->pos1.y = sub_8077EE4(gBattleAnimPlayerMonIndex, 3); - } - sub_807867C(sprite, gBattleAnimArgs[0]); - sprite->pos1.y += gBattleAnimArgs[1]; -} - -u8 GetBankSide(u8 slot) { - return gBanksBySide[slot] & 1; -} - -u8 GetBankIdentity(u8 slot) { - return gBanksBySide[slot]; -} - -u8 GetBankByPlayerAI(u8 slot) { - u8 i; - for (i = 0; i < gNoOfAllBanks; i++) { - if (gBanksBySide[i] == slot) { - break; - } - } - return i; -} - -bool8 sub_8078874(u8 slot) { - if (IsContest()) { - if (gBattleAnimPlayerMonIndex == slot) { - return TRUE; - } - if (gBattleAnimEnemyMonIndex == slot) { - return TRUE; - } - return FALSE; - } else { - if (gBanksBySide[slot] == 0xff) { - return FALSE; - } - if (GetBankSide(slot)) { - if (GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) { - return TRUE; - } - } else { - if (GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) { - return TRUE; - } - } - return FALSE; - } -} - -bool8 IsDoubleBattle() { - return IS_DOUBLE_BATTLE(); -} - -void sub_8078914(struct Struct_sub_8078914 *unk) { - if (IsContest()) { - unk->field_0 = (u8 *)0x6008000; - unk->field_4 = (u8 *)0x600f000; - unk->field_8 = 0xe; - } else { - unk->field_0 = (u8 *)0x6004000; - unk->field_4 = (u8 *)0x600e000; - unk->field_8 = 0x8; - } -} - -void sub_8078954(struct Struct_sub_8078914 *unk) { - if (IsContest()) { - unk->field_0 = (u8 *)0x6008000; - unk->field_4 = (u8 *)0x600f000; - unk->field_8 = 0xe; - } else if (GetBankIdentity_permutated(gBattleAnimPlayerMonIndex) == 1) { - unk->field_0 = (u8 *)0x6004000; - unk->field_4 = (u8 *)0x600e000; - unk->field_8 = 0x8; - } else { - unk->field_0 = (u8 *)0x6006000; - unk->field_4 = (u8 *)0x600f000; - unk->field_8 = 0x9; - } -} - -u8 sub_80789BC() { - if (IsContest()) { - return 1; - } - return 2; -} - -void sub_80789D4(bool8 a1) { - if (!a1) { - BG3CNT.size = 0; - BG3CNT.overflow = 1; - } else if (IsContest()) { - BG3CNT.size = 0; - BG3CNT.overflow = 1; - } else { - BG3CNT.size = 1; - BG3CNT.overflow = 0; - } -} - -void sub_8078A34(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x; - sprite->data3 = sprite->pos1.y; - sub_8078A5C(sprite); - sprite->callback = sub_80783D0; - sprite->callback(sprite); -} - -void sub_8078A5C(struct Sprite *sprite) { - s16 x = (sprite->data2 - sprite->data1) << 8; - s16 y = (sprite->data4 - sprite->data3) << 8; - sprite->data1 = x / sprite->data0; - sprite->data2 = y / sprite->data0; - sprite->data4 = 0; - sprite->data3 = 0; -} - -void obj_translate_based_on_private_1_2_3_4(struct Sprite *sprite) { - int x = sprite->data2 - sprite->data1; - int y = sprite->data4 - sprite->data3; - bool8 r8 = x < 0; - bool8 r9 = y < 0; - u16 x2 = abs(x) << 8; - u16 y2 = abs(y) << 8; - x2 = x2 / sprite->data0; - y2 = y2 / sprite->data0; - if (r8) { - x2 |= 1; - } else { - x2 &= ~1; - } - if (r9) { - y2 |= 1; - } else { - y2 &= ~1; - } - sprite->data1 = x2; - sprite->data2 = y2; - sprite->data4 = 0; - sprite->data3 = 0; -} - -void sub_8078B34(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x; - sprite->data3 = sprite->pos1.y; - obj_translate_based_on_private_1_2_3_4(sprite); - sprite->callback = sub_8078BB8; - sprite->callback(sprite); -} - -bool8 sub_8078B5C(struct Sprite *sprite) { - u16 v1, v2, x, y; - if (!sprite->data0) { - return TRUE; - } - v1 = sprite->data1; - v2 = sprite->data2; - x = sprite->data3; - y = sprite->data4; - x += v1; - y += v2; - if (v1 & 1) { - sprite->pos2.x = -(x >> 8); - } else { - sprite->pos2.x = x >> 8; - } - if (v2 & 1) { - sprite->pos2.y = -(y >> 8); - } else { - sprite->pos2.y = y >> 8; - } - sprite->data3 = x; - sprite->data4 = y; - sprite->data0--; - return FALSE; -} - -void sub_8078BB8(struct Sprite *sprite) { - if (sub_8078B5C(sprite)) { - sub_8078104(sprite); - } -} - -void sub_8078BD4(struct Sprite *sprite) { - int v1 = abs(sprite->data2 - sprite->data1) << 8; - sprite->data0 = v1 / sprite->data0; - obj_translate_based_on_private_1_2_3_4(sprite); -} - -void sub_8078C00(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x; - sprite->data3 = sprite->pos1.y; - sub_8078BD4(sprite); - sprite->callback = sub_8078BB8; - sprite->callback(sprite); -} - -void sub_8078C28(struct Sprite *sprite) { - int x = sprite->data2 - sprite->data1; - int y = sprite->data4 - sprite->data3; - bool8 x_sign = x < 0; - bool8 y_sign = y < 0; - u16 x2 = abs(x) << 4; - u16 y2 = abs(y) << 4; - x2 /= sprite->data0; - y2 /= sprite->data0; - if (x_sign) { - x2 |= 1; - } else { - x2 &= ~1; - } - if (y_sign) { - y2 |= 1; - } else { - y2 &= ~1; - } - sprite->data1 = x2; - sprite->data2 = y2; - sprite->data4 = 0; - sprite->data3 = 0; -} - -void sub_8078CC0(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x; - sprite->data3 = sprite->pos1.y; - sub_8078C28(sprite); - sprite->callback = sub_8078D44; - sprite->callback(sprite); -} - -bool8 sub_8078CE8(struct Sprite *sprite) { - u16 v1, v2, x, y; - if (!sprite->data0) { - return TRUE; - } - v1 = sprite->data1; - v2 = sprite->data2; - x = sprite->data3; - y = sprite->data4; - x += v1; - y += v2; - if (v1 & 1) { - sprite->pos2.x = -(x >> 4); - } else { - sprite->pos2.x = x >> 4; - } - if (v2 & 1) { - sprite->pos2.y = -(y >> 4); - } else { - sprite->pos2.y = y >> 4; - } - sprite->data3 = x; - sprite->data4 = y; - sprite->data0--; - return FALSE; -} - -void sub_8078D44(struct Sprite *sprite) { - if (sub_8078CE8(sprite)) { - sub_8078104(sprite); - } -} - -void sub_8078D60(struct Sprite *sprite) { - int v1 = abs(sprite->data2 - sprite->data1) << 4; - sprite->data0 = v1 / sprite->data0; - sub_8078C28(sprite); -} - -void sub_8078D8C(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x; - sprite->data3 = sprite->pos1.y; - sub_8078D60(sprite); - sprite->callback = sub_8078D44; - sprite->callback(sprite); -} - -void obj_id_set_rotscale(u8 sprite, s16 xScale, s16 yScale, u16 rotation) { - int i; - struct ObjAffineSrcData src; - struct OamMatrix matrix; - src.xScale = xScale; - src.yScale = yScale; - src.rotation = rotation; - if (sub_8078E38()) { - src.xScale = -src.xScale; - } - i = gSprites[sprite].oam.matrixNum; - ObjAffineSet(&src, &matrix, 1, 2); - gOamMatrices[i].a = matrix.a; - gOamMatrices[i].b = matrix.b; - gOamMatrices[i].c = matrix.c; - gOamMatrices[i].d = matrix.d; -} - -bool8 sub_8078E38() { - if (IsContest()) { - if (gSprites[obj_id_for_side_relative_to_move(0)].data2 == 0xc9 /* XXX SPECIES_UNOWN? */) { - return FALSE; - } - return TRUE; - } - return FALSE; -} - -void sub_8078E70(u8 sprite, u8 a2) { - struct Struct_2017810 *unk; - u8 r7 = gSprites[sprite].data0; - if (IsContest() || b_side_obj__get_some_boolean(r7)) { - gSprites[sprite].invisible = FALSE; - } - gSprites[sprite].oam.objMode = a2; - gSprites[sprite].affineAnimPaused = TRUE; - if (!IsContest() && !gSprites[sprite].oam.affineMode) { - unk = &unk_2017810[r7]; - gSprites[sprite].oam.matrixNum = unk->field_6; - } - gSprites[sprite].oam.affineMode = 3; - CalcCenterToCornerVec(&gSprites[sprite], gSprites[sprite].oam.shape, gSprites[sprite].oam.size, gSprites[sprite].oam.affineMode); -} - -void sub_8078F40(u8 sprite) { - obj_id_set_rotscale(sprite, 0x100, 0x100, 0); - gSprites[sprite].oam.affineMode = 1; - gSprites[sprite].oam.objMode = 0; - gSprites[sprite].affineAnimPaused = FALSE; - CalcCenterToCornerVec(&gSprites[sprite], gSprites[sprite].oam.shape, gSprites[sprite].oam.size, gSprites[sprite].oam.affineMode); -} - -void sub_8078F9C(u8 sprite) { - u16 matrix = gSprites[sprite].oam.matrixNum; - s16 c = gOamMatrices[matrix].c; - if (c < 0) { - c = -c; - } - gSprites[sprite].pos2.y = c >> 3; -} - -// related to obj_id_set_rotscale -void sub_8078FDC(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 rotation) { - int i; - struct ObjAffineSrcData src; - struct OamMatrix matrix; - if (sprite->oam.affineMode & 1) { - sprite->affineAnimPaused = TRUE; - if (a2) { - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - } - src.xScale = xScale; - src.yScale = yScale; - src.rotation = rotation; - if (sub_8078E38()) { - src.xScale = -src.xScale; - } - i = sprite->oam.matrixNum; - ObjAffineSet(&src, &matrix, 1, 2); - gOamMatrices[i].a = matrix.a; - gOamMatrices[i].b = matrix.b; - gOamMatrices[i].c = matrix.c; - gOamMatrices[i].d = matrix.d; - } -} - -void sub_8079098(struct Sprite *sprite) { - sub_8078FDC(sprite, TRUE, 0x100, 0x100, 0); - sprite->affineAnimPaused = FALSE; - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); -} - -u16 sub_80790D8(s16 a, s16 b) { - return ArcTan2(a, b); -} - -u16 sub_80790F0(s16 a, s16 b) { - u16 var = sub_80790D8(a, b); - return -var; -} - -void sub_8079108(u16 a1, bool8 a2) { - int i; - struct Color *c; - struct Color *c2; - u16 average; - - a1 *= 0x10; - - if (!a2) { - for (i = 0; i < 0x10; i++) { - c = (struct Color *)&gPlttBufferUnfaded[a1 + i]; - average = c->r + c->g + c->b; - average /= 3; - - c2 = (struct Color *)&gPlttBufferFaded[a1 + i]; - c2->r = average; - c2->g = average; - c2->b = average; - } - } else { - CpuCopy32(&gPlttBufferUnfaded[a1], &gPlttBufferFaded[a1], 0x20); - } -} - -u32 sub_80791A8(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) { - u32 var = 0; - u32 shift; - if (a1) { - if (!IsContest()) { - var = 0xe; - } else { - var = 1 << sub_80789BC(); - } - } - if (a2) { - shift = gBattleAnimPlayerMonIndex + 16; - var |= 1 << shift; - } - if (a3) { - shift = gBattleAnimEnemyMonIndex + 16; - var |= 1 << shift; - } - if (a4) { - if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) { - shift = (gBattleAnimPlayerMonIndex ^ 2) + 16; - var |= 1 << shift; - } - } - if (a5) { - if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) { - shift = (gBattleAnimEnemyMonIndex ^ 2) + 16; - var |= 1 << shift; - } - } - if (a6) { - if (!IsContest()) { - var |= 0x100; - } else { - var |= 0x4000; - } - } - if (a7) { - if (!IsContest()) { - var |= 0x200; - } - } - return var; -} - -u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4) { - u32 var = 0; - u32 shift; - if (IsContest()) { - if (a1) { - var |= 1 << 18; - return var; - } - } else { - if (a1) { - if (b_side_obj__get_some_boolean(GetBankByPlayerAI(0))) { - var |= 1 << (GetBankByPlayerAI(0) + 16); - } - } - if (a2) { - if (b_side_obj__get_some_boolean(GetBankByPlayerAI(2))) { - shift = GetBankByPlayerAI(2) + 16; - var |= 1 << shift; - } - } - if (a3) { - if (b_side_obj__get_some_boolean(GetBankByPlayerAI(1))) { - shift = GetBankByPlayerAI(1) + 16; - var |= 1 << shift; - } - } - if (a4) { - if (b_side_obj__get_some_boolean(GetBankByPlayerAI(3))) { - shift = GetBankByPlayerAI(3) + 16; - var |= 1 << shift; - } - } - } - return var; -} - -u8 sub_80793A8(u8 a1) { - return a1; -} - -u8 unref_sub_80793B0(u8 a1) { - return GetBankByPlayerAI(a1); -} - -void sub_80793C4(struct Sprite *sprite) { - bool8 var; - if (!sprite->data0) { - if (!gBattleAnimArgs[3]) { - var = TRUE; - } else { - var = FALSE; - } - if (!gBattleAnimArgs[2]) { - sub_80787B0(sprite, var); - } else { - sub_8078764(sprite, var); - } - sprite->data0++; - - } else if (sprite->animEnded || sprite->affineAnimEnded) { - move_anim_8074EE0(sprite); - } -} - -void sub_807941C(struct Sprite *sprite) { - bool8 v1; - u8 v2; - if (!(gBattleAnimArgs[5] & 0xff00)) { - v1 = TRUE; - } else { - v1 = FALSE; - } - if (!(gBattleAnimArgs[5] & 0xff)) { - v2 = 3; - } else { - v2 = 1; - } - sub_80787B0(sprite, v1); - if (GetBankSide(gBattleAnimPlayerMonIndex)) { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } - sprite->data0 = gBattleAnimArgs[4]; - sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) + gBattleAnimArgs[2]; - sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, v2) + gBattleAnimArgs[3]; - sprite->callback = sub_8078B34; - oamt_set_x3A_32(sprite, move_anim_8072740); -} - -void sub_80794A8(struct Sprite *sprite) { - sub_80787B0(sprite, 1); - if (GetBankSide(gBattleAnimPlayerMonIndex)) { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } - sprite->data0 = gBattleAnimArgs[4]; - sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) + gBattleAnimArgs[2]; - sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3) + gBattleAnimArgs[3]; - sprite->data5 = gBattleAnimArgs[5]; - sub_80786EC(sprite); - sprite->callback = sub_8079518; -} - -void sub_8079518(struct Sprite *sprite) { - if (sub_8078718(sprite)) { - move_anim_8072740(sprite); - } -} - -void sub_8079534(struct Sprite *sprite) { - u8 r4, slot, r7; - if (!gBattleAnimArgs[6]) { - r4 = 1; - r7 = 3; - } else { - r4 = 0; - r7 = 1; - } - if (!gBattleAnimArgs[5]) { - sub_80787B0(sprite, r4); - slot = gBattleAnimPlayerMonIndex; - } else { - sub_8078764(sprite, r4); - slot = gBattleAnimEnemyMonIndex; - } - if (GetBankSide(gBattleAnimPlayerMonIndex)) { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } - sub_8078764(sprite, r4); - sprite->data0 = gBattleAnimArgs[4]; - sprite->data2 = sub_8077ABC(slot, 2) + gBattleAnimArgs[2]; - sprite->data4 = sub_8077ABC(slot, r7) + gBattleAnimArgs[3]; - sprite->callback = sub_8078B34; - oamt_set_x3A_32(sprite, move_anim_8072740); -} - -s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 a1) { - u16 i; - u8 sprite = obj_id_for_side_relative_to_move(a1); - if (sprite != 0xff) { - for (i = 0; i < 0x40; i++) { - if (gSprites[i].inUse) { - continue; - } - gSprites[i] = gSprites[sprite]; - gSprites[i].oam.objMode = 1; - gSprites[i].invisible = FALSE; - return i; - } - } - return -1; -} - -void obj_delete_but_dont_free_vram(struct Sprite *sprite) { - sprite->usingSheet = TRUE; - DestroySprite(sprite); -} - -void sub_8079670(u8 task) { - s16 v1 = 0; - s16 v2 = 0; - if (gBattleAnimArgs[2] > gBattleAnimArgs[0]) { - v2 = 1; - } - if (gBattleAnimArgs[2] < gBattleAnimArgs[0]) { - v2 = -1; - } - if (gBattleAnimArgs[3] > gBattleAnimArgs[1]) { - v1 = 1; - } - if (gBattleAnimArgs[3] < gBattleAnimArgs[1]) { - v1 = -1; - } - gTasks[task].data[0] = 0; - gTasks[task].data[1] = gBattleAnimArgs[4]; - gTasks[task].data[2] = 0; - gTasks[task].data[3] = gBattleAnimArgs[0]; - gTasks[task].data[4] = gBattleAnimArgs[1]; - gTasks[task].data[5] = v2; - gTasks[task].data[6] = v1; - gTasks[task].data[7] = gBattleAnimArgs[2]; - gTasks[task].data[8] = gBattleAnimArgs[3]; - REG_BLDALPHA = (gBattleAnimArgs[1] << 8) | gBattleAnimArgs[0]; - gTasks[task].func = sub_80796F8; -} - -void sub_80796F8(u8 taskId) { - struct Task *task = &gTasks[taskId]; - if (++task->data[0] > task->data[1]) { - task->data[0] = 0; - if (++task->data[2] & 1) { - if (task->data[3] != task->data[7]) { - task->data[3] += task->data[5]; - } - } else { - if (task->data[4] != task->data[8]) { - task->data[4] += task->data[6]; - } - } - REG_BLDALPHA = (task->data[4] << 8) | task->data[3]; - if (task->data[3] == task->data[7] && task->data[4] == task->data[8]) { - DestroyAnimVisualTask(taskId); - return; - } - } -} - -void sub_8079790(u8 task) { - u8 sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); - if (sprite == 0xff) { - DestroyAnimVisualTask(task); - return; - } - gTasks[task].data[0] = (gSprites[sprite].oam.paletteNum * 0x10) + 0x101; - sub_80797EC(&gTasks[task]); -} - -void sub_80797EC(struct Task *task) { - task->data[1] = gBattleAnimArgs[1]; - task->data[2] = 0; - task->data[3] = gBattleAnimArgs[2]; - task->data[4] = 0; - task->data[5] = gBattleAnimArgs[3]; - task->data[6] = 0; - task->data[7] = gBattleAnimArgs[4]; - task->func = sub_8079814; -} - -void sub_8079814(u8 taskId) { - struct Task *task = &gTasks[taskId]; - if (++task->data[4] >= task->data[5]) { - task->data[4] = 0; - if (!task->data[6]) { - task->data[2]++; - BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]); - if (task->data[2] == task->data[3]) { - task->data[6] = 1; - } - } else { - task->data[2]--; - BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]); - if (!task->data[2]) { - if (--task->data[7]) { - task->data[4] = 0; - task->data[6] = 0; - } else { - DestroyAnimVisualTask(taskId); - return; - } - } - } - } -} - -void sub_80798AC(u8 task) { - u8 palette = IndexOfSpritePaletteTag(gBattleAnimArgs[0]); - if (palette == 0xff) { - DestroyAnimVisualTask(task); - return; - } - gTasks[task].data[0] = (palette * 0x10) + 0x101; - sub_80797EC(&gTasks[task]); -} - -void sub_80798F4(struct Task *task, u8 a2, void *a3) { - task->data[7] = 0; - task->data[8] = 0; - task->data[9] = 0; - task->data[15] = a2; - task->data[10] = 0x100; - task->data[11] = 0x100; - task->data[12] = 0; - sub_8079BF4(&task->data[13], &task->data[14], a3); - sub_8078E70(a2, 0); -} - -bool8 sub_807992C(struct Task *task) { - gUnknown_0202F7D4 = sub_8079BFC(task->data[13], task->data[14]) + (task->data[7] << 3); - switch (gUnknown_0202F7D4->type) { - default: - if (!gUnknown_0202F7D4->frame.duration) { - task->data[10] = gUnknown_0202F7D4->frame.xScale; - task->data[11] = gUnknown_0202F7D4->frame.yScale; - task->data[12] = gUnknown_0202F7D4->frame.rotation; - task->data[7]++; - gUnknown_0202F7D4++; - } - task->data[10] += gUnknown_0202F7D4->frame.xScale; - task->data[11] += gUnknown_0202F7D4->frame.yScale; - task->data[12] += gUnknown_0202F7D4->frame.rotation; - obj_id_set_rotscale(task->data[15], task->data[10], task->data[11], task->data[12]); - sub_8079A64(task->data[15]); - if (++task->data[8] >= gUnknown_0202F7D4->frame.duration) { - task->data[8] = 0; - task->data[7]++; - } - break; - - case AFFINEANIMCMDTYPE_JUMP: - task->data[7] = gUnknown_0202F7D4->jump.target; - break; - - case AFFINEANIMCMDTYPE_LOOP: - if (gUnknown_0202F7D4->loop.count) { - if (task->data[9]) { - if (!--task->data[9]) { - task->data[7]++; - break; - } - } else { - task->data[9] = gUnknown_0202F7D4->loop.count; - } - if (!task->data[7]) { - break; - } - for (;;) { - task->data[7]--; - gUnknown_0202F7D4--; - if (gUnknown_0202F7D4->type == AFFINEANIMCMDTYPE_LOOP) { - task->data[7]++; - return TRUE; - } - if (!task->data[7]) { - return TRUE; - } - } - } - task->data[7]++; - break; - - case 0x7fff: - gSprites[task->data[15]].pos2.y = 0; - sub_8078F40(task->data[15]); - return FALSE; - } - - return TRUE; -} - -void sub_8079A64(u8 sprite) { - int var = 0x40 - sub_8079B10(sprite) * 2; - u16 matrix = gSprites[sprite].oam.matrixNum; - int var2 = (var << 8) / gOamMatrices[matrix].d; - if (var2 > 0x80) { - var2 = 0x80; - } - gSprites[sprite].pos2.y = (var - var2) / 2; -} - -void sub_8079AB8(u8 sprite, u8 sprite2) { - int var = 0x40 - sub_8079B10(sprite2) * 2; - u16 matrix = gSprites[sprite].oam.matrixNum; - int var2 = (var << 8) / gOamMatrices[matrix].d; - if (var2 > 0x80) { - var2 = 0x80; - } - gSprites[sprite].pos2.y = (var - var2) / 2; -} - -u16 sub_8079B10(u8 sprite) { - struct TransformStatus *transform; - u8 slot = gSprites[sprite].data0; - u16 species; - u16 i; - for (i = 0; i < (sizeof(gBattleMonSprites) / sizeof(u8)); i++) { - if (gBattleMonSprites[i] == sprite) { - if (IsContest()) { - species = unk_2019348.field_0; - return gMonBackPicCoords[species].y_offset; - } else { - if (!GetBankSide(i)) { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[i]], MON_DATA_SPECIES); - } else { - species = transform->species; - } - return gMonBackPicCoords[species].y_offset; - } else { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[i]], MON_DATA_SPECIES); - } else { - species = transform->species; - } - return gMonFrontPicCoords[species].y_offset; - } - } - } - } - return 0x40; -} - -void sub_8079BF4(s16 *bottom, s16 *top, void *ptr) { - *bottom = ((intptr_t) ptr) & 0xffff; - *top = (((intptr_t) ptr) >> 16) & 0xffff; -} - -void *sub_8079BFC(s16 bottom, s16 top) { - return (void *)((u16)bottom | ((u16)top << 16)); -} - - -// possible new file - -void sub_8079C08(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7) { - task->data[8] = a7; - task->data[15] = a2; - task->data[9] = a3; - task->data[10] = a4; - task->data[13] = a5; - task->data[14] = a6; - task->data[11] = (a5 - a3) / a7; - task->data[12] = (a6 - a4) / a7; -} - -u8 sub_8079C74(struct Task *task) { - if (!task->data[8]) { - return 0; - } - if (--task->data[8]) { - task->data[9] += task->data[11]; - task->data[10] += task->data[12]; - } else { - task->data[9] = task->data[13]; - task->data[10] = task->data[14]; - } - obj_id_set_rotscale(task->data[15], task->data[9], task->data[10], 0); - if (task->data[8]) { - sub_8079A64(task->data[15]); - } else { - gSprites[task->data[15]].pos2.y = 0; - } - return task->data[8]; -} - -void sub_8079CEC(u8 task) { - u16 v1; - if (gHappinessMoveAnim <= 30) { - v1 = 0; - } else if (gHappinessMoveAnim <= 100) { - v1 = 1; - } else if (gHappinessMoveAnim <= 200) { - v1 = 2; - } else { - v1 = 3; - } - gBattleAnimArgs[7] = v1; - DestroyAnimVisualTask(task); -} - -void unref_sub_8079D20(u8 priority) { - if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex)) { - gSprites[gBattleMonSprites[gBattleAnimEnemyMonIndex]].oam.priority = priority; - } - if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex)) { - gSprites[gBattleMonSprites[gBattleAnimPlayerMonIndex]].oam.priority = priority; - } - if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) { - gSprites[gBattleMonSprites[gBattleAnimEnemyMonIndex ^ 2]].oam.priority = priority; - } - if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) { - gSprites[gBattleMonSprites[gBattleAnimPlayerMonIndex ^ 2]].oam.priority = priority; - } -} - -void sub_8079E24() { - int i; - for (i = 0; i < gNoOfAllBanks; i++) { - if (b_side_obj__get_some_boolean(i)) { - gSprites[gBattleMonSprites[i]].subpriority = sub_8079E90(i); - gSprites[gBattleMonSprites[i]].oam.priority = 2; - } - } -} - -u8 sub_8079E90(u8 slot) { - u8 status; - u8 ret; - if (IsContest()) { - if (slot == 2) { - return 30; - } else { - return 40; - } - } else { - status = GetBankIdentity(slot); - if (status == 0) { - ret = 30; - } else if (status == 2) { - ret = 20; - } else if (status == 1) { - ret = 40; - } else { - ret = 50; - } - } - return ret; -} - -u8 sub_8079ED4(u8 slot) { - u8 status = GetBankIdentity(slot); - if (IsContest()) { - return 2; - } - if (status == 0 || status == 3) { - return BG2CNT.priority; - } else { - return BG1CNT.priority; - } -} - -u8 GetBankIdentity_permutated(u8 slot) { - u8 status; - if (!IsContest()) { - status = GetBankIdentity(slot); - if (status == 0 || status == 3) { - return 2; - } else { - return 1; - } - } - return 1; -} - -u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, u32 a8) { - void *src; - void *dest; - int size; - - u8 sprite; - u16 sheet = LoadSpriteSheet(&gUnknown_0837F5E0[a3]); - u16 palette = AllocSpritePalette(gSpriteTemplate_837F5B0[a3].paletteTag); - if (!isBackpic) { - LoadCompressedPalette(species_and_otid_get_pal(species, a8, a7), (palette * 0x10) + 0x100, 0x20); - LoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, - gMonFrontPicCoords[species].y_offset, - 0x2000000, - (void *)0x2000000, - species, - a7, - 1 - ); - } else { - LoadCompressedPalette( - species_and_otid_get_pal(species, a8, a7), (palette * 0x10) + 0x100, 0x20); - LoadSpecialPokePic( - &gMonBackPicTable[species], - gMonBackPicCoords[species].coords, - gMonBackPicCoords[species].y_offset, - 0x2000000, - (void *)0x2000000, - species, - a7, - 0 - ); - } - - src = (void *)0x2000000; - dest = (void *)(0x6010000 + (sheet * 0x20)); - size = 0x800; - DmaCopy32(3, src, dest, size); - - if (!isBackpic) { - sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonFrontPicCoords[species].y_offset, a6); - } else { - sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonBackPicCoords[species].y_offset, a6); - } - if (IsContest()) { - gSprites[sprite].affineAnims = &gSpriteAffineAnimTable_81E7C18; - StartSpriteAffineAnim(&gSprites[sprite], 0); - } - return sprite; -} - -void sub_807A0F4(struct Sprite *sprite) { - DestroySpriteAndFreeResources(sprite); -} - -int sub_807A100(u8 slot, u8 a2) { - u16 species; - u32 personality; - u16 letter; - u16 var; - int ret; - const struct MonCoords *coords; - struct TransformStatus *transform; - if (IsContest()) { - if (unk_2019348.field_4 & 1) { - species = unk_2019348.field_2; - personality = unk_2019348.field_10; - } else { - species = unk_2019348.field_0; - personality = unk_2019348.field_8; - } - if (species == SPECIES_UNOWN) { - letter = GET_UNOWN_LETTER(personality); - if (!letter) { - var = SPECIES_UNOWN; - } else { - var = letter + SPECIES_UNOWN_B - 1; - } - coords = &gMonBackPicCoords[var]; - } else if (species == SPECIES_CASTFORM) { - coords = &gCastformFrontSpriteCoords[gBattleMonForms[slot]]; - } else if (species <= SPECIES_EGG) { - coords = &gMonBackPicCoords[species]; - } else { - coords = &gMonBackPicCoords[0]; - } - } else { - if (!GetBankSide(slot)) { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - personality = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); - } else { - species = transform->species; - personality = gTransformPersonalities[slot]; - } - if (species == SPECIES_UNOWN) { - letter = GET_UNOWN_LETTER(personality); - if (!letter) { - var = SPECIES_UNOWN; - } else { - var = letter + SPECIES_UNOWN_B - 1; - } - coords = &gMonBackPicCoords[var]; - } else if (species > SPECIES_EGG) { - coords = &gMonBackPicCoords[0]; - } else { - coords = &gMonBackPicCoords[species]; - } - } else { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - personality = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); - } else { - species = transform->species; - personality = gTransformPersonalities[slot]; - } - if (species == SPECIES_UNOWN) { - letter = GET_UNOWN_LETTER(personality); - if (!letter) { - var = SPECIES_UNOWN; - } else { - var = letter + SPECIES_UNOWN_B - 1; - } - coords = &gMonFrontPicCoords[var]; - } else if (species == SPECIES_CASTFORM) { - coords = &gCastformFrontSpriteCoords[gBattleMonForms[slot]]; - } else if (species > SPECIES_EGG) { - coords = &gMonFrontPicCoords[0]; - } else { - coords = &gMonFrontPicCoords[species]; - } - } - } - - switch (a2) { - case 0: - return (coords->coords & 0xf) * 8; - case 1: - return (coords->coords >> 4) * 8; - case 4: - return sub_8077ABC(slot, 2) - ((coords->coords >> 4) * 4); - case 5: - return sub_8077ABC(slot, 2) + ((coords->coords >> 4) * 4); - case 2: - return sub_8077ABC(slot, 3) - ((coords->coords & 0xf) * 4); - case 3: - return sub_8077ABC(slot, 3) + ((coords->coords & 0xf) * 4); - case 6: - ret = sub_8077ABC(slot, 1) + 0x1f; - return ret - coords->y_offset; - default: - return 0; - } -} - -void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4) { - u8 v1, v2; - s16 v3, v4; - s16 v5, v6; - if (!a2) { - v1 = 0; - v2 = 1; - } else { - v1 = 2; - v2 = 3; - } - v3 = sub_8077ABC(slot, v1); - v4 = sub_8077ABC(slot, v2); - if (IsDoubleBattle() && !IsContest()) { - v5 = sub_8077ABC(slot ^ 2, v1); - v6 = sub_8077ABC(slot ^ 2, v2); - } else { - v5 = v3; - v6 = v4; - } - *a3 = (v3 + v5) / 2; - *a4 = (v4 + v6) / 2; -} - -u8 sub_807A4A0(int a1, u8 sprite, int a3) { - u8 new_sprite = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); - gSprites[new_sprite] = gSprites[sprite]; - gSprites[new_sprite].usingSheet = TRUE; - gSprites[new_sprite].oam.priority = 0; - gSprites[new_sprite].oam.objMode = 2; - gSprites[new_sprite].oam.tileNum = gSprites[sprite].oam.tileNum; - gSprites[new_sprite].callback = SpriteCallbackDummy; - return new_sprite; -} - -void sub_807A544(struct Sprite *sprite) { - sub_8078650(sprite); - if (GetBankSide(gBattleAnimPlayerMonIndex)) { - sprite->pos1.x -= gBattleAnimArgs[0]; - gBattleAnimArgs[3] = -gBattleAnimArgs[3]; - sprite->hFlip = TRUE; - } else { - sprite->pos1.x += gBattleAnimArgs[0]; - } - sprite->pos1.y += gBattleAnimArgs[1]; - sprite->data0 = gBattleAnimArgs[2]; - sprite->data1 = gBattleAnimArgs[3]; - sprite->data3 = gBattleAnimArgs[4]; - sprite->data5 = gBattleAnimArgs[5]; - oamt_set_x3A_32(sprite, move_anim_8074EE0); - sprite->callback = sub_8078504; -} - -void sub_807A5C4(struct Sprite *sprite) { - if (GetBankSide(gBattleAnimPlayerMonIndex)) { - sprite->pos1.x -= gBattleAnimArgs[0]; - gBattleAnimArgs[3] *= -1; - } else { - sprite->pos1.x += gBattleAnimArgs[0]; - } - sprite->pos1.y += gBattleAnimArgs[1]; - sprite->data0 = gBattleAnimArgs[2]; - sprite->data1 = gBattleAnimArgs[3]; - sprite->data3 = gBattleAnimArgs[4]; - sprite->data5 = gBattleAnimArgs[5]; - StartSpriteAnim(sprite, gBattleAnimArgs[6]); - oamt_set_x3A_32(sprite, move_anim_8074EE0); - sprite->callback = sub_8078504; -} - -void sub_807A63C(struct Sprite *sprite) { - sub_8078650(sprite); - if (GetBankSide(gBattleAnimPlayerMonIndex)) { - sprite->pos1.x -= gBattleAnimArgs[0]; - } else { - sprite->pos1.x += gBattleAnimArgs[0]; - } - sprite->pos1.y += gBattleAnimArgs[1]; - sprite->callback = sub_8078600; - oamt_set_x3A_32(sprite, move_anim_8072740); -} - -void sub_807A69C(u8 taskId) { - u16 src; - u16 dest; - struct Task *task = &gTasks[taskId]; - task->data[0] = obj_id_for_side_relative_to_move(0); - task->data[1] = (GetBankSide(gBattleAnimPlayerMonIndex)) ? -8 : 8; - task->data[2] = 0; - task->data[3] = 0; - gSprites[task->data[0]].pos2.x -= task->data[0]; - task->data[4] = AllocSpritePalette(10097); - task->data[5] = 0; - - dest = (task->data[4] + 0x10) * 0x10; - src = (gSprites[task->data[0]].oam.paletteNum + 0x10) * 0x10; - task->data[6] = sub_8079E90(gBattleAnimPlayerMonIndex); - if (task->data[6] == 20 || task->data[6] == 40) { - task->data[6] = 2; - } else { - task->data[6] = 3; - } - CpuCopy32(&gPlttBufferUnfaded[src], &gPlttBufferFaded[dest], 0x20); - BlendPalette(dest, 0x10, gBattleAnimArgs[1], gBattleAnimArgs[0]); - task->func = sub_807A784; -} - -void sub_807A784(u8 taskId) { - struct Task *task = &gTasks[taskId]; - switch (task->data[2]) { - case 0: - sub_807A850(task, taskId); - gSprites[task->data[0]].pos2.x += task->data[1]; - if (++task->data[3] == 5) { - task->data[3]--; - task->data[2]++; - } - break; - case 1: - sub_807A850(task, taskId); - gSprites[task->data[0]].pos2.x -= task->data[1]; - if (--task->data[3] == 0) { - gSprites[task->data[0]].pos2.x = 0; - task->data[2]++; - } - break; - case 2: - if (!task->data[5]) { - FreeSpritePaletteByTag(10097); - DestroyAnimVisualTask(taskId); - } - break; - } -} - -void sub_807A850(struct Task *task, u8 taskId) { - s16 sprite = duplicate_obj_of_side_rel2move_in_transparent_mode(0); - if (sprite >= 0) { - gSprites[sprite].oam.priority = task->data[6]; - gSprites[sprite].oam.paletteNum = task->data[4]; - gSprites[sprite].data0 = 8; - gSprites[sprite].data1 = taskId; - gSprites[sprite].data2 = sprite; - gSprites[sprite].pos2.x = gSprites[task->data[0]].pos2.x; - gSprites[sprite].callback = sub_807A8D4; - task->data[5]++; - } -} - -void sub_807A8D4(struct Sprite *sprite) { - if (--sprite->data0 == 0) { - gTasks[sprite->data1].data[5]--; - obj_delete_but_dont_free_vram(sprite); - } -} - -void sub_807A908(struct Sprite *sprite) { - sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); - sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); - if (!GetBankSide(gBattleAnimPlayerMonIndex)) { - sprite->data0 = 5; - } else { - sprite->data0 = -10; - } - sprite->data1 = -40; - sprite->callback = sub_807A960; -} - -void sub_807A960(struct Sprite *sprite) { - sprite->data2 += sprite->data0; - sprite->data3 += sprite->data1; - sprite->pos2.x = sprite->data2 / 10; - sprite->pos2.y = sprite->data3 / 10; - if (sprite->data1 < -20) { - sprite->data1++; - } - if ((sprite->pos1.y + sprite->pos2.y) < -32) { - move_anim_8072740(sprite); - } -} - -void sub_807A9BC(struct Sprite *sprite) { - int x; - sprite->data0 = gBattleAnimArgs[2]; - sprite->data2 = sprite->pos1.x + gBattleAnimArgs[4]; - sprite->data4 = sprite->pos1.y + gBattleAnimArgs[5]; - if (!GetBankSide(gBattleAnimEnemyMonIndex)) { - x = (u16)gBattleAnimArgs[4] + 30; - sprite->pos1.x += x; - sprite->pos1.y = gBattleAnimArgs[5] - 20; - } else { - x = (u16)gBattleAnimArgs[4] - 30; - sprite->pos1.x += x; - sprite->pos1.y = gBattleAnimArgs[5] - 80; - } - sprite->callback = sub_8078B34; - oamt_set_x3A_32(sprite, move_anim_8072740); -} diff --git a/src/rotating_gate.c b/src/rotating_gate.c deleted file mode 100644 index bb3c31dfc..000000000 --- a/src/rotating_gate.c +++ /dev/null @@ -1,1228 +0,0 @@ -#include "global.h" -#include "bike.h" -#include "event_data.h" -#include "field_map_obj.h" -#include "fieldmap.h" -#include "map_constants.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" - -#define ROTATING_GATE_TILE_TAG 0x1300 -#define ROTATING_GATE_PUZZLE_MAX 14 -#define GATE_ARM_MAX_LENGTH 2 - -#define GATE_ROTATION(rotationDirection, arm, longArm) \ - ((rotationDirection & 15) << 4) | ((arm & 7) << 1) | (longArm & 1) -#define GATE_ROTATION_CLOCKWISE(arm, longArm) GATE_ROTATION(ROTATE_CLOCKWISE, arm, longArm) -#define GATE_ROTATION_ANTICLOCKWISE(arm, longArm) GATE_ROTATION(ROTATE_ANTICLOCKWISE, arm, longArm) -#define GATE_ROTATION_NONE 255 - -static void SpriteCallback_RotatingGate(struct Sprite *sprite); -static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY); -static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite); - -enum -{ - /* - * | - * +-- - */ - GATE_SHAPE_L1, - - /* - * | - * | - * +-- - */ - GATE_SHAPE_L2, - - /* - * | - * +---- - */ - GATE_SHAPE_L3, - - /* - * | - * | - * +---- - */ - GATE_SHAPE_L4, - - /* - * | - * +-- - * | - */ - GATE_SHAPE_T1, - - /* - * | - * | - * +-- - * | - */ - GATE_SHAPE_T2, - - /* - * | - * +---- - * | - */ - GATE_SHAPE_T3, - - /* - * An unused T-shape gate - * | - * +-- - * | - * | - */ - GATE_SHAPE_T4, - - /* - * An unused T-shape gate - * | - * | - * +---- - * | - */ - GATE_SHAPE_UNUSED_T1, - - /* - * An unused T-shape gate - * | - * | - * +-- - * | - * | - */ - GATE_SHAPE_UNUSED_T2, - - /* - * An unused T-shape gate - * | - * +---- - * | - * | - */ - GATE_SHAPE_UNUSED_T3, - - /* - * An unused T-shape gate - * | - * | - * +---- - * | - * | - */ - GATE_SHAPE_UNUSED_T4, -}; - -enum -{ - /* - * 0 degrees (clockwise) - * | - * +-- - * | - */ - GATE_ORIENTATION_0, - - /* - * 90 degress (clockwise) - * --+-- - * | - */ - GATE_ORIENTATION_90, - - /* - * 180 degrees (clockwise) - * | - * --+ - * | - */ - GATE_ORIENTATION_180, - - /* - * 270 degrees (clockwise) - * | - * --+-- - */ - GATE_ORIENTATION_270, - - GATE_ORIENTATION_MAX, -}; - -// Describes the location of the gates "arms" when the gate has not -// been rotated (i.e. rotated 0 degrees) -enum -{ - GATE_ARM_NORTH, - GATE_ARM_EAST, - GATE_ARM_SOUTH, - GATE_ARM_WEST, -}; - -enum -{ - ROTATE_NONE, - ROTATE_ANTICLOCKWISE, - ROTATE_CLOCKWISE, -}; - -enum -{ - PUZZLE_NONE, - PUZZLE_FORTREE_CITY_GYM, - PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6, -}; - -struct RotatingGatePuzzle -{ - struct Coords16 pos; - u8 shape; - u8 orientation; -}; - -struct Coords8 -{ - s8 deltaX; - s8 deltaY; -}; - -// Fortree -static const struct RotatingGatePuzzle sRotatingGate_FortreePuzzleConfig[] = { - { { 12, 5 }, GATE_SHAPE_L4, GATE_ORIENTATION_0 }, - { { 14, 7 }, GATE_SHAPE_L4, GATE_ORIENTATION_270 }, - { { 16, 4 }, GATE_SHAPE_T2, GATE_ORIENTATION_90 }, - { { 15, 14 }, GATE_SHAPE_L2, GATE_ORIENTATION_0 }, - { { 18, 13 }, GATE_SHAPE_T1, GATE_ORIENTATION_180 }, - { { 8, 20 }, GATE_SHAPE_T1, GATE_ORIENTATION_180 }, - { { 16, 20 }, GATE_SHAPE_T4, GATE_ORIENTATION_90 }, -}; - -// Trickhouse -static const struct RotatingGatePuzzle sRotatingGate_TrickHousePuzzleConfig[] = { - { { 13, 3 }, GATE_SHAPE_T1, GATE_ORIENTATION_270 }, - { { 12, 6 }, GATE_SHAPE_T1, GATE_ORIENTATION_180 }, - { { 3, 6 }, GATE_SHAPE_T1, GATE_ORIENTATION_180 }, - { { 3, 9 }, GATE_SHAPE_T2, GATE_ORIENTATION_270 }, - { { 8, 8 }, GATE_SHAPE_L1, GATE_ORIENTATION_90 }, - { { 2, 12 }, GATE_SHAPE_T3, GATE_ORIENTATION_180 }, - { { 9, 13 }, GATE_SHAPE_L2, GATE_ORIENTATION_0 }, - { { 3, 14 }, GATE_SHAPE_L3, GATE_ORIENTATION_90 }, - { { 9, 15 }, GATE_SHAPE_L4, GATE_ORIENTATION_180 }, - { { 3, 18 }, GATE_SHAPE_T2, GATE_ORIENTATION_180 }, - { { 2, 19 }, GATE_SHAPE_T1, GATE_ORIENTATION_0 }, - { { 5, 21 }, GATE_SHAPE_L1, GATE_ORIENTATION_0 }, - { { 9, 19 }, GATE_SHAPE_L4, GATE_ORIENTATION_270 }, - { { 12, 20 }, GATE_SHAPE_T1, GATE_ORIENTATION_90 }, -}; - -static const u8 sRotatingGateTiles_1[] = INCBIN_U8("graphics/rotating_gates/1.4bpp"); -static const u8 sRotatingGateTiles_2[] = INCBIN_U8("graphics/rotating_gates/2.4bpp"); -static const u8 sRotatingGateTiles_3[] = INCBIN_U8("graphics/rotating_gates/3.4bpp"); -static const u8 sRotatingGateTiles_5[] = INCBIN_U8("graphics/rotating_gates/5.4bpp"); -static const u8 sRotatingGateTiles_6[] = INCBIN_U8("graphics/rotating_gates/6.4bpp"); -static const u8 sRotatingGateTiles_7[] = INCBIN_U8("graphics/rotating_gates/7.4bpp"); -static const u8 sRotatingGateTiles_0[] = INCBIN_U8("graphics/rotating_gates/0.4bpp"); -static const u8 sRotatingGateTiles_4[] = INCBIN_U8("graphics/rotating_gates/4.4bpp"); - -static const struct OamData sOamData_RotatingGateLarge = { - .y = 0, - .affineMode = ST_OAM_AFFINE_NORMAL, - .objMode = 0, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 2, - .paletteNum = 5, - .affineParam = 0, -}; - -static const struct OamData sOamData_RotatingGateRegular = { - .y = 0, - .affineMode = ST_OAM_AFFINE_NORMAL, - .objMode = 0, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 2, - .paletteNum = 5, - .affineParam = 0, -}; - -static const struct SpriteSheet sRotatingGatesGraphicsTable[] = { - { sRotatingGateTiles_0, 0x200, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L1 }, - { sRotatingGateTiles_1, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L2 }, - { sRotatingGateTiles_2, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L3 }, - { sRotatingGateTiles_3, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L4 }, - { sRotatingGateTiles_4, 0x200, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T1 }, - { sRotatingGateTiles_5, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T2 }, - { sRotatingGateTiles_6, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T3 }, - { sRotatingGateTiles_7, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T4 }, - { NULL }, -}; - -static const union AnimCmd sSpriteAnim_RotatingGateLarge[] = { - ANIMCMD_FRAME(0, 0), ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_RotatingGateRegular[] = { - ANIMCMD_FRAME(0, 0), ANIMCMD_END, -}; - -static const union AnimCmd *const sSpriteAnimTable_RotatingGateLarge[] = { - sSpriteAnim_RotatingGateLarge, -}; - -static const union AnimCmd *const sSpriteAnimTable_RotatingGateRegular[] = { - sSpriteAnim_RotatingGateRegular, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_Rotated0[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sSpriteAffineAnim_Rotated90[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sSpriteAffineAnim_Rotated180[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sSpriteAffineAnim_Rotated270[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise0to90[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise90to180[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise180to270[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise270to360[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise360to270[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise270to180[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise180to90[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise90to0[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise0to90Faster[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise90to180Faster[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise180to270Faster[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise270to360Faster[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise360to270Faster[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise270to180Faster[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise180to90Faster[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise90to0Faster[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd *const sSpriteAffineAnimTable_RotatingGate[] = { - sSpriteAffineAnim_Rotated0, - sSpriteAffineAnim_Rotated90, - sSpriteAffineAnim_Rotated180, - sSpriteAffineAnim_Rotated270, - sSpriteAffineAnim_RotatingAnticlockwise360to270, - sSpriteAffineAnim_RotatingAnticlockwise90to0, - sSpriteAffineAnim_RotatingAnticlockwise180to90, - sSpriteAffineAnim_RotatingAnticlockwise270to180, - sSpriteAffineAnim_RotatingClockwise0to90, - sSpriteAffineAnim_RotatingClockwise90to180, - sSpriteAffineAnim_RotatingClockwise180to270, - sSpriteAffineAnim_RotatingClockwise270to360, - sSpriteAffineAnim_RotatingAnticlockwise360to270Faster, - sSpriteAffineAnim_RotatingAnticlockwise90to0Faster, - sSpriteAffineAnim_RotatingAnticlockwise180to90Faster, - sSpriteAffineAnim_RotatingAnticlockwise270to180Faster, - sSpriteAffineAnim_RotatingClockwise0to90Faster, - sSpriteAffineAnim_RotatingClockwise90to180Faster, - sSpriteAffineAnim_RotatingClockwise180to270Faster, - sSpriteAffineAnim_RotatingClockwise270to360Faster, -}; - -static const struct SpriteTemplate sSpriteTemplate_RotatingGateLarge = { - .tileTag = ROTATING_GATE_TILE_TAG, - .paletteTag = 0xFFFF, - .oam = &sOamData_RotatingGateLarge, - .anims = sSpriteAnimTable_RotatingGateLarge, - .images = NULL, - .affineAnims = sSpriteAffineAnimTable_RotatingGate, - .callback = SpriteCallback_RotatingGate, -}; - -static const struct SpriteTemplate sSpriteTemplate_RotatingGateRegular = { - .tileTag = ROTATING_GATE_TILE_TAG, - .paletteTag = 0xFFFF, - .oam = &sOamData_RotatingGateRegular, - .anims = sSpriteAnimTable_RotatingGateRegular, - .images = NULL, - .affineAnims = sSpriteAffineAnimTable_RotatingGate, - .callback = SpriteCallback_RotatingGate, -}; - -// These structures describe what happens to the gate if you hit it at -// a given coordinate in a 4x4 grid when walking in the specified -// direction. Either the gate does not rotate, or it rotates in the -// given direction. This information is compared against the gate -// "arm" layout to see if there is an arm at the position in order to -// produce the final rotation. -static const u8 sRotatingGate_RotationInfoNorth[4][4] = { - { GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE }, - { GATE_ROTATION_CLOCKWISE(GATE_ARM_WEST, 1), - GATE_ROTATION_CLOCKWISE(GATE_ARM_WEST, 0), - GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_EAST, 0), - GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_EAST, 1) }, - { GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE }, - { GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE }, -}; - -static const u8 sRotatingGate_RotationInfoSouth[4][4] = { - { GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE }, - { GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE }, - { GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_WEST, 1), - GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_WEST, 0), - GATE_ROTATION_CLOCKWISE(GATE_ARM_EAST, 0), - GATE_ROTATION_CLOCKWISE(GATE_ARM_EAST, 1) }, - { GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE, GATE_ROTATION_NONE }, -}; - -static const u8 sRotatingGate_RotationInfoWest[4][4] = { - { GATE_ROTATION_NONE, - GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_NORTH, 1), - GATE_ROTATION_NONE, - GATE_ROTATION_NONE }, - { GATE_ROTATION_NONE, - GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_NORTH, 0), - GATE_ROTATION_NONE, - GATE_ROTATION_NONE }, - { GATE_ROTATION_NONE, - GATE_ROTATION_CLOCKWISE(GATE_ARM_SOUTH, 0), - GATE_ROTATION_NONE, - GATE_ROTATION_NONE }, - { GATE_ROTATION_NONE, - GATE_ROTATION_CLOCKWISE(GATE_ARM_SOUTH, 1), - GATE_ROTATION_NONE, - GATE_ROTATION_NONE }, -}; - -static const u8 sRotatingGate_RotationInfoEast[4][4] = { - { GATE_ROTATION_NONE, - GATE_ROTATION_NONE, - GATE_ROTATION_CLOCKWISE(GATE_ARM_NORTH, 1), - GATE_ROTATION_NONE }, - { GATE_ROTATION_NONE, - GATE_ROTATION_NONE, - GATE_ROTATION_CLOCKWISE(GATE_ARM_NORTH, 0), - GATE_ROTATION_NONE }, - { GATE_ROTATION_NONE, - GATE_ROTATION_NONE, - GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_SOUTH, 0), - GATE_ROTATION_NONE }, - { GATE_ROTATION_NONE, - GATE_ROTATION_NONE, - GATE_ROTATION_ANTICLOCKWISE(GATE_ARM_SOUTH, 1), - GATE_ROTATION_NONE }, -}; - -// These tables describe the relative coordinate positions the arms -// must move through in order to be rotated. -static const struct Coords8 sRotatingGate_ArmPositionsClockwiseRotation[] = { - { 0, -1 }, { 1, -2 }, { 0, 0 }, { 1, 0 }, { -1, 0 }, { -1, 1 }, { -1, -1 }, { -2, -1 }, -}; - -static const struct Coords8 sRotatingGate_ArmPositionsAntiClockwiseRotation[] = { - { -1, -1 }, { -1, -2 }, { 0, -1 }, { 1, -1 }, { 0, 0 }, { 0, 1 }, { -1, 0 }, { -2, 0 }, -}; - -// Describes where the gates "arms" are in the order north, east, south, west. -// These are adjusted using the current orientation to perform collision checking -static const u8 sRotatingGate_ArmLayout[][GATE_ARM_WEST + 1][GATE_ARM_MAX_LENGTH] = { - // L-shape gates - { - { 1, 0 }, { 1, 0 }, { 0, 0 }, { 0, 0 }, - }, - { - { 1, 1 }, { 1, 0 }, { 0, 0 }, { 0, 0 }, - }, - { - { 1, 0 }, { 1, 1 }, { 0, 0 }, { 0, 0 }, - }, - { - { 1, 1 }, { 1, 1 }, { 0, 0 }, { 0, 0 }, - }, - - // T-shape gates - { - { 1, 0 }, { 1, 0 }, { 1, 0 }, { 0, 0 }, - }, - { - { 1, 1 }, { 1, 0 }, { 1, 0 }, { 0, 0 }, - }, - { - { 1, 0 }, { 1, 1 }, { 1, 0 }, { 0, 0 }, - }, - { - { 1, 0 }, { 1, 0 }, { 1, 1 }, { 0, 0 }, - }, - - // Unused T-shape gates - // These have 2-3 long arms and cannot actually be used anywhere - // since configuration for them is missing from the other tables. - { - { 1, 1 }, { 1, 1 }, { 1, 0 }, { 0, 0 }, - }, - { - { 1, 1 }, { 1, 0 }, { 1, 1 }, { 0, 0 }, - }, - { - { 1, 0 }, { 1, 1 }, { 1, 1 }, { 0, 0 }, - }, - { - { 1, 1 }, { 1, 1 }, { 1, 1 }, { 0, 0 }, - }, -}; - -static EWRAM_DATA u8 gRotatingGate_GateSpriteIds[ROTATING_GATE_PUZZLE_MAX] = {0}; -static EWRAM_DATA const struct RotatingGatePuzzle *gRotatingGate_PuzzleConfig = NULL; -static EWRAM_DATA u8 gRotatingGate_PuzzleCount = 0; - -static int GetCurrentMapRotatingGatePuzzleType(void) -{ - if (gSaveBlock1.location.mapGroup == MAP_GROUP_FORTREE_CITY_GYM && - gSaveBlock1.location.mapNum == MAP_ID_FORTREE_CITY_GYM) - { - return PUZZLE_FORTREE_CITY_GYM; - } - - if (gSaveBlock1.location.mapGroup == MAP_GROUP_ROUTE110_TRICK_HOUSE_PUZZLE6 && - gSaveBlock1.location.mapNum == MAP_ID_ROUTE110_TRICK_HOUSE_PUZZLE6) - { - return PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6; - } - - return PUZZLE_NONE; -} - -static void RotatingGate_ResetAllGateOrientations(void) -{ - int i; - u8 *ptr; - - ptr = (u8 *)GetVarPointer(0x4000); - - for (i = 0; i < gRotatingGate_PuzzleCount; i++) - { - ptr[i] = gRotatingGate_PuzzleConfig[i].orientation; - } -} - -static int RotatingGate_GetGateOrientation(u8 gateId) -{ - return ((u8 *)GetVarPointer(0x4000))[gateId]; -} - -static void RotatingGate_SetGateOrientation(u8 gateId, u8 orientation) -{ - ((u8 *)GetVarPointer(0x4000))[gateId] = orientation; -} - -static void RotatingGate_RotateInDirection(u8 gateId, u32 rotationDirection) -{ - u8 orientation = RotatingGate_GetGateOrientation(gateId); - - if (rotationDirection == ROTATE_ANTICLOCKWISE) - { - if (orientation) - { - orientation--; - } - else - { - orientation = GATE_ORIENTATION_270; - } - } - else - { - orientation = ++orientation % GATE_ORIENTATION_MAX; - } - - RotatingGate_SetGateOrientation(gateId, orientation); -} - -static void RotatingGate_LoadPuzzleConfig(void) -{ - int puzzleType = GetCurrentMapRotatingGatePuzzleType(); - u32 i; - - switch (puzzleType) - { - case PUZZLE_FORTREE_CITY_GYM: - gRotatingGate_PuzzleConfig = sRotatingGate_FortreePuzzleConfig; - gRotatingGate_PuzzleCount = - sizeof(sRotatingGate_FortreePuzzleConfig) / sizeof(struct RotatingGatePuzzle); - break; - case PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6: - gRotatingGate_PuzzleConfig = sRotatingGate_TrickHousePuzzleConfig; - gRotatingGate_PuzzleCount = - sizeof(sRotatingGate_TrickHousePuzzleConfig) / sizeof(struct RotatingGatePuzzle); - break; - case PUZZLE_NONE: - default: - return; - } - - for (i = 0; i < ROTATING_GATE_PUZZLE_MAX; i++) - { - gRotatingGate_GateSpriteIds[i] = MAX_SPRITES; - } -} - -static void RotatingGate_CreateGatesWithinViewport(s16 deltaX, s16 deltaY) -{ - u8 i; - - // Calculate the bounding box of the camera - // Same as RotatingGate_DestroyGatesOutsideViewport - s16 x = gSaveBlock1.pos.x - 2; - s16 x2 = gSaveBlock1.pos.x + 0x11; - s16 y = gSaveBlock1.pos.y - 2; - s16 y2 = gSaveBlock1.pos.y + 0xe; - - s16 x3, y3; - - for (i = 0; i < gRotatingGate_PuzzleCount; i++) - { - x3 = gRotatingGate_PuzzleConfig[i].pos.x + 7; - y3 = gRotatingGate_PuzzleConfig[i].pos.y + 7; - - if (y <= y3 && y2 >= y3 && x <= x3 && x2 >= x3 && - gRotatingGate_GateSpriteIds[i] == MAX_SPRITES) - { - gRotatingGate_GateSpriteIds[i] = RotatingGate_CreateGate(i, deltaX, deltaY); - } - } -} - -static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY) -{ - struct Sprite *sprite; - struct SpriteTemplate template; - const struct RotatingGatePuzzle *gate; - u8 spriteId; - s16 x, y; - - gate = &gRotatingGate_PuzzleConfig[gateId]; - - if (gate->shape == GATE_SHAPE_L1 || gate->shape == GATE_SHAPE_T1) - { - template = sSpriteTemplate_RotatingGateRegular; - } - else - { - template = sSpriteTemplate_RotatingGateLarge; - } - - template.tileTag = gate->shape + ROTATING_GATE_TILE_TAG; - - spriteId = CreateSprite(&template, 0, 0, 0x94); - if (spriteId == MAX_SPRITES) - { - return MAX_SPRITES; - } - - x = gate->pos.x + 7; - y = gate->pos.y + 7; - - sprite = &gSprites[spriteId]; - sprite->data0 = gateId; - sprite->coordOffsetEnabled = 1; - - sub_8060388(x + deltaX, y + deltaY, &sprite->pos1.x, &sprite->pos1.y); - RotatingGate_HideGatesOutsideViewport(sprite); - StartSpriteAffineAnim(sprite, RotatingGate_GetGateOrientation(gateId)); - - return spriteId; -} - -static void SpriteCallback_RotatingGate(struct Sprite *sprite) -{ - u8 rotationDirection; - u8 orientation; - u8 affineAnimation; - - rotationDirection = sprite->data1; - orientation = sprite->data2; - - RotatingGate_HideGatesOutsideViewport(sprite); - - if (rotationDirection == ROTATE_ANTICLOCKWISE) - { - affineAnimation = orientation + 4; - - if (GetPlayerSpeed() != 1) - affineAnimation += 8; - - PlaySE(SE_HI_TURUN); - StartSpriteAffineAnim(sprite, affineAnimation); - } - else if (rotationDirection == ROTATE_CLOCKWISE) - { - affineAnimation = orientation + 8; - - if (GetPlayerSpeed() != 1) - affineAnimation += 8; - - PlaySE(SE_HI_TURUN); - StartSpriteAffineAnim(sprite, affineAnimation); - } - - sprite->data1 = ROTATE_NONE; -} - -static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite) -{ - u16 x; - s16 x2; - u16 y; - s16 y2; - - sprite->invisible = 0; - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - - x2 = x + 0x40; // Dimensions of the rotating gate - y2 = y + 0x40; - - if ((s16)x > DISPLAY_WIDTH + 0x10 - 1 || x2 < -0x10) - { - sprite->invisible = 1; - } - - if ((s16)y > DISPLAY_HEIGHT + 0x10 - 1 || y2 < -0x10) - { - sprite->invisible = 1; - } -} - -static void LoadRotatingGatePics(void) -{ - LoadSpriteSheets(sRotatingGatesGraphicsTable); -} - -static void RotatingGate_DestroyGatesOutsideViewport(void) -{ - s16 x; - s16 x2; - s16 y; - s16 y2; - s16 xGate; - s16 yGate; - int i; - struct Sprite *sprite; - - // Same as RotatingGate_CreateGatesWithinViewport - x = gSaveBlock1.pos.x - 2; - x2 = gSaveBlock1.pos.x + 0x11; - y = gSaveBlock1.pos.y - 2; - y2 = gSaveBlock1.pos.y + 0xe; - - for (i = 0; i < gRotatingGate_PuzzleCount; i++) - { - xGate = gRotatingGate_PuzzleConfig[i].pos.x + 7; - yGate = gRotatingGate_PuzzleConfig[i].pos.y + 7; - - if (gRotatingGate_GateSpriteIds[i] == MAX_SPRITES) - continue; - - if (xGate < x || xGate > x2 || yGate < y || yGate > y2) - { - sprite = &gSprites[gRotatingGate_GateSpriteIds[i]]; - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - gRotatingGate_GateSpriteIds[i] = MAX_SPRITES; - } - } -} - -#ifdef NONMATCHING -static int RotatingGate_CanRotate(u8 gateId, int rotationDirection) -{ - const struct Coords8 *armPos; - u8 orientation; - s16 x; - s16 y; - int shape; - int i; - int j; - int armOrientation; - const u8 *gateArmCollisionData; - u8 armIndex; - - if (rotationDirection == ROTATE_ANTICLOCKWISE) - armPos = sRotatingGate_ArmPositionsAntiClockwiseRotation; - else if (rotationDirection == ROTATE_CLOCKWISE) - armPos = sRotatingGate_ArmPositionsClockwiseRotation; - else - return 0; - - orientation = RotatingGate_GetGateOrientation(gateId); - - shape = gRotatingGate_PuzzleConfig[gateId].shape; - x = gRotatingGate_PuzzleConfig[gateId].pos.x + 7; - y = gRotatingGate_PuzzleConfig[gateId].pos.y + 7; - - // Loop through the gate's "arms" clockwise (north, south, east, west) - for (i = GATE_ARM_NORTH; i <= GATE_ARM_WEST; i++) - { - armOrientation = orientation + i; - gateArmCollisionData = sRotatingGate_ArmLayout[shape][i]; - - // Ensure that no part of the arm collides with the map - for (j = 0; j < GATE_ARM_MAX_LENGTH; j++) - { - armIndex = 2 * (armOrientation % 4) + j; - - if (*gateArmCollisionData) - { - if (MapGridIsImpassableAt( - armPos[armIndex].deltaX + x, armPos[armIndex].deltaY + y) == 1) - return 0; - } - gateArmCollisionData++; - } - } - - return 1; -} -#else -__attribute__((naked)) static int RotatingGate_CanRotate(u8 a, int puzzleType) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0xC\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r1, 0x1\n\ - bne _080C7EAC\n\ - ldr r0, _080C7EA8 @ =sRotatingGate_ArmPositionsAntiClockwiseRotation\n\ - mov r10, r0\n\ - b _080C7EB8\n\ - .align 2, 0\n\ -_080C7EA8: .4byte sRotatingGate_ArmPositionsAntiClockwiseRotation\n\ -_080C7EAC:\n\ - cmp r1, 0x2\n\ - beq _080C7EB4\n\ -_080C7EB0:\n\ - movs r0, 0\n\ - b _080C7F48\n\ -_080C7EB4:\n\ - ldr r1, _080C7F58 @ =sRotatingGate_ArmPositionsClockwiseRotation\n\ - mov r10, r1\n\ -_080C7EB8:\n\ - adds r0, r4, 0\n\ - bl RotatingGate_GetGateOrientation\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp]\n\ - ldr r0, _080C7F5C @ =gRotatingGate_PuzzleConfig\n\ - ldr r1, [r0]\n\ - lsls r0, r4, 3\n\ - adds r0, r1\n\ - ldrb r2, [r0, 0x4]\n\ - ldrh r1, [r0]\n\ - adds r1, 0x7\n\ - ldrh r0, [r0, 0x2]\n\ - adds r0, 0x7\n\ - movs r3, 0\n\ - lsls r2, 3\n\ - str r2, [sp, 0x4]\n\ - lsls r1, 16\n\ - asrs r1, 16\n\ - mov r9, r1\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - mov r8, r0\n\ -_080C7EE8:\n\ - movs r6, 0\n\ - ldr r2, [sp]\n\ - adds r7, r2, r3\n\ - lsls r0, r3, 1\n\ - adds r5, r7, 0\n\ - ldr r1, [sp, 0x4]\n\ - adds r0, r1\n\ - ldr r2, _080C7F60 @ =sRotatingGate_ArmLayout\n\ - adds r4, r0, r2\n\ -_080C7EFA:\n\ - adds r0, r5, 0\n\ - cmp r5, 0\n\ - bge _080C7F02\n\ - adds r0, r7, 0x3\n\ -_080C7F02:\n\ - asrs r0, 2\n\ - lsls r0, 2\n\ - subs r0, r5, r0\n\ - lsls r0, 1\n\ - adds r0, r6\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - ldrb r0, [r4]\n\ - cmp r0, 0\n\ - beq _080C7F38\n\ - lsls r1, 2\n\ - add r1, r10\n\ - movs r0, 0\n\ - ldrsb r0, [r1, r0]\n\ - add r0, r9\n\ - ldrb r1, [r1, 0x1]\n\ - lsls r1, 24\n\ - asrs r1, 24\n\ - add r1, r8\n\ - str r3, [sp, 0x8]\n\ - bl MapGridIsImpassableAt\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldr r3, [sp, 0x8]\n\ - cmp r0, 0x1\n\ - beq _080C7EB0\n\ -_080C7F38:\n\ - adds r4, 0x1\n\ - adds r6, 0x1\n\ - cmp r6, 0x1\n\ - ble _080C7EFA\n\ - adds r3, 0x1\n\ - cmp r3, 0x3\n\ - ble _080C7EE8\n\ - movs r0, 0x1\n\ -_080C7F48:\n\ - add sp, 0xC\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080C7F58: .4byte sRotatingGate_ArmPositionsClockwiseRotation\n\ -_080C7F5C: .4byte gRotatingGate_PuzzleConfig\n\ -_080C7F60: .4byte sRotatingGate_ArmLayout\n\ -.syntax divided\n"); -} -#endif - -#ifdef NONMATCHING -static int RotatingGate_HasArm(u8 gateId, u8 armInfo) -{ - int isLongArm; - s8 armOrientation; - int arm; - int shape; - - arm = armInfo >> 1; - isLongArm = armInfo & 1; - - armOrientation = (arm - RotatingGate_GetGateOrientation(gateId) + 4) % 4; - shape = gRotatingGate_PuzzleConfig[gateId].shape; - return sRotatingGate_ArmLayout[shape][armOrientation][isLongArm]; -} -#else -__attribute__((naked)) static int RotatingGate_HasArm(u8 a, u8 b) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - adds r4, r1, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - adds r6, r0, 0\n\ - lsls r4, 24\n\ - lsrs r5, r4, 24\n\ - lsrs r4, 25\n\ - movs r0, 0x1\n\ - ands r5, r0\n\ - adds r0, r6, 0\n\ - bl RotatingGate_GetGateOrientation\n\ - subs r4, r0\n\ - adds r1, r4, 0x4\n\ - adds r0, r1, 0\n\ - cmp r1, 0\n\ - bge _080C7F8A\n\ - adds r0, r4, 0x7\n\ -_080C7F8A:\n\ - asrs r0, 2\n\ - lsls r0, 2\n\ - subs r0, r1, r0\n\ - ldr r1, _080C7FB0 @ =gRotatingGate_PuzzleConfig\n\ - ldr r2, [r1]\n\ - lsls r1, r6, 3\n\ - adds r1, r2\n\ - ldrb r1, [r1, 0x4]\n\ - ldr r2, _080C7FB4 @ =sRotatingGate_ArmLayout\n\ - lsls r0, 24\n\ - asrs r0, 23\n\ - adds r0, r5\n\ - lsls r1, 3\n\ - adds r0, r1\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - pop {r4-r6}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080C7FB0: .4byte gRotatingGate_PuzzleConfig\n\ -_080C7FB4: .4byte sRotatingGate_ArmLayout\n\ -.syntax divided\n"); -} -#endif - -static void RotatingGate_TriggerRotationAnimation(u8 gateId, int rotationDirection) -{ - struct Sprite *sprite; - - if (gRotatingGate_GateSpriteIds[gateId] != MAX_SPRITES) - { - sprite = &gSprites[gRotatingGate_GateSpriteIds[gateId]]; - sprite->data1 = rotationDirection; - sprite->data2 = RotatingGate_GetGateOrientation(gateId); - } -} - -#ifdef NONMATCHING -static u8 RotatingGate_GetRotationInfo(u8 direction, s16 x, s16 y) -{ - register const u8(*ptr)[][4] asm("r3"); - - if (direction == DIR_NORTH) - ptr = &sRotatingGate_RotationInfoNorth; - else if (direction == DIR_SOUTH) - ptr = &sRotatingGate_RotationInfoSouth; - else if (direction == DIR_WEST) - ptr = &sRotatingGate_RotationInfoWest; - else if (direction == DIR_EAST) - ptr = &sRotatingGate_RotationInfoEast; - else - return GATE_ROTATION_NONE; - - return (*ptr)[y][x]; -} -#else -__attribute__((naked)) static u8 RotatingGate_GetRotationInfo(u8 a, s16 b, s16 c) -{ - asm(".syntax unified\n\ - push {lr}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - adds r3, r0, 0\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - cmp r0, 0x2\n\ - bne _080C8008\n\ - ldr r3, _080C8004 @ =sRotatingGate_RotationInfoNorth\n\ - b _080C802A\n\ - .align 2, 0\n\ -_080C8004: .4byte sRotatingGate_RotationInfoNorth\n\ -_080C8008:\n\ - cmp r0, 0x1\n\ - bne _080C8014\n\ - ldr r3, _080C8010 @ =sRotatingGate_RotationInfoSouth\n\ - b _080C802A\n\ - .align 2, 0\n\ -_080C8010: .4byte sRotatingGate_RotationInfoSouth\n\ -_080C8014:\n\ - cmp r0, 0x3\n\ - bne _080C8020\n\ - ldr r3, _080C801C @ =sRotatingGate_RotationInfoWest\n\ - b _080C802A\n\ - .align 2, 0\n\ -_080C801C: .4byte sRotatingGate_RotationInfoWest\n\ -_080C8020:\n\ - cmp r3, 0x4\n\ - beq _080C8028\n\ - movs r0, 0xFF\n\ - b _080C8038\n\ -_080C8028:\n\ - ldr r3, _080C803C @ =sRotatingGate_RotationInfoEast\n\ -_080C802A:\n\ - lsls r0, r2, 16\n\ - lsls r1, 16\n\ - asrs r1, 16\n\ - asrs r0, 14\n\ - adds r0, r1\n\ - adds r0, r3, r0\n\ - ldrb r0, [r0]\n\ -_080C8038:\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080C803C: .4byte sRotatingGate_RotationInfoEast\n\ -.syntax divided\n"); -} -#endif - -void RotatingGate_InitPuzzle(void) -{ - if (GetCurrentMapRotatingGatePuzzleType()) - { - RotatingGate_LoadPuzzleConfig(); - RotatingGate_ResetAllGateOrientations(); - } -} - -void RotatingGatePuzzleCameraUpdate(u16 deltaX, u16 deltaY) -{ - if (GetCurrentMapRotatingGatePuzzleType()) - { - RotatingGate_CreateGatesWithinViewport(deltaX, deltaY); - RotatingGate_DestroyGatesOutsideViewport(); - } -} - -void RotatingGate_InitPuzzleAndGraphics(void) -{ - if (GetCurrentMapRotatingGatePuzzleType()) - { - LoadRotatingGatePics(); - RotatingGate_LoadPuzzleConfig(); - RotatingGate_CreateGatesWithinViewport(0, 0); - } -} - -bool8 CheckForRotatingGatePuzzleCollision(u8 direction, s16 x, s16 y) -{ - int i; - s16 gateX; - s16 gateY; - register u32 rotationInfo asm("r0"); - int rotationDirection; - int armInfo; - s16 centerX; - s16 centerY; - - if (!GetCurrentMapRotatingGatePuzzleType()) - { - return 0; - } - - for (i = 0; i < gRotatingGate_PuzzleCount; i++) - { - gateX = gRotatingGate_PuzzleConfig[i].pos.x + 7; - gateY = gRotatingGate_PuzzleConfig[i].pos.y + 7; - - if (gateX - 2 <= x && x <= gateX + 1 && gateY - 2 <= y && y <= gateY + 1) - { - centerX = x - gateX + 2; - centerY = y - gateY + 2; - rotationInfo = RotatingGate_GetRotationInfo(direction, centerX, centerY); - - if (rotationInfo != GATE_ROTATION_NONE) - { - rotationDirection = rotationInfo >> 4; - armInfo = rotationInfo & 0xF; - - asm("" ::"r"(armInfo)); - - if (RotatingGate_HasArm(i, armInfo)) - { - if (RotatingGate_CanRotate(i, rotationDirection)) - { - RotatingGate_TriggerRotationAnimation(i, rotationDirection); - RotatingGate_RotateInDirection(i, rotationDirection); - return 0; - } - - return 1; - } - } - } - } - - return 0; -} diff --git a/src/rtc.c b/src/rtc.c deleted file mode 100644 index d73f943d2..000000000 --- a/src/rtc.c +++ /dev/null @@ -1,349 +0,0 @@ -#include "global.h" -#include "rtc.h" -#include "string_util.h" -#include "text.h" - -static u16 sErrorStatus; -static struct SiiRtcInfo sRtc; -static u8 sProbeResult; -static u16 sSavedIme; - -struct Time gLocalTime; - -static const struct SiiRtcInfo sRtcDummy = {0, MONTH_JAN, 1}; // 2000 Jan 1 - -static const s32 sNumDaysInMonths[12] = -{ - 31, - 28, - 31, - 30, - 31, - 30, - 31, - 31, - 30, - 31, - 30, - 31, -}; - -void RtcDisableInterrupts() -{ - sSavedIme = REG_IME; - REG_IME = 0; -} - -void RtcRestoreInterrupts() -{ - REG_IME = sSavedIme; -} - -u32 ConvertBcdToBinary(u8 bcd) -{ - if (bcd > 0x9F) - return 0xFF; - - if ((bcd & 0xF) <= 9) - return (10 * ((bcd >> 4) & 0xF)) + (bcd & 0xF); - else - return 0xFF; -} - -bool8 IsLeapYear(u8 year) -{ - if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) - return TRUE; - - return FALSE; -} - -u16 ConvertDateToDayCount(u8 year, u8 month, u8 day) -{ - s32 i; - u16 dayCount = 0; - -#ifndef BUGFIX_BERRY - // The berry glitch was caused by not adding days for the year 2000. - for (i = year - 1; i > 0; i--) - { - dayCount += 365; - - if (IsLeapYear(i) == TRUE) - dayCount++; - } -#else - // The fix was to use "i >= 0" as the condition instead of "i > 0". - for (i = year - 1; i >= 0; i--) - { - dayCount += 365; - - if (IsLeapYear(i) == TRUE) - dayCount++; - } -#endif // BUGFIX_BERRY - - for (i = 0; i < month - 1; i++) - dayCount += sNumDaysInMonths[i]; - - if (month > MONTH_FEB && IsLeapYear(year) == TRUE) - dayCount++; - - dayCount += day; - - return dayCount; -} - -u16 RtcGetDayCount(struct SiiRtcInfo *rtc) -{ - u8 year = ConvertBcdToBinary(rtc->year); - u8 month = ConvertBcdToBinary(rtc->month); - u8 day = ConvertBcdToBinary(rtc->day); - return ConvertDateToDayCount(year, month, day); -} - -void RtcInit() -{ - sErrorStatus = 0; - - RtcDisableInterrupts(); - SiiRtcUnprotect(); - sProbeResult = SiiRtcProbe(); - RtcRestoreInterrupts(); - - if (!(sProbeResult & 0xF)) - { - sErrorStatus = RTC_INIT_ERROR; - return; - } - - if (sProbeResult & 0xF0) - sErrorStatus = RTC_INIT_WARNING; - else - sErrorStatus = 0; - - RtcGetRawInfo(&sRtc); - sErrorStatus = RtcCheckInfo(&sRtc); -} - -u16 RtcGetErrorStatus() -{ - return sErrorStatus; -} - -void RtcGetInfo(struct SiiRtcInfo *rtc) -{ - if (sErrorStatus & RTC_ERR_FLAG_MASK) - *rtc = sRtcDummy; - else - RtcGetRawInfo(rtc); -} - -void RtcGetDateTime(struct SiiRtcInfo *rtc) -{ - RtcDisableInterrupts(); - SiiRtcGetDateTime(rtc); - RtcRestoreInterrupts(); -} - -void RtcGetStatus(struct SiiRtcInfo *rtc) -{ - RtcDisableInterrupts(); - SiiRtcGetStatus(rtc); - RtcRestoreInterrupts(); -} - -void RtcGetRawInfo(struct SiiRtcInfo *rtc) -{ - RtcGetStatus(rtc); - RtcGetDateTime(rtc); -} - -u16 RtcCheckInfo(struct SiiRtcInfo *rtc) -{ - u16 errorFlags = 0; - s32 year; - s32 month; - s32 value; - - if (rtc->status & SIIRTCINFO_POWER) - errorFlags |= RTC_ERR_POWER_FAILURE; - - if (!(rtc->status & SIIRTCINFO_24HOUR)) - errorFlags |= RTC_ERR_12HOUR_CLOCK; - - year = ConvertBcdToBinary(rtc->year); - - if (year == 0xFF) - errorFlags |= RTC_ERR_INVALID_YEAR; - - month = ConvertBcdToBinary(rtc->month); - - if (month == 0xFF || month == 0 || month > 12) - errorFlags |= RTC_ERR_INVALID_MONTH; - - value = ConvertBcdToBinary(rtc->day); - - if (value == 0xFF) - errorFlags |= RTC_ERR_INVALID_DAY; - - if (month == MONTH_FEB) - { - if (value > IsLeapYear(year) + sNumDaysInMonths[month - 1]) - errorFlags |= RTC_ERR_INVALID_DAY; - } - else - { - if (value > sNumDaysInMonths[month - 1]) - errorFlags |= RTC_ERR_INVALID_DAY; - } - - value = ConvertBcdToBinary(rtc->hour); - - if (value > 24) - errorFlags |= RTC_ERR_INVALID_HOUR; - - value = ConvertBcdToBinary(rtc->minute); - - if (value > 60) - errorFlags |= RTC_ERR_INVALID_MINUTE; - - value = ConvertBcdToBinary(rtc->second); - - if (value > 60) - errorFlags |= RTC_ERR_INVALID_SECOND; - - return errorFlags; -} - -void RtcReset() -{ - RtcDisableInterrupts(); - SiiRtcReset(); - RtcRestoreInterrupts(); -} - -void FormatDecimalTime(u8 *dest, s32 hour, s32 minute, s32 second) -{ - dest = ConvertIntToDecimalStringN(dest, hour, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest++ = CHAR_COLON; - dest = ConvertIntToDecimalStringN(dest, minute, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest++ = CHAR_COLON; - dest = ConvertIntToDecimalStringN(dest, second, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest = EOS; -} - -void FormatHexTime(u8 *dest, s32 hour, s32 minute, s32 second) -{ - dest = ConvertIntToHexStringN(dest, hour, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest++ = CHAR_COLON; - dest = ConvertIntToHexStringN(dest, minute, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest++ = CHAR_COLON; - dest = ConvertIntToHexStringN(dest, second, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest = EOS; -} - -void FormatHexRtcTime(u8 *dest) -{ - FormatHexTime(dest, sRtc.hour, sRtc.minute, sRtc.second); -} - -void FormatDecimalDate(u8 *dest, s32 year, s32 month, s32 day) -{ - dest = ConvertIntToDecimalStringN(dest, year, STR_CONV_MODE_LEADING_ZEROS, 4); - *dest++ = CHAR_HYPHEN; - dest = ConvertIntToDecimalStringN(dest, month, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest++ = CHAR_HYPHEN; - dest = ConvertIntToDecimalStringN(dest, day, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest = EOS; -} - -void FormatHexDate(u8 *dest, s32 year, s32 month, s32 day) -{ - dest = ConvertIntToHexStringN(dest, year, STR_CONV_MODE_LEADING_ZEROS, 4); - *dest++ = CHAR_HYPHEN; - dest = ConvertIntToHexStringN(dest, month, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest++ = CHAR_HYPHEN; - dest = ConvertIntToHexStringN(dest, day, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest = EOS; -} - -void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct Time *t) -{ - u16 days = RtcGetDayCount(rtc); - result->seconds = ConvertBcdToBinary(rtc->second) - t->seconds; - result->minutes = ConvertBcdToBinary(rtc->minute) - t->minutes; - result->hours = ConvertBcdToBinary(rtc->hour) - t->hours; - result->days = days - t->days; - - if (result->seconds < 0) - { - result->seconds += 60; - --result->minutes; - } - - if (result->minutes < 0) - { - result->minutes += 60; - --result->hours; - } - - if (result->hours < 0) - { - result->hours += 24; - --result->days; - } -} - -void RtcCalcLocalTime() -{ - RtcGetInfo(&sRtc); - RtcCalcTimeDifference(&sRtc, &gLocalTime, &gSaveBlock2.localTimeOffset); -} - -void RtcInitLocalTimeOffset(s32 hour, s32 minute) -{ - RtcCalcLocalTimeOffset(0, hour, minute, 0); -} - -void RtcCalcLocalTimeOffset(s32 days, s32 hours, s32 minutes, s32 seconds) -{ - gLocalTime.days = days; - gLocalTime.hours = hours; - gLocalTime.minutes = minutes; - gLocalTime.seconds = seconds; - RtcGetInfo(&sRtc); - RtcCalcTimeDifference(&sRtc, &gSaveBlock2.localTimeOffset, &gLocalTime); -} - -void CalcTimeDifference(struct Time *result, struct Time *t1, struct Time *t2) -{ - result->seconds = t2->seconds - t1->seconds; - result->minutes = t2->minutes - t1->minutes; - result->hours = t2->hours - t1->hours; - result->days = t2->days - t1->days; - - if (result->seconds < 0) - { - result->seconds += 60; - --result->minutes; - } - - if (result->minutes < 0) - { - result->minutes += 60; - --result->hours; - } - - if (result->hours < 0) - { - result->hours += 24; - --result->days; - } -} - -u32 RtcGetMinuteCount() -{ - RtcGetInfo(&sRtc); - return (24 * 60) * RtcGetDayCount(&sRtc) + 60 * sRtc.hour + sRtc.minute; -} diff --git a/src/safari_zone.c b/src/safari_zone.c deleted file mode 100644 index a47c8e951..000000000 --- a/src/safari_zone.c +++ /dev/null @@ -1,253 +0,0 @@ -#include "global.h" -#include "safari_zone.h" -#include "event_data.h" -#include "field_fadetransition.h" -#include "field_player_avatar.h" -#include "main.h" -#include "rom4.h" -#include "script.h" -#include "string_util.h" -#include "text.h" - -struct PokeblockFeeder -{ - /*0x00*/ s16 x; - /*0x02*/ s16 y; - /*0x04*/ s8 mapNum; - /*0x05*/ u8 stepCounter; - /*0x08*/ struct Pokeblock pokeblock; -}; - -#define NUM_POKEBLOCK_FEEDERS 10 - -static void ClearAllPokeblockFeeders(void); -static void DecrementFeederStepCounters(void); - -extern u8 gBattleOutcome; - -EWRAM_DATA u8 gNumSafariBalls = 0; -EWRAM_DATA static u16 gSafariZoneStepCounter = 0; -EWRAM_DATA static struct PokeblockFeeder gPokeblockFeeders[NUM_POKEBLOCK_FEEDERS] = {0}; - -extern void (*gFieldCallback)(void); - -extern u8 gUnknown_081C340A; -extern u8 gUnknown_081C342D; -extern u8 gUnknown_081C3448; -extern u8 gUnknown_081C3459; -extern u8 *gPokeblockNames[]; - -extern u16 gScriptResult; - -bool32 GetSafariZoneFlag(void) -{ - return FlagGet(SYS_SAFARI_MODE); -} - -void SetSafariZoneFlag(void) -{ - FlagSet(SYS_SAFARI_MODE); -} - -void ResetSafariZoneFlag(void) -{ - FlagReset(SYS_SAFARI_MODE); -} - -void EnterSafariMode(void) -{ - IncrementGameStat(0x11); - SetSafariZoneFlag(); - ClearAllPokeblockFeeders(); - gNumSafariBalls = 30; - gSafariZoneStepCounter = 500; -} - -void ExitSafariMode(void) -{ - ResetSafariZoneFlag(); - ClearAllPokeblockFeeders(); - gNumSafariBalls = 0; - gSafariZoneStepCounter = 0; -} - -bool8 SafariZoneTakeStep(void) -{ - if (GetSafariZoneFlag() == FALSE) - { - return FALSE; - } - - DecrementFeederStepCounters(); - gSafariZoneStepCounter--; - if (gSafariZoneStepCounter == 0) - { - ScriptContext1_SetupScript(&gUnknown_081C3448); - return TRUE; - } - return FALSE; -} - -void SafariZoneRetirePrompt(void) -{ - ScriptContext1_SetupScript(&gUnknown_081C342D); -} - -void sub_80C824C(void) -{ - if (gNumSafariBalls != 0) - { - SetMainCallback2(c2_exit_to_overworld_2_switch); - } - else if (gBattleOutcome == 8) - { - ScriptContext2_RunNewScript(&gUnknown_081C340A); - warp_in(); - gFieldCallback = sub_8080E44; - SetMainCallback2(CB2_LoadMap); - } - else if (gBattleOutcome == 7) - { - ScriptContext1_SetupScript(&gUnknown_081C3459); - ScriptContext1_Stop(); - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); - } -} - -static void ClearPokeblockFeeder(u8 index) -{ - memset(&gPokeblockFeeders[index], 0, sizeof(struct PokeblockFeeder)); -} - -static void ClearAllPokeblockFeeders(void) -{ - memset(gPokeblockFeeders, 0, sizeof(gPokeblockFeeders)); -} - -void SafariZoneGetPokeblockNameInFeeder(void) -{ - s16 x, y; - u16 i; - - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - - for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) - { - if (gSaveBlock1.location.mapNum == gPokeblockFeeders[i].mapNum - && gPokeblockFeeders[i].x == x - && gPokeblockFeeders[i].y == y) - { - gScriptResult = i; - StringCopy(gStringVar1, gPokeblockNames[gPokeblockFeeders[i].pokeblock.color]); - return; - } - } - - gScriptResult = -1; -} - -static void GetPokeblockFeederWithinRange(void) -{ - s16 x, y; - u16 i; - - PlayerGetDestCoords(&x, &y); - - for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) - { - if (gSaveBlock1.location.mapNum == gPokeblockFeeders[i].mapNum) - { - //Get absolute value of x and y distance from Pokeblock feeder on current map - x -= gPokeblockFeeders[i].x; - y -= gPokeblockFeeders[i].y; - if (x < 0) - x *= -1; - if (y < 0) - y *= -1; - if ((x + y) <= 5) - { - gScriptResult = i; - return; - } - } - } - - gScriptResult = -1; -} - -struct Pokeblock *unref_sub_80C8418(void) -{ - SafariZoneGetPokeblockNameInFeeder(); - - if (gScriptResult == 0xFFFF) - return NULL; - else - return &gPokeblockFeeders[gScriptResult].pokeblock; -} - - -struct Pokeblock *SafariZoneGetActivePokeblock(void) -{ - GetPokeblockFeederWithinRange(); - - if (gScriptResult == 0xFFFF) - return NULL; - else - return &gPokeblockFeeders[gScriptResult].pokeblock; -} - - -void SafariZoneActivatePokeblockFeeder(u8 pokeblock_index) -{ - s16 x, y; - u8 i; - - for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) - { - //Find free entry in gPokeblockFeeders - if (gPokeblockFeeders[i].mapNum == 0 - && gPokeblockFeeders[i].x == 0 - && gPokeblockFeeders[i].y == 0) - { - //Initialize Pokeblock feeder - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - gPokeblockFeeders[i].mapNum = gSaveBlock1.location.mapNum; - gPokeblockFeeders[i].pokeblock = gSaveBlock1.pokeblocks[pokeblock_index]; - gPokeblockFeeders[i].stepCounter = 100; - gPokeblockFeeders[i].x = x; - gPokeblockFeeders[i].y = y; - break; - } - } -} - -static void DecrementFeederStepCounters(void) -{ - u8 i; - - for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) - { - if (gPokeblockFeeders[i].stepCounter != 0) - { - gPokeblockFeeders[i].stepCounter--; - if (gPokeblockFeeders[i].stepCounter == 0) - ClearPokeblockFeeder(i); - } - } -} - -bool8 unref_sub_80C853C(void) -{ - SafariZoneGetPokeblockNameInFeeder(); - - if (gScriptResult == 0xFFFF) - { - return FALSE; - } - - ConvertIntToDecimalStringN(gStringVar2, - gPokeblockFeeders[gScriptResult].stepCounter, - STR_CONV_MODE_LEADING_ZEROS, 3); - - return TRUE; -} diff --git a/src/save.c b/src/save.c deleted file mode 100644 index adf39268e..000000000 --- a/src/save.c +++ /dev/null @@ -1,797 +0,0 @@ -#include "global.h" -#include "gba/gba.h" -#include "gba/flash_internal.h" -#include "save.h" -#include "load_save.h" -#include "rom4.h" -#include "save_failed_screen.h" - -#define GETVALIDSTATUSBITFIELD ((1 << ARRAY_COUNT(gSaveSectionLocations)) - 1) -#define GETCHUNKSIZE(chunk, n) ((sizeof(chunk) - (0xF80 * (n - 1))) >= 0xF80 ? 0xF80 : (sizeof(chunk) - (0xF80 * (n - 1)))) -#define GETBLOCKOFFSET(n) (0xF80 * (n - 1)) -#define TOTALNUMSECTORS ((ARRAY_COUNT(gSaveSectionLocations) * 2) + (ARRAY_COUNT(gHallOfFameSaveSectionLocations) * 2)) // there are 2 slots, so double each array count and get the sum. - -extern struct SaveSection unk_2000000; // slow save RAM - -u16 gLastWrittenSector; -u32 gLastSaveCounter; -u16 gLastKnownGoodSector; -u32 gDamagedSaveSectors; -u32 gSaveCounter; -struct SaveSection *gFastSaveSection; // the pointer is in fast IWRAM but may sometimes point to the slower EWRAM. -u16 gUnknown_03005EB4; -u16 gSaveFileStatus; -u32 gGameContinueCallback; - -extern struct PokemonStorage gPokemonStorage; -extern struct HallOfFame gHallOfFame; - -static EWRAM_DATA u32 gLastSaveSectorStatus = 0; // used but in an unferenced function, so unused - -const struct SaveSectionLocation gSaveSectionLocations[] = -{ - {((u8 *) &gSaveBlock2) + GETBLOCKOFFSET(1), GETCHUNKSIZE(gSaveBlock2, 1)}, - {((u8 *) &gSaveBlock1) + GETBLOCKOFFSET(1), GETCHUNKSIZE(gSaveBlock1, 1)}, - {((u8 *) &gSaveBlock1) + GETBLOCKOFFSET(2), GETCHUNKSIZE(gSaveBlock1, 2)}, - {((u8 *) &gSaveBlock1) + GETBLOCKOFFSET(3), GETCHUNKSIZE(gSaveBlock1, 3)}, - {((u8 *) &gSaveBlock1) + GETBLOCKOFFSET(4), GETCHUNKSIZE(gSaveBlock1, 4)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(1), GETCHUNKSIZE(gPokemonStorage, 1)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(2), GETCHUNKSIZE(gPokemonStorage, 2)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(3), GETCHUNKSIZE(gPokemonStorage, 3)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(4), GETCHUNKSIZE(gPokemonStorage, 4)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(5), GETCHUNKSIZE(gPokemonStorage, 5)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(6), GETCHUNKSIZE(gPokemonStorage, 6)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(7), GETCHUNKSIZE(gPokemonStorage, 7)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(8), GETCHUNKSIZE(gPokemonStorage, 8)}, - {((u8 *) &gPokemonStorage) + GETBLOCKOFFSET(9), GETCHUNKSIZE(gPokemonStorage, 9)} -}; - -const struct SaveSectionLocation gHallOfFameSaveSectionLocations[] = -{ - {((u8 *) &gHallOfFame) + GETBLOCKOFFSET(1), GETCHUNKSIZE(struct HallOfFame, 1)}, // gHallOfFame is not a proper sym, so the struct must be used. - {((u8 *) &gHallOfFame) + GETBLOCKOFFSET(2), GETCHUNKSIZE(struct HallOfFame, 2)} -}; - -const u8 gFlashSectors[] = { 0x1E, 0x1F }; - -void ClearSaveData(void) -{ - u16 i; - - for (i = 0; i < NUM_SECTORS; i++) - EraseFlashSector(i); -} - -void ResetSaveCounters(void) -{ - gSaveCounter = 0; - gLastWrittenSector = 0; - gDamagedSaveSectors = 0; -} - -bool32 SetDamagedSectorBits(u8 op, u8 bit) -{ - bool32 retVal = FALSE; - - switch (op) - { - case ENABLE: - gDamagedSaveSectors |= (1 << bit); - break; - case DISABLE: - gDamagedSaveSectors &= ~(1 << bit); - break; - case CHECK: // unused - if (gDamagedSaveSectors & (1 << bit)) - retVal = TRUE; - break; - } - - return retVal; -} - -u8 save_write_to_flash(u16 a1, const struct SaveSectionLocation *location) -{ - u32 retVal; - u16 i; - - gFastSaveSection = &unk_2000000; - - if (a1 != 0xFFFF) // for link - { - retVal = HandleWriteSector(a1, location); - } - else - { - gLastKnownGoodSector = gLastWrittenSector; // backup the current written sector before attempting to write. - gLastSaveCounter = gSaveCounter; - gLastWrittenSector++; - gLastWrittenSector = gLastWrittenSector % ARRAY_COUNT(gSaveSectionLocations); - gSaveCounter++; - retVal = 1; - - for (i = 0; i < ARRAY_COUNT(gSaveSectionLocations); i++) - HandleWriteSector(i, location); - - if (gDamagedSaveSectors != 0) // skip the damaged sector. - { - retVal = 0xFF; - gLastWrittenSector = gLastKnownGoodSector; - gSaveCounter = gLastSaveCounter; - } - } - - return retVal; -} - -u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location) -{ - u16 i; - u16 sector; - u8 *data; - u16 size; - - sector = a1 + gLastWrittenSector; - sector %= ARRAY_COUNT(gSaveSectionLocations); - sector += ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); - - data = location[a1].data; - size = location[a1].size; - - // clear save section. - for (i = 0; i < sizeof(struct SaveSection); i++) - ((char *)gFastSaveSection)[i] = 0; - - gFastSaveSection->id = a1; - gFastSaveSection->security = UNKNOWN_CHECK_VALUE; - gFastSaveSection->counter = gSaveCounter; - - for (i = 0; i < size; i++) - gFastSaveSection->data[i] = data[i]; - - gFastSaveSection->checksum = CalculateChecksum(data, size); - return TryWriteSector(sector, gFastSaveSection->data); -} - -u8 HandleWriteSectorNBytes(u8 sector, u8 *data, u16 size) -{ - u16 i; - struct SaveSection *section = &unk_2000000; - - for (i = 0; i < sizeof(struct SaveSection); i++) - ((char *)section)[i] = 0; - - section->security = UNKNOWN_CHECK_VALUE; - - for (i = 0; i < size; i++) - section->data[i] = data[i]; - - section->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used. - return TryWriteSector(sector, section->data); -} - -u8 TryWriteSector(u8 sector, u8 *data) -{ - if (ProgramFlashSectorAndVerify(sector, data) != 0) // is damaged? - { - SetDamagedSectorBits(ENABLE, sector); // set damaged sector bits. - return 0xFF; - } - else - { - SetDamagedSectorBits(DISABLE, sector); // unset damaged sector bits. it's safe now. - return 1; - } -} - -u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectionLocation *location) // location is unused -{ - gFastSaveSection = &unk_2000000; - gLastKnownGoodSector = gLastWrittenSector; - gLastSaveCounter = gSaveCounter; - gLastWrittenSector++; - gLastWrittenSector = gLastWrittenSector % ARRAY_COUNT(gSaveSectionLocations); - gSaveCounter++; - gUnknown_03005EB4 = 0; - gDamagedSaveSectors = 0; - return 0; -} - -u32 RestoreSaveBackupVars(const struct SaveSectionLocation *location) // only ever called once, and gSaveBlock2 is passed to this function. location is unused -{ - gFastSaveSection = &unk_2000000; - gLastKnownGoodSector = gLastWrittenSector; - gLastSaveCounter = gSaveCounter; - gUnknown_03005EB4 = 0; - gDamagedSaveSectors = 0; - return 0; -} - -u8 sub_812550C(u16 a1, const struct SaveSectionLocation *location) -{ - u8 retVal; - - if (gUnknown_03005EB4 < a1 - 1) - { - retVal = 1; - HandleWriteSector(gUnknown_03005EB4, location); - gUnknown_03005EB4++; - if (gDamagedSaveSectors) - { - retVal = 0xFF; - gLastWrittenSector = gLastKnownGoodSector; - gSaveCounter = gLastSaveCounter; - } - } - else - { - retVal = 0xFF; - } - - return retVal; -} - -u8 sub_812556C(u16 a1, const struct SaveSectionLocation *location) -{ - u8 retVal = 1; - - sub_81255B8(a1 - 1, location); - - if (gDamagedSaveSectors) - { - retVal = 0xFF; - gLastWrittenSector = gLastKnownGoodSector; - gSaveCounter = gLastSaveCounter; - } - return retVal; -} - -u8 sub_81255B8(u16 a1, const struct SaveSectionLocation *location) -{ - u16 i; - u16 sector; - u8 *data; - u16 size; - u8 status; - - sector = a1 + gLastWrittenSector; - sector %= ARRAY_COUNT(gSaveSectionLocations); - sector += ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); - - data = location[a1].data; - size = location[a1].size; - - // clear temp save section. - for (i = 0; i < sizeof(struct SaveSection); i++) - ((char *)gFastSaveSection)[i] = 0; - - gFastSaveSection->id = a1; - gFastSaveSection->security = UNKNOWN_CHECK_VALUE; - gFastSaveSection->counter = gSaveCounter; - - // set temp section's data. - for (i = 0; i < size; i++) - gFastSaveSection->data[i] = data[i]; - - // calculate checksum. - gFastSaveSection->checksum = CalculateChecksum(data, size); - - EraseFlashSector(sector); - - status = 1; - - for (i = 0; i < sizeof(struct UnkSaveSection); i++) - { - if (ProgramFlashByte(sector, i, ((u8 *)gFastSaveSection)[i])) - { - status = 0xFF; - break; - } - } - - if (status == 0xFF) - { - SetDamagedSectorBits(ENABLE, sector); - return 0xFF; - } - else - { - status = 1; - - for (i = 0; i < 7; i++) - { - if (ProgramFlashByte(sector, 0xFF9 + i, ((u8 *)gFastSaveSection)[0xFF9 + i])) - { - status = 0xFF; - break; - } - } - - if (status == 0xFF) - { - SetDamagedSectorBits(ENABLE, sector); - return 0xFF; - } - else - { - SetDamagedSectorBits(DISABLE, sector); - return 1; - } - } -} - -u8 sub_8125758(u16 a1, const struct SaveSectionLocation *location) -{ - u16 sector; - - sector = a1 + gLastWrittenSector - 1; - sector %= ARRAY_COUNT(gSaveSectionLocations); - sector += ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); - - if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), ((u8 *)gFastSaveSection)[sizeof(struct UnkSaveSection)])) - { - // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. - SetDamagedSectorBits(ENABLE, sector); - gLastWrittenSector = gLastKnownGoodSector; - gSaveCounter = gLastSaveCounter; - return 0xFF; - } - else - { - SetDamagedSectorBits(DISABLE, sector); - return 1; - } -} - -u8 sub_81257F0(u16 a1, const struct SaveSectionLocation *location) -{ - u16 sector; - - sector = a1 + gLastWrittenSector - 1; - sector %= ARRAY_COUNT(gSaveSectionLocations); - sector += ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); - - if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25)) - { - // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. - SetDamagedSectorBits(ENABLE, sector); - gLastWrittenSector = gLastKnownGoodSector; - gSaveCounter = gLastSaveCounter; - return 0xFF; - } - else - { - SetDamagedSectorBits(DISABLE, sector); - return 1; - } -} - -u8 sub_812587C(u16 a1, const struct SaveSectionLocation *location) -{ - u8 retVal; - gFastSaveSection = &unk_2000000; - if (a1 != 0xFFFF) - { - retVal = 0xFF; - } - else - { - retVal = GetSaveValidStatus(location); - sub_81258BC(0xFFFF, location); - } - - return retVal; -} - -u8 sub_81258BC(u16 a1, const struct SaveSectionLocation *location) -{ - u16 i; - u16 checksum; - u16 v3 = ARRAY_COUNT(gSaveSectionLocations) * (gSaveCounter % 2); - u16 id; - - for (i = 0; i < ARRAY_COUNT(gSaveSectionLocations); i++) - { - DoReadFlashWholeSection(i + v3, gFastSaveSection); - id = gFastSaveSection->id; - if (id == 0) - gLastWrittenSector = i; - checksum = CalculateChecksum(gFastSaveSection->data, location[id].size); - if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE - && gFastSaveSection->checksum == checksum) - { - u16 j; - for (j = 0; j < location[id].size; j++) - ((u8 *)location[id].data)[j] = gFastSaveSection->data[j]; - } - } - - return 1; -} - -u8 GetSaveValidStatus(const struct SaveSectionLocation *location) -{ - u16 i; - u16 checksum; - u32 saveSlot1Counter = 0; - u32 saveSlot2Counter = 0; - u32 slotCheckField = 0; - bool8 securityPassed = FALSE; - u8 saveSlot1Status; - u8 saveSlot2Status; - - // check save slot 1. - for (i = 0; i < ARRAY_COUNT(gSaveSectionLocations); i++) - { - DoReadFlashWholeSection(i, gFastSaveSection); - if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE) - { - securityPassed = TRUE; - checksum = CalculateChecksum(gFastSaveSection->data, location[gFastSaveSection->id].size); - if (gFastSaveSection->checksum == checksum) - { - saveSlot1Counter = gFastSaveSection->counter; - slotCheckField |= 1 << gFastSaveSection->id; - } - } - } - - if (securityPassed) - { - if (slotCheckField == GETVALIDSTATUSBITFIELD) - saveSlot1Status = 1; - else - saveSlot1Status = 255; - } - else - { - saveSlot1Status = 0; - } - - slotCheckField = 0; - securityPassed = FALSE; - - // check save slot 2. - for (i = 0; i < ARRAY_COUNT(gSaveSectionLocations); i++) - { - DoReadFlashWholeSection(i + ARRAY_COUNT(gSaveSectionLocations), gFastSaveSection); - if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE) - { - securityPassed = TRUE; - checksum = CalculateChecksum(gFastSaveSection->data, location[gFastSaveSection->id].size); - if (gFastSaveSection->checksum == checksum) - { - saveSlot2Counter = gFastSaveSection->counter; - slotCheckField |= 1 << gFastSaveSection->id; - } - } - } - - if (securityPassed) - { - if (slotCheckField == GETVALIDSTATUSBITFIELD) - saveSlot2Status = 1; - else - saveSlot2Status = 255; - } - else - { - saveSlot2Status = 0; - } - - if (saveSlot1Status == 1 && saveSlot2Status == 1) - { - if ((saveSlot1Counter == -1 && saveSlot2Counter == 0) || (saveSlot1Counter == 0 && saveSlot2Counter == -1)) - { - if ((unsigned)(saveSlot1Counter + 1) < (unsigned)(saveSlot2Counter + 1)) - { - gSaveCounter = saveSlot2Counter; - } - else - { - gSaveCounter = saveSlot1Counter; - } - } - else - { - if (saveSlot1Counter < saveSlot2Counter) - { - gSaveCounter = saveSlot2Counter; - } - else - { - gSaveCounter = saveSlot1Counter; - } - } - return 1; - } - - if (saveSlot1Status == 1) - { - gSaveCounter = saveSlot1Counter; - if (saveSlot2Status == 255) - return 255; - return 1; - } - - if (saveSlot2Status == 1) - { - gSaveCounter = saveSlot2Counter; - if (saveSlot1Status == 255) - return 255; - return 1; - } - - if (saveSlot1Status == 0 && saveSlot2Status == 0) - { - gSaveCounter = 0; - gLastWrittenSector = 0; - return 0; - } - - gSaveCounter = 0; - gLastWrittenSector = 0; - return 2; -} - -u8 sub_8125B88(u8 a1, u8 *data, u16 size) -{ - u16 i; - struct SaveSection *section = &unk_2000000; - DoReadFlashWholeSection(a1, section); - if (section->security == UNKNOWN_CHECK_VALUE) - { - u16 checksum = CalculateChecksum(section->data, size); - if (section->id == checksum) - { - for (i = 0; i < size; i++) - data[i] = section->data[i]; - return 1; - } - else - { - return 2; - } - } - else - { - return 0; - } -} - -u8 DoReadFlashWholeSection(u8 sector, struct SaveSection *section) -{ - ReadFlash(sector, 0, section->data, sizeof(struct SaveSection)); - return 1; -} - -u16 CalculateChecksum(void *data, u16 size) -{ - u16 i; - u32 checksum = 0; - - for (i = 0; i < (size / 4); i++) - checksum += *((u32 *)data)++; - - return ((checksum >> 16) + checksum); -} - -u8 HandleSavingData(u8 saveType) -{ - u8 i; - switch (saveType) - { - case HOF_DELETE_SAVE: // deletes HOF before overwriting HOF completely. unused - for (i = (ARRAY_COUNT(gSaveSectionLocations) * 2 + 0); i < TOTALNUMSECTORS; i++) - EraseFlashSector(i); - case HOF_SAVE: // hall of fame. - if (GetGameStat(10) < 999) - IncrementGameStat(10); - for (i = 0; i < ARRAY_COUNT(gHallOfFameSaveSectionLocations); i++) - HandleWriteSectorNBytes((ARRAY_COUNT(gSaveSectionLocations) * 2 + 0) + i, gHallOfFameSaveSectionLocations[i].data, gHallOfFameSaveSectionLocations[i].size); - SaveSerializedGame(); - save_write_to_flash(0xFFFF, gSaveSectionLocations); - break; - case NORMAL_SAVE: // normal save. also called by overwriting your own save. - default: - SaveSerializedGame(); - save_write_to_flash(0xFFFF, gSaveSectionLocations); - break; - case LINK_SAVE: // link save. updates only gSaveBlock1 and gSaveBlock2. - SaveSerializedGame(); - for (i = 0; i < 5; i++) - save_write_to_flash(i, gSaveSectionLocations); - break; - case EREADER_SAVE: // used in mossdeep "game corner" before/after battling old man e-reader trainer - SaveSerializedGame(); - save_write_to_flash(0, gSaveSectionLocations); - break; - case DIFFERENT_FILE_SAVE: // there is a different file, so erase the file and overwrite it completely. - for (i = (ARRAY_COUNT(gSaveSectionLocations) * 2 + 0); i < TOTALNUMSECTORS; i++) - EraseFlashSector(i); // erase HOF. - SaveSerializedGame(); - save_write_to_flash(0xFFFF, gSaveSectionLocations); - break; - } - return 0; -} - -u8 TrySavingData(u8 saveType) // TrySave -{ - if (gFlashMemoryPresent != TRUE) - return 0xFF; - HandleSavingData(saveType); - if (!gDamagedSaveSectors) - return 1; - DoSaveFailedScreen(saveType); - return 0xFF; -} - -u8 sub_8125D80(void) // trade.s save -{ - if (gFlashMemoryPresent != TRUE) - return 1; - SaveSerializedGame(); - RestoreSaveBackupVarsAndIncrement(gSaveSectionLocations); - return 0; -} - -bool8 sub_8125DA8(void) // trade.s save -{ - u8 retVal = sub_812550C(ARRAY_COUNT(gSaveSectionLocations), gSaveSectionLocations); - if (gDamagedSaveSectors) - DoSaveFailedScreen(0); - if (retVal == 0xFF) - return 1; - else - return 0; -} - -u8 sub_8125DDC(void) // trade.s save -{ - sub_812556C(ARRAY_COUNT(gSaveSectionLocations), gSaveSectionLocations); - if (gDamagedSaveSectors) - DoSaveFailedScreen(0); - return 0; -} - -u8 sub_8125E04(void) // trade.s save -{ - sub_8125758(ARRAY_COUNT(gSaveSectionLocations), gSaveSectionLocations); - if (gDamagedSaveSectors) - DoSaveFailedScreen(0); - return 0; -} - -u8 sub_8125E2C(void) -{ - if (gFlashMemoryPresent != TRUE) - return 1; - - SaveSerializedGame(); - RestoreSaveBackupVars(gSaveSectionLocations); - sub_812556C(gUnknown_03005EB4 + 1, gSaveSectionLocations); - return 0; -} - -bool8 sub_8125E6C(void) -{ - u8 retVal = FALSE; - u16 val = ++gUnknown_03005EB4; - if (val <= 4) - { - sub_812556C(gUnknown_03005EB4 + 1, gSaveSectionLocations); - sub_81257F0(val, gSaveSectionLocations); - } - else - { - sub_81257F0(val, gSaveSectionLocations); - retVal = TRUE; - } - if (gDamagedSaveSectors) - DoSaveFailedScreen(1); - return retVal; -} - -u8 sub_8125EC8(u8 a1) -{ - u8 result; - - if (gFlashMemoryPresent != TRUE) - { - gSaveFileStatus = 4; - return 0xFF; - } - - switch (a1) - { - case 0: - default: - result = sub_812587C(0xFFFF, gSaveSectionLocations); - LoadSerializedGame(); - gSaveFileStatus = result; - gGameContinueCallback = 0; - break; - case 3: - result = sub_8125B88((ARRAY_COUNT(gSaveSectionLocations) * 2 + 0), gHallOfFameSaveSectionLocations[0].data, gHallOfFameSaveSectionLocations[0].size); - if (result == 1) - result = sub_8125B88((ARRAY_COUNT(gSaveSectionLocations) * 2 + 1), gHallOfFameSaveSectionLocations[1].data, gHallOfFameSaveSectionLocations[1].size); - break; - } - - return result; -} - -bool8 unref_sub_8125F4C(struct UnkSaveSection *a1) -{ - u16 i; - char *raw = (char *)a1; - - for (i = 0; i < sizeof(struct SaveSection); i++) - raw[i] = 0; - - ReadFlash(gFlashSectors[0], 0, a1->data, 4096); - - if (a1->security != UNKNOWN_CHECK_VALUE) - return FALSE; - - return TRUE; -} - -u8 unref_sub_8125FA0(void) -{ - u16 i; - u8 v0 = TrySavingData(0); - - for (i = 0; i < 2; i++) - EraseFlashSector(gFlashSectors[i]); - - if (v0 == 255) - { - return 3; - } - else if (v0 == 3) - { - return 2; - } - else - { - sub_8125EC8(0); - return 1; - } -} - -u8 unref_sub_8125FF0(u8 *data, u16 size) -{ - u16 i; - struct UnkSaveSection *section = (struct UnkSaveSection *)&unk_2000000; - - for (i = 0; i < sizeof(struct SaveSection); i++) - ((char *)section)[i] = 0; - - section->security = UNKNOWN_CHECK_VALUE; - - for (i = 0; i < size; i++) - section->data[i] = data[i]; - - gLastSaveSectorStatus = ProgramFlashSectorAndVerifyNBytes(gFlashSectors[0], (u8 *)section, sizeof(struct SaveSection)); - - if (gLastSaveSectorStatus) - return 0xFF; - else - return 1; -} - -u8 unref_sub_8126068(u8 sector, u8 *data, u32 size) -{ - if (ProgramFlashSectorAndVerify(sector, data)) - return 255; - else - return 1; -} - -u8 unref_sub_8126080(u8 sector, u8 *data) -{ - ReadFlash(sector, 0, data, sizeof(struct SaveSection)); - return 1; -} diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c deleted file mode 100644 index b91e8b5bf..000000000 --- a/src/save_failed_screen.c +++ /dev/null @@ -1,310 +0,0 @@ -#include "global.h" -#include "gba/flash_internal.h" -#include "save_failed_screen.h" -#include "m4a.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "save.h" -#include "sprite.h" -#include "starter_choose.h" -#include "strings.h" -#include "task.h" -#include "text.h" - -// In English 1.0, the text window is too small, causing text to overflow. - -#ifdef BUGFIX_SAVEFAILEDSCREEN1 -#define MSG_WIN_TOP 10 -#else -#define MSG_WIN_TOP 12 -#endif - -#define CLOCK_WIN_TOP (MSG_WIN_TOP - 4) - -extern u8 unk_2000000[]; - -static EWRAM_DATA u16 gSaveFailedType = 0; -static EWRAM_DATA u16 gSaveFailedClockInfo[9] = {0}; - -extern u32 gDamagedSaveSectors; -extern u32 gGameContinueCallback; - -static const struct OamData sClockOamData = -{ - 160, // Y - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0 -}; - -static const u8 sClockFrames[8][3] = -{ - { 1, 0, 0 }, - { 5, 0, 0 }, - { 9, 0, 0 }, - { 5, 0, 1 }, - { 1, 0, 1 }, - { 5, 1, 1 }, - { 9, 1, 0 }, - { 5, 1, 0 }, -}; - -static const u8 gSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal"); -static const u8 gSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz"); - -static void VBlankCB(void); -static void CB2_SaveFailedScreen(void); -static void CB2_WipeSave(void); -static void CB2_GameplayCannotBeContinued(void); -static void CB2_FadeAndReturnToTitleScreen(void); -static void CB2_ReturnToTitleScreen(void); -static void VBlankCB_UpdateClockGraphics(void); -static bool8 VerifySectorWipe(u16 sector); -static bool8 WipeSector(u16 sector); -static bool8 WipeSectors(u32 sectorBits); - -void DoSaveFailedScreen(u8 saveType) -{ - SetMainCallback2(CB2_SaveFailedScreen); - gSaveFailedType = saveType; - gSaveFailedClockInfo[0] = FALSE; -} - -static void VBlankCB(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void CB2_SaveFailedScreen(void) -{ - u16 ime; - - switch (gMain.state) - { - case 0: - default: - SetVBlankCallback(0); - REG_DISPCNT = 0; - REG_BG3CNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16(3, 0, VRAM, VRAM_SIZE); - DmaFill32(3, 0, OAM, OAM_SIZE); - DmaFill16(3, 0, PLTT, PLTT_SIZE); - LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); - LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000)); - LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); - LZ77UnCompVram(&gSaveFailedClockGfx, (void *)(VRAM + 0x10020)); - ResetSpriteData(); - ResetTasks(); - ResetPaletteFade(); - LoadPalette(&gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal)); - LoadPalette(&gSaveFailedClockPal, 0x100, sizeof(gSaveFailedClockPal)); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - MenuDrawTextWindow(13, CLOCK_WIN_TOP, 16, CLOCK_WIN_TOP + 3); // clock window - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); // message window - MenuPrint(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - SetVBlankCallback(VBlankCB); - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG2_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0; - gMain.state++; - break; - case 1: - if (!UpdatePaletteFade()) - { - SetMainCallback2(CB2_WipeSave); - SetVBlankCallback(VBlankCB_UpdateClockGraphics); - } - break; - } -} - -static void CB2_WipeSave(void) -{ - u8 wipeTries = 0; - - gSaveFailedClockInfo[0] = TRUE; - - while (gDamagedSaveSectors != 0 && wipeTries < 3) // while there are still attempts left, keep trying to fix the save sectors. - { - if (WipeSectors(gDamagedSaveSectors) != FALSE) - { - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - MenuPrint(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); - SetMainCallback2(CB2_GameplayCannotBeContinued); - return; - } - - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - MenuPrint(gSystemText_CheckCompleteSaveAttempt, 2, MSG_WIN_TOP + 1); - HandleSavingData(gSaveFailedType); - - if (gDamagedSaveSectors != 0) - { -#ifdef BUGFIX_SAVEFAILEDSCREEN2 - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); -#endif - MenuPrint(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); - } - - wipeTries++; - } - - if (wipeTries == 3) - { - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - MenuPrint(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); - SetMainCallback2(CB2_FadeAndReturnToTitleScreen); // called again below - } - else - { - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - - // no callback exists, so the game cannot continue. - if (gGameContinueCallback == 0) - MenuPrint(gSystemText_SaveCompletedGameEnd, 2, MSG_WIN_TOP + 1); - else // callback exists, so continue - MenuPrint(gSystemText_SaveCompletedPressA, 2, MSG_WIN_TOP + 1); - } - - SetMainCallback2(CB2_FadeAndReturnToTitleScreen); -} - -static void CB2_GameplayCannotBeContinued(void) -{ - gSaveFailedClockInfo[0] = FALSE; - - if (gMain.newKeys & A_BUTTON) - { - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - MenuPrint(gSystemText_GameplayEnded, 2, MSG_WIN_TOP + 1); - SetVBlankCallback(VBlankCB); - SetMainCallback2(CB2_FadeAndReturnToTitleScreen); - } -} - -static void CB2_FadeAndReturnToTitleScreen(void) -{ - gSaveFailedClockInfo[0] = FALSE; - - if (gMain.newKeys & A_BUTTON) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - SetVBlankCallback(VBlankCB); - SetMainCallback2(CB2_ReturnToTitleScreen); - } -} - -static void CB2_ReturnToTitleScreen(void) -{ - if (!UpdatePaletteFade()) - { - if (gGameContinueCallback == 0) // no callback exists, so do a soft reset. - { - DoSoftReset(); - } - else - { - SetMainCallback2((MainCallback)gGameContinueCallback); - gGameContinueCallback = 0; - } - } -} - -static void VBlankCB_UpdateClockGraphics(void) -{ - unsigned int n = (gMain.vblankCounter2 >> 3) & 7; - - gMain.oamBuffer[0] = sClockOamData; - gMain.oamBuffer[0].x = 112; - gMain.oamBuffer[0].y = (CLOCK_WIN_TOP + 1) * 8; - - if (gSaveFailedClockInfo[0] != FALSE) - { - gMain.oamBuffer[0].tileNum = sClockFrames[n][0]; - gMain.oamBuffer[0].matrixNum = (sClockFrames[n][2] << 4) | (sClockFrames[n][1] << 3); - } - else - { - gMain.oamBuffer[0].tileNum = 1; - } - - CpuFastCopy(gMain.oamBuffer, (void *)OAM, 4); - - if (gSaveFailedClockInfo[1]) // maybe was used for debugging? - gSaveFailedClockInfo[1]--; -} - -static bool8 VerifySectorWipe(u16 sector) -{ - u32 *ptr = (u32 *)unk_2000000; - u16 i; - - ReadFlash(sector, 0, (u8 *)ptr, 4096); - - for (i = 0; i < 0x400; i++, ptr++) - if (*ptr) - return TRUE; - - return FALSE; -} - -static bool8 WipeSector(u16 sector) -{ - u16 i, j; - bool8 failed = TRUE; - - for (i = 0; failed && i < 130; i++) - { - for (j = 0; j < 0x1000; j++) - ProgramFlashByte(sector, j, 0); - - failed = VerifySectorWipe(sector); - } - - return failed; -} - -static bool8 WipeSectors(u32 sectorBits) -{ - u16 i; - - for (i = 0; i < 0x20; i++) - if ((sectorBits & (1 << i)) && !WipeSector(i)) - sectorBits &= ~(1 << i); - - if (sectorBits == 0) - return FALSE; - else - return TRUE; -} diff --git a/src/save_menu_util.c b/src/save_menu_util.c deleted file mode 100644 index a2d17bd36..000000000 --- a/src/save_menu_util.c +++ /dev/null @@ -1,148 +0,0 @@ -#include "global.h" -#include "save_menu_util.h" -#include "event_data.h" -#include "menu.h" -#include "pokedex.h" -#include "region_map.h" -#include "string_util.h" -#include "strings2.h" - -void HandleDrawSaveWindowInfo(s16 left, s16 top) -{ - u32 width = 12; - - // old handle for setting window width? - if (IsResizeSaveWindowEnabled()) - width = 13; - - if (FlagGet(SYS_POKEDEX_GET)) - { - // print info + dex information. - MenuDrawTextWindow(left, top, left + width, top + 11); - PrintSaveMapName(++left, ++top); // MAP NAME - PrintSavePlayerName(left, top + 2); // PLAYER - PrintSaveBadges(left, top + 4); // BADGES - PrintSavePokedexCount(left, top + 6); // POKEDEX - PrintSavePlayTime(left, top + 8); // PLAY TIME - } - else - { - // print everything besides dex. - MenuDrawTextWindow(left, top, left + width, top + 9); - PrintSaveMapName(++left, ++top); // MAP NAME - PrintSavePlayerName(left, top + 2); // PLAYER - PrintSaveBadges(left, top + 4); // BADGES - PrintSavePlayTime(left, top + 6); // PLAY TIME - } -} - -void HandleCloseSaveWindow(u16 left, u16 top) -{ - u32 width = 12; - - // old handle for setting window width? - if (IsResizeSaveWindowEnabled()) - width = 13; - - if (FlagGet(SYS_POKEDEX_GET)) - MenuZeroFillWindowRect(left, top, left + width, top + 11); - else - MenuZeroFillWindowRect(left, top, left + width, top + 9); -} - -/* -theory: This function was used to handle the save menu window's width being auto sized from -either 12 or 13 in an older source. Whatever was here might have either been optimized out by -GF's compiler or was dummied out to always return a TRUE at some point. -*/ -u8 IsResizeSaveWindowEnabled(void) // i don't know what else to name it.. -{ - return TRUE; -} - -void PrintSavePlayerName(s16 x, s16 y) -{ - MenuPrint(gOtherText_Player, x, y); - MenuPrint_RightAligned(gSaveBlock2.playerName, x + 12, y); -} - -void PrintSaveMapName(s16 x, s16 y) -{ - char name[32]; - - CopyMapName(name, gMapHeader.regionMapSectionId); - MenuPrint(name, x, y); -} - -void PrintSaveBadges(s16 x, s16 y) -{ - char badges[16]; - - MenuPrint(gOtherText_Badges, x, y); - ConvertIntToDecimalString(badges, GetBadgeCount()); - MenuPrint_RightAligned(badges, x + 12, y); -} - -void PrintSavePokedexCount(s16 x, s16 y) -{ - char pokedex[16]; - - MenuPrint(gOtherText_Pokedex, x, y); - ConvertIntToDecimalStringN(pokedex, GetPokedexSeenCount(), 1, 3); - MenuPrint_RightAligned(pokedex, x + 12, y); -} - -void PrintSavePlayTime(s16 x, s16 y) -{ - char playtime[16]; - - MenuPrint(gOtherText_PlayTime, x, y); - FormatPlayTime(playtime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); - MenuPrint_RightAligned(playtime, x + 12, y); -} - -u8 GetBadgeCount(void) -{ - u8 badgeCount = 0; - int badgeFlag; - - for (badgeFlag = BADGE01_GET; badgeFlag <= BADGE08_GET; badgeFlag++) - if (FlagGet(badgeFlag)) - badgeCount++; - - return badgeCount; -} - -u16 GetPokedexSeenCount() -{ - u16 pokedexSeenCount; - - if (IsNationalPokedexEnabled()) - pokedexSeenCount = GetNationalPokedexCount(1); - else - pokedexSeenCount = GetHoennPokedexCount(1); - - return pokedexSeenCount; -} - -void FormatPlayTime(char *playtime, u16 hours, u16 minutes, u16 unk) -{ - s16 colon = unk; - playtime = ConvertIntToDecimalString(playtime, hours); - - // playtime[0] is hours. - // playtime[1] is the character to render between hours and minutes. - // playtime[2] is minutes. - - playtime[0] = 0; - - if (colon) - playtime[1] = 0xF0; // set middle character to ":" - else - playtime[1] = 0; - - playtime[2] = 0; - playtime += 3; - - ConvertIntToDecimalStringN(playtime, minutes, 2, 2); -} diff --git a/src/scene/contest_painting.c b/src/scene/contest_painting.c new file mode 100644 index 000000000..391cbdfaa --- /dev/null +++ b/src/scene/contest_painting.c @@ -0,0 +1,805 @@ +#include "global.h" +#include "contest_painting.h" +#include "cute_sketch.h" +#include "data2.h" +#include "decompress.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "rng.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "text.h" +#include "unknown_task.h" + +extern u8 unk_2000000[]; + +static u8 gUnknown_03000750; +static u16 gUnknown_03000752; +static u16 gUnknown_03000754; +static u8 gUnknown_03000756; + +u16 (*gUnknown_03005E10)[][32]; +struct Unk03005E20 gUnknown_03005E20; +u8 gUnknown_03005E40[0x4C]; +struct ContestEntry *gUnknown_03005E8C; +u16 (*gUnknown_03005E90)[]; + +extern struct ContestEntry unk_2015de0; +extern struct Unk2015E00 unk_2015e00; + +static const u16 gPictureFramePalettes[][16] = +{ + INCBIN_U16("graphics/picture_frame/bg0.gbapal"), + INCBIN_U16("graphics/picture_frame/bg1.gbapal"), + INCBIN_U16("graphics/picture_frame/bg2.gbapal"), + INCBIN_U16("graphics/picture_frame/bg3.gbapal"), + INCBIN_U16("graphics/picture_frame/bg4.gbapal"), + INCBIN_U16("graphics/picture_frame/bg5.gbapal"), + {0}, + {0}, +}; +const u8 emptySpace[8 * 32] = {0}; +const u8 gPictureFrameTiles_0[] = INCBIN_U8("graphics/picture_frame/frame0.4bpp.rl"); +const u8 gPictureFrameTiles_1[] = INCBIN_U8("graphics/picture_frame/frame1.4bpp.rl"); +const u8 gPictureFrameTiles_2[] = INCBIN_U8("graphics/picture_frame/frame2.4bpp.rl"); +const u8 gPictureFrameTiles_3[] = INCBIN_U8("graphics/picture_frame/frame3.4bpp.rl"); +const u8 gPictureFrameTiles_4[] = INCBIN_U8("graphics/picture_frame/frame4.4bpp.rl"); +const u8 gPictureFrameTiles_5[] = INCBIN_U8("graphics/picture_frame/frame5.4bpp.rl"); +const u8 gPictureFrameTilemap_0[] = INCBIN_U8("graphics/picture_frame/frame0_map.bin.rl"); +const u8 gPictureFrameTilemap_1[] = INCBIN_U8("graphics/picture_frame/frame1_map.bin.rl"); +const u8 gPictureFrameTilemap_2[] = INCBIN_U8("graphics/picture_frame/frame2_map.bin.rl"); +const u8 gPictureFrameTilemap_3[] = INCBIN_U8("graphics/picture_frame/frame3_map.bin.rl"); +const u8 gPictureFrameTilemap_4[] = INCBIN_U8("graphics/picture_frame/frame4_map.bin.rl"); +const u8 gPictureFrameTilemap_5[] = INCBIN_U8("graphics/picture_frame/frame5_map.bin.rl"); +const u8 *const gUnknown_083F60AC[] = +{ + OtherText_Cool, + OtherText_Beauty2, + OtherText_Cute, + OtherText_Smart, + OtherText_Tough, +}; +const struct LabelPair gUnknown_083F60C0[] = +{ + {OtherText_NonstopSuperCool, OtherText_Terminator6}, + {OtherText_GoodLookingPoke, OtherText_Terminator7}, + {OtherText_MarvelousGreat, OtherText_Terminator8}, + {OtherText_CenturyLastVenus, OtherText_Terminator9}, + {OtherText_Terminator10, OtherText_DazzlingSmile}, + {OtherText_PokeCenterIdol, OtherText_Terminator11}, + {OtherText_LovelyAndSweet, OtherText_Terminator12}, + {OtherText_ThePretty, OtherText_WinningPortrait}, + {OtherText_GiveUsWink, OtherText_Terminator13}, + {OtherText_SmartnessMaestro, OtherText_Terminator15}, + {OtherText_ChosenPokeAmong, OtherText_Terminator15}, + {OtherText_TheExcellent, OtherText_ItsMomentOfElegance}, + {OtherText_PowerfullyMuscular, OtherText_Terminator16}, + {OtherText_StrongErEst, OtherText_Terminator17}, + {OtherText_MightyTough, OtherText_Exclamation}, +}; +const struct OamData gOamData_83F6138 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 1, + .bpp = 1, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +const u16 gUnknown_083F6140[] = {0, 0}; + +static void ShowContestPainting(); +static void CB2_HoldContestPainting(void); +static void HoldContestPainting(void); +static void ContestPaintingInitWindow(u8 arg0); +static void ContestPaintingPrintCaption(u8 arg0, u8 arg1); +static void ContestPaintingInitBG(void); +static void ContestPaintingInitVars(u8 arg0); +static void VBlankCB_ContestPainting(void); +void sub_8106B90(); //should be static +static void sub_8107090(u8 arg0, u8 arg1); + +__attribute__((naked)) +void sub_8106630(u32 arg0) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + ldr r2, _0810665C @ =0x02015de0\n\ + subs r4, r2, 0x2\n\ + subs r5, r2, 0x1\n\ + ldr r3, _08106660 @ =gSaveBlock1\n\ + subs r0, 0x1\n\ + lsls r1, r0, 5\n\ + adds r1, r3\n\ + ldr r3, _08106664 @ =0x00002dfc\n\ + adds r1, r3\n\ + ldm r1!, {r3,r6,r7}\n\ + stm r2!, {r3,r6,r7}\n\ + ldm r1!, {r3,r6,r7}\n\ + stm r2!, {r3,r6,r7}\n\ + ldm r1!, {r6,r7}\n\ + stm r2!, {r6,r7}\n\ + strb r0, [r4]\n\ + movs r0, 0\n\ + strb r0, [r5]\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0810665C: .4byte 0x02015de0\n\ +_08106660: .4byte gSaveBlock1\n\ +_08106664: .4byte 0x00002dfc\n\ + .syntax divided\n"); +} + +void CB2_ContestPainting(void) +{ + ShowContestPainting(); +} + +static void ShowContestPainting(void) +{ + switch (gMain.state) + { + case 0: + remove_some_task(); + SetVBlankCallback(NULL); + gUnknown_03005E8C = &unk_2015de0; + ContestPaintingInitVars(TRUE); + ContestPaintingInitBG(); + gMain.state++; + break; + case 1: + { + u8 *addr; + size_t size; + + ResetPaletteFade(); + addr = (void *)VRAM; + size = 0x18000; + while (1) + { + DmaFill32(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaFill32(3, 0, addr, size); + break; + } + } + ResetSpriteData(); + gMain.state++; + break; + } + case 2: + SeedRng(gMain.vblankCounter1); + InitKeys(); + ContestPaintingInitWindow(unk_2000000[0x15DDF]); + gMain.state++; + break; + case 3: + sub_8107090(unk_2000000[0x15DDE], unk_2000000[0x15DDF]); + gMain.state++; + break; + case 4: + ContestPaintingPrintCaption(unk_2000000[0x15DDE], unk_2000000[0x15DDF]); + LoadPalette(gUnknown_083F6140, 0, 1 * 2); + DmaClear32(3, PLTT, 0x400); + BeginFastPaletteFade(2); + SetVBlankCallback(VBlankCB_ContestPainting); + gUnknown_03000750 = 0; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; + SetMainCallback2(CB2_HoldContestPainting); + break; + } +} + +static void CB2_HoldContestPainting(void) +{ + HoldContestPainting(); + UpdatePaletteFade(); +} + +static void CB2_QuitContestPainting(void) +{ + SetMainCallback2(gMain.savedCallback); +} + +static void HoldContestPainting(void) +{ + switch (gUnknown_03000750) + { + case 0: + if (!gPaletteFade.active) + gUnknown_03000750 = 1; + if (gUnknown_03000756 != 0 && gUnknown_03000754 != 0) + gUnknown_03000754--; + break; + case 1: + if ((gMain.newKeys & 1) || (gMain.newKeys & 2)) + { + u8 two = 2; //needed to make the asm match + + gUnknown_03000750 = two; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + } + if (gUnknown_03000756 != 0) + gUnknown_03000754 = 0; + break; + case 2: + if (!gPaletteFade.active) + SetMainCallback2(CB2_QuitContestPainting); + if (gUnknown_03000756 != 0 && gUnknown_03000754 <= 0x1D) + gUnknown_03000754++; + break; + } +} + +static void ContestPaintingInitWindow(u8 arg0) +{ + InitMenuWindow(&gWindowConfig_81E7160); + SetUpWindowConfig(&gWindowConfig_81E7160); +} + +static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) +{ + u8 xPos, yPos; + u8 *ptr; + u8 type; + + if (arg1 == TRUE) + return; + ptr = gUnknown_03005E40; + type = gUnknown_03005E8C->contestType; + if (contestType < 8) + { + ptr = StringCopy(ptr, gUnknown_083F60AC[type]); + ptr = StringCopy(ptr, gContestText_ContestWinner); +#if ENGLISH + ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name); +#elif GERMAN + ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); +#endif + + // {LATIN} + ptr[0] = 0xFC; + ptr[1] = 0x16; + ptr += 2; + + ptr = StringCopy(ptr, gOtherText_Unknown1); +#if ENGLISH + ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); +#elif GERMAN + ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name); +#endif + + xPos = 6; + yPos = 14; + } + else + { + ptr = StringCopy(ptr, gUnknown_083F60C0[type].prefix); + ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); + ptr = StringCopy(ptr, gUnknown_083F60C0[type].suffix); + + xPos = 3; + yPos = 14; + } + MenuPrint_PixelCoords(gUnknown_03005E40, xPos * 8 + 1, yPos * 8, 1); +} + +static void ContestPaintingInitBG(void) +{ + REG_DISPCNT = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_BG0CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(12) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; +} + +static void ContestPaintingInitVars(bool8 arg0) +{ + if (arg0 == FALSE) + { + gUnknown_03000756 = FALSE; + gUnknown_03000752 = 0; + gUnknown_03000754 = 0; + } + else + { + gUnknown_03000756 = TRUE; + gUnknown_03000752 = 15; + gUnknown_03000754 = 30; + } +} + +static void ContestPaintingMosaic(void) +{ + if (gUnknown_03000756 == FALSE) + { + REG_MOSAIC = 0; + return; + } + + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256; + gUnknown_03000752 = gUnknown_03000754 / 2; + + REG_MOSAIC = (gUnknown_03000752 << 12) | (gUnknown_03000752 << 8) | (gUnknown_03000752 << 4) | (gUnknown_03000752 << 0); +} + +static void VBlankCB_ContestPainting(void) +{ + ContestPaintingMosaic(); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +#ifdef NONMATCHING +static void sub_8106AC4(u16 species, u8 arg1) +{ + void *pal; + + // Unsure what gUnknown_03005E8C->var0 is supposed to be. + pal = species_and_otid_get_pal(species, gUnknown_03005E8C->var4, gUnknown_03005E8C->var0); + LZDecompressVram(pal, gUnknown_03005E90); + + if (arg1 == 1) + { + HandleLoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].x, + gMonFrontPicCoords[species].y, + 0x2000000, + gUnknown_081FAF4C[1], + species, + (u32)gUnknown_03005E8C->var0 + ); + sub_8106B90(gUnknown_081FAF4C[1], gUnknown_03005E90, gUnknown_03005E10); + } + else + { + HandleLoadSpecialPokePic( + &gMonBackPicTable[species], + gMonBackPicCoords[species].x, + gMonBackPicCoords[species].y, + 0x2000000, + gUnknown_081FAF4C[0], + species, + (u32)gUnknown_03005E8C->var0 + ); + sub_8106B90(gUnknown_081FAF4C[0], gUnknown_03005E90, gUnknown_03005E10); + } +} +#else +__attribute__((naked)) +static void sub_8106AC4(u16 arg0, u8 arg2) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0xC\n\ + adds r4, r1, 0\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + ldr r7, _08106B28 @ =gUnknown_03005E8C\n\ + ldr r0, [r7]\n\ + ldr r1, [r0, 0x4]\n\ + ldr r2, [r0]\n\ + adds r0, r6, 0\n\ + bl species_and_otid_get_pal\n\ + ldr r1, _08106B2C @ =gUnknown_03005E90\n\ + mov r8, r1\n\ + ldr r1, [r1]\n\ + bl LZDecompressVram\n\ + cmp r4, 0\n\ + bne _08106B40\n\ + lsls r0, r6, 3\n\ + ldr r1, _08106B30 @ =gMonFrontPicTable\n\ + adds r0, r1\n\ + ldr r1, _08106B34 @ =gMonFrontPicCoords\n\ + lsls r2, r6, 2\n\ + adds r2, r1\n\ + ldrb r1, [r2]\n\ + ldrb r2, [r2, 0x1]\n\ + movs r3, 0x80\n\ + lsls r3, 18\n\ + ldr r4, _08106B38 @ =gUnknown_081FAF4C\n\ + ldr r5, [r4, 0x4]\n\ + str r5, [sp]\n\ + str r6, [sp, 0x4]\n\ + ldr r4, [r7]\n\ + ldr r4, [r4]\n\ + str r4, [sp, 0x8]\n\ + bl HandleLoadSpecialPokePic\n\ + mov r2, r8\n\ + ldr r1, [r2]\n\ + ldr r0, _08106B3C @ =gUnknown_03005E10\n\ + ldr r2, [r0]\n\ + adds r0, r5, 0\n\ + bl sub_8106B90\n\ + b _08106B74\n\ + .align 2, 0\n\ +_08106B28: .4byte gUnknown_03005E8C\n\ +_08106B2C: .4byte gUnknown_03005E90\n\ +_08106B30: .4byte gMonFrontPicTable\n\ +_08106B34: .4byte gMonFrontPicCoords\n\ +_08106B38: .4byte gUnknown_081FAF4C\n\ +_08106B3C: .4byte gUnknown_03005E10\n\ +_08106B40:\n\ + lsls r0, r6, 3\n\ + ldr r1, _08106B80 @ =gMonBackPicTable\n\ + adds r0, r1\n\ + ldr r1, _08106B84 @ =gMonBackPicCoords\n\ + lsls r2, r6, 2\n\ + adds r2, r1\n\ + ldrb r1, [r2]\n\ + ldrb r2, [r2, 0x1]\n\ + movs r3, 0x80\n\ + lsls r3, 18\n\ + ldr r4, _08106B88 @ =gUnknown_081FAF4C\n\ + ldr r5, [r4]\n\ + str r5, [sp]\n\ + str r6, [sp, 0x4]\n\ + ldr r4, [r7]\n\ + ldr r4, [r4]\n\ + str r4, [sp, 0x8]\n\ + bl HandleLoadSpecialPokePic\n\ + mov r0, r8\n\ + ldr r1, [r0]\n\ + ldr r0, _08106B8C @ =gUnknown_03005E10\n\ + ldr r2, [r0]\n\ + adds r0, r5, 0\n\ + bl sub_8106B90\n\ +_08106B74:\n\ + add sp, 0xC\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08106B80: .4byte gMonBackPicTable\n\ +_08106B84: .4byte gMonBackPicCoords\n\ +_08106B88: .4byte gUnknown_081FAF4C\n\ +_08106B8C: .4byte gUnknown_03005E10\n\ + .syntax divided\n"); +} +#endif + +#ifdef NONMATCHING +void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8]) +{ + u16 i; + u16 j; + u16 k; + u16 l; + + for (i = 0; i < 8; i++) + { + for (j = 0; j < 8; j++) + { + for (k = 0; k < 8; k++) + { + for (l = 0; l < 8; l++) + { + //u8 *arr = a[i][j][k]; + //u8 r1 = arr[l / 2]; + u8 r1 = a[i][j][k][l / 2]; + + if (l & 1) + r1 /= 16; + else + r1 %= 16; + //_08106BEA + if (r1 == 0) + c[i][k][j][l] = 0x8000; + else + c[i][k][j][l] = b[r1]; + } + } + } + } +} +#else +__attribute__((naked)) +void sub_8106B90() +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0xC\n\ + mov r10, r0\n\ + mov r9, r1\n\ + str r2, [sp]\n\ + movs r0, 0\n\ +_08106BA4:\n\ + movs r3, 0\n\ + adds r1, r0, 0x1\n\ + str r1, [sp, 0x4]\n\ + lsls r0, 3\n\ + str r0, [sp, 0x8]\n\ +_08106BAE:\n\ + movs r1, 0\n\ + adds r2, r3, 0x1\n\ + mov r8, r2\n\ + ldr r7, [sp, 0x8]\n\ + adds r0, r7, r3\n\ + lsls r0, 5\n\ + mov r12, r0\n\ + lsls r4, r3, 3\n\ +_08106BBE:\n\ + movs r3, 0\n\ + lsls r0, r1, 2\n\ + adds r6, r1, 0x1\n\ + mov r2, r12\n\ + adds r5, r2, r0\n\ + ldr r7, [sp, 0x8]\n\ + adds r0, r7, r1\n\ + lsls r0, 7\n\ + ldr r1, [sp]\n\ + adds r2, r0, r1\n\ +_08106BD2:\n\ + lsrs r0, r3, 1\n\ + adds r0, r5, r0\n\ + add r0, r10\n\ + ldrb r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _08106BE6\n\ + lsrs r1, 4\n\ + b _08106BEA\n\ +_08106BE6:\n\ + movs r0, 0xF\n\ + ands r1, r0\n\ +_08106BEA:\n\ + cmp r1, 0\n\ + bne _08106BFC\n\ + adds r0, r4, r3\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + movs r7, 0x80\n\ + lsls r7, 8\n\ + adds r1, r7, 0\n\ + b _08106C08\n\ +_08106BFC:\n\ + adds r0, r4, r3\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + lsls r1, 1\n\ + add r1, r9\n\ + ldrh r1, [r1]\n\ +_08106C08:\n\ + strh r1, [r0]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x7\n\ + bls _08106BD2\n\ + lsls r0, r6, 16\n\ + lsrs r1, r0, 16\n\ + cmp r1, 0x7\n\ + bls _08106BBE\n\ + mov r1, r8\n\ + lsls r0, r1, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x7\n\ + bls _08106BAE\n\ + ldr r2, [sp, 0x4]\n\ + lsls r0, r2, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x7\n\ + bls _08106BA4\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +static void sub_8106C40(u8 arg0, u8 arg1) +{ + u8 x, y; + + LoadPalette(gPictureFramePalettes, 0, sizeof(gPictureFramePalettes)); + if (arg1 == 1) + { + switch (gUnknown_03005E8C->contestType / 3) + { + case CONTEST_COOL: + RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM); + RLUnCompWram(gPictureFrameTilemap_0, gUnknown_03005E10); + break; + case CONTEST_BEAUTY: + RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM); + RLUnCompWram(gPictureFrameTilemap_1, gUnknown_03005E10); + break; + case CONTEST_CUTE: + RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM); + RLUnCompWram(gPictureFrameTilemap_2, gUnknown_03005E10); + break; + case CONTEST_SMART: + RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM); + RLUnCompWram(gPictureFrameTilemap_3, gUnknown_03005E10); + break; + case CONTEST_TOUGH: + RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM); + RLUnCompWram(gPictureFrameTilemap_4, gUnknown_03005E10); + break; + } + +#define VRAM_PICTURE_DATA(x, y) (((u16 *)(VRAM + 0x6000))[(y) * 32 + (x)]) + + // Set the background + for (y = 0; y < 20; y++) + { + for (x = 0; x < 32; x++) + VRAM_PICTURE_DATA(x, y) = 0x1015; + } + + // Copy the image frame + for (y = 0; y < 10; y++) + { + for (x = 0; x < 18; x++) + VRAM_PICTURE_DATA(x + 6, y + 2) = (*gUnknown_03005E10)[y + 2][x + 6]; + } + + // Re-set the entire top row to the first top frame part + for (x = 0; x < 16; x++) + VRAM_PICTURE_DATA(x + 7, 2) = (*gUnknown_03005E10)[2][7]; + +#undef VRAM_PICTURE_DATA + } + else if (arg0 < 8) + { + RLUnCompVram(gPictureFrameTiles_5, (void *)VRAM); + RLUnCompVram(gPictureFrameTilemap_5, (void *)(VRAM + 0x6000)); + } + else + { + switch (gUnknown_03005E8C->contestType / 3) + { + case CONTEST_COOL: + RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM); + RLUnCompVram(gPictureFrameTilemap_0, (void *)(VRAM + 0x6000)); + break; + case CONTEST_BEAUTY: + RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM); + RLUnCompVram(gPictureFrameTilemap_1, (void *)(VRAM + 0x6000)); + break; + case CONTEST_CUTE: + RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM); + RLUnCompVram(gPictureFrameTilemap_2, (void *)(VRAM + 0x6000)); + break; + case CONTEST_SMART: + RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM); + RLUnCompVram(gPictureFrameTilemap_3, (void *)(VRAM + 0x6000)); + break; + case CONTEST_TOUGH: + RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM); + RLUnCompVram(gPictureFrameTilemap_4, (void *)(VRAM + 0x6000)); + break; + } + } +} + +static void sub_8106E98(u8 arg0) +{ + //Some hacks just to get the asm to match +#ifndef NONMATCHING + asm(""::"r"(arg0)); +#endif + + gMain.oamBuffer[0] = gOamData_83F6138; + gMain.oamBuffer[0].tileNum = 0; + +#ifndef NONMATCHING + if (arg0) arg0 = gMain.oamBuffer[0].tileNum; +#endif + + gMain.oamBuffer[0].x = 88; + gMain.oamBuffer[0].y = 24; +} + +static u8 sub_8106EE0(u8 arg0) +{ + u8 contestType; + + if (arg0 < 8) + contestType = gUnknown_03005E8C->contestType; + else + contestType = gUnknown_03005E8C->contestType / 3; + + switch (contestType) + { + case CONTEST_COOL: + return CONTESTRESULT_COOL; + case CONTEST_BEAUTY: + return CONTESTRESULT_BEAUTY; + case CONTEST_CUTE: + return CONTESTRESULT_CUTE; + case CONTEST_SMART: + return CONTESTRESULT_SMART; + case CONTEST_TOUGH: + return CONTESTRESULT_TOUGH; + } + + return contestType; +} + +static void sub_8106F4C(void) +{ + gUnknown_03005E90 = &unk_2015e00.unk2017e00; + gUnknown_03005E10 = &unk_2015e00.unk2015e00; +} + +static void sub_8106F6C(u8 arg0) +{ + gUnknown_03005E20.var_4 = gUnknown_03005E10; + gUnknown_03005E20.var_8 = gUnknown_03005E90; + gUnknown_03005E20.var_18 = 0; + gUnknown_03005E20.var_1F = gUnknown_03005E8C->var0; + gUnknown_03005E20.var_19 = 0; + gUnknown_03005E20.var_1A = 0; + gUnknown_03005E20.var_1B = 64; + gUnknown_03005E20.var_1C = 64; + gUnknown_03005E20.var_1D = 64; + gUnknown_03005E20.var_1E = 64; + + switch (arg0) + { + case CONTESTRESULT_SMART: + case CONTESTRESULT_TOUGH: + gUnknown_03005E20.var_14 = 3; + break; + case CONTESTRESULT_COOL: + case CONTESTRESULT_BEAUTY: + case CONTESTRESULT_CUTE: + default: + gUnknown_03005E20.var_14 = 1; + break; + } + + gUnknown_03005E20.var_16 = 2; + gUnknown_03005E20.var_0 = arg0; + gUnknown_03005E20.var_10 = 0x6010000; + + sub_80FC7A0(&gUnknown_03005E20); + sub_80FDA18(&gUnknown_03005E20); + sub_80FD8CC(&gUnknown_03005E20); + + LoadPalette(gUnknown_03005E90, 256, 256 * 2); +} + +static void sub_8107090(u8 arg0, u8 arg1) +{ + sub_8106F4C(); + sub_8106AC4(gUnknown_03005E8C->var8, 0); + sub_8106F6C(sub_8106EE0(arg0)); + sub_8106E98(arg0); + sub_8106C40(arg0, arg1); +} diff --git a/src/scene/credits.c b/src/scene/credits.c new file mode 100644 index 000000000..df70674b6 --- /dev/null +++ b/src/scene/credits.c @@ -0,0 +1,1496 @@ +#include "global.h" +#include "data2.h" +#include "decompress.h" +#include "event_data.h" +#include "hall_of_fame.h" +#include "intro_credits_graphics.h" +#include "m4a.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "pokedex.h" +#include "rng.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "starter_choose.h" +#include "task.h" +#include "trig.h" + +asm(".set REG_BASE, 0x4000000"); +asm(".set OFFSET_REG_BLDCNT, 0x50"); +asm(".set OFFSET_REG_BLDALPHA, 0x52"); +asm(".set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT"); +asm(".set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA"); + +enum +{ + PAGE_TITLE, + PAGE_DIRECTOR, + PAGE_ART_DIRECTOR, + PAGE_BATTLE_DIRECTOR, + PAGE_MAIN_PROGRAMMER, + PAGE_BATTLE_SYSTEM_PROGRAMMER, + PAGE_PROGRAMMERS_1, + PAGE_PROGRAMMERS_2, + PAGE_PROGRAMMERS_3, + PAGE_MAIN_GRAHPICS_DESIGNER, + PAGE_POKEMON_GRAHPIC_DESIGNERS_1, + PAGE_POKEMON_GRAHPIC_DESIGNERS_2, + PAGE_POKEMON_GRAHPIC_DESIGNERS_3, + PAGE_POKEMON_DESIGNERS_1, + PAGE_POKEMON_DESIGNERS_2, + PAGE_MUSIC_COMPOSITION, + PAGE_SOUND_EFFECTS, + PAGE_GAME_DESIGNERS_1, + PAGE_GAME_DESIGNERS_2, + PAGE_GAME_DESIGNERS_3, + PAGE_PLOT_SCENARIO, + PAGE_GAME_SCENARIO, + PAGE_SCRIPT_DESIGNERS, + PAGE_MAP_DESIGNERS, + PAGE_MAP_DATA_DESIGNERS, + PAGE_PARAMETRIC_DESIGNERS, + PAGE_POKEDEX_TEXT, + PAGE_ENVIRONMENT_TOOLS, + PAGE_PRODUCT_TESTING, + PAGE_SPECIAL_THANKS, + PAGE_SPECIAL_THANKS_1, + PAGE_SPECIAL_THANKS_2, + PAGE_SPECIAL_THANKS_3, + PAGE_INFORMATION_SUPERVISORS, + PAGE_COORDINATORS, + PAGE_TASK_MANAGERS, + PAGE_PRODUCERS, + PAGE_EXECUTIVE_DIRECTOR, + PAGE_EXECUTIVE_PRODUCERS_1, + PAGE_EXECUTIVE_PRODUCERS_2, + PAGE_TRANSLATION_COORDINATOR, + PAGE_TRANSLATORS, + PAGE_PROGRAMMERS, + PAGE_GRAPHIC_DESIGNERS, + PAGE_PRODUCT_SUPPORT, + +#if ENGLISH + PAGE_ARTWORK, + PAGE_TEXT_EDITOR, + PAGE_NOA_TESTING, + PAGE_BRAILLE_CODE_CHECK_1, + PAGE_BRAILLE_CODE_CHECK_2, +#elif GERMAN + PAGE_NOE_TESTING, + PAGE_BRAILLE_CODE_CHECK_1, +#endif + + PAGE_SPECIAL_THANKS_4, + PAGE_SPECIAL_THANKS_5, + + PAGE_COUNT +}; + +#if ENGLISH +#define POKEMON_TILE_COUNT 68 +#define LAST_PAGE (PAGE_TEXT_EDITOR) +#define UNK_DEFINE_45 (0x45) +#define UNK_DEFINE_82 (0x82) +#define UNK_DEF_1F3 (499) +#elif GERMAN +#define POKEMON_TILE_COUNT 65 +#define LAST_PAGE (PAGE_NOE_TESTING) +#define UNK_DEFINE_45 (8) +#define UNK_DEFINE_82 (0x8D) +#define UNK_DEF_1F3 (554) +#endif + +#define COLOR_DARK_GREEN 0x1967 +#define COLOR_LIGHT_GREEN 0x328D + +enum +{ + TDA_0 = 0, + TDA_TASK_C_ID = 1, + TDA_TASK_E_ID = 2, + TDA_TASK_D_ID = 3, + TDA_4 = 4, + TDA_PLAYER_CYCLIST = 5, + TDA_RIVAL_CYCLIST = 6, + TDA_7 = 7, // Has something to do with the bike scene + TDA_11 = 11, // Gets set depending on whether the bike or the grass scene should be shown + TDA_12 = 12, + TDA_13 = 13, + TDA_14 = 14, + TDA_TASK_B_ID = 15, + + // Appears to be responsible for text + TDB_0 = 0, + TDB_TASK_A_ID = 1, + TDB_CURRENT_PAGE = 2, + TDB_3 = 3, + + TDC_0 = 0, + TDC_1 = 1, + TDC_2 = 2, + TDC_3 = 3, + TDC_4 = 4, + TDC_5 = 5, + + TDD_STATE = 0, + TDD_TASK_A_ID = 1, + TDD_2 = 2, + TDD_3 = 3, + + TDE_0 = 0, + TDE_1 = 1, + TDE_TASK_A_ID = 2, +}; + + +struct Unk201C000 +{ + u16 unk0[POKEMON_TILE_COUNT]; + u16 unk88; + u16 unk8A; + u16 unk8C; + u16 unk8E; + u16 unk90[386]; + u16 unk394; +}; + +struct CreditsEntry +{ + u8 var_0; + u8 *text; +}; + +extern u8 ewram[]; + +#define EWRAM_1F800 ((u16 *)(ewram + 0x1F800)) +#define HALL_OF_FAME_SHEET_0 ((u8 *)(ewram + 0x1E000)) +#define HALL_OF_FAME_SHEET_1 ((u8 *)(ewram + 0x1E800)) +#define HALL_OF_FAME_SHEET_2 ((u8 *)(ewram + 0x1F000)) +#define ewram1c000 (*(struct Unk201C000 *)(ewram + 0x1C000)) + +extern struct HallOfFame gHallOfFame; +extern u8 unk_201e800[0x800]; +extern u8 unk_201f000[0x800]; +extern u16 unk_201f800[]; + +extern struct SpriteTemplate gUnknown_02024E8C; + +extern u16 gUnknown_02039358; +extern s16 gUnknown_0203935A; +extern s16 gUnknown_0203935C; + +static EWRAM_DATA s16 gUnknown_02039320 = 0; +static EWRAM_DATA u16 gUnknown_02039322 = 0; // TASK A +EWRAM_DATA u8 gUnknown_02039324 = 0; +static EWRAM_DATA u8 gUnknown_02039325 = 0; + +extern u8 gReservedSpritePaletteCount; + +// data/hall_of_fame +extern void *gUnknown_0840B5A0[]; + +// data/credits +const u16 gUnknown_0840B7BC[] = INCBIN_U16("graphics/credits/palette_1.gbapal"); +const u8 gUnknown_0840B7FC[] = INCBIN_U8("graphics/credits/ampersand.4bpp"); +extern u8 gUnknown_0840B83C[]; +extern u8 gUnknown_0840B84B[]; +extern u8 gUnknown_0840B85A[]; +extern u8 gUnknown_0840B869[]; +extern u8 gUnknown_0840B878[]; +extern struct CreditsEntry *gCreditsEntryPointerTable[][5]; +extern u8 gUnknown_0840CA00[][2]; +extern struct SpriteSheet gUnknown_0840CAA0; +extern struct SpritePalette gUnknown_0840CAB0; +extern const union AnimCmd *const gSpriteAnimTable_0840CA54[]; +extern const union AnimCmd *const gSpriteAnimTable_0840CA94[]; +extern struct SpriteTemplate gSpriteTemplate_840CAEC; + +// graphics +extern u8 gCreditsCopyrightEnd_Gfx[]; +extern u16 gIntroCopyright_Pal[16]; + +static void task_a_8143B38(u8 taskIdA); +static void task_a_8143B68(u8 taskIdA); +static void task_a_8143BFC(u8 taskIdA); +static void task_a_80C9BFC(u8 taskIdA); +static void task_a_8143CC0(u8 taskIdA); +static void task_a_8143D04(u8 taskIdA); +static void task_a_8143EBC(u8 taskIdA); +static void task_a_8143F04(u8 taskIdA); +static void task_a_8143F3C(u8 taskIdA); +static void task_a_8143FDC(u8 taskIdA); +static void task_a_8144024(u8 taskIdA); +static void task_a_8144080(u8 taskIdA); +static void task_a_8144114(u8 taskIdA); +static void sub_8144130(void); +static void task_b_81441B8(u8 taskIdB); +static u8 sub_8144454(u8 page, u8 taskIdA); +static void task_d_8144514(u8 taskIdD); +static bool8 sub_8144ECC(u8 data, u8 taskIdA); +static void sub_81450AC(u8 taskIdA); +static void sub_8145128(u16, u16, u16); +static void sub_81452D0(u16 arg0, u16 palette); +static void spritecb_player_8145378(struct Sprite *sprite); +static void spritecb_rival_8145420(struct Sprite *sprite); +static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position); +static void sub_81458DC(void); + +static void vblank_8143948(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void sub_814395C(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + + if ((gMain.heldKeys & B_BUTTON) + && gUnknown_02039324 != 0 + && gTasks[gUnknown_02039322].func == task_a_8143B68) + { + vblank_8143948(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + gUnknown_02039325 = 1; + } +} + +void sub_81439D0(void) +{ + u8 taskIdA; + s16 taskIdC; + u8 taskIdB; + u16 savedIme; + struct Unk201C000 *c000; + + sub_8144130(); + SetVBlankCallback(NULL); + ResetPaletteFade(); + ResetTasks(); + + taskIdA = CreateTask(task_a_8143B38, 0); + + gTasks[taskIdA].data[TDA_4] = 0; + gTasks[taskIdA].data[TDA_7] = 0; + gTasks[taskIdA].data[TDA_11] = 0; + gTasks[taskIdA].data[TDA_13] = 1; + + while (TRUE) + { + if (sub_8144ECC(0, taskIdA)) + break; + } + + taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; + gTasks[taskIdC].data[TDC_0] = 40; + + SetUpWindowConfig(&gWindowConfig_81E7208); + InitMenuWindow(&gWindowConfig_81E7208); + LoadPalette(&gUnknown_0840B7BC, 0x80, sizeof(gUnknown_0840B7BC)); + + CpuCopy16(&gUnknown_0840B7FC, (void *)(VRAM + 0xBEE0), sizeof(gUnknown_0840B7FC)); + + REG_BG0VOFS = 0xFFFC; + + taskIdB = CreateTask(task_b_81441B8, 0); + + gTasks[taskIdB].data[TDB_TASK_A_ID] = taskIdA; + gTasks[taskIdA].data[TDA_TASK_B_ID] = taskIdB; + + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + + + SetVBlankCallback(vblank_8143948); + m4aSongNumStart(BGM_THANKFOR); + SetMainCallback2(sub_814395C); + gUnknown_02039325 = 0; + + c000 = &ewram1c000; + + sub_81458DC(); + + c000->unk88 = 0; + c000->unk8A = 0; + c000->unk8C = 0; + + gUnknown_02039322 = taskIdA; +} + +static void task_a_8143B38(u8 taskIdA) +{ + if (!gPaletteFade.active) + gTasks[taskIdA].func = task_a_8143B68; +} + +static void task_a_8143B68(u8 taskIdA) +{ + u16 data11; + + if (gTasks[taskIdA].data[TDA_4]) + { + s16 taskIdC; + + taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; + gTasks[taskIdC].data[TDC_0] = 30; + + gTasks[taskIdA].data[TDA_12] = 0x100; + gTasks[taskIdA].func = task_a_8143EBC; + return; + } + + gUnknown_02039320 = 0; + data11 = gTasks[taskIdA].data[TDA_11]; + + if (gTasks[taskIdA].data[TDA_11] == 1) + { + gTasks[taskIdA].data[TDA_13] = data11; + gTasks[taskIdA].data[TDA_11] = 0; + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskIdA].func = task_a_8143BFC; + } + else if (gTasks[taskIdA].data[TDA_11] == 2) + { + gTasks[taskIdA].data[TDA_13] = data11; + gTasks[taskIdA].data[TDA_11] = 0; + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskIdA].func = task_a_8143CC0; + } +} + +static void task_a_8143BFC(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + REG_DISPCNT = 0; + sub_81450AC(taskIdA); + gTasks[taskIdA].func = task_a_80C9BFC; + } +} + +static void task_a_80C9BFC(u8 taskIdA) +{ + u16 backup; + + SetVBlankCallback(NULL); + + if (sub_8144ECC(gTasks[taskIdA].data[TDA_7], taskIdA)) + { + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + + backup = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = backup; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + + SetVBlankCallback(vblank_8143948); + gTasks[taskIdA].func = task_a_8143B38; + } +} + +static void task_a_8143CC0(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + REG_DISPCNT = 0; + sub_81450AC(taskIdA); + gTasks[taskIdA].func = task_a_8143D04; + } +} + +void task_a_8143D04(u8 taskIdA) +{ + switch (gMain.state) + { + default: + case 0: + { + u16 i; + + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); + LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); + LoadPalette(gBirchBagGrassPal[0] + 1, 1, 31 * 2); + + for (i = 0; i < 0x800; i++) + HALL_OF_FAME_SHEET_0[i] = 0x11; + for (i = 0; i < 0x800; i++) + HALL_OF_FAME_SHEET_1[i] = 0x22; + for (i = 0; i < 0x800; i++) + HALL_OF_FAME_SHEET_2[i] = 0x33; + + EWRAM_1F800[0] = 0; + EWRAM_1F800[1] = 0x53FF; // light yellow + EWRAM_1F800[2] = 0x529F; // light red + EWRAM_1F800[3] = 0x7E94; // light blue + + LoadSpriteSheet(&gUnknown_0840CAA0); + LoadSpritePalette(&gUnknown_0840CAB0); + + gMain.state += 1; + break; + } + case 1: + gTasks[taskIdA].data[TDA_TASK_D_ID] = CreateTask(task_d_8144514, 0); + gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_STATE] = 1; + gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_TASK_A_ID] = taskIdA; + gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_2] = gTasks[taskIdA].data[TDA_7]; + + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + REG_BG3HOFS = 0; + REG_BG3VOFS = 32; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + + gMain.state = 0; + gUnknown_0203935C = 0; + gTasks[taskIdA].func = task_a_8143B38; + break; + } +} + +static void task_a_8143EBC(u8 taskIdA) +{ + if (gTasks[taskIdA].data[TDA_12]) + { + gTasks[taskIdA].data[TDA_12] -= 1; + return; + } + + BeginNormalPaletteFade(-1, 12, 0, 16, 0); + gTasks[taskIdA].func = task_a_8143F04; +} + +static void task_a_8143F04(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + sub_81450AC(taskIdA); + gTasks[taskIdA].func = task_a_8143F3C; + } +} + +static void task_a_8143F3C(u8 taskIdA) +{ + u16 backup; + + sub_8144130(); + ResetPaletteFade(); + sub_8145128(0, 0x3800, 0); + ResetSpriteData(); + FreeAllSpritePalettes(); + BeginNormalPaletteFade(-1, 8, 16, 0, 0); + + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + backup = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = backup; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; + + gTasks[taskIdA].data[TDA_0] = 0x100; + gTasks[taskIdA].func = task_a_8143FDC; +} + +static void task_a_8143FDC(u8 taskIdA) +{ + if (gTasks[taskIdA].data[TDA_0]) + { + gTasks[taskIdA].data[TDA_0] -= 1; + return; + } + + BeginNormalPaletteFade(-1, 6, 0, 16, 0); + gTasks[taskIdA].func = task_a_8144024; +} + +static void task_a_8144024(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + sub_81452D0(0x3800, 0); + + BeginNormalPaletteFade(-1, 0, 0, 0, 0); + gTasks[taskIdA].data[TDA_0] = 7200; + gTasks[taskIdA].func = task_a_8144080; + } +} + +static void task_a_8144080(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + if (gTasks[taskIdA].data[TDA_0] == 0) + { + FadeOutBGM(4); + BeginNormalPaletteFade(-1, 8, 0, 16, 0xFFFF); + gTasks[taskIdA].func = task_a_8144114; + return; + } + + if (gMain.newKeys) + { + FadeOutBGM(4); + BeginNormalPaletteFade(-1, 8, 0, 16, 0xFFFF); + gTasks[taskIdA].func = task_a_8144114; + return; + } + + if (gTasks[taskIdA].data[TDA_0] == 7144) + { + FadeOutBGM(8); + } + + if (gTasks[taskIdA].data[TDA_0] == 6840) + m4aSongNumStart(BGM_END); + + gTasks[taskIdA].data[TDA_0] -= 1; + } +} + +static void task_a_8144114(u8 taskIdA) +{ + if (!gPaletteFade.active) + SoftReset(0xFF); +} + +static void sub_8144130(void) +{ + REG_DISPCNT = 0; + + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); +} + +static void task_b_81441B8(u8 taskIdB) +{ + u16 i; + + switch (gTasks[taskIdB].data[TDB_0]) + { + case 0: + case 6: + case 7: + case 8: + case 9: + default: + if (!gPaletteFade.active) + { + gTasks[taskIdB].data[TDB_0] = 1; + gTasks[taskIdB].data[TDB_3] = 0x58; + gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0; + gUnknown_02039320 = 0; + } + return; + case 1: + if (gTasks[taskIdB].data[TDB_3] != 0) + { + gTasks[taskIdB].data[TDB_3] -= 1; + return; + } + gTasks[taskIdB].data[TDB_0] += 1; + return; + case 2: + REG_DISPCNT &= ~DISPCNT_BG0_ON; + if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == task_a_8143B68) + { + if (gTasks[taskIdB].data[TDB_CURRENT_PAGE] < PAGE_COUNT) + { + for (i = 0; i < 5; i++) + sub_8072BD8(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 0, 9 + i * 2, 240); + + gTasks[taskIdB].data[TDB_CURRENT_PAGE] += 1; + gTasks[taskIdB].data[TDB_0] += 1; + + gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 1; + + if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1) + BeginNormalPaletteFade(0x300, 0, 16, 0, COLOR_LIGHT_GREEN); + else + BeginNormalPaletteFade(0x300, 0, 16, 0, COLOR_DARK_GREEN); + return; + } + gTasks[taskIdB].data[TDB_0] = 10; + return; + } + gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0; + return; + case 3: + REG_DISPCNT |= DISPCNT_BG0_ON; + if (!gPaletteFade.active) + { + gTasks[taskIdB].data[TDB_3] = UNK_DEFINE_82; + gTasks[taskIdB].data[TDB_0] += 1; + } + return; + case 4: + if (gTasks[taskIdB].data[TDB_3] != 0) + { + gTasks[taskIdB].data[TDB_3] -= 1; + return; + } + + if (sub_8144454((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID])) + { + gTasks[taskIdB].data[TDB_0] += 1; + return; + } + gTasks[taskIdB].data[TDB_0] += 1; + if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1) + BeginNormalPaletteFade(0x300, 0, 0, 16, COLOR_LIGHT_GREEN); + else + BeginNormalPaletteFade(0x300, 0, 0, 16, COLOR_DARK_GREEN); + return; + case 5: + if (!gPaletteFade.active) + { + MenuZeroFillWindowRect(0, 9, 29, 19); + gTasks[taskIdB].data[TDB_0] = 2; + } + return; + + case 10: + gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_4] = 1; + DestroyTask(taskIdB); + return; + } +} + +static u8 sub_8144454(u8 page, u8 taskIdA) +{ + // Starts with bike + ocean + morning + + if (page == PAGE_PROGRAMMERS_1) + { + // Grass patch + gTasks[taskIdA].data[TDA_11] = 2; + } + + if (page == PAGE_POKEMON_GRAHPIC_DESIGNERS_3) + { + // Bike + ocean + sunset + gTasks[taskIdA].data[TDA_7] = 1; + gTasks[taskIdA].data[TDA_11] = 1; + } + + if (page == PAGE_GAME_DESIGNERS_2) + { + // Grass patch + gTasks[taskIdA].data[TDA_11] = 2; + } + + if (page == PAGE_MAP_DATA_DESIGNERS) + { + // Bike + forest + sunset + gTasks[taskIdA].data[TDA_7] = 2; + gTasks[taskIdA].data[TDA_11] = 1; + } + + if (page == PAGE_SPECIAL_THANKS_1) + { + // Grass patch + gTasks[taskIdA].data[TDA_11] = 2; + } + + if (page == PAGE_TASK_MANAGERS) + { + // Bike + forest + sunset + gTasks[taskIdA].data[TDA_7] = 3; + gTasks[taskIdA].data[TDA_11] = 1; + } + + if (page == PAGE_TRANSLATION_COORDINATOR) + { + // Grass patch + gTasks[taskIdA].data[TDA_11] = 2; + } + + if (page == LAST_PAGE) + { + // Bike + town + night + gTasks[taskIdA].data[TDA_7] = 4; + gTasks[taskIdA].data[TDA_11] = 1; + } + + if (gTasks[taskIdA].data[TDA_11] != 0) + { + // Returns true if changed? + return TRUE; + } + + return FALSE; +} + +static void task_d_8144514(u8 taskIdD) +{ + struct Unk201C000 *r6 = &ewram1c000; + u8 r2; + + switch (gTasks[taskIdD].data[TDD_STATE]) + { + case 0: + break; + case 1: + if (r6->unk8A == 0 && gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] == 0) + break; + gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] = 0; + gTasks[taskIdD].data[TDD_STATE]++; + break; + case 2: + if (r6->unk88 == POKEMON_TILE_COUNT || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != task_a_8143B68) + break; + r2 = sub_81456B4(r6->unk0[r6->unk8C], gUnknown_0840CA00[r6->unk8A][0], gUnknown_0840CA00[r6->unk8A][1], r6->unk8A); + if (r6->unk8C < r6->unk8E - 1) + { + r6->unk8C++; + gSprites[r2].data3 = 50; + } + else + { + r6->unk8C = 0; + gSprites[r2].data3 = 512; + } + r6->unk88++; + if (r6->unk8A == 2) + r6->unk8A = 0; + else + r6->unk8A++; + gTasks[taskIdD].data[TDD_3] = 50; + gTasks[taskIdD].data[TDD_STATE]++; + break; + case 3: + if (gTasks[taskIdD].data[TDD_3] != 0) + gTasks[taskIdD].data[TDD_3]--; + else + gTasks[taskIdD].data[TDD_STATE] = 1; + break; + } +} + +void task_c_8144664(u8 taskIdC) +{ + switch (gTasks[taskIdC].data[TDC_0]) + { + case 0: + gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); + gTasks[taskIdC].data[TDC_5]++; + break; + case 1: + if (gUnknown_0203935A != 0) + { + gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); + gTasks[taskIdC].data[TDC_5]++; + } + else + { + gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 2; + gTasks[taskIdC].data[TDC_5] = 0; + gTasks[taskIdC].data[TDC_0]++; + } + break; + case 2: + if (gTasks[taskIdC].data[TDC_5] < 64) + { + gTasks[taskIdC].data[TDC_5]++; + gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); + } + else + { + gTasks[taskIdC].data[TDC_0]++; + } + break; + case 3: + gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 3; + gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 1; + gTasks[taskIdC].data[TDC_4] = 120; + gTasks[taskIdC].data[TDC_0]++; + break; + case 4: + if (gTasks[taskIdC].data[TDC_4] != 0) + { + gTasks[taskIdC].data[TDC_4]--; + } + else + { + gTasks[taskIdC].data[TDC_5] = 64; + gTasks[taskIdC].data[TDC_0]++; + } + break; + case 5: + if (gTasks[taskIdC].data[TDC_5] > 0) + { + gTasks[taskIdC].data[TDC_5]--; + gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); + } + else + { + gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 1; + gTasks[taskIdC].data[TDC_0]++; + } + break; + case 6: + gTasks[taskIdC].data[TDC_0] = 50; + break; + case 10: + gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 2; + gTasks[taskIdC].data[TDC_0] = 50; + break; + case 20: + gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 4; + gTasks[taskIdC].data[TDC_0] = 50; + break; + case 30: + gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 5; + gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 3; + gTasks[taskIdC].data[TDC_0] = 50; + break; + case 50: + gTasks[taskIdC].data[TDC_0] = 0; + break; + } +} + +void task_e_8144934(u8 taskIdE) +{ + s16 taskIdC; + + switch (gTasks[taskIdE].data[TDE_0]) + { + default: + case 0: + if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) + { + + if (gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_B_ID]].data[TDB_CURRENT_PAGE] == PAGE_ART_DIRECTOR) + { + gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 20; + gTasks[taskIdE].data[TDE_1] = 0x7FFF; + } + } + sub_8149020(0); + break; + case 1: + sub_8149020(0); + break; + case 2: + if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) + { + taskIdC = gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]; + + // Floor to multiple of 128 + if ((gTasks[taskIdC].data[TDC_5] & -128) == 640) + { + gTasks[taskIdC].data[TDC_0] = 1; + gTasks[taskIdE].data[TDE_1] = 0x7FFF; + } + } + sub_8149020(1); + break; + case 3: + if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) + { + + if (gTasks[taskIdE].data[TDE_1] == UNK_DEF_1F3) + { + gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 10; + gTasks[taskIdE].data[TDE_1] = 0x7FFF; + } + else + { + gTasks[taskIdE].data[TDE_1] += 1; + } + } + sub_8149020(1); + break; + case 4: + sub_8149020(2); + break; + } +} + +static void sub_8144A68(u8 data, u8 taskIdA) +{ + switch (data) + { + case 0: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 272; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0; + gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8); + break; + case 1: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0; + gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8); + break; + case 2: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0; + gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8); + break; + case 3: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = -32; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0; + gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8); + break; + case 4: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 88; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 152; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0; + gTasks[taskIdA].data[TDA_0] = sub_8148EC0(2, 0x2000, 0x200, 8); + break; + } + + gTasks[taskIdA].data[TDA_TASK_E_ID] = CreateTask(task_e_8144934, 0); + gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_0] = data; + gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_1] = 0; + gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_TASK_A_ID] = taskIdA; + + gTasks[taskIdA].data[TDA_TASK_C_ID] = CreateTask(task_c_8144664, 0); + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_0] = 0; + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_1] = taskIdA; + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_2] = gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]; + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_3] = gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]; + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_4] = 0; + + if (data == 2) + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_5] = UNK_DEFINE_45; +} + +static bool8 sub_8144ECC(u8 data, u8 taskIdA) +{ + u8 spriteId; + + switch (gMain.state) + { + default: + case 0: + REG_DISPCNT = 0; + REG_BG3HOFS = 8; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + ResetSpriteData(); + FreeAllSpritePalettes(); + gMain.state = 1; + break; + case 1: + gUnknown_02039358 = 34; + gUnknown_0203935A = 0; + sub_8148CB0(data); + gMain.state += 1; + break; + case 2: + if (gSaveBlock2.playerGender == MALE) + { + LoadCompressedObjectPic(&gIntro2BrendanSpriteSheet); + LoadCompressedObjectPic(&gUnknown_08416E34); + LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet); + LoadSpritePalettes(gIntro2SpritePalettes); + + spriteId = intro_create_brendan_sprite(120, 46); + gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId; + gSprites[spriteId].callback = spritecb_player_8145378; + gSprites[spriteId].anims = gSpriteAnimTable_0840CA54; + + spriteId = intro_create_may_sprite(272, 46); + gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId; + gSprites[spriteId].callback = spritecb_rival_8145420; + gSprites[spriteId].anims = gSpriteAnimTable_0840CA94; + } + else + { + LoadCompressedObjectPic(&gIntro2MaySpriteSheet); + LoadCompressedObjectPic(&gUnknown_08416E24); + LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet); + LoadSpritePalettes(gIntro2SpritePalettes); + + spriteId = intro_create_may_sprite(120, 46); + gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId; + gSprites[spriteId].callback = spritecb_player_8145378; + gSprites[spriteId].anims = gSpriteAnimTable_0840CA54; + + spriteId = intro_create_brendan_sprite(272, 46); + gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId; + gSprites[spriteId].callback = spritecb_rival_8145420; + gSprites[spriteId].anims = gSpriteAnimTable_0840CA94; + }; + gMain.state += 1; + break; + case 3: + sub_8144A68(data, taskIdA); + sub_8148E90(data); + gMain.state = 0; + return TRUE; + } + return FALSE; +} + +static void sub_81450AC(u8 taskIdA) +{ + if (gTasks[taskIdA].data[TDA_0] != 0) + { + DestroyTask(gTasks[taskIdA].data[TDA_0]); + gTasks[taskIdA].data[TDA_0] = 0; + } + + if (gTasks[taskIdA].data[TDA_TASK_C_ID] != 0) + { + DestroyTask(gTasks[taskIdA].data[TDA_TASK_C_ID]); + gTasks[taskIdA].data[TDA_TASK_C_ID] = 0; + } + + if (gTasks[taskIdA].data[TDA_TASK_E_ID] != 0) + { + DestroyTask(gTasks[taskIdA].data[TDA_TASK_E_ID]); + gTasks[taskIdA].data[TDA_TASK_E_ID] = 0; + } + + if (gTasks[taskIdA].data[TDA_TASK_D_ID] != 0) + { + DestroyTask(gTasks[taskIdA].data[TDA_TASK_D_ID]); + gTasks[taskIdA].data[TDA_TASK_D_ID] = 0; + } + + gUnknown_0203935C = 1; +} + +static void sub_8145128(u16 arg0, u16 arg1, u16 arg2) +{ + u16 baseTile; + u16 i; + + LZ77UnCompVram(gCreditsCopyrightEnd_Gfx, (void *) (VRAM + arg0)); + LoadPalette(gIntroCopyright_Pal, arg2, sizeof(gIntroCopyright_Pal)); + + baseTile = (arg2 / 16) << 12; + + for (i = 0; i < 32 * 32; i++) + ((u16 *) (VRAM + arg1))[i] = baseTile + 1; + + for (i = 0; i < 21; i++) + ((u16 *) (VRAM + arg1))[7 * 32 + 4 + i] = i + 2 + baseTile; + + for (i = 0; i < 20; i++) + ((u16 *) (VRAM + arg1))[9 * 32 + 4 + i] = i + 23 + baseTile; + + for (i = 0; i < 23; i++) + ((u16 *) (VRAM + arg1))[11 * 32 + 4 + i] = i + 43 + baseTile; + + for (i = 0; i < 12; i++) + ((u16 *) (VRAM + arg1))[13 * 32 + 4 + i] = i + 66 + baseTile; +} + +u16 sub_8145208(u8 arg0) +{ + u16 out = (arg0 & 0x3F) + 80; + + if (arg0 == 0xFF) + return 1; + + if (arg0 & (1 << 7)) + out |= 1 << 11; + if (arg0 & (1 << 6)) + out |= 1 << 10; + + return out; +} + +void sub_814524C(u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palette) +{ + u8 y, x; + const u16 tileOffset = (palette / 16) << 12; + + for (y = 0; y < 5; y++) + { + for (x = 0; x < 3; x++) + ((u16 *) (VRAM + arg3 + (baseY + y) * 64))[baseX + x] = tileOffset + sub_8145208(arg0[y * 3 + x]); + } +} + +static void sub_81452D0(u16 arg0, u16 palette) +{ + u16 pos; + u16 baseTile = (palette / 16) << 12; + + for (pos = 0; pos < 32 * 32; pos++) + ((u16 *) (VRAM + arg0))[pos] = baseTile + 1; + +#if ENGLISH + sub_814524C(gUnknown_0840B83C, 3, 7, arg0, palette); + sub_814524C(gUnknown_0840B84B, 7, 7, arg0, palette); + sub_814524C(gUnknown_0840B85A, 11, 7, arg0, palette); + sub_814524C(gUnknown_0840B85A, 16, 7, arg0, palette); + sub_814524C(gUnknown_0840B869, 20, 7, arg0, palette); + sub_814524C(gUnknown_0840B878, 24, 7, arg0, palette); +#elif GERMAN + sub_814524C(gUnknown_0840B85A, 7, 7, arg0, palette); + sub_814524C(gUnknown_0840B869, 11, 7, arg0, palette); + sub_814524C(gUnknown_0840B878, 15, 7, arg0, palette); + sub_814524C(gUnknown_0840B85A, 19, 7, arg0, palette); +#endif +} + +static void spritecb_player_8145378(struct Sprite *sprite) +{ + if (gUnknown_0203935C != 0) + { + DestroySprite(sprite); + return; + } + + switch (sprite->data0) + { + case 0: + StartSpriteAnimIfDifferent(sprite, 0); + break; + case 1: + StartSpriteAnimIfDifferent(sprite, 1); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 1; + break; + case 2: + StartSpriteAnimIfDifferent(sprite, 2); + break; + case 3: + StartSpriteAnimIfDifferent(sprite, 3); + break; + case 4: + StartSpriteAnimIfDifferent(sprite, 0); + if (sprite->pos1.x > 120) + sprite->pos1.x -= 1; + break; + case 5: + StartSpriteAnimIfDifferent(sprite, 0); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 1; + break; + } +} + +static void spritecb_rival_8145420(struct Sprite *sprite) +{ + if (gUnknown_0203935C != 0) + { + DestroySprite(sprite); + return; + } + + switch (sprite->data0) + { + case 0: + sprite->pos2.y = 0; + StartSpriteAnimIfDifferent(sprite, 0); + break; + case 1: + if (sprite->pos1.x > 200) + StartSpriteAnimIfDifferent(sprite, 1); + else + StartSpriteAnimIfDifferent(sprite, 2); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 2; + sprite->pos2.y = -gUnknown_0203935A; + break; + case 2: + sprite->data7 += 1; + StartSpriteAnimIfDifferent(sprite, 0); + if ((sprite->data7 & 3) == 0) + sprite->pos1.x += 1; + break; + case 3: + StartSpriteAnimIfDifferent(sprite, 0); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 1; + break; + } +} + +void spritecb_81454E0(struct Sprite *sprite) +{ + if (gUnknown_0203935C) + { + DestroySprite(sprite); + return; + } + + sprite->data7 += 1; + switch (sprite->data0) + { + case 0: + default: + sprite->oam.affineMode = 1; + sprite->oam.matrixNum = sprite->data1; + sprite->data2 = 16; + SetOamMatrix(sprite->data1, 0x10000 / sprite->data2, 0, 0, 0x10000 / sprite->data2); + sprite->invisible = FALSE; + sprite->data0 = 1; + break; + case 1: + if (sprite->data2 < 256) + { + sprite->data2 += 8; + SetOamMatrix(sprite->data1, 0x10000 / sprite->data2, 0, 0, 0x10000 / sprite->data2); + } + else + { + sprite->data0 += 1; + } + switch (sprite->data1) + { + case 1: + if ((sprite->data7 & 3) == 0) + sprite->pos1.y += 1; + sprite->pos1.x -= 2; + break; + case 2: + break; + case 3: + if ((sprite->data7 & 3) == 0) + sprite->pos1.y += 1; + sprite->pos1.x += 2; + break; + } + break; + case 2: + if (sprite->data3 != 0) + { + sprite->data3 -= 1; + } + else + { + REG_BLDCNT = 0xF40; + REG_BLDALPHA = 0x10; + sprite->oam.objMode = 1; + sprite->data3 = 16; + sprite->data0 += 1; + } + break; + case 3: + if (sprite->data3 != 0) + { + int data3; + vu16 *reg; + + sprite->data3 -= 1; + + reg = ®_BLDALPHA; + data3 = 16 - sprite->data3; + *reg = (data3 << 8) + sprite->data3; + } + else + { + sprite->invisible = TRUE; + sprite->data0 = 10; + } + break; + case 10: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroySprite(sprite); + break; + } +} + +static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position) +{ + u32 personality; + const u8 *lzPaletteData; + u8 spriteId; + u8 spriteId2; + + species = NationalPokedexNumToSpecies(species); + switch (species) + { + default: + personality = 0; + break; + case SPECIES_SPINDA: + personality = gSaveBlock2.pokedex.spindaPersonality; + break; + case SPECIES_UNOWN: + personality = gSaveBlock2.pokedex.unownPersonality; + break; + } + + LoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, + gMonFrontPicCoords[species].y_offset, + 0x2000000, + gUnknown_0840B5A0[position], + species, + personality, + 1 + ); + + lzPaletteData = species_and_otid_get_pal(species, 0, 0xFFFF); + LoadCompressedPalette(lzPaletteData, 0x100 + (position * 16), 0x20); + sub_8143648(position, position); + + spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); + gSprites[spriteId].oam.paletteNum = position; + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].data1 = position + 1; + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].callback = spritecb_81454E0; + + spriteId2 = CreateSprite(&gSpriteTemplate_840CAEC, gSprites[spriteId].pos1.x, gSprites[spriteId].pos1.y, 1); + gSprites[spriteId2].data0 = spriteId; + + StartSpriteAnimIfDifferent(&gSprites[spriteId2], position); + + return spriteId; +} + +void spritecb_814580C(struct Sprite *sprite) +{ + if (gSprites[sprite->data0].data0 == 10 || gUnknown_0203935C) + { + DestroySprite(sprite); + return; + } + + sprite->invisible = gSprites[sprite->data0].invisible; + sprite->oam.objMode = gSprites[sprite->data0].oam.objMode; + sprite->oam.affineMode = gSprites[sprite->data0].oam.affineMode; + sprite->oam.matrixNum = gSprites[sprite->data0].oam.matrixNum; + sprite->pos1.x = gSprites[sprite->data0].pos1.x; + sprite->pos1.y = gSprites[sprite->data0].pos1.y; +} + +static void sub_81458DC(void) +{ + struct Unk201C000 *unk201C000 = &ewram1c000; + u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_FIRST_POKE))); + u16 seenTypesCount; + u16 page; + u16 dexNum; + u16 j; + + for (dexNum = 1, seenTypesCount = 0; dexNum < 386; dexNum++) + { + if (GetNationalPokedexFlag(dexNum, 1)) + { + unk201C000->unk90[seenTypesCount] = dexNum; + seenTypesCount++; + } + } + + for (dexNum = seenTypesCount; dexNum < 386; dexNum++) + unk201C000->unk90[dexNum] = 0; + + unk201C000->unk394 = seenTypesCount; + if (unk201C000->unk394 < POKEMON_TILE_COUNT) + unk201C000->unk8E = seenTypesCount; + else + unk201C000->unk8E = POKEMON_TILE_COUNT; + + j = 0; + do + { + page = Random() % unk201C000->unk394; + unk201C000->unk0[j] = unk201C000->unk90[page]; + + j++; + unk201C000->unk90[page] = 0; + unk201C000->unk394--; + if (page != unk201C000->unk394) + { + unk201C000->unk90[page] = unk201C000->unk90[unk201C000->unk394]; + unk201C000->unk90[unk201C000->unk394] = 0; + } + } + while (unk201C000->unk394 != 0 && j < POKEMON_TILE_COUNT); + + if (unk201C000->unk8E < POKEMON_TILE_COUNT) + { + for (j = unk201C000->unk8E, page = 0; j < POKEMON_TILE_COUNT; j++) + { + unk201C000->unk0[j] = unk201C000->unk0[page]; + + page++; + if (page == unk201C000->unk8E) + page = 0; + } + unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; + } + else + { + for (dexNum = 0; unk201C000->unk0[dexNum] != starter && dexNum < POKEMON_TILE_COUNT; dexNum++); + + if (dexNum < unk201C000->unk8E - 1) + { + unk201C000->unk0[dexNum] = unk201C000->unk0[POKEMON_TILE_COUNT - 1]; + unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; + } + else + { + unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; + } + } + unk201C000->unk8E = POKEMON_TILE_COUNT; +} diff --git a/src/scene/egg_hatch.c b/src/scene/egg_hatch.c new file mode 100644 index 000000000..32fbe1547 --- /dev/null +++ b/src/scene/egg_hatch.c @@ -0,0 +1,52 @@ +#include "global.h" +#include "pokemon.h" + +void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp) { + u16 species; + u32 personality, pokerus; + u8 i, friendship, language, gameMet, markings; + u16 moves[4]; + u32 ivs[6]; + + + species = GetMonData(egg, MON_DATA_SPECIES); + + for (i = 0; i < 4; i++) + { + moves[i] = GetMonData(egg, MON_DATA_MOVE1 + i); + } + + personality = GetMonData(egg, MON_DATA_PERSONALITY); + + for (i = 0; i < 6; i++) + { + ivs[i] = GetMonData(egg, MON_DATA_HP_IV + i); + } + + gameMet = GetMonData(egg, MON_DATA_MET_GAME); + markings = GetMonData(egg, MON_DATA_MARKINGS); + pokerus = GetMonData(egg, MON_DATA_POKERUS); + + CreateMon(temp, species, 5, 32, TRUE, personality, 0, 0); + + for (i = 0; i < 4; i++) + { + SetMonData(temp, MON_DATA_MOVE1 + i, (const u8 *) &moves[i]); + } + + for (i = 0; i < 6; i++) + { + SetMonData(temp, MON_DATA_HP_IV + i, (const u8 *) &ivs[i]); + } + + language = GAME_LANGUAGE; + SetMonData(temp, MON_DATA_LANGUAGE, &language); + SetMonData(temp, MON_DATA_MET_GAME, &gameMet); + SetMonData(temp, MON_DATA_MARKINGS, &markings); + + friendship = 120; + SetMonData(temp, MON_DATA_FRIENDSHIP, &friendship); + SetMonData(temp, MON_DATA_POKERUS, (const u8 *) &pokerus); + + *egg = *temp; +} diff --git a/src/scene/intro.c b/src/scene/intro.c new file mode 100644 index 000000000..a43e0356c --- /dev/null +++ b/src/scene/intro.c @@ -0,0 +1,3167 @@ +#include "global.h" +#include "gba/m4a_internal.h" +#include "intro.h" +#include "data2.h" +#include "decompress.h" +#include "hall_of_fame.h" +#include "intro_credits_graphics.h" +#include "libgncmultiboot.h" +#include "link.h" +#include "m4a.h" +#include "main.h" +#include "new_game.h" +#include "palette.h" +#include "rng.h" +#include "save.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "task.h" +#include "title_screen.h" +#include "trig.h" +#include "unknown_task.h" + +extern struct SpriteTemplate gUnknown_02024E8C; +extern u16 gUnknown_02039358; +extern u16 gUnknown_0203935A; +extern u16 gSaveFileStatus; +extern u8 gReservedSpritePaletteCount; +extern const u8 gInterfaceGfx_PokeBall[]; +extern const u8 gInterfacePal_PokeBall[]; +extern const u8 gIntroCopyright_Gfx[]; +extern const u16 gIntroCopyright_Pal[]; +extern const u16 gIntroCopyright_Tilemap[]; +extern void *const gUnknown_0840B5A0[]; + +static EWRAM_DATA u16 gUnknown_02039318 = 0; +static EWRAM_DATA u16 gUnknown_0203931A = 0; + +u32 gIntroFrameCounter; +struct GcmbStruct gMultibootProgramStruct; + +//-------------------------------------------------- +// Graphics Data +//-------------------------------------------------- + +static const u16 Palette_406340[] = INCBIN_U16("graphics/intro/unknown1.gbapal"); +static const u16 Palette_406360[] = INCBIN_U16("graphics/intro/unknown2.gbapal"); +#if ENGLISH +static const u8 gIntroTiles[] = INCBIN_U8("graphics/intro/intro.4bpp.lz"); +#elif GERMAN +extern const u8 gIntroTiles[]; +#endif +static const u16 gIntro1BGPals[][16] = +{ + INCBIN_U16("graphics/intro/intro1_bgpal1.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal2.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal3.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal4.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal5.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal6.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal7.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal8.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal9.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal10.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal11.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal12.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal13.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal14.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal15.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal16.gbapal"), +}; +static const u8 gIntro1BG0_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg0_map.bin.lz"); +static const u8 gIntro1BG1_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg1_map.bin.lz"); +static const u8 gIntro1BG2_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg2_map.bin.lz"); +static const u8 gIntro1BG3_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg3_map.bin.lz"); +static const u8 gIntro1BGLeavesGfx[] = INCBIN_U8("graphics/intro/introgfx.4bpp.lz"); +static const u16 gIntro3PokeballPal[] = INCBIN_U16("graphics/intro/intro3_pokeball.gbapal"); +static const u8 gIntro3Pokeball_Tilemap[] = INCBIN_U8("graphics/intro/intro3_pokeball_map.bin.lz"); +static const u8 gIntro3Pokeball_Gfx[] = INCBIN_U8("graphics/intro/intro3_pokeball.8bpp.lz"); +static const u16 gIntro3Streaks_Pal[] = INCBIN_U16("graphics/intro/intro3_streaks.gbapal"); +static const u8 gIntro3Streaks_Gfx[] = INCBIN_U8("graphics/intro/intro3_streaks.4bpp.lz"); +static const u8 gIntro3Streaks_Tilemap[] = INCBIN_U8("graphics/intro/intro3_streaks_map.bin.lz"); +static const u16 gIntro3Misc1Palette[] = INCBIN_U16("graphics/intro/intro3_misc1.gbapal"); +static const u16 gIntro3Misc2Palette[] = INCBIN_U16("graphics/intro/intro3_misc2.gbapal"); +static const u8 gIntro3MiscTiles[] = INCBIN_U8("graphics/intro/intro3_misc.4bpp.lz"); +static const u16 gIntro1EonPalette[] = INCBIN_U16("graphics/intro/intro1_eon.gbapal"); +static const u8 gIntro1EonTiles[] = INCBIN_U8("graphics/intro/intro1_eon.4bpp.lz"); +static const struct OamData gOamData_840ADE8 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840ADF0[] = +{ + ANIMCMD_FRAME(16, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840ADF8[] = +{ + ANIMCMD_FRAME(24, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AE00[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AE08[] = +{ + ANIMCMD_FRAME(48, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840AE10[] = +{ + gSpriteAnim_840ADF0, + gSpriteAnim_840ADF8, + gSpriteAnim_840AE00, + gSpriteAnim_840AE08, +}; +static void sub_813D208(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840AE20 = +{ + .tileTag = 2000, + .paletteTag = 2000, + .oam = &gOamData_840ADE8, + .anims = gSpriteAnimTable_840AE10, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813D208, +}; +static const union AnimCmd Unknown_40AE38[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(128, 4), + ANIMCMD_FRAME(192, 4), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd Unknown_40AE4C[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(64, 8), + ANIMCMD_FRAME(128, 8), + ANIMCMD_FRAME(192, 8), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd Unknown_40AE60[] = +{ + ANIMCMD_FRAME(256, 4), + ANIMCMD_FRAME(0x140, 4), + ANIMCMD_FRAME(0x180, 4), + ANIMCMD_END, +}; +static const union AnimCmd Unknown_40AE70[] = +{ + ANIMCMD_FRAME(0x180, 16), + ANIMCMD_FRAME(0x140, 16), + ANIMCMD_FRAME(256, 16), + ANIMCMD_END, +}; +static const union AnimCmd *const gUnknown_0840AE80[] = +{ + Unknown_40AE38, + Unknown_40AE4C, + Unknown_40AE60, + Unknown_40AE70, +}; +static const struct OamData gOamData_840AE90 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_840AE98 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_840AEA0 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 2, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840AEA8[] = +{ + ANIMCMD_FRAME(80, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEB0[] = +{ + ANIMCMD_FRAME(84, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEB8[] = +{ + ANIMCMD_FRAME(88, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEC0[] = +{ + ANIMCMD_FRAME(92, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEC8[] = +{ + ANIMCMD_FRAME(96, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AED0[] = +{ + ANIMCMD_FRAME(100, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AED8[] = +{ + ANIMCMD_FRAME(104, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEE0[] = +{ + ANIMCMD_FRAME(112, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEE8[] = +{ + ANIMCMD_FRAME(113, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEF0[] = +{ + ANIMCMD_FRAME(114, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEF8[] = +{ + ANIMCMD_FRAME(115, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AF00[] = +{ + ANIMCMD_FRAME(116, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AF08[] = +{ + ANIMCMD_FRAME(117, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AF10[] = +{ + ANIMCMD_FRAME(128, 8), + ANIMCMD_END, +}; +#if GERMAN +static const union AnimCmd gSpriteAnim_8416DA4[] = +{ + ANIMCMD_FRAME(118, 8), + ANIMCMD_END, +}; +#endif +static const union AnimCmd *const gSpriteAnimTable_840AF18[] = +{ + gSpriteAnim_840AEA8, + gSpriteAnim_840AEB0, + gSpriteAnim_840AEB8, + gSpriteAnim_840AEC0, + gSpriteAnim_840AEC8, + gSpriteAnim_840AED0, + gSpriteAnim_840AED8, +}; +static const union AnimCmd *const gSpriteAnimTable_840AF34[] = +{ + gSpriteAnim_840AEE0, + gSpriteAnim_840AEE8, + gSpriteAnim_840AEF0, + gSpriteAnim_840AEF8, + gSpriteAnim_840AF00, + gSpriteAnim_840AF08, +#if GERMAN + gSpriteAnim_8416DA4, +#endif +}; +static const union AnimCmd *const gSpriteAnimTable_840AF4C[] = +{ + gSpriteAnim_840AF10, +}; +static const s16 gUnknown_0840AF50[][2] = +{ + {0, -72}, + {1, -56}, + {2, -40}, + {3, -24}, + {4, 8}, + {5, 24}, + {3, 40}, + {1, 56}, + {6, 72}, +}; +static const s16 gUnknown_0840AF74[][2] = +{ + {0, -28}, + {1, -20}, + {2, -12}, + {3, -4}, + {2, 4}, + {4, 12}, + {5, 20}, + {3, 28}, +}; +static void sub_813D908(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840AF94 = +{ + .tileTag = 2000, + .paletteTag = 2001, + .oam = &gOamData_840AE90, + .anims = gSpriteAnimTable_840AF18, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813D908, +}; +static const struct SpriteTemplate gSpriteTemplate_840AFAC = +{ + .tileTag = 2000, + .paletteTag = 2001, + .oam = &gOamData_840AE98, + .anims = gSpriteAnimTable_840AF34, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813D908, +}; +static const struct SpriteTemplate gSpriteTemplate_840AFC4 = +{ + .tileTag = 2000, + .paletteTag = 2001, + .oam = &gOamData_840AEA0, + .anims = gSpriteAnimTable_840AF4C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813D908, +}; +static const struct OamData gOamData_840AFDC = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840AFE4[] = +{ + ANIMCMD_FRAME(0, 10), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd *const gSpriteAnimTable_840AFEC[] = +{ + gSpriteAnim_840AFE4, +}; +static void sub_813DA64(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840AFF0 = +{ + .tileTag = 2002, + .paletteTag = 2002, + .oam = &gOamData_840AFDC, + .anims = gSpriteAnimTable_840AFEC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813DA64, +}; +const struct CompressedSpriteSheet gUnknown_0840B008[] = +{ + {gIntroTiles, 0x1400, 2000}, + {NULL}, +}; +const struct CompressedSpriteSheet gUnknown_0840B018[] = +{ + {gIntro1EonTiles, 0x400, 2002}, + {NULL}, +}; +const struct SpritePalette gUnknown_0840B028[] = +{ + {Palette_406340, 2000}, + {Palette_406360, 2001}, + {gIntro1EonPalette, 2002}, + {NULL}, +}; +static const union AnimCmd gUnknown_0840B048[] = +{ + ANIMCMD_FRAME(3, 0), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_0840B050[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_0840B058[] = +{ + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gUnknown_0840B064[] = +{ + gUnknown_0840B048, + gUnknown_0840B050, + gUnknown_0840B058, +}; +static const struct OamData gOamData_840B070 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B078[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840B080[] = +{ + gSpriteAnim_840B078, +}; +static void sub_813E30C(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B084 = +{ + .tileTag = 2002, + .paletteTag = 2002, + .oam = &gOamData_840B070, + .anims = gSpriteAnimTable_840B080, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813E30C, +}; +static const struct OamData gOamData_840B09C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B0A4[] = +{ + ANIMCMD_FRAME(1, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840B0AC[] = +{ + gSpriteAnim_840B0A4, +}; +static void sub_813E4B8(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B0B0 = +{ + .tileTag = 2003, + .paletteTag = 2003, + .oam = &gOamData_840B09C, + .anims = gSpriteAnimTable_840B0AC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813E4B8, +}; +static const struct OamData gOamData_840B0C8 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B0D0[] = +{ + ANIMCMD_FRAME(14, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840B0D8[] = +{ + gSpriteAnim_840B0D0, +}; +static void sub_813E5E0(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B0DC = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B0C8, + .anims = gSpriteAnimTable_840B0D8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813E5E0, +}; +static void sub_813E6C0(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B0F4 = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B0C8, + .anims = gSpriteAnimTable_840B0D8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813E6C0, +}; +static const struct OamData gOamData_840B10C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B114[] = +{ + ANIMCMD_FRAME(6, 8), + ANIMCMD_FRAME(6, 8, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd *const gSpriteAnimTable_840B120[] = +{ + gSpriteAnim_840B114, +}; +static void sub_813E804(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B124 = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B10C, + .anims = gSpriteAnimTable_840B120, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813E804, +}; +static const struct OamData gOamData_840B13C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B144[] = +{ + ANIMCMD_FRAME(10, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840B14C[] = +{ + gSpriteAnim_840B144, +}; +static void sub_813E980(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B150 = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B13C, + .anims = gSpriteAnimTable_840B14C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813E980, +}; +static const u8 gUnknown_0840B168[] = {0xE6, 0xEB, 0xE4, 0xEA, 0xE5, 0xE9, 0xE7, 0xE8}; +static void sub_813EA60(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B170 = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B13C, + .anims = gSpriteAnimTable_840B14C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813EA60, +}; +static const u16 gUnknown_0840B188[] = {0x200, 0x1C0, 0x180, 0x140, 0x100, 0xE0, 0xC0, 0xA0, 0x80, 0x80}; +static const struct OamData gOamData_840B19C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B1A4[] = +{ + ANIMCMD_FRAME(2, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840B1AC[] = +{ + gSpriteAnim_840B1A4, +}; +static void sub_813EBBC(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B1B0 = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B19C, + .anims = gSpriteAnimTable_840B1AC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813EBBC, +}; +static void sub_813EC90(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B1C8 = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B19C, + .anims = gSpriteAnimTable_840B1AC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813EC90, +}; +static const struct OamData gOamData_840B1E0 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B1E8[] = +{ + ANIMCMD_FRAME(16, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840B1F0[] = +{ + gSpriteAnim_840B1E8, +}; +static void sub_813EDFC(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B1F4 = +{ + .tileTag = 2003, + .paletteTag = 2003, + .oam = &gOamData_840B1E0, + .anims = gSpriteAnimTable_840B1F0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813EDFC, +}; +const struct CompressedSpriteSheet gIntro3PokeballGfx_Table[] = +{ + {gInterfaceGfx_PokeBall, 0x100, 2002}, + {NULL}, +}; +const struct CompressedSpriteSheet gIntro3MiscGfx_Table[] = +{ + {gIntro3MiscTiles, 0xa00, 2003}, + {NULL}, +}; +const struct CompressedSpritePalette gInterfacePokeballPal_Table[] = +{ + {gInterfacePal_PokeBall, 2002}, + {NULL}, +}; +const struct SpritePalette gIntro3MiscPal_Table[] = +{ + {gIntro3Misc1Palette, 2003}, + {gIntro3Misc2Palette, 2004}, + {NULL}, +}; +const u32 unusedData = 0x02000000; + +static void MainCB2_EndIntro(void); +static void Task_IntroLoadPart1Graphics(u8); +static void Task_IntroFadeIn(u8); +static void Task_IntroWaterDrops(u8); +static void Task_IntroScrollDownAndShowEon(u8); +static void Task_IntroWaitToSetupPart2(u8); +static void Task_IntroLoadPart2Graphics(u8); +static void Task_IntroStartBikeRide(u8); +static void Task_IntroHandleBikeAndEonMovement(u8); +static void Task_IntroWaitToSetupPart3(u8); +static void Task_IntroLoadPart3Graphics(u8); +static void Task_IntroSpinAndZoomPokeball(u8); +static void Task_IntroWaitToSetupPart3DoubleFight(u8); +static void Task_IntroLoadPart3Streaks(u8); +static void task_intro_14(u8); +static void task_intro_15(u8); +static void task_intro_16(u8); +static void task_intro_17(u8); +static void Task_IntroPokemonBattle(u8); +static void task_intro_19(u8); +static void task_intro_20(u8); +static void intro_reset_and_hide_bgs(void); +static void sub_813CCE8(u8); +static u16 sub_813CE88(u16, s16, s16, u16, u8); +static u8 sub_813CFA8(u16, u16, u16, u16); +static void sub_813D084(u8); +static void sub_813D220(struct Sprite *); +static void sub_813D368(struct Sprite *); +static void sub_813D414(struct Sprite *); +static void SpriteCB_WaterDropFall(struct Sprite *); +static u8 CreateWaterDrop(s16, s16, u16, u16, u16, u8); +static void sub_813D788(struct Sprite *); +static void sub_813D880(struct Sprite *); +static u8 CreateGameFreakLogo(s16, s16, u8); +static void sub_813DB9C(struct Sprite *); +static void sub_813DE70(struct Sprite *); +static void sub_813E10C(struct Sprite *); +static void sub_813E210(struct Sprite *); +static void sub_813E580(u16, u16); +static void sub_813E7C0(u8); +static void sub_813E930(u8); +static void InitIntroTorchicAttackAnim(u8); +static void InitIntroMudkipAttackAnim(u8); + +static void VBlankCB_Intro(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void MainCB2_Intro(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + if (gMain.newKeys && !gPaletteFade.active) + SetMainCallback2(MainCB2_EndIntro); + else if (gIntroFrameCounter != -1) + gIntroFrameCounter++; +} + +static void MainCB2_EndIntro(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitTitleScreen); +} + +static void LoadCopyrightGraphics(u16 tilesetAddress, u16 tilemapAddress, u16 paletteAddress) +{ + LZ77UnCompVram(gIntroCopyright_Gfx, (void *)(VRAM + tilesetAddress)); + LoadPalette(gIntroCopyright_Pal, paletteAddress, 0x20); + CpuCopy16(gIntroCopyright_Tilemap, (void *)(VRAM + tilemapAddress), 0x500); +} + +static void SerialCB_CopyrightScreen(void) +{ + GameCubeMultiBoot_HandleSerialInterrupt(&gMultibootProgramStruct); +} + +static u8 SetUpCopyrightScreen(void) +{ + u16 ime; + + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + *(u16 *)PLTT = 0x7FFF; + REG_DISPCNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); + ResetPaletteFade(); + LoadCopyrightGraphics(0, 0x3800, 0); + remove_some_task(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF); + REG_BG0CNT = BGCNT_PRIORITY(0) + | BGCNT_CHARBASE(0) + | BGCNT_SCREENBASE(7) + | BGCNT_16COLOR + | BGCNT_TXT256x256; + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(VBlankCB_Intro); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; + SetSerialCallback(SerialCB_CopyrightScreen); + GameCubeMultiBoot_Init(&gMultibootProgramStruct); + default: + UpdatePaletteFade(); + gMain.state++; + GameCubeMultiBoot_Main(&gMultibootProgramStruct); + break; + case 140: + GameCubeMultiBoot_Main(&gMultibootProgramStruct); + if (gMultibootProgramStruct.gcmb_field_2 != 1) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + gMain.state++; + } + break; + case 141: + if (UpdatePaletteFade()) + break; + CreateTask(Task_IntroLoadPart1Graphics, 0); + SetMainCallback2(MainCB2_Intro); + if (gMultibootProgramStruct.gcmb_field_2) + { + GameCubeMultiBoot_ExecuteProgram(&gMultibootProgramStruct); + } + else + { + GameCubeMultiBoot_Quit(); + SetSerialCallback(SerialCB); + } + return 0; + } + + return 1; +} + +void CB2_InitCopyrightScreenAfterBootup(void) +{ + if (!SetUpCopyrightScreen()) + { + sub_8052E4C(); + ResetSaveCounters(); + sub_8125EC8(0); + if (gSaveFileStatus == 0 || gSaveFileStatus == 2) + ClearSav2(); + SetPokemonCryStereo(gSaveBlock2.optionsSound); + } +} + +void CB2_InitCopyrightScreenAfterTitleScreen(void) +{ + SetUpCopyrightScreen(); +} + +static void Task_IntroLoadPart1Graphics(u8 taskId) +{ + SetVBlankCallback(NULL); + gUnknown_02039318 = Random() & 1; + intro_reset_and_hide_bgs(); + REG_BG3VOFS = 0; + REG_BG2VOFS = 0x50; + REG_BG1VOFS = 0x18; + REG_BG0VOFS = 0x28; + LZ77UnCompVram(gIntro1BGLeavesGfx, (void *)VRAM); + LZ77UnCompVram(gIntro1BG0_Tilemap, (void *)(VRAM + 0x8000)); + DmaClear16(3, VRAM + 0x8800, 0x800); + LZ77UnCompVram(gIntro1BG1_Tilemap, (void *)(VRAM + 0x9000)); + DmaClear16(3, VRAM + 0x9800, 0x800); + LZ77UnCompVram(gIntro1BG2_Tilemap, (void *)(VRAM + 0xA000)); + DmaClear16(3, VRAM + 0xA800, 0x800); + LZ77UnCompVram(gIntro1BG3_Tilemap, (void *)(VRAM + 0xB000)); + DmaClear16(3, VRAM + 0xB800, 0x800); + LoadPalette(gIntro1BGPals, 0, sizeof(gIntro1BGPals)); + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(22) | BGCNT_16COLOR | BGCNT_TXT256x512; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(20) | BGCNT_16COLOR | BGCNT_TXT256x512; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(18) | BGCNT_16COLOR | BGCNT_TXT256x512; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(16) | BGCNT_16COLOR | BGCNT_TXT256x512; + LoadCompressedObjectPic(&gUnknown_0840B008[0]); + LoadCompressedObjectPic(&gUnknown_0840B018[0]); + LoadSpritePalettes(gUnknown_0840B028); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1F0, 0x20); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1E1, 0x1E); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1D2, 0x1C); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1C3, 0x1A); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1B4, 0x18); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1A5, 0x16); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x196, 0x14); + gTasks[taskId].data[0] = CreateWaterDrop(236, -14, 0x200, 1, 0x78, FALSE); + gTasks[taskId].func = Task_IntroFadeIn; +} + +static void Task_IntroFadeIn(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + SetVBlankCallback(VBlankCB_Intro); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + gTasks[taskId].func = Task_IntroWaterDrops; + gIntroFrameCounter = 0; + m4aSongNumStart(0x19E); + ResetSerial(); +} + +static void Task_IntroWaterDrops(u8 taskId) +{ + //start moving rock + if (gIntroFrameCounter == 76) + gSprites[gTasks[taskId].data[0]].data0 = 1; + + //drop rock + if (gIntroFrameCounter == 251) + gSprites[gTasks[taskId].data[0]].data0 = 2; + + if (gIntroFrameCounter == 368) + CreateWaterDrop(48, 0, 0x400, 5, 0x70, TRUE); + if (gIntroFrameCounter == 384) + CreateWaterDrop(200, 60, 0x400, 9, 0x80, TRUE); + + if (gIntroFrameCounter == 560) + CreateGameFreakLogo(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, CreateTask(sub_813CCE8, 0)); + + if (gIntroFrameCounter > 739) + { + gTasks[taskId].data[1] = 0x50; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0x18; + gTasks[taskId].data[4] = 0; + gTasks[taskId].data[5] = 0x28; + gTasks[taskId].data[6] = 0; + gTasks[taskId].func = Task_IntroScrollDownAndShowEon; + } +} + +static void Task_IntroScrollDownAndShowEon(u8 taskId) +{ + if (gIntroFrameCounter < 904) + { + s32 r2; + + //slide backgrounds downward + r2 = (gTasks[taskId].data[1] << 16) + (u16)gTasks[taskId].data[2] - 0xC000; + gTasks[taskId].data[1] = r2 >> 16; + gTasks[taskId].data[2] = r2; + REG_BG2VOFS = gTasks[taskId].data[1]; + r2 = (gTasks[taskId].data[3] << 16) + (u16)gTasks[taskId].data[4] - 0x10000; + gTasks[taskId].data[3] = r2 >> 16; + gTasks[taskId].data[4] = r2; + REG_BG1VOFS = gTasks[taskId].data[3]; + r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6] - 0x18000; + gTasks[taskId].data[5] = r2 >> 16; + gTasks[taskId].data[6] = r2; + REG_BG0VOFS = gTasks[taskId].data[5]; + + //show Lati@s sprite + if (gIntroFrameCounter == 880) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_840AFF0, 200, 160, 10); + + gSprites[spriteId].invisible = 1; + } + } + else + { + //fade to white + if (gIntroFrameCounter > 1007) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0xFFFF); + gTasks[taskId].func = Task_IntroWaitToSetupPart2; + } + } +} + +static void Task_IntroWaitToSetupPart2(u8 taskId) +{ + if (gIntroFrameCounter > 1026) + gTasks[taskId].func = Task_IntroLoadPart2Graphics; +} + +static void Task_IntroLoadPart2Graphics(u8 taskId) +{ + intro_reset_and_hide_bgs(); + SetVBlankCallback(NULL); + ResetSpriteData(); + FreeAllSpritePalettes(); + gUnknown_02039358 = 0; + gUnknown_0203935A = 0; +#ifdef SAPPHIRE + load_intro_part2_graphics(0); +#else + load_intro_part2_graphics(1); +#endif + gTasks[taskId].func = Task_IntroStartBikeRide; +} + +static void Task_IntroStartBikeRide(u8 taskId) +{ + u8 spriteId; + + if (gUnknown_02039318 == 0) + LoadCompressedObjectPic(&gIntro2BrendanSpriteSheet); + else + LoadCompressedObjectPic(&gIntro2MaySpriteSheet); + LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet); +#ifdef SAPPHIRE + LoadCompressedObjectPic(&gIntro2LatiasSpriteSheet); +#else + LoadCompressedObjectPic(&gIntro2LatiosSpriteSheet); +#endif + LoadSpritePalettes(gIntro2SpritePalettes); + if (gUnknown_02039318 == 0) + spriteId = intro_create_brendan_sprite(0x110, 100); + else + spriteId = intro_create_may_sprite(0x110, 100); + gSprites[spriteId].callback = sub_813D788; + gSprites[spriteId].anims = gUnknown_0840AE80; + gTasks[taskId].data[1] = spriteId; +#ifdef SAPPHIRE + spriteId = intro_create_latias_sprite(-0x40, 0x3C); +#else + spriteId = intro_create_latios_sprite(-0x40, 0x3C); +#endif + gSprites[spriteId].callback = sub_813D880; + gTasks[taskId].data[2] = spriteId; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0xFFFF); + SetVBlankCallback(VBlankCB_Intro); +#ifdef SAPPHIRE + gTasks[taskId].data[0] = sub_8148EC0(0, 0x4000, 0x40, 0x10); + sub_8148C78(0); +#else + gTasks[taskId].data[0] = sub_8148EC0(1, 0x4000, 0x400, 0x10); + sub_8148C78(1); +#endif + gTasks[taskId].func = Task_IntroHandleBikeAndEonMovement; +} + +static void Task_IntroHandleBikeAndEonMovement(u8 taskId) +{ + s16 a; + u16 sine; + + if (gIntroFrameCounter > 1823) + { + BeginNormalPaletteFade(0xFFFFFFFF, 16, 0, 16, 0xFFFF); + gTasks[taskId].func = Task_IntroWaitToSetupPart3; + } + if (gIntroFrameCounter == 1109) + gSprites[gTasks[taskId].data[1]].data0 = 1; + if (gIntroFrameCounter == 1214) + gSprites[gTasks[taskId].data[1]].data0 = 0; + if (gIntroFrameCounter == 1394) + gSprites[gTasks[taskId].data[2]].data0 = 1; + if (gIntroFrameCounter == 1398) + gSprites[gTasks[taskId].data[1]].data0 = 2; + if (gIntroFrameCounter == 1586) + gSprites[gTasks[taskId].data[1]].data0 = 3; + if (gIntroFrameCounter == 1727) + gSprites[gTasks[taskId].data[1]].data0 = 4; + + //TODO: Clean this up + a = (((u16)gTasks[taskId].data[3] << 16) >> 18) & 0x7F; + sine = Sin(a, 48); + gUnknown_0203935A = sine; + if (gTasks[taskId].data[3] < 512) + gTasks[taskId].data[3]++; +#ifdef SAPPHIRE + sub_8149020(0); +#else + sub_8149020(1); +#endif +} + +static void Task_IntroWaitToSetupPart3(u8 taskId) +{ + if (gIntroFrameCounter > 2068) + { + DestroyTask(gTasks[taskId].data[0]); + gTasks[taskId].func = Task_IntroLoadPart3Graphics; + } +} + +static void Task_IntroLoadPart3Graphics(u8 taskId) +{ + intro_reset_and_hide_bgs(); + LZ77UnCompVram(gIntro3Pokeball_Gfx, (void *)VRAM); + LZ77UnCompVram(gIntro3Pokeball_Tilemap, (void *)(VRAM + 0x4000)); + LoadPalette(gIntro3PokeballPal, 0, 0x200); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + sub_813CE30(0x78, 0x50, 0, 0); + ResetSpriteData(); + FreeAllSpritePalettes(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF); + REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_256COLOR | BGCNT_AFF256x256; + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + gTasks[taskId].func = Task_IntroSpinAndZoomPokeball; + gIntroFrameCounter = 0; + m4aSongNumStart(0x1BA); +} + +static void Task_IntroSpinAndZoomPokeball(u8 taskId) +{ + gTasks[taskId].data[0] += 0x400; + if (gTasks[taskId].data[1] <= 0x6BF) + { + gTasks[taskId].data[1] += gTasks[taskId].data[2]; + gTasks[taskId].data[2]++; + } + else + { + gTasks[taskId].func = Task_IntroWaitToSetupPart3DoubleFight; + } + sub_813CE30(0x78, 0x50, 0x10000 / gTasks[taskId].data[1], gTasks[taskId].data[0]); + if (gIntroFrameCounter == 44) + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); +} + +static void Task_IntroWaitToSetupPart3DoubleFight(u8 taskId) +{ + if (gIntroFrameCounter > 59) + gTasks[taskId].func = Task_IntroLoadPart3Streaks; +} + +extern u8 unk_2000000[][32]; + +static void Task_IntroLoadPart3Streaks(u8 taskId) +{ + u16 i; + void *vram; + + intro_reset_and_hide_bgs(); + for (i = 0; i < 32; i++) + { + unk_2000000[0][i] = 0; + unk_2000000[1][i] = 17; + unk_2000000[2][i] = 34; + } + vram = (void *)VRAM; + DmaCopy16(3, unk_2000000, vram, 0x60); + for (i = 0; i < 0x280; i++) + ((u16 *)(VRAM + 0x3000))[i] = 0xF001; + for (i = 0; i < 0x80; i++) + ((u16 *)(VRAM + 0x3800))[i] = 0xF002; + for (i = 0; i < 0x180; i++) + ((u16 *)(VRAM + 0x3900))[i] = 0xF000; + for (i = 0; i < 0x80; i++) + ((u16 *)(VRAM + 0x3C00))[i] = 0xF002; + gPlttBufferUnfaded[0xF0] = RGB_WHITE; + gPlttBufferFaded[0xF0] = RGB_WHITE; + sub_813D084(1); + gPlttBufferUnfaded[0xF2] = RGB_BLACK; + gPlttBufferFaded[0xF2] = RGB_BLACK; + LZ77UnCompVram(gIntro3Streaks_Gfx, (void *)(VRAM + 0x4000)); + LZ77UnCompVram(gIntro3Streaks_Tilemap, (void *)(VRAM + 0x7000)); + LoadPalette(gIntro3Streaks_Pal, 0, 0x20); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + LoadCompressedObjectPic(&gIntro3PokeballGfx_Table[0]); + LoadCompressedObjectPic(&gIntro3MiscGfx_Table[0]); + LoadCompressedObjectPalette(&gInterfacePokeballPal_Table[0]); + LoadSpritePalettes(gIntro3MiscPal_Table); + gTasks[taskId].func = task_intro_14; +} + +static void task_intro_14(u8 taskId) +{ + REG_WIN0H = 0xF0; + REG_WIN0V = 0xA0; + REG_WININ = 0x1C; + REG_WINOUT = 0x1D; + REG_BG3CNT = BGCNT_PRIORITY(3) + | BGCNT_CHARBASE(0) + | BGCNT_SCREENBASE(6) + | BGCNT_16COLOR + | BGCNT_TXT256x256; + REG_BG0CNT = BGCNT_PRIORITY(0) + | BGCNT_CHARBASE(0) + | BGCNT_SCREENBASE(7) + | BGCNT_16COLOR + | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; + gTasks[taskId].data[15] = CreateTask(task_intro_20, 0); + gTasks[gTasks[taskId].data[15]].data[0] = 0; + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = task_intro_15; +} + +static void task_intro_15(u8 taskId) +{ + u16 foo = gTasks[taskId].data[0]; + + if (gTasks[taskId].data[0] != 32) + { + u32 bar; //needed to match for some reason + + gTasks[taskId].data[0] += 4; + REG_WIN0V = (gTasks[taskId].data[0] * 256) - (bar = foo - 0x9C); + } + else + { + REG_WIN0V = 0x2080; + gTasks[taskId].func = task_intro_16; + } +} + +static void task_intro_16(u8 taskId) +{ + gTasks[taskId].func = task_intro_17; +} + +static void task_intro_17(u8 taskId) +{ + gUnknown_0203931A = 0; + gTasks[taskId].func = Task_IntroPokemonBattle; +} + +static void Task_IntroPokemonBattle(u8 taskId) +{ + u8 spriteId; + + if (gIntroFrameCounter == 80) + { + spriteId = sub_813CE88(SPECIES_SHARPEDO, 0xF0, 0xA0, 5, 1); + gSprites[spriteId].callback = sub_813DB9C; + gSprites[spriteId].data1 = 1; + gSprites[spriteId].data2 = 0; + } + if (gIntroFrameCounter == 152) + { + spriteId = sub_813CE88(SPECIES_DUSKULL, 0, 0xA0, 4, 1); + gSprites[spriteId].callback = sub_813DB9C; + gSprites[spriteId].data1 = 2; + gSprites[spriteId].data2 = 1; + } + if (gIntroFrameCounter == 219) + { + sub_813D084(0); + spriteId = sub_813CFA8(gUnknown_02039318, 0x110, 0x60, 6); + gSprites[spriteId].callback = sub_813DE70; + gTasks[taskId].data[1] = spriteId; + } + if (gIntroFrameCounter == 304) + { + gTasks[gTasks[taskId].data[15]].data[0] = 4; + gSprites[gTasks[taskId].data[1]].data0 = 2; + } + if (gIntroFrameCounter == 384) + { + gTasks[gTasks[taskId].data[15]].data[0] = 0; + gSprites[gTasks[taskId].data[1]].data0 = 4; + } + if (gIntroFrameCounter == 400) + { + BeginNormalPaletteFade(0xFF0000, 0, 0x10, 0, 0x7EFF); + } + if (gIntroFrameCounter == 432) + { + gSprites[gTasks[taskId].data[1]].data0 = 5; + } + if (gIntroFrameCounter == 462) + { + gSprites[gTasks[taskId].data[1]].data0 = 6; + gTasks[gTasks[taskId].data[15]].data[0] = 2; + } + if (gIntroFrameCounter == 463) + { + sub_813D084(1); + spriteId = sub_813CE88(SPECIES_SHARPEDO, 0xD0, 8, 5, 1); + gSprites[spriteId].callback = sub_813E10C; + gTasks[taskId].data[2] = spriteId; + sub_813E7C0(spriteId); + } + if (gIntroFrameCounter == 539) + { + spriteId = sub_813CE88(SPECIES_DUSKULL, 0xF8, 0x10, 4, 1); + gSprites[spriteId].callback = sub_813E10C; + gTasks[taskId].data[3] = spriteId; + sub_813E930(spriteId); + } + if (gIntroFrameCounter == 623) + { + gSprites[gTasks[taskId].data[2]].data0 = 2; + gSprites[gTasks[taskId].data[3]].data0 = 2; + gTasks[gTasks[taskId].data[15]].data[0] = 3; + } + if (gIntroFrameCounter == 624) + { + sub_813D084(0); + spriteId = sub_813CE88(SPECIES_MUDKIP, 0x20, 0x98, 0, 0); + gSprites[spriteId].callback = sub_813E210; + gTasks[taskId].data[4] = spriteId; + InitIntroMudkipAttackAnim(spriteId); + } + if (gIntroFrameCounter == 700) + { + spriteId = sub_813CE88(SPECIES_TORCHIC, -8, 0x90, 1, 0); + gSprites[spriteId].callback = sub_813E210; + gTasks[taskId].data[5] = spriteId; + InitIntroTorchicAttackAnim(spriteId); + } + if (gIntroFrameCounter == 776) + { + gUnknown_0203931A = 1; + gSprites[gTasks[taskId].data[4]].data0 = 2; + gSprites[gTasks[taskId].data[5]].data0 = 2; + gTasks[gTasks[taskId].data[15]].data[0] = 0; + } + if (gIntroFrameCounter == 781) + { + sub_813D084(2); + gSprites[gTasks[taskId].data[2]].data0 = 3; + gSprites[gTasks[taskId].data[3]].data0 = 3; + gSprites[gTasks[taskId].data[4]].data0 = 3; + gSprites[gTasks[taskId].data[5]].data0 = 3; + spriteId = CreateSprite(&gSpriteTemplate_840B1F4, 0x78, 0x50, 15); + gSprites[spriteId].invisible = 1; + } + if (gIntroFrameCounter == 800) + PlaySE(SE_OP_BASYU); + if (gIntroFrameCounter == 850) + BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, 0xFFFF); + if (gIntroFrameCounter == 946) + gTasks[taskId].func = task_intro_19; +} + +static void task_intro_19(u8 taskId) +{ + DestroyTask(taskId); + SetMainCallback2(MainCB2_EndIntro); +} + +static void task_intro_20(u8 taskId) +{ +#define BG2_FLAGS (BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256) +#define DISPCNT_FLAGS (DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON) + + gTasks[taskId].data[15]++; + switch (gTasks[taskId].data[0]) + { + case 0: + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; + REG_BG2CNT = 0; + gTasks[taskId].data[0] = 0xFF; + break; + case 2: + BeginNormalPaletteFade(1, 0, 0x10, 0, 0xFFFF); + REG_BG2CNT = BG2_FLAGS; + REG_DISPCNT = DISPCNT_FLAGS; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[0] = 20; + //fall through + case 20: + REG_BG2VOFS = gTasks[taskId].data[1]; + REG_BG2HOFS = gTasks[taskId].data[2]; + gTasks[taskId].data[1] += 6; + gTasks[taskId].data[2] -= 8; + break; + case 3: + BeginNormalPaletteFade(1, 0, 0x10, 0, 0xFFFF); + REG_BG2CNT = BG2_FLAGS; + REG_DISPCNT = DISPCNT_FLAGS; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[0] = 0x1E; + //fall through + case 0x1E: + REG_BG2VOFS = gTasks[taskId].data[1]; + REG_BG2HOFS = gTasks[taskId].data[2]; + gTasks[taskId].data[1] -= 6; + gTasks[taskId].data[2] += 8; + break; + case 4: + BeginNormalPaletteFade(1, 5, 0, 0x10, 0x37F7); + REG_BG2CNT = BG2_FLAGS; + REG_DISPCNT = DISPCNT_FLAGS; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 8; + gTasks[taskId].data[0] = 0x28; + //fall through + case 0x28: + REG_BG2VOFS = gTasks[taskId].data[1]; + REG_BG2HOFS = gTasks[taskId].data[2]; + gTasks[taskId].data[1] -= gTasks[taskId].data[3]; + gTasks[taskId].data[2] += gTasks[taskId].data[3]; + if (!(gTasks[taskId].data[15] & 7) && gTasks[taskId].data[3] != 0) + gTasks[taskId].data[3]--; + break; + case 0xFF: //needed to prevent jump table optimization + break; + } + +#undef BG2_FLAGS +#undef DISPCNT_FLAGS +} + +static void intro_reset_and_hide_bgs(void) +{ + REG_DISPCNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; +} + +#ifdef NONMATCHING +static void sub_813CCE8(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + default: + case 0: + REG_BLDCNT = 0x3F50; + REG_BLDALPHA = 0x1000; + REG_BLDY = 0; + gTasks[taskId].data[1] = 0x40; + gTasks[taskId].data[0] = 1; + return; + case 1: + if (gTasks[taskId].data[1] != 0) + { + u32 foo; + u32 bar asm("r2"); + + gTasks[taskId].data[1]--; + //tail merge at _0813CDC2 + foo = gTasks[taskId].data[1] + (gTasks[taskId].data[1] < 0); + bar = 0x1FE; + REG_BLDALPHA = gUnknown_08393E64[(foo & bar) / 2]; + } + else + { + REG_BLDALPHA = gUnknown_08393E64[0]; + gTasks[taskId].data[1] = 0x80; + gTasks[taskId].data[0]++; + } + return; + case 2: + if (gTasks[taskId].data[1] != 0) + { + //tail merge at _0813CE0E + gTasks[taskId].data[1]--; + } + else + { + gTasks[taskId].data[1] = 0; //redundant? + gTasks[taskId].data[0]++; + } + return; + case 3: + if (gTasks[taskId].data[1] <= 0x3D) + { + u32 foo; + u32 bar asm("r2"); + + gTasks[taskId].data[1]++; + //_0813CDC2 + foo = gTasks[taskId].data[1] + (gTasks[taskId].data[1] < 0); + bar = 0x1FE; + REG_BLDALPHA = gUnknown_08393E64[(foo & bar) / 2]; + } + else + { + //_0813CDE0 + REG_BLDALPHA = gUnknown_08393E64[0x1F]; + gTasks[taskId].data[1] = 0x10; + gTasks[taskId].data[0]++; + } + return; + case 4: + if (gTasks[taskId].data[1] != 0) + { + gTasks[taskId].data[1]--; + } + else + { + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + DestroyTask(taskId); + } + return; + } +} +#else +__attribute__((naked)) +static void sub_813CCE8(u8 taskId) +{ + asm("\n\ + .equ REG_BLDCNT, 0x4000050\n\ + .equ REG_BLDALPHA, 0x4000052\n\ + .syntax unified\n\ + push {r4,lr}\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + ldr r1, _0813CD0C @ =gTasks\n\ + lsls r0, r3, 2\n\ + adds r0, r3\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + movs r2, 0x8\n\ + ldrsh r0, [r0, r2]\n\ + adds r2, r1, 0\n\ + cmp r0, 0x4\n\ + bhi _0813CD28\n\ + lsls r0, 2\n\ + ldr r1, _0813CD10 @ =_0813CD14\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_0813CD0C: .4byte gTasks\n\ +_0813CD10: .4byte _0813CD14\n\ + .align 2, 0\n\ +_0813CD14:\n\ + .4byte _0813CD28\n\ + .4byte _0813CD5C\n\ + .4byte _0813CD8C\n\ + .4byte _0813CDA8\n\ + .4byte _0813CDFC\n\ +_0813CD28:\n\ + ldr r1, _0813CD54 @ =REG_BLDCNT\n\ + ldr r4, _0813CD58 @ =0x00003f50\n\ + adds r0, r4, 0\n\ + strh r0, [r1]\n\ + adds r1, 0x2\n\ + movs r4, 0x80\n\ + lsls r4, 5\n\ + adds r0, r4, 0\n\ + strh r0, [r1]\n\ + adds r1, 0x2\n\ + movs r0, 0\n\ + strh r0, [r1]\n\ + lsls r0, r3, 2\n\ + adds r0, r3\n\ + lsls r0, 3\n\ + adds r0, r2\n\ + movs r1, 0x40\n\ + strh r1, [r0, 0xA]\n\ + movs r1, 0x1\n\ + strh r1, [r0, 0x8]\n\ + b _0813CE26\n\ + .align 2, 0\n\ +_0813CD54: .4byte REG_BLDCNT\n\ +_0813CD58: .4byte 0x00003f50\n\ +_0813CD5C:\n\ + lsls r0, r3, 2\n\ + adds r0, r3\n\ + lsls r0, 3\n\ + adds r2, r0, r2\n\ + ldrh r1, [r2, 0xA]\n\ + movs r3, 0xA\n\ + ldrsh r0, [r2, r3]\n\ + cmp r0, 0\n\ + beq _0813CD78\n\ + subs r0, r1, 0x1\n\ + strh r0, [r2, 0xA]\n\ + movs r4, 0xA\n\ + ldrsh r0, [r2, r4]\n\ + b _0813CDC2\n\ +_0813CD78:\n\ + ldr r1, _0813CD84 @ =REG_BLDALPHA\n\ + ldr r0, _0813CD88 @ =gUnknown_08393E64\n\ + ldrh r0, [r0]\n\ + strh r0, [r1]\n\ + movs r0, 0x80\n\ + b _0813CDEA\n\ + .align 2, 0\n\ +_0813CD84: .4byte REG_BLDALPHA\n\ +_0813CD88: .4byte gUnknown_08393E64\n\ +_0813CD8C:\n\ + lsls r0, r3, 2\n\ + adds r0, r3\n\ + lsls r0, 3\n\ + adds r1, r0, r2\n\ + ldrh r0, [r1, 0xA]\n\ + movs r3, 0xA\n\ + ldrsh r2, [r1, r3]\n\ + cmp r2, 0\n\ + bne _0813CE0E\n\ + strh r2, [r1, 0xA]\n\ + ldrh r0, [r1, 0x8]\n\ + adds r0, 0x1\n\ + strh r0, [r1, 0x8]\n\ + b _0813CE26\n\ +_0813CDA8:\n\ + lsls r0, r3, 2\n\ + adds r0, r3\n\ + lsls r0, 3\n\ + adds r2, r0, r2\n\ + ldrh r1, [r2, 0xA]\n\ + movs r4, 0xA\n\ + ldrsh r0, [r2, r4]\n\ + cmp r0, 0x3D\n\ + bgt _0813CDE0\n\ + adds r0, r1, 0x1\n\ + strh r0, [r2, 0xA]\n\ + movs r1, 0xA\n\ + ldrsh r0, [r2, r1]\n\ +_0813CDC2:\n\ + lsrs r1, r0, 31\n\ + adds r0, r1\n\ + movs r2, 0xFF\n\ + lsls r2, 1\n\ + ldr r3, _0813CDD8 @ =REG_BLDALPHA\n\ + ldr r1, _0813CDDC @ =gUnknown_08393E64\n\ + ands r0, r2\n\ + adds r0, r1\n\ + ldrh r0, [r0]\n\ + strh r0, [r3]\n\ + b _0813CE26\n\ + .align 2, 0\n\ +_0813CDD8: .4byte REG_BLDALPHA\n\ +_0813CDDC: .4byte gUnknown_08393E64\n\ +_0813CDE0:\n\ + ldr r1, _0813CDF4 @ =REG_BLDALPHA\n\ + ldr r0, _0813CDF8 @ =gUnknown_08393E64\n\ + ldrh r0, [r0, 0x3E]\n\ + strh r0, [r1]\n\ + movs r0, 0x10\n\ +_0813CDEA:\n\ + strh r0, [r2, 0xA]\n\ + ldrh r0, [r2, 0x8]\n\ + adds r0, 0x1\n\ + strh r0, [r2, 0x8]\n\ + b _0813CE26\n\ + .align 2, 0\n\ +_0813CDF4: .4byte REG_BLDALPHA\n\ +_0813CDF8: .4byte gUnknown_08393E64\n\ +_0813CDFC:\n\ + lsls r0, r3, 2\n\ + adds r0, r3\n\ + lsls r0, 3\n\ + adds r1, r0, r2\n\ + ldrh r0, [r1, 0xA]\n\ + movs r4, 0xA\n\ + ldrsh r2, [r1, r4]\n\ + cmp r2, 0\n\ + beq _0813CE14\n\ +_0813CE0E:\n\ + subs r0, 0x1\n\ + strh r0, [r1, 0xA]\n\ + b _0813CE26\n\ +_0813CE14:\n\ + ldr r0, _0813CE2C @ =REG_BLDCNT\n\ + strh r2, [r0]\n\ + adds r0, 0x2\n\ + strh r2, [r0]\n\ + adds r0, 0x2\n\ + strh r2, [r0]\n\ + adds r0, r3, 0\n\ + bl DestroyTask\n\ +_0813CE26:\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0813CE2C: .4byte REG_BLDCNT\n\ + .syntax divided\n"); +} +#endif + +void sub_813CE30(u16 scrX, u16 scrY, u16 zoom, u16 alpha) +{ + struct BgAffineSrcData src; + struct BgAffineDstData dest; + + src.texX = 0x8000; + src.texY = 0x8000; + src.scrX = scrX; + src.scrY = scrY; + src.sx = zoom; + src.sy = zoom; + src.alpha = alpha; + BgAffineSet(&src, &dest, 1); + REG_BG2PA = dest.pa; + REG_BG2PB = dest.pb; + REG_BG2PC = dest.pc; + REG_BG2PD = dest.pd; + REG_BG2X = dest.dx; + REG_BG2Y = dest.dy; +} + +static u16 sub_813CE88(u16 species, s16 x, s16 y, u16 d, u8 front) +{ + const u8 *lzPaletteData; + u8 spriteId; + + if (front) + LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 1); + else + LoadSpecialPokePic(&gMonBackPicTable[species], gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 0); + lzPaletteData = species_and_otid_get_pal(species, 0, 0xFFFF); + LoadCompressedPalette(lzPaletteData, 0x100 + d * 0x10, 0x20); + sub_8143648(d, d); + spriteId = CreateSprite(&gUnknown_02024E8C, x, y, (d + 1) * 4); + gSprites[spriteId].oam.paletteNum = d; + gSprites[spriteId].oam.priority = 1; + return spriteId; +} + +static u8 sub_813CFA8(u16 a, u16 b, u16 c, u16 d) +{ + u8 spriteId; + + DecompressPicFromTable_2(&gTrainerBackPicTable[a], gTrainerBackPicCoords[a].coords, gTrainerBackPicCoords[a].y_offset, (void *)0x2000000, gUnknown_0840B5A0[d], a); + LoadCompressedPalette(gTrainerBackPicPaletteTable[a].data, 0x100 + d * 0x10, 0x20); + sub_8143680(d, d); + gUnknown_02024E8C.anims = gUnknown_0840B064; + spriteId = CreateSprite(&gUnknown_02024E8C, b, c, 1); + gSprites[spriteId].oam.paletteNum = d; + gSprites[spriteId].oam.priority = 1; + return spriteId; +} + +static void sub_813D084(u8 a) +{ + u16 color; + + switch (a) + { + default: + case 0: + color = RGB(22, 31, 15); + break; + case 1: + color = RGB(31, 14, 12); + break; + case 2: + color = RGB(12, 12, 20); + break; + } + gPlttBufferUnfaded[241] = color; + gPlttBufferFaded[241] = color; +} + +static void sub_813D0CC(struct Sprite *sprite) +{ + u8 r0; + + if (sprite->data2 >= 192) + { + if (sprite->data3 != 0) + { + sprite->data3--; + } + else + { + sprite->invisible = FALSE; + SetOamMatrix(sprite->data1, sprite->data2, 0, 0, sprite->data2); + sprite->data2 = (sprite->data2 * 95) / 100; + r0 = (sprite->data2 - 192) / 128 + 9; + if (r0 > 15) + r0 = 15; + sprite->oam.paletteNum = r0; + } + } + else + { + DestroySprite(sprite); + } +} + +static void sub_813D158(struct Sprite *sprite) +{ + if (gSprites[sprite->data7].data7 != 0) + { + sprite->invisible = TRUE; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + StartSpriteAnim(sprite, 3); + sprite->data2 = 1024; + sprite->data3 = 8 * (sprite->data1 & 3); + sprite->callback = sub_813D0CC; + sprite->oam.shape = 1; + sprite->oam.size = 3; + CalcCenterToCornerVec(sprite, 1, 3, 2); + } + else + { + sprite->pos2.x = gSprites[sprite->data7].pos2.x; + sprite->pos2.y = gSprites[sprite->data7].pos2.y; + sprite->pos1.x = gSprites[sprite->data7].pos1.x; + sprite->pos1.y = gSprites[sprite->data7].pos1.y; + } +} + +static void sub_813D208(struct Sprite *sprite) +{ + if (sprite->data0 != 0) + sprite->callback = sub_813D220; +} + +static void sub_813D220(struct Sprite *sprite) +{ + if (sprite->pos1.x <= 116) + { + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos1.x += 4; + sprite->pos2.x = -4; + sprite->data4 = 128; + sprite->callback = sub_813D368; + } + else + { + u16 data2; + u16 data3; + u16 data4; + s16 sin1; + s16 sin2; + s16 sin3; + s16 sin4; + s16 var1; + s16 var2; + s16 var3; + s16 var4; + s16 temp; + + data4 = sprite->data4; + sin1 = gSineTable[(u8)data4]; + sin2 = gSineTable[(u8)(data4 + 64)]; + sprite->data4 += 2; + sprite->pos2.y = sin1 / 32; + sprite->pos1.x--; + if (sprite->pos1.x & 1) + sprite->pos1.y++; + temp = -sin2 / 16; + data2 = sprite->data2; + data3 = sprite->data3; + sin3 = gSineTable[(u8)(temp - 16)]; + sin4 = gSineTable[(u8)(temp + 48)]; + var1 = sin4 * data2 / 256; + var2 = -sin3 * data3 / 256; + var3 = sin3 * data2 / 256; + var4 = sin4 * data3 / 256; + SetOamMatrix(sprite->data1, data2, 0, 0, data3); + SetOamMatrix(sprite->data1 + 1, var1, var3, var2, var4); + SetOamMatrix(sprite->data1 + 2, var1, var3, var2 * 2, var4 * 2); + } +} + +static void sub_813D368(struct Sprite *sprite) +{ + SetOamMatrix(sprite->data1, sprite->data6 + 64, 0, 0, sprite->data6 + 64); + SetOamMatrix(sprite->data1 + 1, sprite->data6 + 64, 0, 0, sprite->data6 + 64); + SetOamMatrix(sprite->data1 + 2, sprite->data6 + 64, 0, 0, sprite->data6 + 64); + if (sprite->data4 != 64) + { + u16 data4; + + sprite->data4 -= 8; + data4 = sprite->data4; + sprite->pos2.x = gSineTable[(u8)(data4 + 64)] / 64; + sprite->pos2.y = gSineTable[(u8)data4] / 64; + } + else + { + sprite->data4 = 0; + sprite->callback = sub_813D414; + } +} + +static void sub_813D414(struct Sprite *sprite) +{ + if (sprite->data0 != 2) + { + s16 r2; + + sprite->data4 += 8; + r2 = gSineTable[(u8)sprite->data4] / 16 + 64; + sprite->pos2.x = gSineTable[(u8)(r2 + 64)] / 64; + sprite->pos2.y = gSineTable[(u8)r2] / 64; + } + else + { + sprite->callback = SpriteCB_WaterDropFall; + } +} + +static void SpriteCB_WaterDropFall(struct Sprite *sprite) +{ + if (sprite->pos1.y < sprite->data5) + { + sprite->pos1.y += 4; + } + else + { + sprite->data7 = 1; + sprite->invisible = TRUE; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + StartSpriteAnim(sprite, 3); + sprite->data2 = 1024; + sprite->data3 = 8 * (sprite->data1 & 3); + sprite->callback = sub_813D0CC; + sprite->oam.shape = 1; + sprite->oam.size = 3; + CalcCenterToCornerVec(sprite, 1, 3, 2); + } +} + +//Duplicate function +static void SpriteCB_WaterDropFall_2(struct Sprite *sprite) +{ + if (sprite->pos1.y < sprite->data5) + { + sprite->pos1.y += 4; + } + else + { + sprite->data7 = 1; + sprite->invisible = TRUE; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + StartSpriteAnim(sprite, 3); + sprite->data2 = 1024; + sprite->data3 = 8 * (sprite->data1 & 3); + sprite->callback = sub_813D0CC; + sprite->oam.shape = 1; + sprite->oam.size = 3; + CalcCenterToCornerVec(sprite, 1, 3, 2); + } +} + +static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately) +{ + u8 spriteId; + u8 oldSpriteId; + + spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0); + gSprites[spriteId].data0 = 0; + gSprites[spriteId].data7 = 0; + gSprites[spriteId].data1 = d; + gSprites[spriteId].data2 = c; + gSprites[spriteId].data3 = c; + gSprites[spriteId].data5 = e; + gSprites[spriteId].data6 = c; + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = d; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); + StartSpriteAnim(&gSprites[spriteId], 2); + if (!fallImmediately) + gSprites[spriteId].callback = sub_813D208; + else + gSprites[spriteId].callback = SpriteCB_WaterDropFall_2; + oldSpriteId = spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0); + gSprites[spriteId].data7 = oldSpriteId; + gSprites[spriteId].data1 = d + 1; + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = d + 1; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); + gSprites[spriteId].callback = sub_813D158; + + spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0); + gSprites[spriteId].data7 = oldSpriteId; + gSprites[spriteId].data1 = d + 2; + StartSpriteAnim(&gSprites[spriteId], 1); + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = d + 2; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); + gSprites[spriteId].callback = sub_813D158; + + SetOamMatrix(d, c + 32, 0, 0, c + 32); + SetOamMatrix(d + 1, c + 32, 0, 0, c + 32); + SetOamMatrix(d + 2, c + 32, 0, 0, 2 * (c + 32)); + + return oldSpriteId; +} + +static void sub_813D788(struct Sprite *sprite) +{ + switch (sprite->data0) + { + case 0: + StartSpriteAnimIfDifferent(sprite, 0); + sprite->pos1.x--; + break; + case 1: + StartSpriteAnimIfDifferent(sprite, 0); + if (gIntroFrameCounter & 7) + return; + sprite->pos1.x++; + break; + case 2: + StartSpriteAnimIfDifferent(sprite, 2); + if (sprite->pos1.x <= 120 || (gIntroFrameCounter & 7)) + sprite->pos1.x++; + break; + case 3: + StartSpriteAnimIfDifferent(sprite, 3); + break; + case 4: + StartSpriteAnimIfDifferent(sprite, 0); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 2; + break; + } + if (gIntroFrameCounter & 7) + return; + if (sprite->pos2.y != 0) + { + sprite->pos2.y = 0; + } + else + { + switch (Random() & 3) + { + case 0: + sprite->pos2.y = -1; + break; + case 1: + sprite->pos2.y = 1; + break; + case 2: + case 3: + sprite->pos2.y = 0; + break; + } + } +} + +static void sub_813D880(struct Sprite *sprite) +{ + switch (sprite->data0) + { + case 0: + break; + case 1: + if (sprite->pos2.x + sprite->pos1.x < 304) + sprite->pos2.x += 8; + else + sprite->data0 = 2; + break; + case 2: + if (sprite->pos2.x + sprite->pos1.x > 120) + sprite->pos2.x -= 1; + else + sprite->data0 = 3; + break; + case 3: + if (sprite->pos2.x > 0) + sprite->pos2.x -= 2; + break; + } + sprite->pos2.y = Sin((u8)sprite->data1, 8) - gUnknown_0203935A; + sprite->data1 += 4; +} + +static void sub_813D908(struct Sprite *sprite) +{ + if (gTasks[sprite->data0].data[0] == 0) + { + sprite->invisible = TRUE; + } + else if (gTasks[sprite->data0].data[0] != 4) + { + sprite->invisible = FALSE; + } + else + { + DestroySprite(sprite); + } +} + +static u8 CreateGameFreakLogo(s16 a, s16 b, u8 c) +{ + u8 spriteId; + u16 i; + + for (i = 0; i < 9; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840AF94, gUnknown_0840AF50[i][1] + a, b - 4, 0); + gSprites[spriteId].data0 = c; + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840AF50[i][0]); + } + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840AFAC, gUnknown_0840AF74[i][1] + a, b + 12, 0); + gSprites[spriteId].data0 = c; + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840AF74[i][0]); + } + spriteId = CreateSprite(&gSpriteTemplate_840AFC4, 120, b - 4, 0); + gSprites[spriteId].data0 = c; + + return spriteId; +} + +#ifdef NONMATCHING +static void sub_813DA64(struct Sprite *sprite) +{ + sprite->data7++; + + switch (sprite->data0) + { + case 0: + default: + sprite->oam.affineMode = 3; + sprite->oam.matrixNum = 1; + CalcCenterToCornerVec(sprite, 1, 3, 3); + sprite->invisible = FALSE; + sprite->data0 = 1; + sprite->data1 = 128; + sprite->data2 = -24; + sprite->data3 = 0; + break; + case 1: + { + s16 r3; + s16 sin1; + s16 r6; + s16 foo; + s16 r5; + s16 r2; + + //_0813DAC0 + if (sprite->data3 < 0x50) + { + sprite->pos2.y = -Sin((u8)sprite->data3, 0x78); + sprite->pos2.x = -Sin((u8)sprite->data3, 0x8C); + if (sprite->data3 > 64) + sprite->oam.priority = 3; + } + //_0813DAF8 + r3 = gSineTable[(u8)sprite->data2]; + sin1 = gSineTable[(u8)(sprite->data2 + 64)]; + r6 = sin1 * sprite->data1 / 256; + foo = sin1 * sprite->data1 / 256; + r5 = -r3 * sprite->data1 / 256; + r2 = r3 * sprite->data1 / 256; + + SetOamMatrix(1, r6, r2, r5, foo); + + if (sprite->data1 < 0x100) + sprite->data1 += 8; + else + sprite->data1 += 32; + if (sprite->data2 < 0x18) + sprite->data2 += 1; + if (sprite->data3 < 64) + sprite->data3 += 2; + else if (!(sprite->data7 & 3)) + sprite->data3 += 1; + break; + } + } + //_0813DB92 +} +#else +__attribute__((naked)) +static void sub_813DA64(struct Sprite *sprite) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + sub sp, 0x4\n\ + adds r4, r0, 0\n\ + ldrh r0, [r4, 0x3C]\n\ + adds r0, 0x1\n\ + strh r0, [r4, 0x3C]\n\ + movs r1, 0x2E\n\ + ldrsh r0, [r4, r1]\n\ + cmp r0, 0\n\ + beq _0813DA7C\n\ + cmp r0, 0x1\n\ + beq _0813DAC0\n\ +_0813DA7C:\n\ + ldrb r0, [r4, 0x1]\n\ + movs r1, 0x3\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x1]\n\ + ldrb r1, [r4, 0x3]\n\ + movs r0, 0x3F\n\ + negs r0, r0\n\ + ands r0, r1\n\ + movs r1, 0x2\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x3]\n\ + adds r0, r4, 0\n\ + movs r1, 0x1\n\ + movs r2, 0x3\n\ + movs r3, 0x3\n\ + bl CalcCenterToCornerVec\n\ + adds r2, r4, 0\n\ + adds r2, 0x3E\n\ + ldrb r1, [r2]\n\ + movs r0, 0x5\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r2]\n\ + movs r0, 0x1\n\ + strh r0, [r4, 0x2E]\n\ + movs r0, 0x80\n\ + strh r0, [r4, 0x30]\n\ + ldr r0, _0813DABC @ =0x0000ffe8\n\ + strh r0, [r4, 0x32]\n\ + movs r0, 0\n\ + b _0813DB92\n\ + .align 2, 0\n\ +_0813DABC: .4byte 0x0000ffe8\n\ +_0813DAC0:\n\ + ldrh r1, [r4, 0x34]\n\ + movs r2, 0x34\n\ + ldrsh r0, [r4, r2]\n\ + cmp r0, 0x4F\n\ + bgt _0813DAF8\n\ + lsls r0, r1, 24\n\ + lsrs r0, 24\n\ + movs r1, 0x78\n\ + bl Sin\n\ + negs r0, r0\n\ + strh r0, [r4, 0x26]\n\ + ldrh r0, [r4, 0x34]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + movs r1, 0x8C\n\ + bl Sin\n\ + negs r0, r0\n\ + strh r0, [r4, 0x24]\n\ + movs r1, 0x34\n\ + ldrsh r0, [r4, r1]\n\ + cmp r0, 0x40\n\ + ble _0813DAF8\n\ + ldrb r0, [r4, 0x5]\n\ + movs r1, 0xC\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x5]\n\ +_0813DAF8:\n\ + ldr r2, _0813DB60 @ =gSineTable\n\ + ldrh r1, [r4, 0x32]\n\ + lsls r0, r1, 24\n\ + lsrs r0, 23\n\ + adds r0, r2\n\ + ldrh r3, [r0]\n\ + adds r1, 0x40\n\ + lsls r1, 24\n\ + lsrs r1, 23\n\ + adds r1, r2\n\ + movs r2, 0\n\ + ldrsh r0, [r1, r2]\n\ + movs r1, 0x30\n\ + ldrsh r2, [r4, r1]\n\ + adds r1, r0, 0\n\ + muls r1, r2\n\ + adds r0, r1, 0\n\ + cmp r1, 0\n\ + bge _0813DB20\n\ + adds r0, 0xFF\n\ +_0813DB20:\n\ + lsls r0, 8\n\ + lsrs r6, r0, 16\n\ + lsls r0, r3, 16\n\ + asrs r3, r0, 16\n\ + negs r0, r3\n\ + muls r0, r2\n\ + cmp r0, 0\n\ + bge _0813DB32\n\ + adds r0, 0xFF\n\ +_0813DB32:\n\ + lsls r0, 8\n\ + lsrs r5, r0, 16\n\ + adds r0, r3, 0\n\ + muls r0, r2\n\ + cmp r0, 0\n\ + bge _0813DB40\n\ + adds r0, 0xFF\n\ +_0813DB40:\n\ + lsls r0, 8\n\ + lsrs r2, r0, 16\n\ + adds r1, r6, 0\n\ + adds r3, r5, 0\n\ + str r1, [sp]\n\ + movs r0, 0x1\n\ + bl SetOamMatrix\n\ + ldrh r1, [r4, 0x30]\n\ + movs r2, 0x30\n\ + ldrsh r0, [r4, r2]\n\ + cmp r0, 0xFF\n\ + bgt _0813DB64\n\ + adds r0, r1, 0\n\ + adds r0, 0x8\n\ + b _0813DB68\n\ + .align 2, 0\n\ +_0813DB60: .4byte gSineTable\n\ +_0813DB64:\n\ + adds r0, r1, 0\n\ + adds r0, 0x20\n\ +_0813DB68:\n\ + strh r0, [r4, 0x30]\n\ + ldrh r1, [r4, 0x32]\n\ + movs r2, 0x32\n\ + ldrsh r0, [r4, r2]\n\ + cmp r0, 0x17\n\ + bgt _0813DB78\n\ + adds r0, r1, 0x1\n\ + strh r0, [r4, 0x32]\n\ +_0813DB78:\n\ + ldrh r2, [r4, 0x34]\n\ + movs r1, 0x34\n\ + ldrsh r0, [r4, r1]\n\ + cmp r0, 0x3F\n\ + bgt _0813DB86\n\ + adds r0, r2, 0x2\n\ + b _0813DB92\n\ +_0813DB86:\n\ + ldrh r1, [r4, 0x3C]\n\ + movs r0, 0x3\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0813DB94\n\ + adds r0, r2, 0x1\n\ +_0813DB92:\n\ + strh r0, [r4, 0x34]\n\ +_0813DB94:\n\ + add sp, 0x4\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +static void sub_813DB9C(struct Sprite *sprite) +{ + switch (sprite->data0) + { + case 0: + default: + if (sprite->data2 != 0) + sprite->hFlip = TRUE; + else + sprite->hFlip = FALSE; + sprite->data0 = 1; + //fall through + case 1: + if (sprite->pos1.y > 96) + { + sprite->pos1.y -= 4; + if (sprite->data2 != 0) + sprite->pos1.x += 2; + else + sprite->pos1.x -= 2; + } + else + { + sprite->data0++; + sprite->data3 = 8; + } + break; + case 2: + if (sprite->data3 != 0) + { + sprite->data3--; + } + else + { + sprite->data0++; + sprite->data3 = 0; //redundant? + } + break; + case 3: + sprite->oam.affineMode = 3; + sprite->oam.matrixNum = sprite->data1; + CalcCenterToCornerVec(sprite, 0, 3, 3); + if (sprite->data2 != 0) + SetOamMatrix(sprite->data1, -256, 0, 0, 256); + else + SetOamMatrix(sprite->data1, 256, 0, 0, 256); + sprite->data0++; + sprite->data4 = 0; + break; + case 4: + sprite->data4++; + if (sprite->pos1.y + sprite->pos2.y > -32 + && sprite->pos1.x + sprite->pos2.x > -64) + { + u16 r2; + + sprite->pos2.y = -(sprite->data4 * sprite->data4) / 8; + if (sprite->data2 != 0) + sprite->pos2.x += sprite->data4; + else + sprite->pos2.x -= sprite->data4; + if (sprite->data3 < 128) + sprite->data3 += 8; + r2 = 256 - sprite->data3; + if (sprite->data2 != 0) + SetOamMatrix(sprite->data1, -r2, 0, 0, r2); + else + SetOamMatrix(sprite->data1, r2, 0, 0, r2); + } + else + { + DestroySprite(sprite); + } + } +} + +static void sub_813DD58(struct Sprite *sprite) +{ + switch (sprite->data0) + { + case 0: + default: + sprite->invisible = FALSE; + sprite->oam.affineMode = 1; + sprite->oam.matrixNum = sprite->data1; + sprite->data3 = 2048; + sprite->data0 = 1; + //fall through + case 1: + if (sprite->data3 > 256) + { + sprite->data3 -= 128; + if (sprite->data2 != 0) + SetOamMatrix(sprite->data1, -sprite->data3, 0, 0, sprite->data3); + else + SetOamMatrix(sprite->data1, sprite->data3, 0, 0, sprite->data3); + } + else + { + if (sprite->data2 != 0) + SetOamMatrix(sprite->data1, -256, 0, 0, 256); + else + SetOamMatrix(sprite->data1, 256, 0, 0, 256); + sprite->data0++; + } + break; + case 2: + break; + case 3: + sprite->data4++; + sprite->pos2.y = sprite->data4 * sprite->data4 / 32; + if (sprite->data2 != 0) + sprite->pos2.x = sprite->data4 / 4; + else + sprite->pos2.x = -(sprite->data4 / 4); + break; + } +} + +static void sub_813DE70(struct Sprite *sprite) +{ + switch (sprite->data0) + { + case 0: + default: + if (sprite->pos1.x > 40) + { + sprite->pos1.x -= 4; + } + else + { + StartSpriteAnim(sprite, 1); + sprite->data6 = CreateSprite(&gSpriteTemplate_840B084, 16, 104, 100); + sprite->data7 = CreateSprite(&gSpriteTemplate_840B084, 12, 106, 101); + sprite->data0 = 1; + } + break; + case 1: + break; + case 2: + StartSpriteAnim(sprite, 2); + gSprites[sprite->data6].data0 = 1; + gSprites[sprite->data7].data0 = 2; + sprite->data0++; + break; + case 3: + if (sprite->pos1.y > 160) + { + sprite->invisible = 1; + sprite->data0 = 1; + } + else + { + sprite->pos1.y += 2; + sprite->pos1.x--; + } + break; + case 4: + { + s16 r4, r5; + + r5 = gSprites[sprite->data6].pos1.x + gSprites[sprite->data6].pos2.x; + r4 = gSprites[sprite->data6].pos1.y + gSprites[sprite->data6].pos2.y; + DestroySprite(&gSprites[sprite->data6]); + sprite->data6 = sub_813CE88(SPECIES_TORCHIC, r5, r4, 2, 1); + gSprites[sprite->data6].callback = sub_813DD58; + gSprites[sprite->data6].invisible = TRUE; + gSprites[sprite->data6].data1 = 1; + gSprites[sprite->data6].data2 = 1; + sub_813E580(r5, r4); + + r5 = gSprites[sprite->data7].pos1.x + gSprites[sprite->data7].pos2.x; + r4 = gSprites[sprite->data7].pos1.y + gSprites[sprite->data7].pos2.y; + DestroySprite(&gSprites[sprite->data7]); + sprite->data7 = sub_813CE88(SPECIES_MUDKIP, r5, r4, 3, 1); + gSprites[sprite->data7].callback = sub_813DD58; + gSprites[sprite->data7].invisible = TRUE; + gSprites[sprite->data7].data1 = 2; + gSprites[sprite->data7].data2 = 0; + sub_813E580(r5, r4); + + BeginNormalPaletteFade(0xFF0000, 0, 16, 16, RGB(31, 23, 31)); + sprite->data0 = 1; + break; + } + case 5: + gSprites[sprite->data6].data0 = 3; + gSprites[sprite->data7].data0 = 3; + break; + case 6: + DestroySprite(&gSprites[sprite->data6]); + DestroySprite(&gSprites[sprite->data7]); + DestroySprite(sprite); + break; + } +} + +static void sub_813E10C(struct Sprite *sprite) +{ + switch (sprite->data0) + { + case 0: + default: + if (sprite->pos2.x > -56) + { + sprite->pos2.x -= 8; + sprite->pos2.y += 6; + } + else + { + sprite->data6 = sprite->pos1.x; + sprite->data7 = sprite->pos1.y; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->data0 = 1; + sprite->data1 = 0; + } + break; + case 1: + if (!(sprite->data1 & 1)) + { + if (sprite->data1 & 2) + { + sprite->pos2.x = -1; + sprite->pos2.y = 1; + } + else + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + } + } + sprite->data1++; + break; + case 2: + sprite->invisible = TRUE; + sprite->pos1.x = sprite->data6; + sprite->pos1.y = sprite->data7; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + break; + case 3: + sprite->invisible = FALSE; + sprite->data1++; + //fall through + case 4: + if (sprite->pos2.x > -56) + { + sprite->pos2.x -= 4; + sprite->pos2.y += 3; + } + else + { + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->data0 = 1; + } + break; + } +} + +static void sub_813E210(struct Sprite *sprite) +{ + switch (sprite->data0) + { + case 0: + default: + if (sprite->pos2.x < 56) + { + sprite->pos2.x += 8; + sprite->pos2.y -= 6; + } + else + { + sprite->data6 = sprite->pos1.x; + sprite->data7 = sprite->pos1.y; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->data0 = 1; + sprite->data1 = 0; + } + break; + case 1: + if (!(sprite->data1 & 1)) + { + if (sprite->data1 & 2) + { + sprite->pos2.x = 1; + sprite->pos2.y = -1; + } + else + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + } + } + sprite->data1++; + break; + case 2: + sprite->invisible = TRUE; + sprite->pos1.x = sprite->data6; + sprite->pos1.y = sprite->data7; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + break; + case 3: + sprite->invisible = FALSE; + sprite->data1++; + //fall through + case 4: + if (sprite->pos2.x < 56) + { + sprite->pos2.x += 4; + sprite->pos2.y -= 3; + } + else + { + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->data0 = 1; + } + break; + } +} + +static void sub_813E30C(struct Sprite *sprite) +{ + u16 r4, r1; + + sprite->data7++; + switch (sprite->data0) + { + case 0: + default: + break; + case 1: + sprite->oam.affineMode = 1; + sprite->oam.matrixNum = 1; + sprite->data0 = 10; + sprite->data4 = 36; + //fall through + case 10: + if (sprite->pos1.x <= 144) + { + sprite->pos1.x += 4; + sprite->pos1.y -= 1; + sprite->pos2.y = -Sin((u8)sprite->data2, 24); + sprite->data2 += 4; + } + sprite->data3 -= sprite->data4; + if ((sprite->data7 & 1) && sprite->data4 != 0) + sprite->data4--; + r4 = gSineTable[(u8)sprite->data3]; + r1 = gSineTable[(u8)(sprite->data3 + 64)]; + SetOamMatrix(1, r1, r4, -r4, r1); + break; + case 2: + sprite->oam.affineMode = 1; + sprite->oam.matrixNum = 2; + sprite->data0 = 20; + sprite->data4 = 36; + //fall through + case 20: + if (sprite->pos1.x <= 96) + { + sprite->pos1.x += 3; + sprite->pos1.y -= 1; + sprite->pos2.y = -Sin((u8)sprite->data2, 24); + sprite->data2 += 4; + } + sprite->data3 -= sprite->data4; + if ((sprite->data7 & 1) && sprite->data4 != 0) + sprite->data4--; + r4 = gSineTable[(u8)sprite->data3]; + r1 = gSineTable[(u8)(sprite->data3 + 64)]; + SetOamMatrix(2, r1, r4, -r4, r1); + break; + } +} + +static void sub_813E4B8(struct Sprite *sprite) +{ + u16 r4; + u16 r2; + u16 r1; + + sprite->data7++; + if (sprite->data7 & 1) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + if (sprite->data2 >= 64) + { + DestroySprite(sprite); + return; + } + sprite->data2 += 2; + r4 = Sin((u8)sprite->data2, 40); + sprite->pos2.x = Cos((u8)(sprite->data0 * 32), r4); + sprite->pos2.y = Sin((u8)(sprite->data0 * 32), r4); + if (sprite->data0 == 0) + { + sprite->data3 -= sprite->data1; + if ((sprite->data7 & 1) && sprite->data1 != 0) + sprite->data1--; + r2 = gSineTable[(u8)sprite->data3]; + r1 = gSineTable[(u8)(sprite->data3 + 64)]; + SetOamMatrix(16, r1, r2, -r2, r1); + } +} + +static void sub_813E580(u16 x, u16 y) +{ + u8 i; + u8 spriteId; + + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840B0B0, x, y, 0); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 16; + gSprites[spriteId].data0 = i; + gSprites[spriteId].data1 = 32; + } +} + +static void sub_813E5E0(struct Sprite *sprite) +{ + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + sprite->invisible = gSprites[sprite->data0].invisible; + if (sprite->data7 < 12) + sprite->data7++; + sprite->data6 += 4; + sprite->pos1.x = sprite->data4 + gSineTable[(u8)(sprite->data3 + 64)] * sprite->data6 / 256; + //This useless '+ 0' is needed to make the asm match + sprite->pos1.y = sprite->data5 + gSineTable[(u8)(sprite->data3 + 0)] * sprite->data6 / 256; + sprite->pos2.y = gSineTable[(u8)(sprite->data1 + 0)] * sprite->data7 / 256; + sprite->data1 += 16; + if (sprite->pos1.y > sprite->data2) + DestroySprite(sprite); + } +} + +static void sub_813E6C0(struct Sprite *sprite) +{ + u8 spriteId; + u8 i; + s16 var1; + s16 var2; + + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + sprite->data7++; + sprite->invisible = TRUE; + if (gSprites[sprite->data0].data0 == 1 && !(sprite->data7 & 3)) + { + var1 = sprite->data1 + gSprites[sprite->data0].pos1.x; + var2 = sprite->data2 + gSprites[sprite->data0].pos1.y; + for (i = 0; i < 3; i++) + { + u8 r3 = gSprites[sprite->data0].subpriority - 1; + //Make redundant copies of these variables to get the asm to match + s16 _var1 = var1; + s16 _var2 = var2; + + spriteId = CreateSprite(&gSpriteTemplate_840B0DC, _var1, _var2, r3); + if (spriteId != 64) + { + gSprites[spriteId].data0 = sprite->data0; + gSprites[spriteId].data1 = (((sprite->data7 >> 2) & 7) << 5) + i * 85; + gSprites[spriteId].data2 = sprite->data3; + gSprites[spriteId].data3 = 104; + gSprites[spriteId].data4 = var1; + gSprites[spriteId].data5 = var2; + gSprites[spriteId].data6 = 0; + } + } + } + } +} + +static void sub_813E7C0(u8 a) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_840B0F4, 0, 0, 0); + if (spriteId != 64) + { + gSprites[spriteId].data0 = a; + gSprites[spriteId].data1 = -12; + gSprites[spriteId].data2 = 0; + gSprites[spriteId].data3 = 136; + } +} + +static void sub_813E804(struct Sprite *sprite) +{ + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + sprite->invisible = gSprites[sprite->data0].invisible; + sprite->data7++; + if (sprite->data3 < 40) + sprite->data3 += 2; + //This useless '+ 0' is needed to make the asm match + sprite->pos1.x = gSprites[sprite->data0].pos1.x + gSprites[sprite->data0].pos2.x + gSineTable[(u8)(sprite->data1 + 64)] * sprite->data3 / 256; + sprite->pos1.y = gSprites[sprite->data0].pos1.y + gSprites[sprite->data0].pos2.y + gSineTable[(u8)(sprite->data1 + 0)] * sprite->data3 / 512; + sprite->data1 += 2; + sprite->pos2.y = gSineTable[(u8)(sprite->data2 + 0)] / 32; + sprite->data2 += 8; + if ((sprite->data1 & 0xFF) < 128) + sprite->subpriority = gSprites[sprite->data0].subpriority - 1; + else + sprite->subpriority = gSprites[sprite->data0].subpriority + 1; + } +} + +static void sub_813E930(u8 a) +{ + u8 i; + u8 spriteId; + + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840B124, gSprites[a].pos1.x, gSprites[a].pos1.y, 0); + if (spriteId != 64) + { + gSprites[spriteId].data0 = a; + gSprites[spriteId].data1 = i * 32; + } + } +} + +static void sub_813E980(struct Sprite *sprite) +{ + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + u8 r0; + u16 matrixNum; + + sprite->invisible = gSprites[sprite->data0].invisible; + sprite->data7++; + sprite->data6 += 8; + sprite->pos1.x = sprite->data4 + gSineTable[(u8)(sprite->data3 + 64)] * sprite->data6 / 256; + sprite->pos1.y = sprite->data5 + gSineTable[(u8)(sprite->data3 + 0)] * sprite->data6 / 256; + r0 = sprite->data6 / 16; + if (r0 > 9) + r0 = 9; + matrixNum = (r0 + 18) & 31; + sprite->oam.matrixNum = matrixNum; + if (sprite->data6 > 160) + DestroySprite(sprite); + } +} + +static void sub_813EA60(struct Sprite *sprite) +{ + bool32 r6; + s16 r1, r2; + u8 spriteId; + + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + sprite->data7++; + sprite->invisible = TRUE; + if (gSprites[sprite->data0].data0 == 1) + { + r6 = (sprite->data7 & 1); + if (!r6) + { + r1 = sprite->data1 + gSprites[sprite->data0].pos1.x; + r2 = sprite->data2 + gSprites[sprite->data0].pos1.y; + spriteId = CreateSprite(&gSpriteTemplate_840B150, r1, r2, gSprites[sprite->data0].subpriority + 1); + if (spriteId != 64) + { + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = 18; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 1, 3); + gSprites[spriteId].data0 = sprite->data0; + gSprites[spriteId].data3 = gUnknown_0840B168[(sprite->data7 >> 1) & 7]; + gSprites[spriteId].data4 = r1; + gSprites[spriteId].data5 = r2; + gSprites[spriteId].data6 = r6; + } + } + } + } +} + +static void InitIntroTorchicAttackAnim(u8 a) +{ + u8 spriteId; + u8 i; + + spriteId = CreateSprite(&gSpriteTemplate_840B170, 0, 0, 0); + if (spriteId != 64) + { + gSprites[spriteId].data0 = a; + gSprites[spriteId].data1 = 0; + gSprites[spriteId].data2 = 8; + gSprites[spriteId].data3 = 24; + } + for (i = 0; i < 10; i++) + { + SetOamMatrix(18 + i, gUnknown_0840B188[i], 0, 0, gUnknown_0840B188[i]); + } +} + +static void sub_813EBBC(struct Sprite *sprite) +{ + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + sprite->invisible = gSprites[sprite->data0].invisible; + sprite->data7 += 1; + sprite->data6 += 8; + sprite->pos1.x = sprite->data4 + gSineTable[(u8)(sprite->data3 + 64)] * sprite->data6 / 256; + sprite->pos1.y = sprite->data5 + gSineTable[(u8)(sprite->data3 + 0)] * sprite->data6 / 256; + sprite->pos2.y = gSineTable[(u8)(sprite->data1 + 0)] / 64; + sprite->data1 += 16; + if (sprite->pos1.y < sprite->data2) + DestroySprite(sprite); + } +} + +static void sub_813EC90(struct Sprite *sprite) +{ + bool32 r6; + s16 r1, r2; + u8 spriteId; + u16 foo; + + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + sprite->data7++; + sprite->invisible = TRUE; + if (gSprites[sprite->data0].data0 == 1) + { + r6 = sprite->data7 & 1; + if (!r6) + { + r1 = sprite->data1 + gSprites[sprite->data0].pos1.x; + r2 = sprite->data2 + gSprites[sprite->data0].pos1.y; + spriteId = CreateSprite(&gSpriteTemplate_840B1B0, r1, r2, gSprites[sprite->data0].subpriority + 1); + if (spriteId != 64) + { + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = 17; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 1, 3); + gSprites[spriteId].data0 = sprite->data0; + gSprites[spriteId].data1 = ((sprite->data7 >> 2) & 7) << 5; + gSprites[spriteId].data2 = sprite->data3; + gSprites[spriteId].data3 = 232; + gSprites[spriteId].data4 = r1; + gSprites[spriteId].data5 = r2; + gSprites[spriteId].data6 = r6; + } + } + if (sprite->data6 < 112) + sprite->data6 += 4; + } + foo = 256 - gSineTable[(u8)sprite->data6] / 2; + SetOamMatrix(17, foo, 0, 0, foo); + } +} + +static void InitIntroMudkipAttackAnim(u8 a) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_840B1C8, 0, 0, 0); + if (spriteId != 64) + { + gSprites[spriteId].data0 = a; + gSprites[spriteId].data1 = 0; + gSprites[spriteId].data2 = 12; + gSprites[spriteId].data3 = 24; + } +} + +static void sub_813EDFC(struct Sprite *sprite) +{ + u16 foo; + + //I'm not sure why a switch statement was used here. + //if (sprite->data0 != 1) would have been more appropriate. + switch (sprite->data0) + { + case 0: + default: + sprite->invisible = FALSE; + sprite->oam.affineMode = 3; + sprite->oam.matrixNum = 18; + CalcCenterToCornerVec(sprite, 0, 3, 3); + sprite->data1 = 0; + sprite->data0 = 1; + //fall through + case 1: + break; + } + sprite->data7++; + if (sprite->data7 & 1) + { + sprite->invisible = TRUE; + } + else + { + sprite->invisible = FALSE; + if (sprite->data1 < 64) + sprite->data1++; + } + foo = 256 - gSineTable[(u8)sprite->data1] / 2; + SetOamMatrix(18, foo, 0, 0, foo); +} diff --git a/src/scene/new_game.c b/src/scene/new_game.c new file mode 100644 index 000000000..226ac9bb7 --- /dev/null +++ b/src/scene/new_game.c @@ -0,0 +1,166 @@ +#include "global.h" +#include "new_game.h" +#include "battle_records.h" +#include "berry.h" +#include "contest.h" +#include "decoration_inventory.h" +#include "dewford_trend.h" +#include "easy_chat.h" +#include "event_data.h" +#include "field_specials.h" +#include "item_menu.h" +#include "lottery_corner.h" +#include "mail_data.h" +#include "mauville_old_man.h" +#include "play_time.h" +#include "player_pc.h" +#include "pokeblock.h" +#include "pokedex.h" +#include "pokemon_size_record.h" +#include "pokemon_storage_system.h" +#include "rng.h" +#include "roamer.h" +#include "rom4.h" +#include "rtc.h" +#include "script.h" +#include "secret_base.h" +#include "tv.h" + +EWRAM_DATA u8 gDifferentSaveFile = 0; +EWRAM_DATA u8 gUnknown_020297ED = 0; + +extern u8 gPlayerPartyCount; +extern u8 gUnknown_03005CE8; +extern u16 gSaveFileStatus; + +extern u8 gUnknown_0819FA81[]; + +const struct SB1_2EFC_Struct gUnknown_08216604 = +{ + 0x0000, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } +}; + +void write_word_to_mem(u32 var, u8 *dataPtr) +{ + dataPtr[0] = var; + dataPtr[1] = var >> 8; + dataPtr[2] = var >> 16; + dataPtr[3] = var >> 24; +} + +void copy_word_to_mem(u8 *copyTo, u8 *copyFrom) +{ + s32 i; + for (i = 0; i < 4; i++) + copyTo[i] = copyFrom[i]; +} + +void InitPlayerTrainerId(void) +{ + write_word_to_mem((Random() << 16) | Random(), gSaveBlock2.playerTrainerId); +} + +// L=A isnt set here for some reason. +void SetDefaultOptions(void) +{ + gSaveBlock2.optionsTextSpeed = OPTIONS_TEXT_SPEED_MID; + gSaveBlock2.optionsWindowFrameType = 0; + gSaveBlock2.optionsSound = OPTIONS_SOUND_MONO; + gSaveBlock2.optionsBattleStyle = OPTIONS_BATTLE_STYLE_SHIFT; + gSaveBlock2.optionsBattleSceneOff = FALSE; + gSaveBlock2.regionMapZoom = FALSE; +} + +void ClearPokedexFlags(void) +{ + gUnknown_03005CE8 = 0; + memset(&gSaveBlock2.pokedex.owned, 0, sizeof(gSaveBlock2.pokedex.owned)); + memset(&gSaveBlock2.pokedex.seen, 0, sizeof(gSaveBlock2.pokedex.seen)); +} + +void sub_8052DA8(void) +{ + s32 i; + + sub_80B2D1C(); + for (i = 0; i < 5; i++) + gSaveBlock1.sbStruct.unkSB1.sb1_2EFC_struct[i] = gUnknown_08216604; +} + +void sub_8052DE4(void) +{ + CpuFill32(0, &gSaveBlock2.filler_A8, sizeof(gSaveBlock2.filler_A8)); +} + +void WarpToTruck(void) +{ + warp1_set(25, 40, -1, -1, -1); // inside of truck + warp_in(); +} + +void ClearSav2(void) +{ + CpuFill16(0, &gSaveBlock2, sizeof(gSaveBlock2)); + SetDefaultOptions(); +} + +void sub_8052E4C(void) +{ + gDifferentSaveFile = 0; + sub_808C0A0(); + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + ResetBagScrollPositions(); +} + +void NewGameInitData(void) +{ + if (gSaveFileStatus == 0 || gSaveFileStatus == 2) + RtcReset(); + + gDifferentSaveFile = 1; + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + ResetPokedex(); + sub_8052DE4(); + memset(&gSaveBlock1, 0, sizeof(gSaveBlock1)); + ClearMailData(); + gSaveBlock2.specialSaveWarp = 0; + InitPlayerTrainerId(); + PlayTimeCounter_Reset(); + ClearPokedexFlags(); + InitEventData(); + ClearTVShowData(); + ResetGabbyAndTy(); + ResetSecretBases(); + ClearBerryTrees(); + gSaveBlock1.money = 3000; + ResetLinkContestBoolean(); + ResetGameStats(); + sub_8052DA8(); + InitLinkBattleRecords(); + InitShroomishSizeRecord(); + InitBarboachSizeRecord(); + gPlayerPartyCount = 0; + ZeroPlayerPartyMons(); + ResetPokemonStorageSystem(); + ClearRoamerData(); + ClearRoamerLocationData(); + gSaveBlock1.registeredItem = 0; + ClearBag(); + NewGameInitPCItems(); + ClearPokeblocks(); + ClearDecorationInventories(); + InitEasyChatPhrases(); + SetMauvilleOldMan(); + InitDewfordTrend(); + ResetFanClub(); + ResetLotteryCorner(); + WarpToTruck(); + ScriptContext2_RunNewScript(gUnknown_0819FA81); +} diff --git a/src/scene/title_screen.c b/src/scene/title_screen.c new file mode 100644 index 000000000..ab0f1d505 --- /dev/null +++ b/src/scene/title_screen.c @@ -0,0 +1,892 @@ +#include "global.h" +#include "gba/m4a_internal.h" +#include "title_screen.h" +#include "clear_save_data_menu.h" +#include "decompress.h" +#include "event_data.h" +#include "intro.h" +#include "m4a.h" +#include "main.h" +#include "main_menu.h" +#include "palette.h" +#include "reset_rtc_screen.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "unknown_task.h" + +#if ENGLISH +#define VERSION_BANNER_SHAPE 1 +#define VERSION_BANNER_RIGHT_TILEOFFSET 64 +#define VERSION_BANNER_BYTES 0x1000 +#define VERSION_BANNER_LEFT_X 98 +#define VERSION_BANNER_RIGHT_X 162 +#define VERSION_BANNER_Y 26 +#define VERSION_BANNER_Y_GOAL 66 +#define START_BANNER_X DISPLAY_WIDTH / 2 +#elif GERMAN +#define VERSION_BANNER_SHAPE 0 +#define VERSION_BANNER_RIGHT_TILEOFFSET 128 +#define VERSION_BANNER_BYTES 0x2000 +#define VERSION_BANNER_LEFT_X 108 +#define VERSION_BANNER_RIGHT_X 172 +#ifdef SAPPHIRE +#define VERSION_BANNER_Y_GOAL 83 +#else +#define VERSION_BANNER_Y_GOAL 84 +#endif +#define VERSION_BANNER_Y (VERSION_BANNER_Y_GOAL - 40) +#define START_BANNER_X DISPLAY_WIDTH / 2 - 2 +#endif + +extern u8 gReservedSpritePaletteCount; +extern struct MusicPlayerInfo gMPlay_BGM; +extern u16 gUnknown_030041B4; +extern u16 gUnknown_030042C0; +extern const u8 gUnknown_08E9D8CC[]; +extern const u16 gUnknown_08E9F624[]; +extern const u8 gUnknown_08E9F7E4[]; +extern const u8 gVersionTiles[]; +extern const u8 gTitleScreenPressStart_Gfx[]; +extern const u16 gTitleScreenLogoShinePalette[]; + +static EWRAM_DATA u8 gUnknown_0202F7E4 = 0; + +#ifdef SAPPHIRE +static const u16 sLegendaryMonPalettes[][16] = +{ + INCBIN_U16("graphics/title_screen/kyogre_dark.gbapal"), + INCBIN_U16("graphics/title_screen/kyogre_glow.gbapal"), +}; +static const u8 sLegendaryMonPixelData[] = INCBIN_U8("graphics/title_screen/kyogre.4bpp.lz"); +static const u8 sLegendaryMonTilemap[] = INCBIN_U8("graphics/title_screen/kyogre_map.bin.lz"); +static const u8 sBackdropTilemap[] = INCBIN_U8("graphics/title_screen/water_map.bin.lz"); +#else +static const u16 sLegendaryMonPalettes[][16] = +{ + INCBIN_U16("graphics/title_screen/groudon_dark.gbapal"), + INCBIN_U16("graphics/title_screen/groudon_glow.gbapal"), +}; +static const u8 sLegendaryMonPixelData[] = INCBIN_U8("graphics/title_screen/groudon.4bpp.lz"); +static const u8 sLegendaryMonTilemap[] = INCBIN_U8("graphics/title_screen/groudon_map.bin.lz"); +static const u8 sBackdropTilemap[] = INCBIN_U8("graphics/title_screen/lava_map.bin.lz"); +#endif +static const u8 sLogoShineTiles[] = INCBIN_U8("graphics/title_screen/logo_shine.4bpp.lz"); +const u16 gUnknown_08393E64[] = +{ + 0x10, + 0x110, + 0x210, + 0x310, + 0x410, + 0x510, + 0x610, + 0x710, + 0x810, + 0x910, + 0xA10, + 0xB10, + 0xC10, + 0xD10, + 0xE10, + 0xF10, + 0x100F, + 0x100E, + 0x100D, + 0x100C, + 0x100B, + 0x100A, + 0x1009, + 0x1008, + 0x1007, + 0x1006, + 0x1005, + 0x1004, + 0x1003, + 0x1002, + 0x1001, + 0x1000, +}; +static const struct OamData sVersionBannerLeftOamData = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 1, + .shape = VERSION_BANNER_SHAPE, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData sVersionBannerRightOamData = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 1, + .shape = VERSION_BANNER_SHAPE, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd sVersionBannerLeftAnimSequence[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END, +}; +static const union AnimCmd sVersionBannerRightAnimSequence[] = +{ + ANIMCMD_FRAME(VERSION_BANNER_RIGHT_TILEOFFSET, 30), + ANIMCMD_END, +}; +static const union AnimCmd *const sVersionBannerLeftAnimTable[] = +{ + sVersionBannerLeftAnimSequence, +}; +static const union AnimCmd *const sVersionBannerRightAnimTable[] = +{ + sVersionBannerRightAnimSequence, +}; +static const struct SpriteTemplate sVersionBannerLeftSpriteTemplate = +{ + .tileTag = 1000, + .paletteTag = 1000, + .oam = &sVersionBannerLeftOamData, + .anims = sVersionBannerLeftAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_VersionBannerLeft, +}; +static const struct SpriteTemplate sVersionBannerRightSpriteTemplate = +{ + .tileTag = 1000, + .paletteTag = 1000, + .oam = &sVersionBannerRightOamData, + .anims = sVersionBannerRightAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_VersionBannerRight, +}; +static const struct CompressedSpriteSheet gUnknown_08393EFC[] = +{ + {gVersionTiles, VERSION_BANNER_BYTES, 1000}, + {NULL}, +}; +static const struct OamData gOamData_8393F0C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_8393F14[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F1C[] = +{ + ANIMCMD_FRAME(4, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F24[] = +{ + ANIMCMD_FRAME(8, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F2C[] = +{ + ANIMCMD_FRAME(12, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F34[] = +{ + ANIMCMD_FRAME(16, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F3C[] = +{ + ANIMCMD_FRAME(20, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F44[] = +{ + ANIMCMD_FRAME(24, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F4C[] = +{ + ANIMCMD_FRAME(28, 4), + ANIMCMD_END, +}; +#if GERMAN +static const union AnimCmd gSpriteAnim_839F73C[] = +{ + ANIMCMD_FRAME(32, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_839F744[] = +{ + ANIMCMD_FRAME(36, 4), + ANIMCMD_END, +}; +#endif +static const union AnimCmd *const sStartCopyrightBannerAnimTable[] = +{ + gSpriteAnim_8393F14, + gSpriteAnim_8393F1C, + gSpriteAnim_8393F24, + gSpriteAnim_8393F2C, + gSpriteAnim_8393F34, + gSpriteAnim_8393F3C, + gSpriteAnim_8393F44, + gSpriteAnim_8393F4C, +#if GERMAN + gSpriteAnim_839F73C, + gSpriteAnim_839F744, +#endif +}; +static const struct SpriteTemplate sStartCopyrightBannerSpriteTemplate = +{ + .tileTag = 1001, + .paletteTag = 1001, + .oam = &gOamData_8393F0C, + .anims = sStartCopyrightBannerAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_PressStartCopyrightBanner, +}; +static const struct CompressedSpriteSheet gUnknown_08393F8C[] = +{ + {gTitleScreenPressStart_Gfx, 0x520, 1001}, + {NULL}, +}; +const struct SpritePalette sPokemonLogoShinePalette[] = +{ + {gTitleScreenLogoShinePalette, 1001}, + {NULL}, +}; +static const struct OamData sPokemonLogoShineOamData = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd sPokemonLogoShineAnimSequence[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; +static const union AnimCmd *const sPokemonLogoShineAnimTable[] = +{ + sPokemonLogoShineAnimSequence, +}; +static const struct SpriteTemplate sPokemonLogoShineSpriteTemplate = +{ + .tileTag = 1002, + .paletteTag = 1001, + .oam = &sPokemonLogoShineOamData, + .anims = sPokemonLogoShineAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_PokemonLogoShine, +}; +static const struct CompressedSpriteSheet sPokemonLogoShineSpriteSheet[] = +{ + {sLogoShineTiles, 0x800, 1002}, + {NULL}, +}; + +#define _RGB(r, g, b) ((((b) & 31) << 10) + (((g) & 31) << 5) + ((r) & 31)) + +#ifdef SAPPHIRE +//Red Kyogre markings +#define LEGENDARY_MARKING_COLOR(c) RGB((c), 0, 0) +#else +//Blue Groundon markings +#define LEGENDARY_MARKING_COLOR(c) RGB(0, 0, (c)) +#endif + +#if defined(GERMAN) && defined(SAPPHIRE) +#define PLTT_BUFFER_INDEX 9 +#elif defined(SAPPHIRE) +#define PLTT_BUFFER_INDEX 26 +#else +#define PLTT_BUFFER_INDEX 21 +#endif + +#define CLEAR_SAVE_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_UP) +#define RESET_RTC_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_LEFT) +#define A_B_START_SELECT (A_BUTTON | B_BUTTON | START_BUTTON | SELECT_BUTTON) + +static void MainCB2(void); +static void Task_TitleScreenPhase1(u8); +static void Task_TitleScreenPhase2(u8); +static void Task_TitleScreenPhase3(u8); +static void CB2_GoToMainMenu(void); +static void CB2_GoToClearSaveDataScreen(void); +static void CB2_GoToResetRtcScreen(void); +static void CB2_GoToCopyrightScreen(void); +static void UpdateLegendaryMarkingColor(u8); + +void SpriteCallback_VersionBannerLeft(struct Sprite *sprite) +{ + struct Task *task = &gTasks[sprite->data1]; + + if (task->data[1] != 0) + { + sprite->oam.objMode = 0; + sprite->pos1.y = VERSION_BANNER_Y_GOAL; + sprite->invisible = FALSE; + } + else + { + if (task->data[5] != 0) + task->data[5]--; + if (task->data[5] < 64) + { + sprite->invisible = FALSE; + if (sprite->pos1.y != VERSION_BANNER_Y_GOAL) + sprite->pos1.y++; + REG_BLDALPHA = gUnknown_08393E64[task->data[5] / 2]; + } + } +} + +void SpriteCallback_VersionBannerRight(struct Sprite *sprite) +{ + struct Task *task = &gTasks[sprite->data1]; + + if (task->data[1] != 0) + { + sprite->oam.objMode = 0; + sprite->pos1.y = VERSION_BANNER_Y_GOAL; + sprite->invisible = FALSE; + } + else + { + if (task->data[5] < 64) + { + sprite->invisible = FALSE; + if (sprite->pos1.y != VERSION_BANNER_Y_GOAL) + sprite->pos1.y++; + } + } +} + +void SpriteCallback_PressStartCopyrightBanner(struct Sprite *sprite) +{ + if (sprite->data0 == 1) + { + sprite->data1++; + //Alternate between hidden and shown every 16th frame + if (sprite->data1 & 16) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + } + else + sprite->invisible = FALSE; +} + +#if ENGLISH +static void CreatePressStartBanner(s16 x, s16 y) +{ + u8 i; + u8 spriteId; + + x -= 32; + for (i = 0; i < 3; i++, x += 32) + { + spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0); + StartSpriteAnim(&gSprites[spriteId], i); + gSprites[spriteId].data0 = 1; + } +} +#elif GERMAN +__attribute__((naked)) +static void CreatePressStartBanner(s16 x, s16 y) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 16\n\ + ldr r2, _0807C3AC @ =0xffe00000\n\ + adds r0, r2\n\ + lsrs r0, 16\n\ + movs r6, 0\n\ + lsls r1, 16\n\ + mov r10, r1\n\ + mov r8, r10\n\ +_0807C302:\n\ + lsls r5, r0, 16\n\ + asrs r5, 16\n\ + ldr r0, _0807C3B0 @ =sStartCopyrightBannerSpriteTemplate\n\ + adds r1, r5, 0\n\ + mov r3, r8\n\ + asrs r2, r3, 16\n\ + movs r3, 0\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, r0, 4\n\ + adds r4, r0\n\ + lsls r4, 2\n\ + ldr r0, _0807C3B4 @ =gSprites\n\ + mov r9, r0\n\ + add r4, r9\n\ + adds r0, r4, 0\n\ + adds r1, r6, 0\n\ + bl StartSpriteAnim\n\ + movs r7, 0x1\n\ + strh r7, [r4, 0x2E]\n\ + adds r0, r6, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + adds r5, 0x20\n\ + lsls r5, 16\n\ + lsrs r0, r5, 16\n\ + cmp r6, 0x2\n\ + bls _0807C302\n\ + ldr r1, _0807C3B0 @ =sStartCopyrightBannerSpriteTemplate\n\ + mov r8, r1\n\ + lsls r5, r0, 16\n\ + asrs r5, 16\n\ + mov r2, r10\n\ + asrs r6, r2, 16\n\ + mov r0, r8\n\ + adds r1, r5, 0\n\ + adds r2, r6, 0\n\ + movs r3, 0\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, r0, 4\n\ + adds r4, r0\n\ + lsls r4, 2\n\ + add r4, r9\n\ + adds r0, r4, 0\n\ + movs r1, 0x8\n\ + bl StartSpriteAnim\n\ + strh r7, [r4, 0x2E]\n\ + subs r5, 0x60\n\ + lsls r5, 16\n\ + asrs r5, 16\n\ + subs r6, 0x8\n\ + lsls r6, 16\n\ + asrs r6, 16\n\ + mov r0, r8\n\ + adds r1, r5, 0\n\ + adds r2, r6, 0\n\ + movs r3, 0\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, r0, 4\n\ + adds r4, r0\n\ + lsls r4, 2\n\ + add r4, r9\n\ + adds r0, r4, 0\n\ + movs r1, 0x9\n\ + bl StartSpriteAnim\n\ + strh r7, [r4, 0x2E]\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0807C3AC: .4byte 0xffe00000\n\ +_0807C3B0: .4byte sStartCopyrightBannerSpriteTemplate\n\ +_0807C3B4: .4byte gSprites\n\ + .syntax divided\n"); +} +#endif + +static void CreateCopyrightBanner(s16 x, s16 y) +{ + u8 i; + u8 spriteId; + + x -= 64; + for (i = 0; i < 5; i++, x += 32) + { + spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0); + StartSpriteAnim(&gSprites[spriteId], i + 3); + } +} + +void SpriteCallback_PokemonLogoShine(struct Sprite *sprite) +{ + if (gTasks[gUnknown_0202F7E4].data[1] == 0 && sprite->pos1.x < 272) + { + if (sprite->data0) //Flash background + { + u16 backgroundColor; + + if (sprite->pos1.x < DISPLAY_WIDTH / 2) + { + //Brighten background color + if (sprite->data1 < 31) + sprite->data1++; + if (sprite->data1 < 31) + sprite->data1++; + } + else + { + //Darken background color + if (sprite->data1 != 0) + sprite->data1--; + if (sprite->data1 != 0) + sprite->data1--; + } + backgroundColor = _RGB(sprite->data1, sprite->data1, sprite->data1); + gPlttBufferFaded[0] = backgroundColor; + gPlttBufferFaded[PLTT_BUFFER_INDEX] = backgroundColor; + } + sprite->pos1.x += 4; + } + else + { + gPlttBufferFaded[0] = RGB_BLACK; + gPlttBufferFaded[PLTT_BUFFER_INDEX] = RGB_BLACK; + DestroySprite(sprite); + } +} + +static void StartPokemonLogoShine(bool8 flashBackground) +{ + u8 spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0); + + gSprites[spriteId].oam.objMode = 2; + gSprites[spriteId].data0 = flashBackground; +} + +static void VBlankCB(void) +{ + sub_8089668(); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + REG_BG1VOFS = gUnknown_030041B4; +} + + +#define tCounter data[0] +#define tSkipToNext data[1] + +void CB2_InitTitleScreen(void) +{ + switch (gMain.state) + { + default: + case 0: + SetVBlankCallback(NULL); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + *((u16 *)PLTT) = RGB_WHITE; + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16(3, 0, (void *)VRAM, 0x18000); + DmaFill32(3, 0, (void *)OAM, 0x400); + DmaFill16(3, 0, (void *)(PLTT + 2), 0x3FE); + ResetPaletteFade(); + gMain.state = 1; + break; + case 1: + LZ77UnCompVram(gUnknown_08E9D8CC, (void *)VRAM); + LZ77UnCompVram(gUnknown_08E9F7E4, (void *)(VRAM + 0x4800)); + LoadPalette(gUnknown_08E9F624, 0, 0x1C0); + LZ77UnCompVram(sLegendaryMonPixelData, (void *)(VRAM + 0x8000)); + LZ77UnCompVram(sLegendaryMonTilemap, (void *)(VRAM + 0xC000)); + LZ77UnCompVram(sBackdropTilemap, (void *)(VRAM + 0xC800)); + LoadPalette(sLegendaryMonPalettes, 0xE0, sizeof(sLegendaryMonPalettes)); + remove_some_task(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 14; + LoadCompressedObjectPic(&gUnknown_08393EFC[0]); + LoadCompressedObjectPic(&gUnknown_08393F8C[0]); + LoadCompressedObjectPic(&sPokemonLogoShineSpriteSheet[0]); + LoadPalette(gUnknown_08E9F624, 0x100, 0x1C0); + LoadSpritePalette(&sPokemonLogoShinePalette[0]); + gMain.state = 2; + break; + case 2: + { + u8 taskId = CreateTask(Task_TitleScreenPhase1, 0); + + gTasks[taskId].tCounter = 256; + gTasks[taskId].tSkipToNext = FALSE; + gTasks[taskId].data[2] = -16; + gTasks[taskId].data[3] = -32; + gUnknown_0202F7E4 = taskId; + gMain.state = 3; + break; + } + case 3: + BeginNormalPaletteFade(-1, 1, 0x10, 0, 0xFFFF); + SetVBlankCallback(VBlankCB); + gMain.state = 4; + break; + case 4: + { + u16 savedIme; + + sub_813CE30(0x78, 0x50, 0x100, 0); + REG_BG2X = -29 * 256; + REG_BG2Y = -33 * 256; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_WININ = 0x1F1F; + REG_WINOUT = 0x3F1F; + REG_BLDCNT = 0x84; + REG_BLDALPHA = 0; + REG_BLDY = 0x8; + REG_BG0CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(25) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_256COLOR | BGCNT_AFF256x256; + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + REG_DISPCNT = DISPCNT_MODE_1 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG2_ON + | DISPCNT_OBJ_ON + | DISPCNT_WIN0_ON + | DISPCNT_OBJWIN_ON; + m4aSongNumStart(0x19D); + gMain.state = 5; + break; + } + case 5: + if (!UpdatePaletteFade()) + { + StartPokemonLogoShine(FALSE); + sub_8089944(0, 0xA0, 4, 4, 0, 4, 1); + SetMainCallback2(MainCB2); + } + break; + } +} + +static void MainCB2(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +//Shine the Pokemon logo two more times, and fade in the version banner +static void Task_TitleScreenPhase1(u8 taskId) +{ + //Skip to next phase when A, B, Start, or Select is pressed + if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].data[1] != 0) + { + gTasks[taskId].tSkipToNext = TRUE; + gTasks[taskId].tCounter = 0; + } + + if (gTasks[taskId].tCounter != 0) + { + u16 frameNum = gTasks[taskId].tCounter; + + if (frameNum == 160 || frameNum == 64) + StartPokemonLogoShine(TRUE); + gTasks[taskId].tCounter--; + } + else + { + u8 spriteId; + + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + REG_WININ = 0; + REG_WINOUT = 0; + REG_BLDCNT = 0x3F50; + REG_BLDALPHA = 0x1F; + REG_BLDY = 0; + + //Create left side of version banner + spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, VERSION_BANNER_LEFT_X, VERSION_BANNER_Y, 0); + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].data1 = taskId; + + //Create right side of version banner + spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, VERSION_BANNER_RIGHT_X, VERSION_BANNER_Y, 0); + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].data1 = taskId; + + gTasks[taskId].data[5] = 88; + gTasks[taskId].tCounter = 144; + gTasks[taskId].func = Task_TitleScreenPhase2; + } +} + +//Create "Press Start" and copyright banners, and slide Pokemon logo up +static void Task_TitleScreenPhase2(u8 taskId) +{ + //Skip to next phase when A, B, Start, or Select is pressed + if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].tSkipToNext) + { + gTasks[taskId].tSkipToNext = TRUE; + gTasks[taskId].tCounter = 0; + } + + if (gTasks[taskId].tCounter != 0) + gTasks[taskId].tCounter--; + else + { + gTasks[taskId].tSkipToNext = TRUE; + REG_DISPCNT = DISPCNT_MODE_1 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG0_ON + | DISPCNT_BG1_ON + | DISPCNT_BG2_ON + | DISPCNT_OBJ_ON; + CreatePressStartBanner(START_BANNER_X, 108); + CreateCopyrightBanner(DISPLAY_WIDTH / 2, 148); + gTasks[taskId].data[4] = 0; + gTasks[taskId].func = Task_TitleScreenPhase3; + } + + if (!(gTasks[taskId].tCounter & 1) && gTasks[taskId].data[3] != 0) + gTasks[taskId].data[3]++; + + //Slide Pokemon logo up + REG_BG2Y = gTasks[taskId].data[3] * 256; +} + +//Show Kyogre/Groundon silhouette and process main title screen input +static void Task_TitleScreenPhase3(u8 taskId) +{ + REG_BLDCNT = 0x2142; + REG_BLDALPHA = 0x1F0F; + REG_BLDY = 0; + + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & START_BUTTON)) + { + FadeOutBGM(4); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF); + SetMainCallback2(CB2_GoToMainMenu); + } + else + { + if ((gMain.heldKeys & CLEAR_SAVE_BUTTON_COMBO) == CLEAR_SAVE_BUTTON_COMBO) + SetMainCallback2(CB2_GoToClearSaveDataScreen); + if ((gMain.heldKeys & RESET_RTC_BUTTON_COMBO) == RESET_RTC_BUTTON_COMBO + && CanResetRTC() == 1) + { + FadeOutBGM(4); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + SetMainCallback2(CB2_GoToResetRtcScreen); + } + else + { + REG_BG2Y = 0; + gTasks[taskId].tCounter++; + if (gTasks[taskId].tCounter & 1) + { + gTasks[taskId].data[4]++; + gUnknown_030041B4 = gTasks[taskId].data[4]; + gUnknown_030042C0 = 0; + } + UpdateLegendaryMarkingColor(gTasks[taskId].tCounter); + if ((gMPlay_BGM.status & 0xFFFF) == 0) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF); + SetMainCallback2(CB2_GoToCopyrightScreen); + } + } + } +} + +static void CB2_GoToMainMenu(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitMainMenu); +} + +static void CB2_GoToCopyrightScreen(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitCopyrightScreenAfterTitleScreen); +} + +static void CB2_GoToClearSaveDataScreen(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitClearSaveDataScreen); +} + +static void CB2_GoToResetRtcScreen(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitResetRtcScreen); +} + +static void UpdateLegendaryMarkingColor(u8 frameNum) +{ + u16 palette; + + if ((frameNum % 4) == 0) //Change color every 4th frame + { + u8 colorIntensity = (frameNum >> 2) & 31; //Take bits 2-6 of frameNum the color intensity + u8 fadeDarker = (frameNum >> 2) & 32; + + if (!fadeDarker) + palette = LEGENDARY_MARKING_COLOR(colorIntensity); + else + palette = LEGENDARY_MARKING_COLOR(31 - colorIntensity); + LoadPalette(&palette, 0xEF, sizeof(palette)); + } +} + diff --git a/src/scrcmd.c b/src/scrcmd.c deleted file mode 100644 index 66578f350..000000000 --- a/src/scrcmd.c +++ /dev/null @@ -1,1887 +0,0 @@ -#include "global.h" -#include "battle_setup.h" -#include "berry.h" -#include "clock.h" -#include "coins.h" -#include "contest_link_80C2020.h" -#include "contest_painting.h" -#include "data2.h" -#include "decoration.h" -#include "decoration_inventory.h" -#include "event_data.h" -#include "field_door.h" -#include "field_effect.h" -#include "field_fadetransition.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" -#include "field_message_box.h" -#include "field_player_avatar.h" -#include "field_screen_effect.h" -#include "field_specials.h" -#include "field_tasks.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "item.h" -#include "main.h" -#include "map_obj_lock.h" -#include "menu.h" -#include "money.h" -#include "mystery_event_script.h" -#include "palette.h" -#include "party_menu.h" -#include "pokemon.h" -#include "rng.h" -#include "rom4.h" -#include "rtc.h" -#include "script.h" -#include "script_menu.h" -#include "script_movement.h" -#include "script_pokemon_80C4.h" -#include "script_pokemon_80F9.h" -#include "shop.h" -#include "slot_machine.h" -#include "sound.h" -#include "string_util.h" -#include "tv.h" - -typedef u16 (*SpecialFunc)(void); -typedef void (*NativeFunc)(void); - -extern u32 gUnknown_0202E8AC; - -static EWRAM_DATA u32 gUnknown_0202E8B0 = 0; -static EWRAM_DATA u16 gUnknown_0202E8B4 = 0; -static EWRAM_DATA u16 gUnknown_0202E8B6 = 0; -static EWRAM_DATA u16 gUnknown_0202E8B8 = 0; -static EWRAM_DATA u16 gUnknown_0202E8BA = 0; -static EWRAM_DATA u16 gUnknown_0202E8BC = 0; - -extern u16 gSpecialVar_0x8000; -extern u16 gSpecialVar_0x8001; -extern u16 gSpecialVar_0x8002; -extern u16 gSpecialVar_0x8004; - -extern u16 gScriptResult; - -extern u16 gScriptContestCategory; - -extern SpecialFunc gSpecials[]; -extern u8 *gStdScripts[]; -extern u8 *gStdScripts_End[]; - -// This is defined in here so the optimizer can't see its value when compiling -// script.c. -void * const gNullScriptPtr = NULL; - -static const u8 sScriptConditionTable[6][3] = -{ -// < = > - 1, 0, 0, // < - 0, 1, 0, // = - 0, 0, 1, // > - 1, 1, 0, // <= - 0, 1, 1, // >= - 1, 0, 1, // != -}; - -static u8 * const sScriptStringVars[] = -{ - gStringVar1, - gStringVar2, - gStringVar3, -}; - -bool8 ScrCmd_snop(struct ScriptContext *ctx) -{ - return FALSE; -} - -bool8 ScrCmd_snop1(struct ScriptContext *ctx) -{ - return FALSE; -} - -bool8 ScrCmd_end(struct ScriptContext *ctx) -{ - StopScript(ctx); - return FALSE; -} - -bool8 ScrCmd_jumpasm(struct ScriptContext *ctx) -{ - u32 addr = ScriptReadWord(ctx); - SetupNativeScript(ctx, (void *)addr); - return TRUE; -} - -bool8 ScrCmd_special(struct ScriptContext *ctx) -{ - u16 index = ScriptReadHalfword(ctx); - gSpecials[index](); - return FALSE; -} - -bool8 ScrCmd_specialval(struct ScriptContext *ctx) -{ - u16 *var = GetVarPointer(ScriptReadHalfword(ctx)); - *var = gSpecials[ScriptReadHalfword(ctx)](); - return FALSE; -} - -bool8 ScrCmd_callasm(struct ScriptContext *ctx) -{ - NativeFunc func = (NativeFunc)ScriptReadWord(ctx); - func(); - return FALSE; -} - -bool8 ScrCmd_waitstate(struct ScriptContext *ctx) -{ - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_jump(struct ScriptContext *ctx) -{ - u8 *ptr = (u8 *)ScriptReadWord(ctx); - ScriptJump(ctx, ptr); - return FALSE; -} - -bool8 ScrCmd_return(struct ScriptContext *ctx) -{ - ScriptReturn(ctx); - return FALSE; -} - -bool8 ScrCmd_call(struct ScriptContext *ctx) -{ - - u8 *ptr = (u8 *)ScriptReadWord(ctx); - ScriptCall(ctx, ptr); - return FALSE; -} - -bool8 ScrCmd_jumpif(struct ScriptContext *ctx) -{ - u8 condition = ScriptReadByte(ctx); - u8 *ptr = (u8 *)ScriptReadWord(ctx); - if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) - ScriptJump(ctx, ptr); - return FALSE; -} - -bool8 ScrCmd_callif(struct ScriptContext *ctx) -{ - u8 condition = ScriptReadByte(ctx); - u8 *ptr = (u8 *)ScriptReadWord(ctx); - if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) - ScriptCall(ctx, ptr); - return FALSE; -} - -bool8 ScrCmd_setvaddress(struct ScriptContext *ctx) -{ - u32 addr1 = (u32)ctx->scriptPtr - 1; - u32 addr2 = ScriptReadWord(ctx); - gUnknown_0202E8B0 = addr2 - addr1; - return FALSE; -} - -bool8 ScrCmd_vjump(struct ScriptContext *ctx) -{ - u32 addr = ScriptReadWord(ctx); - ScriptJump(ctx, (u8 *)(addr - gUnknown_0202E8B0)); - return FALSE; -} - -bool8 ScrCmd_vcall(struct ScriptContext *ctx) -{ - u32 addr = ScriptReadWord(ctx); - ScriptCall(ctx, (u8 *)(addr - gUnknown_0202E8B0)); - return FALSE; -} - -bool8 ScrCmd_if5(struct ScriptContext *ctx) -{ - u8 condition = ScriptReadByte(ctx); - u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); - if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) - ScriptJump(ctx, ptr); - return FALSE; -} - -bool8 ScrCmd_if6(struct ScriptContext *ctx) -{ - u8 condition = ScriptReadByte(ctx); - u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); - if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) - ScriptCall(ctx, ptr); - return FALSE; -} - -bool8 ScrCmd_jumpstd(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - u8 **ptr = &gStdScripts[index]; - if (ptr < gStdScripts_End) - ScriptJump(ctx, *ptr); - return FALSE; -} - -bool8 ScrCmd_callstd(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - u8 **ptr = &gStdScripts[index]; - if (ptr < gStdScripts_End) - ScriptCall(ctx, *ptr); - return FALSE; -} - -bool8 ScrCmd_jumpstdif(struct ScriptContext *ctx) -{ - u8 condition = ScriptReadByte(ctx); - u8 index = ScriptReadByte(ctx); - if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) - { - u8 **ptr = &gStdScripts[index]; - if (ptr < gStdScripts_End) - ScriptJump(ctx, *ptr); - } - return FALSE; -} - -bool8 ScrCmd_callstdif(struct ScriptContext *ctx) -{ - u8 condition = ScriptReadByte(ctx); - u8 index = ScriptReadByte(ctx); - if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) - { - u8 **ptr = &gStdScripts[index]; - if (ptr < gStdScripts_End) - ScriptCall(ctx, *ptr); - } - return FALSE; -} - -bool8 ScrCmd_jumpram(struct ScriptContext *ctx) -{ - ScriptJump(ctx, (u8 *)gUnknown_0202E8AC); - return FALSE; -} - -bool8 ScrCmd_die(struct ScriptContext *ctx) -{ - ClearRamScript(); - StopScript(ctx); - return TRUE; -} - -bool8 ScrCmd_setbyte(struct ScriptContext *ctx) -{ - u8 value = ScriptReadByte(ctx); - SetMysteryEventScriptStatus(value); - return FALSE; -} - -bool8 ScrCmd_loadptr(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - ctx->data[index] = ScriptReadWord(ctx); - return FALSE; -} - -bool8 ScrCmd_loadbytefrompointer(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - ctx->data[index] = *(u8 *)ScriptReadWord(ctx); - return FALSE; -} - -bool8 ScrCmd_writebytetooffset(struct ScriptContext *ctx) -{ - u8 value = ScriptReadByte(ctx); - *(u8 *)ScriptReadWord(ctx) = value; - return FALSE; -} - -bool8 ScrCmd_setbufferbyte(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - ctx->data[index] = ScriptReadByte(ctx); - return FALSE; -} - -bool8 ScrCmd_setptrbyte(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - *(u8 *)ScriptReadWord(ctx) = ctx->data[index]; - return FALSE; -} - -bool8 ScrCmd_copybuffers(struct ScriptContext *ctx) -{ - u8 destIndex = ScriptReadByte(ctx); - u8 srcIndex = ScriptReadByte(ctx); - ctx->data[destIndex] = ctx->data[srcIndex]; - return FALSE; -} - -bool8 ScrCmd_copybyte(struct ScriptContext *ctx) -{ - u8 *ptr = (u8 *)ScriptReadWord(ctx); - *ptr = *(u8 *)ScriptReadWord(ctx); - return FALSE; -} - -bool8 ScrCmd_setvar(struct ScriptContext *ctx) -{ - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr = ScriptReadHalfword(ctx); - return FALSE; -} - -bool8 ScrCmd_copyvar(struct ScriptContext *ctx) -{ - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr = *GetVarPointer(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_setorcopyvar(struct ScriptContext *ctx) -{ - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr = VarGet(ScriptReadHalfword(ctx)); - return FALSE; -} - -u8 compare_012(u16 a1, u16 a2) -{ - if (a1 < a2) - return 0; - - if (a1 == a2) - return 1; - - return 2; -} - -bool8 ScrCmd_comparebuffers(struct ScriptContext *ctx) -{ - u8 value1 = ctx->data[ScriptReadByte(ctx)]; - u8 value2 = ctx->data[ScriptReadByte(ctx)]; - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_comparebuffertobyte(struct ScriptContext *ctx) -{ - u8 value1 = ctx->data[ScriptReadByte(ctx)]; - u8 value2 = ScriptReadByte(ctx); - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_comparebuffertoptrbyte(struct ScriptContext *ctx) -{ - u8 value1 = ctx->data[ScriptReadByte(ctx)]; - u8 value2 = *(u8 *)ScriptReadWord(ctx); - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_compareptrbytetobuffer(struct ScriptContext *ctx) -{ - u8 value1 = *(u8 *)ScriptReadWord(ctx); - u8 value2 = ctx->data[ScriptReadByte(ctx)]; - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_compareptrbytetobyte(struct ScriptContext *ctx) -{ - u8 value1 = *(u8 *)ScriptReadWord(ctx); - u8 value2 = ScriptReadByte(ctx); - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_compareptrbytes(struct ScriptContext *ctx) -{ - u8 value1 = *(u8 *)ScriptReadWord(ctx); - u8 value2 = *(u8 *)ScriptReadWord(ctx); - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_compare(struct ScriptContext *ctx) -{ - u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx)); - u16 value2 = ScriptReadHalfword(ctx); - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_comparevars(struct ScriptContext *ctx) -{ - u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); - u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); - ctx->comparisonResult = compare_012(*ptr1, *ptr2); - return FALSE; -} - -bool8 ScrCmd_addvar(struct ScriptContext *ctx) -{ - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr += ScriptReadHalfword(ctx); - return FALSE; -} - -bool8 ScrCmd_subvar(struct ScriptContext *ctx) -{ - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr -= VarGet(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_random(struct ScriptContext *ctx) -{ - u16 max = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = Random() % max; - return FALSE; -} - -bool8 ScrCmd_additem(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - u32 quantity = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = AddBagItem(itemId, (u8)quantity); - return FALSE; -} - -bool8 ScrCmd_removeitem(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - u32 quantity = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = RemoveBagItem(itemId, (u8)quantity); - return FALSE; -} - -bool8 ScrCmd_checkitemspace(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - u32 quantity = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = CheckBagHasSpace(itemId, (u8)quantity); - return FALSE; -} - -bool8 ScrCmd_checkitem(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - u32 quantity = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = CheckBagHasItem(itemId, (u8)quantity); - return FALSE; -} - -bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = GetPocketByItemId(itemId); - return FALSE; -} - -bool8 ScrCmd_addpcitem(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - u16 quantity = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = AddPCItem(itemId, quantity); - return FALSE; -} - -bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - u16 quantity = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = CheckPCHasItem(itemId, quantity); - return FALSE; -} - -bool8 ScrCmd_adddecor(struct ScriptContext *ctx) -{ - u32 decorId = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = IsThereStorageSpaceForDecoration(decorId); - return FALSE; -} - -bool8 ScrCmd_removedecor(struct ScriptContext *ctx) -{ - u32 decorId = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = sub_81340A8(decorId); - return FALSE; -} - -bool8 ScrCmd_checkdecor(struct ScriptContext *ctx) -{ - u32 decorId = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = sub_8134074(decorId); - return FALSE; -} - -bool8 ScrCmd_testdecor(struct ScriptContext *ctx) -{ - u32 decorId = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = sub_8133FE4(decorId); - return FALSE; -} - -bool8 ScrCmd_setflag(struct ScriptContext *ctx) -{ - FlagSet(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_clearflag(struct ScriptContext *ctx) -{ - FlagReset(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_checkflag(struct ScriptContext *ctx) -{ - ctx->comparisonResult = FlagGet(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_inccounter(struct ScriptContext *ctx) -{ - IncrementGameStat(ScriptReadByte(ctx)); - return FALSE; -} - -bool8 ScrCmd_lighten(struct ScriptContext *ctx) -{ - sub_8081594(ScriptReadByte(ctx)); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_darken(struct ScriptContext *ctx) -{ - u16 value = VarGet(ScriptReadHalfword(ctx)); - sub_8053CE4(value); - return FALSE; -} - -bool8 IsPaletteNotActive(void) -{ - if (!gPaletteFade.active) - return TRUE; - else - return FALSE; -} - -bool8 ScrCmd_fadescreen(struct ScriptContext *ctx) -{ - fade_screen(ScriptReadByte(ctx), 0); - SetupNativeScript(ctx, IsPaletteNotActive); - return TRUE; -} - -bool8 ScrCmd_fadescreendelay(struct ScriptContext *ctx) -{ - u8 duration = ScriptReadByte(ctx); - u8 delay = ScriptReadByte(ctx); - fade_screen(duration, delay); - SetupNativeScript(ctx, IsPaletteNotActive); - return TRUE; -} - -bool8 s28_pause_asm() -{ - gUnknown_0202E8B4--; - - if (gUnknown_0202E8B4 == 0) - return TRUE; - else - return FALSE; -} - -bool8 ScrCmd_pause(struct ScriptContext *ctx) -{ - gUnknown_0202E8B4 = ScriptReadHalfword(ctx); - SetupNativeScript(ctx, s28_pause_asm); - return TRUE; -} - -bool8 ScrCmd_compareflags(struct ScriptContext *ctx) -{ - u8 hour = VarGet(ScriptReadHalfword(ctx)); - u8 minute = VarGet(ScriptReadHalfword(ctx)); - RtcInitLocalTimeOffset(hour, minute); - return FALSE; -} - -bool8 ScrCmd_checkdailyflags(struct ScriptContext *ctx) -{ - DoTimeBasedEvents(); - return FALSE; -} - -bool8 ScrCmd_resetvars(struct ScriptContext *ctx) -{ - RtcCalcLocalTime(); - gSpecialVar_0x8000 = gLocalTime.hours; - gSpecialVar_0x8001 = gLocalTime.minutes; - gSpecialVar_0x8002 = gLocalTime.seconds; - return FALSE; -} - -bool8 ScrCmd_setweather(struct ScriptContext *ctx) -{ - u16 value = VarGet(ScriptReadHalfword(ctx)); - SetSav1Weather(value); - return FALSE; -} - -bool8 ScrCmd_resetweather(struct ScriptContext *ctx) -{ - sub_80806E4(); - return FALSE; -} - -bool8 ScrCmd_doweather(struct ScriptContext *ctx) -{ - DoCurrentWeather(); - return FALSE; -} - -bool8 ScrCmd_tileeffect(struct ScriptContext *ctx) -{ - ActivatePerStepCallback(ScriptReadByte(ctx)); - return FALSE; -} - -bool8 ScrCmd_setmapfooter(struct ScriptContext *ctx) -{ - u16 value = VarGet(ScriptReadHalfword(ctx)); - sub_8053D14(value); - return FALSE; -} - -bool8 ScrCmd_warp(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); - sub_8080E88(); - player_avatar_init_params_reset(); - return TRUE; -} - -bool8 ScrCmd_warpmuted(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); - sp13E_warp_to_last_warp(); - player_avatar_init_params_reset(); - return TRUE; -} - -bool8 ScrCmd_warpwalk(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); - sub_8080EF0(); - player_avatar_init_params_reset(); - return TRUE; -} - -bool8 ScrCmd_warphole(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u16 x; - u16 y; - - PlayerGetDestCoords(&x, &y); - - if (v1 == 0xFF && v2 == 0xFF) - sub_8053720(x - 7, y - 7); - else - warp1_set(v1, v2, -1, x - 7, y - 7); - - sp13F_fall_to_last_warp(); - player_avatar_init_params_reset(); - return TRUE; -} - -bool8 ScrCmd_warpteleport(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); - sub_8080F68(); - player_avatar_init_params_reset(); - return TRUE; -} - -bool8 ScrCmd_warp3(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); - return FALSE; -} - -bool8 ScrCmd_warpplace(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - saved_warp2_set_2(0, v1, v2, v3, v4, v5); - return FALSE; -} - -bool8 ScrCmd_warp4(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - sub_8053690(v1, v2, v3, v4, v5); - return FALSE; -} - -bool8 ScrCmd_warp5(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - sub_80536E4(v1, v2, v3, v4, v5); - return FALSE; -} - -bool8 ScrCmd_warp6(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - sub_805363C(v1, v2, v3, v4, v5); - return FALSE; -} - -bool8 ScrCmd_getplayerxy(struct ScriptContext *ctx) -{ - u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); - u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr1 = gSaveBlock1.pos.x; - *ptr2 = gSaveBlock1.pos.y; - return FALSE; -} - -bool8 ScrCmd_countpokemon(struct ScriptContext *ctx) -{ - gScriptResult = CalculatePlayerPartyCount(); - return FALSE; -} - -bool8 ScrCmd_playsfx(struct ScriptContext *ctx) -{ - PlaySE(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 s30_music_check_asm() -{ - if (!IsSEPlaying()) - return TRUE; - else - return FALSE; -} - -bool8 ScrCmd_checksound(struct ScriptContext *ctx) -{ - SetupNativeScript(ctx, s30_music_check_asm); - return TRUE; -} - -bool8 ScrCmd_fanfare(struct ScriptContext *ctx) -{ - PlayFanfare(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 s32_fanfare_wait_asm() -{ - return IsFanfareTaskInactive(); -} - -bool8 ScrCmd_waitfanfare(struct ScriptContext *ctx) -{ - SetupNativeScript(ctx, s32_fanfare_wait_asm); - return TRUE; -} - -bool8 ScrCmd_playmusic(struct ScriptContext *ctx) -{ - u16 songId = ScriptReadHalfword(ctx); - bool8 val = ScriptReadByte(ctx); - if (val == TRUE) - sav1_set_battle_music_maybe(songId); - PlayNewMapMusic(songId); - return FALSE; -} - -bool8 ScrCmd_playmusicbattle(struct ScriptContext *ctx) -{ - sav1_set_battle_music_maybe(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_fadedefault(struct ScriptContext *ctx) -{ - sub_8053F84(); - return FALSE; -} - -bool8 ScrCmd_fademusic(struct ScriptContext *ctx) -{ - sub_8053FB0(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_fadeout(struct ScriptContext *ctx) -{ - u8 val = ScriptReadByte(ctx); - if (val) - FadeOutBGMTemporarily(4 * val); - else - FadeOutBGMTemporarily(4); - SetupNativeScript(ctx, IsBGMPausedOrStopped); - return TRUE; -} - -bool8 ScrCmd_fadein(struct ScriptContext *ctx) -{ - u8 val = ScriptReadByte(ctx); - if (val) - FadeInBGM(4 * val); - else - FadeInBGM(4); - return FALSE; -} - -bool8 ScrCmd_move(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - void *v2 = (void *)ScriptReadWord(ctx); - exec_movement(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, v2); - gUnknown_0202E8B6 = v1; - return FALSE; -} - -bool8 ScrCmd_movecoords(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - void *v2 = (void *)ScriptReadWord(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 v4 = ScriptReadByte(ctx); - exec_movement(v1, v4, v3, v2); - gUnknown_0202E8B6 = v1; - return FALSE; -} - -bool8 s51a_0806B288(void) -{ - return sub_80A212C(gUnknown_0202E8B6, gUnknown_0202E8BA, gUnknown_0202E8B8); -} - -bool8 ScrCmd_waitmove(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - if (v1) - gUnknown_0202E8B6 = v1; - gUnknown_0202E8B8 = gSaveBlock1.location.mapGroup; - gUnknown_0202E8BA = gSaveBlock1.location.mapNum; - SetupNativeScript(ctx, s51a_0806B288); - return TRUE; -} - -bool8 ScrCmd_waitmovexy(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2; - u8 v3; - - if (v1) - gUnknown_0202E8B6 = v1; - - v2 = ScriptReadByte(ctx); - v3 = ScriptReadByte(ctx); - gUnknown_0202E8B8 = v2; - gUnknown_0202E8BA = v3; - SetupNativeScript(ctx, s51a_0806B288); - return TRUE; -} - -bool8 ScrCmd_disappear(struct ScriptContext *ctx) -{ - u16 objectId = VarGet(ScriptReadHalfword(ctx)); - RemoveFieldObjectByLocalIdAndMap(objectId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - return FALSE; -} - -bool8 ScrCmd_disappearxy(struct ScriptContext *ctx) -{ - u16 objectId = VarGet(ScriptReadHalfword(ctx)); - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - RemoveFieldObjectByLocalIdAndMap(objectId, mapNum, mapGroup); - return FALSE; -} - -bool8 ScrCmd_reappear(struct ScriptContext *ctx) -{ - u16 objectId = VarGet(ScriptReadHalfword(ctx)); - show_sprite(objectId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - return FALSE; -} - -bool8 ScrCmd_reappearxy(struct ScriptContext *ctx) -{ - u16 objectId = VarGet(ScriptReadHalfword(ctx)); - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - show_sprite(objectId, mapNum, mapGroup); - return FALSE; -} - -bool8 ScrCmd_movesprite(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u16 v2 = VarGet(ScriptReadHalfword(ctx)); - u32 v3 = VarGet(ScriptReadHalfword(ctx)); - sub_805C0F8(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, v2, v3); - return FALSE; -} - -bool8 ScrCmd_movespriteperm(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u16 v2 = VarGet(ScriptReadHalfword(ctx)); - u32 v3 = VarGet(ScriptReadHalfword(ctx)); - update_saveblock1_field_object_coords(v1, v2, v3); - return FALSE; -} - -bool8 ScrCmd_moveoffscreen(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - sub_805C78C(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - return FALSE; -} - -bool8 ScrCmd_spritevisible(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - npc_by_local_id_and_map_set_field_1_bit_x20(v1, v3, v2, 0); - return FALSE; -} - -bool8 ScrCmd_spriteinvisible(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - npc_by_local_id_and_map_set_field_1_bit_x20(v1, v3, v2, 1); - return FALSE; -} - -bool8 ScrCmd_spritelevelup(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 v4 = ScriptReadByte(ctx); - sub_805BCF0(v1, v3, v2, v4 + 83); - return FALSE; -} - -bool8 ScrCmd_restorespritelevel(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - sub_805BD48(v1, v3, v2); - return FALSE; -} - -bool8 ScrCmd_faceplayer(struct ScriptContext *ctx) -{ - if (gMapObjects[gSelectedMapObject].active) - { - FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], - player_get_direction_lower_nybble()); - } - return FALSE; -} - -bool8 ScrCmd_spriteface(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - FieldObjectTurnByLocalIdAndMap(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, v2); - return FALSE; -} - -bool8 ScrCmd_spritebehave(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - update_saveblock1_field_object_movement_behavior(v1, v2); - return FALSE; -} - -bool8 ScrCmd_createvsprite(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u16 v3 = VarGet(ScriptReadHalfword(ctx)); - u32 v4 = VarGet(ScriptReadHalfword(ctx)); - u8 v5 = ScriptReadByte(ctx); - u8 v6 = ScriptReadByte(ctx); - sub_805B410(v1, v2, v3, v4, v5, v6); - return FALSE; -} - -bool8 ScrCmd_vspriteface(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - sub_8064990(v1, v2); - return FALSE; -} - -bool8 ScrCmd_lockall(struct ScriptContext *ctx) -{ - if (is_c1_link_related_active()) - { - return FALSE; - } - else - { - ScriptFreezeMapObjects(); - SetupNativeScript(ctx, sub_8064CFC); - return TRUE; - } -} - -bool8 ScrCmd_lock(struct ScriptContext *ctx) -{ - if (is_c1_link_related_active()) - { - return FALSE; - } - else - { - if (gMapObjects[gSelectedMapObject].active) - { - sub_8064DD8(); - SetupNativeScript(ctx, sub_8064DB4); - } - else - { - ScriptFreezeMapObjects(); - SetupNativeScript(ctx, sub_8064CFC); - } - - return TRUE; - } -} - -bool8 ScrCmd_releaseall(struct ScriptContext *ctx) -{ - u8 objectId; - - HideFieldMessageBox(); - objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); - sub_80A2178(); - UnfreezeMapObjects(); - return FALSE; -} - -bool8 ScrCmd_release(struct ScriptContext *ctx) -{ - u8 objectId; - - HideFieldMessageBox(); - if (gMapObjects[gSelectedMapObject].active) - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]); - objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); - sub_80A2178(); - UnfreezeMapObjects(); - return FALSE; -} - -bool8 ScrCmd_message(struct ScriptContext *ctx) -{ - u8 *msg = (u8 *)ScriptReadWord(ctx); - if (!msg) - msg = (u8 *)ctx->data[0]; - ShowFieldMessage(msg); - return FALSE; -} - -bool8 ScrCmd_message2(struct ScriptContext *ctx) -{ - u8 *msg = (u8 *)ScriptReadWord(ctx); - if (!msg) - msg = (u8 *)ctx->data[0]; - ShowFieldAutoScrollMessage(msg); - return FALSE; -} - -bool8 ScrCmd_waittext(struct ScriptContext *ctx) -{ - SetupNativeScript(ctx, IsFieldMessageBoxHidden); - return TRUE; -} - -bool8 ScrCmd_closebutton(struct ScriptContext *ctx) -{ - HideFieldMessageBox(); - return FALSE; -} - -bool8 WaitForAorBPress(void) -{ - if (gMain.newKeys & A_BUTTON) - return TRUE; - if (gMain.newKeys & B_BUTTON) - return TRUE; - return FALSE; -} - -bool8 ScrCmd_waitbutton(struct ScriptContext *ctx) -{ - SetupNativeScript(ctx, WaitForAorBPress); - return TRUE; -} - -bool8 ScrCmd_yesnobox(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - if (yes_no_box(v1, v2) == 1) - { - ScriptContext1_Stop(); - return TRUE; - } - else - { - return FALSE; - } -} - -bool8 ScrCmd_multichoice(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 v4 = ScriptReadByte(ctx); - if (sub_80B5054(v1, v2, v3, v4) == 1) - { - ScriptContext1_Stop(); - return TRUE; - } - else - { - return FALSE; - } -} - -bool8 ScrCmd_multichoicedef(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 v4 = ScriptReadByte(ctx); - u8 v5 = ScriptReadByte(ctx); - if (sub_80B50B0(v1, v2, v3, v5, v4) == 1) - { - ScriptContext1_Stop(); - return TRUE; - } - else - { - return FALSE; - } -} - -bool8 ScrCmd_showbox(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 v4 = ScriptReadByte(ctx); - MenuDrawTextWindow(v1, v2, v3, v4); - return FALSE; -} - -bool8 ScrCmd_multichoicerow(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 v4 = ScriptReadByte(ctx); - u8 v5 = ScriptReadByte(ctx); - if (sub_80B5578(v1, v2, v3, v5, v4) == 1) - { - ScriptContext1_Stop(); - return TRUE; - } - else - { - return FALSE; - } -} - -bool8 ScrCmd_hidebox(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 v4 = ScriptReadByte(ctx); - MenuZeroFillWindowRect(v1, v2, v3, v4); - return FALSE; -} - -bool8 ScrCmd_clearbox(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 v4 = ScriptReadByte(ctx); - if (Multichoice(v1, v2, v3, v4) == 1) - { - ScriptContext1_Stop(); - return TRUE; - } - else - { - return FALSE; - } -} - -bool8 ScrCmd_showpokepic(struct ScriptContext *ctx) -{ - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - sub_80B58C4(v1, v2, v3); - return FALSE; -} - -bool8 ScrCmd_hidepokepic(struct ScriptContext *ctx) -{ - void *func = picbox_close(); - if (!func) - return FALSE; - - SetupNativeScript(ctx, func); - return TRUE; -} - -bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - if (v1) - sub_8106630(v1); - ShowContestWinner(); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_braillemsg(struct ScriptContext *ctx) -{ - u8 *ptr = (u8 *)ScriptReadWord(ctx); - u8 v2 = ptr[0]; - u8 v3 = ptr[1]; - u8 v4 = ptr[2]; - u8 v5 = ptr[3]; - u8 v6 = ptr[4]; - u8 v7 = ptr[5]; - StringBraille(gStringVar4, ptr + 6); - MenuDrawTextWindow(v2, v3, v4, v5); - MenuPrint(gStringVar4, v6, v7); - return FALSE; -} - -bool8 ScrCmd_vtext(struct ScriptContext *ctx) -{ - u32 v1 = ScriptReadWord(ctx); - ShowFieldMessage((u8 *)(v1 - gUnknown_0202E8B0)); - return FALSE; -} - -bool8 ScrCmd_bufferpoke(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 species = VarGet(ScriptReadHalfword(ctx)); - StringCopy(sScriptStringVars[stringVarIndex], gSpeciesNames[species]); - return FALSE; -} - -bool8 ScrCmd_bufferfirstpoke(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u8 *dest = sScriptStringVars[stringVarIndex]; - u8 partyIndex = GetLeadMonIndex(); - u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); - StringCopy(dest, gSpeciesNames[species]); - return FALSE; -} - -bool8 ScrCmd_bufferpartypoke(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); - GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, sScriptStringVars[stringVarIndex]); - StringGetEnd10(sScriptStringVars[stringVarIndex]); - return FALSE; -} - -bool8 ScrCmd_bufferitem(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - CopyItemName(itemId, sScriptStringVars[stringVarIndex]); - return FALSE; -} - -bool8 ScrCmd_bufferdecor(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 decorId = VarGet(ScriptReadHalfword(ctx)); - StringCopy(sScriptStringVars[stringVarIndex], gDecorations[decorId].name); - return FALSE; -} - -bool8 ScrCmd_bufferattack(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 moveId = VarGet(ScriptReadHalfword(ctx)); - StringCopy(sScriptStringVars[stringVarIndex], gMoveNames[moveId]); - return FALSE; -} - -bool8 ScrCmd_buffernum(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = sub_80BF0B8(v1); - ConvertIntToDecimalStringN(sScriptStringVars[stringVarIndex], v1, 0, v2); - return FALSE; -} - -bool8 ScrCmd_bufferstd(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 index = VarGet(ScriptReadHalfword(ctx)); - StringCopy(sScriptStringVars[stringVarIndex], gUnknown_083CE048[index]); - return FALSE; -} - -bool8 ScrCmd_buffertext(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u8 *text = (u8 *)ScriptReadWord(ctx); - StringCopy(sScriptStringVars[stringVarIndex], text); - return FALSE; -} - -bool8 ScrCmd_vloadptr(struct ScriptContext *ctx) -{ - u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); - StringExpandPlaceholders(gStringVar4, ptr); - return FALSE; -} - -bool8 ScrCmd_vbuffer(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u32 addr = ScriptReadWord(ctx); - u8 *src = (u8 *)(addr - gUnknown_0202E8B0); - u8 *dest = sScriptStringVars[stringVarIndex]; - StringCopy(dest, src); - return FALSE; -} - -bool8 ScrCmd_givepokemon(struct ScriptContext *ctx) -{ - u16 v3 = VarGet(ScriptReadHalfword(ctx)); - u8 v5 = ScriptReadByte(ctx); - u16 v7 = VarGet(ScriptReadHalfword(ctx)); - u32 v8 = ScriptReadWord(ctx); - u32 v9 = ScriptReadWord(ctx); - u8 v10 = ScriptReadByte(ctx); - gScriptResult = ScriptGiveMon(v3, v5, v7, v8, v9, v10); - return FALSE; -} - -bool8 ScrCmd_giveegg(struct ScriptContext *ctx) -{ - u16 value = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = ScriptGiveEgg(value); - return FALSE; -} - -bool8 ScrCmd_setpokemove(struct ScriptContext *ctx) -{ - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = ScriptReadHalfword(ctx); - ScriptSetMonMoveSlot(v2, v4, v3); - return FALSE; -} - -bool8 ScrCmd_checkattack(struct ScriptContext *ctx) -{ - u8 i; - u16 moveId = ScriptReadHalfword(ctx); - gScriptResult = 6; - for (i = 0; i < 6; i++) - { - u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL); - if (!species) - break; - // UB: GetMonData() arguments don't match function definition - if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && pokemon_has_move(&gPlayerParty[i], moveId) == TRUE) - { - gScriptResult = i; - gSpecialVar_0x8004 = species; - break; - } - } - return FALSE; -} - -bool8 ScrCmd_givemoney(struct ScriptContext *ctx) -{ - u32 amount = ScriptReadWord(ctx); - u8 ignore = ScriptReadByte(ctx); - if (!ignore) - sub_80B79B8(&gSaveBlock1.money, amount); - return FALSE; -} - -bool8 ScrCmd_paymoney(struct ScriptContext *ctx) -{ - u32 amount = ScriptReadWord(ctx); - u8 ignore = ScriptReadByte(ctx); - if (!ignore) - sub_80B79E0(&gSaveBlock1.money, amount); - return FALSE; -} - -bool8 ScrCmd_checkmoney(struct ScriptContext *ctx) -{ - u32 amount = ScriptReadWord(ctx); - u8 ignore = ScriptReadByte(ctx); - if (!ignore) - gScriptResult = IsEnoughMoney(gSaveBlock1.money, amount); - return FALSE; -} - -bool8 ScrCmd_showmoney(struct ScriptContext *ctx) -{ - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 ignore = ScriptReadByte(ctx); - if (!ignore) - sub_80B7C14(gSaveBlock1.money, v2, v3); - return FALSE; -} - -bool8 ScrCmd_hidemoney(struct ScriptContext *ctx) -{ - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - RemoveMoneyLabelObject(v2, v3); - return FALSE; -} - -bool8 ScrCmd_updatemoney(struct ScriptContext *ctx) -{ - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 ignore = ScriptReadByte(ctx); - if (!ignore) - sub_80B7BEC(gSaveBlock1.money, v2, v3); - return FALSE; -} - -bool8 ScrCmd_showcoins(struct ScriptContext *ctx) -{ - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - ShowCoinsWindow(gSaveBlock1.coins, v2, v3); - return FALSE; -} - -bool8 ScrCmd_hidecoins(struct ScriptContext *ctx) -{ - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - HideCoinsWindow(v2, v3); - return FALSE; -} - -bool8 ScrCmd_updatecoins(struct ScriptContext *ctx) -{ - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - UpdateCoinsWindow(gSaveBlock1.coins, v2, v3); - return FALSE; -} - -bool8 ScrCmd_trainerbattle(struct ScriptContext *ctx) -{ - ctx->scriptPtr = TrainerBattleConfigure(ctx->scriptPtr); - return FALSE; -} - -bool8 ScrCmd_reptrainerbattle(struct ScriptContext *ctx) -{ - sub_80825E4(); - return TRUE; -} - -bool8 ScrCmd_endtrainerbattle(struct ScriptContext *ctx) -{ - ctx->scriptPtr = sub_80826E8(); - return FALSE; -} - -bool8 ScrCmd_endtrainerbattle2(struct ScriptContext *ctx) -{ - ctx->scriptPtr = sub_8082700(); - return FALSE; -} - -bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx) -{ - u16 index = VarGet(ScriptReadHalfword(ctx)); - ctx->comparisonResult = trainer_flag_check(index); - return FALSE; -} - -bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) -{ - u16 index = VarGet(ScriptReadHalfword(ctx)); - trainer_flag_set(index); - return FALSE; -} - -bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx) -{ - u16 index = VarGet(ScriptReadHalfword(ctx)); - trainer_flag_clear(index); - return FALSE; -} - -bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx) -{ - u16 v2 = ScriptReadHalfword(ctx); - u8 v4 = ScriptReadByte(ctx); - u16 v5 = ScriptReadHalfword(ctx); - ScriptWildBattle(v2, v4, v5); - return FALSE; -} - -bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx) -{ - StartBattle_ScriptedWild(); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_pokemart(struct ScriptContext *ctx) -{ - void *ptr = (void *)ScriptReadWord(ctx); - CreatePokemartMenu(ptr); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_pokemartdecor(struct ScriptContext *ctx) -{ - void *ptr = (void *)ScriptReadWord(ctx); - CreateDecorationShop1Menu(ptr); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_pokemartbp(struct ScriptContext *ctx) -{ - void *ptr = (void *)ScriptReadWord(ctx); - CreateDecorationShop2Menu(ptr); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_pokecasino(struct ScriptContext *ctx) -{ - u8 v2 = VarGet(ScriptReadHalfword(ctx)); - PlaySlotMachine(v2, c2_exit_to_overworld_1_continue_scripts_restart_music); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_event_8a(struct ScriptContext *ctx) -{ - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 v4 = ScriptReadByte(ctx); - if (!v3) - PlantBerryTree(v2, 0, v4, FALSE); - else - PlantBerryTree(v2, v3, v4, FALSE); - return FALSE; -} - -bool8 ScrCmd_event_96(struct ScriptContext *ctx) -{ - u16 value = VarGet(ScriptReadHalfword(ctx)); - gScriptResult = GetPriceReduction(value); - return FALSE; -} - -bool8 ScrCmd_choosecontestpkmn(struct ScriptContext *ctx) -{ - sub_80F99CC(); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_startcontest(struct ScriptContext *ctx) -{ - sub_80C48C8(); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_showcontestresults(struct ScriptContext *ctx) -{ - sub_80C4940(); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx) -{ - sub_80C4980(gScriptContestCategory); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_doanimation(struct ScriptContext *ctx) -{ - u16 effectId = VarGet(ScriptReadHalfword(ctx)); - gUnknown_0202E8BC = effectId; - FieldEffectStart(gUnknown_0202E8BC); - return FALSE; -} - -bool8 ScrCmd_setanimation(struct ScriptContext *ctx) -{ - u8 v2 = ScriptReadByte(ctx); - gUnknown_0202FF84[v2] = (s16)VarGet(ScriptReadHalfword(ctx)); - return FALSE; -} - -static bool8 sub_8067B48() -{ - if (!FieldEffectActiveListContains(gUnknown_0202E8BC)) - return TRUE; - else - return FALSE; -} - -bool8 ScrCmd_checkanimation(struct ScriptContext *ctx) -{ - gUnknown_0202E8BC = VarGet(ScriptReadHalfword(ctx)); - SetupNativeScript(ctx, sub_8067B48); - return TRUE; -} - -bool8 ScrCmd_sethealplace(struct ScriptContext *ctx) -{ - u16 v2 = VarGet(ScriptReadHalfword(ctx)); - sub_8053588(v2); - return FALSE; -} - -bool8 ScrCmd_checkgender(struct ScriptContext *ctx) -{ - gScriptResult = gSaveBlock2.playerGender; - return FALSE; -} - -bool8 ScrCmd_pokecry(struct ScriptContext *ctx) -{ - u16 v3 = VarGet(ScriptReadHalfword(ctx)); - u16 v5 = VarGet(ScriptReadHalfword(ctx)); - PlayCry5(v3, v5); - return FALSE; -} - -bool8 ScrCmd_waitpokecry(struct ScriptContext *ctx) -{ - SetupNativeScript(ctx, IsCryFinished); - return TRUE; -} - -bool8 ScrCmd_setmaptile(struct ScriptContext *ctx) -{ - u16 v3 = VarGet(ScriptReadHalfword(ctx)); - u16 v5 = VarGet(ScriptReadHalfword(ctx)); - u16 v7 = VarGet(ScriptReadHalfword(ctx)); - u16 v8 = VarGet(ScriptReadHalfword(ctx)); - v3 += 7; - v5 += 7; - if (!v8) - MapGridSetMetatileIdAt(v3, v5, v7); - else - MapGridSetMetatileIdAt(v3, v5, v7 | 0xC00); - return FALSE; -} - -bool8 ScrCmd_setdooropened(struct ScriptContext *ctx) -{ - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - x += 7; - y += 7; - PlaySE(sub_8058790(x, y)); - FieldAnimateDoorOpen(x, y); - return FALSE; -} - -bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) -{ - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - x += 7; - y += 7; - FieldAnimateDoorClose(x, y); - return FALSE; -} - -static bool8 IsDoorAnimationStopped() -{ - if (!FieldIsDoorAnimationRunning()) - return TRUE; - else - return FALSE; -} - -bool8 ScrCmd_doorchange(struct ScriptContext *ctx) -{ - SetupNativeScript(ctx, IsDoorAnimationStopped); - return TRUE; -} - -bool8 ScrCmd_setdooropened2(struct ScriptContext *ctx) -{ - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - x += 7; - y += 7; - FieldSetDoorOpened(x, y); - return FALSE; -} - -bool8 ScrCmd_setdoorclosed2(struct ScriptContext *ctx) -{ - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - x += 7; - y += 7; - FieldSetDoorClosed(x, y); - return FALSE; -} - -bool8 ScrCmd_event_b1(struct ScriptContext *ctx) -{ - u8 v3 = ScriptReadByte(ctx); - u16 v5 = VarGet(ScriptReadHalfword(ctx)); - u16 v7 = VarGet(ScriptReadHalfword(ctx)); - u16 v9 = VarGet(ScriptReadHalfword(ctx)); - ScriptAddElevatorMenuItem(v3, v5, v7, v9); - return FALSE; -} - -bool8 ScrCmd_event_b2(struct ScriptContext *ctx) -{ - ScriptShowElevatorMenu(); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_checkcoins(struct ScriptContext *ctx) -{ - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr = GetCoins(); - return FALSE; -} - -bool8 ScrCmd_givecoins(struct ScriptContext *ctx) -{ - u16 coins = VarGet(ScriptReadHalfword(ctx)); - if (GiveCoins(coins) == TRUE) - gScriptResult = 0; - else - gScriptResult = 1; - - return FALSE; -} - -bool8 ScrCmd_removecoins(struct ScriptContext *ctx) -{ - u16 coins = VarGet(ScriptReadHalfword(ctx)); - if (TakeCoins(coins) == TRUE) - gScriptResult = 0; - else - gScriptResult = 1; - - return FALSE; -} diff --git a/src/script.c b/src/script.c deleted file mode 100644 index 8f12da437..000000000 --- a/src/script.c +++ /dev/null @@ -1,368 +0,0 @@ -#include "global.h" -#include "script.h" -#include "event_data.h" - -#define RAM_SCRIPT_MAGIC 51 - -EWRAM_DATA u8 *gUnknown_0202E8AC = NULL; - -static u8 sScriptContext1Status; -static struct ScriptContext sScriptContext1; -static struct ScriptContext sScriptContext2; -static bool8 sScriptContext2Enabled; - -extern ScrCmdFunc gScriptCmdTable[]; -extern ScrCmdFunc gScriptCmdTableEnd[]; -extern void *gNullScriptPtr; - -void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd) -{ - s32 i; - - ctx->mode = 0; - ctx->scriptPtr = 0; - ctx->stackDepth = 0; - ctx->nativePtr = 0; - ctx->cmdTable = cmdTable; - ctx->cmdTableEnd = cmdTableEnd; - - for (i = 0; i < 4; i++) - ctx->data[i] = 0; - - for (i = 0; i < 20; i++) - ctx->stack[i] = 0; -} - -u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr) -{ - ctx->scriptPtr = ptr; - ctx->mode = 1; - return 1; -} - -void SetupNativeScript(struct ScriptContext *ctx, void *ptr) -{ - ctx->mode = 2; - ctx->nativePtr = ptr; -} - -void StopScript(struct ScriptContext *ctx) -{ - ctx->mode = 0; - ctx->scriptPtr = 0; -} - -u8 RunScriptCommand(struct ScriptContext *ctx) -{ - if (ctx->mode == 0) - return 0; - - switch (ctx->mode) - { - case 0: - return 0; - case 2: - if (ctx->nativePtr) - { - if (ctx->nativePtr() == 1) - ctx->mode = 1; - return 1; - } - ctx->mode = 1; - case 1: - while (1) - { - u8 cmdCode; - ScrCmdFunc *func; - - if (!ctx->scriptPtr) - { - ctx->mode = 0; - return 0; - } - - if (ctx->scriptPtr == gNullScriptPtr) - { - while (1) - asm("svc 2"); // HALT - } - - cmdCode = *(ctx->scriptPtr); - ctx->scriptPtr++; - func = &ctx->cmdTable[cmdCode]; - - if (func >= ctx->cmdTableEnd) - { - ctx->mode = 0; - return 0; - } - - if ((*func)(ctx) == 1) - return 1; - } - } - - return 1; -} - -u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr) -{ - if (ctx->stackDepth + 1 >= 20) - { - return 1; - } - else - { - ctx->stack[ctx->stackDepth] = ptr; - ctx->stackDepth++; - return 0; - } -} - -const u8 *ScriptPop(struct ScriptContext *ctx) -{ - if (ctx->stackDepth == 0) - return NULL; - - ctx->stackDepth--; - return ctx->stack[ctx->stackDepth]; -} - -void ScriptJump(struct ScriptContext *ctx, u8 *ptr) -{ - ctx->scriptPtr = ptr; -} - -void ScriptCall(struct ScriptContext *ctx, u8 *ptr) -{ - ScriptPush(ctx, ctx->scriptPtr); - ctx->scriptPtr = ptr; -} - -void ScriptReturn(struct ScriptContext *ctx) -{ - ctx->scriptPtr = ScriptPop(ctx); -} - -u16 ScriptReadHalfword(struct ScriptContext *ctx) -{ - u16 value = *(ctx->scriptPtr++); - value |= *(ctx->scriptPtr++) << 8; - return value; -} - -u32 ScriptReadWord(struct ScriptContext *ctx) -{ - u32 value0 = *(ctx->scriptPtr++); - u32 value1 = *(ctx->scriptPtr++); - u32 value2 = *(ctx->scriptPtr++); - u32 value3 = *(ctx->scriptPtr++); - return (((((value3 << 8) + value2) << 8) + value1) << 8) + value0; -} - -void ScriptContext2_Enable(void) -{ - sScriptContext2Enabled = TRUE; -} - -void ScriptContext2_Disable(void) -{ - sScriptContext2Enabled = FALSE; -} - -bool8 ScriptContext2_IsEnabled(void) -{ - return sScriptContext2Enabled; -} - -void ScriptContext1_Init(void) -{ - InitScriptContext(&sScriptContext1, gScriptCmdTable, gScriptCmdTableEnd); - sScriptContext1Status = 2; -} - -bool8 ScriptContext2_RunScript(void) -{ - if (sScriptContext1Status == 2) - return 0; - - if (sScriptContext1Status == 1) - return 0; - - ScriptContext2_Enable(); - - if (!RunScriptCommand(&sScriptContext1)) - { - sScriptContext1Status = 2; - ScriptContext2_Disable(); - return 0; - } - - return 1; -} - -void ScriptContext1_SetupScript(const u8 *ptr) -{ - InitScriptContext(&sScriptContext1, gScriptCmdTable, gScriptCmdTableEnd); - SetupBytecodeScript(&sScriptContext1, ptr); - ScriptContext2_Enable(); - sScriptContext1Status = 0; -} - -void ScriptContext1_Stop(void) -{ - sScriptContext1Status = 1; -} - -void EnableBothScriptContexts() -{ - sScriptContext1Status = 0; - ScriptContext2_Enable(); -} - -void ScriptContext2_RunNewScript(const u8 *ptr) -{ - InitScriptContext(&sScriptContext2, &gScriptCmdTable, &gScriptCmdTableEnd); - SetupBytecodeScript(&sScriptContext2, ptr); - while (RunScriptCommand(&sScriptContext2) == 1) - ; -} - -u8 *mapheader_get_tagged_pointer(u8 tag) -{ - u8 *mapScripts = gMapHeader.mapScripts; - - if (!mapScripts) - return NULL; - - while (1) - { - if (!*mapScripts) - return NULL; - if (*mapScripts == tag) - { - mapScripts++; - return (u8 *)(mapScripts[0] + (mapScripts[1] << 8) + (mapScripts[2] << 16) + (mapScripts[3] << 24)); - } - mapScripts += 5; - } -} - -void mapheader_run_script_by_tag(u8 tag) -{ - u8 *ptr = mapheader_get_tagged_pointer(tag); - if (ptr) - ScriptContext2_RunNewScript(ptr); -} - -u8 *mapheader_get_first_match_from_tagged_ptr_list(u8 tag) -{ - u8 *ptr = mapheader_get_tagged_pointer(tag); - - if (!ptr) - return NULL; - - while (1) - { - u16 varIndex1; - u16 varIndex2; - varIndex1 = ptr[0] | (ptr[1] << 8); - if (!varIndex1) - return NULL; - ptr += 2; - varIndex2 = ptr[0] | (ptr[1] << 8); - ptr += 2; - if (VarGet(varIndex1) == VarGet(varIndex2)) - return (u8 *)(ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24)); - ptr += 4; - } -} - -void mapheader_run_script_with_tag_x1(void) -{ - mapheader_run_script_by_tag(1); -} - -void mapheader_run_script_with_tag_x3(void) -{ - mapheader_run_script_by_tag(3); -} - -void mapheader_run_script_with_tag_x5(void) -{ - mapheader_run_script_by_tag(5); -} - -void mapheader_run_script_with_tag_x6(void) -{ - mapheader_run_script_by_tag(6); -} - -bool8 mapheader_run_first_tag2_script_list_match(void) -{ - u8 *ptr = mapheader_get_first_match_from_tagged_ptr_list(2); - - if (!ptr) - return 0; - - ScriptContext1_SetupScript(ptr); - return 1; -} - -void mapheader_run_first_tag4_script_list_match(void) -{ - u8 *ptr = mapheader_get_first_match_from_tagged_ptr_list(4); - if (ptr) - ScriptContext2_RunNewScript(ptr); -} - -u32 CalculateRamScriptChecksum(void) -{ - u32 i; - u32 sum = 0; - for (i = 0; i < sizeof(struct RamScriptData); i++) - sum += ((u8 *)&gSaveBlock1.ramScript.data)[i]; - return sum; -} - -void ClearRamScript(void) -{ - CpuFill32(0, &gSaveBlock1.ramScript, sizeof(struct RamScript)); -} - -bool8 InitRamScript(u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 objectId) -{ - struct RamScriptData *scriptData = &gSaveBlock1.ramScript.data; - - ClearRamScript(); - - if (scriptSize > sizeof(scriptData->script)) - return FALSE; - - scriptData->magic = RAM_SCRIPT_MAGIC; - scriptData->mapGroup = mapGroup; - scriptData->mapNum = mapNum; - scriptData->objectId = objectId; - memcpy(scriptData->script, script, scriptSize); - gSaveBlock1.ramScript.checksum = CalculateRamScriptChecksum(); - return TRUE; -} - -u8 *GetRamScript(u8 objectId, u8 *script) -{ - struct RamScriptData *scriptData = &gSaveBlock1.ramScript.data; - gUnknown_0202E8AC = 0; - if (scriptData->magic == RAM_SCRIPT_MAGIC - && scriptData->mapGroup == gSaveBlock1.location.mapGroup - && scriptData->mapNum == gSaveBlock1.location.mapNum - && scriptData->objectId == objectId) - { - if (CalculateRamScriptChecksum() == gSaveBlock1.ramScript.checksum) - { - gUnknown_0202E8AC = script; - return scriptData->script; - } - ClearRamScript(); - } - return script; -} diff --git a/src/script_menu.c b/src/script_menu.c deleted file mode 100644 index f4ac55fb9..000000000 --- a/src/script_menu.c +++ /dev/null @@ -1,1134 +0,0 @@ -#include "global.h" -#include "script_menu.h" -#include "event_data.h" -#include "field_effect.h" -#include "menu.h" -#include "palette.h" -#include "script.h" -#include "sound.h" -#include "sprite.h" -#include "strings.h" -#include "task.h" - -// multichoice lists -const struct MenuAction MultichoiceList_00[] = -{ - {(u8 *)OtherText_Petalburg, 0}, - {(u8 *)OtherText_Slateport, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_02[] = -{ - {(u8 *)OtherText_Enter, 0}, - {(u8 *)OtherText_Info3, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_03[] = -{ - {(u8 *)OtherText_WhatsAContest, 0}, - {(u8 *)OtherText_TypesOfContest, 0}, - {(u8 *)OtherText_Ranks, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_04[] = -{ - {(u8 *)OtherText_CoolContest, 0}, - {(u8 *)OtherText_BeautyContest, 0}, - {(u8 *)OtherText_CuteContest, 0}, - {(u8 *)OtherText_SmartContest, 0}, - {(u8 *)OtherText_ToughContest, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_06[] = -{ - {(u8 *)OtherText_Decoration, 0}, - {(u8 *)OtherText_PackUp, 0}, - {(u8 *)OtherText_Registry, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_05[] = -{ - {(u8 *)OtherText_Decoration, 0}, - {(u8 *)OtherText_PackUp, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_07[] = -{ - {(u8 *)OtherText_Register, 0}, - {(u8 *)OtherText_Registry, 0}, - {(u8 *)OtherText_Information, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_12[] = -{ - {(u8 *)OtherText_Mach, 0}, - {(u8 *)OtherText_Acro, 0}, -}; - -const struct MenuAction MultichoiceList_13[] = -{ - {(u8 *)OtherText_Poison, 0}, - {(u8 *)OtherText_Paralysis, 0}, - {(u8 *)OtherText_Sleep, 0}, - {(u8 *)OtherText_Burn, 0}, - {(u8 *)OtherText_Frozen, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_14[] = -{ - {(u8 *)OtherText_Dewford, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_16[] = -{ - {(u8 *)OtherText_SawIt, 0}, - {(u8 *)OtherText_NotYet, 0}, -}; - -const struct MenuAction MultichoiceList_17[] = -{ - {(u8 *)OtherText_Yes, 0}, - {(u8 *)OtherText_No, 0}, - {(u8 *)OtherText_Info3, 0}, -}; - -const struct MenuAction MultichoiceList_18[] = -{ - {(u8 *)OtherText_SingleBattle, 0}, - {(u8 *)OtherText_DoubleBattle, 0}, - {(u8 *)OtherText_MultiBattle, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_19[] = -{ - {(u8 *)OtherText_Littleroot, 0}, - {(u8 *)OtherText_Slateport, 0}, - {(u8 *)OtherText_Lilycove, 0}, -}; - -const struct MenuAction MultichoiceList_20[] = -{ - {(u8 *)OtherText_Yes, 0}, - {(u8 *)OtherText_No, 0}, - {(u8 *)OtherText_Info3, 0}, -}; - -const struct MenuAction MultichoiceList_23[] = -{ - {(u8 *)OtherText_MakeAChallenge, 0}, - {(u8 *)OtherText_ObtainInformation, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_24[] = -{ - {(u8 *)OtherText_Lv50_2, 0}, - {(u8 *)OtherText_Lv100_2, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_25[] = -{ - {(u8 *)OtherText_Zigzagoon, 0}, - {(u8 *)OtherText_Nincada, 0}, - {(u8 *)OtherText_Poochyena, 0}, -}; - -const struct MenuAction MultichoiceList_26[] = -{ - {(u8 *)OtherText_Nincada2, 0}, - {(u8 *)OtherText_Lotad, 0}, - {(u8 *)OtherText_Roselia, 0}, -}; - -const struct MenuAction MultichoiceList_27[] = -{ - {(u8 *)OtherText_Shroomish, 0}, - {(u8 *)OtherText_Nincada3, 0}, - {(u8 *)OtherText_Surskit, 0}, -}; - -const struct MenuAction MultichoiceList_28[] = -{ - {(u8 *)OtherText_Treecko, 0}, - {(u8 *)OtherText_Torchic, 0}, - {(u8 *)OtherText_Mudkip, 0}, -}; - -const struct MenuAction MultichoiceList_29[] = -{ - {(u8 *)OtherText_Seedot, 0}, - {(u8 *)OtherText_Shroomish2, 0}, - {(u8 *)OtherText_Spinda, 0}, -}; - -const struct MenuAction MultichoiceList_30[] = -{ - {(u8 *)OtherText_Shroomish3, 0}, - {(u8 *)OtherText_Zigzagoon2, 0}, - {(u8 *)OtherText_Wurmple, 0}, -}; - -const struct MenuAction MultichoiceList_31[] = -{ - {(u8 *)OtherText_PokeBall, 0}, - {(u8 *)OtherText_SuperPotion, 0}, - {(u8 *)OtherText_SamePrice, 0}, -}; - -const struct MenuAction MultichoiceList_32[] = -{ - {(u8 *)OtherText_Yen135, 0}, - {(u8 *)OtherText_Yen155, 0}, - {(u8 *)OtherText_Yen175, 0}, -}; - -const struct MenuAction MultichoiceList_33[] = -{ - {(u8 *)OtherText_CostMore, 0}, - {(u8 *)OtherText_CostLess, 0}, - {(u8 *)OtherText_SamePrice2, 0}, -}; - -const struct MenuAction MultichoiceList_34[] = -{ - {(u8 *)OtherText_MaleSymbol, 0}, - {(u8 *)OtherText_FemaleSymbol, 0}, - {(u8 *)OtherText_Neither, 0}, -}; - -const struct MenuAction MultichoiceList_35[] = -{ - {(u8 *)OtherText_Males, 0}, - {(u8 *)OtherText_Females, 0}, - {(u8 *)OtherText_SameNumber, 0}, -}; - -const struct MenuAction MultichoiceList_36[] = -{ - {(u8 *)OtherText_Male, 0}, - {(u8 *)OtherText_Female, 0}, - {(u8 *)OtherText_ItDepends, 0}, -}; - -const struct MenuAction MultichoiceList_37[] = -{ - {(u8 *)OtherText_Six2, 0}, - {(u8 *)OtherText_Eight2, 0}, - {(u8 *)OtherText_Ten, 0}, -}; - -const struct MenuAction MultichoiceList_38[] = -{ - {(u8 *)OtherText_One, 0}, - {(u8 *)OtherText_Two, 0}, - {(u8 *)OtherText_Three, 0}, -}; - -const struct MenuAction MultichoiceList_39[] = -{ - {(u8 *)OtherText_Six, 0}, - {(u8 *)OtherText_Seven, 0}, - {(u8 *)OtherText_Eight, 0}, -}; - -const struct MenuAction MultichoiceList_42[] = -{ - {(u8 *)OtherText_FreshWater, 0}, - {(u8 *)OtherText_SodaPop, 0}, - {(u8 *)OtherText_Lemonade, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_43[] = -{ - {(u8 *)OtherText_HowToRide, 0}, - {(u8 *)OtherText_HowToTurn, 0}, - {(u8 *)OtherText_SandySlopes, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_44[] = -{ - {(u8 *)OtherText_Wheelies, 0}, - {(u8 *)OtherText_BunnyHops, 0}, - {(u8 *)OtherText_Jumping, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_45[] = -{ - {(u8 *)OtherText_Satisfied, 0}, - {(u8 *)OtherText_Dissatisfied, 0}, -}; - -const struct MenuAction MultichoiceList_46[] = -{ - {(u8 *)OtherText_Deepseatooth, 0}, - {(u8 *)OtherText_Deepseascale, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_47[] = -{ - {(u8 *)OtherText_BlueFlute2, 0}, - {(u8 *)OtherText_YellowFlute2, 0}, - {(u8 *)OtherText_RedFlute2, 0}, - {(u8 *)OtherText_WhiteFlute2, 0}, - {(u8 *)OtherText_BlackFlute2, 0}, - {(u8 *)OtherText_GlassChair, 0}, - {(u8 *)OtherText_GlassDesk, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_48[] = -{ - {(u8 *)OtherText_TreeckoDoll, 0}, - {(u8 *)OtherText_TorchicDoll, 0}, - {(u8 *)OtherText_MudkipDoll, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_55[] = -{ - {(u8 *)OtherText_TM32, 0}, - {(u8 *)OtherText_TM29, 0}, - {(u8 *)OtherText_TM35, 0}, - {(u8 *)OtherText_TM24, 0}, - {(u8 *)OtherText_TM13, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_49[] = -{ - {(u8 *)OtherText_50Coins, 0}, - {(u8 *)OtherText_500Coins, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_50[] = -{ - {(u8 *)OtherText_Excellent, 0}, - {(u8 *)OtherText_NotSoHot, 0}, -}; - -const struct MenuAction MultichoiceList_52[] = -{ - {(u8 *)OtherText_Lilycove, 0}, - {(u8 *)OtherText_BattleTower, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_53[] = -{ - {(u8 *)OtherText_Slateport, 0}, - {(u8 *)OtherText_Lilycove, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_54[] = -{ - {(u8 *)OtherText_Right, 0}, - {(u8 *)OtherText_Left, 0}, -}; - -const struct MenuAction MultichoiceList_56[] = -{ - {(u8 *)OtherText_Slateport, 0}, - {(u8 *)OtherText_BattleTower, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_57[] = -{ - {(u8 *)OtherText_1F_2, 0}, - {(u8 *)OtherText_2F_2, 0}, - {(u8 *)OtherText_3F_2, 0}, - {(u8 *)OtherText_4F_2, 0}, - {(u8 *)OtherText_5F_2, 0}, -}; - -const struct MenuAction MultichoiceList_58[] = -{ - {(u8 *)OtherText_RedShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_59[] = -{ - {(u8 *)OtherText_YellowShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_60[] = -{ - {(u8 *)OtherText_RedShard, 0}, - {(u8 *)OtherText_YellowShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_61[] = -{ - {(u8 *)OtherText_BlueShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_62[] = -{ - {(u8 *)OtherText_RedShard, 0}, - {(u8 *)OtherText_BlueShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_63[] = -{ - {(u8 *)OtherText_YellowShard, 0}, - {(u8 *)OtherText_BlueShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_64[] = -{ - {(u8 *)OtherText_RedShard, 0}, - {(u8 *)OtherText_YellowShard, 0}, - {(u8 *)OtherText_BlueShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_65[] = -{ - {(u8 *)OtherText_GreenShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_66[] = -{ - {(u8 *)OtherText_RedShard, 0}, - {(u8 *)OtherText_GreenShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_67[] = -{ - {(u8 *)OtherText_YellowShard, 0}, - {(u8 *)OtherText_GreenShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_68[] = -{ - {(u8 *)OtherText_RedShard, 0}, - {(u8 *)OtherText_YellowShard, 0}, - {(u8 *)OtherText_GreenShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_69[] = -{ - {(u8 *)OtherText_BlueShard, 0}, - {(u8 *)OtherText_GreenShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_70[] = -{ - {(u8 *)OtherText_RedShard, 0}, - {(u8 *)OtherText_BlueShard, 0}, - {(u8 *)OtherText_GreenShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_71[] = -{ - {(u8 *)OtherText_YellowShard, 0}, - {(u8 *)OtherText_BlueShard, 0}, - {(u8 *)OtherText_GreenShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_72[] = -{ - {(u8 *)OtherText_RedShard, 0}, - {(u8 *)OtherText_YellowShard, 0}, - {(u8 *)OtherText_BlueShard, 0}, - {(u8 *)OtherText_GreenShard, 0}, - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MenuAction MultichoiceList_01[] = -{ - {(u8 *)gOtherText_CancelNoTerminator, 0}, -}; - -const struct MultichoiceListStruct gMultichoiceLists[] = -{ - {(struct MenuAction *)MultichoiceList_00, 3}, - {(struct MenuAction *)MultichoiceList_01, 1}, - {(struct MenuAction *)MultichoiceList_02, 3}, - {(struct MenuAction *)MultichoiceList_03, 4}, - {(struct MenuAction *)MultichoiceList_04, 6}, - {(struct MenuAction *)MultichoiceList_05, 3}, - {(struct MenuAction *)MultichoiceList_06, 4}, - {(struct MenuAction *)MultichoiceList_07, 4}, - {(struct MenuAction *)MultichoiceList_01, 1}, - {(struct MenuAction *)MultichoiceList_01, 1}, - {(struct MenuAction *)MultichoiceList_01, 1}, - {(struct MenuAction *)MultichoiceList_01, 1}, - {(struct MenuAction *)MultichoiceList_12, 2}, - {(struct MenuAction *)MultichoiceList_13, 6}, - {(struct MenuAction *)MultichoiceList_14, 2}, - {(struct MenuAction *)MultichoiceList_01, 1}, - {(struct MenuAction *)MultichoiceList_16, 2}, - {(struct MenuAction *)MultichoiceList_17, 3}, - {(struct MenuAction *)MultichoiceList_18, 4}, - {(struct MenuAction *)MultichoiceList_19, 3}, - {(struct MenuAction *)MultichoiceList_20, 3}, - {(struct MenuAction *)MultichoiceList_01, 1}, - {(struct MenuAction *)MultichoiceList_01, 1}, - {(struct MenuAction *)MultichoiceList_23, 3}, - {(struct MenuAction *)MultichoiceList_24, 3}, - {(struct MenuAction *)MultichoiceList_25, 3}, - {(struct MenuAction *)MultichoiceList_26, 3}, - {(struct MenuAction *)MultichoiceList_27, 3}, - {(struct MenuAction *)MultichoiceList_28, 3}, - {(struct MenuAction *)MultichoiceList_29, 3}, - {(struct MenuAction *)MultichoiceList_30, 3}, - {(struct MenuAction *)MultichoiceList_31, 3}, - {(struct MenuAction *)MultichoiceList_32, 3}, - {(struct MenuAction *)MultichoiceList_33, 3}, - {(struct MenuAction *)MultichoiceList_34, 3}, - {(struct MenuAction *)MultichoiceList_35, 3}, - {(struct MenuAction *)MultichoiceList_36, 3}, - {(struct MenuAction *)MultichoiceList_37, 3}, - {(struct MenuAction *)MultichoiceList_38, 3}, - {(struct MenuAction *)MultichoiceList_39, 3}, - {(struct MenuAction *)MultichoiceList_01, 1}, - {(struct MenuAction *)MultichoiceList_01, 1}, - {(struct MenuAction *)MultichoiceList_42, 4}, - {(struct MenuAction *)MultichoiceList_43, 4}, - {(struct MenuAction *)MultichoiceList_44, 4}, - {(struct MenuAction *)MultichoiceList_45, 2}, - {(struct MenuAction *)MultichoiceList_46, 3}, - {(struct MenuAction *)MultichoiceList_47, 8}, - {(struct MenuAction *)MultichoiceList_48, 4}, - {(struct MenuAction *)MultichoiceList_49, 3}, - {(struct MenuAction *)MultichoiceList_50, 2}, - {(struct MenuAction *)MultichoiceList_01, 1}, - {(struct MenuAction *)MultichoiceList_52, 3}, - {(struct MenuAction *)MultichoiceList_53, 3}, - {(struct MenuAction *)MultichoiceList_54, 2}, - {(struct MenuAction *)MultichoiceList_55, 6}, - {(struct MenuAction *)MultichoiceList_56, 3}, - {(struct MenuAction *)MultichoiceList_57, 5}, - {(struct MenuAction *)MultichoiceList_58, 2}, - {(struct MenuAction *)MultichoiceList_59, 2}, - {(struct MenuAction *)MultichoiceList_60, 3}, - {(struct MenuAction *)MultichoiceList_61, 2}, - {(struct MenuAction *)MultichoiceList_62, 3}, - {(struct MenuAction *)MultichoiceList_63, 3}, - {(struct MenuAction *)MultichoiceList_64, 4}, - {(struct MenuAction *)MultichoiceList_65, 2}, - {(struct MenuAction *)MultichoiceList_66, 3}, - {(struct MenuAction *)MultichoiceList_67, 3}, - {(struct MenuAction *)MultichoiceList_68, 4}, - {(struct MenuAction *)MultichoiceList_69, 3}, - {(struct MenuAction *)MultichoiceList_70, 4}, - {(struct MenuAction *)MultichoiceList_71, 4}, - {(struct MenuAction *)MultichoiceList_72, 5} -}; - -const u8 *const gUnknown_083CE048[] = -{ - OtherText_Cool2, - OtherText_Beauty3, - OtherText_Cute2, - OtherText_Smart2, - OtherText_Tough2, - OtherText_Normal, - OtherText_Super, - OtherText_Hyper, - OtherText_Master, - OtherText_Cool3, - OtherText_Beauty4, - OtherText_Cute3, - OtherText_Smart3, - OtherText_Tough3, - OtherText_Items, - OtherText_KeyItems, - OtherText_Balls, - OtherText_TMsHMs, - OtherText_Berries, -}; - -extern u8 gPCText_WhichPCShouldBeAccessed[]; - -extern u16 gScriptResult; - -bool8 sub_80B5054(u8 left, u8 top, u8 var3, u8 var4) -{ - if (FuncIsActiveTask(sub_80B52B4) == 1) - return FALSE; - else - { - gScriptResult = 0xFF; - DrawMultichoiceMenu(left, top, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4, 0); - return TRUE; - } -} - -bool8 sub_80B50B0(u8 left, u8 top, u8 var3, u8 var4, u8 var5) -{ - if (FuncIsActiveTask(sub_80B52B4) == 1) - return FALSE; - else - { - gScriptResult = 0xFF; - DrawMultichoiceMenu(left, top, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4, var5); - return TRUE; - } -} - -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; -} - -void DrawMultichoiceMenu(u8 left, u8 top, u8 count, struct MenuAction *list, u8 var4, u8 cursorPos) -{ - u16 width = GetStringWidthInTilesForScriptMenu(list[0].text); - u16 newWidth; - u8 i; - u8 right; - u8 bottom; - - for (i = 1; i < count; i++) - { - newWidth = GetStringWidthInTilesForScriptMenu(list[i].text); - if (width < newWidth) - width = newWidth; - } - - right = width; - right = (right + left) + 1; - - if (right > 29) - { - left = left + (29 - right); - right = 29; - } - - bottom = top + (2 * count + 1); - - MenuDrawTextWindow(left, top, right, bottom); - PrintMenuItems(left + 1, top + 1, count, list); - InitMenu(0, left + 1, top + 1, count, cursorPos, right - left - 1); - sub_80B5230(left, top, right, bottom, var4, count); -} - -void sub_80B5230(u8 left, u8 top, u8 right, u8 bottom, u8 unkVar, u8 count) -{ - u8 taskId = CreateTask(sub_80B52B4, 80); - - gTasks[taskId].data[0] = left; - gTasks[taskId].data[1] = top; - gTasks[taskId].data[2] = right; - gTasks[taskId].data[3] = bottom; - gTasks[taskId].data[4] = unkVar; - - if (count > 3) - gTasks[taskId].data[5] = TRUE; - else - gTasks[taskId].data[5] = FALSE; -} - -void sub_80B52B4(u8 taskId) -{ - s8 var; - - if (!gPaletteFade.active) - { - if (!gTasks[taskId].data[5]) - var = ProcessMenuInputNoWrap(); - else - var = ProcessMenuInput(); - - if (var != -2) - { - if (var == -1) - { - if (!gTasks[taskId].data[4]) - { - PlaySE(5); - gScriptResult = 127; - } - else - { - return; - } - } - else - { - gScriptResult = var; - } - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(gTasks[taskId].data[0], gTasks[taskId].data[1], gTasks[taskId].data[2], gTasks[taskId].data[3]); - DestroyTask(taskId); - EnableBothScriptContexts(); - } - } -} - -bool8 Multichoice(u8 var1, u8 var2, u8 var3, u8 var4) -{ - if (FuncIsActiveTask(sub_80B52B4) == 1) - return FALSE; - else - { - gScriptResult = 0xFF; - sub_80B53B4(var1, var2, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4); - return TRUE; - } -} - -void sub_80B53B4(u8 left, u8 top, u8 count, struct MenuAction *list, u8 var4) -{ - u16 width = GetStringWidthInTilesForScriptMenu(list[0].text); - u16 newWidth; - u8 i; - u8 right; - u8 bottom; - - for (i = 1; i < count; i++) - { - newWidth = GetStringWidthInTilesForScriptMenu(list[i].text); - if (width < newWidth) - width = newWidth; - } - - right = width; - right = (right + left) + 2; - bottom = top + (2 * count + 1); - - PrintMenuItems(left, top, count, list); - InitMenu(0, left, top, count, 0, right - left - 1); - sub_80B5230(left, top, right, bottom, var4, count); -} - -bool8 yes_no_box(u8 var1, u8 var2) -{ - u8 taskId; - - if (FuncIsActiveTask(task_yes_no_maybe) == 1) - return FALSE; - else - { - gScriptResult = 0xFF; - DisplayYesNoMenu(var1, var2, 1); - taskId = CreateTask(task_yes_no_maybe, 0x50); - gTasks[taskId].data[0] = var1; - gTasks[taskId].data[1] = var2; - return TRUE; - } -} - -// unused -bool8 IsScriptActive(void) -{ - if (gScriptResult == 0xFF) - return FALSE; - else - return TRUE; -} - -void task_yes_no_maybe(u8 taskId) -{ - u8 left, top; - - if (gTasks[taskId].data[2] < 5) - { - gTasks[taskId].data[2]++; - return; - } - - switch (ProcessMenuInputNoWrap()) - { - case -2: - return; - case -1: - case 1: - PlaySE(5); - gScriptResult = 0; - break; - case 0: - gScriptResult = 1; - break; - } - - left = gTasks[taskId].data[0]; - top = gTasks[taskId].data[1]; - - MenuZeroFillWindowRect(left, top, left + 6, top + 5); - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -bool8 sub_80B5578(u8 left, u8 top, u8 multichoiceId, u8 a4, u8 columnCount) -{ - u8 bottom = 0; - - if (FuncIsActiveTask(sub_80B5684) == TRUE) - { - return FALSE; - } - else - { - u8 taskId; - u8 width; - - gScriptResult = 0xFF; - - sub_807274C(left, top, gMultichoiceLists[multichoiceId].count, 0, gMultichoiceLists[multichoiceId].list, columnCount, 0); - - taskId = CreateTask(sub_80B5684, 80); - - if (!((gMultichoiceLists[multichoiceId].count >> 1) < columnCount || (gMultichoiceLists[multichoiceId].count & 1)) - || columnCount == 1 || gMultichoiceLists[multichoiceId].count == columnCount) - { - bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 1 + top; - } - else - { - bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 3 + top; - } - - width = sub_807288C(columnCount); - gTasks[taskId].data[0] = left; - gTasks[taskId].data[1] = top; - gTasks[taskId].data[2] = width + left + 2; - gTasks[taskId].data[3] = bottom; - gTasks[taskId].data[4] = a4; - return TRUE; - } -} - -void sub_80B5684(u8 taskId) -{ - s8 var = sub_80727CC(); - - if (var != -2) - { - if (var == -1) - { - if (!gTasks[taskId].data[4]) - { - PlaySE(5); - gScriptResult = 127; - } - else - { - return; - } - } - else - { - gScriptResult = var; - } - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(gTasks[taskId].data[0], gTasks[taskId].data[1], gTasks[taskId].data[2], gTasks[taskId].data[3]); - DestroyTask(taskId); - EnableBothScriptContexts(); - } -} - -bool8 TryCreatePCMenu(void) -{ - if (FuncIsActiveTask(sub_80B52B4) == 1) - return FALSE; - else - { - gScriptResult = 0xFF; - CreatePCMenu(); - return TRUE; - } -} - -#if ENGLISH -void CreatePCMenu(void) -{ - u16 playersPCWidth = GetStringWidthInTilesForScriptMenu(gPCText_PlayersPC); - u8 width; - u8 numChoices; - - if (playersPCWidth > GetStringWidthInTilesForScriptMenu(gPCText_SomeonesPC)) - width = playersPCWidth; - else - width = 8; - - if (FlagGet(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); - } - else - { - numChoices = 3; - MenuDrawTextWindow(0, 0, width + 2, 7); - MenuPrint(gPCText_LogOff, 1, 5); - } - - if (FlagGet(SYS_PC_LANETTE)) // player met lanette? - MenuPrint(gPCText_LanettesPC, 1, 1); - else - MenuPrint(gPCText_SomeonesPC, 1, 1); - - MenuPrint(gPCText_PlayersPC, 1, 3); - InitMenu(0, 1, 1, numChoices, 0, width + 1); - sub_80B5230(0, 0, width + 2, 2 * numChoices + 1, 0, numChoices); -} -#elif GERMAN -__attribute__((naked)) -void CreatePCMenu(void) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - sub sp, 0x18\n\ - ldr r0, _080B5748 @ =0x0000084b\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080B5750\n\ - ldr r0, _080B574C @ =gPCText_LanettesPC\n\ - b _080B5752\n\ - .align 2, 0\n\ -_080B5748: .4byte 0x0000084b\n\ -_080B574C: .4byte gPCText_LanettesPC\n\ -_080B5750:\n\ - ldr r0, _080B57E8 @ =gPCText_SomeonesPC\n\ -_080B5752:\n\ - bl GetStringWidthInTilesForScriptMenu\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x8]\n\ - movs r4, 0x1\n\ - ldr r0, _080B57EC @ =gPCText_PlayersPC\n\ - bl GetStringWidthInTilesForScriptMenu\n\ - lsls r1, r4, 2\n\ - add r1, sp\n\ - adds r1, 0x8\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [r1]\n\ - ldr r0, _080B57F0 @ =gPCText_LogOff\n\ - bl GetStringWidthInTilesForScriptMenu\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x10]\n\ - movs r4, 0x3\n\ - ldr r0, _080B57F4 @ =0x00000804\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080B5798\n\ - ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\ - bl GetStringWidthInTilesForScriptMenu\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x14]\n\ - movs r4, 0x4\n\ -_080B5798:\n\ - movs r5, 0\n\ - cmp r5, r4\n\ - bge _080B57B4\n\ - add r2, sp, 0x8\n\ - adds r1, r4, 0\n\ -_080B57A2:\n\ - ldr r0, [r2]\n\ - cmp r5, r0\n\ - bge _080B57AC\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ -_080B57AC:\n\ - adds r2, 0x4\n\ - subs r1, 0x1\n\ - cmp r1, 0\n\ - bne _080B57A2\n\ -_080B57B4:\n\ - ldr r0, _080B57F4 @ =0x00000804\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080B57FC\n\ - movs r7, 0x4\n\ - adds r4, r5, 0x2\n\ - lsls r2, r4, 24\n\ - lsrs r2, 24\n\ - movs r0, 0\n\ - movs r1, 0\n\ - movs r3, 0x9\n\ - bl MenuDrawTextWindow\n\ - ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\ - movs r1, 0x1\n\ - movs r2, 0x5\n\ - bl MenuPrint\n\ - ldr r0, _080B57F0 @ =gPCText_LogOff\n\ - movs r1, 0x1\n\ - movs r2, 0x7\n\ - bl MenuPrint\n\ - b _080B5818\n\ - .align 2, 0\n\ -_080B57E8: .4byte gPCText_SomeonesPC\n\ -_080B57EC: .4byte gPCText_PlayersPC\n\ -_080B57F0: .4byte gPCText_LogOff\n\ -_080B57F4: .4byte 0x00000804\n\ -_080B57F8: .4byte gPCText_HallOfFame\n\ -_080B57FC:\n\ - movs r7, 0x3\n\ - adds r4, r5, 0x2\n\ - lsls r2, r4, 24\n\ - lsrs r2, 24\n\ - movs r0, 0\n\ - movs r1, 0\n\ - movs r3, 0x7\n\ - bl MenuDrawTextWindow\n\ - ldr r0, _080B5834 @ =gPCText_LogOff\n\ - movs r1, 0x1\n\ - movs r2, 0x5\n\ - bl MenuPrint\n\ -_080B5818:\n\ - adds r6, r4, 0\n\ - ldr r0, _080B5838 @ =0x0000084b\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080B5840\n\ - ldr r0, _080B583C @ =gPCText_LanettesPC\n\ - movs r1, 0x1\n\ - movs r2, 0x1\n\ - bl MenuPrint\n\ - b _080B584A\n\ - .align 2, 0\n\ -_080B5834: .4byte gPCText_LogOff\n\ -_080B5838: .4byte 0x0000084b\n\ -_080B583C: .4byte gPCText_LanettesPC\n\ -_080B5840:\n\ - ldr r0, _080B5888 @ =gPCText_SomeonesPC\n\ - movs r1, 0x1\n\ - movs r2, 0x1\n\ - bl MenuPrint\n\ -_080B584A:\n\ - ldr r0, _080B588C @ =gPCText_PlayersPC\n\ - movs r1, 0x1\n\ - movs r2, 0x3\n\ - bl MenuPrint\n\ - movs r4, 0\n\ - str r4, [sp]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x4]\n\ - movs r0, 0\n\ - movs r1, 0x1\n\ - movs r2, 0x1\n\ - adds r3, r7, 0\n\ - bl InitMenu\n\ - lsls r2, r6, 24\n\ - lsrs r2, 24\n\ - lsls r3, r7, 1\n\ - adds r3, 0x1\n\ - str r4, [sp]\n\ - str r7, [sp, 0x4]\n\ - movs r0, 0\n\ - movs r1, 0\n\ - bl sub_80B5230\n\ - add sp, 0x18\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B5888: .4byte gPCText_SomeonesPC\n\ -_080B588C: .4byte gPCText_PlayersPC\n\ - .syntax divided\n"); -} -#endif - -void sub_80B5838(void) -{ - MenuDisplayMessageBox(); - MenuPrint(gPCText_WhichPCShouldBeAccessed, 2, 15); -} - -void task_picbox(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - task->data[0]++; - break; - case 1: - break; - case 2: - FreeResourcesAndDestroySprite(&gSprites[task->data[2]]); - task->data[0]++; - break; - case 3: - MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10); - DestroyTask(taskId); - break; - } -} - -bool8 sub_80B58C4(u16 var1, u8 var2, u8 var3) -{ - u8 taskId; - u8 var; - - if (FindTaskIdByFunc(task_picbox) != 0xFF) - return FALSE; - else - { - MenuDrawTextWindow(var2, var3, var2 + 9, var3 + 10); - taskId = CreateTask(task_picbox, 0x50); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = var1; - var = CreateMonSprite_PicBox(var1, var2 * 8 + 40, var3 * 8 + 40, 0); - gTasks[taskId].data[2] = var; - gTasks[taskId].data[3] = var2; - gTasks[taskId].data[4] = var3; - gSprites[var].callback = SpriteCallbackDummy; - gSprites[var].oam.priority = 0; - return TRUE; - } -} - -void *picbox_close(void) -{ - u8 taskId = FindTaskIdByFunc(task_picbox); - - if (taskId == 0xFF) - return NULL; - - gTasks[taskId].data[0]++; - return (void *)sub_80B59AC; -} - -bool8 sub_80B59AC(void) -{ - if (FindTaskIdByFunc(task_picbox) == 0xFF) - return TRUE; - else - return FALSE; -} diff --git a/src/script_movement.c b/src/script_movement.c deleted file mode 100644 index e25b60a3c..000000000 --- a/src/script_movement.c +++ /dev/null @@ -1,224 +0,0 @@ -#include "global.h" -#include "script_movement.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" -#include "task.h" -#include "util.h" - -static EWRAM_DATA u8 *gUnknown_020384F8[16] = {0}; - -static void sub_80A2198(u8); -static u8 sub_80A21E0(void); -static bool8 sub_80A21F4(u8, u8, u8 *); -static u8 sub_80A2260(u8, u8); -static bool8 sub_80A2370(u8, u8); -static void sub_80A23C8(u8, u8, u8, u8 *); -static void sub_80A2408(u8); -static void Task_80A244C(u8); -static void sub_80A2490(u8, u8, u8, u8 *); - -bool8 exec_movement(u8 a, u8 b, u8 c, u8 *d) -{ - u8 mapObjId; - - if (TryGetFieldObjectIdByLocalIdAndMap(a, b, c, &mapObjId)) - return TRUE; - if (!FuncIsActiveTask(Task_80A244C)) - sub_80A2198(50); - return sub_80A21F4(sub_80A21E0(), mapObjId, d); -} - -bool8 sub_80A212C(u8 a, u8 b, u8 c) -{ - u8 mapObjId; - u8 r4; - u8 r1; - - if (TryGetFieldObjectIdByLocalIdAndMap(a, b, c, &mapObjId)) - return 1; - r4 = sub_80A21E0(); - r1 = sub_80A2260(r4, mapObjId); - if (r1 == 16) - return 1; - return sub_80A2370(r4, r1); -} - -void sub_80A2178(void) -{ - u8 taskId; - - taskId = sub_80A21E0(); - if (taskId != 0xFF) - { - sub_80A2408(taskId); - DestroyTask(taskId); - } -} - -static void sub_80A2198(u8 priority) -{ - u8 taskId; - u8 i; - - taskId = CreateTask(Task_80A244C, priority); - for (i = 1; i < 16; i++) - gTasks[taskId].data[i] = 0xFFFF; -} - -static u8 sub_80A21E0(void) -{ - return FindTaskIdByFunc(Task_80A244C); -} - -static bool8 sub_80A21F4(u8 taskId, u8 b, u8 *c) -{ - u8 r4; - - r4 = sub_80A2260(taskId, b); - if (r4 != 16) - { - if (sub_80A2370(taskId, r4) == 0) - return TRUE; - else - { - sub_80A23C8(taskId, r4, b, c); - return FALSE; - } - } - r4 = sub_80A2260(taskId, 0xFF); - if (r4 == 16) - return TRUE; - else - { - sub_80A23C8(taskId, r4, b, c); - return FALSE; - } -} - -static u8 sub_80A2260(u8 taskId, u8 b) -{ - u8 *ptr; - u8 i; - - ptr = (u8 *)&gTasks[taskId].data[1]; - for (i = 0; i < 16; i++, ptr++) - { - if (*ptr == b) - return i; - } - return 16; -} - -static void sub_80A229C(u8 taskId, u8 b, u8 **c) -{ - u8 i; - - *c = (u8 *)&gTasks[taskId].data[1]; - for (i = 0; i < b; i++, (*c)++) - ; -} - -static void sub_80A22D0(u8 taskId, u8 b, u8 c) -{ - u8 *ptr; - - sub_80A229C(taskId, b, &ptr); - *ptr = c; //what is this supposed to do? -} - -static void sub_80A22F4(u8 taskId, u8 b, u8 *c) -{ - u8 *ptr; - - sub_80A229C(taskId, b, &ptr); - *c = *ptr; -} - -static void sub_80A2318(u8 a, u8 b) -{ - u16 var = ~gBitTable[b]; - - gTasks[a].data[0] &= var; -} - -static void sub_80A2348(u8 taskId, u8 b) -{ - gTasks[taskId].data[0] |= gBitTable[b]; -} - -static bool8 sub_80A2370(u8 taskId, u8 b) -{ - u16 var = (u16)gTasks[taskId].data[0] & gBitTable[b]; - - if (var != 0) - return TRUE; - else - return FALSE; -} - -static void npc_obj_offscreen_culling_and_flag_update(u8 a, u8 *b) -{ - gUnknown_020384F8[a] = b; -} - -static u8 *sub_80A23B8(u8 a) -{ - return gUnknown_020384F8[a]; -} - -static void sub_80A23C8(u8 taskId, u8 b, u8 c, u8 *d) -{ - sub_80A2318(taskId, b); - npc_obj_offscreen_culling_and_flag_update(b, d); - sub_80A22D0(taskId, b, c); -} - -static void sub_80A2408(u8 a) -{ - u8 *ptr; - u8 i; - - ptr = (u8 *)&gTasks[a].data[1]; - for (i = 0; i < 16; i++, ptr++) - { - if (*ptr != 0xFF) - UnfreezeMapObject(&gMapObjects[*ptr]); - } -} - -static void Task_80A244C(u8 taskId) -{ - u8 i; - u8 var; - - for (i = 0; i < 16; i++) - { - sub_80A22F4(taskId, i, &var); - if (var != 0xFF) - sub_80A2490(taskId, i, var, sub_80A23B8(i)); - } -} - -static void sub_80A2490(u8 taskId, u8 b, u8 c, u8 *d) -{ - u8 var; - - if (FieldObjectIsSpecialAnimActive(&gMapObjects[c]) - && !FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[c])) - return; - - var = *d; - if (var == 0xFE) - { - sub_80A2348(taskId, b); - FreezeMapObject(&gMapObjects[c]); - } - else - { - if (!FieldObjectSetSpecialAnim(&gMapObjects[c], var)) - { - d++; - npc_obj_offscreen_culling_and_flag_update(b, d); - } - } -} diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c deleted file mode 100644 index cbca07011..000000000 --- a/src/script_pokemon_util_80C4BF0.c +++ /dev/null @@ -1,716 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "berry.h" -#include "choose_party.h" -#include "contest.h" -#include "contest_link_80C2020.h" -#include "contest_painting.h" -#include "data2.h" -#include "daycare.h" -#include "debug.h" -#include "decompress.h" -#include "event_data.h" -#include "items.h" -#include "link.h" -#include "load_save.h" -#include "main.h" -#include "menu.h" -#include "pokedex.h" -#include "pokemon.h" -#include "rng.h" -#include "rom4.h" -#include "script_pokemon_80C4.h" -#include "species.h" -#include "task.h" - -#define CONTEST_ENTRY_PIC_LEFT 10 -#define CONTEST_ENTRY_PIC_TOP 3 - -extern struct SpriteTemplate gUnknown_02024E8C; - -extern u8 gContestPlayerMonIndex; -extern u8 gIsLinkContest; -extern u8 gPlayerPartyCount; -extern u8 gSelectedOrderFromParty[]; - -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; - -extern u16 gScriptContestCategory; -extern u16 gScriptContestRank; -extern u16 gScriptResult; - -extern u32 gUnknown_03005D28; - -extern u8 gUnknown_02038694; -extern u8 gUnknown_0203856C; -extern u8 gUnknown_02038690[]; -extern u16 gUnknown_02038678[]; - -void sub_80C4BF0(void) -{ - gSaveBlock1.vars[0x10] = gContestMons[0].unk16; - gSaveBlock1.vars[0x11] = gContestMons[1].unk16; - gSaveBlock1.vars[0x12] = gContestMons[2].unk16; -} - -void sub_80C4C28(void) -{ - u16 var; - u8 specialVar = gSpecialVar_0x8005; - - switch(specialVar) - { - case 0: - var = 3; - break; - case 1: - var = 4; - break; - case 2: - var = 5; - break; - default: - var = 100; - break; - } - gSpecialVar_0x8004 = var; -} - -void sub_80C4C64(void) -{ - sub_80C46EC(); - sub_80C4740(); - sub_80C48F4(); -} - -void sub_80C4C78(void) -{ - u16 var; - u16 returnVar; - - switch(gScriptContestCategory) - { - case 0: - var = 8; - break; - case 1: - var = 9; - break; - case 2: - var = 10; - break; - case 3: - var = 11; - break; - case 4: - default: - var = 12; - break; - } - - returnVar = gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[var].var; - - if(returnVar == 0) - gSpecialVar_0x8004 = returnVar; - else - gSpecialVar_0x8004 = 1; -} - -void sub_80C4CEC(void) -{ - sub_80B2A7C(0xFF); -} - -void sub_80C4CF8(void) -{ - if(!gUnknown_02038690[gContestPlayerMonIndex] - && gScriptContestRank == 3 - && (s16)gUnknown_02038678[gContestPlayerMonIndex] >= 800) - { - gSpecialVar_0x8004 = 1; - } - else - { - gSpecialVar_0x8004 = 0; - } -} - -u8 sub_80C4D50(void) -{ - u8 retVar = 0; - int i; - - for (i = 0; i < 5; i++) - if (gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[i + 8].var) - retVar++; - - return retVar; -} - -// nope. too hard -__attribute__((naked)) -void sub_80C4D80(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - ldr r0, _080C4EA0 @ =gUnknown_02038670\n\ - mov r12, r0\n\ - ldr r1, _080C4EA4 @ =gSpecialVar_0x8006\n\ - mov r8, r1\n\ - ldr r2, _080C4EA8 @ =gStringVar1\n\ - mov r9, r2\n\ - mov r2, r12\n\ - mov r1, sp\n\ - movs r6, 0x3\n\ -_080C4D9E:\n\ - ldrh r0, [r2]\n\ - strh r0, [r1]\n\ - adds r2, 0x2\n\ - adds r1, 0x2\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _080C4D9E\n\ - movs r6, 0\n\ -_080C4DAE:\n\ - movs r1, 0x3\n\ - cmp r1, r6\n\ - ble _080C4DD8\n\ -_080C4DB4:\n\ - subs r4, r1, 0x1\n\ - lsls r0, r4, 1\n\ - mov r5, sp\n\ - adds r3, r5, r0\n\ - lsls r0, r1, 1\n\ - adds r2, r5, r0\n\ - ldrh r5, [r3]\n\ - movs r7, 0\n\ - ldrsh r1, [r3, r7]\n\ - movs r7, 0\n\ - ldrsh r0, [r2, r7]\n\ - cmp r1, r0\n\ - bge _080C4DD2\n\ - strh r5, [r2]\n\ - strh r0, [r3]\n\ -_080C4DD2:\n\ - adds r1, r4, 0\n\ - cmp r1, r6\n\ - bgt _080C4DB4\n\ -_080C4DD8:\n\ - adds r6, 0x1\n\ - cmp r6, 0x2\n\ - ble _080C4DAE\n\ - mov r2, r8\n\ - ldrh r0, [r2]\n\ - lsls r0, 1\n\ - add r0, sp\n\ - ldrh r0, [r0]\n\ - movs r2, 0\n\ - movs r7, 0\n\ - movs r6, 0\n\ - lsls r0, 16\n\ - asrs r4, r0, 16\n\ - adds r3, r0, 0\n\ - mov r1, sp\n\ -_080C4DF6:\n\ - movs r5, 0\n\ - ldrsh r0, [r1, r5]\n\ - cmp r0, r4\n\ - bne _080C4E12\n\ - lsls r0, r2, 24\n\ - movs r2, 0x80\n\ - lsls r2, 17\n\ - adds r0, r2\n\ - lsrs r2, r0, 24\n\ - mov r5, r8\n\ - ldrh r5, [r5]\n\ - cmp r6, r5\n\ - bne _080C4E12\n\ - adds r7, r2, 0\n\ -_080C4E12:\n\ - adds r1, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - ble _080C4DF6\n\ - movs r6, 0\n\ - mov r0, sp\n\ - movs r1, 0\n\ - ldrsh r0, [r0, r1]\n\ - asrs r1, r3, 16\n\ - lsls r2, 24\n\ - mov r10, r2\n\ - cmp r0, r1\n\ - beq _080C4E40\n\ - adds r2, r1, 0\n\ - mov r1, sp\n\ -_080C4E30:\n\ - adds r1, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - bgt _080C4E40\n\ - movs r4, 0\n\ - ldrsh r0, [r1, r4]\n\ - cmp r0, r2\n\ - bne _080C4E30\n\ -_080C4E40:\n\ - lsls r0, r6, 24\n\ - lsrs r4, r0, 24\n\ - adds r2, r7, 0\n\ - movs r6, 0\n\ - asrs r5, r3, 16\n\ - mov r8, r5\n\ - mov r1, r12\n\ - movs r5, 0\n\ - ldrsh r0, [r1, r5]\n\ - cmp r8, r0\n\ - bne _080C4E60\n\ - cmp r7, 0x1\n\ - beq _080C4E78\n\ -_080C4E5A:\n\ - subs r0, r2, 0x1\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ -_080C4E60:\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - bgt _080C4E78\n\ - lsls r0, r6, 1\n\ - add r0, r12\n\ - asrs r1, r3, 16\n\ - movs r5, 0\n\ - ldrsh r0, [r0, r5]\n\ - cmp r1, r0\n\ - bne _080C4E60\n\ - cmp r2, 0x1\n\ - bne _080C4E5A\n\ -_080C4E78:\n\ - lsls r1, r6, 24\n\ - lsrs r1, 24\n\ - mov r0, r9\n\ - bl sub_80C4698\n\ - ldr r0, _080C4EAC @ =gIsLinkContest\n\ - ldrb r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080C4EB8\n\ - ldr r0, _080C4EB0 @ =gStringVar2\n\ - lsls r1, r6, 3\n\ - subs r1, r6\n\ - lsls r1, 2\n\ - ldr r2, _080C4EB4 @ =gLinkPlayers + 0x8\n\ - adds r1, r2\n\ - bl sub_80C4674\n\ - b _080C4EC4\n\ - .align 2, 0\n\ -_080C4EA0: .4byte gUnknown_02038670\n\ -_080C4EA4: .4byte gSpecialVar_0x8006\n\ -_080C4EA8: .4byte gStringVar1\n\ -_080C4EAC: .4byte gIsLinkContest\n\ -_080C4EB0: .4byte gStringVar2\n\ -_080C4EB4: .4byte gLinkPlayers + 0x8\n\ -_080C4EB8:\n\ - ldr r0, _080C4ED8 @ =gStringVar2\n\ - lsls r1, r6, 6\n\ - ldr r2, _080C4EDC @ =gUnknown_0203857D\n\ - adds r1, r2\n\ - bl sub_80C4674\n\ -_080C4EC4:\n\ - mov r1, r10\n\ - asrs r0, r1, 24\n\ - cmp r0, 0x1\n\ - beq _080C4ED0\n\ - cmp r7, r0\n\ - bne _080C4EE4\n\ -_080C4ED0:\n\ - ldr r0, _080C4EE0 @ =gSpecialVar_0x8006\n\ - strh r4, [r0]\n\ - b _080C4EEA\n\ - .align 2, 0\n\ -_080C4ED8: .4byte gStringVar2\n\ -_080C4EDC: .4byte gUnknown_0203857D\n\ -_080C4EE0: .4byte gSpecialVar_0x8006\n\ -_080C4EE4:\n\ - ldr r1, _080C4EFC @ =gSpecialVar_0x8006\n\ - adds r0, r4, 0x4\n\ - strh r0, [r1]\n\ -_080C4EEA:\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080C4EFC: .4byte gSpecialVar_0x8006\n\ - .syntax divided"); -} - -void ShowContestWinnerCleanup(void) -{ - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -void ShowContestWinner(void) -{ - if(gUnknown_0203856C) - { - sub_80AAF30(); - BATTLE_STRUCT->unk15DDF = 1; - BATTLE_STRUCT->unk15DDE = sub_80B2C4C(254, 0); - sub_80B2A7C(3); - gUnknown_0203856C = 0; - } - SetMainCallback2(CB2_ContestPainting); - gMain.savedCallback = ShowContestWinnerCleanup; -} - -void sub_80C4F70(void) -{ - VarSet(0x4010, gContestMons[0].unk16); - VarSet(0x4011, gContestMons[1].unk16); - VarSet(0x4012, gContestMons[2].unk16); - VarSet(0x4013, gContestMons[3].unk16); -} - -bool8 GiveMonArtistRibbon(void) -{ - u8 ribbon = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_ARTIST_RIBBON); - - if(ribbon == FALSE - && gUnknown_02038690[gContestPlayerMonIndex] == 0 - && gScriptContestRank == 3 - && (s16)gUnknown_02038678[gContestPlayerMonIndex] >= 800) - { - ribbon = TRUE; - SetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_ARTIST_RIBBON, &ribbon); - return TRUE; - } - else - { - return FALSE; - } -} - -u8 sub_80C5044(void) -{ - return gUnknown_0203856C; -} - -void ShowContestEntryMonPic(void) -{ - const struct CompressedSpritePalette *palette; - u32 var1, var2; - u16 species; - u8 spriteId; - u8 taskId; - - if(FindTaskIdByFunc(sub_80C5190) == 0xFF) - { - u8 left = CONTEST_ENTRY_PIC_LEFT; - u8 top = CONTEST_ENTRY_PIC_TOP; - - MenuDrawTextWindow(left, top, 19, 13); - species = gContestMons[gSpecialVar_0x8006].species; - var1 = gContestMons[gSpecialVar_0x8006].unk38; // v2 - var2 = gContestMons[gSpecialVar_0x8006].unk3C; // v3 - taskId = CreateTask(sub_80C5190, 0x50); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = species; - HandleLoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, - gMonFrontPicCoords[species].y_offset, - (u32)gUnknown_081FAF4C[0], - gUnknown_081FAF4C[1], - species, - var1); - palette = sub_80409C8(species, var2, var1); - LoadCompressedObjectPalette(palette); - GetMonSpriteTemplate_803C56C(species, 1); - gUnknown_02024E8C.paletteTag = palette->tag; - spriteId = CreateSprite(&gUnknown_02024E8C, 0x78, 0x40, 0); - gTasks[taskId].data[2] = spriteId; - gTasks[taskId].data[3] = left; - gTasks[taskId].data[4] = top; - gSprites[spriteId].callback = SpriteCallbackDummy; - gSprites[spriteId].oam.priority = 0; - } -} - -void sub_80C5164(void) -{ - u8 taskId = FindTaskIdByFunc(sub_80C5190); - - if(taskId != 0xFF) - gTasks[taskId].data[0]++; -} - -void sub_80C5190(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - struct Sprite *sprite; - - switch(task->data[0]) - { - case 2: - sprite = &gSprites[task->data[2]]; - FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); - - if(sprite->oam.affineMode) - FreeOamMatrix(sprite->oam.matrixNum); - - DestroySprite(sprite); - task->data[0]++; - break; - case 0: - task->data[0]++; - break; - case 3: - MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10); - DestroyTask(taskId); - break; - case 1: - default: - break; - } -} - -void ScriptGetMultiplayerId(void) -{ - if(gIsLinkContest & 1) - gScriptResult = GetMultiplayerId(); - else - gScriptResult = 4; -} - -void ScriptRandom(void) -{ - u16 random; - u16 *scriptPtr; - - if(gIsLinkContest & 1) - { - gUnknown_03005D28 = 1103515245 * gUnknown_03005D28 + 24691; - random = gUnknown_03005D28 >> 16; - scriptPtr = &gScriptResult; - } - else - { - scriptPtr = &gScriptResult; - random = Random(); - } - *scriptPtr = random % *scriptPtr; -} - -void HealPlayerParty(void) -{ - u8 i, j; - u8 ppBonuses; - u8 arg[4]; - - // restore HP. - for(i = 0; i < gPlayerPartyCount; i++) - { - u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); - arg[0] = maxHP; - arg[1] = maxHP >> 8; - SetMonData(&gPlayerParty[i], MON_DATA_HP, arg); - ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES); - - // restore PP. - for(j = 0; j < 4; j++) - { - arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j); - SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg); - } - - // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData. - arg[0] = 0; - arg[1] = 0; - arg[2] = 0; - arg[3] = 0; - SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg); - } -} - -u8 ScriptGiveMon(u16 species, u8 var, u16 item, u32 var3, u32 var4, u8 var5) -{ - u16 nationalSpecies; - int sentToPc; - u8 array[2]; - struct Pokemon mon; - - CreateMon(&mon, species, var, 32, 0, 0, 0, 0); - array[0] = item; - array[1] = item >> 8; - SetMonData(&mon, MON_DATA_HELD_ITEM, array); - sentToPc = GiveMonToPlayer(&mon); - nationalSpecies = SpeciesToNationalPokedexNum(species); - - // nested if check to fool compiler - switch(sentToPc) - { - case 0: - case 1: - GetNationalPokedexFlag(nationalSpecies, 2); - GetNationalPokedexFlag(nationalSpecies, 3); - return sentToPc; - default: - return sentToPc; - } -} - -u8 ScriptGiveEgg(u16 value) -{ - struct Pokemon mon; - u8 data; - - sub_8042044(&mon, value, 1); - data = 1; - SetMonData(&mon, MON_DATA_IS_EGG, &data); - - return GiveMonToPlayer(&mon); -} - -void CheckForAlivePartyMons(void) -{ - u8 var = sub_803DAA0(); - - switch(var) - { - case 1: - gScriptResult = var; - break; - case 0: - gScriptResult = var; - break; - case 2: - gScriptResult = var; - break; - } -} - -bool8 CheckPartyMonHasHeldItem(u16 item) -{ - int i; - - for(i = 0; i < 6; i++) - { - u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - if(species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == item) - return TRUE; - } - return FALSE; -} - -bool8 GetNameOfEnigmaBerryInPlayerParty(void) -{ - bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY); - - if(hasItem == TRUE) - GetBerryNameByBerryType(ItemIdToBerryType(ITEM_ENIGMA_BERRY), gStringVar1); - - return hasItem; -} - -void ScriptWildBattle(u16 species, u8 level, u16 item) -{ - u8 data[2]; - - ZeroEnemyPartyMons(); - CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, 0, 0); - - if(item) - { - data[0] = item; - data[1] = item >> 8; - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, data); - } -} - -void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot) -{ - if(monIndex > 6) - monIndex = gPlayerPartyCount - 1; - - SetMonMoveSlot(&gPlayerParty[monIndex], move, slot); -} - -void sub_80C5568(void) -{ - gMain.savedCallback = sub_80C5580; - sub_8121E10(); -} - -void sub_80C5580(void) -{ - u8 var = gSelectedOrderFromParty[0]; - - switch(var) - { - case 0: - gScriptResult = 0; - break; - default: - gScriptResult = 1; - break; - } - - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -void ChooseBattleTowerPlayerParty(void) -{ - gMain.savedCallback = SetBattleTowerPlayerParty; - sub_8121E34(); -} - -void SetBattleTowerPlayerParty(void) -{ - u8 var = gSelectedOrderFromParty[0]; - - switch(var) - { - case 0: // player quit battle tower? - LoadPlayerParty(); - gScriptResult = 0; - break; - default: // load battle tower. - ReducePlayerPartyToThree(); - gScriptResult = 1; - break; - } - - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -void ReducePlayerPartyToThree(void) -{ - struct Pokemon party[3]; - int i; - - CpuFill32(0, party, sizeof party); - - // copy the selected pokemon according to the order. - for(i = 0; i < 3; i++) - if(gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop - party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal - - // delete the last 3 pokemon - CpuFill32(0, gPlayerParty, sizeof gPlayerParty); - - // overwrite the first 3 with the order copied to. - for(i = 0; i < 3; i++) - gPlayerParty[i] = party[i]; - - CalculatePlayerPartyCount(); -} diff --git a/src/script_pokemon_util_80F99CC.c b/src/script_pokemon_util_80F99CC.c deleted file mode 100644 index 2b48cc0d8..000000000 --- a/src/script_pokemon_util_80F99CC.c +++ /dev/null @@ -1,445 +0,0 @@ -#include "global.h" -#include "battle_party_menu.h" -#include "choose_party.h" -#include "contest.h" -#include "data2.h" -#include "party_menu.h" -#include "field_fadetransition.h" -#include "palette.h" -#include "party_menu.h" -#include "pokemon.h" -#include "pokemon_summary_screen.h" -#include "rom4.h" -#include "script.h" -#include "script_pokemon_80F9.h" -#include "sound.h" -#include "string_util.h" -#include "task.h" -#include "text.h" - - - -extern u8 gPlayerPartyCount; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u8 gUnknown_02038694; -extern u16 gScriptResult; - -extern void (*gFieldCallback)(void); - -void sub_80F99CC(void) -{ - u8 taskId; - - ScriptContext2_Enable(); - taskId = CreateTask((void *)sub_80F9A8C, 0xA); - gTasks[taskId].data[0] = 2; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void sub_80F9A0C(void) -{ - u8 taskId; - - ScriptContext2_Enable(); - taskId = CreateTask((void *)sub_80F9A8C, 0xA); - gTasks[taskId].data[0] = 3; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void sub_80F9A4C(void) -{ - u8 taskId; - - ScriptContext2_Enable(); - taskId = CreateTask((void *)sub_80F9A8C, 0xA); - gTasks[taskId].data[0] = 7; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void sub_80F9A8C(u8 taskId) -{ - if(!gPaletteFade.active) - { - gPaletteFade.bufferTransferDisabled = 1; - OpenPartyMenu((u8) gTasks[taskId].data[0], 0); - DestroyTask(taskId); - } -} - -bool8 sub_80F9ACC(void) -{ - switch(EWRAM_1B000.unk264) - { - case 0: - if(EWRAM_1B000.unk266 < gPlayerPartyCount) - { - TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); - EWRAM_1B000.unk266++; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - } - break; - case 1: - LoadHeldItemIconGraphics(); - EWRAM_1B000.unk264++; - break; - case 2: - CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); - EWRAM_1B000.unk264++; - break; - case 3: - if(sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1) - { - EWRAM_1B000.unk266++; - break; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - break; - } - case 4: - PartyMenuPrintMonsLevelOrStatus(); - EWRAM_1B000.unk264++; - break; - case 5: - PrintPartyMenuMonNicknames(); - EWRAM_1B000.unk264++; - break; - case 6: - sub_80F9C00(); - EWRAM_1B000.unk264++; - break; - case 7: // the only case that can return true. - if(sub_806B58C(EWRAM_1B000.unk266) != 1) - { - EWRAM_1B000.unk266++; - break; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264 = 0; - return TRUE; - } - } - return FALSE; -} - -void sub_80F9C00(void) -{ - u8 i; - - for(i = 0; i < gPlayerPartyCount; i++) - { - switch(sub_80AE47C(&gPlayerParty[i])) - { - case 0: - case 3: - case 4: - sub_806BC3C(i, 0x7E); - break; - case 1: - case 2: - sub_806BC3C(i, 0x70); - break; - } - } -} - -void sub_80F9C6C(u8 var) -{ - if(!gPaletteFade.active) - { - switch(sub_806BD80(var)) - { - case 1: - PlaySE(5); - gUnknown_02038694 = sub_806CA38(var); - gSpecialVar_0x8004 = gUnknown_02038694; - sub_8123138(var); - break; - case 2: - PlaySE(5); - gUnknown_02038694 = 0xFF; - gSpecialVar_0x8004 = 0xFF; - sub_8123138(var); - break; - } - } -} - -bool8 sub_80F9CE8(void) // this is the same function as sub_80F9ACC except case 6 calls a different function. why -{ - switch(EWRAM_1B000.unk264) - { - case 0: - if(EWRAM_1B000.unk266 < gPlayerPartyCount) - { - TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); - EWRAM_1B000.unk266++; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - } - break; - case 1: - LoadHeldItemIconGraphics(); - EWRAM_1B000.unk264++; - break; - case 2: - CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); - EWRAM_1B000.unk264++; - break; - case 3: - if(sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1) - { - EWRAM_1B000.unk266++; - break; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - break; - } - case 4: - PartyMenuPrintMonsLevelOrStatus(); - EWRAM_1B000.unk264++; - break; - case 5: - PrintPartyMenuMonNicknames(); - EWRAM_1B000.unk264++; - break; - case 6: - sub_80F9E1C(); - EWRAM_1B000.unk264++; - break; - case 7: // the only case that can return true. - if(sub_806B58C(EWRAM_1B000.unk266) != 1) - { - EWRAM_1B000.unk266++; - break; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264 = 0; - return TRUE; - } - } - return FALSE; -} - -void sub_80F9E1C(void) -{ - u8 i; - - for(i = 0; i < gPlayerPartyCount; i++) - { - if(!sub_8040574(&gPlayerParty[i])) - sub_806BC3C(i, 0x9A); - else - sub_806BC3C(i, 0x8C); - } -} - -void sub_80F9E64(u8 var) -{ - if(!gPaletteFade.active) - { - switch(sub_806BD80(var)) - { - case 1: - PlaySE(5); - gSpecialVar_0x8004 = sub_806CA38(var); - gSpecialVar_0x8005 = sub_8040574(&gPlayerParty[gSpecialVar_0x8004]); - sub_8123138(var); - break; - case 2: - PlaySE(5); - gSpecialVar_0x8004 = 0xFF; - sub_8123138(var); - } - } -} - -void sub_80F9EEC(void) -{ - sub_809D9F0(&gPlayerParty[0], gSpecialVar_0x8004, gPlayerPartyCount - 1, c2_exit_to_overworld_2_switch, 0); - unk_2018000.unk8 = 3; - gFieldCallback = sub_8080990; -} - -void sub_80F9F3C(void) // count pokemon moves -{ - u8 i; - - gScriptResult = 0; - - for(i = 0; i < 4; i++) // checks MOVE1-MOVE4 - if(GetMonData(&gPlayerParty[gSpecialVar_0x8004], i + 13)) - gScriptResult++; -} - -void sub_80F9F84(void) -{ - struct Pokemon *party = &gPlayerParty[gSpecialVar_0x8004]; - u16 data = GetMonData(party, gSpecialVar_0x8005 + 13); - - GetMonNickname(party, gStringVar1); - StringCopy(gStringVar2, gMoveNames[data]); -} - -// no. hard -__attribute__((naked)) -void sub_80F9FDC(struct Pokemon *party, u8 var, u8 var2) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x20\n\ - mov r8, r0\n\ - adds r5, r1, 0\n\ - adds r4, r2, 0\n\ - lsls r5, 24\n\ - lsrs r5, 24\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - adds r0, r5, 0\n\ - adds r0, 0xD\n\ - str r0, [sp, 0x8]\n\ - mov r0, r8\n\ - ldr r1, [sp, 0x8]\n\ - bl GetMonData\n\ - mov r1, sp\n\ - adds r1, 0x2\n\ - str r1, [sp, 0x14]\n\ - strh r0, [r1]\n\ - adds r3, r4, 0\n\ - adds r3, 0xD\n\ - str r3, [sp, 0xC]\n\ - mov r0, r8\n\ - adds r1, r3, 0\n\ - bl GetMonData\n\ - mov r1, sp\n\ - strh r0, [r1]\n\ - adds r7, r5, 0\n\ - adds r7, 0x11\n\ - str r7, [sp, 0x10]\n\ - mov r0, r8\n\ - adds r1, r7, 0\n\ - bl GetMonData\n\ - mov r1, sp\n\ - adds r1, 0x5\n\ - str r1, [sp, 0x18]\n\ - strb r0, [r1]\n\ - adds r3, r4, 0\n\ - adds r3, 0x11\n\ - str r3, [sp, 0x1C]\n\ - mov r0, r8\n\ - adds r1, r3, 0\n\ - bl GetMonData\n\ - add r7, sp, 0x4\n\ - mov r10, r7\n\ - strb r0, [r7]\n\ - mov r0, r8\n\ - movs r1, 0x15\n\ - bl GetMonData\n\ - mov r6, sp\n\ - adds r6, 0x6\n\ - strb r0, [r6]\n\ - ldr r1, _080FA0D8 @ =gUnknown_08208238\n\ - adds r0, r5, r1\n\ - ldrb r0, [r0]\n\ - mov r9, r0\n\ - ldrb r0, [r6]\n\ - adds r2, r0, 0\n\ - mov r3, r9\n\ - ands r2, r3\n\ - lsls r5, 1\n\ - asrs r2, r5\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - adds r1, r4, r1\n\ - ldrb r3, [r1]\n\ - adds r1, r0, 0\n\ - ands r1, r3\n\ - lsls r4, 1\n\ - asrs r1, r4\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r7, r9\n\ - bics r0, r7\n\ - strb r0, [r6]\n\ - ldrb r0, [r6]\n\ - bics r0, r3\n\ - strb r0, [r6]\n\ - lsls r2, r4\n\ - lsls r1, r5\n\ - adds r2, r1\n\ - ldrb r0, [r6]\n\ - orrs r0, r2\n\ - strb r0, [r6]\n\ - mov r0, r8\n\ - ldr r1, [sp, 0x8]\n\ - mov r2, sp\n\ - bl SetMonData\n\ - mov r0, r8\n\ - ldr r1, [sp, 0xC]\n\ - ldr r2, [sp, 0x14]\n\ - bl SetMonData\n\ - mov r0, r8\n\ - ldr r1, [sp, 0x10]\n\ - mov r2, r10\n\ - bl SetMonData\n\ - mov r0, r8\n\ - ldr r1, [sp, 0x1C]\n\ - ldr r2, [sp, 0x18]\n\ - bl SetMonData\n\ - mov r0, r8\n\ - movs r1, 0x15\n\ - adds r2, r6, 0\n\ - bl SetMonData\n\ - add sp, 0x20\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080FA0D8: .4byte gUnknown_08208238\n\ - .syntax divided"); -} - -void sub_80FA0DC(void) -{ - u16 i; - - SetMonMoveSlot(&gPlayerParty[gSpecialVar_0x8004], 0, gSpecialVar_0x8005); - RemoveMonPPBonus(&gPlayerParty[gSpecialVar_0x8004], gSpecialVar_0x8005); - - for(i = gSpecialVar_0x8005; i < 3; i++) - sub_80F9FDC(&gPlayerParty[gSpecialVar_0x8004], i, i + 1); -} - -void sub_80FA148(void) -{ - struct Pokemon *party = &gPlayerParty[gSpecialVar_0x8004]; - gScriptResult = 0; - - if(GetMonData(party, MON_DATA_IS_EGG)) - gScriptResult = 1; -} diff --git a/src/secret_base.c b/src/secret_base.c deleted file mode 100644 index 4e8331f5c..000000000 --- a/src/secret_base.c +++ /dev/null @@ -1,1075 +0,0 @@ -#include "global.h" -#include "secret_base.h" -#include "decoration.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_fadetransition.h" -#include "field_player_avatar.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "main.h" -#include "map_constants.h" -#include "map_name_popup.h" -#include "menu.h" -#include "metatile_behavior.h" -#include "palette.h" -#include "pokemon.h" -#include "rom4.h" -#include "script.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" -#include "vars.h" - -extern u8 gUnknown_020387DC; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; -extern u16 gSpecialVar_0x8007; -extern u16 gScriptResult; -extern const struct -{ - u16 unk_083D1358_0; - u16 unk_083D1358_1; -} gUnknown_083D1358[7]; -extern const u8 gUnknown_083D1374[4 * 16]; -extern void *gUnknown_0300485C; -extern const u8 gUnknown_083D13EC[12]; -extern u8 gUnknown_081A2E14[]; - - -void sub_80BB4AC(struct SecretBaseRecord *record) // 080bb4ac -{ - u16 i; - u16 j; - record->sbr_field_0 = 0; - for (i=0; i<7; i++) - record->sbr_field_2[i] = 0xff; - for (i=0; i<4; i++) - record->trainerId[i] = 0x00; - record->sbr_field_e = 0; - record->sbr_field_10 = 0; - record->sbr_field_11 = 0; - record->sbr_field_1_0 = 0; - record->gender = 0; - record->sbr_field_1_5 = 0; - record->sbr_field_1_6 = 0; - for (i=0; i<16; i++) { - record->decorations[i] = 0; - record->decorationPos[i] = 0; - } - for (i=0; i<6; i++) { - for (j=0; j<4; j++) { - record->partyMoves[i * 4 + j] = 0; - } - record->partyPersonality[i] = 0; - record->partyEVs[i] = 0; - record->partySpecies[i] = 0; - record->partyHeldItems[i] = 0; - record->partyLevels[i] = 0; - } -} - -void ResetSecretBase(u8 idx) // 80bb594 -{ - sub_80BB4AC(&(gSaveBlock1.secretBases[idx])); -} - -void ResetSecretBases(void) // 080bb5b4 -{ - u16 i; - for (i=0; i<20; i++) - ResetSecretBase(i); -} - -void sub_80BB5D0(void) // 080bb5d0 -{ - gUnknown_020387DC = gSpecialVar_0x8004; -} - -void sub_80BB5E4(void) // 80bb5e4 -{ - u16 idx; - gScriptResult = 0; - for (idx=0; idx<20; idx++) { - if (gUnknown_020387DC != gSaveBlock1.secretBases[idx].sbr_field_0) - continue; - gScriptResult = 1; - VarSet(VAR_0x4054, idx); - break; - } -} - -void sub_80BB63C(void) // 80bb63c -{ - if (gSaveBlock1.secretBases[0].sbr_field_0) - gScriptResult = 1; - else - gScriptResult = 0; -} - -u8 sub_80BB66C(void) // 80bb66c -{ - s16 x, y; - s16 v0; - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - v0 = MapGridGetMetatileBehaviorAt(x, y) & 0xFFF; - if (v0 == 0x90 || v0 == 0x91) - return 1; - else if (v0 == 0x92 || v0 == 0x93) - return 2; - else if (v0 == 0x9a || v0 == 0x9b) - return 3; - else if (v0 == 0x94 || v0 == 0x95) - return 4; - else if (v0 == 0x96 || v0 == 0x97 || v0 == 0x9c || v0 == 0x9d) - return 5; - else if (v0 == 0x98 || v0 == 0x99) - return 6; - return 0; -} - -void sub_80BB70C(void) // 80bb70c -{ - gSpecialVar_0x8007 = sub_80BB66C(); -} - -s16 unref_sub_80BB724(u16 *a0, u8 a1) -{ - u16 v2; - for (v2=0; v2<0x200; v2++) { - if ((a0[v2] & 0xFFF) == a1) - return (s16)v2; - } - return -1; -} - -void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3) -{ - s16 x, y; - for (y=0; yheight; y++) { - for (x=0; xwidth; x++) { - if ((gMapHeader.mapData->map[y * gMapHeader.mapData->width + x] & 0x3ff) == arg3) { - *arg1 = x; - *arg2 = y; - return; - } - } - } -} - -void sub_80BB800(void) -{ - s16 x, y; - s16 tile_id; - u16 idx; - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - tile_id = MapGridGetMetatileIdAt(x, y); - for (idx=0; idx<7; idx++) { - if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { - MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); - CurrentMapDrawMetatileAt(x, y); - return; - } - } - for (idx=0; idx<7; idx++) { - if (gUnknown_083D1358[idx].unk_083D1358_1 == tile_id) { - MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_0 | 0xc00); - CurrentMapDrawMetatileAt(x, y); - return; - } - } -} - -u8 sub_80BB8A8(u8 *arg1) -{ - u8 idx; - for (idx=0; idx<7; idx++) { - if (arg1[idx] == EOS) - return idx; - } - return 7; -} - -void sub_80BB8CC(void) -{ - u8 nameLength; - u16 idx; - gSaveBlock1.secretBases[0].sbr_field_0 = gUnknown_020387DC; - for (idx=0; idx<4; idx++) { - gSaveBlock1.secretBases[0].trainerId[idx] = gSaveBlock2.playerTrainerId[idx]; - } - VarSet(VAR_0x4054, 0); - nameLength = sub_80BB8A8(gSaveBlock2.playerName); - memset(gSaveBlock1.secretBases[0].sbr_field_2, 0xFF, 7); - StringCopyN(gSaveBlock1.secretBases[0].sbr_field_2, gSaveBlock2.playerName, nameLength); - gSaveBlock1.secretBases[0].gender = gSaveBlock2.playerGender; - VarSet(VAR_SECRET_BASE_MAP, gMapHeader.regionMapSectionId); -} - -void sub_80BB970(struct MapEvents *events) -{ - u16 bgevidx, idx, jdx; - s16 tile_id; - for (bgevidx=0; bgevidxbgEventCount; bgevidx++) { - if (events->bgEvents[bgevidx].kind == 8) { - for (jdx=0; jdx<20; jdx++) { - if (gSaveBlock1.secretBases[jdx].sbr_field_0 == events->bgEvents[bgevidx].bgUnion.secretBaseId) { - tile_id = MapGridGetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7); - for (idx=0; idx<7; idx++) { - if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { - MapGridSetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); - break; - } - } - break; - } - } - } - } -} - -void sub_80BBA14(void) -{ - s8 idx = 4 * (gUnknown_020387DC / 10); - warp1_set_2(MAP_GROUP_SECRET_BASE_RED_CAVE1, gUnknown_083D1374[idx], gUnknown_083D1374[idx + 1]); -} - -void sub_80BBA48(u8 taskid) -{ - u16 curbaseid; - switch (gTasks[taskid].data[0]) { - case 0: - gTasks[taskid].data[0] = 1; - break; - case 1: - if (!gPaletteFade.active) { - gTasks[taskid].data[0] = 2; - } - break; - case 2: - curbaseid = VarGet(VAR_0x4054); - if (gSaveBlock1.secretBases[curbaseid].sbr_field_10 < 0xff) - gSaveBlock1.secretBases[curbaseid].sbr_field_10 ++; - sub_80BBA14(); - warp_in(); - gFieldCallback = sub_8080990; - SetMainCallback2(CB2_LoadMap); - DestroyTask(taskid); - break; - } -} - -void sub_80BBAF0(void) -{ - CreateTask(sub_80BBA48, 0); - fade_screen(1, 0); - saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); -} - -bool8 sub_80BBB24(void) -{ - if (gMapHeader.mapType == 9 && VarGet(VAR_0x4097) == 0) - return FALSE; - return TRUE; -} - -void sub_80BBB50(u8 taskid) -{ - FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); - if (sub_807D770() == 1) { - EnableBothScriptContexts(); - DestroyTask(taskid); - } -} - -void sub_80BBB90(void) -{ - s16 x, y; - ScriptContext2_Enable(); - HideMapNamePopup(); - sub_80BB764(&x, &y, 0x220); - MapGridSetMetatileIdAt(x + 7, y + 7, 0xe20); - CurrentMapDrawMetatileAt(x + 7, y + 7); - pal_fill_black(); - CreateTask(sub_80BBB50, 0); -} - -void sub_80BBBEC(u8 taskid) -{ - s8 idx; - if (!gPaletteFade.active) { - idx = 4 * (gUnknown_020387DC / 10); - warp1_set(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gUnknown_083D1374[idx + 2], gUnknown_083D1374[idx + 3]); - warp_in(); - gFieldCallback = sub_80BBB90; - SetMainCallback2(CB2_LoadMap); - DestroyTask(taskid); - } -} - -void sub_80BBC78(void) -{ - u8 taskid = CreateTask(sub_80BBBEC, 0); - gTasks[taskid].data[0] = 0; - fade_screen(1, 0); -} - -bool8 CurrentMapIsSecretBase(void) -{ - if (gSaveBlock1.location.mapGroup == MAP_GROUP_SECRET_BASE_SHRUB4 && (u8)(gSaveBlock1.location.mapNum) <= MAP_ID_SECRET_BASE_SHRUB4) - return TRUE; - return FALSE; -} - -#ifdef NONMATCHING -void sub_80BBCCC(u8 flagIn) -{ - u16 curBaseId; - u16 x, y; - if (CurrentMapIsSecretBase()) { - curBaseId = VarGet(VAR_0x4054); - for (x=0; x<16; x++) { - if ((u8)(gSaveBlock1.secretBases[curBaseId].decorations[x] - 1) <= 0x77 && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].decor_field_11 != 4) { - sub_80FF394((gSaveBlock1.secretBases[0].decorationPos[x] >> 4) + 7, (gSaveBlock1.secretBases[0].decorationPos[x] & 0xF) + 7, gSaveBlock1.secretBases[curBaseId].decorations[x]); - } - } - if (curBaseId != 0) { - sub_80BB764(&x, &y, 0x220); - MapGridSetMetatileIdAt(x + 7, y + 7, 0xe21); - } else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) { - sub_80BB764(&x, &y, 0x220); - MapGridSetMetatileIdAt(x + 7, y + 7, 0xe0a); - } - } -} - -void sub_80BBDD0(void) -{ - u8 *roomdecor; - u8 *roomdecorpos; - u8 ndecor; - u8 decidx; - u8 objid = 0; - u8 metatile; - u16 curBase = VarGet(VAR_0x4054); - if (!CurrentMapIsSecretBase()) { - roomdecor = gSaveBlock1.playerRoomDecor; - roomdecorpos = gSaveBlock1.playerRoomDecorPos; - ndecor = 12; - } else { - roomdecor = gSaveBlock1.secretBases[curBase].decorations; - roomdecorpos = gSaveBlock1.secretBases[curBase].decorationPos; - ndecor = 16; - } - for (decidx=0; decidxmapObjectCount; objid++) { - if (gMapHeader.events->mapObjects[objid].flagId == gSpecialVar_0x8004 + 0xAE) - break; - } - if (objid != gMapHeader.events->mapObjectCount) { - gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4; - gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF; - metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7); - if (sub_80572D8(metatile) == 1 || sub_80572EC(metatile) == 1) { - gScriptResult = gMapHeader.events->mapObjects[objid].graphicsId + 0x3f20; - VarSet(gScriptResult, gDecorations[roomdecor[decidx]].tiles[0]); - gScriptResult = gMapHeader.events->mapObjects[objid].localId; - FlagReset(gSpecialVar_0x8004 + 0xAE); - show_sprite(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - sub_805C0F8(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); - sub_805C78C(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - gSpecialVar_0x8004 ++; - } - } - } -} - -#else -__attribute__((naked)) -void sub_80BBCCC(u8 flagIn) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - bl CurrentMapIsSecretBase\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080BBDBC\n\ - ldr r0, _080BBD70 @ =0x00004054\n\ - bl VarGet\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - movs r1, 0\n\ - mov r0, sp\n\ - strh r1, [r0]\n\ - ldr r6, _080BBD74 @ =gSaveBlock1\n\ - mov r4, sp\n\ - ldr r0, _080BBD78 @ =0x00001a2a\n\ - adds r7, r6, r0\n\ -_080BBCFC:\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 5\n\ - ldrh r1, [r4]\n\ - adds r2, r0, r1\n\ - ldr r1, _080BBD7C @ =0x00001a1a\n\ - adds r0, r6, r1\n\ - adds r1, r2, r0\n\ - ldrb r0, [r1]\n\ - subs r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x77\n\ - bhi _080BBD3A\n\ - ldr r0, _080BBD80 @ =gDecorations\n\ - ldrb r3, [r1]\n\ - lsls r1, r3, 5\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x11]\n\ - cmp r0, 0x4\n\ - beq _080BBD3A\n\ - adds r0, r2, r7\n\ - ldrb r2, [r0]\n\ - lsrs r0, r2, 4\n\ - adds r0, 0x7\n\ - movs r1, 0xF\n\ - ands r1, r2\n\ - adds r1, 0x7\n\ - adds r2, r3, 0\n\ - bl sub_80FF394\n\ -_080BBD3A:\n\ - ldrh r0, [r4]\n\ - adds r0, 0x1\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - strh r0, [r4]\n\ - cmp r0, 0xF\n\ - bls _080BBCFC\n\ - cmp r5, 0\n\ - beq _080BBD88\n\ - mov r4, sp\n\ - adds r4, 0x2\n\ - movs r2, 0x88\n\ - lsls r2, 2\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl sub_80BB764\n\ - mov r0, sp\n\ - ldrh r0, [r0]\n\ - adds r0, 0x7\n\ - ldrh r1, [r4]\n\ - adds r1, 0x7\n\ - ldr r2, _080BBD84 @ =0x00000e21\n\ - bl MapGridSetMetatileIdAt\n\ - b _080BBDBC\n\ - .align 2, 0\n\ -_080BBD70: .4byte 0x00004054\n\ -_080BBD74: .4byte gSaveBlock1\n\ -_080BBD78: .4byte 0x00001a2a\n\ -_080BBD7C: .4byte 0x00001a1a\n\ -_080BBD80: .4byte gDecorations\n\ -_080BBD84: .4byte 0x00000e21\n\ -_080BBD88:\n\ - mov r0, r8\n\ - cmp r0, 0x1\n\ - bne _080BBDBC\n\ - ldr r0, _080BBDC8 @ =0x00004089\n\ - bl VarGet\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x1\n\ - bne _080BBDBC\n\ - mov r4, sp\n\ - adds r4, 0x2\n\ - movs r2, 0x88\n\ - lsls r2, 2\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl sub_80BB764\n\ - mov r0, sp\n\ - ldrh r0, [r0]\n\ - adds r0, 0x7\n\ - ldrh r1, [r4]\n\ - adds r1, 0x7\n\ - ldr r2, _080BBDCC @ =0x00000e0a\n\ - bl MapGridSetMetatileIdAt\n\ -_080BBDBC:\n\ - add sp, 0x4\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080BBDC8: .4byte 0x00004089\n\ -_080BBDCC: .4byte 0x00000e0a\n\ -.syntax divided\n"); -} - -__attribute__((naked)) -void sub_80BBDD0(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - ldr r0, _080BBE00 @ =0x00004054\n\ - bl VarGet\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - bl CurrentMapIsSecretBase\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _080BBE08\n\ - ldr r0, _080BBE04 @ =gSaveBlock1 + 0x2688\n\ - str r0, [sp, 0x4]\n\ - adds r0, 0xC\n\ - str r0, [sp, 0x8]\n\ - movs r1, 0xC\n\ - str r1, [sp, 0xC]\n\ - b _080BBE1E\n\ - .align 2, 0\n\ -_080BBE00: .4byte 0x00004054\n\ -_080BBE04: .4byte gSaveBlock1 + 0x2688\n\ -_080BBE08:\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 5\n\ - ldr r0, _080BBF7C @ =gSaveBlock1 + 0x1A1A\n\ - adds r2, r1, r0\n\ - str r2, [sp, 0x4]\n\ - adds r0, 0x10\n\ - adds r1, r0\n\ - str r1, [sp, 0x8]\n\ - movs r3, 0x10\n\ - str r3, [sp, 0xC]\n\ -_080BBE1E:\n\ - movs r6, 0\n\ - ldr r4, [sp, 0xC]\n\ - cmp r6, r4\n\ - bcc _080BBE28\n\ - b _080BBF6C\n\ -_080BBE28:\n\ - ldr r5, _080BBF80 @ =gSaveBlock1\n\ - mov r10, r5\n\ -_080BBE2C:\n\ - ldr r1, [sp, 0x4]\n\ - adds r0, r1, r6\n\ - ldrb r1, [r0]\n\ - mov r9, r0\n\ - adds r2, r6, 0x1\n\ - str r2, [sp, 0x10]\n\ - cmp r1, 0\n\ - bne _080BBE3E\n\ - b _080BBF5E\n\ -_080BBE3E:\n\ - ldrb r0, [r0]\n\ - lsls r0, 5\n\ - ldr r3, _080BBF84 @ =gDecorations\n\ - adds r0, r3\n\ - ldrb r0, [r0, 0x11]\n\ - cmp r0, 0x4\n\ - beq _080BBE4E\n\ - b _080BBF5E\n\ -_080BBE4E:\n\ - movs r5, 0\n\ - ldr r0, _080BBF88 @ =gMapHeader\n\ - ldr r2, [r0, 0x4]\n\ - ldrb r3, [r2]\n\ - mov r8, r0\n\ - cmp r5, r3\n\ - bcs _080BBE8E\n\ - ldr r0, [r2, 0x4]\n\ - ldrh r1, [r0, 0x14]\n\ - ldr r4, _080BBF8C @ =gSpecialVar_0x8004\n\ - ldrh r0, [r4]\n\ - adds r0, 0xAE\n\ - adds r7, r4, 0\n\ - cmp r1, r0\n\ - beq _080BBE8E\n\ - adds r4, r2, 0\n\ - adds r2, r3, 0\n\ -_080BBE70:\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, r2\n\ - bcs _080BBE8E\n\ - ldr r1, [r4, 0x4]\n\ - lsls r0, r5, 1\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldrh r1, [r0, 0x14]\n\ - ldrh r0, [r7]\n\ - adds r0, 0xAE\n\ - cmp r1, r0\n\ - bne _080BBE70\n\ -_080BBE8E:\n\ - mov r1, r8\n\ - ldr r0, [r1, 0x4]\n\ - ldrb r0, [r0]\n\ - cmp r5, r0\n\ - beq _080BBF5E\n\ - ldr r7, _080BBF90 @ =gSpecialVar_0x8006\n\ - ldr r2, [sp, 0x8]\n\ - adds r1, r2, r6\n\ - ldrb r0, [r1]\n\ - lsrs r0, 4\n\ - strh r0, [r7]\n\ - ldr r6, _080BBF94 @ =gSpecialVar_0x8007\n\ - ldrb r1, [r1]\n\ - movs r0, 0xF\n\ - ands r0, r1\n\ - strh r0, [r6]\n\ - ldrh r0, [r7]\n\ - adds r0, 0x7\n\ - ldrh r1, [r6]\n\ - adds r1, 0x7\n\ - bl MapGridGetMetatileBehaviorAt\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - adds r0, r4, 0\n\ - bl sub_80572D8\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - beq _080BBEDA\n\ - adds r0, r4, 0\n\ - bl sub_80572EC\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _080BBF5E\n\ -_080BBEDA:\n\ - mov r3, r8\n\ - ldr r0, [r3, 0x4]\n\ - ldr r1, [r0, 0x4]\n\ - lsls r4, r5, 1\n\ - adds r4, r5\n\ - lsls r4, 3\n\ - adds r1, r4, r1\n\ - ldr r5, _080BBF98 @ =0x00003f20\n\ - adds r0, r5, 0\n\ - ldrb r1, [r1, 0x1]\n\ - adds r0, r1\n\ - ldr r1, _080BBF9C @ =gScriptResult\n\ - strh r0, [r1]\n\ - ldrh r0, [r1]\n\ - mov r2, r9\n\ - ldrb r1, [r2]\n\ - lsls r1, 5\n\ - ldr r3, _080BBFA0 @ =gDecorations + 0x1C\n\ - adds r1, r3\n\ - ldr r1, [r1]\n\ - ldrh r1, [r1]\n\ - bl VarSet\n\ - mov r5, r8\n\ - ldr r0, [r5, 0x4]\n\ - ldr r0, [r0, 0x4]\n\ - adds r4, r0\n\ - ldrb r0, [r4]\n\ - ldr r1, _080BBF9C @ =gScriptResult\n\ - strh r0, [r1]\n\ - ldr r2, _080BBF8C @ =gSpecialVar_0x8004\n\ - ldrh r0, [r2]\n\ - adds r0, 0xAE\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl FlagReset\n\ - ldr r3, _080BBF9C @ =gScriptResult\n\ - ldrb r0, [r3]\n\ - mov r4, r10\n\ - ldrb r1, [r4, 0x5]\n\ - ldrb r2, [r4, 0x4]\n\ - bl show_sprite\n\ - ldr r5, _080BBF9C @ =gScriptResult\n\ - ldrb r0, [r5]\n\ - ldrb r1, [r4, 0x5]\n\ - ldrb r2, [r4, 0x4]\n\ - movs r4, 0\n\ - ldrsh r3, [r7, r4]\n\ - movs r5, 0\n\ - ldrsh r4, [r6, r5]\n\ - str r4, [sp]\n\ - bl sub_805C0F8\n\ - ldr r1, _080BBF9C @ =gScriptResult\n\ - ldrb r0, [r1]\n\ - mov r2, r10\n\ - ldrb r1, [r2, 0x5]\n\ - ldrb r2, [r2, 0x4]\n\ - bl sub_805C78C\n\ - ldr r3, _080BBF8C @ =gSpecialVar_0x8004\n\ - ldrh r0, [r3]\n\ - adds r0, 0x1\n\ - strh r0, [r3]\n\ -_080BBF5E:\n\ - ldr r4, [sp, 0x10]\n\ - lsls r0, r4, 24\n\ - lsrs r6, r0, 24\n\ - ldr r5, [sp, 0xC]\n\ - cmp r6, r5\n\ - bcs _080BBF6C\n\ - b _080BBE2C\n\ -_080BBF6C:\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080BBF7C: .4byte gSaveBlock1 + 0x1A1A\n\ -_080BBF80: .4byte gSaveBlock1\n\ -_080BBF84: .4byte gDecorations\n\ -_080BBF88: .4byte gMapHeader\n\ -_080BBF8C: .4byte gSpecialVar_0x8004\n\ -_080BBF90: .4byte gSpecialVar_0x8006\n\ -_080BBF94: .4byte gSpecialVar_0x8007\n\ -_080BBF98: .4byte 0x00003f20\n\ -_080BBF9C: .4byte gScriptResult\n\ -_080BBFA0: .4byte gDecorations + 0x1C\n\ -.syntax divided\n"); -} -#endif - -void sub_80BBFA4(void) -{ - int curBase = VarGet(VAR_0x4054); - VarSet(VAR_0x401F, gUnknown_083D13EC[sub_80BCCA4(curBase)]); -} - -void sub_80BBFD8(s16 *position, struct MapEvents *events) -{ - s16 bgevtidx; - for (bgevtidx=0; bgevtidxbgEventCount; bgevtidx++) { - if (events->bgEvents[bgevtidx].kind == 8 && position[0] == events->bgEvents[bgevtidx].x + 7 && position[1] == events->bgEvents[bgevtidx].y + 7) { - gUnknown_020387DC = events->bgEvents[bgevtidx].bgUnion.secretBaseId; - break; - } - } -} - -void sub_80BC038(s16 *position, struct MapEvents *events) -{ - sub_80BBFD8(position, events); - sub_80BB5E4(); - ScriptContext1_SetupScript(gUnknown_081A2E14); -} - -bool8 sub_80BC050(void) -{ - sub_80BB5D0(); - sub_80BB5E4(); - if (gScriptResult == 1) - return FALSE; - return TRUE; -} - -void sub_80BC074(u8 taskid) -{ - switch (gTasks[taskid].data[0]) { - case 0: - ScriptContext2_Enable(); - gTasks[taskid].data[0] = 1; - break; - case 1: - if (!gPaletteFade.active) { - gTasks[taskid].data[0] = 2; - } - break; - case 2: - copy_saved_warp2_bank_and_enter_x_to_warp1(0x7E); - warp_in(); - gFieldCallback = mapldr_default; - SetMainCallback2(CB2_LoadMap); - ScriptContext2_Disable(); - DestroyTask(taskid); - break; - } -} - -void sub_80BC0F8(void) { - CreateTask(sub_80BC074, 0); - fade_screen(1, 0); -} - -void sub_80BC114(void) { - if (gSaveBlock1.secretBases[0].sbr_field_0 != gUnknown_020387DC) - gScriptResult = 1; - else - gScriptResult = 0; -} - -u8 sub_80BC14C(u8 sbid) -{ - s16 idx; - for (idx=0; idx<20; idx++) { - if (gSaveBlock1.secretBases[idx].sbr_field_0 == sbid) - return idx; - } - return 0; -} - -u8 *sub_80BC190(u8 *dest, u8 arg1) { // 80bc190 - u8 local1; - u8 *str; - - local1 = sub_80BB8A8(gSaveBlock1.secretBases[arg1].sbr_field_2); - - str = StringCopyN(dest, gSaveBlock1.secretBases[arg1].sbr_field_2, local1); - str[0] = EOS; - -#if ENGLISH - return StringAppend(dest, gOtherText_PlayersBase); -#elif GERMAN - return de_sub_8073174(dest, gOtherText_PlayersBase); -#endif -} - -u8 *GetSecretBaseMapName(u8 *dest) { - gUnknown_020387DC = gSaveBlock1.secretBases[VarGet(VAR_0x4054)].sbr_field_0; - return sub_80BC190(dest, VarGet(VAR_0x4054)); -} - -void sub_80BC224(void) { - u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_0x4054)].sbr_field_2; - u8 *var1 = gStringVar1; - u8 var2 = sub_80BB8A8(var0); - u8 *var3 = StringCopyN(var1, var0, var2); - *var3 = EOS; -} - -u8 sub_80BC268(u8 foo) { // 80bc268 - if (gSaveBlock1.secretBases[foo].sbr_field_1_6) - return 1; - return 0; -} - -u8 sub_80BC298(struct Pokemon *mon) { // 80bc298 - u16 evsum = GetMonData(mon, MON_DATA_HP_EV); - evsum += GetMonData(mon, MON_DATA_ATK_EV); - evsum += GetMonData(mon, MON_DATA_DEF_EV); - evsum += GetMonData(mon, MON_DATA_SPD_EV); - evsum += GetMonData(mon, MON_DATA_SPATK_EV); - evsum += GetMonData(mon, MON_DATA_SPDEF_EV); - return (u8)(evsum / 6); -} - -#ifdef NONMATCHING -void sub_80BC300(void) -{ - u16 moveidx; - u16 sbpartyidx = 0; - int resetVal = 0; - u16 partyidx = 0; - while (partyidx < 6) { - partyidx ++; - for (moveidx=0; moveidx<4; moveidx++) { - gSaveBlock1.secretBases[0].partyMoves[(partyidx - 1) * 6 + moveidx] = resetVal; - } - gSaveBlock1.secretBases[0].partySpecies[partyidx - 1] = resetVal; - gSaveBlock1.secretBases[0].partyHeldItems[partyidx - 1] = resetVal; - gSaveBlock1.secretBases[0].partyLevels[partyidx - 1] = resetVal; - gSaveBlock1.secretBases[0].partyPersonality[partyidx - 1] = resetVal; - gSaveBlock1.secretBases[0].partyEVs[partyidx - 1] = resetVal; - if (GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_SPECIES) != 0 && !GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_IS_EGG)) { - sbpartyidx ++; - for (moveidx=0; moveidx<4; moveidx++) { - gSaveBlock1.secretBases[0].partyMoves[(sbpartyidx - 1) * 6 + moveidx] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_MOVE1 + moveidx); - } - gSaveBlock1.secretBases[0].partySpecies[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_SPECIES); - gSaveBlock1.secretBases[0].partyHeldItems[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_HELD_ITEM); - gSaveBlock1.secretBases[0].partyLevels[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_LEVEL); - gSaveBlock1.secretBases[0].partyPersonality[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_PERSONALITY); - gSaveBlock1.secretBases[0].partyEVs[sbpartyidx - 1] = sub_80BC298(&(gPlayerParty[partyidx - 1])); - } - } -} -#else -__attribute__((naked)) -void sub_80BC300(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0xC\n\ - movs r0, 0\n\ - mov r10, r0\n\ - movs r6, 0\n\ - mov r9, r6\n\ -_080BC314:\n\ - movs r4, 0\n\ - lsls r3, r6, 2\n\ - lsls r2, r6, 1\n\ - ldr r7, _080BC424 @ =gPlayerParty\n\ - adds r1, r6, 0x1\n\ - str r1, [sp]\n\ - adds r1, r3, 0\n\ -_080BC322:\n\ - adds r0, r1, r4\n\ - lsls r0, 1\n\ - ldr r5, _080BC428 @ =gSaveBlock1 + 0x1A54\n\ - adds r0, r5, r0\n\ - mov r5, r9\n\ - strh r5, [r0]\n\ - adds r0, r4, 0x1\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - cmp r4, 0x3\n\ - bls _080BC322\n\ - ldr r1, _080BC42C @ =gSaveBlock1 + 0x1A84\n\ - adds r0, r1, r2\n\ - strh r5, [r0]\n\ - ldr r5, _080BC430 @ =gSaveBlock1 + 0x1A90\n\ - adds r0, r5, r2\n\ - mov r1, r9\n\ - strh r1, [r0]\n\ - ldr r2, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\ - adds r0, r2, r6\n\ - mov r5, r9\n\ - strb r5, [r0]\n\ - ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\ - adds r0, r1, r3\n\ - mov r2, r9\n\ - str r2, [r0]\n\ - ldr r3, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\ - adds r0, r3, r6\n\ - strb r2, [r0]\n\ - movs r0, 0x64\n\ - adds r5, r6, 0\n\ - muls r5, r0\n\ - adds r4, r5, r7\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _080BC408\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _080BC408\n\ - movs r4, 0\n\ - mov r0, r10\n\ - lsls r0, 2\n\ - mov r8, r0\n\ - mov r1, r10\n\ - lsls r7, r1, 1\n\ - adds r1, 0x1\n\ - str r1, [sp, 0x4]\n\ - ldr r2, _080BC424 @ =gPlayerParty\n\ -_080BC38E:\n\ - adds r1, r4, 0\n\ - adds r1, 0xD\n\ - adds r0, r5, r2\n\ - str r2, [sp, 0x8]\n\ - bl GetMonData\n\ - mov r3, r8\n\ - adds r1, r3, r4\n\ - lsls r1, 1\n\ - ldr r3, _080BC428 @ =gSaveBlock1 + 0x1A54\n\ - adds r1, r3, r1\n\ - strh r0, [r1]\n\ - adds r0, r4, 0x1\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - ldr r2, [sp, 0x8]\n\ - cmp r4, 0x3\n\ - bls _080BC38E\n\ - movs r0, 0x64\n\ - adds r4, r6, 0\n\ - muls r4, r0\n\ - ldr r0, _080BC424 @ =gPlayerParty\n\ - adds r4, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - ldr r5, _080BC42C @ =gSaveBlock1 + 0x1A84\n\ - adds r1, r5, r7\n\ - strh r0, [r1]\n\ - adds r0, r4, 0\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - ldr r2, _080BC430 @ =gSaveBlock1 + 0x1A90\n\ - adds r1, r2, r7\n\ - strh r0, [r1]\n\ - adds r0, r4, 0\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - ldr r1, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\ - add r1, r10\n\ - strb r0, [r1]\n\ - adds r0, r4, 0\n\ - movs r1, 0\n\ - bl GetMonData\n\ - ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\ - add r1, r8\n\ - str r0, [r1]\n\ - adds r0, r4, 0\n\ - bl sub_80BC298\n\ - ldr r1, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\ - add r1, r10\n\ - strb r0, [r1]\n\ - ldr r3, [sp, 0x4]\n\ - lsls r0, r3, 16\n\ - lsrs r0, 16\n\ - mov r10, r0\n\ -_080BC408:\n\ - ldr r5, [sp]\n\ - lsls r0, r5, 16\n\ - lsrs r6, r0, 16\n\ - cmp r6, 0x5\n\ - bls _080BC314\n\ - add sp, 0xC\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080BC424: .4byte gPlayerParty\n\ -_080BC428: .4byte gSaveBlock1 + 0x1A54\n\ -_080BC42C: .4byte gSaveBlock1 + 0x1A84\n\ -_080BC430: .4byte gSaveBlock1 + 0x1A90\n\ -_080BC434: .4byte gSaveBlock1 + 0x1A9C\n\ -_080BC438: .4byte gSaveBlock1 + 0x1A3C\n\ -_080BC43C: .4byte gSaveBlock1 + 0x1AA2\n\ -.syntax divided\n"); -} -#endif - -void sub_80BC440(void) -{ - u16 backupValue = gSaveBlock1.secretBases[0].sbr_field_e; - ResetSecretBase(0); - gSaveBlock1.secretBases[0].sbr_field_e = backupValue; - sub_80BC0F8(); -} - -void SecretBasePC_PackUp(void) -{ - IncrementGameStat(20); - sub_80BC440(); -} diff --git a/src/shop.c b/src/shop.c deleted file mode 100644 index d53646a88..000000000 --- a/src/shop.c +++ /dev/null @@ -1,342 +0,0 @@ -#include "global.h" -#include "shop.h" -#include "decompress.h" -#include "field_fadetransition.h" -#include "field_weather.h" -#include "item_menu.h" -#include "main.h" -#include "menu.h" -#include "menu_helpers.h" -#include "money.h" -#include "palette.h" -#include "script.h" -#include "sound.h" -#include "sprite.h" -#include "strings.h" -#include "task.h" -#include "tv.h" -#include "unknown_task.h" - -struct UnknownShopStruct -{ - /* 0x0 */ void (* callback) (void); - /* 0x4 */ u16 *itemList; - /* 0x8 */ u8 itemCount; - /* 0x9 */ u8 unk9; - /* 0xA */ u8 unkA; - /* 0xB */ u8 unkB; - /* 0xC */ bool8 unkC; - // unknown size -}; - -extern struct UnknownShopStruct gUnknown_03000708; -extern struct MenuAction gUnknown_083CC6D0[]; - -extern u8 gUnknown_083CC6E8[]; -extern u8 gUnknown_083CC6EB[]; -extern u8 gBuyMenuFrame_Gfx[]; - -extern u16 gBuyMenuFrame_Tilemap[]; -extern u16 gMenuMoneyPal[16]; -extern u16 gUnknown_083CC710[2]; - -u8 CreateShopMenu(bool8 var) -{ - ScriptContext2_Enable(); - gUnknown_03000708.unkC = var; - gUnknown_03000708.unk9 = 0; - - if(var == FALSE) - { - gUnknown_03000708.unkA = 2; - MenuDrawTextWindow(0, 0, 10, 7); - PrintMenuItemsReordered(1, 1, 3, gUnknown_083CC6D0, (u8 *)gUnknown_083CC6E8); - } - else - { - gUnknown_03000708.unkA = 1; - MenuDrawTextWindow(0, 0, 10, 5); - PrintMenuItemsReordered(1, 1, 2, gUnknown_083CC6D0, (u8 *)gUnknown_083CC6EB); - } - InitMenu(0, 1, 1, gUnknown_03000708.unkA + 1, 0, 9); - - return CreateTask(sub_80B2E38, 8); -} - -void SetShopMenuCallback(void *callbackPtr) -{ - gUnknown_03000708.callback = callbackPtr; -} - -void SetShopItemsForSale(u16 *items) -{ - u16 i = 0; - - gUnknown_03000708.itemList = items; - gUnknown_03000708.itemCount = 0; - - while (gUnknown_03000708.itemList[i]) - { - gUnknown_03000708.itemCount++; - i++; - } -} - -void sub_80B2E38(u8 var) -{ - const u8 local = var; - - if(gMain.newAndRepeatedKeys & 0x40) - { - if(gUnknown_03000708.unk9) - { - PlaySE(0x5); - gUnknown_03000708.unk9 = MoveMenuCursor(-1); - } - } - else if(gMain.newAndRepeatedKeys & 0x80) - { - if(gUnknown_03000708.unk9 != gUnknown_03000708.unkA) - { - PlaySE(0x5); - gUnknown_03000708.unk9 = MoveMenuCursor(1); - } - } - else if (gMain.newKeys & 1) - { - PlaySE(0x5); - if(!gUnknown_03000708.unkC) - { - gUnknown_083CC6D0[gUnknown_083CC6E8[gUnknown_03000708.unk9]].func(local); - } - else - { - gUnknown_083CC6D0[gUnknown_083CC6EB[gUnknown_03000708.unk9]].func(local); - } - } - else if(gMain.newKeys & 2) - { - PlaySE(0x5); - HandleShopMenuQuit(local); - } -} - -void sub_80B2EFC(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)BuyMenuDrawGraphics >> 16; - gTasks[taskId].data[9] = (u32)BuyMenuDrawGraphics; - gTasks[taskId].func = sub_80B2FA0; - fade_screen(1, 0); -} - -void sub_80B2F30(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); -} - -void HandleShopMenuQuit(u8 taskId) -{ - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 11, 8); - sub_80BE3BC(); // in tv.s? - ScriptContext2_Disable(); - DestroyTask(taskId); - - if(gUnknown_03000708.callback) - gUnknown_03000708.callback(); // run the callback if it exists. -} - -void sub_80B2FA0(u8 taskId) -{ - if(!gPaletteFade.active) - { - SetMainCallback2((void *)((u16)gTasks[taskId].data[8] << 16 | (u16)gTasks[taskId].data[9])); - DestroyTask(taskId); - } -} - -void ReturnToShopMenuAfterExitingSellMenu(u8 taskId) -{ - CreateShopMenu(gUnknown_03000708.unkC); - DestroyTask(taskId); -} - -void Task_ExitSellMenu(u8 taskId) -{ - if(sub_807D770() == 1) - { - if(gUnknown_03000708.unkC == 2) - DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0); - else - DisplayItemMessageOnField(taskId, gOtherText_AnythingElse, ReturnToShopMenuAfterExitingSellMenu, 0); - } -} - -void sub_80B3050(void) -{ - pal_fill_black(); - CreateTask(Task_ExitSellMenu, 0x8); -} - -void sub_80B3068(u8 taskId) -{ - Task_ExitSellMenu(taskId); -} - -void unref_sub_80B3078(u8 taskId) -{ - gTasks[taskId].func = Task_ExitSellMenu; -} - -void sub_80B3094(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - UpdatePaletteFade(); -} - -void sub_80B30AC(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); -} - -// this function is fugly. pls fix -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; - gPaletteFade.bufferTransferDisabled = 1; - addr = (void*)OAM; - { - register const u32 zero asm("r6") = 0; - DmaFill32(3, zero, addr, OAM_SIZE); - LZDecompressVram(gBuyMenuFrame_Gfx, (void*)(VRAM + 0x7C00)); - sub_800D238(gBuyMenuFrame_Tilemap, (void *)0x02018000); - LoadCompressedPalette(gMenuMoneyPal, 0xC0, sizeof(gMenuMoneyPal)); - FreeAllSpritePalettes(); - ResetPaletteFade(); - ResetSpriteData(); - ResetTasks(); - SetUpWindowConfig(&gWindowConfig_81E6DFC); - InitMenuWindow(&gWindowConfig_81E6DFC); - BuyMenuDrawMapGraphics(); - gUnknown_03000708.unk9 = zero; - gUnknown_03000708.unkB = zero2; - MenuZeroFillWindowRect(0, 0, 0x20, 0x20); - sub_80B7C14(gSaveBlock1.money, 0, 0); - sub_80B3764(0, 7); - sub_80B37EC(); - sub_80B3270(); - CreateTask(sub_80B40E8, 0x8); - sub_80B3240(); - asm("":::"r4"); // what?? - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, zero); - gPaletteFade.bufferTransferDisabled = 0; - SetVBlankCallback(sub_80B30AC); - SetMainCallback2(sub_80B3094); - } -} - -void sub_80B3240(void) -{ - u16 tempArr[2]; - - memcpy(tempArr, gUnknown_083CC710, sizeof(tempArr)); - LoadPalette(&tempArr[1], 0xD1, 2); - LoadPalette(&tempArr[0], 0xD8, 2); -} - -void sub_80B3270(void) -{ - sub_80F944C(); - - if(gUnknown_03000708.itemCount > 7) - { - CreateVerticalScrollIndicators(0, 172, 12); - CreateVerticalScrollIndicators(1, 172, 148); - sub_80F979C(0, 1); - } -} - -void sub_80B32A4(void) -{ - if(gUnknown_03000708.unkB == 0) - sub_80F979C(0, 1); - else - sub_80F979C(0, 0); - - if(gUnknown_03000708.unkB + 7 >= gUnknown_03000708.itemCount) - sub_80F979C(1, 1); - else - sub_80F979C(1, 0); -} - -void sub_80B32EC(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) -{ - array[offset1 + offset2] = array2[0]; - array[offset1 + offset2 + 1] = array2[1]; - array[offset1 + offset2 + 32] = array2[2]; - array[offset1 + offset2 + 33] = array2[3]; -} - -void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s8 var4) -{ - u8 tempVar4 = var4; - s16 offset1 = var1 * 2; - s16 offset2 = (var2 * 0x40) + 0x40; - - switch(tempVar4) - { - case 0: // _080B335C - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3); - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4); - break; - case 1: // _080B3364 - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4); - break; - case 2: // _080B3398 - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4); - break; - } -} diff --git a/src/siirtc.c b/src/siirtc.c deleted file mode 100644 index 965a068f1..000000000 --- a/src/siirtc.c +++ /dev/null @@ -1,432 +0,0 @@ -// Ruby/Sapphire/Emerald cartridges contain a Seiko Instruments Inc. (SII) -// S-3511A real-time clock (RTC). This library ("SIIRTC_V001") is for -// communicating with the RTC. - -#include "gba/gba.h" -#include "siirtc.h" - -#define STATUS_INTFE 0x02 // frequency interrupt enable -#define STATUS_INTME 0x08 // per-minute interrupt enable -#define STATUS_INTAE 0x20 // alarm interrupt enable -#define STATUS_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode -#define STATUS_POWER 0x80 // power on or power failure occurred - -#define TEST_MODE 0x80 // flag in the "second" byte - -#define ALARM_AM 0x00 -#define ALARM_PM 0x80 - -#define OFFSET_YEAR offsetof(struct SiiRtcInfo, year) -#define OFFSET_MONTH offsetof(struct SiiRtcInfo, month) -#define OFFSET_DAY offsetof(struct SiiRtcInfo, day) -#define OFFSET_DAY_OF_WEEK offsetof(struct SiiRtcInfo, dayOfWeek) -#define OFFSET_HOUR offsetof(struct SiiRtcInfo, hour) -#define OFFSET_MINUTE offsetof(struct SiiRtcInfo, minute) -#define OFFSET_SECOND offsetof(struct SiiRtcInfo, second) -#define OFFSET_STATUS offsetof(struct SiiRtcInfo, status) -#define OFFSET_ALARM_HOUR offsetof(struct SiiRtcInfo, alarmHour) -#define OFFSET_ALARM_MINUTE offsetof(struct SiiRtcInfo, alarmMinute) - -#define INFO_BUF(info, index) (*((u8 *)(info) + (index))) - -#define DATETIME_BUF(info, index) INFO_BUF(info, OFFSET_YEAR + index) -#define DATETIME_BUF_LEN (OFFSET_SECOND - OFFSET_YEAR + 1) - -#define TIME_BUF(info, index) INFO_BUF(info, OFFSET_HOUR + index) -#define TIME_BUF_LEN (OFFSET_SECOND - OFFSET_HOUR + 1) - -#define WR 0 // command for writing data -#define RD 1 // command for reading data - -#define CMD(n) (0x60 | (n << 1)) - -#define CMD_RESET CMD(0) -#define CMD_STATUS CMD(1) -#define CMD_DATETIME CMD(2) -#define CMD_TIME CMD(3) -#define CMD_ALARM CMD(4) - -#define GPIO_PORT_DATA (*(vu16 *)0x80000C4) -#define GPIO_PORT_DIRECTION (*(vu16 *)0x80000C6) -#define GPIO_PORT_READ_ENABLE (*(vu16 *)0x80000C8) - -extern vu16 GPIOPortDirection; - -static u16 sDummy; // unused variable -static bool8 sLocked; - -static int WriteCommand(u8 value); -static int WriteData(u8 value); -static u8 ReadData(); -static void EnableGpioPortRead(); -static void DisableGpioPortRead(); - -static const char AgbLibRtcVersion[] = "SIIRTC_V001"; - -void SiiRtcUnprotect() -{ - EnableGpioPortRead(); - sLocked = FALSE; -} - -void SiiRtcProtect() -{ - DisableGpioPortRead(); - sLocked = TRUE; -} - -u8 SiiRtcProbe() -{ - u8 errorCode; - struct SiiRtcInfo rtc; - - if (!SiiRtcGetStatus(&rtc)) - return 0; - - errorCode = 0; - - if ((rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == SIIRTCINFO_POWER - || (rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == 0) - { - // The RTC is in 12-hour mode. Reset it and switch to 24-hour mode. - - // Note that the conditions are redundant and equivalent to simply - // "(rtc.status & SIIRTCINFO_24HOUR) == 0". It's possible that this - // was also intended to handle resetting the clock after power failure - // but a mistake was made. - - if (!SiiRtcReset()) - return 0; - - errorCode++; - } - - SiiRtcGetTime(&rtc); - - if (rtc.second & TEST_MODE) - { - // The RTC is in test mode. Reset it to leave test mode. - - if (!SiiRtcReset()) - return (errorCode << 4) & 0xF0; - - errorCode++; - } - - return (errorCode << 4) | 1; -} - -bool8 SiiRtcReset() -{ - u8 result; - struct SiiRtcInfo rtc; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_RESET | WR); - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - rtc.status = SIIRTCINFO_24HOUR; - - result = SiiRtcSetStatus(&rtc); - - return result; -} - -bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc) -{ - u8 statusData; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_STATUS | RD); - - GPIO_PORT_DIRECTION = 5; - - statusData = ReadData(); - - rtc->status = (statusData & (STATUS_POWER | STATUS_24HOUR)) - | ((statusData & STATUS_INTAE) >> 3) - | ((statusData & STATUS_INTME) >> 2) - | ((statusData & STATUS_INTFE) >> 1); - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc) -{ - u8 statusData; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - statusData = STATUS_24HOUR - | ((rtc->status & SIIRTCINFO_INTAE) << 3) - | ((rtc->status & SIIRTCINFO_INTME) << 2) - | ((rtc->status & SIIRTCINFO_INTFE) << 1); - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_STATUS | WR); - - WriteData(statusData); - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc) -{ - u8 i; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_DATETIME | RD); - - GPIO_PORT_DIRECTION = 5; - - for (i = 0; i < DATETIME_BUF_LEN; i++) - DATETIME_BUF(rtc, i) = ReadData(); - - INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc) -{ - u8 i; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_DATETIME | WR); - - for (i = 0; i < DATETIME_BUF_LEN; i++) - WriteData(DATETIME_BUF(rtc, i)); - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc) -{ - u8 i; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_TIME | RD); - - GPIO_PORT_DIRECTION = 5; - - for (i = 0; i < TIME_BUF_LEN; i++) - TIME_BUF(rtc, i) = ReadData(); - - INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc) -{ - u8 i; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_TIME | WR); - - for (i = 0; i < TIME_BUF_LEN; i++) - WriteData(TIME_BUF(rtc, i)); - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc) -{ - u8 i; - u8 alarmData[2]; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - // Decode BCD. - alarmData[0] = (rtc->alarmHour & 0xF) + 10 * ((rtc->alarmHour >> 4) & 0xF); - - // The AM/PM flag must be set correctly even in 24-hour mode. - - if (alarmData[0] < 12) - alarmData[0] = rtc->alarmHour | ALARM_AM; - else - alarmData[0] = rtc->alarmHour | ALARM_PM; - - alarmData[1] = rtc->alarmMinute; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIOPortDirection = 7; // Why is this the only instance that uses a symbol? - - WriteCommand(CMD_ALARM | WR); - - for (i = 0; i < 2; i++) - WriteData(alarmData[i]); - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -static int WriteCommand(u8 value) -{ - u8 i; - u8 temp; - - for (i = 0; i < 8; i++) - { - temp = ((value >> (7 - i)) & 1); - GPIO_PORT_DATA = (temp << 1) | 4; - GPIO_PORT_DATA = (temp << 1) | 4; - GPIO_PORT_DATA = (temp << 1) | 4; - GPIO_PORT_DATA = (temp << 1) | 5; - } - - // control reaches end of non-void function -} - -static int WriteData(u8 value) -{ - u8 i; - u8 temp; - - for (i = 0; i < 8; i++) - { - temp = ((value >> i) & 1); - GPIO_PORT_DATA = (temp << 1) | 4; - GPIO_PORT_DATA = (temp << 1) | 4; - GPIO_PORT_DATA = (temp << 1) | 4; - GPIO_PORT_DATA = (temp << 1) | 5; - } - - // control reaches end of non-void function -} - -static u8 ReadData() -{ - u8 i; - u8 temp; - u8 value; - - for (i = 0; i < 8; i++) - { - GPIO_PORT_DATA = 4; - GPIO_PORT_DATA = 4; - GPIO_PORT_DATA = 4; - GPIO_PORT_DATA = 4; - GPIO_PORT_DATA = 4; - GPIO_PORT_DATA = 5; - - temp = ((GPIO_PORT_DATA & 2) >> 1); - value = (value >> 1) | (temp << 7); // UB: accessing uninitialized var - } - - return value; -} - -static void EnableGpioPortRead() -{ - GPIO_PORT_READ_ENABLE = 1; -} - -static void DisableGpioPortRead() -{ - GPIO_PORT_READ_ENABLE = 0; -} diff --git a/src/slot_machine.c b/src/slot_machine.c deleted file mode 100644 index c9a06a758..000000000 --- a/src/slot_machine.c +++ /dev/null @@ -1,150 +0,0 @@ -#include "global.h" -#include "slot_machine.h" -#include "decompress.h" -#include "palette.h" -#include "task.h" - -struct UnkStruct2000000 { - /*0x00*/ u8 filler00[61]; - /*0x3D*/ u8 unk3D; -}; - -struct UnkStruct1 { - /*0x00*/ u8 unk00; - /*0x01*/ u8 unk01; - /*0x02*/ s16 unk02; -}; - -extern struct UnkStruct2000000 unk_2000000; - -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[]; - -extern u16 gUnknown_08E95AB8[]; -extern u16 gUnknown_08E95FB8[]; - -static void LoadSlotMachineWheelOverlay(void); - -void sub_8104CAC(u8 arg0) { - u8 i; - struct Task *task; - - sub_8104DA4(); - - task = &gTasks[unk_2000000.unk3D]; - task->data[1] = arg0; - - i = 0; - while (gUnknown_083ED048[arg0][i].unk00 != 0xFF) - { - u8 spriteId; - spriteId = sub_8105BB4( - gUnknown_083ED048[arg0][i].unk00, - gUnknown_083ED048[arg0][i].unk01, - gUnknown_083ED048[arg0][i].unk02 - ); - task->data[4 + i] = spriteId; - -#ifdef GERMAN - if (arg0 == 5 && i <= 2) - { - gSprites[spriteId].invisible = TRUE; - } -#endif - - i += 1; - } -} - -asm(".section .text_b"); - -void sub_8106448(void) { - u32 offsetRead, offsetWrite; - u32 size; - - sub_800D238(gSlotMachine_Gfx, (void *) 0x02010000); - - offsetRead = 0x02010000; - offsetWrite = BG_VRAM; - size = SLOTMACHINE_GFX_TILES * 32; - while (TRUE) - { - DmaCopy16(3, offsetRead, (void *) (offsetWrite), 0x1000); - offsetRead += 0x1000; - offsetWrite += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaCopy16(3, offsetRead, (void *) (offsetWrite), size); - break; - } - } - - LoadPalette(gUnknown_08E95A18, 0, 160); - LoadPalette(gPalette_83EDE24, 208, 32); -} - -void sub_81064B8(void) { - CpuCopy16(gUnknown_08E95AB8, (void *) BG_SCREEN_ADDR(29), 20 * 32 * 2); - LoadSlotMachineWheelOverlay(); -} - -static void LoadSlotMachineWheelOverlay(void) { - s16 x, y, dx; - u16 *screen; - - screen = (u16 *) BG_SCREEN_ADDR(30); - - for (x = 4; x < 18; x += 5) - { - for (dx = 0; dx < 4; dx++) - { - screen[5 * 32 + dx + x] = 0x2051; - screen[13 * 32 + dx + x] = 0x2851; - screen[6 * 32 + dx + x] = 0x2061; - screen[12 * 32 + dx + x] = 0x2861; - } - - screen[6 * 32 + x] = 0x20BE; - screen[12 * 32 + x] = 0x28BE; - - for (y = 7; y <= 11; y++) - { - screen[y * 32 + x] = 0x20BF; - } - } -} - -void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) { - u16 *vram = (u16 *) BG_SCREEN_ADDR(29); - - vram[15 * 32 + arg0] = arg1; - vram[15 * 32 + 1 + arg0] = arg2; - vram[16 * 32 + arg0] = arg3; - vram[16 * 32 + 1 + arg0] = arg4; -} - -void sub_81065DC(void) { - s16 y, x; - u16 *screen; - - CpuCopy16(gUnknown_08E95FB8, (void *) BG_SCREEN_ADDR(29), 20 * 32 * 2); - - screen = (u16 *) BG_SCREEN_ADDR(30); - for (y = 0; y < 20; y++) - { - for (x = 0; x < 30; x++) - { - screen[x + y * 32] = 0; - } - } -} diff --git a/src/smokescreen.c b/src/smokescreen.c deleted file mode 100644 index 8345cb6ad..000000000 --- a/src/smokescreen.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "decompress.h" -#include "sprite.h" -#include "util.h" - - -static void sub_8046388(struct Sprite *); - - -u8 sub_8046234(s16 x, s16 y, u8 a3) -{ - u8 mainSpriteId; - u8 spriteId1, spriteId2, spriteId3, spriteId4; - struct Sprite *mainSprite; - - if (GetSpriteTileStartByTag(gUnknown_081FAEA4.tag) == 0xFFFF) - { - LoadCompressedObjectPic(&gUnknown_081FAEA4); - LoadCompressedObjectPalette(&gUnknown_081FAEAC); - } - - mainSpriteId = CreateInvisibleSpriteWithCallback(sub_8046388); - mainSprite = &gSprites[mainSpriteId]; - mainSprite->data1 = a3; - - spriteId1 = CreateSprite(&gSpriteTemplate_81FAF0C, x - 16, y - 16, 2); - gSprites[spriteId1].data0 = mainSpriteId; - mainSprite->data0++; - AnimateSprite(&gSprites[spriteId1]); - - spriteId2 = CreateSprite(&gSpriteTemplate_81FAF0C, x, y - 16, 2); - gSprites[spriteId2].data0 = mainSpriteId; - mainSprite->data0++; - StartSpriteAnim(&gSprites[spriteId2], 1); - AnimateSprite(&gSprites[spriteId2]); - - spriteId3 = CreateSprite(&gSpriteTemplate_81FAF0C, x - 16, y, 2); - gSprites[spriteId3].data0 = mainSpriteId; - mainSprite->data0++; - StartSpriteAnim(&gSprites[spriteId3], 2); - AnimateSprite(&gSprites[spriteId3]); - - spriteId4 = CreateSprite(&gSpriteTemplate_81FAF0C, x, y, 2); - gSprites[spriteId4].data0 = mainSpriteId; - mainSprite->data0++; - StartSpriteAnim(&gSprites[spriteId4], 3); - AnimateSprite(&gSprites[spriteId4]); - - return mainSpriteId; -} - -static void sub_8046388(struct Sprite *sprite) -{ - if (!sprite->data0) - { - FreeSpriteTilesByTag(gUnknown_081FAEA4.tag); - FreeSpritePaletteByTag(gUnknown_081FAEAC.tag); - if (!sprite->data1) - DestroySprite(sprite); - else - sprite->callback = SpriteCallbackDummy; - } -} - -void sub_80463CC(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - gSprites[sprite->data0].data0--; - DestroySprite(sprite); - } -} diff --git a/src/sound.c b/src/sound.c deleted file mode 100644 index 8d23b7d7a..000000000 --- a/src/sound.c +++ /dev/null @@ -1,585 +0,0 @@ -#include "global.h" -#include "gba/m4a_internal.h" -#include "sound.h" -#include "battle.h" -#include "m4a.h" -#include "main.h" -#include "songs.h" -#include "task.h" - -struct Fanfare -{ - u16 songNum; - u16 duration; -}; - -// FIXME: different prototype than definition -u32 SpeciesToCryId(u32); - -extern u16 gBattleTypeFlags; - -static EWRAM_DATA struct MusicPlayerInfo *gMPlay_PokemonCry = NULL; -static EWRAM_DATA u8 gPokemonCryBGMDuckingCounter = 0; - -static u16 sCurrentMapMusic; -static u16 sNextMapMusic; -static u8 sMapMusicState; -static u8 sMapMusicFadeInSpeed; -static u16 sFanfareCounter; - -bool8 gDisableMusic; - -extern struct MusicPlayerInfo gMPlay_BGM; -extern struct MusicPlayerInfo gMPlay_SE1; -extern struct MusicPlayerInfo gMPlay_SE2; -extern struct MusicPlayerInfo gMPlay_SE3; - -extern struct ToneData voicegroup_8452590[]; -extern struct ToneData voicegroup_8452B90[]; -extern struct ToneData voicegroup_8453190[]; -extern struct ToneData voicegroup_8453790[]; - -extern struct ToneData voicegroup_84537C0[]; -extern struct ToneData voicegroup_8453DC0[]; -extern struct ToneData voicegroup_84543C0[]; -extern struct ToneData voicegroup_84549C0[]; - -static const struct Fanfare sFanfares[] = -{ - { BGM_FANFA1, 80 }, - { BGM_FANFA4, 160 }, - { BGM_FANFA5, 220 }, - { BGM_ME_WAZA, 220 }, - { BGM_ME_ASA, 160 }, - { BGM_ME_BACHI, 340 }, - { BGM_ME_WASURE, 180 }, - { BGM_ME_KINOMI, 120 }, - { BGM_ME_TAMA, 710 }, - { BGM_ME_B_BIG, 250 }, - { BGM_ME_B_SMALL, 150 }, - { BGM_ME_ZANNEN, 160 }, -}; - -static void Task_Fanfare(u8 taskId); -static void CreateFanfareTask(void); -static void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode); -static void Task_DuckBGMForPokemonCry(u8 taskId); -static void RestoreBGMVolumeAfterPokemonCry(void); - -void InitMapMusic(void) -{ - gDisableMusic = FALSE; - ResetMapMusic(); -} - -void MapMusicMain(void) -{ - switch (sMapMusicState) - { - case 0: - break; - case 1: - sMapMusicState = 2; - PlayBGM(sCurrentMapMusic); - break; - case 2: - case 3: - case 4: - break; - case 5: - if (IsBGMStopped()) - { - sNextMapMusic = 0; - sMapMusicState = 0; - } - break; - case 6: - if (IsBGMStopped() && IsFanfareTaskInactive()) - { - sCurrentMapMusic = sNextMapMusic; - sNextMapMusic = 0; - sMapMusicState = 2; - PlayBGM(sCurrentMapMusic); - } - break; - case 7: - if (IsBGMStopped() && IsFanfareTaskInactive()) - { - FadeInNewBGM(sNextMapMusic, sMapMusicFadeInSpeed); - sCurrentMapMusic = sNextMapMusic; - sNextMapMusic = 0; - sMapMusicState = 2; - sMapMusicFadeInSpeed = 0; - } - break; - } -} - -void ResetMapMusic(void) -{ - sCurrentMapMusic = 0; - sNextMapMusic = 0; - sMapMusicState = 0; - sMapMusicFadeInSpeed = 0; -} - -u16 GetCurrentMapMusic(void) -{ - return sCurrentMapMusic; -} - -void PlayNewMapMusic(u16 songNum) -{ - sCurrentMapMusic = songNum; - sNextMapMusic = 0; - sMapMusicState = 1; -} - -void StopMapMusic(void) -{ - sCurrentMapMusic = 0; - sNextMapMusic = 0; - sMapMusicState = 1; -} - -void FadeOutMapMusic(u8 speed) -{ - if (IsNotWaitingForBGMStop()) - FadeOutBGM(speed); - sCurrentMapMusic = 0; - sNextMapMusic = 0; - sMapMusicState = 5; -} - -void FadeOutAndPlayNewMapMusic(u16 songNum, u8 speed) -{ - FadeOutMapMusic(speed); - sCurrentMapMusic = 0; - sNextMapMusic = songNum; - sMapMusicState = 6; -} - -void FadeOutAndFadeInNewMapMusic(u16 songNum, u8 fadeOutSpeed, u8 fadeInSpeed) -{ - FadeOutMapMusic(fadeOutSpeed); - sCurrentMapMusic = 0; - sNextMapMusic = songNum; - sMapMusicState = 7; - sMapMusicFadeInSpeed = fadeInSpeed; -} - -void FadeInNewMapMusic(u16 songNum, u8 speed) -{ - FadeInNewBGM(songNum, speed); - sCurrentMapMusic = songNum; - sNextMapMusic = 0; - sMapMusicState = 2; - sMapMusicFadeInSpeed = 0; -} - -bool8 IsNotWaitingForBGMStop(void) -{ - if (sMapMusicState == 6) - return FALSE; - if (sMapMusicState == 5) - return FALSE; - if (sMapMusicState == 7) - return FALSE; - return TRUE; -} - -void PlayFanfareByFanfareNum(u8 fanfareNum) -{ - u16 songNum; - m4aMPlayStop(&gMPlay_BGM); - songNum = sFanfares[fanfareNum].songNum; - sFanfareCounter = sFanfares[fanfareNum].duration; - m4aSongNumStart(songNum); -} - -bool8 WaitFanfare(bool8 stop) -{ - if (sFanfareCounter) - { - sFanfareCounter--; - return FALSE; - } - else - { - if (!stop) - m4aMPlayContinue(&gMPlay_BGM); - else - m4aSongNumStart(SE_STOP); - - return TRUE; - } -} - -void StopFanfareByFanfareNum(u8 fanfareNum) -{ - m4aSongNumStop(sFanfares[fanfareNum].songNum); -} - -void PlayFanfare(u16 songNum) -{ - s32 i; - for (i = 0; (u32)i < 12; i++) - { - if (sFanfares[i].songNum == songNum) - { - PlayFanfareByFanfareNum(i); - CreateFanfareTask(); - return; - } - } - - PlayFanfareByFanfareNum(0); - CreateFanfareTask(); -} - -bool8 IsFanfareTaskInactive(void) -{ - if (FuncIsActiveTask(Task_Fanfare) == TRUE) - return FALSE; - return TRUE; -} - -static void Task_Fanfare(u8 taskId) -{ - if (sFanfareCounter) - { - sFanfareCounter--; - } - else - { - m4aMPlayContinue(&gMPlay_BGM); - DestroyTask(taskId); - } -} - -static void CreateFanfareTask(void) -{ - if (FuncIsActiveTask(Task_Fanfare) != TRUE) - CreateTask(Task_Fanfare, 80); -} - -void FadeInNewBGM(u16 songNum, u8 speed) -{ - if (gDisableMusic) - songNum = 0; - m4aSongNumStart(songNum); - m4aMPlayImmInit(&gMPlay_BGM); - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0); - m4aSongNumStop(songNum); - m4aMPlayFadeIn(&gMPlay_BGM, speed); -} - -void FadeOutBGMTemporarily(u8 speed) -{ - m4aMPlayFadeOutTemporarily(&gMPlay_BGM, speed); -} - -bool8 IsBGMPausedOrStopped(void) -{ - if (gMPlay_BGM.status & MUSICPLAYER_STATUS_PAUSE) - return TRUE; - if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) - return TRUE; - return FALSE; -} - -void FadeInBGM(u8 speed) -{ - m4aMPlayFadeIn(&gMPlay_BGM, speed); -} - -void FadeOutBGM(u8 speed) -{ - m4aMPlayFadeOut(&gMPlay_BGM, speed); -} - -bool8 IsBGMStopped(void) -{ - if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) - return TRUE; - return FALSE; -} - -void PlayCry1(u16 species, s8 pan) -{ - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); - PlayCryInternal(species, pan, 125, 10, 0); - gPokemonCryBGMDuckingCounter = 2; - RestoreBGMVolumeAfterPokemonCry(); -} - -void PlayCry2(u16 species, s8 pan, s8 volume, u8 priority) -{ - PlayCryInternal(species, pan, volume, priority, 0); -} - -void PlayCry3(u16 species, s8 pan, u8 mode) -{ - if (mode == 1) - { - PlayCryInternal(species, pan, 125, 10, 1); - } - else - { - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); - PlayCryInternal(species, pan, 125, 10, mode); - gPokemonCryBGMDuckingCounter = 2; - RestoreBGMVolumeAfterPokemonCry(); - } -} - -void PlayCry4(u16 species, s8 pan, u8 mode) -{ - if (mode == 1) - { - PlayCryInternal(species, pan, 125, 10, 1); - } - else - { - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); - PlayCryInternal(species, pan, 125, 10, mode); - } -} - -void PlayCry5(u16 species, u8 mode) -{ - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); - PlayCryInternal(species, 0, 125, 10, mode); - gPokemonCryBGMDuckingCounter = 2; - RestoreBGMVolumeAfterPokemonCry(); -} - -#define GET_CRY_PTR(a, b)\ -{\ - struct ToneData *tone;\ - if (v0)\ - tone = &a[index];\ - else\ - tone = &b[index];\ - gMPlay_PokemonCry = SetPokemonCryTone(tone);\ - break;\ -} - -static void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode) -{ - u32 cryId; - u32 v0; - u32 release; - u32 length; - u32 pitch; - u32 chorus; - u32 index; - u8 table; - - species--; - - cryId = species; - - v0 = 0; - release = 0; - length = 140; - pitch = 15360; - chorus = 0; - - switch (mode) - { - case 0: - break; - case 1: - length = 20; - release = 225; - break; - case 2: - length = 30; - release = 225; - pitch = 15600; - chorus = 20; - volume = 80; - break; - case 3: - length = 50; - release = 200; - pitch = 14800; - break; - case 4: - length = 20; - release = 220; - pitch = 15800; - break; - case 5: - release = 200; - pitch = 14500; - break; - } - - SetPokemonCryVolume(volume); - SetPokemonCryPanpot(pan); - SetPokemonCryPitch(pitch); - SetPokemonCryLength(length); - SetPokemonCryProgress(0); - SetPokemonCryRelease(release); - SetPokemonCryChorus(chorus); - SetPokemonCryPriority(priority); - - asm(""); - asm(""); - asm(""); - asm(""); - asm(""); - asm(""); - asm(""); - - cryId = SpeciesToCryId(cryId); - index = 0x7F; - asm("" ::: "r0"); - index &= cryId; - table = cryId >> 7; - - switch (table) - { - case 0: GET_CRY_PTR(voicegroup_84537C0, voicegroup_8452590); - case 1: GET_CRY_PTR(voicegroup_8453DC0, voicegroup_8452B90); - case 2: GET_CRY_PTR(voicegroup_84543C0, voicegroup_8453190); - case 3: GET_CRY_PTR(voicegroup_84549C0, voicegroup_8453790); - } -} - -bool8 IsCryFinished(void) -{ - if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) == TRUE) - { - return FALSE; - } - else - { - ClearPokemonCrySongs(); - return TRUE; - } -} - -void StopCryAndClearCrySongs(void) -{ - m4aMPlayStop(gMPlay_PokemonCry); - ClearPokemonCrySongs(); -} - -void StopCry(void) -{ - m4aMPlayStop(gMPlay_PokemonCry); -} - -bool8 IsCryPlayingOrClearCrySongs(void) -{ - if (IsPokemonCryPlaying(gMPlay_PokemonCry)) - { - return TRUE; - } - else - { - ClearPokemonCrySongs(); - return FALSE; - } -} - -bool8 IsCryPlaying(void) -{ - if (IsPokemonCryPlaying(gMPlay_PokemonCry)) - return TRUE; - else - return FALSE; -} - -static void Task_DuckBGMForPokemonCry(u8 taskId) -{ - if (gPokemonCryBGMDuckingCounter) - { - gPokemonCryBGMDuckingCounter--; - return; - } - - if (!IsPokemonCryPlaying(gMPlay_PokemonCry)) - { - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); - DestroyTask(taskId); - } -} - -static void RestoreBGMVolumeAfterPokemonCry(void) -{ - if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) != TRUE) - CreateTask(Task_DuckBGMForPokemonCry, 80); -} - -void PlayBGM(u16 songNum) -{ - if (gDisableMusic) - songNum = 0; - m4aSongNumStart(songNum); -} - -void PlaySE(u16 songNum) -{ - m4aSongNumStart(songNum); -} - -void PlaySE12WithPanning(u16 songNum, s8 pan) -{ - m4aSongNumStart(songNum); - m4aMPlayImmInit(&gMPlay_SE1); - m4aMPlayImmInit(&gMPlay_SE2); - m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); - m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); -} - -void PlaySE1WithPanning(u16 songNum, s8 pan) -{ - m4aSongNumStart(songNum); - m4aMPlayImmInit(&gMPlay_SE1); - m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); -} - -void PlaySE2WithPanning(u16 songNum, s8 pan) -{ - m4aSongNumStart(songNum); - m4aMPlayImmInit(&gMPlay_SE2); - m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); -} - -void SE12PanpotControl(s8 pan) -{ - m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); - m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); -} - -bool8 IsSEPlaying(void) -{ - if ((gMPlay_SE1.status & MUSICPLAYER_STATUS_PAUSE) && (gMPlay_SE2.status & MUSICPLAYER_STATUS_PAUSE)) - return FALSE; - if (!(gMPlay_SE1.status & MUSICPLAYER_STATUS_TRACK) && !(gMPlay_SE2.status & MUSICPLAYER_STATUS_TRACK)) - return FALSE; - return TRUE; -} - -bool8 IsBGMPlaying(void) -{ - if (gMPlay_BGM.status & MUSICPLAYER_STATUS_PAUSE) - return FALSE; - if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) - return FALSE; - return TRUE; -} - -bool8 IsSpecialSEPlaying(void) -{ - if (gMPlay_SE3.status & MUSICPLAYER_STATUS_PAUSE) - return FALSE; - if (!(gMPlay_SE3.status & MUSICPLAYER_STATUS_TRACK)) - return FALSE; - return TRUE; -} diff --git a/src/sound_check_menu.c b/src/sound_check_menu.c deleted file mode 100644 index d97ae6d86..000000000 --- a/src/sound_check_menu.c +++ /dev/null @@ -1,2199 +0,0 @@ -#include "global.h" -#include "sprite.h" -#include "palette.h" -#include "task.h" -#include "m4a.h" -#include "main.h" -#include "text.h" -#include "menu.h" -#include "songs.h" -#include "title_screen.h" -#include "sound.h" -#include "pokedex_cry_screen.h" - -// local task defines -#define WINDOW_SELECTED data[0] -#define BGM_INDEX data[1] -#define SE_INDEX data[2] -#define UNK_DATA3 data[3] -#define UNK_DATA4 data[4] -// data 5-7 are not used -// i dont have a define for data 8 yet because its used in a nonmatching and I can't be sure yet its actually used. - -// window selections -enum -{ - BGM_WINDOW, - SE_WINDOW -}; - -// driver test cry enums -enum -{ - CRY_TEST_UNK0, - CRY_TEST_VOLUME, - CRY_TEST_PANPOT, - CRY_TEST_PITCH, - CRY_TEST_LENGTH, - CRY_TEST_RELEASE, - CRY_TEST_PROGRESS, - CRY_TEST_CHORUS, - CRY_TEST_PRIORITY -}; - -// minmax range enums -enum -{ - MIN, - MAX -}; - -extern struct ToneData voicegroup_84537C0[]; -extern struct ToneData voicegroup_8452590[]; -extern struct ToneData voicegroup_8453DC0[]; -extern struct ToneData voicegroup_8452B90[]; -extern struct ToneData voicegroup_84543C0[]; -extern struct ToneData voicegroup_8453190[]; -extern struct ToneData voicegroup_84549C0[]; -extern struct ToneData voicegroup_8453790[]; - -static EWRAM_DATA u8 gUnknown_020387B0 = 0; -static EWRAM_DATA u8 gUnknown_020387B1 = 0; -static EWRAM_DATA u8 gUnknown_020387B2 = 0; -static EWRAM_DATA s8 gUnknown_020387B3 = 0; -static EWRAM_DATA int gUnknown_020387B4[9] = {0}; -static EWRAM_DATA u8 gUnknown_020387D8 = 0; -static EWRAM_DATA u8 gUnknown_020387D9 = 0; - -extern u16 gUnknown_03005D34; -extern u8 gUnknown_03005E98; - -struct MusicPlayerInfo *gUnknown_03005D30; - -extern struct MusicPlayerInfo gMPlay_BGM; - -void sub_80BA258(u8); -void sub_80BA384(u8); -void sub_80BA65C(u8); -void sub_80BA68C(u8); -void sub_80BA6B8(u8); -void sub_80BA700(u16, u16, u16); -void sub_80BA79C(const u8 *const, u16, u16); -void sub_80BA800(u8); -void sub_80BAA48(u8); -void sub_80BACDC(s8); -void sub_80BAD5C(void); -void sub_80BAE10(u8, u8); -void sub_80BAE78(int, u16, u16, u8); -void sub_80BAF84(u8); -void sub_80BB038(u8); -void sub_80BB1D4(void); -void sub_80BB25C(u8); -void sub_80BB3B4(u8); -void sub_80BB494(void); - -static const u8 gDebugText_SoundCheckJap[] = _("サウンドチェック"); -static const u8 gDebugText_BGM[] = _("BGM"); -static const u8 gDebugText_SE[] = _("SE "); -static const u8 gDebugText_ABDesc[] = _("A‥さいせい B‥おわり"); -static const u8 gDebugText_UpDown[] = _("L‥UP R‥DOWN"); -static const u8 gDebugText_DriverTest[] = _("R‥DRIVER-TEST"); - -// ideally this should be a multi Coords8 struct, but it wont match when its treated like a struct. -static const u8 gUnknown_083D0300[] = { 1, 1, 1, 3, 1, 5, 1, 7, 1, 9, 1, 11, 1, 13, 1, 15, 1, 17 }; - -static const u8 gDebugText_BBack[] = _("Bぼたんで もどる"); -static const u8 gDebugText_APlay[] = _("Aぼたんで さいせい"); -static const u8 gDebugText_Voice[] = _("VOICE‥‥‥‥"); -static const u8 gDebugText_Volume[] = _("VOLUME‥‥‥"); -static const u8 gDebugText_Panpot[] = _("PANPOT‥‥‥"); -static const u8 gDebugText_Pitch[] = _("PITCH‥‥‥‥"); -static const u8 gDebugText_Length[] = _("LENGTH‥‥‥"); -static const u8 gDebugText_Release[] = _("RELEASE‥‥"); -static const u8 gDebugText_Progress[] = _("PROGRESS‥"); -static const u8 gDebugText_Chorus[] = _("CHORUS‥‥‥"); -static const u8 gDebugText_Priority[] = _("PRIORITY‥"); -static const u8 gDebugText_Playing[] = _("さいせいちゆう‥"); // 再生中 (playing) -static const u8 gDebugText_Reverse[] = _("はんてん‥‥‥‥"); // 反転 (reverse) -static const u8 gDebugText_Stereo[] = _("すてれお‥‥‥‥"); // stereo - -// also ideally should be a MinMax struct, but any attempt to make this into a struct causes it to not match due to the weird multi dim access. -static const int gUnknown_083D039C[16] = -{ - 0, 387, - 0, 127, - -127, 127, - -128, 32639, - 0, 65535, - 0, 255, - 0, 65535, - -64, 63 -}; - -static const u8 gUnknown_083D03DC[] = _("▶"); -static const u8 gUnknown_083D03DE[] = _(" "); - -// why not just use Powers of ten from string_util? -static const int gUnknown_083D03E0[6] = -{ - 1, - 10, - 100, - 1000, - 10000, - 100000 -}; - -static const s8 gUnknown_083D03F8[5] = { 0x3F, 0x00, 0xC0, 0x7F, 0x80 }; - -static const u8 gOtherText_SE[] = _("SE"); -static const u8 gOtherText_Pan[] = _("PAN"); -static const u8 gOtherText_LR[] = _(" LR"); -static const u8 gOtherText_RL[] = _(" RL"); - -// bgm names -static const u8 BGMName_STOP[] = _("STOP"); -static const u8 BGMName_TETSUJI[] = _("TETSUJI"); -static const u8 BGMName_FIELD13[] = _("FIELD13"); -static const u8 BGMName_KACHI22[] = _("KACHI22"); -static const u8 BGMName_KACHI2[] = _("KACHI2"); -static const u8 BGMName_KACHI3[] = _("KACHI3"); -static const u8 BGMName_KACHI5[] = _("KACHI5"); -static const u8 BGMName_PCC[] = _("PCC"); -static const u8 BGMName_NIBI[] = _("NIBI"); -static const u8 BGMName_SUIKUN[] = _("SUIKUN"); -static const u8 BGMName_DOORO1[] = _("DOORO1"); -static const u8 BGMName_DOORO_X1[] = _("DOORO-X1"); -static const u8 BGMName_DOORO_X3[] = _("DOORO-X3"); -static const u8 BGMName_MACHI_S2[] = _("MACHI-S2"); -static const u8 BGMName_MACHI_S4[] = _("MACHI-S4"); -static const u8 BGMName_GIM[] = _("GIM"); -static const u8 BGMName_NAMINORI[] = _("NAMINORI"); -static const u8 BGMName_DAN01[] = _("DAN01"); -static const u8 BGMName_FANFA1[] = _("FANFA1"); -static const u8 BGMName_ME_ASA[] = _("ME-ASA"); -static const u8 BGMName_ME_BACHI[] = _("ME-BACHI"); -static const u8 BGMName_FANFA4[] = _("FANFA4"); -static const u8 BGMName_FANFA5[] = _("FANFA5"); -static const u8 BGMName_ME_WAZA[] = _("ME-WAZA"); -static const u8 BGMName_BIJYUTU[] = _("BIJYUTU"); -static const u8 BGMName_DOORO_X4[] = _("DOORO-X4"); -static const u8 BGMName_FUNE_KAN[] = _("FUNE-KAN"); -static const u8 BGMName_ME_SHINKA[] = _("ME-SHINKA"); -static const u8 BGMName_SHINKA[] = _("SHINKA"); -static const u8 BGMName_ME_WASURE[] = _("ME-WASURE"); -static const u8 BGMName_SYOUJOEYE[] = _("SYOUJOEYE"); -static const u8 BGMName_BOYEYE[] = _("BOYEYE"); -static const u8 BGMName_DAN02[] = _("DAN02"); -static const u8 BGMName_MACHI_S3[] = _("MACHI-S3"); -static const u8 BGMName_ODAMAKI[] = _("ODAMAKI"); -static const u8 BGMName_B_TOWER[] = _("B-TOWER"); -static const u8 BGMName_SWIMEYE[] = _("SWIMEYE"); -static const u8 BGMName_DAN03[] = _("DAN03"); -static const u8 BGMName_ME_KINOMI[] = _("ME-KINOMI"); -static const u8 BGMName_ME_TAMA[] = _("ME-TAMA"); -static const u8 BGMName_ME_B_BIG[] = _("ME-B-BIG"); -static const u8 BGMName_ME_B_SMALL[] = _("ME-B-SMALL"); -static const u8 BGMName_ME_ZANNEN[] = _("ME-ZANNEN"); -static const u8 BGMName_BD_TIME[] = _("BD-TIME"); -static const u8 BGMName_TEST1[] = _("TEST1"); -static const u8 BGMName_TEST2[] = _("TEST2"); -static const u8 BGMName_TEST3[] = _("TEST3"); -static const u8 BGMName_TEST4[] = _("TEST4"); -static const u8 BGMName_TEST[] = _("TEST"); -static const u8 BGMName_GOMACHI0[] = _("GOMACHI0"); -static const u8 BGMName_GOTOWN[] = _("GOTOWN"); -static const u8 BGMName_POKECEN[] = _("POKECEN"); -static const u8 BGMName_NEXTROAD[] = _("NEXTROAD"); -static const u8 BGMName_GRANROAD[] = _("GRANROAD"); -static const u8 BGMName_CYCLING[] = _("CYCLING"); -static const u8 BGMName_FRIENDLY[] = _("FRIENDLY"); -static const u8 BGMName_MISHIRO[] = _("MISHIRO"); -static const u8 BGMName_TOZAN[] = _("TOZAN"); -static const u8 BGMName_GIRLEYE[] = _("GIRLEYE"); -static const u8 BGMName_MINAMO[] = _("MINAMO"); -static const u8 BGMName_ASHROAD[] = _("ASHROAD"); -static const u8 BGMName_EVENT0[] = _("EVENT0"); -static const u8 BGMName_DEEPDEEP[] = _("DEEPDEEP"); -static const u8 BGMName_KACHI1[] = _("KACHI1"); -static const u8 BGMName_TITLE3[] = _("TITLE3"); -static const u8 BGMName_DEMO1[] = _("DEMO1"); -static const u8 BGMName_GIRL_SUP[] = _("GIRL-SUP"); -static const u8 BGMName_HAGESHII[] = _("HAGESHII"); -static const u8 BGMName_KAKKOII[] = _("KAKKOII"); -static const u8 BGMName_KAZANBAI[] = _("KAZANBAI"); -static const u8 BGMName_AQA_0[] = _("AQA-0"); -static const u8 BGMName_TSURETEK[] = _("TSURETEK"); -static const u8 BGMName_BOY_SUP[] = _("BOY-SUP"); -static const u8 BGMName_RAINBOW[] = _("RAINBOW"); -static const u8 BGMName_AYASII[] = _("AYASII"); -static const u8 BGMName_KACHI4[] = _("KACHI4"); -static const u8 BGMName_ROPEWAY[] = _("ROPEWAY"); -static const u8 BGMName_CASINO[] = _("CASINO"); -static const u8 BGMName_HIGHTOWN[] = _("HIGHTOWN"); -static const u8 BGMName_SAFARI[] = _("SAFARI"); -static const u8 BGMName_C_ROAD[] = _("C-ROAD"); -static const u8 BGMName_AJITO[] = _("AJITO"); -static const u8 BGMName_M_BOAT[] = _("M-BOAT"); -static const u8 BGMName_M_DUNGON[] = _("M-DUNGON"); -static const u8 BGMName_FINECITY[] = _("FINECITY"); -static const u8 BGMName_MACHUPI[] = _("MACHUPI"); -static const u8 BGMName_P_SCHOOL[] = _("P-SCHOOL"); -static const u8 BGMName_DENDOU[] = _("DENDOU"); -static const u8 BGMName_TONEKUSA[] = _("TONEKUSA"); -static const u8 BGMName_MABOROSI[] = _("MABOROSI"); -static const u8 BGMName_CON_FAN[] = _("CON-FAN"); -static const u8 BGMName_CONTEST0[] = _("CONTEST0"); -static const u8 BGMName_MGM0[] = _("MGM0"); -static const u8 BGMName_T_BATTLE[] = _("T-BATTLE"); -static const u8 BGMName_OOAME[] = _("OOAME"); -static const u8 BGMName_HIDERI[] = _("HIDERI"); -static const u8 BGMName_RUNECITY[] = _("RUNECITY"); -static const u8 BGMName_CON_K[] = _("CON-K"); -static const u8 BGMName_EIKOU_R[] = _("EIKOU-R"); -static const u8 BGMName_KARAKURI[] = _("KARAKURI"); -static const u8 BGMName_HUTAGO[] = _("HUTAGO"); -static const u8 BGMName_SITENNOU[] = _("SITENNOU"); -static const u8 BGMName_YAMA_EYE[] = _("YAMA-EYE"); -static const u8 BGMName_CONLOBBY[] = _("CONLOBBY"); -static const u8 BGMName_INTER_V[] = _("INTER-V"); -static const u8 BGMName_DAIGO[] = _("DAIGO"); -static const u8 BGMName_THANKFOR[] = _("THANKFOR"); -static const u8 BGMName_END[] = _("END"); -static const u8 BGMName_BATTLE27[] = _("BATTLE27"); -static const u8 BGMName_BATTLE31[] = _("BATTLE31"); -static const u8 BGMName_BATTLE20[] = _("BATTLE20"); -static const u8 BGMName_BATTLE32[] = _("BATTLE32"); -static const u8 BGMName_BATTLE33[] = _("BATTLE33"); -static const u8 BGMName_BATTLE36[] = _("BATTLE36"); -static const u8 BGMName_BATTLE34[] = _("BATTLE34"); -static const u8 BGMName_BATTLE35[] = _("BATTLE35"); -static const u8 BGMName_BATTLE38[] = _("BATTLE38"); -static const u8 BGMName_BATTLE30[] = _("BATTLE30"); - -static const u8 *const gBGMNames[] = -{ - BGMName_STOP, - BGMName_TETSUJI, - BGMName_FIELD13, - BGMName_KACHI22, - BGMName_KACHI2, - BGMName_KACHI3, - BGMName_KACHI5, - BGMName_PCC, - BGMName_NIBI, - BGMName_SUIKUN, - BGMName_DOORO1, - BGMName_DOORO_X1, - BGMName_DOORO_X3, - BGMName_MACHI_S2, - BGMName_MACHI_S4, - BGMName_GIM, - BGMName_NAMINORI, - BGMName_DAN01, - BGMName_FANFA1, - BGMName_ME_ASA, - BGMName_ME_BACHI, - BGMName_FANFA4, - BGMName_FANFA5, - BGMName_ME_WAZA, - BGMName_BIJYUTU, - BGMName_DOORO_X4, - BGMName_FUNE_KAN, - BGMName_ME_SHINKA, - BGMName_SHINKA, - BGMName_ME_WASURE, - BGMName_SYOUJOEYE, - BGMName_BOYEYE, - BGMName_DAN02, - BGMName_MACHI_S3, - BGMName_ODAMAKI, - BGMName_B_TOWER, - BGMName_SWIMEYE, - BGMName_DAN03, - BGMName_ME_KINOMI, - BGMName_ME_TAMA, - BGMName_ME_B_BIG, - BGMName_ME_B_SMALL, - BGMName_ME_ZANNEN, - BGMName_BD_TIME, - BGMName_TEST1, - BGMName_TEST2, - BGMName_TEST3, - BGMName_TEST4, - BGMName_TEST, - BGMName_GOMACHI0, - BGMName_GOTOWN, - BGMName_POKECEN, - BGMName_NEXTROAD, - BGMName_GRANROAD, - BGMName_CYCLING, - BGMName_FRIENDLY, - BGMName_MISHIRO, - BGMName_TOZAN, - BGMName_GIRLEYE, - BGMName_MINAMO, - BGMName_ASHROAD, - BGMName_EVENT0, - BGMName_DEEPDEEP, - BGMName_KACHI1, - BGMName_TITLE3, - BGMName_DEMO1, - BGMName_GIRL_SUP, - BGMName_HAGESHII, - BGMName_KAKKOII, - BGMName_KAZANBAI, - BGMName_AQA_0, - BGMName_TSURETEK, - BGMName_BOY_SUP, - BGMName_RAINBOW, - BGMName_AYASII, - BGMName_KACHI4, - BGMName_ROPEWAY, - BGMName_CASINO, - BGMName_HIGHTOWN, - BGMName_SAFARI, - BGMName_C_ROAD, - BGMName_AJITO, - BGMName_M_BOAT, - BGMName_M_DUNGON, - BGMName_FINECITY, - BGMName_MACHUPI, - BGMName_P_SCHOOL, - BGMName_DENDOU, - BGMName_TONEKUSA, - BGMName_MABOROSI, - BGMName_CON_FAN, - BGMName_CONTEST0, - BGMName_MGM0, - BGMName_T_BATTLE, - BGMName_OOAME, - BGMName_HIDERI, - BGMName_RUNECITY, - BGMName_CON_K, - BGMName_EIKOU_R, - BGMName_KARAKURI, - BGMName_HUTAGO, - BGMName_SITENNOU, - BGMName_YAMA_EYE, - BGMName_CONLOBBY, - BGMName_INTER_V, - BGMName_DAIGO, - BGMName_THANKFOR, - BGMName_END, - BGMName_BATTLE27, - BGMName_BATTLE31, - BGMName_BATTLE20, - BGMName_BATTLE32, - BGMName_BATTLE33, - BGMName_BATTLE36, - BGMName_BATTLE34, - BGMName_BATTLE35, - BGMName_BATTLE38, - BGMName_BATTLE30 -}; - -// SE names -static const u8 SEName_STOP[] = _("STOP"); -static const u8 SEName_KAIFUKU[] = _("KAIFUKU"); -static const u8 SEName_PC_LOGON[] = _("PC-LOGON"); -static const u8 SEName_PC_OFF[] = _("PC-OFF"); -static const u8 SEName_PC_ON[] = _("PC-ON"); -static const u8 SEName_SELECT[] = _("SELECT"); -static const u8 SEName_WIN_OPEN[] = _("WIN-OPEN"); -static const u8 SEName_WALL_HIT[] = _("WALL-HIT"); -static const u8 SEName_DOOR[] = _("DOOR"); -static const u8 SEName_KAIDAN[] = _("KAIDAN"); -static const u8 SEName_DANSA[] = _("DANSA"); -static const u8 SEName_JITENSYA[] = _("JITENSYA"); -static const u8 SEName_KOUKA_L[] = _("KOUKA-L"); -static const u8 SEName_KOUKA_M[] = _("KOUKA-M"); -static const u8 SEName_KOUKA_H[] = _("KOUKA-H"); -static const u8 SEName_BOWA2[] = _("BOWA2"); -static const u8 SEName_POKE_DEAD[] = _("POKE-DEAD"); -static const u8 SEName_NIGERU[] = _("NIGERU"); -static const u8 SEName_JIDO_DOA[] = _("JIDO-DOA"); -static const u8 SEName_NAMINORI[] = _("NAMINORI"); -static const u8 SEName_BAN[] = _("BAN"); -static const u8 SEName_PIN[] = _("PIN"); -static const u8 SEName_BOO[] = _("BOO"); -static const u8 SEName_BOWA[] = _("BOWA"); -static const u8 SEName_JYUNI[] = _("JYUNI"); -static const u8 SEName_A[] = _("A"); -static const u8 SEName_I[] = _("I"); -static const u8 SEName_U[] = _("U"); -static const u8 SEName_E[] = _("E"); -static const u8 SEName_O[] = _("O"); -static const u8 SEName_N[] = _("N"); -static const u8 SEName_SEIKAI[] = _("SEIKAI"); -static const u8 SEName_HAZURE[] = _("HAZURE"); -static const u8 SEName_EXP[] = _("EXP"); -static const u8 SEName_JITE_PYOKO[] = _("JITE-PYOKO"); -static const u8 SEName_MU_PACHI[] = _("MU-PACHI"); -static const u8 SEName_TK_KASYA[] = _("TK-KASYA"); -static const u8 SEName_FU_ZAKU[] = _("FU-ZAKU"); -static const u8 SEName_FU_ZAKU2[] = _("FU-ZAKU2"); -static const u8 SEName_FU_ZUZUZU[] = _("FU-ZUZUZU"); -static const u8 SEName_RU_GASHIN[] = _("RU-GASHIN"); -static const u8 SEName_RU_GASYAN[] = _("RU-GASYAN"); -static const u8 SEName_RU_BARI[] = _("RU-BARI"); -static const u8 SEName_RU_HYUU[] = _("RU-HYUU"); -static const u8 SEName_KI_GASYAN[] = _("KI-GASYAN"); -static const u8 SEName_TK_WARPIN[] = _("TK-WARPIN"); -static const u8 SEName_TK_WARPOUT[] = _("TK-WARPOUT"); -static const u8 SEName_TU_SAA[] = _("TU-SAA"); -static const u8 SEName_HI_TURUN[] = _("HI-TURUN"); -static const u8 SEName_TRACK_MOVE[] = _("TRACK-MOVE"); -static const u8 SEName_TRACK_STOP[] = _("TRACK-STOP"); -static const u8 SEName_TRACK_HAIK[] = _("TRACK-HAIK"); -static const u8 SEName_TRACK_DOOR[] = _("TRACK-DOOR"); -static const u8 SEName_MOTER[] = _("MOTER"); -static const u8 SEName_CARD[] = _("CARD"); -static const u8 SEName_SAVE[] = _("SAVE"); -static const u8 SEName_KON[] = _("KON"); -static const u8 SEName_KON2[] = _("KON2"); -static const u8 SEName_KON3[] = _("KON3"); -static const u8 SEName_KON4[] = _("KON4"); -static const u8 SEName_SUIKOMU[] = _("SUIKOMU"); -static const u8 SEName_NAGERU[] = _("NAGERU"); -static const u8 SEName_TOY_C[] = _("TOY-C"); -static const u8 SEName_TOY_D[] = _("TOY-D"); -static const u8 SEName_TOY_E[] = _("TOY-E"); -static const u8 SEName_TOY_F[] = _("TOY-F"); -static const u8 SEName_TOY_G[] = _("TOY-G"); -static const u8 SEName_TOY_A[] = _("TOY-A"); -static const u8 SEName_TOY_B[] = _("TOY-B"); -static const u8 SEName_TOY_C1[] = _("TOY-C1"); -static const u8 SEName_MIZU[] = _("MIZU"); -static const u8 SEName_HASHI[] = _("HASHI"); -static const u8 SEName_DAUGI[] = _("DAUGI"); -static const u8 SEName_PINPON[] = _("PINPON"); -static const u8 SEName_FUUSEN1[] = _("FUUSEN1"); -static const u8 SEName_FUUSEN2[] = _("FUUSEN2"); -static const u8 SEName_FUUSEN3[] = _("FUUSEN3"); -static const u8 SEName_TOY_KABE[] = _("TOY-KABE"); -static const u8 SEName_TOY_DANGO[] = _("TOY-DANGO"); -static const u8 SEName_DOKU[] = _("DOKU"); -static const u8 SEName_ESUKA[] = _("ESUKA"); -static const u8 SEName_T_AME[] = _("T-AME"); -static const u8 SEName_T_AME_E[] = _("T-AME-E"); -static const u8 SEName_T_OOAME[] = _("T-OOAME"); -static const u8 SEName_T_OOAME_E[] = _("T-OOAME-E"); -static const u8 SEName_T_KOAME[] = _("T-KOAME"); -static const u8 SEName_T_KOAME_E[] = _("T-KOAME-E"); -static const u8 SEName_T_KAMI[] = _("T-KAMI"); -static const u8 SEName_T_KAMI2[] = _("T-KAMI2"); -static const u8 SEName_ELEBETA[] = _("ELEBETA"); -static const u8 SEName_HINSI[] = _("HINSI"); -static const u8 SEName_EXPMAX[] = _("EXPMAX"); -static const u8 SEName_TAMAKORO[] = _("TAMAKORO"); -static const u8 SEName_TAMAKORO_E[] = _("TAMAKORO-E"); -static const u8 SEName_BASABASA[] = _("BASABASA"); -static const u8 SEName_REGI[] = _("REGI"); -static const u8 SEName_C_GAJI[] = _("C-GAJI"); -static const u8 SEName_C_MAKU_U[] = _("C-MAKU-U"); -static const u8 SEName_C_MAKU_D[] = _("C-MAKU-D"); -static const u8 SEName_C_PASI[] = _("C-PASI"); -static const u8 SEName_C_SYU[] = _("C-SYU"); -static const u8 SEName_C_PIKON[] = _("C-PIKON"); -static const u8 SEName_REAPOKE[] = _("REAPOKE"); -static const u8 SEName_OP_BASYU[] = _("OP-BASYU"); -static const u8 SEName_BT_START[] = _("BT-START"); -static const u8 SEName_DENDOU[] = _("DENDOU"); -static const u8 SEName_JIHANKI[] = _("JIHANKI"); -static const u8 SEName_TAMA[] = _("TAMA"); -static const u8 SEName_Z_SCROLL[] = _("Z-SCROLL"); -static const u8 SEName_Z_PAGE[] = _("Z-PAGE"); -static const u8 SEName_PN_ON[] = _("PN-ON"); -static const u8 SEName_PN_OFF[] = _("PN-OFF"); -static const u8 SEName_Z_SEARCH[] = _("Z-SEARCH"); -static const u8 SEName_TAMAGO[] = _("TAMAGO"); -static const u8 SEName_TB_START[] = _("TB-START"); -static const u8 SEName_TB_KON[] = _("TB-KON"); -static const u8 SEName_TB_KARA[] = _("TB-KARA"); -static const u8 SEName_BIDORO[] = _("BIDORO"); -static const u8 SEName_W085[] = _("W085"); -static const u8 SEName_W085B[] = _("W085B"); -static const u8 SEName_W231[] = _("W231"); -static const u8 SEName_W171[] = _("W171"); -static const u8 SEName_W233[] = _("W233"); -static const u8 SEName_W233B[] = _("W233B"); -static const u8 SEName_W145[] = _("W145"); -static const u8 SEName_W145B[] = _("W145B"); -static const u8 SEName_W145C[] = _("W145C"); -static const u8 SEName_W240[] = _("W240"); -static const u8 SEName_W015[] = _("W015"); -static const u8 SEName_W081[] = _("W081"); -static const u8 SEName_W081B[] = _("W081B"); -static const u8 SEName_W088[] = _("W088"); -static const u8 SEName_W016[] = _("W016"); -static const u8 SEName_W016B[] = _("W016B"); -static const u8 SEName_W003[] = _("W003"); -static const u8 SEName_W104[] = _("W104"); -static const u8 SEName_W013[] = _("W013"); -static const u8 SEName_W196[] = _("W196"); -static const u8 SEName_W086[] = _("W086"); -static const u8 SEName_W004[] = _("W004"); -static const u8 SEName_W025[] = _("W025"); -static const u8 SEName_W025B[] = _("W025B"); -static const u8 SEName_W152[] = _("W152"); -static const u8 SEName_W026[] = _("W026"); -static const u8 SEName_W172[] = _("W172"); -static const u8 SEName_W172B[] = _("W172B"); -static const u8 SEName_W053[] = _("W053"); -static const u8 SEName_W007[] = _("W007"); -static const u8 SEName_W092[] = _("W092"); -static const u8 SEName_W221[] = _("W221"); -static const u8 SEName_W221B[] = _("W221B"); -static const u8 SEName_W052[] = _("W052"); -static const u8 SEName_W036[] = _("W036"); -static const u8 SEName_W059[] = _("W059"); -static const u8 SEName_W059B[] = _("W059B"); -static const u8 SEName_W010[] = _("W010"); -static const u8 SEName_W011[] = _("W011"); -static const u8 SEName_W017[] = _("W017"); -static const u8 SEName_W019[] = _("W019"); -static const u8 SEName_W028[] = _("W028"); -static const u8 SEName_W013B[] = _("W013B"); -static const u8 SEName_W044[] = _("W044"); -static const u8 SEName_W029[] = _("W029"); -static const u8 SEName_W057[] = _("W057"); -static const u8 SEName_W056[] = _("W056"); -static const u8 SEName_W250[] = _("W250"); -static const u8 SEName_W030[] = _("W030"); -static const u8 SEName_W039[] = _("W039"); -static const u8 SEName_W054[] = _("W054"); -static const u8 SEName_W077[] = _("W077"); -static const u8 SEName_W020[] = _("W020"); -static const u8 SEName_W082[] = _("W082"); -static const u8 SEName_W047[] = _("W047"); -static const u8 SEName_W195[] = _("W195"); -static const u8 SEName_W006[] = _("W006"); -static const u8 SEName_W091[] = _("W091"); -static const u8 SEName_W146[] = _("W146"); -static const u8 SEName_W120[] = _("W120"); -static const u8 SEName_W153[] = _("W153"); -static const u8 SEName_W071B[] = _("W071B"); -static const u8 SEName_W071[] = _("W071"); -static const u8 SEName_W103[] = _("W103"); -static const u8 SEName_W062[] = _("W062"); -static const u8 SEName_W062B[] = _("W062B"); -static const u8 SEName_W048[] = _("W048"); -static const u8 SEName_W187[] = _("W187"); -static const u8 SEName_W118[] = _("W118"); -static const u8 SEName_W155[] = _("W155"); -static const u8 SEName_W122[] = _("W122"); -static const u8 SEName_W060[] = _("W060"); -static const u8 SEName_W185[] = _("W185"); -static const u8 SEName_W014[] = _("W014"); -static const u8 SEName_W043[] = _("W043"); -static const u8 SEName_W207[] = _("W207"); -static const u8 SEName_W207B[] = _("W207B"); -static const u8 SEName_W215[] = _("W215"); -static const u8 SEName_W109[] = _("W109"); -static const u8 SEName_W173[] = _("W173"); -static const u8 SEName_W280[] = _("W280"); -static const u8 SEName_W202[] = _("W202"); -static const u8 SEName_W060B[] = _("W060B"); -static const u8 SEName_W076[] = _("W076"); -static const u8 SEName_W080[] = _("W080"); -static const u8 SEName_W100[] = _("W100"); -static const u8 SEName_W107[] = _("W107"); -static const u8 SEName_W166[] = _("W166"); -static const u8 SEName_W129[] = _("W129"); -static const u8 SEName_W115[] = _("W115"); -static const u8 SEName_W112[] = _("W112"); -static const u8 SEName_W197[] = _("W197"); -static const u8 SEName_W199[] = _("W199"); -static const u8 SEName_W236[] = _("W236"); -static const u8 SEName_W204[] = _("W204"); -static const u8 SEName_W268[] = _("W268"); -static const u8 SEName_W070[] = _("W070"); -static const u8 SEName_W063[] = _("W063"); -static const u8 SEName_W127[] = _("W127"); -static const u8 SEName_W179[] = _("W179"); -static const u8 SEName_W151[] = _("W151"); -static const u8 SEName_W201[] = _("W201"); -static const u8 SEName_W161[] = _("W161"); -static const u8 SEName_W161B[] = _("W161B"); -static const u8 SEName_W227[] = _("W227"); -static const u8 SEName_W227B[] = _("W227B"); -static const u8 SEName_W226[] = _("W226"); -static const u8 SEName_W208[] = _("W208"); -static const u8 SEName_W213[] = _("W213"); -static const u8 SEName_W213B[] = _("W213B"); -static const u8 SEName_W234[] = _("W234"); -static const u8 SEName_W260[] = _("W260"); -static const u8 SEName_W328[] = _("W328"); -static const u8 SEName_W320[] = _("W320"); -static const u8 SEName_W255[] = _("W255"); -static const u8 SEName_W291[] = _("W291"); -static const u8 SEName_W089[] = _("W089"); -static const u8 SEName_W239[] = _("W239"); -static const u8 SEName_W230[] = _("W230"); -static const u8 SEName_W281[] = _("W281"); -static const u8 SEName_W327[] = _("W327"); -static const u8 SEName_W287[] = _("W287"); -static const u8 SEName_W257[] = _("W257"); -static const u8 SEName_W253[] = _("W253"); -static const u8 SEName_W258[] = _("W258"); -static const u8 SEName_W322[] = _("W322"); -static const u8 SEName_W298[] = _("W298"); -static const u8 SEName_W287B[] = _("W287B"); -static const u8 SEName_W114[] = _("W114"); -static const u8 SEName_W063B[] = _("W063B"); - -static const u8 *const gSENames[] = -{ - SEName_STOP, - SEName_KAIFUKU, - SEName_PC_LOGON, - SEName_PC_OFF, - SEName_PC_ON, - SEName_SELECT, - SEName_WIN_OPEN, - SEName_WALL_HIT, - SEName_DOOR, - SEName_KAIDAN, - SEName_DANSA, - SEName_JITENSYA, - SEName_KOUKA_L, - SEName_KOUKA_M, - SEName_KOUKA_H, - SEName_BOWA2, - SEName_POKE_DEAD, - SEName_NIGERU, - SEName_JIDO_DOA, - SEName_NAMINORI, - SEName_BAN, - SEName_PIN, - SEName_BOO, - SEName_BOWA, - SEName_JYUNI, - SEName_A, - SEName_I, - SEName_U, - SEName_E, - SEName_O, - SEName_N, - SEName_SEIKAI, - SEName_HAZURE, - SEName_EXP, - SEName_JITE_PYOKO, - SEName_MU_PACHI, - SEName_TK_KASYA, - SEName_FU_ZAKU, - SEName_FU_ZAKU2, - SEName_FU_ZUZUZU, - SEName_RU_GASHIN, - SEName_RU_GASYAN, - SEName_RU_BARI, - SEName_RU_HYUU, - SEName_KI_GASYAN, - SEName_TK_WARPIN, - SEName_TK_WARPOUT, - SEName_TU_SAA, - SEName_HI_TURUN, - SEName_TRACK_MOVE, - SEName_TRACK_STOP, - SEName_TRACK_HAIK, - SEName_TRACK_DOOR, - SEName_MOTER, - SEName_CARD, - SEName_SAVE, - SEName_KON, - SEName_KON2, - SEName_KON3, - SEName_KON4, - SEName_SUIKOMU, - SEName_NAGERU, - SEName_TOY_C, - SEName_TOY_D, - SEName_TOY_E, - SEName_TOY_F, - SEName_TOY_G, - SEName_TOY_A, - SEName_TOY_B, - SEName_TOY_C1, - SEName_MIZU, - SEName_HASHI, - SEName_DAUGI, - SEName_PINPON, - SEName_FUUSEN1, - SEName_FUUSEN2, - SEName_FUUSEN3, - SEName_TOY_KABE, - SEName_TOY_DANGO, - SEName_DOKU, - SEName_ESUKA, - SEName_T_AME, - SEName_T_AME_E, - SEName_T_OOAME, - SEName_T_OOAME_E, - SEName_T_KOAME, - SEName_T_KOAME_E, - SEName_T_KAMI, - SEName_T_KAMI2, - SEName_ELEBETA, - SEName_HINSI, - SEName_EXPMAX, - SEName_TAMAKORO, - SEName_TAMAKORO_E, - SEName_BASABASA, - SEName_REGI, - SEName_C_GAJI, - SEName_C_MAKU_U, - SEName_C_MAKU_D, - SEName_C_PASI, - SEName_C_SYU, - SEName_C_PIKON, - SEName_REAPOKE, - SEName_OP_BASYU, - SEName_BT_START, - SEName_DENDOU, - SEName_JIHANKI, - SEName_TAMA, - SEName_Z_SCROLL, - SEName_Z_PAGE, - SEName_PN_ON, - SEName_PN_OFF, - SEName_Z_SEARCH, - SEName_TAMAGO, - SEName_TB_START, - SEName_TB_KON, - SEName_TB_KARA, - SEName_BIDORO, - SEName_W085, - SEName_W085B, - SEName_W231, - SEName_W171, - SEName_W233, - SEName_W233B, - SEName_W145, - SEName_W145B, - SEName_W145C, - SEName_W240, - SEName_W015, - SEName_W081, - SEName_W081B, - SEName_W088, - SEName_W016, - SEName_W016B, - SEName_W003, - SEName_W104, - SEName_W013, - SEName_W196, - SEName_W086, - SEName_W004, - SEName_W025, - SEName_W025B, - SEName_W152, - SEName_W026, - SEName_W172, - SEName_W172B, - SEName_W053, - SEName_W007, - SEName_W092, - SEName_W221, - SEName_W221B, - SEName_W052, - SEName_W036, - SEName_W059, - SEName_W059B, - SEName_W010, - SEName_W011, - SEName_W017, - SEName_W019, - SEName_W028, - SEName_W013B, - SEName_W044, - SEName_W029, - SEName_W057, - SEName_W056, - SEName_W250, - SEName_W030, - SEName_W039, - SEName_W054, - SEName_W077, - SEName_W020, - SEName_W082, - SEName_W047, - SEName_W195, - SEName_W006, - SEName_W091, - SEName_W146, - SEName_W120, - SEName_W153, - SEName_W071B, - SEName_W071, - SEName_W103, - SEName_W062, - SEName_W062B, - SEName_W048, - SEName_W187, - SEName_W118, - SEName_W155, - SEName_W122, - SEName_W060, - SEName_W185, - SEName_W014, - SEName_W043, - SEName_W207, - SEName_W207B, - SEName_W215, - SEName_W109, - SEName_W173, - SEName_W280, - SEName_W202, - SEName_W060B, - SEName_W076, - SEName_W080, - SEName_W100, - SEName_W107, - SEName_W166, - SEName_W129, - SEName_W115, - SEName_W112, - SEName_W197, - SEName_W199, - SEName_W236, - SEName_W204, - SEName_W268, - SEName_W070, - SEName_W063, - SEName_W127, - SEName_W179, - SEName_W151, - SEName_W201, - SEName_W161, - SEName_W161B, - SEName_W227, - SEName_W227B, - SEName_W226, - SEName_W208, - SEName_W213, - SEName_W213B, - SEName_W234, - SEName_W260, - SEName_W328, - SEName_W320, - SEName_W255, - SEName_W291, - SEName_W089, - SEName_W239, - SEName_W230, - SEName_W281, - SEName_W327, - SEName_W287, - SEName_W257, - SEName_W253, - SEName_W258, - SEName_W322, - SEName_W298, - SEName_W287B, - SEName_W114, - SEName_W063B -}; - -void sub_80BA0A8(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void sub_80BA0C0(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - - if(gUnknown_020387B0 != 0) - { - m4aSoundMain(); - m4aSoundMain(); - m4aSoundMain(); - } -} - -// unused -void CB2_StartSoundCheckMenu(void) -{ - u8 taskId; - - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16(3, 0, VRAM, VRAM_SIZE); - DmaFill32(3, 0, OAM, OAM_SIZE); - DmaFill16(3, 0, PLTT, PLTT_SIZE); - ResetPaletteFade(); - ResetTasks(); - ResetSpriteData(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - REG_WIN0H = WIN_RANGE(0, 0); - REG_WIN0V = WIN_RANGE(0, 0); - REG_WIN1H = WIN_RANGE(0, 0); - REG_WIN1V = WIN_RANGE(0, 0); - REG_WININ = 0x1111; - REG_WINOUT = 0x31; - REG_BLDCNT = 0xE1; - REG_BLDALPHA = 0; - REG_BLDY = 7; - REG_IE = 1; // could be a typo of REG_IME - REG_IE |= 1; - REG_DISPSTAT |= 8; - SetVBlankCallback(sub_80BA0C0); - SetMainCallback2(sub_80BA0A8); - REG_DISPCNT = 0x7140; - taskId = CreateTask(sub_80BA258, 0); - TASK.WINDOW_SELECTED = BGM_WINDOW; - TASK.BGM_INDEX = 0; - TASK.SE_INDEX = 0; - TASK.UNK_DATA3 = 0; - gUnknown_020387B0 = 0; - TASK.UNK_DATA3 = 0; // why? - m4aSoundInit(); -} - -// Task_InitSoundCheckMenu -void sub_80BA258(u8 taskId) -{ - u8 soundcheckStr[sizeof(gDebugText_SoundCheckJap)]; - u8 bgmStr[sizeof(gDebugText_BGM)]; - u8 seStr[sizeof(gDebugText_SE)]; - u8 abDescStr[sizeof(gDebugText_ABDesc)]; - u8 upDownStr[sizeof(gDebugText_UpDown)]; - u8 driverStr[sizeof(gDebugText_DriverTest)]; - - memcpy(soundcheckStr, gDebugText_SoundCheckJap, sizeof(gDebugText_SoundCheckJap)); - memcpy(bgmStr, gDebugText_BGM, sizeof(gDebugText_BGM)); - memcpy(seStr, gDebugText_SE, sizeof(gDebugText_SE)); - memcpy(abDescStr, gDebugText_ABDesc, sizeof(gDebugText_ABDesc)); - memcpy(upDownStr, gDebugText_UpDown, sizeof(gDebugText_UpDown)); - memcpy(driverStr, gDebugText_DriverTest, sizeof(gDebugText_DriverTest)); - - if(!gPaletteFade.active) - { - MenuDrawTextWindow(0x2, 0, 0x1B, 0x3); - MenuDrawTextWindow(0x2, 0x5, 0x1B, 0xA); - MenuDrawTextWindow(0x2, 0xC, 0x1B, 0x11); - MenuPrint(soundcheckStr, 4, 1); - MenuPrint(abDescStr, 14, 1); - MenuPrint(bgmStr, 4, 6); - MenuPrint(upDownStr, 14, 6); - MenuPrint(seStr, 4, 13); - MenuPrint(upDownStr, 14, 13); - MenuPrint(driverStr, 14, 18); - TASK.FUNC = sub_80BA384; - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(1, 31); - } -} - -void sub_80BA384(u8 taskId) // Task_HandleDrawingSoundCheckMenuText -{ - sub_80BA6B8(TASK.WINDOW_SELECTED); - sub_80BA700(TASK.BGM_INDEX + BGM_STOP, 7, 8); // print by BGM index - sub_80BA79C(gBGMNames[TASK.BGM_INDEX], 11, 8); - sub_80BA700(TASK.SE_INDEX, 7, 15); - sub_80BA79C(gSENames[TASK.SE_INDEX], 11, 15); - TASK.FUNC = sub_80BA65C; -} - -#ifdef NONMATCHING -bool8 sub_80BA400(u8 taskId) // Task_ProcessSoundCheckMenuInput -{ - if(gMain.newKeys & R_BUTTON) // driver test - { - TASK.FUNC = sub_80BA800; - return FALSE; - } - if(gMain.newKeys & L_BUTTON) - { - TASK.FUNC = sub_80BAF84; - return FALSE; - } - if(gMain.newKeys & START_BUTTON) - { - TASK.FUNC = sub_80BB25C; - return FALSE; - } - if(gMain.newKeys & A_BUTTON) // both these cases insist on non reuses of certain data variables and cause the function to not match. - { - if(TASK.WINDOW_SELECTED != 0) // is playing? - { - if(TASK.UNK_DATA4 != 0) - { - if(TASK.SE_INDEX != 0) // why are you insiting on a non signed halfword? - { - m4aSongNumStop(TASK.UNK_DATA4); - } - else - { - m4aSongNumStop(TASK.SE_INDEX); - TASK.UNK_DATA4 = TASK.SE_INDEX; - return FALSE; - } - } - else if(TASK.SE_INDEX == 0) // _080BA4BA - { - return FALSE; - } - // _080BA4C4 - m4aSongNumStart(TASK.SE_INDEX); - TASK.UNK_DATA4 = TASK.SE_INDEX; - return FALSE; - } - else // _080BA4D0 - { - if(TASK.UNK_DATA3 != 0) - { - if(TASK.BGM_INDEX != 0) - { - m4aSongNumStop(TASK.UNK_DATA3 + BGM_STOP); - } - else // _080BA500 - { - m4aSongNumStop(TASK.UNK_DATA3 + BGM_STOP); - TASK.UNK_DATA3 = TASK.BGM_INDEX; - return FALSE; - } - } - else if(TASK.BGM_INDEX == 0) // _080BA514 - return FALSE; - - m4aSongNumStart(TASK.BGM_INDEX + BGM_STOP); - TASK.UNK_DATA3 = TASK.BGM_INDEX; - } - return FALSE; - } - if(gMain.newKeys & B_BUTTON) - { - m4aSongNumStart(5); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - TASK.FUNC = sub_80BA68C; - return FALSE; - } - if(gMain.newAndRepeatedKeys & DPAD_UP) - { - TASK.data[8] ^= A_BUTTON; // huh? - return TRUE; - } - if(gMain.newAndRepeatedKeys & DPAD_DOWN) - { - TASK.data[8] ^= A_BUTTON; // huh? - return TRUE; - } - else - { - u16 keys = gMain.newAndRepeatedKeys & DPAD_RIGHT; - if(keys) - { - if(TASK.WINDOW_SELECTED != 0) - { - if(TASK.SE_INDEX > 0) - { - TASK.SE_INDEX--; - } - else - { - TASK.SE_INDEX = 0xF7; - } - } - else if(TASK.BGM_INDEX > 0) - { - TASK.BGM_INDEX--; - } - else - { - TASK.BGM_INDEX = 0x75; - } - return TRUE; - } - if(gMain.newAndRepeatedKeys & DPAD_LEFT) - { - if(TASK.WINDOW_SELECTED != 0) - { - if(TASK.SE_INDEX < 0xF7) - { - TASK.SE_INDEX++; - } - else - { - TASK.SE_INDEX = keys; // ?? - } - } - else if(TASK.BGM_INDEX < 0x75) - { - TASK.BGM_INDEX++; - return TRUE; - } - else - { - TASK.BGM_INDEX = TASK.SE_INDEX; - return TRUE; - } - return TRUE; - } - if(gMain.heldKeys & SELECT_BUTTON) - { - gUnknown_020387B0 = A_BUTTON; - return FALSE; - } - else - { - gUnknown_020387B0 = (gMain.heldKeys & SELECT_BUTTON); - return FALSE; - } - } -} -#else -__attribute__((naked)) -bool8 sub_80BA400(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldr r2, _080BA428 @ =gMain\n\ - ldrh r1, [r2, 0x2E]\n\ - movs r0, 0x80\n\ - lsls r0, 1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA434\n\ - ldr r0, _080BA42C @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldr r0, _080BA430 @ =sub_80BA800\n\ - str r0, [r1]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA428: .4byte gMain\n\ -_080BA42C: .4byte gTasks\n\ -_080BA430: .4byte sub_80BA800\n\ -_080BA434:\n\ - movs r0, 0x80\n\ - lsls r0, 2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA458\n\ - ldr r0, _080BA450 @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldr r0, _080BA454 @ =sub_80BAF84\n\ - str r0, [r1]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA450: .4byte gTasks\n\ -_080BA454: .4byte sub_80BAF84\n\ -_080BA458:\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA478\n\ - ldr r0, _080BA470 @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldr r0, _080BA474 @ =sub_80BB25C\n\ - str r0, [r1]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA470: .4byte gTasks\n\ -_080BA474: .4byte sub_80BB25C\n\ -_080BA478:\n\ - movs r6, 0x1\n\ - movs r5, 0x1\n\ - ands r5, r1\n\ - cmp r5, 0\n\ - beq _080BA538\n\ - ldr r0, _080BA4AC @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r5, r1, r0\n\ - movs r1, 0x8\n\ - ldrsh r0, [r5, r1]\n\ - cmp r0, 0\n\ - beq _080BA4D0\n\ - movs r2, 0x10\n\ - ldrsh r0, [r5, r2]\n\ - cmp r0, 0\n\ - beq _080BA4BA\n\ - movs r3, 0xC\n\ - ldrsh r4, [r5, r3]\n\ - cmp r4, 0\n\ - beq _080BA4B0\n\ - ldrh r0, [r5, 0x10]\n\ - bl m4aSongNumStop\n\ - b _080BA4C4\n\ - .align 2, 0\n\ -_080BA4AC: .4byte gTasks\n\ -_080BA4B0:\n\ - ldrh r0, [r5, 0x10]\n\ - bl m4aSongNumStop\n\ - strh r4, [r5, 0x10]\n\ - b _080BA64C\n\ -_080BA4BA:\n\ - movs r4, 0xC\n\ - ldrsh r0, [r5, r4]\n\ - cmp r0, 0\n\ - bne _080BA4C4\n\ - b _080BA64C\n\ -_080BA4C4:\n\ - ldrh r0, [r5, 0xC]\n\ - bl m4aSongNumStart\n\ - ldrh r0, [r5, 0xC]\n\ - strh r0, [r5, 0x10]\n\ - b _080BA64C\n\ -_080BA4D0:\n\ - ldrh r1, [r5, 0xE]\n\ - movs r2, 0xE\n\ - ldrsh r0, [r5, r2]\n\ - cmp r0, 0\n\ - beq _080BA514\n\ - movs r3, 0xA\n\ - ldrsh r4, [r5, r3]\n\ - cmp r4, 0\n\ - beq _080BA500\n\ - ldr r0, _080BA4FC @ =0x0000015d\n\ - adds r4, r0, 0\n\ - adds r0, r1, r4\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl m4aSongNumStop\n\ - ldrh r1, [r5, 0xA]\n\ - adds r4, r1\n\ - lsls r4, 16\n\ - lsrs r4, 16\n\ - adds r0, r4, 0\n\ - b _080BA528\n\ - .align 2, 0\n\ -_080BA4FC: .4byte 0x0000015d\n\ -_080BA500:\n\ - ldr r2, _080BA510 @ =0x0000015d\n\ - adds r0, r1, r2\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl m4aSongNumStop\n\ - strh r4, [r5, 0xE]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA510: .4byte 0x0000015d\n\ -_080BA514:\n\ - ldrh r1, [r5, 0xA]\n\ - movs r3, 0xA\n\ - ldrsh r0, [r5, r3]\n\ - cmp r0, 0\n\ - bne _080BA520\n\ - b _080BA64C\n\ -_080BA520:\n\ - ldr r4, _080BA534 @ =0x0000015d\n\ - adds r0, r1, r4\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ -_080BA528:\n\ - bl m4aSongNumStart\n\ - ldrh r0, [r5, 0xA]\n\ - strh r0, [r5, 0xE]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA534: .4byte 0x0000015d\n\ -_080BA538:\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA570\n\ - movs r0, 0x5\n\ - bl m4aSongNumStart\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - str r5, [sp]\n\ - movs r1, 0\n\ - movs r2, 0\n\ - movs r3, 0x10\n\ - bl BeginNormalPaletteFade\n\ - ldr r1, _080BA568 @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldr r1, _080BA56C @ =sub_80BA68C\n\ - str r1, [r0]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA568: .4byte gTasks\n\ -_080BA56C: .4byte sub_80BA68C\n\ -_080BA570:\n\ - ldrh r1, [r2, 0x30]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080BA582\n\ - movs r0, 0x80\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA59C\n\ -_080BA582:\n\ - ldr r0, _080BA598 @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldrh r0, [r1, 0x8]\n\ - eors r0, r6\n\ - strh r0, [r1, 0x8]\n\ -_080BA592:\n\ - movs r0, 0x1\n\ - b _080BA64E\n\ - .align 2, 0\n\ -_080BA598: .4byte gTasks\n\ -_080BA59C:\n\ - movs r0, 0x10\n\ - ands r0, r1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0\n\ - beq _080BA5EA\n\ - ldr r0, _080BA5CC @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - movs r2, 0x8\n\ - ldrsh r0, [r1, r2]\n\ - cmp r0, 0\n\ - beq _080BA5D6\n\ - ldrh r2, [r1, 0xC]\n\ - movs r3, 0xC\n\ - ldrsh r0, [r1, r3]\n\ - cmp r0, 0\n\ - ble _080BA5D0\n\ - subs r0, r2, 0x1\n\ - strh r0, [r1, 0xC]\n\ - b _080BA592\n\ - .align 2, 0\n\ -_080BA5CC: .4byte gTasks\n\ -_080BA5D0:\n\ - movs r0, 0xF7\n\ - strh r0, [r1, 0xC]\n\ - b _080BA592\n\ -_080BA5D6:\n\ - ldrh r2, [r1, 0xA]\n\ - movs r4, 0xA\n\ - ldrsh r0, [r1, r4]\n\ - cmp r0, 0\n\ - ble _080BA5E4\n\ - subs r0, r2, 0x1\n\ - b _080BA5E6\n\ -_080BA5E4:\n\ - movs r0, 0x75\n\ -_080BA5E6:\n\ - strh r0, [r1, 0xA]\n\ - b _080BA592\n\ -_080BA5EA:\n\ - movs r0, 0x20\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA630\n\ - ldr r1, _080BA614 @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r1, r0, r1\n\ - movs r0, 0x8\n\ - ldrsh r2, [r1, r0]\n\ - cmp r2, 0\n\ - beq _080BA61C\n\ - ldrh r2, [r1, 0xC]\n\ - movs r4, 0xC\n\ - ldrsh r0, [r1, r4]\n\ - cmp r0, 0xF6\n\ - bgt _080BA618\n\ - adds r0, r2, 0x1\n\ - strh r0, [r1, 0xC]\n\ - b _080BA592\n\ - .align 2, 0\n\ -_080BA614: .4byte gTasks\n\ -_080BA618:\n\ - strh r3, [r1, 0xC]\n\ - b _080BA592\n\ -_080BA61C:\n\ - ldrh r3, [r1, 0xA]\n\ - movs r4, 0xA\n\ - ldrsh r0, [r1, r4]\n\ - cmp r0, 0x74\n\ - bgt _080BA62C\n\ - adds r0, r3, 0x1\n\ - strh r0, [r1, 0xA]\n\ - b _080BA592\n\ -_080BA62C:\n\ - strh r2, [r1, 0xA]\n\ - b _080BA592\n\ -_080BA630:\n\ - ldrh r1, [r2, 0x2C]\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - cmp r1, 0\n\ - beq _080BA648\n\ - ldr r0, _080BA644 @ =gUnknown_020387B0\n\ - strb r6, [r0]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA644: .4byte gUnknown_020387B0\n\ -_080BA648:\n\ - ldr r0, _080BA658 @ =gUnknown_020387B0\n\ - strb r1, [r0]\n\ -_080BA64C:\n\ - movs r0, 0\n\ -_080BA64E:\n\ - add sp, 0x4\n\ - pop {r4-r6}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080BA658: .4byte gUnknown_020387B0\n\ - .syntax divided"); -} -#endif - -void sub_80BA65C(u8 taskId) -{ - if(sub_80BA400(taskId) != FALSE) - TASK.FUNC = sub_80BA384; -} - -void sub_80BA68C(u8 taskId) -{ - if(!gPaletteFade.active) - { - DestroyTask(taskId); - SetMainCallback2(CB2_InitTitleScreen); - } -} - -void sub_80BA6B8(u8 windowType) -{ - switch(windowType) - { - case BGM_WINDOW: - default: - REG_WIN1H = WIN_RANGE(17, 223); - REG_WIN1V = WIN_RANGE(41, 87); - break; - case SE_WINDOW: - REG_WIN1H = WIN_RANGE(17, 223); - REG_WIN1V = WIN_RANGE(97, 143); - break; - } -} - -void sub_80BA700(u16 soundIndex, u16 x, u16 y) // PrintSoundNumber ? -{ - u8 i; - u8 str[5]; - bool8 someBool; - u8 divisorValue; - - for(i = 0; i < 3; i++) - str[i] = 0; // initialize array - - str[3] = CHAR_ELLIPSIS; - str[4] = EOS; - someBool = FALSE; - - divisorValue = soundIndex / 100; - if(divisorValue) - { - str[0] = divisorValue + CHAR_0; - someBool = TRUE; - } - - divisorValue = (soundIndex % 100) / 10; - if(divisorValue || someBool != FALSE) - str[1] = divisorValue + CHAR_0; - - str[2] = ((soundIndex % 100) % 10) + CHAR_0; - MenuPrint(str, x, y); -} - -void sub_80BA79C(const u8 *const string, u16 x, u16 y) -{ - u8 i; - u8 str[11]; - - for(i = 0; i < 11; i++) - str[i] = 0; // format string. - - str[10] = EOS; // the above for loop formats the last element of the array unnecessarily. - - for(i = 0; string[i] != EOS && i < 10; i++) - str[i] = string[i]; - - MenuPrint(str, x, y); -} - -void sub_80BA800(u8 taskId) // Task_DrawDriverTestMenu -{ - u8 bbackStr[sizeof(gDebugText_BBack)]; - u8 aplayStr[sizeof(gDebugText_APlay)]; - u8 voiceStr[sizeof(gDebugText_Voice)]; - u8 volumeStr[sizeof(gDebugText_Volume)]; - u8 panpotStr[sizeof(gDebugText_Panpot)]; - u8 pitchStr[sizeof(gDebugText_Pitch)]; - u8 lengthStr[sizeof(gDebugText_Length)]; - u8 releaseStr[sizeof(gDebugText_Release)]; - u8 progressStr[sizeof(gDebugText_Progress)]; - u8 chorusStr[sizeof(gDebugText_Chorus)]; - u8 priorityStr[sizeof(gDebugText_Priority)]; - u8 playingStr[sizeof(gDebugText_Playing)]; - u8 reverseStr[sizeof(gDebugText_Reverse)]; - u8 stereoStr[sizeof(gDebugText_Stereo)]; - - memcpy(bbackStr, gDebugText_BBack, sizeof(gDebugText_BBack)); - memcpy(aplayStr, gDebugText_APlay, sizeof(gDebugText_APlay)); - memcpy(voiceStr, gDebugText_Voice, sizeof(gDebugText_Voice)); - memcpy(volumeStr, gDebugText_Volume, sizeof(gDebugText_Volume)); - memcpy(panpotStr, gDebugText_Panpot, sizeof(gDebugText_Panpot)); - memcpy(pitchStr, gDebugText_Pitch, sizeof(gDebugText_Pitch)); - memcpy(lengthStr, gDebugText_Length, sizeof(gDebugText_Length)); - memcpy(releaseStr, gDebugText_Release, sizeof(gDebugText_Release)); - memcpy(progressStr, gDebugText_Progress, sizeof(gDebugText_Progress)); - memcpy(chorusStr, gDebugText_Chorus, sizeof(gDebugText_Chorus)); - memcpy(priorityStr, gDebugText_Priority, sizeof(gDebugText_Priority)); - memcpy(playingStr, gDebugText_Playing, sizeof(gDebugText_Playing)); - memcpy(reverseStr, gDebugText_Reverse, sizeof(gDebugText_Reverse)); - memcpy(stereoStr, gDebugText_Stereo, sizeof(gDebugText_Stereo)); - - REG_DISPCNT = 0x3140; - MenuDrawTextWindow(0, 0, 0x1D, 0x13); - MenuPrint(bbackStr, 0x13, 0x4); - MenuPrint(aplayStr, 0x13, 0x2); - MenuPrint(voiceStr, 0x2, 0x1); - MenuPrint(volumeStr, 0x2, 0x3); - MenuPrint(panpotStr, 0x2, 0x5); - MenuPrint(pitchStr, 0x2, 0x7); - MenuPrint(lengthStr, 0x2, 0x9); - MenuPrint(releaseStr, 0x2, 0xB); - MenuPrint(progressStr, 0x2, 0xD); - MenuPrint(chorusStr, 0x2, 0xF); - MenuPrint(priorityStr, 0x2, 0x11); - MenuPrint(playingStr, 0x13, 0x10); - MenuPrint(reverseStr, 0x13, 0xE); - MenuPrint(stereoStr, 0x13, 0xC); - REG_WIN0H = WIN_RANGE(0, 240); - REG_WIN0V = WIN_RANGE(0, 160); - gUnknown_020387B3 = 0; - gUnknown_020387B1 = 0; - gUnknown_020387B2 = 0; - gUnknown_03005D30 = NULL; - gUnknown_020387D8 = 0; - gUnknown_020387D9 = 1; - gUnknown_020387B4[CRY_TEST_UNK0] = 0; - gUnknown_020387B4[CRY_TEST_VOLUME] = 0x78; - gUnknown_020387B4[CRY_TEST_PANPOT] = 0; - gUnknown_020387B4[CRY_TEST_PITCH] = 0x3C00; - gUnknown_020387B4[CRY_TEST_LENGTH] = 0xB4; - gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; - gUnknown_020387B4[CRY_TEST_RELEASE] = 0; - gUnknown_020387B4[CRY_TEST_CHORUS] = 0; - gUnknown_020387B4[CRY_TEST_PRIORITY] = 2; - sub_80BAD5C(); - sub_80BAE10(0, 0); - TASK.FUNC = sub_80BAA48; -} - -void sub_80BAA48(u8 taskId) // Task_ProcessDriverTestInput -{ - if(gMain.newKeys & B_BUTTON) - { - REG_DISPCNT = 0x7140; - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(1, 31); - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - TASK.FUNC = sub_80BA258; - return; - } - if(gMain.newAndRepeatedKeys & DPAD_UP) // _080BAAA8 - { - u8 backupVar = gUnknown_020387B3; - if(--gUnknown_020387B3 < 0) - gUnknown_020387B3 = 8; - - sub_80BAE10(backupVar, gUnknown_020387B3); - return; - } - if(gMain.newAndRepeatedKeys & DPAD_DOWN) // _080BAAD0 - { - u8 backupVar = gUnknown_020387B3; - if(++gUnknown_020387B3 > 8) - gUnknown_020387B3 = 0; - - sub_80BAE10(backupVar, gUnknown_020387B3); - return; - } - if(gMain.newKeys & START_BUTTON) // _080BAAF8 - { - gUnknown_020387D8 ^= 1; - sub_80BAD5C(); - return; - } - if(gMain.newKeys & SELECT_BUTTON) // _080BAB14 - { - gUnknown_020387D9 ^= 1; - sub_80BAD5C(); - SetPokemonCryStereo(gUnknown_020387D9); - return; - } - if(gMain.newAndRepeatedKeys & R_BUTTON) // _080BAB38 - { - sub_80BACDC(10); - sub_80BAD5C(); - return; - } - if(gMain.newAndRepeatedKeys & L_BUTTON) // _080BAB46 - { - sub_80BACDC(-10); - sub_80BAD5C(); - return; - } - if(gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BAB56 - { - sub_80BACDC(-1); - sub_80BAD5C(); - return; - } - if(gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BAB64 - { - sub_80BACDC(1); - sub_80BAD5C(); - return; - } - if(gMain.newKeys & A_BUTTON) // _080BAB78 - { - u8 divide, remaining; - - SetPokemonCryVolume(gUnknown_020387B4[CRY_TEST_VOLUME]); - SetPokemonCryPanpot(gUnknown_020387B4[CRY_TEST_PANPOT]); - SetPokemonCryPitch(gUnknown_020387B4[CRY_TEST_PITCH]); - SetPokemonCryLength(gUnknown_020387B4[CRY_TEST_LENGTH]); - SetPokemonCryProgress(gUnknown_020387B4[CRY_TEST_PROGRESS]); - SetPokemonCryRelease(gUnknown_020387B4[CRY_TEST_RELEASE]); - SetPokemonCryChorus(gUnknown_020387B4[CRY_TEST_CHORUS]); - SetPokemonCryPriority(gUnknown_020387B4[CRY_TEST_PRIORITY]); - - remaining = gUnknown_020387B4[CRY_TEST_UNK0] % 128; - divide = gUnknown_020387B4[CRY_TEST_UNK0] / 128; - - switch(divide) - { - case 0: - if(gUnknown_020387D8) - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84537C0[remaining]); - else - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452590[remaining]); - break; - case 1: - if(gUnknown_020387D8) - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453DC0[remaining]); - else - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452B90[remaining]); - break; - case 2: - if(gUnknown_020387D8) - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84543C0[remaining]); - else - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453190[remaining]); - break; - case 3: - if(gUnknown_020387D8) - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84549C0[remaining]); - else - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453790[remaining]); - break; - } - } - - // _080BACA2 - if(gUnknown_03005D30 != NULL) - { - gUnknown_020387B1 = IsPokemonCryPlaying(gUnknown_03005D30); - - if(gUnknown_020387B1 != gUnknown_020387B2) - sub_80BAD5C(); - - gUnknown_020387B2 = gUnknown_020387B1; - } -} - -void sub_80BACDC(s8 var) -{ - int minMaxArray[ARRAY_COUNT(gUnknown_083D039C)]; - - memcpy(minMaxArray, gUnknown_083D039C, sizeof(gUnknown_083D039C)); - gUnknown_020387B4[gUnknown_020387B3] += var; - - if(gUnknown_020387B4[gUnknown_020387B3] > minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MAX)]) - gUnknown_020387B4[gUnknown_020387B3] = minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MIN)]; - - if(gUnknown_020387B4[gUnknown_020387B3] < minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MIN)]) - gUnknown_020387B4[gUnknown_020387B3] = minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MAX)]; -} - -void sub_80BAD5C(void) -{ - sub_80BAE78(gUnknown_020387B4[CRY_TEST_UNK0] + 1, 0xB, 0x1, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_VOLUME], 0xB, 0x3, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_PANPOT], 0xB, 0x5, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_PITCH], 0xB, 0x7, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_LENGTH], 0xB, 0x9, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_RELEASE], 0xB, 0xB, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_PROGRESS], 0xB, 0xD, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_CHORUS], 0xB, 0xF, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_PRIORITY], 0xB, 0x11, 0x5); - sub_80BAE78(gUnknown_020387B1, 0x1B, 0x10, 0x1); - sub_80BAE78(gUnknown_020387D8, 0x1B, 0xE, 0x1); - sub_80BAE78(gUnknown_020387D9, 0x1B, 0xC, 0x1); -} - -void sub_80BAE10(u8 var1, u8 var2) -{ - u8 str1[sizeof(gUnknown_083D03DC)]; - u8 str2[sizeof(gUnknown_083D03DE)]; - - memcpy(str1, gUnknown_083D03DC, sizeof(gUnknown_083D03DC)); - memcpy(str2, gUnknown_083D03DE, sizeof(gUnknown_083D03DE)); - - MenuPrint(str2, gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 1)]); - MenuPrint(str1, gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 1)]); -} - -/*void sub_80BAE78(int var1, u16 var2, u16 var3, u8 var4) -{ - u32 powers[6]; - u8 str[8]; - u8 i; - u8 someVar, someVar2; - - memcpy(powers, gUnknown_083D03E0, sizeof(powers); - - for(i = 0; i < var4; i++) - str[i] = 0; - - str[var4 + 1] = CHAR_0; - someVar = 0; - - if(var1 < 0) // make absolute value? wtf - { - var1 = -var1; // just use abs? - someVar = 1; - } - - // _080BAED6 - someVar2 = 0; - if(var4 == 1) - someVar2 = 1; - - // _080BAEE2 - for(;;) - { - - } -}*/ - -// no. -__attribute__((naked)) -void sub_80BAE78(int var1, u16 var2, u16 var3, u8 var4) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x2C\n\ - mov r8, r0\n\ - lsls r1, 16\n\ - lsrs r6, r1, 16\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - lsls r3, 24\n\ - lsrs r7, r3, 24\n\ - mov r1, sp\n\ - ldr r0, _080BAF80 @ =gUnknown_083D03E0\n\ - ldm r0!, {r3-r5}\n\ - stm r1!, {r3-r5}\n\ - ldm r0!, {r3-r5}\n\ - stm r1!, {r3-r5}\n\ - movs r5, 0\n\ - add r0, sp, 0x18\n\ - mov r9, r0\n\ - cmp r5, r7\n\ - bgt _080BAEC0\n\ - mov r4, r9\n\ - movs r3, 0\n\ -_080BAEAC:\n\ - lsls r0, r5, 24\n\ - asrs r0, 24\n\ - adds r1, r4, r0\n\ - strb r3, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, r7\n\ - ble _080BAEAC\n\ -_080BAEC0:\n\ - adds r0, r7, 0x1\n\ - add r0, r9\n\ - movs r1, 0xFF\n\ - strb r1, [r0]\n\ - movs r1, 0\n\ - mov r3, r8\n\ - cmp r3, 0\n\ - bge _080BAED6\n\ - negs r3, r3\n\ - mov r8, r3\n\ - movs r1, 0x1\n\ -_080BAED6:\n\ - movs r4, 0\n\ - mov r10, r4\n\ - cmp r7, 0x1\n\ - bne _080BAEE2\n\ - movs r5, 0x1\n\ - mov r10, r5\n\ -_080BAEE2:\n\ - subs r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - lsls r0, r5, 24\n\ - lsls r6, 24\n\ - str r6, [sp, 0x24]\n\ - lsls r2, 24\n\ - str r2, [sp, 0x28]\n\ - cmp r0, 0\n\ - blt _080BAF62\n\ - str r1, [sp, 0x20]\n\ -_080BAEF8:\n\ - asrs r6, r0, 24\n\ - lsls r0, r6, 2\n\ - add r0, sp\n\ - ldr r1, [r0]\n\ - mov r0, r8\n\ - bl __divsi3\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - cmp r0, 0\n\ - bne _080BAF1A\n\ - mov r0, r10\n\ - cmp r0, 0\n\ - bne _080BAF1A\n\ - lsls r4, r5, 24\n\ - cmp r6, 0\n\ - bne _080BAF46\n\ -_080BAF1A:\n\ - lsls r4, r5, 24\n\ - ldr r3, [sp, 0x20]\n\ - cmp r3, 0\n\ - beq _080BAF34\n\ - mov r5, r10\n\ - cmp r5, 0\n\ - bne _080BAF34\n\ - asrs r0, r4, 24\n\ - subs r0, r7, r0\n\ - subs r0, 0x1\n\ - add r0, r9\n\ - movs r1, 0xAE\n\ - strb r1, [r0]\n\ -_080BAF34:\n\ - asrs r1, r4, 24\n\ - subs r1, r7, r1\n\ - add r1, r9\n\ - lsls r0, r2, 24\n\ - asrs r0, 24\n\ - subs r0, 0x5F\n\ - strb r0, [r1]\n\ - movs r0, 0x1\n\ - mov r10, r0\n\ -_080BAF46:\n\ - asrs r4, 24\n\ - lsls r0, r4, 2\n\ - add r0, sp\n\ - ldr r1, [r0]\n\ - mov r0, r8\n\ - bl __modsi3\n\ - mov r8, r0\n\ - subs r4, 0x1\n\ - lsls r4, 24\n\ - lsrs r5, r4, 24\n\ - lsls r0, r5, 24\n\ - cmp r0, 0\n\ - bge _080BAEF8\n\ -_080BAF62:\n\ - ldr r3, [sp, 0x24]\n\ - lsrs r1, r3, 24\n\ - ldr r4, [sp, 0x28]\n\ - lsrs r2, r4, 24\n\ - mov r0, r9\n\ - bl MenuPrint\n\ - add sp, 0x2C\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080BAF80: .4byte gUnknown_083D03E0\n\ - .syntax divided"); -} - -void sub_80BAF84(u8 taskId) -{ - u8 seStr[sizeof(gOtherText_SE)]; - u8 panStr[sizeof(gOtherText_Pan)]; - u8 playingStr[sizeof(gDebugText_Playing)]; - - memcpy(seStr, gOtherText_SE, sizeof(gOtherText_SE)); - memcpy(panStr, gOtherText_Pan, sizeof(gOtherText_Pan)); - memcpy(playingStr, gDebugText_Playing, sizeof(gDebugText_Playing)); - - REG_DISPCNT = 0x3140; - MenuDrawTextWindow(0, 0, 0x1D, 0x13); - MenuPrint(seStr, 3, 2); - MenuPrint(panStr, 3, 4); - MenuPrint(playingStr, 3, 8); - REG_WIN0H = WIN_RANGE(0, 240); - REG_WIN0V = WIN_RANGE(0, 160); - gUnknown_020387B4[CRY_TEST_UNK0] = 1; - gUnknown_020387B4[CRY_TEST_PANPOT] = 0; - gUnknown_020387B4[CRY_TEST_CHORUS] = 0; - gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; - gUnknown_020387B4[CRY_TEST_RELEASE] = 0; - sub_80BB1D4(); - TASK.FUNC = sub_80BB038; -} - -void sub_80BB038(u8 taskId) -{ - sub_80BB1D4(); - if(gUnknown_020387B4[CRY_TEST_PROGRESS]) - { - if(gUnknown_020387B4[CRY_TEST_RELEASE]) - { - gUnknown_020387B4[CRY_TEST_RELEASE]--; - } - else // _080BB05C - { - s8 panpot = gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]; - if(panpot != -128) - { - if(panpot == 0x7F) - { - gUnknown_020387B4[CRY_TEST_CHORUS] += 2; - if(gUnknown_020387B4[CRY_TEST_CHORUS] < 0x3F) - SE12PanpotControl(gUnknown_020387B4[CRY_TEST_CHORUS]); - } - } - else // _080BB08C - { - gUnknown_020387B4[CRY_TEST_CHORUS] -= 2; - if(gUnknown_020387B4[CRY_TEST_CHORUS] > -0x40) - SE12PanpotControl(gUnknown_020387B4[CRY_TEST_CHORUS]); - } - } - } - // _080BB0A2 - if(gMain.newKeys & B_BUTTON) - { - REG_DISPCNT = 0x7140; - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(1, 31); - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - TASK.FUNC = sub_80BA258; - return; - } - if(gMain.newKeys & A_BUTTON) // _080BB104 - { - s8 panpot = gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]; - if(panpot != -128) - { - if(panpot == 0x7F) - { - PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], -0x40); - gUnknown_020387B4[CRY_TEST_CHORUS] = -0x40; - gUnknown_020387B4[CRY_TEST_PROGRESS] = 1; - gUnknown_020387B4[CRY_TEST_RELEASE] = 0x1E; - return; - } - } - else // _080BB140 - { - PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], 0x3F); - gUnknown_020387B4[CRY_TEST_CHORUS] = 0x3F; - gUnknown_020387B4[CRY_TEST_PROGRESS] = 1; - gUnknown_020387B4[CRY_TEST_RELEASE] = 0x1E; - return; - } - // _080BB154 - PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], panpot); - gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; - return; - } - if(gMain.newKeys & L_BUTTON) // _080BB15E - { - gUnknown_020387B4[CRY_TEST_PANPOT]++; - if(gUnknown_020387B4[CRY_TEST_PANPOT] > 4) - gUnknown_020387B4[CRY_TEST_PANPOT] = 0; - } - if(gMain.newKeys & R_BUTTON) // _080BB176 - { - gUnknown_020387B4[CRY_TEST_PANPOT]--; - if(gUnknown_020387B4[CRY_TEST_PANPOT] < 0) - gUnknown_020387B4[CRY_TEST_PANPOT] = 4; - } - if(gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BB192 - { - gUnknown_020387B4[CRY_TEST_UNK0]++; - if(gUnknown_020387B4[CRY_TEST_UNK0] > 0xF7) - gUnknown_020387B4[CRY_TEST_UNK0] = 0; - } - else if(gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BB1B0 - { - gUnknown_020387B4[CRY_TEST_UNK0]--; - if(gUnknown_020387B4[CRY_TEST_UNK0] < 0) - gUnknown_020387B4[CRY_TEST_UNK0] = 0xF7; - } -} - -void sub_80BB1D4(void) -{ - u8 lrStr[sizeof(gOtherText_LR)]; - u8 rlStr[sizeof(gOtherText_RL)]; - - memcpy(lrStr, gOtherText_LR, sizeof(lrStr)); - memcpy(rlStr, gOtherText_RL, sizeof(rlStr)); - - sub_80BAE78(gUnknown_020387B4[CRY_TEST_UNK0], 7, 2, 3); - - switch(gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]) - { - case 0x7F: - MenuPrint(lrStr, 7, 4); - break; - case -0x80: - MenuPrint(rlStr, 7, 4); - break; - default: - sub_80BAE78(gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]], 7, 4, 3); - break; - } - sub_80BAE78(IsSEPlaying(), 12, 8, 1); -} - -void sub_80BB25C(u8 taskId) -{ - struct CryRelatedStruct cryStruct, cryStruct2; - u8 zero; - - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - gUnknown_03005D34 = 1; - ResetSpriteData(); - FreeAllSpritePalettes(); - - cryStruct.unk0 = 0x2000; - cryStruct.unk2 = 29; - cryStruct.paletteNo = 12; - cryStruct.yPos = 30; - cryStruct.xPos = 4; - - zero = 0; // wtf? - gUnknown_03005E98 = 0; - - while(sub_8119E3C(&cryStruct, 3) == FALSE); - - cryStruct2.unk0 = 0; - cryStruct2.unk2 = 15; - cryStruct2.paletteNo = 13; - cryStruct2.xPos = 12; - cryStruct2.yPos = 12; - - zero = 0; // wtf? - gUnknown_03005E98 = 0; - - while(ShowPokedexCryScreen(&cryStruct2, 2) == FALSE); - - MenuDrawTextWindow(0, 16, 5, 19); - sub_80BB494(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG2CNT = 0xF01; - REG_BG3CNT = 0x1D03; - REG_DISPCNT = 0x1d40; - m4aMPlayFadeOutTemporarily(&gMPlay_BGM, 2); - TASK.FUNC = sub_80BB3B4; -} - -void sub_80BB3B4(u8 taskId) -{ - sub_8119F88(3); - - if(gMain.newKeys & A_BUTTON) - { - sub_811A050(gUnknown_03005D34); - } - if(gMain.newKeys & R_BUTTON) - { - StopCryAndClearCrySongs(); - } - if(gMain.newAndRepeatedKeys & DPAD_UP) - { - if(--gUnknown_03005D34 == 0) - gUnknown_03005D34 = 384; // total species - sub_80BB494(); - } - if(gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if(++gUnknown_03005D34 > 384) - gUnknown_03005D34 = 1; - sub_80BB494(); - } - if(gMain.newKeys & B_BUTTON) - { - REG_DISPCNT = 0x7140; - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(1, 31); - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - TASK.FUNC = sub_80BA258; - DestroyCryMeterNeedleSprite(); - } -} - -void sub_80BB494(void) -{ - sub_80BAE78(gUnknown_03005D34, 1, 17, 3); -} diff --git a/src/sprite.c b/src/sprite.c deleted file mode 100644 index fb8c2b648..000000000 --- a/src/sprite.c +++ /dev/null @@ -1,1802 +0,0 @@ -#include "global.h" -#include "sprite.h" -#include "main.h" -#include "menu_cursor.h" -#include "palette.h" - -#define MAX_SPRITE_COPY_REQUESTS 64 - -#define OAM_MATRIX_COUNT 32 - -#define SET_SPRITE_TILE_RANGE(index, start, count) \ -{ \ - sSpriteTileRanges[index * 2] = start; \ - (sSpriteTileRanges + 1)[index * 2] = count; \ -} - -#define ALLOC_SPRITE_TILE(n) \ -{ \ - gSpriteTileAllocBitmap[(n) / 8] |= (1 << ((n) % 8)); \ -} - -#define FREE_SPRITE_TILE(n) \ -{ \ - gSpriteTileAllocBitmap[(n) / 8] &= ~(1 << ((n) % 8)); \ -} - -#define SPRITE_TILE_IS_ALLOCATED(n) ((gSpriteTileAllocBitmap[(n) / 8] >> ((n) % 8)) & 1) - -struct OamMatrix -{ - s16 a; - s16 b; - s16 c; - s16 d; -}; - -struct SpriteCopyRequest -{ - const u8 *src; - u8 *dest; - u16 size; -}; - -struct OamDimensions -{ - s8 width; - s8 height; -}; - -static void UpdateOamCoords(void); -static void BuildSpritePriorities(void); -static void SortSprites(void); -static void CopyMatricesToOamBuffer(void); -static void AddSpritesToOamBuffer(void); -static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority); -static void ClearSpriteCopyRequests(void); -static void ResetOamMatrices(void); -static void ResetSprite(struct Sprite *sprite); -static s16 AllocSpriteTiles(u16 tileCount); -static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images); -static void ResetAllSprites(void); -static void BeginAnim(struct Sprite *sprite); -static void ContinueAnim(struct Sprite *sprite); -static void AnimCmd_frame(struct Sprite *sprite); -static void AnimCmd_end(struct Sprite *sprite); -static void AnimCmd_jump(struct Sprite *sprite); -static void AnimCmd_loop(struct Sprite *sprite); -static void BeginAnimLoop(struct Sprite *sprite); -static void ContinueAnimLoop(struct Sprite *sprite); -static void JumpToTopOfAnimLoop(struct Sprite *sprite); -static void BeginAffineAnim(struct Sprite *sprite); -static void ContinueAffineAnim(struct Sprite *sprite); -static void AffineAnimDelay(u8 matrixNum, struct Sprite *sprite); -static void AffineAnimCmd_loop(u8 matrixNum, struct Sprite *sprite); -static void BeginAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); -static void ContinueAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); -static void JumpToTopOfAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); -static void AffineAnimCmd_jump(u8 matrixNum, struct Sprite *sprite); -static void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite); -static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite); -static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix); -static u8 GetSpriteMatrixNum(struct Sprite *sprite); -static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip); -static void AffineAnimStateRestartAnim(u8 matrixNum); -static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum); -static void AffineAnimStateReset(u8 matrixNum); -static void ApplyAffineAnimFrameAbsolute(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); -static void DecrementAnimDelayCounter(struct Sprite *sprite); -static bool8 DecrementAffineAnimDelayCounter(struct Sprite *sprite, u8 matrixNum); -static void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); -static s16 ConvertScaleParam(s16 scale); -static void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd); -static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); -static void ResetAffineAnimData(void); -static u8 IndexOfSpriteTileTag(u16 tag); -static void AllocSpriteTileRange(u16 tag, u16 start, u16 count); -static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset); - -typedef void (*AnimFunc)(struct Sprite *); -typedef void (*AnimCmdFunc)(struct Sprite *); -typedef void (*AffineAnimCmdFunc)(u8 matrixNum, struct Sprite *); - -#define DUMMY_OAM_DATA \ -{ \ - 160, /* Y (off-screen) */ \ - 0, \ - 0, \ - 0, \ - 0, \ - 0, \ - 304, /* X */ \ - 0, \ - 0, \ - 0, \ - 3, /* lowest priority */ \ - 0, \ - 0 \ -} - -#define ANIM_END 0xFFFF -#define AFFINE_ANIM_END 0x7FFF - -// forward declarations -const union AnimCmd * const gDummySpriteAnimTable[]; -const union AffineAnimCmd * const gDummySpriteAffineAnimTable[]; -const struct SpriteTemplate gDummySpriteTemplate; - -// Unreferenced error message. -// It means "The DMA transfer request table has exceeded its limit." -static const u8 sDmaOverErrorMsg[] = - _( - "DMA OVER\n" - "DMAてんそう\n" - "リクエストテーブルが\n" - "オーバーしました" - ); - -// Unreferenced data. -static const u8 sUnknownData[24] = -{ - 0x01, 0x04, 0x10, 0x40, - 0x02, 0x04, 0x08, 0x20, - 0x02, 0x04, 0x08, 0x20, - 0x01, 0x04, 0x10, 0x40, - 0x02, 0x04, 0x08, 0x20, - 0x02, 0x04, 0x08, 0x20, -}; - -static const u8 sCenterToCornerVecTable[3][4][2] = -{ - { // square - { -4, -4 }, - { -8, -8 }, - { -16, -16 }, - { -32, -32 }, - }, - { // horizontal rectangle - { -8, -4 }, - { -16, -4 }, - { -16, -8 }, - { -32, -16 }, - }, - { // vertical rectangle - { -4, -8 }, - { -4, -16 }, - { -8, -16 }, - { -16, -32 }, - }, -}; - -static const struct Sprite sDummySprite = -{ - .oam = DUMMY_OAM_DATA, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .template = &gDummySpriteTemplate, - .subspriteTables = NULL, - .callback = SpriteCallbackDummy, - .pos1 = { 304, 160 }, - .pos2 = { 0, 0 }, - .centerToCornerVecX = 0, - .centerToCornerVecY = 0, - .animNum = 0, - .animCmdIndex = 0, - .animDelayCounter = 0, - .animPaused = 0, - .affineAnimPaused = 0, - .animLoopCounter = 0, - .data0 = 0, - .data1 = 0, - .data2 = 0, - .data3 = 0, - .data4 = 0, - .data5 = 0, - .data6 = 0, - .data7 = 0, - .inUse = 0, - .coordOffsetEnabled = 0, - .invisible = 0, - .flags_3 = 0, - .flags_4 = 0, - .flags_5 = 0, - .flags_6 = 0, - .flags_7 = 0, - .hFlip = 0, - .vFlip = 0, - .animBeginning = 0, - .affineAnimBeginning = 0, - .animEnded = 0, - .affineAnimEnded = 0, - .usingSheet = 0, - .flags_f = 0, - .sheetTileStart = 0, - .subspriteTableNum = 0, - .subspriteMode = 0, - .subpriority = 0xFF -}; - -const struct OamData gDummyOamData = DUMMY_OAM_DATA; - -static const union AnimCmd sDummyAnim = { ANIM_END }; - -const union AnimCmd * const gDummySpriteAnimTable[] = { &sDummyAnim }; - -static const union AffineAnimCmd sDummyAffineAnim = { AFFINE_ANIM_END }; - -const union AffineAnimCmd * const gDummySpriteAffineAnimTable[] = { &sDummyAffineAnim }; - -const struct SpriteTemplate gDummySpriteTemplate = -{ - .tileTag = 0, - .paletteTag = 0xFFFF, - .oam = &gDummyOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -// TODO: Find out what these are used for. -static const u16 sOamBitmasks[9] = -{ - 0xFF00, 0x00FF, 0x001F, - 0xFE00, 0x01FF, 0x03E0, - 0xFC00, 0x03FF, 0xFC00, -}; - -static const AnimFunc sAnimFuncs[] = -{ - ContinueAnim, - BeginAnim, -}; - -static const AnimFunc sAffineAnimFuncs[] = -{ - ContinueAffineAnim, - BeginAffineAnim, -}; - -static const AnimCmdFunc sAnimCmdFuncs[] = -{ - AnimCmd_loop, - AnimCmd_jump, - AnimCmd_end, - AnimCmd_frame, -}; - -static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] = -{ - AffineAnimCmd_loop, - AffineAnimCmd_jump, - AffineAnimCmd_end, - AffineAnimCmd_frame, -}; - -static const struct OamDimensions sOamDimensions[3][4] = -{ - { // square - { 8, 8 }, - { 16, 16 }, - { 32, 32 }, - { 64, 64 }, - }, - { // horizontal rectangle - { 16, 8 }, - { 32, 8 }, - { 32, 16 }, - { 64, 32 }, - }, - { // vertical rectangle - { 8, 16 }, - { 8, 32 }, - { 16, 32 }, - { 32, 64 }, - }, -}; - -static u16 sSpriteTileRangeTags[MAX_SPRITES]; -static u16 sSpriteTileRanges[MAX_SPRITES * 2]; -static struct AffineAnimState sAffineAnimStates[OAM_MATRIX_COUNT]; -static u16 sSpritePaletteTags[16]; - -u8 gSpriteOrder[MAX_SPRITES]; -bool8 gShouldProcessSpriteCopyRequests; -u8 gSpriteCopyRequestCount; -struct SpriteCopyRequest gSpriteCopyRequests[MAX_SPRITE_COPY_REQUESTS]; -u8 gOamLimit; -u16 gReservedSpriteTileCount; -u8 gSpriteTileAllocBitmap[128]; -s16 gSpriteCoordOffsetX; -s16 gSpriteCoordOffsetY; -u32 gOamMatrixAllocBitmap; -struct OamMatrix gOamMatrices[OAM_MATRIX_COUNT]; -u8 gReservedSpritePaletteCount; - -EWRAM_DATA struct Sprite gSprites[MAX_SPRITES + 1] = {0}; -EWRAM_DATA u16 gSpritePriorities[MAX_SPRITES] = {0}; -EWRAM_DATA u8 gAffineAnimsDisabled = {0}; - -void ResetSpriteData(void) -{ - ResetOamRange(0, 128); - ResetAllSprites(); - ClearSpriteCopyRequests(); - ResetAffineAnimData(); - FreeSpriteTileRanges(); - gOamLimit = 64; - gReservedSpriteTileCount = 0; - AllocSpriteTiles(0); - gSpriteCoordOffsetX = 0; - gSpriteCoordOffsetY = 0; -} - -void AnimateSprites(void) -{ - u8 i; - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - - if (sprite->inUse) - { - sprite->callback(sprite); - - if (sprite->inUse) - AnimateSprite(sprite); - } - } -} - -void BuildOamBuffer(void) -{ - u8 temp; - UpdateOamCoords(); - BuildSpritePriorities(); - SortSprites(); - temp = gMain.oamLoadDisabled; - gMain.oamLoadDisabled = TRUE; - AddSpritesToOamBuffer(); - CopyMatricesToOamBuffer(); - gMain.oamLoadDisabled = temp; - gShouldProcessSpriteCopyRequests = TRUE; -} - -static void UpdateOamCoords(void) -{ - u8 i; - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - if (sprite->inUse && !sprite->invisible) - { - if (sprite->coordOffsetEnabled) - { - sprite->oam.x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - sprite->oam.y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } - else - { - sprite->oam.x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - sprite->oam.y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - } - } - } -} - -static void BuildSpritePriorities(void) -{ - u16 i; - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - u16 priority = sprite->subpriority | (sprite->oam.priority << 8); - gSpritePriorities[i] = priority; - } -} - -static void SortSprites(void) -{ - u8 i; - for (i = 1; i < MAX_SPRITES; i++) - { - u8 j = i; - struct Sprite *sprite1 = &gSprites[gSpriteOrder[i - 1]]; - struct Sprite *sprite2 = &gSprites[gSpriteOrder[i]]; - u16 sprite1Priority = gSpritePriorities[gSpriteOrder[i - 1]]; - u16 sprite2Priority = gSpritePriorities[gSpriteOrder[i]]; - s16 sprite1Y = sprite1->oam.y; - s16 sprite2Y = sprite2->oam.y; - - if (sprite1Y >= DISPLAY_HEIGHT) - sprite1Y = sprite1Y - 256; - - if (sprite2Y >= DISPLAY_HEIGHT) - sprite2Y = sprite2Y - 256; - - if (sprite1->oam.affineMode == ST_OAM_AFFINE_DOUBLE - && sprite1->oam.size == 3) - { - u32 shape = sprite1->oam.shape; - if (shape == ST_OAM_SQUARE || shape == 2) - { - if (sprite1Y > 128) - sprite1Y = sprite1Y - 256; - } - } - - if (sprite2->oam.affineMode == ST_OAM_AFFINE_DOUBLE - && sprite2->oam.size == 3) - { - u32 shape = sprite2->oam.shape; - if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) - { - if (sprite2Y > 128) - sprite2Y = sprite2Y - 256; - } - } - - while (j > 0 - && ((sprite1Priority > sprite2Priority) - || (sprite1Priority == sprite2Priority && sprite1Y < sprite2Y))) - { - u8 temp = gSpriteOrder[j]; - gSpriteOrder[j] = gSpriteOrder[j - 1]; - gSpriteOrder[j - 1] = temp; - - // UB: If j equals 1, then j-- makes j equal 0. - // Then, gSpriteOrder[-1] gets accessed below. - // Although this doesn't result in a bug in the ROM, - // the behavior is undefined. - j--; - - sprite1 = &gSprites[gSpriteOrder[j - 1]]; - sprite2 = &gSprites[gSpriteOrder[j]]; - sprite1Priority = gSpritePriorities[gSpriteOrder[j - 1]]; - sprite2Priority = gSpritePriorities[gSpriteOrder[j]]; - sprite1Y = sprite1->oam.y; - sprite2Y = sprite2->oam.y; - - if (sprite1Y >= DISPLAY_HEIGHT) - sprite1Y = sprite1Y - 256; - - if (sprite2Y >= DISPLAY_HEIGHT) - sprite2Y = sprite2Y - 256; - - if (sprite1->oam.affineMode == ST_OAM_AFFINE_DOUBLE - && sprite1->oam.size == 3) - { - u32 shape = sprite1->oam.shape; - if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) - { - if (sprite1Y > 128) - sprite1Y = sprite1Y - 256; - } - } - - if (sprite2->oam.affineMode == ST_OAM_AFFINE_DOUBLE - && sprite2->oam.size == 3) - { - u32 shape = sprite2->oam.shape; - if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) - { - if (sprite2Y > 128) - sprite2Y = sprite2Y - 256; - } - } - } - } -} - -static void CopyMatricesToOamBuffer(void) -{ - u8 i; - for (i = 0; i < OAM_MATRIX_COUNT; i++) - { - u32 base = 4 * i; - gMain.oamBuffer[base + 0].affineParam = gOamMatrices[i].a; - gMain.oamBuffer[base + 1].affineParam = gOamMatrices[i].b; - gMain.oamBuffer[base + 2].affineParam = gOamMatrices[i].c; - gMain.oamBuffer[base + 3].affineParam = gOamMatrices[i].d; - } -} - -static void AddSpritesToOamBuffer(void) -{ - u8 i = 0; - u8 oamIndex = 0; - - while (i < MAX_SPRITES) - { - struct Sprite *sprite = &gSprites[gSpriteOrder[i]]; - if (sprite->inUse && !sprite->invisible && AddSpriteToOamBuffer(sprite, &oamIndex)) - break; - i++; - } - - gMain.objCount = oamIndex; - - while (oamIndex < gOamLimit) - { - gMain.oamBuffer[oamIndex] = gDummyOamData; - oamIndex++; - } -} - -u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - if (!gSprites[i].inUse) - return CreateSpriteAt(i, template, x, y, subpriority); - - return MAX_SPRITES; -} - -u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) -{ - s16 i; - - for (i = MAX_SPRITES - 1; i > -1; i--) - if (!gSprites[i].inUse) - return CreateSpriteAt(i, template, x, y, subpriority); - - return MAX_SPRITES; -} - -u8 CreateInvisibleSprite(void (*callback)(struct Sprite *)) -{ - u8 index = CreateSprite(&gDummySpriteTemplate, 0, 0, 31); - - if (index == MAX_SPRITES) - { - return MAX_SPRITES; - } - else - { - gSprites[index].invisible = TRUE; - gSprites[index].callback = callback; - return index; - } -} - -static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) -{ - struct Sprite *sprite = &gSprites[index]; - - ResetSprite(sprite); - - sprite->inUse = TRUE; - sprite->animBeginning = TRUE; - sprite->affineAnimBeginning = TRUE; - sprite->usingSheet = TRUE; - - sprite->subpriority = subpriority; - sprite->oam = *template->oam; - sprite->anims = template->anims; - sprite->affineAnims = template->affineAnims; - sprite->template = template; - sprite->callback = template->callback; - sprite->pos1.x = x; - sprite->pos1.y = y; - - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - - if (template->tileTag == 0xFFFF) - { - s16 tileNum; - sprite->images = template->images; - tileNum = AllocSpriteTiles((u8)(sprite->images->size / TILE_SIZE_4BPP)); - if (tileNum == -1) - { - ResetSprite(sprite); - return MAX_SPRITES; - } - sprite->oam.tileNum = tileNum; - sprite->usingSheet = FALSE; - sprite->sheetTileStart = 0; - } - else - { - sprite->sheetTileStart = GetSpriteTileStartByTag(template->tileTag); - SetSpriteSheetFrameTileNum(sprite); - } - - if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) - InitSpriteAffineAnim(sprite); - - if (template->paletteTag != 0xFFFF) - sprite->oam.paletteNum = IndexOfSpritePaletteTag(template->paletteTag); - - return index; -} - -u8 CreateSpriteAndAnimate(struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - - if (!gSprites[i].inUse) - { - u8 index = CreateSpriteAt(i, template, x, y, subpriority); - - if (index == MAX_SPRITES) - return MAX_SPRITES; - - gSprites[i].callback(sprite); - - if (gSprites[i].inUse) - AnimateSprite(sprite); - - return index; - } - } - - return MAX_SPRITES; -} - -void DestroySprite(struct Sprite *sprite) -{ - if (sprite->inUse) - { - if (!sprite->usingSheet) - { - u16 i; - u16 tileEnd = (sprite->images->size / TILE_SIZE_4BPP) + sprite->oam.tileNum; - for (i = sprite->oam.tileNum; i < tileEnd; i++) - FREE_SPRITE_TILE(i); - } - ResetSprite(sprite); - } -} - -void ResetOamRange(u8 a, u8 b) -{ - u8 i; - - for (i = a; i < b; i++) - { - struct OamData *oamBuffer = gMain.oamBuffer; - oamBuffer[i] = *(struct OamData *)&gDummyOamData; - } -} - -void LoadOam(void) -{ - if (!gMain.oamLoadDisabled) - CpuCopy32(gMain.oamBuffer, (void *)OAM, sizeof(gMain.oamBuffer)); -} - -static void ClearSpriteCopyRequests(void) -{ - u8 i; - - gShouldProcessSpriteCopyRequests = FALSE; - gSpriteCopyRequestCount = 0; - - for (i = 0; i < MAX_SPRITE_COPY_REQUESTS; i++) - { - gSpriteCopyRequests[i].src = 0; - gSpriteCopyRequests[i].dest = 0; - gSpriteCopyRequests[i].size = 0; - } -} - -static void ResetOamMatrices(void) -{ - u8 i; - for (i = 0; i < OAM_MATRIX_COUNT; i++) - { - // set to identity matrix - gOamMatrices[i].a = 0x0100; - gOamMatrices[i].b = 0x0000; - gOamMatrices[i].c = 0x0000; - gOamMatrices[i].d = 0x0100; - } -} - -void SetOamMatrix(u8 matrixNum, u16 a, u16 b, u16 c, u16 d) -{ - gOamMatrices[matrixNum].a = a; - gOamMatrices[matrixNum].b = b; - gOamMatrices[matrixNum].c = c; - gOamMatrices[matrixNum].d = d; -} - -static void ResetSprite(struct Sprite *sprite) -{ - *sprite = sDummySprite; -} - -void CalcCenterToCornerVec(struct Sprite *sprite, u8 shape, u8 size, u8 affineMode) -{ - u8 x = sCenterToCornerVecTable[shape][size][0]; - u8 y = sCenterToCornerVecTable[shape][size][1]; - - if (affineMode & ST_OAM_AFFINE_DOUBLE_MASK) - { - x *= 2; - y *= 2; - } - - sprite->centerToCornerVecX = x; - sprite->centerToCornerVecY = y; -} - -static s16 AllocSpriteTiles(u16 tileCount) -{ - u16 i; - s16 start; - u16 numTilesFound; - - if (tileCount == 0) - { - // Free all unreserved tiles if the tile count is 0. - for (i = gReservedSpriteTileCount; i < TOTAL_OBJ_TILE_COUNT; i++) - FREE_SPRITE_TILE(i); - - return 0; - } - - i = gReservedSpriteTileCount; - - for (;;) - { - while (SPRITE_TILE_IS_ALLOCATED(i)) - { - i++; - - if (i == TOTAL_OBJ_TILE_COUNT) - return -1; - } - - start = i; - numTilesFound = 1; - - while (numTilesFound != tileCount) - { - i++; - - if (i == TOTAL_OBJ_TILE_COUNT) - return -1; - - if (!SPRITE_TILE_IS_ALLOCATED(i)) - numTilesFound++; - else - break; - } - - if (numTilesFound == tileCount) - break; - } - - for (i = start; i < tileCount + start; i++) - ALLOC_SPRITE_TILE(i); - - return start; -} - -u8 SpriteTileAllocBitmapOp(u16 bit, u8 op) -{ - u8 index = bit / 8; - u8 shift = bit % 8; - u8 val = bit % 8; - u8 retVal = 0; - - if (op == 0) - { - val = ~(1 << val); - gSpriteTileAllocBitmap[index] &= val; - } - else if (op == 1) - { - val = (1 << val); - gSpriteTileAllocBitmap[index] |= val; - } - else - { - retVal = 1 << shift; - retVal &= gSpriteTileAllocBitmap[index]; - } - - return retVal; -} - -void SpriteCallbackDummy(struct Sprite *sprite) -{ -} - -void ProcessSpriteCopyRequests(void) -{ - if (gShouldProcessSpriteCopyRequests) - { - u8 i = 0; - - while (gSpriteCopyRequestCount > 0) - { - CpuCopy16(gSpriteCopyRequests[i].src, gSpriteCopyRequests[i].dest, gSpriteCopyRequests[i].size); - gSpriteCopyRequestCount--; - i++; - } - - gShouldProcessSpriteCopyRequests = FALSE; - } -} - -static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images) -{ - if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) - { - gSpriteCopyRequests[gSpriteCopyRequestCount].src = images[index].data; - gSpriteCopyRequests[gSpriteCopyRequestCount].dest = (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileNum; - gSpriteCopyRequests[gSpriteCopyRequestCount].size = images[index].size; - gSpriteCopyRequestCount++; - } -} - -void RequestSpriteCopy(const u8 *src, u8 *dest, u16 size) -{ - if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) - { - gSpriteCopyRequests[gSpriteCopyRequestCount].src = src; - gSpriteCopyRequests[gSpriteCopyRequestCount].dest = dest; - gSpriteCopyRequests[gSpriteCopyRequestCount].size = size; - gSpriteCopyRequestCount++; - } -} - -void CopyFromSprites(u8 *dest) -{ - u32 i; - u8 *src = (u8 *)gSprites; - for (i = 0; i < sizeof(struct Sprite) * MAX_SPRITES; i++) - { - *dest = *src; - dest++; - src++; - } -} - -void CopyToSprites(u8 *src) -{ - u32 i; - u8 *dest = (u8 *)gSprites; - for (i = 0; i < sizeof(struct Sprite) * MAX_SPRITES; i++) - { - *dest = *src; - src++; - dest++; - } -} - -static void ResetAllSprites(void) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - { - ResetSprite(&gSprites[i]); - gSpriteOrder[i] = i; - } - - ResetSprite(&gSprites[i]); - sub_814A590(); -} - -void FreeSpriteTiles(struct Sprite *sprite) -{ - if (sprite->template->tileTag != 0xFFFF) - FreeSpriteTilesByTag(sprite->template->tileTag); -} - -void FreeSpritePalette(struct Sprite *sprite) -{ - FreeSpritePaletteByTag(sprite->template->paletteTag); -} - -void FreeSpriteOamMatrix(struct Sprite *sprite) -{ - if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) - { - FreeOamMatrix(sprite->oam.matrixNum); - sprite->oam.affineMode = ST_OAM_AFFINE_OFF; - } -} - -void DestroySpriteAndFreeResources(struct Sprite *sprite) -{ - FreeSpriteTiles(sprite); - FreeSpritePalette(sprite); - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); -} - -void sub_800142C(u32 a1, u32 a2, u16 *a3, u16 a4, u32 a5) -{ - u16 *d = a3; - struct OamData *oam = &gMain.oamBuffer[gMain.objCount]; - while (!(gMain.objCount & 0x80) && (s16)(d[0] + 1) != 0) - { - u16 *x = (u16 *)oam; - x[0] = (d[0] & sOamBitmasks[0]) | ((d[0] + a2) & sOamBitmasks[1]) | ((a4 & sOamBitmasks[2]) << 8); - x[1] = (d[1] & sOamBitmasks[3]) | ((d[1] + a1) & sOamBitmasks[4]) | ((a4 & sOamBitmasks[5]) << 4); - x[2] = (d[2] & sOamBitmasks[6]) | ((d[2] + a5) & sOamBitmasks[7]) | (a4 & sOamBitmasks[8]); - oam++; - gMain.objCount++; - d += 3; - } -} - -void AnimateSprite(struct Sprite *sprite) -{ - sAnimFuncs[sprite->animBeginning](sprite); - - if (!gAffineAnimsDisabled) - sAffineAnimFuncs[sprite->affineAnimBeginning](sprite); -} - -static void BeginAnim(struct Sprite *sprite) -{ - s16 imageValue; - u8 duration; - u8 hFlip; - u8 vFlip; - - sprite->animCmdIndex = 0; - sprite->animEnded = FALSE; - sprite->animLoopCounter = 0; - imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; - - if (imageValue != -1) - { - sprite->animBeginning = FALSE; - duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; - hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; - vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; - - if (duration) - duration--; - - sprite->animDelayCounter = duration; - - if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) - SetSpriteOamFlipBits(sprite, hFlip, vFlip); - - if (sprite->usingSheet) - sprite->oam.tileNum = sprite->sheetTileStart + imageValue; - else - RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); - } -} - -static void ContinueAnim(struct Sprite *sprite) -{ - if (sprite->animDelayCounter) - { - u8 hFlip; - u8 vFlip; - DecrementAnimDelayCounter(sprite); - hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; - vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; - if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) - SetSpriteOamFlipBits(sprite, hFlip, vFlip); - } - else if (!sprite->animPaused) - { - s16 type; - s16 funcIndex; - sprite->animCmdIndex++; - type = sprite->anims[sprite->animNum][sprite->animCmdIndex].type; - funcIndex = 3; - if (type < 0) - funcIndex = type + 3; - sAnimCmdFuncs[funcIndex](sprite); - } -} - -static void AnimCmd_frame(struct Sprite *sprite) -{ - s16 imageValue; - u8 duration; - u8 hFlip; - u8 vFlip; - - imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; - duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; - hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; - vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; - - if (duration) - duration--; - - sprite->animDelayCounter = duration; - - if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) - SetSpriteOamFlipBits(sprite, hFlip, vFlip); - - if (sprite->usingSheet) - sprite->oam.tileNum = sprite->sheetTileStart + imageValue; - else - RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); -} - -static void AnimCmd_end(struct Sprite *sprite) -{ - sprite->animCmdIndex--; - sprite->animEnded = TRUE; -} - -static void AnimCmd_jump(struct Sprite *sprite) -{ - s16 imageValue; - u8 duration; - u8 hFlip; - u8 vFlip; - - sprite->animCmdIndex = sprite->anims[sprite->animNum][sprite->animCmdIndex].jump.target; - - imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; - duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; - hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; - vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; - - if (duration) - duration--; - - sprite->animDelayCounter = duration; - - if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) - SetSpriteOamFlipBits(sprite, hFlip, vFlip); - - if (sprite->usingSheet) - sprite->oam.tileNum = sprite->sheetTileStart + imageValue; - else - RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); -} - -static void AnimCmd_loop(struct Sprite *sprite) -{ - if (sprite->animLoopCounter) - ContinueAnimLoop(sprite); - else - BeginAnimLoop(sprite); -} - -static void BeginAnimLoop(struct Sprite *sprite) -{ - sprite->animLoopCounter = sprite->anims[sprite->animNum][sprite->animCmdIndex].loop.count; - JumpToTopOfAnimLoop(sprite); - ContinueAnim(sprite); -} - -static void ContinueAnimLoop(struct Sprite *sprite) -{ - sprite->animLoopCounter--; - JumpToTopOfAnimLoop(sprite); - ContinueAnim(sprite); -} - -static void JumpToTopOfAnimLoop(struct Sprite *sprite) -{ - if (sprite->animLoopCounter) - { - sprite->animCmdIndex--; - - while (sprite->anims[sprite->animNum][sprite->animCmdIndex - 1].type != -3) - { - if (sprite->animCmdIndex == 0) - break; - sprite->animCmdIndex--; - } - - sprite->animCmdIndex--; - } -} - -static void BeginAffineAnim(struct Sprite *sprite) -{ - if ((sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) && sprite->affineAnims[0][0].type != 32767) - { - struct AffineAnimFrameCmd frameCmd; - u8 matrixNum = GetSpriteMatrixNum(sprite); - AffineAnimStateRestartAnim(matrixNum); - GetAffineAnimFrame(matrixNum, sprite, &frameCmd); - sprite->affineAnimBeginning = FALSE; - sprite->affineAnimEnded = FALSE; - ApplyAffineAnimFrame(matrixNum, &frameCmd); - sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; - } -} - -static void ContinueAffineAnim(struct Sprite *sprite) -{ - if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) - { - u8 matrixNum = GetSpriteMatrixNum(sprite); - - if (sAffineAnimStates[matrixNum].delayCounter) - { - AffineAnimDelay(matrixNum, sprite); - } - else if (!sprite->affineAnimPaused) - { - s16 type; - s16 funcIndex; - sAffineAnimStates[matrixNum].animCmdIndex++; - type = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].type; - funcIndex = 3; - if (type >= 32765) - funcIndex = type - 32765; - sAffineAnimCmdFuncs[funcIndex](matrixNum, sprite); - } - } -} - -static void AffineAnimDelay(u8 matrixNum, struct Sprite *sprite) -{ - if (!DecrementAffineAnimDelayCounter(sprite, matrixNum)) - { - struct AffineAnimFrameCmd frameCmd; - GetAffineAnimFrame(matrixNum, sprite, &frameCmd); - ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &frameCmd); - } -} - -static void AffineAnimCmd_loop(u8 matrixNum, struct Sprite *sprite) -{ - if (sAffineAnimStates[matrixNum].loopCounter) - ContinueAffineAnimLoop(matrixNum, sprite); - else - BeginAffineAnimLoop(matrixNum, sprite); -} - -static void BeginAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) -{ - sAffineAnimStates[matrixNum].loopCounter = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].loop.count; - JumpToTopOfAffineAnimLoop(matrixNum, sprite); - ContinueAffineAnim(sprite); -} - -static void ContinueAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) -{ - sAffineAnimStates[matrixNum].loopCounter--; - JumpToTopOfAffineAnimLoop(matrixNum, sprite); - ContinueAffineAnim(sprite); -} - -static void JumpToTopOfAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) -{ - if (sAffineAnimStates[matrixNum].loopCounter) - { - sAffineAnimStates[matrixNum].animCmdIndex--; - - while (sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex - 1].type != 32765) - { - if (sAffineAnimStates[matrixNum].animCmdIndex == 0) - break; - sAffineAnimStates[matrixNum].animCmdIndex--; - } - - sAffineAnimStates[matrixNum].animCmdIndex--; - } -} - -static void AffineAnimCmd_jump(u8 matrixNum, struct Sprite *sprite) -{ - struct AffineAnimFrameCmd frameCmd; - sAffineAnimStates[matrixNum].animCmdIndex = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].jump.target; - GetAffineAnimFrame(matrixNum, sprite, &frameCmd); - ApplyAffineAnimFrame(matrixNum, &frameCmd); - sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; -} - -static void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite) -{ - struct AffineAnimFrameCmd dummyFrameCmd = {0}; - sprite->affineAnimEnded = TRUE; - sAffineAnimStates[matrixNum].animCmdIndex--; - ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &dummyFrameCmd); -} - -static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite) -{ - struct AffineAnimFrameCmd frameCmd; - GetAffineAnimFrame(matrixNum, sprite, &frameCmd); - ApplyAffineAnimFrame(matrixNum, &frameCmd); - sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; -} - -static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix) -{ - gOamMatrices[destMatrixIndex].a = srcMatrix->a; - gOamMatrices[destMatrixIndex].b = srcMatrix->b; - gOamMatrices[destMatrixIndex].c = srcMatrix->c; - gOamMatrices[destMatrixIndex].d = srcMatrix->d; -} - -static u8 GetSpriteMatrixNum(struct Sprite *sprite) -{ - u8 matrixNum = 0; - if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) - matrixNum = sprite->oam.matrixNum; - return matrixNum; -} - -static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip) -{ - sprite->oam.matrixNum &= 0x7; - sprite->oam.matrixNum |= (((hFlip ^ sprite->hFlip) & 1) << 3); - sprite->oam.matrixNum |= (((vFlip ^ sprite->vFlip) & 1) << 4); -} - -static void AffineAnimStateRestartAnim(u8 matrixNum) -{ - sAffineAnimStates[matrixNum].animCmdIndex = 0; - sAffineAnimStates[matrixNum].delayCounter = 0; - sAffineAnimStates[matrixNum].loopCounter = 0; -} - -static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum) -{ - sAffineAnimStates[matrixNum].animNum = animNum; - sAffineAnimStates[matrixNum].animCmdIndex = 0; - sAffineAnimStates[matrixNum].delayCounter = 0; - sAffineAnimStates[matrixNum].loopCounter = 0; - sAffineAnimStates[matrixNum].xScale = 0x0100; - sAffineAnimStates[matrixNum].yScale = 0x0100; - sAffineAnimStates[matrixNum].rotation = 0; -} - -static void AffineAnimStateReset(u8 matrixNum) -{ - sAffineAnimStates[matrixNum].animNum = 0; - sAffineAnimStates[matrixNum].animCmdIndex = 0; - sAffineAnimStates[matrixNum].delayCounter = 0; - sAffineAnimStates[matrixNum].loopCounter = 0; - sAffineAnimStates[matrixNum].xScale = 0x0100; - sAffineAnimStates[matrixNum].yScale = 0x0100; - sAffineAnimStates[matrixNum].rotation = 0; -} - -static void ApplyAffineAnimFrameAbsolute(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) -{ - sAffineAnimStates[matrixNum].xScale = frameCmd->xScale; - sAffineAnimStates[matrixNum].yScale = frameCmd->yScale; - sAffineAnimStates[matrixNum].rotation = frameCmd->rotation << 8; -} - -static void DecrementAnimDelayCounter(struct Sprite *sprite) -{ - if (!sprite->animPaused) - sprite->animDelayCounter--; -} - -static bool8 DecrementAffineAnimDelayCounter(struct Sprite *sprite, u8 matrixNum) -{ - if (!sprite->affineAnimPaused) - --sAffineAnimStates[matrixNum].delayCounter; - return sprite->affineAnimPaused; -} - -static void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) -{ - struct ObjAffineSrcData srcData; - struct OamMatrix matrix; - sAffineAnimStates[matrixNum].xScale += frameCmd->xScale; - sAffineAnimStates[matrixNum].yScale += frameCmd->yScale; - sAffineAnimStates[matrixNum].rotation = (sAffineAnimStates[matrixNum].rotation + (frameCmd->rotation << 8)) & ~0xFF; - srcData.xScale = ConvertScaleParam(sAffineAnimStates[matrixNum].xScale); - srcData.yScale = ConvertScaleParam(sAffineAnimStates[matrixNum].yScale); - srcData.rotation = sAffineAnimStates[matrixNum].rotation; - ObjAffineSet(&srcData, &matrix, 1, 2); - CopyOamMatrix(matrixNum, &matrix); -} - -static s16 ConvertScaleParam(s16 scale) -{ - s32 val = 0x10000; - return val / scale; -} - -static void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd) -{ - frameCmd->xScale = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.xScale; - frameCmd->yScale = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.yScale; - frameCmd->rotation = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.rotation; - frameCmd->duration = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.duration; -} - -static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) -{ - struct AffineAnimFrameCmd dummyFrameCmd = {0}; - - if (frameCmd->duration) - { - frameCmd->duration--; - ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, frameCmd); - } - else - { - ApplyAffineAnimFrameAbsolute(matrixNum, frameCmd); - ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &dummyFrameCmd); - } -} - -void StartSpriteAnim(struct Sprite *sprite, u8 animNum) -{ - sprite->animNum = animNum; - sprite->animBeginning = TRUE; - sprite->animEnded = FALSE; -} - -void StartSpriteAnimIfDifferent(struct Sprite *sprite, u8 animNum) -{ - if (sprite->animNum != animNum) - StartSpriteAnim(sprite, animNum); -} - -void SeekSpriteAnim(struct Sprite *sprite, u8 animCmdIndex) -{ - u8 temp = sprite->animPaused; - sprite->animCmdIndex = animCmdIndex - 1; - sprite->animDelayCounter = 0; - sprite->animBeginning = FALSE; - sprite->animEnded = FALSE; - sprite->animPaused = FALSE; - ContinueAnim(sprite); - if (sprite->animDelayCounter) - sprite->animDelayCounter++; - sprite->animPaused = temp; -} - -void StartSpriteAffineAnim(struct Sprite *sprite, u8 animNum) -{ - u8 matrixNum = GetSpriteMatrixNum(sprite); - AffineAnimStateStartAnim(matrixNum, animNum); - sprite->affineAnimBeginning = TRUE; - sprite->affineAnimEnded = FALSE; -} - -void StartSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum) -{ - u8 matrixNum = GetSpriteMatrixNum(sprite); - if (sAffineAnimStates[matrixNum].animNum != animNum) - StartSpriteAffineAnim(sprite, animNum); -} - -void ChangeSpriteAffineAnim(struct Sprite *sprite, u8 animNum) -{ - u8 matrixNum = GetSpriteMatrixNum(sprite); - sAffineAnimStates[matrixNum].animNum = animNum; - sprite->affineAnimBeginning = TRUE; - sprite->affineAnimEnded = FALSE; -} - -void ChangeSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum) -{ - u8 matrixNum = GetSpriteMatrixNum(sprite); - if (sAffineAnimStates[matrixNum].animNum != animNum) - ChangeSpriteAffineAnim(sprite, animNum); -} - -void SetSpriteSheetFrameTileNum(struct Sprite *sprite) -{ - if (sprite->usingSheet) - { - s16 tileOffset = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; - if (tileOffset < 0) - tileOffset = 0; - sprite->oam.tileNum = sprite->sheetTileStart + tileOffset; - } -} - -static void ResetAffineAnimData(void) -{ - u8 i; - - gAffineAnimsDisabled = 0; - gOamMatrixAllocBitmap = 0; - - ResetOamMatrices(); - - for (i = 0; i < OAM_MATRIX_COUNT; i++) - AffineAnimStateReset(i); -} - -u8 AllocOamMatrix(void) -{ - u8 i = 0; - u32 bit = 1; - u32 bitmap = gOamMatrixAllocBitmap; - - while (i < OAM_MATRIX_COUNT) - { - if (!(bitmap & bit)) - { - gOamMatrixAllocBitmap |= bit; - return i; - } - - i++; - bit <<= 1; - } - - return 0xFF; -} - -void FreeOamMatrix(u8 matrixNum) -{ - u8 i = 0; - u32 bit = 1; - - while (i < matrixNum) - { - i++; - bit <<= 1; - } - - gOamMatrixAllocBitmap &= ~bit; - SetOamMatrix(matrixNum, 0x100, 0, 0, 0x100); -} - -void InitSpriteAffineAnim(struct Sprite *sprite) -{ - u8 matrixNum = AllocOamMatrix(); - if (matrixNum != 0xFF) - { - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - sprite->oam.matrixNum = matrixNum; - sprite->affineAnimBeginning = TRUE; - AffineAnimStateReset(matrixNum); - } -} - -void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation) -{ - struct ObjAffineSrcData srcData; - struct OamMatrix matrix; - srcData.xScale = ConvertScaleParam(xScale); - srcData.yScale = ConvertScaleParam(yScale); - srcData.rotation = rotation; - ObjAffineSet(&srcData, &matrix, 1, 2); - CopyOamMatrix(matrixNum, &matrix); -} - -u16 LoadSpriteSheet(const struct SpriteSheet *sheet) -{ - s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); - - if (tileStart < 0) - { - return 0; - } - else - { - AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); - CpuCopy16(sheet->data, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); - return (u16)tileStart; - } -} - -void LoadSpriteSheets(const struct SpriteSheet *sheets) -{ - u8 i; - for (i = 0; sheets[i].data != NULL; i++) - LoadSpriteSheet(&sheets[i]); -} - -u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet) -{ - s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); - - if (tileStart < 0) - { - return 0; - } - else - { - AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); - return (u16)tileStart; - } -} - -void AllocTilesForSpriteSheets(struct SpriteSheet *sheets) -{ - u8 i; - for (i = 0; sheets[i].data != NULL; i++) - AllocTilesForSpriteSheet(&sheets[i]); -} - -void LoadTilesForSpriteSheet(const struct SpriteSheet *sheet) -{ - const u8 *data = sheet->data; - u16 tileStart = GetSpriteTileStartByTag(sheet->tag); - CpuCopy16(data, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); -} - -void LoadTilesForSpriteSheets(struct SpriteSheet *sheets) -{ - u8 i; - for (i = 0; sheets[i].data != NULL; i++) - LoadTilesForSpriteSheet(&sheets[i]); -} - -void FreeSpriteTilesByTag(u16 tag) -{ - u8 index = IndexOfSpriteTileTag(tag); - if (index != 0xFF) - { - u16 i; - u16 *rangeStarts; - u16 *rangeCounts; - u16 start; - u16 count; - rangeStarts = sSpriteTileRanges; - start = rangeStarts[index * 2]; - rangeCounts = sSpriteTileRanges + 1; - count = rangeCounts[index * 2]; - - for (i = start; i < start + count; i++) - FREE_SPRITE_TILE(i); - - sSpriteTileRangeTags[index] = 0xFFFF; - } -} - -void FreeSpriteTileRanges(void) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - { - sSpriteTileRangeTags[i] = 0xFFFF; - SET_SPRITE_TILE_RANGE(i, 0, 0); - } -} - -u16 GetSpriteTileStartByTag(u16 tag) -{ - u8 index = IndexOfSpriteTileTag(tag); - if (index == 0xFF) - return 0xFFFF; - return sSpriteTileRanges[index * 2]; -} - -static u8 IndexOfSpriteTileTag(u16 tag) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - if (sSpriteTileRangeTags[i] == tag) - return i; - - return 0xFF; -} - -u16 GetSpriteTileTagByTileStart(u16 start) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - { - if (sSpriteTileRangeTags[i] != 0xFFFF && sSpriteTileRanges[i * 2] == start) - return sSpriteTileRangeTags[i]; - } - - return 0xFFFF; -} - -static void AllocSpriteTileRange(u16 tag, u16 start, u16 count) -{ - u8 freeIndex = IndexOfSpriteTileTag(0xFFFF); - sSpriteTileRangeTags[freeIndex] = tag; - SET_SPRITE_TILE_RANGE(freeIndex, start, count); -} - -void RequestSpriteSheetCopy(const struct SpriteSheet *sheet) -{ - const u8 *data = sheet->data; - u16 tileStart = GetSpriteTileStartByTag(sheet->tag); - RequestSpriteCopy(data, (u8 *)OBJ_VRAM0 + tileStart * TILE_SIZE_4BPP, sheet->size); -} - -u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet) -{ - s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); - - if (tileStart < 0) - { - return 0; - } - else - { - AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); - RequestSpriteSheetCopy(sheet); - return (u16)tileStart; - } -} - -void FreeAllSpritePalettes(void) -{ - u8 i; - gReservedSpritePaletteCount = 0; - for (i = 0; i < 16; i++) - sSpritePaletteTags[i] = 0xFFFF; -} - -u8 LoadSpritePalette(const struct SpritePalette *palette) -{ - u8 index = IndexOfSpritePaletteTag(palette->tag); - - if (index != 0xFF) - return index; - - index = IndexOfSpritePaletteTag(0xFFFF); - - if (index == 0xFF) - { - return 0xFF; - } - else - { - sSpritePaletteTags[index] = palette->tag; - DoLoadSpritePalette(palette->data, index * 16); - return index; - } -} - -void LoadSpritePalettes(const struct SpritePalette *palettes) -{ - u8 i; - for (i = 0; palettes[i].data != NULL; i++) - if (LoadSpritePalette(&palettes[i]) == 0xFF) - break; -} - -static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset) -{ - LoadPalette(src, paletteOffset + 0x100, 32); -} - -u8 AllocSpritePalette(u16 tag) -{ - u8 index = IndexOfSpritePaletteTag(0xFFFF); - if (index == 0xFF) - { - return 0xFF; - } - else - { - sSpritePaletteTags[index] = tag; - return index; - } -} - -u8 IndexOfSpritePaletteTag(u16 tag) -{ - u8 i; - for (i = gReservedSpritePaletteCount; i < 16; i++) - if (sSpritePaletteTags[i] == tag) - return i; - - return 0xFF; -} - -u16 GetSpritePaletteTagByPaletteNum(u8 paletteNum) -{ - return sSpritePaletteTags[paletteNum]; -} - -void FreeSpritePaletteByTag(u16 tag) -{ - u8 index = IndexOfSpritePaletteTag(tag); - if (index != 0xFF) - sSpritePaletteTags[index] = 0xFFFF; -} - -void SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables) -{ - sprite->subspriteTables = subspriteTables; - sprite->subspriteTableNum = 0; - sprite->subspriteMode = SUBSPRITES_ON; -} - -bool8 AddSpriteToOamBuffer(struct Sprite *sprite, u8 *oamIndex) -{ - if (*oamIndex >= gOamLimit) - return 1; - - if (!sprite->subspriteTables || sprite->subspriteMode == SUBSPRITES_OFF) - { - gMain.oamBuffer[*oamIndex] = sprite->oam; - (*oamIndex)++; - return 0; - } - else - { - return AddSubspritesToOamBuffer(sprite, &gMain.oamBuffer[*oamIndex], oamIndex); - } -} - -bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u8 *oamIndex) -{ - const struct SubspriteTable *subspriteTable; - struct OamData *oam; - - if (*oamIndex >= gOamLimit) - return 1; - - subspriteTable = &sprite->subspriteTables[sprite->subspriteTableNum]; - oam = &sprite->oam; - - if (!subspriteTable || !subspriteTable->subsprites) - { - *destOam = *oam; - (*oamIndex)++; - return 0; - } - else - { - u16 tileNum; - u16 baseX; - u16 baseY; - u8 subspriteCount; - u8 hFlip; - u8 vFlip; - u8 i; - - tileNum = oam->tileNum; - subspriteCount = subspriteTable->subspriteCount; - hFlip = ((s32)oam->matrixNum >> 3) & 1; - vFlip = ((s32)oam->matrixNum >> 4) & 1; - baseX = oam->x - sprite->centerToCornerVecX; - baseY = oam->y - sprite->centerToCornerVecY; - - for (i = 0; i < subspriteCount; i++, (*oamIndex)++) - { - u16 x; - u16 y; - - if (*oamIndex >= gOamLimit) - return 1; - - x = subspriteTable->subsprites[i].x; - y = subspriteTable->subsprites[i].y; - - if (hFlip) - { - s8 width = sOamDimensions[subspriteTable->subsprites[i].shape][subspriteTable->subsprites[i].size].width; - s16 right = x; - right += width; - x = right; - x = ~x + 1; - } - - if (vFlip) - { - s8 height = sOamDimensions[subspriteTable->subsprites[i].shape][subspriteTable->subsprites[i].size].height; - s16 bottom = y; - bottom += height; - y = bottom; - y = ~y + 1; - } - - destOam[i] = *oam; - destOam[i].shape = subspriteTable->subsprites[i].shape; - destOam[i].size = subspriteTable->subsprites[i].size; - destOam[i].x = (s16)baseX + (s16)x; - destOam[i].y = baseY + y; - destOam[i].tileNum = tileNum + subspriteTable->subsprites[i].tileOffset; - - if (sprite->subspriteMode != SUBSPRITES_IGNORE_PRIORITY) - destOam[i].priority = subspriteTable->subsprites[i].priority; - } - } - - return 0; -} diff --git a/src/start_menu.c b/src/start_menu.c deleted file mode 100644 index 411690aff..000000000 --- a/src/start_menu.c +++ /dev/null @@ -1,850 +0,0 @@ -#include "global.h" -#include "start_menu.h" -#include "event_data.h" -#include "field_map_obj_helpers.h" -#include "field_player_avatar.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "item_menu.h" -#include "load_save.h" -#include "main.h" -#include "map_obj_lock.h" -#include "menu.h" -#include "option_menu.h" -#include "palette.h" -#include "pokedex.h" -#include "pokemon_menu.h" -#include "pokenav.h" -#include "rom4.h" -#include "safari_zone.h" -#include "save.h" -#include "save_menu_util.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "strings2.h" -#include "task.h" -#include "trainer_card.h" -#include "unknown_task.h" - -//Menu actions -enum { - MENU_ACTION_POKEDEX, - MENU_ACTION_POKEMON, - MENU_ACTION_BAG, - MENU_ACTION_POKENAV, - MENU_ACTION_PLAYER, - MENU_ACTION_SAVE, - MENU_ACTION_OPTION, - MENU_ACTION_EXIT, - MENU_ACTION_RETIRE, - MENU_ACTION_PLAYER_LINK -}; - -static u8 (*saveDialogCallback)(void); -static u8 saveDialogTimer; //Number of frames to keep the window on screen after save was completed -static bool8 savingComplete; - -extern bool8 gDifferentSaveFile; -extern u16 gSaveFileStatus; -extern u16 gScriptResult; - -extern u8 gUnknown_03004860; - -u8 (*gCallback_03004AE8)(void); - -EWRAM_DATA static u8 sStartMenuCursorPos = 0; -EWRAM_DATA static u8 sNumStartMenuActions = 0; -EWRAM_DATA static u8 sCurrentStartMenuActions[10] = {0}; - -//Text strings -extern u8 gSaveText_PlayerSavedTheGame[]; -extern u8 gSaveText_DontTurnOff[]; -extern u8 gSaveText_ThereIsAlreadyAFile[]; -extern u8 gSaveText_ThereIsADifferentFile[]; -extern u8 gSaveText_WouldYouLikeToSave[]; - -static u8 StartMenu_PokedexCallback(void); -static u8 StartMenu_PokemonCallback(void); -static u8 StartMenu_BagCallback(void); -static u8 StartMenu_PokenavCallback(void); -static u8 StartMenu_PlayerCallback(void); -static u8 StartMenu_SaveCallback(void); -static u8 StartMenu_OptionCallback(void); -static u8 StartMenu_ExitCallback(void); -static u8 StartMenu_RetireCallback(void); -static u8 StartMenu_PlayerLinkCallback(void); - -static const struct MenuAction sStartMenuItems[] = -{ - { SystemText_Pokedex, StartMenu_PokedexCallback }, - { SystemText_Pokemon, StartMenu_PokemonCallback }, - { SystemText_BAG, StartMenu_BagCallback }, - { SystemText_Pokenav, StartMenu_PokenavCallback }, - { SystemText_Player, StartMenu_PlayerCallback }, - { SystemText_Save, StartMenu_SaveCallback }, - { SystemText_Option, StartMenu_OptionCallback }, - { SystemText_Exit, StartMenu_ExitCallback }, - { SystemText_Retire, StartMenu_RetireCallback }, - { SystemText_Player, StartMenu_PlayerLinkCallback }, -}; - -//Private functions -static void BuildStartMenuActions(void); -static void AddStartMenuAction(u8 action); -static void BuildStartMenuActions_Normal(void); -static void BuildStartMenuActions_SafariZone(void); -static void BuildStartMenuActions_Link(void); -static void DisplaySafariBallsWindow(void); -static bool32 PrintStartMenuItemsMultistep(s16 *a, u32 b); -static bool32 InitStartMenuMultistep(s16 *a, s16 *b); -static void Task_StartMenu(u8 taskId); -static u8 StartMenu_InputProcessCallback(void); -static u8 SaveCallback1(void); -static u8 SaveCallback2(void); -static void sub_807160C(void); -static u8 RunSaveDialogCallback(void); -static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void)); -static void Task_SaveDialog(u8 taskId); -static void sub_8071700(void); -static void HideSaveDialog(void); -static void SaveDialogStartTimeout(void); -static u8 SaveDialogCheckForTimeoutOrKeypress(void); -static u8 SaveDialogCheckForTimeoutAndKeypress(void); -static u8 SaveDialogCheckForTimeoutAndKeypress(void); -static u8 SaveDialogCB_DisplayConfirmMessage(void); -static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void); -static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void); -static u8 SaveDialogCB_SaveFileExists(void); -static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void); -static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void); -static u8 SaveDialogCB_DisplaySavingMessage(void); -static u8 SaveDialogCB_DoSave(void); -static u8 SaveDialogCB_SaveSuccess(void); -static u8 SaveDialogCB_ReturnSuccess(void); -static u8 SaveDialogCB_SaveError(void); -static u8 SaveDialogCB_ReturnError(void); -static void sub_80719F0(void); -static bool32 sub_80719FC(u8 *ptr); -static void sub_8071B54(void); -static void Task_8071B64(u8 taskId); - - -static void BuildStartMenuActions(void) -{ - sNumStartMenuActions = 0; - if (is_c1_link_related_active() == TRUE) - BuildStartMenuActions_Link(); - else - { - if (GetSafariZoneFlag() == TRUE) - BuildStartMenuActions_SafariZone(); - else - BuildStartMenuActions_Normal(); - } -} - -static void AddStartMenuAction(u8 action) -{ - AppendToList(sCurrentStartMenuActions, &sNumStartMenuActions, action); -} - -static void BuildStartMenuActions_Normal(void) -{ - if (FlagGet(SYS_POKEDEX_GET) == TRUE) - AddStartMenuAction(MENU_ACTION_POKEDEX); - if (FlagGet(SYS_POKEMON_GET) == TRUE) - AddStartMenuAction(MENU_ACTION_POKEMON); - AddStartMenuAction(MENU_ACTION_BAG); - if (FlagGet(SYS_POKENAV_GET) == TRUE) - AddStartMenuAction(MENU_ACTION_POKENAV); - AddStartMenuAction(MENU_ACTION_PLAYER); - AddStartMenuAction(MENU_ACTION_SAVE); - AddStartMenuAction(MENU_ACTION_OPTION); - AddStartMenuAction(MENU_ACTION_EXIT); -} - -static void BuildStartMenuActions_SafariZone(void) -{ - AddStartMenuAction(MENU_ACTION_RETIRE); - AddStartMenuAction(MENU_ACTION_POKEDEX); - AddStartMenuAction(MENU_ACTION_POKEMON); - AddStartMenuAction(MENU_ACTION_BAG); - AddStartMenuAction(MENU_ACTION_PLAYER); - AddStartMenuAction(MENU_ACTION_OPTION); - AddStartMenuAction(MENU_ACTION_EXIT); -} - -static void BuildStartMenuActions_Link(void) -{ - AddStartMenuAction(MENU_ACTION_POKEMON); - AddStartMenuAction(MENU_ACTION_BAG); - if (FlagGet(SYS_POKENAV_GET) == TRUE) - AddStartMenuAction(MENU_ACTION_POKENAV); - AddStartMenuAction(MENU_ACTION_PLAYER_LINK); - AddStartMenuAction(MENU_ACTION_OPTION); - AddStartMenuAction(MENU_ACTION_EXIT); -} - -//Show number of safari balls left -static void DisplaySafariBallsWindow(void) -{ - sub_8072C44(gStringVar1, gNumSafariBalls, 12, 1); - MenuDrawTextWindow(0, 0, 10, 5); - MenuPrint(gOtherText_SafariStock, 1, 1); -} - -//Prints n menu items starting at *index -static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n) -{ - int _index = *index; - - do - { - MenuPrint(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2); - _index++; - if (_index >= sNumStartMenuActions) - { - *index = _index; - return TRUE; - } - } - while (--n != 0); - *index = _index; - return FALSE; -} - -static bool32 InitStartMenuMultistep(s16 *step, s16 *index) -{ - switch (*step) - { - case 1: - BuildStartMenuActions(); - (*step)++; - break; - case 2: - MenuDrawTextWindow(22, 0, 29, sNumStartMenuActions * 2 + 3); - *index = 0; - (*step)++; - break; - case 3: - if (GetSafariZoneFlag()) - DisplaySafariBallsWindow(); - (*step)++; - break; - case 4: - if (PrintStartMenuItemsMultistep(index, 2)) - (*step)++; - break; - case 0: - (*step)++; - break; - case 5: - sStartMenuCursorPos = InitMenu(0, 0x17, 2, sNumStartMenuActions, sStartMenuCursorPos, 6); - return TRUE; - } - return FALSE; -} - -static void InitStartMenu(void) -{ - s16 step = 0; - s16 index = 0; - - while (InitStartMenuMultistep(&step, &index) == FALSE) - ; -} - -static void Task_StartMenu(u8 taskId) -{ - if (InitStartMenuMultistep(gTasks[taskId].data, gTasks[taskId].data + 1) == TRUE) - { - *gTasks[taskId].data = 0; - SwitchTaskToFollowupFunc(taskId); - } -} - -void CreateStartMenuTask(void (*func)(u8)) -{ - u8 taskId; - - InitMenuWindow(&gWindowConfig_81E6CE4); - taskId = CreateTask(Task_StartMenu, 0x50); - SetTaskFuncWithFollowupFunc(taskId, Task_StartMenu, func); -} - -void sub_80712B4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - gCallback_03004AE8 = StartMenu_InputProcessCallback; - task->data[0]++; - break; - case 1: - if (gCallback_03004AE8() == 1) - DestroyTask(taskId); - break; - } -} - -void sub_8071310(void) -{ - if (!is_c1_link_related_active()) - { - FreezeMapObjects(); - sub_80594C0(); - sub_80597F4(); - } - CreateStartMenuTask(sub_80712B4); - ScriptContext2_Enable(); -} - -static u8 StartMenu_InputProcessCallback(void) -{ - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - sStartMenuCursorPos = MoveMenuCursor(-1); - } - if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - sStartMenuCursorPos = MoveMenuCursor(1); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func == StartMenu_PokedexCallback) - { - 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); - return 0; - } - if (gMain.newKeys & (START_BUTTON | B_BUTTON)) - { - CloseMenu(); - return 1; - } - return 0; -} - -//When player selects POKEDEX -static u8 StartMenu_PokedexCallback(void) -{ - if (!gPaletteFade.active) - { - IncrementGameStat(0x29); - PlayRainSoundEffect(); - SetMainCallback2(CB2_InitPokedex); - return 1; - } - return 0; -} - -//When player selects POKEMON -static u8 StartMenu_PokemonCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - SetMainCallback2(sub_8089A70); - return 1; - } - return 0; -} - -//When player selects BAG -static u8 StartMenu_BagCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - SetMainCallback2(sub_80A53F8); - return 1; - } - return 0; -} - -//When player selects POKENAV -static u8 StartMenu_PokenavCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - SetMainCallback2(sub_80EBA5C); - return 1; - } - return 0; -} - -//When player selects his/her name -static u8 StartMenu_PlayerCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - sub_8093110(sub_805469C); - return 1; - } - return 0; -} - -//When player selects SAVE -static u8 StartMenu_SaveCallback(void) -{ - HandleDestroyMenuCursors(); - gCallback_03004AE8 = SaveCallback1; - return 0; -} - -//When player selects OPTION -static u8 StartMenu_OptionCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - SetMainCallback2(CB2_InitOptionMenu); - gMain.savedCallback = sub_805469C; - return 1; - } - return 0; -} - -//When player selects EXIT -static u8 StartMenu_ExitCallback(void) -{ - CloseMenu(); - return 1; -} - -//When player selects RETIRE -static u8 StartMenu_RetireCallback(void) -{ - CloseMenu(); - SafariZoneRetirePrompt(); - return 1; -} - -//When player selects their name in multiplayer mode -static u8 StartMenu_PlayerLinkCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - sub_8093130(gUnknown_03004860, sub_805469C); - return 1; - } - return 0; -} - -//Save dialog status -enum -{ - SAVE_IN_PROGRESS, - SAVE_SUCCESS, - SAVE_CANCELED, - SAVE_ERROR, -}; - -static u8 SaveCallback1(void) -{ - sub_807160C(); - gCallback_03004AE8 = SaveCallback2; - return FALSE; -} - -static u8 SaveCallback2(void) -{ - switch (RunSaveDialogCallback()) - { - case SAVE_IN_PROGRESS: - return FALSE; - case SAVE_CANCELED: - //Go back to start menu - MenuZeroFillScreen(); - InitStartMenu(); - gCallback_03004AE8 = StartMenu_InputProcessCallback; - return FALSE; - case SAVE_SUCCESS: - case SAVE_ERROR: - MenuZeroFillScreen(); - sub_8064E2C(); - ScriptContext2_Disable(); - return TRUE; - } - return FALSE; -} - -static void sub_807160C(void) -{ - save_serialize_map(); - saveDialogCallback = SaveDialogCB_DisplayConfirmMessage; - savingComplete = FALSE; -} - -static u8 RunSaveDialogCallback(void) -{ - if (savingComplete) - { - if (!MenuUpdateWindowText()) - return 0; - } - savingComplete = FALSE; - return saveDialogCallback(); -} - -void InitSaveDialog(void) -{ - sub_807160C(); - CreateTask(Task_SaveDialog, 0x50); -} - -static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void)) -{ - StringExpandPlaceholders(gStringVar4, ptr); - MenuDisplayMessageBox(); - sub_8072044(gStringVar4); - savingComplete = TRUE; - saveDialogCallback = func; -} - -static void Task_SaveDialog(u8 taskId) -{ - u8 status = RunSaveDialogCallback(); - - switch (status) - { - case SAVE_CANCELED: - case SAVE_ERROR: - gScriptResult = 0; - break; - case SAVE_SUCCESS: - gScriptResult = status; - break; - case SAVE_IN_PROGRESS: - return; - } - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -static void sub_8071700(void) -{ - HandleCloseSaveWindow(0, 0); -} - -static void HideSaveDialog(void) -{ - MenuZeroFillWindowRect(20, 8, 26, 13); -} - -static void SaveDialogStartTimeout(void) -{ - saveDialogTimer = 60; -} - -static bool8 SaveDialogCheckForTimeoutOrKeypress(void) -{ - saveDialogTimer--; - if (gMain.heldKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - return TRUE; - } - else if (saveDialogTimer == 0) - return TRUE; - return FALSE; -} - -static bool8 SaveDialogCheckForTimeoutAndKeypress(void) -{ - if (saveDialogTimer != 0) - saveDialogTimer--; - else if (gMain.heldKeys & A_BUTTON) - return TRUE; - return FALSE; -} - -static u8 SaveDialogCB_DisplayConfirmMessage(void) -{ - MenuZeroFillScreen(); - HandleDrawSaveWindowInfo(0, 0); - DisplaySaveMessageWithCallback(gSaveText_WouldYouLikeToSave, SaveDialogCB_DisplayConfirmYesNoMenu); - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void) -{ - DisplayYesNoMenu(20, 8, 1); - saveDialogCallback = SaveDialogCB_ProcessConfirmYesNoMenu; - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void) -{ - switch (ProcessMenuInputNoWrap_()) - { - case 0: //YES - HideSaveDialog(); - switch (gSaveFileStatus) - { - case 0: - case 2: - if (gDifferentSaveFile == FALSE) - { - saveDialogCallback = SaveDialogCB_SaveFileExists; - return SAVE_IN_PROGRESS; - } - saveDialogCallback = SaveDialogCB_DisplaySavingMessage; - return SAVE_IN_PROGRESS; - default: - saveDialogCallback = SaveDialogCB_SaveFileExists; - return SAVE_IN_PROGRESS; - } - break; - case -1: //B button - case 1: //NO - HideSaveDialog(); - sub_8071700(); - return SAVE_CANCELED; - } - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_SaveFileExists(void) -{ - DisplaySaveMessageWithCallback( - gDifferentSaveFile == TRUE ? gSaveText_ThereIsADifferentFile : gSaveText_ThereIsAlreadyAFile, - SaveDialogCB_DisplayOverwriteYesNoMenu); - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void) -{ - DisplayYesNoMenu(20, 8, 1); - saveDialogCallback = SaveDialogCB_ProcessOverwriteYesNoMenu; - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void) -{ - switch (ProcessMenuInputNoWrap_()) - { - case 0: //YES - HideSaveDialog(); - saveDialogCallback = SaveDialogCB_DisplaySavingMessage; - break; - case -1: //B button - case 1: //NO - HideSaveDialog(); - sub_8071700(); - return SAVE_CANCELED; - } - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_DisplaySavingMessage(void) -{ - //"SAVING... DON'T TURN OFF THE POWER." - DisplaySaveMessageWithCallback(gSaveText_DontTurnOff, SaveDialogCB_DoSave); - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_DoSave(void) -{ - bool8 saveSucceeded; - - IncrementGameStat(0); - if (gDifferentSaveFile == TRUE) - { - saveSucceeded = TrySavingData(DIFFERENT_FILE_SAVE); - gDifferentSaveFile = FALSE; - } - else - { - saveSucceeded = TrySavingData(NORMAL_SAVE); - } - - if (saveSucceeded == TRUE) - { - //"(Player) saved the game." - DisplaySaveMessageWithCallback(gSaveText_PlayerSavedTheGame, SaveDialogCB_SaveSuccess); - } - else - { - //"Save error. Please exchange the backup memory." - DisplaySaveMessageWithCallback(gSystemText_SaveErrorExchangeBackup, SaveDialogCB_SaveError); - } - - SaveDialogStartTimeout(); - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_SaveSuccess(void) -{ - if (MenuUpdateWindowText()) - { - PlaySE(SE_SAVE); - saveDialogCallback = SaveDialogCB_ReturnSuccess; - } - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_ReturnSuccess(void) -{ - if (!IsSEPlaying() && SaveDialogCheckForTimeoutOrKeypress()) - { - sub_8071700(); - return SAVE_SUCCESS; - } - else - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_SaveError(void) -{ - if (MenuUpdateWindowText()) - { - PlaySE(SE_BOO); - saveDialogCallback = SaveDialogCB_ReturnError; - } - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_ReturnError(void) -{ - if (!SaveDialogCheckForTimeoutAndKeypress()) - return SAVE_IN_PROGRESS; - else - { - sub_8071700(); - return SAVE_ERROR; - } -} - -static void sub_80719F0(void) -{ - TransferPlttBuffer(); -} - -static bool32 sub_80719FC(u8 *step) -{ - switch (*step) - { - case 0: - { - u8 *addr; - u32 size; - - REG_DISPCNT = 0; - SetVBlankCallback(NULL); - remove_some_task(); - 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; - } - } - break; - } - case 1: - ResetSpriteData(); - ResetTasks(); - ResetPaletteFade(); - dp12_8087EA4(); - break; - case 2: - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON; - break; - case 3: - { - u32 savedIme; - - BlendPalettes(-1, 0x10, 0); - SetVBlankCallback(sub_80719F0); - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= 1; - REG_IME = savedIme; - break; - } - case 4: - return TRUE; - } - (*step)++; - return FALSE; -} - -void sub_8071B28(void) -{ - if (sub_80719FC(&gMain.state)) - { - CreateTask(Task_8071B64, 0x50); - SetMainCallback2(sub_8071B54); - } -} - -static void sub_8071B54(void) -{ - RunTasks(); - UpdatePaletteFade(); -} - -static void Task_8071B64(u8 taskId) -{ - s16 *step = gTasks[taskId].data; - - if (!gPaletteFade.active) - { - switch (*step) - { - case 0: - MenuDisplayMessageBox(); - MenuPrint(gSystemText_Saving, 2, 15); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - (*step)++; - break; - case 1: - SetSecretBase2Field_9_AndHideBG(); - sub_8125E2C(); - (*step)++; - break; - case 2: - if (!sub_8125E6C()) - break; - ClearSecretBase2Field_9_2(); - (*step)++; - break; - case 3: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - (*step)++; - break; - case 4: - SetMainCallback2(gMain.savedCallback); - DestroyTask(taskId); - break; - } - } -} diff --git a/src/starter_choose.c b/src/starter_choose.c deleted file mode 100644 index 2b28df4f0..000000000 --- a/src/starter_choose.c +++ /dev/null @@ -1,757 +0,0 @@ -#include "global.h" -#include "starter_choose.h" -#include "data2.h" -#include "decompress.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "pokedex.h" -#include "songs.h" -#include "sound.h" -#include "species.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "trig.h" -#include "unknown_task.h" - -extern u16 gScriptResult; -extern struct SpriteTemplate gUnknown_02024E8C; - -//-------------------------------------------------- -// Graphics Data -//-------------------------------------------------- - -const u16 gBirchBagGrassPal[2][16] = -{ - INCBIN_U16("graphics/misc/birch_bag.gbapal"), - INCBIN_U16("graphics/misc/birch_grass.gbapal"), -}; -static const u16 gBirchBallarrow_Pal[] = INCBIN_U16("graphics/misc/birch_ballarrow.gbapal"); -static const u16 gBirchCircle_Pal[] = INCBIN_U16("graphics/misc/birch_circle.gbapal"); -const u8 gBirchBagTilemap[] = INCBIN_U8("graphics/misc/birch_bag_map.bin.lz"); -const u8 gBirchGrassTilemap[] = INCBIN_U8("graphics/misc/birch_grass_map.bin.lz"); -const u8 gBirchHelpGfx[] = INCBIN_U8("graphics/misc/birch_help.4bpp.lz"); -static const u8 gBirchBallarrow_Gfx[] = INCBIN_U8("graphics/misc/birch_ballarrow.4bpp.lz"); -static const u8 gBirchCircle_Gfx[] = INCBIN_U8("graphics/misc/birch_circle.4bpp.lz"); -static const u8 gStarterChoose_PokeballCoords[][2] = -{ - {60, 64}, - {120, 88}, - {180, 64}, -}; -static const u8 gStarterChoose_LabelCoords[][2] = -{ - {0, 9}, - {16, 10}, - {8, 4}, -}; -static const u16 sStarterMons[] = {SPECIES_TREECKO, SPECIES_TORCHIC, SPECIES_MUDKIP}; -static const struct OamData gOamData_83F76CC = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83F76D4 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83F76DC = -{ - .y = 160, - .affineMode = 3, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const u8 gUnknown_083F76E4[][2] = -{ - {60, 32}, - {120, 56}, - {180, 32}, - {0, 0}, -}; -static const union AnimCmd gSpriteAnim_83F76EC[] = -{ - ANIMCMD_FRAME(48, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83F76F4[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83F76FC[] = -{ - ANIMCMD_FRAME(16, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(32, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(16, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(32, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(0, 32), - ANIMCMD_FRAME(16, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(32, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(16, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(32, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_JUMP(0), -}; -static const union AnimCmd gSpriteAnim_83F7744[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_83F774C[] = -{ - gSpriteAnim_83F76EC, -}; -static const union AnimCmd *const gSpriteAnimTable_83F7750[] = -{ - gSpriteAnim_83F76F4, - gSpriteAnim_83F76FC, -}; -static const union AnimCmd *const gSpriteAnimTable_83F7758[] = -{ - gSpriteAnim_83F7744, -}; -static const union AffineAnimCmd gSpriteAffineAnim_83F775C[] = -{ - AFFINEANIMCMD_FRAME(16, 16, 0, 0), - AFFINEANIMCMD_FRAME(16, 16, 0, 15), - AFFINEANIMCMD_END, -}; -static const union AffineAnimCmd gSpriteAffineAnim_83F7774[] = -{ - AFFINEANIMCMD_FRAME(20, 20, 0, 0), - AFFINEANIMCMD_FRAME(20, 20, 0, 15), - AFFINEANIMCMD_END, -}; -static const union AffineAnimCmd *const gSpriteAffineAnimTable_83F778C[] = -{ - gSpriteAffineAnim_83F775C, -}; -static const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7790[] = -{ - gSpriteAffineAnim_83F7774, -}; -static const struct CompressedSpriteSheet gUnknown_083F7794[] = -{ - {gBirchBallarrow_Gfx, 0x0800, 0x1000}, - {NULL}, -}; -static const struct CompressedSpriteSheet gUnknown_083F77A4[] = -{ - {gBirchCircle_Gfx, 0x0800, 0x1001}, - {NULL}, -}; -const struct SpritePalette gUnknown_083F77B4[] = -{ - {gBirchBallarrow_Pal, 0x1000}, - {gBirchCircle_Pal, 0x1001}, - {NULL}, -}; -static void sub_810A62C(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F77CC = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83F76CC, - .anims = gSpriteAnimTable_83F774C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810A62C, -}; -static void sub_810A68C(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F77E4 = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83F76D4, - .anims = gSpriteAnimTable_83F7750, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810A68C, -}; -static void StarterPokemonSpriteAnimCallback(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F77FC = -{ - .tileTag = 4097, - .paletteTag = 4097, - .oam = &gOamData_83F76DC, - .anims = gSpriteAnimTable_83F7758, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_83F7790, - .callback = StarterPokemonSpriteAnimCallback, -}; - -static void MainCallback2(void); -static void Task_StarterChoose1(u8 taskId); -static void Task_StarterChoose2(u8 taskId); -static void Task_StarterChoose3(u8 taskId); -static void Task_StarterChoose4(u8 taskId); -static void Task_StarterChoose5(u8 taskId); -static void Task_StarterChoose6(u8 taskId); - -static void CreateStarterPokemonLabel(u8, u8); -static u8 CreatePokemonFrontSprite(u16, u8, u8); - -//Position of the sprite of the selected starter Pokemon -#define STARTER_PKMN_POS_X 120 -#define STARTER_PKMN_POS_Y 64 - -//Retrieves one of the available starter Pokemon -u16 GetStarterPokemon(u16 n) -{ - if (n > 3) - n = 0; - return sStarterMons[n]; -} - -static void VblankCallback(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -#define tStarterSelection data[0] -#define tPkmnSpriteId data[1] -#define tCircleSpriteId data[2] - -void CB2_ChooseStarter(void) -{ - u16 savedIme; - u8 taskId; - u8 spriteId; - - SetVBlankCallback(NULL); - - REG_DISPCNT = 0; - REG_BG3CNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - DmaFill16(3, 0, VRAM, VRAM_SIZE); - DmaFill32(3, 0, OAM, OAM_SIZE); - DmaFill16(3, 0, PLTT, PLTT_SIZE); - - LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); - LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000)); - LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); - remove_some_task(); - ResetTasks(); - ResetSpriteData(); - ResetPaletteFade(); - FreeAllSpritePalettes(); - LoadPalette(gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal)); - LoadCompressedObjectPic(&gUnknown_083F7794[0]); - LoadCompressedObjectPic(&gUnknown_083F77A4[0]); - LoadSpritePalettes(gUnknown_083F77B4); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - - SetVBlankCallback(VblankCallback); - SetMainCallback2(MainCallback2); - - REG_WININ = 0x3F; - REG_WINOUT = 0x1F; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_BLDCNT = 0xFE; - REG_BLDALPHA = 0; - REG_BLDY = 0x7; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; - - taskId = CreateTask(Task_StarterChoose1, 0); - gTasks[taskId].tStarterSelection = 1; - - //Create hand sprite - spriteId = CreateSprite(&gSpriteTemplate_83F77CC, 120, 56, 2); - gSprites[spriteId].data0 = taskId; - - //Create three Pokeball sprites - spriteId = CreateSprite( - &gSpriteTemplate_83F77E4, - gStarterChoose_PokeballCoords[0][0], gStarterChoose_PokeballCoords[0][1], 2); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = 0; - spriteId = CreateSprite( - &gSpriteTemplate_83F77E4, - gStarterChoose_PokeballCoords[1][0], gStarterChoose_PokeballCoords[1][1], 2); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = 1; - spriteId = CreateSprite( - &gSpriteTemplate_83F77E4, - gStarterChoose_PokeballCoords[2][0], gStarterChoose_PokeballCoords[2][1], 2); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = 2; -} - -static void MainCallback2(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void Task_StarterChoose1(u8 taskId) -{ - CreateStarterPokemonLabel(0xFF, gTasks[taskId].tStarterSelection); - MenuDrawTextWindow(2, 14, 27, 19); - MenuPrint(gOtherText_BirchInTrouble, 3, 15); - gTasks[taskId].func = Task_StarterChoose2; -} - -static void Task_StarterChoose2(u8 taskId) -{ - u8 selection = gTasks[taskId].tStarterSelection; - - if (gMain.newKeys & A_BUTTON) - { - u8 spriteId; - - MenuZeroFillWindowRect( - gStarterChoose_LabelCoords[selection][0], - gStarterChoose_LabelCoords[selection][1], - gStarterChoose_LabelCoords[selection][0] + 13, - gStarterChoose_LabelCoords[selection][1] + 3); - - REG_WIN0H = 0; - REG_WIN0V = 0; - - //Create white circle background - spriteId = CreateSprite( - &gSpriteTemplate_83F77FC, - gStarterChoose_PokeballCoords[selection][0], - gStarterChoose_PokeballCoords[selection][1], - 1); - gTasks[taskId].tCircleSpriteId = spriteId; - - //Create Pokemon sprite - spriteId = CreatePokemonFrontSprite( - GetStarterPokemon(gTasks[taskId].tStarterSelection), - gStarterChoose_PokeballCoords[selection][0], - gStarterChoose_PokeballCoords[selection][1]); - gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_83F778C; - gSprites[spriteId].callback = StarterPokemonSpriteAnimCallback; - gTasks[taskId].tPkmnSpriteId = spriteId; - - gTasks[taskId].func = Task_StarterChoose3; - } - else - { - if ((gMain.newKeys & DPAD_LEFT) && selection > 0) - { - gTasks[taskId].tStarterSelection--; - CreateStarterPokemonLabel(selection, gTasks[taskId].tStarterSelection); - } - else if ((gMain.newKeys & DPAD_RIGHT) && selection < 2) - { - gTasks[taskId].tStarterSelection++; - CreateStarterPokemonLabel(selection, gTasks[taskId].tStarterSelection); - } - } -} - -static void Task_StarterChoose3(u8 taskId) -{ - if (gSprites[gTasks[taskId].tCircleSpriteId].affineAnimEnded && - gSprites[gTasks[taskId].tCircleSpriteId].pos1.x == STARTER_PKMN_POS_X && - gSprites[gTasks[taskId].tCircleSpriteId].pos1.y == STARTER_PKMN_POS_Y) - { - gTasks[taskId].func = Task_StarterChoose4; - } -} - -static void Task_StarterChoose4(u8 taskId) -{ - PlayCry1(GetStarterPokemon(gTasks[taskId].tStarterSelection), 0); - MenuDrawTextWindow(2, 14, 27, 19); - //"Do you choose this POKEMON?" - MenuPrint(gOtherText_DoYouChoosePoke, 3, 15); - DisplayYesNoMenu(21, 7, 1); - gTasks[taskId].func = Task_StarterChoose5; -} - -static void Task_StarterChoose5(u8 taskId) -{ - u8 spriteId; - - switch (ProcessMenuInputNoWrap_()) - { - case 0: // YES - //Return the starter choice and exit. - gScriptResult = gTasks[taskId].tStarterSelection; - SetMainCallback2(gMain.savedCallback); - break; - case 1: // NO - case -1: // B button - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(21, 7, 27, 12); - - spriteId = gTasks[taskId].tPkmnSpriteId; - FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum)); - FreeOamMatrix(gSprites[spriteId].oam.matrixNum); - DestroySprite(&gSprites[spriteId]); - - spriteId = gTasks[taskId].tCircleSpriteId; - FreeOamMatrix(gSprites[spriteId].oam.matrixNum); - DestroySprite(&gSprites[spriteId]); - gTasks[taskId].func = Task_StarterChoose6; - break; - } -} - -static void Task_StarterChoose6(u8 taskId) -{ - gTasks[taskId].func = Task_StarterChoose1; -} - -void AddTextColorCtrlCode(u8 *string, u8 bgColor, u8 textColor, u8 shadowColor) -{ - *(string++) = EXT_CTRL_CODE_BEGIN; - *(string++) = 4; - *(string++) = textColor; - *(string++) = bgColor; - *(string++) = shadowColor; -} - -#define SET_CHAR(str, index, c) \ -{ \ - u8 *p = str + index; \ - *p = c; \ -} - - -#if ENGLISH -static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) -{ - u8 labelText[72]; - const u8 *category; - u8 srcIndex; - u8 dstIndex; - u16 species; - - u8 labelLeft; - u8 labelRight; - u8 labelTop; - u8 labelBottom; - - if (prevSelection != 0xFF) - { - //Remove the old Pokemon label - MenuZeroFillWindowRect( - gStarterChoose_LabelCoords[prevSelection][0], - gStarterChoose_LabelCoords[prevSelection][1], - gStarterChoose_LabelCoords[prevSelection][0] + 13, - gStarterChoose_LabelCoords[prevSelection][1] + 3); - REG_WIN0H = 0; - REG_WIN0V = 0; - } - species = GetStarterPokemon(selection); - category = GetPokemonCategory(SpeciesToNationalPokedexNum(species)); - AddTextColorCtrlCode(labelText, 0, 15, 8); - dstIndex = 5; - SET_CHAR(labelText, 5, EXT_CTRL_CODE_BEGIN); - SET_CHAR(labelText, 6, 0x11); - SET_CHAR(labelText, 7, dstIndex); - - //Copy category string to label - dstIndex = 8; - srcIndex = 0; - while (category[srcIndex] != EOS && srcIndex <= 10) - { - labelText[dstIndex] = category[srcIndex]; - srcIndex++; - dstIndex++; - } - labelText[dstIndex++] = CHAR_SPACE; - - //Copy POKEMON string to label - StringCopy(labelText + dstIndex, gOtherText_Poke); - MenuPrint( - labelText, - gStarterChoose_LabelCoords[selection][0], - gStarterChoose_LabelCoords[selection][1]); - AddTextColorCtrlCode(labelText, 0, 15, 8); - - //Copy Pokemon name to label - sub_8072C74(labelText + 5, gSpeciesNames[species], 0x6B, 1); - MenuPrint( - labelText, - gStarterChoose_LabelCoords[selection][0], - gStarterChoose_LabelCoords[selection][1] + 2); - - labelLeft = gStarterChoose_LabelCoords[selection][0] * 8 + 4; - labelRight = (gStarterChoose_LabelCoords[selection][0] + 13) * 8 + 4; - labelTop = gStarterChoose_LabelCoords[selection][1] * 8; - labelBottom = (gStarterChoose_LabelCoords[selection][1] + 4) * 8; - REG_WIN0H = WIN_RANGE(labelLeft, labelRight); - REG_WIN0V = WIN_RANGE(labelTop, labelBottom); -} -#elif GERMAN -__attribute__((naked)) -static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - sub sp, 0x48\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, 24\n\ - lsrs r5, r1, 24\n\ - cmp r0, 0xFF\n\ - beq _0810A872\n\ - ldr r1, _0810A960 @ =gStarterChoose_LabelCoords\n\ - lsls r2, r0, 1\n\ - adds r0, r2, r1\n\ - ldrb r0, [r0]\n\ - adds r1, 0x1\n\ - adds r2, r1\n\ - ldrb r1, [r2]\n\ - adds r2, r0, 0\n\ - adds r2, 0xD\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - adds r3, r1, 0x3\n\ - lsls r3, 24\n\ - lsrs r3, 24\n\ - bl MenuZeroFillWindowRect\n\ - ldr r0, _0810A964 @ =0x04000040\n\ - movs r1, 0\n\ - strh r1, [r0]\n\ - adds r0, 0x4\n\ - strh r1, [r0]\n\ -_0810A872:\n\ - adds r0, r5, 0\n\ - bl GetStarterPokemon\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - adds r0, r6, 0\n\ - bl SpeciesToNationalPokedexNum\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl GetPokemonCategory\n\ - adds r4, r0, 0\n\ - mov r0, sp\n\ - movs r1, 0\n\ - movs r2, 0xF\n\ - movs r3, 0x8\n\ - bl AddTextColorCtrlCode\n\ - movs r2, 0x8\n\ - movs r3, 0\n\ - ldrb r0, [r4]\n\ - lsls r5, 1\n\ - mov r7, sp\n\ - adds r7, 0x5\n\ - cmp r0, 0xFF\n\ - beq _0810A8CA\n\ -_0810A8A8:\n\ - mov r0, sp\n\ - adds r1, r0, r2\n\ - adds r0, r4, r3\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - adds r0, r2, 0x1\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - adds r0, r4, r3\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xFF\n\ - beq _0810A8CA\n\ - cmp r3, 0xA\n\ - bls _0810A8A8\n\ -_0810A8CA:\n\ - mov r0, sp\n\ - adds r1, r0, r2\n\ - movs r0, 0xFF\n\ - strb r0, [r1]\n\ - mov r1, sp\n\ - movs r0, 0xFC\n\ - strb r0, [r1, 0x5]\n\ - movs r0, 0x11\n\ - strb r0, [r1, 0x6]\n\ - mov r2, sp\n\ - lsls r1, r3, 1\n\ - adds r1, r3\n\ - lsls r1, 1\n\ - movs r0, 0x70\n\ - subs r0, r1\n\ - asrs r0, 1\n\ - strb r0, [r2, 0x7]\n\ - ldr r0, _0810A960 @ =gStarterChoose_LabelCoords\n\ - adds r1, r5, r0\n\ - ldrb r4, [r1]\n\ - adds r0, 0x1\n\ - adds r0, r5, r0\n\ - ldrb r5, [r0]\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - adds r2, r5, 0\n\ - bl MenuPrint\n\ - mov r0, sp\n\ - movs r1, 0\n\ - movs r2, 0xF\n\ - movs r3, 0x8\n\ - bl AddTextColorCtrlCode\n\ - movs r0, 0xB\n\ - adds r1, r6, 0\n\ - muls r1, r0\n\ - ldr r0, _0810A968 @ =gSpeciesNames\n\ - adds r1, r0\n\ - adds r0, r7, 0\n\ - movs r2, 0x70\n\ - movs r3, 0x2\n\ - bl sub_8072C74\n\ - adds r2, r5, 0x2\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl MenuPrint\n\ - lsls r0, r4, 3\n\ - adds r0, 0x4\n\ - lsls r0, 24\n\ - adds r4, 0xD\n\ - lsls r4, 3\n\ - adds r4, 0x4\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - lsls r1, r5, 27\n\ - adds r5, 0x4\n\ - lsls r5, 27\n\ - lsrs r5, 24\n\ - ldr r2, _0810A964 @ =0x04000040\n\ - lsrs r0, 16\n\ - orrs r0, r4\n\ - strh r0, [r2]\n\ - ldr r0, _0810A96C @ =0x04000044\n\ - lsrs r1, 16\n\ - orrs r1, r5\n\ - strh r1, [r0]\n\ - add sp, 0x48\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0810A960: .4byte gStarterChoose_LabelCoords\n\ -_0810A964: .4byte 0x04000040\n\ -_0810A968: .4byte gSpeciesNames\n\ -_0810A96C: .4byte 0x04000044\n\ - .syntax divided\n"); -} -#endif - -static void nullsub_72(struct Sprite *sprite) -{ -} - -static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y) -{ - u8 spriteId; - - DecompressPicFromTable_2( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, - gUnknown_081FAF4C[0], gUnknown_081FAF4C[1], - species); - LoadCompressedObjectPalette(&gMonPaletteTable[species]); - GetMonSpriteTemplate_803C56C(species, 1); - spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); - gSprites[spriteId].callback = nullsub_72; - gSprites[spriteId].oam.priority = 0; - return spriteId; -} - -//Sprite callback -static void sub_810A62C(struct Sprite *sprite) -{ - sprite->pos1.x = gUnknown_083F76E4[gTasks[sprite->data0].tStarterSelection][0]; - sprite->pos1.y = gUnknown_083F76E4[gTasks[sprite->data0].tStarterSelection][1]; - sprite->pos2.y = Sin(sprite->data1, 8); - sprite->data1 = (u8)sprite->data1 + 4; -} - -//Sprite callback -static void sub_810A68C(struct Sprite *sprite) -{ - if (gTasks[sprite->data0].tStarterSelection == sprite->data1) - StartSpriteAnimIfDifferent(sprite, 1); - else - StartSpriteAnimIfDifferent(sprite, 0); -} - -//Sprite callback -static void StarterPokemonSpriteAnimCallback(struct Sprite *sprite) -{ - //Move sprite to upper center of screen - if (sprite->pos1.x > STARTER_PKMN_POS_X) - sprite->pos1.x -= 4; - if (sprite->pos1.x < STARTER_PKMN_POS_X) - sprite->pos1.x += 4; - if (sprite->pos1.y > STARTER_PKMN_POS_Y) - sprite->pos1.y -= 2; - if (sprite->pos1.y < STARTER_PKMN_POS_Y) - sprite->pos1.y += 2; -} diff --git a/src/string_util.c b/src/string_util.c deleted file mode 100644 index 9686256a1..000000000 --- a/src/string_util.c +++ /dev/null @@ -1,561 +0,0 @@ -#include "global.h" -#include "string_util.h" -#include "strings.h" -#include "text.h" - -u8 gUnknownStringVar[16]; - -const u8 gEmptyString_81E72B0[] = _(""); -const u8 gRightPointingTriangleString[] = _("▶"); - -static const u8 sDigits[] = __("0123456789ABCDEF"); - -static const s32 sPowersOfTen[] = -{ - 1, - 10, - 100, - 1000, - 10000, - 100000, - 1000000, - 10000000, - 100000000, - 1000000000, -}; - -u8 *StringCopy10(u8 *dest, const u8 *src) -{ - u8 i; - u32 limit = 10; - - for (i = 0; i < limit; i++) - { - dest[i] = src[i]; - - if (dest[i] == EOS) - return &dest[i]; - } - - dest[i] = EOS; - return &dest[i]; -} - -u8 *StringGetEnd10(u8 *str) -{ - u8 i; - u32 limit = 10; - - for (i = 0; i < limit; i++) - if (str[i] == EOS) - return &str[i]; - - str[i] = EOS; - return &str[i]; -} - -u8 *StringCopy8(u8 *dest, const u8 *src) -{ - s32 i; - - for (i = 0; i < 8; i++) - { - dest[i] = src[i]; - - if (dest[i] == EOS) - return &dest[i]; - } - - dest[i] = EOS; - return &dest[i]; -} - -u8 *StringCopy(u8 *dest, const u8 *src) -{ - while (*src != EOS) - { - *dest = *src; - dest++; - src++; - } - - *dest = EOS; - return dest; -} - -u8 *StringAppend(u8 *dest, const u8 *src) -{ - while (*dest != EOS) - dest++; - - return StringCopy(dest, src); -} - -u8 *StringCopyN(u8 *dest, const u8 *src, u8 n) -{ - u16 i; - - for (i = 0; i < n; i++) - dest[i] = src[i]; - - return &dest[n]; -} - -u8 *StringAppendN(u8 *dest, const u8 *src, u8 n) -{ - while (*dest != EOS) - dest++; - - return StringCopyN(dest, src, n); -} - -u16 StringLength(const u8 *str) -{ - u16 length = 0; - - while (str[length] != EOS) - { - u16 temp = length; - length++; - if (str[temp] == EXT_CTRL_CODE_BEGIN) - length += GetExtCtrlCodeLength(str[length]); - } - - return length; -} - -#ifdef GERMAN -s32 StringLengthN(const u8 *str, s32 n) -{ - s32 i; - - for (i = 0; i < n && str[i] != EOS; i++) - ; - - if (i == n) - i = 0; - - return i; -} -#endif - -s32 StringCompare(const u8 *str1, const u8 *str2) -{ - while (*str1 == *str2) - { - if (*str1 == EOS) - return 0; - str1++; - str2++; - } - - return *str1 - *str2; -} - -s32 StringCompareN(const u8 *str1, const u8 *str2, u32 n) -{ - while (*str1 == *str2) - { - if (*str1 == EOS) - return 0; - str1++; - str2++; - if (--n == 0) - return 0; - } - - return *str1 - *str2; -} - -u8 *ConvertIntToDecimalStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) -{ - enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; - s32 powerOfTen; - s32 largestPowerOfTen = sPowersOfTen[n - 1]; - - state = WAITING_FOR_NONZERO_DIGIT; - - if (mode == STR_CONV_MODE_RIGHT_ALIGN) - state = WRITING_SPACES; - - if (mode == STR_CONV_MODE_LEADING_ZEROS) - state = WRITING_DIGITS; - - for (powerOfTen = largestPowerOfTen; powerOfTen > 0; powerOfTen /= 10) - { - char *out; - u8 c; - u16 digit = value / powerOfTen; - s32 temp = value - (powerOfTen * digit); - - if (state == WRITING_DIGITS) - { - out = dest++; - - if (digit <= 9) - c = sDigits[digit]; - else - c = CHAR_QUESTION_MARK; - - *out = c; - } - else if (digit != 0 || powerOfTen == 1) - { - state = WRITING_DIGITS; - out = dest++; - - if (digit <= 9) - c = sDigits[digit]; - else - c = CHAR_QUESTION_MARK; - - *out = c; - } - else if (state == WRITING_SPACES) - { - *dest++ = CHAR_SPACE; - } - - value = temp; - } - - *dest = EOS; - return dest; -} - -u8 *ConvertIntToDecimalStringN_DigitWidth6(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) -{ - enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; - s32 powerOfTen; - s32 largestPowerOfTen = sPowersOfTen[n - 1]; - - *dest++ = EXT_CTRL_CODE_BEGIN; - *dest++ = 0x14; - *dest++ = 6; - - state = WAITING_FOR_NONZERO_DIGIT; - - if (mode == STR_CONV_MODE_RIGHT_ALIGN) - state = WRITING_SPACES; - - if (mode == STR_CONV_MODE_LEADING_ZEROS) - state = WRITING_DIGITS; - - for (powerOfTen = largestPowerOfTen; powerOfTen > 0; powerOfTen /= 10) - { - char *out; - u8 c; - u16 digit = value / powerOfTen; - s32 temp = value - (powerOfTen * digit); - - if (state == WRITING_DIGITS) - { - out = dest++; - - if (digit <= 9) - c = sDigits[digit]; - else - c = CHAR_QUESTION_MARK; - - *out = c; - } - else if (digit != 0 || powerOfTen == 1) - { - state = WRITING_DIGITS; - out = dest++; - - if (digit <= 9) - c = sDigits[digit]; - else - c = CHAR_QUESTION_MARK; - - *out = c; - } - else if (state == WRITING_SPACES) - { - *dest++ = CHAR_SPACE; - } - - value = temp; - } - - *dest++ = EXT_CTRL_CODE_BEGIN; - *dest++ = 0x14; - *dest++ = 0x00; - - *dest = EOS; - return dest; -} - -u8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) -{ - enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; - u8 i; - s32 powerOfSixteen; - s32 largestPowerOfSixteen = 1; - - for (i = 1; i < n; i++) - largestPowerOfSixteen *= 16; - - state = WAITING_FOR_NONZERO_DIGIT; - - if (mode == STR_CONV_MODE_RIGHT_ALIGN) - state = WRITING_SPACES; - - if (mode == STR_CONV_MODE_LEADING_ZEROS) - state = WRITING_DIGITS; - - for (powerOfSixteen = largestPowerOfSixteen; powerOfSixteen > 0; powerOfSixteen /= 16) - { - char *out; - u8 c; - u32 digit = value / powerOfSixteen; - s32 temp = value % powerOfSixteen; - - if (state == WRITING_DIGITS) - { - out = dest++; - - if (digit <= 0xF) - c = sDigits[digit]; - else - c = CHAR_QUESTION_MARK; - - *out = c; - } - else if (digit != 0 || powerOfSixteen == 1) - { - state = WRITING_DIGITS; - out = dest++; - - if (digit <= 0xF) - c = sDigits[digit]; - else - c = CHAR_QUESTION_MARK; - - *out = c; - } - else if (state == WRITING_SPACES) - { - *dest++ = CHAR_SPACE; - } - - value = temp; - } - - *dest = EOS; - return dest; -} - -u8 *ConvertIntToDecimalString(u8 *dest, s32 value) -{ - char temp[12]; - s32 length = 0; - - do - { - temp[length++] = sDigits[value % 10]; - value /= 10; - } while (value != 0); - - length--; - - while (length != -1) - { - *dest++ = temp[length]; - length--; - } - - *dest = EOS; - return dest; -} - -u8 *StringExpandPlaceholders(u8 *dest, const u8 *src) -{ - for (;;) - { - u8 c = *src++; - u8 placeholderId; - u8 *expandedString; - u8 length; - - switch (c) - { - case PLACEHOLDER_BEGIN: - placeholderId = *src++; - expandedString = GetExpandedPlaceholder(placeholderId); - dest = StringExpandPlaceholders(dest, expandedString); - break; - case EXT_CTRL_CODE_BEGIN: - *dest++ = c; - length = GetExtCtrlCodeLength(*src); - memcpy(dest, src, length); - dest += length; - src += length; - break; - case EOS: - *dest = EOS; - return dest; - case 0xFA: - case 0xFB: - case 0xFE: - default: - *dest++ = c; - } - } -} - -u8 *StringBraille(u8 *dest, const u8 *src) -{ - u8 setBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF }; - u8 gotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF }; - - dest = StringCopy(dest, setBrailleFont); - - for (;;) - { - u8 c = *src++; - - switch (c) - { - case EOS: - *dest = c; - return dest; - case 0xFE: - dest = StringCopy(dest, gotoLine2); - break; - default: - *dest++ = c; - *dest++ = c + 0x40; - break; - } - } -} - -static u8 *ExpandPlaceholder_UnknownStringVar(void) -{ - return gUnknownStringVar; -} - -static u8 *ExpandPlaceholder_PlayerName(void) -{ - return gSaveBlock2.playerName; -} - -static u8 *ExpandPlaceholder_StringVar1(void) -{ - return gStringVar1; -} - -static u8 *ExpandPlaceholder_StringVar2(void) -{ - return gStringVar2; -} - -static u8 *ExpandPlaceholder_StringVar3(void) -{ - return gStringVar3; -} - -static u8 *ExpandPlaceholder_KunChan(void) -{ - if (gSaveBlock2.playerGender == MALE) - return (u8 *) gExpandedPlaceholder_Kun; - else - return (u8 *) gExpandedPlaceholder_Chan; -} - -static u8 *ExpandPlaceholder_RivalName(void) -{ - if (gSaveBlock2.playerGender == MALE) - return (u8 *) gExpandedPlaceholder_May; - else - return (u8 *) gExpandedPlaceholder_Brendan; -} - -#define VERSION_DEPENDENT_PLACEHOLDER_LIST \ - X(Version, Ruby, Sapphire) \ - X(EvilTeam, Magma, Aqua) \ - X(GoodTeam, Aqua, Magma) \ - X(EvilLeader, Maxie, Archie) \ - X(GoodLeader, Archie, Maxie) \ - X(EvilLegendary, Groudon, Kyogre) \ - X(GoodLegendary, Kyogre, Groudon) - -#ifdef SAPPHIRE -#define X(ph, r, s) \ -static u8 *ExpandPlaceholder_##ph(void) { return (u8 *) gExpandedPlaceholder_##s; } -VERSION_DEPENDENT_PLACEHOLDER_LIST -#else -#define X(ph, r, s) \ -static u8 *ExpandPlaceholder_##ph(void) { return (u8 *) gExpandedPlaceholder_##r; } -VERSION_DEPENDENT_PLACEHOLDER_LIST -#endif - -#undef X - -u8 *GetExpandedPlaceholder(u32 id) -{ - typedef u8 *(*ExpandPlaceholderFunc)(void); - - static const ExpandPlaceholderFunc funcs[] = - { - ExpandPlaceholder_UnknownStringVar, - ExpandPlaceholder_PlayerName, - ExpandPlaceholder_StringVar1, - ExpandPlaceholder_StringVar2, - ExpandPlaceholder_StringVar3, - ExpandPlaceholder_KunChan, - ExpandPlaceholder_RivalName, - ExpandPlaceholder_Version, - ExpandPlaceholder_EvilTeam, - ExpandPlaceholder_GoodTeam, - ExpandPlaceholder_EvilLeader, - ExpandPlaceholder_GoodLeader, - ExpandPlaceholder_EvilLegendary, - ExpandPlaceholder_GoodLegendary, - }; - - if (id >= ARRAY_COUNT(funcs)) - return (u8 *) gExpandedPlaceholder_Empty; - else - return funcs[id](); -} - -u8 *StringFill(u8 *dest, u8 c, u16 n) -{ - u16 i; - - for (i = 0; i < n; i++) - *dest++ = c; - - *dest = EOS; - return dest; -} - -u8 *StringCopyPadded(u8 *dest, const u8 *src, u8 c, u16 n) -{ - while (*src != EOS) - { - *dest++ = *src++; - - if (n) - n--; - } - - n--; - - while (n != (u16)-1) - { - *dest++ = c; - n--; - } - - *dest = EOS; - return dest; -} - -u8 *StringFillWithTerminator(u8 *dest, u16 n) -{ - return StringFill(dest, EOS, n); -} diff --git a/src/task.c b/src/task.c deleted file mode 100644 index 7bd2b5937..000000000 --- a/src/task.c +++ /dev/null @@ -1,209 +0,0 @@ -#include "global.h" -#include "task.h" - -#define ACTIVE_SENTINEL 0x10 -#define HEAD_SENTINEL 0xFE -#define TAIL_SENTINEL 0xFF - -// gTasks is a queue of the active 16 tasks -struct Task gTasks[ACTIVE_SENTINEL]; - -static void InsertTask(u8 newTaskId); -static u8 FindFirstActiveTask(); - -// Unused string -const u8 sTaskOverString[] = _("TASK OVER\nタスクがオーバーしました"); - -void ResetTasks() -{ - u8 taskId; - - for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++) - { - gTasks[taskId].isActive = FALSE; - gTasks[taskId].func = TaskDummy; - gTasks[taskId].prev = taskId; - gTasks[taskId].next = taskId + 1; - gTasks[taskId].priority = -1; - memset(gTasks[taskId].data, 0, sizeof(gTasks[taskId].data)); - } - - gTasks[0].prev = HEAD_SENTINEL; - gTasks[ACTIVE_SENTINEL - 1].next = TAIL_SENTINEL; -} - -u8 CreateTask(TaskFunc func, u8 priority) -{ - u8 taskId; - - for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++) - { - if (!gTasks[taskId].isActive) - { - gTasks[taskId].func = func; - gTasks[taskId].priority = priority; - InsertTask(taskId); - memset(gTasks[taskId].data, 0, sizeof(gTasks[taskId].data)); - gTasks[taskId].isActive = TRUE; - return taskId; - } - } - - return 0; -} - -static void InsertTask(u8 newTaskId) -{ - u8 taskId = FindFirstActiveTask(); - - if (taskId == ACTIVE_SENTINEL) - { - // The task system inserts from the top downwards starting from the end (0xFF) to 0. If FindFirstActiveTask returned the value equivalent to ACTIVE_SENTINEL, it means it is the only task because it searched the entire queue. - gTasks[newTaskId].prev = HEAD_SENTINEL; - gTasks[newTaskId].next = TAIL_SENTINEL; - return; - } - - while (1) - { - if (gTasks[newTaskId].priority < gTasks[taskId].priority) - { - // We've found a task with a higher priority value, - // so we insert the new task before it. - gTasks[newTaskId].prev = gTasks[taskId].prev; - gTasks[newTaskId].next = taskId; - - if (gTasks[taskId].prev != HEAD_SENTINEL) - gTasks[gTasks[taskId].prev].next = newTaskId; // as long as we are not at the end, insert the newTask appropriately. - - gTasks[taskId].prev = newTaskId; - return; - } - if (gTasks[taskId].next == TAIL_SENTINEL) // we did not find a space for the task, so overwrite the last task as it is the lowest priority. - { - // We've reached the end. - gTasks[newTaskId].prev = taskId; - gTasks[newTaskId].next = gTasks[taskId].next; - gTasks[taskId].next = newTaskId; - return; - } - taskId = gTasks[taskId].next; // neither the priority was lower, nor the end. check the next task. - } -} - -void DestroyTask(u8 taskId) -{ - if (gTasks[taskId].isActive) - { - gTasks[taskId].isActive = FALSE; - - if (gTasks[taskId].prev == HEAD_SENTINEL) - { - if (gTasks[taskId].next != TAIL_SENTINEL) - gTasks[gTasks[taskId].next].prev = HEAD_SENTINEL; - } - else - { - if (gTasks[taskId].next == TAIL_SENTINEL) - { - gTasks[gTasks[taskId].prev].next = TAIL_SENTINEL; - } - else - { - gTasks[gTasks[taskId].prev].next = gTasks[taskId].next; - gTasks[gTasks[taskId].next].prev = gTasks[taskId].prev; - } - } - } -} - -void RunTasks(void) -{ - u8 taskId = FindFirstActiveTask(); - - if (taskId != ACTIVE_SENTINEL) - { - do - { - gTasks[taskId].func(taskId); - taskId = gTasks[taskId].next; - } while (taskId != TAIL_SENTINEL); - } -} - -static u8 FindFirstActiveTask(void) -{ - u8 taskId; - - for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++) - if (gTasks[taskId].isActive == TRUE && gTasks[taskId].prev == HEAD_SENTINEL) - break; - - return taskId; -} - -void TaskDummy(u8 taskId) -{ -} - -#define TASK_DATA_OP(taskId, offset, op) \ -{ \ - u32 tasksAddr = (u32)gTasks; \ - u32 addr = taskId * sizeof(struct Task) + offset; \ - u32 dataAddr = tasksAddr + offsetof(struct Task, data); \ - addr += dataAddr; \ - op; \ -} - -void SetTaskFuncWithFollowupFunc(u8 taskId, TaskFunc func, TaskFunc followupFunc) -{ - TASK_DATA_OP(taskId, 28, *((u16 *)addr) = (u32)followupFunc) - TASK_DATA_OP(taskId, 30, *((u16 *)addr) = (u32)followupFunc >> 16) - gTasks[taskId].func = func; -} - -void SwitchTaskToFollowupFunc(u8 taskId) -{ - s32 func; - - gTasks[taskId].func = NULL; - - TASK_DATA_OP(taskId, 28, func = *((u16 *)addr)) - TASK_DATA_OP(taskId, 30, func |= *((s16 *)addr) << 16) - - gTasks[taskId].func = (TaskFunc)func; -} - -bool8 FuncIsActiveTask(TaskFunc func) -{ - u8 i; - - for (i = 0; i < ACTIVE_SENTINEL; i++) - if (gTasks[i].isActive == TRUE && gTasks[i].func == func) - return TRUE; - - return FALSE; -} - -u8 FindTaskIdByFunc(TaskFunc func) -{ - s32 i; - - for (i = 0; i < ACTIVE_SENTINEL; i++) - if (gTasks[i].isActive == TRUE && gTasks[i].func == func) - return (u8)i; - - return -1; -} - -u8 GetTaskCount(void) -{ - u8 i; - u8 count = 0; - - for (i = 0; i < ACTIVE_SENTINEL; i++) - if (gTasks[i].isActive == TRUE) - count++; - - return count; -} diff --git a/src/text.c b/src/text.c deleted file mode 100644 index b27084b86..000000000 --- a/src/text.c +++ /dev/null @@ -1,4324 +0,0 @@ -#include "global.h" -#include "text.h" -#include "battle.h" -#include "main.h" -#include "palette.h" -#include "songs.h" -#include "sound.h" -#include "string_util.h" - -enum -{ - WIN_STATE_END, - WIN_STATE_BEGIN, - WIN_STATE_NORMAL, - WIN_STATE_INTERRUPTIBLE_PAUSE, - WIN_STATE_PAUSE, - WIN_STATE_WAIT_BUTTON, - WIN_STATE_NEWLINE, - WIN_STATE_PLACEHOLDER, - WIN_STATE_PARAGRAPH, - WIN_STATE_NEWLINE_WAIT, - WIN_STATE_WAIT_SOUND, -}; - -struct Font -{ - u32 type; - u8 *glyphs; - u16 glyphSize; - u16 lowerTileOffset; -}; - -struct GlyphBuffer -{ - // 0-7 left tile - // 8-15 right tile (if it exists) - u32 pixelRows[16]; - - // pixel row filled with BG color - u32 background; - - // table of color indices (not a palette) - u32 colors[16]; -}; - -struct GlyphTileInfo -{ - u8 textMode; - u8 startPixel; - u8 width; - u8 *src; - u32 *dest; - u32 *colors; -}; - -struct ShiftAmount -{ - u32 left; - u32 right; -}; - -static u16 InitVariableWidthFontTileData(struct Window *, u16); -static u16 LoadFixedWidthFont(struct Window *, u16); -static u16 LoadFixedWidthFont_Font1Latin(struct Window *, u16); -static u16 LoadFixedWidthFont_Font4Latin(struct Window *, u16); -static u16 LoadFixedWidthFont_Braille(struct Window *, u16); -static void MultistepLoadFont_LoadGlyph(struct Window *, u16, u8); -static u8 sub_8002FA0(struct Window *, const u8 *); -static u8 InterpretText(struct Window *); -static u8 HandleExtCtrlCode(struct Window *); -static u8 UpdateWindowText(struct Window *); -static u8 DrawGlyph_TextMode0(struct Window *, u32); -static void DrawGlyph_TextMode2(struct Window *, u32); -static void LoadFixedWidthGlyph(struct Window *, u32, u8 *); -static void WriteGlyphTilemap(struct Window *, u16, u16); -static void GetGlyphTilePointers(u8, u8, u16, u8 **, u8 **); -static u16 *GetCursorTilemapPointer(struct Window *); -static void ApplyColors_UnshadowedFont(const u8 *, u32 *, u8, u8); -static void ApplyColors_ShadowedFont(const void *, void *, u8, u8, u8); -static void SetCursorX(struct Window *, u8); -static void AddToCursorX(struct Window *, u8); -static void AddToCursorY(struct Window *, u8); -static void ClipLeft(struct Window *); -static void ClipRight(struct Window *); -static void InitColors(struct Window *); -static void SetBackgroundColor(struct Window *, u8); -static void SetShadowColor(struct Window *, u8); -static void SetForegroundColor(struct Window *, u8); -static u8 GetTextDelay(struct Window *); -static bool8 PlayerCanInterruptWait(struct Window *); -static void ScrollWindowTextLines(struct Window *); -static void ScrollWindowTextLines_TextMode0(struct Window *); -static void DoScroll_TextMode0(struct Window *, u16); -static void ScrollWindowTextLines_TextMode1(struct Window *); -static void DoScroll_TextMode1(struct Window *, u16); -static void ScrollWindowTextLines_TextMode2(struct Window *); -static void DoScroll_TextMode2(struct Window *, u8); -void ClearWindowTextLines(struct Window *); -static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *, u8); -static void ClearWindowTextLines_TextMode2(struct Window *, u8); -static void TryEraseDownArrow(struct Window *); -static u16 GetBlankTileNum(struct Window *); -static u8 WaitWithDownArrow(struct Window *); -static void DrawInitialDownArrow(struct Window *); -static void DrawMovingDownArrow(struct Window *); -static u16 GetCursorTileNum(struct Window *, u32, u32); -static s32 DrawGlyphTiles(struct Window *, u32, u32); -static void UpdateTilemap(struct Window *, u32); -static u8 GetGlyphWidth(struct Window *, u32); -static s32 DrawGlyphTile_ShadowedFont(struct GlyphTileInfo *); - -static void PrintGlyph_TextMode0(struct Window *, u32); -static void PrintGlyph_TextMode1(struct Window *, u32); -static void PrintGlyph_TextMode2(struct Window *, u32); - -static void WriteGlyphTilemap_Font0_Font3(struct Window *, u32); -static void WriteGlyphTilemap_Font1_Font4(struct Window *, u32); -static void WriteGlyphTilemap_Font2_Font5(struct Window *, u32); -static void WriteGlyphTilemap_Font1_Font4(struct Window *, u32); -static void WriteGlyphTilemap_Font2_Font5(struct Window *, u32); -static void WriteGlyphTilemap_Font6(struct Window *, u32); - -static u8 ExtCtrlCode_Nop(struct Window *); -static u8 ExtCtrlCode_ForegroundColor(struct Window *); -static u8 ExtCtrlCode_BackgroundColor(struct Window *); -static u8 ExtCtrlCode_ShadowColor(struct Window *); -static u8 ExtCtrlCode_AllColors(struct Window *); -static u8 ExtCtrlCode_Palette(struct Window *); -static u8 ExtCtrlCode_Font(struct Window *); -static u8 ExtCtrlCode_DefaultFont(struct Window *); -static u8 ExtCtrlCode_Pause(struct Window *); -static u8 ExtCtrlCode_WaitButton(struct Window *); -static u8 ExtCtrlCode_WaitSound(struct Window *); -static u8 ExtCtrlCode_PlayBGM(struct Window *); -static u8 ExtCtrlCode_Escape(struct Window *); -static u8 ExtCtrlCode_Nop2(struct Window *); -static u8 ExtCtrlCode_SetCursorY(struct Window *); -static u8 ExtCtrlCode_ClearWindowTextLines(struct Window *); -static u8 ExtCtrlCode_PlaySE(struct Window *); -static u8 ExtCtrlCode_Skip(struct Window *); -static u8 ExtCtrlCode_SetCursorX(struct Window *); -static u8 ExtCtrlCode_SkipTo(struct Window *); -static u8 ExtCtrlCode_Spacing(struct Window *); -static u8 ExtCtrlCode_Japanese(struct Window *); -static u8 ExtCtrlCode_Latin(struct Window *); - -static void ShiftGlyphTile_UnshadowedFont_Width0(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width1(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width2(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width3(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width4(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width5(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width6(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width7(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width8(struct GlyphBuffer *, u8 *, u32 *, u8); - -static void ShiftGlyphTile_ShadowedFont_Width0(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width1(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width2(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width3(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width4(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width5(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width6(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width7(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width8(struct GlyphBuffer *, u32 *, u32 *, u8); - -static struct Window *sMultistepLoadFont_Window; -static u16 sMultistepLoadFont_StartOffset; -static u16 sMultistepLoadFont_Index; -static struct Window sTempWindow; -static u8 sWaitType; -static u8 sLineLength; -static struct GlyphBuffer sGlyphBuffer; - -EWRAM_DATA u16 gBGTilemapBuffers[4][0x400] = {0}; - -EWRAM_DATA u8 gStringVar1[0x100] = {0}; -EWRAM_DATA u8 gStringVar2[0x100] = {0}; -EWRAM_DATA u8 gStringVar3[0x100] = {0}; -EWRAM_DATA u8 gStringVar4[0x100] = {0}; - -extern u16 gBattleTypeFlags; -extern u8 gIsLinkContest; -extern u8 gTileBuffer[]; - -vu16 *const gBGControlRegs[] = -{ - ®_BG0CNT, - ®_BG1CNT, - ®_BG2CNT, - ®_BG3CNT, -}; - -vu16 *const gBGHOffsetRegs[] = -{ - ®_BG0HOFS, - ®_BG1HOFS, - ®_BG2HOFS, - ®_BG3HOFS, -}; - -vu16 *const gBGVOffsetRegs[] = -{ - ®_BG0VOFS, - ®_BG1VOFS, - ®_BG2VOFS, - ®_BG3VOFS, -}; - -const u16 gUnknown_081E29D8[] = { 0x100, 0x200, 0x400, 0x800 }; -const u16 gUnknown_081E29E0[] = { 0x100, 0x200, 0x400, 0x800 }; -const u16 gUnknown_081E29E8[] = { 1, 2, 4, 8 }; - -static const u8 sFont0LatinGlyphs[] = INCBIN_U8("graphics/fonts/font0_lat.1bpp"); -static const u8 sFont1LatinGlyphs[] = INCBIN_U8("graphics/fonts/font1_lat.1bpp"); -static const u8 sFont0JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font0_jpn.1bpp"); -static const u8 sFont1JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font1_jpn.1bpp"); -static const u8 sBrailleGlyphs[] = INCBIN_U8("graphics/fonts/font6_braille.1bpp"); -static const u32 sDownArrowTiles[] = INCBIN_U32("graphics/fonts/down_arrow.4bpp"); - -// clang-format off -#include "data/text/type1_map.h" -#include "data/text/type3_map.h" -#include "data/text/font1_widths.h" -#include "data/text/font4_widths.h" -#include "data/text/font0_widths.h" -#include "data/text/font3_widths.h" -// clang-format on - -const u16 gUnknownPalette_81E6692[] = INCBIN_U16("graphics/fonts/unknown_81E6692.gbapal"); -const u16 gFontDefaultPalette[] = INCBIN_U16("graphics/fonts/default.gbapal"); - -const u8 sBlankTile[8] = { 0, 0, 0, 0, 0, 0, 0, 0, }; - -static const u32 sGlyphMasks[9][8][3] = -{ - { - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFFFFFF0, }, - { 0x0000000F,0xFFFFFFFF,0xFFFFFF00, }, - { 0x000000FF,0xFFFFFFFF,0xFFFFF000, }, - { 0x00000FFF,0xFFFFFFFF,0xFFFF0000, }, - { 0x0000FFFF,0xFFFFFFFF,0xFFF00000, }, - { 0x000FFFFF,0xFFFFFFFF,0xFF000000, }, - { 0x00FFFFFF,0xFFFFFFFF,0xF0000000, }, - { 0x0FFFFFFF,0xFFFFFFFF,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFFFFF00, }, - { 0x0000000F,0xFFFFFFFF,0xFFFFF000, }, - { 0x000000FF,0xFFFFFFFF,0xFFFF0000, }, - { 0x00000FFF,0xFFFFFFFF,0xFFF00000, }, - { 0x0000FFFF,0xFFFFFFFF,0xFF000000, }, - { 0x000FFFFF,0xFFFFFFFF,0xF0000000, }, - { 0x00FFFFFF,0xFFFFFFFF,0x00000000, }, - { 0x0FFFFFFF,0xFFFFFFF0,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFFFF000, }, - { 0x0000000F,0xFFFFFFFF,0xFFFF0000, }, - { 0x000000FF,0xFFFFFFFF,0xFFF00000, }, - { 0x00000FFF,0xFFFFFFFF,0xFF000000, }, - { 0x0000FFFF,0xFFFFFFFF,0xF0000000, }, - { 0x000FFFFF,0xFFFFFFFF,0x00000000, }, - { 0x00FFFFFF,0xFFFFFFF0,0x00000000, }, - { 0x0FFFFFFF,0xFFFFFF00,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFFF0000, }, - { 0x0000000F,0xFFFFFFFF,0xFFF00000, }, - { 0x000000FF,0xFFFFFFFF,0xFF000000, }, - { 0x00000FFF,0xFFFFFFFF,0xF0000000, }, - { 0x0000FFFF,0xFFFFFFFF,0x00000000, }, - { 0x000FFFFF,0xFFFFFFF0,0x00000000, }, - { 0x00FFFFFF,0xFFFFFF00,0x00000000, }, - { 0x0FFFFFFF,0xFFFFF000,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFF00000, }, - { 0x0000000F,0xFFFFFFFF,0xFF000000, }, - { 0x000000FF,0xFFFFFFFF,0xF0000000, }, - { 0x00000FFF,0xFFFFFFFF,0x00000000, }, - { 0x0000FFFF,0xFFFFFFF0,0x00000000, }, - { 0x000FFFFF,0xFFFFFF00,0x00000000, }, - { 0x00FFFFFF,0xFFFFF000,0x00000000, }, - { 0x0FFFFFFF,0xFFFF0000,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFF000000, }, - { 0x0000000F,0xFFFFFFFF,0xF0000000, }, - { 0x000000FF,0xFFFFFFFF,0x00000000, }, - { 0x00000FFF,0xFFFFFFF0,0x00000000, }, - { 0x0000FFFF,0xFFFFFF00,0x00000000, }, - { 0x000FFFFF,0xFFFFF000,0x00000000, }, - { 0x00FFFFFF,0xFFFF0000,0x00000000, }, - { 0x0FFFFFFF,0xFFF00000,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xF0000000, }, - { 0x0000000F,0xFFFFFFFF,0x00000000, }, - { 0x000000FF,0xFFFFFFF0,0x00000000, }, - { 0x00000FFF,0xFFFFFF00,0x00000000, }, - { 0x0000FFFF,0xFFFFF000,0x00000000, }, - { 0x000FFFFF,0xFFFF0000,0x00000000, }, - { 0x00FFFFFF,0xFFF00000,0x00000000, }, - { 0x0FFFFFFF,0xFF000000,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0x00000000, }, - { 0x0000000F,0xFFFFFFF0,0x00000000, }, - { 0x000000FF,0xFFFFFF00,0x00000000, }, - { 0x00000FFF,0xFFFFF000,0x00000000, }, - { 0x0000FFFF,0xFFFF0000,0x00000000, }, - { 0x000FFFFF,0xFFF00000,0x00000000, }, - { 0x00FFFFFF,0xFF000000,0x00000000, }, - { 0x0FFFFFFF,0xF0000000,0x00000000, }, - }, -}; - -static const struct ShiftAmount sGlyphShiftAmounts[8] = -{ - { 0, 32 }, - { 4, 28 }, - { 8, 24 }, - { 12, 20 }, - { 16, 16 }, - { 20, 12 }, - { 24, 8 }, - { 28, 4 }, -}; - -typedef void (*PrintGlyphFunc)(struct Window *, u32); - -static const PrintGlyphFunc sPrintGlyphFuncs[] = -{ - PrintGlyph_TextMode0, - PrintGlyph_TextMode1, - PrintGlyph_TextMode2, -}; - -typedef void (*WriteGlyphTilemapFunc)(struct Window *, u32); - -static const WriteGlyphTilemapFunc sWriteGlyphTilemapFuncs[] = -{ - WriteGlyphTilemap_Font0_Font3, - WriteGlyphTilemap_Font1_Font4, - WriteGlyphTilemap_Font2_Font5, - WriteGlyphTilemap_Font0_Font3, - WriteGlyphTilemap_Font1_Font4, - WriteGlyphTilemap_Font2_Font5, - WriteGlyphTilemap_Font6, -}; - -static const struct Window sDefaultWindow = { .language = GAME_LANGUAGE }; - -typedef u8 (*ExtCtrlCodeFunc)(struct Window *); - -static const ExtCtrlCodeFunc sExtCtrlCodeFuncs[] = -{ - ExtCtrlCode_Nop, - ExtCtrlCode_ForegroundColor, - ExtCtrlCode_BackgroundColor, - ExtCtrlCode_ShadowColor, - ExtCtrlCode_AllColors, - ExtCtrlCode_Palette, - ExtCtrlCode_Font, - ExtCtrlCode_DefaultFont, - ExtCtrlCode_Pause, - ExtCtrlCode_WaitButton, - ExtCtrlCode_WaitSound, - ExtCtrlCode_PlayBGM, - ExtCtrlCode_Escape, - ExtCtrlCode_Nop2, - ExtCtrlCode_SetCursorY, - ExtCtrlCode_ClearWindowTextLines, - ExtCtrlCode_PlaySE, - ExtCtrlCode_Skip, - ExtCtrlCode_SetCursorX, - ExtCtrlCode_SkipTo, - ExtCtrlCode_Spacing, - ExtCtrlCode_Japanese, - ExtCtrlCode_Latin, -}; - -extern const u32 gFont3LatinGlyphs[]; -extern const u32 gFont4LatinGlyphs[]; -extern const u32 gFont3JapaneseGlyphs[]; -extern const u32 gFont4JapaneseGlyphs[]; - -static const struct Font sFonts[] = -{ - // Japanese fonts - { 0, (u8 *)sFont0JapaneseGlyphs, 16, 8 }, - { 1, (u8 *)sFont1JapaneseGlyphs, 8, 0 }, - { 2, (u8 *)sFont1JapaneseGlyphs, 8, 0 }, - { 4, (u8 *)gFont3JapaneseGlyphs, 64, 512 }, - { 1, (u8 *)gFont4JapaneseGlyphs, 32, 0 }, - { 2, (u8 *)gFont4JapaneseGlyphs, 32, 0 }, - { 3, (u8 *)sBrailleGlyphs, 8, 0 }, - // Latin - { 0, (u8 *)sFont0LatinGlyphs, 16, 8 }, - { 1, (u8 *)sFont1LatinGlyphs, 8, 0 }, - { 2, (u8 *)sFont1LatinGlyphs, 8, 0 }, - { 0, (u8 *)gFont3LatinGlyphs, 64, 32 }, - { 1, (u8 *)gFont4LatinGlyphs, 32, 0 }, - { 2, (u8 *)gFont4LatinGlyphs, 32, 0 }, - { 3, (u8 *)sBrailleGlyphs, 8, 0 }, -}; - -static const u8 sTextSpeedDelays[] = { 6, 3, 1 }; // slow, mid, fast - -static const u8 sExtCtrlCodeLengths[] = -{ - 1, - 2, - 2, - 2, - 4, - 2, - 2, - 1, - 2, - 1, - 1, - 3, - 2, - 2, - 2, - 1, - 3, - 2, - 2, - 2, - 2, - 1, - 1, -}; - -typedef void (*ShiftGlyphTileUnshadowedFunc)(struct GlyphBuffer *, u8 *, u32 *, u8); - -static const ShiftGlyphTileUnshadowedFunc sShiftGlyphTileUnshadowedFuncs[] = -{ - ShiftGlyphTile_UnshadowedFont_Width0, - ShiftGlyphTile_UnshadowedFont_Width1, - ShiftGlyphTile_UnshadowedFont_Width2, - ShiftGlyphTile_UnshadowedFont_Width3, - ShiftGlyphTile_UnshadowedFont_Width4, - ShiftGlyphTile_UnshadowedFont_Width5, - ShiftGlyphTile_UnshadowedFont_Width6, - ShiftGlyphTile_UnshadowedFont_Width7, - ShiftGlyphTile_UnshadowedFont_Width8, -}; - -typedef void (*ShiftGlyphTileShadowedFunc)(struct GlyphBuffer *, u32 *, u32 *, u8); - -static const ShiftGlyphTileShadowedFunc sShiftGlyphTileShadowedFuncs[] = -{ - ShiftGlyphTile_ShadowedFont_Width0, - ShiftGlyphTile_ShadowedFont_Width1, - ShiftGlyphTile_ShadowedFont_Width2, - ShiftGlyphTile_ShadowedFont_Width3, - ShiftGlyphTile_ShadowedFont_Width4, - ShiftGlyphTile_ShadowedFont_Width5, - ShiftGlyphTile_ShadowedFont_Width6, - ShiftGlyphTile_ShadowedFont_Width7, - ShiftGlyphTile_ShadowedFont_Width8, -}; - -const struct WindowConfig gWindowConfig_81E6C3C = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 0, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6C58 = -{ - 0, // BG number - 0, // BG character base block - 24, // BG screen base block - 0, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 26, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(24), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6C74 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 1, // foreground color - 0, // background color - 3, // shadow color - 4, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)OBJ_VRAM0, // tile data - NULL, // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6C90 = -{ - 0, // BG number - 1, // BG character base block - 30, // BG screen base block - 2, // BG priority - 31, // palette number - 15, // foreground color - 0, // background color - 1, // shadow color - 4, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(1), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6CAC = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 15, // foreground color - 0, // background color - 1, // shadow color - 4, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 8, // width - 60, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6CC8 = -{ - 2, // BG number - 2, // BG character base block - 15, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6CE4 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6D00 = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 2, // foreground color - 15, // background color - 3, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6D1C = -{ - 1, // BG number - 0, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 2, // foreground color - 15, // background color - 3, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6D38 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 15, // foreground color - 0, // background color - 14, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 8, // width - 64, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6D54 = -{ - 3, // BG number - 3, // BG character base block - 15, // BG screen base block - 3, // BG priority - 2, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(3), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6D70 = -{ - 3, // BG number - 3, // BG character base block - 15, // BG screen base block - 3, // BG priority - 3, // palette number - 1, // foreground color - 3, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(3), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6D8C = -{ - 1, // BG number - 0, // BG character base block - 14, // BG screen base block - 1, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(14), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6DA8 = -{ - 0, // BG number - 0, // BG character base block - 12, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(11), // tilemap -}; - -const struct WindowConfig WindowConfig_TrainerCard_Back_Values = -{ - 0, // BG number - 2, // BG character base block - 30, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig WindowConfig_TrainerCard_Back_Labels = -{ - 0, // BG number - 2, // BG character base block - 30, // BG screen base block - 0, // BG priority - 14, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6DFC = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6E18 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6E34 = -{ - 1, // BG number - 0, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6E50 = -{ - 0, // BG number - 2, // BG character base block - 28, // BG screen base block - 0, // BG priority - 13, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6E6C = -{ - 0, // BG number - 2, // BG character base block - 30, // BG screen base block - 0, // BG priority - 13, // palette number - 15, // foreground color - 0, // background color - 10, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6E88 = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6EA4 = -{ - 1, // BG number - 0, // BG character base block - 28, // BG screen base block - 1, // BG priority - 1, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6EC0 = -{ - 2, // BG number - 2, // BG character base block - 29, // BG screen base block - 2, // BG priority - 1, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(29), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6EDC = -{ - 1, // BG number - 0, // BG character base block - 28, // BG screen base block - 1, // BG priority - 2, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6EF8 = -{ - 2, // BG number - 2, // BG character base block - 29, // BG screen base block - 2, // BG priority - 2, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(29), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6F14 = -{ - 1, // BG number - 0, // BG character base block - 28, // BG screen base block - 1, // BG priority - 3, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6F30 = -{ - 2, // BG number - 2, // BG character base block - 29, // BG screen base block - 2, // BG priority - 3, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(29), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6F4C = -{ - 3, // BG number - 0, // BG character base block - 30, // BG screen base block - 3, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6F68 = -{ - 0, // BG number - 2, // BG character base block - 13, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(13), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6F84 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 1, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6FA0 = -{ - 1, // BG number - 0, // BG character base block - 24, // BG screen base block - 3, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(24), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6FBC = -{ - 0, // BG number - 0, // BG character base block - 30, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6FD8 = -{ - 0, // BG number - 0, // BG character base block - 24, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(24), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E6FF4 = -{ - 0, // BG number - 0, // BG character base block - 24, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(24), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7010 = -{ - 0, // BG number - 0, // BG character base block - 30, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E702C = -{ - 3, // BG number - 2, // BG character base block - 15, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7048 = -{ - 2, // BG number - 2, // BG character base block - 14, // BG screen base block - 2, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 16, // tilemap left coordinate - 0, // tilemap top coordinate - 16, // width - 32, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(14), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7064 = -{ - 2, // BG number - 2, // BG character base block - 14, // BG screen base block - 2, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(14), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7080 = -{ - 3, // BG number - 0, // BG character base block - 30, // BG screen base block - 3, // BG priority - 11, // palette number - 1, // foreground color - 15, // background color - 5, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E709C = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E70B8 = -{ - 2, // BG number - 0, // BG character base block - 30, // BG screen base block - 2, // BG priority - 11, // palette number - 1, // foreground color - 0, // background color - 5, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E70D4 = -{ - 3, // BG number - 0, // BG character base block - 30, // BG screen base block - 3, // BG priority - 11, // palette number - 1, // foreground color - 15, // background color - 5, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E70F0 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 15, // foreground color - 1, // background color - 14, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 32, // width - 32, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -const struct WindowConfig gWindowConfig_81E710C = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7128 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7144 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 13, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7160 = -{ - 1, // BG number - 1, // BG character base block - 10, // BG screen base block - 1, // BG priority - 14, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(1), // tile data - (u16 *)BG_SCREEN_ADDR(10), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E717C = -{ - 0, // BG number - 3, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(3), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7198 = -{ - 0, // BG number - 2, // BG character base block - 15, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E71B4 = -{ - 0, // BG number - 2, // BG character base block - 15, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E71D0 = -{ - 1, // BG number - 1, // BG character base block - 28, // BG screen base block - 0, // BG priority - 5, // palette number - 13, // foreground color - 14, // background color - 15, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(1), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E71EC = -{ - 2, // BG number - 1, // BG character base block - 30, // BG screen base block - 0, // BG priority - 5, // palette number - 13, // foreground color - 14, // background color - 15, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(1), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7208 = -{ - 0, // BG number - 2, // BG character base block - 28, // BG screen base block - 0, // BG priority - 8, // palette number - 1, // foreground color - 0, // background color - 2, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7224 = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7240 = -{ - 1, // BG number - 2, // BG character base block - 30, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowConfig gWindowConfig_81E725C = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 15, // foreground color - 0, // background color - 14, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - (u8 *)OBJ_VRAM0, // tile data - NULL, // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7278 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 16, // width - 32, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -const struct WindowConfig gWindowConfig_81E7294 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 4, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 16, // width - 32, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -static void UpdateBGRegs(const struct WindowConfig *winConfig) -{ - u8 bgNum = winConfig->bgNum; - *gBGHOffsetRegs[bgNum] = 0; - *gBGVOffsetRegs[bgNum] = 0; - *gBGControlRegs[bgNum] = winConfig->priority | (winConfig->screenBaseBlock << 8) | (winConfig->charBaseBlock << 2); -} - -static void ClearBGMem(const struct WindowConfig *winConfig) -{ - CpuFastFill(0, winConfig->tileData, 32); - - if (winConfig->tilemap) - CpuFastFill(0, winConfig->tilemap, 0x800); -} - -void LoadFontDefaultPalette(const struct WindowConfig *winConfig) -{ - LoadPalette(gFontDefaultPalette, 16 * winConfig->paletteNum, 32); -} - -void SetUpWindowConfig(const struct WindowConfig *winConfig) -{ - UpdateBGRegs(winConfig); - ClearBGMem(winConfig); - LoadFontDefaultPalette(winConfig); -} - -u16 InitWindowTileData(struct Window *win, u16 startOffset) -{ - u16 retVal; - - win->tileDataStartOffset = startOffset; - retVal = 0; - - switch (win->config->textMode) - { - case 2: - retVal = InitVariableWidthFontTileData(win, startOffset); - break; - case 1: - switch (win->config->fontNum) - { - case 0: - case 3: - retVal = LoadFixedWidthFont(win, startOffset); - break; - case 1: - case 2: - retVal = LoadFixedWidthFont_Font1Latin(win, startOffset); - break; - case 4: - case 5: - retVal = LoadFixedWidthFont_Font4Latin(win, startOffset); - break; - case 6: - retVal = LoadFixedWidthFont_Braille(win, startOffset); - break; - } - break; - } - - return retVal; -} - -static u16 InitVariableWidthFontTileData(struct Window *win, u16 startOffset) -{ - u8 *buffer; - - win->tileDataStartOffset = startOffset; - win->tileDataOffset = 2; - buffer = win->tileData + 32 * win->tileDataStartOffset; - CpuFastFill(0, buffer, 32); - ApplyColors_UnshadowedFont(sBlankTile, (u32 *)(buffer + 32), win->config->foregroundColor, win->config->backgroundColor); - return win->tileDataStartOffset + win->tileDataOffset + win->width * win->height; -} - -static u16 LoadFixedWidthFont(struct Window *win, u16 startOffset) -{ - s32 glyph; - u8 *buffer = win->tileData + 32 * startOffset; - for (glyph = 0; glyph < 256; glyph++) - { - LoadFixedWidthGlyph(win, glyph, buffer); - buffer += 64; - } - return 2 * glyph; -} - -static u16 LoadFixedWidthFont_Font1Latin(struct Window *win, u16 startOffset) -{ - s32 i; - u8 *buffer = win->tileData + 32 * startOffset; - for (i = 0; i < 256; i++) - { - ApplyColors_UnshadowedFont(&sFont1LatinGlyphs[8 * i], (u32 *)buffer, win->foregroundColor, win->backgroundColor); - buffer += 32; - } - return i; -} - -static u16 LoadFixedWidthFont_Font4Latin(struct Window *win, u16 startOffset) -{ - s32 i; - u8 *buffer = win->tileData + 32 * startOffset; - for (i = 0; i < 256; i++) - { - ApplyColors_ShadowedFont(&gFont4LatinGlyphs[8 * i], buffer, win->foregroundColor, win->shadowColor, win->backgroundColor); - buffer += 32; - } - return i; -} - -static u16 LoadFixedWidthFont_Braille(struct Window *win, u16 startOffset) -{ - s32 i; - u8 *buffer = win->tileData + 32 * startOffset; - for (i = 0; i < 256; i++) - { - ApplyColors_UnshadowedFont(&sBrailleGlyphs[8 * i], (u32 *)buffer, win->foregroundColor, win->backgroundColor); - buffer += 32; - } - return i; -} - -u32 MultistepInitWindowTileData(struct Window *win, u16 startOffset) -{ - u32 retVal; - sMultistepLoadFont_Window = win; - sMultistepLoadFont_Index = 0; - sMultistepLoadFont_StartOffset = startOffset; - win->tileDataStartOffset = startOffset; - retVal = 0; - - switch (win->config->textMode) - { - case 2: - retVal = InitVariableWidthFontTileData(win, startOffset); - break; - case 1: - retVal = 256; - if (win->config->fontNum == 0 - || win->config->fontNum == 3) - retVal *= 2; - break; - } - - return retVal; -} - -bool32 MultistepLoadFont(void) -{ - bool32 retVal = TRUE; - - if (sMultistepLoadFont_Window->config->textMode == 1) - { - s32 i; - - for (i = sMultistepLoadFont_Index; i < sMultistepLoadFont_Index + 16; i++) - MultistepLoadFont_LoadGlyph(sMultistepLoadFont_Window, sMultistepLoadFont_StartOffset, i); - - sMultistepLoadFont_Index += 16; - - if (sMultistepLoadFont_Index < 256) - retVal = FALSE; - } - - return retVal; -} - -static void MultistepLoadFont_LoadGlyph(struct Window *win, u16 startOffset, u8 glyph) -{ - u8 *buffer; - - switch (win->config->fontNum) - { - case 0: - case 3: - buffer = win->tileData + 32 * startOffset + 64 * glyph; - LoadFixedWidthGlyph(win, glyph, buffer); - break; - case 1: - case 2: - buffer = win->tileData + 32 * (glyph + startOffset); - ApplyColors_UnshadowedFont( - &sFont1LatinGlyphs[8 * glyph], - (u32 *)buffer, - win->foregroundColor, - win->backgroundColor); - break; - case 4: - case 5: - buffer = win->tileData + 32 * (glyph + startOffset); - ApplyColors_ShadowedFont( - &gFont4LatinGlyphs[8 * glyph], - buffer, - win->foregroundColor, - win->shadowColor, - win->backgroundColor); - break; - } -} - -void EmptyFunc(void) -{ -} - -void InitWindowFromConfig(struct Window *win, const struct WindowConfig *winConfig) -{ - *win = sDefaultWindow; - win->config = (struct WindowConfig *)winConfig; - win->textMode = winConfig->textMode; - win->spacing = winConfig->spacing; - win->fontNum = winConfig->fontNum; - win->paletteNum = winConfig->paletteNum; - win->tilemapLeft = winConfig->tilemapLeft; - win->tilemapTop = winConfig->tilemapTop; - win->width = winConfig->width; - win->height = winConfig->height; - win->tileData = winConfig->tileData; - win->tilemap = winConfig->tilemap; - InitColors(win); - SetBackgroundColor(win, winConfig->backgroundColor); - SetShadowColor(win, winConfig->shadowColor); - SetForegroundColor(win, winConfig->foregroundColor); -} - -void InitWindow(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - struct WindowConfig *winConfig = win->config; - win->textMode = winConfig->textMode; - win->fontNum = winConfig->fontNum; - win->language = GAME_LANGUAGE; - win->paletteNum = winConfig->paletteNum; - win->win_field_B = 0; - win->win_field_C = 0; - win->delayCounter = 0; - win->spacing = winConfig->spacing; - win->win_field_F = 0; - win->tilemapLeft = winConfig->tilemapLeft; - win->tilemapTop = winConfig->tilemapTop; - win->width = winConfig->width; - win->height = winConfig->height; - win->text = text; - win->textIndex = 0; - win->tileDataStartOffset = tileDataStartOffset; - win->tileDataOffset = 0; - win->left = 8 * left; - win->cursorX = 0; - win->top = 8 * top; - win->cursorY = 0; - win->state = WIN_STATE_BEGIN; - win->downArrowCounter = 0; - win->tileData = winConfig->tileData; - win->tilemap = winConfig->tilemap; - InitColors(win); - SetBackgroundColor(win, winConfig->backgroundColor); - SetShadowColor(win, winConfig->shadowColor); - SetForegroundColor(win, winConfig->foregroundColor); -} - -void sub_8002E4C(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) -{ - u8 val; - - InitWindow(win, text, tileDataStartOffset, 0, 0); - win->left = left; - win->top = top; - val = 0; - if (a6) - val = 255; - win->win_field_F = val; - if (val) - ClipLeft(win); -} - -void sub_8002E90(struct Window *win, const u8 *text) -{ - win->state = WIN_STATE_NORMAL; - win->text = text; - win->textIndex = 0; - win->downArrowCounter = 0; - win->win_field_B = -1; - win->win_field_C = 0; - win->delayCounter = 0; -} - -void sub_8002EB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - gMain.watchedKeysMask = A_BUTTON | B_BUTTON; - gMain.watchedKeysPressed = 0; - sWaitType = 0; - sLineLength = 26; - InitWindow(win, text, tileDataStartOffset, left, top); - win->win_field_B = -1; - if (win->textMode == 0) - { - u16 val = GetCursorTileNum(win, 0, 0); - u8 *buffer = win->tileData + 32 * val; - ApplyColors_UnshadowedFont(sBlankTile, (u32 *)buffer, win->backgroundColor, win->backgroundColor); - ApplyColors_UnshadowedFont(&sFont1LatinGlyphs[8 * 0x6E], (u32 *)(buffer + 32), win->foregroundColor, win->backgroundColor); - win->tileDataOffset = 2; - } -} - -u8 sub_8002F44(struct Window *win) -{ - while (win->state) - { - if (win->state == WIN_STATE_NEWLINE) - { - AddToCursorY(win, 16); - win->cursorX = 0; - if (win->win_field_F) - ClipLeft(win); - win->state = WIN_STATE_NORMAL; - } - else if (win->state == WIN_STATE_PLACEHOLDER) - { - sub_8002FA0(win, GetExpandedPlaceholder(win->text[win->textIndex++])); - } - - InterpretText(win); - } - return 1; -} - -static u8 sub_8002FA0(struct Window *win, const u8 *text) -{ - u8 retVal; - u8 savedLanguage = win->language; - const u8 *savedText = win->text; - u16 savedTextIndex = win->textIndex; - win->text = text; - win->textIndex = 0; - win->state = WIN_STATE_NORMAL; - retVal = sub_8002F44(win); - win->text = savedText; - win->textIndex = savedTextIndex; - win->state = WIN_STATE_NORMAL; - win->language = savedLanguage; - return retVal; -} - -static u8 InterpretText(struct Window *win) -{ - u8 c = win->text[win->textIndex++]; - - switch (c) - { - case 0xFF: - ClipRight(win); - win->state = WIN_STATE_END; - return 0; - case 0xFD: - win->state = WIN_STATE_PLACEHOLDER; - return 2; - case 0xFE: - ClipRight(win); - win->state = WIN_STATE_NEWLINE; - return 2; - case 0xFB: - DrawInitialDownArrow(win); - win->state = WIN_STATE_PARAGRAPH; - return 2; - case 0xFA: - DrawInitialDownArrow(win); - win->state = WIN_STATE_NEWLINE_WAIT; - return 2; - case 0xFC: - return HandleExtCtrlCode(win); - } - - sPrintGlyphFuncs[win->textMode](win, c); - return 1; -} - -static u8 HandleExtCtrlCode(struct Window *win) -{ - return sExtCtrlCodeFuncs[win->text[win->textIndex++]](win); -} - -static u8 ExtCtrlCode_Nop(struct Window *win) -{ - return 2; -} - -static u8 ExtCtrlCode_ForegroundColor(struct Window *win) -{ - SetForegroundColor(win, win->text[win->textIndex++]); - return 2; -} - -static u8 ExtCtrlCode_BackgroundColor(struct Window *win) -{ - SetBackgroundColor(win, win->text[win->textIndex++]); - return 2; -} - -static u8 ExtCtrlCode_ShadowColor(struct Window *win) -{ - SetShadowColor(win, win->text[win->textIndex++]); - return 2; -} - -static u8 ExtCtrlCode_AllColors(struct Window *win) -{ - SetForegroundColor(win, win->text[win->textIndex++]); - SetBackgroundColor(win, win->text[win->textIndex++]); - SetShadowColor(win, win->text[win->textIndex++]); - return 2; -} - -static u8 ExtCtrlCode_Palette(struct Window *win) -{ - win->paletteNum = win->text[win->textIndex++]; - return 2; -} - -static u8 ExtCtrlCode_Font(struct Window *win) -{ - win->fontNum = win->text[win->textIndex++]; - return 2; -} - -static u8 ExtCtrlCode_DefaultFont(struct Window *win) -{ - win->fontNum = win->config->fontNum; - return 2; -} - -static u8 ExtCtrlCode_Pause(struct Window *win) -{ - ClipRight(win); - win->state = WIN_STATE_PAUSE; - win->delayCounter = win->text[win->textIndex++]; - return 2; -} - -static u8 ExtCtrlCode_WaitButton(struct Window *win) -{ - ClipRight(win); - win->state = WIN_STATE_WAIT_BUTTON; - return 2; -} - -static u8 ExtCtrlCode_WaitSound(struct Window *win) -{ - ClipRight(win); - win->state = WIN_STATE_WAIT_SOUND; - return 2; -} - -static u8 ExtCtrlCode_PlayBGM(struct Window *win) -{ - u16 loByte = win->text[win->textIndex++]; - u16 hiByte = win->text[win->textIndex++] << 8; - PlayBGM(loByte | hiByte); - return 2; -} - -static u8 ExtCtrlCode_Escape(struct Window *win) -{ - sPrintGlyphFuncs[win->textMode](win, win->text[win->textIndex++]); - return 1; -} - -u8 ExtCtrlCode_Nop2(struct Window *win) -{ - return 1; -} - -static u8 ExtCtrlCode_SetCursorY(struct Window *win) -{ - ClipRight(win); - AddToCursorY(win, 8 * win->text[win->textIndex++]); - return 1; -} - -static u8 ExtCtrlCode_ClearWindowTextLines(struct Window *win) -{ - ClearWindowTextLines(win); - return 2; -} - -static u8 ExtCtrlCode_PlaySE(struct Window *win) -{ - u16 loByte = win->text[win->textIndex++]; - u16 hiByte = win->text[win->textIndex++] << 8; - PlaySE(loByte | hiByte); - return 2; -} - -static void DrawSpace(struct Window *win) -{ - if (win->textMode == 1 || (win->left + win->cursorX) & 7 || win->spacing <= 7) - { - sPrintGlyphFuncs[win->textMode](win, 0); - } - else - { - u32 val = sGlyphBuffer.background; - u16 index = GetCursorTileNum(win, 0, 0); - u32 *buffer = (u32 *)(win->tileData + 32 * index); - buffer[0] = val; - buffer[1] = val; - buffer[2] = val; - buffer[3] = val; - buffer[4] = val; - buffer[5] = val; - buffer[6] = val; - buffer[7] = val; - index = GetCursorTileNum(win, 0, 1); - buffer = (u32 *)(win->tileData + 32 * index); - buffer[0] = val; - buffer[1] = val; - buffer[2] = val; - buffer[3] = val; - buffer[4] = val; - buffer[5] = val; - buffer[6] = val; - buffer[7] = val; - UpdateTilemap(win, 1); - AddToCursorX(win, 8); - } -} - -static void sub_8003344(struct Window *win, u8 newX) -{ - u8 savedSpacing = win->spacing; - - if (newX - win->cursorX <= 8) - win->spacing = newX - win->cursorX; - else - win->spacing = 8 - ((win->left + win->cursorX) & 7); - - while (win->cursorX < newX) - { - s32 spacing; - DrawSpace(win); - spacing = newX - win->cursorX; - if (spacing >= 8) - spacing = 8; - win->spacing = spacing; - } - - win->spacing = savedSpacing; -} - -static u8 ExtCtrlCode_Skip(struct Window *win) -{ - sub_8003344(win, win->cursorX + win->text[win->textIndex++]); - return 1; -} - -static u8 ExtCtrlCode_SetCursorX(struct Window *win) -{ - ClipRight(win); - SetCursorX(win, win->text[win->textIndex++]); - return 1; -} - -static u8 ExtCtrlCode_SkipTo(struct Window *win) -{ - sub_8003344(win, win->text[win->textIndex++]); - return 1; -} - -static u8 ExtCtrlCode_Spacing(struct Window *win) -{ - win->spacing = win->text[win->textIndex++]; - return 2; -} - -static u8 ExtCtrlCode_Japanese(struct Window *win) -{ - win->language = LANGUAGE_JAPANESE; - return 2; -} - -static u8 ExtCtrlCode_Latin(struct Window *win) -{ - win->language = GAME_LANGUAGE; - return 2; -} - -u8 sub_8003418(struct Window *win) -{ - u8 retVal = 1; - while (win->state) - { - if (win->state == WIN_STATE_NEWLINE) - { - AddToCursorY(win, 16); - win->cursorX = 0; - if (win->win_field_F) - ClipLeft(win); - win->state = WIN_STATE_NORMAL; - } - if (InterpretText(win) == 1) - { - retVal = 0; - break; - } - } - return retVal; -} - -u8 sub_8003460(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - InitWindow(win, text, tileDataStartOffset, left, top); - return sub_8002F44(win); -} - -u8 sub_8003490(struct Window *win, u8 c, u16 tileDataStartOffset, u8 left, u8 top) -{ - u8 retVal; - u8 text[2]; - text[0] = c; - text[1] = EOS; - InitWindow(win, text, tileDataStartOffset, left, top); - retVal = InterpretText(win); - ClipRight(win); - return retVal; -} - -void sub_80034D4(u8 *tileData, const u8 *text) -{ - sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6C74, tileData, text); -} - -u8 sub_80034EC(u8 *str) -{ - return GetStringWidthGivenWindowConfig((struct WindowConfig *)&gWindowConfig_81E6C74, str); -} - -u8 *sub_8003504(u8 *dest, s32 value, u8 alignAmount, u8 alignType) -{ - sTempWindow.config = (struct WindowConfig *)&gWindowConfig_81E6C74; - InitWindow(&sTempWindow, 0, 0, 0, 0); - return AlignInt2(&sTempWindow, dest, value, alignAmount, alignType); -} - -u8 *sub_8003558(u8 *dest, const u8 *src, u8 alignAmount, u8 alignType) -{ - sTempWindow.config = (struct WindowConfig *)&gWindowConfig_81E6C74; - InitWindow(&sTempWindow, src, 0, 0, 0); - return AlignString(&sTempWindow, dest, src, alignAmount, alignType); -} - -u8 sub_80035AC(struct Window *win) -{ - sWaitType = 0; - return UpdateWindowText(win); -} - -static u8 UpdateWindowText(struct Window *win) -{ - switch (win->state) - { - case WIN_STATE_WAIT_BUTTON: - if (PlayerCanInterruptWait(win)) - { - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PlaySE(SE_SELECT); - } - else - { - return 0; - } - } - else - { - win->delayCounter--; - if (win->delayCounter) - return 0; - } - win->state = WIN_STATE_NORMAL; - return 0; - case WIN_STATE_INTERRUPTIBLE_PAUSE: - if (PlayerCanInterruptWait(win) && (gMain.heldKeys & (A_BUTTON | B_BUTTON)) && gMain.watchedKeysPressed == TRUE) - { - win->delayCounter = 0; - win->state = WIN_STATE_NORMAL; - break; - } - case WIN_STATE_PAUSE: - if (win->delayCounter) - { - win->delayCounter--; - if (win->delayCounter) - return 0; - } - - win->state = WIN_STATE_NORMAL; - break; - case WIN_STATE_PARAGRAPH: - if (!WaitWithDownArrow(win)) - return 0; - ClearWindowTextLines(win); - win->state = WIN_STATE_NORMAL; - BLOCK_CROSS_JUMP - return 0; - case WIN_STATE_NEWLINE_WAIT: - if (!WaitWithDownArrow(win)) - return 0; - ScrollWindowTextLines(win); - win->state = WIN_STATE_NORMAL; - BLOCK_CROSS_JUMP - return 0; - case WIN_STATE_PLACEHOLDER: - win->textIndex++; - win->state = WIN_STATE_NORMAL; - break; - case WIN_STATE_NEWLINE: - ScrollWindowTextLines(win); - win->state = WIN_STATE_NORMAL; - BLOCK_CROSS_JUMP - return 0; - case WIN_STATE_BEGIN: - ClearWindowTextLines(win); - break; - case WIN_STATE_WAIT_SOUND: - if (IsSEPlaying()) - return 0; - win->state = WIN_STATE_NORMAL; - break; - case WIN_STATE_END: - return 1; - case WIN_STATE_NORMAL: - break; - default: - win->state = WIN_STATE_END; - return 1; - } - - InterpretText(win); - - switch (win->state) - { - case WIN_STATE_END: - return 1; - case WIN_STATE_WAIT_BUTTON: - case WIN_STATE_PARAGRAPH: - case WIN_STATE_NEWLINE_WAIT: - if (PlayerCanInterruptWait(win)) - return 0; - win->delayCounter = 60; - break; - case WIN_STATE_PAUSE: - case WIN_STATE_NEWLINE: - case WIN_STATE_WAIT_SOUND: - break; - default: - win->state = WIN_STATE_INTERRUPTIBLE_PAUSE; - win->delayCounter = GetTextDelay(win); - } - - return 0; -} - -#if defined(ENGLISH) -#define SUB_800374C_LINE_LENGTH 26 -#elif defined(GERMAN) -#define SUB_800374C_LINE_LENGTH 27 -#endif - -u8 sub_800374C(struct Window *win) -{ - u8 retVal; - - sWaitType = 1; - sLineLength = SUB_800374C_LINE_LENGTH; - retVal = UpdateWindowText(win); - sLineLength = 26; - sWaitType = 0; - return retVal; -} - -u8 sub_8003778(struct Window *win) -{ - u8 retVal; - - sWaitType = 2; - sLineLength = 26; - retVal = UpdateWindowText(win); - sWaitType = 0; - return retVal; -} - -u8 sub_80037A0(struct Window *win) -{ - u8 retVal; - - sWaitType = 3; - sLineLength = 17; - retVal = UpdateWindowText(win); - sLineLength = 26; - return retVal; -} - -u32 sub_80037C8(struct Window *win, u8 lineLength) -{ - u8 retVal; - - sWaitType = 0; - sLineLength = lineLength; - retVal = UpdateWindowText(win); - sLineLength = 26; - return retVal; -} - -static void PrintGlyph_TextMode0(struct Window *win, u32 glyph) -{ - AddToCursorX(win, DrawGlyph_TextMode0(win, glyph)); - if (win->win_field_B) - ClipRight(win); -} - -static u8 DrawGlyph_TextMode0(struct Window *win, u32 glyph) -{ - u8 pixelsWidth = GetGlyphWidth(win, glyph); - u32 tilesWidth = DrawGlyphTiles(win, glyph, pixelsWidth); - UpdateTilemap(win, tilesWidth); - return pixelsWidth; -} - -static void PrintGlyph_TextMode1(struct Window *win, u32 glyph) -{ - sWriteGlyphTilemapFuncs[win->fontNum](win, glyph); - win->cursorX += 8; -} - -static void WriteGlyphTilemap_Font0_Font3(struct Window *win, u32 glyph) -{ - s16 val = win->tileDataStartOffset + 2 * glyph; - WriteGlyphTilemap(win, val, val + 1); -} - -static void WriteGlyphTilemap_Font1_Font4(struct Window *win, u32 glyph) -{ - u32 val = glyph * 2; - WriteGlyphTilemap( - win, - win->tileDataStartOffset + sFontType1Map[val], - win->tileDataStartOffset + sFontType1Map[val + 1]); -} - -static void WriteGlyphTilemap_Font2_Font5(struct Window *win, u32 glyph) -{ - WriteGlyphTilemap( - win, - win->tileDataStartOffset + 212, - win->tileDataStartOffset + glyph); -} - -static void WriteGlyphTilemap_Font6(struct Window *win, u32 glyph) -{ - u32 val = glyph * 2; - WriteGlyphTilemap( - win, - win->tileDataStartOffset + sFontType3Map[val], - win->tileDataStartOffset + sFontType3Map[val + 1]); -} - -static void PrintGlyph_TextMode2(struct Window *win, u32 glyph) -{ - u8 width = GetGlyphWidth(win, glyph); - DrawGlyph_TextMode2(win, glyph); - AddToCursorX(win, width); - if (win->win_field_B) - ClipRight(win); -} - -static void DrawGlyph_TextMode2(struct Window *win, u32 glyph) -{ - u8 pixelsWidth = GetGlyphWidth(win, glyph); - u32 tilesWidth = DrawGlyphTiles(win, glyph, pixelsWidth); - UpdateTilemap(win, tilesWidth); -} - -static void LoadFixedWidthGlyph(struct Window *win, u32 glyph, u8 *dest) -{ - u8 *upperTile; - u8 *lowerTile; - - GetGlyphTilePointers(win->fontNum, win->language, glyph, &upperTile, &lowerTile); - - switch (win->fontNum) - { - case 0: - case 1: - case 2: - case 6: - ApplyColors_UnshadowedFont(upperTile, (u32 *)dest, win->foregroundColor, win->backgroundColor); - ApplyColors_UnshadowedFont(lowerTile, (u32 *)(dest + 32), win->foregroundColor, win->backgroundColor); - break; - case 3: - case 4: - case 5: - ApplyColors_ShadowedFont(upperTile, dest, win->foregroundColor, win->shadowColor, win->backgroundColor); - ApplyColors_ShadowedFont(lowerTile, dest + 32, win->foregroundColor, win->shadowColor, win->backgroundColor); - break; - } -} - -static void WriteGlyphTilemap(struct Window *win, u16 upperTileNum, u16 lowerTileNum) -{ - u16 *buffer = GetCursorTilemapPointer(win); - if (buffer) - { - u16 palette = (win->paletteNum << 12); - buffer[0] = upperTileNum | palette; - buffer[32] = lowerTileNum | palette; - } -} - -static void GetGlyphTilePointers(u8 fontNum, u8 language, u16 glyph, u8 **upperTilePtr, u8 **lowerTilePtr) -{ - u16 index; - const struct Font *font; - - if (language == LANGUAGE_JAPANESE) - language = 0; - else - language = 7; - - font = &sFonts[language + fontNum]; - - switch (font->type) - { - case 0: - *upperTilePtr = font->glyphs + glyph * font->glyphSize; - *lowerTilePtr = *upperTilePtr + font->lowerTileOffset; - break; - case 1: - index = 2 * glyph; - *upperTilePtr = font->glyphs + sFontType1Map[index] * font->glyphSize; - *lowerTilePtr = font->glyphs + sFontType1Map[index + 1] * font->glyphSize; - break; - case 2: - *upperTilePtr = font->glyphs + 212 * font->glyphSize; - *lowerTilePtr = font->glyphs + glyph * font->glyphSize; - break; - case 3: - index = 2 * glyph; - *upperTilePtr = font->glyphs + sFontType3Map[index] * font->glyphSize; - *lowerTilePtr = font->glyphs + sFontType3Map[index + 1] * font->glyphSize; - break; - case 4: - *upperTilePtr = font->glyphs - + (glyph & 0xFFF0) * font->glyphSize - + (((glyph &= 0xF) * font->glyphSize) >> 1); - *lowerTilePtr = *upperTilePtr + font->lowerTileOffset; - break; - } -} - -static u16 *GetCursorTilemapPointer(struct Window *win) -{ - u16 *ptr = NULL; - if (win->tilemap) - { - u8 x = ((win->left + win->cursorX) >> 3) + win->tilemapLeft; - u8 y = ((win->top + win->cursorY) >> 3) + win->tilemapTop; - ptr = &win->tilemap[(y * 32) + x]; - } - return ptr; -} - -static void ApplyColors_UnshadowedFont(const u8 *src, u32 *dest, u8 foreground, u8 background) -{ - u32 a[2]; - s32 i; - const u8 *srcRows = src; - - a[0] = background; - a[1] = foreground; - - for (i = 0; i < 8; i++) - { - u32 destRow = a[srcRows[i] & 1] - | (a[(srcRows[i] >> 1) & 1] << 4) - | (a[(srcRows[i] >> 2) & 1] << 8) - | (a[(srcRows[i] >> 3) & 1] << 12) - | (a[(srcRows[i] >> 4) & 1] << 16) - | (a[(srcRows[i] >> 5) & 1] << 20) - | (a[(srcRows[i] >> 6) & 1] << 24) - | (a[(srcRows[i] >> 7) ] << 28); - dest[i] = destRow; - } -} - -static void ApplyColors_ShadowedFont(const void *src, void *dest, u8 foreground, u8 shadow, u8 background) -{ - u32 a[0x10]; - s32 i; - const u32 *curSrc; - u32 *curDest; - u32 colorMask; - - a[0x1] = 0x1; - a[0x2] = 0x2; - a[0x3] = 0x3; - a[0x4] = 0x4; - a[0x5] = 0x5; - a[0x6] = 0x6; - a[0x7] = 0x7; - a[0x8] = 0x8; - a[0x9] = 0x9; - a[0xA] = 0xA; - a[0xB] = 0xB; - a[0xC] = 0xC; - a[0xD] = 0xD; - a[0x0] = background; - a[0xE] = shadow; - a[0xF] = foreground; - - colorMask = 0xF; - - curSrc = src; - curDest = dest; - - for (i = 7; i >= 0; i--) - { - u32 row = *curSrc++; - u32 recoloredRow = a[row & colorMask] - | (a[(row >> 4) & colorMask] << 4) - | (a[(row >> 8) & colorMask] << 8) - | (a[(row >> 12) & colorMask] << 12) - | (a[(row >> 16) & colorMask] << 16) - | (a[(row >> 20) & colorMask] << 20) - | (a[(row >> 24) & colorMask] << 24) - | (a[(row >> 28) ] << 28); - *curDest++ = recoloredRow; - } -} - -static void SetCursorX(struct Window *win, u8 x) -{ - if (win->textMode == 0 && ((win->left + win->cursorX) & 7)) - win->tileDataOffset += 2; - win->cursorX = x; -} - -static void AddToCursorX(struct Window *win, u8 deltaX) -{ - if (win->textMode == 0) - { - u8 x = win->cursorX; - win->cursorX += deltaX; - if (((win->left + win->cursorX) & 0xF8) != ((win->left + x) & 0xF8)) - win->tileDataOffset += 2; - } - else - { - win->cursorX += deltaX; - } -} - -static void AddToCursorY(struct Window *win, u8 deltaY) -{ - if (win->textMode == 0 && ((win->left + win->cursorX) & 7)) - win->tileDataOffset += 2; - win->cursorY += deltaY; -} - -static void EraseAtCursor(struct Window *win) -{ - switch (win->textMode) - { - case 0: - case 2: - DrawGlyphTiles(win, 0, 8); - break; - case 1: - sWriteGlyphTilemapFuncs[win->fontNum](win, 0); - break; - } -} - -static void ClipLeft(struct Window *win) -{ - u32 pixel = win->left & 7; - if (win->textMode != 1 && pixel) - { - const u32 *masks = sGlyphMasks[8][pixel]; - u32 outsideMask = masks[0]; - u32 insideMask = ~outsideMask; - u32 outside = sGlyphBuffer.background & outsideMask; - u16 tileNum = GetCursorTileNum(win, 0, 0); - u32 *buffer = (u32 *)(win->tileData + 32 * tileNum); - buffer[0] = (buffer[0] & insideMask) | outside; - buffer[1] = (buffer[1] & insideMask) | outside; - buffer[2] = (buffer[2] & insideMask) | outside; - buffer[3] = (buffer[3] & insideMask) | outside; - buffer[4] = (buffer[4] & insideMask) | outside; - buffer[5] = (buffer[5] & insideMask) | outside; - buffer[6] = (buffer[6] & insideMask) | outside; - buffer[7] = (buffer[7] & insideMask) | outside; - tileNum = GetCursorTileNum(win, 0, 1); - buffer = (u32 *)(win->tileData + 32 * tileNum); - buffer[0] = (buffer[0] & insideMask) | outside; - buffer[1] = (buffer[1] & insideMask) | outside; - buffer[2] = (buffer[2] & insideMask) | outside; - buffer[3] = (buffer[3] & insideMask) | outside; - buffer[4] = (buffer[4] & insideMask) | outside; - buffer[5] = (buffer[5] & insideMask) | outside; - buffer[6] = (buffer[6] & insideMask) | outside; - buffer[7] = (buffer[7] & insideMask) | outside; - } -} - -static void ClipRight(struct Window *win) -{ - register u8 cursorX asm("r0") = win->cursorX; - u8 left = win->left; - u32 pixel = (cursorX + left) & 7; - if (win->textMode != 1 && pixel) - { - const u32 *masks = sGlyphMasks[8 - pixel][pixel]; - u32 insideMask = masks[0]; - u32 outside = (sGlyphBuffer.background & ~insideMask); - u16 tileNum = GetCursorTileNum(win, 0, 0); - u32 *buffer = (u32 *)(win->tileData + 32 * tileNum); - buffer[0] = (buffer[0] & insideMask) | outside; - buffer[1] = (buffer[1] & insideMask) | outside; - buffer[2] = (buffer[2] & insideMask) | outside; - buffer[3] = (buffer[3] & insideMask) | outside; - buffer[4] = (buffer[4] & insideMask) | outside; - buffer[5] = (buffer[5] & insideMask) | outside; - buffer[6] = (buffer[6] & insideMask) | outside; - buffer[7] = (buffer[7] & insideMask) | outside; - tileNum = GetCursorTileNum(win, 0, 1); - buffer = (u32 *)(win->tileData + 32 * tileNum); - buffer[0] = (buffer[0] & insideMask) | outside; - buffer[1] = (buffer[1] & insideMask) | outside; - buffer[2] = (buffer[2] & insideMask) | outside; - buffer[3] = (buffer[3] & insideMask) | outside; - buffer[4] = (buffer[4] & insideMask) | outside; - buffer[5] = (buffer[5] & insideMask) | outside; - buffer[6] = (buffer[6] & insideMask) | outside; - buffer[7] = (buffer[7] & insideMask) | outside; - UpdateTilemap(win, 1); - } -} - -static void InitColors(struct Window *win) -{ - u32 i; - - win->backgroundColor = 0; - win->shadowColor = 14; - win->foregroundColor = 15; - - for (i = 0; i < 16; i++) - sGlyphBuffer.colors[i] = i; -} - -static void SetBackgroundColor(struct Window *win, u8 color) -{ - u32 val1; - u32 val2; - u32 val3; - win->backgroundColor = color; - sGlyphBuffer.colors[0] = color; - val1 = color | (color << 4); - val2 = val1 | (val1 << 8); - val3 = val2 | (val2 << 16); - sGlyphBuffer.background = val3; -} - -static void SetShadowColor(struct Window *win, u8 color) -{ - win->shadowColor = color; - sGlyphBuffer.colors[14] = color; -} - -static void SetForegroundColor(struct Window *win, u8 color) -{ - win->foregroundColor = color; - sGlyphBuffer.colors[15] = color; -} - -static u8 GetTextDelay(struct Window *win) -{ - if (!PlayerCanInterruptWait(win)) - return 3; - - return sTextSpeedDelays[gSaveBlock2.optionsTextSpeed]; -} - -static bool8 PlayerCanInterruptWait(struct Window *win) -{ - bool8 retVal = TRUE; - - switch (sWaitType) - { - case 2: - retVal = FALSE; - break; - case 3: - retVal = gIsLinkContest ? FALSE : TRUE; - break; - case 1: - retVal = (gBattleTypeFlags & BATTLE_TYPE_LINK) ? FALSE : TRUE; - break; - } - - return retVal; -} - -static void ScrollWindowTextLines(struct Window *win) -{ - switch (win->textMode) - { - case 0: - ScrollWindowTextLines_TextMode0(win); - break; - case 1: - ScrollWindowTextLines_TextMode1(win); - break; - case 2: - ScrollWindowTextLines_TextMode2(win); - break; - } -} - -static void ScrollWindowTextLines_TextMode0(struct Window *win) -{ - if (win->cursorY == 0) - { - win->tileDataOffset = 2 * sLineLength + 2; - win->cursorX = 0; - win->cursorY += 16; - } - else - { - if (win->win_field_C & 2) - win->tileDataOffset = 2 * sLineLength + 2; - else - win->tileDataOffset = 2; - win->win_field_C = win->win_field_C ^ 2; - win->cursorX = 0; - DoScroll_TextMode0(win, sLineLength); - } -} - -static void DoScroll_TextMode0(struct Window *win, u16 lineLength) -{ - u16 *buffer = win->tilemap; - u32 val1 = 32 * (win->top >> 3); - u32 val2 = (win->left >> 3); - u16 fill; - buffer += val1 + val2; - fill = (win->paletteNum << 12) | GetBlankTileNum(win); - CpuCopy16(buffer + 64, buffer, lineLength * 2); - CpuCopy16(buffer + 96, buffer + 32, lineLength * 2); - CpuFill16(fill, buffer + 64, lineLength * 2); - CpuFill16(fill, buffer + 96, lineLength * 2); -} - -static void ScrollWindowTextLines_TextMode1(struct Window *win) -{ - if (win->cursorY == 0) - { - win->cursorX = 0; - win->cursorY += 16; - } - else - { - win->win_field_C ^= 2; - win->cursorX = 0; - DoScroll_TextMode1(win, sLineLength); - } -} - -static void DoScroll_TextMode1(struct Window *win, u16 lineLength) -{ - u16 *buffer = GetCursorTilemapPointer(win); - u16 *dest = buffer - 32; - u16 fill = (win->paletteNum << 12) | GetBlankTileNum(win); - CpuCopy16(buffer + 32, dest, lineLength * 2); - CpuCopy16(buffer + 64, buffer, lineLength * 2); - CpuFill16(fill, buffer + 32, lineLength * 2); - CpuFill16(fill, buffer + 64, lineLength * 2); -} - -static void ScrollWindowTextLines_TextMode2(struct Window *win) -{ - if (win->cursorY == 0) - { - win->cursorX = 0; - win->cursorY += 16; - } - else - { - win->win_field_C ^= 2; - win->cursorX = 0; - DoScroll_TextMode2(win, sLineLength); - } -} - -static void DoScroll_TextMode2(struct Window *win, u8 lineLength) -{ - u8 i; - u8 *buf1 = win->tileData + 32 * GetCursorTileNum(win, 0, -2); - u8 *buf2 = win->tileData + 32 * GetCursorTileNum(win, 0, 0); - u8 *buf4; - u16 *buf3; - u16 a[4]; - - CpuFastCopy(buf2, buf1, 32 * lineLength); - CpuFastFill(sGlyphBuffer.background, buf2, 32 * lineLength); - buf4 = buf2 + 32 * win->width; - CpuFastCopy(buf4, buf1 + 32 * win->width, 32 * lineLength); - CpuFastFill(sGlyphBuffer.background, buf4, 32 * lineLength); - - buf3 = GetCursorTilemapPointer(win) - 64; - - a[0] = (win->tileDataStartOffset + win->tileDataOffset - + ((win->top >> 3) * win->width) - + (win->left >> 3)) - | (win->paletteNum << 12); - a[1] = a[0] + win->width; - a[2] = a[1] + win->width; - a[3] = a[2] + win->width; - - for (i = 0; i < lineLength; i++) - { - buf3[0] = a[0]++; - buf3[32] = a[1]++; - buf3[64] = a[2]++; - buf3[96] = a[3]++; - buf3++; - } -} - -void ClearWindowTextLines(struct Window *win) -{ - switch (win->textMode) - { - case 0: - ClearWindowTextLines_TextMode0_TextMode1(win, sLineLength); - win->tileDataOffset = 2; - break; - case 1: - ClearWindowTextLines_TextMode0_TextMode1(win, sLineLength); - break; - case 2: - ClearWindowTextLines_TextMode2(win, sLineLength); - break; - } -} - -static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *win, u8 lineLength) -{ - u8 i; - u16 *buffer; - u16 fill; - - win->cursorX = 0; - win->cursorY = 0; - win->win_field_C = 0; - - buffer = GetCursorTilemapPointer(win); - fill = GetBlankTileNum(win) | (win->paletteNum << 12); - - for (i = 0; i < 4; i++) - { - u8 j; - for (j = 0; j < lineLength; j++) - buffer[j] = fill; - buffer += 32; - } -} - -static void ClearWindowTextLines_TextMode2(struct Window *win, u8 lineLength) -{ - u8 *buffer; - - win->cursorX = 0; - win->cursorY = 0; - win->win_field_C = 0; - - buffer = win->tileData + 32 * GetCursorTileNum(win, 0, 0); - CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); - buffer += 32 * win->width; - CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); - buffer += 32 * win->width; - CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); - buffer += 32 * win->width; - CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); -} - -static void DrawDownArrow(struct Window *win) -{ - if (PlayerCanInterruptWait(win)) - { - const u32 *downArrowTiles = &sDownArrowTiles[((win->downArrowCounter & 0x0F00) >> 8) * 16]; - - switch (win->textMode) - { - case 1: - { - u8 *buffer; - u16 tileNum = win->tileDataStartOffset + 254; - if (win->fontNum == 0 || win->fontNum == 3) - tileNum *= 2; - buffer = win->tileData + 32 * tileNum; - ApplyColors_ShadowedFont(downArrowTiles, buffer, win->foregroundColor, win->shadowColor, win->backgroundColor); - ApplyColors_ShadowedFont(downArrowTiles + 8, buffer + 32, win->foregroundColor, win->shadowColor, win->backgroundColor); - WriteGlyphTilemap(win, tileNum, tileNum + 1); - break; - } - case 0: - case 2: - { - struct GlyphTileInfo glyphTileInfo; - glyphTileInfo.textMode = win->textMode; - glyphTileInfo.startPixel = (win->left + win->cursorX) & 7; - if (glyphTileInfo.startPixel != 0) - { - u8 *upperTile; - u8 *lowerTile; - GetGlyphTilePointers(win->fontNum, win->language, 0, &upperTile, &lowerTile); - glyphTileInfo.width = 8 - glyphTileInfo.startPixel; - glyphTileInfo.src = upperTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 1, 0)); - glyphTileInfo.colors = sGlyphBuffer.colors; - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - glyphTileInfo.src = lowerTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 1, 1)); - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - } - glyphTileInfo.width = 8; - glyphTileInfo.src = (u8 *)downArrowTiles; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 0)); - glyphTileInfo.colors = sGlyphBuffer.colors; - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - glyphTileInfo.src += 32; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - if (glyphTileInfo.startPixel != 0) - UpdateTilemap(win, 2); - else - UpdateTilemap(win, 1); - break; - } - } - } -} - -static u8 WaitWithDownArrow(struct Window *win) -{ - u8 retVal = 1; - - if (!PlayerCanInterruptWait(win)) - { - win->delayCounter--; - if (!win->delayCounter) - { - TryEraseDownArrow(win); - } - else - { - DrawMovingDownArrow(win); - retVal = 0; - } - } - else - { - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PlaySE(SE_SELECT); - TryEraseDownArrow(win); - } - else - { - DrawMovingDownArrow(win); - retVal = 0; - } - } - - return retVal; -} - -static void DrawInitialDownArrow(struct Window *win) -{ - win->downArrowCounter = 0; - DrawDownArrow(win); -} - -static void DrawMovingDownArrow(struct Window *win) -{ - u16 downArrowPos = (win->downArrowCounter & 0x0F00) >> 8; - u16 wait = win->downArrowCounter & 0x000F; - u16 newVal; - - wait++; - - if (wait == 6) - { - wait = 0; - downArrowPos++; - if (downArrowPos > 3) - downArrowPos = 0; - win->downArrowCounter = downArrowPos << 8; - DrawDownArrow(win); - } - - newVal = downArrowPos << 8; - newVal |= wait; - - win->downArrowCounter = newVal; -} - -static void TryEraseDownArrow(struct Window *win) -{ - win->downArrowCounter = 0; - if (PlayerCanInterruptWait(win) == TRUE) - EraseAtCursor(win); -} - -u16 GetWindowTilemapEntry(struct Window *win, u8 x, u8 y) -{ - u16 *tilemap = win->tilemap; - return tilemap[32 * y + x]; -} - -void DrawWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) -{ - u8 i; - u16 *buffer = &win->tilemap[top * 32]; - - for (i = left; i <= right; i++) - buffer[i] = tilemapEntry; - - for (i = top + 1; i < bottom - 1; i++) - { - buffer += 32; - buffer[left] = tilemapEntry; - buffer[right] = tilemapEntry; - } - - if (top != bottom) - { - buffer += 32; - for (i = left; i <= right; i++) - buffer[i] = tilemapEntry; - } -} - -void DrawWindowRect_DefaultPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) -{ - DrawWindowRect(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); -} - -void FillWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) -{ - u16 *buffer = &win->tilemap[top * 32]; - while (top++ <= bottom) - { - u8 j; - for (j = left; j <= right; j++) - buffer[j] = tilemapEntry; - buffer += 32; - } -} - -void FillWindowRect_DefaultPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) -{ - FillWindowRect(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); -} - -void ZeroFillWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) -{ - FillWindowRect_DefaultPalette(win, 0, left, top, right, bottom); -} - -void FillWindowRectWithBlankTile(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) -{ - u16 tileNum = GetBlankTileNum(win); - FillWindowRect_DefaultPalette(win, tileNum, left, top, right, bottom); -} - -static u16 GetBlankTileNum(struct Window *win) -{ - u16 retVal = win->tileDataStartOffset; - - switch (win->textMode) - { - case 0: - break; - case 2: - retVal++; - break; - case 1: - switch (win->fontNum) - { - case 1: - case 2: - case 4: - case 5: - retVal += 212; - case 0: - case 3: - case 6: - break; - default: - retVal = 0; - } - break; - } - - return retVal; -} - -static s32 sub_80048D8(struct Window *win, u8 x, u8 y) -{ - win->cursorX = x; - win->cursorY = y & 0xF8; -} - -static u8 GetGlyphWidth(struct Window *win, u32 glyph) -{ - u8 width = 8; - -#ifdef BUGFIX_GLYPHWIDTH - if (win->language != LANGUAGE_JAPANESE) -#else - if (win->language == LANGUAGE_ENGLISH) -#endif - { - width = win->spacing; - if (!win->spacing) - { - switch (win->fontNum) - { - case 3: - width = sFont3Widths[glyph]; - break; - case 4: - case 5: - width = sFont4Widths[sFontType1Map[2 * glyph + 1]]; - break; - case 0: - width = sFont0Widths[glyph]; - break; - case 1: - case 2: - width = sFont1Widths[sFontType1Map[2 * glyph + 1]]; - break; - case 6: - width = 8; - break; - default: - width = 8; - } - } - } - - return width; -} - -u8 GetExtCtrlCodeLength(u8 code) -{ - u8 length = 0; - if (code <= 0x16) - length = sExtCtrlCodeLengths[code]; - return length; -} - -u8 *AlignInt1(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignType) -{ - u8 temp[16]; - u8 width; - switch (alignType) - { - case 0: - ConvertIntToDecimalString(temp, value); - dest = StringCopy(dest, temp); - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount; - dest += 3; - *dest = 0xFF; - break; - case 1: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount - width; - dest += 3; - } - dest = StringCopy(dest, temp); - break; - case 2: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = (alignAmount - width) / 2; - dest += 3; - } - dest = StringCopy(dest, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount; - dest += 3; - *dest = 0xFF; - } - break; - } - return dest; -} - -u8 *AlignInt2(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignType) -{ - u8 temp[16]; - u8 width; - switch (alignType) - { - case 0: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - dest = StringCopy(dest, temp); - dest[0] = 0xFC; - dest[1] = 17; - dest[2] = alignAmount - width; - dest += 3; - *dest = 0xFF; - break; - case 1: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 17; - dest[2] = alignAmount - width; - dest += 3; - } - dest = StringCopy(dest, temp); - break; - case 2: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 17; - dest[2] = (alignAmount - width) / 2; - dest += 3; - } - dest = StringCopy(dest, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 17; - dest[2] = (alignAmount - width) / 2; - dest += 3; - *dest = 0xFF; - } - break; - } - return dest; -} - -u8 *AlignString(struct Window *win, u8 *dest, const u8 *src, u8 alignAmount, u8 alignType) -{ - u8 width; - switch (alignType) - { - case 0: - dest = StringCopy(dest, src); - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount; - dest += 3; - *dest = 0xFF; - break; - case 1: - width = GetStringWidth(win, src); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount - width; - dest += 3; - } - dest = StringCopy(dest, src); - break; - case 2: - width = GetStringWidth(win, src); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = (alignAmount - width) / 2; - dest += 3; - } - dest = StringCopy(dest, src); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount; - dest += 3; - *dest = 0xFF; - } - break; - } - return dest; -} - -u8 GetStringWidth(struct Window *win, const u8 *s) -{ - u8 width = 0; - u8 savedFontNum = win->fontNum; - u8 savedCharset = win->language; - u8 savedSpacing = win->spacing; - s32 i = 0; - - while (s[i] != 0xFF) - { - u8 c = s[i]; - switch (c) - { - case 0xFD: - { - u8 temp; - i++; - temp = win->language; - width += GetStringWidth(win, GetExpandedPlaceholder(s[i])); - win->language = temp; - i++; - break; - } - case 0xFC: - i++; - switch (s[i]) - { - case 6: - win->fontNum = s[i + 1]; - break; - case 7: - win->fontNum = win->config->fontNum; - break; - case 0x11: - width += s[i + 1]; - break; - case 0x12: - case 0x13: - if (width < s[i + 1]) - width = s[i + 1]; - break; - case 0x14: - win->spacing = s[i + 1]; - break; - case 0x15: - win->language = LANGUAGE_JAPANESE; - break; - case 0x16: - win->language = GAME_LANGUAGE; - break; - } - - i += GetExtCtrlCodeLength(s[i]); - break; - default: - i++; - width += GetGlyphWidth(win, c); - } - } - - win->spacing = savedSpacing; - win->language = savedCharset; - win->fontNum = savedFontNum; - - return width; -} - -u8 sub_8004D04(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) -{ - sub_8002E4C(win, text, tileDataStartOffset, left, top, a6); - return sub_8002F44(win); -} - -u8 sub_8004D38(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - u8 width = GetStringWidth(win, text); - InitWindow(win, text, tileDataStartOffset, left - ((u32)(width + 7) >> 3), top); - EraseAtCursor(win); - width &= 7; - if (width) - width = 8 - width; - sub_80048D8(win, width, 0); - return sub_8002F44(win); -} - -u8 sub_8004DB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top, u16 a6) -{ - register u32 val asm("r5") = (u8)((a6 >> 1) - (GetStringWidth(win, text) >> 1)); - left += (val >> 3); - InitWindow(win, text, tileDataStartOffset, left, top); - EraseAtCursor(win); - sub_80048D8(win, val & 7, 0); - return sub_8002F44(win); -} - -u8 sub_8004E24(struct Window *win) -{ - return win->paletteNum; -} - -void sub_8004E28(struct Window *win, u8 *foreground, u8 *background, u8 *shadow) -{ - *foreground = win->foregroundColor; - *background = win->backgroundColor; - *shadow = win->shadowColor; -} - -void sub_8004E3C(struct WindowConfig *winConfig, u8 *tileData, const u8 *text) -{ - sTempWindow.config = winConfig; - InitWindow(&sTempWindow, text, 0, 0, 0); - sTempWindow.tileData = tileData; - sub_8002F44(&sTempWindow); -} - -u8 GetStringWidthGivenWindowConfig(struct WindowConfig *winConfig, const u8 *s) -{ - sTempWindow.config = winConfig; - InitWindow(&sTempWindow, s, 0, 0, 0); - return GetStringWidth(&sTempWindow, s); -} - -void ConvertInternationalString(u8 *s, u8 language) -{ - if (language == LANGUAGE_JAPANESE) - { - u8 i; - - StripExtCtrlCodes(s); - i = StringLength(s); - s[i++] = 0xFC; - s[i++] = 22; - s[i++] = 0xFF; - - i--; - - while (i != (u8)-1) - { - s[i + 2] = s[i]; - i--; - } - - s[0] = 0xFC; - s[1] = 21; - } -} - -void StripExtCtrlCodes(u8 *str) -{ - u16 srcIndex = 0; - u16 destIndex = 0; - while (str[srcIndex] != 0xFF) - { - if (str[srcIndex] == 0xFC) - { - srcIndex++; - srcIndex += GetExtCtrlCodeLength(str[srcIndex]); - } - else - { - str[destIndex++] = str[srcIndex++]; - } - } - str[destIndex] = 0xFF; -} - -static const u8 *SkipExtCtrlCode(const u8 *s) -{ - while (*s == 0xFC) - { - s++; - s += GetExtCtrlCodeLength(*s); - } - - return s; -} - -s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2) -{ - s32 retVal = 0; - - while (1) - { - str1 = SkipExtCtrlCode(str1); - str2 = SkipExtCtrlCode(str2); - - if (*str1 > *str2) - break; - - if (*str1 < *str2) - { - retVal = -1; - if (*str2 == 0xFF) - retVal = 1; - } - - if (*str1 == 0xFF) - return retVal; - - str1++; - str2++; - } - - retVal = 1; - - if (*str1 == 0xFF) - retVal = -1; - - return retVal; -} - -u8 sub_8004FD0(struct Window *win, u8 *dest, const u8 *src, u16 tileDataStartOffset, u8 left, u16 top, u8 width, u32 a8) -{ - u8 newlineCount = 0; - u8 extCtrlCodeLength; - u8 *start; - u32 endsWithoutNewline; - - if (dest == NULL) - dest = gStringVar4; - - start = dest; - endsWithoutNewline = FALSE; - - while (*src != 0xFF) - { - switch (*src) - { - default: - *dest = *src; - dest++; - src++; - endsWithoutNewline = TRUE; - break; - case 0xFC: - extCtrlCodeLength = GetExtCtrlCodeLength(src[1]) + 1; - memcpy(dest, src, extCtrlCodeLength); - dest += extCtrlCodeLength; - src += extCtrlCodeLength; - break; - case 0xFE: - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = width; - dest[3] = 0xFE; - dest += 4; - src++; - newlineCount++; - endsWithoutNewline = FALSE; - break; - } - } - - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = width; - dest[3] = 0xFF; - - if (endsWithoutNewline) - newlineCount++; - - sub_8002E4C(win, start, tileDataStartOffset, left, top, a8); - sub_8002F44(win); - - return newlineCount; -} - -static s32 DrawGlyphTile_UnshadowedFont(struct GlyphTileInfo *glyphTileInfo) -{ - struct GlyphBuffer *glyphBuffer = &sGlyphBuffer; - u32 colors[2]; - u32 *buffer = glyphTileInfo->dest; - const u32 *masks = sGlyphMasks[glyphTileInfo->width][glyphTileInfo->startPixel]; - u32 mask1 = masks[0] | masks[2]; - - glyphBuffer->pixelRows[0] = buffer[0] & mask1; - glyphBuffer->pixelRows[1] = buffer[1] & mask1; - glyphBuffer->pixelRows[2] = buffer[2] & mask1; - glyphBuffer->pixelRows[3] = buffer[3] & mask1; - glyphBuffer->pixelRows[4] = buffer[4] & mask1; - glyphBuffer->pixelRows[5] = buffer[5] & mask1; - glyphBuffer->pixelRows[6] = buffer[6] & mask1; - glyphBuffer->pixelRows[7] = buffer[7] & mask1; - - if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) - { - u32 mask2 = masks[1]; - if (glyphTileInfo->textMode == 2) - { - glyphBuffer->pixelRows[8] = buffer[8] & mask2; - glyphBuffer->pixelRows[9] = buffer[9] & mask2; - glyphBuffer->pixelRows[10] = buffer[10] & mask2; - glyphBuffer->pixelRows[11] = buffer[11] & mask2; - glyphBuffer->pixelRows[12] = buffer[12] & mask2; - glyphBuffer->pixelRows[13] = buffer[13] & mask2; - glyphBuffer->pixelRows[14] = buffer[14] & mask2; - glyphBuffer->pixelRows[15] = buffer[15] & mask2; - } - else - { - glyphBuffer->pixelRows[8] = buffer[16] & mask2; - glyphBuffer->pixelRows[9] = buffer[17] & mask2; - glyphBuffer->pixelRows[10] = buffer[18] & mask2; - glyphBuffer->pixelRows[11] = buffer[19] & mask2; - glyphBuffer->pixelRows[12] = buffer[20] & mask2; - glyphBuffer->pixelRows[13] = buffer[21] & mask2; - glyphBuffer->pixelRows[14] = buffer[22] & mask2; - glyphBuffer->pixelRows[15] = buffer[23] & mask2; - } - } - - colors[0] = glyphTileInfo->colors[0]; - colors[1] = glyphTileInfo->colors[15]; - - sShiftGlyphTileUnshadowedFuncs[glyphTileInfo->width](glyphBuffer, glyphTileInfo->src, colors, glyphTileInfo->startPixel); - - buffer[0] = glyphBuffer->pixelRows[0]; - buffer[1] = glyphBuffer->pixelRows[1]; - buffer[2] = glyphBuffer->pixelRows[2]; - buffer[3] = glyphBuffer->pixelRows[3]; - buffer[4] = glyphBuffer->pixelRows[4]; - buffer[5] = glyphBuffer->pixelRows[5]; - buffer[6] = glyphBuffer->pixelRows[6]; - buffer[7] = glyphBuffer->pixelRows[7]; - - if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) - { - if (glyphTileInfo->textMode != 2) - buffer += 8; - buffer[8] = glyphBuffer->pixelRows[8]; - buffer[9] = glyphBuffer->pixelRows[9]; - buffer[10] = glyphBuffer->pixelRows[10]; - buffer[11] = glyphBuffer->pixelRows[11]; - buffer[12] = glyphBuffer->pixelRows[12]; - buffer[13] = glyphBuffer->pixelRows[13]; - buffer[14] = glyphBuffer->pixelRows[14]; - buffer[15] = glyphBuffer->pixelRows[15]; - } - - return (glyphTileInfo->startPixel + glyphTileInfo->width) / 8; -} - -static void ShiftGlyphTile_UnshadowedFont_Width0(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *a3, u8 startPixel) -{ -} - -static void ShiftGlyphTile_UnshadowedFont_Width1(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = colors[src[i] >> 7]; - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width2(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width3(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - // XXX: why 4? - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width4(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width5(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12) - | (colors[(src[i] >> 3) & 1] << 16); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width6(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12) - | (colors[(src[i] >> 3) & 1] << 16) - | (colors[(src[i] >> 2) & 1] << 20); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width7(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12) - | (colors[(src[i] >> 3) & 1] << 16) - | (colors[(src[i] >> 2) & 1] << 20) - | (colors[(src[i] >> 1) & 1] << 24); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width8(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12) - | (colors[(src[i] >> 3) & 1] << 16) - | (colors[(src[i] >> 2) & 1] << 20) - | (colors[(src[i] >> 1) & 1] << 24) - | (colors[(src[i] >> 0) & 1] << 28); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static s32 DrawGlyphTile_ShadowedFont(struct GlyphTileInfo *glyphTileInfo) -{ - struct GlyphBuffer *glyphBuffer = &sGlyphBuffer; - u32 *buffer = glyphTileInfo->dest; - const u32 *masks = sGlyphMasks[glyphTileInfo->width][glyphTileInfo->startPixel]; - u32 mask1 = masks[0] | masks[2]; - - glyphBuffer->pixelRows[0] = buffer[0] & mask1; - glyphBuffer->pixelRows[1] = buffer[1] & mask1; - glyphBuffer->pixelRows[2] = buffer[2] & mask1; - glyphBuffer->pixelRows[3] = buffer[3] & mask1; - glyphBuffer->pixelRows[4] = buffer[4] & mask1; - glyphBuffer->pixelRows[5] = buffer[5] & mask1; - glyphBuffer->pixelRows[6] = buffer[6] & mask1; - glyphBuffer->pixelRows[7] = buffer[7] & mask1; - - if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) - { - u32 mask2 = masks[1]; - if (glyphTileInfo->textMode == 2) - { - glyphBuffer->pixelRows[8] = buffer[8] & mask2; - glyphBuffer->pixelRows[9] = buffer[9] & mask2; - glyphBuffer->pixelRows[10] = buffer[10] & mask2; - glyphBuffer->pixelRows[11] = buffer[11] & mask2; - glyphBuffer->pixelRows[12] = buffer[12] & mask2; - glyphBuffer->pixelRows[13] = buffer[13] & mask2; - glyphBuffer->pixelRows[14] = buffer[14] & mask2; - glyphBuffer->pixelRows[15] = buffer[15] & mask2; - } - else - { - glyphBuffer->pixelRows[8] = buffer[16] & mask2; - glyphBuffer->pixelRows[9] = buffer[17] & mask2; - glyphBuffer->pixelRows[10] = buffer[18] & mask2; - glyphBuffer->pixelRows[11] = buffer[19] & mask2; - glyphBuffer->pixelRows[12] = buffer[20] & mask2; - glyphBuffer->pixelRows[13] = buffer[21] & mask2; - glyphBuffer->pixelRows[14] = buffer[22] & mask2; - glyphBuffer->pixelRows[15] = buffer[23] & mask2; - } - } - - sShiftGlyphTileShadowedFuncs[glyphTileInfo->width](glyphBuffer, (u32 *)glyphTileInfo->src, glyphTileInfo->colors, glyphTileInfo->startPixel); - - buffer[0] = glyphBuffer->pixelRows[0]; - buffer[1] = glyphBuffer->pixelRows[1]; - buffer[2] = glyphBuffer->pixelRows[2]; - buffer[3] = glyphBuffer->pixelRows[3]; - buffer[4] = glyphBuffer->pixelRows[4]; - buffer[5] = glyphBuffer->pixelRows[5]; - buffer[6] = glyphBuffer->pixelRows[6]; - buffer[7] = glyphBuffer->pixelRows[7]; - - if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) - { - if (glyphTileInfo->textMode != 2) - buffer += 8; - buffer[8] = glyphBuffer->pixelRows[8]; - buffer[9] = glyphBuffer->pixelRows[9]; - buffer[10] = glyphBuffer->pixelRows[10]; - buffer[11] = glyphBuffer->pixelRows[11]; - buffer[12] = glyphBuffer->pixelRows[12]; - buffer[13] = glyphBuffer->pixelRows[13]; - buffer[14] = glyphBuffer->pixelRows[14]; - buffer[15] = glyphBuffer->pixelRows[15]; - } - - return (glyphTileInfo->startPixel + glyphTileInfo->width) / 8; -} - -static void ShiftGlyphTile_ShadowedFont_Width0(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ -} - -static void ShiftGlyphTile_ShadowedFont_Width1(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = colors[src[i] & 0xF]; - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_ShadowedFont_Width2(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 0) & 0xF] << 0) - | (colors[(src[i] >> 4) & 0xF] << 4); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_ShadowedFont_Width3(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 0) & 0xF] << 0) - | (colors[(src[i] >> 4) & 0xF] << 4) - | (colors[(src[i] >> 8) & 0xF] << 8); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_ShadowedFont_Width4(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 0) & 0xF] << 0) - | (colors[(src[i] >> 4) & 0xF] << 4) - | (colors[(src[i] >> 8) & 0xF] << 8) - | (colors[(src[i] >> 12) & 0xF] << 12); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -#define SHIFT_GLYPH_WIDTH5_STEP(i) \ -val = (colors[(src[i] >> 0) & 0xF] << 0) \ - | (colors[(src[i] >> 4) & 0xF] << 4) \ - | (colors[(src[i] >> 8) & 0xF] << 8) \ - | (colors[(src[i] >> 12) & 0xF] << 12) \ - | (colors[(src[i] >> 16) & 0xF] << 16); \ -glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ -glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ - -static void ShiftGlyphTile_ShadowedFont_Width5(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u32 val; - SHIFT_GLYPH_WIDTH5_STEP(0) - SHIFT_GLYPH_WIDTH5_STEP(1) - SHIFT_GLYPH_WIDTH5_STEP(2) - SHIFT_GLYPH_WIDTH5_STEP(3) - SHIFT_GLYPH_WIDTH5_STEP(4) - SHIFT_GLYPH_WIDTH5_STEP(5) - SHIFT_GLYPH_WIDTH5_STEP(6) - SHIFT_GLYPH_WIDTH5_STEP(7) -} - -#define SHIFT_GLYPH_WIDTH6_STEP(i) \ -val = (colors[(src[i] >> 0) & 0xF] << 0) \ - | (colors[(src[i] >> 4) & 0xF] << 4) \ - | (colors[(src[i] >> 8) & 0xF] << 8) \ - | (colors[(src[i] >> 12) & 0xF] << 12) \ - | (colors[(src[i] >> 16) & 0xF] << 16) \ - | (colors[(src[i] >> 20) & 0xF] << 20); \ -glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ -glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ - -static void ShiftGlyphTile_ShadowedFont_Width6(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u32 val; - SHIFT_GLYPH_WIDTH6_STEP(0) - SHIFT_GLYPH_WIDTH6_STEP(1) - SHIFT_GLYPH_WIDTH6_STEP(2) - SHIFT_GLYPH_WIDTH6_STEP(3) - SHIFT_GLYPH_WIDTH6_STEP(4) - SHIFT_GLYPH_WIDTH6_STEP(5) - SHIFT_GLYPH_WIDTH6_STEP(6) - SHIFT_GLYPH_WIDTH6_STEP(7) -} - -#define SHIFT_GLYPH_WIDTH7_STEP(i) \ -val = (colors[(src[i] >> 0) & 0xF] << 0) \ - | (colors[(src[i] >> 4) & 0xF] << 4) \ - | (colors[(src[i] >> 8) & 0xF] << 8) \ - | (colors[(src[i] >> 12) & 0xF] << 12) \ - | (colors[(src[i] >> 16) & 0xF] << 16) \ - | (colors[(src[i] >> 20) & 0xF] << 20) \ - | (colors[(src[i] >> 24) & 0xF] << 24); \ -glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ -glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ - -static void ShiftGlyphTile_ShadowedFont_Width7(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u32 val; - SHIFT_GLYPH_WIDTH7_STEP(0) - SHIFT_GLYPH_WIDTH7_STEP(1) - SHIFT_GLYPH_WIDTH7_STEP(2) - SHIFT_GLYPH_WIDTH7_STEP(3) - SHIFT_GLYPH_WIDTH7_STEP(4) - SHIFT_GLYPH_WIDTH7_STEP(5) - SHIFT_GLYPH_WIDTH7_STEP(6) - SHIFT_GLYPH_WIDTH7_STEP(7) -} - -#define SHIFT_GLYPH_WIDTH8_STEP(i) \ -val = (colors[(src[i] >> 0) & 0xF] << 0) \ - | (colors[(src[i] >> 4) & 0xF] << 4) \ - | (colors[(src[i] >> 8) & 0xF] << 8) \ - | (colors[(src[i] >> 12) & 0xF] << 12) \ - | (colors[(src[i] >> 16) & 0xF] << 16) \ - | (colors[(src[i] >> 20) & 0xF] << 20) \ - | (colors[(src[i] >> 24) & 0xF] << 24) \ - | (colors[(src[i] >> 28) ] << 28); \ -glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ -glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ - -static void ShiftGlyphTile_ShadowedFont_Width8(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u32 val; - SHIFT_GLYPH_WIDTH8_STEP(0) - SHIFT_GLYPH_WIDTH8_STEP(1) - SHIFT_GLYPH_WIDTH8_STEP(2) - SHIFT_GLYPH_WIDTH8_STEP(3) - SHIFT_GLYPH_WIDTH8_STEP(4) - SHIFT_GLYPH_WIDTH8_STEP(5) - SHIFT_GLYPH_WIDTH8_STEP(6) - SHIFT_GLYPH_WIDTH8_STEP(7) -} - -static s32 DrawGlyphTiles(struct Window *win, u32 glyph, u32 glyphWidth) -{ - struct GlyphTileInfo glyphTileInfo; - u8 *upperTile; - u8 *lowerTile; - s32 retVal = 0; - - GetGlyphTilePointers(win->fontNum, win->language, glyph, &upperTile, &lowerTile); - glyphTileInfo.textMode = win->textMode; - glyphTileInfo.startPixel = (win->left + win->cursorX) & 7; - glyphTileInfo.width = glyphWidth; - glyphTileInfo.src = upperTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 0)); - glyphTileInfo.colors = sGlyphBuffer.colors; - - switch (win->fontNum) - { - case 0: - case 1: - case 2: - case 6: - DrawGlyphTile_UnshadowedFont(&glyphTileInfo); - glyphTileInfo.src = lowerTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); - retVal = DrawGlyphTile_UnshadowedFont(&glyphTileInfo); - break; - case 3: - case 4: - case 5: - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - glyphTileInfo.src = lowerTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); - retVal = DrawGlyphTile_ShadowedFont(&glyphTileInfo); - break; - } - - return retVal; -} - -static void UpdateTilemap(struct Window *win, u32 tilesWidth) -{ - u16 *tilemap = GetCursorTilemapPointer(win); - if (tilesWidth && tilemap) - { - u16 paletteNum = (win->paletteNum << 12); - u16 upperLeftTileNum = GetCursorTileNum(win, 0, 0); - u16 lowerLeftTileNum = GetCursorTileNum(win, 0, 1); - tilemap[0] = upperLeftTileNum | paletteNum; - tilemap[32] = lowerLeftTileNum | paletteNum; - if (tilesWidth == 2) - { - u16 upperRightTileNum = GetCursorTileNum(win, 1, 0); - u16 lowerRightTileNum = GetCursorTileNum(win, 1, 1); - tilemap[1] = upperRightTileNum | paletteNum; - tilemap[33] = lowerRightTileNum | paletteNum; - } - } -} - -static u16 GetCursorTileNum(struct Window *win, u32 xOffset, u32 yOffset) -{ - u16 index; - - if (win->textMode == 2) - index = win->tileDataStartOffset - + win->tileDataOffset - + (((win->top + win->cursorY) >> 3) + yOffset) * win->width - + (((win->left + win->cursorX) >> 3) + xOffset); - else - index = win->tileDataStartOffset + win->tileDataOffset + 2 * xOffset + yOffset; - - return index; -} diff --git a/src/text_window.c b/src/text_window.c deleted file mode 100644 index 9a88789d1..000000000 --- a/src/text_window.c +++ /dev/null @@ -1,184 +0,0 @@ -#include "global.h" -#include "text_window.h" -#include "main.h" -#include "palette.h" -#include "text.h" - -#define STD_MSG_BOX_LEFT 0 -#define STD_MSG_BOX_TOP 14 -#define STD_MSG_BOX_WIDTH 26 -#define STD_MSG_BOX_HEIGHT 4 - -static void LoadTextWindowTiles(u8, void *); -static void LoadTextWindowPalette(u8, u8); -static void DrawTextWindowInternal(u16 *dest, u16 baseTileNum, u8 left, u8 top, u8 right, u8 bottom); -static u16 GetMessageBoxTilemapEntry(u16 tilemapEntry, u8 x, u8 y, u8 width, u8 height); -static void DrawMessageBox(struct Window *win, u8 left, u8 top, u8 width, u8 height); - -static u16 sTextWindowBaseTileNum; -static u16 sMessageBoxBaseTileNum; - -extern const struct FrameGraphics gUnknown_083761F0[20]; - -extern const u16 gMessageBoxTilemap[5][7]; -extern const u8 gMessageBox_Gfx[]; - -u16 SetTextWindowBaseTileNum(u16 baseTileNum) -{ - sTextWindowBaseTileNum = baseTileNum; - return baseTileNum + 9; -} - -void LoadTextWindowGraphics(struct Window *win) -{ - u8 *tileData = win->config->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; - LoadTextWindowTiles(gSaveBlock2.optionsWindowFrameType, tileData); - LoadTextWindowPalette(gSaveBlock2.optionsWindowFrameType, 0xE); -} - -void LoadTextWindowGraphics_OverridePalSlot(struct Window *win, u8 palSlot) -{ - u8 *tileData = win->config->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; - LoadTextWindowTiles(gSaveBlock2.optionsWindowFrameType, tileData); - LoadTextWindowPalette(gSaveBlock2.optionsWindowFrameType, palSlot); -} - -void LoadTextWindowGraphics_OverrideFrameType(struct Window *win, u8 frameType) -{ - u8 *tileData = win->config->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; - LoadTextWindowTiles(frameType, tileData); - LoadTextWindowPalette(frameType, 0xE); -} - -void DrawTextWindow(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) -{ - DrawTextWindowInternal(win->config->tilemap, sTextWindowBaseTileNum, left, top, right, bottom); -} - -const struct FrameGraphics *GetTextWindowFrameGraphics(u8 frameType) -{ - if (frameType > 19) - return &gUnknown_083761F0[0]; - else - return &gUnknown_083761F0[frameType]; -} - -static void LoadTextWindowTiles(u8 frameType, void *dest) -{ - const struct FrameGraphics *frameGraphics = GetTextWindowFrameGraphics(frameType); - CpuFastCopy(frameGraphics->tiles, dest, 9 * TILE_SIZE_4BPP); -} - -static void LoadTextWindowPalette(u8 frameType, u8 palSlot) -{ - const struct FrameGraphics *frameGraphics = GetTextWindowFrameGraphics(frameType); - LoadPalette(frameGraphics->palette, 16 * palSlot, 0x20); -} - -static void DrawTextWindowInternal(u16 *dest, u16 baseTileNum, u8 left, u8 top, u8 right, u8 bottom) -{ - u8 x, y; - u8 startX, endX; - u8 startY, endY; - - startX = (left < right) ? left : right; - endX = (right > left) ? right : left; - - startY = (top < bottom) ? top : bottom; - endY = (bottom > top) ? bottom : top; - - dest[32 * startY + startX] = baseTileNum | 0xE000; - - for (x = startX + 1; x < endX; x++) - dest[32 * startY + x] = (baseTileNum + 1) | 0xE000; - - dest[32 * startY + endX] = (baseTileNum + 2) | 0xE000; - - for (y = startY + 1; y < endY; y++) - { - dest[32 * y + startX] = (baseTileNum + 3) | 0xE000; - - for (x = startX + 1; x < endX; x++) - dest[32 * y + x] = (baseTileNum + 4) | 0xE000; - - dest[32 * y + endX] = (baseTileNum + 5) | 0xE000; - } - - dest[32 * endY + startX] = (baseTileNum + 6) | 0xE000; - - for (x = startX + 1; x < endX; x++) - dest[32 * endY + x] = (baseTileNum + 7) | 0xE000; - - dest[32 * endY + endX] = (baseTileNum + 8) | 0xE000; -} - -u16 SetMessageBoxBaseTileNum(u16 baseTileNum) -{ - sMessageBoxBaseTileNum = baseTileNum; - return baseTileNum + 14; -} - -void unref_sub_80651DC(struct Window *win, u8 *text) -{ - sub_8002EB0(win, text, sMessageBoxBaseTileNum + 14, 2, 15); -} - -void DisplayMessageBox(struct Window *win) -{ - LoadMessageBoxTiles(win); - DrawStandardMessageBox(win); -} - -static u16 GetMessageBoxTilemapEntry(u16 baseTilemapEntry, u8 x, u8 y, u8 width, u8 height) -{ - u16 tilemapEntry = 9; - - if (y >= height) - y = y - height + 3; - else if (y > 1) - y = 2; - - if (x >= width + 2) - x = x - (width + 2) + 4; - else if (x > 2) - x = 3; - - if (x <= 6 && y <= 4) - tilemapEntry = gMessageBoxTilemap[y][x]; - - tilemapEntry += baseTilemapEntry; - - return tilemapEntry; -} - -static void DrawMessageBox(struct Window *win, u8 left, u8 top, u8 width, u8 height) -{ - u8 i, j; - u16 tilemapEntry = (win->paletteNum << 12) | sMessageBoxBaseTileNum; - u16 *tilemap = win->config->tilemap; - - for (i = 0; i < height + 2; i++) - for (j = 0; j < width + 6; j++) - tilemap[(left + j) + 32 * (top + i)] = (win->paletteNum << 12) | GetMessageBoxTilemapEntry(tilemapEntry, j, i, width, height); -} - -void DrawStandardMessageBox(struct Window *win) -{ - DrawMessageBox(win, STD_MSG_BOX_LEFT, STD_MSG_BOX_TOP, STD_MSG_BOX_WIDTH, STD_MSG_BOX_HEIGHT); -} - -void LoadMessageBoxTiles(struct Window *win) -{ - u8 *tileData = win->config->tileData; - CpuFastCopy(gMessageBox_Gfx, tileData + 32 * sMessageBoxBaseTileNum, 14 * TILE_SIZE_4BPP); -} - -void ClearStandardMessageBox(struct Window *win) -{ - u8 i; - u16 *tilemap = win->config->tilemap + (STD_MSG_BOX_TOP * 32); - u16 tilemapEntry = win->paletteNum << 12; - - for (i = 0; i < ((STD_MSG_BOX_HEIGHT + 2) * 32); i++) - tilemap[i] = tilemapEntry; -} diff --git a/src/tileset_anim.c b/src/tileset_anim.c deleted file mode 100644 index 34685381d..000000000 --- a/src/tileset_anim.c +++ /dev/null @@ -1,630 +0,0 @@ -#include "global.h" -#include "tileset_anim.h" - -extern u8 *gTilesetAnimTable_General_0[]; -extern u8 *gTilesetAnimTable_General_1[]; -extern u8 *gTilesetAnimTable_General_2[]; -extern u8 *gTilesetAnimTable_General_3[]; -extern u8 *gTilesetAnimTable_General_4[]; -extern u8 *gTilesetAnimTable_Lavaridge[]; -extern u8 *gTilesetAnimTable_Pacifidlog_0[]; -extern u8 *gTilesetAnimTable_Underwater[]; -extern u8 *gTilesetAnimTable_Pacifidlog_1[]; -extern u8 *gUnknown_0837BAE4[]; -extern u8 *gUnknown_0837BB04[]; -extern u8 *gTilesetAnimTable_Mauville_0A[]; -extern u8 *gTilesetAnimTable_Mauville_1A[]; -extern u8 *gTilesetAnimTable_Mauville_0B[]; -extern u8 *gTilesetAnimTable_Mauville_1B[]; -extern u8 *gUnknown_0837BFA4[]; -extern u8 *gTilesetAnimTable_Rustboro_0[]; -extern u8 *gTilesetAnimTable_Rustboro_1[]; -extern u8 *gTilesetAnimTable_Cave[]; -extern u8 *gUnknown_0837C93C[]; -extern u8 *gTilesetAnimTable_EverGrande[]; -extern u8 *gTilesetAnimTable_Building[]; -extern u8 *gTilesetAnimTable_SootopolisGym_0[]; -extern u8 *gTilesetAnimTable_SootopolisGym_1[]; -extern u8 *gTilesetAnimTable_EliteFour_0[]; -extern u8 *gTilesetAnimTable_EliteFour_1[]; -extern u8 *gTilesetAnimTable_MauvilleGym[]; -extern u8 *gTilesetAnimTable_BikeShop[]; - -struct Dma -{ - u8 *src; - u8 *dest; - u16 size; -}; - -EWRAM_DATA static struct Dma gTilesetAnimDmas[20] = {0}; - -static u8 gNumTilesetAnimDmas; -static u16 gTileset1AnimFrame; -static u16 gTileset1AnimLength; -static u16 gTileset2AnimFrame; -static u16 gTileset2AnimLength; -static void (*gTileset1AnimCallback)(u16); -static void (*gTileset2AnimCallback)(u16); - -static void StartTileset1Animation(void); -static void StartTileset2Animation(void); - -static void sub_8073014(u16); -static void sub_8073058(u16); - -static void sub_8073070(u16); -static void sub_8073098(u16); -static void sub_80730C0(u16); -static void sub_80730E8(u16); -static void sub_807361C(u16); - -static void sub_8073424(u16); -static void sub_80734A0(u16); -static void sub_8073514(u16); -static void sub_8073540(u16); -static void sub_80735B4(u16); -static void sub_80735E4(u16); -static void sub_80738A8(u16); -static void sub_8073600(u16); -static void sub_80738C0(u16); -static void sub_8073890(u16); -static void sub_80738EC(u16); - -static void sub_80737A4(u16, u8); -static void sub_80737E0(u16); -static void sub_8073704(u16, u8); -static void sub_8073644(u8); -static void sub_8073808(u16); -static void sub_8073830(u16, u8); -static void sub_807368C(u8); -static void sub_80736DC(u8); -static void sub_80736B4(u8); -static void sub_8073868(u16); - -static void sub_8073904(u16); -static void sub_80739C4(u16); -static void sub_807392C(u16); -static void sub_807399C(u16); -static void sub_8073974(u16); -static void sub_80739EC(u16); - -static void ClearTilesetAnimDmas(void) -{ - gNumTilesetAnimDmas = 0; - CpuFill32(0, &gTilesetAnimDmas, sizeof(gTilesetAnimDmas)); -} - -static void QueueTilesetAnimDma(u8 *src, u8 *dest, u16 size) -{ - if (gNumTilesetAnimDmas < 20) - { - gTilesetAnimDmas[gNumTilesetAnimDmas].src = src; - gTilesetAnimDmas[gNumTilesetAnimDmas].dest = dest; - gTilesetAnimDmas[gNumTilesetAnimDmas].size = size; - gNumTilesetAnimDmas++; - } -} - -void sub_8072E74(void) -{ - int i; - for (i = 0; i < gNumTilesetAnimDmas; i++) - { - DmaCopy16(3, - gTilesetAnimDmas[i].src, - gTilesetAnimDmas[i].dest, - gTilesetAnimDmas[i].size); - } - gNumTilesetAnimDmas = 0; -} - -void cur_mapheader_run_tileset_funcs_after_some_cpuset(void) -{ - ClearTilesetAnimDmas(); - StartTileset1Animation(); - StartTileset2Animation(); -} - -void sub_8072ED0(void) -{ - StartTileset2Animation(); -} - -void sub_8072EDC(void) -{ - ClearTilesetAnimDmas(); - if (++gTileset1AnimFrame >= gTileset1AnimLength) - { - gTileset1AnimFrame = 0; - } - if (++gTileset2AnimFrame >= gTileset2AnimLength) - { - gTileset2AnimFrame = 0; - } - if (gTileset1AnimCallback) - { - gTileset1AnimCallback(gTileset1AnimFrame); - } - if (gTileset2AnimCallback) - { - gTileset2AnimCallback(gTileset2AnimFrame); - } -} - -static void StartTileset1Animation(void) -{ - gTileset1AnimFrame = 0; - gTileset1AnimLength = 0; - gTileset1AnimCallback = 0; - if (gMapHeader.mapData->primaryTileset) - { - if (gMapHeader.mapData->primaryTileset->callback) - { - gMapHeader.mapData->primaryTileset->callback(); - } - } -} - -static void StartTileset2Animation(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = 0; - gTileset2AnimCallback = 0; - if (gMapHeader.mapData->secondaryTileset) - { - if (gMapHeader.mapData->secondaryTileset->callback) - { - gMapHeader.mapData->secondaryTileset->callback(); - } - } -} - -void TilesetCB_General(void) -{ - gTileset1AnimFrame = 0; - gTileset1AnimLength = 0x100; - gTileset1AnimCallback = sub_8073014; -} - -void TilesetCB_Building(void) -{ - gTileset1AnimFrame = 0; - gTileset1AnimLength = 0x100; - gTileset1AnimCallback = sub_8073058; -} - -static void sub_8073014(u16 a1) -{ - int v1; - v1 = a1 % 0x10; - if (v1 == 0) sub_8073070(a1 / 0x10); - if (v1 == 1) sub_8073098(a1 / 0x10); - if (v1 == 2) sub_80730C0(a1 / 0x10); - if (v1 == 3) sub_80730E8(a1 / 0x10); - if (v1 == 4) sub_807361C(a1 / 0x10); -} - -static void sub_8073058(u16 a1) -{ - if (a1 % 8 == 0) - { - sub_8073904(a1 / 8); - } -} - -static void sub_8073070(u16 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_General_0[v1], (u8 *)(BG_VRAM + 0x3f80), 0x80); -} - -static void sub_8073098(u16 a1) -{ - u8 v1; - v1 = a1 % 8; - QueueTilesetAnimDma(gTilesetAnimTable_General_1[v1], (u8 *)(BG_VRAM + 0x3600), 0x3c0); -} - -static void sub_80730C0(u16 a1) -{ - int v1; - v1 = a1 % 8; - QueueTilesetAnimDma(gTilesetAnimTable_General_2[v1], (u8 *)(BG_VRAM + 0x3a00), 0x140); -} - -static void sub_80730E8(u16 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_General_3[v1], (u8 *)(BG_VRAM + 0x3e00), 0xc0); -} - -void TilesetCB_Petalburg(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Rustboro(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_8073424; -} - -void TilesetCB_Dewford(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Slateport(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Mauville(void) -{ - gTileset2AnimFrame = gTileset1AnimFrame; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_80734A0; -} - -void TilesetCB_Lavaridge(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_8073514; -} - -void TilesetCB_Fallarbor(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Fortree(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Lilycove(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Mossdeep(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_EverGrande(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_8073540; -} - -void TilesetCB_Pacifidlog(void) -{ - gTileset2AnimFrame = gTileset1AnimFrame; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_80735B4; -} - -void TilesetCB_Sootopolis(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Underwater(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = 0x80; - gTileset2AnimCallback = sub_80735E4; -} - -void TilesetCB_SootopolisGym(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = 0xf0; - gTileset2AnimCallback = sub_80738A8; -} - -void TilesetCB_Cave(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_8073600; -} - -void TilesetCB_EliteFour(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = 0x80; - gTileset2AnimCallback = sub_80738C0; -} - -void TilesetCB_MauvilleGym(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_8073890; -} - -void TilesetCB_BikeShop(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_80738EC; -} - -static void sub_8073424(u16 a1) -{ - int v1; - v1 = a1 % 8; - if (v1 == 0) - { - sub_80737A4(a1 / 8, 0); - sub_80737E0(a1 / 8); - } - if (v1 == 1) sub_80737A4(a1 / 8, 1); - if (v1 == 2) sub_80737A4(a1 / 8, 2); - if (v1 == 3) sub_80737A4(a1 / 8, 3); - if (v1 == 4) sub_80737A4(a1 / 8, 4); - if (v1 == 5) sub_80737A4(a1 / 8, 5); - if (v1 == 6) sub_80737A4(a1 / 8, 6); - if (v1 == 7) sub_80737A4(a1 / 8, 7); -} - -static void sub_80734A0(u16 a1) -{ - int v1; - v1 = a1 % 8; - if (v1 == 0) sub_8073704(a1 / 8, 0); - if (v1 == 1) sub_8073704(a1 / 8, 1); - if (v1 == 2) sub_8073704(a1 / 8, 2); - if (v1 == 3) sub_8073704(a1 / 8, 3); - if (v1 == 4) sub_8073704(a1 / 8, 4); - if (v1 == 5) sub_8073704(a1 / 8, 5); - if (v1 == 6) sub_8073704(a1 / 8, 6); - if (v1 == 7) sub_8073704(a1 / 8, 7); -} - -static void sub_8073514(u16 a1) -{ - int v1; - v1 = a1 % 0x10; - if (v1 == 0) sub_8073644(a1 / 0x10); - if (v1 == 1) sub_8073808(a1 / 0x10); -} - -static void sub_8073540(u16 a1) -{ - int v1; - v1 = a1 % 8; - if (v1 == 0) sub_8073830(a1 / 8, 0); - if (v1 == 1) sub_8073830(a1 / 8, 1); - if (v1 == 2) sub_8073830(a1 / 8, 2); - if (v1 == 3) sub_8073830(a1 / 8, 3); - if (v1 == 4) sub_8073830(a1 / 8, 4); - if (v1 == 5) sub_8073830(a1 / 8, 5); - if (v1 == 6) sub_8073830(a1 / 8, 6); - if (v1 == 7) sub_8073830(a1 / 8, 7); -} - -static void sub_80735B4(u16 a1) -{ - int v1; - v1 = a1 % 0x10; - if (v1 == 0) sub_807368C(a1 / 0x10); - if (v1 == 1) sub_80736DC(a1 / 0x10); -} - -static void sub_80735E4(u16 a1) -{ - int v1; - v1 = a1 % 0x10; - if (v1 == 0) sub_80736B4(a1 / 0x10); -} - -static void sub_8073600(u16 a1) -{ - int v1; - v1 = a1 % 0x10; - if (v1 == 1) sub_8073868(a1 / 0x10); -} - -static void sub_807361C(u16 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_General_4[v1], (u8 *)(BG_VRAM + 0x3c00), 0x140); -} - -static void sub_8073644(u8 a1) -{ - u8 v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], (u8 *)(BG_VRAM + 0x6400), 0x80); - v1 = (a1 + 2) % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], (u8 *)(BG_VRAM + 0x6480), 0x80); -} - -static void sub_807368C(u8 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_0[v1], (u8 *)(BG_VRAM + 0x7a00), 0x3c0); -} - -static void sub_80736B4(u8 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Underwater[v1], (u8 *)(BG_VRAM + 0x7e00), 0x80); -} - -static void sub_80736DC(u8 a1) -{ - int v1; - v1 = a1 % 8; - QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_1[v1], (u8 *)(BG_VRAM + 0x7e00), 0x100); -} - -static void sub_8073704(u16 a1, u8 a2) -{ - int v1; - a1 -= a2; - if (a1 < 12) - { - v1 = a1 % 12; - QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0A[v1], gUnknown_0837BAE4[a2], 0x80); - QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1A[v1], gUnknown_0837BB04[a2], 0x80); - } - else - { - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0B[v1], gUnknown_0837BAE4[a2], 0x80); - QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1B[v1], gUnknown_0837BB04[a2], 0x80); - } -} - -static void sub_80737A4(u16 a1, u8 a2) -{ - int v1; - a1 -= a2; - - v1 = a1 % 8; - if (gTilesetAnimTable_Rustboro_0[v1]) - { - QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_0[v1], gUnknown_0837BFA4[a2], 0x80); - } -} - -static void sub_80737E0(u16 a1) -{ - int v1; - v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_1[v1], (u8 *)(BG_VRAM + 0x7800), 0x80); -} - -static void sub_8073808(u16 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], (u8 *)(BG_VRAM + 0x5400), 0x80); -} - -static void sub_8073830(u16 a1, u8 a2) -{ - int v1; - a1 -= a2; - v1 = a1 % 8; - QueueTilesetAnimDma(gTilesetAnimTable_EverGrande[v1], gUnknown_0837C93C[a2], 0x80); -} - -static void sub_8073868(u16 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], (u8 *)(BG_VRAM + 0x7400), 0x80); -} - -static void sub_8073890(u16 a1) -{ - int v1; - v1 = a1 % 2; - if (!v1) - { - sub_80739C4(a1 / 2); - } -} - -static void sub_80738A8(u16 a1) -{ - int v1; - v1 = a1 % 8; - if (!v1) - { - sub_807392C(a1 / 8); - } -} - -static void sub_80738C0(u16 a1) -{ - if (a1 % 0x40 == 0) - { - sub_807399C(a1 / 0x40); - } - if (a1 % 8 == 1) - { - sub_8073974(a1 / 8); - } -} - -static void sub_80738EC(u16 a1) -{ - if (a1 % 4 == 0) - { - sub_80739EC(a1 / 4); - } -} - -static void sub_8073904(u16 a1) -{ - int v1; - v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_Building[v1], (u8 *)(BG_VRAM + 0x3e00), 0x80); -} - -static void sub_807392C(u16 a1) -{ - int v1; - v1 = a1 % 3; - QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_0[v1], (u8 *)(BG_VRAM + 0x7e00), 0x180); - QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_1[v1], (u8 *)(BG_VRAM + 0x7a00), 0x280); -} - -static void sub_8073974(u16 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_0[v1], (u8 *)(BG_VRAM + 0x7f00), 0x20); -} - -static void sub_807399C(u16 a1) -{ - int v1; - v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_1[v1], (u8 *)(BG_VRAM + 0x7c00), 0x80); -} - -static void sub_80739C4(u16 a1) -{ - int v1; - v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_MauvilleGym[v1], (u8 *)(BG_VRAM + 0x5200), 0x200); -} - -static void sub_80739EC(u16 a1) -{ - int v1; - v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_BikeShop[v1], (u8 *)(BG_VRAM + 0x7e00), 0x120); -} diff --git a/src/time_events.c b/src/time_events.c deleted file mode 100644 index e1b9a2e9e..000000000 --- a/src/time_events.c +++ /dev/null @@ -1,118 +0,0 @@ -#include "global.h" -#include "time_events.h" -#include "event_data.h" -#include "field_weather.h" -#include "pokemon.h" -#include "rng.h" -#include "rom4.h" -#include "rtc.h" -#include "script.h" -#include "task.h" - -static u32 GetMirageRnd(void) -{ - u32 hi = VarGet(VAR_MIRAGE_RND_H); - u32 lo = VarGet(VAR_MIRAGE_RND_L); - return (hi << 16) | lo; -} - -static void SetMirageRnd(u32 rnd) -{ - VarSet(VAR_MIRAGE_RND_H, rnd >> 16); - VarSet(VAR_MIRAGE_RND_L, rnd); -} - -// unused -void InitMirageRnd(void) -{ - SetMirageRnd((Random() << 16) | Random()); -} - -void UpdateMirageRnd(u16 days) -{ - s32 rnd = GetMirageRnd(); - while (days) - { - rnd = 1103515245 * rnd + 12345; - days--; - } - SetMirageRnd(rnd); -} - -bool8 IsMirageIslandPresent(void) -{ - u16 rnd = GetMirageRnd() >> 16; - int i; - - for (i = 0; i < PARTY_SIZE; i++) - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && (GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY) & 0xFFFF) == rnd) - return TRUE; - - return FALSE; -} - -void UpdateShoalTideFlag(void) -{ - static const u8 tide[] = - { - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - }; - - if (is_light_level_1_2_3_5_or_6(get_map_light_from_warp0())) - { - RtcCalcLocalTime(); - if (tide[gLocalTime.hours]) - FlagSet(SYS_SHOAL_TIDE); - else - FlagReset(SYS_SHOAL_TIDE); - } -} - -static void Task_WaitWeather(u8 taskId) -{ - if (sub_807DDFC()) - { - EnableBothScriptContexts(); - DestroyTask(taskId); - } -} - -void WaitWeather(void) -{ - CreateTask(Task_WaitWeather, 80); -} - -void InitBirchState(void) -{ - *(u16 *)GetVarPointer(VAR_BIRCH_STATE) = 0; -} - -void UpdateBirchState(u16 days) -{ - u16 *state = GetVarPointer(VAR_BIRCH_STATE); - *state += days; - *state %= 7; -} diff --git a/src/title_screen.c b/src/title_screen.c deleted file mode 100644 index ab0f1d505..000000000 --- a/src/title_screen.c +++ /dev/null @@ -1,892 +0,0 @@ -#include "global.h" -#include "gba/m4a_internal.h" -#include "title_screen.h" -#include "clear_save_data_menu.h" -#include "decompress.h" -#include "event_data.h" -#include "intro.h" -#include "m4a.h" -#include "main.h" -#include "main_menu.h" -#include "palette.h" -#include "reset_rtc_screen.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "unknown_task.h" - -#if ENGLISH -#define VERSION_BANNER_SHAPE 1 -#define VERSION_BANNER_RIGHT_TILEOFFSET 64 -#define VERSION_BANNER_BYTES 0x1000 -#define VERSION_BANNER_LEFT_X 98 -#define VERSION_BANNER_RIGHT_X 162 -#define VERSION_BANNER_Y 26 -#define VERSION_BANNER_Y_GOAL 66 -#define START_BANNER_X DISPLAY_WIDTH / 2 -#elif GERMAN -#define VERSION_BANNER_SHAPE 0 -#define VERSION_BANNER_RIGHT_TILEOFFSET 128 -#define VERSION_BANNER_BYTES 0x2000 -#define VERSION_BANNER_LEFT_X 108 -#define VERSION_BANNER_RIGHT_X 172 -#ifdef SAPPHIRE -#define VERSION_BANNER_Y_GOAL 83 -#else -#define VERSION_BANNER_Y_GOAL 84 -#endif -#define VERSION_BANNER_Y (VERSION_BANNER_Y_GOAL - 40) -#define START_BANNER_X DISPLAY_WIDTH / 2 - 2 -#endif - -extern u8 gReservedSpritePaletteCount; -extern struct MusicPlayerInfo gMPlay_BGM; -extern u16 gUnknown_030041B4; -extern u16 gUnknown_030042C0; -extern const u8 gUnknown_08E9D8CC[]; -extern const u16 gUnknown_08E9F624[]; -extern const u8 gUnknown_08E9F7E4[]; -extern const u8 gVersionTiles[]; -extern const u8 gTitleScreenPressStart_Gfx[]; -extern const u16 gTitleScreenLogoShinePalette[]; - -static EWRAM_DATA u8 gUnknown_0202F7E4 = 0; - -#ifdef SAPPHIRE -static const u16 sLegendaryMonPalettes[][16] = -{ - INCBIN_U16("graphics/title_screen/kyogre_dark.gbapal"), - INCBIN_U16("graphics/title_screen/kyogre_glow.gbapal"), -}; -static const u8 sLegendaryMonPixelData[] = INCBIN_U8("graphics/title_screen/kyogre.4bpp.lz"); -static const u8 sLegendaryMonTilemap[] = INCBIN_U8("graphics/title_screen/kyogre_map.bin.lz"); -static const u8 sBackdropTilemap[] = INCBIN_U8("graphics/title_screen/water_map.bin.lz"); -#else -static const u16 sLegendaryMonPalettes[][16] = -{ - INCBIN_U16("graphics/title_screen/groudon_dark.gbapal"), - INCBIN_U16("graphics/title_screen/groudon_glow.gbapal"), -}; -static const u8 sLegendaryMonPixelData[] = INCBIN_U8("graphics/title_screen/groudon.4bpp.lz"); -static const u8 sLegendaryMonTilemap[] = INCBIN_U8("graphics/title_screen/groudon_map.bin.lz"); -static const u8 sBackdropTilemap[] = INCBIN_U8("graphics/title_screen/lava_map.bin.lz"); -#endif -static const u8 sLogoShineTiles[] = INCBIN_U8("graphics/title_screen/logo_shine.4bpp.lz"); -const u16 gUnknown_08393E64[] = -{ - 0x10, - 0x110, - 0x210, - 0x310, - 0x410, - 0x510, - 0x610, - 0x710, - 0x810, - 0x910, - 0xA10, - 0xB10, - 0xC10, - 0xD10, - 0xE10, - 0xF10, - 0x100F, - 0x100E, - 0x100D, - 0x100C, - 0x100B, - 0x100A, - 0x1009, - 0x1008, - 0x1007, - 0x1006, - 0x1005, - 0x1004, - 0x1003, - 0x1002, - 0x1001, - 0x1000, -}; -static const struct OamData sVersionBannerLeftOamData = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 1, - .shape = VERSION_BANNER_SHAPE, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData sVersionBannerRightOamData = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 1, - .shape = VERSION_BANNER_SHAPE, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd sVersionBannerLeftAnimSequence[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -static const union AnimCmd sVersionBannerRightAnimSequence[] = -{ - ANIMCMD_FRAME(VERSION_BANNER_RIGHT_TILEOFFSET, 30), - ANIMCMD_END, -}; -static const union AnimCmd *const sVersionBannerLeftAnimTable[] = -{ - sVersionBannerLeftAnimSequence, -}; -static const union AnimCmd *const sVersionBannerRightAnimTable[] = -{ - sVersionBannerRightAnimSequence, -}; -static const struct SpriteTemplate sVersionBannerLeftSpriteTemplate = -{ - .tileTag = 1000, - .paletteTag = 1000, - .oam = &sVersionBannerLeftOamData, - .anims = sVersionBannerLeftAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallback_VersionBannerLeft, -}; -static const struct SpriteTemplate sVersionBannerRightSpriteTemplate = -{ - .tileTag = 1000, - .paletteTag = 1000, - .oam = &sVersionBannerRightOamData, - .anims = sVersionBannerRightAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallback_VersionBannerRight, -}; -static const struct CompressedSpriteSheet gUnknown_08393EFC[] = -{ - {gVersionTiles, VERSION_BANNER_BYTES, 1000}, - {NULL}, -}; -static const struct OamData gOamData_8393F0C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_8393F14[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F1C[] = -{ - ANIMCMD_FRAME(4, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F24[] = -{ - ANIMCMD_FRAME(8, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F2C[] = -{ - ANIMCMD_FRAME(12, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F34[] = -{ - ANIMCMD_FRAME(16, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F3C[] = -{ - ANIMCMD_FRAME(20, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F44[] = -{ - ANIMCMD_FRAME(24, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F4C[] = -{ - ANIMCMD_FRAME(28, 4), - ANIMCMD_END, -}; -#if GERMAN -static const union AnimCmd gSpriteAnim_839F73C[] = -{ - ANIMCMD_FRAME(32, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_839F744[] = -{ - ANIMCMD_FRAME(36, 4), - ANIMCMD_END, -}; -#endif -static const union AnimCmd *const sStartCopyrightBannerAnimTable[] = -{ - gSpriteAnim_8393F14, - gSpriteAnim_8393F1C, - gSpriteAnim_8393F24, - gSpriteAnim_8393F2C, - gSpriteAnim_8393F34, - gSpriteAnim_8393F3C, - gSpriteAnim_8393F44, - gSpriteAnim_8393F4C, -#if GERMAN - gSpriteAnim_839F73C, - gSpriteAnim_839F744, -#endif -}; -static const struct SpriteTemplate sStartCopyrightBannerSpriteTemplate = -{ - .tileTag = 1001, - .paletteTag = 1001, - .oam = &gOamData_8393F0C, - .anims = sStartCopyrightBannerAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallback_PressStartCopyrightBanner, -}; -static const struct CompressedSpriteSheet gUnknown_08393F8C[] = -{ - {gTitleScreenPressStart_Gfx, 0x520, 1001}, - {NULL}, -}; -const struct SpritePalette sPokemonLogoShinePalette[] = -{ - {gTitleScreenLogoShinePalette, 1001}, - {NULL}, -}; -static const struct OamData sPokemonLogoShineOamData = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd sPokemonLogoShineAnimSequence[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; -static const union AnimCmd *const sPokemonLogoShineAnimTable[] = -{ - sPokemonLogoShineAnimSequence, -}; -static const struct SpriteTemplate sPokemonLogoShineSpriteTemplate = -{ - .tileTag = 1002, - .paletteTag = 1001, - .oam = &sPokemonLogoShineOamData, - .anims = sPokemonLogoShineAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallback_PokemonLogoShine, -}; -static const struct CompressedSpriteSheet sPokemonLogoShineSpriteSheet[] = -{ - {sLogoShineTiles, 0x800, 1002}, - {NULL}, -}; - -#define _RGB(r, g, b) ((((b) & 31) << 10) + (((g) & 31) << 5) + ((r) & 31)) - -#ifdef SAPPHIRE -//Red Kyogre markings -#define LEGENDARY_MARKING_COLOR(c) RGB((c), 0, 0) -#else -//Blue Groundon markings -#define LEGENDARY_MARKING_COLOR(c) RGB(0, 0, (c)) -#endif - -#if defined(GERMAN) && defined(SAPPHIRE) -#define PLTT_BUFFER_INDEX 9 -#elif defined(SAPPHIRE) -#define PLTT_BUFFER_INDEX 26 -#else -#define PLTT_BUFFER_INDEX 21 -#endif - -#define CLEAR_SAVE_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_UP) -#define RESET_RTC_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_LEFT) -#define A_B_START_SELECT (A_BUTTON | B_BUTTON | START_BUTTON | SELECT_BUTTON) - -static void MainCB2(void); -static void Task_TitleScreenPhase1(u8); -static void Task_TitleScreenPhase2(u8); -static void Task_TitleScreenPhase3(u8); -static void CB2_GoToMainMenu(void); -static void CB2_GoToClearSaveDataScreen(void); -static void CB2_GoToResetRtcScreen(void); -static void CB2_GoToCopyrightScreen(void); -static void UpdateLegendaryMarkingColor(u8); - -void SpriteCallback_VersionBannerLeft(struct Sprite *sprite) -{ - struct Task *task = &gTasks[sprite->data1]; - - if (task->data[1] != 0) - { - sprite->oam.objMode = 0; - sprite->pos1.y = VERSION_BANNER_Y_GOAL; - sprite->invisible = FALSE; - } - else - { - if (task->data[5] != 0) - task->data[5]--; - if (task->data[5] < 64) - { - sprite->invisible = FALSE; - if (sprite->pos1.y != VERSION_BANNER_Y_GOAL) - sprite->pos1.y++; - REG_BLDALPHA = gUnknown_08393E64[task->data[5] / 2]; - } - } -} - -void SpriteCallback_VersionBannerRight(struct Sprite *sprite) -{ - struct Task *task = &gTasks[sprite->data1]; - - if (task->data[1] != 0) - { - sprite->oam.objMode = 0; - sprite->pos1.y = VERSION_BANNER_Y_GOAL; - sprite->invisible = FALSE; - } - else - { - if (task->data[5] < 64) - { - sprite->invisible = FALSE; - if (sprite->pos1.y != VERSION_BANNER_Y_GOAL) - sprite->pos1.y++; - } - } -} - -void SpriteCallback_PressStartCopyrightBanner(struct Sprite *sprite) -{ - if (sprite->data0 == 1) - { - sprite->data1++; - //Alternate between hidden and shown every 16th frame - if (sprite->data1 & 16) - sprite->invisible = FALSE; - else - sprite->invisible = TRUE; - } - else - sprite->invisible = FALSE; -} - -#if ENGLISH -static void CreatePressStartBanner(s16 x, s16 y) -{ - u8 i; - u8 spriteId; - - x -= 32; - for (i = 0; i < 3; i++, x += 32) - { - spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0); - StartSpriteAnim(&gSprites[spriteId], i); - gSprites[spriteId].data0 = 1; - } -} -#elif GERMAN -__attribute__((naked)) -static void CreatePressStartBanner(s16 x, s16 y) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - lsls r0, 16\n\ - ldr r2, _0807C3AC @ =0xffe00000\n\ - adds r0, r2\n\ - lsrs r0, 16\n\ - movs r6, 0\n\ - lsls r1, 16\n\ - mov r10, r1\n\ - mov r8, r10\n\ -_0807C302:\n\ - lsls r5, r0, 16\n\ - asrs r5, 16\n\ - ldr r0, _0807C3B0 @ =sStartCopyrightBannerSpriteTemplate\n\ - adds r1, r5, 0\n\ - mov r3, r8\n\ - asrs r2, r3, 16\n\ - movs r3, 0\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r4, r0, 4\n\ - adds r4, r0\n\ - lsls r4, 2\n\ - ldr r0, _0807C3B4 @ =gSprites\n\ - mov r9, r0\n\ - add r4, r9\n\ - adds r0, r4, 0\n\ - adds r1, r6, 0\n\ - bl StartSpriteAnim\n\ - movs r7, 0x1\n\ - strh r7, [r4, 0x2E]\n\ - adds r0, r6, 0x1\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - adds r5, 0x20\n\ - lsls r5, 16\n\ - lsrs r0, r5, 16\n\ - cmp r6, 0x2\n\ - bls _0807C302\n\ - ldr r1, _0807C3B0 @ =sStartCopyrightBannerSpriteTemplate\n\ - mov r8, r1\n\ - lsls r5, r0, 16\n\ - asrs r5, 16\n\ - mov r2, r10\n\ - asrs r6, r2, 16\n\ - mov r0, r8\n\ - adds r1, r5, 0\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r4, r0, 4\n\ - adds r4, r0\n\ - lsls r4, 2\n\ - add r4, r9\n\ - adds r0, r4, 0\n\ - movs r1, 0x8\n\ - bl StartSpriteAnim\n\ - strh r7, [r4, 0x2E]\n\ - subs r5, 0x60\n\ - lsls r5, 16\n\ - asrs r5, 16\n\ - subs r6, 0x8\n\ - lsls r6, 16\n\ - asrs r6, 16\n\ - mov r0, r8\n\ - adds r1, r5, 0\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r4, r0, 4\n\ - adds r4, r0\n\ - lsls r4, 2\n\ - add r4, r9\n\ - adds r0, r4, 0\n\ - movs r1, 0x9\n\ - bl StartSpriteAnim\n\ - strh r7, [r4, 0x2E]\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0807C3AC: .4byte 0xffe00000\n\ -_0807C3B0: .4byte sStartCopyrightBannerSpriteTemplate\n\ -_0807C3B4: .4byte gSprites\n\ - .syntax divided\n"); -} -#endif - -static void CreateCopyrightBanner(s16 x, s16 y) -{ - u8 i; - u8 spriteId; - - x -= 64; - for (i = 0; i < 5; i++, x += 32) - { - spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0); - StartSpriteAnim(&gSprites[spriteId], i + 3); - } -} - -void SpriteCallback_PokemonLogoShine(struct Sprite *sprite) -{ - if (gTasks[gUnknown_0202F7E4].data[1] == 0 && sprite->pos1.x < 272) - { - if (sprite->data0) //Flash background - { - u16 backgroundColor; - - if (sprite->pos1.x < DISPLAY_WIDTH / 2) - { - //Brighten background color - if (sprite->data1 < 31) - sprite->data1++; - if (sprite->data1 < 31) - sprite->data1++; - } - else - { - //Darken background color - if (sprite->data1 != 0) - sprite->data1--; - if (sprite->data1 != 0) - sprite->data1--; - } - backgroundColor = _RGB(sprite->data1, sprite->data1, sprite->data1); - gPlttBufferFaded[0] = backgroundColor; - gPlttBufferFaded[PLTT_BUFFER_INDEX] = backgroundColor; - } - sprite->pos1.x += 4; - } - else - { - gPlttBufferFaded[0] = RGB_BLACK; - gPlttBufferFaded[PLTT_BUFFER_INDEX] = RGB_BLACK; - DestroySprite(sprite); - } -} - -static void StartPokemonLogoShine(bool8 flashBackground) -{ - u8 spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0); - - gSprites[spriteId].oam.objMode = 2; - gSprites[spriteId].data0 = flashBackground; -} - -static void VBlankCB(void) -{ - sub_8089668(); - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - REG_BG1VOFS = gUnknown_030041B4; -} - - -#define tCounter data[0] -#define tSkipToNext data[1] - -void CB2_InitTitleScreen(void) -{ - switch (gMain.state) - { - default: - case 0: - SetVBlankCallback(NULL); - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - *((u16 *)PLTT) = RGB_WHITE; - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16(3, 0, (void *)VRAM, 0x18000); - DmaFill32(3, 0, (void *)OAM, 0x400); - DmaFill16(3, 0, (void *)(PLTT + 2), 0x3FE); - ResetPaletteFade(); - gMain.state = 1; - break; - case 1: - LZ77UnCompVram(gUnknown_08E9D8CC, (void *)VRAM); - LZ77UnCompVram(gUnknown_08E9F7E4, (void *)(VRAM + 0x4800)); - LoadPalette(gUnknown_08E9F624, 0, 0x1C0); - LZ77UnCompVram(sLegendaryMonPixelData, (void *)(VRAM + 0x8000)); - LZ77UnCompVram(sLegendaryMonTilemap, (void *)(VRAM + 0xC000)); - LZ77UnCompVram(sBackdropTilemap, (void *)(VRAM + 0xC800)); - LoadPalette(sLegendaryMonPalettes, 0xE0, sizeof(sLegendaryMonPalettes)); - remove_some_task(); - ResetTasks(); - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 14; - LoadCompressedObjectPic(&gUnknown_08393EFC[0]); - LoadCompressedObjectPic(&gUnknown_08393F8C[0]); - LoadCompressedObjectPic(&sPokemonLogoShineSpriteSheet[0]); - LoadPalette(gUnknown_08E9F624, 0x100, 0x1C0); - LoadSpritePalette(&sPokemonLogoShinePalette[0]); - gMain.state = 2; - break; - case 2: - { - u8 taskId = CreateTask(Task_TitleScreenPhase1, 0); - - gTasks[taskId].tCounter = 256; - gTasks[taskId].tSkipToNext = FALSE; - gTasks[taskId].data[2] = -16; - gTasks[taskId].data[3] = -32; - gUnknown_0202F7E4 = taskId; - gMain.state = 3; - break; - } - case 3: - BeginNormalPaletteFade(-1, 1, 0x10, 0, 0xFFFF); - SetVBlankCallback(VBlankCB); - gMain.state = 4; - break; - case 4: - { - u16 savedIme; - - sub_813CE30(0x78, 0x50, 0x100, 0); - REG_BG2X = -29 * 256; - REG_BG2Y = -33 * 256; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_WININ = 0x1F1F; - REG_WINOUT = 0x3F1F; - REG_BLDCNT = 0x84; - REG_BLDALPHA = 0; - REG_BLDY = 0x8; - REG_BG0CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(25) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_256COLOR | BGCNT_AFF256x256; - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - REG_DISPCNT = DISPCNT_MODE_1 - | DISPCNT_OBJ_1D_MAP - | DISPCNT_BG2_ON - | DISPCNT_OBJ_ON - | DISPCNT_WIN0_ON - | DISPCNT_OBJWIN_ON; - m4aSongNumStart(0x19D); - gMain.state = 5; - break; - } - case 5: - if (!UpdatePaletteFade()) - { - StartPokemonLogoShine(FALSE); - sub_8089944(0, 0xA0, 4, 4, 0, 4, 1); - SetMainCallback2(MainCB2); - } - break; - } -} - -static void MainCB2(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -//Shine the Pokemon logo two more times, and fade in the version banner -static void Task_TitleScreenPhase1(u8 taskId) -{ - //Skip to next phase when A, B, Start, or Select is pressed - if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].data[1] != 0) - { - gTasks[taskId].tSkipToNext = TRUE; - gTasks[taskId].tCounter = 0; - } - - if (gTasks[taskId].tCounter != 0) - { - u16 frameNum = gTasks[taskId].tCounter; - - if (frameNum == 160 || frameNum == 64) - StartPokemonLogoShine(TRUE); - gTasks[taskId].tCounter--; - } - else - { - u8 spriteId; - - REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - REG_WININ = 0; - REG_WINOUT = 0; - REG_BLDCNT = 0x3F50; - REG_BLDALPHA = 0x1F; - REG_BLDY = 0; - - //Create left side of version banner - spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, VERSION_BANNER_LEFT_X, VERSION_BANNER_Y, 0); - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data1 = taskId; - - //Create right side of version banner - spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, VERSION_BANNER_RIGHT_X, VERSION_BANNER_Y, 0); - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data1 = taskId; - - gTasks[taskId].data[5] = 88; - gTasks[taskId].tCounter = 144; - gTasks[taskId].func = Task_TitleScreenPhase2; - } -} - -//Create "Press Start" and copyright banners, and slide Pokemon logo up -static void Task_TitleScreenPhase2(u8 taskId) -{ - //Skip to next phase when A, B, Start, or Select is pressed - if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].tSkipToNext) - { - gTasks[taskId].tSkipToNext = TRUE; - gTasks[taskId].tCounter = 0; - } - - if (gTasks[taskId].tCounter != 0) - gTasks[taskId].tCounter--; - else - { - gTasks[taskId].tSkipToNext = TRUE; - REG_DISPCNT = DISPCNT_MODE_1 - | DISPCNT_OBJ_1D_MAP - | DISPCNT_BG0_ON - | DISPCNT_BG1_ON - | DISPCNT_BG2_ON - | DISPCNT_OBJ_ON; - CreatePressStartBanner(START_BANNER_X, 108); - CreateCopyrightBanner(DISPLAY_WIDTH / 2, 148); - gTasks[taskId].data[4] = 0; - gTasks[taskId].func = Task_TitleScreenPhase3; - } - - if (!(gTasks[taskId].tCounter & 1) && gTasks[taskId].data[3] != 0) - gTasks[taskId].data[3]++; - - //Slide Pokemon logo up - REG_BG2Y = gTasks[taskId].data[3] * 256; -} - -//Show Kyogre/Groundon silhouette and process main title screen input -static void Task_TitleScreenPhase3(u8 taskId) -{ - REG_BLDCNT = 0x2142; - REG_BLDALPHA = 0x1F0F; - REG_BLDY = 0; - - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & START_BUTTON)) - { - FadeOutBGM(4); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF); - SetMainCallback2(CB2_GoToMainMenu); - } - else - { - if ((gMain.heldKeys & CLEAR_SAVE_BUTTON_COMBO) == CLEAR_SAVE_BUTTON_COMBO) - SetMainCallback2(CB2_GoToClearSaveDataScreen); - if ((gMain.heldKeys & RESET_RTC_BUTTON_COMBO) == RESET_RTC_BUTTON_COMBO - && CanResetRTC() == 1) - { - FadeOutBGM(4); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - SetMainCallback2(CB2_GoToResetRtcScreen); - } - else - { - REG_BG2Y = 0; - gTasks[taskId].tCounter++; - if (gTasks[taskId].tCounter & 1) - { - gTasks[taskId].data[4]++; - gUnknown_030041B4 = gTasks[taskId].data[4]; - gUnknown_030042C0 = 0; - } - UpdateLegendaryMarkingColor(gTasks[taskId].tCounter); - if ((gMPlay_BGM.status & 0xFFFF) == 0) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF); - SetMainCallback2(CB2_GoToCopyrightScreen); - } - } - } -} - -static void CB2_GoToMainMenu(void) -{ - if (!UpdatePaletteFade()) - SetMainCallback2(CB2_InitMainMenu); -} - -static void CB2_GoToCopyrightScreen(void) -{ - if (!UpdatePaletteFade()) - SetMainCallback2(CB2_InitCopyrightScreenAfterTitleScreen); -} - -static void CB2_GoToClearSaveDataScreen(void) -{ - if (!UpdatePaletteFade()) - SetMainCallback2(CB2_InitClearSaveDataScreen); -} - -static void CB2_GoToResetRtcScreen(void) -{ - if (!UpdatePaletteFade()) - SetMainCallback2(CB2_InitResetRtcScreen); -} - -static void UpdateLegendaryMarkingColor(u8 frameNum) -{ - u16 palette; - - if ((frameNum % 4) == 0) //Change color every 4th frame - { - u8 colorIntensity = (frameNum >> 2) & 31; //Take bits 2-6 of frameNum the color intensity - u8 fadeDarker = (frameNum >> 2) & 32; - - if (!fadeDarker) - palette = LEGENDARY_MARKING_COLOR(colorIntensity); - else - palette = LEGENDARY_MARKING_COLOR(31 - colorIntensity); - LoadPalette(&palette, 0xEF, sizeof(palette)); - } -} - diff --git a/src/trade.c b/src/trade.c deleted file mode 100644 index cb190d194..000000000 --- a/src/trade.c +++ /dev/null @@ -1,88 +0,0 @@ -#include "global.h" -#include "name_string_util.h" -#include "string_util.h" -#include "text.h" - -struct InGameTrade { - /*0x00*/ u8 name[11]; - /*0x0C*/ u16 species; - /*0x0E*/ u8 ivs[6]; - /*0x14*/ bool8 secondAbility; - /*0x18*/ u32 otId; - /*0x1C*/ u8 stats[5]; - /*0x24*/ u32 personality; - /*0x28*/ u16 heldItem; - /*0x2A*/ u8 mailNum; - /*0x2B*/ u8 otName[11]; - /*0x36*/ u8 otGender; - /*0x37*/ u8 sheen; - /*0x38*/ u16 playerSpecies; -}; - -struct UnkStructC { - /*0x00*/ u16 words[9]; - /*0x10*/ u8 string[8]; - /*0x1A*/ u8 otId[4]; - /*0x1E*/ u16 species; - /*0x20*/ u16 heldItem; -}; - -struct UnkStructD { - /*0x00*/ u8 pad00[0x10]; - /*0x10*/ u8 var10; - /*0x11*/ u8 pad11[1]; - /*0x12*/ u16 var12[1]; -}; - -extern const struct InGameTrade gIngameTrades[]; -extern const u16 gIngameTradeMail[][10]; - - -void sub_804A96C(struct UnkStructD *arg0, u8 left, u8 top, u16 *tilemap, u8 width, u8 height, u16 sp8) { - int y, x; - - for (y = 0; y < height; y++) - { - - for (x = 0; x < width; x++) - { - arg0->var12[(top * 32 + left) + y * 32 + x] = tilemap[width * y + x] | sp8; - } - } - -#if ENGLISH - arg0->var10 = 1; -#endif -} - -#if GERMAN -void sub_804A96C_alt(struct UnkStructD *arg0, u8 left, u8 top, u16 *tilemap, u8 width, u8 height, u16 sp8) { - sub_804A96C(arg0, left, top, tilemap, width, height, sp8); - - arg0->var10 = 1; -} -#endif - -asm(".section .text.sub_804DAD4"); - -void sub_804DAD4(struct UnkStructC *arg0, struct InGameTrade *trade) { - s32 i; - - for (i = 0; i < 9; i++) - { - arg0->words[i] = gIngameTradeMail[trade->mailNum][i]; - } - - StringCopy(arg0->string, trade->otName); - -#if GERMAN - PadNameString(arg0->string, CHAR_SPACE); -#endif - - arg0->otId[0] = trade->otId >> 24; - arg0->otId[1] = trade->otId >> 16; - arg0->otId[2] = trade->otId >> 8; - arg0->otId[3] = trade->otId; - arg0->species = trade->species; - arg0->heldItem = trade->heldItem; -} diff --git a/src/trader.c b/src/trader.c deleted file mode 100644 index ea06058e9..000000000 --- a/src/trader.c +++ /dev/null @@ -1,261 +0,0 @@ -#include "global.h" -#include "decoration.h" -#include "decoration_inventory.h" -#include "event_data.h" -#include "main.h" -#include "menu.h" -#include "menu_helpers.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" - -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; - -static const u8 * const gUnknown_083F62D8[] = -{ - SecretBaseText_Tristan, - SecretBaseText_Philip, - SecretBaseText_Dennis, - SecretBaseText_Roberto, -}; - -static const u8 gTraderDecorations[] = -{ - DECOR_DUSKULL_DOLL, - DECOR_BALL_CUSHION, - DECOR_TIRE, - DECOR_PRETTY_FLOWERS, -}; - -void sub_810993C(void) -{ - u8 i, j; - u8 buffer[12]; - struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; - - for (i = 0; i < 3; i++) - { - for (j = i + 1; j < 4; j++) - { - if (trader->unk1[i] == 0) - { - u8 temp = trader->unk1[i]; - trader->unk1[i] = trader->unk1[j]; - trader->unk1[j] = temp; - StringCopy(buffer, trader->unk5[i]); - StringCopy(trader->unk5[i], trader->unk5[j]); - StringCopy(trader->unk5[j], buffer); - } - } - } -} - -void sub_81099CC(void) -{ - u8 i; - struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; - - trader->unk0 = 2; - trader->unk31 = 0; - - for (i = 0; i < 4; i++) - { - StringCopy(trader->unk5[i], gUnknown_083F62D8[i]); - trader->unk1[i] = gTraderDecorations[i]; - } - - sub_810993C(); -} - -void sub_8109A20(void) -{ - struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; - trader->unk31 = 0; -} - -void sub_8109A30(u8 value) -{ - VarSet(VAR_RECYCLE_GOODS, value); -} - -void sub_8109A48(u8 taskId) -{ - u8 i; - u8 numChoices = 1; - u8 numDecorations = 0; - struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; - - for (i = 0; i < 4; i++) - { - if (trader->unk1[i]) - { - numChoices++; - } - } - - MenuDrawTextWindow(0, 1, 12, numChoices * 2 + 2); - - for (i = 0; i < 4; i++) - { - if (trader->unk1[i]) - { - if (trader->unk1[i] > DECOR_REGISTEEL_DOLL) - { - MenuPrint(gOtherText_FiveQuestionsAndSlash, 1, numDecorations * 2 + 2); - } - else - { - MenuPrint(gDecorations[trader->unk1[i]].name, 1, numDecorations * 2 + 2); - } - - numDecorations++; - } - } - - MenuPrint(gOtherText_CancelNoTerminator, 1, numDecorations * 2 + 2); - InitMenu(0, 1, 2, numChoices, 0, 11); - gTasks[taskId].data[1] = numDecorations; -} - -void sub_8109B34(u8 taskId, u8 decorationId) -{ - if (decorationId > DECOR_REGISTEEL_DOLL) - { - gSpecialVar_0x8004 = 0xFFFF; - } - else - { - gSpecialVar_0x8004 = decorationId; - } - - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 1, 12, 12); - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -void sub_8109B7C(u8 taskId) -{ - struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; - - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - MoveMenuCursor(-1); - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - MoveMenuCursor(1); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gSpecialVar_0x8005 = GetMenuCursorPos(); - if (gTasks[taskId].data[1] == gSpecialVar_0x8005) - { - sub_8109B34(taskId, 0); - } - else - { - StringCopy(gStringVar1, trader->unk5[gSpecialVar_0x8005]); - sub_8109B34(taskId, trader->unk1[gSpecialVar_0x8005]); - } - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_8109B34(taskId, 0); - } -} - -void sub_8109C44(void) -{ - struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; - gScriptResult = trader->unk31; -} - -void sub_8109C58(void) -{ - u8 i; - - for (i = 0; i < 8; i++) - { - if (sub_8134194(i)) - { - gScriptResult = FALSE; - return; - } - } - gScriptResult = TRUE; -} - -void sub_8109C90(void) -{ - gScriptResult = FALSE; - if (gDecorations[gSpecialVar_0x8004].category != gDecorations[gSpecialVar_0x8006].category - && sub_8133F9C(gDecorations[gSpecialVar_0x8004].category) == -1) - { - sub_80FE7D4(gStringVar2, gDecorations[gSpecialVar_0x8004].category); - gScriptResult = TRUE; - } -} - -void sub_8109CF0(void) -{ - CreateTask(sub_80FE7A8, 0); -} - -void sub_8109D04(u8 taskId) -{ - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); - sub_80F9520(gUnknown_020388F7, 8); - BuyMenuFreeMemory(); - if (sub_80FEFA4() == TRUE) - { - gSpecialVar_0x8006 = gUnknown_020388D0[gUnknown_020388F5]; - StringCopy(gStringVar3, gDecorations[gSpecialVar_0x8004].name); - StringCopy(gStringVar2, gDecorations[gSpecialVar_0x8006].name); - } - else - { - gSpecialVar_0x8006 = 0xFFFF; - } - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -void sub_8109DAC(u8 taskId) -{ - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); - gSpecialVar_0x8006 = 0; - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -void sub_8109DE0(void) -{ - struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader; - - sub_81340A8(gSpecialVar_0x8006); - IsThereStorageSpaceForDecoration(gSpecialVar_0x8004); - StringCopy(trader->unk5[gSpecialVar_0x8005], gSaveBlock2.playerName); - trader->unk1[gSpecialVar_0x8005] = gSpecialVar_0x8006; - sub_810993C(); - trader->unk31 = 1; -} - -void sub_8109E34(void) -{ - u8 taskId = CreateTask(sub_8109B7C, 0); - sub_8109A48(taskId); -} diff --git a/src/trainer_card.c b/src/trainer_card.c deleted file mode 100644 index 626c5a7bf..000000000 --- a/src/trainer_card.c +++ /dev/null @@ -1,1569 +0,0 @@ -#include "global.h" -#include "trainer_card.h" -#include "easy_chat.h" -#include "event_data.h" -#include "field_effect.h" -#include "graphics.h" -#include "link.h" -#include "main.h" -#include "menu.h" -#include "money.h" -#include "palette.h" -#include "pokedex.h" -#include "rom4.h" -#include "script_pokemon_80C4.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "unknown_task.h" -#include "util.h" - -typedef void (*Callback)(void); - -struct Struct2000000 -{ - /*0x00*/ u8 var_0; - /*0x01*/ bool8 var_1; - /*0x02*/ u8 var_2; - /*0x03*/ bool8 var_3; - /*0x04*/ u8 var_4; - /*0x05*/ u8 var_5; - /*0x06*/ u8 var_6; - /*0x07*/ bool8 var_7; - /*0x08*/ bool8 var_8; - /*0x09*/ bool8 var_9; - /*0x0A*/ bool8 var_a; - /*0x0B*/ bool8 var_b; - /*0x0C*/ bool8 var_c; - /*0x0D*/ bool8 var_d; - /*0x0E*/ u8 var_e[8]; - /*0x16*/ u8 filler_16[10]; - /*0x20*/ u8 var_20[4][0x10]; - /*0x60*/ Callback *var_60; - /*0x64*/ struct TrainerCard var_64; - /*0x9C*/ u8 language; // 0x9C -}; - -extern u8 ewram[]; -#define ewram0 (*(struct Struct2000000 *)(ewram)) - -extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; - -EWRAM_DATA struct TrainerCard gTrainerCards[4] = {0}; - -struct UnknownStruct1 -{ - u16 filler0[0x3C0]; - u16 unk780[160]; -}; -extern struct UnknownStruct1 gUnknown_03004DE0; - -extern const u8 gBadgesTiles[]; -extern const u16 gUnknown_083B5F0C[]; -extern const u16 gBadgesPalette[]; -extern const u16 gUnknown_083B5F4C[]; -extern const u16 gUnknown_083B5F6C[]; -extern const u16 gUnknown_083B5F8C[][4]; - -const u8 gBadgesTiles[] = INCBIN_U8("graphics/trainer_card/badges.4bpp"); -// XXX: what is this? -u8 *const ewram_ = ewram; - -bool8 sub_8093864(struct Task *); -bool8 sub_80938A8(struct Task *); -bool8 sub_80938CC(struct Task *); -bool8 sub_8093918(struct Task *); -bool8 sub_8093938(struct Task *); -bool8 sub_8093954(struct Task *); -bool8 sub_8093980(struct Task *); - -bool8 (*const gUnknown_083B5EBC[])(struct Task *) = -{ - sub_8093864, - sub_80938A8, - sub_80938CC, - sub_8093918, - sub_8093938, - sub_8093954, - sub_8093980, -}; - -bool8 sub_8093AA0(struct Task *); -bool8 sub_8093AF0(struct Task *); -bool8 sub_8093C0C(struct Task *); -bool8 sub_8093C38(struct Task *); -bool8 sub_8093D50(struct Task *); - -bool8 (*const gUnknown_083B5ED8[])(struct Task *) = -{ - sub_8093AA0, - sub_8093AF0, - sub_8093C0C, - sub_8093C38, - sub_8093D50, -}; - -// FIXME: Other signature than on save_menu_util.h -void FormatPlayTime(u8 *playtime, u16 hours, u16 minutes, s16 colon); -u16 GetPokedexSeenCount(void); - -enum -{ - TD_0, - TD_1, - TD_CALLBACK, -}; - -static void sub_8093174(void); -static void sub_809323C(void); -static void sub_8093254(void); -static void sub_80932AC(Callback callBack); -static void sub_80932E4(u8 arg1, Callback callBack); -void sub_8093324(void); -static void nullsub_60(u8); -static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal); -static u8 sub_80934F4(struct TrainerCard *); -static void sub_8093534(void); -static void sub_8093550(void); -static void sub_8093598(void); -static void sub_80935EC(void); -static void sub_8093610(void); -static void sub_8093688(void); -void sub_80936D4(void); -static void sub_80937A4(void); -static void sub_80937BC(void); -static void sub_80937D8(void); -static void sub_80937F0(void); -static void nullsub_15(void); -static void sub_8093800(void); -static void sub_809380C(); -static void sub_809382C(u8 taskId); -static void sub_80939A4(void); -static void sub_80939C0(void); -static void sub_80939DC(u8 taskId); -static void sub_8093A28(void); -static u8 sub_8093A48(void); -static void sub_8093A68(u8 taskId); -void sub_8093D7C(void); -static void sub_8093DAC(void); -static void sub_8093DC8(void); -static void sub_8093DEC(void); -static void sub_8093E04(void); -static void sub_8093E28(void); -void sub_8093EA0(void); -static void sub_8093EF8(void); -static void sub_8093F14(void); -static void sub_8093F48(void); -static void sub_8093F64(void); -static void sub_8093F80(void); -static void sub_8093FD0(void); -static void sub_8094038(void); -static void sub_80940E4(void); -static void sub_8094110(void); -static void sub_8094140(void); -static void sub_8094188(void); -static void TrainerCard_Front_PrintTrainerID(void); -static void TrainerCard_Front_PrintMoney(void); -static void TrainerCard_Front_PrintPokedexCount(void); -static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon); -static void sub_809429C(void); -static void TrainerCard_Back_PrintName(void); -static void TrainerCard_Back_PrintHallOfFameTime_Label(void); -static void TrainerCard_Back_PrintHallOfFameTime(void); -static void TrainerCard_Back_PrintLinkBattlesLabel(void); -static void TrainerCard_Back_PrintLinkBattles(void); -static void TrainerCard_Back_PrintBattleTower_Label(void); -static void TrainerCard_Back_PrintBattleTower(void); -static void TrainerCard_Back_PrintLinkContests_Label(void); -static void TrainerCard_Back_PrintLinkContests(void); -static void TrainerCard_Back_PrintLinkPokeblocks_Label(void); -static void TrainerCard_Back_PrintLinkPokeblocks(void); -static void TrainerCard_Back_PrintPokemonTrades_Label(void); -static void TrainerCard_Back_PrintPokemonTrades(void); -void unref_sub_8094588(u16 left, u16 top); - -void sub_8093110(Callback arg1) -{ - sub_80932AC(arg1); - SetMainCallback2(sub_8093174); - ewram0.language = GAME_LANGUAGE; -} - -void sub_8093130(u8 playerIndex, Callback arg2) -{ - sub_80932E4(playerIndex, arg2); - SetMainCallback2(sub_8093174); - ewram0.language = gLinkPlayers[gLinkPlayerMapObjects[playerIndex].linkPlayerId].language; -} - -static void sub_8093174(void) -{ - switch (gMain.state) - { - case 0: - sub_8093534(); - sub_8093688(); - gMain.state++; - break; - case 1: - sub_8093598(); - gMain.state++; - break; - case 2: - sub_80935EC(); - gMain.state++; - break; - case 3: - sub_8093610(); - sub_80937A4(); - gMain.state++; - break; - case 4: - sub_80937BC(); - gMain.state++; - case 5: - if (MultistepInitMenuWindowContinue()) - gMain.state++; - break; - case 6: - sub_80937F0(); - gMain.state++; - break; - case 7: - sub_80937D8(); - gMain.state++; - break; - case 8: - nullsub_15(); - sub_8093800(); - sub_8093550(); - SetMainCallback2(sub_809323C); - break; - } -} - -static void sub_809323C(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_8093254(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - ewram0.var_6++; - if (ewram0.var_6 >= 60) - { - ewram0.var_6 = 0; - ewram0.var_5 ^= 1; - } - if (ewram0.var_4) - DmaCopy16(3, gUnknown_03004DE0.filler0, gUnknown_03004DE0.unk780, sizeof(gUnknown_03004DE0.unk780)); -} - -static void sub_80932AC(Callback callBack) -{ - u8 taskId = CreateTask(nullsub_60, 0xFF); - struct Task *task = &gTasks[taskId]; - task->data[TD_0] = FALSE; - StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32)callBack); -} - -static void sub_80932E4(u8 arg1, Callback callBack) -{ - u8 taskId = CreateTask(nullsub_60, 0xFF); - - struct Task *task = &gTasks[taskId]; - task->data[TD_0] = TRUE; - task->data[TD_1] = arg1; - StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32)callBack); -} - -void sub_8093324(void) -{ - u8 taskId = FindTaskIdByFunc(nullsub_60); - struct Task *task = &gTasks[taskId]; - ewram0.var_1 = task->data[TD_0]; - - LoadWordFromTwoHalfwords((u16 *)&task->data[TD_CALLBACK], (u32 *)&ewram0.var_60); - - if (ewram0.var_1) - { - struct TrainerCard(*trainerCards)[4] = &gTrainerCards; - s16 var = task->data[TD_1]; - struct TrainerCard *dest = &(*trainerCards)[var]; - memcpy(&ewram0.var_64, dest, sizeof(struct TrainerCard)); - } - else - { - sub_8093390(&ewram0.var_64); - } -} - -static void nullsub_60(u8 taskid) -{ -} - -void sub_8093390(struct TrainerCard *arg1) -{ - u32 playTime; - bool32 enteredHallOfFame; - bool8 r4; - u8 i; - - arg1->gender = gSaveBlock2.playerGender; - arg1->playTimeHours = gSaveBlock2.playTimeHours; - arg1->playTimeMinutes = gSaveBlock2.playTimeMinutes; - - playTime = GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME); - enteredHallOfFame = GetGameStat(GAME_STAT_ENTERED_HOF); - if (!enteredHallOfFame) - { - playTime = 0; - } - arg1->firstHallOfFameA = playTime >> 16; - arg1->firstHallOfFameB = (playTime >> 8) & 0xFF; - arg1->firstHallOfFameC = playTime & 0xFF; - - arg1->hasPokedex = FlagGet(SYS_POKEDEX_GET); - arg1->var_3 = sub_8090FC0(); - arg1->pokedexSeen = GetPokedexSeenCount(); - - arg1->trainerId = (gSaveBlock2.playerTrainerId[1] << 8) | gSaveBlock2.playerTrainerId[0]; - - // Link Cable Battles - arg1->linkBattleWins = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_WINS, 9999); - arg1->linkBattleLosses = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_LOSSES, 9999); - - // Contests w/ Friends - arg1->contestsWithFriends = sav12_xor_get_clamped_above(GAME_STAT_WON_LINK_CONTEST, 999); - - // Pokéblocks w/ Friends - arg1->pokeblocksWithFriends = sav12_xor_get_clamped_above(GAME_STAT_POKEBLOCKS_WITH_FRIENDS, 0xFFFF); - - // Pokémon Trades - arg1->pokemonTrades = sav12_xor_get_clamped_above(GAME_STAT_POKEMON_TRADES, 0xFFFF); - - // Battle tower? - arg1->battleTowerWins = gSaveBlock2.filler_A8.var_4C8; - arg1->battleTowerLosses = gSaveBlock2.filler_A8.var_4CA; - if (arg1->battleTowerWins > 9999) - { - arg1->battleTowerWins = 9999; - } - if (arg1->battleTowerLosses > 9999) - { - arg1->battleTowerLosses = 9999; - } - - r4 = FALSE; - if (sub_80C4D50() > 4) - { - r4 = TRUE; - } - arg1->var_4 = r4; - - arg1->money = gSaveBlock1.money; - - for (i = 0; i < 4; i++) - { - arg1->var_28[i] = gSaveBlock1.unk2B1C[i]; - } - - for (i = 0; i < 8; i++) - { - arg1->playerName[i] = gSaveBlock2.playerName[i]; - } - - arg1->stars = sub_80934F4(arg1); -} - -u8 sub_80934C4(u8 id) -{ - return gTrainerCards[id].stars; -} - -static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal) -{ - u32 value = GetGameStat(index); - - if (value > maxVal) - { - value = maxVal; - } - - return value; -} - -static u8 sub_80934F4(struct TrainerCard *trainerCard) -{ - u8 value = 0; - - if (trainerCard->firstHallOfFameA != 0 || trainerCard->firstHallOfFameB != 0 || trainerCard->firstHallOfFameC != 0) - { - value++; - } - - if (trainerCard->var_3) - { - value++; - } - - if (trainerCard->battleTowerLosses > 49) - { - value++; - } - - if (trainerCard->var_4) - { - value++; - } - - return value; -} - -static void sub_8093534(void) -{ - SetVBlankCallback(NULL); - SetHBlankCallback(NULL); - REG_DISPCNT = 0; -} - -static void sub_8093550(void) -{ - u16 backup; - - SetVBlankCallback(sub_8093254); - - backup = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK | INTR_FLAG_HBLANK; - REG_IME = backup; - - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR | DISPSTAT_HBLANK_INTR; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; -} - -void sub_8093598(void) -{ - u8 *addr = (void *)VRAM; - u32 size = 0x10000; - - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } -} - -void sub_80935EC(void) -{ - void *addr = (void *)OAM; - - DmaFill16(3, 0, addr, 0x400); -} - -void sub_8093610(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_CHARBASE(2) | BGCNT_SCREENBASE(30) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(10) | BGCNT_16COLOR | BGCNT_TXT256x256; -} - -static void sub_8093688(void) -{ - u8 i; - - sub_8093324(); - ewram0.var_0 = 0; - ewram0.var_3 = 0; - ewram0.var_4 = FALSE; - ewram0.var_2 = ewram0.var_64.stars; - ewram0.var_5 = 0; - ewram0.var_6 = 0; - for (i = 0; i < 4; i++) - sub_80EB3FC(ewram0.var_20[i], ewram0.var_64.var_28[i]); - sub_80936D4(); -} - -void sub_80936D4(void) -{ - ewram0.var_7 = 0; - ewram0.var_8 = 0; - ewram0.var_9 = 0; - ewram0.var_a = 0; - ewram0.var_b = 0; - ewram0.var_c = 0; - ewram0.var_d = 0; - memset(ewram0.var_e, 0, sizeof(ewram0.var_e)); - - if (ewram0.var_64.hasPokedex) - ewram0.var_7++; - - if (ewram0.var_64.firstHallOfFameA != 0 - || ewram0.var_64.firstHallOfFameB != 0 - || ewram0.var_64.firstHallOfFameC != 0) - ewram0.var_8++; - - if (ewram0.var_64.linkBattleWins != 0 || ewram0.var_64.linkBattleLosses != 0) - ewram0.var_9++; - - if (ewram0.var_64.battleTowerWins != 0 || ewram0.var_64.battleTowerLosses != 0) - ewram0.var_a++; - - if (ewram0.var_64.contestsWithFriends != 0) - ewram0.var_b++; - - if (ewram0.var_64.pokeblocksWithFriends != 0) - ewram0.var_c++; - - if (ewram0.var_64.pokemonTrades != 0) - ewram0.var_d++; - - if (!ewram0.var_1) - { - u32 badgeFlag; - int i = 0; - - badgeFlag = BADGE01_GET; - while (1) - { - if (FlagGet(badgeFlag)) - ewram0.var_e[i]++; - badgeFlag++; - i++; - if (badgeFlag > BADGE08_GET) - { - break; - } - } - } -} - -void sub_80937A4() -{ - ResetPaletteFade(); - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); -} - -void sub_80937BC() -{ - SetUpWindowConfig(&WindowConfig_TrainerCard_Back_Values); - MultistepInitMenuWindowBegin(&WindowConfig_TrainerCard_Back_Values); -} - -static void sub_80937D8() -{ - sub_8093E04(); - sub_8093E28(); - sub_8093F64(); - sub_8093DAC(); -} - -static void sub_80937F0() -{ - sub_8093EF8(); -} - -static void nullsub_15(void) -{ -} - -static void sub_8093800() -{ - sub_809380C(); -} - -static void sub_809380C() -{ - u8 taskId; - - taskId = CreateTask(sub_809382C, 0); - sub_809382C(taskId); -} - -static void sub_809382C(u8 taskId) -{ - while (gUnknown_083B5EBC[ewram0.var_0](&gTasks[taskId]) != 0) - ; -} - -bool8 sub_8093864(struct Task *task) -{ - ewram0.var_5 = gSaveBlock2.playTimeSeconds & 1; - ewram0.var_6 = gSaveBlock2.playTimeVBlanks; - sub_80939A4(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - ewram0.var_0++; - return FALSE; -} - -bool8 sub_80938A8(struct Task *task) -{ - if (!gPaletteFade.active) - ewram0.var_0++; - return FALSE; -} - -bool8 sub_80938CC(struct Task *task) -{ - if (gMain.newKeys & B_BUTTON) - { - ewram0.var_0 = 5; - return TRUE; - } - else if (gMain.newKeys & A_BUTTON) - { - if (ewram0.var_3 != 0) - { - ewram0.var_0 = 5; - } - else - { - ewram0.var_3 ^= 1; - ewram0.var_0 = 3; - } - return TRUE; - } - return FALSE; -} - -bool8 sub_8093918(struct Task *task) -{ - sub_8093A28(); - PlaySE(SE_CARD); - ewram0.var_0++; - return FALSE; -} - -bool8 sub_8093938(struct Task *task) -{ - if (sub_8093A48()) - ewram0.var_0 = 2; - return FALSE; -} - -bool8 sub_8093954(struct Task *task) -{ - sub_80939C0(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - ewram0.var_0++; - return FALSE; -} - -bool8 sub_8093980(struct Task *task) -{ - if (!gPaletteFade.active) - SetMainCallback2((MainCallback)ewram0.var_60); - return FALSE; -} - -static void sub_80939A4(void) -{ - CreateTask(sub_80939DC, 0); - BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values); -} - -static void sub_80939C0(void) -{ - u8 taskId = FindTaskIdByFunc(sub_80939DC); - - if (taskId != 0xFF) - DestroyTask(taskId); -} - -static void sub_80939DC(u8 taskId) -{ - u8 buffer[32]; - struct Task *task = &gTasks[taskId]; - - if (ewram0.var_5 != task->data[TD_1]) - { - task->data[TD_1] = ewram0.var_5; - task->data[TD_0] ^= TRUE; - } - TrainerCard_Front_PrintPlayTime(buffer, task->data[TD_0]); - MenuPrint(buffer, 10, 12); -} - -static void sub_8093A28(void) -{ - u8 taskId; - - taskId = CreateTask(sub_8093A68, 0); - sub_8093A68(taskId); -} - -static u8 sub_8093A48(void) -{ - if (FindTaskIdByFunc(sub_8093A68) == 0xFF) - return TRUE; - else - return FALSE; -} - -static void sub_8093A68(u8 taskId) -{ - while (gUnknown_083B5ED8[gTasks[taskId].data[0]](&gTasks[taskId]) != 0) - ; -} - -bool8 sub_8093AA0(struct Task *task) -{ - s32 i; - - ewram0.var_4 = FALSE; - dp12_8087EA4(); - for (i = 0; i < ARRAY_COUNT(gUnknown_03004DE0.unk780); i++) - gUnknown_03004DE0.unk780[i] = -4; - SetHBlankCallback(sub_8093D7C); - ewram0.var_4 = TRUE; - task->data[0]++; - return FALSE; -} - -/* -bool8 sub_8093AF0(struct Task *task) -{ - u32 r7; - u16 r9; - u32 r6; - u32 r5; - u32 r4; - u32 r10; - u32 sp0; - s16 i; - - ewram0.var_4 = 0; - task->data[1] += 3; - if (task->data[1] > 79) - task->data[1] = 79; - - r7 = task->data[1]; - r9 = 160 - r7; - r4 = r9 - r7; - r6 = -r7 << 16; - r5 = (160 << 16) / r4; - r5 -= 1 << 16; - r10 = r5 * r4 + r6; - sp0 = r5 / r4; - r5 *= 2; - - for (i = 0; i < r7; i++) - { - gUnknown_03004DE0.filler0[i] = -4 - (u32)i; - } - //_08093B74 - for (; i < r9; i++) - { - u16 var = r6 >> 16; - r6 += r5; - r5 -= sp0; - gUnknown_03004DE0.filler0[i] = -4 + var; - } - for (; i < 160; i++) - gUnknown_03004DE0.filler0[i] = -4 + (u16)(r10 >> 16); - ewram0.var_4 = 1; - if (task->data[1] > 0x4A) - task->data[0]++; - return FALSE; -} -*/ - -__attribute__((naked)) -bool8 sub_8093AF0(struct Task *task) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - mov r8, r0\n\ - ldr r1, _08093BFC @ =0x02000000\n\ - movs r0, 0\n\ - strb r0, [r1, 0x4]\n\ - mov r2, r8\n\ - ldrh r0, [r2, 0xA]\n\ - adds r0, 0x3\n\ - strh r0, [r2, 0xA]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x4F\n\ - ble _08093B18\n\ - movs r0, 0x4F\n\ - strh r0, [r2, 0xA]\n\ -_08093B18:\n\ - mov r4, r8\n\ - movs r0, 0xA\n\ - ldrsh r7, [r4, r0]\n\ - movs r0, 0xA0\n\ - subs r0, r7\n\ - mov r9, r0\n\ - subs r4, r0, r7\n\ - negs r0, r7\n\ - lsls r6, r0, 16\n\ - movs r0, 0xA0\n\ - lsls r0, 16\n\ - adds r1, r4, 0\n\ - bl __udivsi3\n\ - adds r5, r0, 0\n\ - ldr r1, _08093C00 @ =0xffff0000\n\ - adds r5, r1\n\ - adds r0, r5, 0\n\ - muls r0, r4\n\ - adds r0, r6\n\ - mov r10, r0\n\ - adds r0, r5, 0\n\ - adds r1, r4, 0\n\ - bl __udivsi3\n\ - str r0, [sp]\n\ - lsls r5, 1\n\ - movs r3, 0\n\ - cmp r3, r7\n\ - bcs _08093B74\n\ - ldr r2, _08093C04 @ =gUnknown_03004DE0\n\ - mov r12, r2\n\ - ldr r0, _08093C08 @ =0x0000fffc\n\ - adds r4, r0, 0\n\ -_08093B5C:\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - lsls r1, r0, 1\n\ - add r1, r12\n\ - subs r2, r4, r0\n\ - strh r2, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, r7\n\ - bcc _08093B5C\n\ -_08093B74:\n\ - lsls r2, r3, 16\n\ - mov r1, r9\n\ - lsls r0, r1, 16\n\ - asrs r1, r0, 16\n\ - mov r4, r10\n\ - lsrs r7, r4, 16\n\ - cmp r2, r0\n\ - bge _08093BAE\n\ - ldr r0, _08093C04 @ =gUnknown_03004DE0\n\ - mov r9, r0\n\ - ldr r4, _08093C08 @ =0x0000fffc\n\ - mov r12, r4\n\ - adds r4, r1, 0\n\ -_08093B8E:\n\ - lsrs r1, r6, 16\n\ - adds r6, r5\n\ - ldr r0, [sp]\n\ - subs r5, r0\n\ - asrs r2, 16\n\ - lsls r0, r2, 1\n\ - add r0, r9\n\ - add r1, r12\n\ - strh r1, [r0]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - lsrs r3, r2, 16\n\ - lsls r2, r3, 16\n\ - asrs r0, r2, 16\n\ - cmp r0, r4\n\ - blt _08093B8E\n\ -_08093BAE:\n\ - adds r1, r7, 0\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x9F\n\ - bgt _08093BD4\n\ - ldr r4, _08093C04 @ =gUnknown_03004DE0\n\ - ldr r0, _08093C08 @ =0x0000fffc\n\ - adds r2, r1, r0\n\ -_08093BBE:\n\ - lsls r1, r3, 16\n\ - asrs r1, 16\n\ - lsls r0, r1, 1\n\ - adds r0, r4\n\ - strh r2, [r0]\n\ - adds r1, 0x1\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - cmp r1, 0x9F\n\ - ble _08093BBE\n\ -_08093BD4:\n\ - movs r0, 0x1\n\ - ldr r1, _08093BFC @ =0x02000000\n\ - strb r0, [r1, 0x4]\n\ - mov r2, r8\n\ - movs r4, 0xA\n\ - ldrsh r0, [r2, r4]\n\ - cmp r0, 0x4A\n\ - ble _08093BEA\n\ - ldrh r0, [r2, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r2, 0x8]\n\ -_08093BEA:\n\ - movs r0, 0\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08093BFC: .4byte 0x02000000\n\ -_08093C00: .4byte 0xffff0000\n\ -_08093C04: .4byte gUnknown_03004DE0\n\ -_08093C08: .4byte 0x0000fffc\n\ - .syntax divided\n"); -} - -bool8 sub_8093C0C(struct Task *task) -{ - sub_80939C0(); - sub_8093DAC(); - if (!ewram0.var_3) - sub_80939A4(); - task->data[0]++; - return TRUE; -} - -__attribute__((naked)) -bool8 sub_8093C38(struct Task *task) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - mov r8, r0\n\ - ldr r1, _08093D40 @ =0x02000000\n\ - movs r2, 0\n\ - strb r2, [r1, 0x4]\n\ - ldrh r0, [r0, 0xA]\n\ - subs r0, 0x3\n\ - mov r3, r8\n\ - strh r0, [r3, 0xA]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bgt _08093C5C\n\ - strh r2, [r3, 0xA]\n\ -_08093C5C:\n\ - mov r4, r8\n\ - movs r0, 0xA\n\ - ldrsh r7, [r4, r0]\n\ - movs r0, 0xA0\n\ - subs r0, r7\n\ - mov r9, r0\n\ - subs r4, r0, r7\n\ - negs r0, r7\n\ - lsls r6, r0, 16\n\ - movs r0, 0xA0\n\ - lsls r0, 16\n\ - adds r1, r4, 0\n\ - bl __udivsi3\n\ - adds r5, r0, 0\n\ - ldr r1, _08093D44 @ =0xffff0000\n\ - adds r5, r1\n\ - adds r0, r5, 0\n\ - muls r0, r4\n\ - adds r0, r6\n\ - mov r10, r0\n\ - adds r0, r5, 0\n\ - adds r1, r4, 0\n\ - bl __udivsi3\n\ - str r0, [sp]\n\ - lsrs r5, 1\n\ - movs r3, 0\n\ - cmp r3, r7\n\ - bcs _08093CB8\n\ - ldr r2, _08093D48 @ =gUnknown_03004DE0\n\ - mov r12, r2\n\ - ldr r0, _08093D4C @ =0x0000fffc\n\ - adds r4, r0, 0\n\ -_08093CA0:\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - lsls r1, r0, 1\n\ - add r1, r12\n\ - subs r2, r4, r0\n\ - strh r2, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, r7\n\ - bcc _08093CA0\n\ -_08093CB8:\n\ - lsls r2, r3, 16\n\ - mov r1, r9\n\ - lsls r0, r1, 16\n\ - asrs r1, r0, 16\n\ - mov r4, r10\n\ - lsrs r7, r4, 16\n\ - cmp r2, r0\n\ - bge _08093CF2\n\ - ldr r0, _08093D48 @ =gUnknown_03004DE0\n\ - mov r9, r0\n\ - ldr r3, _08093D4C @ =0x0000fffc\n\ - mov r12, r3\n\ - adds r4, r1, 0\n\ -_08093CD2:\n\ - lsrs r1, r6, 16\n\ - adds r6, r5\n\ - ldr r0, [sp]\n\ - adds r5, r0\n\ - asrs r2, 16\n\ - lsls r0, r2, 1\n\ - add r0, r9\n\ - add r1, r12\n\ - strh r1, [r0]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - lsrs r3, r2, 16\n\ - lsls r2, r3, 16\n\ - asrs r0, r2, 16\n\ - cmp r0, r4\n\ - blt _08093CD2\n\ -_08093CF2:\n\ - adds r1, r7, 0\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x9F\n\ - bgt _08093D18\n\ - ldr r4, _08093D48 @ =gUnknown_03004DE0\n\ - ldr r0, _08093D4C @ =0x0000fffc\n\ - adds r2, r1, r0\n\ -_08093D02:\n\ - lsls r1, r3, 16\n\ - asrs r1, 16\n\ - lsls r0, r1, 1\n\ - adds r0, r4\n\ - strh r2, [r0]\n\ - adds r1, 0x1\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - cmp r1, 0x9F\n\ - ble _08093D02\n\ -_08093D18:\n\ - movs r0, 0x1\n\ - ldr r1, _08093D40 @ =0x02000000\n\ - strb r0, [r1, 0x4]\n\ - mov r2, r8\n\ - movs r3, 0xA\n\ - ldrsh r0, [r2, r3]\n\ - cmp r0, 0\n\ - bgt _08093D2E\n\ - ldrh r0, [r2, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r2, 0x8]\n\ -_08093D2E:\n\ - movs r0, 0\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08093D40: .4byte 0x02000000\n\ -_08093D44: .4byte 0xffff0000\n\ -_08093D48: .4byte gUnknown_03004DE0\n\ -_08093D4C: .4byte 0x0000fffc\n\ - .syntax divided\n"); -} - -bool8 sub_8093D50(struct Task *task) -{ - u8 taskId; - - ewram0.var_4 = FALSE; - SetHBlankCallback(NULL); - sub_8093E04(); - taskId = FindTaskIdByFunc(sub_8093A68); - DestroyTask(taskId); - return FALSE; -} - -void sub_8093D7C(void) -{ - u16 bgVOffset = gUnknown_03004DE0.unk780[REG_VCOUNT & 0xFF]; - - REG_BG0VOFS = bgVOffset; - REG_BG1VOFS = bgVOffset; - REG_BG2VOFS = bgVOffset; -} - -static void sub_8093DAC(void) -{ - if (ewram0.var_3) - sub_8093DEC(); - else - sub_8093DC8(); -} - -static void sub_8093DC8(void) -{ - MenuZeroFillScreen(); - sub_80940E4(); - sub_8093F14(); - sub_8093F80(); - sub_8093FD0(); - sub_8094038(); - sub_8094140(); -} - -static void sub_8093DEC(void) -{ - MenuZeroFillScreen(); - sub_80940E4(); - sub_8093F48(); - sub_8094188(); -} - -static void sub_8093E04(void) -{ - REG_BG0VOFS = -4; - REG_BG1HOFS = 0; - REG_BG1VOFS = -4; - REG_BG2HOFS = 0; - REG_BG2VOFS = -4; -} - -static void sub_8093E28(void) -{ - const u8 *src; - u8 *dst; - u32 size; - - sub_8093EA0(); - LoadPalette(gUnknown_083B5F6C, 0xE0, 32); - src = gMenuTrainerCard_Gfx; - dst = (void *)VRAM; - size = 0x1480; - while (1) - { - DmaCopy16(3, src, dst, 0x1000); - src += 0x1000; - dst += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaCopy16(3, src, dst, size); - break; - } - } - { - const void *src = gBadgesTiles; - void *dst = (void *)(VRAM + 0x1480); - - DmaCopy16(3, src, dst, 0x400); - } -} - -extern const u16 *const gUnknown_083B5EF8[]; - -void sub_8093EA0(void) -{ - LoadPalette(gUnknown_083B5EF8[ewram0.var_2], 0, 48 * 2); - LoadPalette(gBadgesPalette, 48, 16 * 2); - LoadPalette(gUnknown_083B5F4C, 64, 16 * 2); - if (ewram0.var_64.gender != MALE) - LoadPalette(gUnknown_083B5F0C, 16, 16 * 2); -} - -static void sub_8093EF8(void) -{ - LoadTrainerGfx_TrainerCard(ewram0.var_64.gender, 80, (void *)(VRAM + 0x1880)); -} - -static void sub_8093F14(void) -{ - const void *arr[] = {gUnknown_08E8CAC0, gUnknown_08E8D4C0}; - - CpuFastSet(arr[ewram0.var_1], (void *)(VRAM + 0x4800), 0x140); -} - -// I don't really know where to put the data. It's in such a weird order. - -const u8 gUnknown_083B5EF4[] = _(" : "); - -const u16 *const gUnknown_083B5EF8[] = -{ - gMenuTrainerCard0Star_Pal, - gMenuTrainerCard1Star_Pal, - gMenuTrainerCard2Star_Pal, - gMenuTrainerCard3Star_Pal, - gMenuTrainerCard4Star_Pal, -}; - -const u16 gUnknown_083B5F0C[] = INCBIN_U16("graphics/trainer_card/83B5F0C.gbapal"); -const u16 gBadgesPalette[] = INCBIN_U16("graphics/trainer_card/badges.gbapal"); -const u16 gUnknown_083B5F4C[] = INCBIN_U16("graphics/trainer_card/83B5F4C.gbapal"); -const u16 gUnknown_083B5F6C[] = INCBIN_U16("graphics/trainer_card/83B5F6C.gbapal"); -const u16 gUnknown_083B5F8C[][4] = INCBIN_U16("graphics/trainer_card/83B5F8C_map.bin"); - -static void sub_8093F48(void) -{ - CpuFastSet(gUnknown_08E8CFC0, (void *)(VRAM + 0x4800), 320); -} - -static void sub_8093F64(void) -{ - CpuFastSet(gUnknown_08E8D9C0, (void *)(VRAM + 0x5000), 320); -} - -static void sub_8093F80(void) -{ - u16 r5 = 0xC4; - u16 *ptr = (u16 *)(VRAM + 0x4000); - s16 i; - s16 j; - - for (i = 5; i < 13; i++) - { - for (j = 19; j < 27; j++, r5++) - ptr[i * 32 + j] = r5 | 0x5000; - } -} - -static void sub_8093FD0(void) -{ - u16 *ptr = (u16 *)(VRAM + 0x4000); - s16 i = 15; - s16 var = 15 + ewram0.var_2; - - while (i < var) - { - ptr[6 * 32 + i] = 0x408F; - i++; - } - while (i < 0x13) - { - ptr[6 * 32 + i] = 0; - i++; - } -} - -static void sub_8094038(void) -{ - if (ewram0.var_1 == 0) - { - u16 *ptr = (u16 *)(VRAM + 0x4000); - s16 i; - s16 r2; - - for (i = 0, r2 = 4; i < 8; i++, r2 += 3) - { - if (ewram0.var_e[i] != 0) - { - ptr[15 * 32 + r2 + 0] = gUnknown_083B5F8C[i][0] | 0x3000; - ptr[15 * 32 + r2 + 1] = gUnknown_083B5F8C[i][1] | 0x3000; - ptr[16 * 32 + r2 + 0] = gUnknown_083B5F8C[i][2] | 0x3000; - ptr[16 * 32 + r2 + 1] = gUnknown_083B5F8C[i][3] | 0x3000; - } - } - } -} - -static void sub_80940E4(void) -{ - s16 i; - u16 *ptr; - - for (i = 0, ptr = (u16 *)(VRAM + 0x4000); i < 0x400; i++, ptr++) - *ptr = 0; -} - -static void sub_8094110(void) -{ - u16 *ptr = (u16 *)(VRAM + 0x4800); - u16 i; - - for (i = 3; i < 17; i++) - { - ptr[10 * 32 + i] = 1; - ptr[11 * 32 + i] = 1; - } -} - -static void sub_8094140(void) -{ - u8 *buffer; - - BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values); - - buffer = gStringVar1; - StringCopy(buffer, ewram0.var_64.playerName); - ConvertInternationalString(buffer, ewram0.language); - MenuPrint(buffer, 7, 5); - - TrainerCard_Front_PrintTrainerID(); - TrainerCard_Front_PrintMoney(); - TrainerCard_Front_PrintPokedexCount(); - sub_809429C(); -} - -static void sub_8094188(void) -{ - BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values); - TrainerCard_Back_PrintName(); - TrainerCard_Back_PrintHallOfFameTime_Label(); - TrainerCard_Back_PrintLinkBattlesLabel(); - TrainerCard_Back_PrintBattleTower_Label(); - TrainerCard_Back_PrintLinkContests_Label(); - TrainerCard_Back_PrintLinkPokeblocks_Label(); - TrainerCard_Back_PrintPokemonTrades_Label(); - - BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Labels); - TrainerCard_Back_PrintHallOfFameTime(); - TrainerCard_Back_PrintLinkBattles(); - TrainerCard_Back_PrintBattleTower(); - TrainerCard_Back_PrintLinkContests(); - TrainerCard_Back_PrintLinkPokeblocks(); - TrainerCard_Back_PrintPokemonTrades(); -} - -static void TrainerCard_Front_PrintTrainerID(void) -{ - u8 buffer[8]; - - ConvertIntToDecimalStringN(buffer, ewram0.var_64.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5); - MenuPrint(buffer, 20, 2); -} - -static void TrainerCard_Front_PrintMoney(void) -{ - sub_80B7AEC(ewram0.var_64.money, 16, 8); -} - -static void TrainerCard_Front_PrintPokedexCount(void) -{ - u8 buffer[16]; - - if (ewram0.var_7 == FALSE) - { - sub_8094110(); - } - else - { - ConvertIntToDecimalStringN(buffer, ewram0.var_64.pokedexSeen, STR_CONV_MODE_LEFT_ALIGN, 3); - MenuPrint_RightAligned(buffer, 16, 10); - } -} - -static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon) -{ - u8 buffer[16]; - u16 playTimeHours; - u16 playTimeMinutes; - - playTimeHours = gSaveBlock2.playTimeHours; - playTimeMinutes = gSaveBlock2.playTimeMinutes; - if (ewram0.var_1 != 0) - { - playTimeHours = ewram0.var_64.playTimeHours; - playTimeMinutes = ewram0.var_64.playTimeMinutes; - } - FormatPlayTime(buffer, playTimeHours, playTimeMinutes, colon); - sub_8072C74(arg1, buffer, 48, 1); -} - -static void sub_809429C(void) -{ - u8 *str; - - if (ewram0.var_1 != 0) - { - str = gStringVar1; - str = StringCopy(str, ewram0.var_20[0]); - str[0] = 00; - str++; - str = StringCopy(str, ewram0.var_20[1]); - MenuPrint(gStringVar1, 2, 14); - - str = gStringVar1; - str = StringCopy(str, ewram0.var_20[2]); - str[0] = 00; - str++; - str = StringCopy(str, ewram0.var_20[3]); - MenuPrint(gStringVar1, 2, 16); - } -} - -static void TrainerCard_Back_PrintName(void) -{ - u8 *str; - - str = gStringVar1; - StringCopy(str, ewram0.var_64.playerName); - ConvertInternationalString(str, ewram0.language); - -#if ENGLISH - StringAppend(str, gOtherText_TrainersTrainerCard); -#elif GERMAN - de_sub_8073174(str, gOtherText_TrainersTrainerCard); -#endif - - MenuPrint_RightAligned(gStringVar1, 28, 2); -} - -static void TrainerCard_Back_PrintHallOfFameTime_Label(void) -{ - if (ewram0.var_8 != 0) - MenuPrint(gOtherText_FirstHOF, 3, 5); -} - -static void TrainerCard_Back_PrintHallOfFameTime(void) -{ - u8 *str; - - if (ewram0.var_8 != 0) - { - str = gStringVar1; - str = ConvertIntToDecimalStringN(str, ewram0.var_64.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN, 3); - str = StringCopy(str, gUnknown_083B5EF4); - str = ConvertIntToDecimalStringN(str, ewram0.var_64.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS, 2); - str = StringCopy(str, gUnknown_083B5EF4); - str = ConvertIntToDecimalStringN(str, ewram0.var_64.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS, 2); - MenuPrint_RightAligned(gStringVar1, 28, 5); - } -} - -static void TrainerCard_Back_PrintLinkBattlesLabel(void) -{ - if (ewram0.var_9 != 0) - MenuPrint(gOtherText_LinkCableBattles, 3, 7); -} - -static void TrainerCard_Back_PrintLinkBattles(void) -{ - u8 buffer[16]; - - if (ewram0.var_9 != 0) - { - ConvertIntToDecimalString(buffer, ewram0.var_64.linkBattleWins); - MenuPrint_RightAligned(buffer, 22, 7); - - ConvertIntToDecimalString(buffer, ewram0.var_64.linkBattleLosses); - MenuPrint_RightAligned(buffer, 28, 7); - } -} - -static void TrainerCard_Back_PrintBattleTower_Label(void) -{ - if (ewram0.var_a != 0) - MenuPrint(gOtherText_BattleTowerWinRecord, 3, 15); -} - -static void TrainerCard_Back_PrintBattleTower(void) -{ - u8 buffer[16]; - - if (ewram0.var_a != 0) - { - sub_8072C44(buffer, ewram0.var_64.battleTowerWins, 24, 1); - MenuPrint_PixelCoords(buffer, 112, 120, 0); - - sub_8072C44(buffer, ewram0.var_64.battleTowerLosses, 24, 1); - MenuPrint_PixelCoords(buffer, 149, 120, 0); - } -} - -static void TrainerCard_Back_PrintLinkContests_Label(void) -{ - if (ewram0.var_b != 0) - MenuPrint(gOtherText_ContestRecord, 3, 13); -} - -static void TrainerCard_Back_PrintLinkContests(void) -{ - u8 buffer[8]; - - if (ewram0.var_b != 0) - { - ConvertIntToDecimalStringN(buffer, ewram0.var_64.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 3); - MenuPrint_RightAligned(buffer, 28, 13); - } -} - -static void TrainerCard_Back_PrintLinkPokeblocks_Label(void) -{ - if (ewram0.var_c != 0) - MenuPrint(gOtherText_MixingRecord, 3, 11); -} - -static void TrainerCard_Back_PrintLinkPokeblocks(void) -{ - u8 buffer[8]; - - if (ewram0.var_c != 0) - { - ConvertIntToDecimalStringN(buffer, ewram0.var_64.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); - MenuPrint_RightAligned(buffer, 28, 11); - } -} - -static void TrainerCard_Back_PrintPokemonTrades_Label(void) -{ - if (ewram0.var_d != 0) - MenuPrint(gOtherText_TradeRecord, 3, 9); -} - -static void TrainerCard_Back_PrintPokemonTrades(void) -{ - u8 buffer[8]; - - if (ewram0.var_d != 0) - { - ConvertIntToDecimalStringN(buffer, ewram0.var_64.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5); - MenuPrint_RightAligned(buffer, 28, 9); - } -} - -void unref_sub_8094588(u16 left, u16 top) -{ - const u8 *text = gOtherText_Boy; - - if (gSaveBlock2.playerGender == FEMALE) - text = gOtherText_Girl; - MenuPrint(text, left, top); -} diff --git a/src/trainer_see.c b/src/trainer_see.c deleted file mode 100644 index feb35c67c..000000000 --- a/src/trainer_see.c +++ /dev/null @@ -1,455 +0,0 @@ -#include "global.h" -#include "trainer_see.h" -#include "battle_setup.h" -#include "field_effect.h" -#include "field_map_obj.h" -#include "field_player_avatar.h" -#include "script.h" -#include "sprite.h" -#include "task.h" -#include "util.h" - -extern bool8 (*gIsTrainerInRange[])(struct MapObject *, u16, s16, s16); -extern bool8 (*gTrainerSeeFuncList[])(u8, struct Task *, struct MapObject *); -extern bool8 (*gTrainerSeeFuncList2[])(u8, struct Task *, struct MapObject *); - -extern struct SpriteTemplate gSpriteTemplate_839B510; -extern struct SpriteTemplate gSpriteTemplate_839B528; - -bool8 CheckTrainers(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if ( gMapObjects[i].active ) - if ( gMapObjects[i].trainerType == 1 || gMapObjects[i].trainerType == 3 ) - if ( CheckTrainer(i) ) - return TRUE; - } - return FALSE; -} - -bool8 CheckTrainer(u8 trainer) -{ - u8 *scriptPtr = GetFieldObjectScriptPointerByFieldObjectId(trainer); - - if (GetTrainerFlagFromScriptPointer(scriptPtr)) - return FALSE; - else - { - struct MapObject *trainerObj = &gMapObjects[trainer]; - u8 canApproach = TrainerCanApproachPlayer(trainerObj); - - if (canApproach != 0) - { - TrainerWantsBattle(trainer, scriptPtr); - sub_80842C8(trainerObj, (canApproach - 1)); - return TRUE; - } - else - { - return FALSE; - } - } -} - -bool8 TrainerCanApproachPlayer(struct MapObject *trainerObj) -{ - s16 x, y; - u8 i; - u8 playerCoord; - - PlayerGetDestCoords(&x, &y); - if ( trainerObj->trainerType == 1 ) // trainers that don't spin - { - playerCoord = gIsTrainerInRange[trainerObj->mapobj_unk_18 - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); - return CheckPathBetweenTrainerAndPlayer((struct MapObject2 *)trainerObj, playerCoord, trainerObj->mapobj_unk_18); - } - else // spinners - { - for (i = 0; i < 4; i++) - { - playerCoord = gIsTrainerInRange[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); - if ( CheckPathBetweenTrainerAndPlayer((struct MapObject2 *)trainerObj, playerCoord, i + 1) ) // directions are 1-4 instead of 0-3. south north west east - return playerCoord; - } - return FALSE; - } -} - -bool8 IsTrainerInRangeSouth(struct MapObject *trainerObj, s16 vision, s16 x, s16 y) -{ - if ( trainerObj->coords2.x == x - && y > trainerObj->coords2.y - && y <= trainerObj->coords2.y + vision ) - return (y - trainerObj->coords2.y); - else - return FALSE; -} - -bool8 IsTrainerInRangeNorth(struct MapObject *trainerObj, s16 vision, s16 x, s16 y) -{ - if ( trainerObj->coords2.x == x - && y < trainerObj->coords2.y - && y >= trainerObj->coords2.y - vision ) - return (trainerObj->coords2.y - y); - else - return FALSE; -} - -bool8 IsTrainerInRangeWest(struct MapObject *trainerObj, s16 vision, s16 x, s16 y) -{ - if ( trainerObj->coords2.y == y - && x < trainerObj->coords2.x - && x >= trainerObj->coords2.x - vision ) - return (trainerObj->coords2.x - x); - else - return FALSE; -} - -bool8 IsTrainerInRangeEast(struct MapObject *trainerObj, s16 vision, s16 x, s16 y) -{ - if ( trainerObj->coords2.y == y - && x > trainerObj->coords2.x - && x <= trainerObj->coords2.x + vision ) - return (x - trainerObj->coords2.x); - else - return FALSE; -} - -#ifdef BUGFIX_TRAINERAPPROACH -#define COLLISION_MASK ~1 -#else -#define COLLISION_MASK 1 -#endif - -bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject2 *trainerObj, u8 playerCoord, u8 direction) -{ - s16 x, y; - u8 unk19_temp; - u8 unk19b_temp; - u8 i; - u8 var; - - if (!playerCoord) - return FALSE; - - x = trainerObj->coords2.x; - y = trainerObj->coords2.y; - - for (i = 0; i <= playerCoord - 1; i++, MoveCoords(direction, &x, &y)) - { - var = sub_8060024((struct MapObject *)trainerObj, x, y, direction); - - if (var && (var & COLLISION_MASK)) - return FALSE; - } - - // preserve mapobj_unk_19 before clearing. - unk19_temp = trainerObj->mapobj_unk_19; - unk19b_temp = trainerObj->mapobj_unk_19b; - trainerObj->mapobj_unk_19 = 0; - trainerObj->mapobj_unk_19b = 0; - - var = npc_block_way((struct MapObject *)trainerObj, x, y, direction); - - trainerObj->mapobj_unk_19 = unk19_temp; - trainerObj->mapobj_unk_19b = unk19b_temp; - if (var == 4) - return playerCoord; - - return FALSE; -} - -void sub_80842C8(struct MapObject *trainerObj, u8 taskId) -{ - struct Task *task = &gTasks[CreateTask(RunTrainerSeeFuncList, 0x50)]; - - task->data[1] = (u32)(trainerObj) >> 16; - task->data[2] = (u32)(trainerObj); - task->data[3] = taskId; -} - -void sub_80842FC(TaskFunc func) -{ - TaskFunc func2 = RunTrainerSeeFuncList; - u8 taskId = FindTaskIdByFunc(func2); - - SetTaskFuncWithFollowupFunc(taskId, RunTrainerSeeFuncList, func); - gTasks[taskId].data[0] = 1; - func2(taskId); -} - -void RunTrainerSeeFuncList(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - struct MapObject *trainerObj = (struct MapObject *)((task->data[1] << 16) | (task->data[2])); - - if (!trainerObj->active) - SwitchTaskToFollowupFunc(taskId); - else - while (gTrainerSeeFuncList[task->data[0]](taskId, task, trainerObj)); -} - -u8 sub_8084394() // cant be void because it is called with RunTrainerSeeFuncList with arguments. -{ - return 0; -} - -s8 sub_8084398(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - u8 direction; - - FieldObjectGetLocalIdAndMap(trainerObj, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); - FieldEffectStart(0); - - direction = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18); - - FieldObjectSetSpecialAnim(trainerObj, direction); - task->data[0]++; - return 1; -} - -s8 sub_80843DC(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (FieldEffectActiveListContains(0)) - return 0; - else - { - task->data[0]++; - if ((u8)(trainerObj->animPattern - 57) <= 1) - task->data[0] = 6; - if (trainerObj->animPattern == 63) - task->data[0] = 8; - return 1; - } -} - -s8 sub_808441C(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) - { - if (task->data[3]) - { - FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18)); - task->data[3]--; - } - else - { - FieldObjectSetSpecialAnim(trainerObj, 0x3E); - task->data[0]++; - } - } - return 0; -} - -s8 sub_8084478(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - struct MapObject *playerObj; - - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) - return 0; - - npc_set_running_behaviour_etc(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18)); - sub_805C774(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18)); - sub_805C754(trainerObj); - - playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) - && !FieldObjectClearAnimIfSpecialAnimFinished(playerObj)) - return 0; - - sub_80597E8(); - FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18))); - task->data[0]++; - return 0; -} - -s8 sub_8084534(u8 taskId, struct Task *task, struct MapObject *trainerObj) // technically only 1 parameter, but needs all 3 for TrainerSeeFuncList call. -{ - struct MapObject *playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if ( !FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) - || FieldObjectClearAnimIfSpecialAnimFinished(playerObj) ) - SwitchTaskToFollowupFunc(taskId); - - return 0; -} - -s8 sub_8084578(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) - || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) - { - FieldObjectSetSpecialAnim(trainerObj, 0x59); - task->data[0]++; - } - return 0; -} - -s8 sub_80845AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if ( FieldObjectClearAnimIfSpecialAnimFinished(trainerObj) ) - task->data[0] = 3; - - return 0; -} - -s8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) - || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) - { - FieldObjectSetSpecialAnim(trainerObj, 0x3E); - task->data[0]++; - } - return 0; -} - -s8 sub_80845FC(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj)) - { - gUnknown_0202FF84[0] = trainerObj->coords2.x; - gUnknown_0202FF84[1] = trainerObj->coords2.y; - gUnknown_0202FF84[2] = gSprites[trainerObj->spriteId].subpriority - 1; - gUnknown_0202FF84[3] = 2; - task->data[4] = FieldEffectStart(49); - task->data[0]++; - } - return 0; -} - -s8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - struct Sprite *sprite; - - if (gSprites[task->data[4]].animCmdIndex == 2) - { - trainerObj->mapobj_bit_26 = 0; - trainerObj->mapobj_bit_2 = 1; - - sprite = &gSprites[trainerObj->spriteId]; - sprite->oam.priority = 2; - FieldObjectClearAnimIfSpecialAnimFinished(trainerObj); - FieldObjectSetSpecialAnim(trainerObj, sub_806084C(trainerObj->mapobj_unk_18)); - task->data[0]++; - } - return 0; -} - -s8 sub_80846C8(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (!FieldEffectActiveListContains(49)) - task->data[0] = 3; - - return 0; -} - -void sub_80846E4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - struct MapObject *mapObj; - - // another mapObj loaded into by loadword? - LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&mapObj); - if (!task->data[7]) - { - FieldObjectClearAnim(mapObj); - task->data[7]++; - } - gTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj); - if (task->data[0] == 3 && !FieldEffectActiveListContains(49)) - { - npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); - sub_805C774(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); - DestroyTask(taskId); - } - else - mapObj->mapobj_bit_7 = 0; -} - -void sub_8084794(struct MapObject *var) -{ - StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80846E4, 0)].data[1], (u32)var); -} - -void sub_80847C8(void) -{ - sub_80842FC(sub_80847D8); -} - -void sub_80847D8(u8 taskId) -{ - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -u8 FldEff_ExclamationMarkIcon1(void) -{ - u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x53); - - if (spriteId != 64) - sub_8084894(&gSprites[spriteId], 0, 0); - - return 0; -} - -u8 FldEff_ExclamationMarkIcon2(void) -{ - u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x52); - - if (spriteId != 64) - sub_8084894(&gSprites[spriteId], 33, 1); - - return 0; -} - -u8 FldEff_HeartIcon(void) -{ - u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B528, 0, 0, 0x52); - - if (spriteId != 64) - sub_8084894(&gSprites[spriteId], 46, 0); - - return 0; -} - -void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3) -{ - sprite->oam.priority = 1; - sprite->coordOffsetEnabled = 1; - - sprite->data0 = gUnknown_0202FF84[0]; - sprite->data1 = gUnknown_0202FF84[1]; - sprite->data2 = gUnknown_0202FF84[2]; - sprite->data3 = -5; - sprite->data7 = a2; - - StartSpriteAnim(sprite, a3); -} - -void objc_exclamation_mark_probably(struct Sprite *sprite) -{ - u8 mapObjId; - - if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjId) - || sprite->animEnded) - { - FieldEffectStop(sprite, (u8)sprite->data7); - } - else - { - struct Sprite *mapObjSprite = &gSprites[gMapObjects[mapObjId].spriteId]; - sprite->data4 += sprite->data3; - sprite->pos1.x = mapObjSprite->pos1.x; - sprite->pos1.y = mapObjSprite->pos1.y - 16; - sprite->pos2.x = mapObjSprite->pos2.x; - sprite->pos2.y = mapObjSprite->pos2.y + sprite->data4; - if (sprite->data4) - sprite->data3++; - else - sprite->data3 = 0; - } -} diff --git a/src/trig.c b/src/trig.c deleted file mode 100644 index e16a69e63..000000000 --- a/src/trig.c +++ /dev/null @@ -1,549 +0,0 @@ -#include "global.h" -#include "trig.h" - -// Converts a number to Q8.8 fixed-point format -#define Q_8_8(n) ((s16)((n) * 256)) - -// Converts a number to Q4.12 fixed-point format -#define Q_4_12(n) ((s16)((n) * 4096)) - -// Values of sin(x*(π/128)) as Q8.8 fixed-point numbers from x = 0 to x = 319 -const s16 gSineTable[] = -{ - Q_8_8(0), // sin(0*(π/128)) - Q_8_8(0.0234375), // sin(1*(π/128)) - Q_8_8(0.046875), // sin(2*(π/128)) - Q_8_8(0.0703125), // sin(3*(π/128)) - Q_8_8(0.09765625), // sin(4*(π/128)) - Q_8_8(0.12109375), // sin(5*(π/128)) - Q_8_8(0.14453125), // sin(6*(π/128)) - Q_8_8(0.16796875), // sin(7*(π/128)) - Q_8_8(0.19140625), // sin(8*(π/128)) - Q_8_8(0.21875), // sin(9*(π/128)) - Q_8_8(0.2421875), // sin(10*(π/128)) - Q_8_8(0.265625), // sin(11*(π/128)) - Q_8_8(0.2890625), // sin(12*(π/128)) - Q_8_8(0.3125), // sin(13*(π/128)) - Q_8_8(0.3359375), // sin(14*(π/128)) - Q_8_8(0.359375), // sin(15*(π/128)) - Q_8_8(0.37890625), // sin(16*(π/128)) - Q_8_8(0.40234375), // sin(17*(π/128)) - Q_8_8(0.42578125), // sin(18*(π/128)) - Q_8_8(0.44921875), // sin(19*(π/128)) - Q_8_8(0.46875), // sin(20*(π/128)) - Q_8_8(0.4921875), // sin(21*(π/128)) - Q_8_8(0.51171875), // sin(22*(π/128)) - Q_8_8(0.53125), // sin(23*(π/128)) - Q_8_8(0.5546875), // sin(24*(π/128)) - Q_8_8(0.57421875), // sin(25*(π/128)) - Q_8_8(0.59375), // sin(26*(π/128)) - Q_8_8(0.61328125), // sin(27*(π/128)) - Q_8_8(0.6328125), // sin(28*(π/128)) - Q_8_8(0.65234375), // sin(29*(π/128)) - Q_8_8(0.66796875), // sin(30*(π/128)) - Q_8_8(0.6875), // sin(31*(π/128)) - Q_8_8(0.70703125), // sin(32*(π/128)) - Q_8_8(0.72265625), // sin(33*(π/128)) - Q_8_8(0.73828125), // sin(34*(π/128)) - Q_8_8(0.75390625), // sin(35*(π/128)) - Q_8_8(0.76953125), // sin(36*(π/128)) - Q_8_8(0.78515625), // sin(37*(π/128)) - Q_8_8(0.80078125), // sin(38*(π/128)) - Q_8_8(0.81640625), // sin(39*(π/128)) - Q_8_8(0.828125), // sin(40*(π/128)) - Q_8_8(0.84375), // sin(41*(π/128)) - Q_8_8(0.85546875), // sin(42*(π/128)) - Q_8_8(0.8671875), // sin(43*(π/128)) - Q_8_8(0.87890625), // sin(44*(π/128)) - Q_8_8(0.890625), // sin(45*(π/128)) - Q_8_8(0.90234375), // sin(46*(π/128)) - Q_8_8(0.9140625), // sin(47*(π/128)) - Q_8_8(0.921875), // sin(48*(π/128)) - Q_8_8(0.9296875), // sin(49*(π/128)) - Q_8_8(0.94140625), // sin(50*(π/128)) - Q_8_8(0.94921875), // sin(51*(π/128)) - Q_8_8(0.953125), // sin(52*(π/128)) - Q_8_8(0.9609375), // sin(53*(π/128)) - Q_8_8(0.96875), // sin(54*(π/128)) - Q_8_8(0.97265625), // sin(55*(π/128)) - Q_8_8(0.98046875), // sin(56*(π/128)) - Q_8_8(0.984375), // sin(57*(π/128)) - Q_8_8(0.98828125), // sin(58*(π/128)) - Q_8_8(0.9921875), // sin(59*(π/128)) - Q_8_8(0.9921875), // sin(60*(π/128)) - Q_8_8(0.99609375), // sin(61*(π/128)) - Q_8_8(0.99609375), // sin(62*(π/128)) - Q_8_8(0.99609375), // sin(63*(π/128)) - Q_8_8(1), // sin(64*(π/128)) - Q_8_8(0.99609375), // sin(65*(π/128)) - Q_8_8(0.99609375), // sin(66*(π/128)) - Q_8_8(0.99609375), // sin(67*(π/128)) - Q_8_8(0.9921875), // sin(68*(π/128)) - Q_8_8(0.9921875), // sin(69*(π/128)) - Q_8_8(0.98828125), // sin(70*(π/128)) - Q_8_8(0.984375), // sin(71*(π/128)) - Q_8_8(0.98046875), // sin(72*(π/128)) - Q_8_8(0.97265625), // sin(73*(π/128)) - Q_8_8(0.96875), // sin(74*(π/128)) - Q_8_8(0.9609375), // sin(75*(π/128)) - Q_8_8(0.953125), // sin(76*(π/128)) - Q_8_8(0.94921875), // sin(77*(π/128)) - Q_8_8(0.94140625), // sin(78*(π/128)) - Q_8_8(0.9296875), // sin(79*(π/128)) - Q_8_8(0.921875), // sin(80*(π/128)) - Q_8_8(0.9140625), // sin(81*(π/128)) - Q_8_8(0.90234375), // sin(82*(π/128)) - Q_8_8(0.890625), // sin(83*(π/128)) - Q_8_8(0.87890625), // sin(84*(π/128)) - Q_8_8(0.8671875), // sin(85*(π/128)) - Q_8_8(0.85546875), // sin(86*(π/128)) - Q_8_8(0.84375), // sin(87*(π/128)) - Q_8_8(0.828125), // sin(88*(π/128)) - Q_8_8(0.81640625), // sin(89*(π/128)) - Q_8_8(0.80078125), // sin(90*(π/128)) - Q_8_8(0.78515625), // sin(91*(π/128)) - Q_8_8(0.76953125), // sin(92*(π/128)) - Q_8_8(0.75390625), // sin(93*(π/128)) - Q_8_8(0.73828125), // sin(94*(π/128)) - Q_8_8(0.72265625), // sin(95*(π/128)) - Q_8_8(0.70703125), // sin(96*(π/128)) - Q_8_8(0.6875), // sin(97*(π/128)) - Q_8_8(0.66796875), // sin(98*(π/128)) - Q_8_8(0.65234375), // sin(99*(π/128)) - Q_8_8(0.6328125), // sin(100*(π/128)) - Q_8_8(0.61328125), // sin(101*(π/128)) - Q_8_8(0.59375), // sin(102*(π/128)) - Q_8_8(0.57421875), // sin(103*(π/128)) - Q_8_8(0.5546875), // sin(104*(π/128)) - Q_8_8(0.53125), // sin(105*(π/128)) - Q_8_8(0.51171875), // sin(106*(π/128)) - Q_8_8(0.4921875), // sin(107*(π/128)) - Q_8_8(0.46875), // sin(108*(π/128)) - Q_8_8(0.44921875), // sin(109*(π/128)) - Q_8_8(0.42578125), // sin(110*(π/128)) - Q_8_8(0.40234375), // sin(111*(π/128)) - Q_8_8(0.37890625), // sin(112*(π/128)) - Q_8_8(0.359375), // sin(113*(π/128)) - Q_8_8(0.3359375), // sin(114*(π/128)) - Q_8_8(0.3125), // sin(115*(π/128)) - Q_8_8(0.2890625), // sin(116*(π/128)) - Q_8_8(0.265625), // sin(117*(π/128)) - Q_8_8(0.2421875), // sin(118*(π/128)) - Q_8_8(0.21875), // sin(119*(π/128)) - Q_8_8(0.19140625), // sin(120*(π/128)) - Q_8_8(0.16796875), // sin(121*(π/128)) - Q_8_8(0.14453125), // sin(122*(π/128)) - Q_8_8(0.12109375), // sin(123*(π/128)) - Q_8_8(0.09765625), // sin(124*(π/128)) - Q_8_8(0.0703125), // sin(125*(π/128)) - Q_8_8(0.046875), // sin(126*(π/128)) - Q_8_8(0.0234375), // sin(127*(π/128)) - Q_8_8(0), // sin(128*(π/128)) - Q_8_8(-0.0234375), // sin(129*(π/128)) - Q_8_8(-0.046875), // sin(130*(π/128)) - Q_8_8(-0.0703125), // sin(131*(π/128)) - Q_8_8(-0.09765625), // sin(132*(π/128)) - Q_8_8(-0.12109375), // sin(133*(π/128)) - Q_8_8(-0.14453125), // sin(134*(π/128)) - Q_8_8(-0.16796875), // sin(135*(π/128)) - Q_8_8(-0.19140625), // sin(136*(π/128)) - Q_8_8(-0.21875), // sin(137*(π/128)) - Q_8_8(-0.2421875), // sin(138*(π/128)) - Q_8_8(-0.265625), // sin(139*(π/128)) - Q_8_8(-0.2890625), // sin(140*(π/128)) - Q_8_8(-0.3125), // sin(141*(π/128)) - Q_8_8(-0.3359375), // sin(142*(π/128)) - Q_8_8(-0.359375), // sin(143*(π/128)) - Q_8_8(-0.37890625), // sin(144*(π/128)) - Q_8_8(-0.40234375), // sin(145*(π/128)) - Q_8_8(-0.42578125), // sin(146*(π/128)) - Q_8_8(-0.44921875), // sin(147*(π/128)) - Q_8_8(-0.46875), // sin(148*(π/128)) - Q_8_8(-0.4921875), // sin(149*(π/128)) - Q_8_8(-0.51171875), // sin(150*(π/128)) - Q_8_8(-0.53125), // sin(151*(π/128)) - Q_8_8(-0.5546875), // sin(152*(π/128)) - Q_8_8(-0.57421875), // sin(153*(π/128)) - Q_8_8(-0.59375), // sin(154*(π/128)) - Q_8_8(-0.61328125), // sin(155*(π/128)) - Q_8_8(-0.6328125), // sin(156*(π/128)) - Q_8_8(-0.65234375), // sin(157*(π/128)) - Q_8_8(-0.66796875), // sin(158*(π/128)) - Q_8_8(-0.6875), // sin(159*(π/128)) - Q_8_8(-0.70703125), // sin(160*(π/128)) - Q_8_8(-0.72265625), // sin(161*(π/128)) - Q_8_8(-0.73828125), // sin(162*(π/128)) - Q_8_8(-0.75390625), // sin(163*(π/128)) - Q_8_8(-0.76953125), // sin(164*(π/128)) - Q_8_8(-0.78515625), // sin(165*(π/128)) - Q_8_8(-0.80078125), // sin(166*(π/128)) - Q_8_8(-0.81640625), // sin(167*(π/128)) - Q_8_8(-0.828125), // sin(168*(π/128)) - Q_8_8(-0.84375), // sin(169*(π/128)) - Q_8_8(-0.85546875), // sin(170*(π/128)) - Q_8_8(-0.8671875), // sin(171*(π/128)) - Q_8_8(-0.87890625), // sin(172*(π/128)) - Q_8_8(-0.890625), // sin(173*(π/128)) - Q_8_8(-0.90234375), // sin(174*(π/128)) - Q_8_8(-0.9140625), // sin(175*(π/128)) - Q_8_8(-0.921875), // sin(176*(π/128)) - Q_8_8(-0.9296875), // sin(177*(π/128)) - Q_8_8(-0.94140625), // sin(178*(π/128)) - Q_8_8(-0.94921875), // sin(179*(π/128)) - Q_8_8(-0.953125), // sin(180*(π/128)) - Q_8_8(-0.9609375), // sin(181*(π/128)) - Q_8_8(-0.96875), // sin(182*(π/128)) - Q_8_8(-0.97265625), // sin(183*(π/128)) - Q_8_8(-0.98046875), // sin(184*(π/128)) - Q_8_8(-0.984375), // sin(185*(π/128)) - Q_8_8(-0.98828125), // sin(186*(π/128)) - Q_8_8(-0.9921875), // sin(187*(π/128)) - Q_8_8(-0.9921875), // sin(188*(π/128)) - Q_8_8(-0.99609375), // sin(189*(π/128)) - Q_8_8(-0.99609375), // sin(190*(π/128)) - Q_8_8(-0.99609375), // sin(191*(π/128)) - Q_8_8(-1), // sin(192*(π/128)) - Q_8_8(-0.99609375), // sin(193*(π/128)) - Q_8_8(-0.99609375), // sin(194*(π/128)) - Q_8_8(-0.99609375), // sin(195*(π/128)) - Q_8_8(-0.9921875), // sin(196*(π/128)) - Q_8_8(-0.9921875), // sin(197*(π/128)) - Q_8_8(-0.98828125), // sin(198*(π/128)) - Q_8_8(-0.984375), // sin(199*(π/128)) - Q_8_8(-0.98046875), // sin(200*(π/128)) - Q_8_8(-0.97265625), // sin(201*(π/128)) - Q_8_8(-0.96875), // sin(202*(π/128)) - Q_8_8(-0.9609375), // sin(203*(π/128)) - Q_8_8(-0.953125), // sin(204*(π/128)) - Q_8_8(-0.94921875), // sin(205*(π/128)) - Q_8_8(-0.94140625), // sin(206*(π/128)) - Q_8_8(-0.9296875), // sin(207*(π/128)) - Q_8_8(-0.921875), // sin(208*(π/128)) - Q_8_8(-0.9140625), // sin(209*(π/128)) - Q_8_8(-0.90234375), // sin(210*(π/128)) - Q_8_8(-0.890625), // sin(211*(π/128)) - Q_8_8(-0.87890625), // sin(212*(π/128)) - Q_8_8(-0.8671875), // sin(213*(π/128)) - Q_8_8(-0.85546875), // sin(214*(π/128)) - Q_8_8(-0.84375), // sin(215*(π/128)) - Q_8_8(-0.828125), // sin(216*(π/128)) - Q_8_8(-0.81640625), // sin(217*(π/128)) - Q_8_8(-0.80078125), // sin(218*(π/128)) - Q_8_8(-0.78515625), // sin(219*(π/128)) - Q_8_8(-0.76953125), // sin(220*(π/128)) - Q_8_8(-0.75390625), // sin(221*(π/128)) - Q_8_8(-0.73828125), // sin(222*(π/128)) - Q_8_8(-0.72265625), // sin(223*(π/128)) - Q_8_8(-0.70703125), // sin(224*(π/128)) - Q_8_8(-0.6875), // sin(225*(π/128)) - Q_8_8(-0.66796875), // sin(226*(π/128)) - Q_8_8(-0.65234375), // sin(227*(π/128)) - Q_8_8(-0.6328125), // sin(228*(π/128)) - Q_8_8(-0.61328125), // sin(229*(π/128)) - Q_8_8(-0.59375), // sin(230*(π/128)) - Q_8_8(-0.57421875), // sin(231*(π/128)) - Q_8_8(-0.5546875), // sin(232*(π/128)) - Q_8_8(-0.53125), // sin(233*(π/128)) - Q_8_8(-0.51171875), // sin(234*(π/128)) - Q_8_8(-0.4921875), // sin(235*(π/128)) - Q_8_8(-0.46875), // sin(236*(π/128)) - Q_8_8(-0.44921875), // sin(237*(π/128)) - Q_8_8(-0.42578125), // sin(238*(π/128)) - Q_8_8(-0.40234375), // sin(239*(π/128)) - Q_8_8(-0.37890625), // sin(240*(π/128)) - Q_8_8(-0.359375), // sin(241*(π/128)) - Q_8_8(-0.3359375), // sin(242*(π/128)) - Q_8_8(-0.3125), // sin(243*(π/128)) - Q_8_8(-0.2890625), // sin(244*(π/128)) - Q_8_8(-0.265625), // sin(245*(π/128)) - Q_8_8(-0.2421875), // sin(246*(π/128)) - Q_8_8(-0.21875), // sin(247*(π/128)) - Q_8_8(-0.19140625), // sin(248*(π/128)) - Q_8_8(-0.16796875), // sin(249*(π/128)) - Q_8_8(-0.14453125), // sin(250*(π/128)) - Q_8_8(-0.12109375), // sin(251*(π/128)) - Q_8_8(-0.09765625), // sin(252*(π/128)) - Q_8_8(-0.0703125), // sin(253*(π/128)) - Q_8_8(-0.046875), // sin(254*(π/128)) - Q_8_8(-0.0234375), // sin(255*(π/128)) - Q_8_8(0), // sin(256*(π/128)) - Q_8_8(0.0234375), // sin(257*(π/128)) - Q_8_8(0.046875), // sin(258*(π/128)) - Q_8_8(0.0703125), // sin(259*(π/128)) - Q_8_8(0.09765625), // sin(260*(π/128)) - Q_8_8(0.12109375), // sin(261*(π/128)) - Q_8_8(0.14453125), // sin(262*(π/128)) - Q_8_8(0.16796875), // sin(263*(π/128)) - Q_8_8(0.19140625), // sin(264*(π/128)) - Q_8_8(0.21875), // sin(265*(π/128)) - Q_8_8(0.2421875), // sin(266*(π/128)) - Q_8_8(0.265625), // sin(267*(π/128)) - Q_8_8(0.2890625), // sin(268*(π/128)) - Q_8_8(0.3125), // sin(269*(π/128)) - Q_8_8(0.3359375), // sin(270*(π/128)) - Q_8_8(0.359375), // sin(271*(π/128)) - Q_8_8(0.37890625), // sin(272*(π/128)) - Q_8_8(0.40234375), // sin(273*(π/128)) - Q_8_8(0.42578125), // sin(274*(π/128)) - Q_8_8(0.44921875), // sin(275*(π/128)) - Q_8_8(0.46875), // sin(276*(π/128)) - Q_8_8(0.4921875), // sin(277*(π/128)) - Q_8_8(0.51171875), // sin(278*(π/128)) - Q_8_8(0.53125), // sin(279*(π/128)) - Q_8_8(0.5546875), // sin(280*(π/128)) - Q_8_8(0.57421875), // sin(281*(π/128)) - Q_8_8(0.59375), // sin(282*(π/128)) - Q_8_8(0.61328125), // sin(283*(π/128)) - Q_8_8(0.6328125), // sin(284*(π/128)) - Q_8_8(0.65234375), // sin(285*(π/128)) - Q_8_8(0.66796875), // sin(286*(π/128)) - Q_8_8(0.6875), // sin(287*(π/128)) - Q_8_8(0.70703125), // sin(288*(π/128)) - Q_8_8(0.72265625), // sin(289*(π/128)) - Q_8_8(0.73828125), // sin(290*(π/128)) - Q_8_8(0.75390625), // sin(291*(π/128)) - Q_8_8(0.76953125), // sin(292*(π/128)) - Q_8_8(0.78515625), // sin(293*(π/128)) - Q_8_8(0.80078125), // sin(294*(π/128)) - Q_8_8(0.81640625), // sin(295*(π/128)) - Q_8_8(0.828125), // sin(296*(π/128)) - Q_8_8(0.84375), // sin(297*(π/128)) - Q_8_8(0.85546875), // sin(298*(π/128)) - Q_8_8(0.8671875), // sin(299*(π/128)) - Q_8_8(0.87890625), // sin(300*(π/128)) - Q_8_8(0.890625), // sin(301*(π/128)) - Q_8_8(0.90234375), // sin(302*(π/128)) - Q_8_8(0.9140625), // sin(303*(π/128)) - Q_8_8(0.921875), // sin(304*(π/128)) - Q_8_8(0.9296875), // sin(305*(π/128)) - Q_8_8(0.94140625), // sin(306*(π/128)) - Q_8_8(0.94921875), // sin(307*(π/128)) - Q_8_8(0.953125), // sin(308*(π/128)) - Q_8_8(0.9609375), // sin(309*(π/128)) - Q_8_8(0.96875), // sin(310*(π/128)) - Q_8_8(0.97265625), // sin(311*(π/128)) - Q_8_8(0.98046875), // sin(312*(π/128)) - Q_8_8(0.984375), // sin(313*(π/128)) - Q_8_8(0.98828125), // sin(314*(π/128)) - Q_8_8(0.9921875), // sin(315*(π/128)) - Q_8_8(0.9921875), // sin(316*(π/128)) - Q_8_8(0.99609375), // sin(317*(π/128)) - Q_8_8(0.99609375), // sin(318*(π/128)) - Q_8_8(0.99609375), // sin(319*(π/128)) -}; - -// values of sin(x) as Q4.12 fixed-point numbers from x = 0° to x = 179° -const s16 gSineDegreeTable[] = -{ - Q_4_12(0), // sin(0°) - Q_4_12(0.017333984375), // sin(1°) - Q_4_12(0.034912109375), // sin(2°) - Q_4_12(0.05224609375), // sin(3°) - Q_4_12(0.06982421875), // sin(4°) - Q_4_12(0.087158203125), // sin(5°) - Q_4_12(0.1044921875), // sin(6°) - Q_4_12(0.121826171875), // sin(7°) - Q_4_12(0.13916015625), // sin(8°) - Q_4_12(0.156494140625), // sin(9°) - Q_4_12(0.173583984375), // sin(10°) - Q_4_12(0.19091796875), // sin(11°) - Q_4_12(0.2080078125), // sin(12°) - Q_4_12(0.224853515625), // sin(13°) - Q_4_12(0.241943359375), // sin(14°) - Q_4_12(0.2587890625), // sin(15°) - Q_4_12(0.275634765625), // sin(16°) - Q_4_12(0.29248046875), // sin(17°) - Q_4_12(0.30908203125), // sin(18°) - Q_4_12(0.32568359375), // sin(19°) - Q_4_12(0.342041015625), // sin(20°) - Q_4_12(0.3583984375), // sin(21°) - Q_4_12(0.37451171875), // sin(22°) - Q_4_12(0.390625), // sin(23°) - Q_4_12(0.40673828125), // sin(24°) - Q_4_12(0.422607421875), // sin(25°) - Q_4_12(0.4384765625), // sin(26°) - Q_4_12(0.4541015625), // sin(27°) - Q_4_12(0.469482421875), // sin(28°) - Q_4_12(0.48486328125), // sin(29°) - Q_4_12(0.5), // sin(30°) - Q_4_12(0.51513671875), // sin(31°) - Q_4_12(0.530029296875), // sin(32°) - Q_4_12(0.544677734375), // sin(33°) - Q_4_12(0.55908203125), // sin(34°) - Q_4_12(0.573486328125), // sin(35°) - Q_4_12(0.587890625), // sin(36°) - Q_4_12(0.601806640625), // sin(37°) - Q_4_12(0.61572265625), // sin(38°) - Q_4_12(0.62939453125), // sin(39°) - Q_4_12(0.642822265625), // sin(40°) - Q_4_12(0.656005859375), // sin(41°) - Q_4_12(0.669189453125), // sin(42°) - Q_4_12(0.681884765625), // sin(43°) - Q_4_12(0.694580078125), // sin(44°) - Q_4_12(0.70703125), // sin(45°) - Q_4_12(0.71923828125), // sin(46°) - Q_4_12(0.7314453125), // sin(47°) - Q_4_12(0.7431640625), // sin(48°) - Q_4_12(0.754638671875), // sin(49°) - Q_4_12(0.76611328125), // sin(50°) - Q_4_12(0.777099609375), // sin(51°) - Q_4_12(0.7880859375), // sin(52°) - Q_4_12(0.798583984375), // sin(53°) - Q_4_12(0.80908203125), // sin(54°) - Q_4_12(0.819091796875), // sin(55°) - Q_4_12(0.8291015625), // sin(56°) - Q_4_12(0.838623046875), // sin(57°) - Q_4_12(0.84814453125), // sin(58°) - Q_4_12(0.857177734375), // sin(59°) - Q_4_12(0.865966796875), // sin(60°) - Q_4_12(0.87451171875), // sin(61°) - Q_4_12(0.883056640625), // sin(62°) - Q_4_12(0.89111328125), // sin(63°) - Q_4_12(0.898681640625), // sin(64°) - Q_4_12(0.90625), // sin(65°) - Q_4_12(0.91357421875), // sin(66°) - Q_4_12(0.92041015625), // sin(67°) - Q_4_12(0.92724609375), // sin(68°) - Q_4_12(0.93359375), // sin(69°) - Q_4_12(0.939697265625), // sin(70°) - Q_4_12(0.945556640625), // sin(71°) - Q_4_12(0.951171875), // sin(72°) - Q_4_12(0.956298828125), // sin(73°) - Q_4_12(0.961181640625), // sin(74°) - Q_4_12(0.9658203125), // sin(75°) - Q_4_12(0.97021484375), // sin(76°) - Q_4_12(0.974365234375), // sin(77°) - Q_4_12(0.97802734375), // sin(78°) - Q_4_12(0.981689453125), // sin(79°) - Q_4_12(0.98486328125), // sin(80°) - Q_4_12(0.98779296875), // sin(81°) - Q_4_12(0.990234375), // sin(82°) - Q_4_12(0.992431640625), // sin(83°) - Q_4_12(0.994384765625), // sin(84°) - Q_4_12(0.99609375), // sin(85°) - Q_4_12(0.99755859375), // sin(86°) - Q_4_12(0.99853515625), // sin(87°) - Q_4_12(0.999267578125), // sin(88°) - Q_4_12(0.999755859375), // sin(89°) - Q_4_12(1), // sin(90°) - Q_4_12(0.999755859375), // sin(91°) - Q_4_12(0.999267578125), // sin(92°) - Q_4_12(0.99853515625), // sin(93°) - Q_4_12(0.99755859375), // sin(94°) - Q_4_12(0.99609375), // sin(95°) - Q_4_12(0.994384765625), // sin(96°) - Q_4_12(0.992431640625), // sin(97°) - Q_4_12(0.990234375), // sin(98°) - Q_4_12(0.98779296875), // sin(99°) - Q_4_12(0.98486328125), // sin(100°) - Q_4_12(0.981689453125), // sin(101°) - Q_4_12(0.97802734375), // sin(102°) - Q_4_12(0.974365234375), // sin(103°) - Q_4_12(0.97021484375), // sin(104°) - Q_4_12(0.9658203125), // sin(105°) - Q_4_12(0.961181640625), // sin(106°) - Q_4_12(0.956298828125), // sin(107°) - Q_4_12(0.951171875), // sin(108°) - Q_4_12(0.945556640625), // sin(109°) - Q_4_12(0.939697265625), // sin(110°) - Q_4_12(0.93359375), // sin(111°) - Q_4_12(0.92724609375), // sin(112°) - Q_4_12(0.92041015625), // sin(113°) - Q_4_12(0.91357421875), // sin(114°) - Q_4_12(0.90625), // sin(115°) - Q_4_12(0.898681640625), // sin(116°) - Q_4_12(0.89111328125), // sin(117°) - Q_4_12(0.883056640625), // sin(118°) - Q_4_12(0.87451171875), // sin(119°) - Q_4_12(0.865966796875), // sin(120°) - Q_4_12(0.857177734375), // sin(121°) - Q_4_12(0.84814453125), // sin(122°) - Q_4_12(0.838623046875), // sin(123°) - Q_4_12(0.8291015625), // sin(124°) - Q_4_12(0.819091796875), // sin(125°) - Q_4_12(0.80908203125), // sin(126°) - Q_4_12(0.798583984375), // sin(127°) - Q_4_12(0.7880859375), // sin(128°) - Q_4_12(0.777099609375), // sin(129°) - Q_4_12(0.76611328125), // sin(130°) - Q_4_12(0.754638671875), // sin(131°) - Q_4_12(0.7431640625), // sin(132°) - Q_4_12(0.7314453125), // sin(133°) - Q_4_12(0.71923828125), // sin(134°) - Q_4_12(0.70703125), // sin(135°) - Q_4_12(0.694580078125), // sin(136°) - Q_4_12(0.681884765625), // sin(137°) - Q_4_12(0.669189453125), // sin(138°) - Q_4_12(0.656005859375), // sin(139°) - Q_4_12(0.642822265625), // sin(140°) - Q_4_12(0.62939453125), // sin(141°) - Q_4_12(0.61572265625), // sin(142°) - Q_4_12(0.601806640625), // sin(143°) - Q_4_12(0.587890625), // sin(144°) - Q_4_12(0.573486328125), // sin(145°) - Q_4_12(0.55908203125), // sin(146°) - Q_4_12(0.544677734375), // sin(147°) - Q_4_12(0.530029296875), // sin(148°) - Q_4_12(0.51513671875), // sin(149°) - Q_4_12(0.5), // sin(150°) - Q_4_12(0.48486328125), // sin(151°) - Q_4_12(0.469482421875), // sin(152°) - Q_4_12(0.4541015625), // sin(153°) - Q_4_12(0.4384765625), // sin(154°) - Q_4_12(0.422607421875), // sin(155°) - Q_4_12(0.40673828125), // sin(156°) - Q_4_12(0.390625), // sin(157°) - Q_4_12(0.37451171875), // sin(158°) - Q_4_12(0.3583984375), // sin(159°) - Q_4_12(0.342041015625), // sin(160°) - Q_4_12(0.32568359375), // sin(161°) - Q_4_12(0.30908203125), // sin(162°) - Q_4_12(0.29248046875), // sin(163°) - Q_4_12(0.275634765625), // sin(164°) - Q_4_12(0.2587890625), // sin(165°) - Q_4_12(0.241943359375), // sin(166°) - Q_4_12(0.224853515625), // sin(167°) - Q_4_12(0.2080078125), // sin(168°) - Q_4_12(0.19091796875), // sin(169°) - Q_4_12(0.173583984375), // sin(170°) - Q_4_12(0.156494140625), // sin(171°) - Q_4_12(0.13916015625), // sin(172°) - Q_4_12(0.121826171875), // sin(173°) - Q_4_12(0.1044921875), // sin(174°) - Q_4_12(0.087158203125), // sin(175°) - Q_4_12(0.06982421875), // sin(176°) - Q_4_12(0.05224609375), // sin(177°) - Q_4_12(0.034912109375), // sin(178°) - Q_4_12(0.017333984375), // sin(179°) -}; - -// amplitude * sin(index*(π/128)) -s16 Sin(s16 index, s16 amplitude) -{ - return (amplitude * gSineTable[index]) >> 8; -} - -// amplitude * cos(index*(π/128)) -s16 Cos(s16 index, s16 amplitude) -{ - return (amplitude * gSineTable[index + 64]) >> 8; -} - -// angle in degrees -s16 Sin2(u16 angle) -{ - s32 angleMod = angle % 180; - s32 negate = ((angle / 180) & 1); - s16 value = gSineDegreeTable[angleMod]; - - if (negate) - return -value; - else - return value; -} - -// angle in degrees -s16 Cos2(u16 angle) -{ - return Sin2(angle + 90); -} diff --git a/src/tv.c b/src/tv.c deleted file mode 100644 index a254bcd5f..000000000 --- a/src/tv.c +++ /dev/null @@ -1,3260 +0,0 @@ -#include "global.h" -#include "tv.h" -#include "battle_tower.h" -#include "contest_painting.h" -#include "data2.h" -#include "easy_chat.h" -#include "event_data.h" -#include "fieldmap.h" -#include "field_message_box.h" -#include "field_camera.h" -#include "flags.h" -#include "rng.h" -#include "string_util.h" -#include "text.h" -#include "species.h" -#include "pokedex.h" -#include "naming_screen.h" -#include "rom4.h" -#include "map_constants.h" -#include "strings.h" -#include "battle.h" -#include "link.h" -#include "easy_chat.h" -#include "field_map_obj.h" -#include "field_specials.h" -#include "item.h" -#include "items.h" -#include "link.h" -#include "map_constants.h" -#include "naming_screen.h" -#include "pokedex.h" -#include "region_map.h" -#include "rng.h" -#include "rom4.h" -#include "rtc.h" -#include "script_menu.h" -#include "species.h" -#include "string_util.h" -#include "strings.h" -#include "text.h" - -struct UnkTvStruct -{ - s8 var0; -}; - -extern u8 gUnknown_0300430A[11]; - -struct OutbreakPokemon -{ - /*0x00*/ u16 species; - /*0x02*/ u16 moves[4]; - /*0x0A*/ u8 level; - /*0x0B*/ u8 location; -}; - -struct TVSaleItem { - u16 item_id; - u16 item_amount; -}; - -extern u8 gUnknown_02038694; - -extern struct TVSaleItem gUnknown_02038724[3]; - -struct UnkTvStruct gUnknown_03005D38; - -extern u8 *gTVBravoTrainerTextGroup[]; -extern u8 *gTVBravoTrainerBattleTowerTextGroup[]; -extern u8 *gTVSmartShopperTextGroup[]; -extern u8 *gTVNameRaterTextGroup[]; -extern u8 *gTVPokemonTodayTextGroup[]; -extern u8 *gTVPokemonTodayFailedCaptureTextGroup[]; -extern u8 *gTVFanClubTextGroup[]; -extern u8 *gTVRecentHappeningsTextGroup[]; -extern u8 *gTVFanClubOpinionsTextGroup[]; -extern u8 *gTVPokemonOutbreakTextGroup[]; -extern u8 *gTVGabbyAndTyTextGroup[]; -extern u8 *gTVFishingGuruAdviceTextGroup[]; -extern u8 *gTVWorldOfMastersTextGroup[]; -extern struct OutbreakPokemon gPokeOutbreakSpeciesList[5]; - - - -extern const u8 *gTVNewsTextGroup1[]; -extern const u8 *gTVNewsTextGroup2[]; -extern const u8 *gTVNewsTextGroup3[]; - -extern u16 gScriptLastTalked; - -extern u8 gScriptContestCategory; -extern u8 gScriptContestRank; -extern u8 gUnknown_03004316[11]; -extern u8 gBattleOutcome; - -extern u16 gLastUsedItem; - -extern u8 ewram[]; -#define gUnknown_02007000 (*(ewramStruct_02007000 *)(ewram + 0x7000)) - -static EWRAM_DATA u16 gUnknown_020387E0 = 0; -static EWRAM_DATA u16 gUnknown_020387E2 = 0; -static EWRAM_DATA u8 gUnknown_020387E4 = 0; -static EWRAM_DATA ALIGNED(4) u8 gUnknown_020387E8 = 0; // why is this aligned to a 4-byte boundary? - -static u8 gUnknown_03000720; -static u8 gUnknown_03000721; -static s8 gUnknown_03000722; - -void ClearTVShowData(void) -{ - u8 showidx; - u8 extradataidx; - for (showidx=0; showidx<25; showidx++) { - gSaveBlock1.tvShows[showidx].common.var00 = 0; - gSaveBlock1.tvShows[showidx].common.var01 = 0; - for (extradataidx=0; extradataidx<34; extradataidx++) { - gSaveBlock1.tvShows[showidx].common.pad02[extradataidx] = 0; - } - } - sub_80BEBF4(); -} - -bool8 sub_80BF1B4(u8); -void sub_80BF20C(void); -extern u16 sub_8135D3C(u8); -extern u8 gScriptContestCategory; -extern u8 gScriptContestRank; -extern u8 gUnknown_03004316[11]; -extern u8 gBattleOutcome; - -void sub_80BF334(void); -void sub_80BF3A4(void); -void sub_80BF3DC(void); -void sub_80BF46C(void); -void sub_80BF478(void); -void sub_80BF484(void); -void sub_80BF4BC(void); - -void sub_80BE028(void); -void sub_80BE074(void); -void sub_80BE778(void); -void sub_80BEB20(void); - -u8 sub_80BFB54(u8); - -s8 sub_80BF74C(TVShow tvShow[]); - -void sub_80BF55C(TVShow tvShow[], u8 showidx); -void sub_80BEA88(void); - -void sub_80BE138(TVShow *show); -void sub_80BE160(TVShow *show); -extern u16 gLastUsedItem; - -void sub_80BE5FC(void); -void sub_80BE65C(void); -void sub_80BE6A0(void); -void nullsub_21(void); -void sub_80BE188(void); -void sub_80BE320(void); - -u8 special_0x44(void) -{ - u8 i; - u8 j; - -#ifndef NONMATCHING - asm("":::"r5"); -#endif - - for (i = 5; i < 24; i++) - { - if (gSaveBlock1.tvShows[i].common.var00 == 0) - break; - } - i = Random() % i; - j = i; - do - { - if (sub_80BFB54(gSaveBlock1.tvShows[i].common.var00) != 4) - { - if (gSaveBlock1.tvShows[i].common.var01 == 1) - return i; - } - else - { - struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[i].massOutbreak; - - if (massOutbreak->var16 == 0 && massOutbreak->var01 == 1) - return i; - } - - if (i == 0) - i = 23; - else - i--; - } while (i != j); - return 0xFF; -} - -u8 sub_80BDA30(void); - -u8 sub_80BD8B8(void) -{ - u8 retval = special_0x44(); - - if (retval == 0xff) - return 0xff; - if (gSaveBlock1.outbreakPokemonSpecies != 0 && gSaveBlock1.tvShows[retval].common.var00 == TVSHOW_MASS_OUTBREAK) - return sub_80BDA30(); - return retval; -} - -u8 CheckForBigMovieOrEmergencyNewsOnTV(void); -void SetTVMetatilesOnMap(int, int, u16); -bool8 sub_80BECA0(void); -bool8 IsTVShowInSearchOfTrainersAiring(void); - -void UpdateTVScreensOnMap(int width, int height) -{ - FlagSet(SYS_TV_WATCH); - switch (CheckForBigMovieOrEmergencyNewsOnTV()) - { - case 1: - SetTVMetatilesOnMap(width, height, 0x3); - break; - case 2: - break; - default: - if (gSaveBlock1.location.mapGroup == MAP_GROUP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F - && gSaveBlock1.location.mapNum == MAP_ID_LILYCOVE_CITY_COVE_LILY_MOTEL_1F) - { - SetTVMetatilesOnMap(width, height, 0x3); - } - else if (FlagGet(SYS_TV_START) && (sub_80BD8B8() != 0xff || sub_80BECA0() != 0xff || IsTVShowInSearchOfTrainersAiring())) - { - FlagReset(SYS_TV_WATCH); - SetTVMetatilesOnMap(width, height, 0x3); - } - break; - } -} - -void SetTVMetatilesOnMap(int width, int height, u16 tileId) -{ - int x; - int y; - - for (y=0; ycommon.var00 == TVSHOW_MASS_OUTBREAK && gSaveBlock1.outbreakPokemonSpecies) - return sub_80BDA30(); - return gSpecialVar_0x8004; -} - -void ResetGabbyAndTy(void) -{ - gSaveBlock1.gabbyAndTyData.mon1 = 0; - gSaveBlock1.gabbyAndTyData.mon2 = 0; - gSaveBlock1.gabbyAndTyData.lastMove = 0; - gSaveBlock1.gabbyAndTyData.quote = 0xffff; - gSaveBlock1.gabbyAndTyData.valA_0 = 0; - gSaveBlock1.gabbyAndTyData.valA_1 = 0; - gSaveBlock1.gabbyAndTyData.valA_2 = 0; - gSaveBlock1.gabbyAndTyData.valA_3 = 0; - gSaveBlock1.gabbyAndTyData.valA_4 = 0; - gSaveBlock1.gabbyAndTyData.valA_5 = 0; - gSaveBlock1.gabbyAndTyData.valB_0 = 0; - gSaveBlock1.gabbyAndTyData.valB_1 = 0; - gSaveBlock1.gabbyAndTyData.valB_2 = 0; - gSaveBlock1.gabbyAndTyData.valB_3 = 0; - gSaveBlock1.gabbyAndTyData.valB_4 = 0; - gSaveBlock1.gabbyAndTyData.valB_5 = 0; - gSaveBlock1.gabbyAndTyData.mapnum = 0; - gSaveBlock1.gabbyAndTyData.battleNum = 0; -} - -void TakeTVShowInSearchOfTrainersOffTheAir(void); - -void GabbyAndTyBeforeInterview(void) -{ - u8 i; - - gSaveBlock1.gabbyAndTyData.mon1 = gBattleResults.poke1Species; - gSaveBlock1.gabbyAndTyData.mon2 = gBattleResults.opponentSpecies; - gSaveBlock1.gabbyAndTyData.lastMove = gBattleResults.lastUsedMove; - if (gSaveBlock1.gabbyAndTyData.battleNum != 0xff) - gSaveBlock1.gabbyAndTyData.battleNum ++; - gSaveBlock1.gabbyAndTyData.valA_0 = gBattleResults.unk5_0; - - if (gBattleResults.playerFaintCounter) - gSaveBlock1.gabbyAndTyData.valA_1 = 1; - else - gSaveBlock1.gabbyAndTyData.valA_1 = 0; - - if (gBattleResults.unk3) - gSaveBlock1.gabbyAndTyData.valA_2 = 1; - else - gSaveBlock1.gabbyAndTyData.valA_2 = 0; - - if (!gBattleResults.unk5_1) - { - for (i=0; i<11; i++) - { - if (gBattleResults.unk36[i] != 0) - { - gSaveBlock1.gabbyAndTyData.valA_3 = 1; - break; - } - } - } - else - { - gSaveBlock1.gabbyAndTyData.valA_3 = 1; - } - - TakeTVShowInSearchOfTrainersOffTheAir(); - if (gSaveBlock1.gabbyAndTyData.lastMove == 0) - FlagSet(1); -} - -void sub_80BDC14(void) -{ - gSaveBlock1.gabbyAndTyData.valB_0 = gSaveBlock1.gabbyAndTyData.valA_0; - gSaveBlock1.gabbyAndTyData.valB_1 = gSaveBlock1.gabbyAndTyData.valA_1; - gSaveBlock1.gabbyAndTyData.valB_2 = gSaveBlock1.gabbyAndTyData.valA_2; - gSaveBlock1.gabbyAndTyData.valB_3 = gSaveBlock1.gabbyAndTyData.valA_3; - gSaveBlock1.gabbyAndTyData.valA_4 = 1; - gSaveBlock1.gabbyAndTyData.mapnum = gMapHeader.regionMapSectionId; - IncrementGameStat(GAME_STAT_GOT_INTERVIEWED); -} - -void TakeTVShowInSearchOfTrainersOffTheAir(void) -{ - gSaveBlock1.gabbyAndTyData.valA_4 = 0; -} - -u8 GabbyAndTyGetBattleNum(void) -{ - if (gSaveBlock1.gabbyAndTyData.battleNum >= 6) - return (gSaveBlock1.gabbyAndTyData.battleNum % 3) + 6; - else - return gSaveBlock1.gabbyAndTyData.battleNum; -} - -bool8 IsTVShowInSearchOfTrainersAiring(void) -{ - return gSaveBlock1.gabbyAndTyData.valA_4; -} - -bool8 GabbyAndTyGetLastQuote(void) -{ - if (gSaveBlock1.gabbyAndTyData.quote == 0xffff) - return FALSE; - - sub_80EB3FC(gStringVar1, gSaveBlock1.gabbyAndTyData.quote); - gSaveBlock1.gabbyAndTyData.quote |= 0xffff; - return TRUE; -} - -u8 sub_80BDD18(void) -{ - if (!gSaveBlock1.gabbyAndTyData.valB_0) - return 1; - if (gSaveBlock1.gabbyAndTyData.valB_3) - return 2; - if (gSaveBlock1.gabbyAndTyData.valB_2) - return 3; - if (gSaveBlock1.gabbyAndTyData.valB_1) - return 4; - return 0; -} - -void GabbyAndTySetScriptVarsToFieldObjectLocalIds(void) -{ - switch (GabbyAndTyGetBattleNum()) - { - case 1: - gSpecialVar_0x8004 = 0xE; - gSpecialVar_0x8005 = 0xD; - break; - case 2: - gSpecialVar_0x8004 = 0x5; - gSpecialVar_0x8005 = 0x6; - break; - case 3: - gSpecialVar_0x8004 = 0x12; - gSpecialVar_0x8005 = 0x11; - break; - case 4: - gSpecialVar_0x8004 = 0x15; - gSpecialVar_0x8005 = 0x16; - break; - case 5: - gSpecialVar_0x8004 = 0x8; - gSpecialVar_0x8005 = 0x9; - break; - case 6: - gSpecialVar_0x8004 = 0x13; - gSpecialVar_0x8005 = 0x14; - break; - case 7: - gSpecialVar_0x8004 = 0x17; - gSpecialVar_0x8005 = 0x18; - break; - case 8: - gSpecialVar_0x8004 = 0xA; - gSpecialVar_0x8005 = 0xB; - break; - } -} - -void sub_80BDE48(void) -{ - switch (gSpecialVar_0x8005) - { - case TVSHOW_FAN_CLUB_LETTER: - sub_80BE5FC(); - break; - case TVSHOW_RECENT_HAPPENINGS: - sub_80BE65C(); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - sub_80BE6A0(); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - nullsub_21(); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - sub_80BE188(); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - sub_80BE320(); - break; - } -} - -u8 sub_80BDEAC(u8 *a0) -{ - u8 lang = GAME_LANGUAGE; - - if (a0[0] == EXT_CTRL_CODE_BEGIN && a0[1] == 0x15) - lang = LANGUAGE_JAPANESE; - return lang; -} - -void sub_80BDEC8(void) -{ - u8 i; - u16 total; - u16 item; - - total = 0; - sub_80BEB20(); - sub_80BE778(); - - if (gBattleResults.caughtPoke == 0) - { - sub_80BE074(); - } - else - { - sub_80BE028(); - if (sub_80BF77C(0xffff) == 0 && StringCompareWithoutExtCtrlCodes(gSpeciesNames[gBattleResults.caughtPoke], gBattleResults.caughtNick) != 0) - { - gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_POKEMON_TODAY_CAUGHT) != 1) - { - for (i = 0; i < 11; i++) - total += gBattleResults.unk36[i]; - if (total != 0 || gBattleResults.unk5_1 != 0) - { - struct TVShowPokemonToday *pokemonToday; - - total = 0; - pokemonToday = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonToday; - pokemonToday->var00 = TVSHOW_POKEMON_TODAY_CAUGHT; - pokemonToday->var01 = total; - if (gBattleResults.unk5_1 != 0) - { - total = 1; - item = ITEM_MASTER_BALL; - } - else - { - for (i = 0; i < 11; i++) - total += gBattleResults.unk36[i]; - if (total > 0xff) - total = 0xff; - item = gLastUsedItem; - } - pokemonToday->var12 = total; - pokemonToday->ball = item; - StringCopy(pokemonToday->playerName, gSaveBlock2.playerName); - StringCopy(pokemonToday->nickname, gBattleResults.caughtNick); - pokemonToday->species = gBattleResults.caughtPoke; - sub_80BE138((TVShow *)pokemonToday); - pokemonToday->language = GAME_LANGUAGE; - pokemonToday->language2 = sub_80BDEAC(pokemonToday->nickname); - StripExtCtrlCodes(pokemonToday->nickname); - } - } - } - } -} - -void sub_80BE028(void) -{ - struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[24].worldOfMasters; - - if (worldOfMasters->var00 != TVSHOW_WORLD_OF_MASTERS) - { - sub_80BF55C(gSaveBlock1.tvShows, 24); - worldOfMasters->var06 = GetGameStat(GAME_STAT_STEPS); - worldOfMasters->var00 = TVSHOW_WORLD_OF_MASTERS; - } - worldOfMasters->var02++; - worldOfMasters->var04 = gBattleResults.caughtPoke; - worldOfMasters->var08 = gBattleResults.poke1Species; - worldOfMasters->var0a = gMapHeader.regionMapSectionId; -} - -void sub_80BE074(void) -{ - u8 i; - u16 total; - u8 zero = 0; - - if (sub_80BF77C(0xffff) == 0) - { - for (i = 0, total = 0; i < ARRAY_COUNT(gUnknown_03004316); i++) - total += gUnknown_03004316[i]; - if (total > 0xff) - total = 0xff; - if (total > 2 && gBattleOutcome == 1) - { - gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_POKEMON_TODAY_FAILED) != 1) - { - struct TVShowPokemonTodayFailed *pokemonTodayFailed = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonTodayFailed; - - zero = 0; - pokemonTodayFailed->var00 = TVSHOW_POKEMON_TODAY_FAILED; - pokemonTodayFailed->var01 = zero; - pokemonTodayFailed->species = gBattleResults.poke1Species; - pokemonTodayFailed->species2 = gBattleResults.lastOpponentSpecies; - pokemonTodayFailed->var10 = total; - pokemonTodayFailed->var11 = gBattleOutcome; - pokemonTodayFailed->var12 = gMapHeader.regionMapSectionId; - StringCopy(pokemonTodayFailed->playerName, gSaveBlock2.playerName); - sub_80BE138((TVShow *)pokemonTodayFailed); - pokemonTodayFailed->language = GAME_LANGUAGE; - } - } - } -} - - -void sub_80BE138(TVShow *show) -{ - u32 playerId = GetPlayerTrainerId(); - - show->common.srcTrainerId2Lo = playerId & 0xFF; - show->common.srcTrainerId2Hi = playerId >> 8; - show->common.srcTrainerIdLo = playerId & 0xFF; - show->common.srcTrainerIdHi = playerId >> 8; - show->common.trainerIdLo = playerId & 0xFF; - show->common.trainerIdHi = playerId >> 8; -} - -void sub_80BE160(TVShow *show) -{ - u32 playerId = GetPlayerTrainerId(); - - show->common.srcTrainerIdLo = playerId & 0xFF; - show->common.srcTrainerIdHi = playerId >> 8; - show->common.trainerIdLo = playerId & 0xFF; - show->common.trainerIdHi = playerId >> 8; -} - -void sub_80BE188(void) -{ - struct TVShowBravoTrainerPokemonProfiles *bravoTrainerSrc = &gSaveBlock1.tvShows[24].bravoTrainer; - - if (bravoTrainerSrc->var00 == TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE) - { - struct TVShowBravoTrainerPokemonProfiles *bravoTrainerNew = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainer; - - bravoTrainerNew->var00 = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE; - bravoTrainerNew->var01 = 1; - bravoTrainerNew->species = bravoTrainerSrc->species; - StringCopy(bravoTrainerNew->playerName, gSaveBlock2.playerName); - StringCopy(bravoTrainerNew->pokemonNickname, bravoTrainerSrc->pokemonNickname); - bravoTrainerNew->contestCategory = bravoTrainerSrc->contestCategory; - bravoTrainerNew->contestRank = bravoTrainerSrc->contestRank; - bravoTrainerNew->var14 = bravoTrainerSrc->var14; - bravoTrainerNew->contestResult = bravoTrainerSrc->contestResult; - bravoTrainerNew->contestCategory = bravoTrainerSrc->contestCategory; - sub_80BE160((TVShow *)bravoTrainerNew); - bravoTrainerNew->language = GAME_LANGUAGE; - bravoTrainerNew->var1f = sub_80BDEAC(bravoTrainerNew->pokemonNickname); - StripExtCtrlCodes(bravoTrainerNew->pokemonNickname); - } -} - -void sub_80BE23C(u16 a0) -{ - struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[24].bravoTrainer; - - sub_80BF484(); - gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1) - { - sub_80BF55C(gSaveBlock1.tvShows, 24); - bravoTrainer->var14 = a0; - bravoTrainer->var00 = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE; - } -} - -void sub_80BE284(u8 a0) -{ - struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[24].bravoTrainer; - - gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1) - { - bravoTrainer->contestResult = a0; - bravoTrainer->contestCategory = gScriptContestCategory; - bravoTrainer->contestRank = gScriptContestRank; - bravoTrainer->species = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_SPECIES, NULL); - GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_NICKNAME, bravoTrainer->pokemonNickname); - } -} - -void sub_80BE320(void) -{ - struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainerTower; - - bravoTrainerTower->var00 = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE; - bravoTrainerTower->var01 = 1; - StringCopy(bravoTrainerTower->trainerName, gSaveBlock2.playerName); - StringCopy(bravoTrainerTower->pokemonName, gSaveBlock2.filler_A8.filler_3DC); - bravoTrainerTower->species = gSaveBlock2.filler_A8.var_480; - bravoTrainerTower->defeatedSpecies = gSaveBlock2.filler_A8.var_482; - bravoTrainerTower->var16 = sub_8135D3C(gSaveBlock2.filler_A8.var_4D0); - bravoTrainerTower->var1c = gSaveBlock2.filler_A8.var_4AD; - if (gSaveBlock2.filler_A8.var_4D0 == 0) - bravoTrainerTower->btLevel = 50; - else - bravoTrainerTower->btLevel = 100; - bravoTrainerTower->var1b = gSpecialVar_0x8004; - sub_80BE160((TVShow *)bravoTrainerTower); - bravoTrainerTower->language = GAME_LANGUAGE; -} - -void sub_80BE3BC(void) -{ - u8 rval; - u8 i; - - rval = sub_80BF77C(0x5555); - if (rval == 0) - { - gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_SMART_SHOPPER) != 1) - { - sub_80BF20C(); - if (gUnknown_02038724[0].item_amount >= 20) - { - struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].smartshopperShow; - - smartShopper->var00 = TVSHOW_SMART_SHOPPER; - smartShopper->var01 = rval; - 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->priceReduced = GetPriceReduction(1); - StringCopy(smartShopper->playerName, gSaveBlock2.playerName); - sub_80BE138((TVShow *)smartShopper); - smartShopper->language = GAME_LANGUAGE; - } - } - } -} - -void sub_80BE478(void) -{ - sub_80BF478(); - if (gScriptResult == 1) - return; - - GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1); - if (StringLength(gSaveBlock2.playerName) > 1 && StringLength(gStringVar1) > 1) - { - struct TVShowNameRaterShow *nameRaterShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].nameRaterShow; - - nameRaterShow->var00 = TVSHOW_NAME_RATER_SHOW; - nameRaterShow->var01 = 1; - nameRaterShow->species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL); - nameRaterShow->random = Random() % 3; - nameRaterShow->random2 = Random() % 2; - nameRaterShow->var1C = sub_80BF674(nameRaterShow->species); - StringCopy(nameRaterShow->trainerName, gSaveBlock2.playerName); - GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, nameRaterShow->pokemonName); - sub_80BE160((TVShow *)nameRaterShow); - nameRaterShow->language = GAME_LANGUAGE; - nameRaterShow->pokemonNameLanguage = sub_80BDEAC(nameRaterShow->pokemonName); - StripExtCtrlCodes(nameRaterShow->pokemonName); - } -} - -void StartMassOutbreak(void) -{ - struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[gSpecialVar_0x8004].massOutbreak; - - gSaveBlock1.outbreakPokemonSpecies = massOutbreak->species; - gSaveBlock1.outbreakLocationMapNum = massOutbreak->locationMapNum; - gSaveBlock1.outbreakLocationMapGroup = massOutbreak->locationMapGroup; - gSaveBlock1.outbreakPokemonLevel = massOutbreak->level; - gSaveBlock1.outbreakUnk1 = massOutbreak->var02; - gSaveBlock1.outbreakUnk2 = massOutbreak->var0E; - gSaveBlock1.outbreakPokemonMoves[0] = massOutbreak->moves[0]; - gSaveBlock1.outbreakPokemonMoves[1] = massOutbreak->moves[1]; - gSaveBlock1.outbreakPokemonMoves[2] = massOutbreak->moves[2]; - gSaveBlock1.outbreakPokemonMoves[3] = massOutbreak->moves[3]; - gSaveBlock1.outbreakUnk4 = massOutbreak->var03; - gSaveBlock1.outbreakPokemonProbability = massOutbreak->probability; - gSaveBlock1.outbreakUnk5 = 2; -} - -void sub_80BE5FC(void) -{ - struct TVShowFanClubLetter *fanclubLetter = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubLetter; - - fanclubLetter->var00 = TVSHOW_FAN_CLUB_LETTER; - fanclubLetter->var01 = 1; - StringCopy(fanclubLetter->playerName, gSaveBlock2.playerName); - fanclubLetter->species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL); - sub_80BE160((TVShow *)fanclubLetter); - fanclubLetter->language = GAME_LANGUAGE; -} - -void sub_80BE65C(void) -{ - struct TVShowRecentHappenings *recentHappenings = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].recentHappenings; - - recentHappenings->var00 = TVSHOW_RECENT_HAPPENINGS; - recentHappenings->var01 = 1; - StringCopy(recentHappenings->playerName, gSaveBlock2.playerName); - recentHappenings->var02 = 0; - sub_80BE160((TVShow *)recentHappenings); - recentHappenings->language = GAME_LANGUAGE; -} - -void sub_80BE6A0(void) -{ - u8 monIndex; - struct TVShowFanclubOpinions *fanclubOpinions = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubOpinions; - - fanclubOpinions->var00 = TVSHOW_PKMN_FAN_CLUB_OPINIONS; - fanclubOpinions->var01 = 1; - monIndex = GetLeadMonIndex(); - fanclubOpinions->var04A = GetMonData(&gPlayerParty[monIndex], MON_DATA_FRIENDSHIP, NULL) / 16; - fanclubOpinions->var04B = gSpecialVar_0x8007; - StringCopy(fanclubOpinions->playerName, gSaveBlock2.playerName); - GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, fanclubOpinions->var10); - fanclubOpinions->var02 = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL); - sub_80BE160((TVShow *)fanclubOpinions); - fanclubOpinions->language = GAME_LANGUAGE; - fanclubOpinions->var0E = sub_80BDEAC(fanclubOpinions->var10); - StripExtCtrlCodes(fanclubOpinions->var10); -} - -void nullsub_21(void) -{ -} - -void sub_80BE778(void) -{ - if (FlagGet(SYS_GAME_CLEAR)) - { - u8 i; - - for (i = 0; i < 24; i++) - { - if (gSaveBlock1.tvShows[i].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK) - return; - } - if (sub_80BF77C(0x147)) - return; - - gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1) - { - u16 rand = Random(); - u16 val = rand % 5; - s32 val2 = gUnknown_03005D38.var0; - struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[val2].massOutbreak; - - massOutbreak->var00 = TVSHOW_MASS_OUTBREAK; - massOutbreak->var01 = 1; - massOutbreak->level = gPokeOutbreakSpeciesList[val].level; - massOutbreak->var02 = 0; - massOutbreak->var03 = 0; - massOutbreak->species = gPokeOutbreakSpeciesList[val].species; - massOutbreak->var0E = 0; - massOutbreak->moves[0] = gPokeOutbreakSpeciesList[val].moves[0]; - massOutbreak->moves[1] = gPokeOutbreakSpeciesList[val].moves[1]; - massOutbreak->moves[2] = gPokeOutbreakSpeciesList[val].moves[2]; - massOutbreak->moves[3] = gPokeOutbreakSpeciesList[val].moves[3]; - massOutbreak->locationMapNum = gPokeOutbreakSpeciesList[val].location; - massOutbreak->locationMapGroup = 0; - massOutbreak->var12 = 0; - massOutbreak->probability = 0x32; - massOutbreak->var15 = 0; - massOutbreak->var16 = 0x01; - sub_80BE160((TVShow *)massOutbreak); - massOutbreak->language = GAME_LANGUAGE; - } - } -} - -void EndMassOutbreak(void) -{ - gSaveBlock1.outbreakPokemonSpecies = 0; - gSaveBlock1.outbreakLocationMapNum = 0; - gSaveBlock1.outbreakLocationMapGroup = 0; - gSaveBlock1.outbreakPokemonLevel = 0; - gSaveBlock1.outbreakUnk1 = 0; - gSaveBlock1.outbreakUnk2 = 0; - gSaveBlock1.outbreakPokemonMoves[0] = 0; - gSaveBlock1.outbreakPokemonMoves[1] = 0; - gSaveBlock1.outbreakPokemonMoves[2] = 0; - gSaveBlock1.outbreakPokemonMoves[3] = 0; - gSaveBlock1.outbreakUnk4 = 0; - gSaveBlock1.outbreakPokemonProbability = 0; - gSaveBlock1.outbreakUnk5 = 0; -} - -void UpdateTVShowsPerDay(u16 arg0) -{ - sub_80BE8EC(arg0); - UpdateMassOutbreakTimeLeft(arg0); - sub_80BEE84(arg0); - sub_80BEA5C(arg0); -} - -void sub_80BE8EC(u16 arg0) -{ - u8 showidx; - - if (gSaveBlock1.outbreakPokemonSpecies == 0) - { - for (showidx=0; showidx<24; showidx++) - { - if (gSaveBlock1.tvShows[showidx].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK - && gSaveBlock1.tvShows[showidx].massOutbreak.var01 == 0x01) - { - struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[showidx].massOutbreak; - - if (massOutbreak->var16 < arg0) - massOutbreak->var16 = 0; - else - massOutbreak->var16 -= arg0; - break; - } - } - } -} - -void UpdateMassOutbreakTimeLeft(u16 arg0) -{ - if (gSaveBlock1.outbreakUnk5 <= arg0) - EndMassOutbreak(); - else - gSaveBlock1.outbreakUnk5 -= arg0; -} - -void sub_80BE97C(bool8 flag) -{ - u8 var0, var1; - - if (flag) - { - var0 = gUnknown_020387E2 >> 8; - if (var0 > 4) - sub_80BE9D4(); - gUnknown_020387E2 &= 0xFF; - var1 = gUnknown_020387E2 & 0xFF; - if (var1 != 0xFF) - gUnknown_020387E2++; - } - else - { - var0 = gUnknown_020387E2 & 0xFF; - if (var0 > 4) - sub_80BE9D4(); - gUnknown_020387E2 &= 0xFF00; - var1 = gUnknown_020387E2 >> 8; - if (var1 != 0xFF) - gUnknown_020387E2 += 0x100; - } -} - -void sub_80BE9D4(void) -{ - //TVShow *show; - gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_FISHING_ADVICE) != 1) - { - struct TVShowPokemonAngler *pokemonAngler = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonAngler; - register u8 zero asm("r1") = 0; - - asm(""::"r"(zero)); - pokemonAngler->var00 = TVSHOW_FISHING_ADVICE; - pokemonAngler->var01 = zero; - pokemonAngler->var02 = gUnknown_020387E2 & 0xFF; - pokemonAngler->var03 = gUnknown_020387E2 >> 8; - pokemonAngler->var04 = gUnknown_020387E0; - StringCopy(pokemonAngler->playerName, gSaveBlock2.playerName); - sub_80BE138((TVShow *)pokemonAngler); - pokemonAngler->language = GAME_LANGUAGE; - } -} - -void sub_80BEA50(u16 var) -{ - gUnknown_020387E0 = var; -} - -void sub_80BEA88(void); - -void sub_80BEA5C(u16 arg0) -{ - struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[24].worldOfMasters; - - if (worldOfMasters->var00 == TVSHOW_WORLD_OF_MASTERS) - { - if (worldOfMasters->var02 < 20) - sub_80BF55C(gSaveBlock1.tvShows, 0x18); - else - sub_80BEA88(); - } -} -void sub_80BEA88(void) -{ - struct TVShowWorldOfMasters *worldOfMastersSrc = &gSaveBlock1.tvShows[24].worldOfMasters; - - if (sub_80BF77C(0xFFFF) == 0) - { - gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_WORLD_OF_MASTERS) != 1) - { - struct TVShowWorldOfMasters *worldOfMastersDst = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].worldOfMasters; - - worldOfMastersDst->var00 = TVSHOW_WORLD_OF_MASTERS; - worldOfMastersDst->var01 = 0; - worldOfMastersDst->var02 = worldOfMastersSrc->var02; - worldOfMastersDst->var06 = GetGameStat(GAME_STAT_STEPS) - worldOfMastersSrc->var06; - worldOfMastersDst->var04 = worldOfMastersSrc->var04; - worldOfMastersDst->var08 = worldOfMastersSrc->var08; - worldOfMastersDst->var0a = worldOfMastersSrc->var0a; - StringCopy(worldOfMastersDst->playerName, gSaveBlock2.playerName); - sub_80BE138((TVShow *)worldOfMastersDst); - worldOfMastersDst->language = GAME_LANGUAGE; - } - } -} - -void sub_80BEB20(void) -{ - u16 rval; - - if (FlagGet(SYS_GAME_CLEAR) != 0) - { - gUnknown_03005D38.var0 = sub_80BEBC8(gSaveBlock1.unknown_2ABC); - if (gUnknown_03005D38.var0 != -1 && sub_80BF77C(0x28f) != 1) - { - rval = (Random() % 3) + 1; - if (sub_80BEE48(rval) != 1) - { - gSaveBlock1.unknown_2ABC[gUnknown_03005D38.var0].val0 = rval; - gSaveBlock1.unknown_2ABC[gUnknown_03005D38.var0].val2 = 4; - gSaveBlock1.unknown_2ABC[gUnknown_03005D38.var0].val1 = 1; - } - } - } -} - -int sub_80BEBC8(struct UnknownSaveStruct2ABC *arg0) -{ - s8 i; - - for (i = 0; i < 16; i++) - { - if (arg0[i].val0 == 0) - return i; - } - return -1; -} - -void sub_80BEBF4(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - sub_80BEC10(i); -} - -void sub_80BEC10(u8 arg0) -{ - gSaveBlock1.unknown_2ABC[arg0].val0 = 0; - gSaveBlock1.unknown_2ABC[arg0].val1 = 0; - gSaveBlock1.unknown_2ABC[arg0].val2 = 0; -} - -void sub_80BEC40(void) -{ - u8 i, j; - - for (i = 0; i < 15; i++) - { - if (gSaveBlock1.unknown_2ABC[i].val0 == 0) - { - for (j = i + 1; j < 16; j++) - { - if (gSaveBlock1.unknown_2ABC[j].val0 != 0) - { - gSaveBlock1.unknown_2ABC[i] = gSaveBlock1.unknown_2ABC[j]; - sub_80BEC10(j); - break; - } - } - } - } -} - -u8 sub_80BECA0(void) -{ - u8 i; - for (i = 0; i < 16; i++) - { - if (gSaveBlock1.unknown_2ABC[i].val0 != 0 - && gSaveBlock1.unknown_2ABC[i].val1 == 1 - && gSaveBlock1.unknown_2ABC[i].val2 < 3) - return i; - } - return 0xFF; -} - -void sub_80BECE8(void) -{ - u8 arg0; - arg0 = sub_80BECA0(); - if (arg0 == 0xff) - { - gScriptResult = 0; - return; - } - if (gSaveBlock1.unknown_2ABC[arg0].val2 == 0) - { - gSaveBlock1.unknown_2ABC[arg0].val1 = 2; - if (gLocalTime.hours < 20) - ShowFieldMessage(gTVNewsTextGroup2[gSaveBlock1.unknown_2ABC[arg0].val0]); - else - ShowFieldMessage(gTVNewsTextGroup3[gSaveBlock1.unknown_2ABC[arg0].val0]); - } - else - { - u16 value = gSaveBlock1.unknown_2ABC[arg0].val2; - - ConvertIntToDecimalStringN(gStringVar1, value, 0, 1); - gSaveBlock1.unknown_2ABC[arg0].val1 = 0; - ShowFieldMessage(gTVNewsTextGroup1[gSaveBlock1.unknown_2ABC[arg0].val0]); - } - gScriptResult = 1; -} - -bool8 GetPriceReduction(u8 arg0) -{ - u8 i; - - if (arg0 == 0) - return FALSE; - for (i=0; i<16; i++) - { - if (gSaveBlock1.unknown_2ABC[i].val0 == arg0) - { - if (gSaveBlock1.unknown_2ABC[i].val1 == 2 && IsPriceDiscounted(arg0) != 0) - return TRUE; - else - return FALSE; - } - } - return FALSE; -} - -bool8 IsPriceDiscounted(u8 arg0) -{ - switch (arg0) - { - case 1: - if (gSaveBlock1.location.mapGroup == MAP_GROUP_SLATEPORT_CITY - && gSaveBlock1.location.mapNum == MAP_ID_SLATEPORT_CITY - && gScriptLastTalked == 0x1a) - return TRUE; - else - return FALSE; - break; - case 3: - if (gSaveBlock1.location.mapGroup == MAP_GROUP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP - && gSaveBlock1.location.mapNum == MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) - return TRUE; - else - return FALSE; - break; - default: - return TRUE; - } -} - -bool8 sub_80BEE48(u8 arg0) -{ - u8 i; - - if (arg0 == 0) - return TRUE; - for (i=0; i<16; i++) - { - if (gSaveBlock1.unknown_2ABC[i].val0 == arg0) - return TRUE; - } - return FALSE; -} - -void sub_80BEE84(u16 var0) -{ - u8 i; - - for (i=0; i<16; i++) - { - if (gSaveBlock1.unknown_2ABC[i].val0) - { - if (gSaveBlock1.unknown_2ABC[i].val2 < var0) - { - sub_80BEC10(i); - } - else - { - if (!gSaveBlock1.unknown_2ABC[i].val1 && FlagGet(SYS_GAME_CLEAR) == 1) - gSaveBlock1.unknown_2ABC[i].val1 = 1; - gSaveBlock1.unknown_2ABC[i].val2 -= var0; - } - } - } - sub_80BEC40(); -} - -void sub_80BEF10(u8 strvaridx, u8 rank) -{ - switch (rank) - { - case NORMAL_RANK: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[NORMAL_RANK + 5]); - break; - case SUPER_RANK: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[SUPER_RANK + 5]); - break; - case HYPER_RANK: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[HYPER_RANK + 5]); - break; - case MASTER_RANK: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[MASTER_RANK + 5]); - break; - } -} - -void CopyContestCategoryToStringVar(u8 strvaridx, u8 category) -{ - switch (category) - { - case CONTEST_COOL: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_COOL]); - break; - case CONTEST_BEAUTY: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_BEAUTY]); - break; - case CONTEST_CUTE: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_CUTE]); - break; - case CONTEST_SMART: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_SMART]); - break; - case CONTEST_TOUGH: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_TOUGH]); - break; - } -} - -void SetContestCategoryStringVarForInterview(void) -{ - struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainer; - - CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory); -} - -void sub_80BF088(u8 arg0, s32 price) -{ - size_t log10val = sub_80BF0B8(price); - - ConvertIntToDecimalStringN(gUnknown_083D1464[arg0], price, 0, log10val); -} - -size_t sub_80BF0B8(int value) -{ - if (value / 10 == 0) - return 1; - else if (value / 100 == 0) - return 2; - else if (value / 1000 == 0) - return 3; - else if (value / 10000 == 0) - return 4; - else if (value / 100000 == 0) - return 5; - else if (value / 1000000 == 0) - return 6; - else if (value / 10000000 == 0) - return 7; - else if (value / 100000000 == 0) - return 8; - else - return 1; -} - -void sub_80BF154(u8 arg0, struct TVShowSmartShopper *arg1) -{ - u8 i; - s32 price; - price = 0; - - for (i = 0; i < 3; i++) - { - if (arg1->itemIds[i]) - price += ItemId_GetPrice(arg1->itemIds[i]) * arg1->itemAmounts[i]; - } - if (arg1->priceReduced == 1) - sub_80BF088(arg0, price >> 1); - else - sub_80BF088(arg0, price); -} - -bool8 sub_80BF1B4(u8 showIdx) -{ - u8 i; - //TVShow *tvShows; - TVShow *tvShows = gSaveBlock1.tvShows; - u32 trainerId = GetPlayerTrainerId(); - - for (i = 5; i < 24; i++) - { - if (tvShows[i].common.var00 == showIdx) - { - if ((trainerId & 0xFF) == tvShows[i].common.trainerIdLo && ((trainerId >> 8) & 0xFF) == tvShows[i].common.trainerIdHi) - return TRUE; - } - } - return FALSE; -} - -void sub_80BF20C(void) -{ - u8 i, j; - u16 tmpId, tmpAmount; - - for (i = 0; i < 2; i++) - { - for (j = i + 1; j < 3; j++) - { - if (gUnknown_02038724[i].item_amount < gUnknown_02038724[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; - } - } - } -} - -void sub_80BF25C(u8 showType) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - if (gSaveBlock1.tvShows[i].common.var00 == showType) - { - if(gSaveBlock1.tvShows[i].common.var01 == 1) - { - gScriptResult = 1; - } - else - { - sub_80BF55C(gSaveBlock1.tvShows, i); - sub_80BF588(gSaveBlock1.tvShows); - sub_80BF6D8(); - } - return; - } - } - sub_80BF6D8(); -} - -void sub_80BF2C4(void) -{ - gScriptResult = 0; - switch (gSpecialVar_0x8005) - { - case TVSHOW_FAN_CLUB_LETTER: - sub_80BF334(); - break; - case TVSHOW_RECENT_HAPPENINGS: - sub_80BF3A4(); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - sub_80BF3DC(); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - sub_80BF46C(); - break; - case TVSHOW_NAME_RATER_SHOW: - sub_80BF478(); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - sub_80BF484(); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - sub_80BF4BC(); - break; - } -} - -void sub_80BF334(void) -{ - struct TVShowFanClubLetter *fanclubLetter; - - sub_80BF25C(TVSHOW_FAN_CLUB_LETTER); - if (gScriptResult == 0) - { - StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]); - fanclubLetter = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubLetter; - sub_80EB6FC(fanclubLetter->pad04, 6); - } -} - -void sub_80BF3A4(void) -{ - struct TVShowRecentHappenings *recentHappenings; - - sub_80BF25C(TVSHOW_RECENT_HAPPENINGS); - if (gScriptResult == 0) - { - recentHappenings = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].recentHappenings; - sub_80EB6FC(recentHappenings->var04, 6); - } -} - -void sub_80BF3DC(void) -{ - struct TVShowFanclubOpinions *fanclubOpinions; - - sub_80BF25C(TVSHOW_PKMN_FAN_CLUB_OPINIONS); - if (gScriptResult == 0) - { - StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]); - GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, gStringVar2); - StringGetEnd10(gStringVar2); - fanclubOpinions = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubOpinions; - sub_80EB6FC(fanclubOpinions->var1C, 2); - } -} - -void sub_80BF46C(void) -{ - gScriptResult = 1; -} - -void sub_80BF478(void) -{ - sub_80BF25C(TVSHOW_NAME_RATER_SHOW); -} - -void sub_80BF484(void) -{ - struct TVShowBravoTrainerPokemonProfiles *bravoTrainer; - - sub_80BF25C(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE); - if (gScriptResult == 0) - { - bravoTrainer = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainer; - sub_80EB6FC(bravoTrainer->var04, 2); - } -} - -void sub_80BF4BC(void) -{ - struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower; - - sub_80BF25C(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE); - if (gScriptResult == 0) - { - bravoTrainerTower = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainerTower; - sub_80EB6FC(bravoTrainerTower->var18, 1); // wrong struct ident, fix later - } -} - -#if ENGLISH -u8 sub_80BF4F4(u8 arg0) -{ - u32 species; - - GetMonData(&gPlayerParty[arg0], MON_DATA_NICKNAME, &gStringVar1); - species = GetMonData(&gPlayerParty[arg0], MON_DATA_SPECIES, NULL); - if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1) == FALSE) - return FALSE; - - return TRUE; -} -#elif GERMAN -u8 sub_80BF4F4(u8 arg0) -{ - u8 langData[4]; - u32 species; - u8 *tmp; - - GetMonData(&gPlayerParty[arg0], MON_DATA_NICKNAME, &gStringVar1); - - tmp = langData; - tmp[0] = GetMonData(&gPlayerParty[arg0], MON_DATA_LANGUAGE, &langData); - if (tmp[0] != GAME_LANGUAGE) - return TRUE; - - species = GetMonData(&gPlayerParty[arg0], MON_DATA_SPECIES, NULL); - if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1)) - return TRUE; - - return FALSE; -} -#endif - -u8 sub_80BF544(void) -{ - return sub_80BF4F4(GetLeadMonIndex()); -} - -void sub_80BF55C(TVShow tvShow[], u8 showidx) -{ - u8 idx; - - tvShow[showidx].common.var00 = 0; - tvShow[showidx].common.var01 = 0; - for (idx = 0; idx < 34; idx++) - tvShow[showidx].common.pad02[idx] = 0; -} - -void sub_80BF588(TVShow tvShow[]) -{ - u8 showidx; - u8 showidx2; - - for (showidx = 0; showidx < 4; showidx++) - { - if (tvShow[showidx].common.var00 == 0) - { - for (showidx2 = showidx + 1; showidx2 < 5; showidx2++) - { - if (tvShow[showidx2].common.var00 != 0) - { - tvShow[showidx] = tvShow[showidx2]; - sub_80BF55C(tvShow, showidx2); - break; - } - } - } - } - for (showidx = 5; showidx < 24; showidx++) - { - if (tvShow[showidx].common.var00 == 0) - { - for (showidx2 = showidx + 1; showidx2 < 24; showidx2++) - { - if (tvShow[showidx2].common.var00 != 0) - { - tvShow[showidx] = tvShow[showidx2]; - sub_80BF55C(gSaveBlock1.tvShows, showidx2); - break; - } - } - } - } -} - -u16 sub_80BF638(u8 arg0, u16 arg1) -{ - u16 retval = sub_80BF674(arg1); - - StringCopy(gUnknown_083D1464[arg0], gSpeciesNames[retval]); - return retval; -} - -u16 sub_80BF674(u16 species) -{ - u16 rspecies; - u16 cspecies; - - rspecies = (Random() % (NUM_SPECIES - 1)) + 1; - cspecies = rspecies; - while (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(cspecies), 0) != 1 || cspecies == species) - { - if (cspecies == SPECIES_BULBASAUR) - cspecies = NUM_SPECIES - 1; - else - cspecies --; - if (cspecies == rspecies) - { - cspecies = species; - return cspecies; - } - } - return cspecies; -} - -void sub_80BF6D8(void) -{ - gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); - gSpecialVar_0x8006 = gUnknown_03005D38.var0; - if (gUnknown_03005D38.var0 == -1) - gScriptResult = 1; - else - gScriptResult = 0; -} - -s8 sub_80BF720(TVShow tvShow[]) -{ - u8 idx; - - for (idx = 0; idx < 5; idx++) - { - if (tvShow[idx].common.var00 == 0) - return idx; - } - return -1; -} - -s8 sub_80BF74C(TVShow tvShow[]) -{ - s8 idx; - - for (idx = 5; idx < 24; idx++) - { - if (tvShow[idx].common.var00 == 0) - return idx; - } - return -1; -} - -bool8 sub_80BF77C(u16 value) -{ - if (Random() <= value) - return FALSE; - return TRUE; -} - -void sub_80BF79C(TVShow *arg0) -{ - u8 i = Random() % 6; - - while (1) - { - if (i == 6) - i = 0; - if (arg0->recentHappenings.var04[i] != 0xFFFF) - break; - i++; - } - sub_80EB3FC(gStringVar3, arg0->recentHappenings.var04[i]); -} - -u8 sub_80BF7E8(struct TVShowNameRaterShow *arg0) -{ - u16 flagsum = 0; - u8 i = 0; - - if (arg0->pokemonName[0] != 0xFF) - { - while (i < 11 && arg0->pokemonName[i] != 0xFF) - { - flagsum += arg0->pokemonName[i]; - i++; - } - } - return flagsum & 0x7; -} - - -void sub_80BF820(u8 arg0, u8 arg1, u8 arg2, u16 arg3, u16 arg4, struct TVShowNameRaterShow *tvShow) -{ - u8 flags[3]; - u16 nameLength; - u8 i; - - for (i = 0; i < 3; i++) - flags[i] = EOS; - - if (arg3 == 0) - { - nameLength = StringLength(tvShow->trainerName); - if (arg2 == 0) - { - flags[0] = tvShow->trainerName[arg1]; - } - else if (arg2 == 1) - { - flags[0] = tvShow->trainerName[nameLength - arg1]; - } - else if (arg2 == 2) { - flags[0] = tvShow->trainerName[arg1]; - flags[1] = tvShow->trainerName[arg1 + 1]; - } - else - { - flags[0] = tvShow->trainerName[nameLength - (arg1 + 2)]; - flags[1] = tvShow->trainerName[nameLength - (arg1 + 1)]; - } - } - else if (arg3 == 1) - { - nameLength = StringLength(tvShow->pokemonName); - if (arg2 == 0) - { - flags[0] = tvShow->pokemonName[arg1]; - } - else if (arg2 == 1) - { - flags[0] = tvShow->pokemonName[nameLength - arg1]; - } - else if (arg2 == 2) - { - flags[0] = tvShow->pokemonName[arg1]; - flags[1] = tvShow->pokemonName[arg1 + 1]; - } - else - { - flags[0] = tvShow->pokemonName[nameLength - (arg1 + 2)]; - flags[1] = tvShow->pokemonName[nameLength - (arg1 + 1)]; - } - } - else - { - nameLength = StringLength(gSpeciesNames[arg4]); - if (arg2 == 0) - { - flags[0] = gSpeciesNames[arg4][arg1]; - } - else if (arg2 == 1) - { - flags[0] = gSpeciesNames[arg4][nameLength - arg1]; - } - else if (arg2 == 2) - { - flags[0] = gSpeciesNames[arg4][arg1]; - flags[1] = gSpeciesNames[arg4][arg1 + 1]; - } - else - { - flags[0] = gSpeciesNames[arg4][nameLength - (arg1 + 2)]; - flags[1] = gSpeciesNames[arg4][nameLength - (arg1 + 1)]; - } - } - StringCopy(gUnknown_083D1464[arg0], flags); -} - -bool8 sub_80BF974(void) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - if (gSaveBlock1.tvShows[i].common.var00 == gSpecialVar_0x8004) - return TRUE; - } - return FALSE; -} - -bool8 sub_80BF9B4(void) -{ - GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1); - if (!StringCompareWithoutExtCtrlCodes(gStringVar3, gStringVar1)) - return FALSE; - sub_80BE478(); - return TRUE; -} - -void c2_080CC144(void); - -void sub_80BF9F8(void) -{ - u16 spec; - u16 gender; - u32 pval; - - GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar3); - GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar2); - spec = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_SPECIES, 0); - gender = GetMonGender(&(gPlayerParty[gSpecialVar_0x8004])); - pval = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_PERSONALITY, 0); - DoNamingScreen(3, gStringVar2, spec, gender, pval, c2_080CC144); -} - -void c2_080CC144(void) -{ - SetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, gStringVar2); - c2_exit_to_overworld_1_continue_scripts_restart_music(); -} - -void sub_80BFAE0(void) -{ - GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1); - StringGetEnd10(gStringVar1); -} - -void sub_80BFB10(void) -{ - if (GetPlayerTrainerId() == GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_OT_ID, 0)) - gScriptResult = 0; - else - gScriptResult = 1; -} - -u8 sub_80BFB54(u8 arg0) -{ - if (arg0 == 0) - return 0; - else if (arg0 > 0 && arg0 <= 20) - return 2; - else if (arg0 > 20 && arg0 <= 40) - return 3; - else if (arg0 > 40 && arg0 <= 60) - return 4; - else - return 0; -} - -u32 GetPlayerTrainerId(void) -{ - return (gSaveBlock2.playerTrainerId[3] << 24) | (gSaveBlock2.playerTrainerId[2] << 16) | (gSaveBlock2.playerTrainerId[1] << 8) | (gSaveBlock2.playerTrainerId[0]); -} - -u8 CheckForBigMovieOrEmergencyNewsOnTV(void) -{ - if (gSaveBlock1.location.mapGroup != MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) - return 0; - if (gSaveBlock2.playerGender == MALE) - { - if (gSaveBlock1.location.mapNum != MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) - return 0; - } - else - { - if (gSaveBlock1.location.mapNum != MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F) - return 0; - } - if (FlagGet(SYS_TV_LATI) == 1) - return 1; - if (FlagGet(SYS_TV_HOME) == 1) - return 2; - return 1; -} - -void GetMomOrDadStringForTVMessage(void) -{ - if (gSaveBlock1.location.mapGroup == MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) - { - if (gSaveBlock2.playerGender == MALE) - { - if (gSaveBlock1.location.mapNum == MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) - { - StringCopy(gStringVar1, gOtherText_Mom); - VarSet(VAR_0x4003, 1); - } - } - else - { - if (gSaveBlock1.location.mapNum == MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F) - { - StringCopy(gStringVar1, gOtherText_Mom); - VarSet(VAR_0x4003, 1); - } - } - } - if (VarGet(VAR_0x4003) == 1) - { - StringCopy(gStringVar1, gOtherText_Mom); - } - else if (VarGet(VAR_0x4003) == 2) - { - StringCopy(gStringVar1, gOtherText_Dad); - } - else if (VarGet(VAR_0x4003) > 2) - { - if (VarGet(VAR_0x4003) % 2 == 0) - StringCopy(gStringVar1, gOtherText_Mom); - else - StringCopy(gStringVar1, gOtherText_Dad); - } - else - { - if (Random() % 2 != 0) - { - StringCopy(gStringVar1, gOtherText_Mom); - VarSet(VAR_0x4003, 1); - } - else - { - StringCopy(gStringVar1, gOtherText_Dad); - VarSet(VAR_0x4003, 2); - } - } -} - -void sub_80BFD20(void) -{ - VarSet(VAR_0x40BC, 0); - RemoveFieldObjectByLocalIdAndMap(5, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); -} - -typedef union ewramStruct_02007000 -{ - TVShow tvshows[4][25]; - struct UnknownSaveStruct2ABC unknown_2abc[4][16]; -} ewramStruct_02007000; - -void sub_80BFE24(TVShow arg0[25], TVShow arg1[25], TVShow arg2[25], TVShow arg3[25]); - -void sub_80C04A0(void); -void sub_80C01D4(void); -void sub_80C0408(void); - -void sub_80BFD44(u8 *arg0, u32 arg1, u8 arg2) -{ - u8 i; - ewramStruct_02007000 *ewramTVShows; - - for (i = 0; i < 4; i++) - memcpy(&gUnknown_02007000.tvshows[i], &arg0[i * arg1], 25 * sizeof(TVShow)); - ewramTVShows = &gUnknown_02007000; - switch (arg2) - { - case 0: - sub_80BFE24(gSaveBlock1.tvShows, ewramTVShows->tvshows[1], ewramTVShows->tvshows[2], ewramTVShows->tvshows[3]); - break; - case 1: - sub_80BFE24(ewramTVShows->tvshows[0], gSaveBlock1.tvShows, ewramTVShows->tvshows[2], ewramTVShows->tvshows[3]); - break; - case 2: - sub_80BFE24(ewramTVShows->tvshows[0], ewramTVShows->tvshows[1], gSaveBlock1.tvShows, ewramTVShows->tvshows[3]); - break; - case 3: - sub_80BFE24(ewramTVShows->tvshows[0], ewramTVShows->tvshows[1], ewramTVShows->tvshows[2], gSaveBlock1.tvShows); - break; - } - sub_80BF588(gSaveBlock1.tvShows); - sub_80C04A0(); - sub_80BF588(gSaveBlock1.tvShows); - sub_80C01D4(); - sub_80C0408(); -} - -s8 sub_80C019C(TVShow tvShows[]); -bool8 sub_80BFF68(TVShow * tv1[25], TVShow * tv2[25], u8 idx); -u8 sub_80C004C(TVShow *tv1, TVShow *tv2, u8 idx); -u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx); -u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx); - -void sub_80BFE24(TVShow arg0[25], TVShow arg1[25], TVShow arg2[25], TVShow arg3[25]) -{ - u8 i, j; - TVShow **argslist[4]; - - argslist[0] = &arg0; - argslist[1] = &arg1; - argslist[2] = &arg2; - argslist[3] = &arg3; - gUnknown_03000720 = GetLinkPlayerCount(); - while (1) - { - for (i=0; icommon.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) - return FALSE; - tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo; - tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi; - tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF; - tv2->common.srcTrainerIdHi = linkTrainerId >> 8; - *tv1 = *tv2; - tv1->common.var01 = 1; - return TRUE; -} - -u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx) -{ - u32 linkTrainerId = GetLinkPlayerTrainerId(idx); - if ((linkTrainerId & 0xFF) == tv2->common.srcTrainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.srcTrainerIdHi) - return FALSE; - if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) - return FALSE; - tv2->common.srcTrainerIdLo = tv2->common.srcTrainerId2Lo; - tv2->common.srcTrainerIdHi = tv2->common.srcTrainerId2Hi; - tv2->common.srcTrainerId2Lo = linkTrainerId & 0xFF; - tv2->common.srcTrainerId2Hi = linkTrainerId >> 8; - *tv1 = *tv2; - tv1->common.var01 = 1; - return TRUE; -} - -u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx) -{ - u32 linkTrainerId = GetLinkPlayerTrainerId(idx); - if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) - return FALSE; - tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo; - tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi; - tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF; - tv2->common.srcTrainerIdHi = linkTrainerId >> 8; - *tv1 = *tv2; - tv1->common.var01 = 1; - tv1->common.var16[0] = 1; - return TRUE; -} - -s8 sub_80C019C(TVShow tvShows[]) -{ - u8 i; - for (i = 0; i < 24; i++) - { - if (tvShows[i].common.var01 == 0 && (u8)(tvShows[i].common.var00 - 1) < 60) - return i; - } - return -1; -} - -#ifdef NONMATCHING -void sub_80C01D4(void) -{ - u16 i; - for (i=0; i<24; i++) - { - switch (gSaveBlock1.tvShows[i].common.var00) - { - case 0: - case TVSHOW_RECENT_HAPPENINGS: - case TVSHOW_SMART_SHOPPER: - case TVSHOW_MASS_OUTBREAK: - break; - case TVSHOW_FAN_CLUB_LETTER: - sub_80C03C8((&gSaveBlock1.tvShows[i])->fanclubLetter.species, i); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - sub_80C03C8((&gSaveBlock1.tvShows[i])->fanclubOpinions.var02, i); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - sub_80C03C8((&gSaveBlock1.tvShows[i])->unkShow04.var06, i); - break; - case TVSHOW_NAME_RATER_SHOW: - sub_80C03C8((&gSaveBlock1.tvShows[i])->nameRaterShow.species, i); - sub_80C03C8((&gSaveBlock1.tvShows[i])->nameRaterShow.var1C, i); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - sub_80C03C8((&gSaveBlock1.tvShows[i])->bravoTrainer.species, i); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - sub_80C03C8((&gSaveBlock1.tvShows[i])->bravoTrainerTower.species, i); - sub_80C03C8((&gSaveBlock1.tvShows[i])->bravoTrainerTower.defeatedSpecies, i); - break; - case TVSHOW_POKEMON_TODAY_CAUGHT: - sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonToday.species, i); - break; - case TVSHOW_POKEMON_TODAY_FAILED: - sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonTodayFailed.species, i); - sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonTodayFailed.species2, i); - break; - case TVSHOW_FISHING_ADVICE: - sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonAngler.var04, i); - break; - case TVSHOW_WORLD_OF_MASTERS: - sub_80C03C8((&gSaveBlock1.tvShows[i])->worldOfMasters.var08, i); - sub_80C03C8((&gSaveBlock1.tvShows[i])->worldOfMasters.var04, i); - break; - default: - sub_80C03A8(i); - } - } -} -#else -__attribute__((naked)) -void sub_80C01D4(void) { - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - movs r6, 0\n\ -_080C01D8:\n\ - ldr r0, _080C01F8 @ =gSaveBlock1\n\ - lsls r2, r6, 3\n\ - adds r1, r2, r6\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldr r0, _080C01FC @ =0x00002738\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x29\n\ - bls _080C01EE\n\ - b _default\n\ -_080C01EE:\n\ - lsls r0, 2\n\ - ldr r1, _080C0200 @ =_080C0204\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_080C01F8: .4byte gSaveBlock1\n\ -_080C01FC: .4byte 0x00002738\n\ -_080C0200: .4byte _080C0204\n\ - .align 2, 0\n\ -_080C0204:\n\ - .4byte _break\n\ - .4byte _fanclubLetter @ TVSHOW_FAN_CLUB_LETTER\n\ - .4byte _break @ TVSHOW_RECENT_HAPPENINGS\n\ - .4byte _fanclubOpinions @ TVSHOW_PKMN_FAN_CLUB_OPINIONS\n\ - .4byte _showtype4 @ TVSHOW_UNKN_SHOWTYPE_04\n\ - .4byte _nameRater @ TVSHOW_NAME_RATER_SHOW\n\ - .4byte _bravoTrainerContest @ TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE\n\ - .4byte _bravoTrainerTower @ TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _pokemonTodayS @ TVSHOW_POKEMON_TODAY_CAUGHT\n\ - .4byte _break @ TVSHOW_SMART_SHOPPER\n\ - .4byte _pokemonTodayF @ TVSHOW_POKEMON_TODAY_FAILED\n\ - .4byte _fishing @ TVSHOW_FISHING_ADVICE\n\ - .4byte _worldOfMasters @ TVSHOW_WORLD_OF_MASTERS\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _break @ TVSHOW_MASS_OUTBREAK\n\ -_fanclubLetter:\n\ - adds r0, r2, r6\n\ - lsls r0, 2\n\ - ldr r1, _080C02B8 @ =gSaveBlock1 + 0x2738\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x2]\n\ - b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C02B8: .4byte gSaveBlock1 + 0x2738\n\ -_fanclubOpinions:\n\ - adds r0, r2, r6\n\ - lsls r0, 2\n\ - ldr r1, _080C02C8 @ =gSaveBlock1 + 0x2738\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x2]\n\ - b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C02C8: .4byte gSaveBlock1 + 0x2738\n\ -_showtype4:\n\ - adds r0, r2, r6\n\ - lsls r0, 2\n\ - ldr r1, _080C02D8 @ =gSaveBlock1 + 0x2738\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x6]\n\ - b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C02D8: .4byte gSaveBlock1 + 0x2738\n\ -_nameRater:\n\ - adds r4, r2, r6\n\ - lsls r4, 2\n\ - ldr r0, _080C02F4 @ =gSaveBlock1 + 0x2738\n\ - adds r4, r0\n\ - ldrh r0, [r4, 0x2]\n\ - lsls r5, r6, 24\n\ - lsrs r5, 24\n\ - adds r1, r5, 0\n\ - bl sub_80C03C8\n\ - ldrh r0, [r4, 0x1C]\n\ - b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C02F4: .4byte gSaveBlock1 + 0x2738\n\ -_bravoTrainerContest:\n\ - adds r0, r2, r6\n\ - lsls r0, 2\n\ - ldr r1, _080C0304 @ =gSaveBlock1 + 0x2738\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x2]\n\ - b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C0304: .4byte gSaveBlock1 + 0x2738\n\ -_bravoTrainerTower:\n\ - adds r4, r2, r6\n\ - lsls r4, 2\n\ - ldr r0, _080C0320 @ =gSaveBlock1 + 0x2738\n\ - adds r4, r0\n\ - ldrh r0, [r4, 0xA]\n\ - lsls r5, r6, 24\n\ - lsrs r5, 24\n\ - adds r1, r5, 0\n\ - bl sub_80C03C8\n\ - ldrh r0, [r4, 0x14]\n\ - b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C0320: .4byte gSaveBlock1 + 0x2738\n\ -_pokemonTodayS:\n\ - adds r0, r2, r6\n\ - lsls r0, 2\n\ - ldr r1, _080C0330 @ =gSaveBlock1 + 0x2738\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x10]\n\ - b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C0330: .4byte gSaveBlock1 + 0x2738\n\ -_pokemonTodayF:\n\ - adds r4, r2, r6\n\ - lsls r4, 2\n\ - ldr r0, _080C034C @ =gSaveBlock1 + 0x2738\n\ - adds r4, r0\n\ - ldrh r0, [r4, 0xC]\n\ - lsls r5, r6, 24\n\ - lsrs r5, 24\n\ - adds r1, r5, 0\n\ - bl sub_80C03C8\n\ - ldrh r0, [r4, 0xE]\n\ - b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C034C: .4byte gSaveBlock1 + 0x2738\n\ -_fishing:\n\ - adds r0, r2, r6\n\ - lsls r0, 2\n\ - ldr r1, _080C0364 @ =gSaveBlock1 + 0x2738\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x4]\n\ -_checkSpecies1:\n\ - lsls r1, r6, 24\n\ - lsrs r1, 24\n\ - bl sub_80C03C8\n\ - b _break\n\ - .align 2, 0\n\ -_080C0364: .4byte gSaveBlock1 + 0x2738\n\ -_worldOfMasters:\n\ - adds r4, r2, r6\n\ - lsls r4, 2\n\ - ldr r0, _080C0388 @ =gSaveBlock1 + 0x2738\n\ - adds r4, r0\n\ - ldrh r0, [r4, 0x8]\n\ - lsls r5, r6, 24\n\ - lsrs r5, 24\n\ - adds r1, r5, 0\n\ - bl sub_80C03C8\n\ - ldrh r0, [r4, 0x4]\n\ -_checkSpecies2:\n\ - adds r1, r5, 0\n\ - bl sub_80C03C8\n\ - b _break\n\ - .align 2, 0\n\ -_080C0388: .4byte gSaveBlock1 + 0x2738\n\ -_default:\n\ - lsls r0, r6, 24\n\ - lsrs r0, 24\n\ - bl sub_80C03A8\n\ -_break:\n\ - adds r0, r6, 0x1\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - cmp r6, 0x17\n\ - bhi _080C03A0\n\ - b _080C01D8\n\ -_080C03A0:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ -.syntax divided\n"); -} -#endif - -void sub_80C03A8(u8 showidx) -{ - gSaveBlock1.tvShows[showidx].common.var01 = 0; -} - -void sub_80C03C8(u16 species, u8 showidx) -{ - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0) - gSaveBlock1.tvShows[showidx].common.var01 = 0; -} - -void sub_80C0408(void) -{ - u16 i; - - if (FlagGet(SYS_GAME_CLEAR) == TRUE) - return; - for (i = 0; i < 24; i++) - { - if (gSaveBlock1.tvShows[i].common.var00 == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE) - gSaveBlock1.tvShows[i].common.var01 = 0; - else if (gSaveBlock1.tvShows[i].common.var00 == TVSHOW_MASS_OUTBREAK) - gSaveBlock1.tvShows[i].common.var01 = 0; - } -} - -void sub_80C045C(void) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - if (sub_80BFB54(gSaveBlock1.tvShows[i].common.var00) == 2) - gSaveBlock1.tvShows[i].common.var01 = 0; - } -} - -void sub_80C04A0(void) -{ - s8 showIdx; - s8 count; - count = 0; - - for (showIdx = 5; showIdx < 24; showIdx++) - { - if (gSaveBlock1.tvShows[showIdx].common.var00 == 0) - count++; - } - for (showIdx = 0; showIdx < 5 - count; showIdx++) - sub_80BF55C(gSaveBlock1.tvShows, showIdx+5); -} - -void sub_80C05C4(struct UnknownSaveStruct2ABC[16], struct UnknownSaveStruct2ABC[16], struct UnknownSaveStruct2ABC[16], struct UnknownSaveStruct2ABC[16]); -void sub_80C0750(void); -void sub_80C0788(void); -s8 sub_80C0730(struct UnknownSaveStruct2ABC[16], u8); -void sub_80C06BC(struct UnknownSaveStruct2ABC *[16], struct UnknownSaveStruct2ABC *[16]); - -void sub_80C0514(void *a0, u32 a1, u8 a2) -{ - ewramStruct_02007000 *struct02007000; - u8 i; - - for (i = 0; i < 4; i++) - memcpy(gUnknown_02007000.unknown_2abc[i], a0 + i * a1, 64); - struct02007000 = &gUnknown_02007000; - switch (a2) - { - case 0: - sub_80C05C4(gSaveBlock1.unknown_2ABC, struct02007000->unknown_2abc[1], struct02007000->unknown_2abc[2], struct02007000->unknown_2abc[3]); - break; - case 1: - sub_80C05C4(struct02007000->unknown_2abc[0], gSaveBlock1.unknown_2ABC, struct02007000->unknown_2abc[2], struct02007000->unknown_2abc[3]); - break; - case 2: - sub_80C05C4(struct02007000->unknown_2abc[0], struct02007000->unknown_2abc[1], gSaveBlock1.unknown_2ABC, struct02007000->unknown_2abc[3]); - break; - case 3: - sub_80C05C4(struct02007000->unknown_2abc[0], struct02007000->unknown_2abc[1], struct02007000->unknown_2abc[2], gSaveBlock1.unknown_2ABC); - break; - } - sub_80C0750(); - sub_80C0788(); -} - -void sub_80C05C4(struct UnknownSaveStruct2ABC a0[16], struct UnknownSaveStruct2ABC a1[16], struct UnknownSaveStruct2ABC a2[16], struct UnknownSaveStruct2ABC a3[16]) -{ - u8 i; - u8 j; - u8 k; - struct UnknownSaveStruct2ABC ** arglist[4]; - - arglist[0] = &a0; - arglist[1] = &a1; - arglist[2] = &a2; - arglist[3] = &a3; - gUnknown_03000721 = GetLinkPlayerCount(); - for (i = 0; i < 16; i++) - { - for (j = 0; j < gUnknown_03000721; j++) - { - gUnknown_03000722 = sub_80C0730(*arglist[j], i); - if (gUnknown_03000722 != -1) - { - for (k = 0; k < gUnknown_03000721-1; k++) - { - gUnknown_03005D38.var0 = sub_80BEBC8(*arglist[(j + k + 1) % gUnknown_03000721]); - if (gUnknown_03005D38.var0 != -1) - sub_80C06BC(arglist[(j + k + 1) % gUnknown_03000721], arglist[j]); - } - } - } - } -} - -void sub_80C06BC(struct UnknownSaveStruct2ABC *arg0[16], struct UnknownSaveStruct2ABC *arg1[16]) -{ - struct UnknownSaveStruct2ABC *str0; - struct UnknownSaveStruct2ABC *str1; - - str0 = arg0[0]; - str1 = arg1[0]; - str1 += gUnknown_03000722; - sub_80C06E8(str0, str1, gUnknown_03005D38.var0); -} - -bool8 sub_80C06E8(struct UnknownSaveStruct2ABC *arg0, struct UnknownSaveStruct2ABC *arg1, s8 arg2) -{ - u8 i; - - if (arg1->val0 == 0) - return FALSE; - for (i = 0; i < 16; i++) - { - if (arg0[i].val0 == arg1->val0) - return FALSE; - } - arg0[arg2].val0 = arg1->val0; - arg0[arg2].val1 = 1; - arg0[arg2].val2 = arg1->val2; - return TRUE; -} - -s8 sub_80C0730(struct UnknownSaveStruct2ABC *arg0, u8 arg1) -{ - if (arg0[arg1].val0 == 0) - return -1; - return arg1; -} - -void sub_80C0750(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gSaveBlock1.unknown_2ABC[i].val0 > 3) - sub_80BEC10(i); - } - sub_80BEC40(); -} - -void sub_80C0788(void) -{ - u8 i; - - if (FlagGet(SYS_GAME_CLEAR) != 1) - { - for (i = 0; i < 16; i++) - gSaveBlock1.unknown_2ABC[i].val1 = 0; - } -} - -void DoTVShow(void) -{ - if (gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var01 != 0) - { - switch (gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var00) - { - case TVSHOW_FAN_CLUB_LETTER: - DoTVShowPokemonFanClubLetter(); - break; - case TVSHOW_RECENT_HAPPENINGS: - DoTVShowRecentHappenings(); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - DoTVShowPokemonFanClubOpinions(); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - nullsub_22(); - break; - case TVSHOW_MASS_OUTBREAK: - DoTVShowPokemonNewsMassOutbreak(); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - DoTVShowBravoTrainerPokemonProfile(); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - DoTVShowBravoTrainerBattleTowerProfile(); - break; - case TVSHOW_POKEMON_TODAY_CAUGHT: - DoTVShowPokemonTodaySuccessfulCapture(); - break; - case TVSHOW_SMART_SHOPPER: - DoTVShowTodaysSmartShopper(); - break; - case TVSHOW_NAME_RATER_SHOW: - DoTVShowTheNameRaterShow(); - break; - case TVSHOW_POKEMON_TODAY_FAILED: - DoTVShowPokemonTodayFailedCapture(); - break; - case TVSHOW_FISHING_ADVICE: - DoTVShowPokemonAngler(); - break; - case TVSHOW_WORLD_OF_MASTERS: - DoTVShowTheWorldOfMasters(); - break; - } - } -} - -void TVShowConvertInternationalString(u8 *dest, u8 *src, u8 language) -{ - StringCopy(dest, src); - if (language < LANGUAGE_ENGLISH) - ConvertInternationalString(dest, LANGUAGE_JAPANESE); -} - -void DoTVShowBravoTrainerPokemonProfile(void) -{ - struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainer; - u8 state; - - gScriptResult = 0; - state = gUnknown_020387E8; - switch(state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); - CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory); - sub_80BEF10(2, bravoTrainer->contestRank); - if (!StringCompareWithoutExtCtrlCodes(gSpeciesNames[bravoTrainer->species], bravoTrainer->pokemonNickname)) - gUnknown_020387E8 = 8; - else - gUnknown_020387E8 = 1; - break; - case 1: - StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]); - TVShowConvertInternationalString(gStringVar2, bravoTrainer->pokemonNickname, bravoTrainer->var1f); - CopyContestCategoryToStringVar(2, bravoTrainer->contestCategory); - gUnknown_020387E8 = 2; - break; - case 2: - TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); - if (bravoTrainer->contestResult == 0) // placed first - gUnknown_020387E8 = 3; - else - gUnknown_020387E8 = 4; - break; - case 3: - TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); - sub_80EB3FC(gStringVar2, bravoTrainer->var04[0]); - sub_80BF088(2, bravoTrainer->contestResult + 1); - gUnknown_020387E8 = 5; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); - sub_80EB3FC(gStringVar2, bravoTrainer->var04[0]); - sub_80BF088(2, bravoTrainer->contestResult + 1); - gUnknown_020387E8 = 5; - break; - case 5: - TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); - CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory); - sub_80EB3FC(gStringVar3, bravoTrainer->var04[1]); - if (bravoTrainer->var14) - gUnknown_020387E8 = 6; - else - gUnknown_020387E8 = 7; - break; - case 6: - StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]); - StringCopy(gStringVar2, gMoveNames[bravoTrainer->var14]); - sub_80EB3FC(gStringVar3, bravoTrainer->var04[1]); - gUnknown_020387E8 = 7; - break; - case 7: - TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); - StringCopy(gStringVar2, gSpeciesNames[bravoTrainer->species]); - TVShowDone(); - break; - case 8: - StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]); - gUnknown_020387E8 = 2; - break; - } - ShowFieldMessage(gTVBravoTrainerTextGroup[state]); -} - -void DoTVShowBravoTrainerBattleTowerProfile(void) -{ - struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainerTower; - u8 state; - - gScriptResult = 0; - state = gUnknown_020387E8; - switch(state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language); - StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->species]); - if (bravoTrainerTower->var16 >= 7) - gUnknown_020387E8 = 1; - else - gUnknown_020387E8 = 2; - break; - case 1: - sub_80BF088(0, bravoTrainerTower->btLevel); - sub_80BF088(1, bravoTrainerTower->var16); - if (bravoTrainerTower->var1c == 1) - gUnknown_020387E8 = 3; - else - gUnknown_020387E8 = 4; - break; - case 2: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); - sub_80BF088(1, bravoTrainerTower->var16 + 1); - if (bravoTrainerTower->var1b == 0) - gUnknown_020387E8 = 5; - else - gUnknown_020387E8 = 6; - break; - case 3: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); - StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->defeatedSpecies]); - if (bravoTrainerTower->var1b == 0) - gUnknown_020387E8 = 5; - else - gUnknown_020387E8 = 6; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); - StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->defeatedSpecies]); - if (bravoTrainerTower->var1b == 0) - gUnknown_020387E8 = 5; - else - gUnknown_020387E8 = 6; - break; - case 5: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); - gUnknown_020387E8 = 11; - break; - case 6: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); - gUnknown_020387E8 = 11; - break; - case 7: - gUnknown_020387E8 = 11; - break; - case 8: - case 9: - case 10: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language); - gUnknown_020387E8 = 11; - break; - case 11: - sub_80EB3FC(gStringVar1, bravoTrainerTower->var18[0]); - if (bravoTrainerTower->var1b == 0) - gUnknown_020387E8 = 12; - else - gUnknown_020387E8 = 13; - break; - case 12: - case 13: - sub_80EB3FC(gStringVar1, bravoTrainerTower->var18[0]); - TVShowConvertInternationalString(gStringVar2, bravoTrainerTower->trainerName, bravoTrainerTower->language); - TVShowConvertInternationalString(gStringVar3, bravoTrainerTower->pokemonName, bravoTrainerTower->language); - gUnknown_020387E8 = 14; - break; - case 14: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language); - StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->species]); - TVShowDone(); - break; - } - ShowFieldMessage(gTVBravoTrainerBattleTowerTextGroup[state]); -} - -void DoTVShowTodaysSmartShopper(void) -{ - struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gSpecialVar_0x8004].smartshopperShow; - u8 state; - - gScriptResult = 0; - state = gUnknown_020387E8; - switch(state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); - GetMapSectionName(gStringVar2, smartShopper->shopLocation, 0); - if (smartShopper->itemAmounts[0] >= 0xff) - gUnknown_020387E8 = 11; - else - gUnknown_020387E8 = 1; - break; - case 1: - TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); - StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[0])->name); - sub_80BF088(2, smartShopper->itemAmounts[0]); - gUnknown_020387E8 += (Random() % 4) + 1; - break; - case 2: - case 4: - case 5: - if (smartShopper->itemIds[1] != 0) - gUnknown_020387E8 = 6; - else - gUnknown_020387E8 = 10; - break; - case 3: - sub_80BF088(2, smartShopper->itemAmounts[0] + 1); - if (smartShopper->itemIds[1] != 0) - gUnknown_020387E8 = 6; - else - gUnknown_020387E8 = 10; - break; - case 6: - StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[1])->name); - sub_80BF088(2, smartShopper->itemAmounts[1]); - if (smartShopper->itemIds[2] != 0) - gUnknown_020387E8 = 7; - else if (smartShopper->priceReduced == 1) - gUnknown_020387E8 = 8; - else - gUnknown_020387E8 = 9; - break; - case 7: - StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[2])->name); - sub_80BF088(2, smartShopper->itemAmounts[2]); - if (smartShopper->priceReduced == 1) - gUnknown_020387E8 = 8; - else - gUnknown_020387E8 = 9; - break; - case 8: - if (smartShopper->itemAmounts[0] < 0xff) - gUnknown_020387E8 = 9; - else - gUnknown_020387E8 = 12; - break; - case 9: - sub_80BF154(1, smartShopper); - TVShowDone(); - break; - case 10: - if (smartShopper->priceReduced == 1) - gUnknown_020387E8 = 8; - else - gUnknown_020387E8 = 9; - break; - case 11: - TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); - StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[0])->name); - if (smartShopper->priceReduced == 1) - gUnknown_020387E8 = 8; - else - gUnknown_020387E8 = 12; - break; - case 12: - TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); - TVShowDone(); - break; - } - ShowFieldMessage(gTVSmartShopperTextGroup[state]); -} - -void DoTVShowTheNameRaterShow(void) -{ - struct TVShowNameRaterShow *nameRaterShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004].nameRaterShow; - u8 state; - - gScriptResult = 0; - state = gUnknown_020387E8; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); - StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->species]); - TVShowConvertInternationalString(gStringVar3, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage); - gUnknown_020387E8 = sub_80BF7E8(nameRaterShow) + 1; - break; - case 1: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - if (nameRaterShow->random == 0) - gUnknown_020387E8 = 9; - else if (nameRaterShow->random == 1) - gUnknown_020387E8 = 10; - else if (nameRaterShow->random == 2) - gUnknown_020387E8 = 11; - break; - case 2: - TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); - if (nameRaterShow->random == 0) - gUnknown_020387E8 = 9; - else if (nameRaterShow->random == 1) - gUnknown_020387E8 = 10; - else if (nameRaterShow->random == 2) - gUnknown_020387E8 = 11; - break; - case 9: - case 10: - case 11: - sub_80BF820(0, 1, 0, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage); - sub_80BF820(0, 0, 0, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->pokemonNameLanguage); - TVShowConvertInternationalString(gStringVar1, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage); - gUnknown_020387E8 = 12; - break; - case 13: - sub_80BF820(0, 0, 3, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage); - sub_80BF820(0, 0, 2, 0, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->language); - TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); - gUnknown_020387E8 = 14; - break; - case 14: - sub_80BF820(0, 0, 3, 0, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->language); - sub_80BF820(0, 0, 2, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->pokemonNameLanguage); - TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); - gUnknown_020387E8 = 18; - break; - case 15: - sub_80BF820(1, 0, 2, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar1, gStringVar2, nameRaterShow->pokemonNameLanguage); - StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->species]); - sub_80BF820(2, 0, 3, 2, nameRaterShow->species, nameRaterShow); - gUnknown_020387E8 = 16; - break; - case 16: - sub_80BF820(0, 0, 3, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage); - sub_80BF820(0, 0, 2, 2, nameRaterShow->species, nameRaterShow); - gUnknown_020387E8 = 17; - break; - case 17: - sub_80BF820(1, 0, 2, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar1, gStringVar2, nameRaterShow->pokemonNameLanguage); - sub_80BF820(2, 0, 3, 2, nameRaterShow->var1C, nameRaterShow); - StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->var1C]); - gUnknown_020387E8 = 18; - break; - case 12: - state = 18; - gUnknown_020387E8 = 18; - case 18: - TVShowConvertInternationalString(gStringVar1, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage); - TVShowConvertInternationalString(gStringVar2, nameRaterShow->trainerName, nameRaterShow->language); - TVShowDone(); - break; - } - ShowFieldMessage(gTVNameRaterTextGroup[state]); -} - -void DoTVShowPokemonTodaySuccessfulCapture(void) -{ - struct TVShowPokemonToday *pokemonToday = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonToday; - u8 state; - - gScriptResult = 0; - state = gUnknown_020387E8; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); - TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2); - if (pokemonToday->ball == ITEM_MASTER_BALL) - gUnknown_020387E8 = 5; - else - gUnknown_020387E8 = 1; - break; - case 1: - gUnknown_020387E8 = 2; - break; - case 2: - StringCopy(gStringVar2, ItemId_GetItem(pokemonToday->ball)->name); - sub_80BF088(2, pokemonToday->var12); - if (pokemonToday->var12 < 4) - gUnknown_020387E8 = 3; - else - gUnknown_020387E8 = 4; - break; - case 3: - TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); - TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2); - gUnknown_020387E8 = 6; - break; - case 4: - gUnknown_020387E8 = 6; - break; - case 5: - TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); - gUnknown_020387E8 = 6; - break; - case 6: - TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); - TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2); - gUnknown_020387E8 += (Random() % 4) + 1; - break; - case 7: - case 8: - StringCopy(gStringVar1, gSpeciesNames[pokemonToday->species]); - TVShowConvertInternationalString(gStringVar2, pokemonToday->nickname, pokemonToday->language2); - sub_80BF638(2, pokemonToday->species); - gUnknown_020387E8 = 11; - break; - case 9: - case 10: - StringCopy(gStringVar1, gSpeciesNames[pokemonToday->species]); - TVShowConvertInternationalString(gStringVar2, pokemonToday->nickname, pokemonToday->language2); - gUnknown_020387E8 = 11; - break; - case 11: - TVShowDone(); - break; - } - ShowFieldMessage(gTVPokemonTodayTextGroup[state]); -} - -void DoTVShowPokemonTodayFailedCapture(void) -{ - struct TVShowPokemonTodayFailed *pokemonTodayFailed = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonTodayFailed; - u8 state; - - gScriptResult = 0; - state = gUnknown_020387E8; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonTodayFailed->species]); - gUnknown_020387E8 = 1; - break; - case 1: - TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); - GetMapSectionName(gStringVar2, pokemonTodayFailed->var12, 0); - StringCopy(gStringVar3, gSpeciesNames[pokemonTodayFailed->species2]); - if (pokemonTodayFailed->var11 == 1) - gUnknown_020387E8 = 3; - else - gUnknown_020387E8 = 2; - break; - case 2: - case 3: - TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); - sub_80BF088(1, pokemonTodayFailed->var10); - if ((Random() % 3) == 0) - gUnknown_020387E8 = 5; - else - gUnknown_020387E8 = 4; - break; - case 4: - case 5: - TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); - gUnknown_020387E8 = 6; - break; - case 6: - TVShowDone(); - break; - } - ShowFieldMessage(gTVPokemonTodayFailedCaptureTextGroup[state]); -} - -void DoTVShowPokemonFanClubLetter(void) -{ - struct TVShowFanClubLetter *fanclubLetter = &gSaveBlock1.tvShows[gSpecialVar_0x8004].fanclubLetter; - u8 state; - u16 rval; - - gScriptResult = 0; - state = gUnknown_020387E8; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, fanclubLetter->playerName, fanclubLetter->language); - StringCopy(gStringVar2, gSpeciesNames[fanclubLetter->species]); - gUnknown_020387E8 = 50; - break; - case 1: - rval = (Random() % 4) + 1; - if (rval == 1) - gUnknown_020387E8 = 2; - else - gUnknown_020387E8 = rval + 2; - break; - case 2: - gUnknown_020387E8 = 51; - break; - case 3: - gUnknown_020387E8 += (Random() % 3) + 1; - break; - case 4: - case 5: - case 6: - sub_80BF79C((TVShow *)fanclubLetter); - gUnknown_020387E8 = 7; - break; - case 7: - rval = (Random() % 0x1f) + 0x46; - sub_80BF088(2, rval); - TVShowDone(); - break; - case 50: - ConvertEasyChatWordsToString(gStringVar4, fanclubLetter->pad04, 2, 2); - ShowFieldMessage(gStringVar4); - gUnknown_020387E8 = 1; - return; - case 51: - ConvertEasyChatWordsToString(gStringVar4, fanclubLetter->pad04, 2, 2); - ShowFieldMessage(gStringVar4); - gUnknown_020387E8 = 3; - return; - } - ShowFieldMessage(gTVFanClubTextGroup[state]); -} - -void DoTVShowRecentHappenings(void) -{ - struct TVShowRecentHappenings *recentHappenings = &gSaveBlock1.tvShows[gSpecialVar_0x8004].recentHappenings; - u8 state; - - gScriptResult = 0; - state = gUnknown_020387E8; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, recentHappenings->playerName, recentHappenings->language); - sub_80BF79C((TVShow *)recentHappenings); - gUnknown_020387E8 = 50; - break; - case 1: - gUnknown_020387E8 += 1 + (Random() % 3); - break; - case 2: - case 3: - case 4: - gUnknown_020387E8 = 5; - break; - case 5: - TVShowDone(); - break; - case 50: - ConvertEasyChatWordsToString(gStringVar4, recentHappenings->var04, 2, 2); - ShowFieldMessage(gStringVar4); - gUnknown_020387E8 = 1; - return; - } - ShowFieldMessage(gTVRecentHappeningsTextGroup[state]); -} - -void DoTVShowPokemonFanClubOpinions(void) -{ - struct TVShowFanclubOpinions *fanclubOpinions = &gSaveBlock1.tvShows[gSpecialVar_0x8004].fanclubOpinions; - u8 state; - - gScriptResult = 0; - state = gUnknown_020387E8; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language); - StringCopy(gStringVar2, gSpeciesNames[fanclubOpinions->var02]); - TVShowConvertInternationalString(gStringVar3, fanclubOpinions->var10, fanclubOpinions->var0E); - gUnknown_020387E8 = fanclubOpinions->var04B + 1; - break; - case 1: - case 2: - case 3: - TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language); - StringCopy(gStringVar2, gSpeciesNames[fanclubOpinions->var02]); - sub_80EB3FC(gStringVar3, fanclubOpinions->var1C[0]); - gUnknown_020387E8 = 4; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language); - sub_80EB3FC(gStringVar3, fanclubOpinions->var1C[1]); - TVShowDone(); - break; - } - ShowFieldMessage(gTVFanClubOpinionsTextGroup[state]); -} - -void nullsub_22(void) -{ -} - -void DoTVShowPokemonNewsMassOutbreak(void) -{ - struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[gSpecialVar_0x8004].massOutbreak; - - GetMapSectionName(gStringVar1, massOutbreak->locationMapNum, 0); - StringCopy(gStringVar2, gSpeciesNames[massOutbreak->species]); - TVShowDone(); - StartMassOutbreak(); - ShowFieldMessage(gTVPokemonOutbreakTextGroup[gUnknown_020387E8]); -} - -void DoTVShowInSearchOfTrainers(void) -{ - u8 state; - - gScriptResult = 0; - state = gUnknown_020387E8; - switch (state) - { - case 0: - GetMapSectionName(gStringVar1, gSaveBlock1.gabbyAndTyData.mapnum, 0); - if (gSaveBlock1.gabbyAndTyData.battleNum > 1) - gUnknown_020387E8 = 1; - else - gUnknown_020387E8 = 2; - break; - case 1: - gUnknown_020387E8 = 2; - break; - case 2: - if (gSaveBlock1.gabbyAndTyData.valA_0 == 0) - gUnknown_020387E8 = 4; - else if (gSaveBlock1.gabbyAndTyData.valA_3 != 0) - gUnknown_020387E8 = 5; - else if (gSaveBlock1.gabbyAndTyData.valA_2 != 0) - gUnknown_020387E8 = 6; - else if (gSaveBlock1.gabbyAndTyData.valA_1 != 0) - gUnknown_020387E8 = 7; - else - gUnknown_020387E8 = 3; - break; - case 3: - StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]); - StringCopy(gStringVar2, gMoveNames[gSaveBlock1.gabbyAndTyData.lastMove]); - StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]); - gUnknown_020387E8 = 8; - break; - case 4: - case 5: - case 6: - case 7: - gUnknown_020387E8 = 8; - break; - case 8: - sub_80EB3FC(gStringVar1, gSaveBlock1.gabbyAndTyData.quote); - StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]); - StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]); - gScriptResult = 1; - gUnknown_020387E8 = 0;; - TakeTVShowInSearchOfTrainersOffTheAir(); - break; - } - ShowFieldMessage(gTVGabbyAndTyTextGroup[state]); -} - -void DoTVShowPokemonAngler(void) -{ - struct TVShowPokemonAngler *pokemonAngler = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonAngler; - u8 state; - - gScriptResult = 0; - if (pokemonAngler->var02 < pokemonAngler->var03) - gUnknown_020387E8 = 0; - else - gUnknown_020387E8 = 1; - state = gUnknown_020387E8; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, pokemonAngler->playerName, pokemonAngler->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonAngler->var04]); - sub_80BF088(2, pokemonAngler->var03); - TVShowDone(); - break; - case 1: - TVShowConvertInternationalString(gStringVar1, pokemonAngler->playerName, pokemonAngler->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonAngler->var04]); - sub_80BF088(2, pokemonAngler->var02); - TVShowDone(); - break; - } - ShowFieldMessage(gTVFishingGuruAdviceTextGroup[state]); -} - -void DoTVShowTheWorldOfMasters(void) -{ - struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[gSpecialVar_0x8004].worldOfMasters; - u8 state; - - gScriptResult = 0; - state = gUnknown_020387E8; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, worldOfMasters->playerName, - worldOfMasters->language); - sub_80BF088(1, worldOfMasters->var06); - sub_80BF088(2, worldOfMasters->var02); - gUnknown_020387E8 = 1; - break; - case 1: - StringCopy(gStringVar1, gSpeciesNames[worldOfMasters->var08]); - gUnknown_020387E8 = 2; - break; - case 2: - TVShowConvertInternationalString(gStringVar1, worldOfMasters->playerName, - worldOfMasters->language); - GetMapSectionName(gStringVar2, worldOfMasters->var0a, 0); - StringCopy(gStringVar3, gSpeciesNames[worldOfMasters->var04]); - TVShowDone(); - break; - } - ShowFieldMessage(gTVWorldOfMastersTextGroup[state]); -} - -void TVShowDone(void) -{ - gScriptResult = 1; - gUnknown_020387E8 = 0; - gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var01 = 0; -} - -void sub_80C2014(void) -{ - gUnknown_020387E8 = 0; -} diff --git a/src/unknown_debug_menu.c b/src/unknown_debug_menu.c deleted file mode 100644 index a81625f2a..000000000 --- a/src/unknown_debug_menu.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "global.h" -#include "menu.h" - -extern u8 gBattleCommunication[]; - -extern u8 (*gCallback_03004AE8)(void); - -extern const struct MenuAction gUnknown_0842C29C[]; - -static u8 sub_814A464(void); - -int unref_sub_814A414(void) -{ - MenuZeroFillScreen(); - MenuDrawTextWindow(0, 0, 16, 18); - PrintMenuItems(2, 1, 8, gUnknown_0842C29C); - InitMenu(0, 1, 1, 8, 0, 15); - gCallback_03004AE8 = sub_814A464; - return 0; -} - -static u8 sub_814A464(void) -{ - s8 result = ProcessMenuInput(); - if (result == -2) - { - return 0; - } - else if (result == -1) - { - CloseMenu(); - return 1; - } - else - { - gBattleCommunication[0] = result; - gCallback_03004AE8 = gUnknown_0842C29C[result].func; - return 0; - } -} - -u8 sub_814A4B8(void) -{ - gSaveBlock2.filler_A8.var_4AE[0] = 3; - gSaveBlock2.filler_A8.var_4AE[1] = 3; - gSaveBlock2.filler_A8.var_4B4 = gBattleCommunication[0] + 1; - gSaveBlock2.filler_A8.var_4B6 = gBattleCommunication[0] + 1; - gSaveBlock2.filler_A8.var_4B0 = 1; - gSaveBlock2.filler_A8.var_4B2 = 1; - CloseMenu(); - return 1; -} diff --git a/src/unknown_task.c b/src/unknown_task.c deleted file mode 100644 index 81b89ef92..000000000 --- a/src/unknown_task.c +++ /dev/null @@ -1,255 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "task.h" -#include "trig.h" - -struct UnknownStruct1 -{ - void *src[2]; - void *dest; - u32 unkC; - void (*unk10)(void); - u8 srcBank; - u8 unk15; - u8 unk16; - u8 unk17; - u8 taskId; - u8 filler19[0x7]; -}; - -struct UnknownStruct2 -{ - void *dest; - u32 control; - u8 unk8; - u8 unk9; -}; - -static void sub_80896F4(void); -static void sub_8089714(void); - -extern u16 gUnknown_030041B0; -extern u16 gUnknown_030041B4; -extern u16 gUnknown_030041B8; -extern u16 gUnknown_03004280; -extern u16 gUnknown_03004288; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; -extern u16 gUnknown_030042C0; - -extern u8 gUnknown_0202FFA4; - -extern struct UnknownStruct1 gUnknown_03004DC0; - -extern u16 gUnknown_03004DE0[][0x3C0]; - -void remove_some_task(void) -{ - gUnknown_03004DC0.unk15 = 0; - DmaStop(0); - if (gUnknown_03004DC0.taskId != 0xFF) - { - DestroyTask(gUnknown_03004DC0.taskId); - gUnknown_03004DC0.taskId = 0xFF; - } -} - -void dp12_8087EA4(void) -{ - CpuFill16(0, gUnknown_03004DE0, 0x780 * 2); - gUnknown_03004DC0.src[0] = 0; - gUnknown_03004DC0.src[1] = 0; - gUnknown_03004DC0.dest = 0; - gUnknown_03004DC0.unkC = 0; - gUnknown_03004DC0.srcBank = 0; - gUnknown_03004DC0.unk15 = 0; - gUnknown_03004DC0.unk16 = 0; - gUnknown_03004DC0.unk17 = 0; - gUnknown_03004DC0.taskId = 0xFF; -} - -void sub_80895F8(struct UnknownStruct2 unk) -{ - if (unk.control == (((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1)) - { - gUnknown_03004DC0.src[0] = &gUnknown_03004DE0[0][1]; - gUnknown_03004DC0.src[1] = &gUnknown_03004DE0[1][1]; - gUnknown_03004DC0.unk10 = sub_80896F4; - } - else - { - gUnknown_03004DC0.src[0] = &gUnknown_03004DE0[0][2]; - gUnknown_03004DC0.src[1] = &gUnknown_03004DE0[1][2]; - gUnknown_03004DC0.unk10 = sub_8089714; - } - - gUnknown_03004DC0.unkC = unk.control; - gUnknown_03004DC0.dest = unk.dest; - gUnknown_03004DC0.unk15 = unk.unk8; - gUnknown_03004DC0.unk16 = unk.unk9; - gUnknown_03004DC0.unk17 = unk.unk9; -} - -void sub_8089668(void) -{ - if (gUnknown_03004DC0.unk15) - { - if (gUnknown_03004DC0.unk15 == 3) - { - gUnknown_03004DC0.unk15 = 0; - DmaStop(0); - gUnknown_0202FFA4 = 1; - } - else - { - DmaStop(0); - DmaSet(0, gUnknown_03004DC0.src[gUnknown_03004DC0.srcBank], gUnknown_03004DC0.dest, gUnknown_03004DC0.unkC); - gUnknown_03004DC0.unk10(); - gUnknown_03004DC0.srcBank ^= 1; - } - } -} - -static void sub_80896F4(void) -{ - u16 *dest = (u16 *)gUnknown_03004DC0.dest; - u16 *src = (u16 *)&gUnknown_03004DE0[gUnknown_03004DC0.srcBank]; - *dest = *src; -} - -static void sub_8089714(void) -{ - u32 *dest = (u32 *)gUnknown_03004DC0.dest; - u32 *src = (u32 *)&gUnknown_03004DE0[gUnknown_03004DC0.srcBank]; - *dest = *src; -} - -static void task00_for_dp12(u8 taskId) -{ - int value = 0; - - if (gUnknown_0202FFA4) - { - DestroyTask(taskId); - gUnknown_03004DC0.taskId = 0xFF; - } - else - { - if (gTasks[taskId].data[7]) - { - switch (gTasks[taskId].data[6]) - { - case 0x0: - value = gUnknown_030042A4; - break; - case 0x2: - value = gUnknown_030042A0; - break; - case 0x4: - value = gUnknown_030042C0; - break; - case 0x6: - value = gUnknown_030041B4; - break; - case 0x8: - value = gUnknown_03004288; - break; - case 0xA: - value = gUnknown_03004280; - break; - case 0xC: - value = gUnknown_030041B0; - break; - case 0xE: - value = gUnknown_030041B8; - break; - } - } - if (gTasks[taskId].data[4]) - { - int i; - int offset; - gTasks[taskId].data[4]--; - offset = gTasks[taskId].data[3] + 320; - for (i = gTasks[taskId].data[0]; i < gTasks[taskId].data[1]; i++) - { - gUnknown_03004DE0[gUnknown_03004DC0.srcBank][i] = gUnknown_03004DE0[0][offset] + value; - offset++; - } - } - else - { - int i; - int offset; - gTasks[taskId].data[4] = gTasks[taskId].data[5]; - offset = gTasks[taskId].data[3] + 320; - for (i = gTasks[taskId].data[0]; i < gTasks[taskId].data[1]; i++) - { - gUnknown_03004DE0[gUnknown_03004DC0.srcBank][i] = gUnknown_03004DE0[0][offset] + value; - offset++; - } - gTasks[taskId].data[3]++; - if (gTasks[taskId].data[3] == gTasks[taskId].data[2]) - { - gTasks[taskId].data[3] = 0; - } - } - } -} - -static void sub_80898FC(u16 *a1, u8 a2, u8 a3, u8 a4) -{ - u16 i = 0; - u8 offset = 0; - - while (i < 0x100) - { - a1[i] = (gSineTable[offset] * a3) / 256; - offset += a2; - i++; - } -} - -u8 sub_8089944(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) -{ - int i; - int offset; - struct UnknownStruct2 unk; - u8 taskId; - - dp12_8087EA4(); - - unk.dest = (void *)(REG_ADDR_BG0HOFS + a6); - unk.control = ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1; - unk.unk8 = 1; - unk.unk9 = 0; - - sub_80895F8(unk); - - taskId = CreateTask(task00_for_dp12, 0); - - gTasks[taskId].data[0] = a1; - gTasks[taskId].data[1] = a2; - gTasks[taskId].data[2] = 256 / a3; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = a5; - gTasks[taskId].data[5] = a5; - gTasks[taskId].data[6] = a6; - gTasks[taskId].data[7] = a7; - - gUnknown_03004DC0.taskId = taskId; - gUnknown_0202FFA4 = 0; - - sub_80898FC(&gUnknown_03004DE0[0][320], a3, a4, a2 - a1); - - offset = 320; - - for (i = a1; i < a2; i++) - { - gUnknown_03004DE0[0][i] = gUnknown_03004DE0[0][offset]; - gUnknown_03004DE0[1][i] = gUnknown_03004DE0[0][offset]; - offset++; - } - - return taskId; -} diff --git a/src/unused_8124F94.c b/src/unused_8124F94.c deleted file mode 100644 index 93b569058..000000000 --- a/src/unused_8124F94.c +++ /dev/null @@ -1,126 +0,0 @@ -#include "global.h" -#include "decompress.h" -#include "palette.h" - -struct UnknownStruct2 -{ - void *src; - u8 unk4; - u8 unk5; - u8 unk6; - u16 unk8; -}; - -struct UnknownStruct3 -{ - u16 *paletteSrc; - u8 unk4; - u8 paletteCount; -}; - -struct UnknownStruct1 -{ - u8 paletteNum; - u8 unk1; - u16 unk2; - u8 *dest; - struct UnknownStruct3 unk8[16]; - struct UnknownStruct2 unk88[32]; -}; - -void unref_sub_8124F94(struct UnknownStruct1 *a) -{ - a->unk1 = 0; - a->paletteNum = 0; - a->unk2 = 0; - a->dest = (void *)VRAM; - DmaFill16(3, 0, a->unk8, sizeof(a->unk8)); - DmaFill16(3, 0, a->unk88, sizeof(a->unk88)); -} - -u8 unref_sub_8124FD8(struct UnknownStruct1 *a, const struct UnknownStruct2 *b) -{ - while (1) - { - s32 r6; - s32 temp; - - // Couldn't get it to match any other way - if (a->unk1 < 32 && b->src == NULL) - return 0; - if (a->unk1 >= 32) - break; - - a->unk88[a->unk1].src = b->src; - a->unk88[a->unk1].unk6 = b->unk6; - a->unk88[a->unk1].unk4 = b->unk4; - a->unk88[a->unk1].unk5 = b->unk5; - r6 = b->unk4 * b->unk5; - if (a->unk2 + r6 > 0x400) - return 2; - if (b->unk8 == 0) - { - DmaCopy16(3, b->src, a->dest + a->unk2 * 64, r6 * 32); - } - else - { - sub_800D238(b->src, a->dest + a->unk2 * 64); - } - a->unk88[a->unk1].unk8 = a->unk2; - temp = r6 + a->unk2; - a->unk2 = temp; - a->unk1++; - b++; - } - return 1; -} - -u8 unref_sub_81250A4(struct UnknownStruct1 *a, struct UnknownStruct3 *b) -{ - while (1) - { - // Couldn't get it to match any other way - if (a->paletteNum < 16 && b->paletteSrc == NULL) - return 0; - if (a->paletteNum >= 16) - break; - - a->unk8[a->paletteNum].paletteSrc = b->paletteSrc; - a->unk8[a->paletteNum].unk4 = b->unk4; - if (b->paletteCount == 0) - { - LoadPalette(b->paletteSrc, a->paletteNum * 16, 32); - } - else - { - u16 palette[16]; - - sub_800D238(b->paletteSrc, palette); - LoadPalette(palette, a->paletteNum * 16, 32); - } - a->unk8[a->paletteNum].paletteCount = a->paletteNum; - a->paletteNum = a->paletteNum + 1; - b++; - } - return 1; -} - -u8 unref_sub_8125118(struct UnknownStruct1 *a, struct UnknownStruct3 *b) -{ - u16 palettes[16][16] = {0}; - u8 r7 = b->paletteCount; - u8 i; - - sub_800D238(b->paletteSrc, palettes); - for (i = a->paletteNum; i < r7; i++) - { - if (a->paletteNum + i >= 16) - return 1; - a->unk8[i].paletteSrc = b->paletteSrc; - a->unk8[i].unk4 = b->unk4 + i; - a->unk8[i].paletteCount = a->paletteNum; - LoadPalette(palettes[i], a->paletteNum * 16, sizeof(palettes[i])); - a->paletteNum++; - } - return 0; -} diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c deleted file mode 100644 index 3aa2f1fa5..000000000 --- a/src/use_pokeblock.c +++ /dev/null @@ -1,965 +0,0 @@ -// -// Created by Scott Norton on 5/31/17. -// - -#include "global.h" -#include "main.h" -#include "rom4.h" -#include "string_util.h" -#include "strings.h" -#include "sprite.h" -#include "pokemon.h" -#include "pokenav.h" -#include "palette.h" -#include "text.h" -#include "menu.h" -#include "sound.h" -#include "songs.h" -#include "pokeblock.h" -#include "pokeblock_feed.h" -#include "use_pokeblock.h" - -#define GFX_TAG_CONDITIONUPDOWN 0 - -#ifdef GERMAN -extern const u16 ConditionUpDownPalette[16]; -extern const u32 ConditionUpDownTiles[0x80]; -#else -const u16 ConditionUpDownPalette[] = INCBIN_U16("graphics/misc/condition_up_down.gbapal"); -const u32 ConditionUpDownTiles[] = INCBIN_U32("graphics/misc/condition_up_down.4bpp"); -#endif - -const u32 gUnknown_08406118[] = { - MON_DATA_COOL, - MON_DATA_TOUGH, - MON_DATA_SMART, - MON_DATA_CUTE, - MON_DATA_BEAUTY -}; - -const u8 gUnknown_0840612C[] = { - 0, 4, 3, 2, 1 -}; - -const u8 *const gUnknown_08406134[] = { - OtherText_Coolness, - OtherText_Toughness, - OtherText_Smartness, - OtherText_Cuteness, - OtherText_Beauty -}; - -const struct SpriteSheet gSpriteSheet_ConditionUpDown = { - (u8 *)ConditionUpDownTiles, - sizeof ConditionUpDownTiles, - GFX_TAG_CONDITIONUPDOWN -}; - -const struct SpritePalette gSpritePalette_ConditionUpDown = { - ConditionUpDownPalette, - GFX_TAG_CONDITIONUPDOWN -}; - -const s16 gUnknown_08406158[][2] = { - {0x9c, 0x1e}, - {0x75, 0x35}, - {0x75, 0x70}, - {0xc5, 0x70}, - {0xc5, 0x35} -}; - -const struct OamData gOamData_840616C = { - .shape = 1, - .size = 2, - .priority = 1 -}; - -const union AnimCmd gSpriteAnim_8406174[] = { - ANIMCMD_FRAME(0, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_840617C[] = { - ANIMCMD_FRAME(8, 5), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_8406184[] = { - gSpriteAnim_8406174, - gSpriteAnim_840617C -}; - -const struct SpriteTemplate gSpriteTemplate_840618C = { - GFX_TAG_CONDITIONUPDOWN, - GFX_TAG_CONDITIONUPDOWN, - &gOamData_840616C, - gSpriteAnimTable_8406184, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy -}; - -asm(".text\n" - ".include \"constants/gba_constants.inc\""); - -static EWRAM_DATA struct UnkPokenavStruct_Sub1 *gUnknown_02039304 = NULL; -static EWRAM_DATA MainCallback gUnknown_02039308 = NULL; -static EWRAM_DATA struct Pokeblock *gUnknown_0203930C = NULL; -EWRAM_DATA u8 gUnknown_02039310 = 0; -EWRAM_DATA s16 gUnknown_02039312 = 0; - -extern u16 gKeyRepeatStartDelay; -extern u16 gScriptItemId; // FIXME: remove after merge of #349 Pokeblock - -void launch_c3_walk_stairs_and_run_once(void (*const)(void)); -void sub_81361E4(void); -void sub_813622C(void); -void sub_8136244(void); -void sub_8136264(void); -void sub_8136294(void); -void sub_81365A0(void); -void sub_81365C8(void); -void sub_8136638(void); -void sub_81368A4(void); -void sub_8089668(void); -void sub_8136B44(void); -u8 sub_81370E4(u8); -void sub_8136BB8(void); -s8 sub_8136C40(void); -bool8 sub_8137058(void); -void sub_8136D60(void); -void sub_8136808(void); -void sub_8136D8C(void); -u8 sub_81370A4(u8); -void sub_81369CC(void); -void sub_8136EF0(void); -void sub_8137138(void); -void sub_8136C6C(void); -bool8 sub_8136D00(void); -void sub_8136DC0(u8 *, u8, s16); -void sub_8136DA0(const u8 *); -void sub_8136F74(struct Pokeblock *, struct Pokemon *); -void sub_81371DC(struct Sprite *); - -void sub_8136130(struct Pokeblock *pokeblock, MainCallback callback) -{ - gUnknown_02039304 = &gUnknown_083DFEC4->unkD164; - gUnknown_02039304->pokeblock = pokeblock; - gUnknown_02039304->callback = callback; - gUnknown_083DFEC4->unkD162[0] = 2; - launch_c3_walk_stairs_and_run_once(sub_8136294); - SetMainCallback2(sub_8136244); -} - -void sub_8136174(void) -{ - gUnknown_02039304->pokeblock = gUnknown_0203930C; - gUnknown_02039304->callback = gUnknown_02039308; - gUnknown_02039310 = sub_81370E4(gUnknown_02039310); - gUnknown_02039304->unk56 = gUnknown_02039310 < 4 ? 0 : 1; - gUnknown_083DFEC4->unkD162[0] = 2; - launch_c3_walk_stairs_and_run_once(sub_8136294); - SetMainCallback2(sub_81361E4); -} - -void sub_81361E4(void) -{ - gUnknown_02039304->unk0(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - if (gUnknown_02039304->unk0 == sub_81365C8) - { - REG_DISPCNT = 0; - gUnknown_02039304->unk50 = 0; - SetMainCallback2(sub_813622C); - } -} - -void sub_813622C(void) -{ - sub_81368A4(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void sub_8136244(void) -{ - gUnknown_02039304->unk0(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void sub_8136264(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - sub_80F5CDC(6); - sub_8089668(); -} - -void launch_c3_walk_stairs_and_run_once(void (*const func)(void)) -{ - gUnknown_02039304->unk0 = func; - gUnknown_02039304->unk50 = 0; -} - -void sub_8136294(void) -{ - bool32 c1LinkRelatedActive; - switch (gUnknown_02039304->unk50) - { - case 0: - c1LinkRelatedActive = is_c1_link_related_active(); - gUnknown_083DFEC4->unk6DAC = c1LinkRelatedActive; - if ((bool8)c1LinkRelatedActive == FALSE) - { - gUnknown_02039304->unk55 = 0; - launch_c3_walk_stairs_and_run_once(sub_81365A0); - gUnknown_02039304->unk50++; - } - break; - case 1: - ResetSpriteData(); - FreeAllSpritePalettes(); - gUnknown_02039304->unk50++; - break; - case 2: - SetVBlankCallback(NULL); - gUnknown_02039304->unk50++; - break; - case 3: - SetUpWindowConfig(&gWindowConfig_81E7080); - gUnknown_02039304->unk50++; - break; - case 4: - MultistepInitMenuWindowBegin(&gWindowConfig_81E7080); - gUnknown_02039304->unk50++; - break; - case 5: - if (MultistepInitMenuWindowContinue()) - { - gUnknown_02039304->unk50++; - } - break; - case 6: - gUnknown_083DFEC4->unk76AA = 0; - gUnknown_083DFEC4->unk87E0 = NULL; - gUnknown_083DFEC4->unk030C = 0x20; - gUnknown_02039304->unk50++; - break; - case 7: - sub_80F2688(); - gUnknown_02039304->unk50++; - // fallthrough - case 8: - if (!sub_80F26BC()) - { - gUnknown_02039304->unk50++; - } - break; - case 9: - sub_80F2C80(1); - gUnknown_02039304->unk50++; - // fallthrough - case 10: - if (!sub_80F2CBC(1)) - { - gUnknown_02039304->unk50++; - } - break; - case 11: - gKeyRepeatStartDelay = 20; - gUnknown_083DFEC4->unk8828 = CalculatePlayerPartyCount(); - gUnknown_083DFEC4->unk9344 = 0; - gUnknown_083DFEC4->unk8768 = NULL; - sub_80F4BD0(); - gUnknown_083DFEC4->unkD160 = 0; - gUnknown_02039304->unk50++; - break; - case 12: - if (!sub_80F1778()) - { - REG_BG2VOFS = 6; - REG_BG3VOFS = 6; - gUnknown_02039304->unk50++; - } - break; - case 13: - sub_80F2E18(0); - gUnknown_083DFEC4->unk8768->unk26 = 0xffd8; - gUnknown_02039304->unk50++; - break; - case 14: - if (!sub_80F170C()) - { - gUnknown_02039304->unk50++; - } - break; - case 15: - sub_80F33A8(); - gUnknown_02039304->unk50++; - break; - case 16: - DmaClear32(3, BG_SCREEN_ADDR(31), 0x800); - REG_BG1VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1CNT = BGCNT_SCREENBASE(31); - gUnknown_02039304->unk50++; - break; - case 17: - sub_80F567C(&gUnknown_083DFEC4->unk8ff0, gUnknown_083DFEC4->unk9004); - sub_80F5B38(); - gUnknown_02039304->unk50++; - break; - case 18: - if (!sub_80F5B50()) - { - gUnknown_02039304->unk50++; - } - break; - case 19: - sub_80F556C(gUnknown_083DFEC4->unk9004); - gUnknown_02039304->unk50++; - break; - case 20: - sub_80F1934(); - gUnknown_02039304->unk50++; - break; - case 21: - REG_WIN0H = 0xf0; - REG_WIN1H = 0x9b; - REG_WIN0V = 0x3273; - REG_WIN1V = 0x3273; - REG_WININ = 0x3f3f; - REG_WINOUT = 0x1b; - REG_BG0VOFS = 0x28; - REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; - // fallthrough - case 22: - gUnknown_02039304->unk55 = 1; - launch_c3_walk_stairs_and_run_once(sub_81365C8); - break; - } -} - -void sub_81365A0(void) -{ - while (!gUnknown_02039304->unk55) - { - sub_8136294(); - } -} - -void sub_81365C8(void) -{ - switch (gUnknown_02039304->unk50) - { - case 0: - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - SetVBlankCallback(sub_8136264); - gUnknown_02039304->unk50++; - break; - case 1: - if (!gPaletteFade.active) - { - sub_80F3C94(); - sub_80F3D00(); - launch_c3_walk_stairs_and_run_once(sub_8136638); - } - break; - } -} - -void sub_8136638(void) -{ - switch (gUnknown_02039304->unk50) - { - case 0: - if (gMain.heldKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - sub_80F5060(TRUE); - move_anim_execute(); - gUnknown_02039304->unk50 = 1; - } - else if (gMain.heldKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - sub_80F5060(FALSE); - move_anim_execute(); - gUnknown_02039304->unk50 = 1; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_02039304->unk50 = 3; - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gUnknown_083DFEC4->unk87DC == gUnknown_083DFEC4->unk87DA - 1) - { - gUnknown_02039304->unk50 = 3; - } - else - { - gUnknown_02039304->unk50 = 5; - } - } - break; - case 1: - if (!gpu_sync_bg_show()) - { - gUnknown_02039304->unk50++; - } - break; - case 2: - if (!sub_8055870()) - { - sub_80F1934(); - sub_80F3D00(); - gUnknown_02039304->unk50 = 0; - } - break; - case 3: - launch_c3_walk_stairs_and_run_once(sub_8136B44); - break; - case 4: - break; - case 5: - sub_8136BB8(); - gUnknown_02039304->unk50++; - break; - case 6: - switch (sub_8136C40()) - { - case 1: - case -1: - gUnknown_02039304->unk50 = 0; - break; - case 0: - if (sub_8137058()) - { - sub_8136D60(); - gUnknown_02039304->unk50 = 7; - } - else - { - launch_c3_walk_stairs_and_run_once(sub_8136808); - } - break; - } - break; - case 7: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - sub_8136D8C(); - gUnknown_02039304->unk50 = 0; - } - break; - } -} - -void sub_8136808(void) -{ - switch (gUnknown_02039304->unk50) - { - case 0: - gUnknown_02039310 = sub_81370A4(gUnknown_083DFEC4->unk87DC); - gUnknown_02039308 = gUnknown_02039304->callback; - gUnknown_0203930C = gUnknown_02039304->pokeblock; - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_02039304->unk50++; - break; - case 1: - if (!gPaletteFade.active) - { - gMain.savedCallback = sub_8136174; - SetMainCallback2(sub_8147ADC); - } - break; - } -} - -void sub_81368A4(void) -{ - switch (gUnknown_02039304->unk50) - { - case 0: - if (gUnknown_083DFEC4->unk87DC != gUnknown_02039310) - { - sub_80F5060(gUnknown_02039304->unk56); - gUnknown_02039304->unk50++; - } - else - { - gUnknown_02039304->unk50 = 3; - } - break; - case 1: - if (!gpu_sync_bg_show()) - { - gUnknown_02039304->unk50++; - } - break; - case 2: - if (!sub_8055870()) - { - sub_80F1934(); - gUnknown_02039304->unk50 = 0; - } - break; - case 3: - BlendPalettes(-1, 16, 0); - gUnknown_02039304->unk50++; - break; - case 4: - REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; - gUnknown_02039304->unk50++; - break; - case 5: - SetVBlankCallback(sub_8136264); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - gUnknown_02039304->unk50++; - break; - case 6: - if (!gPaletteFade.active) - { - sub_80F3C94(); - sub_80F3D00(); - launch_c3_walk_stairs_and_run_once(sub_81369CC); - SetMainCallback2(sub_8136244); - } - break; - } -} - -void sub_81369CC(void) -{ - switch (gUnknown_02039304->unk50) - { - case 0: - gUnknown_02039304->pokemon = &gPlayerParty[0]; - gUnknown_02039304->pokemon = &gPlayerParty[gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].partyIdx]; - move_anim_execute(); - gUnknown_02039304->unk50++; - break; - case 1: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - gUnknown_02039304->unk50++; - break; - case 2: - sub_8136EF0(); - sub_80F567C(gUnknown_02039304->unk5c, gUnknown_083DFEC4->unk9040); - sub_80F5550(gUnknown_083DFEC4->unk9004[gUnknown_083DFEC4->unk8fe9], gUnknown_083DFEC4->unk9040); - sub_8137138(); - gUnknown_02039304->unk50++; - break; - case 3: - if (!sub_80F555C()) - { - sub_80F7224(sub_81370A4(gUnknown_083DFEC4->unk87DC)); - sub_80F3D00(); - gUnknown_02039304->unk52 = 0; - gUnknown_02039304->unk50++; - } - break; - case 4: - if ((++gUnknown_02039304->unk52) > 16) - { - sub_8136C6C(); - gUnknown_02039304->unk50++; - } - break; - case 5: - if (gMain.newKeys & (A_BUTTON | B_BUTTON) && !sub_8136D00()) - { - sub_810CA6C((u8)gScriptItemId); - launch_c3_walk_stairs_and_run_once(sub_8136B44); - } - break; - } -} - -void sub_8136B44(void) -{ - switch (gUnknown_02039304->unk50) - { - case 0: - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_02039304->unk50++; - break; - case 1: - if (!gPaletteFade.active) - { - gUnknown_02039304->unk50 = 2; - } - break; - case 2: - sub_80F5BDC(); - gUnknown_02039304->unk50++; - break; - case 3: - SetMainCallback2(gUnknown_02039304->callback); - break; - } -} - -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); - DisplayYesNoMenu(23, 10, 1); - MoveMenuCursor(0); -} - -s8 sub_8136C40(void) -{ - s8 retval = ProcessMenuInputNoWrap(); - if ((u8)(retval + 1) < 3) - { - MenuZeroFillScreen(); - BasicInitMenuWindow(&gWindowConfig_81E7080); - } - return retval; -} - -void sub_8136C6C(void) -{ - BasicInitMenuWindow(&gWindowConfig_81E709C); - MenuDrawTextWindow(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) - { - sub_8136DC0(gUnknown_02039304->stringBuffer, gUnknown_02039304->unk53, gUnknown_02039304->unk61[gUnknown_02039304->unk53]); - } - else - { - sub_8136DC0(gUnknown_02039304->stringBuffer, gUnknown_02039304->unk53, 0); - } - sub_8136DA0(gUnknown_02039304->stringBuffer); -} - -#ifdef NONMATCHING -bool8 sub_8136D00(void) -{ - while (1) - { - if (++gUnknown_02039304->unk53 >= 5) - { - break; - } - if (gUnknown_02039304->unk61[gUnknown_02039304->unk53] != 0) - { - sub_8136DC0(gUnknown_02039304->stringBuffer, gUnknown_02039304->unk53, gUnknown_02039304->unk61[gUnknown_02039304->unk53]); - sub_8136DA0(gUnknown_02039304->stringBuffer); - return TRUE; - } - } - gUnknown_02039304->unk53 = 5; - return FALSE; -} -#else -__attribute__((naked)) -bool8 sub_8136D00(void) -{ - asm_unified("\tpush {r4,r5,lr}\n" - "\tldr r4, _08136D30 @ =gUnknown_02039304\n" - "\tadds r3, r4, 0\n" - "\tmovs r5, 0x5\n" - "_08136D08:\n" - "\tldr r0, [r3]\n" - "\tadds r0, 0x53\n" - "\tldrb r1, [r0]\n" - "\tadds r1, 0x1\n" - "\tstrb r1, [r0]\n" - "\tldr r2, [r3]\n" - "\tadds r1, r2, 0\n" - "\tadds r1, 0x53\n" - "\tldrb r0, [r1]\n" - "\tcmp r0, 0x4\n" - "\tbhi _08136D34\n" - "\tadds r0, r2, 0\n" - "\tadds r0, 0x61\n" - "\tldrb r1, [r1]\n" - "\tadds r0, r1\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _08136D3A\n" - "\tb _08136D08\n" - "\t.align 2, 0\n" - "_08136D30: .4byte gUnknown_02039304\n" - "_08136D34:\n" - "\tstrb r5, [r1]\n" - "\tmovs r0, 0\n" - "\tb _08136D5A\n" - "_08136D3A:\n" - "\tldr r2, [r4]\n" - "\tadds r0, r2, 0\n" - "\tadds r0, 0x10\n" - "\tadds r1, r2, 0\n" - "\tadds r1, 0x53\n" - "\tldrb r1, [r1]\n" - "\tadds r2, 0x61\n" - "\tadds r2, r1\n" - "\tldrb r2, [r2]\n" - "\tbl sub_8136DC0\n" - "\tldr r0, [r4]\n" - "\tadds r0, 0x10\n" - "\tbl sub_8136DA0\n" - "\tmovs r0, 0x1\n" - "_08136D5A:\n" - "\tpop {r4,r5}\n" - "\tpop {r1}\n" - "\tbx r1"); -} -#endif - -void sub_8136D60(void) -{ - BasicInitMenuWindow(&gWindowConfig_81E709C); - MenuDrawTextWindow(0, 16, 29, 19); - MenuPrint(gOtherText_WontEat, 1, 17); -} - -void sub_8136D8C(void) -{ - MenuZeroFillScreen(); - BasicInitMenuWindow(&gWindowConfig_81E7080); -} - -void sub_8136DA0(const u8 *message) -{ - MenuDrawTextWindow(0, 16, 29, 19); - MenuPrint(message, 1, 17); -} - -#ifdef NONMATCHING -void sub_8136DC0(u8 *dest, u8 a1, s16 a2) -{ - u16 v0 = a2; - if (a2 != 0) - { - if ((v0 = max(a2, 0)) == 0); - StringCopy(dest, gUnknown_08406134[a1]); - StringAppend(dest, gOtherText_WasEnhanced); - } - else - { - StringCopy(dest, gOtherText_NothingChanged); - } -} -#else -__attribute__((naked)) -void sub_8136DC0(u8 *dest, u8 a1, s16 a2) -{ - asm_unified("\tpush {r4,lr}\n" - "\tadds r4, r0, 0\n" - "\tlsls r1, 24\n" - "\tlsrs r3, r1, 24\n" - "\tlsls r2, 16\n" - "\tlsrs r0, r2, 16\n" - "\tasrs r2, 16\n" - "\tcmp r2, 0\n" - "\tbeq _08136DFC\n" - "\tcmp r2, 0\n" - "\tble _08136DD8\n" - "\tmovs r0, 0\n" - "_08136DD8:\n" - "\tlsls r0, 16\n" - "\tldr r1, _08136DF4 @ =gUnknown_08406134\n" - "\tlsls r0, r3, 2\n" - "\tadds r0, r1\n" - "\tldr r1, [r0]\n" - "\tadds r0, r4, 0\n" - "\tbl StringCopy\n" - "\tldr r1, _08136DF8 @ =gOtherText_WasEnhanced\n" - "\tadds r0, r4, 0\n" - "\tbl StringAppend\n" - "\tb _08136E04\n" - "\t.align 2, 0\n" - "_08136DF4: .4byte gUnknown_08406134\n" - "_08136DF8: .4byte gOtherText_WasEnhanced\n" - "_08136DFC:\n" - "\tldr r1, _08136E0C @ =gOtherText_NothingChanged\n" - "\tadds r0, r4, 0\n" - "\tbl StringCopy\n" - "_08136E04:\n" - "\tpop {r4}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08136E0C: .4byte gOtherText_NothingChanged"); -} -#endif - -void sub_8136E10(struct Pokemon *pokemon, u8 *data) -{ - u16 i; - for (i=0; i<5; i++) - { - data[i] = GetMonData(pokemon, gUnknown_08406118[i]); - } -} - -void sub_8136E40(struct Pokeblock *pokeblock, struct Pokemon *pokemon) -{ - u16 i; - s16 cstat; - u8 data; - if (GetMonData(pokemon, MON_DATA_SHEEN) != 255) - { - sub_8136F74(pokeblock, pokemon); - for (i=0; i<5; i++) - { - data = GetMonData(pokemon, gUnknown_08406118[i]); - cstat = data + gUnknown_02039304->unk66[i]; - if (cstat < 0) - cstat = 0; - if (cstat > 255) - cstat = 255; - data = cstat; - SetMonData(pokemon, gUnknown_08406118[i], &data); - } - cstat = (u8)GetMonData(pokemon, MON_DATA_SHEEN); - cstat = cstat + pokeblock->feel; - if (cstat > 255) - cstat = 255; - data = cstat; - SetMonData(pokemon, MON_DATA_SHEEN, &data); - } -} - -void sub_8136EF0(void) -{ - u16 i; - struct Pokemon *pokemon = gPlayerParty; - pokemon += gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].partyIdx; - sub_8136E10(pokemon, gUnknown_02039304->unk57); - sub_8136E40(gUnknown_02039304->pokeblock, pokemon); - sub_8136E10(pokemon, gUnknown_02039304->unk5c); - for (i=0; i<5; i++) - { - gUnknown_02039304->unk61[i] = gUnknown_02039304->unk5c[i] - gUnknown_02039304->unk57[i]; - } -} - -void sub_8136F74(struct Pokeblock *pokeblock, struct Pokemon *pokemon) -{ - s8 direction; - s8 i; - s16 amount; - s8 boost; - s8 taste; - gUnknown_02039304->unk66[0] = pokeblock->spicy; - gUnknown_02039304->unk66[1] = pokeblock->sour; - gUnknown_02039304->unk66[2] = pokeblock->bitter; - gUnknown_02039304->unk66[3] = pokeblock->sweet; - gUnknown_02039304->unk66[4] = pokeblock->dry; - if (gUnknown_02039312 > 0) - direction = 1; - else if (gUnknown_02039312 < 0) - direction = -1; - else - return; - for (i=0; i<5; i++) - { - amount = gUnknown_02039304->unk66[i]; - boost = amount / 10; - if (amount % 10 >= 5) // round to the nearest - boost++; - taste = sub_8040A54(pokemon, gUnknown_0840612C[i]); - if (taste == direction) - { - gUnknown_02039304->unk66[i] += boost * taste; - } - } -} - -bool8 sub_8137058(void) -{ - struct Pokemon *pokemon = gPlayerParty; - pokemon += gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].partyIdx; - if (GetMonData(pokemon, MON_DATA_SHEEN) == 255) - return TRUE; - return FALSE; -} - -u8 sub_81370A4(u8 a0) -{ - u8 i; - for (i=0; iunk54 = 0; - for (flavor=0; flavor<5; flavor++) - { - if (gUnknown_02039304->unk61[flavor] != 0) - { - spriteidx = CreateSprite(&gSpriteTemplate_840618C, gUnknown_08406158[flavor][0], gUnknown_08406158[flavor][1], 0); - if (spriteidx != MAX_SPRITES) - { - if (gUnknown_02039304->unk61[flavor] != 0) - { - gSprites[spriteidx].callback = sub_81371DC; - } - gUnknown_02039304->unk54++; - } - } - } -} - -void sub_81371DC(struct Sprite *sprite) -{ - if (sprite->data0 <= 5) - sprite->pos2.y -= 2; - else if (sprite->data0 <= 11) - sprite->pos2.y += 2; - if ((++sprite->data0) > 60) - { - DestroySprite(sprite); - gUnknown_02039304->unk54--; - } -} diff --git a/src/util.c b/src/util.c deleted file mode 100644 index 582b9f806..000000000 --- a/src/util.c +++ /dev/null @@ -1,525 +0,0 @@ -#include "global.h" -#include "util.h" - -const u32 gBitTable[] = -{ - 1 << 0, - 1 << 1, - 1 << 2, - 1 << 3, - 1 << 4, - 1 << 5, - 1 << 6, - 1 << 7, - 1 << 8, - 1 << 9, - 1 << 10, - 1 << 11, - 1 << 12, - 1 << 13, - 1 << 14, - 1 << 15, - 1 << 16, - 1 << 17, - 1 << 18, - 1 << 19, - 1 << 20, - 1 << 21, - 1 << 22, - 1 << 23, - 1 << 24, - 1 << 25, - 1 << 26, - 1 << 27, - 1 << 28, - 1 << 29, - 1 << 30, - 1 << 31, -}; - -static const struct SpriteTemplate gInvisibleSpriteTemplate = -{ - .tileTag = 0, - .paletteTag = 0, - .oam = &gDummyOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -static const u8 gSpriteDimensions[3][4][2] = -{ - // square - { - {1, 1}, - {2, 2}, - {4, 4}, - {8, 8}, - }, - - // horizontal rectangle - { - {2, 1}, - {4, 1}, - {4, 2}, - {8, 4}, - }, - - // vertical rectangle - { - {1, 2}, - {1, 4}, - {2, 4}, - {4, 8}, - }, -}; - -static const u16 gCrc16Table[] = -{ - 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, - 0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7, - 0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E, - 0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876, - 0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD, - 0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5, - 0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C, - 0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974, - 0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB, - 0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3, - 0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A, - 0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72, - 0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9, - 0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1, - 0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738, - 0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70, - 0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7, - 0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF, - 0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036, - 0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E, - 0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5, - 0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD, - 0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134, - 0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C, - 0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3, - 0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB, - 0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232, - 0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A, - 0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1, - 0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9, - 0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330, - 0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78, -}; - -const u8 gMiscBlank_Gfx[] = INCBIN_U8("graphics/interface/blank.4bpp"); - - -u8 CreateInvisibleSpriteWithCallback(void (*callback)(struct Sprite *)) -{ - u8 sprite = CreateSprite(&gInvisibleSpriteTemplate, 248, 168, 14); - gSprites[sprite].invisible = TRUE; - gSprites[sprite].callback = callback; - return sprite; -} - -void StoreWordInTwoHalfwords(u16 *h, u32 w) -{ - h[0] = (u16)(w); - h[1] = (u16)(w >> 16); -} - -void LoadWordFromTwoHalfwords(u16 *h, u32 *w) -{ - *w = h[0] | (s16)h[1] << 16; -} - -void SetBgAffineStruct(struct BgAffineSrcData *src, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha) -{ - src->texX = texX; - src->texY = texY; - src->scrX = scrX; - src->scrY = scrY; - src->sx = sx; - src->sy = sy; - src->alpha = alpha; -} - -void DoBgAffineSet(struct BgAffineDstData *dest, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha) -{ - struct BgAffineSrcData src; - - SetBgAffineStruct(&src, texX, texY, scrX, scrY, sx, sy, alpha); - BgAffineSet(&src, dest, 1); -} - -#ifdef NONMATCHING - -// Functionally equivalent. -// Only the two yflip loops don't match. -void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) -{ - u8 x, y; - s8 i, j; - u8 xflip[32]; - u8 h = gSpriteDimensions[shape][size][1]; - u8 w = gSpriteDimensions[shape][size][0]; - - for (y = 0; y < h; y++) - { - int filler = 32 - w; - - for (x = 0; x < w; x++) - { - int tile = (*tilemap & 0x3ff) * 32; - int attr = *tilemap & 0xc00; - - if (attr == 0) - { - void *src = tiles + tile; - void *dest = output; - int length = 32; - DmaCopy32(3, src, dest, length); - } - else if (attr == 0x800) // yflip - { - for (i = 0; i < 8; i++) - { - void *src = tiles; - void *dest = output; - int length = 4; - // this is likely wrong, but makes it closer to matching - src += tile + (7 - i) * 4; - dest += i * 4; - DmaCopy32(3, src, dest, length); - } - } - else // xflip - { - for (i = 0; i < 8; i++) - { - for (j = 0; j < 4; j++) - { - u8 i2 = i * 4; - xflip[i2 + (3-j)] = (tiles[tile + i2 + j] & 0xf) << 4; - xflip[i2 + (3-j)] |= tiles[tile + i2 + j] >> 4; - } - } - if (*tilemap & 0x800) // yflip - { - for (i = 0; i < 8; i++) - { - void *src = xflip + (7-i) * 4; - void *dest = output + i*4; - int length = 4; - DmaCopy32(3, src, dest, length); - } - } - else - { - void *src = xflip; - void *dest = output; - int length = 32; - DmaCopy32(3, src, dest, length); - } - } - tilemap++; - output += 32; - } - tilemap += filler; - } -} - -#else - -__attribute__((naked)) void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) -{ - asm("\n" - " .syntax unified\n" - " push {r4-r7,lr}\n" - " mov r7, r10\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5-r7}\n" - " sub sp, 0x3C\n" - " str r2, [sp, 0x20]\n" - " adds r4, r3, 0\n" - " ldr r7, [sp, 0x5C]\n" - " lsls r0, 24\n" - " lsls r1, 24\n" - " ldr r2, _08041008 @ =gSpriteDimensions\n" - " lsrs r1, 23\n" - " lsrs r0, 21\n" - " adds r1, r0\n" - " adds r0, r2, 0x1\n" - " adds r0, r1, r0\n" - " ldrb r0, [r0]\n" - " str r0, [sp, 0x24]\n" - " adds r1, r2\n" - " ldrb r1, [r1]\n" - " str r1, [sp, 0x28]\n" - " movs r1, 0\n" - " cmp r1, r0\n" - " bcc _08040FB4\n" - " b _08041136\n" - "_08040FB4:\n" - " movs r0, 0x20\n" - " ldr r2, [sp, 0x28]\n" - " subs r0, r2\n" - " lsls r0, 1\n" - " str r0, [sp, 0x2C]\n" - "_08040FBE:\n" - " movs r2, 0\n" - " adds r1, 0x1\n" - " str r1, [sp, 0x34]\n" - " ldr r3, [sp, 0x28]\n" - " cmp r2, r3\n" - " bcc _08040FCC\n" - " b _08041124\n" - "_08040FCC:\n" - " ldr r0, _0804100C @ =0x040000d4\n" - " mov r8, r0\n" - "_08040FD0:\n" - " ldrh r1, [r4]\n" - " ldr r0, _08041010 @ =0x000003ff\n" - " ands r0, r1\n" - " lsls r0, 5\n" - " mov r12, r0\n" - " movs r0, 0xC0\n" - " lsls r0, 4\n" - " ands r0, r1\n" - " mov r3, sp\n" - " strh r1, [r3, 0x38]\n" - " cmp r0, 0\n" - " bne _08041018\n" - " ldr r0, [sp, 0x20]\n" - " add r0, r12\n" - " mov r1, r8\n" - " str r0, [r1]\n" - " str r7, [r1, 0x4]\n" - " ldr r3, _08041014 @ =0x84000008\n" - " str r3, [r1, 0x8]\n" - " ldr r0, [r1, 0x8]\n" - " adds r4, 0x2\n" - " str r4, [sp, 0x30]\n" - " adds r7, 0x20\n" - " mov r10, r7\n" - " adds r2, 0x1\n" - " mov r9, r2\n" - " b _08041112\n" - " .align 2, 0\n" - "_08041008: .4byte gSpriteDimensions\n" - "_0804100C: .4byte 0x040000d4\n" - "_08041010: .4byte 0x000003ff\n" - "_08041014: .4byte 0x84000008\n" - "_08041018:\n" - " movs r1, 0x80\n" - " lsls r1, 4\n" - " cmp r0, r1\n" - " bne _08041068\n" - " movs r3, 0\n" - " adds r4, 0x2\n" - " str r4, [sp, 0x30]\n" - " movs r0, 0x20\n" - " adds r0, r7\n" - " mov r10, r0\n" - " adds r2, 0x1\n" - " mov r9, r2\n" - " ldr r4, _08041060 @ =0x040000d4\n" - " ldr r6, _08041064 @ =0x84000001\n" - " movs r5, 0x7\n" - "_08041036:\n" - " lsls r2, r3, 24\n" - " asrs r2, 24\n" - " subs r0, r5, r2\n" - " lsls r0, 2\n" - " add r0, r12\n" - " ldr r1, [sp, 0x20]\n" - " adds r0, r1, r0\n" - " lsls r1, r2, 2\n" - " adds r1, r7, r1\n" - " str r0, [r4]\n" - " str r1, [r4, 0x4]\n" - " str r6, [r4, 0x8]\n" - " ldr r0, [r4, 0x8]\n" - " adds r2, 0x1\n" - " lsls r2, 24\n" - " lsrs r3, r2, 24\n" - " asrs r2, 24\n" - " cmp r2, 0x7\n" - " ble _08041036\n" - " b _08041112\n" - " .align 2, 0\n" - "_08041060: .4byte 0x040000d4\n" - "_08041064: .4byte 0x84000001\n" - "_08041068:\n" - " movs r3, 0\n" - " adds r4, 0x2\n" - " str r4, [sp, 0x30]\n" - " movs r0, 0x20\n" - " adds r0, r7\n" - " mov r10, r0\n" - " adds r2, 0x1\n" - " mov r9, r2\n" - "_08041078:\n" - " movs r2, 0\n" - " lsls r4, r3, 24\n" - " lsls r0, r4, 2\n" - " lsrs r0, 24\n" - " adds r6, r0, 0x3\n" - " mov r1, r12\n" - " adds r5, r1, r0\n" - "_08041086:\n" - " lsls r1, r2, 24\n" - " asrs r1, 24\n" - " subs r0, r6, r1\n" - " mov r2, sp\n" - " adds r3, r2, r0\n" - " adds r0, r5, r1\n" - " ldr r2, [sp, 0x20]\n" - " adds r0, r2, r0\n" - " ldrb r2, [r0]\n" - " movs r0, 0xF\n" - " ands r0, r2\n" - " lsls r0, 4\n" - " lsrs r2, 4\n" - " orrs r0, r2\n" - " strb r0, [r3]\n" - " adds r1, 0x1\n" - " lsls r1, 24\n" - " lsrs r2, r1, 24\n" - " asrs r1, 24\n" - " cmp r1, 0x3\n" - " ble _08041086\n" - " movs r3, 0x80\n" - " lsls r3, 17\n" - " adds r0, r4, r3\n" - " lsrs r3, r0, 24\n" - " asrs r0, 24\n" - " cmp r0, 0x7\n" - " ble _08041078\n" - " movs r0, 0x80\n" - " lsls r0, 4\n" - " mov r1, sp\n" - " ldrh r1, [r1, 0x38]\n" - " ands r0, r1\n" - " cmp r0, 0\n" - " beq _08041104\n" - " movs r3, 0\n" - " ldr r4, _080410FC @ =0x040000d4\n" - " ldr r6, _08041100 @ =0x84000001\n" - " movs r5, 0x7\n" - "_080410D4:\n" - " lsls r1, r3, 24\n" - " asrs r1, 24\n" - " subs r0, r5, r1\n" - " lsls r0, 2\n" - " mov r3, sp\n" - " adds r2, r3, r0\n" - " lsls r0, r1, 2\n" - " adds r0, r7, r0\n" - " str r2, [r4]\n" - " str r0, [r4, 0x4]\n" - " str r6, [r4, 0x8]\n" - " ldr r0, [r4, 0x8]\n" - " adds r1, 0x1\n" - " lsls r1, 24\n" - " lsrs r3, r1, 24\n" - " asrs r1, 24\n" - " cmp r1, 0x7\n" - " ble _080410D4\n" - " b _08041112\n" - " .align 2, 0\n" - "_080410FC: .4byte 0x040000d4\n" - "_08041100: .4byte 0x84000001\n" - "_08041104:\n" - " mov r0, sp\n" - " mov r1, r8\n" - " str r0, [r1]\n" - " str r7, [r1, 0x4]\n" - " ldr r2, _08041148 @ =0x84000008\n" - " str r2, [r1, 0x8]\n" - " ldr r0, [r1, 0x8]\n" - "_08041112:\n" - " ldr r4, [sp, 0x30]\n" - " mov r7, r10\n" - " mov r3, r9\n" - " lsls r0, r3, 24\n" - " lsrs r2, r0, 24\n" - " ldr r0, [sp, 0x28]\n" - " cmp r2, r0\n" - " bcs _08041124\n" - " b _08040FD0\n" - "_08041124:\n" - " ldr r1, [sp, 0x2C]\n" - " adds r4, r1\n" - " ldr r2, [sp, 0x34]\n" - " lsls r0, r2, 24\n" - " lsrs r1, r0, 24\n" - " ldr r3, [sp, 0x24]\n" - " cmp r1, r3\n" - " bcs _08041136\n" - " b _08040FBE\n" - "_08041136:\n" - " add sp, 0x3C\n" - " pop {r3-r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov r10, r5\n" - " pop {r4-r7}\n" - " pop {r0}\n" - " bx r0\n" - " .align 2, 0\n" - "_08041148: .4byte 0x84000008\n" - " .syntax divided\n" - ); -} - -#endif - -int CountTrailingZeroBits(u32 value) -{ - u8 i; - - for (i = 0; i < 32; i++) - { - if ((value & 1) == 0) - value >>= 1; - else - return i; - } - return 0; -} - -u16 CalcCRC16(u8 *data, int length) -{ - u16 i, j; - u16 crc = 0x1121; - - for (i = 0; i < length; i++) - { - crc ^= data[i]; - for (j = 0; j < 8; j++) - { - if (crc & 1) - crc = (crc >> 1) ^ 0x8408; - else - crc >>= 1; - } - } - return ~crc; -} - -u16 CalcCRC16WithTable(u8 *data, int length) -{ - u16 i; - u16 crc = 0x1121; - u8 byte; - - for (i = 0; i < length; i++) - { - byte = crc >> 8; - crc ^= data[i]; - crc = byte ^ gCrc16Table[(u8)crc]; - } - return ~crc; -} diff --git a/src/wallclock.c b/src/wallclock.c deleted file mode 100644 index 8db13dc2d..000000000 --- a/src/wallclock.c +++ /dev/null @@ -1,1061 +0,0 @@ -#include "global.h" -#include "wallclock.h" -#include "decompress.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "rtc.h" -#include "songs.h" -#include "sound.h" -#include "strings2.h" -#include "task.h" -#include "trig.h" -#include "unknown_task.h" - -extern u16 gSpecialVar_0x8004; -extern u8 gMiscClock_Gfx[]; -extern u8 gUnknown_08E95774[]; -extern u8 gUnknown_08E954B0[]; -extern u16 gMiscClockMale_Pal[]; -extern u16 gMiscClockFemale_Pal[]; - -//-------------------------------------------------- -// Graphics Data -//-------------------------------------------------- - -static const u8 ClockGfx_Misc[] = INCBIN_U8("graphics/misc/clock_misc.4bpp.lz"); -static const struct CompressedSpriteSheet gUnknown_083F7A90[] = -{ - {ClockGfx_Misc, 0x2000, 0x1000}, - {NULL}, -}; -static const struct SpritePalette gUnknown_083F7AA0[] = -{ - {gMiscClockMale_Pal, 0x1000}, - {gMiscClockFemale_Pal, 0x1001}, - {NULL}, -}; -static const struct OamData gOamData_83F7AB8 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_83F7AC0[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83F7AC8[] = -{ - ANIMCMD_FRAME(64, 30), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_83F7AD0[] = -{ - gSpriteAnim_83F7AC0, -}; -static const union AnimCmd *const gSpriteAnimTable_83F7AD4[] = -{ - gSpriteAnim_83F7AC8, -}; -static void sub_810B05C(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F7AD8 = -{ - .tileTag = 0x1000, - .paletteTag = 0x1000, - .oam = &gOamData_83F7AB8, - .anims = gSpriteAnimTable_83F7AD0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810B05C, -}; -static void sub_810B0F4(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F7AF0 = -{ - .tileTag = 0x1000, - .paletteTag = 0x1000, - .oam = &gOamData_83F7AB8, - .anims = gSpriteAnimTable_83F7AD4, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810B0F4, -}; -static const struct OamData gOamData_83F7B08 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_83F7B10[] = -{ - ANIMCMD_FRAME(132, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83F7B18[] = -{ - ANIMCMD_FRAME(128, 30), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_83F7B20[] = -{ - gSpriteAnim_83F7B10, -}; -static const union AnimCmd *const gSpriteAnimTable_83F7B24[] = -{ - gSpriteAnim_83F7B18, -}; -static void sub_810B18C(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F7B28 = -{ - .tileTag = 0x1000, - .paletteTag = 0x1000, - .oam = &gOamData_83F7B08, - .anims = gSpriteAnimTable_83F7B20, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810B18C, -}; -static void sub_810B230(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F7B40 = -{ - .tileTag = 0x1000, - .paletteTag = 0x1000, - .oam = &gOamData_83F7B08, - .anims = gSpriteAnimTable_83F7B24, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810B230, -}; - -static void WallClockVblankCallback(void); -static void LoadWallClockGraphics(void); -static void WallClockMainCallback(void); -static void WallClockInit(void); -static void Task_SetClock1(u8 taskId); -static void Task_SetClock2(u8 taskId); -static void Task_SetClock3(u8 taskId); -static void Task_SetClock4(u8 taskId); -static void Task_SetClock5(u8 taskId); -static void Task_SetClock6(u8 taskId); -static void Task_ViewClock1(u8 taskId); -static void Task_ViewClock2(u8 taskId); -static void Task_ViewClock3(u8 taskId); -static void Task_ViewClock4(u8 taskId); -static u8 CalcMinHandDelta(u16 speed); -static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed); -static u8 AdvanceClock(u8 taskId, u8 direction); -static void UpdateClockPeriod(u8 taskId, u8 direction); -static void InitClockWithRtc(u8 taskId); - -enum -{ - PERIOD_AM, - PERIOD_PM, -}; - -enum -{ - MVMT_NONE, - MVMT_BACKWARD, - MVMT_FORWARD, -}; - -static void WallClockVblankCallback(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void LoadWallClockGraphics(void) -{ - u8 *addr; - u32 size; - - SetVBlankCallback(0); - REG_DISPCNT = 0; - REG_BG3CNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - 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; - } - } - DmaClear32(3, OAM, OAM_SIZE); - DmaClear16(3, PLTT, PLTT_SIZE); - - LZ77UnCompVram(gMiscClock_Gfx, (void *)VRAM); - if (gSpecialVar_0x8004 == MALE) - LoadPalette(gMiscClockMale_Pal, 0, 32); - else - LoadPalette(gMiscClockFemale_Pal, 0, 32); - remove_some_task(); - ResetTasks(); - ResetSpriteData(); - ResetPaletteFade(); - FreeAllSpritePalettes(); - LoadCompressedObjectPic(&gUnknown_083F7A90[0]); - LoadSpritePalettes(gUnknown_083F7AA0); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); -} - -static void WallClockInit(void) -{ - u16 ime; - - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - SetVBlankCallback(WallClockVblankCallback); - SetMainCallback2(WallClockMainCallback); - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG3CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | - DISPCNT_BG3_ON | DISPCNT_OBJ_ON; -} - -#define tMinuteHandAngle data[0] -#define tHourHandAngle data[1] -#define tHours data[2] -#define tMinutes data[3] -#define tMvmtDir data[4] -#define tPeriod data[5] -#define tMvmtSpeed data[6] - -//Allow player to set the clock -void CB2_StartWallClock(void) -{ - u8 taskId; - u8 spriteId; - - LoadWallClockGraphics(); - LZ77UnCompVram(&gUnknown_08E954B0, (void *)(VRAM + 0x3800)); - - taskId = CreateTask(Task_SetClock1, 0); - gTasks[taskId].tHours = 10; - gTasks[taskId].tMinutes = 0; - gTasks[taskId].tMvmtDir = MVMT_NONE; - gTasks[taskId].tPeriod = PERIOD_AM; - gTasks[taskId].tMvmtSpeed = 0; - gTasks[taskId].tMinuteHandAngle = 0; - gTasks[taskId].tHourHandAngle = 300; - - spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 1); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; - gSprites[spriteId].oam.matrixNum = 0; - - spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; - gSprites[spriteId].oam.matrixNum = 1; - - spriteId = CreateSprite(&gSpriteTemplate_83F7B28, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 2); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = 45; - - spriteId = CreateSprite(&gSpriteTemplate_83F7B40, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 2); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = 90; - - WallClockInit(); -} - -//View, but don't set, the clock -void CB2_ViewWallClock(void) -{ - u8 taskId; - s16 angle1; - s16 angle2; - u8 spriteId; - - LoadWallClockGraphics(); - LZ77UnCompVram(gUnknown_08E95774, (void *)(VRAM + 0x3800)); - - taskId = CreateTask(Task_ViewClock1, 0); - InitClockWithRtc(taskId); - if (gTasks[taskId].tPeriod == PERIOD_AM) - { - angle1 = 45; - angle2 = 90; - } - else - { - angle1 = 90; - angle2 = 135; - } - - spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, 120, 80, 1); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; - gSprites[spriteId].oam.matrixNum = 0; - - spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, 120, 80, 0); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; - gSprites[spriteId].oam.matrixNum = 1; - - spriteId = CreateSprite(&gSpriteTemplate_83F7B28, 120, 80, 2); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = angle1; - - spriteId = CreateSprite(&gSpriteTemplate_83F7B40, 120, 80, 2); - gSprites[spriteId].data0 = taskId; - gSprites[spriteId].data1 = angle2; - - WallClockInit(); -} - -static void WallClockMainCallback(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void Task_SetClock1(u8 taskId) -{ - if (!gPaletteFade.active) - gTasks[taskId].func = Task_SetClock2; -} - -//Handle keypresses when setting clock -static void Task_SetClock2(u8 taskId) -{ - if (gTasks[taskId].tMinuteHandAngle % 6) - { - gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle( - gTasks[taskId].tMinuteHandAngle, - gTasks[taskId].tMvmtDir, - gTasks[taskId].tMvmtSpeed); - } - else - { - gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6; - gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5; - if (gMain.newKeys & A_BUTTON) - { - gTasks[taskId].func = Task_SetClock3; - return; - } - else - { - gTasks[taskId].tMvmtDir = gMain.newKeys & A_BUTTON; - if (gMain.heldKeys & DPAD_LEFT) - gTasks[taskId].tMvmtDir = MVMT_BACKWARD; - if (gMain.heldKeys & DPAD_RIGHT) - gTasks[taskId].tMvmtDir = MVMT_FORWARD; - if (gTasks[taskId].tMvmtDir) - { - if (gTasks[taskId].tMvmtSpeed < 0xFF) - gTasks[taskId].tMvmtSpeed++; - gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle( - gTasks[taskId].tMinuteHandAngle, - gTasks[taskId].tMvmtDir, - gTasks[taskId].tMvmtSpeed); - AdvanceClock(taskId, gTasks[taskId].tMvmtDir); - } - else - { - gTasks[taskId].tMvmtSpeed = 0; - } - } - } -} - -//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); - InitMenu(0, 24, 9, 2, 1, 5); - gTasks[taskId].func = Task_SetClock4; -} - -//Get menu selection -static void Task_SetClock4(u8 taskId) -{ - switch (ProcessMenuInputNoWrap_()) - { - case 0: //YES - PlaySE(SE_SELECT); - gTasks[taskId].func = Task_SetClock5; //Move on - return; - case -1: //B button - case 1: //NO - HandleDestroyMenuCursors(); - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - MenuZeroFillWindowRect(2, 16, 27, 19); - gTasks[taskId].func = Task_SetClock2; //Go back and let player adjust clock - } -} - -//Set the time offset based on the wall clock's time -static void Task_SetClock5(u8 taskId) -{ - RtcInitLocalTimeOffset(gTasks[taskId].tHours, gTasks[taskId].tMinutes); - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = Task_SetClock6; -} - -static void Task_SetClock6(u8 taskId) -{ - if (!gPaletteFade.active) - SetMainCallback2((MainCallback)gMain.savedCallback); -} - -static void Task_ViewClock1(u8 taskId) -{ - if (!gPaletteFade.active) - gTasks[taskId].func = Task_ViewClock2; -} - -//Wait for A or B press -static void Task_ViewClock2(u8 taskId) -{ - InitClockWithRtc(taskId); - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - gTasks[taskId].func = Task_ViewClock3; -} - -static void Task_ViewClock3(u8 taskId) -{ - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = Task_ViewClock4; -} - -static void Task_ViewClock4(u8 taskId) -{ - if (!gPaletteFade.active) - SetMainCallback2((MainCallback)gMain.savedCallback); -} - -static u8 CalcMinHandDelta(u16 speed) -{ - if (speed > 60) - return 6; - else if (speed > 30) - return 3; - else if (speed > 10) - return 2; - else - return 1; -} - -//Calculates the new angle of the minute hand when setting the clock -static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed) -{ - u8 delta = CalcMinHandDelta(speed); - - switch (direction) - { - case MVMT_BACKWARD: - if (angle) - angle = angle - delta; - else - angle = 360 - delta; - break; - case MVMT_FORWARD: - if (angle < 360 - delta) - angle = angle + delta; - else - angle = 0; - break; - } - return angle; -} - -//Advances clock forward or backward by 1 minute -static u8 AdvanceClock(u8 taskId, u8 direction) -{ - switch (direction) - { - case MVMT_BACKWARD: - if (gTasks[taskId].tMinutes > 0) - gTasks[taskId].tMinutes--; - else - { - gTasks[taskId].tMinutes = 59; - if (gTasks[taskId].tHours > 0) - gTasks[taskId].tHours--; - else - gTasks[taskId].tHours = 23; - UpdateClockPeriod(taskId, direction); - } - break; - case MVMT_FORWARD: - if (gTasks[taskId].tMinutes < 59) - gTasks[taskId].tMinutes++; - else - { - gTasks[taskId].tMinutes = 0; - if (gTasks[taskId].tHours < 23) - gTasks[taskId].tHours++; - else - gTasks[taskId].tHours = 0; - UpdateClockPeriod(taskId, direction); - } - break; - } - return 0; -} - -//Updates the clock period (AM/PM) if it needs to change -static void UpdateClockPeriod(u8 taskId, u8 direction) -{ - u8 hours = gTasks[taskId].tHours; - - switch (direction) - { - case MVMT_BACKWARD: - switch (hours) - { - case 11: - gTasks[taskId].tPeriod = PERIOD_AM; - break; - case 23: - gTasks[taskId].tPeriod = PERIOD_PM; - break; - } - break; - case MVMT_FORWARD: - switch (hours) - { - case 0: - gTasks[taskId].tPeriod = PERIOD_AM; - break; - case 12: - gTasks[taskId].tPeriod = PERIOD_PM; - break; - } - break; - } -} - -static void InitClockWithRtc(u8 taskId) -{ - RtcCalcLocalTime(); - gTasks[taskId].tHours = gLocalTime.hours; - gTasks[taskId].tMinutes = gLocalTime.minutes; - gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6; - gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5; - if (gLocalTime.hours <= 11) - gTasks[taskId].tPeriod = PERIOD_AM; - else - gTasks[taskId].tPeriod = PERIOD_PM; -} - -static const s8 gClockHandCoords[][2] = -{ - { 0, -24}, - { 1, -25}, - { 1, -25}, - { 2, -25}, - { 2, -25}, - { 2, -25}, - { 3, -24}, - { 3, -25}, - { 4, -25}, - { 4, -25}, - { 4, -25}, - { 5, -25}, - { 5, -25}, - { 6, -24}, - { 6, -24}, - { 6, -24}, - { 7, -24}, - { 7, -24}, - { 7, -24}, - { 8, -24}, - { 8, -24}, - { 9, -24}, - { 9, -24}, - { 10, -23}, - { 10, -23}, - { 11, -22}, - { 11, -22}, - { 11, -22}, - { 12, -22}, - { 12, -21}, - { 13, -21}, - { 13, -21}, - { 13, -21}, - { 14, -21}, - { 14, -21}, - { 14, -20}, - { 14, -20}, - { 15, -20}, - { 15, -19}, - { 16, -19}, - { 16, -19}, - { 16, -19}, - { 16, -18}, - { 16, -18}, - { 17, -18}, - { 17, -17}, - { 17, -17}, - { 18, -17}, - { 18, -17}, - { 18, -16}, - { 18, -16}, - { 19, -16}, - { 19, -15}, - { 19, -15}, - { 20, -15}, - { 20, -14}, - { 20, -14}, - { 20, -13}, - { 20, -13}, - { 21, -13}, - { 21, -13}, - { 21, -12}, - { 22, -12}, - { 22, -12}, - { 22, -11}, - { 22, -11}, - { 22, -10}, - { 23, -10}, - { 23, -9}, - { 23, -9}, - { 23, -9}, - { 23, -9}, - { 23, -8}, - { 23, -8}, - { 23, -7}, - { 23, -7}, - { 23, -6}, - { 24, -6}, - { 24, -6}, - { 25, -5}, - { 25, -5}, - { 24, -4}, - { 25, -4}, - { 24, -3}, - { 25, -3}, - { 25, -3}, - { 25, -2}, - { 25, -2}, - { 24, -1}, - { 25, -1}, - { 24, 0}, - { 24, 0}, - { 24, 0}, - { 24, 1}, - { 24, 1}, - { 25, 2}, - { 24, 2}, - { 25, 2}, - { 24, 3}, - { 24, 3}, - { 25, 4}, - { 24, 4}, - { 24, 5}, - { 24, 5}, - { 24, 5}, - { 24, 6}, - { 23, 6}, - { 23, 6}, - { 23, 7}, - { 23, 8}, - { 23, 8}, - { 23, 8}, - { 23, 9}, - { 23, 9}, - { 23, 10}, - { 22, 10}, - { 22, 10}, - { 22, 11}, - { 22, 11}, - { 22, 11}, - { 22, 12}, - { 21, 12}, - { 21, 12}, - { 21, 13}, - { 20, 13}, - { 20, 13}, - { 19, 13}, - { 19, 13}, - { 19, 14}, - { 19, 14}, - { 19, 15}, - { 19, 15}, - { 18, 15}, - { 18, 16}, - { 17, 16}, - { 17, 16}, - { 17, 17}, - { 17, 17}, - { 16, 17}, - { 16, 18}, - { 16, 18}, - { 15, 18}, - { 14, 18}, - { 15, 19}, - { 14, 19}, - { 14, 19}, - { 13, 19}, - { 13, 20}, - { 13, 20}, - { 13, 20}, - { 12, 20}, - { 12, 20}, - { 12, 21}, - { 11, 21}, - { 11, 21}, - { 11, 21}, - { 10, 21}, - { 10, 22}, - { 10, 22}, - { 9, 22}, - { 9, 22}, - { 8, 22}, - { 7, 22}, - { 7, 23}, - { 7, 23}, - { 6, 23}, - { 6, 23}, - { 5, 23}, - { 5, 23}, - { 5, 24}, - { 4, 24}, - { 4, 24}, - { 4, 24}, - { 3, 24}, - { 2, 24}, - { 2, 24}, - { 1, 24}, - { 1, 24}, - { 0, 24}, - { 0, 24}, - { -1, 23}, - { 0, 24}, - { 0, 24}, - { -1, 24}, - { -1, 24}, - { -2, 24}, - { -2, 24}, - { -3, 24}, - { -3, 24}, - { -4, 24}, - { -4, 24}, - { -5, 24}, - { -5, 23}, - { -5, 23}, - { -6, 23}, - { -6, 23}, - { -7, 23}, - { -7, 23}, - { -7, 23}, - { -8, 23}, - { -8, 22}, - { -9, 22}, - { -9, 22}, - {-10, 22}, - {-10, 22}, - {-10, 21}, - {-11, 21}, - {-11, 21}, - {-11, 21}, - {-11, 20}, - {-12, 20}, - {-12, 20}, - {-13, 20}, - {-13, 20}, - {-13, 19}, - {-14, 19}, - {-14, 19}, - {-14, 19}, - {-14, 18}, - {-15, 18}, - {-15, 18}, - {-15, 17}, - {-16, 17}, - {-16, 17}, - {-17, 17}, - {-17, 16}, - {-17, 16}, - {-18, 16}, - {-17, 15}, - {-18, 15}, - {-18, 15}, - {-19, 15}, - {-19, 14}, - {-19, 14}, - {-19, 13}, - {-19, 13}, - {-20, 13}, - {-20, 12}, - {-20, 12}, - {-21, 12}, - {-21, 12}, - {-21, 11}, - {-21, 11}, - {-21, 10}, - {-21, 10}, - {-21, 9}, - {-22, 9}, - {-22, 9}, - {-22, 8}, - {-22, 8}, - {-22, 7}, - {-23, 7}, - {-23, 7}, - {-23, 6}, - {-23, 6}, - {-23, 5}, - {-24, 5}, - {-23, 4}, - {-23, 4}, - {-24, 4}, - {-24, 4}, - {-24, 3}, - {-24, 3}, - {-24, 2}, - {-24, 2}, - {-24, 1}, - {-24, 1}, - {-24, 1}, - {-24, 0}, - {-25, 0}, - {-24, -1}, - {-25, -1}, - {-24, -1}, - {-24, -2}, - {-24, -2}, - {-24, -3}, - {-24, -3}, - {-24, -4}, - {-24, -4}, - {-24, -4}, - {-24, -5}, - {-24, -5}, - {-24, -6}, - {-24, -6}, - {-23, -6}, - {-23, -7}, - {-23, -7}, - {-23, -8}, - {-23, -8}, - {-23, -9}, - {-23, -9}, - {-22, -9}, - {-22, -9}, - {-22, -10}, - {-22, -10}, - {-21, -10}, - {-21, -11}, - {-22, -11}, - {-22, -12}, - {-21, -12}, - {-21, -13}, - {-21, -13}, - {-20, -13}, - {-21, -14}, - {-20, -14}, - {-20, -14}, - {-19, -14}, - {-19, -15}, - {-19, -15}, - {-18, -16}, - {-18, -16}, - {-18, -16}, - {-18, -17}, - {-18, -17}, - {-17, -17}, - {-17, -18}, - {-17, -18}, - {-16, -18}, - {-16, -18}, - {-16, -19}, - {-16, -19}, - {-15, -19}, - {-15, -19}, - {-15, -20}, - {-14, -20}, - {-14, -20}, - {-14, -21}, - {-13, -21}, - {-13, -21}, - {-13, -21}, - {-12, -21}, - {-12, -22}, - {-11, -22}, - {-11, -22}, - {-11, -22}, - {-10, -22}, - {-10, -22}, - { -9, -22}, - { -9, -23}, - { -9, -23}, - { -8, -23}, - { -8, -23}, - { -7, -23}, - { -7, -23}, - { -7, -24}, - { -6, -24}, - { -6, -24}, - { -5, -24}, - { -5, -24}, - { -4, -24}, - { -4, -24}, - { -4, -24}, - { -4, -25}, - { -3, -25}, - { -2, -25}, - { -2, -24}, - { -2, -24}, - { -1, -25}, - { -1, -25}, - { 0, -25}, -}; - -static void sub_810B05C(struct Sprite *sprite) -{ - u16 angle; - s16 sin; - s16 cos; - u16 x; - u16 y; - - angle = gTasks[sprite->data0].tMinuteHandAngle; - sin = Sin2(angle) / 16; - cos = Cos2(angle) / 16; - SetOamMatrix(0, cos, sin, -sin, cos); - x = gClockHandCoords[angle][0]; - y = gClockHandCoords[angle][1]; - - //Manual sign extension - if (x > 0x80) - x |= 0xFF00; - if (y > 0x80) - y |= 0xFF00; - - sprite->pos2.x = x; - sprite->pos2.y = y; -} - -static void sub_810B0F4(struct Sprite *sprite) -{ - u16 angle; - s16 sin; - s16 cos; - u16 x; - u16 y; - - angle = gTasks[sprite->data0].tHourHandAngle; - sin = Sin2(angle) / 16; - cos = Cos2(angle) / 16; - SetOamMatrix(1, cos, sin, -sin, cos); - x = gClockHandCoords[angle][0]; - y = gClockHandCoords[angle][1]; - - //Manual sign extension - if (x > 0x80) - x |= 0xFF00; - if (y > 0x80) - y |= 0xFF00; - - sprite->pos2.x = x; - sprite->pos2.y = y; -} - -static void sub_810B18C(struct Sprite *sprite) -{ - s16 sin; - s16 cos; - - if (gTasks[sprite->data0].tPeriod != PERIOD_AM) - { - if (sprite->data1 >= 60 && sprite->data1 < 90) - sprite->data1 += 5; - if (sprite->data1 < 60) - sprite->data1++; - } - else - { - if (sprite->data1 > 45 && sprite->data1 <= 75) - sprite->data1 -= 5; - if (sprite->data1 > 75) - sprite->data1--; - } - cos = Cos2((u16)sprite->data1); - sprite->pos2.x = cos * 30 / 4096; - sin = Sin2((u16)sprite->data1); - sprite->pos2.y = sin * 30 / 4096; -} - -static void sub_810B230(struct Sprite *sprite) -{ - s16 sin; - s16 cos; - - if (gTasks[sprite->data0].tPeriod != PERIOD_AM) - { - if (sprite->data1 >= 105 && sprite->data1 < 135) - sprite->data1 += 5; - if (sprite->data1 < 105) - sprite->data1++; - } - else - { - if (sprite->data1 > 90 && sprite->data1 <= 120) - sprite->data1 -= 5; - if (sprite->data1 > 120) - sprite->data1--; - } - cos = Cos2((u16)sprite->data1); - sprite->pos2.x = cos * 30 / 4096; - sin = Sin2((u16)sprite->data1); - sprite->pos2.y = sin * 30 / 4096; -} diff --git a/src/wild_encounter.c b/src/wild_encounter.c deleted file mode 100644 index 96f47c067..000000000 --- a/src/wild_encounter.c +++ /dev/null @@ -1,3568 +0,0 @@ -#include "global.h" -#include "wild_encounter.h" -#include "abilities.h" -#include "battle_setup.h" -#include "event_data.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "metatile_behavior.h" -#include "pokeblock.h" -#include "rng.h" -#include "roamer.h" -#include "rom4.h" -#include "safari_zone.h" -#include "script.h" -#include "species.h" -#include "tv.h" - -const struct WildPokemon PetalburgCity_WaterMons [] = -{ - {20, 30, SPECIES_MARILL}, - {10, 20, SPECIES_MARILL}, - {30, 35, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, -}; -const struct WildPokemonInfo PetalburgCity_WaterMonsInfo = {1, PetalburgCity_WaterMons}; - -const struct WildPokemon PetalburgCity_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_CORPHISH}, - {25, 30, SPECIES_CORPHISH}, - {30, 35, SPECIES_CORPHISH}, - {20, 25, SPECIES_CORPHISH}, - {35, 40, SPECIES_CORPHISH}, - {40, 45, SPECIES_CORPHISH}, -}; -const struct WildPokemonInfo PetalburgCity_FishingMonsInfo = {10, PetalburgCity_FishingMons}; - -const struct WildPokemon SlateportCity_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo SlateportCity_WaterMonsInfo = {4, SlateportCity_WaterMons}; - -const struct WildPokemon SlateportCity_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo SlateportCity_FishingMonsInfo = {10, SlateportCity_FishingMons}; - -const struct WildPokemon LilycoveCity_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo LilycoveCity_WaterMonsInfo = {4, LilycoveCity_WaterMons}; - -const struct WildPokemon LilycoveCity_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_STARYU}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo LilycoveCity_FishingMonsInfo = {10, LilycoveCity_FishingMons}; - -const struct WildPokemon MossdeepCity_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo MossdeepCity_WaterMonsInfo = {4, MossdeepCity_WaterMons}; - -const struct WildPokemon MossdeepCity_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo MossdeepCity_FishingMonsInfo = {10, MossdeepCity_FishingMons}; - -const struct WildPokemon SootopolisCity_WaterMons [] = -{ - {5, 35, SPECIES_MAGIKARP}, - {10, 30, SPECIES_MAGIKARP}, - {15, 25, SPECIES_MAGIKARP}, - {25, 30, SPECIES_MAGIKARP}, - {25, 30, SPECIES_MAGIKARP}, -}; -const struct WildPokemonInfo SootopolisCity_WaterMonsInfo = {1, SootopolisCity_WaterMons}; - -const struct WildPokemon SootopolisCity_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, -#ifdef SAPPHIRE - {5, 10, SPECIES_TENTACOOL}, -#else - {10, 15, SPECIES_MAGIKARP}, -#endif - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_MAGIKARP}, - {30, 35, SPECIES_MAGIKARP}, - {30, 35, SPECIES_MAGIKARP}, - {35, 40, SPECIES_GYARADOS}, - {35, 45, SPECIES_GYARADOS}, - {5, 45, SPECIES_GYARADOS}, -}; -const struct WildPokemonInfo SootopolisCity_FishingMonsInfo = {10, SootopolisCity_FishingMons}; - -const struct WildPokemon EverGrandeCity_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo EverGrandeCity_WaterMonsInfo = {4, EverGrandeCity_WaterMons}; - -const struct WildPokemon EverGrandeCity_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_LUVDISC}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_LUVDISC}, - {30, 35, SPECIES_WAILMER}, - {30, 35, SPECIES_CORSOLA}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo EverGrandeCity_FishingMonsInfo = {10, EverGrandeCity_FishingMons}; - -const struct WildPokemon MeteorFalls_1F_1R_LandMons [] = -{ - {16, 16, SPECIES_ZUBAT}, - {17, 17, SPECIES_ZUBAT}, - {18, 18, SPECIES_ZUBAT}, - {15, 15, SPECIES_ZUBAT}, - {14, 14, SPECIES_ZUBAT}, -#ifdef SAPPHIRE - {16, 16, SPECIES_LUNATONE}, - {18, 18, SPECIES_LUNATONE}, - {14, 14, SPECIES_LUNATONE}, -#else - {16, 16, SPECIES_SOLROCK}, - {18, 18, SPECIES_SOLROCK}, - {14, 14, SPECIES_SOLROCK}, -#endif - {19, 19, SPECIES_ZUBAT}, - {20, 20, SPECIES_ZUBAT}, - {19, 19, SPECIES_ZUBAT}, - {20, 20, SPECIES_ZUBAT}, -}; -const struct WildPokemonInfo MeteorFalls_1F_1R_LandMonsInfo = {10, MeteorFalls_1F_1R_LandMons}; - -const struct WildPokemon MeteorFalls_1F_1R_WaterMons [] = -{ - {5, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_ZUBAT}, -#ifdef SAPPHIRE - {25, 35, SPECIES_LUNATONE}, - {15, 25, SPECIES_LUNATONE}, - {5, 15, SPECIES_LUNATONE}, -#else - {25, 35, SPECIES_SOLROCK}, - {15, 25, SPECIES_SOLROCK}, - {5, 15, SPECIES_SOLROCK}, -#endif -}; -const struct WildPokemonInfo MeteorFalls_1F_1R_WaterMonsInfo = {4, MeteorFalls_1F_1R_WaterMons}; - -const struct WildPokemon MeteorFalls_1F_1R_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {20, 25, SPECIES_BARBOACH}, - {35, 40, SPECIES_BARBOACH}, - {40, 45, SPECIES_BARBOACH}, -}; -const struct WildPokemonInfo MeteorFalls_1F_1R_FishingMonsInfo = {30, MeteorFalls_1F_1R_FishingMons}; - -const struct WildPokemon MeteorFalls_1F_2R_LandMons [] = -{ - {33, 33, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {35, 35, SPECIES_LUNATONE}, - {33, 33, SPECIES_LUNATONE}, - {37, 37, SPECIES_LUNATONE}, -#else - {35, 35, SPECIES_SOLROCK}, - {33, 33, SPECIES_SOLROCK}, - {37, 37, SPECIES_SOLROCK}, -#endif - {35, 35, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {39, 39, SPECIES_LUNATONE}, -#else - {39, 39, SPECIES_SOLROCK}, -#endif - {38, 38, SPECIES_GOLBAT}, - {40, 40, SPECIES_GOLBAT}, - {38, 38, SPECIES_GOLBAT}, - {40, 40, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo MeteorFalls_1F_2R_LandMonsInfo = {10, MeteorFalls_1F_2R_LandMons}; - -const struct WildPokemon MeteorFalls_1F_2R_WaterMons [] = -{ - {30, 35, SPECIES_GOLBAT}, - {30, 35, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {25, 35, SPECIES_LUNATONE}, - {15, 25, SPECIES_LUNATONE}, - {5, 15, SPECIES_LUNATONE}, -#else - {25, 35, SPECIES_SOLROCK}, - {15, 25, SPECIES_SOLROCK}, - {5, 15, SPECIES_SOLROCK}, -#endif -}; -const struct WildPokemonInfo MeteorFalls_1F_2R_WaterMonsInfo = {4, MeteorFalls_1F_2R_WaterMons}; - -const struct WildPokemon MeteorFalls_1F_2R_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {30, 35, SPECIES_WHISCASH}, - {35, 40, SPECIES_WHISCASH}, - {40, 45, SPECIES_WHISCASH}, -}; -const struct WildPokemonInfo MeteorFalls_1F_2R_FishingMonsInfo = {30, MeteorFalls_1F_2R_FishingMons}; - -const struct WildPokemon MeteorFalls_B1F_1R_LandMons [] = -{ - {33, 33, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {35, 35, SPECIES_LUNATONE}, - {33, 33, SPECIES_LUNATONE}, - {37, 37, SPECIES_LUNATONE}, -#else - {35, 35, SPECIES_SOLROCK}, - {33, 33, SPECIES_SOLROCK}, - {37, 37, SPECIES_SOLROCK}, -#endif - {35, 35, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {39, 39, SPECIES_LUNATONE}, -#else - {39, 39, SPECIES_SOLROCK}, -#endif - {38, 38, SPECIES_GOLBAT}, - {40, 40, SPECIES_GOLBAT}, - {38, 38, SPECIES_GOLBAT}, - {40, 40, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo MeteorFalls_B1F_1R_LandMonsInfo = {10, MeteorFalls_B1F_1R_LandMons}; - -const struct WildPokemon MeteorFalls_B1F_1R_WaterMons [] = -{ - {30, 35, SPECIES_GOLBAT}, - {30, 35, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {25, 35, SPECIES_LUNATONE}, - {15, 25, SPECIES_LUNATONE}, - {5, 15, SPECIES_LUNATONE}, -#else - {25, 35, SPECIES_SOLROCK}, - {15, 25, SPECIES_SOLROCK}, - {5, 15, SPECIES_SOLROCK}, -#endif -}; -const struct WildPokemonInfo MeteorFalls_B1F_1R_WaterMonsInfo = {4, MeteorFalls_B1F_1R_WaterMons}; - -const struct WildPokemon MeteorFalls_B1F_1R_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {30, 35, SPECIES_WHISCASH}, - {35, 40, SPECIES_WHISCASH}, - {40, 45, SPECIES_WHISCASH}, -}; -const struct WildPokemonInfo MeteorFalls_B1F_1R_FishingMonsInfo = {30, MeteorFalls_B1F_1R_FishingMons}; - -const struct WildPokemon MeteorFalls_B1F_2R_LandMons [] = -{ - {33, 33, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {30, 30, SPECIES_BAGON}, -#ifdef SAPPHIRE - {35, 35, SPECIES_LUNATONE}, -#else - {35, 35, SPECIES_SOLROCK}, -#endif - {35, 35, SPECIES_BAGON}, -#ifdef SAPPHIRE - {37, 37, SPECIES_LUNATONE}, -#else - {37, 37, SPECIES_SOLROCK}, -#endif - {25, 25, SPECIES_BAGON}, -#ifdef SAPPHIRE - {39, 39, SPECIES_LUNATONE}, -#else - {39, 39, SPECIES_SOLROCK}, -#endif - {38, 38, SPECIES_GOLBAT}, - {40, 40, SPECIES_GOLBAT}, - {38, 38, SPECIES_GOLBAT}, - {40, 40, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo MeteorFalls_B1F_2R_LandMonsInfo = {10, MeteorFalls_B1F_2R_LandMons}; - -const struct WildPokemon MeteorFalls_B1F_2R_WaterMons [] = -{ - {30, 35, SPECIES_GOLBAT}, - {30, 35, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {25, 35, SPECIES_LUNATONE}, - {15, 25, SPECIES_LUNATONE}, - {5, 15, SPECIES_LUNATONE}, -#else - {25, 35, SPECIES_SOLROCK}, - {15, 25, SPECIES_SOLROCK}, - {5, 15, SPECIES_SOLROCK}, -#endif -}; -const struct WildPokemonInfo MeteorFalls_B1F_2R_WaterMonsInfo = {4, MeteorFalls_B1F_2R_WaterMons}; - -const struct WildPokemon MeteorFalls_B1F_2R_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {30, 35, SPECIES_WHISCASH}, - {35, 40, SPECIES_WHISCASH}, - {40, 45, SPECIES_WHISCASH}, -}; -const struct WildPokemonInfo MeteorFalls_B1F_2R_FishingMonsInfo = {30, MeteorFalls_B1F_2R_FishingMons}; - -const struct WildPokemon RusturfTunnel_LandMons [] = -{ - {6, 6, SPECIES_WHISMUR}, - {7, 7, SPECIES_WHISMUR}, - {6, 6, SPECIES_WHISMUR}, - {6, 6, SPECIES_WHISMUR}, - {7, 7, SPECIES_WHISMUR}, - {7, 7, SPECIES_WHISMUR}, - {5, 5, SPECIES_WHISMUR}, - {8, 8, SPECIES_WHISMUR}, - {5, 5, SPECIES_WHISMUR}, - {8, 8, SPECIES_WHISMUR}, - {5, 5, SPECIES_WHISMUR}, - {8, 8, SPECIES_WHISMUR}, -}; -const struct WildPokemonInfo RusturfTunnel_LandMonsInfo = {10, RusturfTunnel_LandMons}; - -const struct WildPokemon GraniteCave_1F_LandMons [] = -{ - {7, 7, SPECIES_ZUBAT}, - {8, 8, SPECIES_MAKUHITA}, - {7, 7, SPECIES_MAKUHITA}, - {8, 8, SPECIES_ZUBAT}, - {9, 9, SPECIES_MAKUHITA}, - {8, 8, SPECIES_ABRA}, - {10, 10, SPECIES_MAKUHITA}, - {6, 6, SPECIES_MAKUHITA}, - {7, 7, SPECIES_GEODUDE}, - {8, 8, SPECIES_GEODUDE}, - {6, 6, SPECIES_GEODUDE}, - {9, 9, SPECIES_GEODUDE}, -}; -const struct WildPokemonInfo GraniteCave_1F_LandMonsInfo = {10, GraniteCave_1F_LandMons}; - -const struct WildPokemon GraniteCave_B1F_LandMons [] = -{ - {9, 9, SPECIES_ZUBAT}, - {10, 10, SPECIES_ARON}, - {9, 9, SPECIES_ARON}, - {11, 11, SPECIES_ARON}, - {10, 10, SPECIES_ZUBAT}, - {9, 9, SPECIES_ABRA}, - {10, 10, SPECIES_MAKUHITA}, - {11, 11, SPECIES_MAKUHITA}, -#ifdef SAPPHIRE - {10, 10, SPECIES_SABLEYE}, - {10, 10, SPECIES_SABLEYE}, - {9, 9, SPECIES_SABLEYE}, - {11, 11, SPECIES_SABLEYE}, -#else - {10, 10, SPECIES_MAWILE}, - {10, 10, SPECIES_MAWILE}, - {9, 9, SPECIES_MAWILE}, - {11, 11, SPECIES_MAWILE}, -#endif -}; -const struct WildPokemonInfo GraniteCave_B1F_LandMonsInfo = {10, GraniteCave_B1F_LandMons}; - -const struct WildPokemon GraniteCave_B2F_LandMons [] = -{ - {10, 10, SPECIES_ZUBAT}, - {11, 11, SPECIES_ARON}, - {10, 10, SPECIES_ARON}, - {11, 11, SPECIES_ZUBAT}, - {12, 12, SPECIES_ARON}, - {10, 10, SPECIES_ABRA}, -#ifdef SAPPHIRE - {10, 10, SPECIES_SABLEYE}, - {11, 11, SPECIES_SABLEYE}, - {12, 12, SPECIES_SABLEYE}, - {10, 10, SPECIES_SABLEYE}, - {12, 12, SPECIES_SABLEYE}, - {10, 10, SPECIES_SABLEYE}, -#else - {10, 10, SPECIES_MAWILE}, - {11, 11, SPECIES_MAWILE}, - {12, 12, SPECIES_MAWILE}, - {10, 10, SPECIES_MAWILE}, - {12, 12, SPECIES_MAWILE}, - {10, 10, SPECIES_MAWILE}, -#endif -}; -const struct WildPokemonInfo GraniteCave_B2F_LandMonsInfo = {10, GraniteCave_B2F_LandMons}; - -const struct WildPokemon GraniteCave_B2F_RockSmashMons [] = -{ - {10, 15, SPECIES_GEODUDE}, - {10, 20, SPECIES_NOSEPASS}, - {5, 10, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, -}; -const struct WildPokemonInfo GraniteCave_B2F_RockSmashMonsInfo = {20, GraniteCave_B2F_RockSmashMons}; - -const struct WildPokemon GraniteCave_StevensRoom_LandMons [] = -{ - {7, 7, SPECIES_ZUBAT}, - {8, 8, SPECIES_MAKUHITA}, - {7, 7, SPECIES_MAKUHITA}, - {8, 8, SPECIES_ZUBAT}, - {9, 9, SPECIES_MAKUHITA}, - {8, 8, SPECIES_ABRA}, - {10, 10, SPECIES_MAKUHITA}, - {6, 6, SPECIES_MAKUHITA}, - {7, 7, SPECIES_ARON}, - {8, 8, SPECIES_ARON}, - {7, 7, SPECIES_ARON}, - {8, 8, SPECIES_ARON}, -}; -const struct WildPokemonInfo GraniteCave_StevensRoom_LandMonsInfo = {10, GraniteCave_StevensRoom_LandMons}; - -const struct WildPokemon PetalburgWoods_LandMons [] = -{ - {5, 5, SPECIES_ZIGZAGOON}, - {5, 5, SPECIES_WURMPLE}, - {5, 5, SPECIES_SHROOMISH}, - {6, 6, SPECIES_ZIGZAGOON}, - {5, 5, SPECIES_SILCOON}, - {5, 5, SPECIES_CASCOON}, - {6, 6, SPECIES_WURMPLE}, - {6, 6, SPECIES_SHROOMISH}, - {5, 5, SPECIES_TAILLOW}, - {5, 5, SPECIES_SLAKOTH}, - {6, 6, SPECIES_TAILLOW}, - {6, 6, SPECIES_SLAKOTH}, -}; -const struct WildPokemonInfo PetalburgWoods_LandMonsInfo = {20, PetalburgWoods_LandMons}; - -//Jagged Pass Pokemon are 2 levels higher on Sapphire -#ifdef SAPPHIRE -#define JAGGED_PASS_LEVEL_DIFF 2 -#else -#define JAGGED_PASS_LEVEL_DIFF 0 -#endif - -const struct WildPokemon JaggedPass_LandMons [] = -{ - {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, - {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, - {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP}, - {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, - {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, - {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP}, - {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, - {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP}, - {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, - {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, - {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, - {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, -}; -const struct WildPokemonInfo JaggedPass_LandMonsInfo = {20, JaggedPass_LandMons}; - -const struct WildPokemon FieryPath_LandMons [] = -{ - {15, 15, SPECIES_NUMEL}, -#ifdef SAPPHIRE - {15, 15, SPECIES_GRIMER}, -#else - {15, 15, SPECIES_KOFFING}, -#endif - {16, 16, SPECIES_NUMEL}, - {15, 15, SPECIES_MACHOP}, - {15, 15, SPECIES_TORKOAL}, - {15, 15, SPECIES_SLUGMA}, -#ifdef SAPPHIRE - {16, 16, SPECIES_GRIMER}, -#else - {16, 16, SPECIES_KOFFING}, -#endif - {16, 16, SPECIES_MACHOP}, - {14, 14, SPECIES_TORKOAL}, - {16, 16, SPECIES_TORKOAL}, -#ifdef SAPPHIRE - {14, 14, SPECIES_KOFFING}, - {14, 14, SPECIES_KOFFING}, -#else - {14, 14, SPECIES_GRIMER}, - {14, 14, SPECIES_GRIMER}, -#endif -}; -const struct WildPokemonInfo FieryPath_LandMonsInfo = {10, FieryPath_LandMons}; - -const struct WildPokemon MtPyre_1F_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {23, 23, SPECIES_SHUPPET}, - {22, 22, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, -#else - {27, 27, SPECIES_DUSKULL}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {23, 23, SPECIES_DUSKULL}, - {22, 22, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, -#endif -}; -const struct WildPokemonInfo MtPyre_1F_LandMonsInfo = {10, MtPyre_1F_LandMons}; - -const struct WildPokemon MtPyre_2F_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {23, 23, SPECIES_SHUPPET}, - {22, 22, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, -#else - {27, 27, SPECIES_DUSKULL}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {23, 23, SPECIES_DUSKULL}, - {22, 22, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, -#endif -}; -const struct WildPokemonInfo MtPyre_2F_LandMonsInfo = {10, MtPyre_2F_LandMons}; - -const struct WildPokemon MtPyre_3F_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {23, 23, SPECIES_SHUPPET}, - {22, 22, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, -#else - {27, 27, SPECIES_DUSKULL}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {23, 23, SPECIES_DUSKULL}, - {22, 22, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, -#endif -}; -const struct WildPokemonInfo MtPyre_3F_LandMonsInfo = {10, MtPyre_3F_LandMons}; - -const struct WildPokemon MtPyre_4F_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {23, 23, SPECIES_SHUPPET}, - {22, 22, SPECIES_SHUPPET}, - {27, 27, SPECIES_DUSKULL}, - {27, 27, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, -#else - {27, 27, SPECIES_DUSKULL}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {23, 23, SPECIES_DUSKULL}, - {22, 22, SPECIES_DUSKULL}, - {27, 27, SPECIES_SHUPPET}, - {27, 27, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, -#endif -}; -const struct WildPokemonInfo MtPyre_4F_LandMonsInfo = {10, MtPyre_4F_LandMons}; - -const struct WildPokemon MtPyre_5F_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {23, 23, SPECIES_SHUPPET}, - {22, 22, SPECIES_SHUPPET}, - {27, 27, SPECIES_DUSKULL}, - {27, 27, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, -#else - {27, 27, SPECIES_DUSKULL}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {23, 23, SPECIES_DUSKULL}, - {22, 22, SPECIES_DUSKULL}, - {27, 27, SPECIES_SHUPPET}, - {27, 27, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, -#endif -}; -const struct WildPokemonInfo MtPyre_5F_LandMonsInfo = {10, MtPyre_5F_LandMons}; - -const struct WildPokemon MtPyre_6F_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {23, 23, SPECIES_SHUPPET}, - {22, 22, SPECIES_SHUPPET}, - {27, 27, SPECIES_DUSKULL}, - {27, 27, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, -#else - {27, 27, SPECIES_DUSKULL}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {23, 23, SPECIES_DUSKULL}, - {22, 22, SPECIES_DUSKULL}, - {27, 27, SPECIES_SHUPPET}, - {27, 27, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, -#endif -}; -const struct WildPokemonInfo MtPyre_6F_LandMonsInfo = {10, MtPyre_6F_LandMons}; - -const struct WildPokemon MtPyre_Exterior_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, -#else - {27, 27, SPECIES_DUSKULL}, -#endif - {27, 27, SPECIES_MEDITITE}, -#ifdef SAPPHIRE - {28, 28, SPECIES_SHUPPET}, -#else - {28, 28, SPECIES_DUSKULL}, -#endif - {29, 29, SPECIES_MEDITITE}, -#ifdef SAPPHIRE - {29, 29, SPECIES_SHUPPET}, -#else - {29, 29, SPECIES_DUSKULL}, -#endif - {27, 27, SPECIES_VULPIX}, - {29, 29, SPECIES_VULPIX}, - {25, 25, SPECIES_VULPIX}, - {27, 27, SPECIES_WINGULL}, - {27, 27, SPECIES_WINGULL}, - {26, 26, SPECIES_WINGULL}, - {28, 28, SPECIES_WINGULL}, -}; -const struct WildPokemonInfo MtPyre_Exterior_LandMonsInfo = {10, MtPyre_Exterior_LandMons}; - -const struct WildPokemon MtPyre_Summit_LandMons [] = -{ -#ifdef SAPPHIRE - {28, 28, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {27, 27, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {30, 30, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {30, 30, SPECIES_DUSKULL}, -#else - {28, 28, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {27, 27, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {30, 30, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {30, 30, SPECIES_SHUPPET}, -#endif - {28, 28, SPECIES_CHIMECHO}, - {28, 28, SPECIES_CHIMECHO}, -}; -const struct WildPokemonInfo MtPyre_Summit_LandMonsInfo = {10, MtPyre_Summit_LandMons}; - -const struct WildPokemon SeafloorCavern_Entrance_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_GOLBAT}, - {30, 35, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Entrance_WaterMonsInfo = {4, SeafloorCavern_Entrance_WaterMons}; - -const struct WildPokemon SeafloorCavern_Entrance_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo SeafloorCavern_Entrance_FishingMonsInfo = {10, SeafloorCavern_Entrance_FishingMons}; - -const struct WildPokemon SeafloorCavern_Room1_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room1_LandMonsInfo = {4, SeafloorCavern_Room1_LandMons}; - -const struct WildPokemon SeafloorCavern_Room2_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room2_LandMonsInfo = {4, SeafloorCavern_Room2_LandMons}; - -const struct WildPokemon SeafloorCavern_Room3_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room3_LandMonsInfo = {4, SeafloorCavern_Room3_LandMons}; - -const struct WildPokemon SeafloorCavern_Room4_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room4_LandMonsInfo = {4, SeafloorCavern_Room4_LandMons}; - -const struct WildPokemon SeafloorCavern_Room5_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room5_LandMonsInfo = {4, SeafloorCavern_Room5_LandMons}; - -const struct WildPokemon SeafloorCavern_Room6_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room6_LandMonsInfo = {4, SeafloorCavern_Room6_LandMons}; - -const struct WildPokemon SeafloorCavern_Room6_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_GOLBAT}, - {30, 35, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room6_WaterMonsInfo = {4, SeafloorCavern_Room6_WaterMons}; - -const struct WildPokemon SeafloorCavern_Room6_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo SeafloorCavern_Room6_FishingMonsInfo = {10, SeafloorCavern_Room6_FishingMons}; - -const struct WildPokemon SeafloorCavern_Room7_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room7_LandMonsInfo = {4, SeafloorCavern_Room7_LandMons}; - -const struct WildPokemon SeafloorCavern_Room7_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_GOLBAT}, - {30, 35, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room7_WaterMonsInfo = {4, SeafloorCavern_Room7_WaterMons}; - -const struct WildPokemon SeafloorCavern_Room7_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo SeafloorCavern_Room7_FishingMonsInfo = {10, SeafloorCavern_Room7_FishingMons}; - -const struct WildPokemon SeafloorCavern_Room8_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room8_LandMonsInfo = {4, SeafloorCavern_Room8_LandMons}; - -const struct WildPokemon CaveOfOrigin_Entrance_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo CaveOfOrigin_Entrance_LandMonsInfo = {4, CaveOfOrigin_Entrance_LandMons}; - -const struct WildPokemon CaveOfOrigin_1F_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, -#ifdef SAPPHIRE - {30, 30, SPECIES_SABLEYE}, - {32, 32, SPECIES_SABLEYE}, - {34, 34, SPECIES_SABLEYE}, -#else - {30, 30, SPECIES_MAWILE}, - {32, 32, SPECIES_MAWILE}, - {34, 34, SPECIES_MAWILE}, -#endif - {33, 33, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo CaveOfOrigin_1F_LandMonsInfo = {4, CaveOfOrigin_1F_LandMons}; - -const struct WildPokemon CaveOfOrigin_B1F_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, -#ifdef SAPPHIRE - {30, 30, SPECIES_SABLEYE}, - {32, 32, SPECIES_SABLEYE}, - {34, 34, SPECIES_SABLEYE}, -#else - {30, 30, SPECIES_MAWILE}, - {32, 32, SPECIES_MAWILE}, - {34, 34, SPECIES_MAWILE}, -#endif - {33, 33, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo CaveOfOrigin_B1F_LandMonsInfo = {4, CaveOfOrigin_B1F_LandMons}; - -const struct WildPokemon CaveOfOrigin_B2F_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, -#ifdef SAPPHIRE - {30, 30, SPECIES_SABLEYE}, - {32, 32, SPECIES_SABLEYE}, - {34, 34, SPECIES_SABLEYE}, -#else - {30, 30, SPECIES_MAWILE}, - {32, 32, SPECIES_MAWILE}, - {34, 34, SPECIES_MAWILE}, -#endif - {33, 33, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo CaveOfOrigin_B2F_LandMonsInfo = {4, CaveOfOrigin_B2F_LandMons}; - -const struct WildPokemon CaveOfOrigin_B3F_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, -#ifdef SAPPHIRE - {30, 30, SPECIES_SABLEYE}, - {32, 32, SPECIES_SABLEYE}, - {34, 34, SPECIES_SABLEYE}, -#else - {30, 30, SPECIES_MAWILE}, - {32, 32, SPECIES_MAWILE}, - {34, 34, SPECIES_MAWILE}, -#endif - {33, 33, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo CaveOfOrigin_B3F_LandMonsInfo = {4, CaveOfOrigin_B3F_LandMons}; - -const struct WildPokemon VictoryRoad_1F_LandMons [] = -{ - {40, 40, SPECIES_GOLBAT}, - {40, 40, SPECIES_HARIYAMA}, - {40, 40, SPECIES_LAIRON}, - {40, 40, SPECIES_LOUDRED}, - {36, 36, SPECIES_ZUBAT}, - {36, 36, SPECIES_MAKUHITA}, - {38, 38, SPECIES_GOLBAT}, - {38, 38, SPECIES_HARIYAMA}, - {36, 36, SPECIES_ARON}, - {36, 36, SPECIES_WHISMUR}, - {36, 36, SPECIES_ARON}, - {36, 36, SPECIES_WHISMUR}, -}; -const struct WildPokemonInfo VictoryRoad_1F_LandMonsInfo = {10, VictoryRoad_1F_LandMons}; - -const struct WildPokemon VictoryRoad_B1F_LandMons [] = -{ - {40, 40, SPECIES_GOLBAT}, - {40, 40, SPECIES_HARIYAMA}, - {40, 40, SPECIES_LAIRON}, - {40, 40, SPECIES_MEDICHAM}, - {38, 38, SPECIES_GOLBAT}, - {38, 38, SPECIES_HARIYAMA}, - {42, 42, SPECIES_GOLBAT}, - {42, 42, SPECIES_HARIYAMA}, - {42, 42, SPECIES_LAIRON}, - {38, 38, SPECIES_MEDITITE}, - {42, 42, SPECIES_LAIRON}, - {38, 38, SPECIES_MEDITITE}, -}; -const struct WildPokemonInfo VictoryRoad_B1F_LandMonsInfo = {10, VictoryRoad_B1F_LandMons}; - -const struct WildPokemon VictoryRoad_B1F_RockSmashMons [] = -{ - {30, 40, SPECIES_GRAVELER}, - {30, 40, SPECIES_GEODUDE}, - {35, 40, SPECIES_GRAVELER}, - {35, 40, SPECIES_GRAVELER}, - {35, 40, SPECIES_GRAVELER}, -}; -const struct WildPokemonInfo VictoryRoad_B1F_RockSmashMonsInfo = {20, VictoryRoad_B1F_RockSmashMons}; - -const struct WildPokemon VictoryRoad_B2F_LandMons [] = -{ - {40, 40, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {40, 40, SPECIES_SABLEYE}, -#else - {40, 40, SPECIES_MAWILE}, -#endif - {40, 40, SPECIES_LAIRON}, - {40, 40, SPECIES_MEDICHAM}, - {42, 42, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {42, 42, SPECIES_SABLEYE}, -#else - {42, 42, SPECIES_MAWILE}, -#endif - {44, 44, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {44, 44, SPECIES_SABLEYE}, -#else - {44, 44, SPECIES_MAWILE}, -#endif - {42, 42, SPECIES_LAIRON}, - {42, 42, SPECIES_MEDICHAM}, - {44, 44, SPECIES_LAIRON}, - {44, 44, SPECIES_MEDICHAM}, -}; -const struct WildPokemonInfo VictoryRoad_B2F_LandMonsInfo = {10, VictoryRoad_B2F_LandMons}; - -const struct WildPokemon VictoryRoad_B2F_WaterMons [] = -{ - {30, 35, SPECIES_GOLBAT}, - {25, 30, SPECIES_GOLBAT}, - {35, 40, SPECIES_GOLBAT}, - {35, 40, SPECIES_GOLBAT}, - {35, 40, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo VictoryRoad_B2F_WaterMonsInfo = {4, VictoryRoad_B2F_WaterMons}; - -const struct WildPokemon VictoryRoad_B2F_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {30, 35, SPECIES_WHISCASH}, - {35, 40, SPECIES_WHISCASH}, - {40, 45, SPECIES_WHISCASH}, -}; -const struct WildPokemonInfo VictoryRoad_B2F_FishingMonsInfo = {30, VictoryRoad_B2F_FishingMons}; - -const struct WildPokemon ShoalCave_LowTideEntranceRoom_LandMons [] = -{ - {26, 26, SPECIES_ZUBAT}, - {26, 26, SPECIES_SPHEAL}, - {28, 28, SPECIES_ZUBAT}, - {28, 28, SPECIES_SPHEAL}, - {30, 30, SPECIES_ZUBAT}, - {30, 30, SPECIES_SPHEAL}, - {32, 32, SPECIES_ZUBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, -}; -const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_LandMonsInfo = {10, ShoalCave_LowTideEntranceRoom_LandMons}; - -const struct WildPokemon ShoalCave_LowTideEntranceRoom_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_ZUBAT}, - {25, 30, SPECIES_SPHEAL}, - {25, 30, SPECIES_SPHEAL}, - {25, 35, SPECIES_SPHEAL}, -}; -const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_WaterMonsInfo = {4, ShoalCave_LowTideEntranceRoom_WaterMons}; - -const struct WildPokemon ShoalCave_LowTideEntranceRoom_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_FishingMonsInfo = {10, ShoalCave_LowTideEntranceRoom_FishingMons}; - -const struct WildPokemon ShoalCave_LowTideInnerRoom_LandMons [] = -{ - {26, 26, SPECIES_ZUBAT}, - {26, 26, SPECIES_SPHEAL}, - {28, 28, SPECIES_ZUBAT}, - {28, 28, SPECIES_SPHEAL}, - {30, 30, SPECIES_ZUBAT}, - {30, 30, SPECIES_SPHEAL}, - {32, 32, SPECIES_ZUBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, -}; -const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_LandMonsInfo = {10, ShoalCave_LowTideInnerRoom_LandMons}; - -const struct WildPokemon ShoalCave_LowTideInnerRoom_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_ZUBAT}, - {25, 30, SPECIES_SPHEAL}, - {25, 30, SPECIES_SPHEAL}, - {25, 35, SPECIES_SPHEAL}, -}; -const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_WaterMonsInfo = {4, ShoalCave_LowTideInnerRoom_WaterMons}; - -const struct WildPokemon ShoalCave_LowTideInnerRoom_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_FishingMonsInfo = {10, ShoalCave_LowTideInnerRoom_FishingMons}; - -const struct WildPokemon ShoalCave_LowTideStairsRoom_LandMons [] = -{ - {26, 26, SPECIES_ZUBAT}, - {26, 26, SPECIES_SPHEAL}, - {28, 28, SPECIES_ZUBAT}, - {28, 28, SPECIES_SPHEAL}, - {30, 30, SPECIES_ZUBAT}, - {30, 30, SPECIES_SPHEAL}, - {32, 32, SPECIES_ZUBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, -}; -const struct WildPokemonInfo ShoalCave_LowTideStairsRoom_LandMonsInfo = {10, ShoalCave_LowTideStairsRoom_LandMons}; - -const struct WildPokemon ShoalCave_LowTideLowerRoom_LandMons [] = -{ - {26, 26, SPECIES_ZUBAT}, - {26, 26, SPECIES_SPHEAL}, - {28, 28, SPECIES_ZUBAT}, - {28, 28, SPECIES_SPHEAL}, - {30, 30, SPECIES_ZUBAT}, - {30, 30, SPECIES_SPHEAL}, - {32, 32, SPECIES_ZUBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, -}; -const struct WildPokemonInfo ShoalCave_LowTideLowerRoom_LandMonsInfo = {10, ShoalCave_LowTideLowerRoom_LandMons}; - -const struct WildPokemon ShoalCave_LowTideIceRoom_LandMons [] = -{ - {26, 26, SPECIES_ZUBAT}, - {26, 26, SPECIES_SPHEAL}, - {28, 28, SPECIES_ZUBAT}, - {28, 28, SPECIES_SPHEAL}, - {30, 30, SPECIES_ZUBAT}, - {30, 30, SPECIES_SPHEAL}, - {26, 26, SPECIES_SNORUNT}, - {32, 32, SPECIES_SPHEAL}, - {30, 30, SPECIES_GOLBAT}, - {28, 28, SPECIES_SNORUNT}, - {32, 32, SPECIES_GOLBAT}, - {30, 30, SPECIES_SNORUNT}, -}; -const struct WildPokemonInfo ShoalCave_LowTideIceRoom_LandMonsInfo = {10, ShoalCave_LowTideIceRoom_LandMons}; - -const struct WildPokemon NewMauville_Entrance_LandMons [] = -{ - {24, 24, SPECIES_VOLTORB}, - {24, 24, SPECIES_MAGNEMITE}, - {25, 25, SPECIES_VOLTORB}, - {25, 25, SPECIES_MAGNEMITE}, - {23, 23, SPECIES_VOLTORB}, - {23, 23, SPECIES_MAGNEMITE}, - {26, 26, SPECIES_VOLTORB}, - {26, 26, SPECIES_MAGNEMITE}, - {22, 22, SPECIES_VOLTORB}, - {22, 22, SPECIES_MAGNEMITE}, - {22, 22, SPECIES_VOLTORB}, - {22, 22, SPECIES_MAGNEMITE}, -}; -const struct WildPokemonInfo NewMauville_Entrance_LandMonsInfo = {10, NewMauville_Entrance_LandMons}; - -const struct WildPokemon NewMauville_Inside_LandMons [] = -{ - {24, 24, SPECIES_VOLTORB}, - {24, 24, SPECIES_MAGNEMITE}, - {25, 25, SPECIES_VOLTORB}, - {25, 25, SPECIES_MAGNEMITE}, - {23, 23, SPECIES_VOLTORB}, - {23, 23, SPECIES_MAGNEMITE}, - {26, 26, SPECIES_VOLTORB}, - {26, 26, SPECIES_MAGNEMITE}, - {22, 22, SPECIES_VOLTORB}, - {22, 22, SPECIES_MAGNEMITE}, - {26, 26, SPECIES_ELECTRODE}, - {26, 26, SPECIES_MAGNETON}, -}; -const struct WildPokemonInfo NewMauville_Inside_LandMonsInfo = {10, NewMauville_Inside_LandMons}; - -const struct WildPokemon AbandonedShip_Rooms_B1F_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_TENTACOOL}, - {30, 35, SPECIES_TENTACRUEL}, -}; -const struct WildPokemonInfo AbandonedShip_Rooms_B1F_WaterMonsInfo = {4, AbandonedShip_Rooms_B1F_WaterMons}; - -const struct WildPokemon AbandonedShip_Rooms_B1F_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_TENTACOOL}, - {25, 30, SPECIES_TENTACOOL}, - {30, 35, SPECIES_TENTACOOL}, - {30, 35, SPECIES_TENTACRUEL}, - {25, 30, SPECIES_TENTACRUEL}, - {20, 25, SPECIES_TENTACRUEL}, -}; -const struct WildPokemonInfo AbandonedShip_Rooms_B1F_FishingMonsInfo = {20, AbandonedShip_Rooms_B1F_FishingMons}; - -const struct WildPokemon AbandonedShip_HiddenFloorCorridors_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_TENTACOOL}, - {30, 35, SPECIES_TENTACRUEL}, -}; -const struct WildPokemonInfo AbandonedShip_HiddenFloorCorridors_WaterMonsInfo = {4, AbandonedShip_HiddenFloorCorridors_WaterMons}; - -const struct WildPokemon AbandonedShip_HiddenFloorCorridors_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_TENTACOOL}, - {25, 30, SPECIES_TENTACOOL}, - {30, 35, SPECIES_TENTACOOL}, - {30, 35, SPECIES_TENTACRUEL}, - {25, 30, SPECIES_TENTACRUEL}, - {20, 25, SPECIES_TENTACRUEL}, -}; -const struct WildPokemonInfo AbandonedShip_HiddenFloorCorridors_FishingMonsInfo = {20, AbandonedShip_HiddenFloorCorridors_FishingMons}; - -const struct WildPokemon SkyPillar_1F_LandMons [] = -{ -#ifdef SAPPHIRE - {48, 48, SPECIES_SABLEYE}, -#else - {48, 48, SPECIES_MAWILE}, -#endif - {48, 48, SPECIES_GOLBAT}, - {50, 50, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {50, 50, SPECIES_SABLEYE}, -#else - {50, 50, SPECIES_MAWILE}, -#endif - {48, 48, SPECIES_CLAYDOL}, -#ifdef SAPPHIRE - {48, 48, SPECIES_BANETTE}, - {50, 50, SPECIES_BANETTE}, -#else - {48, 48, SPECIES_DUSCLOPS}, - {50, 50, SPECIES_DUSCLOPS}, -#endif - {49, 49, SPECIES_CLAYDOL}, - {47, 47, SPECIES_CLAYDOL}, - {50, 50, SPECIES_CLAYDOL}, - {47, 47, SPECIES_CLAYDOL}, - {50, 50, SPECIES_CLAYDOL}, -}; -const struct WildPokemonInfo SkyPillar_1F_LandMonsInfo = {10, SkyPillar_1F_LandMons}; - -const struct WildPokemon SkyPillar_3F_LandMons [] = -{ -#ifdef SAPPHIRE - {51, 51, SPECIES_SABLEYE}, -#else - {51, 51, SPECIES_MAWILE}, -#endif - {51, 51, SPECIES_GOLBAT}, - {53, 53, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {53, 53, SPECIES_SABLEYE}, -#else - {53, 53, SPECIES_MAWILE}, -#endif - {51, 51, SPECIES_CLAYDOL}, -#ifdef SAPPHIRE - {51, 51, SPECIES_BANETTE}, - {53, 53, SPECIES_BANETTE}, -#else - {51, 51, SPECIES_DUSCLOPS}, - {53, 53, SPECIES_DUSCLOPS}, -#endif - {52, 52, SPECIES_CLAYDOL}, - {50, 50, SPECIES_CLAYDOL}, - {53, 53, SPECIES_CLAYDOL}, - {50, 50, SPECIES_CLAYDOL}, - {53, 53, SPECIES_CLAYDOL}, -}; -const struct WildPokemonInfo SkyPillar_3F_LandMonsInfo = {10, SkyPillar_3F_LandMons}; - -const struct WildPokemon SkyPillar_5F_LandMons [] = -{ -#ifdef SAPPHIRE - {54, 54, SPECIES_SABLEYE}, -#else - {54, 54, SPECIES_MAWILE}, -#endif - {54, 54, SPECIES_GOLBAT}, - {56, 56, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {56, 56, SPECIES_SABLEYE}, -#else - {56, 56, SPECIES_MAWILE}, -#endif - {54, 54, SPECIES_CLAYDOL}, -#ifdef SAPPHIRE - {54, 54, SPECIES_BANETTE}, - {56, 56, SPECIES_BANETTE}, -#else - {54, 54, SPECIES_DUSCLOPS}, - {56, 56, SPECIES_DUSCLOPS}, -#endif - {55, 55, SPECIES_CLAYDOL}, - {56, 56, SPECIES_CLAYDOL}, - {57, 57, SPECIES_ALTARIA}, - {54, 54, SPECIES_ALTARIA}, - {60, 60, SPECIES_ALTARIA}, -}; -const struct WildPokemonInfo SkyPillar_5F_LandMonsInfo = {10, SkyPillar_5F_LandMons}; - -const struct WildPokemon Route101_LandMons [] = -{ - {2, 2, SPECIES_WURMPLE}, - {2, 2, SPECIES_ZIGZAGOON}, - {2, 2, SPECIES_WURMPLE}, - {3, 3, SPECIES_WURMPLE}, - {3, 3, SPECIES_ZIGZAGOON}, - {3, 3, SPECIES_ZIGZAGOON}, - {3, 3, SPECIES_WURMPLE}, - {3, 3, SPECIES_ZIGZAGOON}, - {2, 2, SPECIES_POOCHYENA}, - {2, 2, SPECIES_POOCHYENA}, - {3, 3, SPECIES_POOCHYENA}, - {3, 3, SPECIES_POOCHYENA}, -}; -const struct WildPokemonInfo Route101_LandMonsInfo = {20, Route101_LandMons}; - -const struct WildPokemon Route102_LandMons [] = -{ - {3, 3, SPECIES_ZIGZAGOON}, - {3, 3, SPECIES_WURMPLE}, - {4, 4, SPECIES_ZIGZAGOON}, - {4, 4, SPECIES_WURMPLE}, -#ifdef SAPPHIRE - {3, 3, SPECIES_LOTAD}, - {4, 4, SPECIES_LOTAD}, -#else - {3, 3, SPECIES_SEEDOT}, - {4, 4, SPECIES_SEEDOT}, -#endif - {3, 3, SPECIES_POOCHYENA}, - {3, 3, SPECIES_POOCHYENA}, - {4, 4, SPECIES_POOCHYENA}, - {4, 4, SPECIES_RALTS}, - {4, 4, SPECIES_POOCHYENA}, - {3, 3, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route102_LandMonsInfo = {20, Route102_LandMons}; - -const struct WildPokemon Route102_WaterMons [] = -{ - {20, 30, SPECIES_MARILL}, - {10, 20, SPECIES_MARILL}, - {30, 35, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, - {20, 30, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route102_WaterMonsInfo = {4, Route102_WaterMons}; - -const struct WildPokemon Route102_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_CORPHISH}, - {25, 30, SPECIES_CORPHISH}, - {30, 35, SPECIES_CORPHISH}, - {20, 25, SPECIES_CORPHISH}, - {35, 40, SPECIES_CORPHISH}, - {40, 45, SPECIES_CORPHISH}, -}; -const struct WildPokemonInfo Route102_FishingMonsInfo = {30, Route102_FishingMons}; - -const struct WildPokemon Route103_LandMons [] = -{ - {2, 2, SPECIES_ZIGZAGOON}, - {3, 3, SPECIES_ZIGZAGOON}, - {3, 3, SPECIES_ZIGZAGOON}, - {4, 4, SPECIES_ZIGZAGOON}, - {2, 2, SPECIES_POOCHYENA}, - {3, 3, SPECIES_POOCHYENA}, - {3, 3, SPECIES_POOCHYENA}, - {4, 4, SPECIES_POOCHYENA}, - {3, 3, SPECIES_WINGULL}, - {3, 3, SPECIES_WINGULL}, - {2, 2, SPECIES_WINGULL}, - {4, 4, SPECIES_WINGULL}, -}; -const struct WildPokemonInfo Route103_LandMonsInfo = {20, Route103_LandMons}; - -const struct WildPokemon Route103_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route103_WaterMonsInfo = {4, Route103_WaterMons}; - -const struct WildPokemon Route103_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route103_FishingMonsInfo = {30, Route103_FishingMons}; - -const struct WildPokemon Route104_LandMons [] = -{ - {4, 4, SPECIES_ZIGZAGOON}, - {4, 4, SPECIES_WURMPLE}, - {5, 5, SPECIES_ZIGZAGOON}, - {5, 5, SPECIES_WURMPLE}, - {4, 4, SPECIES_ZIGZAGOON}, - {5, 5, SPECIES_ZIGZAGOON}, - {4, 4, SPECIES_TAILLOW}, - {5, 5, SPECIES_TAILLOW}, - {4, 4, SPECIES_WINGULL}, - {4, 4, SPECIES_WINGULL}, - {3, 3, SPECIES_WINGULL}, - {5, 5, SPECIES_WINGULL}, -}; -const struct WildPokemonInfo Route104_LandMonsInfo = {20, Route104_LandMons}; - -const struct WildPokemon Route104_WaterMons [] = -{ - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route104_WaterMonsInfo = {4, Route104_WaterMons}; - -const struct WildPokemon Route104_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_MAGIKARP}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_MAGIKARP}, - {25, 30, SPECIES_MAGIKARP}, - {30, 35, SPECIES_MAGIKARP}, - {20, 25, SPECIES_MAGIKARP}, - {35, 40, SPECIES_MAGIKARP}, - {40, 45, SPECIES_MAGIKARP}, -}; -const struct WildPokemonInfo Route104_FishingMonsInfo = {30, Route104_FishingMons}; - -const struct WildPokemon Route105_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route105_WaterMonsInfo = {4, Route105_WaterMons}; - -const struct WildPokemon Route105_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route105_FishingMonsInfo = {30, Route105_FishingMons}; - -const struct WildPokemon Route106_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route106_WaterMonsInfo = {4, Route106_WaterMons}; - -const struct WildPokemon Route106_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route106_FishingMonsInfo = {30, Route106_FishingMons}; - -const struct WildPokemon Route107_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route107_WaterMonsInfo = {4, Route107_WaterMons}; - -const struct WildPokemon Route107_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route107_FishingMonsInfo = {30, Route107_FishingMons}; - -const struct WildPokemon Route108_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route108_WaterMonsInfo = {4, Route108_WaterMons}; - -const struct WildPokemon Route108_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route108_FishingMonsInfo = {30, Route108_FishingMons}; - -const struct WildPokemon Route109_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route109_WaterMonsInfo = {4, Route109_WaterMons}; - -const struct WildPokemon Route109_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route109_FishingMonsInfo = {30, Route109_FishingMons}; - -const struct WildPokemon Route110_LandMons [] = -{ - {12, 12, SPECIES_ZIGZAGOON}, - {12, 12, SPECIES_ELECTRIKE}, - {12, 12, SPECIES_GULPIN}, - {13, 13, SPECIES_ELECTRIKE}, -#ifdef SAPPHIRE - {13, 13, SPECIES_PLUSLE}, -#else - {13, 13, SPECIES_MINUN}, -#endif - {13, 13, SPECIES_ODDISH}, -#ifdef SAPPHIRE - {13, 13, SPECIES_PLUSLE}, -#else - {13, 13, SPECIES_MINUN}, -#endif - {13, 13, SPECIES_GULPIN}, - {12, 12, SPECIES_WINGULL}, - {12, 12, SPECIES_WINGULL}, -#ifdef SAPPHIRE - {12, 12, SPECIES_MINUN}, - {13, 13, SPECIES_MINUN}, -#else - {12, 12, SPECIES_PLUSLE}, - {13, 13, SPECIES_PLUSLE}, -#endif -}; -const struct WildPokemonInfo Route110_LandMonsInfo = {20, Route110_LandMons}; - -const struct WildPokemon Route110_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route110_WaterMonsInfo = {4, Route110_WaterMons}; - -const struct WildPokemon Route110_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route110_FishingMonsInfo = {30, Route110_FishingMons}; - -const struct WildPokemon Route111_LandMons [] = -{ - {20, 20, SPECIES_SANDSHREW}, - {20, 20, SPECIES_TRAPINCH}, - {21, 21, SPECIES_SANDSHREW}, - {21, 21, SPECIES_TRAPINCH}, - {19, 19, SPECIES_CACNEA}, - {21, 21, SPECIES_CACNEA}, - {19, 19, SPECIES_SANDSHREW}, - {19, 19, SPECIES_TRAPINCH}, - {20, 20, SPECIES_BALTOY}, - {20, 20, SPECIES_BALTOY}, - {22, 22, SPECIES_BALTOY}, - {22, 22, SPECIES_BALTOY}, -}; -const struct WildPokemonInfo Route111_LandMonsInfo = {10, Route111_LandMons}; - -const struct WildPokemon Route111_WaterMons [] = -{ - {20, 30, SPECIES_MARILL}, - {10, 20, SPECIES_MARILL}, - {30, 35, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, - {20, 30, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route111_WaterMonsInfo = {4, Route111_WaterMons}; - -const struct WildPokemon Route111_RockSmashMons [] = -{ - {10, 15, SPECIES_GEODUDE}, - {5, 10, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, -}; -const struct WildPokemonInfo Route111_RockSmashMonsInfo = {20, Route111_RockSmashMons}; - -const struct WildPokemon Route111_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {20, 25, SPECIES_BARBOACH}, - {35, 40, SPECIES_BARBOACH}, - {40, 45, SPECIES_BARBOACH}, -}; -const struct WildPokemonInfo Route111_FishingMonsInfo = {30, Route111_FishingMons}; - -const struct WildPokemon Route112_LandMons [] = -{ - {15, 15, SPECIES_NUMEL}, - {15, 15, SPECIES_NUMEL}, - {15, 15, SPECIES_MACHOP}, - {14, 14, SPECIES_NUMEL}, - {14, 14, SPECIES_NUMEL}, - {14, 14, SPECIES_MACHOP}, - {16, 16, SPECIES_NUMEL}, - {16, 16, SPECIES_MACHOP}, - {16, 16, SPECIES_NUMEL}, - {16, 16, SPECIES_NUMEL}, - {16, 16, SPECIES_NUMEL}, - {16, 16, SPECIES_NUMEL}, -}; -const struct WildPokemonInfo Route112_LandMonsInfo = {20, Route112_LandMons}; - -const struct WildPokemon Route113_LandMons [] = -{ - {15, 15, SPECIES_SPINDA}, - {15, 15, SPECIES_SPINDA}, - {15, 15, SPECIES_SANDSHREW}, - {14, 14, SPECIES_SPINDA}, - {14, 14, SPECIES_SPINDA}, - {14, 14, SPECIES_SANDSHREW}, - {16, 16, SPECIES_SPINDA}, - {16, 16, SPECIES_SANDSHREW}, - {16, 16, SPECIES_SPINDA}, - {16, 16, SPECIES_SKARMORY}, - {16, 16, SPECIES_SPINDA}, - {16, 16, SPECIES_SKARMORY}, -}; -const struct WildPokemonInfo Route113_LandMonsInfo = {20, Route113_LandMons}; - -const struct WildPokemon Route114_LandMons [] = -{ - {16, 16, SPECIES_SWABLU}, -#ifdef SAPPHIRE - {16, 16, SPECIES_LOTAD}, -#else - {16, 16, SPECIES_SEEDOT}, -#endif - {17, 17, SPECIES_SWABLU}, - {15, 15, SPECIES_SWABLU}, -#ifdef SAPPHIRE - {15, 15, SPECIES_LOTAD}, - {16, 16, SPECIES_SEVIPER}, - {16, 16, SPECIES_LOMBRE}, - {18, 18, SPECIES_LOMBRE}, - {17, 17, SPECIES_SEVIPER}, - {15, 15, SPECIES_SEVIPER}, - {17, 17, SPECIES_SEVIPER}, -#else - {15, 15, SPECIES_SEEDOT}, - {16, 16, SPECIES_ZANGOOSE}, - {16, 16, SPECIES_NUZLEAF}, - {18, 18, SPECIES_NUZLEAF}, - {17, 17, SPECIES_ZANGOOSE}, - {15, 15, SPECIES_ZANGOOSE}, - {17, 17, SPECIES_ZANGOOSE}, -#endif - {15, 15, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route114_LandMonsInfo = {20, Route114_LandMons}; - -const struct WildPokemon Route114_WaterMons [] = -{ - {20, 30, SPECIES_MARILL}, - {10, 20, SPECIES_MARILL}, - {30, 35, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, - {20, 30, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route114_WaterMonsInfo = {4, Route114_WaterMons}; - -const struct WildPokemon Route114_RockSmashMons [] = -{ - {10, 15, SPECIES_GEODUDE}, - {5, 10, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, -}; -const struct WildPokemonInfo Route114_RockSmashMonsInfo = {20, Route114_RockSmashMons}; - -const struct WildPokemon Route114_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {20, 25, SPECIES_BARBOACH}, - {35, 40, SPECIES_BARBOACH}, - {40, 45, SPECIES_BARBOACH}, -}; -const struct WildPokemonInfo Route114_FishingMonsInfo = {30, Route114_FishingMons}; - -const struct WildPokemon Route115_LandMons [] = -{ - {23, 23, SPECIES_SWABLU}, - {23, 23, SPECIES_TAILLOW}, - {25, 25, SPECIES_SWABLU}, - {24, 24, SPECIES_TAILLOW}, - {25, 25, SPECIES_TAILLOW}, - {25, 25, SPECIES_SWELLOW}, - {24, 24, SPECIES_JIGGLYPUFF}, - {25, 25, SPECIES_JIGGLYPUFF}, - {24, 24, SPECIES_WINGULL}, - {24, 24, SPECIES_WINGULL}, - {26, 26, SPECIES_WINGULL}, - {25, 25, SPECIES_WINGULL}, -}; -const struct WildPokemonInfo Route115_LandMonsInfo = {20, Route115_LandMons}; - -const struct WildPokemon Route115_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route115_WaterMonsInfo = {4, Route115_WaterMons}; - -const struct WildPokemon Route115_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route115_FishingMonsInfo = {30, Route115_FishingMons}; - -const struct WildPokemon Route116_LandMons [] = -{ - {6, 6, SPECIES_ZIGZAGOON}, - {6, 6, SPECIES_WHISMUR}, - {6, 6, SPECIES_NINCADA}, - {7, 7, SPECIES_WHISMUR}, - {7, 7, SPECIES_NINCADA}, - {6, 6, SPECIES_TAILLOW}, - {7, 7, SPECIES_TAILLOW}, - {8, 8, SPECIES_TAILLOW}, - {7, 7, SPECIES_ZIGZAGOON}, - {8, 8, SPECIES_ZIGZAGOON}, - {7, 7, SPECIES_SKITTY}, - {8, 8, SPECIES_SKITTY}, -}; -const struct WildPokemonInfo Route116_LandMonsInfo = {20, Route116_LandMons}; - -const struct WildPokemon Route117_LandMons [] = -{ - {13, 13, SPECIES_ZIGZAGOON}, - {13, 13, SPECIES_ROSELIA}, - {14, 14, SPECIES_ZIGZAGOON}, - {14, 14, SPECIES_ROSELIA}, - {13, 13, SPECIES_MARILL}, - {13, 13, SPECIES_ODDISH}, -#ifdef SAPPHIRE - {13, 13, SPECIES_VOLBEAT}, - {13, 13, SPECIES_VOLBEAT}, - {14, 14, SPECIES_VOLBEAT}, - {14, 14, SPECIES_VOLBEAT}, - {13, 13, SPECIES_ILLUMISE}, -#else - {13, 13, SPECIES_ILLUMISE}, - {13, 13, SPECIES_ILLUMISE}, - {14, 14, SPECIES_ILLUMISE}, - {14, 14, SPECIES_ILLUMISE}, - {13, 13, SPECIES_VOLBEAT}, -#endif - {13, 13, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route117_LandMonsInfo = {20, Route117_LandMons}; - -const struct WildPokemon Route117_WaterMons [] = -{ - {20, 30, SPECIES_MARILL}, - {10, 20, SPECIES_MARILL}, - {30, 35, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, - {20, 30, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route117_WaterMonsInfo = {4, Route117_WaterMons}; - -const struct WildPokemon Route117_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_CORPHISH}, - {25, 30, SPECIES_CORPHISH}, - {30, 35, SPECIES_CORPHISH}, - {20, 25, SPECIES_CORPHISH}, - {35, 40, SPECIES_CORPHISH}, - {40, 45, SPECIES_CORPHISH}, -}; -const struct WildPokemonInfo Route117_FishingMonsInfo = {30, Route117_FishingMons}; - -const struct WildPokemon Route118_LandMons [] = -{ - {24, 24, SPECIES_ZIGZAGOON}, - {24, 24, SPECIES_ELECTRIKE}, - {26, 26, SPECIES_ZIGZAGOON}, - {26, 26, SPECIES_ELECTRIKE}, - {26, 26, SPECIES_LINOONE}, - {26, 26, SPECIES_MANECTRIC}, - {25, 25, SPECIES_WINGULL}, - {25, 25, SPECIES_WINGULL}, - {26, 26, SPECIES_WINGULL}, - {26, 26, SPECIES_WINGULL}, - {27, 27, SPECIES_WINGULL}, - {25, 25, SPECIES_KECLEON}, -}; -const struct WildPokemonInfo Route118_LandMonsInfo = {20, Route118_LandMons}; - -const struct WildPokemon Route118_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route118_WaterMonsInfo = {4, Route118_WaterMons}; - -const struct WildPokemon Route118_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_CARVANHA}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_CARVANHA}, - {20, 25, SPECIES_CARVANHA}, - {35, 40, SPECIES_CARVANHA}, - {40, 45, SPECIES_CARVANHA}, -}; -const struct WildPokemonInfo Route118_FishingMonsInfo = {30, Route118_FishingMons}; - -const struct WildPokemon Route119_LandMons [] = -{ - {25, 25, SPECIES_ZIGZAGOON}, - {25, 25, SPECIES_LINOONE}, - {27, 27, SPECIES_ZIGZAGOON}, - {25, 25, SPECIES_ODDISH}, - {27, 27, SPECIES_LINOONE}, - {26, 26, SPECIES_ODDISH}, - {27, 27, SPECIES_ODDISH}, - {24, 24, SPECIES_ODDISH}, - {25, 25, SPECIES_TROPIUS}, - {26, 26, SPECIES_TROPIUS}, - {27, 27, SPECIES_TROPIUS}, - {25, 25, SPECIES_KECLEON}, -}; -const struct WildPokemonInfo Route119_LandMonsInfo = {15, Route119_LandMons}; - -const struct WildPokemon Route119_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route119_WaterMonsInfo = {4, Route119_WaterMons}; - -const struct WildPokemon Route119_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_CARVANHA}, - {25, 30, SPECIES_CARVANHA}, - {30, 35, SPECIES_CARVANHA}, - {20, 25, SPECIES_CARVANHA}, - {35, 40, SPECIES_CARVANHA}, - {40, 45, SPECIES_CARVANHA}, -}; -const struct WildPokemonInfo Route119_FishingMonsInfo = {30, Route119_FishingMons}; - -const struct WildPokemon Route120_LandMons [] = -{ - {25, 25, SPECIES_ZIGZAGOON}, - {25, 25, SPECIES_LINOONE}, - {27, 27, SPECIES_LINOONE}, - {25, 25, SPECIES_ODDISH}, - {25, 25, SPECIES_MARILL}, - {26, 26, SPECIES_ODDISH}, - {27, 27, SPECIES_ODDISH}, - {27, 27, SPECIES_MARILL}, - {25, 25, SPECIES_ABSOL}, - {27, 27, SPECIES_ABSOL}, - {25, 25, SPECIES_KECLEON}, - {25, 25, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route120_LandMonsInfo = {20, Route120_LandMons}; - -const struct WildPokemon Route120_WaterMons [] = -{ - {20, 30, SPECIES_MARILL}, - {10, 20, SPECIES_MARILL}, - {30, 35, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, - {20, 30, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route120_WaterMonsInfo = {4, Route120_WaterMons}; - -const struct WildPokemon Route120_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {20, 25, SPECIES_BARBOACH}, - {35, 40, SPECIES_BARBOACH}, - {40, 45, SPECIES_BARBOACH}, -}; -const struct WildPokemonInfo Route120_FishingMonsInfo = {30, Route120_FishingMons}; - -const struct WildPokemon Route121_LandMons [] = -{ - {26, 26, SPECIES_ZIGZAGOON}, -#ifdef SAPPHIRE - {26, 26, SPECIES_SHUPPET}, -#else - {26, 26, SPECIES_DUSKULL}, -#endif - {26, 26, SPECIES_LINOONE}, -#ifdef SAPPHIRE - {28, 28, SPECIES_SHUPPET}, -#else - {28, 28, SPECIES_DUSKULL}, -#endif - {28, 28, SPECIES_LINOONE}, - {26, 26, SPECIES_ODDISH}, - {28, 28, SPECIES_ODDISH}, - {28, 28, SPECIES_GLOOM}, - {26, 26, SPECIES_WINGULL}, - {27, 27, SPECIES_WINGULL}, - {28, 28, SPECIES_WINGULL}, - {25, 25, SPECIES_KECLEON}, -}; -const struct WildPokemonInfo Route121_LandMonsInfo = {20, Route121_LandMons}; - -const struct WildPokemon Route121_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route121_WaterMonsInfo = {4, Route121_WaterMons}; - -const struct WildPokemon Route121_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route121_FishingMonsInfo = {30, Route121_FishingMons}; - -const struct WildPokemon Route122_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route122_WaterMonsInfo = {4, Route122_WaterMons}; - -const struct WildPokemon Route122_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route122_FishingMonsInfo = {30, Route122_FishingMons}; - -const struct WildPokemon Route123_LandMons [] = -{ - {26, 26, SPECIES_ZIGZAGOON}, -#ifdef SAPPHIRE - {26, 26, SPECIES_SHUPPET}, -#else - {26, 26, SPECIES_DUSKULL}, -#endif - {26, 26, SPECIES_LINOONE}, -#ifdef SAPPHIRE - {28, 28, SPECIES_SHUPPET}, -#else - {28, 28, SPECIES_DUSKULL}, -#endif - {28, 28, SPECIES_LINOONE}, - {26, 26, SPECIES_ODDISH}, - {28, 28, SPECIES_ODDISH}, - {28, 28, SPECIES_GLOOM}, - {26, 26, SPECIES_WINGULL}, - {27, 27, SPECIES_WINGULL}, - {28, 28, SPECIES_WINGULL}, - {25, 25, SPECIES_KECLEON}, -}; -const struct WildPokemonInfo Route123_LandMonsInfo = {20, Route123_LandMons}; - -const struct WildPokemon Route123_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route123_WaterMonsInfo = {4, Route123_WaterMons}; - -const struct WildPokemon Route123_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route123_FishingMonsInfo = {30, Route123_FishingMons}; - -const struct WildPokemon Route124_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route124_WaterMonsInfo = {4, Route124_WaterMons}; - -const struct WildPokemon Route124_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route124_FishingMonsInfo = {30, Route124_FishingMons}; - -const struct WildPokemon Route125_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route125_WaterMonsInfo = {4, Route125_WaterMons}; - -const struct WildPokemon Route125_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route125_FishingMonsInfo = {30, Route125_FishingMons}; - -const struct WildPokemon Route126_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route126_WaterMonsInfo = {4, Route126_WaterMons}; - -const struct WildPokemon Route126_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route126_FishingMonsInfo = {30, Route126_FishingMons}; - -const struct WildPokemon Route127_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route127_WaterMonsInfo = {4, Route127_WaterMons}; - -const struct WildPokemon Route127_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route127_FishingMonsInfo = {30, Route127_FishingMons}; - -const struct WildPokemon Route128_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route128_WaterMonsInfo = {4, Route128_WaterMons}; - -const struct WildPokemon Route128_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_LUVDISC}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_LUVDISC}, - {30, 35, SPECIES_WAILMER}, - {30, 35, SPECIES_CORSOLA}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route128_FishingMonsInfo = {30, Route128_FishingMons}; - -const struct WildPokemon Route129_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, -#ifdef SAPPHIRE - {25, 30, SPECIES_WAILORD}, -#else - {35, 40, SPECIES_WAILORD}, -#endif -}; -const struct WildPokemonInfo Route129_WaterMonsInfo = {4, Route129_WaterMons}; - -const struct WildPokemon Route129_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route129_FishingMonsInfo = {30, Route129_FishingMons}; - -const struct WildPokemon Route130_LandMons [] = -{ - {30, 30, SPECIES_WYNAUT}, - {35, 35, SPECIES_WYNAUT}, - {25, 25, SPECIES_WYNAUT}, - {40, 40, SPECIES_WYNAUT}, - {20, 20, SPECIES_WYNAUT}, - {45, 45, SPECIES_WYNAUT}, - {15, 15, SPECIES_WYNAUT}, - {50, 50, SPECIES_WYNAUT}, - {10, 10, SPECIES_WYNAUT}, - {5, 5, SPECIES_WYNAUT}, - {10, 10, SPECIES_WYNAUT}, - {5, 5, SPECIES_WYNAUT}, -}; -const struct WildPokemonInfo Route130_LandMonsInfo = {20, Route130_LandMons}; - -const struct WildPokemon Route130_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route130_WaterMonsInfo = {4, Route130_WaterMons}; - -const struct WildPokemon Route130_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route130_FishingMonsInfo = {30, Route130_FishingMons}; - -const struct WildPokemon Route131_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route131_WaterMonsInfo = {4, Route131_WaterMons}; - -const struct WildPokemon Route131_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route131_FishingMonsInfo = {30, Route131_FishingMons}; - -const struct WildPokemon Route132_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route132_WaterMonsInfo = {4, Route132_WaterMons}; - -const struct WildPokemon Route132_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_HORSEA}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route132_FishingMonsInfo = {30, Route132_FishingMons}; - -const struct WildPokemon Route133_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route133_WaterMonsInfo = {4, Route133_WaterMons}; - -const struct WildPokemon Route133_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_HORSEA}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route133_FishingMonsInfo = {30, Route133_FishingMons}; - -const struct WildPokemon Route134_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route134_WaterMonsInfo = {4, Route134_WaterMons}; - -const struct WildPokemon Route134_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_HORSEA}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route134_FishingMonsInfo = {30, Route134_FishingMons}; - -const struct WildPokemon SafariZone_Northwest_LandMons [] = -{ - {27, 27, SPECIES_RHYHORN}, - {27, 27, SPECIES_ODDISH}, - {29, 29, SPECIES_RHYHORN}, - {29, 29, SPECIES_ODDISH}, - {27, 27, SPECIES_DODUO}, - {29, 29, SPECIES_GLOOM}, - {31, 31, SPECIES_GLOOM}, - {29, 29, SPECIES_DODUO}, - {29, 29, SPECIES_DODRIO}, - {27, 27, SPECIES_PINSIR}, - {31, 31, SPECIES_DODRIO}, - {29, 29, SPECIES_PINSIR}, -}; -const struct WildPokemonInfo SafariZone_Northwest_LandMonsInfo = {25, SafariZone_Northwest_LandMons}; - -const struct WildPokemon SafariZone_Northwest_WaterMons [] = -{ - {20, 30, SPECIES_PSYDUCK}, - {20, 30, SPECIES_PSYDUCK}, - {30, 35, SPECIES_PSYDUCK}, - {30, 35, SPECIES_GOLDUCK}, - {25, 40, SPECIES_GOLDUCK}, -}; -const struct WildPokemonInfo SafariZone_Northwest_WaterMonsInfo = {9, SafariZone_Northwest_WaterMons}; - -const struct WildPokemon SafariZone_Northwest_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 25, SPECIES_GOLDEEN}, - {10, 30, SPECIES_GOLDEEN}, - {25, 30, SPECIES_GOLDEEN}, - {30, 35, SPECIES_GOLDEEN}, - {30, 35, SPECIES_SEAKING}, - {35, 40, SPECIES_SEAKING}, - {25, 30, SPECIES_SEAKING}, -}; -const struct WildPokemonInfo SafariZone_Northwest_FishingMonsInfo = {35, SafariZone_Northwest_FishingMons}; - -const struct WildPokemon SafariZone_Northeast_LandMons [] = -{ - {27, 27, SPECIES_PHANPY}, - {27, 27, SPECIES_ODDISH}, - {29, 29, SPECIES_PHANPY}, - {29, 29, SPECIES_ODDISH}, - {27, 27, SPECIES_NATU}, - {29, 29, SPECIES_GLOOM}, - {31, 31, SPECIES_GLOOM}, - {29, 29, SPECIES_NATU}, - {29, 29, SPECIES_XATU}, - {27, 27, SPECIES_HERACROSS}, - {31, 31, SPECIES_XATU}, - {29, 29, SPECIES_HERACROSS}, -}; -const struct WildPokemonInfo SafariZone_Northeast_LandMonsInfo = {25, SafariZone_Northeast_LandMons}; - -const struct WildPokemon SafariZone_Northeast_RockSmashMons [] = -{ - {10, 15, SPECIES_GEODUDE}, - {5, 10, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, - {20, 25, SPECIES_GEODUDE}, - {25, 30, SPECIES_GEODUDE}, -}; -const struct WildPokemonInfo SafariZone_Northeast_RockSmashMonsInfo = {25, SafariZone_Northeast_RockSmashMons}; - -const struct WildPokemon SafariZone_Southwest_LandMons [] = -{ - {25, 25, SPECIES_ODDISH}, - {27, 27, SPECIES_ODDISH}, - {25, 25, SPECIES_GIRAFARIG}, - {27, 27, SPECIES_GIRAFARIG}, - {25, 25, SPECIES_NATU}, -#ifdef SAPPHIRE - {27, 27, SPECIES_DODUO}, -#else - {25, 25, SPECIES_DODUO}, -#endif - {25, 25, SPECIES_GLOOM}, - {27, 27, SPECIES_WOBBUFFET}, - {25, 25, SPECIES_PIKACHU}, - {27, 27, SPECIES_WOBBUFFET}, - {27, 27, SPECIES_PIKACHU}, - {29, 29, SPECIES_WOBBUFFET}, -}; -const struct WildPokemonInfo SafariZone_Southwest_LandMonsInfo = {25, SafariZone_Southwest_LandMons}; - -const struct WildPokemon SafariZone_Southwest_WaterMons [] = -{ - {20, 30, SPECIES_PSYDUCK}, - {20, 30, SPECIES_PSYDUCK}, - {30, 35, SPECIES_PSYDUCK}, - {30, 35, SPECIES_PSYDUCK}, - {30, 35, SPECIES_PSYDUCK}, -}; -const struct WildPokemonInfo SafariZone_Southwest_WaterMonsInfo = {9, SafariZone_Southwest_WaterMons}; - -const struct WildPokemon SafariZone_Southwest_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 25, SPECIES_GOLDEEN}, - {10, 30, SPECIES_GOLDEEN}, - {25, 30, SPECIES_GOLDEEN}, - {30, 35, SPECIES_GOLDEEN}, - {30, 35, SPECIES_SEAKING}, - {35, 40, SPECIES_SEAKING}, - {25, 30, SPECIES_SEAKING}, -}; -const struct WildPokemonInfo SafariZone_Southwest_FishingMonsInfo = {35, SafariZone_Southwest_FishingMons}; - -const struct WildPokemon SafariZone_Southeast_LandMons [] = -{ - {25, 25, SPECIES_ODDISH}, - {27, 27, SPECIES_ODDISH}, - {25, 25, SPECIES_GIRAFARIG}, - {27, 27, SPECIES_GIRAFARIG}, - {25, 25, SPECIES_NATU}, - {25, 25, SPECIES_DODUO}, - {25, 25, SPECIES_GLOOM}, - {27, 27, SPECIES_WOBBUFFET}, - {25, 25, SPECIES_PIKACHU}, - {27, 27, SPECIES_WOBBUFFET}, - {27, 27, SPECIES_PIKACHU}, - {29, 29, SPECIES_WOBBUFFET}, -}; -const struct WildPokemonInfo SafariZone_Southeast_LandMonsInfo = {25, SafariZone_Southeast_LandMons}; - -const struct WildPokemon DewfordTown_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo DewfordTown_WaterMonsInfo = {4, DewfordTown_WaterMons}; - -const struct WildPokemon DewfordTown_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo DewfordTown_FishingMonsInfo = {10, DewfordTown_FishingMons}; - -const struct WildPokemon PacifidlogTown_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo PacifidlogTown_WaterMonsInfo = {4, PacifidlogTown_WaterMons}; - -const struct WildPokemon PacifidlogTown_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo PacifidlogTown_FishingMonsInfo = {10, PacifidlogTown_FishingMons}; - -const struct WildPokemon Underwater1_WaterMons [] = -{ - {20, 30, SPECIES_CLAMPERL}, - {20, 30, SPECIES_CHINCHOU}, - {30, 35, SPECIES_CLAMPERL}, - {30, 35, SPECIES_RELICANTH}, - {30, 35, SPECIES_RELICANTH}, -}; -const struct WildPokemonInfo Underwater1_WaterMonsInfo = {4, Underwater1_WaterMons}; - -const struct WildPokemon Underwater2_WaterMons [] = -{ - {20, 30, SPECIES_CLAMPERL}, - {20, 30, SPECIES_CHINCHOU}, - {30, 35, SPECIES_CLAMPERL}, - {30, 35, SPECIES_RELICANTH}, - {30, 35, SPECIES_RELICANTH}, -}; -const struct WildPokemonInfo Underwater2_WaterMonsInfo = {4, Underwater2_WaterMons}; - - -extern u16 gRoute119WaterTileData[]; -extern u16 gScriptResult; -extern struct WildPokemon gWildFeebasRoute119Data; -extern u8 Event_RepelWoreOff[]; - -EWRAM_DATA static u8 sWildEncountersDisabled = 0; -EWRAM_DATA static u32 sFeebasRngValue = 0; - -#define NUM_FEEBAS_SPOTS 6 - -static u16 FeebasRandom(void); -static void FeebasSeedRng(u16 seed); - -static bool8 RepelCheck(u8 level); -static void ApplyFluteEncounterRateMod(u32 *encRate); -static void ApplyCleanseTagEncounterRateMod(u32 *encRate); - -void DisableWildEncounters(bool8 disabled) -{ - sWildEncountersDisabled = disabled; -} - -static u16 GetRoute119WaterTileNum(s16 x, s16 y, u8 section) -{ - u16 xCur; - u16 yCur; - u16 yMin = gRoute119WaterTileData[section * 3 + 0]; - u16 yMax = gRoute119WaterTileData[section * 3 + 1]; - u16 tileNum = gRoute119WaterTileData[section * 3 + 2]; - - for (yCur = yMin; yCur <= yMax; yCur++) - { - for (xCur = 0; xCur < gMapHeader.mapData->width; xCur++) - { - if (sub_805759C(MapGridGetMetatileBehaviorAt(xCur + 7, yCur + 7)) == TRUE) - { - tileNum++; - if (x == xCur && y == yCur) - return tileNum; - } - } - } - return tileNum + 1; -} - -static bool8 CheckFeebas(void) -{ - u8 i; - u16 feebasSpots[6]; - s16 x; - s16 y; - u8 route119section = 0; - u16 waterTileNum; - - if (gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 0x22) - { - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - x -= 7; - y -= 7; - -#ifdef NONMATCHING - if (y >= gRoute119WaterTileData[3 * 1 + 0] && y <= gRoute119WaterTileData[3 * 1 + 1]) - route119section = 1; - if (y >= gRoute119WaterTileData[3 * 2 + 0] && y <= gRoute119WaterTileData[3 * 2 + 1]) - route119section = 2; -#else - { - register u16 *arr asm("r0"); - if (y >= (arr = gRoute119WaterTileData)[3 * 1 + 0] && y <= arr[3 * 1 + 1]) - route119section = 1; - if (y >= arr[3 * 2 + 0] && y <= arr[3 * 2 + 1]) - route119section = 2; - } -#endif - - if (Random() % 100 > 49) //50% chance of encountering Feebas - return FALSE; - - FeebasSeedRng(gSaveBlock1.easyChatPairs[0].unk2); - for (i = 0; i != NUM_FEEBAS_SPOTS;) - { - feebasSpots[i] = FeebasRandom() % 447; - if (feebasSpots[i] == 0) - feebasSpots[i] = 447; - if (feebasSpots[i] < 1 || feebasSpots[i] >= 4) - i++; - } - waterTileNum = GetRoute119WaterTileNum(x, y, route119section); - for (i = 0; i < NUM_FEEBAS_SPOTS; i++) - { - if (waterTileNum == feebasSpots[i]) - return TRUE; - } - } - return FALSE; -} - -static u16 FeebasRandom(void) -{ - sFeebasRngValue = 12345 + 0x41C64E6D * sFeebasRngValue; - return sFeebasRngValue >> 16; -} - -static void FeebasSeedRng(u16 seed) -{ - sFeebasRngValue = seed; -} - -static u8 ChooseWildMonIndex_Land(void) -{ - u8 rand = Random() % 100; - - if (rand < 20) //20% chance - return 0; - if (rand >= 20 && rand < 40) //20% chance - return 1; - if (rand >= 40 && rand < 50) //10% chance - return 2; - if (rand >= 50 && rand < 60) //10% chance - return 3; - if (rand >= 60 && rand < 70) //10% chance - return 4; - if (rand >= 70 && rand < 80) //10% chance - return 5; - if (rand >= 80 && rand < 85) //5% chance - return 6; - if (rand >= 85 && rand < 90) //5% chance - return 7; - if (rand >= 90 && rand < 94) //4% chance - return 8; - if (rand >= 94 && rand < 98) //4% chance - return 9; - if (rand == 98) //1% chance - return 10; - else //1% chance - return 11; -} - -static u8 ChooseWildMonIndex_Water(void) -{ - u8 rand = Random() % 100; - - if (rand < 60) //60% chance - return 0; - if (rand >= 60 && rand < 90) //30% chance - return 1; - if (rand >= 90 && rand < 95) //5% chance - return 2; - if (rand >= 95 && rand < 99) //4% chance - return 3; - else //1% chance - return 4; -} - -enum -{ - OLD_ROD, - GOOD_ROD, - SUPER_ROD -}; - -static u8 ChooseWildMonIndex_Fishing(u8 rod) -{ - u8 wildMonIndex = 0; - u8 rand = Random() % 100; - - switch (rod) - { - case OLD_ROD: - if (rand < 70) //70% chance - wildMonIndex = 0; - else //30% chance - wildMonIndex = 1; - break; - case GOOD_ROD: - if (rand < 60) //60% chance - wildMonIndex = 2; - if (rand >= 60 && rand < 80) //20% chance - wildMonIndex = 3; - if (rand >= 80 && rand < 100) //20% chance - wildMonIndex = 4; - break; - case SUPER_ROD: - if (rand < 40) //40% chance - wildMonIndex = 5; - if (rand >= 40 && rand < 80) //40% chance - wildMonIndex = 6; - if (rand >= 80 && rand < 95) //15% chance - wildMonIndex = 7; - if (rand >= 95 && rand < 99) //4% chance - wildMonIndex = 8; - if (rand == 99) //1% chance - wildMonIndex = 9; - break; - } - return wildMonIndex; -} - -static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon) -{ - u8 min; - u8 max; - u8 range; - u8 rand; - - //Make sure minimum level is less than maximum level - if (wildPokemon->maxLevel >= wildPokemon->minLevel) - { - min = wildPokemon->minLevel; - max = wildPokemon->maxLevel; - } - else - { - min = wildPokemon->maxLevel; - max = wildPokemon->minLevel; - } - range = max - min + 1; - rand = Random() % range; - return min + rand; -} - -static u16 GetCurrentMapWildMonHeader(void) -{ - u16 i; - - for (i = 0; gWildMonHeaders[i].mapGroup != 0xFF; i++) - { - if (gWildMonHeaders[i].mapGroup == gSaveBlock1.location.mapGroup && - gWildMonHeaders[i].mapNum == gSaveBlock1.location.mapNum) - return i; - } - return -1; -} - -static u8 PickWildMonNature(void) -{ - u8 i; - u8 j; - struct Pokeblock *safariPokeblock; - u8 natures[25]; - - if (GetSafariZoneFlag() == TRUE && Random() % 100 < 80) - { - safariPokeblock = SafariZoneGetActivePokeblock(); - if (safariPokeblock != NULL) - { - for (i = 0; i < 25; i++) - natures[i] = i; - for (i = 0; i < 24; i++) - { - for (j = i + 1; j < 25; j++) - { - if (Random() & 1) - { - u8 temp = natures[i]; - - natures[i] = natures[j]; - natures[j] = temp; - } - } - } - for (i = 0; i < 25; i++) - { - if (sub_810CAE4(natures[i], safariPokeblock) > 0) - return natures[i]; - } - } - } - return Random() % 25; -} - -static void CreateWildMon(u16 species, u8 b) -{ - ZeroEnemyPartyMons(); - CreateMonWithNature(&gEnemyParty[0], species, b, 0x20, PickWildMonNature()); -} - -static bool8 GenerateWildMon(struct WildPokemonInfo *wildMonInfo, u8 area, bool8 checkRepel) -{ - u8 wildMonIndex = 0; - u8 level; - - switch (area) - { - case 0: - wildMonIndex = ChooseWildMonIndex_Land(); - break; - case 1: - wildMonIndex = ChooseWildMonIndex_Water(); - break; - case 2: - wildMonIndex = ChooseWildMonIndex_Water(); - break; - } - level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]); - if (checkRepel == TRUE && RepelCheck(level) == FALSE) - return FALSE; - else - { - CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level); - return TRUE; - } -} - -static u16 GenerateFishingWildMon(struct WildPokemonInfo *wildMonInfo, u8 rod) -{ - u8 wildMonIndex = ChooseWildMonIndex_Fishing(rod); - u8 level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]); - - CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level); - return wildMonInfo->wildPokemon[wildMonIndex].species; -} - -static bool8 SetUpMassOutbreakEncounter(bool8 checkRepel) -{ - u16 i; - - if (checkRepel == TRUE && RepelCheck(gSaveBlock1.outbreakPokemonLevel) == 0) - return FALSE; - else - { - CreateWildMon(gSaveBlock1.outbreakPokemonSpecies, gSaveBlock1.outbreakPokemonLevel); - for (i = 0; i < 4; i++) - SetMonMoveSlot(&gEnemyParty[0], gSaveBlock1.outbreakPokemonMoves[i], i); - return TRUE; - } -} - -static bool8 DoMassOutbreakEncounterTest(void) -{ - if (gSaveBlock1.outbreakPokemonSpecies != 0 - && gSaveBlock1.location.mapNum == gSaveBlock1.outbreakLocationMapNum - && gSaveBlock1.location.mapGroup == gSaveBlock1.outbreakLocationMapGroup) - { - if (Random() % 100 < gSaveBlock1.outbreakPokemonProbability) - return TRUE; - } - return FALSE; -} - -static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate) -{ - if (Random() % 2880 < encounterRate) - return TRUE; - else - return FALSE; -} - -static bool8 DoWildEncounterTest(u32 encounterRate, bool8 ignoreAbility) -{ - encounterRate *= 16; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) - encounterRate = encounterRate * 80 / 100; - ApplyFluteEncounterRateMod(&encounterRate); - ApplyCleanseTagEncounterRateMod(&encounterRate); - if (!ignoreAbility) - { - // UB: Too few arguments for function 'GetMonData' - if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)) - { - u32 ability = GetMonAbility(&gPlayerParty[0]); - if (ability == ABILITY_STENCH) - encounterRate /= 2; - if (ability == ABILITY_ILLUMINATE) - encounterRate *= 2; - } - } - if (encounterRate > 2880) - encounterRate = 2880; - return DoWildEncounterRateDiceRoll(encounterRate); -} - -static bool8 DoGlobalWildEncounterDiceRoll(void) -{ - if (Random() % 100 >= 60) - return FALSE; - else - return TRUE; -} - -bool8 StandardWildEncounter(u16 a, u16 b) -{ - u16 headerNum; - struct Roamer *roamer; - - if (sWildEncountersDisabled == TRUE) - return 0; - else - { - headerNum = GetCurrentMapWildMonHeader(); - if (headerNum != 0xFFFF) - { - if (MetatileBehavior_IsLandWildEncounter(a) == TRUE) - { - if (gWildMonHeaders[headerNum].landMonsInfo) - { - if (b != a && !DoGlobalWildEncounterDiceRoll()) - return 0; - - if (DoWildEncounterTest(gWildMonHeaders[headerNum].landMonsInfo->encounterRate, 0) == TRUE) - { - if (TryStartRoamerEncounter() == TRUE) - { - roamer = &gSaveBlock1.roamer; - if (RepelCheck(roamer->level)) - { - StartBattle_Roamer(); - return 1; - } - } - else - { - if (DoMassOutbreakEncounterTest() == TRUE && SetUpMassOutbreakEncounter(1) == TRUE) - { - CheckForSafariZoneAndProceed(); - return 1; - } - if (GenerateWildMon(gWildMonHeaders[headerNum].landMonsInfo, 0, TRUE) == TRUE) - { - goto label; - } - } - } - } - } - else if (MetatileBehavior_IsWaterWildEncounter(a) == TRUE - || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(a) == TRUE)) - { - if (gWildMonHeaders[headerNum].waterMonsInfo) - { - if (b != a && !DoGlobalWildEncounterDiceRoll()) - return 0; - - if (DoWildEncounterTest(gWildMonHeaders[headerNum].waterMonsInfo->encounterRate, 0) == TRUE) - { - if (TryStartRoamerEncounter() == TRUE) - { - roamer = &gSaveBlock1.roamer; - if (RepelCheck(roamer->level)) - { - StartBattle_Roamer(); - return 1; - } - } - else - { - //_08085268 - if (GenerateWildMon(gWildMonHeaders[headerNum].waterMonsInfo, 1, TRUE) == TRUE) - { - label: - //_0808527A - CheckForSafariZoneAndProceed(); - return 1; - } - } - } - } - } - } - } - return 0; -} - -void RockSmashWildEncounter(void) -{ - u16 headerNum = GetCurrentMapWildMonHeader(); - - if (headerNum != 0xFFFF) - { - struct WildPokemonInfo *wildPokemonInfo = gWildMonHeaders[headerNum].rockSmashMonsInfo; - - if (wildPokemonInfo == NULL) - { - gScriptResult = 0; - return; - } - else if (DoWildEncounterTest(wildPokemonInfo->encounterRate, 1) == TRUE - && GenerateWildMon(wildPokemonInfo, 2, TRUE) == TRUE) - { - CheckForSafariZoneAndProceed(); - gScriptResult = 1; - return; - } - } - gScriptResult = 0; - return; -} - -bool8 SweetScentWildEncounter(void) -{ - s16 x; - s16 y; - u16 headerNum; - struct WildPokemonInfo *wildPokemonInfo; - - PlayerGetDestCoords(&x, &y); - if ((headerNum = GetCurrentMapWildMonHeader()) != 0xFFFF) - { - if (MetatileBehavior_IsLandWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == 1) - { - wildPokemonInfo = gWildMonHeaders[headerNum].landMonsInfo; - if (wildPokemonInfo == NULL) - return FALSE; - if (TryStartRoamerEncounter() == TRUE) - { - StartBattle_Roamer(); - return TRUE; - } - if (DoMassOutbreakEncounterTest() == TRUE) - SetUpMassOutbreakEncounter(0); - else - GenerateWildMon(wildPokemonInfo, 0, FALSE); - CheckForSafariZoneAndProceed(); - return TRUE; - } - else if (MetatileBehavior_IsWaterWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == 1) - { - wildPokemonInfo = gWildMonHeaders[headerNum].waterMonsInfo; - if (wildPokemonInfo == NULL) - return FALSE; - if (TryStartRoamerEncounter() == TRUE) - { - StartBattle_Roamer(); - return TRUE; - } - GenerateWildMon(wildPokemonInfo, 1, FALSE); - CheckForSafariZoneAndProceed(); - return TRUE; - } - } - return FALSE; -} - -bool8 GetFishingWildMonListHeader(void) -{ - u16 headerNum = GetCurrentMapWildMonHeader(); - - if (headerNum != 0xFFFF && gWildMonHeaders[headerNum].fishingMonsInfo != NULL) - return TRUE; - else - return FALSE; -} - -void FishingWildEncounter(u8 rod) -{ - u16 species; - - if (CheckFeebas() == TRUE) - { - u8 level = ChooseWildMonLevel(&gWildFeebasRoute119Data); - - species = gWildFeebasRoute119Data.species; - CreateWildMon(species, level); - } - else - { - species = GenerateFishingWildMon( - gWildMonHeaders[GetCurrentMapWildMonHeader()].fishingMonsInfo, - rod); - } - IncrementGameStat(12); - sub_80BEA50(species); - CheckForSafariZoneAndProceed(); -} - -u16 GetLocalWildMon(bool8 *isWaterMon) -{ - u16 headerNum; - struct WildPokemonInfo *landMonsInfo; - struct WildPokemonInfo *waterMonsInfo; - - *isWaterMon = FALSE; - headerNum = GetCurrentMapWildMonHeader(); - if (headerNum == 0xFFFF) - return 0; - landMonsInfo = gWildMonHeaders[headerNum].landMonsInfo; - waterMonsInfo = gWildMonHeaders[headerNum].waterMonsInfo; - //Neither - if (landMonsInfo == NULL && waterMonsInfo == NULL) - return 0; - //Land Pokemon - if (landMonsInfo != NULL && waterMonsInfo == NULL) - return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; - //Water Pokemon - if (landMonsInfo == NULL && waterMonsInfo != NULL) - { - *isWaterMon = TRUE; - return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; - } - //Either land or water Pokemon - if ((Random() % 100) < 80) - return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; - else - { - *isWaterMon = TRUE; - return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; - } -} - -u16 GetMirageIslandMon(void) -{ - u16 headerNum = GetCurrentMapWildMonHeader(); - - if (headerNum != 0xFFFF) - { - struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerNum].waterMonsInfo; - - if (waterMonsInfo) - return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; - } - return 0; -} - -bool8 UpdateRepelCounter(void) -{ - u16 steps = VarGet(VAR_REPEL_STEP_COUNT); - - if (steps != 0) - { - steps--; - VarSet(VAR_REPEL_STEP_COUNT, steps); - if (steps == 0) - { - ScriptContext1_SetupScript(Event_RepelWoreOff); - return TRUE; - } - } - return FALSE; -} - -//Returns FALSE if Repel prevents wild Pokemon at the specified level from appearing -static bool8 RepelCheck(u8 level) -{ - u8 i; - - if (!VarGet(VAR_REPEL_STEP_COUNT)) - return TRUE; - else - { - for (i = 0; i < 6; i++) - { - // UB: Too few arguments for function 'GetMonData' - if (GetMonData(&gPlayerParty[i], MON_DATA_HP) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) - { - if (level < (u8)GetMonData(&gPlayerParty[i], MON_DATA_LEVEL)) - return FALSE; - else - return TRUE; - } - } - return FALSE; - } -} - -static void ApplyFluteEncounterRateMod(u32 *encRate) -{ - if (FlagGet(SYS_ENC_UP_ITEM) == TRUE) - *encRate += *encRate / 2; - else if (FlagGet(SYS_ENC_DOWN_ITEM) == TRUE) - *encRate = *encRate / 2; -} - -static void ApplyCleanseTagEncounterRateMod(u32 *encRate) -{ - // UB: Too few arguments for function 'GetMonData' - if (GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM) == 0xBE) - *encRate = *encRate * 2 / 3; -} -- cgit v1.2.3 From 2fc46db68496ae03e99b5ae131fceba6ba0e2127 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 12 Aug 2017 01:40:31 -0400 Subject: german fix --- src/field/decoration.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/field/decoration.c b/src/field/decoration.c index da33b3ab7..dde364069 100644 --- a/src/field/decoration.c +++ b/src/field/decoration.c @@ -619,7 +619,7 @@ const u8 DecorDesc_REGISTEEL_DOLL[] = _( "Place it on a mat\n" "or a desk."); #elif GERMAN -#include "data/decoration/descriptions_de.h" +#include "../data/decoration/descriptions_de.h" #endif const u16 DecorGfx_SMALL_DESK[] = { @@ -1389,7 +1389,7 @@ const struct Decoration gDecorations[] = { {DECOR_REGISTEEL_DOLL, _("REGISTEEL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGISTEEL_DOLL, DecorGfx_REGISTEEL_DOLL} }; #elif GERMAN -#include "data/decoration/decorations.h" +#include "../data/decoration/decorations.h" #endif const u8 *const gUnknown_083EC5E4[] = { -- cgit v1.2.3 From b9e96a1ffa69f8dc1ae74374954318b60a1aae48 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sun, 13 Aug 2017 21:30:35 -0400 Subject: move GBA library files to libs. --- src/engine/agb_flash.c | 295 --------------- src/engine/agb_flash_1m.c | 86 ----- src/engine/agb_flash_le.c | 31 -- src/engine/agb_flash_mx.c | 197 ---------- src/engine/libc.c | 143 -------- src/engine/m4a_2.c | 912 ---------------------------------------------- src/engine/m4a_4.c | 545 --------------------------- src/engine/m4a_tables.c | 307 ---------------- src/engine/siirtc.c | 432 ---------------------- src/libs/agb_flash.c | 295 +++++++++++++++ src/libs/agb_flash_1m.c | 86 +++++ src/libs/agb_flash_le.c | 31 ++ src/libs/agb_flash_mx.c | 197 ++++++++++ src/libs/libc.c | 143 ++++++++ src/libs/m4a_2.c | 912 ++++++++++++++++++++++++++++++++++++++++++++++ src/libs/m4a_4.c | 545 +++++++++++++++++++++++++++ src/libs/m4a_tables.c | 307 ++++++++++++++++ src/libs/siirtc.c | 432 ++++++++++++++++++++++ 18 files changed, 2948 insertions(+), 2948 deletions(-) delete mode 100644 src/engine/agb_flash.c delete mode 100644 src/engine/agb_flash_1m.c delete mode 100644 src/engine/agb_flash_le.c delete mode 100644 src/engine/agb_flash_mx.c delete mode 100644 src/engine/libc.c delete mode 100644 src/engine/m4a_2.c delete mode 100644 src/engine/m4a_4.c delete mode 100644 src/engine/m4a_tables.c delete mode 100644 src/engine/siirtc.c create mode 100644 src/libs/agb_flash.c create mode 100644 src/libs/agb_flash_1m.c create mode 100644 src/libs/agb_flash_le.c create mode 100644 src/libs/agb_flash_mx.c create mode 100644 src/libs/libc.c create mode 100644 src/libs/m4a_2.c create mode 100644 src/libs/m4a_4.c create mode 100644 src/libs/m4a_tables.c create mode 100644 src/libs/siirtc.c (limited to 'src') diff --git a/src/engine/agb_flash.c b/src/engine/agb_flash.c deleted file mode 100644 index 340d469a7..000000000 --- a/src/engine/agb_flash.c +++ /dev/null @@ -1,295 +0,0 @@ -#include "gba/gba.h" -#include "gba/flash_internal.h" - -static u8 sTimerNum; -static u16 sTimerCount; -static vu16 *sTimerReg; -static u16 sSavedIme; - -u8 gFlashTimeoutFlag; -u8 (*PollFlashStatus)(u8 *); -u16 (*WaitForFlashWrite)(u8 phase, u8 *addr, u8 lastData); -u16 (*ProgramFlashSector)(u16 sectorNum, u8 *src); -const struct FlashType *gFlash; -u16 (*ProgramFlashByte)(u16 sectorNum, u32 offset, u8 data); -u16 gFlashNumRemainingBytes; -u16 (*EraseFlashChip)(); -u16 (*EraseFlashSector)(u16 sectorNum); -const u16 *gFlashMaxTime; - -void SetReadFlash1(u16 *dest); - -void SwitchFlashBank(u8 bankNum) -{ - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0xB0); - FLASH_WRITE(0x0000, bankNum); -} - -#define DELAY() \ -do { \ - vu16 i; \ - for (i = 20000; i != 0; i--) \ - ; \ -} while (0) - -u16 ReadFlashId(void) -{ - u16 flashId; - u16 readFlash1Buffer[0x20]; - u8 (*readFlash1)(u8 *); - - SetReadFlash1(readFlash1Buffer); - readFlash1 = (u8 (*)(u8 *))((s32)readFlash1Buffer + 1); - - // Enter ID mode. - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0x90); - DELAY(); - - flashId = readFlash1(FLASH_BASE + 1) << 8; - flashId |= readFlash1(FLASH_BASE); - - // Leave ID mode. - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0xF0); - FLASH_WRITE(0x5555, 0xF0); - DELAY(); - - return flashId; -} - -void FlashTimerIntr(void) -{ - if (sTimerCount != 0 && --sTimerCount == 0) - gFlashTimeoutFlag = 1; -} - -u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)) -{ - if (timerNum >= 4) - return 1; - - sTimerNum = timerNum; - sTimerReg = ®_TMCNT(sTimerNum); - *intrFunc = FlashTimerIntr; - return 0; -} - -void StartFlashTimer(u8 phase) -{ - const u16 *maxTime = &gFlashMaxTime[phase * 3]; - sSavedIme = REG_IME; - REG_IME = 0; - sTimerReg[1] = 0; - REG_IE |= (INTR_FLAG_TIMER0 << sTimerNum); - gFlashTimeoutFlag = 0; - sTimerCount = *maxTime++; - *sTimerReg++ = *maxTime++; - *sTimerReg-- = *maxTime++; - REG_IF = (INTR_FLAG_TIMER0 << sTimerNum); - REG_IME = 1; -} - -void StopFlashTimer(void) -{ - REG_IME = 0; - *sTimerReg++ = 0; - *sTimerReg-- = 0; - REG_IE &= ~(INTR_FLAG_TIMER0 << sTimerNum); - REG_IME = sSavedIme; -} - -u8 ReadFlash1(u8 *addr) -{ - return *addr; -} - -void SetReadFlash1(u16 *dest) -{ - u16 *src; - u16 i; - - PollFlashStatus = (u8 (*)(u8 *))((s32)dest + 1); - - src = (u16 *)ReadFlash1; - src = (u16 *)((s32)src ^ 1); - - i = ((s32)SetReadFlash1 - (s32)ReadFlash1) >> 1; - - while (i != 0) - { - *dest++ = *src++; - i--; - } -} - -void ReadFlash_Core(u8 *src, u8 *dest, u32 size) -{ - while (size-- != 0) - { - *dest++ = *src++; - } -} - -void ReadFlash(u16 sectorNum, u32 offset, u8 *dest, u32 size) -{ - u8 *src; - u16 i; - u16 readFlash_Core_Buffer[0x40]; - u16 *funcSrc; - u16 *funcDest; - void (*readFlash_Core)(u8 *, u8 *, u32); - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - - if (gFlash->romSize == FLASH_ROM_SIZE_1M) - { - SwitchFlashBank(sectorNum / SECTORS_PER_BANK); - sectorNum %= SECTORS_PER_BANK; - } - - funcSrc = (u16 *)ReadFlash_Core; - funcSrc = (u16 *)((s32)funcSrc ^ 1); - funcDest = readFlash_Core_Buffer; - - i = ((s32)ReadFlash - (s32)ReadFlash_Core) >> 1; - - while (i != 0) - { - *funcDest++ = *funcSrc++; - i--; - } - - readFlash_Core = (void (*)(u8 *, u8 *, u32))((s32)readFlash_Core_Buffer + 1); - - src = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset; - - readFlash_Core(src, dest, size); -} - -u32 VerifyFlashSector_Core(u8 *src, u8 *tgt, u32 size) -{ - while (size-- != 0) - { - if (*tgt++ != *src++) - return (u32)(tgt - 1); - } - - return 0; -} - -u32 VerifyFlashSector(u16 sectorNum, u8 *src) -{ - u16 i; - u16 verifyFlashSector_Core_Buffer[0x80]; - u16 *funcSrc; - u16 *funcDest; - u8 *tgt; - u16 size; - u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - - if (gFlash->romSize == FLASH_ROM_SIZE_1M) - { - SwitchFlashBank(sectorNum / SECTORS_PER_BANK); - sectorNum %= SECTORS_PER_BANK; - } - - funcSrc = (u16 *)VerifyFlashSector_Core; - funcSrc = (u16 *)((s32)funcSrc ^ 1); - funcDest = verifyFlashSector_Core_Buffer; - - i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1; - - while (i != 0) - { - *funcDest++ = *funcSrc++; - i--; - } - - verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1); - - tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift); - size = gFlash->sector.size; - - return verifyFlashSector_Core(src, tgt, size); // return 0 if verified. -} - -u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n) -{ - u16 i; - u16 verifyFlashSector_Core_Buffer[0x80]; - u16 *funcSrc; - u16 *funcDest; - u8 *tgt; - u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); - - if (gFlash->romSize == FLASH_ROM_SIZE_1M) - { - SwitchFlashBank(sectorNum / SECTORS_PER_BANK); - sectorNum %= SECTORS_PER_BANK; - } - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - - funcSrc = (u16 *)VerifyFlashSector_Core; - funcSrc = (u16 *)((s32)funcSrc ^ 1); - funcDest = verifyFlashSector_Core_Buffer; - - i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1; - - while (i != 0) - { - *funcDest++ = *funcSrc++; - i--; - } - - verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1); - - tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift); - - return verifyFlashSector_Core(src, tgt, n); -} - -u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src) // 3rd is unused -{ - u8 i; - u32 result; - - for (i = 0; i < 3; i++) // 3 attempts - { - result = ProgramFlashSector(sectorNum, src); - if (result != 0) - continue; - - result = VerifyFlashSector(sectorNum, src); - if (result == 0) - break; - } - - return result; // return 0 if verified and programmed. -} - -u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, u8 *src, u32 n) -{ - u8 i; - u32 result; - - for (i = 0; i < 3; i++) - { - result = ProgramFlashSector(sectorNum, src); - if (result != 0) - continue; - - result = VerifyFlashSectorNBytes(sectorNum, src, n); - if (result == 0) - break; - } - - return result; -} diff --git a/src/engine/agb_flash_1m.c b/src/engine/agb_flash_1m.c deleted file mode 100644 index e249fab9a..000000000 --- a/src/engine/agb_flash_1m.c +++ /dev/null @@ -1,86 +0,0 @@ -#include "gba/gba.h" -#include "gba/flash_internal.h" - -static const char AgbLibFlashVersion[] = "FLASH1M_V103"; - -const struct FlashSetupInfo * const sSetupInfos[] = -{ - &MX29L010, - &LE26FV10N1TS, - &DefaultFlash -}; - -u16 IdentifyFlash(void) -{ - u16 result; - u16 flashId; - const struct FlashSetupInfo * const *setupInfo; - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - - flashId = ReadFlashId(); - - setupInfo = sSetupInfos; - result = 1; - - for (;;) - { - if ((*setupInfo)->type.ids.separate.makerId == 0) - break; - - if (flashId == (*setupInfo)->type.ids.joined) - { - result = 0; - break; - } - - setupInfo++; - } - - ProgramFlashByte = (*setupInfo)->programFlashByte; - ProgramFlashSector = (*setupInfo)->programFlashSector; - EraseFlashChip = (*setupInfo)->eraseFlashChip; - EraseFlashSector = (*setupInfo)->eraseFlashSector; - WaitForFlashWrite = (*setupInfo)->WaitForFlashWrite; - gFlashMaxTime = (*setupInfo)->maxTime; - gFlash = &(*setupInfo)->type; - - return result; -} - -u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData) -{ - u16 result = 0; - u8 status; - - StartFlashTimer(phase); - - while ((status = PollFlashStatus(addr)) != lastData) - { - if (status & 0x20) - { - // The write operation exceeded the flash chip's time limit. - - if (PollFlashStatus(addr) == lastData) - break; - - FLASH_WRITE(0x5555, 0xF0); - result = phase | 0xA000u; - break; - } - - if (gFlashTimeoutFlag) - { - if (PollFlashStatus(addr) == lastData) - break; - - FLASH_WRITE(0x5555, 0xF0); - result = phase | 0xC000u; - break; - } - } - - StopFlashTimer(); - - return result; -} diff --git a/src/engine/agb_flash_le.c b/src/engine/agb_flash_le.c deleted file mode 100644 index 39d956e27..000000000 --- a/src/engine/agb_flash_le.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "gba/gba.h" -#include "gba/flash_internal.h" - -const u16 leMaxTime[] = -{ - 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, - 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, - 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, - 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, -}; - -const struct FlashSetupInfo LE26FV10N1TS = -{ - ProgramFlashByte_MX, - ProgramFlashSector_MX, - EraseFlashChip_MX, - EraseFlashSector_MX, - WaitForFlashWrite_Common, - leMaxTime, - { - 131072, // ROM size - { - 4096, // sector size - 12, // bit shift to multiply by sector size (4096 == 1 << 12) - 32, // number of sectors - 0 // appears to be unused - }, - { 3, 1 }, // wait state setup data - { { 0x62, 0x13 } } // ID - } -}; diff --git a/src/engine/agb_flash_mx.c b/src/engine/agb_flash_mx.c deleted file mode 100644 index 67348901f..000000000 --- a/src/engine/agb_flash_mx.c +++ /dev/null @@ -1,197 +0,0 @@ -#include "gba/gba.h" -#include "gba/flash_internal.h" - -const u16 mxMaxTime[] = -{ - 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, - 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, - 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, - 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, -}; - -const struct FlashSetupInfo MX29L010 = -{ - ProgramFlashByte_MX, - ProgramFlashSector_MX, - EraseFlashChip_MX, - EraseFlashSector_MX, - WaitForFlashWrite_Common, - mxMaxTime, - { - 131072, // ROM size - { - 4096, // sector size - 12, // bit shift to multiply by sector size (4096 == 1 << 12) - 32, // number of sectors - 0 // appears to be unused - }, - { 3, 1 }, // wait state setup data -#if defined(GERMAN) && defined(SAPPHIRE) - { { 0xBF, 0xD4 } } // ID -#else - { { 0xC2, 0x09 } } // ID -#endif - } -}; - -const struct FlashSetupInfo DefaultFlash = -{ - ProgramFlashByte_MX, - ProgramFlashSector_MX, - EraseFlashChip_MX, - EraseFlashSector_MX, - WaitForFlashWrite_Common, - mxMaxTime, - { - 131072, // ROM size - { - 4096, // sector size - 12, // bit shift to multiply by sector size (4096 == 1 << 12) - 32, // number of sectors - 0 // appears to be unused - }, - { 3, 1 }, // wait state setup data - { { 0x00, 0x00 } } // ID of 0 - } -}; - -u16 EraseFlashChip_MX(void) -{ - u16 result; - u16 readFlash1Buffer[0x20]; - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; - - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0x80); - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0x10); - - SetReadFlash1(readFlash1Buffer); - - result = WaitForFlashWrite(3, FLASH_BASE, 0xFF); - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - - return result; -} - -u16 EraseFlashSector_MX(u16 sectorNum) -{ - u16 numTries; - u16 result; - u8 *addr; - u16 readFlash1Buffer[0x20]; - - if (sectorNum >= gFlash->sector.count) - return 0x80FF; - - SwitchFlashBank(sectorNum / SECTORS_PER_BANK); - sectorNum %= SECTORS_PER_BANK; - - numTries = 0; - -try_erase: - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; - - addr = FLASH_BASE + (sectorNum << gFlash->sector.shift); - - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0x80); - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - *addr = 0x30; - - SetReadFlash1(readFlash1Buffer); - - result = WaitForFlashWrite(2, addr, 0xFF); - - if (!(result & 0xA000) || numTries > 3) - goto done; - - numTries++; - - goto try_erase; - -done: - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - - return result; -} - -u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data) -{ - u8 *addr; - u16 readFlash1Buffer[0x20]; - - if (offset >= gFlash->sector.size) - return 0x8000; - - SwitchFlashBank(sectorNum / SECTORS_PER_BANK); - sectorNum %= SECTORS_PER_BANK; - - addr = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset; - - SetReadFlash1(readFlash1Buffer); - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; - - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0xA0); - *addr = data; - - return WaitForFlashWrite(1, addr, data); -} - -static u16 ProgramByte(u8 *src, u8 *dest) -{ - FLASH_WRITE(0x5555, 0xAA); - FLASH_WRITE(0x2AAA, 0x55); - FLASH_WRITE(0x5555, 0xA0); - *dest = *src; - - return WaitForFlashWrite(1, dest, *src); -} - -u16 ProgramFlashSector_MX(u16 sectorNum, u8 *src) -{ - u16 result; - u8 *dest; - u16 readFlash1Buffer[0x20]; - - if (sectorNum >= gFlash->sector.count) - return 0x80FF; - - result = EraseFlashSector_MX(sectorNum); - - if (result != 0) - return result; - - SwitchFlashBank(sectorNum / SECTORS_PER_BANK); - sectorNum %= SECTORS_PER_BANK; - - SetReadFlash1(readFlash1Buffer); - - REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; - - gFlashNumRemainingBytes = gFlash->sector.size; - dest = FLASH_BASE + (sectorNum << gFlash->sector.shift); - - while (gFlashNumRemainingBytes > 0) - { - result = ProgramByte(src, dest); - - if (result != 0) - break; - - gFlashNumRemainingBytes--; - src++; - dest++; - } - - return result; -} diff --git a/src/engine/libc.c b/src/engine/libc.c deleted file mode 100644 index 920673e3e..000000000 --- a/src/engine/libc.c +++ /dev/null @@ -1,143 +0,0 @@ -#include "global.h" -#include - -#define LBLOCKSIZE (sizeof(long)) - -// Nonzero if (long)X contains a NULL byte. -#define CONTAINSNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) - -// Nonzero if X is not aligned on a "long" boundary. -#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1)) - -void *memcpy(void *dst0, const void *src0, size_t len0) -{ - char *dst = dst0; - const char *src = src0; - long *aligned_dst; - const long *aligned_src; - unsigned int len = len0; - - // If the size is small, or either src or dst is unaligned, - // then go to the byte copy loop. This should be rare. - if (len >= 16 && !(UNALIGNED(src) | UNALIGNED(dst))) - { - aligned_dst = (long *)dst; - aligned_src = (long *)src; - - // Copy 4X long words at a time if possible. - while (len >= 16) - { - *aligned_dst++ = *aligned_src++; - *aligned_dst++ = *aligned_src++; - *aligned_dst++ = *aligned_src++; - *aligned_dst++ = *aligned_src++; - len -= 16; - } - - // Copy one long word at a time if possible - while (len >= 4) - { - *aligned_dst++ = *aligned_src++; - len -= 4; - } - - dst = (char *)aligned_dst; - src = (char *)aligned_src; - } - - // Pick up any remaining bytes with a byte copier. - while (len--) - *dst++ = *src++; - - return dst0; -} - -void *memset(void *m, int c, size_t n) -{ - char *s = (char *)m; - int count, i; - unsigned long buffer; - unsigned long *aligned_addr; - unsigned char *unaligned_addr; - - // If the size is small or m is unaligned, - // then go to the byte copy loop. This should be rare. - if (n >= LBLOCKSIZE && !UNALIGNED(m)) - { - // We know that n is large and m is word-aligned. - aligned_addr = (unsigned long *)m; - - // Store C into each char sized location in buffer so that - // we can set large blocks quickly. - c &= 0xFF; - if (LBLOCKSIZE == 4) - { - buffer = (c << 8) | c; - buffer |= (buffer << 16); - } - else - { - buffer = 0; - for (i = 0; i < LBLOCKSIZE; i++) - buffer = (buffer << 8) | c; - } - - while (n >= LBLOCKSIZE * 4) - { - *aligned_addr++ = buffer; - *aligned_addr++ = buffer; - *aligned_addr++ = buffer; - *aligned_addr++ = buffer; - n -= LBLOCKSIZE * 4; - } - while (n >= LBLOCKSIZE) - { - *aligned_addr++ = buffer; - n -= LBLOCKSIZE; - } - - s = (char *)aligned_addr; - } - - // Pick up the remainder with a bytewise loop. - while (n--) - *s++ = (char)c; - - return m; -} - -int strcmp(const char *s1, const char *s2) -{ - unsigned long *a1; - unsigned long *a2; - - // If s1 or s2 are unaligned, then skip this and compare bytes. - if (!(UNALIGNED(s1) | UNALIGNED(s2))) - { - // Compare them a word at a time. - a1 = (unsigned long *)s1; - a2 = (unsigned long *)s2; - while (*a1 == *a2) - { - // If *a1 == *a2, and we find a null in *a1, - // then the strings must be equal, so return zero. - if (CONTAINSNULL(*a1)) - return 0; - - a1++; - a2++; - } - - s1 = (char *)a1; - s2 = (char *)a2; - } - - // Check the remaining few bytes. - while (*s1 != '\0' && *s1 == *s2) - { - s1++; - s2++; - } - - return (*(unsigned char *) s1) - (*(unsigned char *) s2); -} diff --git a/src/engine/m4a_2.c b/src/engine/m4a_2.c deleted file mode 100644 index 2d3c65848..000000000 --- a/src/engine/m4a_2.c +++ /dev/null @@ -1,912 +0,0 @@ -#include "gba/m4a_internal.h" - -#define BSS_CODE __attribute__((section(".bss.code"))) - -BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0}; - -struct SoundInfo gSoundInfo; -struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES]; -struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES]; -void *gMPlayJumpTable[36]; -struct CgbChannel gCgbChans[4]; -struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2]; -struct PokemonCrySong gPokemonCrySong; -struct MusicPlayerInfo gMPlay_BGM; -struct MusicPlayerInfo gMPlay_SE1; -struct MusicPlayerInfo gMPlay_SE2; -struct MusicPlayerInfo gMPlay_SE3; -u8 gMPlayMemAccArea[0x10]; - -u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust) -{ - u32 val1; - u32 val2; - u32 fineAdjustShifted = fineAdjust << 24; - - if (key > 178) - { - key = 178; - fineAdjustShifted = 255 << 24; - } - - val1 = gScaleTable[key]; - val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4); - - val2 = gScaleTable[key + 1]; - val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4); - - return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted)); -} - -void UnusedDummyFunc() -{ -} - -void MPlayContinue(struct MusicPlayerInfo *mplayInfo) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; - mplayInfo->ident = ID_NUMBER; - } -} - -void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->fadeOC = speed; - mplayInfo->fadeOI = speed; - mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aSoundInit(void) -{ - s32 i; - - CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); - - SoundInit(&gSoundInfo); - MPlayExtender(gCgbChans); - m4aSoundMode(SOUND_MODE_DA_BIT_8 - | SOUND_MODE_FREQ_13379 - | (12 << SOUND_MODE_MASVOL_SHIFT) - | (5 << SOUND_MODE_MAXCHN_SHIFT)); - - for (i = 0; i < NUM_MUSIC_PLAYERS; i++) - { - struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info; - MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8); - mplayInfo->unk_B = gMPlayTable[i].unk_A; - mplayInfo->memAccArea = gMPlayMemAccArea; - } - - memcpy(&gPokemonCrySong, &gPokemonCrySongTemplate, sizeof(struct PokemonCrySong)); - - for (i = 0; i < MAX_POKEMON_CRIES; i++) - { - struct MusicPlayerInfo *mplayInfo = &gPokemonCryMusicPlayers[i]; - struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; - MPlayOpen(mplayInfo, track, 2); - track->chan = 0; - } -} - -void m4aSoundMain(void) -{ - SoundMain(); -} - -void m4aSongNumStart(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - MPlayStart(mplay->info, song->header); -} - -void m4aSongNumStartOrChange(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader != song->header) - { - MPlayStart(mplay->info, song->header); - } - else - { - if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0 - || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)) - { - MPlayStart(mplay->info, song->header); - } - } -} - -void m4aSongNumStartOrContinue(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader != song->header) - MPlayStart(mplay->info, song->header); - else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0) - MPlayStart(mplay->info, song->header); - else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE) - MPlayContinue(mplay->info); -} - -void m4aSongNumStop(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader == song->header) - m4aMPlayStop(mplay->info); -} - -void m4aSongNumContinue(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader == song->header) - MPlayContinue(mplay->info); -} - -void m4aMPlayAllStop(void) -{ - s32 i; - - for (i = 0; i < NUM_MUSIC_PLAYERS; i++) - m4aMPlayStop(gMPlayTable[i].info); - - for (i = 0; i < MAX_POKEMON_CRIES; i++) - m4aMPlayStop(&gPokemonCryMusicPlayers[i]); -} - -void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo) -{ - MPlayContinue(mplayInfo); -} - -void m4aMPlayAllContinue(void) -{ - s32 i; - - for (i = 0; i < NUM_MUSIC_PLAYERS; i++) - MPlayContinue(gMPlayTable[i].info); - - for (i = 0; i < MAX_POKEMON_CRIES; i++) - MPlayContinue(&gPokemonCryMusicPlayers[i]); -} - -void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - MPlayFadeOut(mplayInfo, speed); -} - -void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->fadeOC = speed; - mplayInfo->fadeOI = speed; - mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE; - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->fadeOC = speed; - mplayInfo->fadeOI = speed; - mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN; - mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo) -{ - s32 trackCount = mplayInfo->trackCount; - struct MusicPlayerTrack *track = mplayInfo->tracks; - - while (trackCount > 0) - { - if (track->flags & MPT_FLG_EXIST) - { - if (track->flags & MPT_FLG_START) - { - Clear64byte(track); - track->flags = MPT_FLG_EXIST; - track->bendRange = 2; - track->volX = 64; - track->lfoSpeed = 22; - track->tone.type = 1; - } - } - - trackCount--; - track++; - } -} - -void MPlayExtender(struct CgbChannel *cgbChans) -{ - struct SoundInfo *soundInfo; - u32 ident; - - REG_SOUNDCNT_X = SOUND_MASTER_ENABLE - | SOUND_4_ON - | SOUND_3_ON - | SOUND_2_ON - | SOUND_1_ON; - REG_SOUNDCNT_L = 0; // set master volume to zero - REG_NR12 = 0x8; - REG_NR22 = 0x8; - REG_NR42 = 0x8; - REG_NR14 = 0x80; - REG_NR24 = 0x80; - REG_NR44 = 0x80; - REG_NR30 = 0; - REG_NR50 = 0x77; - - soundInfo = SOUND_INFO_PTR; - - ident = soundInfo->ident; - - if (ident != ID_NUMBER) - return; - - soundInfo->ident++; - - gMPlayJumpTable[8] = ply_memacc; - gMPlayJumpTable[17] = ply_lfos; - gMPlayJumpTable[19] = ply_mod; - gMPlayJumpTable[28] = ply_xcmd; - gMPlayJumpTable[29] = ply_endtie; - gMPlayJumpTable[30] = SampleFreqSet; - gMPlayJumpTable[31] = TrackStop; - gMPlayJumpTable[32] = FadeOutBody; - gMPlayJumpTable[33] = TrkVolPitSet; - - soundInfo->cgbChans = (struct CgbChannel *)cgbChans; - soundInfo->CgbSound = CgbSound; - soundInfo->CgbOscOff = CgbOscOff; - soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq; - soundInfo->maxLines = MAX_LINES; - - CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4); - - cgbChans[0].ty = 1; - cgbChans[0].panMask = 0x11; - cgbChans[1].ty = 2; - cgbChans[1].panMask = 0x22; - cgbChans[2].ty = 3; - cgbChans[2].panMask = 0x44; - cgbChans[3].ty = 4; - cgbChans[3].panMask = 0x88; - - soundInfo->ident = ident; -} - -void MusicPlayerJumpTableCopy(void) -{ - asm("swi 0x2A"); -} - -void ClearChain(void *x) -{ - void (*func)(void *) = *(&gMPlayJumpTable[34]); - func(x); -} - -void Clear64byte(void *x) -{ - void (*func)(void *) = *(&gMPlayJumpTable[35]); - func(x); -} - -void SoundInit(struct SoundInfo *soundInfo) -{ - soundInfo->ident = 0; - - if (REG_DMA1CNT & (DMA_REPEAT << 16)) - REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - if (REG_DMA2CNT & (DMA_REPEAT << 16)) - REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - REG_DMA1CNT_H = DMA_32BIT; - REG_DMA2CNT_H = DMA_32BIT; - REG_SOUNDCNT_X = SOUND_MASTER_ENABLE - | SOUND_4_ON - | SOUND_3_ON - | SOUND_2_ON - | SOUND_1_ON; - REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT - | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT - | SOUND_ALL_MIX_FULL; - REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40; - - REG_DMA1SAD = (s32)soundInfo->pcmBuffer; - REG_DMA1DAD = (s32)®_FIFO_A; - REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE; - REG_DMA2DAD = (s32)®_FIFO_B; - - SOUND_INFO_PTR = soundInfo; - CpuFill32(0, soundInfo, sizeof(struct SoundInfo)); - - soundInfo->maxChans = 8; - soundInfo->masterVolume = 15; - soundInfo->plynote = (u32)ply_note; - soundInfo->CgbSound = DummyFunc; - soundInfo->CgbOscOff = (void (*)(u8))DummyFunc; - soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc; - soundInfo->ExtVolPit = (u32)DummyFunc; - - MPlayJumpTableCopy(gMPlayJumpTable); - - soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable; - - SampleFreqSet(SOUND_MODE_FREQ_13379); - - soundInfo->ident = ID_NUMBER; -} - -void SampleFreqSet(u32 freq) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - freq = (freq & 0xF0000) >> 16; - soundInfo->freq = freq; - soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; - soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; - - // LCD refresh rate 59.7275Hz - soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000; - - // CPU frequency 16.78Mhz - soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1; - - // Turn off timer 0. - REG_TM0CNT_H = 0; - - // cycles per LCD fresh 280896 - REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank); - - m4aSoundVSyncOn(); - - while (*(vu8 *)REG_ADDR_VCOUNT == 159) - ; - - while (*(vu8 *)REG_ADDR_VCOUNT != 159) - ; - - REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK; -} - -void m4aSoundMode(u32 mode) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - u32 temp; - - if (soundInfo->ident != ID_NUMBER) - return; - - soundInfo->ident++; - - temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL); - - if (temp) - soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL; - - temp = mode & SOUND_MODE_MAXCHN; - - if (temp) - { - struct SoundChannel *chan; - - soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; - - temp = MAX_DIRECTSOUND_CHANNELS; - chan = &soundInfo->chans[0]; - - while (temp != 0) - { - chan->status = 0; - temp--; - chan++; - } - } - - temp = mode & SOUND_MODE_MASVOL; - - if (temp) - soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT; - - temp = mode & SOUND_MODE_DA_BIT; - - if (temp) - { - temp = (temp & 0x300000) >> 14; - REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp; - } - - temp = mode & SOUND_MODE_FREQ; - - if (temp) - { - m4aSoundVSyncOff(); - SampleFreqSet(temp); - } - - soundInfo->ident = ID_NUMBER; -} - -void SoundClear(void) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - s32 i; - void *chan; - - if (soundInfo->ident != ID_NUMBER) - return; - - soundInfo->ident++; - - i = MAX_DIRECTSOUND_CHANNELS; - chan = &soundInfo->chans[0]; - - while (i > 0) - { - ((struct SoundChannel *)chan)->status = 0; - i--; - chan = (void *)((s32)chan + sizeof(struct SoundChannel)); - } - - chan = soundInfo->cgbChans; - - if (chan) - { - i = 1; - - while (i <= 4) - { - soundInfo->CgbOscOff(i); - ((struct CgbChannel *)chan)->sf = 0; - i++; - chan = (void *)((s32)chan + sizeof(struct CgbChannel)); - } - } - - soundInfo->ident = ID_NUMBER; -} - -void m4aSoundVSyncOff(void) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) - { - soundInfo->ident += 10; - - if (REG_DMA1CNT & (DMA_REPEAT << 16)) - REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - if (REG_DMA2CNT & (DMA_REPEAT << 16)) - REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - REG_DMA1CNT_H = DMA_32BIT; - REG_DMA2CNT_H = DMA_32BIT; - - CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer)); - } -} - -void m4aSoundVSyncOn(void) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - u32 ident = soundInfo->ident; - - if (ident == ID_NUMBER) - return; - - REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; - REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; - - soundInfo->pcmDmaCounter = 0; - soundInfo->ident = ident - 10; -} - -void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount) -{ - struct SoundInfo *soundInfo; - - if (trackCount == 0) - return; - - if (trackCount > MAX_MUSICPLAYER_TRACKS) - trackCount = MAX_MUSICPLAYER_TRACKS; - - soundInfo = SOUND_INFO_PTR; - - if (soundInfo->ident != ID_NUMBER) - return; - - soundInfo->ident++; - - Clear64byte(mplayInfo); - - mplayInfo->tracks = tracks; - mplayInfo->trackCount = trackCount; - mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; - - while (trackCount != 0) - { - tracks->flags = 0; - trackCount--; - tracks++; - } - - if (soundInfo->func != 0) - { - mplayInfo->func = soundInfo->func; - mplayInfo->intp = soundInfo->intp; - soundInfo->func = 0; - } - - soundInfo->intp = (u32)mplayInfo; - soundInfo->func = (u32)MPlayMain; - soundInfo->ident = ID_NUMBER; - mplayInfo->ident = ID_NUMBER; -} - -void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader) -{ - s32 i; - u8 unk_B; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - unk_B = mplayInfo->unk_B; - - if (!unk_B - || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START)) - && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0 - || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE))) - || (mplayInfo->priority <= songHeader->priority)) - { - mplayInfo->ident++; - mplayInfo->status = 0; - mplayInfo->songHeader = songHeader; - mplayInfo->tone = songHeader->tone; - mplayInfo->priority = songHeader->priority; - mplayInfo->clock = 0; - mplayInfo->tempoD = 150; - mplayInfo->tempoI = 150; - mplayInfo->tempoU = 0x100; - mplayInfo->tempoC = 0; - mplayInfo->fadeOI = 0; - - i = 0; - track = mplayInfo->tracks; - - while (i < songHeader->trackCount && i < mplayInfo->trackCount) - { - TrackStop(mplayInfo, track); - track->flags = MPT_FLG_EXIST | MPT_FLG_START; - track->chan = 0; - track->cmdPtr = songHeader->part[i]; - i++; - track++; - } - - while (i < mplayInfo->trackCount) - { - TrackStop(mplayInfo, track); - track->flags = 0; - i++; - track++; - } - - if (songHeader->reverb & 0x80) - m4aSoundMode(songHeader->reverb); - - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo) -{ - s32 i; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { - TrackStop(mplayInfo, track); - i--; - track++; - } - - mplayInfo->ident = ID_NUMBER; -} - -void FadeOutBody(struct MusicPlayerInfo *mplayInfo) -{ - s32 i; - struct MusicPlayerTrack *track; - u16 fadeOI = mplayInfo->fadeOI; - register u32 temp asm("r3"); - register u16 mask asm("r2"); - - if (fadeOI == 0) - return; - - mplayInfo->fadeOC--; - - temp = 0xFFFF; - mask = temp; - - if (mplayInfo->fadeOC != 0) - return; - - mplayInfo->fadeOC = fadeOI; - - if (mplayInfo->fadeOV & FADE_IN) - { - mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT); - - if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT)) - { - mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); - mplayInfo->fadeOI = 0; - } - } - else - { - mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT); - - if ((s16)(mplayInfo->fadeOV & mask) <= 0) - { - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { - register u32 fadeOV asm("r7"); - u32 val; - - TrackStop(mplayInfo, track); - - val = TEMPORARY_FADE; - fadeOV = mplayInfo->fadeOV; - val &= fadeOV; - - if (!val) - track->flags = 0; - - i--; - track++; - } - - if (mplayInfo->fadeOV & TEMPORARY_FADE) - mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; - else - mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; - - mplayInfo->fadeOI = 0; - return; - } - } - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { - if (track->flags & MPT_FLG_EXIST) - { - track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT); - track->flags |= MPT_FLG_VOLCHG; - } - - i--; - track++; - } -} - -void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - if (track->flags & MPT_FLG_VOLSET) - { - s32 x; - s32 y; - - x = (u32)(track->vol * track->volX) >> 5; - - if (track->modT == 1) - x = (u32)(x * (track->modM + 128)) >> 7; - - y = 2 * track->pan + track->panX; - - if (track->modT == 2) - y += track->modM; - - if (y < -128) - y = -128; - else if (y > 127) - y = 127; - - track->volMR = (u32)((y + 128) * x) >> 8; - track->volML = (u32)((127 - y) * x) >> 8; - } - - if (track->flags & MPT_FLG_PITSET) - { - s32 bend = track->bend * track->bendRange; - register s32 x asm("r1") = track->tune; - x += bend; - x *= 4; - x += (track->keyShift << 8); - x += (track->keyShiftX << 8); - x += track->pitX; - - if (track->modT == 0) - x += 16 * track->modM; - - track->keyM = x >> 8; - track->pitM = x; - } - - track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET); -} - -u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) -{ - if (chanNum == 4) - { - if (key <= 20) - { - key = 0; - } - else - { - key -= 21; - if (key > 59) - key = 59; - } - - return gNoiseTable[key]; - } - else - { - s32 val1; - s32 val2; - - if (key <= 35) - { - fineAdjust = 0; - key = 0; - } - else - { - key -= 36; - if (key > 130) - { - key = 130; - fineAdjust = 255; - } - } - - val1 = gCgbScaleTable[key]; - val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4); - - val2 = gCgbScaleTable[key + 1]; - val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4); - - return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048; - } -} - -void CgbOscOff(u8 chanNum) -{ - switch (chanNum) - { - case 1: - REG_NR12 = 8; - REG_NR14 = 0x80; - break; - case 2: - REG_NR22 = 8; - REG_NR24 = 0x80; - break; - case 3: - REG_NR30 = 0; - break; - default: - REG_NR42 = 8; - REG_NR44 = 0x80; - } -} - -static inline int CgbPan(struct CgbChannel *chan) -{ - u32 rightVolume = chan->rightVolume; - u32 leftVolume = chan->leftVolume; - - if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) - { - if (rightVolume / 2 >= leftVolume) - { - chan->pan = 0x0F; - return 1; - } - } - else - { - if (leftVolume / 2 >= rightVolume) - { - chan->pan = 0xF0; - return 1; - } - } - - return 0; -} - -void CgbModVol(struct CgbChannel *chan) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - if ((soundInfo->mode & 1) || !CgbPan(chan)) - { - chan->pan = 0xFF; - chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; - } - else - { - // Force chan->rightVolume and chan->leftVolume to be read from memory again, - // even though there is no reason to do so. - // The command line option "-fno-gcse" achieves the same result as this. - asm("" : : : "memory"); - - chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; - if (chan->eg > 15) - chan->eg = 15; - } - - chan->sg = (chan->eg * chan->su + 15) >> 4; - chan->pan &= chan->panMask; -} diff --git a/src/engine/m4a_4.c b/src/engine/m4a_4.c deleted file mode 100644 index 99195ec00..000000000 --- a/src/engine/m4a_4.c +++ /dev/null @@ -1,545 +0,0 @@ -#include "gba/m4a_internal.h" - -void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->tempoU = tempo; - mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8; - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->volX = volume / 4; - track->flags |= MPT_FLG_VOLCHG; - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 pitch) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->keyShiftX = (s16)pitch >> 8; - track->pitX = pitch; - track->flags |= MPT_FLG_PITCHG; - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->panX = pan; - track->flags |= MPT_FLG_VOLCHG; - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void ClearModM(struct MusicPlayerTrack *track) -{ - track->lfoSpeedC = 0; - track->modM = 0; - - if (track->modT == 0) - track->flags |= MPT_FLG_PITCHG; - else - track->flags |= MPT_FLG_VOLCHG; -} - -void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->mod = modDepth; - - if (!track->mod) - ClearModM(track); - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->lfoSpeed = lfoSpeed; - - if (!track->lfoSpeed) - ClearModM(track); - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -#define MEMACC_COND_JUMP(cond) \ -if (cond) \ - goto cond_true; \ -else \ - goto cond_false; \ - -void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 op; - u8 *addr; - u8 data; - - op = *track->cmdPtr; - track->cmdPtr++; - - addr = mplayInfo->memAccArea + *track->cmdPtr; - track->cmdPtr++; - - data = *track->cmdPtr; - track->cmdPtr++; - - switch (op) - { - case 0: - *addr = data; - return; - case 1: - *addr += data; - return; - case 2: - *addr -= data; - return; - case 3: - *addr = mplayInfo->memAccArea[data]; - return; - case 4: - *addr += mplayInfo->memAccArea[data]; - return; - case 5: - *addr -= mplayInfo->memAccArea[data]; - return; - case 6: - MEMACC_COND_JUMP(*addr == data) - return; - case 7: - MEMACC_COND_JUMP(*addr != data) - return; - case 8: - MEMACC_COND_JUMP(*addr > data) - return; - case 9: - MEMACC_COND_JUMP(*addr >= data) - return; - case 10: - MEMACC_COND_JUMP(*addr <= data) - return; - case 11: - MEMACC_COND_JUMP(*addr < data) - return; - case 12: - MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data]) - return; - case 13: - MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data]) - return; - case 14: - MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data]) - return; - case 15: - MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data]) - return; - case 16: - MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data]) - return; - case 17: - MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data]) - return; - default: - return; - } - -cond_true: - { - void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]); - func(mplayInfo, track); - return; - } - -cond_false: - track->cmdPtr += 4; -} - -void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 n = *track->cmdPtr; - track->cmdPtr++; - - gXcmdTable[n](mplayInfo, track); -} - -void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]); - func(mplayInfo, track); -} - -#define READ_XCMD_BYTE(var, n) \ -{ \ - u32 byte = track->cmdPtr[(n)]; \ - byte <<= n * 8; \ - (var) &= ~(0xFF << (n * 8)); \ - (var) |= byte; \ -} - -void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 wav; - - READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable - READ_XCMD_BYTE(wav, 1) - READ_XCMD_BYTE(wav, 2) - READ_XCMD_BYTE(wav, 3) - - track->tone.wav = (struct WaveData *)wav; - track->cmdPtr += 4; -} - -void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.type = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.attack = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.decay = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.sustain = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.release = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->echoVolume = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->echoLength = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.length = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.pan_sweep = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 unk; - - READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable - READ_XCMD_BYTE(unk, 1) - - if (track->unk_3A < (u16)unk) - { - track->unk_3A++; - track->cmdPtr -= 2; - track->wait = 1; - } - else - { - track->unk_3A = 0; - track->cmdPtr += 2; - } -} - -void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 unk; - - READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable - READ_XCMD_BYTE(unk, 1) - READ_XCMD_BYTE(unk, 2) - READ_XCMD_BYTE(unk, 3) - - track->unk_3C = unk; - track->cmdPtr += 4; -} - -void DummyFunc(void) -{ -} - -struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone) -{ - u32 maxClock = 0; - s32 maxClockIndex = 0; - s32 i; - struct MusicPlayerInfo *mplayInfo; - - for (i = 0; i < MAX_POKEMON_CRIES; i++) - { - struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; - - if (!track->flags && (!track->chan || track->chan->track != track)) - goto start_song; - - if (maxClock < gPokemonCryMusicPlayers[i].clock) - { - maxClock = gPokemonCryMusicPlayers[i].clock; - maxClockIndex = i; - } - } - - i = maxClockIndex; - -start_song: - mplayInfo = &gPokemonCryMusicPlayers[i]; - mplayInfo->ident++; - -#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong)) -#define CRY_OFS(field) offsetof(struct PokemonCrySong, field) - - memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong)); - - *(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone; - *(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0); - *(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1); - *(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont); - -#undef CRY_OFS -#undef CRY - - mplayInfo->ident = ID_NUMBER; - - MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i])); - - return mplayInfo; -} - -void SetPokemonCryVolume(u8 val) -{ - gPokemonCrySong.volumeValue = val & 0x7F; -} - -void SetPokemonCryPanpot(s8 val) -{ - gPokemonCrySong.panValue = (val + C_V) & 0x7F; -} - -void SetPokemonCryPitch(s16 val) -{ - s16 b = val + 0x80; - u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue; - gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F; - gPokemonCrySong.tuneValue = (b >> 1) & 0x7F; - gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F; -} - -void SetPokemonCryLength(u16 val) -{ - gPokemonCrySong.unkCmd0CParam = val; -} - -void SetPokemonCryRelease(u8 val) -{ - gPokemonCrySong.releaseValue = val; -} - -void SetPokemonCryProgress(u32 val) -{ - gPokemonCrySong.unkCmd0DParam = val; -} - -int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo) -{ - struct MusicPlayerTrack *track = mplayInfo->tracks; - - if (track->chan && track->chan->track == track) - return 1; - else - return 0; -} - -void SetPokemonCryChorus(s8 val) -{ - if (val) - { - gPokemonCrySong.trackCount = 2; - gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F; - } - else - { - gPokemonCrySong.trackCount = 1; - } -} - -void SetPokemonCryStereo(u32 val) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - if (val) - { - REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT - | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT - | SOUND_ALL_MIX_FULL; - soundInfo->mode &= ~1; - } - else - { - REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT - | SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT - | SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL; - soundInfo->mode |= 1; - } -} - -void SetPokemonCryPriority(u8 val) -{ - gPokemonCrySong.priority = val; -} diff --git a/src/engine/m4a_tables.c b/src/engine/m4a_tables.c deleted file mode 100644 index 91f00a31d..000000000 --- a/src/engine/m4a_tables.c +++ /dev/null @@ -1,307 +0,0 @@ -#include "gba/m4a_internal.h" - -// Some of these functions have different signatures, so we need to make this -// an array of void pointers or a struct. It's simpler to just make it an array -// for now. -void * const gMPlayJumpTableTemplate[] = -{ - ply_fine, - ply_goto, - ply_patt, - ply_pend, - ply_rept, - ply_fine, - ply_fine, - ply_fine, - ply_fine, - ply_prio, - ply_tempo, - ply_keysh, - ply_voice, - ply_vol, - ply_pan, - ply_bend, - ply_bendr, - ply_lfos, - ply_lfodl, - ply_mod, - ply_modt, - ply_fine, - ply_fine, - ply_tune, - ply_fine, - ply_fine, - ply_fine, - ply_port, - ply_fine, - ply_endtie, - SampleFreqSet, - TrackStop, - FadeOutBody, - TrkVolPitSet, - RealClearChain, - SoundMainBTM, -}; - -// This is a table of deltas between sample values in compressed PCM data. -const s8 gDeltaEncodingTable[] = -{ - 0, - 1, - 4, - 9, - 16, - 25, - 36, - 49, - -64, - -49, - -36, - -25, - -16, - -9, - -4, - -1, -}; - -const u8 gScaleTable[] = -{ - 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, - 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, - 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, -}; - -const u32 gFreqTable[] = -{ - 2147483648u, - 2275179671u, - 2410468894u, - 2553802834u, - 2705659852u, - 2866546760u, - 3037000500u, - 3217589947u, - 3408917802u, - 3611622603u, - 3826380858u, - 4053909305u, -}; - -const u16 gPcmSamplesPerVBlankTable[] = -{ - 96, - 132, - 176, - 224, - 264, - 304, - 352, - 448, - 528, - 608, - 672, - 704, -}; - -const u8 gCgbScaleTable[] = -{ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, -}; - -const s16 gCgbFreqTable[] = -{ - -2004, - -1891, - -1785, - -1685, - -1591, - -1501, - -1417, - -1337, - -1262, - -1192, - -1125, - -1062, -}; - -const u8 gNoiseTable[] = -{ - 0xD7, 0xD6, 0xD5, 0xD4, - 0xC7, 0xC6, 0xC5, 0xC4, - 0xB7, 0xB6, 0xB5, 0xB4, - 0xA7, 0xA6, 0xA5, 0xA4, - 0x97, 0x96, 0x95, 0x94, - 0x87, 0x86, 0x85, 0x84, - 0x77, 0x76, 0x75, 0x74, - 0x67, 0x66, 0x65, 0x64, - 0x57, 0x56, 0x55, 0x54, - 0x47, 0x46, 0x45, 0x44, - 0x37, 0x36, 0x35, 0x34, - 0x27, 0x26, 0x25, 0x24, - 0x17, 0x16, 0x15, 0x14, - 0x07, 0x06, 0x05, 0x04, - 0x03, 0x02, 0x01, 0x00, -}; - -const u8 gCgb3Vol[] = -{ - 0x00, 0x00, - 0x60, 0x60, 0x60, 0x60, - 0x40, 0x40, 0x40, 0x40, - 0x80, 0x80, 0x80, 0x80, - 0x20, 0x20, -}; - -const u8 gClockTable[] = -{ - 0x00, - 0x01, - 0x02, - 0x03, - 0x04, - 0x05, - 0x06, - 0x07, - 0x08, - 0x09, - 0x0A, - 0x0B, - 0x0C, - 0x0D, - 0x0E, - 0x0F, - 0x10, - 0x11, - 0x12, - 0x13, - 0x14, - 0x15, - 0x16, - 0x17, - 0x18, - 0x1C, - 0x1E, - 0x20, - 0x24, - 0x28, - 0x2A, - 0x2C, - 0x30, - 0x34, - 0x36, - 0x38, - 0x3C, - 0x40, - 0x42, - 0x44, - 0x48, - 0x4C, - 0x4E, - 0x50, - 0x54, - 0x58, - 0x5A, - 0x5C, - 0x60, -}; - -#define FINE 0xb1 -#define GOTO 0xb2 -#define PATT 0xb3 -#define PEND 0xb4 -#define REPT 0xb5 -#define MEMACC 0xb9 -#define PRIO 0xba -#define TEMPO 0xbb -#define KEYSH 0xbc -#define VOICE 0xbd -#define VOL 0xbe -#define PAN 0xbf -#define BEND 0xc0 -#define BENDR 0xc1 -#define LFOS 0xc2 -#define LFODL 0xc3 -#define MOD 0xc4 -#define MODT 0xc5 -#define TUNE 0xc8 - -#define XCMD 0xcd -#define xRELE 0x07 -#define xIECV 0x08 -#define xIECL 0x09 - -#define EOT 0xce -#define TIE 0xcf - -const struct PokemonCrySong gPokemonCrySongTemplate = -{ - 1, // track count - 0, // block count - 255, // priority - 0, // reverb - (struct ToneData *)&voicegroup_pokemon_cry, - NULL, - NULL, - 0, - TUNE, // part 0 - C_V, // TUNE value - GOTO, - 0, // GOTO target address - TUNE, // part 1 - C_V + 16, // TUNE value - {VOICE, 0}, // part 0 jumps here with GOTO - VOL, - 127, // volume - {XCMD, 0x0D}, - 0, // unk value - {XCMD, xRELE}, - 0, // release - PAN, - C_V, // PAN value - TIE, - 60, // TIE key (default is Cn3) - 127, // TIE velocity - {XCMD, 0x0C}, - 60, // unk value - {EOT, FINE} // end -}; - -const XcmdFunc gXcmdTable[] = -{ - ply_xxx, - ply_xwave, - ply_xtype, - ply_xxx, - ply_xatta, - ply_xdeca, - ply_xsust, - ply_xrele, - ply_xiecv, - ply_xiecl, - ply_xleng, - ply_xswee, - ply_xcmd_0C, - ply_xcmd_0D, -}; diff --git a/src/engine/siirtc.c b/src/engine/siirtc.c deleted file mode 100644 index 965a068f1..000000000 --- a/src/engine/siirtc.c +++ /dev/null @@ -1,432 +0,0 @@ -// Ruby/Sapphire/Emerald cartridges contain a Seiko Instruments Inc. (SII) -// S-3511A real-time clock (RTC). This library ("SIIRTC_V001") is for -// communicating with the RTC. - -#include "gba/gba.h" -#include "siirtc.h" - -#define STATUS_INTFE 0x02 // frequency interrupt enable -#define STATUS_INTME 0x08 // per-minute interrupt enable -#define STATUS_INTAE 0x20 // alarm interrupt enable -#define STATUS_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode -#define STATUS_POWER 0x80 // power on or power failure occurred - -#define TEST_MODE 0x80 // flag in the "second" byte - -#define ALARM_AM 0x00 -#define ALARM_PM 0x80 - -#define OFFSET_YEAR offsetof(struct SiiRtcInfo, year) -#define OFFSET_MONTH offsetof(struct SiiRtcInfo, month) -#define OFFSET_DAY offsetof(struct SiiRtcInfo, day) -#define OFFSET_DAY_OF_WEEK offsetof(struct SiiRtcInfo, dayOfWeek) -#define OFFSET_HOUR offsetof(struct SiiRtcInfo, hour) -#define OFFSET_MINUTE offsetof(struct SiiRtcInfo, minute) -#define OFFSET_SECOND offsetof(struct SiiRtcInfo, second) -#define OFFSET_STATUS offsetof(struct SiiRtcInfo, status) -#define OFFSET_ALARM_HOUR offsetof(struct SiiRtcInfo, alarmHour) -#define OFFSET_ALARM_MINUTE offsetof(struct SiiRtcInfo, alarmMinute) - -#define INFO_BUF(info, index) (*((u8 *)(info) + (index))) - -#define DATETIME_BUF(info, index) INFO_BUF(info, OFFSET_YEAR + index) -#define DATETIME_BUF_LEN (OFFSET_SECOND - OFFSET_YEAR + 1) - -#define TIME_BUF(info, index) INFO_BUF(info, OFFSET_HOUR + index) -#define TIME_BUF_LEN (OFFSET_SECOND - OFFSET_HOUR + 1) - -#define WR 0 // command for writing data -#define RD 1 // command for reading data - -#define CMD(n) (0x60 | (n << 1)) - -#define CMD_RESET CMD(0) -#define CMD_STATUS CMD(1) -#define CMD_DATETIME CMD(2) -#define CMD_TIME CMD(3) -#define CMD_ALARM CMD(4) - -#define GPIO_PORT_DATA (*(vu16 *)0x80000C4) -#define GPIO_PORT_DIRECTION (*(vu16 *)0x80000C6) -#define GPIO_PORT_READ_ENABLE (*(vu16 *)0x80000C8) - -extern vu16 GPIOPortDirection; - -static u16 sDummy; // unused variable -static bool8 sLocked; - -static int WriteCommand(u8 value); -static int WriteData(u8 value); -static u8 ReadData(); -static void EnableGpioPortRead(); -static void DisableGpioPortRead(); - -static const char AgbLibRtcVersion[] = "SIIRTC_V001"; - -void SiiRtcUnprotect() -{ - EnableGpioPortRead(); - sLocked = FALSE; -} - -void SiiRtcProtect() -{ - DisableGpioPortRead(); - sLocked = TRUE; -} - -u8 SiiRtcProbe() -{ - u8 errorCode; - struct SiiRtcInfo rtc; - - if (!SiiRtcGetStatus(&rtc)) - return 0; - - errorCode = 0; - - if ((rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == SIIRTCINFO_POWER - || (rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == 0) - { - // The RTC is in 12-hour mode. Reset it and switch to 24-hour mode. - - // Note that the conditions are redundant and equivalent to simply - // "(rtc.status & SIIRTCINFO_24HOUR) == 0". It's possible that this - // was also intended to handle resetting the clock after power failure - // but a mistake was made. - - if (!SiiRtcReset()) - return 0; - - errorCode++; - } - - SiiRtcGetTime(&rtc); - - if (rtc.second & TEST_MODE) - { - // The RTC is in test mode. Reset it to leave test mode. - - if (!SiiRtcReset()) - return (errorCode << 4) & 0xF0; - - errorCode++; - } - - return (errorCode << 4) | 1; -} - -bool8 SiiRtcReset() -{ - u8 result; - struct SiiRtcInfo rtc; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_RESET | WR); - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - rtc.status = SIIRTCINFO_24HOUR; - - result = SiiRtcSetStatus(&rtc); - - return result; -} - -bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc) -{ - u8 statusData; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_STATUS | RD); - - GPIO_PORT_DIRECTION = 5; - - statusData = ReadData(); - - rtc->status = (statusData & (STATUS_POWER | STATUS_24HOUR)) - | ((statusData & STATUS_INTAE) >> 3) - | ((statusData & STATUS_INTME) >> 2) - | ((statusData & STATUS_INTFE) >> 1); - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc) -{ - u8 statusData; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - statusData = STATUS_24HOUR - | ((rtc->status & SIIRTCINFO_INTAE) << 3) - | ((rtc->status & SIIRTCINFO_INTME) << 2) - | ((rtc->status & SIIRTCINFO_INTFE) << 1); - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_STATUS | WR); - - WriteData(statusData); - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc) -{ - u8 i; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_DATETIME | RD); - - GPIO_PORT_DIRECTION = 5; - - for (i = 0; i < DATETIME_BUF_LEN; i++) - DATETIME_BUF(rtc, i) = ReadData(); - - INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc) -{ - u8 i; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_DATETIME | WR); - - for (i = 0; i < DATETIME_BUF_LEN; i++) - WriteData(DATETIME_BUF(rtc, i)); - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc) -{ - u8 i; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_TIME | RD); - - GPIO_PORT_DIRECTION = 5; - - for (i = 0; i < TIME_BUF_LEN; i++) - TIME_BUF(rtc, i) = ReadData(); - - INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc) -{ - u8 i; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIO_PORT_DIRECTION = 7; - - WriteCommand(CMD_TIME | WR); - - for (i = 0; i < TIME_BUF_LEN; i++) - WriteData(TIME_BUF(rtc, i)); - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc) -{ - u8 i; - u8 alarmData[2]; - - if (sLocked == TRUE) - return FALSE; - - sLocked = TRUE; - - // Decode BCD. - alarmData[0] = (rtc->alarmHour & 0xF) + 10 * ((rtc->alarmHour >> 4) & 0xF); - - // The AM/PM flag must be set correctly even in 24-hour mode. - - if (alarmData[0] < 12) - alarmData[0] = rtc->alarmHour | ALARM_AM; - else - alarmData[0] = rtc->alarmHour | ALARM_PM; - - alarmData[1] = rtc->alarmMinute; - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 5; - - GPIOPortDirection = 7; // Why is this the only instance that uses a symbol? - - WriteCommand(CMD_ALARM | WR); - - for (i = 0; i < 2; i++) - WriteData(alarmData[i]); - - GPIO_PORT_DATA = 1; - GPIO_PORT_DATA = 1; - - sLocked = FALSE; - - return TRUE; -} - -static int WriteCommand(u8 value) -{ - u8 i; - u8 temp; - - for (i = 0; i < 8; i++) - { - temp = ((value >> (7 - i)) & 1); - GPIO_PORT_DATA = (temp << 1) | 4; - GPIO_PORT_DATA = (temp << 1) | 4; - GPIO_PORT_DATA = (temp << 1) | 4; - GPIO_PORT_DATA = (temp << 1) | 5; - } - - // control reaches end of non-void function -} - -static int WriteData(u8 value) -{ - u8 i; - u8 temp; - - for (i = 0; i < 8; i++) - { - temp = ((value >> i) & 1); - GPIO_PORT_DATA = (temp << 1) | 4; - GPIO_PORT_DATA = (temp << 1) | 4; - GPIO_PORT_DATA = (temp << 1) | 4; - GPIO_PORT_DATA = (temp << 1) | 5; - } - - // control reaches end of non-void function -} - -static u8 ReadData() -{ - u8 i; - u8 temp; - u8 value; - - for (i = 0; i < 8; i++) - { - GPIO_PORT_DATA = 4; - GPIO_PORT_DATA = 4; - GPIO_PORT_DATA = 4; - GPIO_PORT_DATA = 4; - GPIO_PORT_DATA = 4; - GPIO_PORT_DATA = 5; - - temp = ((GPIO_PORT_DATA & 2) >> 1); - value = (value >> 1) | (temp << 7); // UB: accessing uninitialized var - } - - return value; -} - -static void EnableGpioPortRead() -{ - GPIO_PORT_READ_ENABLE = 1; -} - -static void DisableGpioPortRead() -{ - GPIO_PORT_READ_ENABLE = 0; -} diff --git a/src/libs/agb_flash.c b/src/libs/agb_flash.c new file mode 100644 index 000000000..340d469a7 --- /dev/null +++ b/src/libs/agb_flash.c @@ -0,0 +1,295 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" + +static u8 sTimerNum; +static u16 sTimerCount; +static vu16 *sTimerReg; +static u16 sSavedIme; + +u8 gFlashTimeoutFlag; +u8 (*PollFlashStatus)(u8 *); +u16 (*WaitForFlashWrite)(u8 phase, u8 *addr, u8 lastData); +u16 (*ProgramFlashSector)(u16 sectorNum, u8 *src); +const struct FlashType *gFlash; +u16 (*ProgramFlashByte)(u16 sectorNum, u32 offset, u8 data); +u16 gFlashNumRemainingBytes; +u16 (*EraseFlashChip)(); +u16 (*EraseFlashSector)(u16 sectorNum); +const u16 *gFlashMaxTime; + +void SetReadFlash1(u16 *dest); + +void SwitchFlashBank(u8 bankNum) +{ + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0xB0); + FLASH_WRITE(0x0000, bankNum); +} + +#define DELAY() \ +do { \ + vu16 i; \ + for (i = 20000; i != 0; i--) \ + ; \ +} while (0) + +u16 ReadFlashId(void) +{ + u16 flashId; + u16 readFlash1Buffer[0x20]; + u8 (*readFlash1)(u8 *); + + SetReadFlash1(readFlash1Buffer); + readFlash1 = (u8 (*)(u8 *))((s32)readFlash1Buffer + 1); + + // Enter ID mode. + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0x90); + DELAY(); + + flashId = readFlash1(FLASH_BASE + 1) << 8; + flashId |= readFlash1(FLASH_BASE); + + // Leave ID mode. + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0xF0); + FLASH_WRITE(0x5555, 0xF0); + DELAY(); + + return flashId; +} + +void FlashTimerIntr(void) +{ + if (sTimerCount != 0 && --sTimerCount == 0) + gFlashTimeoutFlag = 1; +} + +u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)) +{ + if (timerNum >= 4) + return 1; + + sTimerNum = timerNum; + sTimerReg = ®_TMCNT(sTimerNum); + *intrFunc = FlashTimerIntr; + return 0; +} + +void StartFlashTimer(u8 phase) +{ + const u16 *maxTime = &gFlashMaxTime[phase * 3]; + sSavedIme = REG_IME; + REG_IME = 0; + sTimerReg[1] = 0; + REG_IE |= (INTR_FLAG_TIMER0 << sTimerNum); + gFlashTimeoutFlag = 0; + sTimerCount = *maxTime++; + *sTimerReg++ = *maxTime++; + *sTimerReg-- = *maxTime++; + REG_IF = (INTR_FLAG_TIMER0 << sTimerNum); + REG_IME = 1; +} + +void StopFlashTimer(void) +{ + REG_IME = 0; + *sTimerReg++ = 0; + *sTimerReg-- = 0; + REG_IE &= ~(INTR_FLAG_TIMER0 << sTimerNum); + REG_IME = sSavedIme; +} + +u8 ReadFlash1(u8 *addr) +{ + return *addr; +} + +void SetReadFlash1(u16 *dest) +{ + u16 *src; + u16 i; + + PollFlashStatus = (u8 (*)(u8 *))((s32)dest + 1); + + src = (u16 *)ReadFlash1; + src = (u16 *)((s32)src ^ 1); + + i = ((s32)SetReadFlash1 - (s32)ReadFlash1) >> 1; + + while (i != 0) + { + *dest++ = *src++; + i--; + } +} + +void ReadFlash_Core(u8 *src, u8 *dest, u32 size) +{ + while (size-- != 0) + { + *dest++ = *src++; + } +} + +void ReadFlash(u16 sectorNum, u32 offset, u8 *dest, u32 size) +{ + u8 *src; + u16 i; + u16 readFlash_Core_Buffer[0x40]; + u16 *funcSrc; + u16 *funcDest; + void (*readFlash_Core)(u8 *, u8 *, u32); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + if (gFlash->romSize == FLASH_ROM_SIZE_1M) + { + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + } + + funcSrc = (u16 *)ReadFlash_Core; + funcSrc = (u16 *)((s32)funcSrc ^ 1); + funcDest = readFlash_Core_Buffer; + + i = ((s32)ReadFlash - (s32)ReadFlash_Core) >> 1; + + while (i != 0) + { + *funcDest++ = *funcSrc++; + i--; + } + + readFlash_Core = (void (*)(u8 *, u8 *, u32))((s32)readFlash_Core_Buffer + 1); + + src = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset; + + readFlash_Core(src, dest, size); +} + +u32 VerifyFlashSector_Core(u8 *src, u8 *tgt, u32 size) +{ + while (size-- != 0) + { + if (*tgt++ != *src++) + return (u32)(tgt - 1); + } + + return 0; +} + +u32 VerifyFlashSector(u16 sectorNum, u8 *src) +{ + u16 i; + u16 verifyFlashSector_Core_Buffer[0x80]; + u16 *funcSrc; + u16 *funcDest; + u8 *tgt; + u16 size; + u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + if (gFlash->romSize == FLASH_ROM_SIZE_1M) + { + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + } + + funcSrc = (u16 *)VerifyFlashSector_Core; + funcSrc = (u16 *)((s32)funcSrc ^ 1); + funcDest = verifyFlashSector_Core_Buffer; + + i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1; + + while (i != 0) + { + *funcDest++ = *funcSrc++; + i--; + } + + verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1); + + tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift); + size = gFlash->sector.size; + + return verifyFlashSector_Core(src, tgt, size); // return 0 if verified. +} + +u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n) +{ + u16 i; + u16 verifyFlashSector_Core_Buffer[0x80]; + u16 *funcSrc; + u16 *funcDest; + u8 *tgt; + u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); + + if (gFlash->romSize == FLASH_ROM_SIZE_1M) + { + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + } + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + funcSrc = (u16 *)VerifyFlashSector_Core; + funcSrc = (u16 *)((s32)funcSrc ^ 1); + funcDest = verifyFlashSector_Core_Buffer; + + i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1; + + while (i != 0) + { + *funcDest++ = *funcSrc++; + i--; + } + + verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1); + + tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift); + + return verifyFlashSector_Core(src, tgt, n); +} + +u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src) // 3rd is unused +{ + u8 i; + u32 result; + + for (i = 0; i < 3; i++) // 3 attempts + { + result = ProgramFlashSector(sectorNum, src); + if (result != 0) + continue; + + result = VerifyFlashSector(sectorNum, src); + if (result == 0) + break; + } + + return result; // return 0 if verified and programmed. +} + +u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, u8 *src, u32 n) +{ + u8 i; + u32 result; + + for (i = 0; i < 3; i++) + { + result = ProgramFlashSector(sectorNum, src); + if (result != 0) + continue; + + result = VerifyFlashSectorNBytes(sectorNum, src, n); + if (result == 0) + break; + } + + return result; +} diff --git a/src/libs/agb_flash_1m.c b/src/libs/agb_flash_1m.c new file mode 100644 index 000000000..e249fab9a --- /dev/null +++ b/src/libs/agb_flash_1m.c @@ -0,0 +1,86 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" + +static const char AgbLibFlashVersion[] = "FLASH1M_V103"; + +const struct FlashSetupInfo * const sSetupInfos[] = +{ + &MX29L010, + &LE26FV10N1TS, + &DefaultFlash +}; + +u16 IdentifyFlash(void) +{ + u16 result; + u16 flashId; + const struct FlashSetupInfo * const *setupInfo; + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + flashId = ReadFlashId(); + + setupInfo = sSetupInfos; + result = 1; + + for (;;) + { + if ((*setupInfo)->type.ids.separate.makerId == 0) + break; + + if (flashId == (*setupInfo)->type.ids.joined) + { + result = 0; + break; + } + + setupInfo++; + } + + ProgramFlashByte = (*setupInfo)->programFlashByte; + ProgramFlashSector = (*setupInfo)->programFlashSector; + EraseFlashChip = (*setupInfo)->eraseFlashChip; + EraseFlashSector = (*setupInfo)->eraseFlashSector; + WaitForFlashWrite = (*setupInfo)->WaitForFlashWrite; + gFlashMaxTime = (*setupInfo)->maxTime; + gFlash = &(*setupInfo)->type; + + return result; +} + +u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData) +{ + u16 result = 0; + u8 status; + + StartFlashTimer(phase); + + while ((status = PollFlashStatus(addr)) != lastData) + { + if (status & 0x20) + { + // The write operation exceeded the flash chip's time limit. + + if (PollFlashStatus(addr) == lastData) + break; + + FLASH_WRITE(0x5555, 0xF0); + result = phase | 0xA000u; + break; + } + + if (gFlashTimeoutFlag) + { + if (PollFlashStatus(addr) == lastData) + break; + + FLASH_WRITE(0x5555, 0xF0); + result = phase | 0xC000u; + break; + } + } + + StopFlashTimer(); + + return result; +} diff --git a/src/libs/agb_flash_le.c b/src/libs/agb_flash_le.c new file mode 100644 index 000000000..39d956e27 --- /dev/null +++ b/src/libs/agb_flash_le.c @@ -0,0 +1,31 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" + +const u16 leMaxTime[] = +{ + 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, +}; + +const struct FlashSetupInfo LE26FV10N1TS = +{ + ProgramFlashByte_MX, + ProgramFlashSector_MX, + EraseFlashChip_MX, + EraseFlashSector_MX, + WaitForFlashWrite_Common, + leMaxTime, + { + 131072, // ROM size + { + 4096, // sector size + 12, // bit shift to multiply by sector size (4096 == 1 << 12) + 32, // number of sectors + 0 // appears to be unused + }, + { 3, 1 }, // wait state setup data + { { 0x62, 0x13 } } // ID + } +}; diff --git a/src/libs/agb_flash_mx.c b/src/libs/agb_flash_mx.c new file mode 100644 index 000000000..67348901f --- /dev/null +++ b/src/libs/agb_flash_mx.c @@ -0,0 +1,197 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" + +const u16 mxMaxTime[] = +{ + 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, +}; + +const struct FlashSetupInfo MX29L010 = +{ + ProgramFlashByte_MX, + ProgramFlashSector_MX, + EraseFlashChip_MX, + EraseFlashSector_MX, + WaitForFlashWrite_Common, + mxMaxTime, + { + 131072, // ROM size + { + 4096, // sector size + 12, // bit shift to multiply by sector size (4096 == 1 << 12) + 32, // number of sectors + 0 // appears to be unused + }, + { 3, 1 }, // wait state setup data +#if defined(GERMAN) && defined(SAPPHIRE) + { { 0xBF, 0xD4 } } // ID +#else + { { 0xC2, 0x09 } } // ID +#endif + } +}; + +const struct FlashSetupInfo DefaultFlash = +{ + ProgramFlashByte_MX, + ProgramFlashSector_MX, + EraseFlashChip_MX, + EraseFlashSector_MX, + WaitForFlashWrite_Common, + mxMaxTime, + { + 131072, // ROM size + { + 4096, // sector size + 12, // bit shift to multiply by sector size (4096 == 1 << 12) + 32, // number of sectors + 0 // appears to be unused + }, + { 3, 1 }, // wait state setup data + { { 0x00, 0x00 } } // ID of 0 + } +}; + +u16 EraseFlashChip_MX(void) +{ + u16 result; + u16 readFlash1Buffer[0x20]; + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; + + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0x80); + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0x10); + + SetReadFlash1(readFlash1Buffer); + + result = WaitForFlashWrite(3, FLASH_BASE, 0xFF); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + return result; +} + +u16 EraseFlashSector_MX(u16 sectorNum) +{ + u16 numTries; + u16 result; + u8 *addr; + u16 readFlash1Buffer[0x20]; + + if (sectorNum >= gFlash->sector.count) + return 0x80FF; + + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + + numTries = 0; + +try_erase: + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; + + addr = FLASH_BASE + (sectorNum << gFlash->sector.shift); + + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0x80); + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + *addr = 0x30; + + SetReadFlash1(readFlash1Buffer); + + result = WaitForFlashWrite(2, addr, 0xFF); + + if (!(result & 0xA000) || numTries > 3) + goto done; + + numTries++; + + goto try_erase; + +done: + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + return result; +} + +u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data) +{ + u8 *addr; + u16 readFlash1Buffer[0x20]; + + if (offset >= gFlash->sector.size) + return 0x8000; + + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + + addr = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset; + + SetReadFlash1(readFlash1Buffer); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; + + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0xA0); + *addr = data; + + return WaitForFlashWrite(1, addr, data); +} + +static u16 ProgramByte(u8 *src, u8 *dest) +{ + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0xA0); + *dest = *src; + + return WaitForFlashWrite(1, dest, *src); +} + +u16 ProgramFlashSector_MX(u16 sectorNum, u8 *src) +{ + u16 result; + u8 *dest; + u16 readFlash1Buffer[0x20]; + + if (sectorNum >= gFlash->sector.count) + return 0x80FF; + + result = EraseFlashSector_MX(sectorNum); + + if (result != 0) + return result; + + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + + SetReadFlash1(readFlash1Buffer); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; + + gFlashNumRemainingBytes = gFlash->sector.size; + dest = FLASH_BASE + (sectorNum << gFlash->sector.shift); + + while (gFlashNumRemainingBytes > 0) + { + result = ProgramByte(src, dest); + + if (result != 0) + break; + + gFlashNumRemainingBytes--; + src++; + dest++; + } + + return result; +} diff --git a/src/libs/libc.c b/src/libs/libc.c new file mode 100644 index 000000000..920673e3e --- /dev/null +++ b/src/libs/libc.c @@ -0,0 +1,143 @@ +#include "global.h" +#include + +#define LBLOCKSIZE (sizeof(long)) + +// Nonzero if (long)X contains a NULL byte. +#define CONTAINSNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) + +// Nonzero if X is not aligned on a "long" boundary. +#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1)) + +void *memcpy(void *dst0, const void *src0, size_t len0) +{ + char *dst = dst0; + const char *src = src0; + long *aligned_dst; + const long *aligned_src; + unsigned int len = len0; + + // If the size is small, or either src or dst is unaligned, + // then go to the byte copy loop. This should be rare. + if (len >= 16 && !(UNALIGNED(src) | UNALIGNED(dst))) + { + aligned_dst = (long *)dst; + aligned_src = (long *)src; + + // Copy 4X long words at a time if possible. + while (len >= 16) + { + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + len -= 16; + } + + // Copy one long word at a time if possible + while (len >= 4) + { + *aligned_dst++ = *aligned_src++; + len -= 4; + } + + dst = (char *)aligned_dst; + src = (char *)aligned_src; + } + + // Pick up any remaining bytes with a byte copier. + while (len--) + *dst++ = *src++; + + return dst0; +} + +void *memset(void *m, int c, size_t n) +{ + char *s = (char *)m; + int count, i; + unsigned long buffer; + unsigned long *aligned_addr; + unsigned char *unaligned_addr; + + // If the size is small or m is unaligned, + // then go to the byte copy loop. This should be rare. + if (n >= LBLOCKSIZE && !UNALIGNED(m)) + { + // We know that n is large and m is word-aligned. + aligned_addr = (unsigned long *)m; + + // Store C into each char sized location in buffer so that + // we can set large blocks quickly. + c &= 0xFF; + if (LBLOCKSIZE == 4) + { + buffer = (c << 8) | c; + buffer |= (buffer << 16); + } + else + { + buffer = 0; + for (i = 0; i < LBLOCKSIZE; i++) + buffer = (buffer << 8) | c; + } + + while (n >= LBLOCKSIZE * 4) + { + *aligned_addr++ = buffer; + *aligned_addr++ = buffer; + *aligned_addr++ = buffer; + *aligned_addr++ = buffer; + n -= LBLOCKSIZE * 4; + } + while (n >= LBLOCKSIZE) + { + *aligned_addr++ = buffer; + n -= LBLOCKSIZE; + } + + s = (char *)aligned_addr; + } + + // Pick up the remainder with a bytewise loop. + while (n--) + *s++ = (char)c; + + return m; +} + +int strcmp(const char *s1, const char *s2) +{ + unsigned long *a1; + unsigned long *a2; + + // If s1 or s2 are unaligned, then skip this and compare bytes. + if (!(UNALIGNED(s1) | UNALIGNED(s2))) + { + // Compare them a word at a time. + a1 = (unsigned long *)s1; + a2 = (unsigned long *)s2; + while (*a1 == *a2) + { + // If *a1 == *a2, and we find a null in *a1, + // then the strings must be equal, so return zero. + if (CONTAINSNULL(*a1)) + return 0; + + a1++; + a2++; + } + + s1 = (char *)a1; + s2 = (char *)a2; + } + + // Check the remaining few bytes. + while (*s1 != '\0' && *s1 == *s2) + { + s1++; + s2++; + } + + return (*(unsigned char *) s1) - (*(unsigned char *) s2); +} diff --git a/src/libs/m4a_2.c b/src/libs/m4a_2.c new file mode 100644 index 000000000..2d3c65848 --- /dev/null +++ b/src/libs/m4a_2.c @@ -0,0 +1,912 @@ +#include "gba/m4a_internal.h" + +#define BSS_CODE __attribute__((section(".bss.code"))) + +BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0}; + +struct SoundInfo gSoundInfo; +struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES]; +struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES]; +void *gMPlayJumpTable[36]; +struct CgbChannel gCgbChans[4]; +struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2]; +struct PokemonCrySong gPokemonCrySong; +struct MusicPlayerInfo gMPlay_BGM; +struct MusicPlayerInfo gMPlay_SE1; +struct MusicPlayerInfo gMPlay_SE2; +struct MusicPlayerInfo gMPlay_SE3; +u8 gMPlayMemAccArea[0x10]; + +u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust) +{ + u32 val1; + u32 val2; + u32 fineAdjustShifted = fineAdjust << 24; + + if (key > 178) + { + key = 178; + fineAdjustShifted = 255 << 24; + } + + val1 = gScaleTable[key]; + val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4); + + val2 = gScaleTable[key + 1]; + val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4); + + return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted)); +} + +void UnusedDummyFunc() +{ +} + +void MPlayContinue(struct MusicPlayerInfo *mplayInfo) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; + mplayInfo->ident = ID_NUMBER; + } +} + +void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aSoundInit(void) +{ + s32 i; + + CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); + + SoundInit(&gSoundInfo); + MPlayExtender(gCgbChans); + m4aSoundMode(SOUND_MODE_DA_BIT_8 + | SOUND_MODE_FREQ_13379 + | (12 << SOUND_MODE_MASVOL_SHIFT) + | (5 << SOUND_MODE_MAXCHN_SHIFT)); + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + { + struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info; + MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8); + mplayInfo->unk_B = gMPlayTable[i].unk_A; + mplayInfo->memAccArea = gMPlayMemAccArea; + } + + memcpy(&gPokemonCrySong, &gPokemonCrySongTemplate, sizeof(struct PokemonCrySong)); + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + { + struct MusicPlayerInfo *mplayInfo = &gPokemonCryMusicPlayers[i]; + struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; + MPlayOpen(mplayInfo, track, 2); + track->chan = 0; + } +} + +void m4aSoundMain(void) +{ + SoundMain(); +} + +void m4aSongNumStart(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + MPlayStart(mplay->info, song->header); +} + +void m4aSongNumStartOrChange(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader != song->header) + { + MPlayStart(mplay->info, song->header); + } + else + { + if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0 + || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)) + { + MPlayStart(mplay->info, song->header); + } + } +} + +void m4aSongNumStartOrContinue(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader != song->header) + MPlayStart(mplay->info, song->header); + else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0) + MPlayStart(mplay->info, song->header); + else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE) + MPlayContinue(mplay->info); +} + +void m4aSongNumStop(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader == song->header) + m4aMPlayStop(mplay->info); +} + +void m4aSongNumContinue(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader == song->header) + MPlayContinue(mplay->info); +} + +void m4aMPlayAllStop(void) +{ + s32 i; + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + m4aMPlayStop(gMPlayTable[i].info); + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + m4aMPlayStop(&gPokemonCryMusicPlayers[i]); +} + +void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo) +{ + MPlayContinue(mplayInfo); +} + +void m4aMPlayAllContinue(void) +{ + s32 i; + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + MPlayContinue(gMPlayTable[i].info); + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + MPlayContinue(&gPokemonCryMusicPlayers[i]); +} + +void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + MPlayFadeOut(mplayInfo, speed); +} + +void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN; + mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo) +{ + s32 trackCount = mplayInfo->trackCount; + struct MusicPlayerTrack *track = mplayInfo->tracks; + + while (trackCount > 0) + { + if (track->flags & MPT_FLG_EXIST) + { + if (track->flags & MPT_FLG_START) + { + Clear64byte(track); + track->flags = MPT_FLG_EXIST; + track->bendRange = 2; + track->volX = 64; + track->lfoSpeed = 22; + track->tone.type = 1; + } + } + + trackCount--; + track++; + } +} + +void MPlayExtender(struct CgbChannel *cgbChans) +{ + struct SoundInfo *soundInfo; + u32 ident; + + REG_SOUNDCNT_X = SOUND_MASTER_ENABLE + | SOUND_4_ON + | SOUND_3_ON + | SOUND_2_ON + | SOUND_1_ON; + REG_SOUNDCNT_L = 0; // set master volume to zero + REG_NR12 = 0x8; + REG_NR22 = 0x8; + REG_NR42 = 0x8; + REG_NR14 = 0x80; + REG_NR24 = 0x80; + REG_NR44 = 0x80; + REG_NR30 = 0; + REG_NR50 = 0x77; + + soundInfo = SOUND_INFO_PTR; + + ident = soundInfo->ident; + + if (ident != ID_NUMBER) + return; + + soundInfo->ident++; + + gMPlayJumpTable[8] = ply_memacc; + gMPlayJumpTable[17] = ply_lfos; + gMPlayJumpTable[19] = ply_mod; + gMPlayJumpTable[28] = ply_xcmd; + gMPlayJumpTable[29] = ply_endtie; + gMPlayJumpTable[30] = SampleFreqSet; + gMPlayJumpTable[31] = TrackStop; + gMPlayJumpTable[32] = FadeOutBody; + gMPlayJumpTable[33] = TrkVolPitSet; + + soundInfo->cgbChans = (struct CgbChannel *)cgbChans; + soundInfo->CgbSound = CgbSound; + soundInfo->CgbOscOff = CgbOscOff; + soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq; + soundInfo->maxLines = MAX_LINES; + + CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4); + + cgbChans[0].ty = 1; + cgbChans[0].panMask = 0x11; + cgbChans[1].ty = 2; + cgbChans[1].panMask = 0x22; + cgbChans[2].ty = 3; + cgbChans[2].panMask = 0x44; + cgbChans[3].ty = 4; + cgbChans[3].panMask = 0x88; + + soundInfo->ident = ident; +} + +void MusicPlayerJumpTableCopy(void) +{ + asm("swi 0x2A"); +} + +void ClearChain(void *x) +{ + void (*func)(void *) = *(&gMPlayJumpTable[34]); + func(x); +} + +void Clear64byte(void *x) +{ + void (*func)(void *) = *(&gMPlayJumpTable[35]); + func(x); +} + +void SoundInit(struct SoundInfo *soundInfo) +{ + soundInfo->ident = 0; + + if (REG_DMA1CNT & (DMA_REPEAT << 16)) + REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + if (REG_DMA2CNT & (DMA_REPEAT << 16)) + REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + REG_DMA1CNT_H = DMA_32BIT; + REG_DMA2CNT_H = DMA_32BIT; + REG_SOUNDCNT_X = SOUND_MASTER_ENABLE + | SOUND_4_ON + | SOUND_3_ON + | SOUND_2_ON + | SOUND_1_ON; + REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT + | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT + | SOUND_ALL_MIX_FULL; + REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40; + + REG_DMA1SAD = (s32)soundInfo->pcmBuffer; + REG_DMA1DAD = (s32)®_FIFO_A; + REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE; + REG_DMA2DAD = (s32)®_FIFO_B; + + SOUND_INFO_PTR = soundInfo; + CpuFill32(0, soundInfo, sizeof(struct SoundInfo)); + + soundInfo->maxChans = 8; + soundInfo->masterVolume = 15; + soundInfo->plynote = (u32)ply_note; + soundInfo->CgbSound = DummyFunc; + soundInfo->CgbOscOff = (void (*)(u8))DummyFunc; + soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc; + soundInfo->ExtVolPit = (u32)DummyFunc; + + MPlayJumpTableCopy(gMPlayJumpTable); + + soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable; + + SampleFreqSet(SOUND_MODE_FREQ_13379); + + soundInfo->ident = ID_NUMBER; +} + +void SampleFreqSet(u32 freq) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + freq = (freq & 0xF0000) >> 16; + soundInfo->freq = freq; + soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; + soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; + + // LCD refresh rate 59.7275Hz + soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000; + + // CPU frequency 16.78Mhz + soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1; + + // Turn off timer 0. + REG_TM0CNT_H = 0; + + // cycles per LCD fresh 280896 + REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank); + + m4aSoundVSyncOn(); + + while (*(vu8 *)REG_ADDR_VCOUNT == 159) + ; + + while (*(vu8 *)REG_ADDR_VCOUNT != 159) + ; + + REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK; +} + +void m4aSoundMode(u32 mode) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + u32 temp; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL); + + if (temp) + soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL; + + temp = mode & SOUND_MODE_MAXCHN; + + if (temp) + { + struct SoundChannel *chan; + + soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; + + temp = MAX_DIRECTSOUND_CHANNELS; + chan = &soundInfo->chans[0]; + + while (temp != 0) + { + chan->status = 0; + temp--; + chan++; + } + } + + temp = mode & SOUND_MODE_MASVOL; + + if (temp) + soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT; + + temp = mode & SOUND_MODE_DA_BIT; + + if (temp) + { + temp = (temp & 0x300000) >> 14; + REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp; + } + + temp = mode & SOUND_MODE_FREQ; + + if (temp) + { + m4aSoundVSyncOff(); + SampleFreqSet(temp); + } + + soundInfo->ident = ID_NUMBER; +} + +void SoundClear(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + s32 i; + void *chan; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + i = MAX_DIRECTSOUND_CHANNELS; + chan = &soundInfo->chans[0]; + + while (i > 0) + { + ((struct SoundChannel *)chan)->status = 0; + i--; + chan = (void *)((s32)chan + sizeof(struct SoundChannel)); + } + + chan = soundInfo->cgbChans; + + if (chan) + { + i = 1; + + while (i <= 4) + { + soundInfo->CgbOscOff(i); + ((struct CgbChannel *)chan)->sf = 0; + i++; + chan = (void *)((s32)chan + sizeof(struct CgbChannel)); + } + } + + soundInfo->ident = ID_NUMBER; +} + +void m4aSoundVSyncOff(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) + { + soundInfo->ident += 10; + + if (REG_DMA1CNT & (DMA_REPEAT << 16)) + REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + if (REG_DMA2CNT & (DMA_REPEAT << 16)) + REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + REG_DMA1CNT_H = DMA_32BIT; + REG_DMA2CNT_H = DMA_32BIT; + + CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer)); + } +} + +void m4aSoundVSyncOn(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + u32 ident = soundInfo->ident; + + if (ident == ID_NUMBER) + return; + + REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; + REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; + + soundInfo->pcmDmaCounter = 0; + soundInfo->ident = ident - 10; +} + +void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount) +{ + struct SoundInfo *soundInfo; + + if (trackCount == 0) + return; + + if (trackCount > MAX_MUSICPLAYER_TRACKS) + trackCount = MAX_MUSICPLAYER_TRACKS; + + soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + Clear64byte(mplayInfo); + + mplayInfo->tracks = tracks; + mplayInfo->trackCount = trackCount; + mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; + + while (trackCount != 0) + { + tracks->flags = 0; + trackCount--; + tracks++; + } + + if (soundInfo->func != 0) + { + mplayInfo->func = soundInfo->func; + mplayInfo->intp = soundInfo->intp; + soundInfo->func = 0; + } + + soundInfo->intp = (u32)mplayInfo; + soundInfo->func = (u32)MPlayMain; + soundInfo->ident = ID_NUMBER; + mplayInfo->ident = ID_NUMBER; +} + +void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader) +{ + s32 i; + u8 unk_B; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + unk_B = mplayInfo->unk_B; + + if (!unk_B + || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START)) + && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0 + || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE))) + || (mplayInfo->priority <= songHeader->priority)) + { + mplayInfo->ident++; + mplayInfo->status = 0; + mplayInfo->songHeader = songHeader; + mplayInfo->tone = songHeader->tone; + mplayInfo->priority = songHeader->priority; + mplayInfo->clock = 0; + mplayInfo->tempoD = 150; + mplayInfo->tempoI = 150; + mplayInfo->tempoU = 0x100; + mplayInfo->tempoC = 0; + mplayInfo->fadeOI = 0; + + i = 0; + track = mplayInfo->tracks; + + while (i < songHeader->trackCount && i < mplayInfo->trackCount) + { + TrackStop(mplayInfo, track); + track->flags = MPT_FLG_EXIST | MPT_FLG_START; + track->chan = 0; + track->cmdPtr = songHeader->part[i]; + i++; + track++; + } + + while (i < mplayInfo->trackCount) + { + TrackStop(mplayInfo, track); + track->flags = 0; + i++; + track++; + } + + if (songHeader->reverb & 0x80) + m4aSoundMode(songHeader->reverb); + + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo) +{ + s32 i; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + TrackStop(mplayInfo, track); + i--; + track++; + } + + mplayInfo->ident = ID_NUMBER; +} + +void FadeOutBody(struct MusicPlayerInfo *mplayInfo) +{ + s32 i; + struct MusicPlayerTrack *track; + u16 fadeOI = mplayInfo->fadeOI; + register u32 temp asm("r3"); + register u16 mask asm("r2"); + + if (fadeOI == 0) + return; + + mplayInfo->fadeOC--; + + temp = 0xFFFF; + mask = temp; + + if (mplayInfo->fadeOC != 0) + return; + + mplayInfo->fadeOC = fadeOI; + + if (mplayInfo->fadeOV & FADE_IN) + { + mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT); + + if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT)) + { + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); + mplayInfo->fadeOI = 0; + } + } + else + { + mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT); + + if ((s16)(mplayInfo->fadeOV & mask) <= 0) + { + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + register u32 fadeOV asm("r7"); + u32 val; + + TrackStop(mplayInfo, track); + + val = TEMPORARY_FADE; + fadeOV = mplayInfo->fadeOV; + val &= fadeOV; + + if (!val) + track->flags = 0; + + i--; + track++; + } + + if (mplayInfo->fadeOV & TEMPORARY_FADE) + mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; + else + mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; + + mplayInfo->fadeOI = 0; + return; + } + } + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + if (track->flags & MPT_FLG_EXIST) + { + track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT); + track->flags |= MPT_FLG_VOLCHG; + } + + i--; + track++; + } +} + +void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + if (track->flags & MPT_FLG_VOLSET) + { + s32 x; + s32 y; + + x = (u32)(track->vol * track->volX) >> 5; + + if (track->modT == 1) + x = (u32)(x * (track->modM + 128)) >> 7; + + y = 2 * track->pan + track->panX; + + if (track->modT == 2) + y += track->modM; + + if (y < -128) + y = -128; + else if (y > 127) + y = 127; + + track->volMR = (u32)((y + 128) * x) >> 8; + track->volML = (u32)((127 - y) * x) >> 8; + } + + if (track->flags & MPT_FLG_PITSET) + { + s32 bend = track->bend * track->bendRange; + register s32 x asm("r1") = track->tune; + x += bend; + x *= 4; + x += (track->keyShift << 8); + x += (track->keyShiftX << 8); + x += track->pitX; + + if (track->modT == 0) + x += 16 * track->modM; + + track->keyM = x >> 8; + track->pitM = x; + } + + track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET); +} + +u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) +{ + if (chanNum == 4) + { + if (key <= 20) + { + key = 0; + } + else + { + key -= 21; + if (key > 59) + key = 59; + } + + return gNoiseTable[key]; + } + else + { + s32 val1; + s32 val2; + + if (key <= 35) + { + fineAdjust = 0; + key = 0; + } + else + { + key -= 36; + if (key > 130) + { + key = 130; + fineAdjust = 255; + } + } + + val1 = gCgbScaleTable[key]; + val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4); + + val2 = gCgbScaleTable[key + 1]; + val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4); + + return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048; + } +} + +void CgbOscOff(u8 chanNum) +{ + switch (chanNum) + { + case 1: + REG_NR12 = 8; + REG_NR14 = 0x80; + break; + case 2: + REG_NR22 = 8; + REG_NR24 = 0x80; + break; + case 3: + REG_NR30 = 0; + break; + default: + REG_NR42 = 8; + REG_NR44 = 0x80; + } +} + +static inline int CgbPan(struct CgbChannel *chan) +{ + u32 rightVolume = chan->rightVolume; + u32 leftVolume = chan->leftVolume; + + if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) + { + if (rightVolume / 2 >= leftVolume) + { + chan->pan = 0x0F; + return 1; + } + } + else + { + if (leftVolume / 2 >= rightVolume) + { + chan->pan = 0xF0; + return 1; + } + } + + return 0; +} + +void CgbModVol(struct CgbChannel *chan) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if ((soundInfo->mode & 1) || !CgbPan(chan)) + { + chan->pan = 0xFF; + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + } + else + { + // Force chan->rightVolume and chan->leftVolume to be read from memory again, + // even though there is no reason to do so. + // The command line option "-fno-gcse" achieves the same result as this. + asm("" : : : "memory"); + + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + if (chan->eg > 15) + chan->eg = 15; + } + + chan->sg = (chan->eg * chan->su + 15) >> 4; + chan->pan &= chan->panMask; +} diff --git a/src/libs/m4a_4.c b/src/libs/m4a_4.c new file mode 100644 index 000000000..99195ec00 --- /dev/null +++ b/src/libs/m4a_4.c @@ -0,0 +1,545 @@ +#include "gba/m4a_internal.h" + +void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->tempoU = tempo; + mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->volX = volume / 4; + track->flags |= MPT_FLG_VOLCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 pitch) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->keyShiftX = (s16)pitch >> 8; + track->pitX = pitch; + track->flags |= MPT_FLG_PITCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->panX = pan; + track->flags |= MPT_FLG_VOLCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void ClearModM(struct MusicPlayerTrack *track) +{ + track->lfoSpeedC = 0; + track->modM = 0; + + if (track->modT == 0) + track->flags |= MPT_FLG_PITCHG; + else + track->flags |= MPT_FLG_VOLCHG; +} + +void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->mod = modDepth; + + if (!track->mod) + ClearModM(track); + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->lfoSpeed = lfoSpeed; + + if (!track->lfoSpeed) + ClearModM(track); + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +#define MEMACC_COND_JUMP(cond) \ +if (cond) \ + goto cond_true; \ +else \ + goto cond_false; \ + +void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 op; + u8 *addr; + u8 data; + + op = *track->cmdPtr; + track->cmdPtr++; + + addr = mplayInfo->memAccArea + *track->cmdPtr; + track->cmdPtr++; + + data = *track->cmdPtr; + track->cmdPtr++; + + switch (op) + { + case 0: + *addr = data; + return; + case 1: + *addr += data; + return; + case 2: + *addr -= data; + return; + case 3: + *addr = mplayInfo->memAccArea[data]; + return; + case 4: + *addr += mplayInfo->memAccArea[data]; + return; + case 5: + *addr -= mplayInfo->memAccArea[data]; + return; + case 6: + MEMACC_COND_JUMP(*addr == data) + return; + case 7: + MEMACC_COND_JUMP(*addr != data) + return; + case 8: + MEMACC_COND_JUMP(*addr > data) + return; + case 9: + MEMACC_COND_JUMP(*addr >= data) + return; + case 10: + MEMACC_COND_JUMP(*addr <= data) + return; + case 11: + MEMACC_COND_JUMP(*addr < data) + return; + case 12: + MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data]) + return; + case 13: + MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data]) + return; + case 14: + MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data]) + return; + case 15: + MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data]) + return; + case 16: + MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data]) + return; + case 17: + MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data]) + return; + default: + return; + } + +cond_true: + { + void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]); + func(mplayInfo, track); + return; + } + +cond_false: + track->cmdPtr += 4; +} + +void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 n = *track->cmdPtr; + track->cmdPtr++; + + gXcmdTable[n](mplayInfo, track); +} + +void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]); + func(mplayInfo, track); +} + +#define READ_XCMD_BYTE(var, n) \ +{ \ + u32 byte = track->cmdPtr[(n)]; \ + byte <<= n * 8; \ + (var) &= ~(0xFF << (n * 8)); \ + (var) |= byte; \ +} + +void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 wav; + + READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable + READ_XCMD_BYTE(wav, 1) + READ_XCMD_BYTE(wav, 2) + READ_XCMD_BYTE(wav, 3) + + track->tone.wav = (struct WaveData *)wav; + track->cmdPtr += 4; +} + +void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.type = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.attack = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.decay = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.sustain = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.release = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->echoVolume = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->echoLength = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.length = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.pan_sweep = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 unk; + + READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable + READ_XCMD_BYTE(unk, 1) + + if (track->unk_3A < (u16)unk) + { + track->unk_3A++; + track->cmdPtr -= 2; + track->wait = 1; + } + else + { + track->unk_3A = 0; + track->cmdPtr += 2; + } +} + +void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 unk; + + READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable + READ_XCMD_BYTE(unk, 1) + READ_XCMD_BYTE(unk, 2) + READ_XCMD_BYTE(unk, 3) + + track->unk_3C = unk; + track->cmdPtr += 4; +} + +void DummyFunc(void) +{ +} + +struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone) +{ + u32 maxClock = 0; + s32 maxClockIndex = 0; + s32 i; + struct MusicPlayerInfo *mplayInfo; + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + { + struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; + + if (!track->flags && (!track->chan || track->chan->track != track)) + goto start_song; + + if (maxClock < gPokemonCryMusicPlayers[i].clock) + { + maxClock = gPokemonCryMusicPlayers[i].clock; + maxClockIndex = i; + } + } + + i = maxClockIndex; + +start_song: + mplayInfo = &gPokemonCryMusicPlayers[i]; + mplayInfo->ident++; + +#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong)) +#define CRY_OFS(field) offsetof(struct PokemonCrySong, field) + + memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong)); + + *(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone; + *(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0); + *(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1); + *(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont); + +#undef CRY_OFS +#undef CRY + + mplayInfo->ident = ID_NUMBER; + + MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i])); + + return mplayInfo; +} + +void SetPokemonCryVolume(u8 val) +{ + gPokemonCrySong.volumeValue = val & 0x7F; +} + +void SetPokemonCryPanpot(s8 val) +{ + gPokemonCrySong.panValue = (val + C_V) & 0x7F; +} + +void SetPokemonCryPitch(s16 val) +{ + s16 b = val + 0x80; + u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue; + gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F; + gPokemonCrySong.tuneValue = (b >> 1) & 0x7F; + gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F; +} + +void SetPokemonCryLength(u16 val) +{ + gPokemonCrySong.unkCmd0CParam = val; +} + +void SetPokemonCryRelease(u8 val) +{ + gPokemonCrySong.releaseValue = val; +} + +void SetPokemonCryProgress(u32 val) +{ + gPokemonCrySong.unkCmd0DParam = val; +} + +int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo) +{ + struct MusicPlayerTrack *track = mplayInfo->tracks; + + if (track->chan && track->chan->track == track) + return 1; + else + return 0; +} + +void SetPokemonCryChorus(s8 val) +{ + if (val) + { + gPokemonCrySong.trackCount = 2; + gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F; + } + else + { + gPokemonCrySong.trackCount = 1; + } +} + +void SetPokemonCryStereo(u32 val) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if (val) + { + REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT + | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT + | SOUND_ALL_MIX_FULL; + soundInfo->mode &= ~1; + } + else + { + REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT + | SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT + | SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL; + soundInfo->mode |= 1; + } +} + +void SetPokemonCryPriority(u8 val) +{ + gPokemonCrySong.priority = val; +} diff --git a/src/libs/m4a_tables.c b/src/libs/m4a_tables.c new file mode 100644 index 000000000..91f00a31d --- /dev/null +++ b/src/libs/m4a_tables.c @@ -0,0 +1,307 @@ +#include "gba/m4a_internal.h" + +// Some of these functions have different signatures, so we need to make this +// an array of void pointers or a struct. It's simpler to just make it an array +// for now. +void * const gMPlayJumpTableTemplate[] = +{ + ply_fine, + ply_goto, + ply_patt, + ply_pend, + ply_rept, + ply_fine, + ply_fine, + ply_fine, + ply_fine, + ply_prio, + ply_tempo, + ply_keysh, + ply_voice, + ply_vol, + ply_pan, + ply_bend, + ply_bendr, + ply_lfos, + ply_lfodl, + ply_mod, + ply_modt, + ply_fine, + ply_fine, + ply_tune, + ply_fine, + ply_fine, + ply_fine, + ply_port, + ply_fine, + ply_endtie, + SampleFreqSet, + TrackStop, + FadeOutBody, + TrkVolPitSet, + RealClearChain, + SoundMainBTM, +}; + +// This is a table of deltas between sample values in compressed PCM data. +const s8 gDeltaEncodingTable[] = +{ + 0, + 1, + 4, + 9, + 16, + 25, + 36, + 49, + -64, + -49, + -36, + -25, + -16, + -9, + -4, + -1, +}; + +const u8 gScaleTable[] = +{ + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, +}; + +const u32 gFreqTable[] = +{ + 2147483648u, + 2275179671u, + 2410468894u, + 2553802834u, + 2705659852u, + 2866546760u, + 3037000500u, + 3217589947u, + 3408917802u, + 3611622603u, + 3826380858u, + 4053909305u, +}; + +const u16 gPcmSamplesPerVBlankTable[] = +{ + 96, + 132, + 176, + 224, + 264, + 304, + 352, + 448, + 528, + 608, + 672, + 704, +}; + +const u8 gCgbScaleTable[] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, +}; + +const s16 gCgbFreqTable[] = +{ + -2004, + -1891, + -1785, + -1685, + -1591, + -1501, + -1417, + -1337, + -1262, + -1192, + -1125, + -1062, +}; + +const u8 gNoiseTable[] = +{ + 0xD7, 0xD6, 0xD5, 0xD4, + 0xC7, 0xC6, 0xC5, 0xC4, + 0xB7, 0xB6, 0xB5, 0xB4, + 0xA7, 0xA6, 0xA5, 0xA4, + 0x97, 0x96, 0x95, 0x94, + 0x87, 0x86, 0x85, 0x84, + 0x77, 0x76, 0x75, 0x74, + 0x67, 0x66, 0x65, 0x64, + 0x57, 0x56, 0x55, 0x54, + 0x47, 0x46, 0x45, 0x44, + 0x37, 0x36, 0x35, 0x34, + 0x27, 0x26, 0x25, 0x24, + 0x17, 0x16, 0x15, 0x14, + 0x07, 0x06, 0x05, 0x04, + 0x03, 0x02, 0x01, 0x00, +}; + +const u8 gCgb3Vol[] = +{ + 0x00, 0x00, + 0x60, 0x60, 0x60, 0x60, + 0x40, 0x40, 0x40, 0x40, + 0x80, 0x80, 0x80, 0x80, + 0x20, 0x20, +}; + +const u8 gClockTable[] = +{ + 0x00, + 0x01, + 0x02, + 0x03, + 0x04, + 0x05, + 0x06, + 0x07, + 0x08, + 0x09, + 0x0A, + 0x0B, + 0x0C, + 0x0D, + 0x0E, + 0x0F, + 0x10, + 0x11, + 0x12, + 0x13, + 0x14, + 0x15, + 0x16, + 0x17, + 0x18, + 0x1C, + 0x1E, + 0x20, + 0x24, + 0x28, + 0x2A, + 0x2C, + 0x30, + 0x34, + 0x36, + 0x38, + 0x3C, + 0x40, + 0x42, + 0x44, + 0x48, + 0x4C, + 0x4E, + 0x50, + 0x54, + 0x58, + 0x5A, + 0x5C, + 0x60, +}; + +#define FINE 0xb1 +#define GOTO 0xb2 +#define PATT 0xb3 +#define PEND 0xb4 +#define REPT 0xb5 +#define MEMACC 0xb9 +#define PRIO 0xba +#define TEMPO 0xbb +#define KEYSH 0xbc +#define VOICE 0xbd +#define VOL 0xbe +#define PAN 0xbf +#define BEND 0xc0 +#define BENDR 0xc1 +#define LFOS 0xc2 +#define LFODL 0xc3 +#define MOD 0xc4 +#define MODT 0xc5 +#define TUNE 0xc8 + +#define XCMD 0xcd +#define xRELE 0x07 +#define xIECV 0x08 +#define xIECL 0x09 + +#define EOT 0xce +#define TIE 0xcf + +const struct PokemonCrySong gPokemonCrySongTemplate = +{ + 1, // track count + 0, // block count + 255, // priority + 0, // reverb + (struct ToneData *)&voicegroup_pokemon_cry, + NULL, + NULL, + 0, + TUNE, // part 0 + C_V, // TUNE value + GOTO, + 0, // GOTO target address + TUNE, // part 1 + C_V + 16, // TUNE value + {VOICE, 0}, // part 0 jumps here with GOTO + VOL, + 127, // volume + {XCMD, 0x0D}, + 0, // unk value + {XCMD, xRELE}, + 0, // release + PAN, + C_V, // PAN value + TIE, + 60, // TIE key (default is Cn3) + 127, // TIE velocity + {XCMD, 0x0C}, + 60, // unk value + {EOT, FINE} // end +}; + +const XcmdFunc gXcmdTable[] = +{ + ply_xxx, + ply_xwave, + ply_xtype, + ply_xxx, + ply_xatta, + ply_xdeca, + ply_xsust, + ply_xrele, + ply_xiecv, + ply_xiecl, + ply_xleng, + ply_xswee, + ply_xcmd_0C, + ply_xcmd_0D, +}; diff --git a/src/libs/siirtc.c b/src/libs/siirtc.c new file mode 100644 index 000000000..965a068f1 --- /dev/null +++ b/src/libs/siirtc.c @@ -0,0 +1,432 @@ +// Ruby/Sapphire/Emerald cartridges contain a Seiko Instruments Inc. (SII) +// S-3511A real-time clock (RTC). This library ("SIIRTC_V001") is for +// communicating with the RTC. + +#include "gba/gba.h" +#include "siirtc.h" + +#define STATUS_INTFE 0x02 // frequency interrupt enable +#define STATUS_INTME 0x08 // per-minute interrupt enable +#define STATUS_INTAE 0x20 // alarm interrupt enable +#define STATUS_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode +#define STATUS_POWER 0x80 // power on or power failure occurred + +#define TEST_MODE 0x80 // flag in the "second" byte + +#define ALARM_AM 0x00 +#define ALARM_PM 0x80 + +#define OFFSET_YEAR offsetof(struct SiiRtcInfo, year) +#define OFFSET_MONTH offsetof(struct SiiRtcInfo, month) +#define OFFSET_DAY offsetof(struct SiiRtcInfo, day) +#define OFFSET_DAY_OF_WEEK offsetof(struct SiiRtcInfo, dayOfWeek) +#define OFFSET_HOUR offsetof(struct SiiRtcInfo, hour) +#define OFFSET_MINUTE offsetof(struct SiiRtcInfo, minute) +#define OFFSET_SECOND offsetof(struct SiiRtcInfo, second) +#define OFFSET_STATUS offsetof(struct SiiRtcInfo, status) +#define OFFSET_ALARM_HOUR offsetof(struct SiiRtcInfo, alarmHour) +#define OFFSET_ALARM_MINUTE offsetof(struct SiiRtcInfo, alarmMinute) + +#define INFO_BUF(info, index) (*((u8 *)(info) + (index))) + +#define DATETIME_BUF(info, index) INFO_BUF(info, OFFSET_YEAR + index) +#define DATETIME_BUF_LEN (OFFSET_SECOND - OFFSET_YEAR + 1) + +#define TIME_BUF(info, index) INFO_BUF(info, OFFSET_HOUR + index) +#define TIME_BUF_LEN (OFFSET_SECOND - OFFSET_HOUR + 1) + +#define WR 0 // command for writing data +#define RD 1 // command for reading data + +#define CMD(n) (0x60 | (n << 1)) + +#define CMD_RESET CMD(0) +#define CMD_STATUS CMD(1) +#define CMD_DATETIME CMD(2) +#define CMD_TIME CMD(3) +#define CMD_ALARM CMD(4) + +#define GPIO_PORT_DATA (*(vu16 *)0x80000C4) +#define GPIO_PORT_DIRECTION (*(vu16 *)0x80000C6) +#define GPIO_PORT_READ_ENABLE (*(vu16 *)0x80000C8) + +extern vu16 GPIOPortDirection; + +static u16 sDummy; // unused variable +static bool8 sLocked; + +static int WriteCommand(u8 value); +static int WriteData(u8 value); +static u8 ReadData(); +static void EnableGpioPortRead(); +static void DisableGpioPortRead(); + +static const char AgbLibRtcVersion[] = "SIIRTC_V001"; + +void SiiRtcUnprotect() +{ + EnableGpioPortRead(); + sLocked = FALSE; +} + +void SiiRtcProtect() +{ + DisableGpioPortRead(); + sLocked = TRUE; +} + +u8 SiiRtcProbe() +{ + u8 errorCode; + struct SiiRtcInfo rtc; + + if (!SiiRtcGetStatus(&rtc)) + return 0; + + errorCode = 0; + + if ((rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == SIIRTCINFO_POWER + || (rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == 0) + { + // The RTC is in 12-hour mode. Reset it and switch to 24-hour mode. + + // Note that the conditions are redundant and equivalent to simply + // "(rtc.status & SIIRTCINFO_24HOUR) == 0". It's possible that this + // was also intended to handle resetting the clock after power failure + // but a mistake was made. + + if (!SiiRtcReset()) + return 0; + + errorCode++; + } + + SiiRtcGetTime(&rtc); + + if (rtc.second & TEST_MODE) + { + // The RTC is in test mode. Reset it to leave test mode. + + if (!SiiRtcReset()) + return (errorCode << 4) & 0xF0; + + errorCode++; + } + + return (errorCode << 4) | 1; +} + +bool8 SiiRtcReset() +{ + u8 result; + struct SiiRtcInfo rtc; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_RESET | WR); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + rtc.status = SIIRTCINFO_24HOUR; + + result = SiiRtcSetStatus(&rtc); + + return result; +} + +bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc) +{ + u8 statusData; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_STATUS | RD); + + GPIO_PORT_DIRECTION = 5; + + statusData = ReadData(); + + rtc->status = (statusData & (STATUS_POWER | STATUS_24HOUR)) + | ((statusData & STATUS_INTAE) >> 3) + | ((statusData & STATUS_INTME) >> 2) + | ((statusData & STATUS_INTFE) >> 1); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc) +{ + u8 statusData; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + statusData = STATUS_24HOUR + | ((rtc->status & SIIRTCINFO_INTAE) << 3) + | ((rtc->status & SIIRTCINFO_INTME) << 2) + | ((rtc->status & SIIRTCINFO_INTFE) << 1); + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_STATUS | WR); + + WriteData(statusData); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc) +{ + u8 i; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_DATETIME | RD); + + GPIO_PORT_DIRECTION = 5; + + for (i = 0; i < DATETIME_BUF_LEN; i++) + DATETIME_BUF(rtc, i) = ReadData(); + + INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc) +{ + u8 i; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_DATETIME | WR); + + for (i = 0; i < DATETIME_BUF_LEN; i++) + WriteData(DATETIME_BUF(rtc, i)); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc) +{ + u8 i; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_TIME | RD); + + GPIO_PORT_DIRECTION = 5; + + for (i = 0; i < TIME_BUF_LEN; i++) + TIME_BUF(rtc, i) = ReadData(); + + INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc) +{ + u8 i; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_TIME | WR); + + for (i = 0; i < TIME_BUF_LEN; i++) + WriteData(TIME_BUF(rtc, i)); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc) +{ + u8 i; + u8 alarmData[2]; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + // Decode BCD. + alarmData[0] = (rtc->alarmHour & 0xF) + 10 * ((rtc->alarmHour >> 4) & 0xF); + + // The AM/PM flag must be set correctly even in 24-hour mode. + + if (alarmData[0] < 12) + alarmData[0] = rtc->alarmHour | ALARM_AM; + else + alarmData[0] = rtc->alarmHour | ALARM_PM; + + alarmData[1] = rtc->alarmMinute; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIOPortDirection = 7; // Why is this the only instance that uses a symbol? + + WriteCommand(CMD_ALARM | WR); + + for (i = 0; i < 2; i++) + WriteData(alarmData[i]); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +static int WriteCommand(u8 value) +{ + u8 i; + u8 temp; + + for (i = 0; i < 8; i++) + { + temp = ((value >> (7 - i)) & 1); + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 5; + } + + // control reaches end of non-void function +} + +static int WriteData(u8 value) +{ + u8 i; + u8 temp; + + for (i = 0; i < 8; i++) + { + temp = ((value >> i) & 1); + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 5; + } + + // control reaches end of non-void function +} + +static u8 ReadData() +{ + u8 i; + u8 temp; + u8 value; + + for (i = 0; i < 8; i++) + { + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 5; + + temp = ((GPIO_PORT_DATA & 2) >> 1); + value = (value >> 1) | (temp << 7); // UB: accessing uninitialized var + } + + return value; +} + +static void EnableGpioPortRead() +{ + GPIO_PORT_READ_ENABLE = 1; +} + +static void DisableGpioPortRead() +{ + GPIO_PORT_READ_ENABLE = 0; +} -- cgit v1.2.3 From c66988abb03682f4fe8c79227452501c16110cfe Mon Sep 17 00:00:00 2001 From: Doesnty Date: Fri, 18 Aug 2017 19:25:16 -0500 Subject: match atk19_faint_pokemon (camthesaxman) --- src/battle_4.c | 521 ++++++++++++--------------------------------------------- 1 file changed, 104 insertions(+), 417 deletions(-) (limited to 'src') diff --git a/src/battle_4.c b/src/battle_4.c index b5f774e6b..1b8f43fcd 100644 --- a/src/battle_4.c +++ b/src/battle_4.c @@ -215,6 +215,11 @@ extern u8 BattleScript_CastformChange[]; extern u8 gUnknown_081D9834[]; extern u8 gUnknown_081D90FC[]; //bs random switchout extern u8 gUnknown_081D95DB[]; //bs payday money give +extern u8 gUnknown_081D8C58[]; +extern u8 gUnknown_081D8C65[]; +extern u8 gUnknown_081D9156[]; +extern u8 gUnknown_081D9468[]; + //useful macros //read via orr @@ -4978,425 +4983,107 @@ static void atk18_status_effect_clear(void) BATTLE_STRUCT->unk16112 = 0; } -//Fuck this, Maybe later -__attribute__((naked)) static void atk19_faint_pokemon(void) { - asm(".syntax unified\n\ -push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - ldr r0, _0801F81C @ =gBattlescriptCurrInstr\n\ - ldr r2, [r0]\n\ - ldrb r1, [r2, 0x2]\n\ - adds r6, r0, 0\n\ - cmp r1, 0\n\ - beq _0801F834\n\ - ldrb r0, [r2, 0x1]\n\ - bl GetBattleBank\n\ - ldr r5, _0801F820 @ =gActiveBank\n\ - strb r0, [r5]\n\ - ldr r2, _0801F824 @ =gHitMarker\n\ - ldr r1, _0801F828 @ =gBitTable\n\ - ldrb r0, [r5]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801F7E6\n\ - b _0801FB1C\n\ -_0801F7E6:\n\ - ldr r1, [r6]\n\ - ldrb r4, [r1, 0x3]\n\ - ldrb r0, [r1, 0x4]\n\ - lsls r0, 8\n\ - orrs r4, r0\n\ - ldrb r0, [r1, 0x5]\n\ - lsls r0, 16\n\ - orrs r4, r0\n\ - ldrb r0, [r1, 0x6]\n\ - lsls r0, 24\n\ - orrs r4, r0\n\ - bl b_movescr_stack_pop_cursor\n\ - str r4, [r6]\n\ - ldrb r0, [r5]\n\ - bl GetBankSide\n\ - ldr r1, _0801F82C @ =gSideAffecting\n\ - lsls r0, 24\n\ - lsrs r0, 23\n\ - adds r0, r1\n\ - ldrh r2, [r0]\n\ - ldr r1, _0801F830 @ =0x0000fdff\n\ - ands r1, r2\n\ - strh r1, [r0]\n\ - b _0801FB22\n\ - .align 2, 0\n\ -_0801F81C: .4byte gBattlescriptCurrInstr\n\ -_0801F820: .4byte gActiveBank\n\ -_0801F824: .4byte gHitMarker\n\ -_0801F828: .4byte gBitTable\n\ -_0801F82C: .4byte gSideAffecting\n\ -_0801F830: .4byte 0x0000fdff\n\ -_0801F834:\n\ - ldrb r0, [r2, 0x1]\n\ - cmp r0, 0x1\n\ - bne _0801F85C\n\ - ldr r1, _0801F84C @ =gActiveBank\n\ - ldr r0, _0801F850 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldr r0, _0801F854 @ =gBankTarget\n\ - ldrb r7, [r0]\n\ - ldr r4, _0801F858 @ =gUnknown_081D8C58\n\ - b _0801F86A\n\ - .align 2, 0\n\ -_0801F84C: .4byte gActiveBank\n\ -_0801F850: .4byte gBankAttacker\n\ -_0801F854: .4byte gBankTarget\n\ -_0801F858: .4byte gUnknown_081D8C58\n\ -_0801F85C:\n\ - ldr r1, _0801F954 @ =gActiveBank\n\ - ldr r0, _0801F958 @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldr r0, _0801F95C @ =gBankAttacker\n\ - ldrb r7, [r0]\n\ - ldr r4, _0801F960 @ =gUnknown_081D8C65\n\ -_0801F86A:\n\ - ldr r0, _0801F964 @ =gAbsentBankFlags\n\ - ldrb r1, [r0]\n\ - ldr r0, _0801F968 @ =gBitTable\n\ - mov r12, r0\n\ - ldr r2, _0801F954 @ =gActiveBank\n\ - mov r8, r2\n\ - ldrb r2, [r2]\n\ - lsls r0, r2, 2\n\ - add r0, r12\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _0801F886\n\ - b _0801FB1C\n\ -_0801F886:\n\ - ldr r3, _0801F96C @ =gBattleMons\n\ - mov r10, r3\n\ - movs r5, 0x58\n\ - mov r9, r5\n\ - mov r0, r9\n\ - muls r0, r2\n\ - add r0, r10\n\ - ldrh r3, [r0, 0x28]\n\ - cmp r3, 0\n\ - beq _0801F89C\n\ - b _0801FB1C\n\ -_0801F89C:\n\ - ldr r2, _0801F970 @ =0x02000000\n\ - lsls r1, r7, 1\n\ - ldr r5, _0801F974 @ =0x000160ac\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - ldr r0, _0801F978 @ =0x000160ad\n\ - adds r1, r0\n\ - adds r1, r2\n\ - strb r3, [r1]\n\ - lsls r1, r7, 2\n\ - adds r5, 0x54\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - adds r5, 0x1\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - adds r5, 0x1\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - ldr r0, _0801F97C @ =0x00016103\n\ - adds r1, r0\n\ - adds r1, r2\n\ - strb r3, [r1]\n\ - ldr r5, _0801F980 @ =gHitMarker\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - lsls r0, 2\n\ - add r0, r12\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r5]\n\ - orrs r0, r1\n\ - str r0, [r5]\n\ - ldr r0, [r6]\n\ - adds r0, 0x7\n\ - bl b_movescr_stack_push\n\ - str r4, [r6]\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0801F9B0\n\ - ldr r0, [r5]\n\ - movs r1, 0x80\n\ - lsls r1, 15\n\ - orrs r0, r1\n\ - str r0, [r5]\n\ - ldr r1, _0801F984 @ =gBattleResults\n\ - ldrb r0, [r1]\n\ - cmp r0, 0xFE\n\ - bhi _0801F914\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ -_0801F914:\n\ - mov r0, r9\n\ - muls r0, r7\n\ - add r0, r10\n\ - adds r3, r0, 0\n\ - adds r3, 0x2A\n\ - mov r4, r8\n\ - ldrb r2, [r4]\n\ - mov r0, r9\n\ - muls r0, r2\n\ - add r0, r10\n\ - adds r1, r0, 0\n\ - adds r1, 0x2A\n\ - ldrb r0, [r3]\n\ - ldrb r5, [r1]\n\ - cmp r0, r5\n\ - bls _0801F9CC\n\ - ldrb r1, [r1]\n\ - subs r0, r1\n\ - cmp r0, 0x1D\n\ - ble _0801F990\n\ - ldr r1, _0801F988 @ =gBattlePartyID\n\ - lsls r0, r2, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _0801F98C @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x8\n\ - bl AdjustFriendship\n\ - b _0801F9CC\n\ - .align 2, 0\n\ -_0801F954: .4byte gActiveBank\n\ -_0801F958: .4byte gBankTarget\n\ -_0801F95C: .4byte gBankAttacker\n\ -_0801F960: .4byte gUnknown_081D8C65\n\ -_0801F964: .4byte gAbsentBankFlags\n\ -_0801F968: .4byte gBitTable\n\ -_0801F96C: .4byte gBattleMons\n\ -_0801F970: .4byte 0x02000000\n\ -_0801F974: .4byte 0x000160ac\n\ -_0801F978: .4byte 0x000160ad\n\ -_0801F97C: .4byte 0x00016103\n\ -_0801F980: .4byte gHitMarker\n\ -_0801F984: .4byte gBattleResults\n\ -_0801F988: .4byte gBattlePartyID\n\ -_0801F98C: .4byte gPlayerParty\n\ -_0801F990:\n\ - ldr r1, _0801F9A8 @ =gBattlePartyID\n\ - lsls r0, r2, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _0801F9AC @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x6\n\ - bl AdjustFriendship\n\ - b _0801F9CC\n\ - .align 2, 0\n\ -_0801F9A8: .4byte gBattlePartyID\n\ -_0801F9AC: .4byte gPlayerParty\n\ -_0801F9B0:\n\ - ldr r1, _0801FAE0 @ =gBattleResults\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0xFE\n\ - bhi _0801F9BC\n\ - adds r0, 0x1\n\ - strb r0, [r1, 0x1]\n\ -_0801F9BC:\n\ - ldr r2, _0801FAE4 @ =gActiveBank\n\ - ldrb r0, [r2]\n\ - mov r3, r9\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - add r0, r10\n\ - ldrh r0, [r0]\n\ - strh r0, [r1, 0x20]\n\ -_0801F9CC:\n\ - ldr r0, _0801FAE8 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801FA02\n\ - ldr r6, _0801FAEC @ =gBattleMons\n\ - ldr r0, _0801FAF0 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - movs r5, 0x58\n\ - muls r0, r5\n\ - adds r0, r6\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _0801FA02\n\ - ldr r4, _0801FAF4 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - bl b_movescr_stack_push\n\ - ldr r1, _0801FAF8 @ =gBattleMoveDamage\n\ - adds r0, r7, 0\n\ - muls r0, r5\n\ - adds r0, r6\n\ - ldrh r0, [r0, 0x28]\n\ - str r0, [r1]\n\ - ldr r0, _0801FAFC @ =gUnknown_081D9156\n\ - str r0, [r4]\n\ -_0801FA02:\n\ - ldr r1, _0801FB00 @ =gStatuses3\n\ - ldr r6, _0801FB04 @ =gBankTarget\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801FA1A\n\ - b _0801FB22\n\ -_0801FA1A:\n\ - ldr r0, _0801FAE8 @ =gHitMarker\n\ - ldr r5, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 17\n\ - ands r5, r0\n\ - cmp r5, 0\n\ - bne _0801FB22\n\ - ldr r4, _0801FAF0 @ =gBankAttacker\n\ - mov r8, r4\n\ - ldrb r0, [r4]\n\ - bl GetBankSide\n\ - adds r4, r0, 0\n\ - ldrb r0, [r6]\n\ - bl GetBankSide\n\ - lsls r4, 24\n\ - lsls r0, 24\n\ - cmp r4, r0\n\ - beq _0801FB22\n\ - ldr r0, _0801FAEC @ =gBattleMons\n\ - mov r9, r0\n\ - mov r1, r8\n\ - ldrb r2, [r1]\n\ - movs r7, 0x58\n\ - adds r3, r2, 0\n\ - muls r3, r7\n\ - adds r0, r3, r0\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _0801FB22\n\ - ldr r0, _0801FB08 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - cmp r0, 0xA5\n\ - beq _0801FB22\n\ - ldr r1, _0801FB0C @ =0x02000000\n\ - ldr r4, _0801FB10 @ =0x0001608c\n\ - adds r0, r2, r4\n\ - adds r0, r1\n\ - ldrb r4, [r0]\n\ - adds r0, r4, r3\n\ - mov r6, r9\n\ - adds r6, 0x24\n\ - adds r0, r6\n\ - strb r5, [r0]\n\ - ldr r5, _0801FAF4 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r5]\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801FB14 @ =gUnknown_081D9468\n\ - str r0, [r5]\n\ - ldr r5, _0801FAE4 @ =gActiveBank\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - strb r0, [r5]\n\ - adds r1, r4, 0\n\ - adds r1, 0x9\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - ldrb r0, [r5]\n\ - muls r0, r7\n\ - adds r0, r6\n\ - adds r0, r4\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r2, 0\n\ - movs r3, 0x1\n\ - bl EmitSetAttributes\n\ - ldrb r0, [r5]\n\ - bl MarkBufferBankForExecution\n\ - ldr r1, _0801FB18 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x2\n\ - strb r0, [r1, 0x1]\n\ - lsls r4, 1\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - muls r0, r7\n\ - adds r0, r4, r0\n\ - mov r2, r9\n\ - adds r2, 0xC\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - strb r0, [r1, 0x2]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - muls r0, r7\n\ - adds r4, r0\n\ - adds r4, r2\n\ - ldrh r0, [r4]\n\ - lsrs r0, 8\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - b _0801FB22\n\ - .align 2, 0\n\ -_0801FAE0: .4byte gBattleResults\n\ -_0801FAE4: .4byte gActiveBank\n\ -_0801FAE8: .4byte gHitMarker\n\ -_0801FAEC: .4byte gBattleMons\n\ -_0801FAF0: .4byte gBankAttacker\n\ -_0801FAF4: .4byte gBattlescriptCurrInstr\n\ -_0801FAF8: .4byte gBattleMoveDamage\n\ -_0801FAFC: .4byte gUnknown_081D9156\n\ -_0801FB00: .4byte gStatuses3\n\ -_0801FB04: .4byte gBankTarget\n\ -_0801FB08: .4byte gCurrentMove\n\ -_0801FB0C: .4byte 0x02000000\n\ -_0801FB10: .4byte 0x0001608c\n\ -_0801FB14: .4byte gUnknown_081D9468\n\ -_0801FB18: .4byte gBattleTextBuff1\n\ -_0801FB1C:\n\ - ldr r0, [r6]\n\ - adds r0, 0x7\n\ - str r0, [r6]\n\ -_0801FB22:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); + u8 *r4; + + if (gBattlescriptCurrInstr[2] != 0) + { + gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); + if (gHitMarker & HITMARKER_FAINTED(gActiveBank)) + { + r4 = BSScriptReadPtr(gBattlescriptCurrInstr + 3); + + b_movescr_stack_pop_cursor(); + gBattlescriptCurrInstr = r4; + gSideAffecting[GetBankSide(gActiveBank)] &= ~SIDE_STATUS_SPIKES_DAMAGED; + } + else + { + gBattlescriptCurrInstr += 7; + } + } + else + { + u8 bank; + + if (gBattlescriptCurrInstr[1] == 1) + { + gActiveBank = gBankAttacker; + bank = gBankTarget; + r4 = gUnknown_081D8C58; + } + else + { + gActiveBank = gBankTarget; + bank = gBankAttacker; + r4 = gUnknown_081D8C65; + } + if (!(gAbsentBankFlags & gBitTable[gActiveBank]) + && gBattleMons[gActiveBank].hp == 0) + { + ewram[0x160AC + bank * 2 + 0] = 0; + ewram[0x160AC + bank * 2 + 1] = 0; + ewram[0x16100 + bank * 4 + 0] = 0; + ewram[0x16100 + bank * 4 + 1] = 0; + ewram[0x16100 + bank * 4 + 2] = 0; + ewram[0x16100 + bank * 4 + 3] = 0; + + gHitMarker |= HITMARKER_FAINTED(gActiveBank); + b_movescr_stack_push(gBattlescriptCurrInstr + 7); + gBattlescriptCurrInstr = r4; + if (GetBankSide(gActiveBank) == 0) + { + gHitMarker |= HITMARKER_x400000; + if (gBattleResults.playerFaintCounter < 0xFF) + gBattleResults.playerFaintCounter++; + if (gBattleMons[bank].level > gBattleMons[gActiveBank].level) + { + if (gBattleMons[bank].level - gBattleMons[gActiveBank].level > 0x1D) + AdjustFriendship(&gPlayerParty[gBattlePartyID[gActiveBank]], 8); + else + AdjustFriendship(&gPlayerParty[gBattlePartyID[gActiveBank]], 6); + } + } + else + { + if (gBattleResults.opponentFaintCounter < 0xFF) + gBattleResults.opponentFaintCounter++; + gBattleResults.lastOpponentSpecies = gBattleMons[gActiveBank].species; + } + if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBankAttacker].hp != 0) + { + b_movescr_stack_push(gBattlescriptCurrInstr); + gBattleMoveDamage = gBattleMons[bank].hp; + gBattlescriptCurrInstr = gUnknown_081D9156; + } + if ((gStatuses3[gBankTarget] & STATUS3_GRUDGE) + && !(gHitMarker & HITMARKER_GRUDGE) + && GetBankSide(gBankAttacker) != GetBankSide(gBankTarget) + && gBattleMons[gBankAttacker].hp != 0 + && gCurrentMove != MOVE_STRUGGLE) + { + u8 moveIndex = ewram[0x1608C + gBankAttacker]; + + gBattleMons[gBankAttacker].pp[moveIndex] = 0; + b_movescr_stack_push(gBattlescriptCurrInstr); + gBattlescriptCurrInstr = gUnknown_081D9468; + gActiveBank = gBankAttacker; + EmitSetAttributes(0, moveIndex + 9, 0, 1, &gBattleMons[gActiveBank].pp[moveIndex]); + MarkBufferBankForExecution(gActiveBank); + + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = gBattleMons[gBankAttacker].moves[moveIndex]; + gBattleTextBuff1[3] = gBattleMons[gBankAttacker].moves[moveIndex] >> 8; + gBattleTextBuff1[4] = EOS; + } + } + else + { + gBattlescriptCurrInstr += 7; + } + } } static void atk1A_faint_animation(void) -- cgit v1.2.3 From 2175733e0f2fbbb678ae25afd204fdecfa30080b Mon Sep 17 00:00:00 2001 From: Doesnty Date: Fri, 18 Aug 2017 19:29:21 -0500 Subject: Also put some abominable lines back to how they were --- src/battle_4.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/battle_4.c b/src/battle_4.c index 1b8f43fcd..cf77fe81c 100644 --- a/src/battle_4.c +++ b/src/battle_4.c @@ -5454,12 +5454,13 @@ static void atk23_getexp(void) gBattleBufferB[BATTLE_STRUCT->expGetterBank][0] = 0; if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) != 100) { - ((u16*)ewram + 0xB8C0)[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); //doesnt match - ((u16*)ewram + 0xB8C0)[1] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); - ((u16*)ewram + 0xB8C0)[2] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); - ((u16*)ewram + 0xB8C0)[3] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); - ((u16*)ewram + 0xB8C0)[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); - ((u16*)ewram + 0xB8C0)[5] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF); + // Doesn't match. + BATTLE_STRUCT->beforeLvlUp[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); + BATTLE_STRUCT->beforeLvlUp[1] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); + BATTLE_STRUCT->beforeLvlUp[2] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); + BATTLE_STRUCT->beforeLvlUp[3] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); + BATTLE_STRUCT->beforeLvlUp[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); + BATTLE_STRUCT->beforeLvlUp[5] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF); gActiveBank = BATTLE_STRUCT->expGetterBank; EmitExpBarUpdate(0, BATTLE_STRUCT->expGetterID, gBattleMoveDamage); -- cgit v1.2.3 From 92a703333302194b1093788aa3725f1e22c77e52 Mon Sep 17 00:00:00 2001 From: Doesnty Date: Tue, 22 Aug 2017 11:54:28 -0500 Subject: Remove a goto from atk06_typecalc (camthesaxman) --- src/battle_4.c | 112 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 55 insertions(+), 57 deletions(-) (limited to 'src') diff --git a/src/battle_4.c b/src/battle_4.c index cf77fe81c..71c78a6b9 100644 --- a/src/battle_4.c +++ b/src/battle_4.c @@ -1464,73 +1464,71 @@ static void atk06_typecalc(void) { int i = 0; u8 move_type; - if (gCurrentMove == MOVE_STRUGGLE) {goto END;} - - if (BATTLE_STRUCT->dynamicMoveType) - move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; - else - move_type = gBattleMoves[gCurrentMove].type; - - //check stab - if (gBattleMons[gBankAttacker].type1 == move_type || gBattleMons[gBankAttacker].type2 == move_type) + if (gCurrentMove != MOVE_STRUGGLE) { - gBattleMoveDamage = gBattleMoveDamage * 15; - gBattleMoveDamage = gBattleMoveDamage / 10; - } + if (BATTLE_STRUCT->dynamicMoveType) + move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; + else + move_type = gBattleMoves[gCurrentMove].type; - if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; - gBattleCommunication[6] = move_type; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) + //check stab + if (gBattleMons[gBankAttacker].type1 == move_type || gBattleMons[gBankAttacker].type2 == move_type) { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } + gBattleMoveDamage = gBattleMoveDamage * 15; + gBattleMoveDamage = gBattleMoveDamage / 10; + } - else if (gTypeEffectiveness[i] == move_type) + if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) + { + gLastUsedAbility = gBattleMons[gBankTarget].ability; + gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); + gMoveHitWith[gBankTarget] = 0; + gUnknown_02024C44[gBankTarget] = 0; + gBattleCommunication[6] = move_type; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); + } + else + { + while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) { - //check type1 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) - ModulateDmgByType(gTypeEffectiveness[i + 2]); - //check type2 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && - gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2) - ModulateDmgByType(gTypeEffectiveness[i + 2]); + if (gTypeEffectiveness[i] == TYPE_FORESIGHT) + { + if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) + break; + i += 3; + continue; + } + + else if (gTypeEffectiveness[i] == move_type) + { + //check type1 + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) + ModulateDmgByType(gTypeEffectiveness[i + 2]); + //check type2 + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && + gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2) + ModulateDmgByType(gTypeEffectiveness[i + 2]); + } + i += 3; } - i += 3; } - } - if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 - && (!(gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) || ((gBattleMoveFlags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) - && gBattleMoves[gCurrentMove].power) - { - gLastUsedAbility = ABILITY_WONDER_GUARD; - gBattleMoveFlags |= MOVESTATUS_MISSED; - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; - gBattleCommunication[6] = 3; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); + if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 + && (!(gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) || ((gBattleMoveFlags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) + && gBattleMoves[gCurrentMove].power) + { + gLastUsedAbility = ABILITY_WONDER_GUARD; + gBattleMoveFlags |= MOVESTATUS_MISSED; + gMoveHitWith[gBankTarget] = 0; + gUnknown_02024C44[gBankTarget] = 0; + gBattleCommunication[6] = 3; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); + } + if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) + gProtectStructs[gBankAttacker].notEffective = 1; } - if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) - gProtectStructs[gBankAttacker].notEffective = 1; - - END: - gBattlescriptCurrInstr++; + gBattlescriptCurrInstr++; } - static void b_wonderguard_and_levitate(void) { u8 flags = 0; -- cgit v1.2.3 From 5487c755f054b464665849bbe5a31ab92ff34574 Mon Sep 17 00:00:00 2001 From: Doesnty Date: Tue, 22 Aug 2017 11:59:10 -0500 Subject: whitespace --- src/battle_4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/battle_4.c b/src/battle_4.c index 71c78a6b9..ecd7fc34b 100644 --- a/src/battle_4.c +++ b/src/battle_4.c @@ -5373,7 +5373,7 @@ static void atk23_getexp(void) if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP)) { - s16 stringID; + s16 stringID; if (BATTLE_STRUCT->sentInPokes & 1) gBattleMoveDamage = *exp; else -- cgit v1.2.3 From 4f36e317f9d2489e7c192f2a70c44a087e7d1998 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 23 Aug 2017 15:55:01 +0200 Subject: name labels --- src/battle_10.c | 10 +- src/battle_2.c | 8 +- src/battle_3.c | 2 +- src/battle_4.c | 10 +- src/battle_6.c | 10 +- src/battle_7.c | 42 ++++---- src/battle_8.c | 10 +- src/battle_811DA74.c | 10 +- src/battle_ai.c | 4 +- src/battle_anim.c | 162 +++++++++++++++--------------- src/battle_anim_807B69C.c | 14 +-- src/battle_anim_80A7E7C.c | 92 ++++++++--------- src/battle_anim_8137220.c | 4 +- src/battle_interface.c | 2 +- src/berry_blender.c | 6 +- src/birch_pc.c | 8 +- src/contest_painting.c | 4 +- src/credits.c | 4 +- src/decompress.c | 2 +- src/easy_chat.c | 2 +- src/egg_hatch.c | 12 +-- src/field_effect.c | 2 +- src/hall_of_fame.c | 2 +- src/intro.c | 2 +- src/item_menu.c | 2 +- src/mystery_event_script.c | 4 +- src/palette.c | 2 +- src/pokeblock.c | 2 +- src/pokedex.c | 99 +++++++++--------- src/pokemon_3.c | 24 ++--- src/rom_8077ABC.c | 204 +++++++++++++++++++------------------- src/script_pokemon_util_80C4BF0.c | 6 +- src/shop.c | 2 +- src/slot_machine.c | 2 +- src/tv.c | 4 +- src/unused_8124F94.c | 6 +- 36 files changed, 390 insertions(+), 391 deletions(-) (limited to 'src') diff --git a/src/battle_10.c b/src/battle_10.c index 0237bab4b..81991f976 100644 --- a/src/battle_10.c +++ b/src/battle_10.c @@ -66,7 +66,7 @@ extern void sub_8031A6C(u16, u8); extern void sub_80313A0(struct Sprite *); extern void sub_803757C(void); extern void oamt_add_pos2_onto_pos1(); -extern void oamt_set_x3A_32(); +extern void StoreSpriteCallbackInData6(); extern void sub_8078B34(struct Sprite *); extern void sub_80375B4(void); extern void sub_8010384(struct Sprite *); @@ -94,7 +94,7 @@ extern void nullsub_47(void); extern bool8 IsDoubleBattle(void); extern void sub_8037840(void); extern void sub_8031B74(); -extern u8 sub_8078874(); +extern u8 AnimBankSpriteExists(); extern u8 move_anim_start_t3(); extern void sub_8037FD8(void); extern void sub_8037F34(void); @@ -826,7 +826,7 @@ void sub_80398B0(void) gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_80375B4; } @@ -1177,7 +1177,7 @@ void sub_803A1B8(void) gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_803A3A8); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], sub_803A3A8); taskId = CreateTask(sub_803A2C4, 5); gTasks[taskId].data[0] = gActiveBank; if (ewram17810[gActiveBank].unk0_0) @@ -1274,7 +1274,7 @@ void sub_803A56C(void) void sub_803A578(void) { - if (sub_8078874(gActiveBank) != 0) + if (AnimBankSpriteExists(gActiveBank) != 0) { gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; sub_8031F88(gActiveBank); diff --git a/src/battle_2.c b/src/battle_2.c index 7772444d7..a7668302b 100644 --- a/src/battle_2.c +++ b/src/battle_2.c @@ -1923,14 +1923,14 @@ void sub_8011384(void) } if (GetBankSide(gActiveBank) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); } else { if (GetBankSide(gActiveBank) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); dp01_build_cmdbuf_x04_4_4_4(0); MarkBufferBankForExecution(gActiveBank); } @@ -2085,7 +2085,7 @@ void bc_801362C(void) { if (GetBankSide(gActiveBank) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); } gBattleMainFunc = sub_8011970; } @@ -2167,7 +2167,7 @@ void BattleBeginFirstTurn(void) { for (j = i + 1; j < gNoOfAllBanks; j++) { - if (b_first_side(gTurnOrder[i], gTurnOrder[j], 1) != 0) + if (GetWhoStrikesFirst(gTurnOrder[i], gTurnOrder[j], 1) != 0) sub_8012FBC(i, j); } } diff --git a/src/battle_3.c b/src/battle_3.c index 9bb9e333f..12a91810e 100644 --- a/src/battle_3.c +++ b/src/battle_3.c @@ -378,7 +378,7 @@ u8 UpdateTurnCounters(void) s32 j; for (j = i + 1; j < gNoOfAllBanks; j++) { - if (b_first_side(gTurnOrder[i], gTurnOrder[j], 0)) + if (GetWhoStrikesFirst(gTurnOrder[i], gTurnOrder[j], 0)) sub_8012FBC(i, j); } } diff --git a/src/battle_4.c b/src/battle_4.c index 6dd5d7df6..7464f0535 100644 --- a/src/battle_4.c +++ b/src/battle_4.c @@ -122,7 +122,7 @@ bool8 IsTradedMon(struct Pokemon*); void b_movescr_stack_pop_cursor(void); void SwitchInClearStructs(void); u8* ConvertIntToDecimalStringN(u8*, s32, u8, u8); -u8 GetNationalPokedexFlag(u16 nationalNum, u8 caseID); +u8 GetSetPokedexFlag(u16 nationalNum, u8 caseID); u16 SpeciesToNationalPokedexNum(u16 species); u8 sub_803FC34(u8 bank); u16 sub_803FBFC(u8 a); @@ -10122,7 +10122,7 @@ static void atk4E_switchin_anim(void) gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); if (GetBankSide(gActiveBank) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER))) { - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); } gAbsentBankFlags &= ~(gBitTable[gActiveBank]); EmitSwitchInAnim(0, gBattlePartyID[gActiveBank], BSScriptRead8(gBattlescriptCurrInstr + 2)); @@ -17834,7 +17834,7 @@ void atkEF_pokeball_catch_calculation(void) ball_multiplier = 10; break; case ITEM_REPEAT_BALL: - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) ball_multiplier = 30; else ball_multiplier = 10; @@ -17920,11 +17920,11 @@ static void atkF0_copy_caught_poke(void) static void atkF1_setpoke_as_caught(void) { - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); else { - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 3); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 3); if (gBattleMons[gBankTarget].species == SPECIES_UNOWN) gSaveBlock2.pokedex.unownPersonality = gBattleMons[gBankTarget].personality; if (gBattleMons[gBankTarget].species == SPECIES_SPINDA) //else if diff --git a/src/battle_6.c b/src/battle_6.c index c833aef5e..66b08f82e 100644 --- a/src/battle_6.c +++ b/src/battle_6.c @@ -97,12 +97,12 @@ extern u8 GetBankSide(u8); extern void sub_80E43C0(); extern void oamt_add_pos2_onto_pos1(); extern void sub_8078B34(struct Sprite *); -extern void oamt_set_x3A_32(); +extern void StoreSpriteCallbackInData6(); extern void sub_80318FC(); extern bool8 IsDoubleBattle(void); extern void sub_802D500(void); extern void dp11b_obj_free(); -extern bool8 sub_8078874(u8); +extern bool8 AnimBankSpriteExists(u8); extern bool8 move_anim_start_t3(); extern void sub_802E460(void); extern void b_link_standby_message(void); @@ -866,7 +866,7 @@ void PlayerHandleTrainerSlideBack(void) gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); gBattleBankFunc[gActiveBank] = sub_802D274; } @@ -1337,7 +1337,7 @@ void PlayerHandleTrainerBallThrow(void) gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2.playerGender].data, 0x100 + paletteNum * 16, 32); @@ -1435,7 +1435,7 @@ void sub_80310F0(void) void PlayerHandleSpriteInvisibility(void) { - if (sub_8078874(gActiveBank)) + if (AnimBankSpriteExists(gActiveBank)) { gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; sub_8031F88(gActiveBank); diff --git a/src/battle_7.c b/src/battle_7.c index f2838467e..f81025409 100644 --- a/src/battle_7.c +++ b/src/battle_7.c @@ -49,8 +49,8 @@ extern struct MusicPlayerInfo gMPlay_BGM; extern u32 gBitTable[]; extern u16 gBattleTypeFlags; extern u8 gBattleMonForms[]; -extern u8 gBattleAnimPlayerMonIndex; -extern u8 gBattleAnimEnemyMonIndex; +extern u8 gBattleAnimBankAttacker; +extern u8 gBattleAnimBankTarget; extern void (*gAnimScriptCallback)(void); extern u8 gAnimScriptActive; extern const u8 *const gBattleAnims_Unknown1[]; @@ -80,7 +80,7 @@ extern void sub_80440EC(); extern void sub_804777C(); extern void sub_8141828(); extern u8 sub_8077ABC(); -extern u8 sub_8078874(u8); +extern u8 AnimBankSpriteExists(u8); extern u8 sub_8077F68(u8); extern u8 sub_8077F7C(u8); extern void sub_8094958(void); @@ -190,8 +190,8 @@ bool8 move_anim_start_t3(u8 a, u8 b, u8 c, u8 d, u16 e) sub_80324E0(a); return TRUE; } - gBattleAnimPlayerMonIndex = b; - gBattleAnimEnemyMonIndex = c; + gBattleAnimBankAttacker = b; + gBattleAnimBankTarget = c; ewram17840.unk0 = e; DoMoveAnim(gBattleAnims_Unknown1, d, 0); taskId = CreateTask(sub_80315E8, 10); @@ -230,8 +230,8 @@ void move_anim_start_t4(u8 a, u8 b, u8 c, u8 d) { u8 taskId; - gBattleAnimPlayerMonIndex = b; - gBattleAnimEnemyMonIndex = c; + gBattleAnimBankAttacker = b; + gBattleAnimBankTarget = c; DoMoveAnim(gBattleAnims_Unknown2, d, 0); taskId = CreateTask(sub_80316CC, 10); gTasks[taskId].data[0] = a; @@ -306,16 +306,16 @@ void sub_8031794(struct Pokemon *pkmn, u8 b) r7); paletteOffset = 0x100 + b * 16; if (ewram17800[b].unk2 == 0) - lzPaletteData = pokemon_get_pal(pkmn); + lzPaletteData = GetMonSpritePal(pkmn); else - lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue); - sub_800D238(lzPaletteData, ewram); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue); + LZDecompressWram(lzPaletteData, ewram); LoadPalette(ewram, paletteOffset, 0x20); LoadPalette(ewram, 0x80 + b * 16, 0x20); if (species == SPECIES_CASTFORM) { paletteOffset = 0x100 + b * 16; - sub_800D238(lzPaletteData, ewram + 0x16400); + LZDecompressWram(lzPaletteData, ewram + 0x16400); LoadPalette(ewram + 0x16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20); } if (ewram17800[b].unk2 != 0) @@ -358,16 +358,16 @@ void sub_80318FC(struct Pokemon *pkmn, u8 b) r7); paletteOffset = 0x100 + b * 16; if (ewram17800[b].unk2 == 0) - lzPaletteData = pokemon_get_pal(pkmn); + lzPaletteData = GetMonSpritePal(pkmn); else - lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue); - sub_800D238(lzPaletteData, ewram); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue); + LZDecompressWram(lzPaletteData, ewram); LoadPalette(ewram, paletteOffset, 0x20); LoadPalette(ewram, 0x80 + b * 16, 0x20); if (species == SPECIES_CASTFORM) { paletteOffset = 0x100 + b * 16; - sub_800D238(lzPaletteData, ewram + 0x16400); + LZDecompressWram(lzPaletteData, ewram + 0x16400); LoadPalette(ewram + 0x16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20); } if (ewram17800[b].unk2 != 0) @@ -511,7 +511,7 @@ bool8 sub_8031C30(u8 a) void load_gfxc_health_bar(void) { - sub_800D238(gUnknown_08D09C48, (void *)0x02000000); + LZDecompressWram(gUnknown_08D09C48, (void *)0x02000000); } u8 battle_load_something(u8 *pState, u8 *b) @@ -695,14 +695,14 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) dst = (void *)(VRAM + 0x10000 + gSprites[gObjectBankIDs[a]].oam.tileNum * 32); DmaCopy32(3, src, dst, 0x800); paletteOffset = 0x100 + a * 16; - lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue); - sub_800D238(lzPaletteData, ewram); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue); + LZDecompressWram(lzPaletteData, ewram); LoadPalette(ewram, paletteOffset, 32); if (species == SPECIES_CASTFORM) { u16 *paletteSrc = (u16 *)(ewram + 0x16400); - sub_800D238(lzPaletteData, paletteSrc); + LZDecompressWram(lzPaletteData, paletteSrc); LoadPalette(paletteSrc + gBattleMonForms[b] * 16, paletteOffset, 32); } BlendPalette(paletteOffset, 16, 6, 0x7FFF); @@ -851,7 +851,7 @@ void sub_80326EC(u8 a) for (i = 0; i < gNoOfAllBanks; i++) { - if (sub_8078874(i) != 0) + if (AnimBankSpriteExists(i) != 0) { gSprites[gObjectBankIDs[i]].oam.affineMode = a; if (a == 0) @@ -889,7 +889,7 @@ void sub_80328A4(struct Sprite *sprite) u8 r4 = sprite->data0; struct Sprite *r7 = &gSprites[gObjectBankIDs[r4]]; - if (!r7->inUse || sub_8078874(r4) == 0) + if (!r7->inUse || AnimBankSpriteExists(r4) == 0) { sprite->callback = sub_8032978; return; diff --git a/src/battle_8.c b/src/battle_8.c index 75f10c4b1..d9a61c3d7 100644 --- a/src/battle_8.c +++ b/src/battle_8.c @@ -76,7 +76,7 @@ extern void sub_8032B84(void); extern void sub_8078B34(struct Sprite *); extern void sub_8032BBC(void); extern void oamt_add_pos2_onto_pos1(); -extern void oamt_set_x3A_32(); +extern void StoreSpriteCallbackInData6(); extern void sub_803311C(void); extern void sub_8010384(struct Sprite *); extern bool8 mplay_80342A4(u8); @@ -104,7 +104,7 @@ extern void nullsub_45(void); extern void sub_8031B74(); extern bool8 IsDoubleBattle(void); extern void sub_8032E2C(void); -extern u8 sub_8078874(); +extern u8 AnimBankSpriteExists(); extern u8 move_anim_start_t3(); extern void sub_80334C0(void); extern void OpponentBufferExecCompleted(void); @@ -868,7 +868,7 @@ void OpponentHandleTrainerSlideBack(void) gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_8032BBC; } @@ -1497,7 +1497,7 @@ void sub_8035B04(void) gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8035C10); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], sub_8035C10); taskId = CreateTask(sub_8035C44, 5); gTasks[taskId].data[0] = gActiveBank; if (ewram17810[gActiveBank].unk0_0) @@ -1594,7 +1594,7 @@ void sub_8035EB8(void) void OpponentHandleSpriteInvisibility(void) { - if (sub_8078874(gActiveBank) != 0) + if (AnimBankSpriteExists(gActiveBank) != 0) { gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; sub_8031F88(gActiveBank); diff --git a/src/battle_811DA74.c b/src/battle_811DA74.c index 36a287efc..dc3a76eec 100644 --- a/src/battle_811DA74.c +++ b/src/battle_811DA74.c @@ -67,7 +67,7 @@ extern void (*gAnimScriptCallback)(void); extern void (*const gLinkPartnerBufferCommands[])(void); extern u8 move_anim_start_t3(); -extern u8 sub_8078874(); +extern u8 AnimBankSpriteExists(); extern void sub_8044CA0(u8); extern void sub_8030E38(struct Sprite *); extern void sub_80E43C0(); @@ -83,7 +83,7 @@ extern void sub_80324BC(); extern u8 sub_8031720(); extern u8 mplay_80342A4(); extern void oamt_add_pos2_onto_pos1(); -extern void oamt_set_x3A_32(); +extern void StoreSpriteCallbackInData6(); extern void sub_8078B34(struct Sprite *); extern void sub_80105EC(struct Sprite *); extern s32 sub_803FC34(u16); @@ -1117,7 +1117,7 @@ void sub_811FC3C(void) gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_811DB1C; } @@ -1470,7 +1470,7 @@ void sub_8120588(void) gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); r4 = AllocSpritePalette(0xD6F9); LoadCompressedPalette( @@ -1560,7 +1560,7 @@ void sub_812096C(void) void sub_8120978(void) { - if (sub_8078874(gActiveBank) != 0) + if (AnimBankSpriteExists(gActiveBank) != 0) { gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; sub_8031F88(gActiveBank); diff --git a/src/battle_ai.c b/src/battle_ai.c index 0e20c6b05..1869bbe36 100644 --- a/src/battle_ai.c +++ b/src/battle_ai.c @@ -1273,7 +1273,7 @@ static void BattleAICmd_if_arg_not_equal(void) static void BattleAICmd_if_would_go_first(void) { - if (b_first_side(gBankAttacker, gBankTarget, 1) == gAIScriptPtr[1]) + if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, 1) == gAIScriptPtr[1]) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); else gAIScriptPtr += 6; @@ -1281,7 +1281,7 @@ static void BattleAICmd_if_would_go_first(void) static void BattleAICmd_if_would_not_go_first(void) { - if (b_first_side(gBankAttacker, gBankTarget, 1) != gAIScriptPtr[1]) + if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, 1) != gAIScriptPtr[1]) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); else gAIScriptPtr += 6; diff --git a/src/battle_anim.c b/src/battle_anim.c index 6bd98099a..111d72813 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -37,8 +37,8 @@ EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0}; EWRAM_DATA u8 gUnknown_0202F7C4 = 0; EWRAM_DATA u8 gUnknown_0202F7C5 = 0; EWRAM_DATA u16 gAnimMoveIndex = 0; // set but unused. -EWRAM_DATA u8 gBattleAnimPlayerMonIndex = 0; -EWRAM_DATA u8 gBattleAnimEnemyMonIndex = 0; +EWRAM_DATA u8 gBattleAnimBankAttacker = 0; +EWRAM_DATA u8 gBattleAnimBankTarget = 0; EWRAM_DATA u16 gUnknown_0202F7CA[4] = {0}; EWRAM_DATA u8 gUnknown_0202F7D2 = 0; extern u16 gUnknown_030041B4; @@ -201,15 +201,15 @@ void battle_anim_clear_some_data(void) gUnknown_0202F7C4 = 0; gUnknown_0202F7C5 = 0; gAnimMoveIndex = 0; - gBattleAnimPlayerMonIndex = 0; - gBattleAnimEnemyMonIndex = 0; + gBattleAnimBankAttacker = 0; + gBattleAnimBankTarget = 0; gUnknown_0202F7D2 = 0; } void ExecuteMoveAnim(u16 move) { - gBattleAnimPlayerMonIndex = gBankAttacker; - gBattleAnimEnemyMonIndex = gBankTarget; + gBattleAnimBankAttacker = gBankAttacker; + gBattleAnimBankTarget = gBankTarget; DoMoveAnim(gBattleAnims_Moves, move, 1); } @@ -396,7 +396,7 @@ static void ScriptCmd_sprite(void) r4 -= 0x40; else r4 = -r4; - _r0 = sub_8079E90(gBattleAnimEnemyMonIndex); + _r0 = sub_8079E90(gBattleAnimBankTarget); r1 = r4; } @@ -407,15 +407,15 @@ static void ScriptCmd_sprite(void) r4 -= 0x40; else r4 = -r4; - _r0 = sub_8079E90(gBattleAnimPlayerMonIndex); + _r0 = sub_8079E90(gBattleAnimBankAttacker); r1 = r4; } r6 = _r0 + r1; if ((s16)r6 < 3) r6 = 3; - r4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2); - r2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3); + r4 = sub_8077ABC(gBattleAnimBankTarget, 2); + r2 = sub_8077ABC(gBattleAnimBankTarget, 3); CreateSpriteAndAnimate(r7, r4, r2, r6); gAnimVisualTaskCount++; } @@ -485,10 +485,10 @@ _08075B34:\n\ _08075B36:\n\ lsls r0, 24\n\ lsrs r4, r0, 24\n\ - ldr r0, _08075B40 @ =gBattleAnimEnemyMonIndex\n\ + ldr r0, _08075B40 @ =gBattleAnimBankTarget\n\ b _08075B56\n\ .align 2, 0\n\ -_08075B40: .4byte gBattleAnimEnemyMonIndex\n\ +_08075B40: .4byte gBattleAnimBankTarget\n\ _08075B44:\n\ cmp r4, 0x3F\n\ bls _08075B4E\n\ @@ -500,7 +500,7 @@ _08075B4E:\n\ _08075B50:\n\ lsls r0, 24\n\ lsrs r4, r0, 24\n\ - ldr r0, _08075BAC @ =gBattleAnimPlayerMonIndex\n\ + ldr r0, _08075BAC @ =gBattleAnimBankAttacker\n\ _08075B56:\n\ ldrb r0, [r0]\n\ bl sub_8079E90\n\ @@ -517,7 +517,7 @@ _08075B56:\n\ bgt _08075B74\n\ movs r6, 0x3\n\ _08075B74:\n\ - ldr r5, _08075BB0 @ =gBattleAnimEnemyMonIndex\n\ + ldr r5, _08075BB0 @ =gBattleAnimBankTarget\n\ ldrb r0, [r5]\n\ movs r1, 0x2\n\ bl sub_8077ABC\n\ @@ -543,8 +543,8 @@ _08075B74:\n\ pop {r0}\n\ bx r0\n\ .align 2, 0\n\ -_08075BAC: .4byte gBattleAnimPlayerMonIndex\n\ -_08075BB0: .4byte gBattleAnimEnemyMonIndex\n\ +_08075BAC: .4byte gBattleAnimBankAttacker\n\ +_08075BB0: .4byte gBattleAnimBankTarget\n\ _08075BB4: .4byte gAnimVisualTaskCount\n\ .syntax divided\n"); } @@ -686,10 +686,10 @@ static void ScriptCmd_monbg(void) else if (r6 == 1) r6 = 3; if (r6 == 0 || r6 == 2) - r5 = gBattleAnimPlayerMonIndex; + r5 = gBattleAnimBankAttacker; else - r5 = gBattleAnimEnemyMonIndex; - if (b_side_obj__get_some_boolean(r5)) + r5 = gBattleAnimBankTarget; + if (IsAnimBankSpriteVisible(r5)) { r0 = GetBankIdentity(r5); r0 += 0xFF; @@ -719,7 +719,7 @@ static void ScriptCmd_monbg(void) } r5 ^= 2; - if (r6 > 1 && b_side_obj__get_some_boolean(r5)) + if (r6 > 1 && IsAnimBankSpriteVisible(r5)) { r0 = GetBankIdentity(r5); r0 += 0xFF; @@ -751,20 +751,20 @@ static void ScriptCmd_monbg(void) } #ifdef NONMATCHING -bool8 b_side_obj__get_some_boolean(u8 a) +bool8 IsAnimBankSpriteVisible(u8 a) { - if (IsContest() != 0) + if (IsContest()) { - if (a == gBattleAnimPlayerMonIndex) + if (a == gBattleAnimBankAttacker) return TRUE; else return FALSE; } - if (sub_8078874(a) == 0) + if (!AnimBankSpriteExists(a)) return FALSE; - if (IsContest() != 0) + if (IsContest()) return TRUE; // this line wont ever be reached. - if ((EWRAM_17800[a].unk0 & 1) == 0) + if (!(EWRAM_17800[a].unk0 & 1)) return TRUE; if (gSprites[gObjectBankIDs[a]].invisible) return FALSE; @@ -772,7 +772,7 @@ bool8 b_side_obj__get_some_boolean(u8 a) } #else __attribute__((naked)) -bool8 b_side_obj__get_some_boolean(u8 a) +bool8 IsAnimBankSpriteVisible(u8 a) { asm(".syntax unified\n\ push {r4,r5,lr}\n\ @@ -783,16 +783,16 @@ bool8 b_side_obj__get_some_boolean(u8 a) lsls r0, 24\n\ cmp r0, 0\n\ beq _08075FDC\n\ - ldr r0, _08075FD8 @ =gBattleAnimPlayerMonIndex\n\ + ldr r0, _08075FD8 @ =gBattleAnimBankAttacker\n\ ldrb r0, [r0]\n\ cmp r4, r0\n\ beq _0807601C\n\ b _0807602C\n\ .align 2, 0\n\ -_08075FD8: .4byte gBattleAnimPlayerMonIndex\n\ +_08075FD8: .4byte gBattleAnimBankAttacker\n\ _08075FDC:\n\ adds r0, r4, 0\n\ - bl sub_8078874\n\ + bl AnimBankSpriteExists\n\ lsls r0, 24\n\ cmp r0, 0\n\ beq _0807602C\n\ @@ -1096,9 +1096,9 @@ static void ScriptCmd_clearmonbg(void) else if (r4 == 1) r4 = 3; if (r4 == 0 || r4 == 2) - r5 = gBattleAnimPlayerMonIndex; + r5 = gBattleAnimBankAttacker; else - r5 = gBattleAnimEnemyMonIndex; + r5 = gBattleAnimBankTarget; if (gMonAnimTaskIdArray[0] != 0xFF) gSprites[gObjectBankIDs[r5]].invisible = FALSE; if (r4 > 1 && gMonAnimTaskIdArray[1] != 0xFF) @@ -1155,10 +1155,10 @@ static void ScriptCmd_monbg_22(void) else if (r5 == 1) r5 = 3; if (r5 == 0 || r5 == 2) - r4 = gBattleAnimPlayerMonIndex; + r4 = gBattleAnimBankAttacker; else - r4 = gBattleAnimEnemyMonIndex; - if (b_side_obj__get_some_boolean(r4)) + r4 = gBattleAnimBankTarget; + if (IsAnimBankSpriteVisible(r4)) { r0 = GetBankIdentity(r4); r0 += 0xFF; @@ -1170,7 +1170,7 @@ static void ScriptCmd_monbg_22(void) gSprites[gObjectBankIDs[r4]].invisible = FALSE; } r4 ^= 2; - if (r5 > 1 && b_side_obj__get_some_boolean(r4)) + if (r5 > 1 && IsAnimBankSpriteVisible(r4)) { r0 = GetBankIdentity(r4); r0 += 0xFF; @@ -1197,12 +1197,12 @@ static void ScriptCmd_clearmonbg_23(void) else if (r5 == 1) r5 = 3; if (r5 == 0 || r5 == 2) - r6 = gBattleAnimPlayerMonIndex; + r6 = gBattleAnimBankAttacker; else - r6 = gBattleAnimEnemyMonIndex; - if (b_side_obj__get_some_boolean(r6)) + r6 = gBattleAnimBankTarget; + if (IsAnimBankSpriteVisible(r6)) gSprites[gObjectBankIDs[r6]].invisible = FALSE; - if (r5 > 1 && b_side_obj__get_some_boolean(r6 ^ 2)) + if (r5 > 1 && IsAnimBankSpriteVisible(r6 ^ 2)) gSprites[gObjectBankIDs[r6 ^ 2]].invisible = FALSE; else r5 = 0; @@ -1228,9 +1228,9 @@ static void sub_80769A4(u8 taskId) r5 = 0; else r5 = 1; - if (b_side_obj__get_some_boolean(r4)) + if (IsAnimBankSpriteVisible(r4)) sub_8076464(r5); - if (gTasks[taskId].data[0] > 1 && b_side_obj__get_some_boolean(r4 ^ 2)) + if (gTasks[taskId].data[0] > 1 && IsAnimBankSpriteVisible(r4 ^ 2)) sub_8076464(r5 ^ 1); DestroyTask(taskId); } @@ -1371,7 +1371,7 @@ static void ScriptCmd_fadetobg_25(void) taskId = CreateTask(task_p5_load_battle_screen_elements, 5); if (IsContest() != 0) gTasks[taskId].data[0] = r6; - else if (GetBankSide(gBattleAnimEnemyMonIndex) == 0) + else if (GetBankSide(gBattleAnimBankTarget) == 0) gTasks[taskId].data[0] = r7; else gTasks[taskId].data[0] = r8; @@ -1422,7 +1422,7 @@ static void sub_8076DB8(u16 a) void *dmaSrc; void *dmaDest; - sub_800D238(tilemap, IsContest() ? EWRAM_14800 : EWRAM_18000); + LZDecompressWram(tilemap, IsContest() ? EWRAM_14800 : EWRAM_18000); sub_80763FC(sub_80789BC(), IsContest() ? EWRAM_14800 : EWRAM_18000, 0x100, 0); dmaSrc = IsContest() ? EWRAM_14800 : EWRAM_18000; dmaDest = (void *)(VRAM + 0xD000); @@ -1493,16 +1493,16 @@ static void ScriptCmd_changebg(void) /* s8 sub_8076F98(s8 a) { - if (!IsContest() && (EWRAM_17810[gBattleAnimPlayerMonIndex].unk0 & 0x10)) + if (!IsContest() && (EWRAM_17810[gBattleAnimBankAttacker].unk0 & 0x10)) { - a = GetBankSide(gBattleAnimPlayerMonIndex) ? 0xC0 : 0x3F; + a = GetBankSide(gBattleAnimBankAttacker) ? 0xC0 : 0x3F; } //_08076FDC else { if (IsContest()) { - if (gBattleAnimPlayerMonIndex == gBattleAnimEnemyMonIndex && gBattleAnimPlayerMonIndex == 2 + if (gBattleAnimBankAttacker == gBattleAnimBankTarget && gBattleAnimBankAttacker == 2 && a == 0x3F) { //jump to _0807707A @@ -1514,9 +1514,9 @@ s8 sub_8076F98(s8 a) //_08077004 else { - if (GetBankSide(gBattleAnimPlayerMonIndex) == 0) + if (GetBankSide(gBattleAnimBankAttacker) == 0) { - if (GetBankSide(gBattleAnimEnemyMonIndex) == 0) + if (GetBankSide(gBattleAnimBankTarget) == 0) } //_08077042 else @@ -1540,7 +1540,7 @@ s8 sub_8076F98(s8 a) lsls r0, 24\n\ cmp r0, 0\n\ bne _08076FDC\n\ - ldr r0, _08076FD4 @ =gBattleAnimPlayerMonIndex\n\ + ldr r0, _08076FD4 @ =gBattleAnimBankAttacker\n\ ldrb r2, [r0]\n\ lsls r0, r2, 1\n\ adds r0, r2\n\ @@ -1561,15 +1561,15 @@ s8 sub_8076F98(s8 a) movs r4, 0x3F\n\ b _0807706E\n\ .align 2, 0\n\ -_08076FD4: .4byte gBattleAnimPlayerMonIndex\n\ +_08076FD4: .4byte gBattleAnimBankAttacker\n\ _08076FD8: .4byte 0x02017810\n\ _08076FDC:\n\ bl IsContest\n\ lsls r0, 24\n\ cmp r0, 0\n\ beq _08077004\n\ - ldr r0, _08076FFC @ =gBattleAnimPlayerMonIndex\n\ - ldr r1, _08077000 @ =gBattleAnimEnemyMonIndex\n\ + ldr r0, _08076FFC @ =gBattleAnimBankAttacker\n\ + ldr r1, _08077000 @ =gBattleAnimBankTarget\n\ ldrb r0, [r0]\n\ ldrb r1, [r1]\n\ cmp r0, r1\n\ @@ -1580,16 +1580,16 @@ _08076FDC:\n\ beq _0807707A\n\ b _08077068\n\ .align 2, 0\n\ -_08076FFC: .4byte gBattleAnimPlayerMonIndex\n\ -_08077000: .4byte gBattleAnimEnemyMonIndex\n\ +_08076FFC: .4byte gBattleAnimBankAttacker\n\ +_08077000: .4byte gBattleAnimBankTarget\n\ _08077004:\n\ - ldr r0, _0807702C @ =gBattleAnimPlayerMonIndex\n\ + ldr r0, _0807702C @ =gBattleAnimBankAttacker\n\ ldrb r0, [r0]\n\ bl GetBankSide\n\ lsls r0, 24\n\ cmp r0, 0\n\ bne _08077042\n\ - ldr r0, _08077030 @ =gBattleAnimEnemyMonIndex\n\ + ldr r0, _08077030 @ =gBattleAnimBankTarget\n\ ldrb r0, [r0]\n\ bl GetBankSide\n\ lsls r0, 24\n\ @@ -1602,8 +1602,8 @@ _08077004:\n\ movs r4, 0xC0\n\ b _0807706E\n\ .align 2, 0\n\ -_0807702C: .4byte gBattleAnimPlayerMonIndex\n\ -_08077030: .4byte gBattleAnimEnemyMonIndex\n\ +_0807702C: .4byte gBattleAnimBankAttacker\n\ +_08077030: .4byte gBattleAnimBankTarget\n\ _08077034:\n\ movs r0, 0x40\n\ negs r0, r0\n\ @@ -1613,7 +1613,7 @@ _08077034:\n\ lsls r0, 24\n\ b _0807706C\n\ _08077042:\n\ - ldr r0, _08077064 @ =gBattleAnimEnemyMonIndex\n\ + ldr r0, _08077064 @ =gBattleAnimBankTarget\n\ ldrb r0, [r0]\n\ bl GetBankSide\n\ lsls r0, 24\n\ @@ -1629,7 +1629,7 @@ _08077042:\n\ movs r4, 0x3F\n\ b _0807706E\n\ .align 2, 0\n\ -_08077064: .4byte gBattleAnimEnemyMonIndex\n\ +_08077064: .4byte gBattleAnimBankTarget\n\ _08077068:\n\ lsls r0, r4, 24\n\ negs r0, r0\n\ @@ -1661,16 +1661,16 @@ _08077088:\n\ s8 sub_8077094(s8 a) { - if (!IsContest() && (EWRAM_17810[gBattleAnimPlayerMonIndex].unk0 & 0x10)) + if (!IsContest() && (EWRAM_17810[gBattleAnimBankAttacker].unk0 & 0x10)) { - if (GetBankSide(gBattleAnimPlayerMonIndex) != 0) + if (GetBankSide(gBattleAnimBankAttacker) != 0) a = 0x3F; else a = 0xC0; } else { - if (GetBankSide(gBattleAnimPlayerMonIndex) != 0 || IsContest() != 0) + if (GetBankSide(gBattleAnimBankAttacker) != 0 || IsContest() != 0) a = -a; } return a; @@ -2128,9 +2128,9 @@ static void ScriptCmd_monbgprio_28(void) r2 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); gBattleAnimScriptPtr += 2; if (r2 != 0) - r0 = gBattleAnimEnemyMonIndex; + r0 = gBattleAnimBankTarget; else - r0 = gBattleAnimPlayerMonIndex; + r0 = gBattleAnimBankAttacker; r4 = GetBankIdentity(r0); if (!IsContest() && (r4 == 0 || r4 == 3)) { @@ -2157,12 +2157,12 @@ static void ScriptCmd_monbgprio_2A(void) r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); gBattleAnimScriptPtr += 2; - if (GetBankSide(gBattleAnimPlayerMonIndex) != GetBankSide(gBattleAnimEnemyMonIndex)) + if (GetBankSide(gBattleAnimBankAttacker) != GetBankSide(gBattleAnimBankTarget)) { if (r6 != 0) - r0 = gBattleAnimEnemyMonIndex; + r0 = gBattleAnimBankTarget; else - r0 = gBattleAnimPlayerMonIndex; + r0 = gBattleAnimBankAttacker; r4 = GetBankIdentity(r0); if (!IsContest() && (r4 == 0 || r4 == 3)) { @@ -2178,7 +2178,7 @@ static void ScriptCmd_invisible(void) u8 spriteId; r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); - spriteId = obj_id_for_side_relative_to_move(r0); + spriteId = GetAnimBankSpriteId(r0); if (spriteId != 0xFF) { gSprites[spriteId].invisible = TRUE; @@ -2192,7 +2192,7 @@ static void ScriptCmd_visible(void) u8 spriteId; r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); - spriteId = obj_id_for_side_relative_to_move(r0); + spriteId = GetAnimBankSpriteId(r0); if (spriteId != 0xFF) { gSprites[spriteId].invisible = FALSE; @@ -2209,17 +2209,17 @@ static void ScriptCmd_doublebattle_2D(void) r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); gBattleAnimScriptPtr += 2; if (!IsContest() && IsDoubleBattle() - && GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex)) + && GetBankSide(gBattleAnimBankAttacker) == GetBankSide(gBattleAnimBankTarget)) { if (r7 == 0) { - r4 = GetBankIdentity_permutated(gBattleAnimPlayerMonIndex); - spriteId = obj_id_for_side_relative_to_move(0); + r4 = GetBankIdentity_permutated(gBattleAnimBankAttacker); + spriteId = GetAnimBankSpriteId(0); } else { - r4 = GetBankIdentity_permutated(gBattleAnimEnemyMonIndex); - spriteId = obj_id_for_side_relative_to_move(1); + r4 = GetBankIdentity_permutated(gBattleAnimBankTarget); + spriteId = GetAnimBankSpriteId(1); } if (spriteId != 0xFF) { @@ -2243,17 +2243,17 @@ static void ScriptCmd_doublebattle_2E(void) r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); gBattleAnimScriptPtr += 2; if (!IsContest() && IsDoubleBattle() - && GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex)) + && GetBankSide(gBattleAnimBankAttacker) == GetBankSide(gBattleAnimBankTarget)) { if (r7 == 0) { - r4 = GetBankIdentity_permutated(gBattleAnimPlayerMonIndex); - spriteId = obj_id_for_side_relative_to_move(0); + r4 = GetBankIdentity_permutated(gBattleAnimBankAttacker); + spriteId = GetAnimBankSpriteId(0); } else { - r4 = GetBankIdentity_permutated(gBattleAnimEnemyMonIndex); - spriteId = obj_id_for_side_relative_to_move(1); + r4 = GetBankIdentity_permutated(gBattleAnimBankTarget); + spriteId = GetAnimBankSpriteId(1); } if (spriteId != 0xFF && r4 == 2) { diff --git a/src/battle_anim_807B69C.c b/src/battle_anim_807B69C.c index 42932877b..bf3eb7ef1 100644 --- a/src/battle_anim_807B69C.c +++ b/src/battle_anim_807B69C.c @@ -8,12 +8,12 @@ #include "task.h" #include "trig.h" -extern u8 gBattleAnimPlayerMonIndex; -extern u8 gBattleAnimEnemyMonIndex; +extern u8 gBattleAnimBankAttacker; +extern u8 gBattleAnimBankTarget; extern bool8 gAnimScriptActive; extern void (*gAnimScriptCallback)(void); extern s16 gBattleAnimArgs[]; -extern u8 gBattleAnimEnemyMonIndex; +extern u8 gBattleAnimBankTarget; extern u8 gObjectBankIDs[]; extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; @@ -179,8 +179,8 @@ static void sub_807B8A4(struct Sprite *sprite) void sub_807B920(u8 taskId) { - s16 x = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) - 32; - s16 y = sub_8077ABC(gBattleAnimEnemyMonIndex, 3) - 36; + s16 x = sub_8077ABC(gBattleAnimBankTarget, 2) - 32; + s16 y = sub_8077ABC(gBattleAnimBankTarget, 3) - 36; u8 spriteId; if (IsContest()) @@ -335,8 +335,8 @@ void move_anim_start_t2(u8 a, u8 b) { u8 taskId; - gBattleAnimPlayerMonIndex = a; - gBattleAnimEnemyMonIndex = a; + gBattleAnimBankAttacker = a; + gBattleAnimBankTarget = a; DoMoveAnim(gBattleAnims_StatusConditions, b, 0); taskId = CreateTask(sub_807BDAC, 10); gTasks[taskId].data[0] = a; diff --git a/src/battle_anim_80A7E7C.c b/src/battle_anim_80A7E7C.c index 31984977f..e0c79dc8e 100644 --- a/src/battle_anim_80A7E7C.c +++ b/src/battle_anim_80A7E7C.c @@ -12,8 +12,8 @@ extern s16 gBattleAnimArgs[8]; extern u8 gObjectBankIDs[]; extern s32 gMoveDmgMoveAnim; extern u16 gMovePowerMoveAnim; -extern u8 gBattleAnimPlayerMonIndex; -extern u8 gBattleAnimEnemyMonIndex; +extern u8 gBattleAnimBankAttacker; +extern u8 gBattleAnimBankTarget; static void sub_80A7EF0(u8 taskId); static void sub_80A808C(u8 taskId); @@ -34,7 +34,7 @@ static void sub_80A913C(u8 taskId); void sub_80A7E7C(u8 taskId) { u8 sprite; - sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); if (sprite == 0xff) { DestroyAnimVisualTask(taskId); @@ -96,7 +96,7 @@ void sub_80A7FA0(u8 taskId) r6 = 0; if (gBattleAnimArgs[0] < 4) { - sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); if (sprite == 0xff) { DestroyAnimVisualTask(taskId); @@ -121,7 +121,7 @@ void sub_80A7FA0(u8 taskId) side = GetBankByPlayerAI(3); break; } - if (b_side_obj__get_some_boolean(side) == FALSE) + if (IsAnimBankSpriteVisible(side) == FALSE) { r6 = 1; } @@ -129,7 +129,7 @@ void sub_80A7FA0(u8 taskId) } else { - sprite = gObjectBankIDs[gBattleAnimPlayerMonIndex]; + sprite = gObjectBankIDs[gBattleAnimBankAttacker]; } if (r6) { @@ -186,7 +186,7 @@ static void sub_80A808C(u8 taskId) void sub_80A8154(u8 taskId) { u8 sprite; - sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); if (sprite == 0xff) { DestroyAnimVisualTask(taskId); @@ -244,7 +244,7 @@ static void sub_80A81D8(u8 taskId) void sub_80A8314(u8 taskId) { - u8 sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); gSprites[sprite].pos2.x = gBattleAnimArgs[1]; TASK.data[0] = sprite; TASK.data[1] = gBattleAnimArgs[1]; @@ -286,7 +286,7 @@ void sub_80A8408(u8 taskId) u8 sprite; u8 v1; v1 = 1; - sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); if (gBattleAnimArgs[4] > 5) { gBattleAnimArgs[4] = 5; @@ -328,7 +328,7 @@ static void sub_80A8488(u8 taskId) void sub_80A8500(u8 taskId) { - if (GetBankSide(gBattleAnimPlayerMonIndex)) + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; } @@ -338,7 +338,7 @@ void sub_80A8500(u8 taskId) void sub_80A8530(struct Sprite *sprite) { sprite->invisible = TRUE; - if (GetBankSide(gBattleAnimPlayerMonIndex)) + if (GetBankSide(gBattleAnimBankAttacker)) { sprite->data1 = -gBattleAnimArgs[1]; } @@ -348,9 +348,9 @@ void sub_80A8530(struct Sprite *sprite) } sprite->data0 = gBattleAnimArgs[0]; sprite->data2 = 0; - sprite->data3 = gObjectBankIDs[gBattleAnimPlayerMonIndex]; + sprite->data3 = gObjectBankIDs[gBattleAnimBankAttacker]; sprite->data4 = gBattleAnimArgs[0]; - oamt_set_x3A_32(sprite, sub_80A85A4); + StoreSpriteCallbackInData6(sprite, sub_80A85A4); sprite->callback = sub_8078458; } @@ -359,20 +359,20 @@ static void sub_80A85A4(struct Sprite *sprite) sprite->data0 = sprite->data4; sprite->data1 = -sprite->data1; sprite->callback = sub_8078458; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } void sub_80A85C8(struct Sprite *sprite) { u8 spriteId; sprite->invisible = TRUE; - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]); + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]); sprite->data0 = gBattleAnimArgs[0]; sprite->data1 = 0; sprite->data2 = gBattleAnimArgs[1]; sprite->data3 = spriteId; sprite->data4 = gBattleAnimArgs[0]; - oamt_set_x3A_32(sprite, sub_80A8614); + StoreSpriteCallbackInData6(sprite, sub_80A8614); sprite->callback = sub_8078458; } @@ -381,7 +381,7 @@ void sub_80A8614(struct Sprite *sprite) sprite->data0 = sprite->data4; sprite->data2 = -sprite->data2; sprite->callback = sub_8078458; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } void sub_80A8638(struct Sprite *sprite) @@ -390,11 +390,11 @@ void sub_80A8638(struct Sprite *sprite) int spriteId; if (!gBattleAnimArgs[0]) { - spriteId = gObjectBankIDs[gBattleAnimPlayerMonIndex]; + spriteId = gObjectBankIDs[gBattleAnimBankAttacker]; } else { - spriteId = gObjectBankIDs[gBattleAnimEnemyMonIndex]; + spriteId = gObjectBankIDs[gBattleAnimBankTarget]; } sprite->data0 = gBattleAnimArgs[2]; sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; @@ -457,11 +457,11 @@ void sub_80A8764(struct Sprite *sprite) u8 spriteId; if (!gBattleAnimArgs[0]) { - v1 = gBattleAnimPlayerMonIndex; + v1 = gBattleAnimBankAttacker; } else { - v1 = gBattleAnimEnemyMonIndex; + v1 = gBattleAnimBankTarget; } spriteId = gObjectBankIDs[v1]; if (GetBankSide(v1)) @@ -482,7 +482,7 @@ void sub_80A8764(struct Sprite *sprite) sprite->data4 = 0; sprite->data5 = spriteId; sprite->invisible = TRUE; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); sprite->callback = sub_80784A8; } @@ -493,11 +493,11 @@ void sub_80A8818(struct Sprite *sprite) sprite->invisible = TRUE; if (!gBattleAnimArgs[0]) { - v1 = gBattleAnimPlayerMonIndex; + v1 = gBattleAnimBankAttacker; } else { - v1 = gBattleAnimEnemyMonIndex; + v1 = gBattleAnimBankTarget; } spriteId = gObjectBankIDs[v1]; if (GetBankSide(v1)) @@ -520,11 +520,11 @@ void sub_80A8818(struct Sprite *sprite) sprite->data6 = gBattleAnimArgs[5]; if (!gBattleAnimArgs[5]) { - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } else { - oamt_set_x3A_32(sprite, sub_80A88F0); + StoreSpriteCallbackInData6(sprite, sub_80A88F0); } sprite->callback = sub_80784A8; } @@ -541,12 +541,12 @@ void sub_80A8920(u8 taskId) { s16 r7; r7 = 0x8000 / gBattleAnimArgs[3]; - if (GetBankSide(gBattleAnimPlayerMonIndex)) + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[5] = -gBattleAnimArgs[5]; } - TASK.data[0] = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + TASK.data[0] = GetAnimBankSpriteId(gBattleAnimArgs[0]); TASK.data[1] = (gBattleAnimArgs[1] << 8) / gBattleAnimArgs[3]; TASK.data[2] = gBattleAnimArgs[2]; TASK.data[3] = gBattleAnimArgs[3]; @@ -600,30 +600,30 @@ void sub_80A8A80(u8 taskId) { case 0: case 1: - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); break; case 2: - if (!b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) + if (!IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { DestroyAnimVisualTask(taskId); return; } - spriteId = gObjectBankIDs[gBattleAnimPlayerMonIndex ^ 2]; + spriteId = gObjectBankIDs[gBattleAnimBankAttacker ^ 2]; break; case 3: - if (!b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) + if (!IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { DestroyAnimVisualTask(taskId); return; } - spriteId = gObjectBankIDs[gBattleAnimEnemyMonIndex ^ 2]; + spriteId = gObjectBankIDs[gBattleAnimBankTarget ^ 2]; break; default: DestroyAnimVisualTask(taskId); return; } TASK.data[0] = spriteId; - if (GetBankSide(gBattleAnimEnemyMonIndex)) + if (GetBankSide(gBattleAnimBankTarget)) { TASK.data[1] = gBattleAnimArgs[1]; } @@ -648,11 +648,11 @@ static void sub_80A8B3C(u8 taskId) void sub_80A8B88(u8 taskId) { u8 spriteId; - if (GetBankSide(gBattleAnimPlayerMonIndex)) + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; } - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[4]); + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[4]); TASK.data[0] = gBattleAnimArgs[0]; TASK.data[1] = gBattleAnimArgs[1]; TASK.data[2] = gBattleAnimArgs[2]; @@ -660,11 +660,11 @@ void sub_80A8B88(u8 taskId) TASK.data[4] = spriteId; if (gBattleAnimArgs[4] == 0) { - TASK.data[5] = gBattleAnimPlayerMonIndex; + TASK.data[5] = gBattleAnimBankAttacker; } else { - TASK.data[5] = gBattleAnimEnemyMonIndex; + TASK.data[5] = gBattleAnimBankTarget; } TASK.data[12] = 1; TASK.func = sub_80A8C0C; @@ -714,7 +714,7 @@ static void sub_80A8C0C(u8 taskId) void sub_80A8D34(u8 taskId) { u8 spriteId; - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[3]); + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]); sub_8078E70(spriteId, gBattleAnimArgs[4]); TASK.data[0] = gBattleAnimArgs[0]; TASK.data[1] = gBattleAnimArgs[1]; @@ -754,7 +754,7 @@ static void sub_80A8D8C(u8 taskId) void sub_80A8E04(u8 taskId) { u8 spriteId; - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]); + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]); sub_8078E70(spriteId, 0); TASK.data[1] = 0; TASK.data[2] = gBattleAnimArgs[0]; @@ -777,11 +777,11 @@ void sub_80A8E04(u8 taskId) { if (gBattleAnimArgs[2] == 0) { - TASK.data[7] = !GetBankSide(gBattleAnimPlayerMonIndex); + TASK.data[7] = !GetBankSide(gBattleAnimBankAttacker); } else { - TASK.data[7] = !GetBankSide(gBattleAnimEnemyMonIndex); + TASK.data[7] = !GetBankSide(gBattleAnimBankTarget); } } if (TASK.data[7]) @@ -798,20 +798,20 @@ void sub_80A8E04(u8 taskId) void sub_80A8EFC(u8 taskId) { u8 spriteId; - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]); + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]); sub_8078E70(spriteId, 0); TASK.data[1] = 0; TASK.data[2] = gBattleAnimArgs[0]; if (gBattleAnimArgs[2] == 0) { - if (GetBankSide(gBattleAnimPlayerMonIndex)) + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; } } else { - if (GetBankSide(gBattleAnimEnemyMonIndex)) + if (GetBankSide(gBattleAnimBankTarget)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; } @@ -891,7 +891,7 @@ void sub_80A9058(u8 taskId) TASK.data[12] = 0; TASK.data[10] = gBattleAnimArgs[3]; TASK.data[11] = gBattleAnimArgs[4]; - TASK.data[7] = obj_id_for_side_relative_to_move(1); + TASK.data[7] = GetAnimBankSpriteId(1); TASK.data[8] = gSprites[TASK.data[7]].pos2.x; TASK.data[9] = gSprites[TASK.data[7]].pos2.y; TASK.data[0] = 0; diff --git a/src/battle_anim_8137220.c b/src/battle_anim_8137220.c index bb181d5fb..ebb3d8ae8 100644 --- a/src/battle_anim_8137220.c +++ b/src/battle_anim_8137220.c @@ -90,7 +90,7 @@ extern void sub_80E43C0(); extern void oamt_add_pos2_onto_pos1(); extern void sub_8078B34(struct Sprite *); extern void sub_8030E38(struct Sprite *); -extern void oamt_set_x3A_32(); +extern void StoreSpriteCallbackInData6(); extern u8 sub_8046400(); extern u8 sub_8077ABC(); extern u8 sub_8077F68(); @@ -1365,7 +1365,7 @@ void sub_8139750(void) gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[2].data, 0x100 + paletteNum * 16, 32); diff --git a/src/battle_interface.c b/src/battle_interface.c index 246bda62b..0741ad33a 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2501,7 +2501,7 @@ static void sub_8045458(u8 a, u8 b) if (GetBankSide(r4) != 0) { u16 species = GetMonData(&gEnemyParty[gBattlePartyID[r4]], MON_DATA_SPECIES); - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(species), 1) != 0) + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 1) != 0) { r4 = gSprites[a].data5; if (b != 0) diff --git a/src/berry_blender.c b/src/berry_blender.c index f54c6271d..d9753c52a 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -828,7 +828,7 @@ static bool8 sub_804E2EC(void) switch (gBerryBlenderData->field_1) { case 0: - sub_800D238(gUnknown_08E6C100, &ewram[0x10000]); + LZDecompressWram(gUnknown_08E6C100, &ewram[0x10000]); gBerryBlenderData->field_1++; break; case 1: @@ -862,11 +862,11 @@ static bool8 sub_804E2EC(void) } break; case 3: - sub_800D238(gUnknown_08E6C920, &ewram[0x10000]); + LZDecompressWram(gUnknown_08E6C920, &ewram[0x10000]); gBerryBlenderData->field_1++; break; case 4: - sub_800D238(gUnknown_08E6D354, &ewram[0x13000]); + LZDecompressWram(gUnknown_08E6D354, &ewram[0x13000]); gBerryBlenderData->field_1++; break; case 5: diff --git a/src/birch_pc.c b/src/birch_pc.c index 5fb6427c3..9872dd54d 100644 --- a/src/birch_pc.c +++ b/src/birch_pc.c @@ -91,15 +91,15 @@ const u8 *GetPokedexRatingText(u16 count) return gBirchDexRatingText_LessThan200; if (count == 200) { - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) - || GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // Jirachi or Deoxys is not counted towards the dex completion. If either of these flags are enabled, it means the actual count is less than 200. + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) + || GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // Jirachi or Deoxys is not counted towards the dex completion. If either of these flags are enabled, it means the actual count is less than 200. return gBirchDexRatingText_LessThan200; return gBirchDexRatingText_DexCompleted; } if (count == 201) { - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) - && GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // If both of these flags are enabled, it means the actual count is less than 200. + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) + && GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // If both of these flags are enabled, it means the actual count is less than 200. return gBirchDexRatingText_LessThan200; return gBirchDexRatingText_DexCompleted; } diff --git a/src/contest_painting.c b/src/contest_painting.c index 391cbdfaa..3662efdec 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -353,7 +353,7 @@ static void sub_8106AC4(u16 species, u8 arg1) void *pal; // Unsure what gUnknown_03005E8C->var0 is supposed to be. - pal = species_and_otid_get_pal(species, gUnknown_03005E8C->var4, gUnknown_03005E8C->var0); + pal = GetMonSpritePalFromOtIdPersonality(species, gUnknown_03005E8C->var4, gUnknown_03005E8C->var0); LZDecompressVram(pal, gUnknown_03005E90); if (arg1 == 1) @@ -402,7 +402,7 @@ static void sub_8106AC4(u16 arg0, u8 arg2) ldr r1, [r0, 0x4]\n\ ldr r2, [r0]\n\ adds r0, r6, 0\n\ - bl species_and_otid_get_pal\n\ + bl GetMonSpritePalFromOtIdPersonality\n\ ldr r1, _08106B2C @ =gUnknown_03005E90\n\ mov r8, r1\n\ ldr r1, [r1]\n\ diff --git a/src/credits.c b/src/credits.c index df70674b6..cf10137c1 100644 --- a/src/credits.c +++ b/src/credits.c @@ -1387,7 +1387,7 @@ static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position) 1 ); - lzPaletteData = species_and_otid_get_pal(species, 0, 0xFFFF); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, 0, 0xFFFF); LoadCompressedPalette(lzPaletteData, 0x100 + (position * 16), 0x20); sub_8143648(position, position); @@ -1433,7 +1433,7 @@ static void sub_81458DC(void) for (dexNum = 1, seenTypesCount = 0; dexNum < 386; dexNum++) { - if (GetNationalPokedexFlag(dexNum, 1)) + if (GetSetPokedexFlag(dexNum, 1)) { unk201C000->unk90[seenTypesCount] = dexNum; seenTypesCount++; diff --git a/src/decompress.c b/src/decompress.c index d7f7087a7..3e5993118 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -6,7 +6,7 @@ #define WRAM 0x02000000 -void sub_800D238(const void *src, void *dest) +void LZDecompressWram(const void *src, void *dest) { LZ77UnCompWram(src, dest); } diff --git a/src/easy_chat.c b/src/easy_chat.c index cca8c1355..f46084e50 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -428,7 +428,7 @@ static u16 sub_80EB9D8(void) for (i = 0; i < gEasyChatGroupSizes[EC_GROUP_POKEMON]; i++) { const u16 dexNum = SpeciesToNationalPokedexNum(*speciesList); - const u8 local2 = GetNationalPokedexFlag(dexNum, 0); + const u8 local2 = GetSetPokedexFlag(dexNum, 0); if (local2) { diff --git a/src/egg_hatch.c b/src/egg_hatch.c index 2b68d83e8..b7fbfa5a8 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -48,10 +48,10 @@ extern const struct SpriteSheet sUnknown_0820A3B0; extern const struct SpriteSheet sUnknown_0820A3B8; extern const struct SpritePalette sUnknown_0820A3C0; -bool8 GetNationalPokedexFlag(u16 nationalNum, u8 caseID); +bool8 GetSetPokedexFlag(u16 nationalNum, u8 caseID); u8* GetMonNick(struct Pokemon* mon, u8* dst); u8 sav1_map_get_name(void); -const struct CompressedSpritePalette* sub_8040990(struct Pokemon* mon); //gets pokemon palette address +const struct CompressedSpritePalette* GetMonSpritePalStruct(struct Pokemon* mon); //gets pokemon palette address void sub_8080990(void); static void Task_EggHatch(u8 taskID); @@ -289,8 +289,8 @@ static void AddHatchedMonToParty(u8 id) SetMonData(mon, MON_DATA_NICKNAME, name); pokeNum = SpeciesToNationalPokedexNum(pokeNum); - GetNationalPokedexFlag(pokeNum, 2); - GetNationalPokedexFlag(pokeNum, 3); + GetSetPokedexFlag(pokeNum, 2); + GetSetPokedexFlag(pokeNum, 3); GetMonNick(mon, gStringVar1); @@ -419,11 +419,11 @@ static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID) u16 species = GetMonData(mon, MON_DATA_SPECIES); u32 pid = GetMonData(mon, MON_DATA_PERSONALITY); HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset,(u32)(&ewram[0]), gUnknown_081FAF4C[2 * a0 + 1], species, pid); - LoadCompressedObjectPalette(sub_8040990(mon)); + LoadCompressedObjectPalette(GetMonSpritePalStruct(mon)); } break; case 1: - GetMonSpriteTemplate_803C56C(sub_8040990(mon)->tag, r5); + GetMonSpriteTemplate_803C56C(GetMonSpritePalStruct(mon)->tag, r5); spriteID = CreateSprite(&gUnknown_02024E8C, 120, 70, 6); gSprites[spriteID].invisible = 1; gSprites[spriteID].callback = SpriteCallbackDummy; diff --git a/src/field_effect.c b/src/field_effect.c index 3632d7053..a5c088381 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -660,7 +660,7 @@ u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subprio const struct CompressedSpritePalette *spritePalette; HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gUnknown_081FAF4C[3] /* this is actually u8* or something, pointing to ewram */, gUnknown_081FAF4C[3], species, g); - spritePalette = sub_80409C8(species, d, g); + spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, d, g); LoadCompressedObjectPalette(spritePalette); GetMonSpriteTemplate_803C56C(species, 3); gUnknown_02024E8C.paletteTag = spritePalette->tag; diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index a04f9d65b..f940830f1 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -1347,7 +1347,7 @@ static u32 HallOfFame_LoadPokemonPic(u16 species, s16 posX, s16 posY, u16 pokeID LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[pokeID], species, pid, 1); - pokePal = species_and_otid_get_pal(species, tid, pid); + pokePal = GetMonSpritePalFromOtIdPersonality(species, tid, pid); LoadCompressedPalette(pokePal, 16 * pokeID + 256, 0x20); sub_8143648(pokeID, pokeID); diff --git a/src/intro.c b/src/intro.c index a43e0356c..dd7cc858c 100644 --- a/src/intro.c +++ b/src/intro.c @@ -1785,7 +1785,7 @@ static u16 sub_813CE88(u16 species, s16 x, s16 y, u16 d, u8 front) LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 1); else LoadSpecialPokePic(&gMonBackPicTable[species], gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 0); - lzPaletteData = species_and_otid_get_pal(species, 0, 0xFFFF); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, 0, 0xFFFF); LoadCompressedPalette(lzPaletteData, 0x100 + d * 0x10, 0x20); sub_8143648(d, d); spriteId = CreateSprite(&gUnknown_02024E8C, x, y, (d + 1) * 4); diff --git a/src/item_menu.c b/src/item_menu.c index fdc47ad67..8874bf151 100644 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -4492,7 +4492,7 @@ static void LoadBerryPic(u8 berryId) spritePal.data = (u16 *)sBerryGraphicsTable[berryId].lzPalette; spritePal.tag = 0x7544; LoadCompressedObjectPalette((struct CompressedSpritePalette *)&spritePal); - sub_800D238(sBerryGraphicsTable[berryId].lzPic, ewramBerryPicTemp); + LZDecompressWram(sBerryGraphicsTable[berryId].lzPic, ewramBerryPicTemp); DrawBerryPic(ewramBerryPicTemp, ewramBerryPic); } } diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c index f507942a7..a6568f5de 100644 --- a/src/mystery_event_script.c +++ b/src/mystery_event_script.c @@ -401,8 +401,8 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) if (species != SPECIES_EGG) { u16 pokedexNum = SpeciesToNationalPokedexNum(species); - GetNationalPokedexFlag(pokedexNum, 2); - GetNationalPokedexFlag(pokedexNum, 3); + GetSetPokedexFlag(pokedexNum, 2); + GetSetPokedexFlag(pokedexNum, 3); } heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM); diff --git a/src/palette.c b/src/palette.c index 94a4f8092..17e9ca178 100644 --- a/src/palette.c +++ b/src/palette.c @@ -74,7 +74,7 @@ static bool8 IsSoftwarePaletteFadeFinishing(void); void LoadCompressedPalette(const void *src, u16 offset, u16 size) { - sub_800D238(src, sPaletteDecompressionBuffer); + LZDecompressWram(src, sPaletteDecompressionBuffer); CpuCopy16(sPaletteDecompressionBuffer, gPlttBufferUnfaded + offset, size); CpuCopy16(sPaletteDecompressionBuffer, gPlttBufferFaded + offset, size); } diff --git a/src/pokeblock.c b/src/pokeblock.c index 775280f6e..6b967d7fc 100644 --- a/src/pokeblock.c +++ b/src/pokeblock.c @@ -379,7 +379,7 @@ static bool8 sub_810B998(void) ewram[0x1ffff]++; break; case 1: - sub_800D238(gMenuPokeblock_Tilemap, gBGTilemapBuffers[2]); + LZDecompressWram(gMenuPokeblock_Tilemap, gBGTilemapBuffers[2]); ewram[0x1ffff]++; break; case 2: diff --git a/src/pokedex.c b/src/pokedex.c index c132635cb..d9659348d 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -1,4 +1,3 @@ - #include "global.h" #include "gba/m4a_internal.h" #include "pokedex.h" @@ -1320,8 +1319,8 @@ void ResetPokedex(void) { gSaveBlock2.pokedex.owned[i] = 0; gSaveBlock2.pokedex.seen[i] = 0; - gSaveBlock1.unk938[i] = 0; - gSaveBlock1.unk3A8C[i] = 0; + gSaveBlock1.dexSeen2[i] = 0; + gSaveBlock1.dexSeen3[i] = 0; } } @@ -2030,8 +2029,8 @@ static void SortPokedex(u8 dexMode, u8 sortMode) { vars[2] = HoennToNationalOrder(i + 1); gPokedexView->unk0[i].dexNum = vars[2]; - gPokedexView->unk0[i].seen = GetNationalPokedexFlag(vars[2], 0); - gPokedexView->unk0[i].owned = GetNationalPokedexFlag(vars[2], 1); + gPokedexView->unk0[i].seen = GetSetPokedexFlag(vars[2], 0); + gPokedexView->unk0[i].owned = GetSetPokedexFlag(vars[2], 1); if (gPokedexView->unk0[i].seen) gPokedexView->pokemonListCount = i + 1; } @@ -2045,14 +2044,14 @@ static void SortPokedex(u8 dexMode, u8 sortMode) for (i = 0; i < vars[0]; i++) { vars[2] = i + 1; - if (GetNationalPokedexFlag(vars[2], 0)) + if (GetSetPokedexFlag(vars[2], 0)) r10 = 1; if (r10) { asm(""); //Needed to match for some reason gPokedexView->unk0[r5].dexNum = vars[2]; - gPokedexView->unk0[r5].seen = GetNationalPokedexFlag(vars[2], 0); - gPokedexView->unk0[r5].owned = GetNationalPokedexFlag(vars[2], 1); + gPokedexView->unk0[r5].seen = GetSetPokedexFlag(vars[2], 0); + gPokedexView->unk0[r5].owned = GetSetPokedexFlag(vars[2], 1); if (gPokedexView->unk0[r5].seen) gPokedexView->pokemonListCount = r5 + 1; r5++; @@ -2065,11 +2064,11 @@ static void SortPokedex(u8 dexMode, u8 sortMode) { vars[2] = gPokedexOrder_Alphabetical[i]; - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 0)) + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 0)) { gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; - gPokedexView->unk0[gPokedexView->pokemonListCount].owned = GetNationalPokedexFlag(vars[2], 1); + gPokedexView->unk0[gPokedexView->pokemonListCount].owned = GetSetPokedexFlag(vars[2], 1); gPokedexView->pokemonListCount++; } } @@ -2079,7 +2078,7 @@ static void SortPokedex(u8 dexMode, u8 sortMode) { vars[2] = gPokedexOrder_Weight[i]; - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) { gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; @@ -2093,7 +2092,7 @@ static void SortPokedex(u8 dexMode, u8 sortMode) { vars[2] = gPokedexOrder_Weight[i]; - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) { gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; @@ -2107,7 +2106,7 @@ static void SortPokedex(u8 dexMode, u8 sortMode) { vars[2] = gPokedexOrder_Height[i]; - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) { gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; @@ -2121,7 +2120,7 @@ static void SortPokedex(u8 dexMode, u8 sortMode) { vars[2] = gPokedexOrder_Height[i]; - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) { gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; @@ -3946,7 +3945,7 @@ static void sub_8090B8C(u8 taskId) otId = ((u16)gTasks[taskId].data[13] << 16) | (u16)gTasks[taskId].data[12]; personality = ((u16)gTasks[taskId].data[15] << 16) | (u16)gTasks[taskId].data[14]; paletteNum = gSprites[gTasks[taskId].data[3]].oam.paletteNum; - lzPaletteData = species_and_otid_get_pal(species, otId, personality); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personality); LoadCompressedPalette(lzPaletteData, 0x100 | paletteNum * 16, 32); DestroyTask(taskId); } @@ -4008,79 +4007,79 @@ u16 GetPokedexHeightWeight(u16 dexNum, u8 data) } } -s8 GetNationalPokedexFlag(u16 a, u8 b) +s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID) { u8 index; u8 bit; u8 mask; s8 retVal; - a--; - index = a / 8; - bit = a % 8; + nationalDexNo--; + index = nationalDexNo / 8; + bit = nationalDexNo % 8; mask = 1 << bit; retVal = 0; - switch (b) + switch (caseID) { - case 0: + case FLAG_GET_SEEN: if (gSaveBlock2.pokedex.seen[index] & mask) { - if ((gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.unk938[index] & mask) - && (gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.unk3A8C[index] & mask)) + if ((gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.dexSeen2[index] & mask) + && (gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.dexSeen3[index] & mask)) retVal = 1; else { gSaveBlock2.pokedex.seen[index] &= ~mask; - gSaveBlock1.unk938[index] &= ~mask; - gSaveBlock1.unk3A8C[index] &= ~mask; + gSaveBlock1.dexSeen2[index] &= ~mask; + gSaveBlock1.dexSeen3[index] &= ~mask; retVal = 0; } } break; - case 1: + case FLAG_GET_CAUGHT: if (gSaveBlock2.pokedex.owned[index] & mask) { if ((gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock2.pokedex.seen[index] & mask) - && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.unk938[index] & mask) - && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.unk3A8C[index] & mask)) + && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.dexSeen2[index] & mask) + && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.dexSeen3[index] & mask)) retVal = 1; else { gSaveBlock2.pokedex.owned[index] &= ~mask; gSaveBlock2.pokedex.seen[index] &= ~mask; - gSaveBlock1.unk938[index] &= ~mask; - gSaveBlock1.unk3A8C[index] &= ~mask; + gSaveBlock1.dexSeen2[index] &= ~mask; + gSaveBlock1.dexSeen3[index] &= ~mask; retVal = 0; } } break; - case 2: + case FLAG_SET_SEEN: gSaveBlock2.pokedex.seen[index] |= mask; - gSaveBlock1.unk938[index] |= mask; - gSaveBlock1.unk3A8C[index] |= mask; + gSaveBlock1.dexSeen2[index] |= mask; + gSaveBlock1.dexSeen3[index] |= mask; break; - case 3: + case FLAG_SET_CAUGHT: gSaveBlock2.pokedex.owned[index] |= mask; break; } return retVal; } -u16 GetNationalPokedexCount(u8 a) +u16 GetNationalPokedexCount(u8 caseID) { u16 count = 0; u16 i; for (i = 0; i < NATIONAL_DEX_COUNT; i++) { - switch (a) + switch (caseID) { - case 0: - if (GetNationalPokedexFlag(i + 1, 0) != 0) + case FLAG_GET_SEEN: + if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN)) count++; break; - case 1: - if (GetNationalPokedexFlag(i + 1, 1) != 0) + case FLAG_GET_CAUGHT: + if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) count++; break; } @@ -4088,21 +4087,21 @@ u16 GetNationalPokedexCount(u8 a) return count; } -u16 GetHoennPokedexCount(u8 a) +u16 GetHoennPokedexCount(u8 caseID) { u16 count = 0; u16 i; for (i = 0; i < 202; i++) { - switch (a) + switch (caseID) { - case 0: - if (GetNationalPokedexFlag(HoennToNationalOrder(i + 1), 0) != 0) + case FLAG_GET_SEEN: + if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_SEEN)) count++; break; - case 1: - if (GetNationalPokedexFlag(HoennToNationalOrder(i + 1), 1) != 0) + case FLAG_GET_CAUGHT: + if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) count++; break; } @@ -4116,7 +4115,7 @@ bool8 sub_8090FC0(void) for (i = 0; i < 200; i++) { - if (GetNationalPokedexFlag(HoennToNationalOrder(i + 1), 1) == 0) + if (!GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) return FALSE; } return TRUE; @@ -4128,17 +4127,17 @@ u16 sub_8090FF4(void) for (i = 0; i < 150; i++) { - if (GetNationalPokedexFlag(i + 1, 1) == 0) + if (GetSetPokedexFlag(i + 1, 1) == 0) return 0; } for (i = 152; i < 250; i++) { - if (GetNationalPokedexFlag(i + 1, 1) == 0) + if (GetSetPokedexFlag(i + 1, 1) == 0) return 0; } for (i = 252; i < 384; i++) { - if (GetNationalPokedexFlag(i + 1, 1) == 0) + if (GetSetPokedexFlag(i + 1, 1) == 0) return 0; } return 1; diff --git a/src/pokemon_3.c b/src/pokemon_3.c index e449af0a1..515d63c44 100644 --- a/src/pokemon_3.c +++ b/src/pokemon_3.c @@ -278,7 +278,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) else holdEffect = ItemId_GetHoldEffect(heldItem); - if (holdEffect == 38 && type != 3) + if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != 3) return 0; switch (type) @@ -1096,7 +1096,7 @@ void ClearBattleMonForms(void) gBattleMonForms[i] = 0; } -u16 sub_8040728(void) +u16 GetBGM_ForBattle(void) { if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) return BGM_BATTLE34; @@ -1137,7 +1137,7 @@ void sub_80408BC(void) { ResetMapMusic(); m4aMPlayAllStop(); - PlayBGM(sub_8040728()); + PlayBGM(GetBGM_ForBattle()); } void current_map_music_set__default_for_battle(u16 song) @@ -1147,15 +1147,15 @@ void current_map_music_set__default_for_battle(u16 song) if (song) PlayNewMapMusic(song); else - PlayNewMapMusic(sub_8040728()); + PlayNewMapMusic(GetBGM_ForBattle()); } -const u8 *pokemon_get_pal(struct Pokemon *mon) +const u8 *GetMonSpritePal(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - return species_and_otid_get_pal(species, otId, personality); + return GetMonSpritePalFromOtIdPersonality(species, otId, personality); } //Extracts the upper 16 bits of a 32-bit number @@ -1164,7 +1164,7 @@ const u8 *pokemon_get_pal(struct Pokemon *mon) //Extracts the lower 16 bits of a 32-bit number #define LOHALF(n) ((n) & 0xFFFF) -const u8 *species_and_otid_get_pal(u16 species, u32 otId, u32 personality) +const u8 *GetMonSpritePalFromOtIdPersonality(u16 species, u32 otId, u32 personality) { u32 shinyValue; @@ -1178,15 +1178,15 @@ const u8 *species_and_otid_get_pal(u16 species, u32 otId, u32 personality) return gMonPaletteTable[species].data; } -const struct CompressedSpritePalette *sub_8040990(struct Pokemon *mon) +const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - return sub_80409C8(species, otId, personality); + return GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); } -const struct CompressedSpritePalette *sub_80409C8(u16 species, u32 otId , u32 personality) +const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality) { u32 shinyValue; @@ -1208,9 +1208,9 @@ bool8 IsHMMove2(u16 move) return FALSE; } -bool8 sub_8040A3C(u16 species) +bool8 IsPokeSpriteNotFlipped(u16 species) { - return gBaseStats[species].unk19_7; + return gBaseStats[species].noFlip; } s8 sub_8040A54(struct Pokemon *mon, u8 a2) diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index 249146b37..172233e6d 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -102,8 +102,8 @@ extern u32 gTransformPersonalities[NUM_BATTLE_SLOTS]; extern u8 gBattleMonForms[NUM_BATTLE_SLOTS]; extern u16 gUnknown_0202F7CA[]; extern u8 gBattleMonSprites[NUM_BATTLE_SLOTS]; -extern u8 gBattleAnimPlayerMonIndex; -extern u8 gBattleAnimEnemyMonIndex; +extern u8 gBattleAnimBankAttacker; +extern u8 gBattleAnimBankTarget; extern s16 gBattleAnimArgs[8]; extern u8 gBanksBySide[NUM_BATTLE_SLOTS]; extern u8 gNoOfAllBanks; // gNumBattleMons? @@ -402,43 +402,43 @@ u8 sub_8077FC0(u8 slot) { return r6; } -u8 obj_id_for_side_relative_to_move(u8 a1) { +u8 GetAnimBankSpriteId(u8 whichBank) { u8 *sprites; - if (a1 == 0) { - if (sub_8078874(gBattleAnimPlayerMonIndex)) { + if (whichBank == ANIM_BANK_ATK) { + if (AnimBankSpriteExists(gBattleAnimBankAttacker)) { sprites = gBattleMonSprites; - return sprites[gBattleAnimPlayerMonIndex]; + return sprites[gBattleAnimBankAttacker]; } else { return 0xff; } - } else if (a1 == 1) { - if (sub_8078874(gBattleAnimEnemyMonIndex)) { + } else if (whichBank == ANIM_BANK_DEF) { + if (AnimBankSpriteExists(gBattleAnimBankTarget)) { sprites = gBattleMonSprites; - return sprites[gBattleAnimEnemyMonIndex]; + return sprites[gBattleAnimBankTarget]; } else { return 0xff; } - } else if (a1 == 2) { - if (!b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) { + } else if (whichBank == ANIM_BANK_ATK_PARTNER) { + if (!IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { return 0xff; } else { - return gBattleMonSprites[gBattleAnimPlayerMonIndex ^ 2]; + return gBattleMonSprites[gBattleAnimBankAttacker ^ 2]; } } else { - if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) { - return gBattleMonSprites[gBattleAnimEnemyMonIndex ^ 2]; + if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { + return gBattleMonSprites[gBattleAnimBankTarget ^ 2]; } else { return 0xff; } } } -void oamt_set_x3A_32(struct Sprite *sprite, void (*callback)(struct Sprite*)) { +void StoreSpriteCallbackInData6(struct Sprite *sprite, void (*callback)(struct Sprite*)) { sprite->data6 = (u32)(callback) & 0xffff; sprite->data7 = (u32)(callback) >> 16; } -void sub_8078104(struct Sprite *sprite) { +void SetCallbackToStoredInData6(struct Sprite *sprite) { u32 callback = (u16)sprite->data6 | (sprite->data7 << 16); sprite->callback = (void (*)(struct Sprite *))callback; } @@ -455,7 +455,7 @@ void sub_8078114(struct Sprite *sprite) { } sprite->data3--; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -472,7 +472,7 @@ void sub_8078174(struct Sprite *sprite) { } sprite->data3--; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -494,7 +494,7 @@ void unref_sub_80781F0(struct Sprite *sprite) { } sprite->data3--; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -510,7 +510,7 @@ void sub_8078278(struct Sprite *sprite) { } sprite->data3--; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -518,7 +518,7 @@ void sub_80782D8(struct Sprite *sprite) { if (sprite->data0 > 0) { sprite->data0--; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -547,7 +547,7 @@ void sub_8078364(struct Sprite *sprite) { sprite->pos2.x += sprite->data1; sprite->pos2.y += sprite->data2; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -559,7 +559,7 @@ void sub_8078394(struct Sprite *sprite) { sprite->pos2.x = sprite->data3 >> 8; sprite->pos2.y = sprite->data4 >> 8; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -571,7 +571,7 @@ void sub_80783D0(struct Sprite *sprite) { sprite->pos2.x = sprite->data3 >> 8; sprite->pos2.y = sprite->data4 >> 8; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } UpdateMonIconFrame(sprite); } @@ -579,8 +579,8 @@ void sub_80783D0(struct Sprite *sprite) { void unref_sub_8078414(struct Sprite *sprite) { sprite->data1 = sprite->pos1.x + sprite->pos2.x; sprite->data3 = sprite->pos1.y + sprite->pos2.y; - sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2); - sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3); + sprite->data2 = sub_8077ABC(gBattleAnimBankTarget, 2); + sprite->data4 = sub_8077ABC(gBattleAnimBankTarget, 3); sprite->callback = sub_80782F8; } @@ -590,7 +590,7 @@ void sub_8078458(struct Sprite *sprite) { gSprites[sprite->data3].pos2.x += sprite->data1; gSprites[sprite->data3].pos2.y += sprite->data2; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -602,7 +602,7 @@ void sub_80784A8(struct Sprite *sprite) { gSprites[sprite->data5].pos2.x = sprite->data3 >> 8; gSprites[sprite->data5].pos2.y = sprite->data4 >> 8; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -619,7 +619,7 @@ void sub_8078504(struct Sprite *sprite) { } } } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -631,8 +631,8 @@ void move_anim_8074EE0(struct Sprite *sprite) { void unref_sub_8078588(struct Sprite *sprite) { sprite->data1 = sprite->pos1.x + sprite->pos2.x; sprite->data3 = sprite->pos1.y + sprite->pos2.y; - sprite->data2 = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); - sprite->data4 = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); + sprite->data2 = sub_8077ABC(gBattleAnimBankAttacker, 2); + sprite->data4 = sub_8077ABC(gBattleAnimBankAttacker, 3); sprite->callback = sub_80782F8; } @@ -643,13 +643,13 @@ void unref_sub_80785CC(struct Sprite *sprite) { void sub_80785E4(struct Sprite *sprite) { if (sprite->affineAnimEnded) { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } void sub_8078600(struct Sprite *sprite) { if (sprite->animEnded) { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -666,19 +666,19 @@ void sub_8078634(u8 task) { } void sub_8078650(struct Sprite *sprite) { - sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); - sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); + sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2); + sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3); } void sub_807867C(struct Sprite *sprite, s16 a2) { - u16 v1 = sub_8077ABC(gBattleAnimPlayerMonIndex, 0); - u16 v2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 0); + u16 v1 = sub_8077ABC(gBattleAnimBankAttacker, 0); + u16 v2 = sub_8077ABC(gBattleAnimBankTarget, 0); if (v1 > v2) { sprite->pos1.x -= a2; } else if (v1 < v2) { sprite->pos1.x += a2; } else { - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { sprite->pos1.x -= a2; } else { sprite->pos1.x += a2; @@ -712,8 +712,8 @@ void oamt_add_pos2_onto_pos1(struct Sprite *sprite) { void sub_8078764(struct Sprite *sprite, u8 a2) { if (!a2) { - sprite->pos1.x = sub_8077EE4(gBattleAnimEnemyMonIndex, 0); - sprite->pos1.y = sub_8077EE4(gBattleAnimEnemyMonIndex, 1); + sprite->pos1.x = sub_8077EE4(gBattleAnimBankTarget, 0); + sprite->pos1.y = sub_8077EE4(gBattleAnimBankTarget, 1); } sub_807867C(sprite, gBattleAnimArgs[0]); sprite->pos1.y += gBattleAnimArgs[1]; @@ -721,11 +721,11 @@ void sub_8078764(struct Sprite *sprite, u8 a2) { void sub_80787B0(struct Sprite *sprite, u8 a2) { if (!a2) { - sprite->pos1.x = sub_8077EE4(gBattleAnimPlayerMonIndex, 0); - sprite->pos1.y = sub_8077EE4(gBattleAnimPlayerMonIndex, 1); + sprite->pos1.x = sub_8077EE4(gBattleAnimBankAttacker, 0); + sprite->pos1.y = sub_8077EE4(gBattleAnimBankAttacker, 1); } else { - sprite->pos1.x = sub_8077EE4(gBattleAnimPlayerMonIndex, 2); - sprite->pos1.y = sub_8077EE4(gBattleAnimPlayerMonIndex, 3); + sprite->pos1.x = sub_8077EE4(gBattleAnimBankAttacker, 2); + sprite->pos1.y = sub_8077EE4(gBattleAnimBankAttacker, 3); } sub_807867C(sprite, gBattleAnimArgs[0]); sprite->pos1.y += gBattleAnimArgs[1]; @@ -749,12 +749,12 @@ u8 GetBankByPlayerAI(u8 slot) { return i; } -bool8 sub_8078874(u8 slot) { +bool8 AnimBankSpriteExists(u8 slot) { if (IsContest()) { - if (gBattleAnimPlayerMonIndex == slot) { + if (gBattleAnimBankAttacker == slot) { return TRUE; } - if (gBattleAnimEnemyMonIndex == slot) { + if (gBattleAnimBankTarget == slot) { return TRUE; } return FALSE; @@ -796,7 +796,7 @@ void sub_8078954(struct Struct_sub_8078914 *unk) { unk->field_0 = (u8 *)0x6008000; unk->field_4 = (u8 *)0x600f000; unk->field_8 = 0xe; - } else if (GetBankIdentity_permutated(gBattleAnimPlayerMonIndex) == 1) { + } else if (GetBankIdentity_permutated(gBattleAnimBankAttacker) == 1) { unk->field_0 = (u8 *)0x6004000; unk->field_4 = (u8 *)0x600e000; unk->field_8 = 0x8; @@ -906,7 +906,7 @@ bool8 sub_8078B5C(struct Sprite *sprite) { void sub_8078BB8(struct Sprite *sprite) { if (sub_8078B5C(sprite)) { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -986,7 +986,7 @@ bool8 sub_8078CE8(struct Sprite *sprite) { void sub_8078D44(struct Sprite *sprite) { if (sub_8078CE8(sprite)) { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -1024,7 +1024,7 @@ void obj_id_set_rotscale(u8 sprite, s16 xScale, s16 yScale, u16 rotation) { bool8 sub_8078E38() { if (IsContest()) { - if (gSprites[obj_id_for_side_relative_to_move(0)].data2 == 0xc9 /* XXX SPECIES_UNOWN? */) { + if (gSprites[GetAnimBankSpriteId(0)].data2 == 0xc9 /* XXX SPECIES_UNOWN? */) { return FALSE; } return TRUE; @@ -1035,7 +1035,7 @@ bool8 sub_8078E38() { void sub_8078E70(u8 sprite, u8 a2) { struct Struct_2017810 *unk; u8 r7 = gSprites[sprite].data0; - if (IsContest() || b_side_obj__get_some_boolean(r7)) { + if (IsContest() || IsAnimBankSpriteVisible(r7)) { gSprites[sprite].invisible = FALSE; } gSprites[sprite].oam.objMode = a2; @@ -1096,12 +1096,12 @@ void sub_8079098(struct Sprite *sprite) { CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); } -u16 sub_80790D8(s16 a, s16 b) { +static u16 ArcTan2_(s16 a, s16 b) { return ArcTan2(a, b); } u16 sub_80790F0(s16 a, s16 b) { - u16 var = sub_80790D8(a, b); + u16 var = ArcTan2_(a, b); return -var; } @@ -1140,22 +1140,22 @@ u32 sub_80791A8(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) { } } if (a2) { - shift = gBattleAnimPlayerMonIndex + 16; + shift = gBattleAnimBankAttacker + 16; var |= 1 << shift; } if (a3) { - shift = gBattleAnimEnemyMonIndex + 16; + shift = gBattleAnimBankTarget + 16; var |= 1 << shift; } if (a4) { - if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) { - shift = (gBattleAnimPlayerMonIndex ^ 2) + 16; + if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { + shift = (gBattleAnimBankAttacker ^ 2) + 16; var |= 1 << shift; } } if (a5) { - if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) { - shift = (gBattleAnimEnemyMonIndex ^ 2) + 16; + if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { + shift = (gBattleAnimBankTarget ^ 2) + 16; var |= 1 << shift; } } @@ -1184,24 +1184,24 @@ u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4) { } } else { if (a1) { - if (b_side_obj__get_some_boolean(GetBankByPlayerAI(0))) { + if (IsAnimBankSpriteVisible(GetBankByPlayerAI(0))) { var |= 1 << (GetBankByPlayerAI(0) + 16); } } if (a2) { - if (b_side_obj__get_some_boolean(GetBankByPlayerAI(2))) { + if (IsAnimBankSpriteVisible(GetBankByPlayerAI(2))) { shift = GetBankByPlayerAI(2) + 16; var |= 1 << shift; } } if (a3) { - if (b_side_obj__get_some_boolean(GetBankByPlayerAI(1))) { + if (IsAnimBankSpriteVisible(GetBankByPlayerAI(1))) { shift = GetBankByPlayerAI(1) + 16; var |= 1 << shift; } } if (a4) { - if (b_side_obj__get_some_boolean(GetBankByPlayerAI(3))) { + if (IsAnimBankSpriteVisible(GetBankByPlayerAI(3))) { shift = GetBankByPlayerAI(3) + 16; var |= 1 << shift; } @@ -1252,24 +1252,24 @@ void sub_807941C(struct Sprite *sprite) { v2 = 1; } sub_80787B0(sprite, v1); - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[2] = -gBattleAnimArgs[2]; } sprite->data0 = gBattleAnimArgs[4]; - sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) + gBattleAnimArgs[2]; - sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, v2) + gBattleAnimArgs[3]; + sprite->data2 = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data4 = sub_8077ABC(gBattleAnimBankTarget, v2) + gBattleAnimArgs[3]; sprite->callback = sub_8078B34; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } void sub_80794A8(struct Sprite *sprite) { sub_80787B0(sprite, 1); - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[2] = -gBattleAnimArgs[2]; } sprite->data0 = gBattleAnimArgs[4]; - sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) + gBattleAnimArgs[2]; - sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3) + gBattleAnimArgs[3]; + sprite->data2 = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data4 = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[3]; sprite->data5 = gBattleAnimArgs[5]; sub_80786EC(sprite); sprite->callback = sub_8079518; @@ -1292,12 +1292,12 @@ void sub_8079534(struct Sprite *sprite) { } if (!gBattleAnimArgs[5]) { sub_80787B0(sprite, r4); - slot = gBattleAnimPlayerMonIndex; + slot = gBattleAnimBankAttacker; } else { sub_8078764(sprite, r4); - slot = gBattleAnimEnemyMonIndex; + slot = gBattleAnimBankTarget; } - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[2] = -gBattleAnimArgs[2]; } sub_8078764(sprite, r4); @@ -1305,12 +1305,12 @@ void sub_8079534(struct Sprite *sprite) { sprite->data2 = sub_8077ABC(slot, 2) + gBattleAnimArgs[2]; sprite->data4 = sub_8077ABC(slot, r7) + gBattleAnimArgs[3]; sprite->callback = sub_8078B34; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 a1) { u16 i; - u8 sprite = obj_id_for_side_relative_to_move(a1); + u8 sprite = GetAnimBankSpriteId(a1); if (sprite != 0xff) { for (i = 0; i < 0x40; i++) { if (gSprites[i].inUse) { @@ -1380,7 +1380,7 @@ void sub_80796F8(u8 taskId) { } void sub_8079790(u8 task) { - u8 sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); if (sprite == 0xff) { DestroyAnimVisualTask(task); return; @@ -1624,24 +1624,24 @@ void sub_8079CEC(u8 task) { } void unref_sub_8079D20(u8 priority) { - if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex)) { - gSprites[gBattleMonSprites[gBattleAnimEnemyMonIndex]].oam.priority = priority; + if (IsAnimBankSpriteVisible(gBattleAnimBankTarget)) { + gSprites[gBattleMonSprites[gBattleAnimBankTarget]].oam.priority = priority; } - if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex)) { - gSprites[gBattleMonSprites[gBattleAnimPlayerMonIndex]].oam.priority = priority; + if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker)) { + gSprites[gBattleMonSprites[gBattleAnimBankAttacker]].oam.priority = priority; } - if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) { - gSprites[gBattleMonSprites[gBattleAnimEnemyMonIndex ^ 2]].oam.priority = priority; + if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { + gSprites[gBattleMonSprites[gBattleAnimBankTarget ^ 2]].oam.priority = priority; } - if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) { - gSprites[gBattleMonSprites[gBattleAnimPlayerMonIndex ^ 2]].oam.priority = priority; + if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { + gSprites[gBattleMonSprites[gBattleAnimBankAttacker ^ 2]].oam.priority = priority; } } void sub_8079E24() { int i; for (i = 0; i < gNoOfAllBanks; i++) { - if (b_side_obj__get_some_boolean(i)) { + if (IsAnimBankSpriteVisible(i)) { gSprites[gBattleMonSprites[i]].subpriority = sub_8079E90(i); gSprites[gBattleMonSprites[i]].oam.priority = 2; } @@ -1706,7 +1706,7 @@ u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, u16 sheet = LoadSpriteSheet(&gUnknown_0837F5E0[a3]); u16 palette = AllocSpritePalette(gSpriteTemplate_837F5B0[a3].paletteTag); if (!isBackpic) { - LoadCompressedPalette(species_and_otid_get_pal(species, a8, a7), (palette * 0x10) + 0x100, 0x20); + LoadCompressedPalette(GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20); LoadSpecialPokePic( &gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, @@ -1719,7 +1719,7 @@ u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, ); } else { LoadCompressedPalette( - species_and_otid_get_pal(species, a8, a7), (palette * 0x10) + 0x100, 0x20); + GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20); LoadSpecialPokePic( &gMonBackPicTable[species], gMonBackPicCoords[species].coords, @@ -1892,7 +1892,7 @@ u8 sub_807A4A0(int a1, u8 sprite, int a3) { void sub_807A544(struct Sprite *sprite) { sub_8078650(sprite); - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { sprite->pos1.x -= gBattleAnimArgs[0]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; sprite->hFlip = TRUE; @@ -1904,12 +1904,12 @@ void sub_807A544(struct Sprite *sprite) { sprite->data1 = gBattleAnimArgs[3]; sprite->data3 = gBattleAnimArgs[4]; sprite->data5 = gBattleAnimArgs[5]; - oamt_set_x3A_32(sprite, move_anim_8074EE0); + StoreSpriteCallbackInData6(sprite, move_anim_8074EE0); sprite->callback = sub_8078504; } void sub_807A5C4(struct Sprite *sprite) { - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { sprite->pos1.x -= gBattleAnimArgs[0]; gBattleAnimArgs[3] *= -1; } else { @@ -1921,28 +1921,28 @@ void sub_807A5C4(struct Sprite *sprite) { sprite->data3 = gBattleAnimArgs[4]; sprite->data5 = gBattleAnimArgs[5]; StartSpriteAnim(sprite, gBattleAnimArgs[6]); - oamt_set_x3A_32(sprite, move_anim_8074EE0); + StoreSpriteCallbackInData6(sprite, move_anim_8074EE0); sprite->callback = sub_8078504; } void sub_807A63C(struct Sprite *sprite) { sub_8078650(sprite); - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { sprite->pos1.x -= gBattleAnimArgs[0]; } else { sprite->pos1.x += gBattleAnimArgs[0]; } sprite->pos1.y += gBattleAnimArgs[1]; sprite->callback = sub_8078600; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } void sub_807A69C(u8 taskId) { u16 src; u16 dest; struct Task *task = &gTasks[taskId]; - task->data[0] = obj_id_for_side_relative_to_move(0); - task->data[1] = (GetBankSide(gBattleAnimPlayerMonIndex)) ? -8 : 8; + task->data[0] = GetAnimBankSpriteId(0); + task->data[1] = (GetBankSide(gBattleAnimBankAttacker)) ? -8 : 8; task->data[2] = 0; task->data[3] = 0; gSprites[task->data[0]].pos2.x -= task->data[0]; @@ -1951,7 +1951,7 @@ void sub_807A69C(u8 taskId) { dest = (task->data[4] + 0x10) * 0x10; src = (gSprites[task->data[0]].oam.paletteNum + 0x10) * 0x10; - task->data[6] = sub_8079E90(gBattleAnimPlayerMonIndex); + task->data[6] = sub_8079E90(gBattleAnimBankAttacker); if (task->data[6] == 20 || task->data[6] == 40) { task->data[6] = 2; } else { @@ -2012,9 +2012,9 @@ void sub_807A8D4(struct Sprite *sprite) { } void sub_807A908(struct Sprite *sprite) { - sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); - sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); - if (!GetBankSide(gBattleAnimPlayerMonIndex)) { + sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2); + sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3); + if (!GetBankSide(gBattleAnimBankAttacker)) { sprite->data0 = 5; } else { sprite->data0 = -10; @@ -2041,7 +2041,7 @@ void sub_807A9BC(struct Sprite *sprite) { sprite->data0 = gBattleAnimArgs[2]; sprite->data2 = sprite->pos1.x + gBattleAnimArgs[4]; sprite->data4 = sprite->pos1.y + gBattleAnimArgs[5]; - if (!GetBankSide(gBattleAnimEnemyMonIndex)) { + if (!GetBankSide(gBattleAnimBankTarget)) { x = (u16)gBattleAnimArgs[4] + 30; sprite->pos1.x += x; sprite->pos1.y = gBattleAnimArgs[5] - 20; @@ -2051,5 +2051,5 @@ void sub_807A9BC(struct Sprite *sprite) { sprite->pos1.y = gBattleAnimArgs[5] - 80; } sprite->callback = sub_8078B34; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c index cbca07011..943569d4f 100644 --- a/src/script_pokemon_util_80C4BF0.c +++ b/src/script_pokemon_util_80C4BF0.c @@ -433,7 +433,7 @@ void ShowContestEntryMonPic(void) gUnknown_081FAF4C[1], species, var1); - palette = sub_80409C8(species, var2, var1); + palette = GetMonSpritePalStructFromOtIdPersonality(species, var2, var1); LoadCompressedObjectPalette(palette); GetMonSpriteTemplate_803C56C(species, 1); gUnknown_02024E8C.paletteTag = palette->tag; @@ -561,8 +561,8 @@ u8 ScriptGiveMon(u16 species, u8 var, u16 item, u32 var3, u32 var4, u8 var5) { case 0: case 1: - GetNationalPokedexFlag(nationalSpecies, 2); - GetNationalPokedexFlag(nationalSpecies, 3); + GetSetPokedexFlag(nationalSpecies, 2); + GetSetPokedexFlag(nationalSpecies, 3); return sentToPc; default: return sentToPc; diff --git a/src/shop.c b/src/shop.c index d53646a88..01d675638 100644 --- a/src/shop.c +++ b/src/shop.c @@ -244,7 +244,7 @@ void BuyMenuDrawGraphics(void) register const u32 zero asm("r6") = 0; DmaFill32(3, zero, addr, OAM_SIZE); LZDecompressVram(gBuyMenuFrame_Gfx, (void*)(VRAM + 0x7C00)); - sub_800D238(gBuyMenuFrame_Tilemap, (void *)0x02018000); + LZDecompressWram(gBuyMenuFrame_Tilemap, (void *)0x02018000); LoadCompressedPalette(gMenuMoneyPal, 0xC0, sizeof(gMenuMoneyPal)); FreeAllSpritePalettes(); ResetPaletteFade(); diff --git a/src/slot_machine.c b/src/slot_machine.c index c9a06a758..e8e4f271b 100644 --- a/src/slot_machine.c +++ b/src/slot_machine.c @@ -71,7 +71,7 @@ void sub_8106448(void) { u32 offsetRead, offsetWrite; u32 size; - sub_800D238(gSlotMachine_Gfx, (void *) 0x02010000); + LZDecompressWram(gSlotMachine_Gfx, (void *) 0x02010000); offsetRead = 0x02010000; offsetWrite = BG_VRAM; diff --git a/src/tv.c b/src/tv.c index a254bcd5f..760b6f176 100644 --- a/src/tv.c +++ b/src/tv.c @@ -1556,7 +1556,7 @@ u16 sub_80BF674(u16 species) rspecies = (Random() % (NUM_SPECIES - 1)) + 1; cspecies = rspecies; - while (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(cspecies), 0) != 1 || cspecies == species) + while (GetSetPokedexFlag(SpeciesToNationalPokedexNum(cspecies), 0) != 1 || cspecies == species) { if (cspecies == SPECIES_BULBASAUR) cspecies = NUM_SPECIES - 1; @@ -2320,7 +2320,7 @@ void sub_80C03A8(u8 showidx) void sub_80C03C8(u16 species, u8 showidx) { - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0) + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0) gSaveBlock1.tvShows[showidx].common.var01 = 0; } diff --git a/src/unused_8124F94.c b/src/unused_8124F94.c index 93b569058..5f76fa92e 100644 --- a/src/unused_8124F94.c +++ b/src/unused_8124F94.c @@ -64,7 +64,7 @@ u8 unref_sub_8124FD8(struct UnknownStruct1 *a, const struct UnknownStruct2 *b) } else { - sub_800D238(b->src, a->dest + a->unk2 * 64); + LZDecompressWram(b->src, a->dest + a->unk2 * 64); } a->unk88[a->unk1].unk8 = a->unk2; temp = r6 + a->unk2; @@ -95,7 +95,7 @@ u8 unref_sub_81250A4(struct UnknownStruct1 *a, struct UnknownStruct3 *b) { u16 palette[16]; - sub_800D238(b->paletteSrc, palette); + LZDecompressWram(b->paletteSrc, palette); LoadPalette(palette, a->paletteNum * 16, 32); } a->unk8[a->paletteNum].paletteCount = a->paletteNum; @@ -111,7 +111,7 @@ u8 unref_sub_8125118(struct UnknownStruct1 *a, struct UnknownStruct3 *b) u8 r7 = b->paletteCount; u8 i; - sub_800D238(b->paletteSrc, palettes); + LZDecompressWram(b->paletteSrc, palettes); for (i = a->paletteNum; i < r7; i++) { if (a->paletteNum + i >= 16) -- cgit v1.2.3 From 5598fc659b4616b1964b38c55cef97c83f615646 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 23 Sep 2017 22:06:05 -0500 Subject: script.c mode constants --- src/script.c | 68 +++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/script.c b/src/script.c index f049b96fc..8625cfdc2 100644 --- a/src/script.c +++ b/src/script.c @@ -3,6 +3,14 @@ #include "event_data.h" #define RAM_SCRIPT_MAGIC 51 +#define SCRIPT_STACK_SIZE 20 + +enum +{ + SCRIPT_MODE_STOPPED, + SCRIPT_MODE_BYTECODE, + SCRIPT_MODE_NATIVE, +}; EWRAM_DATA u8 *gUnknown_0202E8AC = NULL; @@ -19,66 +27,66 @@ void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTable { s32 i; - ctx->mode = 0; - ctx->scriptPtr = 0; + ctx->mode = SCRIPT_MODE_STOPPED; + ctx->scriptPtr = NULL; ctx->stackDepth = 0; - ctx->nativePtr = 0; + ctx->nativePtr = NULL; ctx->cmdTable = cmdTable; ctx->cmdTableEnd = cmdTableEnd; for (i = 0; i < 4; i++) ctx->data[i] = 0; - for (i = 0; i < 20; i++) + for (i = 0; i < SCRIPT_STACK_SIZE; i++) ctx->stack[i] = 0; } u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr) { ctx->scriptPtr = ptr; - ctx->mode = 1; + ctx->mode = SCRIPT_MODE_BYTECODE; return 1; } void SetupNativeScript(struct ScriptContext *ctx, bool8 (*ptr)(void)) { - ctx->mode = 2; + ctx->mode = SCRIPT_MODE_NATIVE; ctx->nativePtr = ptr; } void StopScript(struct ScriptContext *ctx) { - ctx->mode = 0; - ctx->scriptPtr = 0; + ctx->mode = SCRIPT_MODE_STOPPED; + ctx->scriptPtr = NULL; } -u8 RunScriptCommand(struct ScriptContext *ctx) +bool8 RunScriptCommand(struct ScriptContext *ctx) { - if (ctx->mode == 0) - return 0; + if (ctx->mode == SCRIPT_MODE_STOPPED) + return FALSE; switch (ctx->mode) { - case 0: - return 0; - case 2: + case SCRIPT_MODE_STOPPED: + return FALSE; + case SCRIPT_MODE_NATIVE: if (ctx->nativePtr) { if (ctx->nativePtr() == TRUE) - ctx->mode = 1; - return 1; + ctx->mode = SCRIPT_MODE_BYTECODE; + return TRUE; } - ctx->mode = 1; - case 1: + ctx->mode = SCRIPT_MODE_BYTECODE; + case SCRIPT_MODE_BYTECODE: while (1) { u8 cmdCode; - ScrCmdFunc *func; + ScrCmdFunc *cmdFunc; - if (!ctx->scriptPtr) + if (ctx->scriptPtr == NULL) { - ctx->mode = 0; - return 0; + ctx->mode = SCRIPT_MODE_STOPPED; + return FALSE; } if (ctx->scriptPtr == gNullScriptPtr) @@ -89,25 +97,25 @@ u8 RunScriptCommand(struct ScriptContext *ctx) cmdCode = *(ctx->scriptPtr); ctx->scriptPtr++; - func = &ctx->cmdTable[cmdCode]; + cmdFunc = &ctx->cmdTable[cmdCode]; - if (func >= ctx->cmdTableEnd) + if (cmdFunc >= ctx->cmdTableEnd) { - ctx->mode = 0; - return 0; + ctx->mode = SCRIPT_MODE_STOPPED; + return FALSE; } - if ((*func)(ctx) == 1) - return 1; + if ((*cmdFunc)(ctx) == TRUE) + return TRUE; } } - return 1; + return TRUE; } u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr) { - if (ctx->stackDepth + 1 >= 20) + if (ctx->stackDepth + 1 >= SCRIPT_STACK_SIZE) { return 1; } -- cgit v1.2.3 From cdc5d1b683dd89e80d3daaf13965cae916ed9f6c Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 23 Sep 2017 23:49:37 -0500 Subject: do some scrcmd/overworld labeling --- src/decoration.c | 2 +- src/field_effect.c | 4 +- src/field_special_scene.c | 2 +- src/field_specials.c | 4 +- src/item_menu.c | 4 +- src/item_use.c | 32 ++++++----- src/new_game.c | 2 +- src/overworld.c | 95 +++++++++++++++---------------- src/rom6.c | 2 +- src/scrcmd.c | 138 +++++++++++++++++++++++++--------------------- src/secret_base.c | 2 +- 11 files changed, 151 insertions(+), 136 deletions(-) (limited to 'src') diff --git a/src/decoration.c b/src/decoration.c index 1d48692c1..8e4d148ea 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -2199,7 +2199,7 @@ void sub_80FF0E0(u8 taskId) void sub_80FF114(u8 taskId) { DrawWholeMapView(); - warp1_set(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]); + Overworld_SetWarpDestination(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]); warp_in(); } void sub_80FF160(u8 taskId) diff --git a/src/field_effect.c b/src/field_effect.c index 0625e9d18..ba71c40d7 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1213,7 +1213,7 @@ void task00_8084310(u8 taskId) } if (!FieldEffectActiveListContains(FLDEFF_USE_FLY)) { - flag_var_implications_of_teleport_(); + Overworld_ResetStateAfterFly(); warp_in(); SetMainCallback2(CB2_LoadMap); gFieldCallback = mapldr_08084390; @@ -2267,7 +2267,7 @@ void sub_8087D78(struct Task *task) { if (!gPaletteFade.active && sub_8054034() == TRUE) { - sub_8053570(); + Overworld_SetWarpDestToLastHealLoc(); warp_in(); SetMainCallback2(CB2_LoadMap); gFieldCallback = mapldr_08085D88; diff --git a/src/field_special_scene.c b/src/field_special_scene.c index 38c076c51..d4b59c8a2 100644 --- a/src/field_special_scene.c +++ b/src/field_special_scene.c @@ -250,7 +250,7 @@ bool8 sub_80C7754(void) } else { - warp1_set(mapGroup, mapNum, -1, x, y); + Overworld_SetWarpDestination(mapGroup, mapNum, -1, x, y); return TRUE; } } diff --git a/src/field_specials.c b/src/field_specials.c index c23ea2ddc..2c68e105a 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -700,11 +700,11 @@ void CableCarWarp(void) { if (gSpecialVar_0x8004 != 0) { - warp1_set(MAP_GROUP_ROUTE112_CABLE_CAR_STATION, MAP_ID_ROUTE112_CABLE_CAR_STATION, -1, 6, 4); + Overworld_SetWarpDestination(MAP_GROUP_ROUTE112_CABLE_CAR_STATION, MAP_ID_ROUTE112_CABLE_CAR_STATION, -1, 6, 4); } else { - warp1_set(MAP_GROUP_MT_CHIMNEY_CABLE_CAR_STATION, MAP_ID_MT_CHIMNEY_CABLE_CAR_STATION, -1, 6, 4); + Overworld_SetWarpDestination(MAP_GROUP_MT_CHIMNEY_CABLE_CAR_STATION, MAP_ID_MT_CHIMNEY_CABLE_CAR_STATION, -1, 6, 4); } } diff --git a/src/item_menu.c b/src/item_menu.c index 891eb135f..cf4fccc14 100644 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -152,7 +152,7 @@ static u8 sReturnLocation; static const u8 *sPopupMenuActionList; // common -void (*gUnknown_03005D00)(u8) = NULL; +void (*gFieldItemUseCallback)(u8) = NULL; extern u16 gUnknown_030041B4; extern struct PocketScrollState gBagPocketScrollStates[]; extern struct ItemSlot *gCurrentBagPocketItemSlots; // selected pocket item slots @@ -2718,7 +2718,7 @@ void ExecuteItemUseFromBlackPalette(void) static void Task_CallItemUseOnFieldCallback(u8 taskId) { if (sub_807D770() == TRUE) - gUnknown_03005D00(taskId); + gFieldItemUseCallback(taskId); } void sub_80A5D04(void) diff --git a/src/item_use.c b/src/item_use.c index 8bc83bdc6..633c4d817 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -36,7 +36,7 @@ #include "task.h" #include "vars.h" -extern void (*gUnknown_03005D00)(u8); +extern void (*gFieldItemUseCallback)(u8); extern void (*gFieldCallback)(void); extern void (*gUnknown_0300485C)(void); extern void (*gUnknown_03004AE4)(u8, u16, TaskFunc); @@ -106,11 +106,13 @@ void SetUpItemUseOnFieldCallback(u8 taskId) { if (gTasks[taskId].data[2] != 1) { - gFieldCallback = (void *)ExecuteItemUseFromBlackPalette; + gFieldCallback = ExecuteItemUseFromBlackPalette; ItemMenu_ConfirmNormalFade(taskId); } else - gUnknown_03005D00(taskId); + { + gFieldItemUseCallback(taskId); + } } void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text) @@ -187,7 +189,7 @@ void ItemUseOutOfBattle_Bike(u8 taskId) { if (Overworld_IsBikeAllowedOnCurrentMap() == TRUE && IsBikingDisallowedByPlayer() == FALSE) { - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Bike; + gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Bike; SetUpItemUseOnFieldCallback(taskId); } else @@ -241,7 +243,7 @@ void ItemUseOutOfBattle_Rod(u8 taskId) { if (CanFish() == TRUE) { - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Rod; + gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Rod; SetUpItemUseOnFieldCallback(taskId); } else @@ -257,7 +259,7 @@ void ItemUseOnFieldCB_Rod(u8 taskId) void ItemUseOutOfBattle_Itemfinder(u8 var) { IncrementGameStat(0x27); - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Itemfinder; + gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Itemfinder; SetUpItemUseOnFieldCallback(var); } @@ -780,7 +782,7 @@ void sub_80C9C7C(u8 taskId) { if (IsPlayerFacingPlantedBerryTree() == TRUE) { - gUnknown_03005D00 = sub_80C9D00; + gFieldItemUseCallback = sub_80C9D00; gFieldCallback = ExecuteItemUseFromBlackPalette; gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; @@ -805,7 +807,7 @@ void ItemUseOutOfBattle_WailmerPail(u8 taskId) { if (TryToWaterBerryTree() == TRUE) { - gUnknown_03005D00 = sub_80C9D74; + gFieldItemUseCallback = sub_80C9D74; SetUpItemUseOnFieldCallback(taskId); } else @@ -909,7 +911,7 @@ void sub_80C9FC0(u8 var) sub_80C9D98(var); } -void sub_80C9FDC(void) +static void PrepareItemUseMessage(void) { RemoveBagItem(gScriptItemId, 1); sub_80A3E0C(); @@ -922,7 +924,7 @@ void ItemUseOutOfBattle_Repel(u8 var) if (VarGet(VAR_REPEL_STEP_COUNT) == FALSE) { VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gScriptItemId)); - sub_80C9FDC(); + PrepareItemUseMessage(); DisplayItemMessageOnField(var, gStringVar4, CleanUpItemMenuMessage, 1); } else @@ -975,10 +977,10 @@ void task08_080A1C44(u8 taskId) DestroyTask(taskId); } -void sub_80CA18C(u8 taskId) +void EscapeRopeCallback(u8 taskId) { - sub_8053014(); - sub_80C9FDC(); + Overworld_ResetStateAfterDigEscRope(); + PrepareItemUseMessage(); gTasks[taskId].data[0] = 0; DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44, 0); } @@ -995,7 +997,7 @@ void ItemUseOutOfBattle_EscapeRope(u8 taskId) { if (CanUseEscapeRopeOnCurrMap() == TRUE) { - gUnknown_03005D00 = sub_80CA18C; + gFieldItemUseCallback = EscapeRopeCallback; SetUpItemUseOnFieldCallback(taskId); } else @@ -1114,7 +1116,7 @@ void ItemUseInBattle_Escape(u8 taskId) if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE) { - sub_80C9FDC(); + PrepareItemUseMessage(); DisplayItemMessageOnField(taskId, gStringVar4, sub_80A7094, 1); } else diff --git a/src/new_game.c b/src/new_game.c index 3f9e9f5a1..6ab21c544 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -99,7 +99,7 @@ void sub_8052DE4(void) void WarpToTruck(void) { - warp1_set(25, 40, -1, -1, -1); // inside of truck + Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck warp_in(); } diff --git a/src/overworld.c b/src/overworld.c index 9b41a262d..ac212747d 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -91,7 +91,7 @@ extern struct MapHeader * const * const gMapGroups[]; extern s32 gMaxFlashLevel; EWRAM_DATA struct WarpData gUnknown_020297F0 = {0}; -EWRAM_DATA struct WarpData gUnknown_020297F8 = {0}; +EWRAM_DATA struct WarpData gWarpDestination = {0}; // new warp position EWRAM_DATA struct WarpData gUnknown_02029800 = {0}; EWRAM_DATA struct WarpData gUnknown_02029808 = {0}; EWRAM_DATA struct UnkPlayerStruct gUnknown_02029810 = {0}; @@ -195,12 +195,12 @@ static void DoWhiteOut(void) ScriptContext2_RunNewScript(S_WhiteOut); gSaveBlock1.money /= 2; ScrSpecial_HealPlayerParty(); - sub_8053050(); - sub_8053570(); + Overworld_ResetStateAfterWhiteOut(); + Overworld_SetWarpDestToLastHealLoc(); warp_in(); } -void flag_var_implications_of_teleport_(void) +void Overworld_ResetStateAfterFly(void) { player_avatar_init_params_reset(); FlagClear(SYS_CYCLING_ROAD); @@ -221,7 +221,7 @@ void Overworld_ResetStateAfterTeleport(void) ScriptContext2_RunNewScript(gUnknown_0819FC9F); } -void sub_8053014(void) +void Overworld_ResetStateAfterDigEscRope(void) { player_avatar_init_params_reset(); FlagClear(SYS_CYCLING_ROAD); @@ -231,7 +231,7 @@ void sub_8053014(void) FlagClear(SYS_USE_FLASH); } -void sub_8053050(void) +void Overworld_ResetStateAfterWhiteOut(void) { player_avatar_init_params_reset(); FlagClear(SYS_CYCLING_ROAD); @@ -318,6 +318,7 @@ void Overworld_SaveMapObjCoords(u8 localId, s16 x, s16 y) void Overworld_SaveMapObjMovementType(u8 localId, u8 movementType) { s32 i; + for (i = 0; i < 64; i++) { struct MapObjectTemplate *mapObjectTemplate = &gSaveBlock1.mapObjectTemplates[i]; @@ -346,15 +347,15 @@ static struct MapData *get_mapdata_header(void) return NULL; } -static void warp_shift(void) +static void ApplyCurrentWarp(void) { gUnknown_020297F0 = gSaveBlock1.location; - gSaveBlock1.location = gUnknown_020297F8; + gSaveBlock1.location = gWarpDestination; gUnknown_02029800 = sDummyWarpData; gUnknown_02029808 = sDummyWarpData; } -static void warp_set(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +static void SetWarpData(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { warp->mapGroup = mapGroup; warp->mapNum = mapNum; @@ -385,7 +386,7 @@ struct MapHeader *const Overworld_GetMapHeaderByGroupAndId(u16 mapGroup, u16 map struct MapHeader *const warp1_get_mapheader(void) { - return Overworld_GetMapHeaderByGroupAndId(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum); + return Overworld_GetMapHeaderByGroupAndId(gWarpDestination.mapGroup, gWarpDestination.mapNum); } static void set_current_map_header_from_sav1_save_old_name(void) @@ -422,34 +423,34 @@ void sub_80533CC(void) void warp_in(void) { - warp_shift(); + ApplyCurrentWarp(); set_current_map_header_from_sav1_save_old_name(); sub_80533CC(); } -void warp1_set(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +void Overworld_SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - warp_set(&gUnknown_020297F8, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gWarpDestination, mapGroup, mapNum, warpId, x, y); } void warp1_set_2(s8 mapGroup, s8 mapNum, s8 warpId) { - warp1_set(mapGroup, mapNum, warpId, -1, -1); + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, -1, -1); } void saved_warp2_set(int unused, s8 mapGroup, s8 mapNum, s8 warpId) { - warp_set(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, gSaveBlock1.pos.x, gSaveBlock1.pos.y); + SetWarpData(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, gSaveBlock1.pos.x, gSaveBlock1.pos.y); } void saved_warp2_set_2(int unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - warp_set(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, x, y); } void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused) { - gUnknown_020297F8 = gSaveBlock1.warp2; + gWarpDestination = gSaveBlock1.warp2; } void sub_8053538(u8 a1) @@ -457,81 +458,82 @@ void sub_8053538(u8 a1) const struct HealLocation *warp = GetHealLocation(a1); if (warp) - warp1_set(warp->group, warp->map, -1, warp->x, warp->y); + Overworld_SetWarpDestination(warp->group, warp->map, -1, warp->x, warp->y); } -void sub_8053570(void) +void Overworld_SetWarpDestToLastHealLoc(void) { - gUnknown_020297F8 = gSaveBlock1.warp3; + gWarpDestination = gSaveBlock1.lastHealLocation; } -void sub_8053588(u8 a1) +void Overworld_SetHealLocationWarp(u8 healLocationId) { - const struct HealLocation *warp = GetHealLocation(a1); - if (warp) - warp_set(&gSaveBlock1.warp3, warp->group, warp->map, -1, warp->x, warp->y); + const struct HealLocation *healLocation = GetHealLocation(healLocationId); + + if (healLocation != NULL) + SetWarpData(&gSaveBlock1.lastHealLocation, healLocation->group, healLocation->map, -1, healLocation->x, healLocation->y); } void sub_80535C4(s16 a1, s16 a2) { u8 v4 = Overworld_GetMapTypeOfSaveblockLocation(); - u8 v5 = GetMapTypeByGroupAndId(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum); + u8 v5 = GetMapTypeByGroupAndId(gWarpDestination.mapGroup, gWarpDestination.mapNum); if (is_map_type_1_2_3_5_or_6(v4) && is_map_type_1_2_3_5_or_6(v5) != TRUE) sub_805363C(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, a1 - 7, a2 - 6); } void sub_805363C(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - warp_set(&gSaveBlock1.warp4, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gSaveBlock1.warp4, mapGroup, mapNum, warpId, x, y); } void sub_8053678(void) { - gUnknown_020297F8 = gSaveBlock1.warp4; + gWarpDestination = gSaveBlock1.warp4; } void sub_8053690(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - warp_set(&gUnknown_02029800, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gUnknown_02029800, mapGroup, mapNum, warpId, x, y); } -void warp1_set_to_warp2(void) +static void warp1_set_to_warp2(void) { - gUnknown_020297F8 = gUnknown_02029800; + gWarpDestination = gUnknown_02029800; } void sub_80536E4(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - warp_set(&gUnknown_02029808, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gUnknown_02029808, mapGroup, mapNum, warpId, x, y); } void sub_8053720(s16 x, s16 y) { if (warp_data_is_not_neg_1(&gUnknown_02029808) == TRUE) { - gUnknown_020297F8 = gUnknown_020297F0; + gWarpDestination = gUnknown_020297F0; } else { - warp1_set(gUnknown_02029808.mapGroup, gUnknown_02029808.mapNum, -1, x, y); + Overworld_SetWarpDestination(gUnknown_02029808.mapGroup, gUnknown_02029808.mapNum, -1, x, y); } } void sub_8053778(void) { - gUnknown_020297F8 = gSaveBlock1.warp1; + gWarpDestination = gSaveBlock1.warp1; } void unref_sub_8053790(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - warp_set(&gSaveBlock1.warp1, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gSaveBlock1.warp1, mapGroup, mapNum, warpId, x, y); } void sub_80537CC(u8 a1) { const struct HealLocation *warp = GetHealLocation(a1); if (warp) - warp_set(&gSaveBlock1.warp1, warp->group, warp->map, -1, warp->x, warp->y); + SetWarpData(&gSaveBlock1.warp1, warp->group, warp->map, -1, warp->x, warp->y); } void gpu_sync_bg_hide() @@ -539,7 +541,7 @@ void gpu_sync_bg_hide() gSaveBlock1.warp1 = gSaveBlock1.warp2; } -struct MapConnection *sub_8053818(u8 dir) +struct MapConnection *GetMapConnection(u8 dir) { s32 i; s32 count = gMapHeader.connections->count; @@ -557,10 +559,11 @@ struct MapConnection *sub_8053818(u8 dir) bool8 sub_8053850(u8 dir, u16 x, u16 y) { - struct MapConnection *connection = sub_8053818(dir); + struct MapConnection *connection = GetMapConnection(dir); + if (connection != NULL) { - warp1_set(connection->mapGroup, connection->mapNum, -1, x, y); + Overworld_SetWarpDestination(connection->mapGroup, connection->mapNum, -1, x, y); } else { @@ -586,9 +589,9 @@ void sub_80538F0(u8 mapGroup, u8 mapNum) { s32 i; - warp1_set(mapGroup, mapNum, -1, -1, -1); + Overworld_SetWarpDestination(mapGroup, mapNum, -1, -1, -1); sub_8053F0C(); - warp_shift(); + ApplyCurrentWarp(); set_current_map_header_from_sav1_save_old_name(); sub_8053154(); ClearTempFieldEventData(); @@ -830,7 +833,7 @@ static u16 GetLocationMusic(struct WarpData *warp) return Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum)->music; } -u16 sav1_map_get_music(void) +u16 GetCurrLocationMusic(void) { u16 music; @@ -855,7 +858,7 @@ u16 sav1_map_get_music(void) u16 warp1_target_get_music(void) { - u16 music = GetLocationMusic(&gUnknown_020297F8); + u16 music = GetLocationMusic(&gWarpDestination); if (music != 0x7FFF) { return music; @@ -877,7 +880,7 @@ void call_map_music_set_to_zero(void) void sub_8053E90(void) { - u16 music = sav1_map_get_music(); + u16 music = GetCurrLocationMusic(); if (music != LEGENDARY_MUSIC) { @@ -929,8 +932,8 @@ void sub_8053F0C(void) void sub_8053F84(void) { u16 currentMusic = GetCurrentMapMusic(); - if (currentMusic != sav1_map_get_music()) - FadeOutAndPlayNewMapMusic(sav1_map_get_music(), 8); + if (currentMusic != GetCurrLocationMusic()) + FadeOutAndPlayNewMapMusic(GetCurrLocationMusic(), 8); } void Overworld_ChangeMusicTo(u16 newMusic) diff --git a/src/rom6.c b/src/rom6.c index 3a5071034..b91a9b2c0 100644 --- a/src/rom6.c +++ b/src/rom6.c @@ -169,7 +169,7 @@ int SetUpFieldMove_Dig(void) static void sub_810B5D8(void) { - sub_8053014(); + Overworld_ResetStateAfterDigEscRope(); FieldEffectStart(FLDEFF_USE_DIG); gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; } diff --git a/src/scrcmd.c b/src/scrcmd.c index 31a90158a..4f6e7e51b 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -670,12 +670,13 @@ bool8 ScrCmd_setmapfooter(struct ScriptContext *ctx) bool8 ScrCmd_warp(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); sub_8080E88(); player_avatar_init_params_reset(); return TRUE; @@ -683,12 +684,13 @@ bool8 ScrCmd_warp(struct ScriptContext *ctx) bool8 ScrCmd_warpmuted(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); sp13E_warp_to_last_warp(); player_avatar_init_params_reset(); return TRUE; @@ -696,12 +698,13 @@ bool8 ScrCmd_warpmuted(struct ScriptContext *ctx) bool8 ScrCmd_warpwalk(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); sub_8080EF0(); player_avatar_init_params_reset(); return TRUE; @@ -709,17 +712,17 @@ bool8 ScrCmd_warpwalk(struct ScriptContext *ctx) bool8 ScrCmd_warphole(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); u16 x; u16 y; PlayerGetDestCoords(&x, &y); - if (v1 == 0xFF && v2 == 0xFF) + if (mapGroup == 0xFF && mapNum == 0xFF) sub_8053720(x - 7, y - 7); else - warp1_set(v1, v2, -1, x - 7, y - 7); + Overworld_SetWarpDestination(mapGroup, mapNum, -1, x - 7, y - 7); sp13F_fall_to_last_warp(); player_avatar_init_params_reset(); @@ -728,12 +731,13 @@ bool8 ScrCmd_warphole(struct ScriptContext *ctx) bool8 ScrCmd_warpteleport(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); sub_8080F68(); player_avatar_init_params_reset(); return TRUE; @@ -741,65 +745,71 @@ bool8 ScrCmd_warpteleport(struct ScriptContext *ctx) bool8 ScrCmd_warp3(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); return FALSE; } bool8 ScrCmd_warpplace(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - saved_warp2_set_2(0, v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + saved_warp2_set_2(0, mapGroup, mapNum, warpId, x, y); return FALSE; } bool8 ScrCmd_warp4(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - sub_8053690(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + sub_8053690(mapGroup, mapNum, warpId, x, y); return FALSE; } bool8 ScrCmd_warp5(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - sub_80536E4(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + sub_80536E4(mapGroup, mapNum, warpId, x, y); return FALSE; } bool8 ScrCmd_warp6(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - sub_805363C(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + sub_805363C(mapGroup, mapNum, warpId, x, y); return FALSE; } bool8 ScrCmd_getplayerxy(struct ScriptContext *ctx) { - u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); - u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr1 = gSaveBlock1.pos.x; - *ptr2 = gSaveBlock1.pos.y; + u16 *pX = GetVarPointer(ScriptReadHalfword(ctx)); + u16 *pY = GetVarPointer(ScriptReadHalfword(ctx)); + + *pX = gSaveBlock1.pos.x; + *pY = gSaveBlock1.pos.y; return FALSE; } @@ -1748,8 +1758,8 @@ bool8 ScrCmd_checkanimation(struct ScriptContext *ctx) bool8 ScrCmd_sethealplace(struct ScriptContext *ctx) { - u16 v2 = VarGet(ScriptReadHalfword(ctx)); - sub_8053588(v2); + u16 healLocationId = VarGet(ScriptReadHalfword(ctx)); + Overworld_SetHealLocationWarp(healLocationId); return FALSE; } diff --git a/src/secret_base.c b/src/secret_base.c index b2cd1f094..f221d7f16 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -301,7 +301,7 @@ void sub_80BBBEC(u8 taskid) s8 idx; if (!gPaletteFade.active) { idx = 4 * (gUnknown_020387DC / 10); - warp1_set(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gUnknown_083D1374[idx + 2], gUnknown_083D1374[idx + 3]); + Overworld_SetWarpDestination(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gUnknown_083D1374[idx + 2], gUnknown_083D1374[idx + 3]); warp_in(); gFieldCallback = sub_80BBB90; SetMainCallback2(CB2_LoadMap); -- cgit v1.2.3 From 0c234d0929a6f7bb41277275f06abae1b3d7e823 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 24 Sep 2017 12:12:53 -0500 Subject: more renaming --- src/battle_setup.c | 2 +- src/bike.c | 6 +- src/cable_club.c | 4 +- src/coins.c | 26 ++--- src/evolution_scene.c | 4 +- src/field_effect.c | 14 +-- src/field_fadetransition.c | 14 +-- src/field_map_obj.c | 22 ++-- src/field_player_avatar.c | 4 +- src/field_screen_effect.c | 2 +- src/field_specials.c | 2 +- src/hof_pc.c | 2 +- src/item_use.c | 2 +- src/overworld.c | 93 +++++++++-------- src/scrcmd.c | 250 +++++++++++++++++++++++++++++++++------------ src/sound.c | 2 - 16 files changed, 286 insertions(+), 163 deletions(-) (limited to 'src') diff --git a/src/battle_setup.c b/src/battle_setup.c index 59e17e9eb..40949ed38 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -876,7 +876,7 @@ static void CB2_StartFirstBattle(void) static void CB2_EndFirstBattle(void) { - sav1_reset_battle_music_maybe(); + Overworld_ClearSavedMusic(); SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); } diff --git a/src/bike.c b/src/bike.c index 80cab0850..458230a95 100644 --- a/src/bike.c +++ b/src/bike.c @@ -937,13 +937,13 @@ void GetOnOffBike(u8 var) if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) { SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); - sav1_reset_battle_music_maybe(); - sub_8053E90(); + Overworld_ClearSavedMusic(); + Overworld_PlaySpecialMapMusic(); } else { SetPlayerAvatarTransitionFlags(var); - sav1_set_battle_music_maybe(BGM_CYCLING); + Overworld_SetSavedMusic(BGM_CYCLING); Overworld_ChangeMusicTo(BGM_CYCLING); } } diff --git a/src/cable_club.c b/src/cable_club.c index 7a85f2b6c..c61a1d01c 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -68,7 +68,7 @@ static void sub_8083B6C(void); static void sub_8083CA4(u8 taskId); extern void sub_80831F8(u8 taskId); -extern void call_map_music_set_to_zero(void); +extern void Overworld_ResetMapMusic(void); extern void sub_810FEFC(void); extern void sub_8047CD8(void); extern void sub_805559C(void); @@ -708,7 +708,7 @@ static void sub_808382C(u8 taskId) static void sub_8083958(void) { - call_map_music_set_to_zero(); + Overworld_ResetMapMusic(); LoadPlayerParty(); SavePlayerBag(); sub_810FEFC(); diff --git a/src/coins.c b/src/coins.c index 3c6356612..91a4b508d 100644 --- a/src/coins.c +++ b/src/coins.c @@ -6,47 +6,47 @@ #define MAX_COINS 9999 -void UpdateCoinsWindow(s32 a, u8 b, u8 c) +void UpdateCoinsWindow(s32 coins, u8 x, u8 y) { - PrintCoins(a, 4, b + 2, c + 1); + PrintCoins(coins, 4, x + 2, y + 1); } -void ShowCoinsWindow(u32 a, u8 b, u8 c) +void ShowCoinsWindow(u32 coins, u8 x, u8 y) { - MenuDrawTextWindow(b, c, b + 9, c + 3); - UpdateCoinsWindow(a, b, c); + MenuDrawTextWindow(x, y, x + 9, y + 3); + UpdateCoinsWindow(coins, x, y); } -void HideCoinsWindow(u8 a, u8 b) +void HideCoinsWindow(u8 x, u8 y) { - MenuZeroFillWindowRect(a, b, a + 9, b + 3); + MenuZeroFillWindowRect(x, y, x + 9, y + 3); } -void PrintCoins(s32 a, u8 b, u8 c, u8 d) +void PrintCoins(s32 coins, u8 b, u8 x, u8 y) { u8 string[16]; u8 *ptr; u8 r1; u8 foo; - ConvertIntToDecimalString(string, a); + ConvertIntToDecimalString(string, coins); r1 = (b * 6 + 0x21 - 8 * (b + 2)); - c = c - r1 / 8; + x = x - r1 / 8; foo = r1 % 8; ptr = gStringVar1; if (foo) { - ptr[0] = 0xFC; + ptr[0] = EXT_CTRL_CODE_BEGIN; ptr[1] = 0x11; ptr[2] = 8 - (foo); ptr += 3; } - ptr[0] = 0xFC; + ptr[0] = EXT_CTRL_CODE_BEGIN; ptr[1] = 0x11; ptr[2] = (b - StringLength(string)) * 6; ptr += 3; StringCopy(ptr, string); - MenuPrint(gOtherText_Coins2, c, d); + MenuPrint(gOtherText_Coins2, x, y); } u16 GetCoins(void) diff --git a/src/evolution_scene.c b/src/evolution_scene.c index e312b081f..df474ad74 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -667,7 +667,7 @@ static void Task_EvolutionScene(u8 taskID) { u8 text[20]; - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); gTasks[taskID].tBits |= TASK_BIT_LEARN_MOVE; gTasks[taskID].tLearnsFirstMove = FALSE; gTasks[taskID].tLearnMoveState = 0; @@ -691,7 +691,7 @@ static void Task_EvolutionScene(u8 taskID) if (!gPaletteFade.active) { if (!(gTasks[taskID].tBits & TASK_BIT_LEARN_MOVE)) - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); if (!gTasks[taskID].tEvoWasStopped) CreateShedinja(gTasks[taskID].tPreEvoSpecies, mon); DestroyTask(taskID); diff --git a/src/field_effect.c b/src/field_effect.c index ba71c40d7..a24f7c445 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1223,7 +1223,7 @@ void task00_8084310(u8 taskId) void mapldr_08084390(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_black(); CreateTask(c3_080843F8, 0); gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; @@ -1264,7 +1264,7 @@ extern void CameraObjectReset1(void); void sub_8086748(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); ScriptContext2_Enable(); FreezeMapObjects(); @@ -1533,7 +1533,7 @@ void sub_8086C40(void) void sub_8086C94(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); ScriptContext2_Enable(); CreateTask(sub_8086CBC, 0); @@ -1898,7 +1898,7 @@ extern u8 sub_80608A4(u8); void mapldr_080851BC(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); ScriptContext2_Enable(); gFieldCallback = NULL; @@ -2135,7 +2135,7 @@ void sub_8087A74(u8); void mapldr_080859D4(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); ScriptContext2_Enable(); FreezeMapObjects(); @@ -2279,7 +2279,7 @@ void sub_8087E1C(u8); void mapldr_08085D88(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); ScriptContext2_Enable(); FreezeMapObjects(); @@ -2880,7 +2880,7 @@ u8 FldEff_UseSurf(void) u8 taskId; taskId = CreateTask(sub_8088954, 0xff); gTasks[taskId].data[15] = gFieldEffectArguments[0]; - sav1_reset_battle_music_maybe(); + Overworld_ClearSavedMusic(); Overworld_ChangeMusicTo(0x016d); return FALSE; } diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c index d95177821..82776d18c 100644 --- a/src/field_fadetransition.c +++ b/src/field_fadetransition.c @@ -89,7 +89,7 @@ void task0A_asap_script_env_2_enable_and_set_ctx_running(u8 taskID) void sub_8080990(void) { ScriptContext2_Enable(); - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_black(); CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10); } @@ -130,7 +130,7 @@ void task_mpl_807DD60(u8 taskId) void sub_8080A3C(void) { ScriptContext2_Enable(); - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); palette_bg_fill_black(); CreateTask(task_mpl_807DD60, 10); } @@ -165,7 +165,7 @@ void sub_8080A5C(u8 taskId) void sub_8080AC4(void) { ScriptContext2_Enable(); - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); palette_bg_fill_black(); CreateTask(sub_8080A5C, 10); } @@ -188,7 +188,7 @@ void sub_8080AE4(void) void mapldr_default(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); sub_8080AE4(); ScriptContext2_Enable(); @@ -196,7 +196,7 @@ void mapldr_default(void) void sub_8080B60(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_black(); sub_8080AE4(); ScriptContext2_Enable(); @@ -204,7 +204,7 @@ void sub_8080B60(void) void sub_8080B78(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); PlaySE(SE_TK_WARPOUT); CreateTask(task_map_chg_seq_0807E2CC, 10); @@ -354,7 +354,7 @@ void sub_8080E28(void) void sub_8080E44(void) { ScriptContext2_Enable(); - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_black(); CreateTask(task_mpl_807E3C8, 10); } diff --git a/src/field_map_obj.c b/src/field_map_obj.c index 0e7cd7896..b6da956aa 100644 --- a/src/field_map_obj.c +++ b/src/field_map_obj.c @@ -2462,24 +2462,24 @@ extern void sub_8064970(struct Sprite *); extern void sub_8060470(s16 *, s16 *, s16, s16); extern void InitObjectPriorityByZCoord(); -u8 sub_805B410(u8 a, u8 b, s16 c, s16 d, u8 e, u8 f) +u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction) { const struct MapObjectGraphicsInfo *gfxInfo; struct SpriteTemplate spriteTemplate; const struct SubspriteTable *subspriteTables; u8 spriteId; - gfxInfo = GetFieldObjectGraphicsInfo(a); - MakeObjectTemplateFromFieldObjectGraphicsInfo(a, sub_8064970, &spriteTemplate, &subspriteTables); + gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, sub_8064970, &spriteTemplate, &subspriteTables); #ifdef NONMATCHING spriteTemplate.paletteTag = 0xFFFF; #else *(u16 *)&spriteTemplate.paletteTag = 0xFFFF; #endif - c += 7; - d += 7; - sub_8060470(&c, &d, 8, 16); - spriteId = CreateSpriteAtEnd(&spriteTemplate, c, d, 0); + x += 7; + y += 7; + sub_8060470(&x, &y, 8, 16); + spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); if (spriteId != 64) { struct Sprite *sprite = &gSprites[spriteId]; @@ -2490,7 +2490,7 @@ u8 sub_805B410(u8 a, u8 b, s16 c, s16 d, u8 e, u8 f) sprite->oam.paletteNum = gfxInfo->paletteSlot; sprite->coordOffsetEnabled = TRUE; sprite->data0 = b; - sprite->data1 = e; + sprite->data1 = elevation; if (gfxInfo->paletteSlot == 10) npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); if (subspriteTables != NULL) @@ -2498,9 +2498,9 @@ u8 sub_805B410(u8 a, u8 b, s16 c, s16 d, u8 e, u8 f) SetSubspriteTables(sprite, subspriteTables); sprite->subspriteMode = 2; } - InitObjectPriorityByZCoord(sprite, e); - SetObjectSubpriorityByZCoord(e, sprite, 1); - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(f)); + InitObjectPriorityByZCoord(sprite, elevation); + SetObjectSubpriorityByZCoord(elevation, sprite, 1); + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(direction)); } return spriteId; } diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index c8099a73d..2aa534ebc 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -1365,8 +1365,8 @@ void sub_805A20C(u8 a) u8 taskId; ScriptContext2_Enable(); - sav1_reset_battle_music_maybe(); - sub_8053F84(); + Overworld_ClearSavedMusic(); + Overworld_ChangeMusicToDefault(); gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; gPlayerAvatar.unk6 = 1; diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 1464a99b1..0c76d254d 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -327,7 +327,7 @@ static void task50_0807F0C8(u8); void sub_8081924(void) { - sub_8054044(); + Overworld_FadeOutMapMusic(); CreateTask(task50_0807F0C8, 80); } diff --git a/src/field_specials.c b/src/field_specials.c index 2c68e105a..36362d098 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -213,7 +213,7 @@ void UpdateCyclingRoadState(void) { if (VarGet(0x40a9) == 2 || VarGet(0x40a9) == 3) { VarSet(0x40a9, 0); - sav1_set_battle_music_maybe(SE_STOP); + Overworld_SetSavedMusic(SE_STOP); } } diff --git a/src/hof_pc.c b/src/hof_pc.c index aeeb7fe17..267ed4274 100644 --- a/src/hof_pc.c +++ b/src/hof_pc.c @@ -28,7 +28,7 @@ void ReturnFromHallOfFamePC(void) static void ReshowPCMenuAfterHallOfFamePC(void) { ScriptContext2_Enable(); - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); ScrSpecial_CreatePCMenu(); ScriptMenu_DisplayPCStartupPrompt(); diff --git a/src/item_use.c b/src/item_use.c index 633c4d817..68da27fdb 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -187,7 +187,7 @@ void ItemUseOutOfBattle_Bike(u8 taskId) } else { - if (Overworld_IsBikeAllowedOnCurrentMap() == TRUE && IsBikingDisallowedByPlayer() == FALSE) + if (Overworld_IsBikingAllowed() == TRUE && IsBikingDisallowedByPlayer() == FALSE) { gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Bike; SetUpItemUseOnFieldCallback(taskId); diff --git a/src/overworld.c b/src/overworld.c index ac212747d..d6f255409 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -283,9 +283,12 @@ void SetGameStat(u8 index, u32 value) gSaveBlock1.gameStats[index] = value; } -void sub_8053154(void) +void LoadMapObjTemplatesFromHeader(void) { + // Clear map object templates CpuFill32(0, gSaveBlock1.mapObjectTemplates, sizeof(gSaveBlock1.mapObjectTemplates)); + + // Copy map header events to save block CpuCopy32(gMapHeader.events->mapObjects, gSaveBlock1.mapObjectTemplates, gMapHeader.events->mapObjectCount * sizeof(struct MapObjectTemplate)); @@ -300,7 +303,7 @@ static void LoadSaveblockMapObjScripts(void) mapObjectTemplates[i].script = gMapHeader.events->mapObjects[i].script; } -void Overworld_SaveMapObjCoords(u8 localId, s16 x, s16 y) +void Overworld_SetMapObjTemplateCoords(u8 localId, s16 x, s16 y) { s32 i; for (i = 0; i < 64; i++) @@ -315,7 +318,7 @@ void Overworld_SaveMapObjCoords(u8 localId, s16 x, s16 y) } } -void Overworld_SaveMapObjMovementType(u8 localId, u8 movementType) +void Overworld_SetMapObjTemplateMovementType(u8 localId, u8 movementType) { s32 i; @@ -476,9 +479,9 @@ void Overworld_SetHealLocationWarp(u8 healLocationId) void sub_80535C4(s16 a1, s16 a2) { - u8 v4 = Overworld_GetMapTypeOfSaveblockLocation(); - u8 v5 = GetMapTypeByGroupAndId(gWarpDestination.mapGroup, gWarpDestination.mapNum); - if (is_map_type_1_2_3_5_or_6(v4) && is_map_type_1_2_3_5_or_6(v5) != TRUE) + u8 currMapType = Overworld_GetMapTypeOfSaveblockLocation(); + u8 destMapType = GetMapTypeByGroupAndId(gWarpDestination.mapGroup, gWarpDestination.mapNum); + if (is_map_type_1_2_3_5_or_6(currMapType) && is_map_type_1_2_3_5_or_6(destMapType) != TRUE) sub_805363C(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, a1 - 7, a2 - 6); } @@ -593,7 +596,7 @@ void sub_80538F0(u8 mapGroup, u8 mapNum) sub_8053F0C(); ApplyCurrentWarp(); set_current_map_header_from_sav1_save_old_name(); - sub_8053154(); + LoadMapObjTemplatesFromHeader(); ClearTempFieldEventData(); ResetCyclingRoadChallengeData(); prev_quest_postbuffer_cursor_backup_reset(); @@ -602,7 +605,7 @@ void sub_80538F0(u8 mapGroup, u8 mapNum) sub_80806E4(); ChooseAmbientCrySpecies(); SetDefaultFlashLevel(); - sav1_reset_battle_music_maybe(); + Overworld_ClearSavedMusic(); mapheader_run_script_with_tag_x3(); not_trainer_hill_battle_pyramid(); sub_8056D38(gMapHeader.mapData); @@ -626,7 +629,7 @@ void sub_8053994(u32 a1) bool8 v3; set_current_map_header_from_sav1_save_old_name(); - sub_8053154(); + LoadMapObjTemplatesFromHeader(); v2 = is_map_type_1_2_3_5_or_6(gMapHeader.mapType); v3 = Overworld_MapTypeIsIndoors(gMapHeader.mapType); ClearTempFieldEventData(); @@ -640,7 +643,7 @@ void sub_8053994(u32 a1) if (v2) FlagClear(SYS_USE_FLASH); SetDefaultFlashLevel(); - sav1_reset_battle_music_maybe(); + Overworld_ClearSavedMusic(); mapheader_run_script_with_tag_x3(); UpdateLocationHistoryForRoamer(); RoamerMoveToOtherLocationSet(); @@ -694,7 +697,7 @@ u8 sub_8053B00(struct UnkPlayerStruct *playerStruct, u16 a2, u8 a3) return 16; if (MetatileBehavior_IsSurfableWaterOrUnderwater(a2) == 1) return 8; - if (Overworld_IsBikeAllowedOnCurrentMap() != TRUE) + if (Overworld_IsBikingAllowed() != TRUE) return 1; if (playerStruct->player_field_0 == 2) return 2; @@ -732,7 +735,7 @@ u16 cur_mapdata_block_role_at_screen_center_acc_to_sav1(void) return MapGridGetMetatileBehaviorAt(gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7); } -bool32 Overworld_IsBikeAllowedOnCurrentMap(void) +bool32 Overworld_IsBikingAllowed(void) { // is player in cycling road entrance? if (gSaveBlock1.location.mapGroup == MAP_GROUP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE @@ -833,10 +836,11 @@ static u16 GetLocationMusic(struct WarpData *warp) return Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum)->music; } -u16 GetCurrLocationMusic(void) +u16 GetCurrLocationDefaultMusic(void) { u16 music; + // Play the desert music only when the sandstorm is active on Route 111. if (gSaveBlock1.location.mapGroup == MAP_GROUP_ROUTE111 && gSaveBlock1.location.mapNum == MAP_ID_ROUTE111 && GetSav1Weather() == 8) @@ -856,7 +860,7 @@ u16 GetCurrLocationMusic(void) } } -u16 warp1_target_get_music(void) +u16 GetWarpDestinationMusic(void) { u16 music = GetLocationMusic(&gWarpDestination); if (music != 0x7FFF) @@ -873,19 +877,19 @@ u16 warp1_target_get_music(void) } } -void call_map_music_set_to_zero(void) +void Overworld_ResetMapMusic(void) { ResetMapMusic(); } -void sub_8053E90(void) +void Overworld_PlaySpecialMapMusic(void) { - u16 music = GetCurrLocationMusic(); + u16 music = GetCurrLocationDefaultMusic(); if (music != LEGENDARY_MUSIC) { - if (gSaveBlock1.battleMusic) - music = gSaveBlock1.battleMusic; + if (gSaveBlock1.savedMusic) + music = gSaveBlock1.savedMusic; else if (Overworld_GetMapTypeOfSaveblockLocation() == MAP_TYPE_UNDERWATER) music = BGM_DEEPDEEP; else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) @@ -896,21 +900,21 @@ void sub_8053E90(void) PlayNewMapMusic(music); } -void sav1_set_battle_music_maybe(u16 songNum) +void Overworld_SetSavedMusic(u16 songNum) { - gSaveBlock1.battleMusic = songNum; + gSaveBlock1.savedMusic = songNum; } -void sav1_reset_battle_music_maybe(void) +void Overworld_ClearSavedMusic(void) { - gSaveBlock1.battleMusic = 0; + gSaveBlock1.savedMusic = 0; } void sub_8053F0C(void) { if (FlagGet(SPECIAL_FLAG_1) != TRUE) { - u16 newMusic = warp1_target_get_music(); + u16 newMusic = GetWarpDestinationMusic(); u16 currentMusic = GetCurrentMapMusic(); if (newMusic != LEGENDARY_MUSIC) { @@ -929,11 +933,11 @@ void sub_8053F0C(void) } } -void sub_8053F84(void) +void Overworld_ChangeMusicToDefault(void) { u16 currentMusic = GetCurrentMapMusic(); - if (currentMusic != GetCurrLocationMusic()) - FadeOutAndPlayNewMapMusic(GetCurrLocationMusic(), 8); + if (currentMusic != GetCurrLocationDefaultMusic()) + FadeOutAndPlayNewMapMusic(GetCurrLocationDefaultMusic(), 8); } void Overworld_ChangeMusicTo(u16 newMusic) @@ -954,7 +958,7 @@ u8 GetMapMusicFadeoutSpeed(void) void sub_8053FF8(void) { - u16 music = warp1_target_get_music(); + u16 music = GetWarpDestinationMusic(); if (FlagGet(SPECIAL_FLAG_1) != TRUE && music != GetCurrentMapMusic()) { u8 speed = GetMapMusicFadeoutSpeed(); @@ -967,7 +971,7 @@ bool8 sub_8054034(void) return IsNotWaitingForBGMStop(); } -void sub_8054044(void) +void Overworld_FadeOutMapMusic(void) { FadeOutMapMusic(4); } @@ -975,14 +979,16 @@ void sub_8054044(void) static void PlayAmbientCry(void) { s16 x, y; + s8 pan; + s8 volume; + PlayerGetDestCoords(&x, &y); - if (sIsAmbientCryWaterMon != TRUE - || MetatileBehavior_IsSurfableWaterOrUnderwater(MapGridGetMetatileBehaviorAt(x, y))) - { - s8 pan = (Random() % 88) + 212; - s8 volume = (Random() % 30) + 50; - PlayCry2(sAmbientCrySpecies, pan, volume, 1); - } + if (sIsAmbientCryWaterMon == TRUE + && !MetatileBehavior_IsSurfableWaterOrUnderwater(MapGridGetMetatileBehaviorAt(x, y))) + return; + pan = (Random() % 88) + 212; + volume = (Random() % 30) + 50; + PlayCry2(sAmbientCrySpecies, pan, volume, 1); } void UpdateAmbientCry(s16 *state, u16 *delayCounter) @@ -1152,6 +1158,7 @@ void OverworldBasic(void) sub_8072EDC(); } +// This CB2 is used when starting void CB2_OverworldBasic(void) { OverworldBasic(); @@ -1179,7 +1186,7 @@ void sub_80543DC(u16 (*a1)(u32)) void sub_80543E8(void) { - if (gFieldCallback) + if (gFieldCallback != NULL) gFieldCallback(); else mapldr_default(); @@ -1980,27 +1987,27 @@ void sub_8055280(u16 a1) u16 sub_80552B0(u32 a1) { - if (gMain.heldKeys & 0x40) + if (gMain.heldKeys & DPAD_UP) { return 19; } - else if (gMain.heldKeys & 0x80) + else if (gMain.heldKeys & DPAD_DOWN) { return 18; } - else if (gMain.heldKeys & 0x20) + else if (gMain.heldKeys & DPAD_LEFT) { return 20; } - else if (gMain.heldKeys & 0x10) + else if (gMain.heldKeys & DPAD_RIGHT) { return 21; } - else if (gMain.newKeys & 8) + else if (gMain.newKeys & START_BUTTON) { return 24; } - else if (gMain.newKeys & 1) + else if (gMain.newKeys & A_BUTTON) { return 25; } diff --git a/src/scrcmd.c b/src/scrcmd.c index 4f6e7e51b..f45e57e02 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -110,6 +110,7 @@ bool8 ScrCmd_end(struct ScriptContext *ctx) bool8 ScrCmd_jumpasm(struct ScriptContext *ctx) { bool8 (*addr)(void) = (bool8 (*)(void))ScriptReadWord(ctx); + SetupNativeScript(ctx, addr); return TRUE; } @@ -117,6 +118,7 @@ bool8 ScrCmd_jumpasm(struct ScriptContext *ctx) bool8 ScrCmd_special(struct ScriptContext *ctx) { u16 index = ScriptReadHalfword(ctx); + gSpecials[index](); return FALSE; } @@ -124,6 +126,7 @@ bool8 ScrCmd_special(struct ScriptContext *ctx) bool8 ScrCmd_specialval(struct ScriptContext *ctx) { u16 *var = GetVarPointer(ScriptReadHalfword(ctx)); + *var = gSpecials[ScriptReadHalfword(ctx)](); return FALSE; } @@ -131,6 +134,7 @@ bool8 ScrCmd_specialval(struct ScriptContext *ctx) bool8 ScrCmd_callasm(struct ScriptContext *ctx) { NativeFunc func = (NativeFunc)ScriptReadWord(ctx); + func(); return FALSE; } @@ -144,6 +148,7 @@ bool8 ScrCmd_waitstate(struct ScriptContext *ctx) bool8 ScrCmd_jump(struct ScriptContext *ctx) { u8 *ptr = (u8 *)ScriptReadWord(ctx); + ScriptJump(ctx, ptr); return FALSE; } @@ -156,8 +161,8 @@ bool8 ScrCmd_return(struct ScriptContext *ctx) bool8 ScrCmd_call(struct ScriptContext *ctx) { - u8 *ptr = (u8 *)ScriptReadWord(ctx); + ScriptCall(ctx, ptr); return FALSE; } @@ -166,6 +171,7 @@ bool8 ScrCmd_jumpif(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 *ptr = (u8 *)ScriptReadWord(ctx); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptJump(ctx, ptr); return FALSE; @@ -175,6 +181,7 @@ bool8 ScrCmd_callif(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 *ptr = (u8 *)ScriptReadWord(ctx); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptCall(ctx, ptr); return FALSE; @@ -184,6 +191,7 @@ bool8 ScrCmd_setvaddress(struct ScriptContext *ctx) { u32 addr1 = (u32)ctx->scriptPtr - 1; u32 addr2 = ScriptReadWord(ctx); + gUnknown_0202E8B0 = addr2 - addr1; return FALSE; } @@ -191,6 +199,7 @@ bool8 ScrCmd_setvaddress(struct ScriptContext *ctx) bool8 ScrCmd_vjump(struct ScriptContext *ctx) { u32 addr = ScriptReadWord(ctx); + ScriptJump(ctx, (u8 *)(addr - gUnknown_0202E8B0)); return FALSE; } @@ -198,6 +207,7 @@ bool8 ScrCmd_vjump(struct ScriptContext *ctx) bool8 ScrCmd_vcall(struct ScriptContext *ctx) { u32 addr = ScriptReadWord(ctx); + ScriptCall(ctx, (u8 *)(addr - gUnknown_0202E8B0)); return FALSE; } @@ -206,6 +216,7 @@ bool8 ScrCmd_if5(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptJump(ctx, ptr); return FALSE; @@ -215,6 +226,7 @@ bool8 ScrCmd_if6(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptCall(ctx, ptr); return FALSE; @@ -224,6 +236,7 @@ bool8 ScrCmd_jumpstd(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); u8 **ptr = &gStdScripts[index]; + if (ptr < gStdScripts_End) ScriptJump(ctx, *ptr); return FALSE; @@ -233,6 +246,7 @@ bool8 ScrCmd_callstd(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); u8 **ptr = &gStdScripts[index]; + if (ptr < gStdScripts_End) ScriptCall(ctx, *ptr); return FALSE; @@ -242,6 +256,7 @@ bool8 ScrCmd_jumpstdif(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 index = ScriptReadByte(ctx); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) { u8 **ptr = &gStdScripts[index]; @@ -255,6 +270,7 @@ bool8 ScrCmd_callstdif(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 index = ScriptReadByte(ctx); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) { u8 **ptr = &gStdScripts[index]; @@ -280,6 +296,7 @@ bool8 ScrCmd_die(struct ScriptContext *ctx) bool8 ScrCmd_setbyte(struct ScriptContext *ctx) { u8 value = ScriptReadByte(ctx); + SetMysteryEventScriptStatus(value); return FALSE; } @@ -287,6 +304,7 @@ bool8 ScrCmd_setbyte(struct ScriptContext *ctx) bool8 ScrCmd_loadptr(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); + ctx->data[index] = ScriptReadWord(ctx); return FALSE; } @@ -294,6 +312,7 @@ bool8 ScrCmd_loadptr(struct ScriptContext *ctx) bool8 ScrCmd_loadbytefrompointer(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); + ctx->data[index] = *(u8 *)ScriptReadWord(ctx); return FALSE; } @@ -301,6 +320,7 @@ bool8 ScrCmd_loadbytefrompointer(struct ScriptContext *ctx) bool8 ScrCmd_writebytetooffset(struct ScriptContext *ctx) { u8 value = ScriptReadByte(ctx); + *(u8 *)ScriptReadWord(ctx) = value; return FALSE; } @@ -308,6 +328,7 @@ bool8 ScrCmd_writebytetooffset(struct ScriptContext *ctx) bool8 ScrCmd_setbufferbyte(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); + ctx->data[index] = ScriptReadByte(ctx); return FALSE; } @@ -315,6 +336,7 @@ bool8 ScrCmd_setbufferbyte(struct ScriptContext *ctx) bool8 ScrCmd_setptrbyte(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); + *(u8 *)ScriptReadWord(ctx) = ctx->data[index]; return FALSE; } @@ -323,6 +345,7 @@ bool8 ScrCmd_copybuffers(struct ScriptContext *ctx) { u8 destIndex = ScriptReadByte(ctx); u8 srcIndex = ScriptReadByte(ctx); + ctx->data[destIndex] = ctx->data[srcIndex]; return FALSE; } @@ -359,10 +382,8 @@ u8 compare_012(u16 a1, u16 a2) { if (a1 < a2) return 0; - if (a1 == a2) return 1; - return 2; } @@ -370,6 +391,7 @@ bool8 ScrCmd_comparebuffers(struct ScriptContext *ctx) { u8 value1 = ctx->data[ScriptReadByte(ctx)]; u8 value2 = ctx->data[ScriptReadByte(ctx)]; + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } @@ -378,6 +400,7 @@ bool8 ScrCmd_comparebuffertobyte(struct ScriptContext *ctx) { u8 value1 = ctx->data[ScriptReadByte(ctx)]; u8 value2 = ScriptReadByte(ctx); + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } @@ -386,6 +409,7 @@ bool8 ScrCmd_comparebuffertoptrbyte(struct ScriptContext *ctx) { u8 value1 = ctx->data[ScriptReadByte(ctx)]; u8 value2 = *(u8 *)ScriptReadWord(ctx); + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } @@ -394,6 +418,7 @@ bool8 ScrCmd_compareptrbytetobuffer(struct ScriptContext *ctx) { u8 value1 = *(u8 *)ScriptReadWord(ctx); u8 value2 = ctx->data[ScriptReadByte(ctx)]; + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } @@ -402,6 +427,7 @@ bool8 ScrCmd_compareptrbytetobyte(struct ScriptContext *ctx) { u8 value1 = *(u8 *)ScriptReadWord(ctx); u8 value2 = ScriptReadByte(ctx); + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } @@ -410,6 +436,7 @@ bool8 ScrCmd_compareptrbytes(struct ScriptContext *ctx) { u8 value1 = *(u8 *)ScriptReadWord(ctx); u8 value2 = *(u8 *)ScriptReadWord(ctx); + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } @@ -418,6 +445,7 @@ bool8 ScrCmd_compare(struct ScriptContext *ctx) { u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx)); u16 value2 = ScriptReadHalfword(ctx); + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } @@ -426,6 +454,7 @@ bool8 ScrCmd_comparevars(struct ScriptContext *ctx) { u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); + ctx->comparisonResult = compare_012(*ptr1, *ptr2); return FALSE; } @@ -447,6 +476,7 @@ bool8 ScrCmd_subvar(struct ScriptContext *ctx) bool8 ScrCmd_random(struct ScriptContext *ctx) { u16 max = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = Random() % max; return FALSE; } @@ -455,6 +485,7 @@ bool8 ScrCmd_additem(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = AddBagItem(itemId, (u8)quantity); return FALSE; } @@ -463,6 +494,7 @@ bool8 ScrCmd_removeitem(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = RemoveBagItem(itemId, (u8)quantity); return FALSE; } @@ -471,6 +503,7 @@ bool8 ScrCmd_checkitemspace(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = CheckBagHasSpace(itemId, (u8)quantity); return FALSE; } @@ -479,6 +512,7 @@ bool8 ScrCmd_checkitem(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = CheckBagHasItem(itemId, (u8)quantity); return FALSE; } @@ -486,6 +520,7 @@ bool8 ScrCmd_checkitem(struct ScriptContext *ctx) bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = GetPocketByItemId(itemId); return FALSE; } @@ -494,6 +529,7 @@ bool8 ScrCmd_addpcitem(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u16 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = AddPCItem(itemId, quantity); return FALSE; } @@ -502,6 +538,7 @@ bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u16 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = CheckPCHasItem(itemId, quantity); return FALSE; } @@ -509,6 +546,7 @@ bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx) bool8 ScrCmd_adddecor(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = IsThereStorageSpaceForDecoration(decorId); return FALSE; } @@ -516,6 +554,7 @@ bool8 ScrCmd_adddecor(struct ScriptContext *ctx) bool8 ScrCmd_removedecor(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = sub_81340A8(decorId); return FALSE; } @@ -523,6 +562,7 @@ bool8 ScrCmd_removedecor(struct ScriptContext *ctx) bool8 ScrCmd_checkdecor(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = sub_8134074(decorId); return FALSE; } @@ -530,6 +570,7 @@ bool8 ScrCmd_checkdecor(struct ScriptContext *ctx) bool8 ScrCmd_testdecor(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = sub_8133FE4(decorId); return FALSE; } @@ -568,6 +609,7 @@ bool8 ScrCmd_lighten(struct ScriptContext *ctx) bool8 ScrCmd_darken(struct ScriptContext *ctx) { u16 flashLevel = VarGet(ScriptReadHalfword(ctx)); + Overworld_SetFlashLevel(flashLevel); return FALSE; } @@ -591,6 +633,7 @@ bool8 ScrCmd_fadescreendelay(struct ScriptContext *ctx) { u8 duration = ScriptReadByte(ctx); u8 delay = ScriptReadByte(ctx); + fade_screen(duration, delay); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; @@ -617,6 +660,7 @@ bool8 ScrCmd_compareflags(struct ScriptContext *ctx) { u8 hour = VarGet(ScriptReadHalfword(ctx)); u8 minute = VarGet(ScriptReadHalfword(ctx)); + RtcInitLocalTimeOffset(hour, minute); return FALSE; } @@ -638,8 +682,9 @@ bool8 ScrCmd_resetvars(struct ScriptContext *ctx) bool8 ScrCmd_setweather(struct ScriptContext *ctx) { - u16 value = VarGet(ScriptReadHalfword(ctx)); - SetSav1Weather(value); + u16 weather = VarGet(ScriptReadHalfword(ctx)); + + SetSav1Weather(weather); return FALSE; } @@ -664,6 +709,7 @@ bool8 ScrCmd_tileeffect(struct ScriptContext *ctx) bool8 ScrCmd_setmapfooter(struct ScriptContext *ctx) { u16 value = VarGet(ScriptReadHalfword(ctx)); + sub_8053D14(value); return FALSE; } @@ -718,12 +764,10 @@ bool8 ScrCmd_warphole(struct ScriptContext *ctx) u16 y; PlayerGetDestCoords(&x, &y); - if (mapGroup == 0xFF && mapNum == 0xFF) sub_8053720(x - 7, y - 7); else Overworld_SetWarpDestination(mapGroup, mapNum, -1, x - 7, y - 7); - sp13F_fall_to_last_warp(); player_avatar_init_params_reset(); return TRUE; @@ -860,21 +904,22 @@ bool8 ScrCmd_playmusic(struct ScriptContext *ctx) { u16 songId = ScriptReadHalfword(ctx); bool8 val = ScriptReadByte(ctx); + if (val == TRUE) - sav1_set_battle_music_maybe(songId); + Overworld_SetSavedMusic(songId); PlayNewMapMusic(songId); return FALSE; } bool8 ScrCmd_playmusicbattle(struct ScriptContext *ctx) { - sav1_set_battle_music_maybe(ScriptReadHalfword(ctx)); + Overworld_SetSavedMusic(ScriptReadHalfword(ctx)); return FALSE; } bool8 ScrCmd_fadedefault(struct ScriptContext *ctx) { - sub_8053F84(); + Overworld_ChangeMusicToDefault(); return FALSE; } @@ -887,6 +932,7 @@ bool8 ScrCmd_fademusic(struct ScriptContext *ctx) bool8 ScrCmd_fadeout(struct ScriptContext *ctx) { u8 speed = ScriptReadByte(ctx); + if (speed != 0) FadeOutBGMTemporarily(4 * speed); else @@ -898,6 +944,7 @@ bool8 ScrCmd_fadeout(struct ScriptContext *ctx) bool8 ScrCmd_fadein(struct ScriptContext *ctx) { u8 speed = ScriptReadByte(ctx); + if (speed != 0) FadeInBGM(4 * speed); else @@ -963,6 +1010,7 @@ bool8 ScrCmd_waitmovexy(struct ScriptContext *ctx) bool8 ScrCmd_disappear(struct ScriptContext *ctx) { u16 objectId = VarGet(ScriptReadHalfword(ctx)); + RemoveFieldObjectByLocalIdAndMap(objectId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); return FALSE; } @@ -972,6 +1020,7 @@ bool8 ScrCmd_disappearxy(struct ScriptContext *ctx) u16 objectId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); + RemoveFieldObjectByLocalIdAndMap(objectId, mapNum, mapGroup); return FALSE; } @@ -979,6 +1028,7 @@ bool8 ScrCmd_disappearxy(struct ScriptContext *ctx) bool8 ScrCmd_reappear(struct ScriptContext *ctx) { u16 objectId = VarGet(ScriptReadHalfword(ctx)); + show_sprite(objectId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); return FALSE; } @@ -988,69 +1038,77 @@ bool8 ScrCmd_reappearxy(struct ScriptContext *ctx) u16 objectId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); + show_sprite(objectId, mapNum, mapGroup); return FALSE; } bool8 ScrCmd_movesprite(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u16 v2 = VarGet(ScriptReadHalfword(ctx)); - u32 v3 = VarGet(ScriptReadHalfword(ctx)); - sub_805C0F8(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, v2, v3); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + sub_805C0F8(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); return FALSE; } bool8 ScrCmd_movespriteperm(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u16 v2 = VarGet(ScriptReadHalfword(ctx)); - u32 v3 = VarGet(ScriptReadHalfword(ctx)); - Overworld_SaveMapObjCoords(v1, v2, v3); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetMapObjTemplateCoords(localId, x, y); return FALSE; } bool8 ScrCmd_moveoffscreen(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - sub_805C78C(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + + sub_805C78C(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); return FALSE; } bool8 ScrCmd_spritevisible(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - npc_by_local_id_and_map_set_field_1_bit_x20(v1, v3, v2, 0); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + + npc_by_local_id_and_map_set_field_1_bit_x20(localId, mapNum, mapGroup, 0); return FALSE; } bool8 ScrCmd_spriteinvisible(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - npc_by_local_id_and_map_set_field_1_bit_x20(v1, v3, v2, 1); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + + npc_by_local_id_and_map_set_field_1_bit_x20(localId, mapNum, mapGroup, 1); return FALSE; } bool8 ScrCmd_spritelevelup(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 v4 = ScriptReadByte(ctx); - sub_805BCF0(v1, v3, v2, v4 + 83); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 priority = ScriptReadByte(ctx); + + sub_805BCF0(localId, mapNum, mapGroup, priority + 83); return FALSE; } bool8 ScrCmd_restorespritelevel(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - sub_805BD48(v1, v3, v2); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + + sub_805BD48(localId, mapNum, mapGroup); return FALSE; } @@ -1068,35 +1126,39 @@ bool8 ScrCmd_spriteface(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 direction = ScriptReadByte(ctx); + FieldObjectTurnByLocalIdAndMap(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, direction); return FALSE; } bool8 ScrCmd_spritebehave(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - Overworld_SaveMapObjMovementType(v1, v2); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 movementType = ScriptReadByte(ctx); + + Overworld_SetMapObjTemplateMovementType(localId, movementType); return FALSE; } bool8 ScrCmd_createvsprite(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); + u8 graphicsId = ScriptReadByte(ctx); u8 v2 = ScriptReadByte(ctx); - u16 v3 = VarGet(ScriptReadHalfword(ctx)); - u32 v4 = VarGet(ScriptReadHalfword(ctx)); - u8 v5 = ScriptReadByte(ctx); - u8 v6 = ScriptReadByte(ctx); - sub_805B410(v1, v2, v3, v4, v5, v6); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u32 y = VarGet(ScriptReadHalfword(ctx)); + u8 elevation = ScriptReadByte(ctx); + u8 direction = ScriptReadByte(ctx); + + sub_805B410(graphicsId, v2, x, y, elevation, direction); return FALSE; } bool8 ScrCmd_vspriteface(struct ScriptContext *ctx) { u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - sub_8064990(v1, v2); + u8 direction = ScriptReadByte(ctx); + + sub_8064990(v1, direction); return FALSE; } @@ -1132,7 +1194,6 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx) ScriptFreezeMapObjects(); SetupNativeScript(ctx, sub_8064CFC); } - return TRUE; } } @@ -1166,7 +1227,8 @@ bool8 ScrCmd_release(struct ScriptContext *ctx) bool8 ScrCmd_message(struct ScriptContext *ctx) { u8 *msg = (u8 *)ScriptReadWord(ctx); - if (!msg) + + if (msg == NULL) msg = (u8 *)ctx->data[0]; ShowFieldMessage(msg); return FALSE; @@ -1175,7 +1237,8 @@ bool8 ScrCmd_message(struct ScriptContext *ctx) bool8 ScrCmd_message2(struct ScriptContext *ctx) { u8 *msg = (u8 *)ScriptReadWord(ctx); - if (!msg) + + if (msg == NULL) msg = (u8 *)ctx->data[0]; ShowFieldAutoScrollMessage(msg); return FALSE; @@ -1193,7 +1256,7 @@ bool8 ScrCmd_closebutton(struct ScriptContext *ctx) return FALSE; } -bool8 WaitForAorBPress(void) +static bool8 WaitForAorBPress(void) { if (gMain.newKeys & A_BUTTON) return TRUE; @@ -1212,6 +1275,7 @@ bool8 ScrCmd_yesnobox(struct ScriptContext *ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); + if (ScriptMenu_YesNo(left, top) == TRUE) { ScriptContext1_Stop(); @@ -1229,6 +1293,7 @@ bool8 ScrCmd_multichoice(struct ScriptContext *ctx) u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); u8 ignoreBPress = ScriptReadByte(ctx); + if (ScriptMenu_Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) { ScriptContext1_Stop(); @@ -1247,6 +1312,7 @@ bool8 ScrCmd_multichoicedef(struct ScriptContext *ctx) u8 multichoiceId = ScriptReadByte(ctx); u8 defaultChoice = ScriptReadByte(ctx); u8 ignoreBPress = ScriptReadByte(ctx); + if (ScriptMenu_MultichoiceWithDefault(left, top, multichoiceId, ignoreBPress, defaultChoice) == TRUE) { ScriptContext1_Stop(); @@ -1264,6 +1330,7 @@ bool8 ScrCmd_showbox(struct ScriptContext *ctx) u8 top = ScriptReadByte(ctx); u8 right = ScriptReadByte(ctx); u8 bottom = ScriptReadByte(ctx); + MenuDrawTextWindow(left, top, right, bottom); return FALSE; } @@ -1275,6 +1342,7 @@ bool8 ScrCmd_multichoicerow(struct ScriptContext *ctx) u8 multichoiceId = ScriptReadByte(ctx); u8 numColumns = ScriptReadByte(ctx); u8 ignoreBPress = ScriptReadByte(ctx); + if (ScriptMenu_MultichoiceGrid(left, top, multichoiceId, ignoreBPress, numColumns) == TRUE) { ScriptContext1_Stop(); @@ -1292,6 +1360,7 @@ bool8 ScrCmd_hidebox(struct ScriptContext *ctx) u8 top = ScriptReadByte(ctx); u8 right = ScriptReadByte(ctx); u8 bottom = ScriptReadByte(ctx); + MenuZeroFillWindowRect(left, top, right, bottom); return FALSE; } @@ -1303,6 +1372,7 @@ bool8 ScrCmd_clearbox(struct ScriptContext *ctx) u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); u8 ignoreBPress = ScriptReadByte(ctx); + if (Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) { ScriptContext1_Stop(); @@ -1319,6 +1389,7 @@ bool8 ScrCmd_showpokepic(struct ScriptContext *ctx) u16 species = VarGet(ScriptReadHalfword(ctx)); u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); + ScriptMenu_ShowPokemonPic(species, x, y); return FALSE; } @@ -1336,6 +1407,7 @@ bool8 ScrCmd_hidepokepic(struct ScriptContext *ctx) bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx) { u8 v1 = ScriptReadByte(ctx); + if (v1) sub_8106630(v1); ShowContestWinner(); @@ -1346,6 +1418,7 @@ bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx) bool8 ScrCmd_braillemsg(struct ScriptContext *ctx) { u8 *ptr = (u8 *)ScriptReadWord(ctx); + u8 v2 = ptr[0]; u8 v3 = ptr[1]; u8 v4 = ptr[2]; @@ -1361,6 +1434,7 @@ bool8 ScrCmd_braillemsg(struct ScriptContext *ctx) bool8 ScrCmd_vtext(struct ScriptContext *ctx) { u32 v1 = ScriptReadWord(ctx); + ShowFieldMessage((u8 *)(v1 - gUnknown_0202E8B0)); return FALSE; } @@ -1369,6 +1443,7 @@ bool8 ScrCmd_bufferpoke(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 species = VarGet(ScriptReadHalfword(ctx)); + StringCopy(sScriptStringVars[stringVarIndex], gSpeciesNames[species]); return FALSE; } @@ -1376,6 +1451,7 @@ bool8 ScrCmd_bufferpoke(struct ScriptContext *ctx) bool8 ScrCmd_bufferfirstpoke(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); + u8 *dest = sScriptStringVars[stringVarIndex]; u8 partyIndex = GetLeadMonIndex(); u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); @@ -1387,6 +1463,7 @@ bool8 ScrCmd_bufferpartypoke(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); + GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, sScriptStringVars[stringVarIndex]); StringGetEnd10(sScriptStringVars[stringVarIndex]); return FALSE; @@ -1396,6 +1473,7 @@ bool8 ScrCmd_bufferitem(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 itemId = VarGet(ScriptReadHalfword(ctx)); + CopyItemName(itemId, sScriptStringVars[stringVarIndex]); return FALSE; } @@ -1404,6 +1482,7 @@ bool8 ScrCmd_bufferdecor(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 decorId = VarGet(ScriptReadHalfword(ctx)); + StringCopy(sScriptStringVars[stringVarIndex], gDecorations[decorId].name); return FALSE; } @@ -1412,6 +1491,7 @@ bool8 ScrCmd_bufferattack(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 moveId = VarGet(ScriptReadHalfword(ctx)); + StringCopy(sScriptStringVars[stringVarIndex], gMoveNames[moveId]); return FALSE; } @@ -1421,6 +1501,7 @@ bool8 ScrCmd_buffernum(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 v1 = VarGet(ScriptReadHalfword(ctx)); u8 v2 = sub_80BF0B8(v1); + ConvertIntToDecimalStringN(sScriptStringVars[stringVarIndex], v1, 0, v2); return FALSE; } @@ -1429,6 +1510,7 @@ bool8 ScrCmd_bufferstd(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 index = VarGet(ScriptReadHalfword(ctx)); + StringCopy(sScriptStringVars[stringVarIndex], gUnknown_083CE048[index]); return FALSE; } @@ -1437,6 +1519,7 @@ bool8 ScrCmd_buffertext(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u8 *text = (u8 *)ScriptReadWord(ctx); + StringCopy(sScriptStringVars[stringVarIndex], text); return FALSE; } @@ -1444,6 +1527,7 @@ bool8 ScrCmd_buffertext(struct ScriptContext *ctx) bool8 ScrCmd_vloadptr(struct ScriptContext *ctx) { u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); + StringExpandPlaceholders(gStringVar4, ptr); return FALSE; } @@ -1452,6 +1536,7 @@ bool8 ScrCmd_vbuffer(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u32 addr = ScriptReadWord(ctx); + u8 *src = (u8 *)(addr - gUnknown_0202E8B0); u8 *dest = sScriptStringVars[stringVarIndex]; StringCopy(dest, src); @@ -1466,6 +1551,7 @@ bool8 ScrCmd_givepokemon(struct ScriptContext *ctx) u32 unkParam1 = ScriptReadWord(ctx); u32 unkParam2 = ScriptReadWord(ctx); u8 unkParam3 = ScriptReadByte(ctx); + gScriptResult = ScriptGiveMon(species, level, item, unkParam1, unkParam2, unkParam3); return FALSE; } @@ -1473,6 +1559,7 @@ bool8 ScrCmd_givepokemon(struct ScriptContext *ctx) bool8 ScrCmd_giveegg(struct ScriptContext *ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = ScriptGiveEgg(species); return FALSE; } @@ -1482,6 +1569,7 @@ bool8 ScrCmd_setpokemove(struct ScriptContext *ctx) u8 partyIndex = ScriptReadByte(ctx); u8 slot = ScriptReadByte(ctx); u16 move = ScriptReadHalfword(ctx); + ScriptSetMonMoveSlot(partyIndex, move, slot); return FALSE; } @@ -1490,6 +1578,7 @@ bool8 ScrCmd_checkattack(struct ScriptContext *ctx) { u8 i; u16 moveId = ScriptReadHalfword(ctx); + gScriptResult = 6; for (i = 0; i < 6; i++) { @@ -1511,6 +1600,7 @@ bool8 ScrCmd_givemoney(struct ScriptContext *ctx) { u32 amount = ScriptReadWord(ctx); u8 ignore = ScriptReadByte(ctx); + if (!ignore) AddMoney(&gSaveBlock1.money, amount); return FALSE; @@ -1520,6 +1610,7 @@ bool8 ScrCmd_paymoney(struct ScriptContext *ctx) { u32 amount = ScriptReadWord(ctx); u8 ignore = ScriptReadByte(ctx); + if (!ignore) RemoveMoney(&gSaveBlock1.money, amount); return FALSE; @@ -1529,6 +1620,7 @@ bool8 ScrCmd_checkmoney(struct ScriptContext *ctx) { u32 amount = ScriptReadWord(ctx); u8 ignore = ScriptReadByte(ctx); + if (!ignore) gScriptResult = IsEnoughMoney(gSaveBlock1.money, amount); return FALSE; @@ -1539,6 +1631,7 @@ bool8 ScrCmd_showmoney(struct ScriptContext *ctx) u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); u8 ignore = ScriptReadByte(ctx); + if (!ignore) OpenMoneyWindow(gSaveBlock1.money, x, y); return FALSE; @@ -1548,41 +1641,46 @@ bool8 ScrCmd_hidemoney(struct ScriptContext *ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); + CloseMoneyWindow(x, y); return FALSE; } bool8 ScrCmd_updatemoney(struct ScriptContext *ctx) { - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); u8 ignore = ScriptReadByte(ctx); + if (!ignore) - UpdateMoneyWindow(gSaveBlock1.money, v2, v3); + UpdateMoneyWindow(gSaveBlock1.money, x, y); return FALSE; } bool8 ScrCmd_showcoins(struct ScriptContext *ctx) { - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - ShowCoinsWindow(gSaveBlock1.coins, v2, v3); + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + + ShowCoinsWindow(gSaveBlock1.coins, x, y); return FALSE; } bool8 ScrCmd_hidecoins(struct ScriptContext *ctx) { - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - HideCoinsWindow(v2, v3); + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + + HideCoinsWindow(x, y); return FALSE; } bool8 ScrCmd_updatecoins(struct ScriptContext *ctx) { - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - UpdateCoinsWindow(gSaveBlock1.coins, v2, v3); + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + + UpdateCoinsWindow(gSaveBlock1.coins, x, y); return FALSE; } @@ -1613,6 +1711,7 @@ bool8 ScrCmd_endtrainerbattle2(struct ScriptContext *ctx) bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); + ctx->comparisonResult = HasTrainerAlreadyBeenFought(index); return FALSE; } @@ -1620,6 +1719,7 @@ bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx) bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); + trainer_flag_set(index); return FALSE; } @@ -1627,6 +1727,7 @@ bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); + trainer_flag_clear(index); return FALSE; } @@ -1636,6 +1737,7 @@ bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx) u16 species = ScriptReadHalfword(ctx); u8 level = ScriptReadByte(ctx); u16 item = ScriptReadHalfword(ctx); + CreateScriptedWildMon(species, level, item); return FALSE; } @@ -1650,6 +1752,7 @@ bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx) bool8 ScrCmd_pokemart(struct ScriptContext *ctx) { void *ptr = (void *)ScriptReadWord(ctx); + CreatePokemartMenu(ptr); ScriptContext1_Stop(); return TRUE; @@ -1658,6 +1761,7 @@ bool8 ScrCmd_pokemart(struct ScriptContext *ctx) bool8 ScrCmd_pokemartdecor(struct ScriptContext *ctx) { void *ptr = (void *)ScriptReadWord(ctx); + CreateDecorationShop1Menu(ptr); ScriptContext1_Stop(); return TRUE; @@ -1666,6 +1770,7 @@ bool8 ScrCmd_pokemartdecor(struct ScriptContext *ctx) bool8 ScrCmd_pokemartbp(struct ScriptContext *ctx) { void *ptr = (void *)ScriptReadWord(ctx); + CreateDecorationShop2Menu(ptr); ScriptContext1_Stop(); return TRUE; @@ -1674,6 +1779,7 @@ bool8 ScrCmd_pokemartbp(struct ScriptContext *ctx) bool8 ScrCmd_pokecasino(struct ScriptContext *ctx) { u8 v2 = VarGet(ScriptReadHalfword(ctx)); + PlaySlotMachine(v2, c2_exit_to_overworld_1_continue_scripts_restart_music); ScriptContext1_Stop(); return TRUE; @@ -1684,6 +1790,7 @@ bool8 ScrCmd_event_8a(struct ScriptContext *ctx) u8 treeId = ScriptReadByte(ctx); u8 berry = ScriptReadByte(ctx); u8 growthStage = ScriptReadByte(ctx); + if (berry == 0) PlantBerryTree(treeId, 0, growthStage, FALSE); else @@ -1694,6 +1801,7 @@ bool8 ScrCmd_event_8a(struct ScriptContext *ctx) bool8 ScrCmd_event_96(struct ScriptContext *ctx) { u16 value = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = GetPriceReduction(value); return FALSE; } @@ -1729,6 +1837,7 @@ bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx) bool8 ScrCmd_doanimation(struct ScriptContext *ctx) { u16 effectId = VarGet(ScriptReadHalfword(ctx)); + sFieldEffectScriptId = effectId; FieldEffectStart(sFieldEffectScriptId); return FALSE; @@ -1737,6 +1846,7 @@ bool8 ScrCmd_doanimation(struct ScriptContext *ctx) bool8 ScrCmd_setanimation(struct ScriptContext *ctx) { u8 argNum = ScriptReadByte(ctx); + gFieldEffectArguments[argNum] = (s16)VarGet(ScriptReadHalfword(ctx)); return FALSE; } @@ -1759,6 +1869,7 @@ bool8 ScrCmd_checkanimation(struct ScriptContext *ctx) bool8 ScrCmd_sethealplace(struct ScriptContext *ctx) { u16 healLocationId = VarGet(ScriptReadHalfword(ctx)); + Overworld_SetHealLocationWarp(healLocationId); return FALSE; } @@ -1773,6 +1884,7 @@ bool8 ScrCmd_pokecry(struct ScriptContext *ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); u16 mode = VarGet(ScriptReadHalfword(ctx)); + PlayCry5(species, mode); return FALSE; } @@ -1789,6 +1901,7 @@ bool8 ScrCmd_setmaptile(struct ScriptContext *ctx) u16 y = VarGet(ScriptReadHalfword(ctx)); u16 tileId = VarGet(ScriptReadHalfword(ctx)); u16 v8 = VarGet(ScriptReadHalfword(ctx)); + x += 7; y += 7; if (!v8) @@ -1802,6 +1915,7 @@ bool8 ScrCmd_setdooropened(struct ScriptContext *ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; y += 7; PlaySE(GetDoorSoundEffect(x, y)); @@ -1813,6 +1927,7 @@ bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; y += 7; FieldAnimateDoorClose(x, y); @@ -1837,6 +1952,7 @@ bool8 ScrCmd_setdooropened2(struct ScriptContext *ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; y += 7; FieldSetDoorOpened(x, y); @@ -1847,6 +1963,7 @@ bool8 ScrCmd_setdoorclosed2(struct ScriptContext *ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; y += 7; FieldSetDoorClosed(x, y); @@ -1859,6 +1976,7 @@ bool8 ScrCmd_event_b1(struct ScriptContext *ctx) u16 v5 = VarGet(ScriptReadHalfword(ctx)); u16 v7 = VarGet(ScriptReadHalfword(ctx)); u16 v9 = VarGet(ScriptReadHalfword(ctx)); + ScriptAddElevatorMenuItem(v3, v5, v7, v9); return FALSE; } @@ -1880,21 +1998,21 @@ bool8 ScrCmd_checkcoins(struct ScriptContext *ctx) bool8 ScrCmd_givecoins(struct ScriptContext *ctx) { u16 coins = VarGet(ScriptReadHalfword(ctx)); + if (GiveCoins(coins) == TRUE) gScriptResult = 0; else gScriptResult = 1; - return FALSE; } bool8 ScrCmd_removecoins(struct ScriptContext *ctx) { u16 coins = VarGet(ScriptReadHalfword(ctx)); + if (TakeCoins(coins) == TRUE) gScriptResult = 0; else gScriptResult = 1; - return FALSE; } diff --git a/src/sound.c b/src/sound.c index 91f5e06a3..a6a61c0b5 100644 --- a/src/sound.c +++ b/src/sound.c @@ -81,8 +81,6 @@ void MapMusicMain(void) PlayBGM(sCurrentMapMusic); break; case 2: - case 3: - case 4: break; case 5: if (IsBGMStopped()) -- cgit v1.2.3 From 1e2601a0287fdacfb8f0d680fbe82a274414ea65 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 24 Sep 2017 17:10:51 -0500 Subject: more script command renaming --- src/event_data.c | 4 +--- src/scrcmd.c | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/event_data.c b/src/event_data.c index ee475343f..43d49c417 100644 --- a/src/event_data.c +++ b/src/event_data.c @@ -114,10 +114,8 @@ u16 *GetVarPointer(u16 id) { if (id < 0x4000) return NULL; - - if ((s16)id >= 0) + if (id < 0x8000) return &gSaveBlock1.vars[id - 0x4000]; - return gSpecialVars[id - 0x8000]; } diff --git a/src/scrcmd.c b/src/scrcmd.c index f45e57e02..d44fa53e2 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -387,6 +387,7 @@ u8 compare_012(u16 a1, u16 a2) return 2; } +// comparelocaltolocal bool8 ScrCmd_comparebuffers(struct ScriptContext *ctx) { u8 value1 = ctx->data[ScriptReadByte(ctx)]; @@ -396,6 +397,7 @@ bool8 ScrCmd_comparebuffers(struct ScriptContext *ctx) return FALSE; } +// comparelocaltoimm bool8 ScrCmd_comparebuffertobyte(struct ScriptContext *ctx) { u8 value1 = ctx->data[ScriptReadByte(ctx)]; -- cgit v1.2.3 From b4ba35a54c0f6204e34d2814351162c79ea4c0ba Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Tue, 26 Sep 2017 14:33:52 -0500 Subject: more command renaming --- src/scrcmd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/scrcmd.c b/src/scrcmd.c index d44fa53e2..233f04f37 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1011,9 +1011,9 @@ bool8 ScrCmd_waitmovexy(struct ScriptContext *ctx) bool8 ScrCmd_disappear(struct ScriptContext *ctx) { - u16 objectId = VarGet(ScriptReadHalfword(ctx)); + u16 localId = VarGet(ScriptReadHalfword(ctx)); - RemoveFieldObjectByLocalIdAndMap(objectId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + RemoveFieldObjectByLocalIdAndMap(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); return FALSE; } -- cgit v1.2.3 From e2f293d771fe6a5ea8ae3e272db880d048a1e99b Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 30 Sep 2017 16:13:50 -0500 Subject: name some ScrCmd_ functions --- src/scrcmd.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/scrcmd.c b/src/scrcmd.c index 233f04f37..e4b0f73af 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -91,12 +91,12 @@ static u8 * const sScriptStringVars[] = gStringVar3, }; -bool8 ScrCmd_snop(struct ScriptContext *ctx) +bool8 ScrCmd_nop(struct ScriptContext *ctx) { return FALSE; } -bool8 ScrCmd_snop1(struct ScriptContext *ctx) +bool8 ScrCmd_nop1(struct ScriptContext *ctx) { return FALSE; } @@ -145,7 +145,7 @@ bool8 ScrCmd_waitstate(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_jump(struct ScriptContext *ctx) +bool8 ScrCmd_goto(struct ScriptContext *ctx) { u8 *ptr = (u8 *)ScriptReadWord(ctx); @@ -167,7 +167,7 @@ bool8 ScrCmd_call(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_jumpif(struct ScriptContext *ctx) +bool8 ScrCmd_goto_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 *ptr = (u8 *)ScriptReadWord(ctx); @@ -177,7 +177,7 @@ bool8 ScrCmd_jumpif(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_callif(struct ScriptContext *ctx) +bool8 ScrCmd_call_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 *ptr = (u8 *)ScriptReadWord(ctx); @@ -232,7 +232,7 @@ bool8 ScrCmd_if6(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_jumpstd(struct ScriptContext *ctx) +bool8 ScrCmd_gotostd(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); u8 **ptr = &gStdScripts[index]; -- cgit v1.2.3 From c0c4ab681c4413cf534c7e7e6eb8c56edaf4e7ec Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 30 Sep 2017 16:25:36 -0500 Subject: update --- src/scrcmd.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/scrcmd.c b/src/scrcmd.c index e4b0f73af..df85bdc1c 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -252,7 +252,7 @@ bool8 ScrCmd_callstd(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_jumpstdif(struct ScriptContext *ctx) +bool8 ScrCmd_gotostd_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 index = ScriptReadByte(ctx); @@ -266,7 +266,7 @@ bool8 ScrCmd_jumpstdif(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_callstdif(struct ScriptContext *ctx) +bool8 ScrCmd_callstd_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 index = ScriptReadByte(ctx); @@ -280,20 +280,20 @@ bool8 ScrCmd_callstdif(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_jumpram(struct ScriptContext *ctx) +bool8 ScrCmd_gotoram(struct ScriptContext *ctx) { ScriptJump(ctx, (u8 *)gUnknown_0202E8AC); return FALSE; } -bool8 ScrCmd_die(struct ScriptContext *ctx) +bool8 ScrCmd_killscript(struct ScriptContext *ctx) { ClearRamScript(); StopScript(ctx); return TRUE; } -bool8 ScrCmd_setbyte(struct ScriptContext *ctx) +bool8 ScrCmd_setmestatus(struct ScriptContext *ctx) { u8 value = ScriptReadByte(ctx); @@ -301,7 +301,7 @@ bool8 ScrCmd_setbyte(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_loadptr(struct ScriptContext *ctx) +bool8 ScrCmd_loadword(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); @@ -309,7 +309,7 @@ bool8 ScrCmd_loadptr(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_loadbytefrompointer(struct ScriptContext *ctx) +bool8 ScrCmd_loadbytefromaddr(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); @@ -317,7 +317,7 @@ bool8 ScrCmd_loadbytefrompointer(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_writebytetooffset(struct ScriptContext *ctx) +bool8 ScrCmd_writebytetoaddr(struct ScriptContext *ctx) { u8 value = ScriptReadByte(ctx); @@ -325,7 +325,7 @@ bool8 ScrCmd_writebytetooffset(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_setbufferbyte(struct ScriptContext *ctx) +bool8 ScrCmd_loadbyte(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); @@ -341,7 +341,7 @@ bool8 ScrCmd_setptrbyte(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_copybuffers(struct ScriptContext *ctx) +bool8 ScrCmd_copylocal(struct ScriptContext *ctx) { u8 destIndex = ScriptReadByte(ctx); u8 srcIndex = ScriptReadByte(ctx); -- cgit v1.2.3 From 0f0f7856f135317f98de81675c98aa46564b59ee Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 30 Sep 2017 16:41:50 -0500 Subject: update --- src/scrcmd.c | 96 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 48 insertions(+), 48 deletions(-) (limited to 'src') diff --git a/src/scrcmd.c b/src/scrcmd.c index df85bdc1c..f2a2da881 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -107,7 +107,7 @@ bool8 ScrCmd_end(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_jumpasm(struct ScriptContext *ctx) +bool8 ScrCmd_gotonative(struct ScriptContext *ctx) { bool8 (*addr)(void) = (bool8 (*)(void))ScriptReadWord(ctx); @@ -123,7 +123,7 @@ bool8 ScrCmd_special(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_specialval(struct ScriptContext *ctx) +bool8 ScrCmd_specialvar(struct ScriptContext *ctx) { u16 *var = GetVarPointer(ScriptReadHalfword(ctx)); @@ -131,7 +131,7 @@ bool8 ScrCmd_specialval(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_callasm(struct ScriptContext *ctx) +bool8 ScrCmd_callnative(struct ScriptContext *ctx) { NativeFunc func = (NativeFunc)ScriptReadWord(ctx); @@ -388,7 +388,7 @@ u8 compare_012(u16 a1, u16 a2) } // comparelocaltolocal -bool8 ScrCmd_comparebuffers(struct ScriptContext *ctx) +bool8 ScrCmd_compare_local_to_local(struct ScriptContext *ctx) { u8 value1 = ctx->data[ScriptReadByte(ctx)]; u8 value2 = ctx->data[ScriptReadByte(ctx)]; @@ -398,7 +398,7 @@ bool8 ScrCmd_comparebuffers(struct ScriptContext *ctx) } // comparelocaltoimm -bool8 ScrCmd_comparebuffertobyte(struct ScriptContext *ctx) +bool8 ScrCmd_compare_local_to_imm(struct ScriptContext *ctx) { u8 value1 = ctx->data[ScriptReadByte(ctx)]; u8 value2 = ScriptReadByte(ctx); @@ -407,7 +407,7 @@ bool8 ScrCmd_comparebuffertobyte(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_comparebuffertoptrbyte(struct ScriptContext *ctx) +bool8 ScrCmd_compare_local_to_addr(struct ScriptContext *ctx) { u8 value1 = ctx->data[ScriptReadByte(ctx)]; u8 value2 = *(u8 *)ScriptReadWord(ctx); @@ -416,7 +416,7 @@ bool8 ScrCmd_comparebuffertoptrbyte(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_compareptrbytetobuffer(struct ScriptContext *ctx) +bool8 ScrCmd_compare_addr_to_local(struct ScriptContext *ctx) { u8 value1 = *(u8 *)ScriptReadWord(ctx); u8 value2 = ctx->data[ScriptReadByte(ctx)]; @@ -425,7 +425,7 @@ bool8 ScrCmd_compareptrbytetobuffer(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_compareptrbytetobyte(struct ScriptContext *ctx) +bool8 ScrCmd_compare_addr_to_imm(struct ScriptContext *ctx) { u8 value1 = *(u8 *)ScriptReadWord(ctx); u8 value2 = ScriptReadByte(ctx); @@ -434,7 +434,7 @@ bool8 ScrCmd_compareptrbytetobyte(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_compareptrbytes(struct ScriptContext *ctx) +bool8 ScrCmd_compare_addr_to_addr(struct ScriptContext *ctx) { u8 value1 = *(u8 *)ScriptReadWord(ctx); u8 value2 = *(u8 *)ScriptReadWord(ctx); @@ -443,7 +443,7 @@ bool8 ScrCmd_compareptrbytes(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_compare(struct ScriptContext *ctx) +bool8 ScrCmd_compare_var_to_imm(struct ScriptContext *ctx) { u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx)); u16 value2 = ScriptReadHalfword(ctx); @@ -452,7 +452,7 @@ bool8 ScrCmd_compare(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_comparevars(struct ScriptContext *ctx) +bool8 ScrCmd_compare_var_to_var(struct ScriptContext *ctx) { u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); @@ -569,7 +569,7 @@ bool8 ScrCmd_checkdecor(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_testdecor(struct ScriptContext *ctx) +bool8 ScrCmd_hasdecor(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); @@ -651,14 +651,14 @@ bool8 s28_pause_asm() return FALSE; } -bool8 ScrCmd_pause(struct ScriptContext *ctx) +bool8 ScrCmd_delay(struct ScriptContext *ctx) { sPauseCounter = ScriptReadHalfword(ctx); SetupNativeScript(ctx, s28_pause_asm); return TRUE; } -bool8 ScrCmd_compareflags(struct ScriptContext *ctx) +bool8 ScrCmd_initclock(struct ScriptContext *ctx) { u8 hour = VarGet(ScriptReadHalfword(ctx)); u8 minute = VarGet(ScriptReadHalfword(ctx)); @@ -667,13 +667,13 @@ bool8 ScrCmd_compareflags(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_checkdailyflags(struct ScriptContext *ctx) +bool8 ScrCmd_dodailyevents(struct ScriptContext *ctx) { DoTimeBasedEvents(); return FALSE; } -bool8 ScrCmd_resetvars(struct ScriptContext *ctx) +bool8 ScrCmd_gettime(struct ScriptContext *ctx) { RtcCalcLocalTime(); gSpecialVar_0x8000 = gLocalTime.hours; @@ -730,7 +730,7 @@ bool8 ScrCmd_warp(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_warpmuted(struct ScriptContext *ctx) +bool8 ScrCmd_warpsilent(struct ScriptContext *ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); @@ -744,7 +744,7 @@ bool8 ScrCmd_warpmuted(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_warpwalk(struct ScriptContext *ctx) +bool8 ScrCmd_warpdoor(struct ScriptContext *ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); @@ -789,7 +789,7 @@ bool8 ScrCmd_warpteleport(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_warp3(struct ScriptContext *ctx) +bool8 ScrCmd_setwarp(struct ScriptContext *ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); @@ -801,7 +801,7 @@ bool8 ScrCmd_warp3(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_warpplace(struct ScriptContext *ctx) +bool8 ScrCmd_setdynamicwarp(struct ScriptContext *ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); @@ -813,7 +813,7 @@ bool8 ScrCmd_warpplace(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_warp4(struct ScriptContext *ctx) +bool8 ScrCmd_setdivewarp(struct ScriptContext *ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); @@ -825,7 +825,7 @@ bool8 ScrCmd_warp4(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_warp5(struct ScriptContext *ctx) +bool8 ScrCmd_setholewarp(struct ScriptContext *ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); @@ -865,7 +865,7 @@ bool8 ScrCmd_countpokemon(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_playsfx(struct ScriptContext *ctx) +bool8 ScrCmd_playse(struct ScriptContext *ctx) { PlaySE(ScriptReadHalfword(ctx)); return FALSE; @@ -879,13 +879,13 @@ static bool8 WaitForSoundEffectFinish() return FALSE; } -bool8 ScrCmd_checksound(struct ScriptContext *ctx) +bool8 ScrCmd_waitse(struct ScriptContext *ctx) { SetupNativeScript(ctx, WaitForSoundEffectFinish); return TRUE; } -bool8 ScrCmd_fanfare(struct ScriptContext *ctx) +bool8 ScrCmd_playfanfare(struct ScriptContext *ctx) { PlayFanfare(ScriptReadHalfword(ctx)); return FALSE; @@ -902,7 +902,7 @@ bool8 ScrCmd_waitfanfare(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_playmusic(struct ScriptContext *ctx) +bool8 ScrCmd_playbgm(struct ScriptContext *ctx) { u16 songId = ScriptReadHalfword(ctx); bool8 val = ScriptReadByte(ctx); @@ -913,25 +913,25 @@ bool8 ScrCmd_playmusic(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_playmusicbattle(struct ScriptContext *ctx) +bool8 ScrCmd_savebgm(struct ScriptContext *ctx) { Overworld_SetSavedMusic(ScriptReadHalfword(ctx)); return FALSE; } -bool8 ScrCmd_fadedefault(struct ScriptContext *ctx) +bool8 ScrCmd_fadedefaultbgm(struct ScriptContext *ctx) { Overworld_ChangeMusicToDefault(); return FALSE; } -bool8 ScrCmd_fademusic(struct ScriptContext *ctx) +bool8 ScrCmd_fadenewbgm(struct ScriptContext *ctx) { Overworld_ChangeMusicTo(ScriptReadHalfword(ctx)); return FALSE; } -bool8 ScrCmd_fadeout(struct ScriptContext *ctx) +bool8 ScrCmd_fadeoutbgm(struct ScriptContext *ctx) { u8 speed = ScriptReadByte(ctx); @@ -943,7 +943,7 @@ bool8 ScrCmd_fadeout(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_fadein(struct ScriptContext *ctx) +bool8 ScrCmd_fadeinbgm(struct ScriptContext *ctx) { u8 speed = ScriptReadByte(ctx); @@ -954,7 +954,7 @@ bool8 ScrCmd_fadein(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_move(struct ScriptContext *ctx) +bool8 ScrCmd_applymovement(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); void *movementScript = (void *)ScriptReadWord(ctx); @@ -964,7 +964,7 @@ bool8 ScrCmd_move(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_movecoords(struct ScriptContext *ctx) +bool8 ScrCmd_applymovement_at(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); void *movementScript = (void *)ScriptReadWord(ctx); @@ -981,7 +981,7 @@ static bool8 WaitForMovementFinish(void) return ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapId, sMovingNpcMapBank); } -bool8 ScrCmd_waitmove(struct ScriptContext *ctx) +bool8 ScrCmd_waitmovement(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); @@ -993,7 +993,7 @@ bool8 ScrCmd_waitmove(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_waitmovexy(struct ScriptContext *ctx) +bool8 ScrCmd_waitmovement_at(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 mapBank; @@ -1009,7 +1009,7 @@ bool8 ScrCmd_waitmovexy(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_disappear(struct ScriptContext *ctx) +bool8 ScrCmd_removeobject(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); @@ -1017,7 +1017,7 @@ bool8 ScrCmd_disappear(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_disappearxy(struct ScriptContext *ctx) +bool8 ScrCmd_removeobject_at(struct ScriptContext *ctx) { u16 objectId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); @@ -1027,7 +1027,7 @@ bool8 ScrCmd_disappearxy(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_reappear(struct ScriptContext *ctx) +bool8 ScrCmd_addobject(struct ScriptContext *ctx) { u16 objectId = VarGet(ScriptReadHalfword(ctx)); @@ -1035,7 +1035,7 @@ bool8 ScrCmd_reappear(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_reappearxy(struct ScriptContext *ctx) +bool8 ScrCmd_addobject_at(struct ScriptContext *ctx) { u16 objectId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); @@ -1045,7 +1045,7 @@ bool8 ScrCmd_reappearxy(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_movesprite(struct ScriptContext *ctx) +bool8 ScrCmd_setobjectxy(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u16 x = VarGet(ScriptReadHalfword(ctx)); @@ -1073,7 +1073,7 @@ bool8 ScrCmd_moveoffscreen(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_spritevisible(struct ScriptContext *ctx) +bool8 ScrCmd_showobject(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); @@ -1083,7 +1083,7 @@ bool8 ScrCmd_spritevisible(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_spriteinvisible(struct ScriptContext *ctx) +bool8 ScrCmd_hideobject(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); @@ -1124,7 +1124,7 @@ bool8 ScrCmd_faceplayer(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_spriteface(struct ScriptContext *ctx) +bool8 ScrCmd_turnobject(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 direction = ScriptReadByte(ctx); @@ -1692,19 +1692,19 @@ bool8 ScrCmd_trainerbattle(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_reptrainerbattle(struct ScriptContext *ctx) +bool8 ScrCmd_battlebegin(struct ScriptContext *ctx) { BattleSetup_StartTrainerBattle(); return TRUE; } -bool8 ScrCmd_endtrainerbattle(struct ScriptContext *ctx) +bool8 ScrCmd_ontrainerbattleend(struct ScriptContext *ctx) { ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle(); return FALSE; } -bool8 ScrCmd_endtrainerbattle2(struct ScriptContext *ctx) +bool8 ScrCmd_ontrainerbattleendgoto(struct ScriptContext *ctx) { ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript(); return FALSE; @@ -1718,7 +1718,7 @@ bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) +bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); @@ -1726,7 +1726,7 @@ bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx) +bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); -- cgit v1.2.3 From e926119b726839bc687c503db3680899906aad0d Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 30 Sep 2017 17:04:25 -0500 Subject: update --- src/scrcmd.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/scrcmd.c b/src/scrcmd.c index f2a2da881..35264d5e2 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1055,7 +1055,7 @@ bool8 ScrCmd_setobjectxy(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_movespriteperm(struct ScriptContext *ctx) +bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u16 x = VarGet(ScriptReadHalfword(ctx)); @@ -1065,7 +1065,7 @@ bool8 ScrCmd_movespriteperm(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_moveoffscreen(struct ScriptContext *ctx) +bool8 ScrCmd_moveobjectoffscreen(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); @@ -1133,7 +1133,7 @@ bool8 ScrCmd_turnobject(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_spritebehave(struct ScriptContext *ctx) +bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 movementType = ScriptReadByte(ctx); @@ -1246,13 +1246,13 @@ bool8 ScrCmd_message2(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_waittext(struct ScriptContext *ctx) +bool8 ScrCmd_waitmessage(struct ScriptContext *ctx) { SetupNativeScript(ctx, IsFieldMessageBoxHidden); return TRUE; } -bool8 ScrCmd_closebutton(struct ScriptContext *ctx) +bool8 ScrCmd_closemessage(struct ScriptContext *ctx) { HideFieldMessageBox(); return FALSE; @@ -1307,7 +1307,7 @@ bool8 ScrCmd_multichoice(struct ScriptContext *ctx) } } -bool8 ScrCmd_multichoicedef(struct ScriptContext *ctx) +bool8 ScrCmd_multichoicedefault(struct ScriptContext *ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); @@ -1326,7 +1326,7 @@ bool8 ScrCmd_multichoicedef(struct ScriptContext *ctx) } } -bool8 ScrCmd_showbox(struct ScriptContext *ctx) +bool8 ScrCmd_drawbox(struct ScriptContext *ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); @@ -1337,7 +1337,7 @@ bool8 ScrCmd_showbox(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_multichoicerow(struct ScriptContext *ctx) +bool8 ScrCmd_multichoicegrid(struct ScriptContext *ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); @@ -1356,7 +1356,7 @@ bool8 ScrCmd_multichoicerow(struct ScriptContext *ctx) } } -bool8 ScrCmd_hidebox(struct ScriptContext *ctx) +bool8 ScrCmd_erasebox(struct ScriptContext *ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); @@ -1368,7 +1368,7 @@ bool8 ScrCmd_hidebox(struct ScriptContext *ctx) } // unused -bool8 ScrCmd_clearbox(struct ScriptContext *ctx) +bool8 ScrCmd_drawboxtext(struct ScriptContext *ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); @@ -1386,7 +1386,7 @@ bool8 ScrCmd_clearbox(struct ScriptContext *ctx) } } -bool8 ScrCmd_showpokepic(struct ScriptContext *ctx) +bool8 ScrCmd_drawpokepic(struct ScriptContext *ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); u8 x = ScriptReadByte(ctx); @@ -1396,7 +1396,7 @@ bool8 ScrCmd_showpokepic(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_hidepokepic(struct ScriptContext *ctx) +bool8 ScrCmd_erasepokepic(struct ScriptContext *ctx) { bool8 (*func)(void) = ScriptMenu_GetPicboxWaitFunc(); @@ -1406,7 +1406,7 @@ bool8 ScrCmd_hidepokepic(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx) +bool8 ScrCmd_drawcontestwinner(struct ScriptContext *ctx) { u8 v1 = ScriptReadByte(ctx); @@ -1545,7 +1545,7 @@ bool8 ScrCmd_vbuffer(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_givepokemon(struct ScriptContext *ctx) +bool8 ScrCmd_givepoke(struct ScriptContext *ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); u8 level = ScriptReadByte(ctx); @@ -1576,7 +1576,7 @@ bool8 ScrCmd_setpokemove(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_checkattack(struct ScriptContext *ctx) +bool8 ScrCmd_checkpokemove(struct ScriptContext *ctx) { u8 i; u16 moveId = ScriptReadHalfword(ctx); -- cgit v1.2.3 From bc993e8e2a49aa00e7d1f825bbd8f803d4563922 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 30 Sep 2017 19:50:32 -0500 Subject: clean up sound_check_menu.c --- src/sound_check_menu.c | 2361 ++++++++++++++++++++++-------------------------- 1 file changed, 1080 insertions(+), 1281 deletions(-) (limited to 'src') diff --git a/src/sound_check_menu.c b/src/sound_check_menu.c index d97ae6d86..438d8bd76 100644 --- a/src/sound_check_menu.c +++ b/src/sound_check_menu.c @@ -92,1062 +92,258 @@ void sub_80BB25C(u8); void sub_80BB3B4(u8); void sub_80BB494(void); -static const u8 gDebugText_SoundCheckJap[] = _("サウンドチェック"); -static const u8 gDebugText_BGM[] = _("BGM"); -static const u8 gDebugText_SE[] = _("SE "); -static const u8 gDebugText_ABDesc[] = _("A‥さいせい B‥おわり"); -static const u8 gDebugText_UpDown[] = _("L‥UP R‥DOWN"); -static const u8 gDebugText_DriverTest[] = _("R‥DRIVER-TEST"); +void sub_80BA0A8(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} -// ideally this should be a multi Coords8 struct, but it wont match when its treated like a struct. -static const u8 gUnknown_083D0300[] = { 1, 1, 1, 3, 1, 5, 1, 7, 1, 9, 1, 11, 1, 13, 1, 15, 1, 17 }; +void sub_80BA0C0(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + + if (gUnknown_020387B0 != 0) + { + m4aSoundMain(); + m4aSoundMain(); + m4aSoundMain(); + } +} -static const u8 gDebugText_BBack[] = _("Bぼたんで もどる"); -static const u8 gDebugText_APlay[] = _("Aぼたんで さいせい"); -static const u8 gDebugText_Voice[] = _("VOICE‥‥‥‥"); -static const u8 gDebugText_Volume[] = _("VOLUME‥‥‥"); -static const u8 gDebugText_Panpot[] = _("PANPOT‥‥‥"); -static const u8 gDebugText_Pitch[] = _("PITCH‥‥‥‥"); -static const u8 gDebugText_Length[] = _("LENGTH‥‥‥"); -static const u8 gDebugText_Release[] = _("RELEASE‥‥"); -static const u8 gDebugText_Progress[] = _("PROGRESS‥"); -static const u8 gDebugText_Chorus[] = _("CHORUS‥‥‥"); -static const u8 gDebugText_Priority[] = _("PRIORITY‥"); -static const u8 gDebugText_Playing[] = _("さいせいちゆう‥"); // 再生中 (playing) -static const u8 gDebugText_Reverse[] = _("はんてん‥‥‥‥"); // 反転 (reverse) -static const u8 gDebugText_Stereo[] = _("すてれお‥‥‥‥"); // stereo - -// also ideally should be a MinMax struct, but any attempt to make this into a struct causes it to not match due to the weird multi dim access. -static const int gUnknown_083D039C[16] = +// unused +void CB2_StartSoundCheckMenu(void) { - 0, 387, - 0, 127, - -127, 127, - -128, 32639, - 0, 65535, - 0, 255, - 0, 65535, - -64, 63 -}; + u8 taskId; -static const u8 gUnknown_083D03DC[] = _("▶"); -static const u8 gUnknown_083D03DE[] = _(" "); + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16(3, 0, VRAM, VRAM_SIZE); + DmaFill32(3, 0, OAM, OAM_SIZE); + DmaFill16(3, 0, PLTT, PLTT_SIZE); + ResetPaletteFade(); + ResetTasks(); + ResetSpriteData(); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + REG_WIN0H = WIN_RANGE(0, 0); + REG_WIN0V = WIN_RANGE(0, 0); + REG_WIN1H = WIN_RANGE(0, 0); + REG_WIN1V = WIN_RANGE(0, 0); + REG_WININ = 0x1111; + REG_WINOUT = 0x31; + REG_BLDCNT = 0xE1; + REG_BLDALPHA = 0; + REG_BLDY = 7; + REG_IE = 1; // could be a typo of REG_IME + REG_IE |= 1; + REG_DISPSTAT |= 8; + SetVBlankCallback(sub_80BA0C0); + SetMainCallback2(sub_80BA0A8); + REG_DISPCNT = 0x7140; + taskId = CreateTask(sub_80BA258, 0); + gTasks[taskId].WINDOW_SELECTED = BGM_WINDOW; + gTasks[taskId].BGM_INDEX = 0; + gTasks[taskId].SE_INDEX = 0; + gTasks[taskId].UNK_DATA3 = 0; + gUnknown_020387B0 = 0; + gTasks[taskId].UNK_DATA3 = 0; // why? + m4aSoundInit(); +} -// why not just use Powers of ten from string_util? -static const int gUnknown_083D03E0[6] = +// Task_InitSoundCheckMenu +void sub_80BA258(u8 taskId) { - 1, - 10, - 100, - 1000, - 10000, - 100000 -}; + u8 soundcheckStr[] = _("サウンドチェック"); + u8 bgmStr[] = _("BGM"); + u8 seStr[] = _("SE "); + u8 abDescStr[] = _("A‥さいせい B‥おわり"); + u8 upDownStr[] = _("L‥UP R‥DOWN"); + u8 driverStr[] = _("R‥DRIVER-TEST"); + + if (!gPaletteFade.active) + { + MenuDrawTextWindow(0x2, 0, 0x1B, 0x3); + MenuDrawTextWindow(0x2, 0x5, 0x1B, 0xA); + MenuDrawTextWindow(0x2, 0xC, 0x1B, 0x11); + MenuPrint(soundcheckStr, 4, 1); + MenuPrint(abDescStr, 14, 1); + MenuPrint(bgmStr, 4, 6); + MenuPrint(upDownStr, 14, 6); + MenuPrint(seStr, 4, 13); + MenuPrint(upDownStr, 14, 13); + MenuPrint(driverStr, 14, 18); + gTasks[taskId].FUNC = sub_80BA384; + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(1, 31); + } +} -static const s8 gUnknown_083D03F8[5] = { 0x3F, 0x00, 0xC0, 0x7F, 0x80 }; +// ideally this should be a multi Coords8 struct, but it wont match when its treated like a struct. +static const u8 gUnknown_083D0300[] = { 1, 1, 1, 3, 1, 5, 1, 7, 1, 9, 1, 11, 1, 13, 1, 15, 1, 17 }; -static const u8 gOtherText_SE[] = _("SE"); -static const u8 gOtherText_Pan[] = _("PAN"); -static const u8 gOtherText_LR[] = _(" LR"); -static const u8 gOtherText_RL[] = _(" RL"); +extern const u8 *const gBGMNames[]; +extern const u8 *const gSENames[]; -// bgm names -static const u8 BGMName_STOP[] = _("STOP"); -static const u8 BGMName_TETSUJI[] = _("TETSUJI"); -static const u8 BGMName_FIELD13[] = _("FIELD13"); -static const u8 BGMName_KACHI22[] = _("KACHI22"); -static const u8 BGMName_KACHI2[] = _("KACHI2"); -static const u8 BGMName_KACHI3[] = _("KACHI3"); -static const u8 BGMName_KACHI5[] = _("KACHI5"); -static const u8 BGMName_PCC[] = _("PCC"); -static const u8 BGMName_NIBI[] = _("NIBI"); -static const u8 BGMName_SUIKUN[] = _("SUIKUN"); -static const u8 BGMName_DOORO1[] = _("DOORO1"); -static const u8 BGMName_DOORO_X1[] = _("DOORO-X1"); -static const u8 BGMName_DOORO_X3[] = _("DOORO-X3"); -static const u8 BGMName_MACHI_S2[] = _("MACHI-S2"); -static const u8 BGMName_MACHI_S4[] = _("MACHI-S4"); -static const u8 BGMName_GIM[] = _("GIM"); -static const u8 BGMName_NAMINORI[] = _("NAMINORI"); -static const u8 BGMName_DAN01[] = _("DAN01"); -static const u8 BGMName_FANFA1[] = _("FANFA1"); -static const u8 BGMName_ME_ASA[] = _("ME-ASA"); -static const u8 BGMName_ME_BACHI[] = _("ME-BACHI"); -static const u8 BGMName_FANFA4[] = _("FANFA4"); -static const u8 BGMName_FANFA5[] = _("FANFA5"); -static const u8 BGMName_ME_WAZA[] = _("ME-WAZA"); -static const u8 BGMName_BIJYUTU[] = _("BIJYUTU"); -static const u8 BGMName_DOORO_X4[] = _("DOORO-X4"); -static const u8 BGMName_FUNE_KAN[] = _("FUNE-KAN"); -static const u8 BGMName_ME_SHINKA[] = _("ME-SHINKA"); -static const u8 BGMName_SHINKA[] = _("SHINKA"); -static const u8 BGMName_ME_WASURE[] = _("ME-WASURE"); -static const u8 BGMName_SYOUJOEYE[] = _("SYOUJOEYE"); -static const u8 BGMName_BOYEYE[] = _("BOYEYE"); -static const u8 BGMName_DAN02[] = _("DAN02"); -static const u8 BGMName_MACHI_S3[] = _("MACHI-S3"); -static const u8 BGMName_ODAMAKI[] = _("ODAMAKI"); -static const u8 BGMName_B_TOWER[] = _("B-TOWER"); -static const u8 BGMName_SWIMEYE[] = _("SWIMEYE"); -static const u8 BGMName_DAN03[] = _("DAN03"); -static const u8 BGMName_ME_KINOMI[] = _("ME-KINOMI"); -static const u8 BGMName_ME_TAMA[] = _("ME-TAMA"); -static const u8 BGMName_ME_B_BIG[] = _("ME-B-BIG"); -static const u8 BGMName_ME_B_SMALL[] = _("ME-B-SMALL"); -static const u8 BGMName_ME_ZANNEN[] = _("ME-ZANNEN"); -static const u8 BGMName_BD_TIME[] = _("BD-TIME"); -static const u8 BGMName_TEST1[] = _("TEST1"); -static const u8 BGMName_TEST2[] = _("TEST2"); -static const u8 BGMName_TEST3[] = _("TEST3"); -static const u8 BGMName_TEST4[] = _("TEST4"); -static const u8 BGMName_TEST[] = _("TEST"); -static const u8 BGMName_GOMACHI0[] = _("GOMACHI0"); -static const u8 BGMName_GOTOWN[] = _("GOTOWN"); -static const u8 BGMName_POKECEN[] = _("POKECEN"); -static const u8 BGMName_NEXTROAD[] = _("NEXTROAD"); -static const u8 BGMName_GRANROAD[] = _("GRANROAD"); -static const u8 BGMName_CYCLING[] = _("CYCLING"); -static const u8 BGMName_FRIENDLY[] = _("FRIENDLY"); -static const u8 BGMName_MISHIRO[] = _("MISHIRO"); -static const u8 BGMName_TOZAN[] = _("TOZAN"); -static const u8 BGMName_GIRLEYE[] = _("GIRLEYE"); -static const u8 BGMName_MINAMO[] = _("MINAMO"); -static const u8 BGMName_ASHROAD[] = _("ASHROAD"); -static const u8 BGMName_EVENT0[] = _("EVENT0"); -static const u8 BGMName_DEEPDEEP[] = _("DEEPDEEP"); -static const u8 BGMName_KACHI1[] = _("KACHI1"); -static const u8 BGMName_TITLE3[] = _("TITLE3"); -static const u8 BGMName_DEMO1[] = _("DEMO1"); -static const u8 BGMName_GIRL_SUP[] = _("GIRL-SUP"); -static const u8 BGMName_HAGESHII[] = _("HAGESHII"); -static const u8 BGMName_KAKKOII[] = _("KAKKOII"); -static const u8 BGMName_KAZANBAI[] = _("KAZANBAI"); -static const u8 BGMName_AQA_0[] = _("AQA-0"); -static const u8 BGMName_TSURETEK[] = _("TSURETEK"); -static const u8 BGMName_BOY_SUP[] = _("BOY-SUP"); -static const u8 BGMName_RAINBOW[] = _("RAINBOW"); -static const u8 BGMName_AYASII[] = _("AYASII"); -static const u8 BGMName_KACHI4[] = _("KACHI4"); -static const u8 BGMName_ROPEWAY[] = _("ROPEWAY"); -static const u8 BGMName_CASINO[] = _("CASINO"); -static const u8 BGMName_HIGHTOWN[] = _("HIGHTOWN"); -static const u8 BGMName_SAFARI[] = _("SAFARI"); -static const u8 BGMName_C_ROAD[] = _("C-ROAD"); -static const u8 BGMName_AJITO[] = _("AJITO"); -static const u8 BGMName_M_BOAT[] = _("M-BOAT"); -static const u8 BGMName_M_DUNGON[] = _("M-DUNGON"); -static const u8 BGMName_FINECITY[] = _("FINECITY"); -static const u8 BGMName_MACHUPI[] = _("MACHUPI"); -static const u8 BGMName_P_SCHOOL[] = _("P-SCHOOL"); -static const u8 BGMName_DENDOU[] = _("DENDOU"); -static const u8 BGMName_TONEKUSA[] = _("TONEKUSA"); -static const u8 BGMName_MABOROSI[] = _("MABOROSI"); -static const u8 BGMName_CON_FAN[] = _("CON-FAN"); -static const u8 BGMName_CONTEST0[] = _("CONTEST0"); -static const u8 BGMName_MGM0[] = _("MGM0"); -static const u8 BGMName_T_BATTLE[] = _("T-BATTLE"); -static const u8 BGMName_OOAME[] = _("OOAME"); -static const u8 BGMName_HIDERI[] = _("HIDERI"); -static const u8 BGMName_RUNECITY[] = _("RUNECITY"); -static const u8 BGMName_CON_K[] = _("CON-K"); -static const u8 BGMName_EIKOU_R[] = _("EIKOU-R"); -static const u8 BGMName_KARAKURI[] = _("KARAKURI"); -static const u8 BGMName_HUTAGO[] = _("HUTAGO"); -static const u8 BGMName_SITENNOU[] = _("SITENNOU"); -static const u8 BGMName_YAMA_EYE[] = _("YAMA-EYE"); -static const u8 BGMName_CONLOBBY[] = _("CONLOBBY"); -static const u8 BGMName_INTER_V[] = _("INTER-V"); -static const u8 BGMName_DAIGO[] = _("DAIGO"); -static const u8 BGMName_THANKFOR[] = _("THANKFOR"); -static const u8 BGMName_END[] = _("END"); -static const u8 BGMName_BATTLE27[] = _("BATTLE27"); -static const u8 BGMName_BATTLE31[] = _("BATTLE31"); -static const u8 BGMName_BATTLE20[] = _("BATTLE20"); -static const u8 BGMName_BATTLE32[] = _("BATTLE32"); -static const u8 BGMName_BATTLE33[] = _("BATTLE33"); -static const u8 BGMName_BATTLE36[] = _("BATTLE36"); -static const u8 BGMName_BATTLE34[] = _("BATTLE34"); -static const u8 BGMName_BATTLE35[] = _("BATTLE35"); -static const u8 BGMName_BATTLE38[] = _("BATTLE38"); -static const u8 BGMName_BATTLE30[] = _("BATTLE30"); +void sub_80BA384(u8 taskId) // Task_HandleDrawingSoundCheckMenuText +{ + sub_80BA6B8(gTasks[taskId].WINDOW_SELECTED); + sub_80BA700(gTasks[taskId].BGM_INDEX + BGM_STOP, 7, 8); // print by BGM index + sub_80BA79C(gBGMNames[gTasks[taskId].BGM_INDEX], 11, 8); + sub_80BA700(gTasks[taskId].SE_INDEX, 7, 15); + sub_80BA79C(gSENames[gTasks[taskId].SE_INDEX], 11, 15); + gTasks[taskId].FUNC = sub_80BA65C; +} -static const u8 *const gBGMNames[] = +#ifdef NONMATCHING +bool8 sub_80BA400(u8 taskId) // Task_ProcessSoundCheckMenuInput { - BGMName_STOP, - BGMName_TETSUJI, - BGMName_FIELD13, - BGMName_KACHI22, - BGMName_KACHI2, - BGMName_KACHI3, - BGMName_KACHI5, - BGMName_PCC, - BGMName_NIBI, - BGMName_SUIKUN, - BGMName_DOORO1, - BGMName_DOORO_X1, - BGMName_DOORO_X3, - BGMName_MACHI_S2, - BGMName_MACHI_S4, - BGMName_GIM, - BGMName_NAMINORI, - BGMName_DAN01, - BGMName_FANFA1, - BGMName_ME_ASA, - BGMName_ME_BACHI, - BGMName_FANFA4, - BGMName_FANFA5, - BGMName_ME_WAZA, - BGMName_BIJYUTU, - BGMName_DOORO_X4, - BGMName_FUNE_KAN, - BGMName_ME_SHINKA, - BGMName_SHINKA, - BGMName_ME_WASURE, - BGMName_SYOUJOEYE, - BGMName_BOYEYE, - BGMName_DAN02, - BGMName_MACHI_S3, - BGMName_ODAMAKI, - BGMName_B_TOWER, - BGMName_SWIMEYE, - BGMName_DAN03, - BGMName_ME_KINOMI, - BGMName_ME_TAMA, - BGMName_ME_B_BIG, - BGMName_ME_B_SMALL, - BGMName_ME_ZANNEN, - BGMName_BD_TIME, - BGMName_TEST1, - BGMName_TEST2, - BGMName_TEST3, - BGMName_TEST4, - BGMName_TEST, - BGMName_GOMACHI0, - BGMName_GOTOWN, - BGMName_POKECEN, - BGMName_NEXTROAD, - BGMName_GRANROAD, - BGMName_CYCLING, - BGMName_FRIENDLY, - BGMName_MISHIRO, - BGMName_TOZAN, - BGMName_GIRLEYE, - BGMName_MINAMO, - BGMName_ASHROAD, - BGMName_EVENT0, - BGMName_DEEPDEEP, - BGMName_KACHI1, - BGMName_TITLE3, - BGMName_DEMO1, - BGMName_GIRL_SUP, - BGMName_HAGESHII, - BGMName_KAKKOII, - BGMName_KAZANBAI, - BGMName_AQA_0, - BGMName_TSURETEK, - BGMName_BOY_SUP, - BGMName_RAINBOW, - BGMName_AYASII, - BGMName_KACHI4, - BGMName_ROPEWAY, - BGMName_CASINO, - BGMName_HIGHTOWN, - BGMName_SAFARI, - BGMName_C_ROAD, - BGMName_AJITO, - BGMName_M_BOAT, - BGMName_M_DUNGON, - BGMName_FINECITY, - BGMName_MACHUPI, - BGMName_P_SCHOOL, - BGMName_DENDOU, - BGMName_TONEKUSA, - BGMName_MABOROSI, - BGMName_CON_FAN, - BGMName_CONTEST0, - BGMName_MGM0, - BGMName_T_BATTLE, - BGMName_OOAME, - BGMName_HIDERI, - BGMName_RUNECITY, - BGMName_CON_K, - BGMName_EIKOU_R, - BGMName_KARAKURI, - BGMName_HUTAGO, - BGMName_SITENNOU, - BGMName_YAMA_EYE, - BGMName_CONLOBBY, - BGMName_INTER_V, - BGMName_DAIGO, - BGMName_THANKFOR, - BGMName_END, - BGMName_BATTLE27, - BGMName_BATTLE31, - BGMName_BATTLE20, - BGMName_BATTLE32, - BGMName_BATTLE33, - BGMName_BATTLE36, - BGMName_BATTLE34, - BGMName_BATTLE35, - BGMName_BATTLE38, - BGMName_BATTLE30 -}; - -// SE names -static const u8 SEName_STOP[] = _("STOP"); -static const u8 SEName_KAIFUKU[] = _("KAIFUKU"); -static const u8 SEName_PC_LOGON[] = _("PC-LOGON"); -static const u8 SEName_PC_OFF[] = _("PC-OFF"); -static const u8 SEName_PC_ON[] = _("PC-ON"); -static const u8 SEName_SELECT[] = _("SELECT"); -static const u8 SEName_WIN_OPEN[] = _("WIN-OPEN"); -static const u8 SEName_WALL_HIT[] = _("WALL-HIT"); -static const u8 SEName_DOOR[] = _("DOOR"); -static const u8 SEName_KAIDAN[] = _("KAIDAN"); -static const u8 SEName_DANSA[] = _("DANSA"); -static const u8 SEName_JITENSYA[] = _("JITENSYA"); -static const u8 SEName_KOUKA_L[] = _("KOUKA-L"); -static const u8 SEName_KOUKA_M[] = _("KOUKA-M"); -static const u8 SEName_KOUKA_H[] = _("KOUKA-H"); -static const u8 SEName_BOWA2[] = _("BOWA2"); -static const u8 SEName_POKE_DEAD[] = _("POKE-DEAD"); -static const u8 SEName_NIGERU[] = _("NIGERU"); -static const u8 SEName_JIDO_DOA[] = _("JIDO-DOA"); -static const u8 SEName_NAMINORI[] = _("NAMINORI"); -static const u8 SEName_BAN[] = _("BAN"); -static const u8 SEName_PIN[] = _("PIN"); -static const u8 SEName_BOO[] = _("BOO"); -static const u8 SEName_BOWA[] = _("BOWA"); -static const u8 SEName_JYUNI[] = _("JYUNI"); -static const u8 SEName_A[] = _("A"); -static const u8 SEName_I[] = _("I"); -static const u8 SEName_U[] = _("U"); -static const u8 SEName_E[] = _("E"); -static const u8 SEName_O[] = _("O"); -static const u8 SEName_N[] = _("N"); -static const u8 SEName_SEIKAI[] = _("SEIKAI"); -static const u8 SEName_HAZURE[] = _("HAZURE"); -static const u8 SEName_EXP[] = _("EXP"); -static const u8 SEName_JITE_PYOKO[] = _("JITE-PYOKO"); -static const u8 SEName_MU_PACHI[] = _("MU-PACHI"); -static const u8 SEName_TK_KASYA[] = _("TK-KASYA"); -static const u8 SEName_FU_ZAKU[] = _("FU-ZAKU"); -static const u8 SEName_FU_ZAKU2[] = _("FU-ZAKU2"); -static const u8 SEName_FU_ZUZUZU[] = _("FU-ZUZUZU"); -static const u8 SEName_RU_GASHIN[] = _("RU-GASHIN"); -static const u8 SEName_RU_GASYAN[] = _("RU-GASYAN"); -static const u8 SEName_RU_BARI[] = _("RU-BARI"); -static const u8 SEName_RU_HYUU[] = _("RU-HYUU"); -static const u8 SEName_KI_GASYAN[] = _("KI-GASYAN"); -static const u8 SEName_TK_WARPIN[] = _("TK-WARPIN"); -static const u8 SEName_TK_WARPOUT[] = _("TK-WARPOUT"); -static const u8 SEName_TU_SAA[] = _("TU-SAA"); -static const u8 SEName_HI_TURUN[] = _("HI-TURUN"); -static const u8 SEName_TRACK_MOVE[] = _("TRACK-MOVE"); -static const u8 SEName_TRACK_STOP[] = _("TRACK-STOP"); -static const u8 SEName_TRACK_HAIK[] = _("TRACK-HAIK"); -static const u8 SEName_TRACK_DOOR[] = _("TRACK-DOOR"); -static const u8 SEName_MOTER[] = _("MOTER"); -static const u8 SEName_CARD[] = _("CARD"); -static const u8 SEName_SAVE[] = _("SAVE"); -static const u8 SEName_KON[] = _("KON"); -static const u8 SEName_KON2[] = _("KON2"); -static const u8 SEName_KON3[] = _("KON3"); -static const u8 SEName_KON4[] = _("KON4"); -static const u8 SEName_SUIKOMU[] = _("SUIKOMU"); -static const u8 SEName_NAGERU[] = _("NAGERU"); -static const u8 SEName_TOY_C[] = _("TOY-C"); -static const u8 SEName_TOY_D[] = _("TOY-D"); -static const u8 SEName_TOY_E[] = _("TOY-E"); -static const u8 SEName_TOY_F[] = _("TOY-F"); -static const u8 SEName_TOY_G[] = _("TOY-G"); -static const u8 SEName_TOY_A[] = _("TOY-A"); -static const u8 SEName_TOY_B[] = _("TOY-B"); -static const u8 SEName_TOY_C1[] = _("TOY-C1"); -static const u8 SEName_MIZU[] = _("MIZU"); -static const u8 SEName_HASHI[] = _("HASHI"); -static const u8 SEName_DAUGI[] = _("DAUGI"); -static const u8 SEName_PINPON[] = _("PINPON"); -static const u8 SEName_FUUSEN1[] = _("FUUSEN1"); -static const u8 SEName_FUUSEN2[] = _("FUUSEN2"); -static const u8 SEName_FUUSEN3[] = _("FUUSEN3"); -static const u8 SEName_TOY_KABE[] = _("TOY-KABE"); -static const u8 SEName_TOY_DANGO[] = _("TOY-DANGO"); -static const u8 SEName_DOKU[] = _("DOKU"); -static const u8 SEName_ESUKA[] = _("ESUKA"); -static const u8 SEName_T_AME[] = _("T-AME"); -static const u8 SEName_T_AME_E[] = _("T-AME-E"); -static const u8 SEName_T_OOAME[] = _("T-OOAME"); -static const u8 SEName_T_OOAME_E[] = _("T-OOAME-E"); -static const u8 SEName_T_KOAME[] = _("T-KOAME"); -static const u8 SEName_T_KOAME_E[] = _("T-KOAME-E"); -static const u8 SEName_T_KAMI[] = _("T-KAMI"); -static const u8 SEName_T_KAMI2[] = _("T-KAMI2"); -static const u8 SEName_ELEBETA[] = _("ELEBETA"); -static const u8 SEName_HINSI[] = _("HINSI"); -static const u8 SEName_EXPMAX[] = _("EXPMAX"); -static const u8 SEName_TAMAKORO[] = _("TAMAKORO"); -static const u8 SEName_TAMAKORO_E[] = _("TAMAKORO-E"); -static const u8 SEName_BASABASA[] = _("BASABASA"); -static const u8 SEName_REGI[] = _("REGI"); -static const u8 SEName_C_GAJI[] = _("C-GAJI"); -static const u8 SEName_C_MAKU_U[] = _("C-MAKU-U"); -static const u8 SEName_C_MAKU_D[] = _("C-MAKU-D"); -static const u8 SEName_C_PASI[] = _("C-PASI"); -static const u8 SEName_C_SYU[] = _("C-SYU"); -static const u8 SEName_C_PIKON[] = _("C-PIKON"); -static const u8 SEName_REAPOKE[] = _("REAPOKE"); -static const u8 SEName_OP_BASYU[] = _("OP-BASYU"); -static const u8 SEName_BT_START[] = _("BT-START"); -static const u8 SEName_DENDOU[] = _("DENDOU"); -static const u8 SEName_JIHANKI[] = _("JIHANKI"); -static const u8 SEName_TAMA[] = _("TAMA"); -static const u8 SEName_Z_SCROLL[] = _("Z-SCROLL"); -static const u8 SEName_Z_PAGE[] = _("Z-PAGE"); -static const u8 SEName_PN_ON[] = _("PN-ON"); -static const u8 SEName_PN_OFF[] = _("PN-OFF"); -static const u8 SEName_Z_SEARCH[] = _("Z-SEARCH"); -static const u8 SEName_TAMAGO[] = _("TAMAGO"); -static const u8 SEName_TB_START[] = _("TB-START"); -static const u8 SEName_TB_KON[] = _("TB-KON"); -static const u8 SEName_TB_KARA[] = _("TB-KARA"); -static const u8 SEName_BIDORO[] = _("BIDORO"); -static const u8 SEName_W085[] = _("W085"); -static const u8 SEName_W085B[] = _("W085B"); -static const u8 SEName_W231[] = _("W231"); -static const u8 SEName_W171[] = _("W171"); -static const u8 SEName_W233[] = _("W233"); -static const u8 SEName_W233B[] = _("W233B"); -static const u8 SEName_W145[] = _("W145"); -static const u8 SEName_W145B[] = _("W145B"); -static const u8 SEName_W145C[] = _("W145C"); -static const u8 SEName_W240[] = _("W240"); -static const u8 SEName_W015[] = _("W015"); -static const u8 SEName_W081[] = _("W081"); -static const u8 SEName_W081B[] = _("W081B"); -static const u8 SEName_W088[] = _("W088"); -static const u8 SEName_W016[] = _("W016"); -static const u8 SEName_W016B[] = _("W016B"); -static const u8 SEName_W003[] = _("W003"); -static const u8 SEName_W104[] = _("W104"); -static const u8 SEName_W013[] = _("W013"); -static const u8 SEName_W196[] = _("W196"); -static const u8 SEName_W086[] = _("W086"); -static const u8 SEName_W004[] = _("W004"); -static const u8 SEName_W025[] = _("W025"); -static const u8 SEName_W025B[] = _("W025B"); -static const u8 SEName_W152[] = _("W152"); -static const u8 SEName_W026[] = _("W026"); -static const u8 SEName_W172[] = _("W172"); -static const u8 SEName_W172B[] = _("W172B"); -static const u8 SEName_W053[] = _("W053"); -static const u8 SEName_W007[] = _("W007"); -static const u8 SEName_W092[] = _("W092"); -static const u8 SEName_W221[] = _("W221"); -static const u8 SEName_W221B[] = _("W221B"); -static const u8 SEName_W052[] = _("W052"); -static const u8 SEName_W036[] = _("W036"); -static const u8 SEName_W059[] = _("W059"); -static const u8 SEName_W059B[] = _("W059B"); -static const u8 SEName_W010[] = _("W010"); -static const u8 SEName_W011[] = _("W011"); -static const u8 SEName_W017[] = _("W017"); -static const u8 SEName_W019[] = _("W019"); -static const u8 SEName_W028[] = _("W028"); -static const u8 SEName_W013B[] = _("W013B"); -static const u8 SEName_W044[] = _("W044"); -static const u8 SEName_W029[] = _("W029"); -static const u8 SEName_W057[] = _("W057"); -static const u8 SEName_W056[] = _("W056"); -static const u8 SEName_W250[] = _("W250"); -static const u8 SEName_W030[] = _("W030"); -static const u8 SEName_W039[] = _("W039"); -static const u8 SEName_W054[] = _("W054"); -static const u8 SEName_W077[] = _("W077"); -static const u8 SEName_W020[] = _("W020"); -static const u8 SEName_W082[] = _("W082"); -static const u8 SEName_W047[] = _("W047"); -static const u8 SEName_W195[] = _("W195"); -static const u8 SEName_W006[] = _("W006"); -static const u8 SEName_W091[] = _("W091"); -static const u8 SEName_W146[] = _("W146"); -static const u8 SEName_W120[] = _("W120"); -static const u8 SEName_W153[] = _("W153"); -static const u8 SEName_W071B[] = _("W071B"); -static const u8 SEName_W071[] = _("W071"); -static const u8 SEName_W103[] = _("W103"); -static const u8 SEName_W062[] = _("W062"); -static const u8 SEName_W062B[] = _("W062B"); -static const u8 SEName_W048[] = _("W048"); -static const u8 SEName_W187[] = _("W187"); -static const u8 SEName_W118[] = _("W118"); -static const u8 SEName_W155[] = _("W155"); -static const u8 SEName_W122[] = _("W122"); -static const u8 SEName_W060[] = _("W060"); -static const u8 SEName_W185[] = _("W185"); -static const u8 SEName_W014[] = _("W014"); -static const u8 SEName_W043[] = _("W043"); -static const u8 SEName_W207[] = _("W207"); -static const u8 SEName_W207B[] = _("W207B"); -static const u8 SEName_W215[] = _("W215"); -static const u8 SEName_W109[] = _("W109"); -static const u8 SEName_W173[] = _("W173"); -static const u8 SEName_W280[] = _("W280"); -static const u8 SEName_W202[] = _("W202"); -static const u8 SEName_W060B[] = _("W060B"); -static const u8 SEName_W076[] = _("W076"); -static const u8 SEName_W080[] = _("W080"); -static const u8 SEName_W100[] = _("W100"); -static const u8 SEName_W107[] = _("W107"); -static const u8 SEName_W166[] = _("W166"); -static const u8 SEName_W129[] = _("W129"); -static const u8 SEName_W115[] = _("W115"); -static const u8 SEName_W112[] = _("W112"); -static const u8 SEName_W197[] = _("W197"); -static const u8 SEName_W199[] = _("W199"); -static const u8 SEName_W236[] = _("W236"); -static const u8 SEName_W204[] = _("W204"); -static const u8 SEName_W268[] = _("W268"); -static const u8 SEName_W070[] = _("W070"); -static const u8 SEName_W063[] = _("W063"); -static const u8 SEName_W127[] = _("W127"); -static const u8 SEName_W179[] = _("W179"); -static const u8 SEName_W151[] = _("W151"); -static const u8 SEName_W201[] = _("W201"); -static const u8 SEName_W161[] = _("W161"); -static const u8 SEName_W161B[] = _("W161B"); -static const u8 SEName_W227[] = _("W227"); -static const u8 SEName_W227B[] = _("W227B"); -static const u8 SEName_W226[] = _("W226"); -static const u8 SEName_W208[] = _("W208"); -static const u8 SEName_W213[] = _("W213"); -static const u8 SEName_W213B[] = _("W213B"); -static const u8 SEName_W234[] = _("W234"); -static const u8 SEName_W260[] = _("W260"); -static const u8 SEName_W328[] = _("W328"); -static const u8 SEName_W320[] = _("W320"); -static const u8 SEName_W255[] = _("W255"); -static const u8 SEName_W291[] = _("W291"); -static const u8 SEName_W089[] = _("W089"); -static const u8 SEName_W239[] = _("W239"); -static const u8 SEName_W230[] = _("W230"); -static const u8 SEName_W281[] = _("W281"); -static const u8 SEName_W327[] = _("W327"); -static const u8 SEName_W287[] = _("W287"); -static const u8 SEName_W257[] = _("W257"); -static const u8 SEName_W253[] = _("W253"); -static const u8 SEName_W258[] = _("W258"); -static const u8 SEName_W322[] = _("W322"); -static const u8 SEName_W298[] = _("W298"); -static const u8 SEName_W287B[] = _("W287B"); -static const u8 SEName_W114[] = _("W114"); -static const u8 SEName_W063B[] = _("W063B"); - -static const u8 *const gSENames[] = -{ - SEName_STOP, - SEName_KAIFUKU, - SEName_PC_LOGON, - SEName_PC_OFF, - SEName_PC_ON, - SEName_SELECT, - SEName_WIN_OPEN, - SEName_WALL_HIT, - SEName_DOOR, - SEName_KAIDAN, - SEName_DANSA, - SEName_JITENSYA, - SEName_KOUKA_L, - SEName_KOUKA_M, - SEName_KOUKA_H, - SEName_BOWA2, - SEName_POKE_DEAD, - SEName_NIGERU, - SEName_JIDO_DOA, - SEName_NAMINORI, - SEName_BAN, - SEName_PIN, - SEName_BOO, - SEName_BOWA, - SEName_JYUNI, - SEName_A, - SEName_I, - SEName_U, - SEName_E, - SEName_O, - SEName_N, - SEName_SEIKAI, - SEName_HAZURE, - SEName_EXP, - SEName_JITE_PYOKO, - SEName_MU_PACHI, - SEName_TK_KASYA, - SEName_FU_ZAKU, - SEName_FU_ZAKU2, - SEName_FU_ZUZUZU, - SEName_RU_GASHIN, - SEName_RU_GASYAN, - SEName_RU_BARI, - SEName_RU_HYUU, - SEName_KI_GASYAN, - SEName_TK_WARPIN, - SEName_TK_WARPOUT, - SEName_TU_SAA, - SEName_HI_TURUN, - SEName_TRACK_MOVE, - SEName_TRACK_STOP, - SEName_TRACK_HAIK, - SEName_TRACK_DOOR, - SEName_MOTER, - SEName_CARD, - SEName_SAVE, - SEName_KON, - SEName_KON2, - SEName_KON3, - SEName_KON4, - SEName_SUIKOMU, - SEName_NAGERU, - SEName_TOY_C, - SEName_TOY_D, - SEName_TOY_E, - SEName_TOY_F, - SEName_TOY_G, - SEName_TOY_A, - SEName_TOY_B, - SEName_TOY_C1, - SEName_MIZU, - SEName_HASHI, - SEName_DAUGI, - SEName_PINPON, - SEName_FUUSEN1, - SEName_FUUSEN2, - SEName_FUUSEN3, - SEName_TOY_KABE, - SEName_TOY_DANGO, - SEName_DOKU, - SEName_ESUKA, - SEName_T_AME, - SEName_T_AME_E, - SEName_T_OOAME, - SEName_T_OOAME_E, - SEName_T_KOAME, - SEName_T_KOAME_E, - SEName_T_KAMI, - SEName_T_KAMI2, - SEName_ELEBETA, - SEName_HINSI, - SEName_EXPMAX, - SEName_TAMAKORO, - SEName_TAMAKORO_E, - SEName_BASABASA, - SEName_REGI, - SEName_C_GAJI, - SEName_C_MAKU_U, - SEName_C_MAKU_D, - SEName_C_PASI, - SEName_C_SYU, - SEName_C_PIKON, - SEName_REAPOKE, - SEName_OP_BASYU, - SEName_BT_START, - SEName_DENDOU, - SEName_JIHANKI, - SEName_TAMA, - SEName_Z_SCROLL, - SEName_Z_PAGE, - SEName_PN_ON, - SEName_PN_OFF, - SEName_Z_SEARCH, - SEName_TAMAGO, - SEName_TB_START, - SEName_TB_KON, - SEName_TB_KARA, - SEName_BIDORO, - SEName_W085, - SEName_W085B, - SEName_W231, - SEName_W171, - SEName_W233, - SEName_W233B, - SEName_W145, - SEName_W145B, - SEName_W145C, - SEName_W240, - SEName_W015, - SEName_W081, - SEName_W081B, - SEName_W088, - SEName_W016, - SEName_W016B, - SEName_W003, - SEName_W104, - SEName_W013, - SEName_W196, - SEName_W086, - SEName_W004, - SEName_W025, - SEName_W025B, - SEName_W152, - SEName_W026, - SEName_W172, - SEName_W172B, - SEName_W053, - SEName_W007, - SEName_W092, - SEName_W221, - SEName_W221B, - SEName_W052, - SEName_W036, - SEName_W059, - SEName_W059B, - SEName_W010, - SEName_W011, - SEName_W017, - SEName_W019, - SEName_W028, - SEName_W013B, - SEName_W044, - SEName_W029, - SEName_W057, - SEName_W056, - SEName_W250, - SEName_W030, - SEName_W039, - SEName_W054, - SEName_W077, - SEName_W020, - SEName_W082, - SEName_W047, - SEName_W195, - SEName_W006, - SEName_W091, - SEName_W146, - SEName_W120, - SEName_W153, - SEName_W071B, - SEName_W071, - SEName_W103, - SEName_W062, - SEName_W062B, - SEName_W048, - SEName_W187, - SEName_W118, - SEName_W155, - SEName_W122, - SEName_W060, - SEName_W185, - SEName_W014, - SEName_W043, - SEName_W207, - SEName_W207B, - SEName_W215, - SEName_W109, - SEName_W173, - SEName_W280, - SEName_W202, - SEName_W060B, - SEName_W076, - SEName_W080, - SEName_W100, - SEName_W107, - SEName_W166, - SEName_W129, - SEName_W115, - SEName_W112, - SEName_W197, - SEName_W199, - SEName_W236, - SEName_W204, - SEName_W268, - SEName_W070, - SEName_W063, - SEName_W127, - SEName_W179, - SEName_W151, - SEName_W201, - SEName_W161, - SEName_W161B, - SEName_W227, - SEName_W227B, - SEName_W226, - SEName_W208, - SEName_W213, - SEName_W213B, - SEName_W234, - SEName_W260, - SEName_W328, - SEName_W320, - SEName_W255, - SEName_W291, - SEName_W089, - SEName_W239, - SEName_W230, - SEName_W281, - SEName_W327, - SEName_W287, - SEName_W257, - SEName_W253, - SEName_W258, - SEName_W322, - SEName_W298, - SEName_W287B, - SEName_W114, - SEName_W063B -}; - -void sub_80BA0A8(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void sub_80BA0C0(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - - if(gUnknown_020387B0 != 0) - { - m4aSoundMain(); - m4aSoundMain(); - m4aSoundMain(); - } -} - -// unused -void CB2_StartSoundCheckMenu(void) -{ - u8 taskId; - - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16(3, 0, VRAM, VRAM_SIZE); - DmaFill32(3, 0, OAM, OAM_SIZE); - DmaFill16(3, 0, PLTT, PLTT_SIZE); - ResetPaletteFade(); - ResetTasks(); - ResetSpriteData(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - REG_WIN0H = WIN_RANGE(0, 0); - REG_WIN0V = WIN_RANGE(0, 0); - REG_WIN1H = WIN_RANGE(0, 0); - REG_WIN1V = WIN_RANGE(0, 0); - REG_WININ = 0x1111; - REG_WINOUT = 0x31; - REG_BLDCNT = 0xE1; - REG_BLDALPHA = 0; - REG_BLDY = 7; - REG_IE = 1; // could be a typo of REG_IME - REG_IE |= 1; - REG_DISPSTAT |= 8; - SetVBlankCallback(sub_80BA0C0); - SetMainCallback2(sub_80BA0A8); - REG_DISPCNT = 0x7140; - taskId = CreateTask(sub_80BA258, 0); - TASK.WINDOW_SELECTED = BGM_WINDOW; - TASK.BGM_INDEX = 0; - TASK.SE_INDEX = 0; - TASK.UNK_DATA3 = 0; - gUnknown_020387B0 = 0; - TASK.UNK_DATA3 = 0; // why? - m4aSoundInit(); -} - -// Task_InitSoundCheckMenu -void sub_80BA258(u8 taskId) -{ - u8 soundcheckStr[sizeof(gDebugText_SoundCheckJap)]; - u8 bgmStr[sizeof(gDebugText_BGM)]; - u8 seStr[sizeof(gDebugText_SE)]; - u8 abDescStr[sizeof(gDebugText_ABDesc)]; - u8 upDownStr[sizeof(gDebugText_UpDown)]; - u8 driverStr[sizeof(gDebugText_DriverTest)]; - - memcpy(soundcheckStr, gDebugText_SoundCheckJap, sizeof(gDebugText_SoundCheckJap)); - memcpy(bgmStr, gDebugText_BGM, sizeof(gDebugText_BGM)); - memcpy(seStr, gDebugText_SE, sizeof(gDebugText_SE)); - memcpy(abDescStr, gDebugText_ABDesc, sizeof(gDebugText_ABDesc)); - memcpy(upDownStr, gDebugText_UpDown, sizeof(gDebugText_UpDown)); - memcpy(driverStr, gDebugText_DriverTest, sizeof(gDebugText_DriverTest)); - - if(!gPaletteFade.active) - { - MenuDrawTextWindow(0x2, 0, 0x1B, 0x3); - MenuDrawTextWindow(0x2, 0x5, 0x1B, 0xA); - MenuDrawTextWindow(0x2, 0xC, 0x1B, 0x11); - MenuPrint(soundcheckStr, 4, 1); - MenuPrint(abDescStr, 14, 1); - MenuPrint(bgmStr, 4, 6); - MenuPrint(upDownStr, 14, 6); - MenuPrint(seStr, 4, 13); - MenuPrint(upDownStr, 14, 13); - MenuPrint(driverStr, 14, 18); - TASK.FUNC = sub_80BA384; - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(1, 31); - } -} - -void sub_80BA384(u8 taskId) // Task_HandleDrawingSoundCheckMenuText -{ - sub_80BA6B8(TASK.WINDOW_SELECTED); - sub_80BA700(TASK.BGM_INDEX + BGM_STOP, 7, 8); // print by BGM index - sub_80BA79C(gBGMNames[TASK.BGM_INDEX], 11, 8); - sub_80BA700(TASK.SE_INDEX, 7, 15); - sub_80BA79C(gSENames[TASK.SE_INDEX], 11, 15); - TASK.FUNC = sub_80BA65C; -} - -#ifdef NONMATCHING -bool8 sub_80BA400(u8 taskId) // Task_ProcessSoundCheckMenuInput -{ - if(gMain.newKeys & R_BUTTON) // driver test + if (gMain.newKeys & R_BUTTON) // driver test { - TASK.FUNC = sub_80BA800; + gTasks[taskId].FUNC = sub_80BA800; return FALSE; } - if(gMain.newKeys & L_BUTTON) + if (gMain.newKeys & L_BUTTON) { - TASK.FUNC = sub_80BAF84; + gTasks[taskId].FUNC = sub_80BAF84; return FALSE; } - if(gMain.newKeys & START_BUTTON) + if (gMain.newKeys & START_BUTTON) { - TASK.FUNC = sub_80BB25C; + gTasks[taskId].FUNC = sub_80BB25C; return FALSE; } - if(gMain.newKeys & A_BUTTON) // both these cases insist on non reuses of certain data variables and cause the function to not match. + if (gMain.newKeys & A_BUTTON) // both these cases insist on non reuses of certain data variables and cause the function to not match. { - if(TASK.WINDOW_SELECTED != 0) // is playing? + if (gTasks[taskId].WINDOW_SELECTED != 0) // is playing? { - if(TASK.UNK_DATA4 != 0) + if (gTasks[taskId].UNK_DATA4 != 0) { - if(TASK.SE_INDEX != 0) // why are you insiting on a non signed halfword? + if (gTasks[taskId].SE_INDEX != 0) // why are you insiting on a non signed halfword? { - m4aSongNumStop(TASK.UNK_DATA4); + m4aSongNumStop(gTasks[taskId].UNK_DATA4); } else { - m4aSongNumStop(TASK.SE_INDEX); - TASK.UNK_DATA4 = TASK.SE_INDEX; + m4aSongNumStop(gTasks[taskId].SE_INDEX); + gTasks[taskId].UNK_DATA4 = gTasks[taskId].SE_INDEX; return FALSE; } } - else if(TASK.SE_INDEX == 0) // _080BA4BA + else if (gTasks[taskId].SE_INDEX == 0) // _080BA4BA { return FALSE; } // _080BA4C4 - m4aSongNumStart(TASK.SE_INDEX); - TASK.UNK_DATA4 = TASK.SE_INDEX; + m4aSongNumStart(gTasks[taskId].SE_INDEX); + gTasks[taskId].UNK_DATA4 = gTasks[taskId].SE_INDEX; return FALSE; } else // _080BA4D0 { - if(TASK.UNK_DATA3 != 0) + if (gTasks[taskId].UNK_DATA3 != 0) { - if(TASK.BGM_INDEX != 0) + if (gTasks[taskId].BGM_INDEX != 0) { - m4aSongNumStop(TASK.UNK_DATA3 + BGM_STOP); + m4aSongNumStop(gTasks[taskId].UNK_DATA3 + BGM_STOP); } else // _080BA500 { - m4aSongNumStop(TASK.UNK_DATA3 + BGM_STOP); - TASK.UNK_DATA3 = TASK.BGM_INDEX; + m4aSongNumStop(gTasks[taskId].UNK_DATA3 + BGM_STOP); + gTasks[taskId].UNK_DATA3 = gTasks[taskId].BGM_INDEX; return FALSE; } } - else if(TASK.BGM_INDEX == 0) // _080BA514 + else if (gTasks[taskId].BGM_INDEX == 0) // _080BA514 return FALSE; - m4aSongNumStart(TASK.BGM_INDEX + BGM_STOP); - TASK.UNK_DATA3 = TASK.BGM_INDEX; + m4aSongNumStart(gTasks[taskId].BGM_INDEX + BGM_STOP); + gTasks[taskId].UNK_DATA3 = gTasks[taskId].BGM_INDEX; } return FALSE; } - if(gMain.newKeys & B_BUTTON) + if (gMain.newKeys & B_BUTTON) { m4aSongNumStart(5); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - TASK.FUNC = sub_80BA68C; + gTasks[taskId].FUNC = sub_80BA68C; return FALSE; } - if(gMain.newAndRepeatedKeys & DPAD_UP) + if (gMain.newAndRepeatedKeys & DPAD_UP) { - TASK.data[8] ^= A_BUTTON; // huh? + gTasks[taskId].data[8] ^= A_BUTTON; // huh? return TRUE; } - if(gMain.newAndRepeatedKeys & DPAD_DOWN) + if (gMain.newAndRepeatedKeys & DPAD_DOWN) { - TASK.data[8] ^= A_BUTTON; // huh? + gTasks[taskId].data[8] ^= A_BUTTON; // huh? return TRUE; } else { u16 keys = gMain.newAndRepeatedKeys & DPAD_RIGHT; - if(keys) + if (keys) { - if(TASK.WINDOW_SELECTED != 0) + if (gTasks[taskId].WINDOW_SELECTED != 0) { - if(TASK.SE_INDEX > 0) + if (gTasks[taskId].SE_INDEX > 0) { - TASK.SE_INDEX--; + gTasks[taskId].SE_INDEX--; } else { - TASK.SE_INDEX = 0xF7; + gTasks[taskId].SE_INDEX = 0xF7; } } - else if(TASK.BGM_INDEX > 0) + else if (gTasks[taskId].BGM_INDEX > 0) { - TASK.BGM_INDEX--; + gTasks[taskId].BGM_INDEX--; } else { - TASK.BGM_INDEX = 0x75; + gTasks[taskId].BGM_INDEX = 0x75; } return TRUE; } - if(gMain.newAndRepeatedKeys & DPAD_LEFT) + if (gMain.newAndRepeatedKeys & DPAD_LEFT) { - if(TASK.WINDOW_SELECTED != 0) + if (gTasks[taskId].WINDOW_SELECTED != 0) { - if(TASK.SE_INDEX < 0xF7) + if (gTasks[taskId].SE_INDEX < 0xF7) { - TASK.SE_INDEX++; + gTasks[taskId].SE_INDEX++; } else { - TASK.SE_INDEX = keys; // ?? + gTasks[taskId].SE_INDEX = keys; // ?? } } - else if(TASK.BGM_INDEX < 0x75) + else if (gTasks[taskId].BGM_INDEX < 0x75) { - TASK.BGM_INDEX++; + gTasks[taskId].BGM_INDEX++; return TRUE; } else { - TASK.BGM_INDEX = TASK.SE_INDEX; + gTasks[taskId].BGM_INDEX = gTasks[taskId].SE_INDEX; return TRUE; } return TRUE; } - if(gMain.heldKeys & SELECT_BUTTON) + if (gMain.heldKeys & SELECT_BUTTON) { gUnknown_020387B0 = A_BUTTON; return FALSE; @@ -1480,13 +676,13 @@ _080BA658: .4byte gUnknown_020387B0\n\ void sub_80BA65C(u8 taskId) { - if(sub_80BA400(taskId) != FALSE) - TASK.FUNC = sub_80BA384; + if (sub_80BA400(taskId) != FALSE) + gTasks[taskId].FUNC = sub_80BA384; } void sub_80BA68C(u8 taskId) { - if(!gPaletteFade.active) + if (!gPaletteFade.active) { DestroyTask(taskId); SetMainCallback2(CB2_InitTitleScreen); @@ -1495,17 +691,17 @@ void sub_80BA68C(u8 taskId) void sub_80BA6B8(u8 windowType) { - switch(windowType) + switch (windowType) { - case BGM_WINDOW: - default: - REG_WIN1H = WIN_RANGE(17, 223); - REG_WIN1V = WIN_RANGE(41, 87); - break; - case SE_WINDOW: - REG_WIN1H = WIN_RANGE(17, 223); - REG_WIN1V = WIN_RANGE(97, 143); - break; + case BGM_WINDOW: + default: + REG_WIN1H = WIN_RANGE(17, 223); + REG_WIN1V = WIN_RANGE(41, 87); + break; + case SE_WINDOW: + REG_WIN1H = WIN_RANGE(17, 223); + REG_WIN1V = WIN_RANGE(97, 143); + break; } } @@ -1516,7 +712,7 @@ void sub_80BA700(u16 soundIndex, u16 x, u16 y) // PrintSoundNumber ? bool8 someBool; u8 divisorValue; - for(i = 0; i < 3; i++) + for (i = 0; i < 3; i++) str[i] = 0; // initialize array str[3] = CHAR_ELLIPSIS; @@ -1524,14 +720,14 @@ void sub_80BA700(u16 soundIndex, u16 x, u16 y) // PrintSoundNumber ? someBool = FALSE; divisorValue = soundIndex / 100; - if(divisorValue) + if (divisorValue) { str[0] = divisorValue + CHAR_0; someBool = TRUE; } divisorValue = (soundIndex % 100) / 10; - if(divisorValue || someBool != FALSE) + if (divisorValue || someBool != FALSE) str[1] = divisorValue + CHAR_0; str[2] = ((soundIndex % 100) % 10) + CHAR_0; @@ -1543,12 +739,12 @@ void sub_80BA79C(const u8 *const string, u16 x, u16 y) u8 i; u8 str[11]; - for(i = 0; i < 11; i++) + for (i = 0; i < 11; i++) str[i] = 0; // format string. str[10] = EOS; // the above for loop formats the last element of the array unnecessarily. - for(i = 0; string[i] != EOS && i < 10; i++) + for (i = 0; string[i] != EOS && i < 10; i++) str[i] = string[i]; MenuPrint(str, x, y); @@ -1556,35 +752,21 @@ void sub_80BA79C(const u8 *const string, u16 x, u16 y) void sub_80BA800(u8 taskId) // Task_DrawDriverTestMenu { - u8 bbackStr[sizeof(gDebugText_BBack)]; - u8 aplayStr[sizeof(gDebugText_APlay)]; - u8 voiceStr[sizeof(gDebugText_Voice)]; - u8 volumeStr[sizeof(gDebugText_Volume)]; - u8 panpotStr[sizeof(gDebugText_Panpot)]; - u8 pitchStr[sizeof(gDebugText_Pitch)]; - u8 lengthStr[sizeof(gDebugText_Length)]; - u8 releaseStr[sizeof(gDebugText_Release)]; - u8 progressStr[sizeof(gDebugText_Progress)]; - u8 chorusStr[sizeof(gDebugText_Chorus)]; - u8 priorityStr[sizeof(gDebugText_Priority)]; - u8 playingStr[sizeof(gDebugText_Playing)]; - u8 reverseStr[sizeof(gDebugText_Reverse)]; - u8 stereoStr[sizeof(gDebugText_Stereo)]; - - memcpy(bbackStr, gDebugText_BBack, sizeof(gDebugText_BBack)); - memcpy(aplayStr, gDebugText_APlay, sizeof(gDebugText_APlay)); - memcpy(voiceStr, gDebugText_Voice, sizeof(gDebugText_Voice)); - memcpy(volumeStr, gDebugText_Volume, sizeof(gDebugText_Volume)); - memcpy(panpotStr, gDebugText_Panpot, sizeof(gDebugText_Panpot)); - memcpy(pitchStr, gDebugText_Pitch, sizeof(gDebugText_Pitch)); - memcpy(lengthStr, gDebugText_Length, sizeof(gDebugText_Length)); - memcpy(releaseStr, gDebugText_Release, sizeof(gDebugText_Release)); - memcpy(progressStr, gDebugText_Progress, sizeof(gDebugText_Progress)); - memcpy(chorusStr, gDebugText_Chorus, sizeof(gDebugText_Chorus)); - memcpy(priorityStr, gDebugText_Priority, sizeof(gDebugText_Priority)); - memcpy(playingStr, gDebugText_Playing, sizeof(gDebugText_Playing)); - memcpy(reverseStr, gDebugText_Reverse, sizeof(gDebugText_Reverse)); - memcpy(stereoStr, gDebugText_Stereo, sizeof(gDebugText_Stereo)); + + u8 bbackStr[] = _("Bぼたんで もどる"); + u8 aplayStr[] = _("Aぼたんで さいせい"); + u8 voiceStr[] = _("VOICE‥‥‥‥"); + u8 volumeStr[] = _("VOLUME‥‥‥"); + u8 panpotStr[] = _("PANPOT‥‥‥"); + u8 pitchStr[] = _("PITCH‥‥‥‥"); + u8 lengthStr[] = _("LENGTH‥‥‥"); + u8 releaseStr[] = _("RELEASE‥‥"); + u8 progressStr[] = _("PROGRESS‥"); + u8 chorusStr[] = _("CHORUS‥‥‥"); + u8 priorityStr[] = _("PRIORITY‥"); + u8 playingStr[] = _("さいせいちゆう‥"); // 再生中 (playing) + u8 reverseStr[] = _("はんてん‥‥‥‥"); // 反転 (reverse) + u8 stereoStr[] = _("すてれお‥‥‥‥"); // stereo REG_DISPCNT = 0x3140; MenuDrawTextWindow(0, 0, 0x1D, 0x13); @@ -1621,21 +803,23 @@ void sub_80BA800(u8 taskId) // Task_DrawDriverTestMenu gUnknown_020387B4[CRY_TEST_PRIORITY] = 2; sub_80BAD5C(); sub_80BAE10(0, 0); - TASK.FUNC = sub_80BAA48; + gTasks[taskId].FUNC = sub_80BAA48; } + + void sub_80BAA48(u8 taskId) // Task_ProcessDriverTestInput { - if(gMain.newKeys & B_BUTTON) + if (gMain.newKeys & B_BUTTON) { REG_DISPCNT = 0x7140; REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - TASK.FUNC = sub_80BA258; + gTasks[taskId].FUNC = sub_80BA258; return; } - if(gMain.newAndRepeatedKeys & DPAD_UP) // _080BAAA8 + if (gMain.newAndRepeatedKeys & DPAD_UP) // _080BAAA8 { u8 backupVar = gUnknown_020387B3; if(--gUnknown_020387B3 < 0) @@ -1644,7 +828,7 @@ void sub_80BAA48(u8 taskId) // Task_ProcessDriverTestInput sub_80BAE10(backupVar, gUnknown_020387B3); return; } - if(gMain.newAndRepeatedKeys & DPAD_DOWN) // _080BAAD0 + if (gMain.newAndRepeatedKeys & DPAD_DOWN) // _080BAAD0 { u8 backupVar = gUnknown_020387B3; if(++gUnknown_020387B3 > 8) @@ -1653,44 +837,44 @@ void sub_80BAA48(u8 taskId) // Task_ProcessDriverTestInput sub_80BAE10(backupVar, gUnknown_020387B3); return; } - if(gMain.newKeys & START_BUTTON) // _080BAAF8 + if (gMain.newKeys & START_BUTTON) // _080BAAF8 { gUnknown_020387D8 ^= 1; sub_80BAD5C(); return; } - if(gMain.newKeys & SELECT_BUTTON) // _080BAB14 + if (gMain.newKeys & SELECT_BUTTON) // _080BAB14 { gUnknown_020387D9 ^= 1; sub_80BAD5C(); SetPokemonCryStereo(gUnknown_020387D9); return; } - if(gMain.newAndRepeatedKeys & R_BUTTON) // _080BAB38 + if (gMain.newAndRepeatedKeys & R_BUTTON) // _080BAB38 { sub_80BACDC(10); sub_80BAD5C(); return; } - if(gMain.newAndRepeatedKeys & L_BUTTON) // _080BAB46 + if (gMain.newAndRepeatedKeys & L_BUTTON) // _080BAB46 { sub_80BACDC(-10); sub_80BAD5C(); return; } - if(gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BAB56 + if (gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BAB56 { sub_80BACDC(-1); sub_80BAD5C(); return; } - if(gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BAB64 + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BAB64 { sub_80BACDC(1); sub_80BAD5C(); return; } - if(gMain.newKeys & A_BUTTON) // _080BAB78 + if (gMain.newKeys & A_BUTTON) // _080BAB78 { u8 divide, remaining; @@ -1706,41 +890,41 @@ void sub_80BAA48(u8 taskId) // Task_ProcessDriverTestInput remaining = gUnknown_020387B4[CRY_TEST_UNK0] % 128; divide = gUnknown_020387B4[CRY_TEST_UNK0] / 128; - switch(divide) + switch (divide) { - case 0: - if(gUnknown_020387D8) - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84537C0[remaining]); - else - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452590[remaining]); - break; - case 1: - if(gUnknown_020387D8) - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453DC0[remaining]); - else - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452B90[remaining]); - break; - case 2: - if(gUnknown_020387D8) - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84543C0[remaining]); - else - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453190[remaining]); - break; - case 3: - if(gUnknown_020387D8) - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84549C0[remaining]); - else - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453790[remaining]); - break; + case 0: + if (gUnknown_020387D8) + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84537C0[remaining]); + else + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452590[remaining]); + break; + case 1: + if (gUnknown_020387D8) + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453DC0[remaining]); + else + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452B90[remaining]); + break; + case 2: + if (gUnknown_020387D8) + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84543C0[remaining]); + else + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453190[remaining]); + break; + case 3: + if (gUnknown_020387D8) + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84549C0[remaining]); + else + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453790[remaining]); + break; } } // _080BACA2 - if(gUnknown_03005D30 != NULL) + if (gUnknown_03005D30 != NULL) { gUnknown_020387B1 = IsPokemonCryPlaying(gUnknown_03005D30); - if(gUnknown_020387B1 != gUnknown_020387B2) + if (gUnknown_020387B1 != gUnknown_020387B2) sub_80BAD5C(); gUnknown_020387B2 = gUnknown_020387B1; @@ -1749,15 +933,25 @@ void sub_80BAA48(u8 taskId) // Task_ProcessDriverTestInput void sub_80BACDC(s8 var) { - int minMaxArray[ARRAY_COUNT(gUnknown_083D039C)]; + // also ideally should be a MinMax struct, but any attempt to make this into a struct causes it to not match due to the weird multi dim access. + int minMaxArray[16] = + { + 0, 387, + 0, 127, + -127, 127, + -128, 32639, + 0, 65535, + 0, 255, + 0, 65535, + -64, 63 + }; - memcpy(minMaxArray, gUnknown_083D039C, sizeof(gUnknown_083D039C)); gUnknown_020387B4[gUnknown_020387B3] += var; - if(gUnknown_020387B4[gUnknown_020387B3] > minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MAX)]) + if (gUnknown_020387B4[gUnknown_020387B3] > minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MAX)]) gUnknown_020387B4[gUnknown_020387B3] = minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MIN)]; - if(gUnknown_020387B4[gUnknown_020387B3] < minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MIN)]) + if (gUnknown_020387B4[gUnknown_020387B3] < minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MIN)]) gUnknown_020387B4[gUnknown_020387B3] = minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MAX)]; } @@ -1779,206 +973,69 @@ void sub_80BAD5C(void) void sub_80BAE10(u8 var1, u8 var2) { - u8 str1[sizeof(gUnknown_083D03DC)]; - u8 str2[sizeof(gUnknown_083D03DE)]; - - memcpy(str1, gUnknown_083D03DC, sizeof(gUnknown_083D03DC)); - memcpy(str2, gUnknown_083D03DE, sizeof(gUnknown_083D03DE)); + u8 str1[] = _("▶"); + u8 str2[] = _(" "); MenuPrint(str2, gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 1)]); MenuPrint(str1, gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 1)]); } -/*void sub_80BAE78(int var1, u16 var2, u16 var3, u8 var4) +void sub_80BAE78(int n, u16 x, u16 y, u8 digits) { - u32 powers[6]; - u8 str[8]; - u8 i; - u8 someVar, someVar2; - - memcpy(powers, gUnknown_083D03E0, sizeof(powers); - - for(i = 0; i < var4; i++) - str[i] = 0; - - str[var4 + 1] = CHAR_0; - someVar = 0; - - if(var1 < 0) // make absolute value? wtf + int powersOfTen[6] = { - var1 = -var1; // just use abs? - someVar = 1; - } + 1, + 10, + 100, + 1000, + 10000, + 100000 + }; + u8 str[8]; + s8 i; + s8 negative; + s8 someVar2; - // _080BAED6 - someVar2 = 0; - if(var4 == 1) - someVar2 = 1; + for (i = 0; i <= digits; i++) + str[i] = CHAR_SPACE; + str[digits + 1] = EOS; - // _080BAEE2 - for(;;) + negative = FALSE; + if (n < 0) { - + n = -n; + negative = TRUE; } -}*/ -// no. -__attribute__((naked)) -void sub_80BAE78(int var1, u16 var2, u16 var3, u8 var4) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x2C\n\ - mov r8, r0\n\ - lsls r1, 16\n\ - lsrs r6, r1, 16\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - lsls r3, 24\n\ - lsrs r7, r3, 24\n\ - mov r1, sp\n\ - ldr r0, _080BAF80 @ =gUnknown_083D03E0\n\ - ldm r0!, {r3-r5}\n\ - stm r1!, {r3-r5}\n\ - ldm r0!, {r3-r5}\n\ - stm r1!, {r3-r5}\n\ - movs r5, 0\n\ - add r0, sp, 0x18\n\ - mov r9, r0\n\ - cmp r5, r7\n\ - bgt _080BAEC0\n\ - mov r4, r9\n\ - movs r3, 0\n\ -_080BAEAC:\n\ - lsls r0, r5, 24\n\ - asrs r0, 24\n\ - adds r1, r4, r0\n\ - strb r3, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, r7\n\ - ble _080BAEAC\n\ -_080BAEC0:\n\ - adds r0, r7, 0x1\n\ - add r0, r9\n\ - movs r1, 0xFF\n\ - strb r1, [r0]\n\ - movs r1, 0\n\ - mov r3, r8\n\ - cmp r3, 0\n\ - bge _080BAED6\n\ - negs r3, r3\n\ - mov r8, r3\n\ - movs r1, 0x1\n\ -_080BAED6:\n\ - movs r4, 0\n\ - mov r10, r4\n\ - cmp r7, 0x1\n\ - bne _080BAEE2\n\ - movs r5, 0x1\n\ - mov r10, r5\n\ -_080BAEE2:\n\ - subs r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - lsls r0, r5, 24\n\ - lsls r6, 24\n\ - str r6, [sp, 0x24]\n\ - lsls r2, 24\n\ - str r2, [sp, 0x28]\n\ - cmp r0, 0\n\ - blt _080BAF62\n\ - str r1, [sp, 0x20]\n\ -_080BAEF8:\n\ - asrs r6, r0, 24\n\ - lsls r0, r6, 2\n\ - add r0, sp\n\ - ldr r1, [r0]\n\ - mov r0, r8\n\ - bl __divsi3\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - cmp r0, 0\n\ - bne _080BAF1A\n\ - mov r0, r10\n\ - cmp r0, 0\n\ - bne _080BAF1A\n\ - lsls r4, r5, 24\n\ - cmp r6, 0\n\ - bne _080BAF46\n\ -_080BAF1A:\n\ - lsls r4, r5, 24\n\ - ldr r3, [sp, 0x20]\n\ - cmp r3, 0\n\ - beq _080BAF34\n\ - mov r5, r10\n\ - cmp r5, 0\n\ - bne _080BAF34\n\ - asrs r0, r4, 24\n\ - subs r0, r7, r0\n\ - subs r0, 0x1\n\ - add r0, r9\n\ - movs r1, 0xAE\n\ - strb r1, [r0]\n\ -_080BAF34:\n\ - asrs r1, r4, 24\n\ - subs r1, r7, r1\n\ - add r1, r9\n\ - lsls r0, r2, 24\n\ - asrs r0, 24\n\ - subs r0, 0x5F\n\ - strb r0, [r1]\n\ - movs r0, 0x1\n\ - mov r10, r0\n\ -_080BAF46:\n\ - asrs r4, 24\n\ - lsls r0, r4, 2\n\ - add r0, sp\n\ - ldr r1, [r0]\n\ - mov r0, r8\n\ - bl __modsi3\n\ - mov r8, r0\n\ - subs r4, 0x1\n\ - lsls r4, 24\n\ - lsrs r5, r4, 24\n\ - lsls r0, r5, 24\n\ - cmp r0, 0\n\ - bge _080BAEF8\n\ -_080BAF62:\n\ - ldr r3, [sp, 0x24]\n\ - lsrs r1, r3, 24\n\ - ldr r4, [sp, 0x28]\n\ - lsrs r2, r4, 24\n\ - mov r0, r9\n\ - bl MenuPrint\n\ - add sp, 0x2C\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080BAF80: .4byte gUnknown_083D03E0\n\ - .syntax divided"); + if (digits == 1) + someVar2 = TRUE; + else + someVar2 = FALSE; + + for (i = digits - 1; i >= 0; i--) + { + s8 d = n / powersOfTen[i]; + + if (d != 0 || someVar2 || i == 0) + { + if (negative && !someVar2) + str[digits - i - 1] = CHAR_HYPHEN; + str[digits - i] = CHAR_0 + d; + someVar2 = TRUE; + } + n %= powersOfTen[i]; + } + + MenuPrint(str, x, y); } +static const s8 gUnknown_083D03F8[5] = { 0x3F, 0x00, 0xC0, 0x7F, 0x80 }; + void sub_80BAF84(u8 taskId) { - u8 seStr[sizeof(gOtherText_SE)]; - u8 panStr[sizeof(gOtherText_Pan)]; - u8 playingStr[sizeof(gDebugText_Playing)]; - - memcpy(seStr, gOtherText_SE, sizeof(gOtherText_SE)); - memcpy(panStr, gOtherText_Pan, sizeof(gOtherText_Pan)); - memcpy(playingStr, gDebugText_Playing, sizeof(gDebugText_Playing)); + u8 seStr[] = _("SE"); + u8 panStr[] = _("PAN"); + u8 playingStr[] = _("さいせいちゆう‥"); REG_DISPCNT = 0x3140; MenuDrawTextWindow(0, 0, 0x1D, 0x13); @@ -1993,54 +1050,54 @@ void sub_80BAF84(u8 taskId) gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; gUnknown_020387B4[CRY_TEST_RELEASE] = 0; sub_80BB1D4(); - TASK.FUNC = sub_80BB038; + gTasks[taskId].FUNC = sub_80BB038; } void sub_80BB038(u8 taskId) { sub_80BB1D4(); - if(gUnknown_020387B4[CRY_TEST_PROGRESS]) + if (gUnknown_020387B4[CRY_TEST_PROGRESS]) { - if(gUnknown_020387B4[CRY_TEST_RELEASE]) + if (gUnknown_020387B4[CRY_TEST_RELEASE]) { gUnknown_020387B4[CRY_TEST_RELEASE]--; } else // _080BB05C { s8 panpot = gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]; - if(panpot != -128) + if (panpot != -128) { - if(panpot == 0x7F) + if (panpot == 0x7F) { gUnknown_020387B4[CRY_TEST_CHORUS] += 2; - if(gUnknown_020387B4[CRY_TEST_CHORUS] < 0x3F) + if (gUnknown_020387B4[CRY_TEST_CHORUS] < 0x3F) SE12PanpotControl(gUnknown_020387B4[CRY_TEST_CHORUS]); } } else // _080BB08C { gUnknown_020387B4[CRY_TEST_CHORUS] -= 2; - if(gUnknown_020387B4[CRY_TEST_CHORUS] > -0x40) + if (gUnknown_020387B4[CRY_TEST_CHORUS] > -0x40) SE12PanpotControl(gUnknown_020387B4[CRY_TEST_CHORUS]); } } } // _080BB0A2 - if(gMain.newKeys & B_BUTTON) + if (gMain.newKeys & B_BUTTON) { REG_DISPCNT = 0x7140; REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - TASK.FUNC = sub_80BA258; + gTasks[taskId].FUNC = sub_80BA258; return; } - if(gMain.newKeys & A_BUTTON) // _080BB104 + if (gMain.newKeys & A_BUTTON) // _080BB104 { s8 panpot = gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]; - if(panpot != -128) + if (panpot != -128) { - if(panpot == 0x7F) + if (panpot == 0x7F) { PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], -0x40); gUnknown_020387B4[CRY_TEST_CHORUS] = -0x40; @@ -2062,56 +1119,798 @@ void sub_80BB038(u8 taskId) gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; return; } - if(gMain.newKeys & L_BUTTON) // _080BB15E + if (gMain.newKeys & L_BUTTON) // _080BB15E { gUnknown_020387B4[CRY_TEST_PANPOT]++; - if(gUnknown_020387B4[CRY_TEST_PANPOT] > 4) + if (gUnknown_020387B4[CRY_TEST_PANPOT] > 4) gUnknown_020387B4[CRY_TEST_PANPOT] = 0; } - if(gMain.newKeys & R_BUTTON) // _080BB176 + if (gMain.newKeys & R_BUTTON) // _080BB176 { gUnknown_020387B4[CRY_TEST_PANPOT]--; - if(gUnknown_020387B4[CRY_TEST_PANPOT] < 0) + if (gUnknown_020387B4[CRY_TEST_PANPOT] < 0) gUnknown_020387B4[CRY_TEST_PANPOT] = 4; } - if(gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BB192 + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BB192 { gUnknown_020387B4[CRY_TEST_UNK0]++; - if(gUnknown_020387B4[CRY_TEST_UNK0] > 0xF7) + if (gUnknown_020387B4[CRY_TEST_UNK0] > 0xF7) gUnknown_020387B4[CRY_TEST_UNK0] = 0; } - else if(gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BB1B0 + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BB1B0 { gUnknown_020387B4[CRY_TEST_UNK0]--; - if(gUnknown_020387B4[CRY_TEST_UNK0] < 0) + if (gUnknown_020387B4[CRY_TEST_UNK0] < 0) gUnknown_020387B4[CRY_TEST_UNK0] = 0xF7; } } void sub_80BB1D4(void) { - u8 lrStr[sizeof(gOtherText_LR)]; - u8 rlStr[sizeof(gOtherText_RL)]; + u8 lrStr[] = _(" LR"); + u8 rlStr[] = _(" RL"); + + sub_80BAE78(gUnknown_020387B4[CRY_TEST_UNK0], 7, 2, 3); + + switch (gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]) + { + case 0x7F: + MenuPrint(lrStr, 7, 4); + break; + case -0x80: + MenuPrint(rlStr, 7, 4); + break; + default: + sub_80BAE78(gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]], 7, 4, 3); + break; + } + sub_80BAE78(IsSEPlaying(), 12, 8, 1); +} + +// bgm names +static const u8 BGMName_STOP[] = _("STOP"); +static const u8 BGMName_TETSUJI[] = _("TETSUJI"); +static const u8 BGMName_FIELD13[] = _("FIELD13"); +static const u8 BGMName_KACHI22[] = _("KACHI22"); +static const u8 BGMName_KACHI2[] = _("KACHI2"); +static const u8 BGMName_KACHI3[] = _("KACHI3"); +static const u8 BGMName_KACHI5[] = _("KACHI5"); +static const u8 BGMName_PCC[] = _("PCC"); +static const u8 BGMName_NIBI[] = _("NIBI"); +static const u8 BGMName_SUIKUN[] = _("SUIKUN"); +static const u8 BGMName_DOORO1[] = _("DOORO1"); +static const u8 BGMName_DOORO_X1[] = _("DOORO-X1"); +static const u8 BGMName_DOORO_X3[] = _("DOORO-X3"); +static const u8 BGMName_MACHI_S2[] = _("MACHI-S2"); +static const u8 BGMName_MACHI_S4[] = _("MACHI-S4"); +static const u8 BGMName_GIM[] = _("GIM"); +static const u8 BGMName_NAMINORI[] = _("NAMINORI"); +static const u8 BGMName_DAN01[] = _("DAN01"); +static const u8 BGMName_FANFA1[] = _("FANFA1"); +static const u8 BGMName_ME_ASA[] = _("ME-ASA"); +static const u8 BGMName_ME_BACHI[] = _("ME-BACHI"); +static const u8 BGMName_FANFA4[] = _("FANFA4"); +static const u8 BGMName_FANFA5[] = _("FANFA5"); +static const u8 BGMName_ME_WAZA[] = _("ME-WAZA"); +static const u8 BGMName_BIJYUTU[] = _("BIJYUTU"); +static const u8 BGMName_DOORO_X4[] = _("DOORO-X4"); +static const u8 BGMName_FUNE_KAN[] = _("FUNE-KAN"); +static const u8 BGMName_ME_SHINKA[] = _("ME-SHINKA"); +static const u8 BGMName_SHINKA[] = _("SHINKA"); +static const u8 BGMName_ME_WASURE[] = _("ME-WASURE"); +static const u8 BGMName_SYOUJOEYE[] = _("SYOUJOEYE"); +static const u8 BGMName_BOYEYE[] = _("BOYEYE"); +static const u8 BGMName_DAN02[] = _("DAN02"); +static const u8 BGMName_MACHI_S3[] = _("MACHI-S3"); +static const u8 BGMName_ODAMAKI[] = _("ODAMAKI"); +static const u8 BGMName_B_TOWER[] = _("B-TOWER"); +static const u8 BGMName_SWIMEYE[] = _("SWIMEYE"); +static const u8 BGMName_DAN03[] = _("DAN03"); +static const u8 BGMName_ME_KINOMI[] = _("ME-KINOMI"); +static const u8 BGMName_ME_TAMA[] = _("ME-TAMA"); +static const u8 BGMName_ME_B_BIG[] = _("ME-B-BIG"); +static const u8 BGMName_ME_B_SMALL[] = _("ME-B-SMALL"); +static const u8 BGMName_ME_ZANNEN[] = _("ME-ZANNEN"); +static const u8 BGMName_BD_TIME[] = _("BD-TIME"); +static const u8 BGMName_TEST1[] = _("TEST1"); +static const u8 BGMName_TEST2[] = _("TEST2"); +static const u8 BGMName_TEST3[] = _("TEST3"); +static const u8 BGMName_TEST4[] = _("TEST4"); +static const u8 BGMName_TEST[] = _("TEST"); +static const u8 BGMName_GOMACHI0[] = _("GOMACHI0"); +static const u8 BGMName_GOTOWN[] = _("GOTOWN"); +static const u8 BGMName_POKECEN[] = _("POKECEN"); +static const u8 BGMName_NEXTROAD[] = _("NEXTROAD"); +static const u8 BGMName_GRANROAD[] = _("GRANROAD"); +static const u8 BGMName_CYCLING[] = _("CYCLING"); +static const u8 BGMName_FRIENDLY[] = _("FRIENDLY"); +static const u8 BGMName_MISHIRO[] = _("MISHIRO"); +static const u8 BGMName_TOZAN[] = _("TOZAN"); +static const u8 BGMName_GIRLEYE[] = _("GIRLEYE"); +static const u8 BGMName_MINAMO[] = _("MINAMO"); +static const u8 BGMName_ASHROAD[] = _("ASHROAD"); +static const u8 BGMName_EVENT0[] = _("EVENT0"); +static const u8 BGMName_DEEPDEEP[] = _("DEEPDEEP"); +static const u8 BGMName_KACHI1[] = _("KACHI1"); +static const u8 BGMName_TITLE3[] = _("TITLE3"); +static const u8 BGMName_DEMO1[] = _("DEMO1"); +static const u8 BGMName_GIRL_SUP[] = _("GIRL-SUP"); +static const u8 BGMName_HAGESHII[] = _("HAGESHII"); +static const u8 BGMName_KAKKOII[] = _("KAKKOII"); +static const u8 BGMName_KAZANBAI[] = _("KAZANBAI"); +static const u8 BGMName_AQA_0[] = _("AQA-0"); +static const u8 BGMName_TSURETEK[] = _("TSURETEK"); +static const u8 BGMName_BOY_SUP[] = _("BOY-SUP"); +static const u8 BGMName_RAINBOW[] = _("RAINBOW"); +static const u8 BGMName_AYASII[] = _("AYASII"); +static const u8 BGMName_KACHI4[] = _("KACHI4"); +static const u8 BGMName_ROPEWAY[] = _("ROPEWAY"); +static const u8 BGMName_CASINO[] = _("CASINO"); +static const u8 BGMName_HIGHTOWN[] = _("HIGHTOWN"); +static const u8 BGMName_SAFARI[] = _("SAFARI"); +static const u8 BGMName_C_ROAD[] = _("C-ROAD"); +static const u8 BGMName_AJITO[] = _("AJITO"); +static const u8 BGMName_M_BOAT[] = _("M-BOAT"); +static const u8 BGMName_M_DUNGON[] = _("M-DUNGON"); +static const u8 BGMName_FINECITY[] = _("FINECITY"); +static const u8 BGMName_MACHUPI[] = _("MACHUPI"); +static const u8 BGMName_P_SCHOOL[] = _("P-SCHOOL"); +static const u8 BGMName_DENDOU[] = _("DENDOU"); +static const u8 BGMName_TONEKUSA[] = _("TONEKUSA"); +static const u8 BGMName_MABOROSI[] = _("MABOROSI"); +static const u8 BGMName_CON_FAN[] = _("CON-FAN"); +static const u8 BGMName_CONTEST0[] = _("CONTEST0"); +static const u8 BGMName_MGM0[] = _("MGM0"); +static const u8 BGMName_T_BATTLE[] = _("T-BATTLE"); +static const u8 BGMName_OOAME[] = _("OOAME"); +static const u8 BGMName_HIDERI[] = _("HIDERI"); +static const u8 BGMName_RUNECITY[] = _("RUNECITY"); +static const u8 BGMName_CON_K[] = _("CON-K"); +static const u8 BGMName_EIKOU_R[] = _("EIKOU-R"); +static const u8 BGMName_KARAKURI[] = _("KARAKURI"); +static const u8 BGMName_HUTAGO[] = _("HUTAGO"); +static const u8 BGMName_SITENNOU[] = _("SITENNOU"); +static const u8 BGMName_YAMA_EYE[] = _("YAMA-EYE"); +static const u8 BGMName_CONLOBBY[] = _("CONLOBBY"); +static const u8 BGMName_INTER_V[] = _("INTER-V"); +static const u8 BGMName_DAIGO[] = _("DAIGO"); +static const u8 BGMName_THANKFOR[] = _("THANKFOR"); +static const u8 BGMName_END[] = _("END"); +static const u8 BGMName_BATTLE27[] = _("BATTLE27"); +static const u8 BGMName_BATTLE31[] = _("BATTLE31"); +static const u8 BGMName_BATTLE20[] = _("BATTLE20"); +static const u8 BGMName_BATTLE32[] = _("BATTLE32"); +static const u8 BGMName_BATTLE33[] = _("BATTLE33"); +static const u8 BGMName_BATTLE36[] = _("BATTLE36"); +static const u8 BGMName_BATTLE34[] = _("BATTLE34"); +static const u8 BGMName_BATTLE35[] = _("BATTLE35"); +static const u8 BGMName_BATTLE38[] = _("BATTLE38"); +static const u8 BGMName_BATTLE30[] = _("BATTLE30"); + +static const u8 *const gBGMNames[] = +{ + BGMName_STOP, + BGMName_TETSUJI, + BGMName_FIELD13, + BGMName_KACHI22, + BGMName_KACHI2, + BGMName_KACHI3, + BGMName_KACHI5, + BGMName_PCC, + BGMName_NIBI, + BGMName_SUIKUN, + BGMName_DOORO1, + BGMName_DOORO_X1, + BGMName_DOORO_X3, + BGMName_MACHI_S2, + BGMName_MACHI_S4, + BGMName_GIM, + BGMName_NAMINORI, + BGMName_DAN01, + BGMName_FANFA1, + BGMName_ME_ASA, + BGMName_ME_BACHI, + BGMName_FANFA4, + BGMName_FANFA5, + BGMName_ME_WAZA, + BGMName_BIJYUTU, + BGMName_DOORO_X4, + BGMName_FUNE_KAN, + BGMName_ME_SHINKA, + BGMName_SHINKA, + BGMName_ME_WASURE, + BGMName_SYOUJOEYE, + BGMName_BOYEYE, + BGMName_DAN02, + BGMName_MACHI_S3, + BGMName_ODAMAKI, + BGMName_B_TOWER, + BGMName_SWIMEYE, + BGMName_DAN03, + BGMName_ME_KINOMI, + BGMName_ME_TAMA, + BGMName_ME_B_BIG, + BGMName_ME_B_SMALL, + BGMName_ME_ZANNEN, + BGMName_BD_TIME, + BGMName_TEST1, + BGMName_TEST2, + BGMName_TEST3, + BGMName_TEST4, + BGMName_TEST, + BGMName_GOMACHI0, + BGMName_GOTOWN, + BGMName_POKECEN, + BGMName_NEXTROAD, + BGMName_GRANROAD, + BGMName_CYCLING, + BGMName_FRIENDLY, + BGMName_MISHIRO, + BGMName_TOZAN, + BGMName_GIRLEYE, + BGMName_MINAMO, + BGMName_ASHROAD, + BGMName_EVENT0, + BGMName_DEEPDEEP, + BGMName_KACHI1, + BGMName_TITLE3, + BGMName_DEMO1, + BGMName_GIRL_SUP, + BGMName_HAGESHII, + BGMName_KAKKOII, + BGMName_KAZANBAI, + BGMName_AQA_0, + BGMName_TSURETEK, + BGMName_BOY_SUP, + BGMName_RAINBOW, + BGMName_AYASII, + BGMName_KACHI4, + BGMName_ROPEWAY, + BGMName_CASINO, + BGMName_HIGHTOWN, + BGMName_SAFARI, + BGMName_C_ROAD, + BGMName_AJITO, + BGMName_M_BOAT, + BGMName_M_DUNGON, + BGMName_FINECITY, + BGMName_MACHUPI, + BGMName_P_SCHOOL, + BGMName_DENDOU, + BGMName_TONEKUSA, + BGMName_MABOROSI, + BGMName_CON_FAN, + BGMName_CONTEST0, + BGMName_MGM0, + BGMName_T_BATTLE, + BGMName_OOAME, + BGMName_HIDERI, + BGMName_RUNECITY, + BGMName_CON_K, + BGMName_EIKOU_R, + BGMName_KARAKURI, + BGMName_HUTAGO, + BGMName_SITENNOU, + BGMName_YAMA_EYE, + BGMName_CONLOBBY, + BGMName_INTER_V, + BGMName_DAIGO, + BGMName_THANKFOR, + BGMName_END, + BGMName_BATTLE27, + BGMName_BATTLE31, + BGMName_BATTLE20, + BGMName_BATTLE32, + BGMName_BATTLE33, + BGMName_BATTLE36, + BGMName_BATTLE34, + BGMName_BATTLE35, + BGMName_BATTLE38, + BGMName_BATTLE30 +}; - memcpy(lrStr, gOtherText_LR, sizeof(lrStr)); - memcpy(rlStr, gOtherText_RL, sizeof(rlStr)); +// SE names +static const u8 SEName_STOP[] = _("STOP"); +static const u8 SEName_KAIFUKU[] = _("KAIFUKU"); +static const u8 SEName_PC_LOGON[] = _("PC-LOGON"); +static const u8 SEName_PC_OFF[] = _("PC-OFF"); +static const u8 SEName_PC_ON[] = _("PC-ON"); +static const u8 SEName_SELECT[] = _("SELECT"); +static const u8 SEName_WIN_OPEN[] = _("WIN-OPEN"); +static const u8 SEName_WALL_HIT[] = _("WALL-HIT"); +static const u8 SEName_DOOR[] = _("DOOR"); +static const u8 SEName_KAIDAN[] = _("KAIDAN"); +static const u8 SEName_DANSA[] = _("DANSA"); +static const u8 SEName_JITENSYA[] = _("JITENSYA"); +static const u8 SEName_KOUKA_L[] = _("KOUKA-L"); +static const u8 SEName_KOUKA_M[] = _("KOUKA-M"); +static const u8 SEName_KOUKA_H[] = _("KOUKA-H"); +static const u8 SEName_BOWA2[] = _("BOWA2"); +static const u8 SEName_POKE_DEAD[] = _("POKE-DEAD"); +static const u8 SEName_NIGERU[] = _("NIGERU"); +static const u8 SEName_JIDO_DOA[] = _("JIDO-DOA"); +static const u8 SEName_NAMINORI[] = _("NAMINORI"); +static const u8 SEName_BAN[] = _("BAN"); +static const u8 SEName_PIN[] = _("PIN"); +static const u8 SEName_BOO[] = _("BOO"); +static const u8 SEName_BOWA[] = _("BOWA"); +static const u8 SEName_JYUNI[] = _("JYUNI"); +static const u8 SEName_A[] = _("A"); +static const u8 SEName_I[] = _("I"); +static const u8 SEName_U[] = _("U"); +static const u8 SEName_E[] = _("E"); +static const u8 SEName_O[] = _("O"); +static const u8 SEName_N[] = _("N"); +static const u8 SEName_SEIKAI[] = _("SEIKAI"); +static const u8 SEName_HAZURE[] = _("HAZURE"); +static const u8 SEName_EXP[] = _("EXP"); +static const u8 SEName_JITE_PYOKO[] = _("JITE-PYOKO"); +static const u8 SEName_MU_PACHI[] = _("MU-PACHI"); +static const u8 SEName_TK_KASYA[] = _("TK-KASYA"); +static const u8 SEName_FU_ZAKU[] = _("FU-ZAKU"); +static const u8 SEName_FU_ZAKU2[] = _("FU-ZAKU2"); +static const u8 SEName_FU_ZUZUZU[] = _("FU-ZUZUZU"); +static const u8 SEName_RU_GASHIN[] = _("RU-GASHIN"); +static const u8 SEName_RU_GASYAN[] = _("RU-GASYAN"); +static const u8 SEName_RU_BARI[] = _("RU-BARI"); +static const u8 SEName_RU_HYUU[] = _("RU-HYUU"); +static const u8 SEName_KI_GASYAN[] = _("KI-GASYAN"); +static const u8 SEName_TK_WARPIN[] = _("TK-WARPIN"); +static const u8 SEName_TK_WARPOUT[] = _("TK-WARPOUT"); +static const u8 SEName_TU_SAA[] = _("TU-SAA"); +static const u8 SEName_HI_TURUN[] = _("HI-TURUN"); +static const u8 SEName_TRACK_MOVE[] = _("TRACK-MOVE"); +static const u8 SEName_TRACK_STOP[] = _("TRACK-STOP"); +static const u8 SEName_TRACK_HAIK[] = _("TRACK-HAIK"); +static const u8 SEName_TRACK_DOOR[] = _("TRACK-DOOR"); +static const u8 SEName_MOTER[] = _("MOTER"); +static const u8 SEName_CARD[] = _("CARD"); +static const u8 SEName_SAVE[] = _("SAVE"); +static const u8 SEName_KON[] = _("KON"); +static const u8 SEName_KON2[] = _("KON2"); +static const u8 SEName_KON3[] = _("KON3"); +static const u8 SEName_KON4[] = _("KON4"); +static const u8 SEName_SUIKOMU[] = _("SUIKOMU"); +static const u8 SEName_NAGERU[] = _("NAGERU"); +static const u8 SEName_TOY_C[] = _("TOY-C"); +static const u8 SEName_TOY_D[] = _("TOY-D"); +static const u8 SEName_TOY_E[] = _("TOY-E"); +static const u8 SEName_TOY_F[] = _("TOY-F"); +static const u8 SEName_TOY_G[] = _("TOY-G"); +static const u8 SEName_TOY_A[] = _("TOY-A"); +static const u8 SEName_TOY_B[] = _("TOY-B"); +static const u8 SEName_TOY_C1[] = _("TOY-C1"); +static const u8 SEName_MIZU[] = _("MIZU"); +static const u8 SEName_HASHI[] = _("HASHI"); +static const u8 SEName_DAUGI[] = _("DAUGI"); +static const u8 SEName_PINPON[] = _("PINPON"); +static const u8 SEName_FUUSEN1[] = _("FUUSEN1"); +static const u8 SEName_FUUSEN2[] = _("FUUSEN2"); +static const u8 SEName_FUUSEN3[] = _("FUUSEN3"); +static const u8 SEName_TOY_KABE[] = _("TOY-KABE"); +static const u8 SEName_TOY_DANGO[] = _("TOY-DANGO"); +static const u8 SEName_DOKU[] = _("DOKU"); +static const u8 SEName_ESUKA[] = _("ESUKA"); +static const u8 SEName_T_AME[] = _("T-AME"); +static const u8 SEName_T_AME_E[] = _("T-AME-E"); +static const u8 SEName_T_OOAME[] = _("T-OOAME"); +static const u8 SEName_T_OOAME_E[] = _("T-OOAME-E"); +static const u8 SEName_T_KOAME[] = _("T-KOAME"); +static const u8 SEName_T_KOAME_E[] = _("T-KOAME-E"); +static const u8 SEName_T_KAMI[] = _("T-KAMI"); +static const u8 SEName_T_KAMI2[] = _("T-KAMI2"); +static const u8 SEName_ELEBETA[] = _("ELEBETA"); +static const u8 SEName_HINSI[] = _("HINSI"); +static const u8 SEName_EXPMAX[] = _("EXPMAX"); +static const u8 SEName_TAMAKORO[] = _("TAMAKORO"); +static const u8 SEName_TAMAKORO_E[] = _("TAMAKORO-E"); +static const u8 SEName_BASABASA[] = _("BASABASA"); +static const u8 SEName_REGI[] = _("REGI"); +static const u8 SEName_C_GAJI[] = _("C-GAJI"); +static const u8 SEName_C_MAKU_U[] = _("C-MAKU-U"); +static const u8 SEName_C_MAKU_D[] = _("C-MAKU-D"); +static const u8 SEName_C_PASI[] = _("C-PASI"); +static const u8 SEName_C_SYU[] = _("C-SYU"); +static const u8 SEName_C_PIKON[] = _("C-PIKON"); +static const u8 SEName_REAPOKE[] = _("REAPOKE"); +static const u8 SEName_OP_BASYU[] = _("OP-BASYU"); +static const u8 SEName_BT_START[] = _("BT-START"); +static const u8 SEName_DENDOU[] = _("DENDOU"); +static const u8 SEName_JIHANKI[] = _("JIHANKI"); +static const u8 SEName_TAMA[] = _("TAMA"); +static const u8 SEName_Z_SCROLL[] = _("Z-SCROLL"); +static const u8 SEName_Z_PAGE[] = _("Z-PAGE"); +static const u8 SEName_PN_ON[] = _("PN-ON"); +static const u8 SEName_PN_OFF[] = _("PN-OFF"); +static const u8 SEName_Z_SEARCH[] = _("Z-SEARCH"); +static const u8 SEName_TAMAGO[] = _("TAMAGO"); +static const u8 SEName_TB_START[] = _("TB-START"); +static const u8 SEName_TB_KON[] = _("TB-KON"); +static const u8 SEName_TB_KARA[] = _("TB-KARA"); +static const u8 SEName_BIDORO[] = _("BIDORO"); +static const u8 SEName_W085[] = _("W085"); +static const u8 SEName_W085B[] = _("W085B"); +static const u8 SEName_W231[] = _("W231"); +static const u8 SEName_W171[] = _("W171"); +static const u8 SEName_W233[] = _("W233"); +static const u8 SEName_W233B[] = _("W233B"); +static const u8 SEName_W145[] = _("W145"); +static const u8 SEName_W145B[] = _("W145B"); +static const u8 SEName_W145C[] = _("W145C"); +static const u8 SEName_W240[] = _("W240"); +static const u8 SEName_W015[] = _("W015"); +static const u8 SEName_W081[] = _("W081"); +static const u8 SEName_W081B[] = _("W081B"); +static const u8 SEName_W088[] = _("W088"); +static const u8 SEName_W016[] = _("W016"); +static const u8 SEName_W016B[] = _("W016B"); +static const u8 SEName_W003[] = _("W003"); +static const u8 SEName_W104[] = _("W104"); +static const u8 SEName_W013[] = _("W013"); +static const u8 SEName_W196[] = _("W196"); +static const u8 SEName_W086[] = _("W086"); +static const u8 SEName_W004[] = _("W004"); +static const u8 SEName_W025[] = _("W025"); +static const u8 SEName_W025B[] = _("W025B"); +static const u8 SEName_W152[] = _("W152"); +static const u8 SEName_W026[] = _("W026"); +static const u8 SEName_W172[] = _("W172"); +static const u8 SEName_W172B[] = _("W172B"); +static const u8 SEName_W053[] = _("W053"); +static const u8 SEName_W007[] = _("W007"); +static const u8 SEName_W092[] = _("W092"); +static const u8 SEName_W221[] = _("W221"); +static const u8 SEName_W221B[] = _("W221B"); +static const u8 SEName_W052[] = _("W052"); +static const u8 SEName_W036[] = _("W036"); +static const u8 SEName_W059[] = _("W059"); +static const u8 SEName_W059B[] = _("W059B"); +static const u8 SEName_W010[] = _("W010"); +static const u8 SEName_W011[] = _("W011"); +static const u8 SEName_W017[] = _("W017"); +static const u8 SEName_W019[] = _("W019"); +static const u8 SEName_W028[] = _("W028"); +static const u8 SEName_W013B[] = _("W013B"); +static const u8 SEName_W044[] = _("W044"); +static const u8 SEName_W029[] = _("W029"); +static const u8 SEName_W057[] = _("W057"); +static const u8 SEName_W056[] = _("W056"); +static const u8 SEName_W250[] = _("W250"); +static const u8 SEName_W030[] = _("W030"); +static const u8 SEName_W039[] = _("W039"); +static const u8 SEName_W054[] = _("W054"); +static const u8 SEName_W077[] = _("W077"); +static const u8 SEName_W020[] = _("W020"); +static const u8 SEName_W082[] = _("W082"); +static const u8 SEName_W047[] = _("W047"); +static const u8 SEName_W195[] = _("W195"); +static const u8 SEName_W006[] = _("W006"); +static const u8 SEName_W091[] = _("W091"); +static const u8 SEName_W146[] = _("W146"); +static const u8 SEName_W120[] = _("W120"); +static const u8 SEName_W153[] = _("W153"); +static const u8 SEName_W071B[] = _("W071B"); +static const u8 SEName_W071[] = _("W071"); +static const u8 SEName_W103[] = _("W103"); +static const u8 SEName_W062[] = _("W062"); +static const u8 SEName_W062B[] = _("W062B"); +static const u8 SEName_W048[] = _("W048"); +static const u8 SEName_W187[] = _("W187"); +static const u8 SEName_W118[] = _("W118"); +static const u8 SEName_W155[] = _("W155"); +static const u8 SEName_W122[] = _("W122"); +static const u8 SEName_W060[] = _("W060"); +static const u8 SEName_W185[] = _("W185"); +static const u8 SEName_W014[] = _("W014"); +static const u8 SEName_W043[] = _("W043"); +static const u8 SEName_W207[] = _("W207"); +static const u8 SEName_W207B[] = _("W207B"); +static const u8 SEName_W215[] = _("W215"); +static const u8 SEName_W109[] = _("W109"); +static const u8 SEName_W173[] = _("W173"); +static const u8 SEName_W280[] = _("W280"); +static const u8 SEName_W202[] = _("W202"); +static const u8 SEName_W060B[] = _("W060B"); +static const u8 SEName_W076[] = _("W076"); +static const u8 SEName_W080[] = _("W080"); +static const u8 SEName_W100[] = _("W100"); +static const u8 SEName_W107[] = _("W107"); +static const u8 SEName_W166[] = _("W166"); +static const u8 SEName_W129[] = _("W129"); +static const u8 SEName_W115[] = _("W115"); +static const u8 SEName_W112[] = _("W112"); +static const u8 SEName_W197[] = _("W197"); +static const u8 SEName_W199[] = _("W199"); +static const u8 SEName_W236[] = _("W236"); +static const u8 SEName_W204[] = _("W204"); +static const u8 SEName_W268[] = _("W268"); +static const u8 SEName_W070[] = _("W070"); +static const u8 SEName_W063[] = _("W063"); +static const u8 SEName_W127[] = _("W127"); +static const u8 SEName_W179[] = _("W179"); +static const u8 SEName_W151[] = _("W151"); +static const u8 SEName_W201[] = _("W201"); +static const u8 SEName_W161[] = _("W161"); +static const u8 SEName_W161B[] = _("W161B"); +static const u8 SEName_W227[] = _("W227"); +static const u8 SEName_W227B[] = _("W227B"); +static const u8 SEName_W226[] = _("W226"); +static const u8 SEName_W208[] = _("W208"); +static const u8 SEName_W213[] = _("W213"); +static const u8 SEName_W213B[] = _("W213B"); +static const u8 SEName_W234[] = _("W234"); +static const u8 SEName_W260[] = _("W260"); +static const u8 SEName_W328[] = _("W328"); +static const u8 SEName_W320[] = _("W320"); +static const u8 SEName_W255[] = _("W255"); +static const u8 SEName_W291[] = _("W291"); +static const u8 SEName_W089[] = _("W089"); +static const u8 SEName_W239[] = _("W239"); +static const u8 SEName_W230[] = _("W230"); +static const u8 SEName_W281[] = _("W281"); +static const u8 SEName_W327[] = _("W327"); +static const u8 SEName_W287[] = _("W287"); +static const u8 SEName_W257[] = _("W257"); +static const u8 SEName_W253[] = _("W253"); +static const u8 SEName_W258[] = _("W258"); +static const u8 SEName_W322[] = _("W322"); +static const u8 SEName_W298[] = _("W298"); +static const u8 SEName_W287B[] = _("W287B"); +static const u8 SEName_W114[] = _("W114"); +static const u8 SEName_W063B[] = _("W063B"); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_UNK0], 7, 2, 3); +static const u8 *const gSENames[] = +{ + SEName_STOP, + SEName_KAIFUKU, + SEName_PC_LOGON, + SEName_PC_OFF, + SEName_PC_ON, + SEName_SELECT, + SEName_WIN_OPEN, + SEName_WALL_HIT, + SEName_DOOR, + SEName_KAIDAN, + SEName_DANSA, + SEName_JITENSYA, + SEName_KOUKA_L, + SEName_KOUKA_M, + SEName_KOUKA_H, + SEName_BOWA2, + SEName_POKE_DEAD, + SEName_NIGERU, + SEName_JIDO_DOA, + SEName_NAMINORI, + SEName_BAN, + SEName_PIN, + SEName_BOO, + SEName_BOWA, + SEName_JYUNI, + SEName_A, + SEName_I, + SEName_U, + SEName_E, + SEName_O, + SEName_N, + SEName_SEIKAI, + SEName_HAZURE, + SEName_EXP, + SEName_JITE_PYOKO, + SEName_MU_PACHI, + SEName_TK_KASYA, + SEName_FU_ZAKU, + SEName_FU_ZAKU2, + SEName_FU_ZUZUZU, + SEName_RU_GASHIN, + SEName_RU_GASYAN, + SEName_RU_BARI, + SEName_RU_HYUU, + SEName_KI_GASYAN, + SEName_TK_WARPIN, + SEName_TK_WARPOUT, + SEName_TU_SAA, + SEName_HI_TURUN, + SEName_TRACK_MOVE, + SEName_TRACK_STOP, + SEName_TRACK_HAIK, + SEName_TRACK_DOOR, + SEName_MOTER, + SEName_CARD, + SEName_SAVE, + SEName_KON, + SEName_KON2, + SEName_KON3, + SEName_KON4, + SEName_SUIKOMU, + SEName_NAGERU, + SEName_TOY_C, + SEName_TOY_D, + SEName_TOY_E, + SEName_TOY_F, + SEName_TOY_G, + SEName_TOY_A, + SEName_TOY_B, + SEName_TOY_C1, + SEName_MIZU, + SEName_HASHI, + SEName_DAUGI, + SEName_PINPON, + SEName_FUUSEN1, + SEName_FUUSEN2, + SEName_FUUSEN3, + SEName_TOY_KABE, + SEName_TOY_DANGO, + SEName_DOKU, + SEName_ESUKA, + SEName_T_AME, + SEName_T_AME_E, + SEName_T_OOAME, + SEName_T_OOAME_E, + SEName_T_KOAME, + SEName_T_KOAME_E, + SEName_T_KAMI, + SEName_T_KAMI2, + SEName_ELEBETA, + SEName_HINSI, + SEName_EXPMAX, + SEName_TAMAKORO, + SEName_TAMAKORO_E, + SEName_BASABASA, + SEName_REGI, + SEName_C_GAJI, + SEName_C_MAKU_U, + SEName_C_MAKU_D, + SEName_C_PASI, + SEName_C_SYU, + SEName_C_PIKON, + SEName_REAPOKE, + SEName_OP_BASYU, + SEName_BT_START, + SEName_DENDOU, + SEName_JIHANKI, + SEName_TAMA, + SEName_Z_SCROLL, + SEName_Z_PAGE, + SEName_PN_ON, + SEName_PN_OFF, + SEName_Z_SEARCH, + SEName_TAMAGO, + SEName_TB_START, + SEName_TB_KON, + SEName_TB_KARA, + SEName_BIDORO, + SEName_W085, + SEName_W085B, + SEName_W231, + SEName_W171, + SEName_W233, + SEName_W233B, + SEName_W145, + SEName_W145B, + SEName_W145C, + SEName_W240, + SEName_W015, + SEName_W081, + SEName_W081B, + SEName_W088, + SEName_W016, + SEName_W016B, + SEName_W003, + SEName_W104, + SEName_W013, + SEName_W196, + SEName_W086, + SEName_W004, + SEName_W025, + SEName_W025B, + SEName_W152, + SEName_W026, + SEName_W172, + SEName_W172B, + SEName_W053, + SEName_W007, + SEName_W092, + SEName_W221, + SEName_W221B, + SEName_W052, + SEName_W036, + SEName_W059, + SEName_W059B, + SEName_W010, + SEName_W011, + SEName_W017, + SEName_W019, + SEName_W028, + SEName_W013B, + SEName_W044, + SEName_W029, + SEName_W057, + SEName_W056, + SEName_W250, + SEName_W030, + SEName_W039, + SEName_W054, + SEName_W077, + SEName_W020, + SEName_W082, + SEName_W047, + SEName_W195, + SEName_W006, + SEName_W091, + SEName_W146, + SEName_W120, + SEName_W153, + SEName_W071B, + SEName_W071, + SEName_W103, + SEName_W062, + SEName_W062B, + SEName_W048, + SEName_W187, + SEName_W118, + SEName_W155, + SEName_W122, + SEName_W060, + SEName_W185, + SEName_W014, + SEName_W043, + SEName_W207, + SEName_W207B, + SEName_W215, + SEName_W109, + SEName_W173, + SEName_W280, + SEName_W202, + SEName_W060B, + SEName_W076, + SEName_W080, + SEName_W100, + SEName_W107, + SEName_W166, + SEName_W129, + SEName_W115, + SEName_W112, + SEName_W197, + SEName_W199, + SEName_W236, + SEName_W204, + SEName_W268, + SEName_W070, + SEName_W063, + SEName_W127, + SEName_W179, + SEName_W151, + SEName_W201, + SEName_W161, + SEName_W161B, + SEName_W227, + SEName_W227B, + SEName_W226, + SEName_W208, + SEName_W213, + SEName_W213B, + SEName_W234, + SEName_W260, + SEName_W328, + SEName_W320, + SEName_W255, + SEName_W291, + SEName_W089, + SEName_W239, + SEName_W230, + SEName_W281, + SEName_W327, + SEName_W287, + SEName_W257, + SEName_W253, + SEName_W258, + SEName_W322, + SEName_W298, + SEName_W287B, + SEName_W114, + SEName_W063B +}; - switch(gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]) - { - case 0x7F: - MenuPrint(lrStr, 7, 4); - break; - case -0x80: - MenuPrint(rlStr, 7, 4); - break; - default: - sub_80BAE78(gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]], 7, 4, 3); - break; - } - sub_80BAE78(IsSEPlaying(), 12, 8, 1); -} void sub_80BB25C(u8 taskId) { @@ -2133,7 +1932,7 @@ void sub_80BB25C(u8 taskId) zero = 0; // wtf? gUnknown_03005E98 = 0; - while(sub_8119E3C(&cryStruct, 3) == FALSE); + while (sub_8119E3C(&cryStruct, 3) == FALSE); cryStruct2.unk0 = 0; cryStruct2.unk2 = 15; @@ -2144,7 +1943,7 @@ void sub_80BB25C(u8 taskId) zero = 0; // wtf? gUnknown_03005E98 = 0; - while(ShowPokedexCryScreen(&cryStruct2, 2) == FALSE); + while (ShowPokedexCryScreen(&cryStruct2, 2) == FALSE); MenuDrawTextWindow(0, 16, 5, 19); sub_80BB494(); @@ -2155,40 +1954,40 @@ void sub_80BB25C(u8 taskId) REG_BG3CNT = 0x1D03; REG_DISPCNT = 0x1d40; m4aMPlayFadeOutTemporarily(&gMPlay_BGM, 2); - TASK.FUNC = sub_80BB3B4; + gTasks[taskId].FUNC = sub_80BB3B4; } void sub_80BB3B4(u8 taskId) { sub_8119F88(3); - if(gMain.newKeys & A_BUTTON) + if (gMain.newKeys & A_BUTTON) { sub_811A050(gUnknown_03005D34); } - if(gMain.newKeys & R_BUTTON) + if (gMain.newKeys & R_BUTTON) { StopCryAndClearCrySongs(); } - if(gMain.newAndRepeatedKeys & DPAD_UP) + if (gMain.newAndRepeatedKeys & DPAD_UP) { if(--gUnknown_03005D34 == 0) gUnknown_03005D34 = 384; // total species sub_80BB494(); } - if(gMain.newAndRepeatedKeys & DPAD_DOWN) + if (gMain.newAndRepeatedKeys & DPAD_DOWN) { if(++gUnknown_03005D34 > 384) gUnknown_03005D34 = 1; sub_80BB494(); } - if(gMain.newKeys & B_BUTTON) + if (gMain.newKeys & B_BUTTON) { REG_DISPCNT = 0x7140; REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - TASK.FUNC = sub_80BA258; + gTasks[taskId].FUNC = sub_80BA258; DestroyCryMeterNeedleSprite(); } } -- cgit v1.2.3 From 85f505cc083bae5196f4292b2c1621fa06f14e84 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 30 Sep 2017 20:03:09 -0500 Subject: use X-macro for sound list --- src/sound_check_menu.c | 1121 +++++++++++++++++------------------------------- 1 file changed, 385 insertions(+), 736 deletions(-) (limited to 'src') diff --git a/src/sound_check_menu.c b/src/sound_check_menu.c index 438d8bd76..3cc25baf1 100644 --- a/src/sound_check_menu.c +++ b/src/sound_check_menu.c @@ -1167,750 +1167,399 @@ void sub_80BB1D4(void) sub_80BAE78(IsSEPlaying(), 12, 8, 1); } -// bgm names -static const u8 BGMName_STOP[] = _("STOP"); -static const u8 BGMName_TETSUJI[] = _("TETSUJI"); -static const u8 BGMName_FIELD13[] = _("FIELD13"); -static const u8 BGMName_KACHI22[] = _("KACHI22"); -static const u8 BGMName_KACHI2[] = _("KACHI2"); -static const u8 BGMName_KACHI3[] = _("KACHI3"); -static const u8 BGMName_KACHI5[] = _("KACHI5"); -static const u8 BGMName_PCC[] = _("PCC"); -static const u8 BGMName_NIBI[] = _("NIBI"); -static const u8 BGMName_SUIKUN[] = _("SUIKUN"); -static const u8 BGMName_DOORO1[] = _("DOORO1"); -static const u8 BGMName_DOORO_X1[] = _("DOORO-X1"); -static const u8 BGMName_DOORO_X3[] = _("DOORO-X3"); -static const u8 BGMName_MACHI_S2[] = _("MACHI-S2"); -static const u8 BGMName_MACHI_S4[] = _("MACHI-S4"); -static const u8 BGMName_GIM[] = _("GIM"); -static const u8 BGMName_NAMINORI[] = _("NAMINORI"); -static const u8 BGMName_DAN01[] = _("DAN01"); -static const u8 BGMName_FANFA1[] = _("FANFA1"); -static const u8 BGMName_ME_ASA[] = _("ME-ASA"); -static const u8 BGMName_ME_BACHI[] = _("ME-BACHI"); -static const u8 BGMName_FANFA4[] = _("FANFA4"); -static const u8 BGMName_FANFA5[] = _("FANFA5"); -static const u8 BGMName_ME_WAZA[] = _("ME-WAZA"); -static const u8 BGMName_BIJYUTU[] = _("BIJYUTU"); -static const u8 BGMName_DOORO_X4[] = _("DOORO-X4"); -static const u8 BGMName_FUNE_KAN[] = _("FUNE-KAN"); -static const u8 BGMName_ME_SHINKA[] = _("ME-SHINKA"); -static const u8 BGMName_SHINKA[] = _("SHINKA"); -static const u8 BGMName_ME_WASURE[] = _("ME-WASURE"); -static const u8 BGMName_SYOUJOEYE[] = _("SYOUJOEYE"); -static const u8 BGMName_BOYEYE[] = _("BOYEYE"); -static const u8 BGMName_DAN02[] = _("DAN02"); -static const u8 BGMName_MACHI_S3[] = _("MACHI-S3"); -static const u8 BGMName_ODAMAKI[] = _("ODAMAKI"); -static const u8 BGMName_B_TOWER[] = _("B-TOWER"); -static const u8 BGMName_SWIMEYE[] = _("SWIMEYE"); -static const u8 BGMName_DAN03[] = _("DAN03"); -static const u8 BGMName_ME_KINOMI[] = _("ME-KINOMI"); -static const u8 BGMName_ME_TAMA[] = _("ME-TAMA"); -static const u8 BGMName_ME_B_BIG[] = _("ME-B-BIG"); -static const u8 BGMName_ME_B_SMALL[] = _("ME-B-SMALL"); -static const u8 BGMName_ME_ZANNEN[] = _("ME-ZANNEN"); -static const u8 BGMName_BD_TIME[] = _("BD-TIME"); -static const u8 BGMName_TEST1[] = _("TEST1"); -static const u8 BGMName_TEST2[] = _("TEST2"); -static const u8 BGMName_TEST3[] = _("TEST3"); -static const u8 BGMName_TEST4[] = _("TEST4"); -static const u8 BGMName_TEST[] = _("TEST"); -static const u8 BGMName_GOMACHI0[] = _("GOMACHI0"); -static const u8 BGMName_GOTOWN[] = _("GOTOWN"); -static const u8 BGMName_POKECEN[] = _("POKECEN"); -static const u8 BGMName_NEXTROAD[] = _("NEXTROAD"); -static const u8 BGMName_GRANROAD[] = _("GRANROAD"); -static const u8 BGMName_CYCLING[] = _("CYCLING"); -static const u8 BGMName_FRIENDLY[] = _("FRIENDLY"); -static const u8 BGMName_MISHIRO[] = _("MISHIRO"); -static const u8 BGMName_TOZAN[] = _("TOZAN"); -static const u8 BGMName_GIRLEYE[] = _("GIRLEYE"); -static const u8 BGMName_MINAMO[] = _("MINAMO"); -static const u8 BGMName_ASHROAD[] = _("ASHROAD"); -static const u8 BGMName_EVENT0[] = _("EVENT0"); -static const u8 BGMName_DEEPDEEP[] = _("DEEPDEEP"); -static const u8 BGMName_KACHI1[] = _("KACHI1"); -static const u8 BGMName_TITLE3[] = _("TITLE3"); -static const u8 BGMName_DEMO1[] = _("DEMO1"); -static const u8 BGMName_GIRL_SUP[] = _("GIRL-SUP"); -static const u8 BGMName_HAGESHII[] = _("HAGESHII"); -static const u8 BGMName_KAKKOII[] = _("KAKKOII"); -static const u8 BGMName_KAZANBAI[] = _("KAZANBAI"); -static const u8 BGMName_AQA_0[] = _("AQA-0"); -static const u8 BGMName_TSURETEK[] = _("TSURETEK"); -static const u8 BGMName_BOY_SUP[] = _("BOY-SUP"); -static const u8 BGMName_RAINBOW[] = _("RAINBOW"); -static const u8 BGMName_AYASII[] = _("AYASII"); -static const u8 BGMName_KACHI4[] = _("KACHI4"); -static const u8 BGMName_ROPEWAY[] = _("ROPEWAY"); -static const u8 BGMName_CASINO[] = _("CASINO"); -static const u8 BGMName_HIGHTOWN[] = _("HIGHTOWN"); -static const u8 BGMName_SAFARI[] = _("SAFARI"); -static const u8 BGMName_C_ROAD[] = _("C-ROAD"); -static const u8 BGMName_AJITO[] = _("AJITO"); -static const u8 BGMName_M_BOAT[] = _("M-BOAT"); -static const u8 BGMName_M_DUNGON[] = _("M-DUNGON"); -static const u8 BGMName_FINECITY[] = _("FINECITY"); -static const u8 BGMName_MACHUPI[] = _("MACHUPI"); -static const u8 BGMName_P_SCHOOL[] = _("P-SCHOOL"); -static const u8 BGMName_DENDOU[] = _("DENDOU"); -static const u8 BGMName_TONEKUSA[] = _("TONEKUSA"); -static const u8 BGMName_MABOROSI[] = _("MABOROSI"); -static const u8 BGMName_CON_FAN[] = _("CON-FAN"); -static const u8 BGMName_CONTEST0[] = _("CONTEST0"); -static const u8 BGMName_MGM0[] = _("MGM0"); -static const u8 BGMName_T_BATTLE[] = _("T-BATTLE"); -static const u8 BGMName_OOAME[] = _("OOAME"); -static const u8 BGMName_HIDERI[] = _("HIDERI"); -static const u8 BGMName_RUNECITY[] = _("RUNECITY"); -static const u8 BGMName_CON_K[] = _("CON-K"); -static const u8 BGMName_EIKOU_R[] = _("EIKOU-R"); -static const u8 BGMName_KARAKURI[] = _("KARAKURI"); -static const u8 BGMName_HUTAGO[] = _("HUTAGO"); -static const u8 BGMName_SITENNOU[] = _("SITENNOU"); -static const u8 BGMName_YAMA_EYE[] = _("YAMA-EYE"); -static const u8 BGMName_CONLOBBY[] = _("CONLOBBY"); -static const u8 BGMName_INTER_V[] = _("INTER-V"); -static const u8 BGMName_DAIGO[] = _("DAIGO"); -static const u8 BGMName_THANKFOR[] = _("THANKFOR"); -static const u8 BGMName_END[] = _("END"); -static const u8 BGMName_BATTLE27[] = _("BATTLE27"); -static const u8 BGMName_BATTLE31[] = _("BATTLE31"); -static const u8 BGMName_BATTLE20[] = _("BATTLE20"); -static const u8 BGMName_BATTLE32[] = _("BATTLE32"); -static const u8 BGMName_BATTLE33[] = _("BATTLE33"); -static const u8 BGMName_BATTLE36[] = _("BATTLE36"); -static const u8 BGMName_BATTLE34[] = _("BATTLE34"); -static const u8 BGMName_BATTLE35[] = _("BATTLE35"); -static const u8 BGMName_BATTLE38[] = _("BATTLE38"); -static const u8 BGMName_BATTLE30[] = _("BATTLE30"); - +#define SOUND_LIST_BGM \ + X(BGM_STOP, "STOP") \ + X(BGM_TETSUJI, "TETSUJI") \ + X(BGM_FIELD13, "FIELD13") \ + X(BGM_KACHI22, "KACHI22") \ + X(BGM_KACHI2, "KACHI2") \ + X(BGM_KACHI3, "KACHI3") \ + X(BGM_KACHI5, "KACHI5") \ + X(BGM_PCC, "PCC") \ + X(BGM_NIBI, "NIBI") \ + X(BGM_SUIKUN, "SUIKUN") \ + X(BGM_DOORO1, "DOORO1") \ + X(BGM_DOORO_X1, "DOORO-X1") \ + X(BGM_DOORO_X3, "DOORO-X3") \ + X(BGM_MACHI_S2, "MACHI-S2") \ + X(BGM_MACHI_S4, "MACHI-S4") \ + X(BGM_GIM, "GIM") \ + X(BGM_NAMINORI, "NAMINORI") \ + X(BGM_DAN01, "DAN01") \ + X(BGM_FANFA1, "FANFA1") \ + X(BGM_ME_ASA, "ME-ASA") \ + X(BGM_ME_BACHI, "ME-BACHI") \ + X(BGM_FANFA4, "FANFA4") \ + X(BGM_FANFA5, "FANFA5") \ + X(BGM_ME_WAZA, "ME-WAZA") \ + X(BGM_BIJYUTU, "BIJYUTU") \ + X(BGM_DOORO_X4, "DOORO-X4") \ + X(BGM_FUNE_KAN, "FUNE-KAN") \ + X(BGM_ME_SHINKA, "ME-SHINKA") \ + X(BGM_SHINKA, "SHINKA") \ + X(BGM_ME_WASURE, "ME-WASURE") \ + X(BGM_SYOUJOEYE, "SYOUJOEYE") \ + X(BGM_BOYEYE, "BOYEYE") \ + X(BGM_DAN02, "DAN02") \ + X(BGM_MACHI_S3, "MACHI-S3") \ + X(BGM_ODAMAKI, "ODAMAKI") \ + X(BGM_B_TOWER, "B-TOWER") \ + X(BGM_SWIMEYE, "SWIMEYE") \ + X(BGM_DAN03, "DAN03") \ + X(BGM_ME_KINOMI, "ME-KINOMI") \ + X(BGM_ME_TAMA, "ME-TAMA") \ + X(BGM_ME_B_BIG, "ME-B-BIG") \ + X(BGM_ME_B_SMALL, "ME-B-SMALL") \ + X(BGM_ME_ZANNEN, "ME-ZANNEN") \ + X(BGM_BD_TIME, "BD-TIME") \ + X(BGM_TEST1, "TEST1") \ + X(BGM_TEST2, "TEST2") \ + X(BGM_TEST3, "TEST3") \ + X(BGM_TEST4, "TEST4") \ + X(BGM_TEST, "TEST") \ + X(BGM_GOMACHI0, "GOMACHI0") \ + X(BGM_GOTOWN, "GOTOWN") \ + X(BGM_POKECEN, "POKECEN") \ + X(BGM_NEXTROAD, "NEXTROAD") \ + X(BGM_GRANROAD, "GRANROAD") \ + X(BGM_CYCLING, "CYCLING") \ + X(BGM_FRIENDLY, "FRIENDLY") \ + X(BGM_MISHIRO, "MISHIRO") \ + X(BGM_TOZAN, "TOZAN") \ + X(BGM_GIRLEYE, "GIRLEYE") \ + X(BGM_MINAMO, "MINAMO") \ + X(BGM_ASHROAD, "ASHROAD") \ + X(BGM_EVENT0, "EVENT0") \ + X(BGM_DEEPDEEP, "DEEPDEEP") \ + X(BGM_KACHI1, "KACHI1") \ + X(BGM_TITLE3, "TITLE3") \ + X(BGM_DEMO1, "DEMO1") \ + X(BGM_GIRL_SUP, "GIRL-SUP") \ + X(BGM_HAGESHII, "HAGESHII") \ + X(BGM_KAKKOII, "KAKKOII") \ + X(BGM_KAZANBAI, "KAZANBAI") \ + X(BGM_AQA_0, "AQA-0") \ + X(BGM_TSURETEK, "TSURETEK") \ + X(BGM_BOY_SUP, "BOY-SUP") \ + X(BGM_RAINBOW, "RAINBOW") \ + X(BGM_AYASII, "AYASII") \ + X(BGM_KACHI4, "KACHI4") \ + X(BGM_ROPEWAY, "ROPEWAY") \ + X(BGM_CASINO, "CASINO") \ + X(BGM_HIGHTOWN, "HIGHTOWN") \ + X(BGM_SAFARI, "SAFARI") \ + X(BGM_C_ROAD, "C-ROAD") \ + X(BGM_AJITO, "AJITO") \ + X(BGM_M_BOAT, "M-BOAT") \ + X(BGM_M_DUNGON, "M-DUNGON") \ + X(BGM_FINECITY, "FINECITY") \ + X(BGM_MACHUPI, "MACHUPI") \ + X(BGM_P_SCHOOL, "P-SCHOOL") \ + X(BGM_DENDOU, "DENDOU") \ + X(BGM_TONEKUSA, "TONEKUSA") \ + X(BGM_MABOROSI, "MABOROSI") \ + X(BGM_CON_FAN, "CON-FAN") \ + X(BGM_CONTEST0, "CONTEST0") \ + X(BGM_MGM0, "MGM0") \ + X(BGM_T_BATTLE, "T-BATTLE") \ + X(BGM_OOAME, "OOAME") \ + X(BGM_HIDERI, "HIDERI") \ + X(BGM_RUNECITY, "RUNECITY") \ + X(BGM_CON_K, "CON-K") \ + X(BGM_EIKOU_R, "EIKOU-R") \ + X(BGM_KARAKURI, "KARAKURI") \ + X(BGM_HUTAGO, "HUTAGO") \ + X(BGM_SITENNOU, "SITENNOU") \ + X(BGM_YAMA_EYE, "YAMA-EYE") \ + X(BGM_CONLOBBY, "CONLOBBY") \ + X(BGM_INTER_V, "INTER-V") \ + X(BGM_DAIGO, "DAIGO") \ + X(BGM_THANKFOR, "THANKFOR") \ + X(BGM_END, "END") \ + X(BGM_BATTLE27, "BATTLE27") \ + X(BGM_BATTLE31, "BATTLE31") \ + X(BGM_BATTLE20, "BATTLE20") \ + X(BGM_BATTLE32, "BATTLE32") \ + X(BGM_BATTLE33, "BATTLE33") \ + X(BGM_BATTLE36, "BATTLE36") \ + X(BGM_BATTLE34, "BATTLE34") \ + X(BGM_BATTLE35, "BATTLE35") \ + X(BGM_BATTLE38, "BATTLE38") \ + X(BGM_BATTLE30, "BATTLE30") + +#define SOUND_LIST_SE \ + X(SE_STOP, "STOP") \ + X(SE_KAIFUKU, "KAIFUKU") \ + X(SE_PC_LOGON, "PC-LOGON") \ + X(SE_PC_OFF, "PC-OFF") \ + X(SE_PC_ON, "PC-ON") \ + X(SE_SELECT, "SELECT") \ + X(SE_WIN_OPEN, "WIN-OPEN") \ + X(SE_WALL_HIT, "WALL-HIT") \ + X(SE_DOOR, "DOOR") \ + X(SE_KAIDAN, "KAIDAN") \ + X(SE_DANSA, "DANSA") \ + X(SE_JITENSYA, "JITENSYA") \ + X(SE_KOUKA_L, "KOUKA-L") \ + X(SE_KOUKA_M, "KOUKA-M") \ + X(SE_KOUKA_H, "KOUKA-H") \ + X(SE_BOWA2, "BOWA2") \ + X(SE_POKE_DEAD, "POKE-DEAD") \ + X(SE_NIGERU, "NIGERU") \ + X(SE_JIDO_DOA, "JIDO-DOA") \ + X(SE_NAMINORI, "NAMINORI") \ + X(SE_BAN, "BAN") \ + X(SE_PIN, "PIN") \ + X(SE_BOO, "BOO") \ + X(SE_BOWA, "BOWA") \ + X(SE_JYUNI, "JYUNI") \ + X(SE_A, "A") \ + X(SE_I, "I") \ + X(SE_U, "U") \ + X(SE_E, "E") \ + X(SE_O, "O") \ + X(SE_N, "N") \ + X(SE_SEIKAI, "SEIKAI") \ + X(SE_HAZURE, "HAZURE") \ + X(SE_EXP, "EXP") \ + X(SE_JITE_PYOKO, "JITE-PYOKO") \ + X(SE_MU_PACHI, "MU-PACHI") \ + X(SE_TK_KASYA, "TK-KASYA") \ + X(SE_FU_ZAKU, "FU-ZAKU") \ + X(SE_FU_ZAKU2, "FU-ZAKU2") \ + X(SE_FU_ZUZUZU, "FU-ZUZUZU") \ + X(SE_RU_GASHIN, "RU-GASHIN") \ + X(SE_RU_GASYAN, "RU-GASYAN") \ + X(SE_RU_BARI, "RU-BARI") \ + X(SE_RU_HYUU, "RU-HYUU") \ + X(SE_KI_GASYAN, "KI-GASYAN") \ + X(SE_TK_WARPIN, "TK-WARPIN") \ + X(SE_TK_WARPOUT, "TK-WARPOUT") \ + X(SE_TU_SAA, "TU-SAA") \ + X(SE_HI_TURUN, "HI-TURUN") \ + X(SE_TRACK_MOVE, "TRACK-MOVE") \ + X(SE_TRACK_STOP, "TRACK-STOP") \ + X(SE_TRACK_HAIK, "TRACK-HAIK") \ + X(SE_TRACK_DOOR, "TRACK-DOOR") \ + X(SE_MOTER, "MOTER") \ + X(SE_CARD, "CARD") \ + X(SE_SAVE, "SAVE") \ + X(SE_KON, "KON") \ + X(SE_KON2, "KON2") \ + X(SE_KON3, "KON3") \ + X(SE_KON4, "KON4") \ + X(SE_SUIKOMU, "SUIKOMU") \ + X(SE_NAGERU, "NAGERU") \ + X(SE_TOY_C, "TOY-C") \ + X(SE_TOY_D, "TOY-D") \ + X(SE_TOY_E, "TOY-E") \ + X(SE_TOY_F, "TOY-F") \ + X(SE_TOY_G, "TOY-G") \ + X(SE_TOY_A, "TOY-A") \ + X(SE_TOY_B, "TOY-B") \ + X(SE_TOY_C1, "TOY-C1") \ + X(SE_MIZU, "MIZU") \ + X(SE_HASHI, "HASHI") \ + X(SE_DAUGI, "DAUGI") \ + X(SE_PINPON, "PINPON") \ + X(SE_FUUSEN1, "FUUSEN1") \ + X(SE_FUUSEN2, "FUUSEN2") \ + X(SE_FUUSEN3, "FUUSEN3") \ + X(SE_TOY_KABE, "TOY-KABE") \ + X(SE_TOY_DANGO, "TOY-DANGO") \ + X(SE_DOKU, "DOKU") \ + X(SE_ESUKA, "ESUKA") \ + X(SE_T_AME, "T-AME") \ + X(SE_T_AME_E, "T-AME-E") \ + X(SE_T_OOAME, "T-OOAME") \ + X(SE_T_OOAME_E, "T-OOAME-E") \ + X(SE_T_KOAME, "T-KOAME") \ + X(SE_T_KOAME_E, "T-KOAME-E") \ + X(SE_T_KAMI, "T-KAMI") \ + X(SE_T_KAMI2, "T-KAMI2") \ + X(SE_ELEBETA, "ELEBETA") \ + X(SE_HINSI, "HINSI") \ + X(SE_EXPMAX, "EXPMAX") \ + X(SE_TAMAKORO, "TAMAKORO") \ + X(SE_TAMAKORO_E, "TAMAKORO-E") \ + X(SE_BASABASA, "BASABASA") \ + X(SE_REGI, "REGI") \ + X(SE_C_GAJI, "C-GAJI") \ + X(SE_C_MAKU_U, "C-MAKU-U") \ + X(SE_C_MAKU_D, "C-MAKU-D") \ + X(SE_C_PASI, "C-PASI") \ + X(SE_C_SYU, "C-SYU") \ + X(SE_C_PIKON, "C-PIKON") \ + X(SE_REAPOKE, "REAPOKE") \ + X(SE_OP_BASYU, "OP-BASYU") \ + X(SE_BT_START, "BT-START") \ + X(SE_DENDOU, "DENDOU") \ + X(SE_JIHANKI, "JIHANKI") \ + X(SE_TAMA, "TAMA") \ + X(SE_Z_SCROLL, "Z-SCROLL") \ + X(SE_Z_PAGE, "Z-PAGE") \ + X(SE_PN_ON, "PN-ON") \ + X(SE_PN_OFF, "PN-OFF") \ + X(SE_Z_SEARCH, "Z-SEARCH") \ + X(SE_TAMAGO, "TAMAGO") \ + X(SE_TB_START, "TB-START") \ + X(SE_TB_KON, "TB-KON") \ + X(SE_TB_KARA, "TB-KARA") \ + X(SE_BIDORO, "BIDORO") \ + X(SE_W085, "W085") \ + X(SE_W085B, "W085B") \ + X(SE_W231, "W231") \ + X(SE_W171, "W171") \ + X(SE_W233, "W233") \ + X(SE_W233B, "W233B") \ + X(SE_W145, "W145") \ + X(SE_W145B, "W145B") \ + X(SE_W145C, "W145C") \ + X(SE_W240, "W240") \ + X(SE_W015, "W015") \ + X(SE_W081, "W081") \ + X(SE_W081B, "W081B") \ + X(SE_W088, "W088") \ + X(SE_W016, "W016") \ + X(SE_W016B, "W016B") \ + X(SE_W003, "W003") \ + X(SE_W104, "W104") \ + X(SE_W013, "W013") \ + X(SE_W196, "W196") \ + X(SE_W086, "W086") \ + X(SE_W004, "W004") \ + X(SE_W025, "W025") \ + X(SE_W025B, "W025B") \ + X(SE_W152, "W152") \ + X(SE_W026, "W026") \ + X(SE_W172, "W172") \ + X(SE_W172B, "W172B") \ + X(SE_W053, "W053") \ + X(SE_W007, "W007") \ + X(SE_W092, "W092") \ + X(SE_W221, "W221") \ + X(SE_W221B, "W221B") \ + X(SE_W052, "W052") \ + X(SE_W036, "W036") \ + X(SE_W059, "W059") \ + X(SE_W059B, "W059B") \ + X(SE_W010, "W010") \ + X(SE_W011, "W011") \ + X(SE_W017, "W017") \ + X(SE_W019, "W019") \ + X(SE_W028, "W028") \ + X(SE_W013B, "W013B") \ + X(SE_W044, "W044") \ + X(SE_W029, "W029") \ + X(SE_W057, "W057") \ + X(SE_W056, "W056") \ + X(SE_W250, "W250") \ + X(SE_W030, "W030") \ + X(SE_W039, "W039") \ + X(SE_W054, "W054") \ + X(SE_W077, "W077") \ + X(SE_W020, "W020") \ + X(SE_W082, "W082") \ + X(SE_W047, "W047") \ + X(SE_W195, "W195") \ + X(SE_W006, "W006") \ + X(SE_W091, "W091") \ + X(SE_W146, "W146") \ + X(SE_W120, "W120") \ + X(SE_W153, "W153") \ + X(SE_W071B, "W071B") \ + X(SE_W071, "W071") \ + X(SE_W103, "W103") \ + X(SE_W062, "W062") \ + X(SE_W062B, "W062B") \ + X(SE_W048, "W048") \ + X(SE_W187, "W187") \ + X(SE_W118, "W118") \ + X(SE_W155, "W155") \ + X(SE_W122, "W122") \ + X(SE_W060, "W060") \ + X(SE_W185, "W185") \ + X(SE_W014, "W014") \ + X(SE_W043, "W043") \ + X(SE_W207, "W207") \ + X(SE_W207B, "W207B") \ + X(SE_W215, "W215") \ + X(SE_W109, "W109") \ + X(SE_W173, "W173") \ + X(SE_W280, "W280") \ + X(SE_W202, "W202") \ + X(SE_W060B, "W060B") \ + X(SE_W076, "W076") \ + X(SE_W080, "W080") \ + X(SE_W100, "W100") \ + X(SE_W107, "W107") \ + X(SE_W166, "W166") \ + X(SE_W129, "W129") \ + X(SE_W115, "W115") \ + X(SE_W112, "W112") \ + X(SE_W197, "W197") \ + X(SE_W199, "W199") \ + X(SE_W236, "W236") \ + X(SE_W204, "W204") \ + X(SE_W268, "W268") \ + X(SE_W070, "W070") \ + X(SE_W063, "W063") \ + X(SE_W127, "W127") \ + X(SE_W179, "W179") \ + X(SE_W151, "W151") \ + X(SE_W201, "W201") \ + X(SE_W161, "W161") \ + X(SE_W161B, "W161B") \ + X(SE_W227, "W227") \ + X(SE_W227B, "W227B") \ + X(SE_W226, "W226") \ + X(SE_W208, "W208") \ + X(SE_W213, "W213") \ + X(SE_W213B, "W213B") \ + X(SE_W234, "W234") \ + X(SE_W260, "W260") \ + X(SE_W328, "W328") \ + X(SE_W320, "W320") \ + X(SE_W255, "W255") \ + X(SE_W291, "W291") \ + X(SE_W089, "W089") \ + X(SE_W239, "W239") \ + X(SE_W230, "W230") \ + X(SE_W281, "W281") \ + X(SE_W327, "W327") \ + X(SE_W287, "W287") \ + X(SE_W257, "W257") \ + X(SE_W253, "W253") \ + X(SE_W258, "W258") \ + X(SE_W322, "W322") \ + X(SE_W298, "W298") \ + X(SE_W287B, "W287B") \ + X(SE_W114, "W114") \ + X(SE_W063B, "W063B") + +// Create BGM list +#define X(songId, name) static const u8 sBGMName_##songId[] = _(name); +SOUND_LIST_BGM +#undef X + +#define X(songId, name) sBGMName_##songId, static const u8 *const gBGMNames[] = { - BGMName_STOP, - BGMName_TETSUJI, - BGMName_FIELD13, - BGMName_KACHI22, - BGMName_KACHI2, - BGMName_KACHI3, - BGMName_KACHI5, - BGMName_PCC, - BGMName_NIBI, - BGMName_SUIKUN, - BGMName_DOORO1, - BGMName_DOORO_X1, - BGMName_DOORO_X3, - BGMName_MACHI_S2, - BGMName_MACHI_S4, - BGMName_GIM, - BGMName_NAMINORI, - BGMName_DAN01, - BGMName_FANFA1, - BGMName_ME_ASA, - BGMName_ME_BACHI, - BGMName_FANFA4, - BGMName_FANFA5, - BGMName_ME_WAZA, - BGMName_BIJYUTU, - BGMName_DOORO_X4, - BGMName_FUNE_KAN, - BGMName_ME_SHINKA, - BGMName_SHINKA, - BGMName_ME_WASURE, - BGMName_SYOUJOEYE, - BGMName_BOYEYE, - BGMName_DAN02, - BGMName_MACHI_S3, - BGMName_ODAMAKI, - BGMName_B_TOWER, - BGMName_SWIMEYE, - BGMName_DAN03, - BGMName_ME_KINOMI, - BGMName_ME_TAMA, - BGMName_ME_B_BIG, - BGMName_ME_B_SMALL, - BGMName_ME_ZANNEN, - BGMName_BD_TIME, - BGMName_TEST1, - BGMName_TEST2, - BGMName_TEST3, - BGMName_TEST4, - BGMName_TEST, - BGMName_GOMACHI0, - BGMName_GOTOWN, - BGMName_POKECEN, - BGMName_NEXTROAD, - BGMName_GRANROAD, - BGMName_CYCLING, - BGMName_FRIENDLY, - BGMName_MISHIRO, - BGMName_TOZAN, - BGMName_GIRLEYE, - BGMName_MINAMO, - BGMName_ASHROAD, - BGMName_EVENT0, - BGMName_DEEPDEEP, - BGMName_KACHI1, - BGMName_TITLE3, - BGMName_DEMO1, - BGMName_GIRL_SUP, - BGMName_HAGESHII, - BGMName_KAKKOII, - BGMName_KAZANBAI, - BGMName_AQA_0, - BGMName_TSURETEK, - BGMName_BOY_SUP, - BGMName_RAINBOW, - BGMName_AYASII, - BGMName_KACHI4, - BGMName_ROPEWAY, - BGMName_CASINO, - BGMName_HIGHTOWN, - BGMName_SAFARI, - BGMName_C_ROAD, - BGMName_AJITO, - BGMName_M_BOAT, - BGMName_M_DUNGON, - BGMName_FINECITY, - BGMName_MACHUPI, - BGMName_P_SCHOOL, - BGMName_DENDOU, - BGMName_TONEKUSA, - BGMName_MABOROSI, - BGMName_CON_FAN, - BGMName_CONTEST0, - BGMName_MGM0, - BGMName_T_BATTLE, - BGMName_OOAME, - BGMName_HIDERI, - BGMName_RUNECITY, - BGMName_CON_K, - BGMName_EIKOU_R, - BGMName_KARAKURI, - BGMName_HUTAGO, - BGMName_SITENNOU, - BGMName_YAMA_EYE, - BGMName_CONLOBBY, - BGMName_INTER_V, - BGMName_DAIGO, - BGMName_THANKFOR, - BGMName_END, - BGMName_BATTLE27, - BGMName_BATTLE31, - BGMName_BATTLE20, - BGMName_BATTLE32, - BGMName_BATTLE33, - BGMName_BATTLE36, - BGMName_BATTLE34, - BGMName_BATTLE35, - BGMName_BATTLE38, - BGMName_BATTLE30 +SOUND_LIST_BGM }; +#undef X -// SE names -static const u8 SEName_STOP[] = _("STOP"); -static const u8 SEName_KAIFUKU[] = _("KAIFUKU"); -static const u8 SEName_PC_LOGON[] = _("PC-LOGON"); -static const u8 SEName_PC_OFF[] = _("PC-OFF"); -static const u8 SEName_PC_ON[] = _("PC-ON"); -static const u8 SEName_SELECT[] = _("SELECT"); -static const u8 SEName_WIN_OPEN[] = _("WIN-OPEN"); -static const u8 SEName_WALL_HIT[] = _("WALL-HIT"); -static const u8 SEName_DOOR[] = _("DOOR"); -static const u8 SEName_KAIDAN[] = _("KAIDAN"); -static const u8 SEName_DANSA[] = _("DANSA"); -static const u8 SEName_JITENSYA[] = _("JITENSYA"); -static const u8 SEName_KOUKA_L[] = _("KOUKA-L"); -static const u8 SEName_KOUKA_M[] = _("KOUKA-M"); -static const u8 SEName_KOUKA_H[] = _("KOUKA-H"); -static const u8 SEName_BOWA2[] = _("BOWA2"); -static const u8 SEName_POKE_DEAD[] = _("POKE-DEAD"); -static const u8 SEName_NIGERU[] = _("NIGERU"); -static const u8 SEName_JIDO_DOA[] = _("JIDO-DOA"); -static const u8 SEName_NAMINORI[] = _("NAMINORI"); -static const u8 SEName_BAN[] = _("BAN"); -static const u8 SEName_PIN[] = _("PIN"); -static const u8 SEName_BOO[] = _("BOO"); -static const u8 SEName_BOWA[] = _("BOWA"); -static const u8 SEName_JYUNI[] = _("JYUNI"); -static const u8 SEName_A[] = _("A"); -static const u8 SEName_I[] = _("I"); -static const u8 SEName_U[] = _("U"); -static const u8 SEName_E[] = _("E"); -static const u8 SEName_O[] = _("O"); -static const u8 SEName_N[] = _("N"); -static const u8 SEName_SEIKAI[] = _("SEIKAI"); -static const u8 SEName_HAZURE[] = _("HAZURE"); -static const u8 SEName_EXP[] = _("EXP"); -static const u8 SEName_JITE_PYOKO[] = _("JITE-PYOKO"); -static const u8 SEName_MU_PACHI[] = _("MU-PACHI"); -static const u8 SEName_TK_KASYA[] = _("TK-KASYA"); -static const u8 SEName_FU_ZAKU[] = _("FU-ZAKU"); -static const u8 SEName_FU_ZAKU2[] = _("FU-ZAKU2"); -static const u8 SEName_FU_ZUZUZU[] = _("FU-ZUZUZU"); -static const u8 SEName_RU_GASHIN[] = _("RU-GASHIN"); -static const u8 SEName_RU_GASYAN[] = _("RU-GASYAN"); -static const u8 SEName_RU_BARI[] = _("RU-BARI"); -static const u8 SEName_RU_HYUU[] = _("RU-HYUU"); -static const u8 SEName_KI_GASYAN[] = _("KI-GASYAN"); -static const u8 SEName_TK_WARPIN[] = _("TK-WARPIN"); -static const u8 SEName_TK_WARPOUT[] = _("TK-WARPOUT"); -static const u8 SEName_TU_SAA[] = _("TU-SAA"); -static const u8 SEName_HI_TURUN[] = _("HI-TURUN"); -static const u8 SEName_TRACK_MOVE[] = _("TRACK-MOVE"); -static const u8 SEName_TRACK_STOP[] = _("TRACK-STOP"); -static const u8 SEName_TRACK_HAIK[] = _("TRACK-HAIK"); -static const u8 SEName_TRACK_DOOR[] = _("TRACK-DOOR"); -static const u8 SEName_MOTER[] = _("MOTER"); -static const u8 SEName_CARD[] = _("CARD"); -static const u8 SEName_SAVE[] = _("SAVE"); -static const u8 SEName_KON[] = _("KON"); -static const u8 SEName_KON2[] = _("KON2"); -static const u8 SEName_KON3[] = _("KON3"); -static const u8 SEName_KON4[] = _("KON4"); -static const u8 SEName_SUIKOMU[] = _("SUIKOMU"); -static const u8 SEName_NAGERU[] = _("NAGERU"); -static const u8 SEName_TOY_C[] = _("TOY-C"); -static const u8 SEName_TOY_D[] = _("TOY-D"); -static const u8 SEName_TOY_E[] = _("TOY-E"); -static const u8 SEName_TOY_F[] = _("TOY-F"); -static const u8 SEName_TOY_G[] = _("TOY-G"); -static const u8 SEName_TOY_A[] = _("TOY-A"); -static const u8 SEName_TOY_B[] = _("TOY-B"); -static const u8 SEName_TOY_C1[] = _("TOY-C1"); -static const u8 SEName_MIZU[] = _("MIZU"); -static const u8 SEName_HASHI[] = _("HASHI"); -static const u8 SEName_DAUGI[] = _("DAUGI"); -static const u8 SEName_PINPON[] = _("PINPON"); -static const u8 SEName_FUUSEN1[] = _("FUUSEN1"); -static const u8 SEName_FUUSEN2[] = _("FUUSEN2"); -static const u8 SEName_FUUSEN3[] = _("FUUSEN3"); -static const u8 SEName_TOY_KABE[] = _("TOY-KABE"); -static const u8 SEName_TOY_DANGO[] = _("TOY-DANGO"); -static const u8 SEName_DOKU[] = _("DOKU"); -static const u8 SEName_ESUKA[] = _("ESUKA"); -static const u8 SEName_T_AME[] = _("T-AME"); -static const u8 SEName_T_AME_E[] = _("T-AME-E"); -static const u8 SEName_T_OOAME[] = _("T-OOAME"); -static const u8 SEName_T_OOAME_E[] = _("T-OOAME-E"); -static const u8 SEName_T_KOAME[] = _("T-KOAME"); -static const u8 SEName_T_KOAME_E[] = _("T-KOAME-E"); -static const u8 SEName_T_KAMI[] = _("T-KAMI"); -static const u8 SEName_T_KAMI2[] = _("T-KAMI2"); -static const u8 SEName_ELEBETA[] = _("ELEBETA"); -static const u8 SEName_HINSI[] = _("HINSI"); -static const u8 SEName_EXPMAX[] = _("EXPMAX"); -static const u8 SEName_TAMAKORO[] = _("TAMAKORO"); -static const u8 SEName_TAMAKORO_E[] = _("TAMAKORO-E"); -static const u8 SEName_BASABASA[] = _("BASABASA"); -static const u8 SEName_REGI[] = _("REGI"); -static const u8 SEName_C_GAJI[] = _("C-GAJI"); -static const u8 SEName_C_MAKU_U[] = _("C-MAKU-U"); -static const u8 SEName_C_MAKU_D[] = _("C-MAKU-D"); -static const u8 SEName_C_PASI[] = _("C-PASI"); -static const u8 SEName_C_SYU[] = _("C-SYU"); -static const u8 SEName_C_PIKON[] = _("C-PIKON"); -static const u8 SEName_REAPOKE[] = _("REAPOKE"); -static const u8 SEName_OP_BASYU[] = _("OP-BASYU"); -static const u8 SEName_BT_START[] = _("BT-START"); -static const u8 SEName_DENDOU[] = _("DENDOU"); -static const u8 SEName_JIHANKI[] = _("JIHANKI"); -static const u8 SEName_TAMA[] = _("TAMA"); -static const u8 SEName_Z_SCROLL[] = _("Z-SCROLL"); -static const u8 SEName_Z_PAGE[] = _("Z-PAGE"); -static const u8 SEName_PN_ON[] = _("PN-ON"); -static const u8 SEName_PN_OFF[] = _("PN-OFF"); -static const u8 SEName_Z_SEARCH[] = _("Z-SEARCH"); -static const u8 SEName_TAMAGO[] = _("TAMAGO"); -static const u8 SEName_TB_START[] = _("TB-START"); -static const u8 SEName_TB_KON[] = _("TB-KON"); -static const u8 SEName_TB_KARA[] = _("TB-KARA"); -static const u8 SEName_BIDORO[] = _("BIDORO"); -static const u8 SEName_W085[] = _("W085"); -static const u8 SEName_W085B[] = _("W085B"); -static const u8 SEName_W231[] = _("W231"); -static const u8 SEName_W171[] = _("W171"); -static const u8 SEName_W233[] = _("W233"); -static const u8 SEName_W233B[] = _("W233B"); -static const u8 SEName_W145[] = _("W145"); -static const u8 SEName_W145B[] = _("W145B"); -static const u8 SEName_W145C[] = _("W145C"); -static const u8 SEName_W240[] = _("W240"); -static const u8 SEName_W015[] = _("W015"); -static const u8 SEName_W081[] = _("W081"); -static const u8 SEName_W081B[] = _("W081B"); -static const u8 SEName_W088[] = _("W088"); -static const u8 SEName_W016[] = _("W016"); -static const u8 SEName_W016B[] = _("W016B"); -static const u8 SEName_W003[] = _("W003"); -static const u8 SEName_W104[] = _("W104"); -static const u8 SEName_W013[] = _("W013"); -static const u8 SEName_W196[] = _("W196"); -static const u8 SEName_W086[] = _("W086"); -static const u8 SEName_W004[] = _("W004"); -static const u8 SEName_W025[] = _("W025"); -static const u8 SEName_W025B[] = _("W025B"); -static const u8 SEName_W152[] = _("W152"); -static const u8 SEName_W026[] = _("W026"); -static const u8 SEName_W172[] = _("W172"); -static const u8 SEName_W172B[] = _("W172B"); -static const u8 SEName_W053[] = _("W053"); -static const u8 SEName_W007[] = _("W007"); -static const u8 SEName_W092[] = _("W092"); -static const u8 SEName_W221[] = _("W221"); -static const u8 SEName_W221B[] = _("W221B"); -static const u8 SEName_W052[] = _("W052"); -static const u8 SEName_W036[] = _("W036"); -static const u8 SEName_W059[] = _("W059"); -static const u8 SEName_W059B[] = _("W059B"); -static const u8 SEName_W010[] = _("W010"); -static const u8 SEName_W011[] = _("W011"); -static const u8 SEName_W017[] = _("W017"); -static const u8 SEName_W019[] = _("W019"); -static const u8 SEName_W028[] = _("W028"); -static const u8 SEName_W013B[] = _("W013B"); -static const u8 SEName_W044[] = _("W044"); -static const u8 SEName_W029[] = _("W029"); -static const u8 SEName_W057[] = _("W057"); -static const u8 SEName_W056[] = _("W056"); -static const u8 SEName_W250[] = _("W250"); -static const u8 SEName_W030[] = _("W030"); -static const u8 SEName_W039[] = _("W039"); -static const u8 SEName_W054[] = _("W054"); -static const u8 SEName_W077[] = _("W077"); -static const u8 SEName_W020[] = _("W020"); -static const u8 SEName_W082[] = _("W082"); -static const u8 SEName_W047[] = _("W047"); -static const u8 SEName_W195[] = _("W195"); -static const u8 SEName_W006[] = _("W006"); -static const u8 SEName_W091[] = _("W091"); -static const u8 SEName_W146[] = _("W146"); -static const u8 SEName_W120[] = _("W120"); -static const u8 SEName_W153[] = _("W153"); -static const u8 SEName_W071B[] = _("W071B"); -static const u8 SEName_W071[] = _("W071"); -static const u8 SEName_W103[] = _("W103"); -static const u8 SEName_W062[] = _("W062"); -static const u8 SEName_W062B[] = _("W062B"); -static const u8 SEName_W048[] = _("W048"); -static const u8 SEName_W187[] = _("W187"); -static const u8 SEName_W118[] = _("W118"); -static const u8 SEName_W155[] = _("W155"); -static const u8 SEName_W122[] = _("W122"); -static const u8 SEName_W060[] = _("W060"); -static const u8 SEName_W185[] = _("W185"); -static const u8 SEName_W014[] = _("W014"); -static const u8 SEName_W043[] = _("W043"); -static const u8 SEName_W207[] = _("W207"); -static const u8 SEName_W207B[] = _("W207B"); -static const u8 SEName_W215[] = _("W215"); -static const u8 SEName_W109[] = _("W109"); -static const u8 SEName_W173[] = _("W173"); -static const u8 SEName_W280[] = _("W280"); -static const u8 SEName_W202[] = _("W202"); -static const u8 SEName_W060B[] = _("W060B"); -static const u8 SEName_W076[] = _("W076"); -static const u8 SEName_W080[] = _("W080"); -static const u8 SEName_W100[] = _("W100"); -static const u8 SEName_W107[] = _("W107"); -static const u8 SEName_W166[] = _("W166"); -static const u8 SEName_W129[] = _("W129"); -static const u8 SEName_W115[] = _("W115"); -static const u8 SEName_W112[] = _("W112"); -static const u8 SEName_W197[] = _("W197"); -static const u8 SEName_W199[] = _("W199"); -static const u8 SEName_W236[] = _("W236"); -static const u8 SEName_W204[] = _("W204"); -static const u8 SEName_W268[] = _("W268"); -static const u8 SEName_W070[] = _("W070"); -static const u8 SEName_W063[] = _("W063"); -static const u8 SEName_W127[] = _("W127"); -static const u8 SEName_W179[] = _("W179"); -static const u8 SEName_W151[] = _("W151"); -static const u8 SEName_W201[] = _("W201"); -static const u8 SEName_W161[] = _("W161"); -static const u8 SEName_W161B[] = _("W161B"); -static const u8 SEName_W227[] = _("W227"); -static const u8 SEName_W227B[] = _("W227B"); -static const u8 SEName_W226[] = _("W226"); -static const u8 SEName_W208[] = _("W208"); -static const u8 SEName_W213[] = _("W213"); -static const u8 SEName_W213B[] = _("W213B"); -static const u8 SEName_W234[] = _("W234"); -static const u8 SEName_W260[] = _("W260"); -static const u8 SEName_W328[] = _("W328"); -static const u8 SEName_W320[] = _("W320"); -static const u8 SEName_W255[] = _("W255"); -static const u8 SEName_W291[] = _("W291"); -static const u8 SEName_W089[] = _("W089"); -static const u8 SEName_W239[] = _("W239"); -static const u8 SEName_W230[] = _("W230"); -static const u8 SEName_W281[] = _("W281"); -static const u8 SEName_W327[] = _("W327"); -static const u8 SEName_W287[] = _("W287"); -static const u8 SEName_W257[] = _("W257"); -static const u8 SEName_W253[] = _("W253"); -static const u8 SEName_W258[] = _("W258"); -static const u8 SEName_W322[] = _("W322"); -static const u8 SEName_W298[] = _("W298"); -static const u8 SEName_W287B[] = _("W287B"); -static const u8 SEName_W114[] = _("W114"); -static const u8 SEName_W063B[] = _("W063B"); +// Create SE list +#define X(songId, name) static const u8 sSEName_##songId[] = _(name); +SOUND_LIST_SE +#undef X +#define X(songId, name) sSEName_##songId, static const u8 *const gSENames[] = { - SEName_STOP, - SEName_KAIFUKU, - SEName_PC_LOGON, - SEName_PC_OFF, - SEName_PC_ON, - SEName_SELECT, - SEName_WIN_OPEN, - SEName_WALL_HIT, - SEName_DOOR, - SEName_KAIDAN, - SEName_DANSA, - SEName_JITENSYA, - SEName_KOUKA_L, - SEName_KOUKA_M, - SEName_KOUKA_H, - SEName_BOWA2, - SEName_POKE_DEAD, - SEName_NIGERU, - SEName_JIDO_DOA, - SEName_NAMINORI, - SEName_BAN, - SEName_PIN, - SEName_BOO, - SEName_BOWA, - SEName_JYUNI, - SEName_A, - SEName_I, - SEName_U, - SEName_E, - SEName_O, - SEName_N, - SEName_SEIKAI, - SEName_HAZURE, - SEName_EXP, - SEName_JITE_PYOKO, - SEName_MU_PACHI, - SEName_TK_KASYA, - SEName_FU_ZAKU, - SEName_FU_ZAKU2, - SEName_FU_ZUZUZU, - SEName_RU_GASHIN, - SEName_RU_GASYAN, - SEName_RU_BARI, - SEName_RU_HYUU, - SEName_KI_GASYAN, - SEName_TK_WARPIN, - SEName_TK_WARPOUT, - SEName_TU_SAA, - SEName_HI_TURUN, - SEName_TRACK_MOVE, - SEName_TRACK_STOP, - SEName_TRACK_HAIK, - SEName_TRACK_DOOR, - SEName_MOTER, - SEName_CARD, - SEName_SAVE, - SEName_KON, - SEName_KON2, - SEName_KON3, - SEName_KON4, - SEName_SUIKOMU, - SEName_NAGERU, - SEName_TOY_C, - SEName_TOY_D, - SEName_TOY_E, - SEName_TOY_F, - SEName_TOY_G, - SEName_TOY_A, - SEName_TOY_B, - SEName_TOY_C1, - SEName_MIZU, - SEName_HASHI, - SEName_DAUGI, - SEName_PINPON, - SEName_FUUSEN1, - SEName_FUUSEN2, - SEName_FUUSEN3, - SEName_TOY_KABE, - SEName_TOY_DANGO, - SEName_DOKU, - SEName_ESUKA, - SEName_T_AME, - SEName_T_AME_E, - SEName_T_OOAME, - SEName_T_OOAME_E, - SEName_T_KOAME, - SEName_T_KOAME_E, - SEName_T_KAMI, - SEName_T_KAMI2, - SEName_ELEBETA, - SEName_HINSI, - SEName_EXPMAX, - SEName_TAMAKORO, - SEName_TAMAKORO_E, - SEName_BASABASA, - SEName_REGI, - SEName_C_GAJI, - SEName_C_MAKU_U, - SEName_C_MAKU_D, - SEName_C_PASI, - SEName_C_SYU, - SEName_C_PIKON, - SEName_REAPOKE, - SEName_OP_BASYU, - SEName_BT_START, - SEName_DENDOU, - SEName_JIHANKI, - SEName_TAMA, - SEName_Z_SCROLL, - SEName_Z_PAGE, - SEName_PN_ON, - SEName_PN_OFF, - SEName_Z_SEARCH, - SEName_TAMAGO, - SEName_TB_START, - SEName_TB_KON, - SEName_TB_KARA, - SEName_BIDORO, - SEName_W085, - SEName_W085B, - SEName_W231, - SEName_W171, - SEName_W233, - SEName_W233B, - SEName_W145, - SEName_W145B, - SEName_W145C, - SEName_W240, - SEName_W015, - SEName_W081, - SEName_W081B, - SEName_W088, - SEName_W016, - SEName_W016B, - SEName_W003, - SEName_W104, - SEName_W013, - SEName_W196, - SEName_W086, - SEName_W004, - SEName_W025, - SEName_W025B, - SEName_W152, - SEName_W026, - SEName_W172, - SEName_W172B, - SEName_W053, - SEName_W007, - SEName_W092, - SEName_W221, - SEName_W221B, - SEName_W052, - SEName_W036, - SEName_W059, - SEName_W059B, - SEName_W010, - SEName_W011, - SEName_W017, - SEName_W019, - SEName_W028, - SEName_W013B, - SEName_W044, - SEName_W029, - SEName_W057, - SEName_W056, - SEName_W250, - SEName_W030, - SEName_W039, - SEName_W054, - SEName_W077, - SEName_W020, - SEName_W082, - SEName_W047, - SEName_W195, - SEName_W006, - SEName_W091, - SEName_W146, - SEName_W120, - SEName_W153, - SEName_W071B, - SEName_W071, - SEName_W103, - SEName_W062, - SEName_W062B, - SEName_W048, - SEName_W187, - SEName_W118, - SEName_W155, - SEName_W122, - SEName_W060, - SEName_W185, - SEName_W014, - SEName_W043, - SEName_W207, - SEName_W207B, - SEName_W215, - SEName_W109, - SEName_W173, - SEName_W280, - SEName_W202, - SEName_W060B, - SEName_W076, - SEName_W080, - SEName_W100, - SEName_W107, - SEName_W166, - SEName_W129, - SEName_W115, - SEName_W112, - SEName_W197, - SEName_W199, - SEName_W236, - SEName_W204, - SEName_W268, - SEName_W070, - SEName_W063, - SEName_W127, - SEName_W179, - SEName_W151, - SEName_W201, - SEName_W161, - SEName_W161B, - SEName_W227, - SEName_W227B, - SEName_W226, - SEName_W208, - SEName_W213, - SEName_W213B, - SEName_W234, - SEName_W260, - SEName_W328, - SEName_W320, - SEName_W255, - SEName_W291, - SEName_W089, - SEName_W239, - SEName_W230, - SEName_W281, - SEName_W327, - SEName_W287, - SEName_W257, - SEName_W253, - SEName_W258, - SEName_W322, - SEName_W298, - SEName_W287B, - SEName_W114, - SEName_W063B +SOUND_LIST_SE }; - +#undef X void sub_80BB25C(u8 taskId) { -- cgit v1.2.3 From ef73a4cf1a022f993c4d13ed6cd00704d6fb7221 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 30 Sep 2017 21:07:50 -0400 Subject: move misc/ files up one dir. --- src/de_rom_8040FE0.c | 272 +++++ src/misc/de_rom_8040FE0.c | 272 ----- src/misc/rom3.c | 1168 ------------------ src/misc/rom6.c | 202 ---- src/misc/rom_800D42C.c | 118 -- src/misc/rom_8077ABC.c | 2055 -------------------------------- src/misc/script_pokemon_util_80C4BF0.c | 714 ----------- src/misc/script_pokemon_util_80F99CC.c | 444 ------- src/misc/unknown_task.c | 248 ---- src/misc/unused_8124F94.c | 126 -- src/rom3.c | 1168 ++++++++++++++++++ src/rom6.c | 202 ++++ src/rom_800D42C.c | 118 ++ src/rom_8077ABC.c | 2055 ++++++++++++++++++++++++++++++++ src/script_pokemon_util_80C4BF0.c | 714 +++++++++++ src/script_pokemon_util_80F99CC.c | 444 +++++++ src/unknown_task.c | 248 ++++ src/unused_8124F94.c | 126 ++ 18 files changed, 5347 insertions(+), 5347 deletions(-) create mode 100644 src/de_rom_8040FE0.c delete mode 100644 src/misc/de_rom_8040FE0.c delete mode 100644 src/misc/rom3.c delete mode 100644 src/misc/rom6.c delete mode 100644 src/misc/rom_800D42C.c delete mode 100644 src/misc/rom_8077ABC.c delete mode 100644 src/misc/script_pokemon_util_80C4BF0.c delete mode 100644 src/misc/script_pokemon_util_80F99CC.c delete mode 100644 src/misc/unknown_task.c delete mode 100644 src/misc/unused_8124F94.c create mode 100644 src/rom3.c create mode 100644 src/rom6.c create mode 100644 src/rom_800D42C.c create mode 100644 src/rom_8077ABC.c create mode 100644 src/script_pokemon_util_80C4BF0.c create mode 100644 src/script_pokemon_util_80F99CC.c create mode 100644 src/unknown_task.c create mode 100644 src/unused_8124F94.c (limited to 'src') diff --git a/src/de_rom_8040FE0.c b/src/de_rom_8040FE0.c new file mode 100644 index 000000000..eebcc1437 --- /dev/null +++ b/src/de_rom_8040FE0.c @@ -0,0 +1,272 @@ +#include "global.h" +#include "battle.h" + +#if GERMAN + +enum { + TRAINER_CLASS_NAME_LEADER = 25, + TRAINER_CLASS_NAME_SCHOOL_KID = 26, + TRAINER_CLASS_NAME_EXPERT = 30, + TRAINER_CLASS_NAME_POKEMON_TRAINER_3 = 46, +}; + +enum { + TRAINER_CLASS_LEADER_F = 26, + TRAINER_CLASS_ELITE_FOUR_F = 25, + TRAINER_CLASS_SCHOOL_KID_F = 30, + TRAINER_CLASS_BIRD_KEEPER = 46, + TRAINER_CLASS_MAY_1 = 61, + TRAINER_CLASS_MAY_2 = 62, + TRAINER_CLASS_MAY_3 = 63, +}; + +extern struct SecretBaseRecord gSecretBaseRecord; + +extern u8 gTrainerClassNames[][13]; +extern struct Trainer gTrainers[]; + +u8 *de_sub_8040FE0(u8 gender) { + if (gender) + { + gender++; + + } + + gender = TRAINER_CLASS_NAME_SCHOOL_KID; + return gTrainerClassNames[gender]; +} + +u8 *de_sub_8040FF4(u8 gender) { + if (gender) { + gender++; + } + + gender = TRAINER_CLASS_NAME_POKEMON_TRAINER_3; + return gTrainerClassNames[gender]; +} + +u8 *de_sub_804100C(u8 gender) { + if (gender) { + gender++; + } + + gender = TRAINER_CLASS_NAME_LEADER; + return gTrainerClassNames[gender]; +} + +#ifdef NONMATCHING + +u8 de_sub_81364AC(void); +u8 get_trainer_class_name_index(void); +u8 de_sub_81364F8(void); +u8 sub_8135FD8(void); + +u8 *de_sub_8041024(s32 arg0, u32 arg1) { + u8 nameIndex, trainerClass, gender; + struct Trainer *trainer; + u8 local2; + + switch (arg0) + { + case 0x400: + nameIndex = GetSecretBaseTrainerNameIndex(); + gender = gSecretBaseRecord.gender; + if (nameIndex == TRAINER_CLASS_NAME_SCHOOL_KID) + { + return de_sub_8040FE0(gender); + } + + return gTrainerClassNames[nameIndex]; + + case 0x100: + trainerClass = de_sub_81364AC(); + nameIndex = get_trainer_class_name_index(); + if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) + { + return de_sub_8040FE0(FEMALE); + } + if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) + { + return de_sub_8040FF4(FEMALE); + } + + return gTrainerClassNames[nameIndex]; + + case 0x800: + trainerClass = de_sub_81364F8(); + nameIndex = sub_8135FD8(); + if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) + { + return de_sub_8040FE0(FEMALE); + } + if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) + { + return de_sub_8040FF4(FEMALE); + } + + return gTrainerClassNames[nameIndex]; + + default: + trainer = &gTrainers[arg1]; + trainerClass = trainer->trainerClass; + local2 = sub_803FC58(arg1); + + if (trainerClass == TRAINER_CLASS_LEADER_F) + { + return de_sub_8040FE0(local2); + } + + if (trainerClass == TRAINER_CLASS_BIRD_KEEPER && local2 == FEMALE) + { + return de_sub_8040FF4(FEMALE); + } + + if (trainerClass == TRAINER_CLASS_ELITE_FOUR_F) + { + if (gTrainers[arg1].doubleBattle == TRUE) + { + return de_sub_804100C(FEMALE); + } + else + { + return de_sub_804100C(MALE); + } + } + + + return gTrainerClassNames[trainerClass]; + } +} +#else + +__attribute__((naked)) +void de_sub_8041024(void) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + adds r2, r0, 0\n\ + adds r6, r1, 0\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + cmp r2, r0\n\ + beq _0804104A\n\ + cmp r2, r0\n\ + bgt _08041040\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + cmp r2, r0\n\ + beq _08041064\n\ + b _0804109C\n\ +_08041040:\n\ + movs r0, 0x80\n\ + lsls r0, 4\n\ + cmp r2, r0\n\ + beq _08041086\n\ + b _0804109C\n\ +_0804104A:\n\ + bl GetSecretBaseTrainerNameIndex\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + ldr r0, _08041060 @ =0x02017000\n\ + ldrb r0, [r0, 0x1]\n\ + lsls r0, 27\n\ + lsrs r2, r0, 31\n\ + cmp r5, 0x1A\n\ + beq _080410B8\n\ + b _080410F8\n\ + .align 2, 0\n\ +_08041060: .4byte 0x02017000\n\ +_08041064:\n\ + bl de_sub_81364AC\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + bl get_trainer_class_name_index\n\ +_08041070:\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r4, 0x1E\n\ + beq _08041094\n\ + adds r0, r4, 0\n\ + subs r0, 0x3D\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x2\n\ + bls _080410CC\n\ + b _080410F8\n\ +_08041086:\n\ + bl de_sub_81364F8\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + bl sub_8135FD8\n\ + b _08041070\n\ +_08041094:\n\ + movs r0, 0x1\n\ + bl de_sub_8040FE0\n\ + b _08041102\n\ +_0804109C:\n\ + ldr r1, _080410C0 @ =gTrainers\n\ + lsls r4, r6, 2\n\ + adds r0, r4, r6\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldrb r5, [r0, 0x1]\n\ + lsls r0, r6, 16\n\ + lsrs r0, 16\n\ + bl sub_803FC58\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r5, 0x1A\n\ + bne _080410C4\n\ +_080410B8:\n\ + adds r0, r2, 0\n\ + bl de_sub_8040FE0\n\ + b _08041102\n\ + .align 2, 0\n\ +_080410C0: .4byte gTrainers\n\ +_080410C4:\n\ + cmp r5, 0x2E\n\ + bne _080410D4\n\ + cmp r2, 0x1\n\ + bne _080410D4\n\ +_080410CC:\n\ + movs r0, 0x1\n\ + bl de_sub_8040FF4\n\ + b _08041102\n\ +_080410D4:\n\ + cmp r5, 0x19\n\ + bne _080410F8\n\ + ldr r0, _080410F4 @ =gTrainers\n\ + adds r1, r4, r6\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x18]\n\ + movs r2, 0\n\ + cmp r0, 0x1\n\ + bne _080410EA\n\ + movs r2, 0x1\n\ +_080410EA:\n\ + adds r0, r2, 0\n\ + bl de_sub_804100C\n\ + b _08041102\n\ + .align 2, 0\n\ +_080410F4: .4byte gTrainers\n\ +_080410F8:\n\ + movs r0, 0xD\n\ + adds r1, r5, 0\n\ + muls r1, r0\n\ + ldr r0, _08041108 @ =gTrainerClassNames\n\ + adds r0, r1, r0\n\ +_08041102:\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08041108: .4byte gTrainerClassNames\n\ + .syntax divided\n"); +} +#endif + +u32 de_sub_804110C(u32 arg0, u32 arg1) { + return arg1; +} + +#endif diff --git a/src/misc/de_rom_8040FE0.c b/src/misc/de_rom_8040FE0.c deleted file mode 100644 index eebcc1437..000000000 --- a/src/misc/de_rom_8040FE0.c +++ /dev/null @@ -1,272 +0,0 @@ -#include "global.h" -#include "battle.h" - -#if GERMAN - -enum { - TRAINER_CLASS_NAME_LEADER = 25, - TRAINER_CLASS_NAME_SCHOOL_KID = 26, - TRAINER_CLASS_NAME_EXPERT = 30, - TRAINER_CLASS_NAME_POKEMON_TRAINER_3 = 46, -}; - -enum { - TRAINER_CLASS_LEADER_F = 26, - TRAINER_CLASS_ELITE_FOUR_F = 25, - TRAINER_CLASS_SCHOOL_KID_F = 30, - TRAINER_CLASS_BIRD_KEEPER = 46, - TRAINER_CLASS_MAY_1 = 61, - TRAINER_CLASS_MAY_2 = 62, - TRAINER_CLASS_MAY_3 = 63, -}; - -extern struct SecretBaseRecord gSecretBaseRecord; - -extern u8 gTrainerClassNames[][13]; -extern struct Trainer gTrainers[]; - -u8 *de_sub_8040FE0(u8 gender) { - if (gender) - { - gender++; - - } - - gender = TRAINER_CLASS_NAME_SCHOOL_KID; - return gTrainerClassNames[gender]; -} - -u8 *de_sub_8040FF4(u8 gender) { - if (gender) { - gender++; - } - - gender = TRAINER_CLASS_NAME_POKEMON_TRAINER_3; - return gTrainerClassNames[gender]; -} - -u8 *de_sub_804100C(u8 gender) { - if (gender) { - gender++; - } - - gender = TRAINER_CLASS_NAME_LEADER; - return gTrainerClassNames[gender]; -} - -#ifdef NONMATCHING - -u8 de_sub_81364AC(void); -u8 get_trainer_class_name_index(void); -u8 de_sub_81364F8(void); -u8 sub_8135FD8(void); - -u8 *de_sub_8041024(s32 arg0, u32 arg1) { - u8 nameIndex, trainerClass, gender; - struct Trainer *trainer; - u8 local2; - - switch (arg0) - { - case 0x400: - nameIndex = GetSecretBaseTrainerNameIndex(); - gender = gSecretBaseRecord.gender; - if (nameIndex == TRAINER_CLASS_NAME_SCHOOL_KID) - { - return de_sub_8040FE0(gender); - } - - return gTrainerClassNames[nameIndex]; - - case 0x100: - trainerClass = de_sub_81364AC(); - nameIndex = get_trainer_class_name_index(); - if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) - { - return de_sub_8040FE0(FEMALE); - } - if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) - { - return de_sub_8040FF4(FEMALE); - } - - return gTrainerClassNames[nameIndex]; - - case 0x800: - trainerClass = de_sub_81364F8(); - nameIndex = sub_8135FD8(); - if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) - { - return de_sub_8040FE0(FEMALE); - } - if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) - { - return de_sub_8040FF4(FEMALE); - } - - return gTrainerClassNames[nameIndex]; - - default: - trainer = &gTrainers[arg1]; - trainerClass = trainer->trainerClass; - local2 = sub_803FC58(arg1); - - if (trainerClass == TRAINER_CLASS_LEADER_F) - { - return de_sub_8040FE0(local2); - } - - if (trainerClass == TRAINER_CLASS_BIRD_KEEPER && local2 == FEMALE) - { - return de_sub_8040FF4(FEMALE); - } - - if (trainerClass == TRAINER_CLASS_ELITE_FOUR_F) - { - if (gTrainers[arg1].doubleBattle == TRUE) - { - return de_sub_804100C(FEMALE); - } - else - { - return de_sub_804100C(MALE); - } - } - - - return gTrainerClassNames[trainerClass]; - } -} -#else - -__attribute__((naked)) -void de_sub_8041024(void) { - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - adds r2, r0, 0\n\ - adds r6, r1, 0\n\ - movs r0, 0x80\n\ - lsls r0, 3\n\ - cmp r2, r0\n\ - beq _0804104A\n\ - cmp r2, r0\n\ - bgt _08041040\n\ - movs r0, 0x80\n\ - lsls r0, 1\n\ - cmp r2, r0\n\ - beq _08041064\n\ - b _0804109C\n\ -_08041040:\n\ - movs r0, 0x80\n\ - lsls r0, 4\n\ - cmp r2, r0\n\ - beq _08041086\n\ - b _0804109C\n\ -_0804104A:\n\ - bl GetSecretBaseTrainerNameIndex\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - ldr r0, _08041060 @ =0x02017000\n\ - ldrb r0, [r0, 0x1]\n\ - lsls r0, 27\n\ - lsrs r2, r0, 31\n\ - cmp r5, 0x1A\n\ - beq _080410B8\n\ - b _080410F8\n\ - .align 2, 0\n\ -_08041060: .4byte 0x02017000\n\ -_08041064:\n\ - bl de_sub_81364AC\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - bl get_trainer_class_name_index\n\ -_08041070:\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r4, 0x1E\n\ - beq _08041094\n\ - adds r0, r4, 0\n\ - subs r0, 0x3D\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x2\n\ - bls _080410CC\n\ - b _080410F8\n\ -_08041086:\n\ - bl de_sub_81364F8\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - bl sub_8135FD8\n\ - b _08041070\n\ -_08041094:\n\ - movs r0, 0x1\n\ - bl de_sub_8040FE0\n\ - b _08041102\n\ -_0804109C:\n\ - ldr r1, _080410C0 @ =gTrainers\n\ - lsls r4, r6, 2\n\ - adds r0, r4, r6\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldrb r5, [r0, 0x1]\n\ - lsls r0, r6, 16\n\ - lsrs r0, 16\n\ - bl sub_803FC58\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - cmp r5, 0x1A\n\ - bne _080410C4\n\ -_080410B8:\n\ - adds r0, r2, 0\n\ - bl de_sub_8040FE0\n\ - b _08041102\n\ - .align 2, 0\n\ -_080410C0: .4byte gTrainers\n\ -_080410C4:\n\ - cmp r5, 0x2E\n\ - bne _080410D4\n\ - cmp r2, 0x1\n\ - bne _080410D4\n\ -_080410CC:\n\ - movs r0, 0x1\n\ - bl de_sub_8040FF4\n\ - b _08041102\n\ -_080410D4:\n\ - cmp r5, 0x19\n\ - bne _080410F8\n\ - ldr r0, _080410F4 @ =gTrainers\n\ - adds r1, r4, r6\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x18]\n\ - movs r2, 0\n\ - cmp r0, 0x1\n\ - bne _080410EA\n\ - movs r2, 0x1\n\ -_080410EA:\n\ - adds r0, r2, 0\n\ - bl de_sub_804100C\n\ - b _08041102\n\ - .align 2, 0\n\ -_080410F4: .4byte gTrainers\n\ -_080410F8:\n\ - movs r0, 0xD\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, _08041108 @ =gTrainerClassNames\n\ - adds r0, r1, r0\n\ -_08041102:\n\ - pop {r4-r6}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08041108: .4byte gTrainerClassNames\n\ - .syntax divided\n"); -} -#endif - -u32 de_sub_804110C(u32 arg0, u32 arg1) { - return arg1; -} - -#endif diff --git a/src/misc/rom3.c b/src/misc/rom3.c deleted file mode 100644 index 3f4860ecc..000000000 --- a/src/misc/rom3.c +++ /dev/null @@ -1,1168 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_811DA74.h" -#include "battle_ai.h" -#include "battle_anim.h" -#include "battle_anim_81258BC.h" -#include "battle_anim_8137220.h" -#include "cable_club.h" -#include "items.h" -#include "link.h" -#include "pokemon.h" -#include "rom3.h" -#include "rom_8094928.h" -#include "species.h" -#include "task.h" -#include "util.h" -#include "battle_message.h" -#include "data2.h" - -extern u8 unk_2000000[]; - -#define EWRAM_14000 ((u8 *)(unk_2000000 + 0x14000)) -#define EWRAM_15000 ((u8 *)(unk_2000000 + 0x15000)) - -extern u16 gBattleTypeFlags; -extern u16 gBattleWeather; -extern struct BattlePokemon gBattleMons[]; - -static EWRAM_DATA u8 gUnknown_020238C4 = 0; -static EWRAM_DATA u8 gUnknown_020238C5 = 0; -static EWRAM_DATA u8 gUnknown_020238C6 = 0; - -extern u32 gUnknown_020239FC; -extern u8 gBattleBufferA[][0x200]; -extern u8 gBattleBufferB[][0x200]; -extern u8 gActiveBank; -extern u32 gBattleExecBuffer; -extern u8 gNoOfAllBanks; -extern u16 gBattlePartyID[]; -extern u8 gBanksBySide[]; -extern u16 gCurrentMove; -extern u16 gUnknown_02024BE8; -extern u16 gLastUsedItem; -extern u8 gLastUsedAbility; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u8 gEffectBank; -extern u8 gStringBank; -extern u8 gAbsentBankFlags; -extern u8 gMultiHitCounter; -extern u8 gUnknown_02024C78; -extern u8 gBattleOutcome; -extern u8 gActionSelectionCursor[]; -extern u8 gMoveSelectionCursor[]; -extern u8 gBattleTextBuff1[]; -extern u8 gBattleTextBuff2[]; -extern u8 gBattleTextBuff3[]; -extern void (*gBattleMainFunc)(void); -extern void (*gBattleBankFunc[])(void); - -u8 gBattleBuffersTransferData[0x170]; - -void sub_800B858(void) -{ - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - OpenLink(); - CreateTask(sub_8083C50, 0); - sub_800BF28(); - } -} - -void setup_poochyena_battle(void) -{ - s32 i; - - gBattleMainFunc = nullsub_41; - for (i = 0; i < 4; i++) - { - gBattleBankFunc[i] = nullsub_91; - gBanksBySide[i] = 0xFF; - gActionSelectionCursor[i] = 0; - gMoveSelectionCursor[i] = 0; - } - sub_800B858(); - gBattleExecBuffer = 0; - battle_anim_clear_some_data(); - ClearBattleMonForms(); - BattleAI_HandleItemUseBeforeAISetup(); - if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) - { - ZeroEnemyPartyMons(); - CreateMon(&gEnemyParty[0], SPECIES_POOCHYENA, 2, 32, 0, 0, 0, 0); - i = ITEM_NONE; - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&i); - } - gUnknown_020239FC = 0; - gUnknown_02024C78 = 0; -} - -void sub_800B950(void) -{ - s32 i; - - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - sub_800BA78(); - else - sub_800B9A8(); - sub_800BD54(); - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - for (i = 0; i < gNoOfAllBanks; i++) - sub_8094978(i, 0); - } -} - -void sub_800B9A8(void) -{ - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - gBattleMainFunc = sub_8010800; - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - gBattleBankFunc[0] = SetBankFuncToSafariBufferRunCommand; - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) - gBattleBankFunc[0] = SetBankFuncToWallyBufferRunCommand; - else - gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[0] = 0; - gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; - gBanksBySide[1] = 1; - gNoOfAllBanks = 2; - } - else - { - gBattleMainFunc = sub_8010800; - gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[0] = 0; - gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; - gBanksBySide[1] = 1; - gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[2] = 2; - gBattleBankFunc[3] = SetBankFuncToOpponentBufferRunCommand; - gBanksBySide[3] = 3; - gNoOfAllBanks = 4; - } -} - -void sub_800BA78(void) -{ - u8 multiplayerId; - int i; - - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - if (gBattleTypeFlags & BATTLE_TYPE_WILD) - { - gBattleMainFunc = sub_8010800; - gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[0] = 0; - gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; - gBanksBySide[1] = 1; - gNoOfAllBanks = 2; - } - else - { - gBattleBankFunc[1] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[1] = 0; - gBattleBankFunc[0] = SetBankFuncToLinkOpponentBufferRunCommand; - gBanksBySide[0] = 1; - gNoOfAllBanks = 2; - } - return; - } - if ((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_DOUBLE)) == BATTLE_TYPE_DOUBLE) - { - if (gBattleTypeFlags & BATTLE_TYPE_WILD) - { - gBattleMainFunc = sub_8010800; - gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[0] = 0; - gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; - gBanksBySide[1] = 1; - gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[2] = 2; - gBattleBankFunc[3] = SetBankFuncToLinkOpponentBufferRunCommand; - gBanksBySide[3] = 3; - gNoOfAllBanks = 4; - } - else - { - gBattleBankFunc[1] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[1] = 0; - gBattleBankFunc[0] = SetBankFuncToLinkOpponentBufferRunCommand; - gBanksBySide[0] = 1; - gBattleBankFunc[3] = SetBankFuncToPlayerBufferRunCommand; - gBanksBySide[3] = 2; - gBattleBankFunc[2] = SetBankFuncToLinkOpponentBufferRunCommand; - gBanksBySide[2] = 3; - gNoOfAllBanks = 4; - - } - return; - } - multiplayerId = GetMultiplayerId(); - if (gBattleTypeFlags & BATTLE_TYPE_WILD) - gBattleMainFunc = sub_8010800; - for (i = 0; i < 4; i++) - { - switch (gLinkPlayers[i].lp_field_18) - { - case 0: - case 3: - sub_8094978(gLinkPlayers[i].lp_field_18, 0); - break; - case 1: - case 2: - sub_8094978(gLinkPlayers[i].lp_field_18, 1); - break; - } - - if (i == multiplayerId) - { - gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToPlayerBufferRunCommand; - switch (gLinkPlayers[i].lp_field_18) - { - case 0: - case 3: - gBanksBySide[gLinkPlayers[i].lp_field_18] = 0; - gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; - break; - case 1: - case 2: - gBanksBySide[gLinkPlayers[i].lp_field_18] = 2; - gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; - break; - } - } - else - { - if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[multiplayerId].lp_field_18 & 1)) - || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[multiplayerId].lp_field_18 & 1))) - { - gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToLinkPartnerBufferRunCommand; - switch (gLinkPlayers[i].lp_field_18) - { - case 0: - case 3: - gBanksBySide[gLinkPlayers[i].lp_field_18] = 0; - gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; - break; - case 1: - case 2: - gBanksBySide[gLinkPlayers[i].lp_field_18] = 2; - gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; - break; - } - } - else - { - gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToLinkOpponentBufferRunCommand; - switch (gLinkPlayers[i].lp_field_18) - { - case 0: - case 3: - gBanksBySide[gLinkPlayers[i].lp_field_18] = 1; - gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; - break; - case 1: - case 2: - gBanksBySide[gLinkPlayers[i].lp_field_18] = 3; - gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; - break; - } - } - } - } - gNoOfAllBanks = 4; -} - -void sub_800BD54(void) -{ - int i; - int j; - - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - for (i = 0; i < gNoOfAllBanks; i++) - { - for (j = 0; j < 6; j++) - { - if (i < 2) - { - if (!(gBanksBySide[i] & 1)) - { - if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 - && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != 0 - && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG - && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0) - { - gBattlePartyID[i] = j; - break; - } - } - else - { - if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 - && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0 - && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG - && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0) - { - gBattlePartyID[i] = j; - break; - } - } - } - else - { - if (!(gBanksBySide[i] & 1)) - { - if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 - && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != 0 //Probably a typo by Game Freak. The rest use SPECIES2 - && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG - && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0 - && gBattlePartyID[i - 2] != j) - { - gBattlePartyID[i] = j; - break; - } - } - else - { - if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 - && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0 - && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG - && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0 - && gBattlePartyID[i - 2] != j) - { - gBattlePartyID[i] = j; - break; - } - } - } - } - } - } -} - -void PrepareBufferDataTransfer(u8 a, u8 *data, u16 size) -{ - int i; - - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - PrepareBufferDataTransferLink(a, size, data); - } - else - { - switch (a) - { - case 0: - for (i = 0; i < size; i++) - { - gBattleBufferA[gActiveBank][i] = *data; - data++; - } - break; - case 1: - for (i = 0; i < size; i++) - { - gBattleBufferB[gActiveBank][i] = *data; - data++; - } - break; - } - } -} - -void sub_800BF28(void) -{ - gUnknown_020238C4 = CreateTask(sub_800C1A8, 0); - gTasks[gUnknown_020238C4].data[11] = 0; - gTasks[gUnknown_020238C4].data[12] = 0; - gTasks[gUnknown_020238C4].data[13] = 0; - gTasks[gUnknown_020238C4].data[14] = 0; - gTasks[gUnknown_020238C4].data[15] = 0; - gUnknown_020238C5 = CreateTask(sub_800C47C, 0); - gTasks[gUnknown_020238C5].data[12] = 0; - gTasks[gUnknown_020238C5].data[13] = 0; - gTasks[gUnknown_020238C5].data[14] = 0; - gTasks[gUnknown_020238C5].data[15] = 0; - gUnknown_020238C6 = 0; - CpuFill16(0, EWRAM_14000, 0x2000); -} - -void PrepareBufferDataTransferLink(u8 a, u16 size, u8 *data) -{ - s32 r9; - int i; - - r9 = size - size % 4 + 4; - if (gTasks[gUnknown_020238C4].data[14] + r9 + 9 > 0x1000) - { - gTasks[gUnknown_020238C4].data[12] = gTasks[gUnknown_020238C4].data[14]; - gTasks[gUnknown_020238C4].data[14] = 0; - } - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14000] = a; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14001] = gActiveBank; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14002] = gBankAttacker; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14003] = gBankTarget; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14004] = r9; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14005] = (r9 & 0x0000FF00) >> 8; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14006] = gAbsentBankFlags; - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14007] = gEffectBank; - for (i = 0; i < size; i++) - unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14008 + i] = data[i]; - gTasks[gUnknown_020238C4].data[14] = gTasks[gUnknown_020238C4].data[14] + r9 + 8; -} - -void sub_800C1A8(u8 taskId) -{ - u16 var; - - switch (gTasks[taskId].data[11]) - { - case 0: - gTasks[taskId].data[10] = 100; - gTasks[taskId].data[11]++; - break; - case 1: - gTasks[taskId].data[10]--; - if (gTasks[taskId].data[10] == 0) - gTasks[taskId].data[11]++; - break; - case 2: - GetLinkPlayerCount_2(); - if (IsLinkMaster()) - { - sub_8007F4C(); - gTasks[taskId].data[11]++; - break; - } - gTasks[taskId].data[11]++; - break; - case 3: - if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) - { - if (gTasks[taskId].data[13] == 0) - { - if (gTasks[taskId].data[15] > gTasks[taskId].data[14] - && gTasks[taskId].data[15] == gTasks[taskId].data[12]) - { - gTasks[taskId].data[12] = 0; - gTasks[taskId].data[15] = 0; - } - var = (unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8)) + 8; - SendBlock(bitmask_all_link_players_but_self(), &unk_2000000[gTasks[taskId].data[15] + 0x14000], var); - gTasks[taskId].data[11]++; - } - else - { - gTasks[taskId].data[13]--; - break; - } - } - break; - case 4: - if (sub_8007ECC()) - { - var = unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8); - gTasks[taskId].data[13] = 1; - gTasks[taskId].data[15] = gTasks[taskId].data[15] + var + 8; - gTasks[taskId].data[11] = 3; - } - break; - case 5: - gTasks[taskId].data[13]--; - if (gTasks[taskId].data[13] == 0) - { - gTasks[taskId].data[13] = 1; - gTasks[taskId].data[11] = 3; - } - break; - } -} - -//fix me -void sub_800C35C(void) -{ - u8 i; //r4 - s32 j; //r2 - u16 r6; //r6 - u8 *recvBuffer; //r3 - u8 *dest; //r5 - u8 *src; //r4 - - if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & 0x20) && gLinkPlayers[0].linkType == 0x2211) - { - for (i = 0; i < GetLinkPlayerCount(); i++) - { - if (GetBlockReceivedStatus() & gBitTable[i]) - { - ResetBlockReceivedFlag(i); - recvBuffer = (u8 *)&gBlockRecvBuffer[i]; -#ifndef NONMATCHING - asm(""); - recvBuffer = (u8 *)&gBlockRecvBuffer[i]; -#endif - r6 = gBlockRecvBuffer[i][2]; - if (gTasks[gUnknown_020238C5].data[14] + 9 + r6 > 0x1000) - { - gTasks[gUnknown_020238C5].data[12] = gTasks[gUnknown_020238C5].data[14]; - gTasks[gUnknown_020238C5].data[14] = 0; - } - //_0800C402 - dest = EWRAM_15000 + gTasks[gUnknown_020238C5].data[14]; - src = recvBuffer; - for (j = 0; j < r6 + 8; j++) - dest[j] = src[j]; - gTasks[gUnknown_020238C5].data[14] = gTasks[gUnknown_020238C5].data[14] + r6 + 8; - } - //_0800C446 - } - } -} - -void sub_800C47C(u8 taskId) -{ - u16 r7; - u8 r4; - u8 r2; - - if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) - { - if (gTasks[taskId].data[15] > gTasks[taskId].data[14] - && gTasks[taskId].data[15] == gTasks[taskId].data[12]) - { - gTasks[taskId].data[12] = 0; - gTasks[taskId].data[15] = 0; - } - r4 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 1]; - r7 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 4] | (unk_2000000[0x15000 + gTasks[taskId].data[15] + 5] << 8); - switch (unk_2000000[0x15000 + gTasks[taskId].data[15] + 0]) - { - case 0: - if (gBattleExecBuffer & gBitTable[r4]) - return; - memcpy(gBattleBufferA[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7); - sub_80155A4(r4); - if (!(gBattleTypeFlags & BATTLE_TYPE_WILD)) - { - gBankAttacker = unk_2000000[0x15000 + gTasks[taskId].data[15] + 2]; - gBankTarget = unk_2000000[0x15000 + gTasks[taskId].data[15] + 3]; - gAbsentBankFlags = unk_2000000[0x15000 + gTasks[taskId].data[15] + 6]; - gEffectBank = unk_2000000[0x15000 + gTasks[taskId].data[15] + 7]; - } - break; - case 1: - memcpy(gBattleBufferB[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7); - break; - case 2: - r2 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 8]; - gBattleExecBuffer &= ~(gBitTable[r4] << (r2 * 4)); - break; - } - gTasks[taskId].data[15] = gTasks[taskId].data[15] + r7 + 8; - } -} - -void EmitGetAttributes(u8 a, u8 b, u8 c) -{ - gBattleBuffersTransferData[0] = 0; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = 0; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd1(u8 a, u8 b, u8 c) -{ - gBattleBuffersTransferData[0] = 1; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = 0; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitSetAttributes(u8 a, u8 b, u8 c, u8 d, void *e) -{ - int i; - - gBattleBuffersTransferData[0] = 2; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - for (i = 0; i < d; i++) - gBattleBuffersTransferData[3 + i] = *(u8*)(e++); - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, d + 3); -} - -void Emitcmd3(u8 a, u8 b, u8 c, u8 *d) -{ - int i; - - gBattleBuffersTransferData[0] = 3; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - for (i = 0; i < c; i++) - gBattleBuffersTransferData[3 + i] = *(d++); - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, c + 3); -} - -void EmitLoadPokeSprite(u8 a) -{ - gBattleBuffersTransferData[0] = 4; - gBattleBuffersTransferData[1] = 4; - gBattleBuffersTransferData[2] = 4; - gBattleBuffersTransferData[3] = 4; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitSendOutPoke(u8 a, u8 b, u8 c) -{ - gBattleBuffersTransferData[0] = 5; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = 5; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitReturnPokeToBall(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 6; - gBattleBuffersTransferData[1] = b; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); -} - -void EmitTrainerThrow(u8 a) -{ - gBattleBuffersTransferData[0] = 7; - gBattleBuffersTransferData[1] = 7; - gBattleBuffersTransferData[2] = 7; - gBattleBuffersTransferData[3] = 7; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitTrainerSlide(u8 a) -{ - gBattleBuffersTransferData[0] = 8; - gBattleBuffersTransferData[1] = 8; - gBattleBuffersTransferData[2] = 8; - gBattleBuffersTransferData[3] = 8; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitTrainerSlideBack(u8 a) -{ - gBattleBuffersTransferData[0] = 9; - gBattleBuffersTransferData[1] = 9; - gBattleBuffersTransferData[2] = 9; - gBattleBuffersTransferData[3] = 9; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd10(u8 a) -{ - gBattleBuffersTransferData[0] = 10; - gBattleBuffersTransferData[1] = 10; - gBattleBuffersTransferData[2] = 10; - gBattleBuffersTransferData[3] = 10; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd11(u8 a) -{ - gBattleBuffersTransferData[0] = 11; - gBattleBuffersTransferData[1] = 11; - gBattleBuffersTransferData[2] = 11; - gBattleBuffersTransferData[3] = 11; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd12(u8 a) -{ - gBattleBuffersTransferData[0] = 12; - gBattleBuffersTransferData[1] = 12; - gBattleBuffersTransferData[2] = 12; - gBattleBuffersTransferData[3] = 12; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitBallThrow(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 13; - gBattleBuffersTransferData[1] = b; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); -} - -void EmitPuase(u8 a, u8 b, u8 *c) -{ - int i; - - gBattleBuffersTransferData[0] = 14; - gBattleBuffersTransferData[1] = b; - for (i = 0; i < b * 3; i++) - gBattleBuffersTransferData[2 + i] = *(c++); - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, b * 3 + 2); -} - -void EmitMoveAnimation(u8 a, u16 b, u8 c, u16 d, s32 e, u8 f, struct DisableStruct *g) -{ - gBattleBuffersTransferData[0] = 15; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - gBattleBuffersTransferData[3] = c; - gBattleBuffersTransferData[4] = d; - gBattleBuffersTransferData[5] = (d & 0xFF00) >> 8; - gBattleBuffersTransferData[6] = e; - gBattleBuffersTransferData[7] = (e & 0x0000FF00) >> 8; - gBattleBuffersTransferData[8] = (e & 0x00FF0000) >> 16; - gBattleBuffersTransferData[9] = (e & 0xFF000000) >> 24; - gBattleBuffersTransferData[10] = f; - gBattleBuffersTransferData[11] = gMultiHitCounter; - if (AbilityBattleEffects(14, 0, 13, 0, 0) == 0 && AbilityBattleEffects(14, 0, 0x4D, 0, 0) == 0) - { - gBattleBuffersTransferData[12] = gBattleWeather; - gBattleBuffersTransferData[13] = (gBattleWeather & 0xFF00) >> 8; - } - else - { - gBattleBuffersTransferData[12] = 0; - gBattleBuffersTransferData[13] = 0; - } - gBattleBuffersTransferData[14] = 0; - gBattleBuffersTransferData[15] = 0; - memcpy(&gBattleBuffersTransferData[16], g, sizeof(*g)); - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 0x2C); -} - -void EmitPrintString(u8 a, u16 stringID) -{ - s32 i; - struct StringInfoBattle* stringInfo; - - gBattleBuffersTransferData[0] = 16; - gBattleBuffersTransferData[1] = gBattleOutcome; - gBattleBuffersTransferData[2] = stringID; - gBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8; - - stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]); - stringInfo->currentMove = gCurrentMove; - stringInfo->lastMove = gUnknown_02024BE8; - stringInfo->lastItem = gLastUsedItem; - stringInfo->lastAbility = gLastUsedAbility; - stringInfo->scrActive = BATTLE_STRUCT->scriptingActive; - stringInfo->unk1605E = BATTLE_STRUCT->unk1605E; - stringInfo->hpScale = BATTLE_STRUCT->hpScale; - stringInfo->StringBank = gStringBank; - stringInfo->moveType = gBattleMoves[gCurrentMove].type; - - for (i = 0; i < 4; i++) - stringInfo->abilities[i] = gBattleMons[i].ability; - for (i = 0; i < 0x10; i++) - { - stringInfo->textBuffs[0][i] = gBattleTextBuff1[i]; - stringInfo->textBuffs[1][i] = gBattleTextBuff2[i]; - stringInfo->textBuffs[2][i] = gBattleTextBuff3[i]; - } - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4); -} - -void EmitPrintStringPlayerOnly(u8 a, u16 stringID) -{ - s32 i; - struct StringInfoBattle* stringInfo; - - gBattleBuffersTransferData[0] = 17; - gBattleBuffersTransferData[1] = 17; - gBattleBuffersTransferData[2] = stringID; - gBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8; - - stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]); - stringInfo->currentMove = gCurrentMove; - stringInfo->lastMove = gUnknown_02024BE8; - stringInfo->lastItem = gLastUsedItem; - stringInfo->lastAbility = gLastUsedAbility; - stringInfo->scrActive = BATTLE_STRUCT->scriptingActive; - stringInfo->unk1605E = BATTLE_STRUCT->unk1605E; - - for (i = 0; i < 4; i++) - stringInfo->abilities[i] = gBattleMons[i].ability; - for (i = 0; i < 0x10; i++) - { - stringInfo->textBuffs[0][i] = gBattleTextBuff1[i]; - stringInfo->textBuffs[1][i] = gBattleTextBuff2[i]; - stringInfo->textBuffs[2][i] = gBattleTextBuff3[i]; - } - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4); -} - -void Emitcmd18(u8 a, u8 b, u16 c) -{ - gBattleBuffersTransferData[0] = 18; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd19(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 19; - gBattleBuffersTransferData[1] = b; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); -} - -void Emitcmd20(u8 a, u8 b, u8 c, u8 *d) -{ - u32 i; - - gBattleBuffersTransferData[0] = 20; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = 0; - for (i = 0; i < 20; i++) - gBattleBuffersTransferData[4 + i] = d[i]; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 24); -} - -void EmitOpenBag(u8 a, u8 *b) -{ - int i; - - gBattleBuffersTransferData[0] = 21; - for (i = 0; i < 3; i++) - gBattleBuffersTransferData[1 + i] = b[i]; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitChoosePokemon(u8 a, u8 b, u8 c, u8 d, u8 *e) -{ - int i; - - gBattleBuffersTransferData[0] = 22; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = d; - for (i = 0; i < 3; i++) - gBattleBuffersTransferData[4 + i] = e[i]; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 8); //but only 7 bytes were written -} - -void Emitcmd23(u8 a) -{ - gBattleBuffersTransferData[0] = 23; - gBattleBuffersTransferData[1] = 23; - gBattleBuffersTransferData[2] = 23; - gBattleBuffersTransferData[3] = 23; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -// FIXME: I think this function is supposed to take s16 as its second argument, -// but battle_4.c expects u16 -void EmitHealthBarUpdate(u8 a, u16 b) -{ - gBattleBuffersTransferData[0] = 24; - gBattleBuffersTransferData[1] = 0; - gBattleBuffersTransferData[2] = (s16)b; - gBattleBuffersTransferData[3] = ((s16)b & 0xFF00) >> 8; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -// FIXME: I think this function is supposed to take s16 as its third argument, -// but battle_4.c expects u16 -void EmitExpBarUpdate(u8 a, u8 b, u16 c) -{ - gBattleBuffersTransferData[0] = 25; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (s16)c; - gBattleBuffersTransferData[3] = ((s16)c & 0xFF00) >> 8; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitStatusIconUpdate(u8 a, u32 b, u32 c) -{ - gBattleBuffersTransferData[0] = 26; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0x0000FF00) >> 8; - gBattleBuffersTransferData[3] = (b & 0x00FF0000) >> 16; - gBattleBuffersTransferData[4] = (b & 0xFF000000) >> 24; - gBattleBuffersTransferData[5] = c; - gBattleBuffersTransferData[6] = (c & 0x0000FF00) >> 8; - gBattleBuffersTransferData[7] = (c & 0x00FF0000) >> 16; - gBattleBuffersTransferData[8] = (c & 0xFF000000) >> 24; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 9); -} - -void EmitStatusAnimation(u8 a, u8 b, u32 c) -{ - gBattleBuffersTransferData[0] = 27; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = (c & 0x0000FF00) >> 8; - gBattleBuffersTransferData[4] = (c & 0x00FF0000) >> 16; - gBattleBuffersTransferData[5] = (c & 0xFF000000) >> 24; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 6); -} - -void EmitStatusXor(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 28; - gBattleBuffersTransferData[1] = b; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); -} - -void Emitcmd29(u8 a, u16 b, u8 *c) -{ - int i; - - gBattleBuffersTransferData[0] = 29; - gBattleBuffersTransferData[1] = 29; - gBattleBuffersTransferData[2] = b; - gBattleBuffersTransferData[3] = (b & 0xFF00) >> 8; - for (i = 0; i < b; i++) - gBattleBuffersTransferData[4 + i] = *(c++); - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, b + 4); -} - -void EmitDMATransfer(u8 a, u32 b, u16 c, u8 *d) -{ - int i; - - gBattleBuffersTransferData[0] = 30; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0x0000FF00) >> 8; - gBattleBuffersTransferData[3] = (b & 0x00FF0000) >> 16; - gBattleBuffersTransferData[4] = (b & 0xFF000000) >> 24; - gBattleBuffersTransferData[5] = c; - gBattleBuffersTransferData[6] = (c & 0xFF00) >> 8; - for (i = 0; i < c; i++) - gBattleBuffersTransferData[7 + i] = *(d++); - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, c + 7); -} - -void Emitcmd31(u8 a, u16 b, u8 *c) -{ - int i; - - gBattleBuffersTransferData[0] = 31; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - for (i = 0; i < b; i++) - gBattleBuffersTransferData[3 + i] = *(c++); - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, b + 3); -} - -void Emitcmd32(u8 a, u16 b, u8 *c) -{ - int i; - - gBattleBuffersTransferData[0] = 32; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - for (i = 0; i < b; i++) - gBattleBuffersTransferData[3 + i] = *(c++); - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, b + 3); -} - -void Emitcmd33(u8 a, u8 b, u16 c) -{ - gBattleBuffersTransferData[0] = 33; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd34(u8 a, u8 b, u8 *c) -{ - int i; - - gBattleBuffersTransferData[0] = 34; - gBattleBuffersTransferData[1] = b; - for (i = 0; i < 3; i++) - gBattleBuffersTransferData[2 + i] = c[i]; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 5); -} - -void Emitcmd35(u8 a, u16 b) -{ - gBattleBuffersTransferData[0] = 35; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - gBattleBuffersTransferData[3] = 0; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd36(u8 a, u16 b) -{ - gBattleBuffersTransferData[0] = 36; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - gBattleBuffersTransferData[3] = 0; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd37(u8 a) -{ - gBattleBuffersTransferData[0] = 37; - gBattleBuffersTransferData[1] = 37; - gBattleBuffersTransferData[2] = 37; - gBattleBuffersTransferData[3] = 37; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd38(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 38; - gBattleBuffersTransferData[1] = b; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); -} - -void Emitcmd39(u8 a) -{ - gBattleBuffersTransferData[0] = 39; - gBattleBuffersTransferData[1] = 39; - gBattleBuffersTransferData[2] = 39; - gBattleBuffersTransferData[3] = 39; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd40(u8 a) -{ - gBattleBuffersTransferData[0] = 40; - gBattleBuffersTransferData[1] = 40; - gBattleBuffersTransferData[2] = 40; - gBattleBuffersTransferData[3] = 40; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitHitAnimation(u8 a) -{ - gBattleBuffersTransferData[0] = 41; - gBattleBuffersTransferData[1] = 41; - gBattleBuffersTransferData[2] = 41; - gBattleBuffersTransferData[3] = 41; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd42(u8 a) -{ - gBattleBuffersTransferData[0] = 42; - gBattleBuffersTransferData[1] = 42; - gBattleBuffersTransferData[2] = 42; - gBattleBuffersTransferData[3] = 42; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitEffectivenessSound(u8 a, u16 b) -{ - gBattleBuffersTransferData[0] = 43; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - gBattleBuffersTransferData[3] = 0; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd44(u8 a, u16 b) -{ - gBattleBuffersTransferData[0] = 44; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; - gBattleBuffersTransferData[3] = 0; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitFaintingCry(u8 a) -{ - gBattleBuffersTransferData[0] = 45; - gBattleBuffersTransferData[1] = 45; - gBattleBuffersTransferData[2] = 45; - gBattleBuffersTransferData[3] = 45; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitIntroSlide(u8 a, u8 battleTerrain) -{ - gBattleBuffersTransferData[0] = 46; - gBattleBuffersTransferData[1] = battleTerrain; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); -} - -void EmitTrainerBallThrow(u8 a) -{ - gBattleBuffersTransferData[0] = 47; - gBattleBuffersTransferData[1] = 47; - gBattleBuffersTransferData[2] = 47; - gBattleBuffersTransferData[3] = 47; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd48(u8 a, u8 *b, u8 c) -{ - int i; - - gBattleBuffersTransferData[0] = 48; - gBattleBuffersTransferData[1] = c & 0x7F; - gBattleBuffersTransferData[2] = (c & 0x80) >> 7; - gBattleBuffersTransferData[3] = 48; - for (i = 0; i < 48; i++) - gBattleBuffersTransferData[4 + i] = b[i]; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 52); -} - -void Emitcmd49(u8 a) -{ - gBattleBuffersTransferData[0] = 49; - gBattleBuffersTransferData[1] = 49; - gBattleBuffersTransferData[2] = 49; - gBattleBuffersTransferData[3] = 49; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void Emitcmd50(u8 a) -{ - gBattleBuffersTransferData[0] = 50; - gBattleBuffersTransferData[1] = 50; - gBattleBuffersTransferData[2] = 50; - gBattleBuffersTransferData[3] = 50; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitSpriteInvisibility(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 51; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = 51; - gBattleBuffersTransferData[3] = 51; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitBattleAnimation(u8 a, u8 b, u16 c) -{ - gBattleBuffersTransferData[0] = 52; - gBattleBuffersTransferData[1] = b; - gBattleBuffersTransferData[2] = c; - gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); -} - -void EmitLinkStandbyMsg(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 53; - gBattleBuffersTransferData[1] = b; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); -} - -void EmitResetActionMoveSelection(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 54; - gBattleBuffersTransferData[1] = b; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); -} - -void Emitcmd55(u8 a, u8 b) -{ - gBattleBuffersTransferData[0] = 55; - gBattleBuffersTransferData[1] = b; - PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); -} diff --git a/src/misc/rom6.c b/src/misc/rom6.c deleted file mode 100644 index 3a5071034..000000000 --- a/src/misc/rom6.c +++ /dev/null @@ -1,202 +0,0 @@ -#include "global.h" -#include "rom6.h" -#include "braille_puzzles.h" -#include "field_effect.h" -#include "field_map_obj.h" -#include "field_player_avatar.h" -#include "item_use.h" -#include "pokemon_menu.h" -#include "overworld.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" - -extern u16 gScriptLastTalked; -extern void (*gFieldCallback)(void); -extern u8 gLastFieldPokeMenuOpened; -extern void (*gUnknown_03005CE4)(void); -extern u8 S_UseRockSmash[]; - -EWRAM_DATA struct MapPosition gUnknown_0203923C = {0}; - -static void task08_080C9820(u8); -static void sub_810B3DC(u8); -static void sub_810B428(u8); -static void sub_810B4CC(u8); -static void sub_810B53C(void); -static void sub_810B58C(void); -static void sub_810B5D8(void); -static void sub_810B634(void); - -bool8 npc_before_player_of_type(u8 a) -{ - u8 mapObjId; - - GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); - gUnknown_0203923C.height = PlayerGetZCoord(); - mapObjId = GetFieldObjectIdByXYZ(gUnknown_0203923C.x, gUnknown_0203923C.y, gUnknown_0203923C.height); - if (gMapObjects[mapObjId].graphicsId != a) - { - return FALSE; - } - else - { - gScriptLastTalked = gMapObjects[mapObjId].localId; - return TRUE; - } -} - -u8 oei_task_add(void) -{ - GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); - return CreateTask(task08_080C9820, 8); -} - -static void task08_080C9820(u8 taskId) -{ - u8 mapObjId; - - ScriptContext2_Enable(); - gPlayerAvatar.unk6 = 1; - mapObjId = gPlayerAvatar.mapObjectId; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(&gMapObjects[mapObjId]) - || FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId])) - { - if (gMapHeader.mapType == MAP_TYPE_UNDERWATER) - { - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - gTasks[taskId].func = sub_810B428; - } - else - { - sub_8059BF4(); - FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 0x39); - gTasks[taskId].func = sub_810B3DC; - } - } -} - -static void sub_810B3DC(u8 taskId) -{ - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[gPlayerAvatar.mapObjectId]) == TRUE) - { - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - gTasks[taskId].func = sub_810B428; - } -} - -static void sub_810B428(u8 taskId) -{ - if (!FieldEffectActiveListContains(6)) - { - gFieldEffectArguments[1] = player_get_direction_lower_nybble(); - if (gFieldEffectArguments[1] == 1) - gFieldEffectArguments[2] = 0; - if (gFieldEffectArguments[1] == 2) - gFieldEffectArguments[2] = 1; - if (gFieldEffectArguments[1] == 3) - gFieldEffectArguments[2] = 2; - if (gFieldEffectArguments[1] == 4) - gFieldEffectArguments[2] = 3; - sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByCurrentState()); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]); - FieldEffectActiveListRemove(6); - gTasks[taskId].func = sub_810B4CC; - } -} - -static void sub_810B4CC(u8 taskId) -{ - void (*func)(void) = (void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]); - - func(); - gPlayerAvatar.unk6 = 0; - DestroyTask(taskId); -} - -bool8 SetUpFieldMove_RockSmash(void) -{ - if (npc_before_player_of_type(0x56) == TRUE) - { - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_810B53C; - return TRUE; - } - else - { - return FALSE; - } -} - -static void sub_810B53C(void) -{ - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - ScriptContext1_SetupScript(S_UseRockSmash); -} - -int FldEff_RockSmash(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_810B58C >> 16; - gTasks[taskId].data[9] = (u32)sub_810B58C; - IncrementGameStat(0x13); - return 0; -} - -static void sub_810B58C(void) -{ - PlaySE(SE_W088); - FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH); - EnableBothScriptContexts(); -} - -int SetUpFieldMove_Dig(void) -{ - if (CanUseEscapeRopeOnCurrMap() == TRUE) - { - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_810B5D8; - return TRUE; - } - else - { - return FALSE; - } -} - -static void sub_810B5D8(void) -{ - sub_8053014(); - FieldEffectStart(FLDEFF_USE_DIG); - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; -} - -int FldEff_UseDig(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_810B634 >> 16; - gTasks[taskId].data[9] = (u32)sub_810B634; - if (!ShouldDoBrailleDigEffect()) - SetPlayerAvatarTransitionFlags(1); - return 0; -} - -static void sub_810B634(void) -{ - u8 taskId; - - FieldEffectActiveListRemove(FLDEFF_USE_DIG); - if (ShouldDoBrailleDigEffect()) - { - DoBrailleDigEffect(); - } - else - { - taskId = CreateTask(task08_080A1C44, 8); - gTasks[taskId].data[0] = 0; - } -} diff --git a/src/misc/rom_800D42C.c b/src/misc/rom_800D42C.c deleted file mode 100644 index f51779e65..000000000 --- a/src/misc/rom_800D42C.c +++ /dev/null @@ -1,118 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "link.h" -#include "text.h" - -extern u16 gBattleTypeFlags; -extern u8 gBattleOutcome; - -extern struct Window gUnknown_03004210; - -extern u8 BattleText_Win[]; -extern u8 BattleText_Loss[]; -extern u8 BattleText_Tie[]; - -#if ENGLISH -#define LEFT_MESSAGE_X 6 -#define RIGHT_MESSAGE_X 21 -#define TILE_OFFSET_LOSS 168 -#elif GERMAN -#define LEFT_MESSAGE_X 5 -#define RIGHT_MESSAGE_X 20 -#define TILE_OFFSET_LOSS 172 -#endif -#define TILE_OFFSET_WIN 160 -#define CENTER_MESSAGE_X 13 -#define MESSAGE_Y 2 - -#define PRINT_MESSAGE(text, tileDataStartOffset, x) \ -{ \ - InitWindow(&gUnknown_03004210, text, tileDataStartOffset, x, MESSAGE_Y); \ - sub_8002F44(&gUnknown_03004210); \ -} - -#define PRINT_MESSAGE_LEFT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, LEFT_MESSAGE_X) -#define PRINT_MESSAGE_RIGHT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, RIGHT_MESSAGE_X) - -void PrintLinkBattleWinLossTie(void) -{ - - if (gBattleOutcome == 3) - { - PRINT_MESSAGE(BattleText_Tie, TILE_OFFSET_WIN, CENTER_MESSAGE_X); - return; - } - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - // Double battle? - - if (gBattleOutcome == 1) - { - - // lp_field_18 = player position? - switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18) - { - case 0: - case 2: - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - return; - - case 1: - case 3: - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN) - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS) - return; - } - } - else - { - - switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18) - { - case 1: - case 3: - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - return; - - case 0: - case 2: - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); - return; - } - } - - return; - } - - - if (gBattleOutcome == 1) - { - if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0) - { - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); - } - else - { - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - } - } - else - { - if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0) - { - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - } - else - { - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); - } - } -} diff --git a/src/misc/rom_8077ABC.c b/src/misc/rom_8077ABC.c deleted file mode 100644 index 172233e6d..000000000 --- a/src/misc/rom_8077ABC.c +++ /dev/null @@ -1,2055 +0,0 @@ -#include "global.h" -#include "rom_8077ABC.h" -#include "battle.h" -#include "battle_anim.h" -#include "blend_palette.h" -#include "data2.h" -#include "decompress.h" -#include "palette.h" -#include "pokemon_icon.h" -#include "species.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" -#include "util.h" - -#define GET_UNOWN_LETTER(personality) ((\ - (((personality & 0x03000000) >> 24) << 6) \ - | (((personality & 0x00030000) >> 16) << 4) \ - | (((personality & 0x00000300) >> 8) << 2) \ - | (((personality & 0x00000003) >> 0) << 0) \ -) % 28) - -#define IS_DOUBLE_BATTLE() ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) ? TRUE : FALSE) - -#define NUM_BATTLE_SLOTS 4 - -#define gBattleMonPartyPositions gBattlePartyID -#define gCastformElevations gUnknownCastformData_0837F5A8 -#define gCastformBackSpriteYCoords gUnknown_0837F5AC -#define gTransformPersonalities gPID_perBank -#define gBattleMonSprites gObjectBankIDs - - -struct Struct_unk_2019348 { - u16 field_0; - u16 field_2; - u8 field_4; - u32 field_8; - u32 field_c; - u32 field_10; -}; - -struct TransformStatus { - u16 unknown; - u16 species; -}; - -struct Struct_gUnknown_0837F578 { - u8 field_0; - u8 field_1; -}; - -struct OamMatrix { - s16 a; - s16 b; - s16 c; - s16 d; -}; - -struct Struct_2017810 { - u8 filler_0[6]; - u8 field_6; - u8 filler_7[5]; -}; - -struct Color { - u16 r:5; - u16 g:5; - u16 b:5; -}; - -struct Struct_sub_8078914 { - u8 *field_0; - u8 *field_4; - u8 field_8; -}; - -struct BGCnt { - u16 priority:2; - u16 charBase:2; - u16 unused:2; - u16 mosaic:1; - u16 colorMode:1; - u16 screenBase:5; - u16 overflow:1; - u16 size:2; -}; - -#define BG1CNT (*(volatile struct BGCnt*)REG_ADDR_BG1CNT) -#define BG2CNT (*(volatile struct BGCnt*)REG_ADDR_BG2CNT) -#define BG3CNT (*(volatile struct BGCnt*)REG_ADDR_BG3CNT) - -extern struct OamData gOamData_837DF9C[]; -extern const union AnimCmd *const gDummySpriteAnimTable[]; -extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[]; - -extern struct Struct_unk_2019348 unk_2019348; -extern struct TransformStatus gTransformStatuses[]; -extern u16 gBattleMonPartyPositions[]; -extern u16 gBattleTypeFlags; -extern u32 gTransformPersonalities[NUM_BATTLE_SLOTS]; -extern u8 gBattleMonForms[NUM_BATTLE_SLOTS]; -extern u16 gUnknown_0202F7CA[]; -extern u8 gBattleMonSprites[NUM_BATTLE_SLOTS]; -extern u8 gBattleAnimBankAttacker; -extern u8 gBattleAnimBankTarget; -extern s16 gBattleAnimArgs[8]; -extern u8 gBanksBySide[NUM_BATTLE_SLOTS]; -extern u8 gNoOfAllBanks; // gNumBattleMons? -extern struct OamMatrix gOamMatrices[]; -extern struct Struct_2017810 unk_2017810[]; -extern u8 gHappinessMoveAnim; - -EWRAM_DATA union AffineAnimCmd *gUnknown_0202F7D4 = NULL; -EWRAM_DATA u32 filler_0202F7D8[3] = {0}; - -const struct Struct_gUnknown_0837F578 gUnknown_0837F578[][4] = { - { - { 72, 80 }, - { 176, 40 }, - { 48, 40 }, - { 112, 80 }, - }, - { - { 32, 80 }, - { 200, 40 }, - { 90, 88 }, - { 152, 32 }, - }, -}; - -// One entry for each of the four Castform forms. -// Coords are probably front pic coords or back pic coords, but this data does not seem to be -// used during battle, party summary, or pokedex screens. -const struct MonCoords gCastformFrontSpriteCoords[] = { - { 0x44, 17 }, // NORMAL - { 0x66, 9 }, // SUN - { 0x46, 9 }, // RAIN - { 0x86, 8 }, // HAIL -}; - -const u8 gCastformElevations[] = { - 13, // NORMAL - 14, // SUN - 13, // RAIN - 13, // HAIL -}; - -// Y position of the backsprite for each of the four Castform forms. -const u8 gCastformBackSpriteYCoords[] = { - 0, // NORMAL - 0, // SUN - 0, // RAIN - 0, // HAIL -}; - -const struct SpriteTemplate gSpriteTemplate_837F5B0[] = { - { - .tileTag = 55125, - .paletteTag = 55125, - .oam = gOamData_837DF9C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }, { - .tileTag = 55126, - .paletteTag = 55126, - .oam = gOamData_837DF9C, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - } -}; - -const struct SpriteSheet gUnknown_0837F5E0[] = { - { gMiscBlank_Gfx, 0x800, 55125, }, - { gMiscBlank_Gfx, 0x800, 55126, }, -}; - - -u8 sub_8077ABC(u8 slot, u8 a2) { - u8 var; - u16 species; - struct TransformStatus *transform; - - if (IsContest()) { - if (a2 == 3 && slot == 3) { - a2 = 1; - } - } - switch (a2) { - case 0: - case 2: - var = gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_0; - break; - case 1: - var = gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_1; - break; - case 3: - case 4: - default: - if (IsContest()) { - if (unk_2019348.field_4 & 1) { - species = unk_2019348.field_2; - } else { - species = unk_2019348.field_0; - } - } else { - if (GetBankSide(slot)) { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - } else { - species = transform->species; - } - } else { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - } else { - species = transform->species; - } - } - } - if (a2 == 3) { - var = sub_8077E44(slot, species, 1); - } else { - var = sub_8077E44(slot, species, 0); - } - break; - } - return var; -} - -u8 sub_8077BFC(u8 slot, u16 species) { - u16 letter; - u32 personality; - struct TransformStatus *transform; - u8 ret; - u16 var; - - if (!GetBankSide(slot) || IsContest()) { - if (species == SPECIES_UNOWN) { - if (IsContest()) { - if (unk_2019348.field_4 & 1) { - personality = unk_2019348.field_10; - } else { - personality = unk_2019348.field_8; - } - } else { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - personality = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); - } else { - personality = gTransformPersonalities[slot]; - } - } - letter = GET_UNOWN_LETTER(personality); - if (!letter) { - var = species; - } else { - var = letter + SPECIES_UNOWN_B - 1; - } - ret = gMonBackPicCoords[var].y_offset; - } else if (species == SPECIES_CASTFORM) { - ret = gCastformBackSpriteYCoords[gBattleMonForms[slot]]; - } else if (species > NUM_SPECIES) { - ret = gMonBackPicCoords[0].y_offset; - } else { - ret = gMonBackPicCoords[species].y_offset; - } - } else { - if (species == SPECIES_UNOWN) { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - personality = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); - } else { - personality = gTransformPersonalities[slot]; - } - letter = GET_UNOWN_LETTER(personality); - if (!letter) { - var = species; - } else { - var = letter + SPECIES_UNOWN_B - 1; - } - ret = gMonFrontPicCoords[var].y_offset; - } else if (species == SPECIES_CASTFORM) { - ret = gCastformFrontSpriteCoords[gBattleMonForms[slot]].y_offset; - } else if (species > NUM_SPECIES) { - ret = gMonFrontPicCoords[0].y_offset; - } else { - ret = gMonFrontPicCoords[species].y_offset; - } - } - return ret; -} - -u8 sub_8077DD8(u8 slot, u16 species) { - u8 ret = 0; - if (GetBankSide(slot) == 1) { - if (!IsContest()) { - if (species == SPECIES_CASTFORM) { - ret = gCastformElevations[gBattleMonForms[slot]]; - } else if (species > NUM_SPECIES) { - ret = gEnemyMonElevation[0]; - } else { - ret = gEnemyMonElevation[species]; - } - } - } - return ret; -} - -u8 sub_8077E44(u8 slot, u16 species, u8 a3) { - u16 offset; - u8 y; - if (GetBankSide(slot) == 0 || IsContest()) { - offset = sub_8077BFC(slot, species); - } else { - offset = sub_8077BFC(slot, species); - offset -= sub_8077DD8(slot, species); - } - y = offset + gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_1; - if (a3) { - if (GetBankSide(slot) == 0) { - y += 8; - } - if (y > 104) y = 104; - } - return y; -} - -u8 sub_8077EE4(u8 slot, u8 a2) { - u16 species; - struct TransformStatus *transform; - if (a2 == 3 || a2 == 4) { - if (IsContest()) { - if (unk_2019348.field_4 & 1) { - species = unk_2019348.field_2; - } else { - species = unk_2019348.field_0; - } - } else { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = gUnknown_0202F7CA[slot]; - } else { - species = transform->species; - } - } - if (a2 == 3) { - return sub_8077E44(slot, species, 1); - } else { - return sub_8077E44(slot, species, 0); - } - } else { - return sub_8077ABC(slot, a2); - } -} - -u8 sub_8077F68(u8 slot) { - return sub_8077ABC(slot, 4); -} - -u8 sub_8077F7C(u8 slot) { - u16 var; - if (GetBankSide(slot)) { - var = sub_8077ABC(slot, 1) + 16; - } else { - var = sub_8077ABC(slot, 1) + 17; - } - return var; -} - -u8 sub_8077FC0(u8 slot) { - u16 var; - u8 r6; - struct TransformStatus *transform; - r6 = sub_8077ABC(slot, 1); - if (!IsContest()) { - if (GetBankSide(slot)) { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - var = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - } else { - var = transform->species; - } - } else { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - var = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - } else { - var = transform->species; - } - } - if (GetBankSide(slot)) { - r6 -= sub_8077DD8(slot, var); - } - } - return r6; -} - -u8 GetAnimBankSpriteId(u8 whichBank) { - u8 *sprites; - if (whichBank == ANIM_BANK_ATK) { - if (AnimBankSpriteExists(gBattleAnimBankAttacker)) { - sprites = gBattleMonSprites; - return sprites[gBattleAnimBankAttacker]; - } else { - return 0xff; - } - } else if (whichBank == ANIM_BANK_DEF) { - if (AnimBankSpriteExists(gBattleAnimBankTarget)) { - sprites = gBattleMonSprites; - return sprites[gBattleAnimBankTarget]; - } else { - return 0xff; - } - } else if (whichBank == ANIM_BANK_ATK_PARTNER) { - if (!IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { - return 0xff; - } else { - return gBattleMonSprites[gBattleAnimBankAttacker ^ 2]; - } - } else { - if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { - return gBattleMonSprites[gBattleAnimBankTarget ^ 2]; - } else { - return 0xff; - } - } -} - -void StoreSpriteCallbackInData6(struct Sprite *sprite, void (*callback)(struct Sprite*)) { - sprite->data6 = (u32)(callback) & 0xffff; - sprite->data7 = (u32)(callback) >> 16; -} - -void SetCallbackToStoredInData6(struct Sprite *sprite) { - u32 callback = (u16)sprite->data6 | (sprite->data7 << 16); - sprite->callback = (void (*)(struct Sprite *))callback; -} - -void sub_8078114(struct Sprite *sprite) { - if (sprite->data3) { - sprite->pos2.x = Sin(sprite->data0, sprite->data1); - sprite->pos2.y = Cos(sprite->data0, sprite->data1); - sprite->data0 += sprite->data2; - if (sprite->data0 >= 0x100) { - sprite->data0 -= 0x100; - } else if (sprite->data0 < 0) { - sprite->data0 += 0x100; - } - sprite->data3--; - } else { - SetCallbackToStoredInData6(sprite); - } -} - -void sub_8078174(struct Sprite *sprite) { - if (sprite->data3) { - sprite->pos2.x = Sin(sprite->data0, (sprite->data5 >> 8) + sprite->data1); - sprite->pos2.y = Cos(sprite->data0, (sprite->data5 >> 8) + sprite->data1); - sprite->data0 += sprite->data2; - sprite->data5 += sprite->data4; - if (sprite->data0 >= 0x100) { - sprite->data0 -= 0x100; - } else if (sprite->data0 < 0) { - sprite->data0 += 0x100; - } - sprite->data3--; - } else { - SetCallbackToStoredInData6(sprite); - } -} - -void unref_sub_80781F0(struct Sprite *sprite) { - if (sprite->data3) { - sprite->pos2.x = Sin(sprite->data0, sprite->data1); - sprite->pos2.y = Cos(sprite->data4, sprite->data1); - sprite->data0 += sprite->data2; - sprite->data4 += sprite->data5; - if (sprite->data0 >= 0x100) { - sprite->data0 -= 0x100; - } else if (sprite->data0 < 0) { - sprite->data0 += 0x100; - } - if (sprite->data4 >= 0x100) { - sprite->data4 -= 0x100; - } else if (sprite->data4 < 0) { - sprite->data4 += 0x100; - } - sprite->data3--; - } else { - SetCallbackToStoredInData6(sprite); - } -} - -void sub_8078278(struct Sprite *sprite) { - if (sprite->data3) { - sprite->pos2.x = Sin(sprite->data0, sprite->data1); - sprite->pos2.y = Cos(sprite->data0, sprite->data4); - sprite->data0 += sprite->data2; - if (sprite->data0 >= 0x100) { - sprite->data0 -= 0x100; - } else if (sprite->data0 < 0) { - sprite->data0 += 0x100; - } - sprite->data3--; - } else { - SetCallbackToStoredInData6(sprite); - } -} - -void sub_80782D8(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - } else { - SetCallbackToStoredInData6(sprite); - } -} - -void sub_80782F8(struct Sprite *sprite) { - sub_8078314(sprite); - sprite->callback = sub_8078364; - sprite->callback(sprite); -} - -void sub_8078314(struct Sprite *sprite) { - s16 old; - int v1; - if (sprite->data1 > sprite->data2) { - sprite->data0 = -sprite->data0; - } - v1 = sprite->data2 - sprite->data1; - old = sprite->data0; - sprite->data0 = abs(v1 / sprite->data0); - sprite->data2 = (sprite->data4 - sprite->data3) / sprite->data0; - sprite->data1 = old; -} - -void sub_8078364(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - sprite->pos2.x += sprite->data1; - sprite->pos2.y += sprite->data2; - } else { - SetCallbackToStoredInData6(sprite); - } -} - -void sub_8078394(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - sprite->data3 += sprite->data1; - sprite->data4 += sprite->data2; - sprite->pos2.x = sprite->data3 >> 8; - sprite->pos2.y = sprite->data4 >> 8; - } else { - SetCallbackToStoredInData6(sprite); - } -} - -void sub_80783D0(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - sprite->data3 += sprite->data1; - sprite->data4 += sprite->data2; - sprite->pos2.x = sprite->data3 >> 8; - sprite->pos2.y = sprite->data4 >> 8; - } else { - SetCallbackToStoredInData6(sprite); - } - UpdateMonIconFrame(sprite); -} - -void unref_sub_8078414(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x + sprite->pos2.x; - sprite->data3 = sprite->pos1.y + sprite->pos2.y; - sprite->data2 = sub_8077ABC(gBattleAnimBankTarget, 2); - sprite->data4 = sub_8077ABC(gBattleAnimBankTarget, 3); - sprite->callback = sub_80782F8; -} - -void sub_8078458(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - gSprites[sprite->data3].pos2.x += sprite->data1; - gSprites[sprite->data3].pos2.y += sprite->data2; - } else { - SetCallbackToStoredInData6(sprite); - } -} - -void sub_80784A8(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - sprite->data3 += sprite->data1; - sprite->data4 += sprite->data2; - gSprites[sprite->data5].pos2.x = sprite->data3 >> 8; - gSprites[sprite->data5].pos2.y = sprite->data4 >> 8; - } else { - SetCallbackToStoredInData6(sprite); - } -} - -void sub_8078504(struct Sprite *sprite) { - if (sprite->data0 > 0) { - sprite->data0--; - sprite->pos2.x = sprite->data2 >> 8; - sprite->data2 += sprite->data1; - sprite->pos2.y = sprite->data4 >> 8; - sprite->data4 += sprite->data3; - if (sprite->data0 % sprite->data5 == 0) { - if (sprite->data5) { - sprite->invisible ^= 1; - } - } - } else { - SetCallbackToStoredInData6(sprite); - } -} - -void move_anim_8074EE0(struct Sprite *sprite) { - FreeSpriteOamMatrix(sprite); - move_anim_8072740(sprite); -} - -void unref_sub_8078588(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x + sprite->pos2.x; - sprite->data3 = sprite->pos1.y + sprite->pos2.y; - sprite->data2 = sub_8077ABC(gBattleAnimBankAttacker, 2); - sprite->data4 = sub_8077ABC(gBattleAnimBankAttacker, 3); - sprite->callback = sub_80782F8; -} - -void unref_sub_80785CC(struct Sprite *sprite) { - ResetPaletteStructByUid(sprite->data5); - move_anim_8074EE0(sprite); -} - -void sub_80785E4(struct Sprite *sprite) { - if (sprite->affineAnimEnded) { - SetCallbackToStoredInData6(sprite); - } -} - -void sub_8078600(struct Sprite *sprite) { - if (sprite->animEnded) { - SetCallbackToStoredInData6(sprite); - } -} - -void sub_807861C(struct Sprite *sprite) { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - move_anim_8072740(sprite); -} - -void sub_8078634(u8 task) { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroyAnimVisualTask(task); -} - -void sub_8078650(struct Sprite *sprite) { - sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2); - sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3); -} - -void sub_807867C(struct Sprite *sprite, s16 a2) { - u16 v1 = sub_8077ABC(gBattleAnimBankAttacker, 0); - u16 v2 = sub_8077ABC(gBattleAnimBankTarget, 0); - if (v1 > v2) { - sprite->pos1.x -= a2; - } else if (v1 < v2) { - sprite->pos1.x += a2; - } else { - if (GetBankSide(gBattleAnimBankAttacker)) { - sprite->pos1.x -= a2; - } else { - sprite->pos1.x += a2; - } - } -} - -void sub_80786EC(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x; - sprite->data3 = sprite->pos1.y; - obj_translate_based_on_private_1_2_3_4(sprite); - sprite->data6 = 0x8000 / sprite->data0; - sprite->data7 = 0; -} - -bool8 sub_8078718(struct Sprite *sprite) { - if (sub_8078B5C(sprite)) { - return TRUE; - } - sprite->data7 += sprite->data6; - sprite->pos2.y += Sin((u8)(sprite->data7 >> 8), sprite->data5); - return FALSE; -} - -void oamt_add_pos2_onto_pos1(struct Sprite *sprite) { - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; -} - -void sub_8078764(struct Sprite *sprite, u8 a2) { - if (!a2) { - sprite->pos1.x = sub_8077EE4(gBattleAnimBankTarget, 0); - sprite->pos1.y = sub_8077EE4(gBattleAnimBankTarget, 1); - } - sub_807867C(sprite, gBattleAnimArgs[0]); - sprite->pos1.y += gBattleAnimArgs[1]; -} - -void sub_80787B0(struct Sprite *sprite, u8 a2) { - if (!a2) { - sprite->pos1.x = sub_8077EE4(gBattleAnimBankAttacker, 0); - sprite->pos1.y = sub_8077EE4(gBattleAnimBankAttacker, 1); - } else { - sprite->pos1.x = sub_8077EE4(gBattleAnimBankAttacker, 2); - sprite->pos1.y = sub_8077EE4(gBattleAnimBankAttacker, 3); - } - sub_807867C(sprite, gBattleAnimArgs[0]); - sprite->pos1.y += gBattleAnimArgs[1]; -} - -u8 GetBankSide(u8 slot) { - return gBanksBySide[slot] & 1; -} - -u8 GetBankIdentity(u8 slot) { - return gBanksBySide[slot]; -} - -u8 GetBankByPlayerAI(u8 slot) { - u8 i; - for (i = 0; i < gNoOfAllBanks; i++) { - if (gBanksBySide[i] == slot) { - break; - } - } - return i; -} - -bool8 AnimBankSpriteExists(u8 slot) { - if (IsContest()) { - if (gBattleAnimBankAttacker == slot) { - return TRUE; - } - if (gBattleAnimBankTarget == slot) { - return TRUE; - } - return FALSE; - } else { - if (gBanksBySide[slot] == 0xff) { - return FALSE; - } - if (GetBankSide(slot)) { - if (GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) { - return TRUE; - } - } else { - if (GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) { - return TRUE; - } - } - return FALSE; - } -} - -bool8 IsDoubleBattle() { - return IS_DOUBLE_BATTLE(); -} - -void sub_8078914(struct Struct_sub_8078914 *unk) { - if (IsContest()) { - unk->field_0 = (u8 *)0x6008000; - unk->field_4 = (u8 *)0x600f000; - unk->field_8 = 0xe; - } else { - unk->field_0 = (u8 *)0x6004000; - unk->field_4 = (u8 *)0x600e000; - unk->field_8 = 0x8; - } -} - -void sub_8078954(struct Struct_sub_8078914 *unk) { - if (IsContest()) { - unk->field_0 = (u8 *)0x6008000; - unk->field_4 = (u8 *)0x600f000; - unk->field_8 = 0xe; - } else if (GetBankIdentity_permutated(gBattleAnimBankAttacker) == 1) { - unk->field_0 = (u8 *)0x6004000; - unk->field_4 = (u8 *)0x600e000; - unk->field_8 = 0x8; - } else { - unk->field_0 = (u8 *)0x6006000; - unk->field_4 = (u8 *)0x600f000; - unk->field_8 = 0x9; - } -} - -u8 sub_80789BC() { - if (IsContest()) { - return 1; - } - return 2; -} - -void sub_80789D4(bool8 a1) { - if (!a1) { - BG3CNT.size = 0; - BG3CNT.overflow = 1; - } else if (IsContest()) { - BG3CNT.size = 0; - BG3CNT.overflow = 1; - } else { - BG3CNT.size = 1; - BG3CNT.overflow = 0; - } -} - -void sub_8078A34(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x; - sprite->data3 = sprite->pos1.y; - sub_8078A5C(sprite); - sprite->callback = sub_80783D0; - sprite->callback(sprite); -} - -void sub_8078A5C(struct Sprite *sprite) { - s16 x = (sprite->data2 - sprite->data1) << 8; - s16 y = (sprite->data4 - sprite->data3) << 8; - sprite->data1 = x / sprite->data0; - sprite->data2 = y / sprite->data0; - sprite->data4 = 0; - sprite->data3 = 0; -} - -void obj_translate_based_on_private_1_2_3_4(struct Sprite *sprite) { - int x = sprite->data2 - sprite->data1; - int y = sprite->data4 - sprite->data3; - bool8 r8 = x < 0; - bool8 r9 = y < 0; - u16 x2 = abs(x) << 8; - u16 y2 = abs(y) << 8; - x2 = x2 / sprite->data0; - y2 = y2 / sprite->data0; - if (r8) { - x2 |= 1; - } else { - x2 &= ~1; - } - if (r9) { - y2 |= 1; - } else { - y2 &= ~1; - } - sprite->data1 = x2; - sprite->data2 = y2; - sprite->data4 = 0; - sprite->data3 = 0; -} - -void sub_8078B34(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x; - sprite->data3 = sprite->pos1.y; - obj_translate_based_on_private_1_2_3_4(sprite); - sprite->callback = sub_8078BB8; - sprite->callback(sprite); -} - -bool8 sub_8078B5C(struct Sprite *sprite) { - u16 v1, v2, x, y; - if (!sprite->data0) { - return TRUE; - } - v1 = sprite->data1; - v2 = sprite->data2; - x = sprite->data3; - y = sprite->data4; - x += v1; - y += v2; - if (v1 & 1) { - sprite->pos2.x = -(x >> 8); - } else { - sprite->pos2.x = x >> 8; - } - if (v2 & 1) { - sprite->pos2.y = -(y >> 8); - } else { - sprite->pos2.y = y >> 8; - } - sprite->data3 = x; - sprite->data4 = y; - sprite->data0--; - return FALSE; -} - -void sub_8078BB8(struct Sprite *sprite) { - if (sub_8078B5C(sprite)) { - SetCallbackToStoredInData6(sprite); - } -} - -void sub_8078BD4(struct Sprite *sprite) { - int v1 = abs(sprite->data2 - sprite->data1) << 8; - sprite->data0 = v1 / sprite->data0; - obj_translate_based_on_private_1_2_3_4(sprite); -} - -void sub_8078C00(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x; - sprite->data3 = sprite->pos1.y; - sub_8078BD4(sprite); - sprite->callback = sub_8078BB8; - sprite->callback(sprite); -} - -void sub_8078C28(struct Sprite *sprite) { - int x = sprite->data2 - sprite->data1; - int y = sprite->data4 - sprite->data3; - bool8 x_sign = x < 0; - bool8 y_sign = y < 0; - u16 x2 = abs(x) << 4; - u16 y2 = abs(y) << 4; - x2 /= sprite->data0; - y2 /= sprite->data0; - if (x_sign) { - x2 |= 1; - } else { - x2 &= ~1; - } - if (y_sign) { - y2 |= 1; - } else { - y2 &= ~1; - } - sprite->data1 = x2; - sprite->data2 = y2; - sprite->data4 = 0; - sprite->data3 = 0; -} - -void sub_8078CC0(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x; - sprite->data3 = sprite->pos1.y; - sub_8078C28(sprite); - sprite->callback = sub_8078D44; - sprite->callback(sprite); -} - -bool8 sub_8078CE8(struct Sprite *sprite) { - u16 v1, v2, x, y; - if (!sprite->data0) { - return TRUE; - } - v1 = sprite->data1; - v2 = sprite->data2; - x = sprite->data3; - y = sprite->data4; - x += v1; - y += v2; - if (v1 & 1) { - sprite->pos2.x = -(x >> 4); - } else { - sprite->pos2.x = x >> 4; - } - if (v2 & 1) { - sprite->pos2.y = -(y >> 4); - } else { - sprite->pos2.y = y >> 4; - } - sprite->data3 = x; - sprite->data4 = y; - sprite->data0--; - return FALSE; -} - -void sub_8078D44(struct Sprite *sprite) { - if (sub_8078CE8(sprite)) { - SetCallbackToStoredInData6(sprite); - } -} - -void sub_8078D60(struct Sprite *sprite) { - int v1 = abs(sprite->data2 - sprite->data1) << 4; - sprite->data0 = v1 / sprite->data0; - sub_8078C28(sprite); -} - -void sub_8078D8C(struct Sprite *sprite) { - sprite->data1 = sprite->pos1.x; - sprite->data3 = sprite->pos1.y; - sub_8078D60(sprite); - sprite->callback = sub_8078D44; - sprite->callback(sprite); -} - -void obj_id_set_rotscale(u8 sprite, s16 xScale, s16 yScale, u16 rotation) { - int i; - struct ObjAffineSrcData src; - struct OamMatrix matrix; - src.xScale = xScale; - src.yScale = yScale; - src.rotation = rotation; - if (sub_8078E38()) { - src.xScale = -src.xScale; - } - i = gSprites[sprite].oam.matrixNum; - ObjAffineSet(&src, &matrix, 1, 2); - gOamMatrices[i].a = matrix.a; - gOamMatrices[i].b = matrix.b; - gOamMatrices[i].c = matrix.c; - gOamMatrices[i].d = matrix.d; -} - -bool8 sub_8078E38() { - if (IsContest()) { - if (gSprites[GetAnimBankSpriteId(0)].data2 == 0xc9 /* XXX SPECIES_UNOWN? */) { - return FALSE; - } - return TRUE; - } - return FALSE; -} - -void sub_8078E70(u8 sprite, u8 a2) { - struct Struct_2017810 *unk; - u8 r7 = gSprites[sprite].data0; - if (IsContest() || IsAnimBankSpriteVisible(r7)) { - gSprites[sprite].invisible = FALSE; - } - gSprites[sprite].oam.objMode = a2; - gSprites[sprite].affineAnimPaused = TRUE; - if (!IsContest() && !gSprites[sprite].oam.affineMode) { - unk = &unk_2017810[r7]; - gSprites[sprite].oam.matrixNum = unk->field_6; - } - gSprites[sprite].oam.affineMode = 3; - CalcCenterToCornerVec(&gSprites[sprite], gSprites[sprite].oam.shape, gSprites[sprite].oam.size, gSprites[sprite].oam.affineMode); -} - -void sub_8078F40(u8 sprite) { - obj_id_set_rotscale(sprite, 0x100, 0x100, 0); - gSprites[sprite].oam.affineMode = 1; - gSprites[sprite].oam.objMode = 0; - gSprites[sprite].affineAnimPaused = FALSE; - CalcCenterToCornerVec(&gSprites[sprite], gSprites[sprite].oam.shape, gSprites[sprite].oam.size, gSprites[sprite].oam.affineMode); -} - -void sub_8078F9C(u8 sprite) { - u16 matrix = gSprites[sprite].oam.matrixNum; - s16 c = gOamMatrices[matrix].c; - if (c < 0) { - c = -c; - } - gSprites[sprite].pos2.y = c >> 3; -} - -// related to obj_id_set_rotscale -void sub_8078FDC(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 rotation) { - int i; - struct ObjAffineSrcData src; - struct OamMatrix matrix; - if (sprite->oam.affineMode & 1) { - sprite->affineAnimPaused = TRUE; - if (a2) { - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - } - src.xScale = xScale; - src.yScale = yScale; - src.rotation = rotation; - if (sub_8078E38()) { - src.xScale = -src.xScale; - } - i = sprite->oam.matrixNum; - ObjAffineSet(&src, &matrix, 1, 2); - gOamMatrices[i].a = matrix.a; - gOamMatrices[i].b = matrix.b; - gOamMatrices[i].c = matrix.c; - gOamMatrices[i].d = matrix.d; - } -} - -void sub_8079098(struct Sprite *sprite) { - sub_8078FDC(sprite, TRUE, 0x100, 0x100, 0); - sprite->affineAnimPaused = FALSE; - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); -} - -static u16 ArcTan2_(s16 a, s16 b) { - return ArcTan2(a, b); -} - -u16 sub_80790F0(s16 a, s16 b) { - u16 var = ArcTan2_(a, b); - return -var; -} - -void sub_8079108(u16 a1, bool8 a2) { - int i; - struct Color *c; - struct Color *c2; - u16 average; - - a1 *= 0x10; - - if (!a2) { - for (i = 0; i < 0x10; i++) { - c = (struct Color *)&gPlttBufferUnfaded[a1 + i]; - average = c->r + c->g + c->b; - average /= 3; - - c2 = (struct Color *)&gPlttBufferFaded[a1 + i]; - c2->r = average; - c2->g = average; - c2->b = average; - } - } else { - CpuCopy32(&gPlttBufferUnfaded[a1], &gPlttBufferFaded[a1], 0x20); - } -} - -u32 sub_80791A8(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) { - u32 var = 0; - u32 shift; - if (a1) { - if (!IsContest()) { - var = 0xe; - } else { - var = 1 << sub_80789BC(); - } - } - if (a2) { - shift = gBattleAnimBankAttacker + 16; - var |= 1 << shift; - } - if (a3) { - shift = gBattleAnimBankTarget + 16; - var |= 1 << shift; - } - if (a4) { - if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { - shift = (gBattleAnimBankAttacker ^ 2) + 16; - var |= 1 << shift; - } - } - if (a5) { - if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { - shift = (gBattleAnimBankTarget ^ 2) + 16; - var |= 1 << shift; - } - } - if (a6) { - if (!IsContest()) { - var |= 0x100; - } else { - var |= 0x4000; - } - } - if (a7) { - if (!IsContest()) { - var |= 0x200; - } - } - return var; -} - -u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4) { - u32 var = 0; - u32 shift; - if (IsContest()) { - if (a1) { - var |= 1 << 18; - return var; - } - } else { - if (a1) { - if (IsAnimBankSpriteVisible(GetBankByPlayerAI(0))) { - var |= 1 << (GetBankByPlayerAI(0) + 16); - } - } - if (a2) { - if (IsAnimBankSpriteVisible(GetBankByPlayerAI(2))) { - shift = GetBankByPlayerAI(2) + 16; - var |= 1 << shift; - } - } - if (a3) { - if (IsAnimBankSpriteVisible(GetBankByPlayerAI(1))) { - shift = GetBankByPlayerAI(1) + 16; - var |= 1 << shift; - } - } - if (a4) { - if (IsAnimBankSpriteVisible(GetBankByPlayerAI(3))) { - shift = GetBankByPlayerAI(3) + 16; - var |= 1 << shift; - } - } - } - return var; -} - -u8 sub_80793A8(u8 a1) { - return a1; -} - -u8 unref_sub_80793B0(u8 a1) { - return GetBankByPlayerAI(a1); -} - -void sub_80793C4(struct Sprite *sprite) { - bool8 var; - if (!sprite->data0) { - if (!gBattleAnimArgs[3]) { - var = TRUE; - } else { - var = FALSE; - } - if (!gBattleAnimArgs[2]) { - sub_80787B0(sprite, var); - } else { - sub_8078764(sprite, var); - } - sprite->data0++; - - } else if (sprite->animEnded || sprite->affineAnimEnded) { - move_anim_8074EE0(sprite); - } -} - -void sub_807941C(struct Sprite *sprite) { - bool8 v1; - u8 v2; - if (!(gBattleAnimArgs[5] & 0xff00)) { - v1 = TRUE; - } else { - v1 = FALSE; - } - if (!(gBattleAnimArgs[5] & 0xff)) { - v2 = 3; - } else { - v2 = 1; - } - sub_80787B0(sprite, v1); - if (GetBankSide(gBattleAnimBankAttacker)) { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } - sprite->data0 = gBattleAnimArgs[4]; - sprite->data2 = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2]; - sprite->data4 = sub_8077ABC(gBattleAnimBankTarget, v2) + gBattleAnimArgs[3]; - sprite->callback = sub_8078B34; - StoreSpriteCallbackInData6(sprite, move_anim_8072740); -} - -void sub_80794A8(struct Sprite *sprite) { - sub_80787B0(sprite, 1); - if (GetBankSide(gBattleAnimBankAttacker)) { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } - sprite->data0 = gBattleAnimArgs[4]; - sprite->data2 = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2]; - sprite->data4 = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[3]; - sprite->data5 = gBattleAnimArgs[5]; - sub_80786EC(sprite); - sprite->callback = sub_8079518; -} - -void sub_8079518(struct Sprite *sprite) { - if (sub_8078718(sprite)) { - move_anim_8072740(sprite); - } -} - -void sub_8079534(struct Sprite *sprite) { - u8 r4, slot, r7; - if (!gBattleAnimArgs[6]) { - r4 = 1; - r7 = 3; - } else { - r4 = 0; - r7 = 1; - } - if (!gBattleAnimArgs[5]) { - sub_80787B0(sprite, r4); - slot = gBattleAnimBankAttacker; - } else { - sub_8078764(sprite, r4); - slot = gBattleAnimBankTarget; - } - if (GetBankSide(gBattleAnimBankAttacker)) { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } - sub_8078764(sprite, r4); - sprite->data0 = gBattleAnimArgs[4]; - sprite->data2 = sub_8077ABC(slot, 2) + gBattleAnimArgs[2]; - sprite->data4 = sub_8077ABC(slot, r7) + gBattleAnimArgs[3]; - sprite->callback = sub_8078B34; - StoreSpriteCallbackInData6(sprite, move_anim_8072740); -} - -s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 a1) { - u16 i; - u8 sprite = GetAnimBankSpriteId(a1); - if (sprite != 0xff) { - for (i = 0; i < 0x40; i++) { - if (gSprites[i].inUse) { - continue; - } - gSprites[i] = gSprites[sprite]; - gSprites[i].oam.objMode = 1; - gSprites[i].invisible = FALSE; - return i; - } - } - return -1; -} - -void obj_delete_but_dont_free_vram(struct Sprite *sprite) { - sprite->usingSheet = TRUE; - DestroySprite(sprite); -} - -void sub_8079670(u8 task) { - s16 v1 = 0; - s16 v2 = 0; - if (gBattleAnimArgs[2] > gBattleAnimArgs[0]) { - v2 = 1; - } - if (gBattleAnimArgs[2] < gBattleAnimArgs[0]) { - v2 = -1; - } - if (gBattleAnimArgs[3] > gBattleAnimArgs[1]) { - v1 = 1; - } - if (gBattleAnimArgs[3] < gBattleAnimArgs[1]) { - v1 = -1; - } - gTasks[task].data[0] = 0; - gTasks[task].data[1] = gBattleAnimArgs[4]; - gTasks[task].data[2] = 0; - gTasks[task].data[3] = gBattleAnimArgs[0]; - gTasks[task].data[4] = gBattleAnimArgs[1]; - gTasks[task].data[5] = v2; - gTasks[task].data[6] = v1; - gTasks[task].data[7] = gBattleAnimArgs[2]; - gTasks[task].data[8] = gBattleAnimArgs[3]; - REG_BLDALPHA = (gBattleAnimArgs[1] << 8) | gBattleAnimArgs[0]; - gTasks[task].func = sub_80796F8; -} - -void sub_80796F8(u8 taskId) { - struct Task *task = &gTasks[taskId]; - if (++task->data[0] > task->data[1]) { - task->data[0] = 0; - if (++task->data[2] & 1) { - if (task->data[3] != task->data[7]) { - task->data[3] += task->data[5]; - } - } else { - if (task->data[4] != task->data[8]) { - task->data[4] += task->data[6]; - } - } - REG_BLDALPHA = (task->data[4] << 8) | task->data[3]; - if (task->data[3] == task->data[7] && task->data[4] == task->data[8]) { - DestroyAnimVisualTask(taskId); - return; - } - } -} - -void sub_8079790(u8 task) { - u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); - if (sprite == 0xff) { - DestroyAnimVisualTask(task); - return; - } - gTasks[task].data[0] = (gSprites[sprite].oam.paletteNum * 0x10) + 0x101; - sub_80797EC(&gTasks[task]); -} - -void sub_80797EC(struct Task *task) { - task->data[1] = gBattleAnimArgs[1]; - task->data[2] = 0; - task->data[3] = gBattleAnimArgs[2]; - task->data[4] = 0; - task->data[5] = gBattleAnimArgs[3]; - task->data[6] = 0; - task->data[7] = gBattleAnimArgs[4]; - task->func = sub_8079814; -} - -void sub_8079814(u8 taskId) { - struct Task *task = &gTasks[taskId]; - if (++task->data[4] >= task->data[5]) { - task->data[4] = 0; - if (!task->data[6]) { - task->data[2]++; - BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]); - if (task->data[2] == task->data[3]) { - task->data[6] = 1; - } - } else { - task->data[2]--; - BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]); - if (!task->data[2]) { - if (--task->data[7]) { - task->data[4] = 0; - task->data[6] = 0; - } else { - DestroyAnimVisualTask(taskId); - return; - } - } - } - } -} - -void sub_80798AC(u8 task) { - u8 palette = IndexOfSpritePaletteTag(gBattleAnimArgs[0]); - if (palette == 0xff) { - DestroyAnimVisualTask(task); - return; - } - gTasks[task].data[0] = (palette * 0x10) + 0x101; - sub_80797EC(&gTasks[task]); -} - -void sub_80798F4(struct Task *task, u8 a2, void *a3) { - task->data[7] = 0; - task->data[8] = 0; - task->data[9] = 0; - task->data[15] = a2; - task->data[10] = 0x100; - task->data[11] = 0x100; - task->data[12] = 0; - sub_8079BF4(&task->data[13], &task->data[14], a3); - sub_8078E70(a2, 0); -} - -bool8 sub_807992C(struct Task *task) { - gUnknown_0202F7D4 = sub_8079BFC(task->data[13], task->data[14]) + (task->data[7] << 3); - switch (gUnknown_0202F7D4->type) { - default: - if (!gUnknown_0202F7D4->frame.duration) { - task->data[10] = gUnknown_0202F7D4->frame.xScale; - task->data[11] = gUnknown_0202F7D4->frame.yScale; - task->data[12] = gUnknown_0202F7D4->frame.rotation; - task->data[7]++; - gUnknown_0202F7D4++; - } - task->data[10] += gUnknown_0202F7D4->frame.xScale; - task->data[11] += gUnknown_0202F7D4->frame.yScale; - task->data[12] += gUnknown_0202F7D4->frame.rotation; - obj_id_set_rotscale(task->data[15], task->data[10], task->data[11], task->data[12]); - sub_8079A64(task->data[15]); - if (++task->data[8] >= gUnknown_0202F7D4->frame.duration) { - task->data[8] = 0; - task->data[7]++; - } - break; - - case AFFINEANIMCMDTYPE_JUMP: - task->data[7] = gUnknown_0202F7D4->jump.target; - break; - - case AFFINEANIMCMDTYPE_LOOP: - if (gUnknown_0202F7D4->loop.count) { - if (task->data[9]) { - if (!--task->data[9]) { - task->data[7]++; - break; - } - } else { - task->data[9] = gUnknown_0202F7D4->loop.count; - } - if (!task->data[7]) { - break; - } - for (;;) { - task->data[7]--; - gUnknown_0202F7D4--; - if (gUnknown_0202F7D4->type == AFFINEANIMCMDTYPE_LOOP) { - task->data[7]++; - return TRUE; - } - if (!task->data[7]) { - return TRUE; - } - } - } - task->data[7]++; - break; - - case 0x7fff: - gSprites[task->data[15]].pos2.y = 0; - sub_8078F40(task->data[15]); - return FALSE; - } - - return TRUE; -} - -void sub_8079A64(u8 sprite) { - int var = 0x40 - sub_8079B10(sprite) * 2; - u16 matrix = gSprites[sprite].oam.matrixNum; - int var2 = (var << 8) / gOamMatrices[matrix].d; - if (var2 > 0x80) { - var2 = 0x80; - } - gSprites[sprite].pos2.y = (var - var2) / 2; -} - -void sub_8079AB8(u8 sprite, u8 sprite2) { - int var = 0x40 - sub_8079B10(sprite2) * 2; - u16 matrix = gSprites[sprite].oam.matrixNum; - int var2 = (var << 8) / gOamMatrices[matrix].d; - if (var2 > 0x80) { - var2 = 0x80; - } - gSprites[sprite].pos2.y = (var - var2) / 2; -} - -u16 sub_8079B10(u8 sprite) { - struct TransformStatus *transform; - u8 slot = gSprites[sprite].data0; - u16 species; - u16 i; - for (i = 0; i < (sizeof(gBattleMonSprites) / sizeof(u8)); i++) { - if (gBattleMonSprites[i] == sprite) { - if (IsContest()) { - species = unk_2019348.field_0; - return gMonBackPicCoords[species].y_offset; - } else { - if (!GetBankSide(i)) { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[i]], MON_DATA_SPECIES); - } else { - species = transform->species; - } - return gMonBackPicCoords[species].y_offset; - } else { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[i]], MON_DATA_SPECIES); - } else { - species = transform->species; - } - return gMonFrontPicCoords[species].y_offset; - } - } - } - } - return 0x40; -} - -void sub_8079BF4(s16 *bottom, s16 *top, void *ptr) { - *bottom = ((intptr_t) ptr) & 0xffff; - *top = (((intptr_t) ptr) >> 16) & 0xffff; -} - -void *sub_8079BFC(s16 bottom, s16 top) { - return (void *)((u16)bottom | ((u16)top << 16)); -} - - -// possible new file - -void sub_8079C08(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7) { - task->data[8] = a7; - task->data[15] = a2; - task->data[9] = a3; - task->data[10] = a4; - task->data[13] = a5; - task->data[14] = a6; - task->data[11] = (a5 - a3) / a7; - task->data[12] = (a6 - a4) / a7; -} - -u8 sub_8079C74(struct Task *task) { - if (!task->data[8]) { - return 0; - } - if (--task->data[8]) { - task->data[9] += task->data[11]; - task->data[10] += task->data[12]; - } else { - task->data[9] = task->data[13]; - task->data[10] = task->data[14]; - } - obj_id_set_rotscale(task->data[15], task->data[9], task->data[10], 0); - if (task->data[8]) { - sub_8079A64(task->data[15]); - } else { - gSprites[task->data[15]].pos2.y = 0; - } - return task->data[8]; -} - -void sub_8079CEC(u8 task) { - u16 v1; - if (gHappinessMoveAnim <= 30) { - v1 = 0; - } else if (gHappinessMoveAnim <= 100) { - v1 = 1; - } else if (gHappinessMoveAnim <= 200) { - v1 = 2; - } else { - v1 = 3; - } - gBattleAnimArgs[7] = v1; - DestroyAnimVisualTask(task); -} - -void unref_sub_8079D20(u8 priority) { - if (IsAnimBankSpriteVisible(gBattleAnimBankTarget)) { - gSprites[gBattleMonSprites[gBattleAnimBankTarget]].oam.priority = priority; - } - if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker)) { - gSprites[gBattleMonSprites[gBattleAnimBankAttacker]].oam.priority = priority; - } - if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { - gSprites[gBattleMonSprites[gBattleAnimBankTarget ^ 2]].oam.priority = priority; - } - if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { - gSprites[gBattleMonSprites[gBattleAnimBankAttacker ^ 2]].oam.priority = priority; - } -} - -void sub_8079E24() { - int i; - for (i = 0; i < gNoOfAllBanks; i++) { - if (IsAnimBankSpriteVisible(i)) { - gSprites[gBattleMonSprites[i]].subpriority = sub_8079E90(i); - gSprites[gBattleMonSprites[i]].oam.priority = 2; - } - } -} - -u8 sub_8079E90(u8 slot) { - u8 status; - u8 ret; - if (IsContest()) { - if (slot == 2) { - return 30; - } else { - return 40; - } - } else { - status = GetBankIdentity(slot); - if (status == 0) { - ret = 30; - } else if (status == 2) { - ret = 20; - } else if (status == 1) { - ret = 40; - } else { - ret = 50; - } - } - return ret; -} - -u8 sub_8079ED4(u8 slot) { - u8 status = GetBankIdentity(slot); - if (IsContest()) { - return 2; - } - if (status == 0 || status == 3) { - return BG2CNT.priority; - } else { - return BG1CNT.priority; - } -} - -u8 GetBankIdentity_permutated(u8 slot) { - u8 status; - if (!IsContest()) { - status = GetBankIdentity(slot); - if (status == 0 || status == 3) { - return 2; - } else { - return 1; - } - } - return 1; -} - -u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, u32 a8) { - void *src; - void *dest; - int size; - - u8 sprite; - u16 sheet = LoadSpriteSheet(&gUnknown_0837F5E0[a3]); - u16 palette = AllocSpritePalette(gSpriteTemplate_837F5B0[a3].paletteTag); - if (!isBackpic) { - LoadCompressedPalette(GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20); - LoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, - gMonFrontPicCoords[species].y_offset, - 0x2000000, - (void *)0x2000000, - species, - a7, - 1 - ); - } else { - LoadCompressedPalette( - GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20); - LoadSpecialPokePic( - &gMonBackPicTable[species], - gMonBackPicCoords[species].coords, - gMonBackPicCoords[species].y_offset, - 0x2000000, - (void *)0x2000000, - species, - a7, - 0 - ); - } - - src = (void *)0x2000000; - dest = (void *)(0x6010000 + (sheet * 0x20)); - size = 0x800; - DmaCopy32(3, src, dest, size); - - if (!isBackpic) { - sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonFrontPicCoords[species].y_offset, a6); - } else { - sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonBackPicCoords[species].y_offset, a6); - } - if (IsContest()) { - gSprites[sprite].affineAnims = &gSpriteAffineAnimTable_81E7C18; - StartSpriteAffineAnim(&gSprites[sprite], 0); - } - return sprite; -} - -void sub_807A0F4(struct Sprite *sprite) { - DestroySpriteAndFreeResources(sprite); -} - -int sub_807A100(u8 slot, u8 a2) { - u16 species; - u32 personality; - u16 letter; - u16 var; - int ret; - const struct MonCoords *coords; - struct TransformStatus *transform; - if (IsContest()) { - if (unk_2019348.field_4 & 1) { - species = unk_2019348.field_2; - personality = unk_2019348.field_10; - } else { - species = unk_2019348.field_0; - personality = unk_2019348.field_8; - } - if (species == SPECIES_UNOWN) { - letter = GET_UNOWN_LETTER(personality); - if (!letter) { - var = SPECIES_UNOWN; - } else { - var = letter + SPECIES_UNOWN_B - 1; - } - coords = &gMonBackPicCoords[var]; - } else if (species == SPECIES_CASTFORM) { - coords = &gCastformFrontSpriteCoords[gBattleMonForms[slot]]; - } else if (species <= SPECIES_EGG) { - coords = &gMonBackPicCoords[species]; - } else { - coords = &gMonBackPicCoords[0]; - } - } else { - if (!GetBankSide(slot)) { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - personality = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); - } else { - species = transform->species; - personality = gTransformPersonalities[slot]; - } - if (species == SPECIES_UNOWN) { - letter = GET_UNOWN_LETTER(personality); - if (!letter) { - var = SPECIES_UNOWN; - } else { - var = letter + SPECIES_UNOWN_B - 1; - } - coords = &gMonBackPicCoords[var]; - } else if (species > SPECIES_EGG) { - coords = &gMonBackPicCoords[0]; - } else { - coords = &gMonBackPicCoords[species]; - } - } else { - transform = &gTransformStatuses[slot]; - if (!transform->species) { - species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); - personality = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); - } else { - species = transform->species; - personality = gTransformPersonalities[slot]; - } - if (species == SPECIES_UNOWN) { - letter = GET_UNOWN_LETTER(personality); - if (!letter) { - var = SPECIES_UNOWN; - } else { - var = letter + SPECIES_UNOWN_B - 1; - } - coords = &gMonFrontPicCoords[var]; - } else if (species == SPECIES_CASTFORM) { - coords = &gCastformFrontSpriteCoords[gBattleMonForms[slot]]; - } else if (species > SPECIES_EGG) { - coords = &gMonFrontPicCoords[0]; - } else { - coords = &gMonFrontPicCoords[species]; - } - } - } - - switch (a2) { - case 0: - return (coords->coords & 0xf) * 8; - case 1: - return (coords->coords >> 4) * 8; - case 4: - return sub_8077ABC(slot, 2) - ((coords->coords >> 4) * 4); - case 5: - return sub_8077ABC(slot, 2) + ((coords->coords >> 4) * 4); - case 2: - return sub_8077ABC(slot, 3) - ((coords->coords & 0xf) * 4); - case 3: - return sub_8077ABC(slot, 3) + ((coords->coords & 0xf) * 4); - case 6: - ret = sub_8077ABC(slot, 1) + 0x1f; - return ret - coords->y_offset; - default: - return 0; - } -} - -void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4) { - u8 v1, v2; - s16 v3, v4; - s16 v5, v6; - if (!a2) { - v1 = 0; - v2 = 1; - } else { - v1 = 2; - v2 = 3; - } - v3 = sub_8077ABC(slot, v1); - v4 = sub_8077ABC(slot, v2); - if (IsDoubleBattle() && !IsContest()) { - v5 = sub_8077ABC(slot ^ 2, v1); - v6 = sub_8077ABC(slot ^ 2, v2); - } else { - v5 = v3; - v6 = v4; - } - *a3 = (v3 + v5) / 2; - *a4 = (v4 + v6) / 2; -} - -u8 sub_807A4A0(int a1, u8 sprite, int a3) { - u8 new_sprite = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); - gSprites[new_sprite] = gSprites[sprite]; - gSprites[new_sprite].usingSheet = TRUE; - gSprites[new_sprite].oam.priority = 0; - gSprites[new_sprite].oam.objMode = 2; - gSprites[new_sprite].oam.tileNum = gSprites[sprite].oam.tileNum; - gSprites[new_sprite].callback = SpriteCallbackDummy; - return new_sprite; -} - -void sub_807A544(struct Sprite *sprite) { - sub_8078650(sprite); - if (GetBankSide(gBattleAnimBankAttacker)) { - sprite->pos1.x -= gBattleAnimArgs[0]; - gBattleAnimArgs[3] = -gBattleAnimArgs[3]; - sprite->hFlip = TRUE; - } else { - sprite->pos1.x += gBattleAnimArgs[0]; - } - sprite->pos1.y += gBattleAnimArgs[1]; - sprite->data0 = gBattleAnimArgs[2]; - sprite->data1 = gBattleAnimArgs[3]; - sprite->data3 = gBattleAnimArgs[4]; - sprite->data5 = gBattleAnimArgs[5]; - StoreSpriteCallbackInData6(sprite, move_anim_8074EE0); - sprite->callback = sub_8078504; -} - -void sub_807A5C4(struct Sprite *sprite) { - if (GetBankSide(gBattleAnimBankAttacker)) { - sprite->pos1.x -= gBattleAnimArgs[0]; - gBattleAnimArgs[3] *= -1; - } else { - sprite->pos1.x += gBattleAnimArgs[0]; - } - sprite->pos1.y += gBattleAnimArgs[1]; - sprite->data0 = gBattleAnimArgs[2]; - sprite->data1 = gBattleAnimArgs[3]; - sprite->data3 = gBattleAnimArgs[4]; - sprite->data5 = gBattleAnimArgs[5]; - StartSpriteAnim(sprite, gBattleAnimArgs[6]); - StoreSpriteCallbackInData6(sprite, move_anim_8074EE0); - sprite->callback = sub_8078504; -} - -void sub_807A63C(struct Sprite *sprite) { - sub_8078650(sprite); - if (GetBankSide(gBattleAnimBankAttacker)) { - sprite->pos1.x -= gBattleAnimArgs[0]; - } else { - sprite->pos1.x += gBattleAnimArgs[0]; - } - sprite->pos1.y += gBattleAnimArgs[1]; - sprite->callback = sub_8078600; - StoreSpriteCallbackInData6(sprite, move_anim_8072740); -} - -void sub_807A69C(u8 taskId) { - u16 src; - u16 dest; - struct Task *task = &gTasks[taskId]; - task->data[0] = GetAnimBankSpriteId(0); - task->data[1] = (GetBankSide(gBattleAnimBankAttacker)) ? -8 : 8; - task->data[2] = 0; - task->data[3] = 0; - gSprites[task->data[0]].pos2.x -= task->data[0]; - task->data[4] = AllocSpritePalette(10097); - task->data[5] = 0; - - dest = (task->data[4] + 0x10) * 0x10; - src = (gSprites[task->data[0]].oam.paletteNum + 0x10) * 0x10; - task->data[6] = sub_8079E90(gBattleAnimBankAttacker); - if (task->data[6] == 20 || task->data[6] == 40) { - task->data[6] = 2; - } else { - task->data[6] = 3; - } - CpuCopy32(&gPlttBufferUnfaded[src], &gPlttBufferFaded[dest], 0x20); - BlendPalette(dest, 0x10, gBattleAnimArgs[1], gBattleAnimArgs[0]); - task->func = sub_807A784; -} - -void sub_807A784(u8 taskId) { - struct Task *task = &gTasks[taskId]; - switch (task->data[2]) { - case 0: - sub_807A850(task, taskId); - gSprites[task->data[0]].pos2.x += task->data[1]; - if (++task->data[3] == 5) { - task->data[3]--; - task->data[2]++; - } - break; - case 1: - sub_807A850(task, taskId); - gSprites[task->data[0]].pos2.x -= task->data[1]; - if (--task->data[3] == 0) { - gSprites[task->data[0]].pos2.x = 0; - task->data[2]++; - } - break; - case 2: - if (!task->data[5]) { - FreeSpritePaletteByTag(10097); - DestroyAnimVisualTask(taskId); - } - break; - } -} - -void sub_807A850(struct Task *task, u8 taskId) { - s16 sprite = duplicate_obj_of_side_rel2move_in_transparent_mode(0); - if (sprite >= 0) { - gSprites[sprite].oam.priority = task->data[6]; - gSprites[sprite].oam.paletteNum = task->data[4]; - gSprites[sprite].data0 = 8; - gSprites[sprite].data1 = taskId; - gSprites[sprite].data2 = sprite; - gSprites[sprite].pos2.x = gSprites[task->data[0]].pos2.x; - gSprites[sprite].callback = sub_807A8D4; - task->data[5]++; - } -} - -void sub_807A8D4(struct Sprite *sprite) { - if (--sprite->data0 == 0) { - gTasks[sprite->data1].data[5]--; - obj_delete_but_dont_free_vram(sprite); - } -} - -void sub_807A908(struct Sprite *sprite) { - sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2); - sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3); - if (!GetBankSide(gBattleAnimBankAttacker)) { - sprite->data0 = 5; - } else { - sprite->data0 = -10; - } - sprite->data1 = -40; - sprite->callback = sub_807A960; -} - -void sub_807A960(struct Sprite *sprite) { - sprite->data2 += sprite->data0; - sprite->data3 += sprite->data1; - sprite->pos2.x = sprite->data2 / 10; - sprite->pos2.y = sprite->data3 / 10; - if (sprite->data1 < -20) { - sprite->data1++; - } - if ((sprite->pos1.y + sprite->pos2.y) < -32) { - move_anim_8072740(sprite); - } -} - -void sub_807A9BC(struct Sprite *sprite) { - int x; - sprite->data0 = gBattleAnimArgs[2]; - sprite->data2 = sprite->pos1.x + gBattleAnimArgs[4]; - sprite->data4 = sprite->pos1.y + gBattleAnimArgs[5]; - if (!GetBankSide(gBattleAnimBankTarget)) { - x = (u16)gBattleAnimArgs[4] + 30; - sprite->pos1.x += x; - sprite->pos1.y = gBattleAnimArgs[5] - 20; - } else { - x = (u16)gBattleAnimArgs[4] - 30; - sprite->pos1.x += x; - sprite->pos1.y = gBattleAnimArgs[5] - 80; - } - sprite->callback = sub_8078B34; - StoreSpriteCallbackInData6(sprite, move_anim_8072740); -} diff --git a/src/misc/script_pokemon_util_80C4BF0.c b/src/misc/script_pokemon_util_80C4BF0.c deleted file mode 100644 index f98293a90..000000000 --- a/src/misc/script_pokemon_util_80C4BF0.c +++ /dev/null @@ -1,714 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "berry.h" -#include "choose_party.h" -#include "contest.h" -#include "contest_link_80C2020.h" -#include "contest_painting.h" -#include "data2.h" -#include "daycare.h" -#include "debug.h" -#include "decompress.h" -#include "event_data.h" -#include "items.h" -#include "link.h" -#include "load_save.h" -#include "main.h" -#include "menu.h" -#include "pokedex.h" -#include "pokemon.h" -#include "rng.h" -#include "overworld.h" -#include "script_pokemon_80C4.h" -#include "species.h" -#include "task.h" - -#define CONTEST_ENTRY_PIC_LEFT 10 -#define CONTEST_ENTRY_PIC_TOP 3 - -extern struct SpriteTemplate gUnknown_02024E8C; - -extern u8 gContestPlayerMonIndex; -extern u8 gIsLinkContest; -extern u8 gPlayerPartyCount; -extern u8 gSelectedOrderFromParty[]; - -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; - -extern u16 gScriptContestCategory; -extern u16 gScriptContestRank; -extern u16 gScriptResult; - -extern u32 gUnknown_03005D28; - -extern u8 gUnknown_02038694; -extern u8 gUnknown_0203856C; -extern u8 gUnknown_02038690[]; -extern u16 gUnknown_02038678[]; - -void sub_80C4BF0(void) -{ - gSaveBlock1.vars[0x10] = gContestMons[0].unk16; - gSaveBlock1.vars[0x11] = gContestMons[1].unk16; - gSaveBlock1.vars[0x12] = gContestMons[2].unk16; -} - -void sub_80C4C28(void) -{ - u16 var; - u8 specialVar = gSpecialVar_0x8005; - - switch(specialVar) - { - case 0: - var = 3; - break; - case 1: - var = 4; - break; - case 2: - var = 5; - break; - default: - var = 100; - break; - } - gSpecialVar_0x8004 = var; -} - -void sub_80C4C64(void) -{ - sub_80C46EC(); - sub_80C4740(); - sub_80C48F4(); -} - -void sub_80C4C78(void) -{ - u16 var; - u16 returnVar; - - switch(gScriptContestCategory) - { - case 0: - var = 8; - break; - case 1: - var = 9; - break; - case 2: - var = 10; - break; - case 3: - var = 11; - break; - case 4: - default: - var = 12; - break; - } - - returnVar = gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[var].var; - - if(returnVar == 0) - gSpecialVar_0x8004 = returnVar; - else - gSpecialVar_0x8004 = 1; -} - -void sub_80C4CEC(void) -{ - sub_80B2A7C(0xFF); -} - -void sub_80C4CF8(void) -{ - if(!gUnknown_02038690[gContestPlayerMonIndex] - && gScriptContestRank == 3 - && (s16)gUnknown_02038678[gContestPlayerMonIndex] >= 800) - { - gSpecialVar_0x8004 = 1; - } - else - { - gSpecialVar_0x8004 = 0; - } -} - -u8 sub_80C4D50(void) -{ - u8 retVar = 0; - int i; - - for (i = 0; i < 5; i++) - if (gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[i + 8].var) - retVar++; - - return retVar; -} - -// nope. too hard -__attribute__((naked)) -void sub_80C4D80(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - ldr r0, _080C4EA0 @ =gUnknown_02038670\n\ - mov r12, r0\n\ - ldr r1, _080C4EA4 @ =gSpecialVar_0x8006\n\ - mov r8, r1\n\ - ldr r2, _080C4EA8 @ =gStringVar1\n\ - mov r9, r2\n\ - mov r2, r12\n\ - mov r1, sp\n\ - movs r6, 0x3\n\ -_080C4D9E:\n\ - ldrh r0, [r2]\n\ - strh r0, [r1]\n\ - adds r2, 0x2\n\ - adds r1, 0x2\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _080C4D9E\n\ - movs r6, 0\n\ -_080C4DAE:\n\ - movs r1, 0x3\n\ - cmp r1, r6\n\ - ble _080C4DD8\n\ -_080C4DB4:\n\ - subs r4, r1, 0x1\n\ - lsls r0, r4, 1\n\ - mov r5, sp\n\ - adds r3, r5, r0\n\ - lsls r0, r1, 1\n\ - adds r2, r5, r0\n\ - ldrh r5, [r3]\n\ - movs r7, 0\n\ - ldrsh r1, [r3, r7]\n\ - movs r7, 0\n\ - ldrsh r0, [r2, r7]\n\ - cmp r1, r0\n\ - bge _080C4DD2\n\ - strh r5, [r2]\n\ - strh r0, [r3]\n\ -_080C4DD2:\n\ - adds r1, r4, 0\n\ - cmp r1, r6\n\ - bgt _080C4DB4\n\ -_080C4DD8:\n\ - adds r6, 0x1\n\ - cmp r6, 0x2\n\ - ble _080C4DAE\n\ - mov r2, r8\n\ - ldrh r0, [r2]\n\ - lsls r0, 1\n\ - add r0, sp\n\ - ldrh r0, [r0]\n\ - movs r2, 0\n\ - movs r7, 0\n\ - movs r6, 0\n\ - lsls r0, 16\n\ - asrs r4, r0, 16\n\ - adds r3, r0, 0\n\ - mov r1, sp\n\ -_080C4DF6:\n\ - movs r5, 0\n\ - ldrsh r0, [r1, r5]\n\ - cmp r0, r4\n\ - bne _080C4E12\n\ - lsls r0, r2, 24\n\ - movs r2, 0x80\n\ - lsls r2, 17\n\ - adds r0, r2\n\ - lsrs r2, r0, 24\n\ - mov r5, r8\n\ - ldrh r5, [r5]\n\ - cmp r6, r5\n\ - bne _080C4E12\n\ - adds r7, r2, 0\n\ -_080C4E12:\n\ - adds r1, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - ble _080C4DF6\n\ - movs r6, 0\n\ - mov r0, sp\n\ - movs r1, 0\n\ - ldrsh r0, [r0, r1]\n\ - asrs r1, r3, 16\n\ - lsls r2, 24\n\ - mov r10, r2\n\ - cmp r0, r1\n\ - beq _080C4E40\n\ - adds r2, r1, 0\n\ - mov r1, sp\n\ -_080C4E30:\n\ - adds r1, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - bgt _080C4E40\n\ - movs r4, 0\n\ - ldrsh r0, [r1, r4]\n\ - cmp r0, r2\n\ - bne _080C4E30\n\ -_080C4E40:\n\ - lsls r0, r6, 24\n\ - lsrs r4, r0, 24\n\ - adds r2, r7, 0\n\ - movs r6, 0\n\ - asrs r5, r3, 16\n\ - mov r8, r5\n\ - mov r1, r12\n\ - movs r5, 0\n\ - ldrsh r0, [r1, r5]\n\ - cmp r8, r0\n\ - bne _080C4E60\n\ - cmp r7, 0x1\n\ - beq _080C4E78\n\ -_080C4E5A:\n\ - subs r0, r2, 0x1\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ -_080C4E60:\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - bgt _080C4E78\n\ - lsls r0, r6, 1\n\ - add r0, r12\n\ - asrs r1, r3, 16\n\ - movs r5, 0\n\ - ldrsh r0, [r0, r5]\n\ - cmp r1, r0\n\ - bne _080C4E60\n\ - cmp r2, 0x1\n\ - bne _080C4E5A\n\ -_080C4E78:\n\ - lsls r1, r6, 24\n\ - lsrs r1, 24\n\ - mov r0, r9\n\ - bl sub_80C4698\n\ - ldr r0, _080C4EAC @ =gIsLinkContest\n\ - ldrb r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080C4EB8\n\ - ldr r0, _080C4EB0 @ =gStringVar2\n\ - lsls r1, r6, 3\n\ - subs r1, r6\n\ - lsls r1, 2\n\ - ldr r2, _080C4EB4 @ =gLinkPlayers + 0x8\n\ - adds r1, r2\n\ - bl sub_80C4674\n\ - b _080C4EC4\n\ - .align 2, 0\n\ -_080C4EA0: .4byte gUnknown_02038670\n\ -_080C4EA4: .4byte gSpecialVar_0x8006\n\ -_080C4EA8: .4byte gStringVar1\n\ -_080C4EAC: .4byte gIsLinkContest\n\ -_080C4EB0: .4byte gStringVar2\n\ -_080C4EB4: .4byte gLinkPlayers + 0x8\n\ -_080C4EB8:\n\ - ldr r0, _080C4ED8 @ =gStringVar2\n\ - lsls r1, r6, 6\n\ - ldr r2, _080C4EDC @ =gUnknown_0203857D\n\ - adds r1, r2\n\ - bl sub_80C4674\n\ -_080C4EC4:\n\ - mov r1, r10\n\ - asrs r0, r1, 24\n\ - cmp r0, 0x1\n\ - beq _080C4ED0\n\ - cmp r7, r0\n\ - bne _080C4EE4\n\ -_080C4ED0:\n\ - ldr r0, _080C4EE0 @ =gSpecialVar_0x8006\n\ - strh r4, [r0]\n\ - b _080C4EEA\n\ - .align 2, 0\n\ -_080C4ED8: .4byte gStringVar2\n\ -_080C4EDC: .4byte gUnknown_0203857D\n\ -_080C4EE0: .4byte gSpecialVar_0x8006\n\ -_080C4EE4:\n\ - ldr r1, _080C4EFC @ =gSpecialVar_0x8006\n\ - adds r0, r4, 0x4\n\ - strh r0, [r1]\n\ -_080C4EEA:\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080C4EFC: .4byte gSpecialVar_0x8006\n\ - .syntax divided"); -} - -void ShowContestWinnerCleanup(void) -{ - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -void ShowContestWinner(void) -{ - if(gUnknown_0203856C) - { - sub_80AAF30(); - BATTLE_STRUCT->unk15DDF = 1; - BATTLE_STRUCT->unk15DDE = sub_80B2C4C(254, 0); - sub_80B2A7C(3); - gUnknown_0203856C = 0; - } - SetMainCallback2(CB2_ContestPainting); - gMain.savedCallback = ShowContestWinnerCleanup; -} - -void sub_80C4F70(void) -{ - VarSet(0x4010, gContestMons[0].unk16); - VarSet(0x4011, gContestMons[1].unk16); - VarSet(0x4012, gContestMons[2].unk16); - VarSet(0x4013, gContestMons[3].unk16); -} - -bool8 GiveMonArtistRibbon(void) -{ - u8 ribbon = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_ARTIST_RIBBON); - - if(ribbon == FALSE - && gUnknown_02038690[gContestPlayerMonIndex] == 0 - && gScriptContestRank == 3 - && (s16)gUnknown_02038678[gContestPlayerMonIndex] >= 800) - { - ribbon = TRUE; - SetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_ARTIST_RIBBON, &ribbon); - return TRUE; - } - else - { - return FALSE; - } -} - -u8 sub_80C5044(void) -{ - return gUnknown_0203856C; -} - -void ShowContestEntryMonPic(void) -{ - const struct CompressedSpritePalette *palette; - u32 var1, var2; - u16 species; - u8 spriteId; - u8 taskId; - - if(FindTaskIdByFunc(sub_80C5190) == 0xFF) - { - u8 left = CONTEST_ENTRY_PIC_LEFT; - u8 top = CONTEST_ENTRY_PIC_TOP; - - MenuDrawTextWindow(left, top, 19, 13); - species = gContestMons[gSpecialVar_0x8006].species; - var1 = gContestMons[gSpecialVar_0x8006].unk38; // v2 - var2 = gContestMons[gSpecialVar_0x8006].unk3C; // v3 - taskId = CreateTask(sub_80C5190, 0x50); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = species; - HandleLoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, - gMonFrontPicCoords[species].y_offset, - (u32)gUnknown_081FAF4C[0], - gUnknown_081FAF4C[1], - species, - var1); - palette = GetMonSpritePalStructFromOtIdPersonality(species, var2, var1); - LoadCompressedObjectPalette(palette); - GetMonSpriteTemplate_803C56C(species, 1); - gUnknown_02024E8C.paletteTag = palette->tag; - spriteId = CreateSprite(&gUnknown_02024E8C, 0x78, 0x40, 0); - gTasks[taskId].data[2] = spriteId; - gTasks[taskId].data[3] = left; - gTasks[taskId].data[4] = top; - gSprites[spriteId].callback = SpriteCallbackDummy; - gSprites[spriteId].oam.priority = 0; - } -} - -void sub_80C5164(void) -{ - u8 taskId = FindTaskIdByFunc(sub_80C5190); - - if(taskId != 0xFF) - gTasks[taskId].data[0]++; -} - -void sub_80C5190(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - struct Sprite *sprite; - - switch(task->data[0]) - { - case 2: - sprite = &gSprites[task->data[2]]; - FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); - - if(sprite->oam.affineMode) - FreeOamMatrix(sprite->oam.matrixNum); - - DestroySprite(sprite); - task->data[0]++; - break; - case 0: - task->data[0]++; - break; - case 3: - MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10); - DestroyTask(taskId); - break; - case 1: - default: - break; - } -} - -void ScriptGetMultiplayerId(void) -{ - if(gIsLinkContest & 1) - gScriptResult = GetMultiplayerId(); - else - gScriptResult = 4; -} - -void ScriptRandom(void) -{ - u16 random; - u16 *scriptPtr; - - if(gIsLinkContest & 1) - { - gUnknown_03005D28 = 1103515245 * gUnknown_03005D28 + 24691; - random = gUnknown_03005D28 >> 16; - scriptPtr = &gScriptResult; - } - else - { - scriptPtr = &gScriptResult; - random = Random(); - } - *scriptPtr = random % *scriptPtr; -} - -void ScrSpecial_HealPlayerParty(void) -{ - u8 i, j; - u8 ppBonuses; - u8 arg[4]; - - // restore HP. - for(i = 0; i < gPlayerPartyCount; i++) - { - u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); - arg[0] = maxHP; - arg[1] = maxHP >> 8; - SetMonData(&gPlayerParty[i], MON_DATA_HP, arg); - ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES); - - // restore PP. - for(j = 0; j < 4; j++) - { - arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j); - SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg); - } - - // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData. - arg[0] = 0; - arg[1] = 0; - arg[2] = 0; - arg[3] = 0; - SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg); - } -} - -u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 unused3) -{ - u16 nationalDexNum; - int sentToPc; - u8 heldItem[2]; - struct Pokemon mon; - - CreateMon(&mon, species, level, 32, 0, 0, 0, 0); - heldItem[0] = item; - heldItem[1] = item >> 8; - SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem); - sentToPc = GiveMonToPlayer(&mon); - nationalDexNum = SpeciesToNationalPokedexNum(species); - - switch(sentToPc) - { - case 0: - case 1: - GetSetPokedexFlag(nationalDexNum, 2); - GetSetPokedexFlag(nationalDexNum, 3); - break; - } - return sentToPc; -} - -u8 ScriptGiveEgg(u16 species) -{ - struct Pokemon mon; - u8 isEgg; - - sub_8042044(&mon, species, 1); - isEgg = TRUE; - SetMonData(&mon, MON_DATA_IS_EGG, &isEgg); - - return GiveMonToPlayer(&mon); -} - -void CheckForAlivePartyMons(void) -{ - u8 var = sub_803DAA0(); - - switch(var) - { - case 1: - gScriptResult = var; - break; - case 0: - gScriptResult = var; - break; - case 2: - gScriptResult = var; - break; - } -} - -bool8 CheckPartyMonHasHeldItem(u16 item) -{ - int i; - - for(i = 0; i < 6; i++) - { - u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - if(species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == item) - return TRUE; - } - return FALSE; -} - -bool8 GetNameOfEnigmaBerryInPlayerParty(void) -{ - bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY); - - if(hasItem == TRUE) - GetBerryNameByBerryType(ItemIdToBerryType(ITEM_ENIGMA_BERRY), gStringVar1); - - return hasItem; -} - -void CreateScriptedWildMon(u16 species, u8 level, u16 item) -{ - u8 heldItem[2]; - - ZeroEnemyPartyMons(); - CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, 0, 0); - - if(item) - { - heldItem[0] = item; - heldItem[1] = item >> 8; - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem); - } -} - -void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot) -{ - if(monIndex > 6) - monIndex = gPlayerPartyCount - 1; - - SetMonMoveSlot(&gPlayerParty[monIndex], move, slot); -} - -void sub_80C5568(void) -{ - gMain.savedCallback = sub_80C5580; - sub_8121E10(); -} - -void sub_80C5580(void) -{ - u8 var = gSelectedOrderFromParty[0]; - - switch(var) - { - case 0: - gScriptResult = 0; - break; - default: - gScriptResult = 1; - break; - } - - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -void ChooseBattleTowerPlayerParty(void) -{ - gMain.savedCallback = SetBattleTowerPlayerParty; - sub_8121E34(); -} - -void SetBattleTowerPlayerParty(void) -{ - u8 var = gSelectedOrderFromParty[0]; - - switch(var) - { - case 0: // player quit battle tower? - LoadPlayerParty(); - gScriptResult = 0; - break; - default: // load battle tower. - ReducePlayerPartyToThree(); - gScriptResult = 1; - break; - } - - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -void ReducePlayerPartyToThree(void) -{ - struct Pokemon party[3]; - int i; - - CpuFill32(0, party, sizeof party); - - // copy the selected pokemon according to the order. - for(i = 0; i < 3; i++) - if(gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop - party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal - - // delete the last 3 pokemon - CpuFill32(0, gPlayerParty, sizeof gPlayerParty); - - // overwrite the first 3 with the order copied to. - for(i = 0; i < 3; i++) - gPlayerParty[i] = party[i]; - - CalculatePlayerPartyCount(); -} diff --git a/src/misc/script_pokemon_util_80F99CC.c b/src/misc/script_pokemon_util_80F99CC.c deleted file mode 100644 index f930df8e2..000000000 --- a/src/misc/script_pokemon_util_80F99CC.c +++ /dev/null @@ -1,444 +0,0 @@ -#include "global.h" -#include "battle_party_menu.h" -#include "choose_party.h" -#include "contest.h" -#include "data2.h" -#include "party_menu.h" -#include "field_fadetransition.h" -#include "palette.h" -#include "party_menu.h" -#include "pokemon.h" -#include "pokemon_summary_screen.h" -#include "overworld.h" -#include "script.h" -#include "script_pokemon_80F9.h" -#include "songs.h" -#include "sound.h" -#include "string_util.h" -#include "task.h" -#include "text.h" - -extern u8 gPlayerPartyCount; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u8 gUnknown_02038694; -extern u16 gScriptResult; - -extern void (*gFieldCallback)(void); - -void sub_80F99CC(void) -{ - u8 taskId; - - ScriptContext2_Enable(); - taskId = CreateTask((void *)sub_80F9A8C, 0xA); - gTasks[taskId].data[0] = 2; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void sub_80F9A0C(void) -{ - u8 taskId; - - ScriptContext2_Enable(); - taskId = CreateTask((void *)sub_80F9A8C, 0xA); - gTasks[taskId].data[0] = 3; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void sub_80F9A4C(void) -{ - u8 taskId; - - ScriptContext2_Enable(); - taskId = CreateTask((void *)sub_80F9A8C, 0xA); - gTasks[taskId].data[0] = 7; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void sub_80F9A8C(u8 taskId) -{ - if (!gPaletteFade.active) - { - gPaletteFade.bufferTransferDisabled = 1; - OpenPartyMenu((u8) gTasks[taskId].data[0], 0); - DestroyTask(taskId); - } -} - -bool8 sub_80F9ACC(void) -{ - switch (EWRAM_1B000.unk264) - { - case 0: - if (EWRAM_1B000.unk266 < gPlayerPartyCount) - { - TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); - EWRAM_1B000.unk266++; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - } - break; - case 1: - LoadHeldItemIconGraphics(); - EWRAM_1B000.unk264++; - break; - case 2: - CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); - EWRAM_1B000.unk264++; - break; - case 3: - if (sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1) - { - EWRAM_1B000.unk266++; - break; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - break; - } - case 4: - PartyMenuPrintMonsLevelOrStatus(); - EWRAM_1B000.unk264++; - break; - case 5: - PrintPartyMenuMonNicknames(); - EWRAM_1B000.unk264++; - break; - case 6: - sub_80F9C00(); - EWRAM_1B000.unk264++; - break; - case 7: // the only case that can return true. - if (sub_806B58C(EWRAM_1B000.unk266) != 1) - { - EWRAM_1B000.unk266++; - break; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264 = 0; - return TRUE; - } - } - return FALSE; -} - -void sub_80F9C00(void) -{ - u8 i; - - for (i = 0; i < gPlayerPartyCount; i++) - { - switch (sub_80AE47C(&gPlayerParty[i])) - { - case 0: - case 3: - case 4: - sub_806BC3C(i, 0x7E); - break; - case 1: - case 2: - sub_806BC3C(i, 0x70); - break; - } - } -} - -void sub_80F9C6C(u8 var) -{ - if (!gPaletteFade.active) - { - switch (sub_806BD80(var)) - { - case 1: - PlaySE(SE_SELECT); - gUnknown_02038694 = sub_806CA38(var); - gSpecialVar_0x8004 = gUnknown_02038694; - sub_8123138(var); - break; - case 2: - PlaySE(SE_SELECT); - gUnknown_02038694 = 0xFF; - gSpecialVar_0x8004 = 0xFF; - sub_8123138(var); - break; - } - } -} - -bool8 sub_80F9CE8(void) // this is the same function as sub_80F9ACC except case 6 calls a different function. why -{ - switch (EWRAM_1B000.unk264) - { - case 0: - if (EWRAM_1B000.unk266 < gPlayerPartyCount) - { - TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); - EWRAM_1B000.unk266++; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - } - break; - case 1: - LoadHeldItemIconGraphics(); - EWRAM_1B000.unk264++; - break; - case 2: - CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); - EWRAM_1B000.unk264++; - break; - case 3: - if (sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1) - { - EWRAM_1B000.unk266++; - break; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - break; - } - case 4: - PartyMenuPrintMonsLevelOrStatus(); - EWRAM_1B000.unk264++; - break; - case 5: - PrintPartyMenuMonNicknames(); - EWRAM_1B000.unk264++; - break; - case 6: - sub_80F9E1C(); - EWRAM_1B000.unk264++; - break; - case 7: // the only case that can return true. - if (sub_806B58C(EWRAM_1B000.unk266) != 1) - { - EWRAM_1B000.unk266++; - break; - } - else - { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264 = 0; - return TRUE; - } - } - return FALSE; -} - -void sub_80F9E1C(void) -{ - u8 i; - - for (i = 0; i < gPlayerPartyCount; i++) - { - if (!sub_8040574(&gPlayerParty[i])) - sub_806BC3C(i, 0x9A); - else - sub_806BC3C(i, 0x8C); - } -} - -void sub_80F9E64(u8 var) -{ - if (!gPaletteFade.active) - { - switch (sub_806BD80(var)) - { - case 1: - PlaySE(SE_SELECT); - gSpecialVar_0x8004 = sub_806CA38(var); - gSpecialVar_0x8005 = sub_8040574(&gPlayerParty[gSpecialVar_0x8004]); - sub_8123138(var); - break; - case 2: - PlaySE(SE_SELECT); - gSpecialVar_0x8004 = 0xFF; - sub_8123138(var); - } - } -} - -void sub_80F9EEC(void) -{ - sub_809D9F0(&gPlayerParty[0], gSpecialVar_0x8004, gPlayerPartyCount - 1, c2_exit_to_overworld_2_switch, 0); - unk_2018000.unk8 = 3; - gFieldCallback = sub_8080990; -} - -void ScrSpecial_CountPokemonMoves(void) // count pokemon moves -{ - u8 i; - - gScriptResult = 0; - - for (i = 0; i < 4; i++) // checks MOVE1-MOVE4 - if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_MOVE1 + i)) - gScriptResult++; -} - -void ScrSpecial_GetPokemonNicknameAndMoveName(void) -{ - struct Pokemon *pkmn = &gPlayerParty[gSpecialVar_0x8004]; - u16 data = GetMonData(pkmn, MON_DATA_MOVE1 + gSpecialVar_0x8005); - - GetMonNickname(pkmn, gStringVar1); - StringCopy(gStringVar2, gMoveNames[data]); -} - -// no. hard -__attribute__((naked)) -void sub_80F9FDC(struct Pokemon *party, u8 var, u8 var2) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x20\n\ - mov r8, r0\n\ - adds r5, r1, 0\n\ - adds r4, r2, 0\n\ - lsls r5, 24\n\ - lsrs r5, 24\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - adds r0, r5, 0\n\ - adds r0, 0xD\n\ - str r0, [sp, 0x8]\n\ - mov r0, r8\n\ - ldr r1, [sp, 0x8]\n\ - bl GetMonData\n\ - mov r1, sp\n\ - adds r1, 0x2\n\ - str r1, [sp, 0x14]\n\ - strh r0, [r1]\n\ - adds r3, r4, 0\n\ - adds r3, 0xD\n\ - str r3, [sp, 0xC]\n\ - mov r0, r8\n\ - adds r1, r3, 0\n\ - bl GetMonData\n\ - mov r1, sp\n\ - strh r0, [r1]\n\ - adds r7, r5, 0\n\ - adds r7, 0x11\n\ - str r7, [sp, 0x10]\n\ - mov r0, r8\n\ - adds r1, r7, 0\n\ - bl GetMonData\n\ - mov r1, sp\n\ - adds r1, 0x5\n\ - str r1, [sp, 0x18]\n\ - strb r0, [r1]\n\ - adds r3, r4, 0\n\ - adds r3, 0x11\n\ - str r3, [sp, 0x1C]\n\ - mov r0, r8\n\ - adds r1, r3, 0\n\ - bl GetMonData\n\ - add r7, sp, 0x4\n\ - mov r10, r7\n\ - strb r0, [r7]\n\ - mov r0, r8\n\ - movs r1, 0x15\n\ - bl GetMonData\n\ - mov r6, sp\n\ - adds r6, 0x6\n\ - strb r0, [r6]\n\ - ldr r1, _080FA0D8 @ =gUnknown_08208238\n\ - adds r0, r5, r1\n\ - ldrb r0, [r0]\n\ - mov r9, r0\n\ - ldrb r0, [r6]\n\ - adds r2, r0, 0\n\ - mov r3, r9\n\ - ands r2, r3\n\ - lsls r5, 1\n\ - asrs r2, r5\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - adds r1, r4, r1\n\ - ldrb r3, [r1]\n\ - adds r1, r0, 0\n\ - ands r1, r3\n\ - lsls r4, 1\n\ - asrs r1, r4\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r7, r9\n\ - bics r0, r7\n\ - strb r0, [r6]\n\ - ldrb r0, [r6]\n\ - bics r0, r3\n\ - strb r0, [r6]\n\ - lsls r2, r4\n\ - lsls r1, r5\n\ - adds r2, r1\n\ - ldrb r0, [r6]\n\ - orrs r0, r2\n\ - strb r0, [r6]\n\ - mov r0, r8\n\ - ldr r1, [sp, 0x8]\n\ - mov r2, sp\n\ - bl SetMonData\n\ - mov r0, r8\n\ - ldr r1, [sp, 0xC]\n\ - ldr r2, [sp, 0x14]\n\ - bl SetMonData\n\ - mov r0, r8\n\ - ldr r1, [sp, 0x10]\n\ - mov r2, r10\n\ - bl SetMonData\n\ - mov r0, r8\n\ - ldr r1, [sp, 0x1C]\n\ - ldr r2, [sp, 0x18]\n\ - bl SetMonData\n\ - mov r0, r8\n\ - movs r1, 0x15\n\ - adds r2, r6, 0\n\ - bl SetMonData\n\ - add sp, 0x20\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080FA0D8: .4byte gUnknown_08208238\n\ - .syntax divided"); -} - -void sub_80FA0DC(void) -{ - u16 i; - - SetMonMoveSlot(&gPlayerParty[gSpecialVar_0x8004], 0, gSpecialVar_0x8005); - RemoveMonPPBonus(&gPlayerParty[gSpecialVar_0x8004], gSpecialVar_0x8005); - - for (i = gSpecialVar_0x8005; i < 3; i++) - sub_80F9FDC(&gPlayerParty[gSpecialVar_0x8004], i, i + 1); -} - -void sub_80FA148(void) -{ - struct Pokemon *party = &gPlayerParty[gSpecialVar_0x8004]; - gScriptResult = 0; - - if (GetMonData(party, MON_DATA_IS_EGG)) - gScriptResult = 1; -} diff --git a/src/misc/unknown_task.c b/src/misc/unknown_task.c deleted file mode 100644 index 5ec7fa6bc..000000000 --- a/src/misc/unknown_task.c +++ /dev/null @@ -1,248 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "task.h" -#include "trig.h" -#include "unknown_task.h" - -struct UnknownStruct1 -{ - void *src[2]; - volatile void *dest; - u32 unkC; - void (*unk10)(void); - u8 srcBank; - u8 unk15; - u8 unk16; - u8 unk17; - u8 taskId; - u8 filler19[0x7]; -}; - -static void sub_80896F4(void); -static void sub_8089714(void); - -extern u16 gUnknown_030041B0; -extern u16 gUnknown_030041B4; -extern u16 gUnknown_030041B8; -extern u16 gUnknown_03004280; -extern u16 gUnknown_03004288; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; -extern u16 gUnknown_030042C0; - -extern u8 gUnknown_0202FFA4; - -extern struct UnknownStruct1 gUnknown_03004DC0; - -extern u16 gUnknown_03004DE0[][0x3C0]; - -void remove_some_task(void) -{ - gUnknown_03004DC0.unk15 = 0; - DmaStop(0); - if (gUnknown_03004DC0.taskId != 0xFF) - { - DestroyTask(gUnknown_03004DC0.taskId); - gUnknown_03004DC0.taskId = 0xFF; - } -} - -void dp12_8087EA4(void) -{ - CpuFill16(0, gUnknown_03004DE0, 0x780 * 2); - gUnknown_03004DC0.src[0] = 0; - gUnknown_03004DC0.src[1] = 0; - gUnknown_03004DC0.dest = 0; - gUnknown_03004DC0.unkC = 0; - gUnknown_03004DC0.srcBank = 0; - gUnknown_03004DC0.unk15 = 0; - gUnknown_03004DC0.unk16 = 0; - gUnknown_03004DC0.unk17 = 0; - gUnknown_03004DC0.taskId = 0xFF; -} - -void sub_80895F8(struct UnknownTaskStruct unk) -{ - if (unk.control == (((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1)) - { - gUnknown_03004DC0.src[0] = &gUnknown_03004DE0[0][1]; - gUnknown_03004DC0.src[1] = &gUnknown_03004DE0[1][1]; - gUnknown_03004DC0.unk10 = sub_80896F4; - } - else - { - gUnknown_03004DC0.src[0] = &gUnknown_03004DE0[0][2]; - gUnknown_03004DC0.src[1] = &gUnknown_03004DE0[1][2]; - gUnknown_03004DC0.unk10 = sub_8089714; - } - - gUnknown_03004DC0.unkC = unk.control; - gUnknown_03004DC0.dest = unk.dest; - gUnknown_03004DC0.unk15 = unk.unk8; - gUnknown_03004DC0.unk16 = unk.unk9; - gUnknown_03004DC0.unk17 = unk.unk9; -} - -void sub_8089668(void) -{ - if (gUnknown_03004DC0.unk15) - { - if (gUnknown_03004DC0.unk15 == 3) - { - gUnknown_03004DC0.unk15 = 0; - DmaStop(0); - gUnknown_0202FFA4 = 1; - } - else - { - DmaStop(0); - DmaSet(0, gUnknown_03004DC0.src[gUnknown_03004DC0.srcBank], gUnknown_03004DC0.dest, gUnknown_03004DC0.unkC); - gUnknown_03004DC0.unk10(); - gUnknown_03004DC0.srcBank ^= 1; - } - } -} - -static void sub_80896F4(void) -{ - u16 *dest = (u16 *)gUnknown_03004DC0.dest; - u16 *src = (u16 *)&gUnknown_03004DE0[gUnknown_03004DC0.srcBank]; - *dest = *src; -} - -static void sub_8089714(void) -{ - u32 *dest = (u32 *)gUnknown_03004DC0.dest; - u32 *src = (u32 *)&gUnknown_03004DE0[gUnknown_03004DC0.srcBank]; - *dest = *src; -} - -static void task00_for_dp12(u8 taskId) -{ - int value = 0; - - if (gUnknown_0202FFA4) - { - DestroyTask(taskId); - gUnknown_03004DC0.taskId = 0xFF; - } - else - { - if (gTasks[taskId].data[7]) - { - switch (gTasks[taskId].data[6]) - { - case 0x0: - value = gUnknown_030042A4; - break; - case 0x2: - value = gUnknown_030042A0; - break; - case 0x4: - value = gUnknown_030042C0; - break; - case 0x6: - value = gUnknown_030041B4; - break; - case 0x8: - value = gUnknown_03004288; - break; - case 0xA: - value = gUnknown_03004280; - break; - case 0xC: - value = gUnknown_030041B0; - break; - case 0xE: - value = gUnknown_030041B8; - break; - } - } - if (gTasks[taskId].data[4]) - { - int i; - int offset; - gTasks[taskId].data[4]--; - offset = gTasks[taskId].data[3] + 320; - for (i = gTasks[taskId].data[0]; i < gTasks[taskId].data[1]; i++) - { - gUnknown_03004DE0[gUnknown_03004DC0.srcBank][i] = gUnknown_03004DE0[0][offset] + value; - offset++; - } - } - else - { - int i; - int offset; - gTasks[taskId].data[4] = gTasks[taskId].data[5]; - offset = gTasks[taskId].data[3] + 320; - for (i = gTasks[taskId].data[0]; i < gTasks[taskId].data[1]; i++) - { - gUnknown_03004DE0[gUnknown_03004DC0.srcBank][i] = gUnknown_03004DE0[0][offset] + value; - offset++; - } - gTasks[taskId].data[3]++; - if (gTasks[taskId].data[3] == gTasks[taskId].data[2]) - { - gTasks[taskId].data[3] = 0; - } - } - } -} - -static void sub_80898FC(u16 *a1, u8 a2, u8 a3, u8 a4) -{ - u16 i = 0; - u8 offset = 0; - - while (i < 0x100) - { - a1[i] = (gSineTable[offset] * a3) / 256; - offset += a2; - i++; - } -} - -u8 sub_8089944(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) -{ - int i; - int offset; - struct UnknownTaskStruct unk; - u8 taskId; - - dp12_8087EA4(); - - unk.dest = (void *)(REG_ADDR_BG0HOFS + a6); - unk.control = ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1; - unk.unk8 = 1; - unk.unk9 = 0; - - sub_80895F8(unk); - - taskId = CreateTask(task00_for_dp12, 0); - - gTasks[taskId].data[0] = a1; - gTasks[taskId].data[1] = a2; - gTasks[taskId].data[2] = 256 / a3; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = a5; - gTasks[taskId].data[5] = a5; - gTasks[taskId].data[6] = a6; - gTasks[taskId].data[7] = a7; - - gUnknown_03004DC0.taskId = taskId; - gUnknown_0202FFA4 = 0; - - sub_80898FC(&gUnknown_03004DE0[0][320], a3, a4, a2 - a1); - - offset = 320; - - for (i = a1; i < a2; i++) - { - gUnknown_03004DE0[0][i] = gUnknown_03004DE0[0][offset]; - gUnknown_03004DE0[1][i] = gUnknown_03004DE0[0][offset]; - offset++; - } - - return taskId; -} diff --git a/src/misc/unused_8124F94.c b/src/misc/unused_8124F94.c deleted file mode 100644 index 5f76fa92e..000000000 --- a/src/misc/unused_8124F94.c +++ /dev/null @@ -1,126 +0,0 @@ -#include "global.h" -#include "decompress.h" -#include "palette.h" - -struct UnknownStruct2 -{ - void *src; - u8 unk4; - u8 unk5; - u8 unk6; - u16 unk8; -}; - -struct UnknownStruct3 -{ - u16 *paletteSrc; - u8 unk4; - u8 paletteCount; -}; - -struct UnknownStruct1 -{ - u8 paletteNum; - u8 unk1; - u16 unk2; - u8 *dest; - struct UnknownStruct3 unk8[16]; - struct UnknownStruct2 unk88[32]; -}; - -void unref_sub_8124F94(struct UnknownStruct1 *a) -{ - a->unk1 = 0; - a->paletteNum = 0; - a->unk2 = 0; - a->dest = (void *)VRAM; - DmaFill16(3, 0, a->unk8, sizeof(a->unk8)); - DmaFill16(3, 0, a->unk88, sizeof(a->unk88)); -} - -u8 unref_sub_8124FD8(struct UnknownStruct1 *a, const struct UnknownStruct2 *b) -{ - while (1) - { - s32 r6; - s32 temp; - - // Couldn't get it to match any other way - if (a->unk1 < 32 && b->src == NULL) - return 0; - if (a->unk1 >= 32) - break; - - a->unk88[a->unk1].src = b->src; - a->unk88[a->unk1].unk6 = b->unk6; - a->unk88[a->unk1].unk4 = b->unk4; - a->unk88[a->unk1].unk5 = b->unk5; - r6 = b->unk4 * b->unk5; - if (a->unk2 + r6 > 0x400) - return 2; - if (b->unk8 == 0) - { - DmaCopy16(3, b->src, a->dest + a->unk2 * 64, r6 * 32); - } - else - { - LZDecompressWram(b->src, a->dest + a->unk2 * 64); - } - a->unk88[a->unk1].unk8 = a->unk2; - temp = r6 + a->unk2; - a->unk2 = temp; - a->unk1++; - b++; - } - return 1; -} - -u8 unref_sub_81250A4(struct UnknownStruct1 *a, struct UnknownStruct3 *b) -{ - while (1) - { - // Couldn't get it to match any other way - if (a->paletteNum < 16 && b->paletteSrc == NULL) - return 0; - if (a->paletteNum >= 16) - break; - - a->unk8[a->paletteNum].paletteSrc = b->paletteSrc; - a->unk8[a->paletteNum].unk4 = b->unk4; - if (b->paletteCount == 0) - { - LoadPalette(b->paletteSrc, a->paletteNum * 16, 32); - } - else - { - u16 palette[16]; - - LZDecompressWram(b->paletteSrc, palette); - LoadPalette(palette, a->paletteNum * 16, 32); - } - a->unk8[a->paletteNum].paletteCount = a->paletteNum; - a->paletteNum = a->paletteNum + 1; - b++; - } - return 1; -} - -u8 unref_sub_8125118(struct UnknownStruct1 *a, struct UnknownStruct3 *b) -{ - u16 palettes[16][16] = {0}; - u8 r7 = b->paletteCount; - u8 i; - - LZDecompressWram(b->paletteSrc, palettes); - for (i = a->paletteNum; i < r7; i++) - { - if (a->paletteNum + i >= 16) - return 1; - a->unk8[i].paletteSrc = b->paletteSrc; - a->unk8[i].unk4 = b->unk4 + i; - a->unk8[i].paletteCount = a->paletteNum; - LoadPalette(palettes[i], a->paletteNum * 16, sizeof(palettes[i])); - a->paletteNum++; - } - return 0; -} diff --git a/src/rom3.c b/src/rom3.c new file mode 100644 index 000000000..3f4860ecc --- /dev/null +++ b/src/rom3.c @@ -0,0 +1,1168 @@ +#include "global.h" +#include "battle.h" +#include "battle_811DA74.h" +#include "battle_ai.h" +#include "battle_anim.h" +#include "battle_anim_81258BC.h" +#include "battle_anim_8137220.h" +#include "cable_club.h" +#include "items.h" +#include "link.h" +#include "pokemon.h" +#include "rom3.h" +#include "rom_8094928.h" +#include "species.h" +#include "task.h" +#include "util.h" +#include "battle_message.h" +#include "data2.h" + +extern u8 unk_2000000[]; + +#define EWRAM_14000 ((u8 *)(unk_2000000 + 0x14000)) +#define EWRAM_15000 ((u8 *)(unk_2000000 + 0x15000)) + +extern u16 gBattleTypeFlags; +extern u16 gBattleWeather; +extern struct BattlePokemon gBattleMons[]; + +static EWRAM_DATA u8 gUnknown_020238C4 = 0; +static EWRAM_DATA u8 gUnknown_020238C5 = 0; +static EWRAM_DATA u8 gUnknown_020238C6 = 0; + +extern u32 gUnknown_020239FC; +extern u8 gBattleBufferA[][0x200]; +extern u8 gBattleBufferB[][0x200]; +extern u8 gActiveBank; +extern u32 gBattleExecBuffer; +extern u8 gNoOfAllBanks; +extern u16 gBattlePartyID[]; +extern u8 gBanksBySide[]; +extern u16 gCurrentMove; +extern u16 gUnknown_02024BE8; +extern u16 gLastUsedItem; +extern u8 gLastUsedAbility; +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u8 gEffectBank; +extern u8 gStringBank; +extern u8 gAbsentBankFlags; +extern u8 gMultiHitCounter; +extern u8 gUnknown_02024C78; +extern u8 gBattleOutcome; +extern u8 gActionSelectionCursor[]; +extern u8 gMoveSelectionCursor[]; +extern u8 gBattleTextBuff1[]; +extern u8 gBattleTextBuff2[]; +extern u8 gBattleTextBuff3[]; +extern void (*gBattleMainFunc)(void); +extern void (*gBattleBankFunc[])(void); + +u8 gBattleBuffersTransferData[0x170]; + +void sub_800B858(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + OpenLink(); + CreateTask(sub_8083C50, 0); + sub_800BF28(); + } +} + +void setup_poochyena_battle(void) +{ + s32 i; + + gBattleMainFunc = nullsub_41; + for (i = 0; i < 4; i++) + { + gBattleBankFunc[i] = nullsub_91; + gBanksBySide[i] = 0xFF; + gActionSelectionCursor[i] = 0; + gMoveSelectionCursor[i] = 0; + } + sub_800B858(); + gBattleExecBuffer = 0; + battle_anim_clear_some_data(); + ClearBattleMonForms(); + BattleAI_HandleItemUseBeforeAISetup(); + if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) + { + ZeroEnemyPartyMons(); + CreateMon(&gEnemyParty[0], SPECIES_POOCHYENA, 2, 32, 0, 0, 0, 0); + i = ITEM_NONE; + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&i); + } + gUnknown_020239FC = 0; + gUnknown_02024C78 = 0; +} + +void sub_800B950(void) +{ + s32 i; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + sub_800BA78(); + else + sub_800B9A8(); + sub_800BD54(); + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + for (i = 0; i < gNoOfAllBanks; i++) + sub_8094978(i, 0); + } +} + +void sub_800B9A8(void) +{ + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + gBattleMainFunc = sub_8010800; + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + gBattleBankFunc[0] = SetBankFuncToSafariBufferRunCommand; + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) + gBattleBankFunc[0] = SetBankFuncToWallyBufferRunCommand; + else + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[0] = 0; + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksBySide[1] = 1; + gNoOfAllBanks = 2; + } + else + { + gBattleMainFunc = sub_8010800; + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[0] = 0; + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksBySide[1] = 1; + gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[2] = 2; + gBattleBankFunc[3] = SetBankFuncToOpponentBufferRunCommand; + gBanksBySide[3] = 3; + gNoOfAllBanks = 4; + } +} + +void sub_800BA78(void) +{ + u8 multiplayerId; + int i; + + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + { + gBattleMainFunc = sub_8010800; + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[0] = 0; + gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[1] = 1; + gNoOfAllBanks = 2; + } + else + { + gBattleBankFunc[1] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[1] = 0; + gBattleBankFunc[0] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[0] = 1; + gNoOfAllBanks = 2; + } + return; + } + if ((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_DOUBLE)) == BATTLE_TYPE_DOUBLE) + { + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + { + gBattleMainFunc = sub_8010800; + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[0] = 0; + gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[1] = 1; + gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[2] = 2; + gBattleBankFunc[3] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[3] = 3; + gNoOfAllBanks = 4; + } + else + { + gBattleBankFunc[1] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[1] = 0; + gBattleBankFunc[0] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[0] = 1; + gBattleBankFunc[3] = SetBankFuncToPlayerBufferRunCommand; + gBanksBySide[3] = 2; + gBattleBankFunc[2] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksBySide[2] = 3; + gNoOfAllBanks = 4; + + } + return; + } + multiplayerId = GetMultiplayerId(); + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + gBattleMainFunc = sub_8010800; + for (i = 0; i < 4; i++) + { + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + sub_8094978(gLinkPlayers[i].lp_field_18, 0); + break; + case 1: + case 2: + sub_8094978(gLinkPlayers[i].lp_field_18, 1); + break; + } + + if (i == multiplayerId) + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToPlayerBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 0; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 2; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + else + { + if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[multiplayerId].lp_field_18 & 1)) + || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[multiplayerId].lp_field_18 & 1))) + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToLinkPartnerBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 0; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 2; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + else + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToLinkOpponentBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 1; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksBySide[gLinkPlayers[i].lp_field_18] = 3; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + } + } + gNoOfAllBanks = 4; +} + +void sub_800BD54(void) +{ + int i; + int j; + + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + for (i = 0; i < gNoOfAllBanks; i++) + { + for (j = 0; j < 6; j++) + { + if (i < 2) + { + if (!(gBanksBySide[i] & 1)) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0) + { + gBattlePartyID[i] = j; + break; + } + } + else + { + if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0) + { + gBattlePartyID[i] = j; + break; + } + } + } + else + { + if (!(gBanksBySide[i] & 1)) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != 0 //Probably a typo by Game Freak. The rest use SPECIES2 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0 + && gBattlePartyID[i - 2] != j) + { + gBattlePartyID[i] = j; + break; + } + } + else + { + if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0 + && gBattlePartyID[i - 2] != j) + { + gBattlePartyID[i] = j; + break; + } + } + } + } + } + } +} + +void PrepareBufferDataTransfer(u8 a, u8 *data, u16 size) +{ + int i; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + PrepareBufferDataTransferLink(a, size, data); + } + else + { + switch (a) + { + case 0: + for (i = 0; i < size; i++) + { + gBattleBufferA[gActiveBank][i] = *data; + data++; + } + break; + case 1: + for (i = 0; i < size; i++) + { + gBattleBufferB[gActiveBank][i] = *data; + data++; + } + break; + } + } +} + +void sub_800BF28(void) +{ + gUnknown_020238C4 = CreateTask(sub_800C1A8, 0); + gTasks[gUnknown_020238C4].data[11] = 0; + gTasks[gUnknown_020238C4].data[12] = 0; + gTasks[gUnknown_020238C4].data[13] = 0; + gTasks[gUnknown_020238C4].data[14] = 0; + gTasks[gUnknown_020238C4].data[15] = 0; + gUnknown_020238C5 = CreateTask(sub_800C47C, 0); + gTasks[gUnknown_020238C5].data[12] = 0; + gTasks[gUnknown_020238C5].data[13] = 0; + gTasks[gUnknown_020238C5].data[14] = 0; + gTasks[gUnknown_020238C5].data[15] = 0; + gUnknown_020238C6 = 0; + CpuFill16(0, EWRAM_14000, 0x2000); +} + +void PrepareBufferDataTransferLink(u8 a, u16 size, u8 *data) +{ + s32 r9; + int i; + + r9 = size - size % 4 + 4; + if (gTasks[gUnknown_020238C4].data[14] + r9 + 9 > 0x1000) + { + gTasks[gUnknown_020238C4].data[12] = gTasks[gUnknown_020238C4].data[14]; + gTasks[gUnknown_020238C4].data[14] = 0; + } + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14000] = a; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14001] = gActiveBank; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14002] = gBankAttacker; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14003] = gBankTarget; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14004] = r9; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14005] = (r9 & 0x0000FF00) >> 8; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14006] = gAbsentBankFlags; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14007] = gEffectBank; + for (i = 0; i < size; i++) + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14008 + i] = data[i]; + gTasks[gUnknown_020238C4].data[14] = gTasks[gUnknown_020238C4].data[14] + r9 + 8; +} + +void sub_800C1A8(u8 taskId) +{ + u16 var; + + switch (gTasks[taskId].data[11]) + { + case 0: + gTasks[taskId].data[10] = 100; + gTasks[taskId].data[11]++; + break; + case 1: + gTasks[taskId].data[10]--; + if (gTasks[taskId].data[10] == 0) + gTasks[taskId].data[11]++; + break; + case 2: + GetLinkPlayerCount_2(); + if (IsLinkMaster()) + { + sub_8007F4C(); + gTasks[taskId].data[11]++; + break; + } + gTasks[taskId].data[11]++; + break; + case 3: + if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) + { + if (gTasks[taskId].data[13] == 0) + { + if (gTasks[taskId].data[15] > gTasks[taskId].data[14] + && gTasks[taskId].data[15] == gTasks[taskId].data[12]) + { + gTasks[taskId].data[12] = 0; + gTasks[taskId].data[15] = 0; + } + var = (unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8)) + 8; + SendBlock(bitmask_all_link_players_but_self(), &unk_2000000[gTasks[taskId].data[15] + 0x14000], var); + gTasks[taskId].data[11]++; + } + else + { + gTasks[taskId].data[13]--; + break; + } + } + break; + case 4: + if (sub_8007ECC()) + { + var = unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8); + gTasks[taskId].data[13] = 1; + gTasks[taskId].data[15] = gTasks[taskId].data[15] + var + 8; + gTasks[taskId].data[11] = 3; + } + break; + case 5: + gTasks[taskId].data[13]--; + if (gTasks[taskId].data[13] == 0) + { + gTasks[taskId].data[13] = 1; + gTasks[taskId].data[11] = 3; + } + break; + } +} + +//fix me +void sub_800C35C(void) +{ + u8 i; //r4 + s32 j; //r2 + u16 r6; //r6 + u8 *recvBuffer; //r3 + u8 *dest; //r5 + u8 *src; //r4 + + if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & 0x20) && gLinkPlayers[0].linkType == 0x2211) + { + for (i = 0; i < GetLinkPlayerCount(); i++) + { + if (GetBlockReceivedStatus() & gBitTable[i]) + { + ResetBlockReceivedFlag(i); + recvBuffer = (u8 *)&gBlockRecvBuffer[i]; +#ifndef NONMATCHING + asm(""); + recvBuffer = (u8 *)&gBlockRecvBuffer[i]; +#endif + r6 = gBlockRecvBuffer[i][2]; + if (gTasks[gUnknown_020238C5].data[14] + 9 + r6 > 0x1000) + { + gTasks[gUnknown_020238C5].data[12] = gTasks[gUnknown_020238C5].data[14]; + gTasks[gUnknown_020238C5].data[14] = 0; + } + //_0800C402 + dest = EWRAM_15000 + gTasks[gUnknown_020238C5].data[14]; + src = recvBuffer; + for (j = 0; j < r6 + 8; j++) + dest[j] = src[j]; + gTasks[gUnknown_020238C5].data[14] = gTasks[gUnknown_020238C5].data[14] + r6 + 8; + } + //_0800C446 + } + } +} + +void sub_800C47C(u8 taskId) +{ + u16 r7; + u8 r4; + u8 r2; + + if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) + { + if (gTasks[taskId].data[15] > gTasks[taskId].data[14] + && gTasks[taskId].data[15] == gTasks[taskId].data[12]) + { + gTasks[taskId].data[12] = 0; + gTasks[taskId].data[15] = 0; + } + r4 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 1]; + r7 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 4] | (unk_2000000[0x15000 + gTasks[taskId].data[15] + 5] << 8); + switch (unk_2000000[0x15000 + gTasks[taskId].data[15] + 0]) + { + case 0: + if (gBattleExecBuffer & gBitTable[r4]) + return; + memcpy(gBattleBufferA[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7); + sub_80155A4(r4); + if (!(gBattleTypeFlags & BATTLE_TYPE_WILD)) + { + gBankAttacker = unk_2000000[0x15000 + gTasks[taskId].data[15] + 2]; + gBankTarget = unk_2000000[0x15000 + gTasks[taskId].data[15] + 3]; + gAbsentBankFlags = unk_2000000[0x15000 + gTasks[taskId].data[15] + 6]; + gEffectBank = unk_2000000[0x15000 + gTasks[taskId].data[15] + 7]; + } + break; + case 1: + memcpy(gBattleBufferB[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7); + break; + case 2: + r2 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 8]; + gBattleExecBuffer &= ~(gBitTable[r4] << (r2 * 4)); + break; + } + gTasks[taskId].data[15] = gTasks[taskId].data[15] + r7 + 8; + } +} + +void EmitGetAttributes(u8 a, u8 b, u8 c) +{ + gBattleBuffersTransferData[0] = 0; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd1(u8 a, u8 b, u8 c) +{ + gBattleBuffersTransferData[0] = 1; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitSetAttributes(u8 a, u8 b, u8 c, u8 d, void *e) +{ + int i; + + gBattleBuffersTransferData[0] = 2; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + for (i = 0; i < d; i++) + gBattleBuffersTransferData[3 + i] = *(u8*)(e++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, d + 3); +} + +void Emitcmd3(u8 a, u8 b, u8 c, u8 *d) +{ + int i; + + gBattleBuffersTransferData[0] = 3; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + for (i = 0; i < c; i++) + gBattleBuffersTransferData[3 + i] = *(d++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, c + 3); +} + +void EmitLoadPokeSprite(u8 a) +{ + gBattleBuffersTransferData[0] = 4; + gBattleBuffersTransferData[1] = 4; + gBattleBuffersTransferData[2] = 4; + gBattleBuffersTransferData[3] = 4; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitSendOutPoke(u8 a, u8 b, u8 c) +{ + gBattleBuffersTransferData[0] = 5; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = 5; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitReturnPokeToBall(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 6; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void EmitTrainerThrow(u8 a) +{ + gBattleBuffersTransferData[0] = 7; + gBattleBuffersTransferData[1] = 7; + gBattleBuffersTransferData[2] = 7; + gBattleBuffersTransferData[3] = 7; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitTrainerSlide(u8 a) +{ + gBattleBuffersTransferData[0] = 8; + gBattleBuffersTransferData[1] = 8; + gBattleBuffersTransferData[2] = 8; + gBattleBuffersTransferData[3] = 8; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitTrainerSlideBack(u8 a) +{ + gBattleBuffersTransferData[0] = 9; + gBattleBuffersTransferData[1] = 9; + gBattleBuffersTransferData[2] = 9; + gBattleBuffersTransferData[3] = 9; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd10(u8 a) +{ + gBattleBuffersTransferData[0] = 10; + gBattleBuffersTransferData[1] = 10; + gBattleBuffersTransferData[2] = 10; + gBattleBuffersTransferData[3] = 10; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd11(u8 a) +{ + gBattleBuffersTransferData[0] = 11; + gBattleBuffersTransferData[1] = 11; + gBattleBuffersTransferData[2] = 11; + gBattleBuffersTransferData[3] = 11; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd12(u8 a) +{ + gBattleBuffersTransferData[0] = 12; + gBattleBuffersTransferData[1] = 12; + gBattleBuffersTransferData[2] = 12; + gBattleBuffersTransferData[3] = 12; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitBallThrow(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 13; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void EmitPuase(u8 a, u8 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 14; + gBattleBuffersTransferData[1] = b; + for (i = 0; i < b * 3; i++) + gBattleBuffersTransferData[2 + i] = *(c++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, b * 3 + 2); +} + +void EmitMoveAnimation(u8 a, u16 b, u8 c, u16 d, s32 e, u8 f, struct DisableStruct *g) +{ + gBattleBuffersTransferData[0] = 15; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = c; + gBattleBuffersTransferData[4] = d; + gBattleBuffersTransferData[5] = (d & 0xFF00) >> 8; + gBattleBuffersTransferData[6] = e; + gBattleBuffersTransferData[7] = (e & 0x0000FF00) >> 8; + gBattleBuffersTransferData[8] = (e & 0x00FF0000) >> 16; + gBattleBuffersTransferData[9] = (e & 0xFF000000) >> 24; + gBattleBuffersTransferData[10] = f; + gBattleBuffersTransferData[11] = gMultiHitCounter; + if (AbilityBattleEffects(14, 0, 13, 0, 0) == 0 && AbilityBattleEffects(14, 0, 0x4D, 0, 0) == 0) + { + gBattleBuffersTransferData[12] = gBattleWeather; + gBattleBuffersTransferData[13] = (gBattleWeather & 0xFF00) >> 8; + } + else + { + gBattleBuffersTransferData[12] = 0; + gBattleBuffersTransferData[13] = 0; + } + gBattleBuffersTransferData[14] = 0; + gBattleBuffersTransferData[15] = 0; + memcpy(&gBattleBuffersTransferData[16], g, sizeof(*g)); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 0x2C); +} + +void EmitPrintString(u8 a, u16 stringID) +{ + s32 i; + struct StringInfoBattle* stringInfo; + + gBattleBuffersTransferData[0] = 16; + gBattleBuffersTransferData[1] = gBattleOutcome; + gBattleBuffersTransferData[2] = stringID; + gBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8; + + stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]); + stringInfo->currentMove = gCurrentMove; + stringInfo->lastMove = gUnknown_02024BE8; + stringInfo->lastItem = gLastUsedItem; + stringInfo->lastAbility = gLastUsedAbility; + stringInfo->scrActive = BATTLE_STRUCT->scriptingActive; + stringInfo->unk1605E = BATTLE_STRUCT->unk1605E; + stringInfo->hpScale = BATTLE_STRUCT->hpScale; + stringInfo->StringBank = gStringBank; + stringInfo->moveType = gBattleMoves[gCurrentMove].type; + + for (i = 0; i < 4; i++) + stringInfo->abilities[i] = gBattleMons[i].ability; + for (i = 0; i < 0x10; i++) + { + stringInfo->textBuffs[0][i] = gBattleTextBuff1[i]; + stringInfo->textBuffs[1][i] = gBattleTextBuff2[i]; + stringInfo->textBuffs[2][i] = gBattleTextBuff3[i]; + } + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4); +} + +void EmitPrintStringPlayerOnly(u8 a, u16 stringID) +{ + s32 i; + struct StringInfoBattle* stringInfo; + + gBattleBuffersTransferData[0] = 17; + gBattleBuffersTransferData[1] = 17; + gBattleBuffersTransferData[2] = stringID; + gBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8; + + stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]); + stringInfo->currentMove = gCurrentMove; + stringInfo->lastMove = gUnknown_02024BE8; + stringInfo->lastItem = gLastUsedItem; + stringInfo->lastAbility = gLastUsedAbility; + stringInfo->scrActive = BATTLE_STRUCT->scriptingActive; + stringInfo->unk1605E = BATTLE_STRUCT->unk1605E; + + for (i = 0; i < 4; i++) + stringInfo->abilities[i] = gBattleMons[i].ability; + for (i = 0; i < 0x10; i++) + { + stringInfo->textBuffs[0][i] = gBattleTextBuff1[i]; + stringInfo->textBuffs[1][i] = gBattleTextBuff2[i]; + stringInfo->textBuffs[2][i] = gBattleTextBuff3[i]; + } + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4); +} + +void Emitcmd18(u8 a, u8 b, u16 c) +{ + gBattleBuffersTransferData[0] = 18; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd19(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 19; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void Emitcmd20(u8 a, u8 b, u8 c, u8 *d) +{ + u32 i; + + gBattleBuffersTransferData[0] = 20; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = 0; + for (i = 0; i < 20; i++) + gBattleBuffersTransferData[4 + i] = d[i]; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 24); +} + +void EmitOpenBag(u8 a, u8 *b) +{ + int i; + + gBattleBuffersTransferData[0] = 21; + for (i = 0; i < 3; i++) + gBattleBuffersTransferData[1 + i] = b[i]; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitChoosePokemon(u8 a, u8 b, u8 c, u8 d, u8 *e) +{ + int i; + + gBattleBuffersTransferData[0] = 22; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = d; + for (i = 0; i < 3; i++) + gBattleBuffersTransferData[4 + i] = e[i]; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 8); //but only 7 bytes were written +} + +void Emitcmd23(u8 a) +{ + gBattleBuffersTransferData[0] = 23; + gBattleBuffersTransferData[1] = 23; + gBattleBuffersTransferData[2] = 23; + gBattleBuffersTransferData[3] = 23; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +// FIXME: I think this function is supposed to take s16 as its second argument, +// but battle_4.c expects u16 +void EmitHealthBarUpdate(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 24; + gBattleBuffersTransferData[1] = 0; + gBattleBuffersTransferData[2] = (s16)b; + gBattleBuffersTransferData[3] = ((s16)b & 0xFF00) >> 8; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +// FIXME: I think this function is supposed to take s16 as its third argument, +// but battle_4.c expects u16 +void EmitExpBarUpdate(u8 a, u8 b, u16 c) +{ + gBattleBuffersTransferData[0] = 25; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (s16)c; + gBattleBuffersTransferData[3] = ((s16)c & 0xFF00) >> 8; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitStatusIconUpdate(u8 a, u32 b, u32 c) +{ + gBattleBuffersTransferData[0] = 26; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0x0000FF00) >> 8; + gBattleBuffersTransferData[3] = (b & 0x00FF0000) >> 16; + gBattleBuffersTransferData[4] = (b & 0xFF000000) >> 24; + gBattleBuffersTransferData[5] = c; + gBattleBuffersTransferData[6] = (c & 0x0000FF00) >> 8; + gBattleBuffersTransferData[7] = (c & 0x00FF0000) >> 16; + gBattleBuffersTransferData[8] = (c & 0xFF000000) >> 24; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 9); +} + +void EmitStatusAnimation(u8 a, u8 b, u32 c) +{ + gBattleBuffersTransferData[0] = 27; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = (c & 0x0000FF00) >> 8; + gBattleBuffersTransferData[4] = (c & 0x00FF0000) >> 16; + gBattleBuffersTransferData[5] = (c & 0xFF000000) >> 24; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 6); +} + +void EmitStatusXor(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 28; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void Emitcmd29(u8 a, u16 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 29; + gBattleBuffersTransferData[1] = 29; + gBattleBuffersTransferData[2] = b; + gBattleBuffersTransferData[3] = (b & 0xFF00) >> 8; + for (i = 0; i < b; i++) + gBattleBuffersTransferData[4 + i] = *(c++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, b + 4); +} + +void EmitDMATransfer(u8 a, u32 b, u16 c, u8 *d) +{ + int i; + + gBattleBuffersTransferData[0] = 30; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0x0000FF00) >> 8; + gBattleBuffersTransferData[3] = (b & 0x00FF0000) >> 16; + gBattleBuffersTransferData[4] = (b & 0xFF000000) >> 24; + gBattleBuffersTransferData[5] = c; + gBattleBuffersTransferData[6] = (c & 0xFF00) >> 8; + for (i = 0; i < c; i++) + gBattleBuffersTransferData[7 + i] = *(d++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, c + 7); +} + +void Emitcmd31(u8 a, u16 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 31; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + for (i = 0; i < b; i++) + gBattleBuffersTransferData[3 + i] = *(c++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, b + 3); +} + +void Emitcmd32(u8 a, u16 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 32; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + for (i = 0; i < b; i++) + gBattleBuffersTransferData[3 + i] = *(c++); + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, b + 3); +} + +void Emitcmd33(u8 a, u8 b, u16 c) +{ + gBattleBuffersTransferData[0] = 33; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd34(u8 a, u8 b, u8 *c) +{ + int i; + + gBattleBuffersTransferData[0] = 34; + gBattleBuffersTransferData[1] = b; + for (i = 0; i < 3; i++) + gBattleBuffersTransferData[2 + i] = c[i]; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 5); +} + +void Emitcmd35(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 35; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd36(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 36; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd37(u8 a) +{ + gBattleBuffersTransferData[0] = 37; + gBattleBuffersTransferData[1] = 37; + gBattleBuffersTransferData[2] = 37; + gBattleBuffersTransferData[3] = 37; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd38(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 38; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void Emitcmd39(u8 a) +{ + gBattleBuffersTransferData[0] = 39; + gBattleBuffersTransferData[1] = 39; + gBattleBuffersTransferData[2] = 39; + gBattleBuffersTransferData[3] = 39; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd40(u8 a) +{ + gBattleBuffersTransferData[0] = 40; + gBattleBuffersTransferData[1] = 40; + gBattleBuffersTransferData[2] = 40; + gBattleBuffersTransferData[3] = 40; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitHitAnimation(u8 a) +{ + gBattleBuffersTransferData[0] = 41; + gBattleBuffersTransferData[1] = 41; + gBattleBuffersTransferData[2] = 41; + gBattleBuffersTransferData[3] = 41; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd42(u8 a) +{ + gBattleBuffersTransferData[0] = 42; + gBattleBuffersTransferData[1] = 42; + gBattleBuffersTransferData[2] = 42; + gBattleBuffersTransferData[3] = 42; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitEffectivenessSound(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 43; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd44(u8 a, u16 b) +{ + gBattleBuffersTransferData[0] = 44; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitFaintingCry(u8 a) +{ + gBattleBuffersTransferData[0] = 45; + gBattleBuffersTransferData[1] = 45; + gBattleBuffersTransferData[2] = 45; + gBattleBuffersTransferData[3] = 45; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitIntroSlide(u8 a, u8 battleTerrain) +{ + gBattleBuffersTransferData[0] = 46; + gBattleBuffersTransferData[1] = battleTerrain; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void EmitTrainerBallThrow(u8 a) +{ + gBattleBuffersTransferData[0] = 47; + gBattleBuffersTransferData[1] = 47; + gBattleBuffersTransferData[2] = 47; + gBattleBuffersTransferData[3] = 47; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd48(u8 a, u8 *b, u8 c) +{ + int i; + + gBattleBuffersTransferData[0] = 48; + gBattleBuffersTransferData[1] = c & 0x7F; + gBattleBuffersTransferData[2] = (c & 0x80) >> 7; + gBattleBuffersTransferData[3] = 48; + for (i = 0; i < 48; i++) + gBattleBuffersTransferData[4 + i] = b[i]; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 52); +} + +void Emitcmd49(u8 a) +{ + gBattleBuffersTransferData[0] = 49; + gBattleBuffersTransferData[1] = 49; + gBattleBuffersTransferData[2] = 49; + gBattleBuffersTransferData[3] = 49; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void Emitcmd50(u8 a) +{ + gBattleBuffersTransferData[0] = 50; + gBattleBuffersTransferData[1] = 50; + gBattleBuffersTransferData[2] = 50; + gBattleBuffersTransferData[3] = 50; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitSpriteInvisibility(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 51; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = 51; + gBattleBuffersTransferData[3] = 51; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitBattleAnimation(u8 a, u8 b, u16 c) +{ + gBattleBuffersTransferData[0] = 52; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = c; + gBattleBuffersTransferData[3] = (c & 0xFF00) >> 8; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); +} + +void EmitLinkStandbyMsg(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 53; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void EmitResetActionMoveSelection(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 54; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} + +void Emitcmd55(u8 a, u8 b) +{ + gBattleBuffersTransferData[0] = 55; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2); +} diff --git a/src/rom6.c b/src/rom6.c new file mode 100644 index 000000000..3a5071034 --- /dev/null +++ b/src/rom6.c @@ -0,0 +1,202 @@ +#include "global.h" +#include "rom6.h" +#include "braille_puzzles.h" +#include "field_effect.h" +#include "field_map_obj.h" +#include "field_player_avatar.h" +#include "item_use.h" +#include "pokemon_menu.h" +#include "overworld.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" + +extern u16 gScriptLastTalked; +extern void (*gFieldCallback)(void); +extern u8 gLastFieldPokeMenuOpened; +extern void (*gUnknown_03005CE4)(void); +extern u8 S_UseRockSmash[]; + +EWRAM_DATA struct MapPosition gUnknown_0203923C = {0}; + +static void task08_080C9820(u8); +static void sub_810B3DC(u8); +static void sub_810B428(u8); +static void sub_810B4CC(u8); +static void sub_810B53C(void); +static void sub_810B58C(void); +static void sub_810B5D8(void); +static void sub_810B634(void); + +bool8 npc_before_player_of_type(u8 a) +{ + u8 mapObjId; + + GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); + gUnknown_0203923C.height = PlayerGetZCoord(); + mapObjId = GetFieldObjectIdByXYZ(gUnknown_0203923C.x, gUnknown_0203923C.y, gUnknown_0203923C.height); + if (gMapObjects[mapObjId].graphicsId != a) + { + return FALSE; + } + else + { + gScriptLastTalked = gMapObjects[mapObjId].localId; + return TRUE; + } +} + +u8 oei_task_add(void) +{ + GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); + return CreateTask(task08_080C9820, 8); +} + +static void task08_080C9820(u8 taskId) +{ + u8 mapObjId; + + ScriptContext2_Enable(); + gPlayerAvatar.unk6 = 1; + mapObjId = gPlayerAvatar.mapObjectId; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(&gMapObjects[mapObjId]) + || FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId])) + { + if (gMapHeader.mapType == MAP_TYPE_UNDERWATER) + { + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + gTasks[taskId].func = sub_810B428; + } + else + { + sub_8059BF4(); + FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 0x39); + gTasks[taskId].func = sub_810B3DC; + } + } +} + +static void sub_810B3DC(u8 taskId) +{ + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[gPlayerAvatar.mapObjectId]) == TRUE) + { + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + gTasks[taskId].func = sub_810B428; + } +} + +static void sub_810B428(u8 taskId) +{ + if (!FieldEffectActiveListContains(6)) + { + gFieldEffectArguments[1] = player_get_direction_lower_nybble(); + if (gFieldEffectArguments[1] == 1) + gFieldEffectArguments[2] = 0; + if (gFieldEffectArguments[1] == 2) + gFieldEffectArguments[2] = 1; + if (gFieldEffectArguments[1] == 3) + gFieldEffectArguments[2] = 2; + if (gFieldEffectArguments[1] == 4) + gFieldEffectArguments[2] = 3; + sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByCurrentState()); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]); + FieldEffectActiveListRemove(6); + gTasks[taskId].func = sub_810B4CC; + } +} + +static void sub_810B4CC(u8 taskId) +{ + void (*func)(void) = (void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]); + + func(); + gPlayerAvatar.unk6 = 0; + DestroyTask(taskId); +} + +bool8 SetUpFieldMove_RockSmash(void) +{ + if (npc_before_player_of_type(0x56) == TRUE) + { + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_810B53C; + return TRUE; + } + else + { + return FALSE; + } +} + +static void sub_810B53C(void) +{ + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + ScriptContext1_SetupScript(S_UseRockSmash); +} + +int FldEff_RockSmash(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_810B58C >> 16; + gTasks[taskId].data[9] = (u32)sub_810B58C; + IncrementGameStat(0x13); + return 0; +} + +static void sub_810B58C(void) +{ + PlaySE(SE_W088); + FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH); + EnableBothScriptContexts(); +} + +int SetUpFieldMove_Dig(void) +{ + if (CanUseEscapeRopeOnCurrMap() == TRUE) + { + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_810B5D8; + return TRUE; + } + else + { + return FALSE; + } +} + +static void sub_810B5D8(void) +{ + sub_8053014(); + FieldEffectStart(FLDEFF_USE_DIG); + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; +} + +int FldEff_UseDig(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_810B634 >> 16; + gTasks[taskId].data[9] = (u32)sub_810B634; + if (!ShouldDoBrailleDigEffect()) + SetPlayerAvatarTransitionFlags(1); + return 0; +} + +static void sub_810B634(void) +{ + u8 taskId; + + FieldEffectActiveListRemove(FLDEFF_USE_DIG); + if (ShouldDoBrailleDigEffect()) + { + DoBrailleDigEffect(); + } + else + { + taskId = CreateTask(task08_080A1C44, 8); + gTasks[taskId].data[0] = 0; + } +} diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c new file mode 100644 index 000000000..f51779e65 --- /dev/null +++ b/src/rom_800D42C.c @@ -0,0 +1,118 @@ +#include "global.h" +#include "battle.h" +#include "link.h" +#include "text.h" + +extern u16 gBattleTypeFlags; +extern u8 gBattleOutcome; + +extern struct Window gUnknown_03004210; + +extern u8 BattleText_Win[]; +extern u8 BattleText_Loss[]; +extern u8 BattleText_Tie[]; + +#if ENGLISH +#define LEFT_MESSAGE_X 6 +#define RIGHT_MESSAGE_X 21 +#define TILE_OFFSET_LOSS 168 +#elif GERMAN +#define LEFT_MESSAGE_X 5 +#define RIGHT_MESSAGE_X 20 +#define TILE_OFFSET_LOSS 172 +#endif +#define TILE_OFFSET_WIN 160 +#define CENTER_MESSAGE_X 13 +#define MESSAGE_Y 2 + +#define PRINT_MESSAGE(text, tileDataStartOffset, x) \ +{ \ + InitWindow(&gUnknown_03004210, text, tileDataStartOffset, x, MESSAGE_Y); \ + sub_8002F44(&gUnknown_03004210); \ +} + +#define PRINT_MESSAGE_LEFT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, LEFT_MESSAGE_X) +#define PRINT_MESSAGE_RIGHT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, RIGHT_MESSAGE_X) + +void PrintLinkBattleWinLossTie(void) +{ + + if (gBattleOutcome == 3) + { + PRINT_MESSAGE(BattleText_Tie, TILE_OFFSET_WIN, CENTER_MESSAGE_X); + return; + } + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + // Double battle? + + if (gBattleOutcome == 1) + { + + // lp_field_18 = player position? + switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18) + { + case 0: + case 2: + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); + return; + + case 1: + case 3: + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN) + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS) + return; + } + } + else + { + + switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18) + { + case 1: + case 3: + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); + return; + + case 0: + case 2: + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); + return; + } + } + + return; + } + + + if (gBattleOutcome == 1) + { + if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0) + { + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); + } + else + { + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); + } + } + else + { + if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0) + { + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); + } + else + { + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); + } + } +} diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c new file mode 100644 index 000000000..172233e6d --- /dev/null +++ b/src/rom_8077ABC.c @@ -0,0 +1,2055 @@ +#include "global.h" +#include "rom_8077ABC.h" +#include "battle.h" +#include "battle_anim.h" +#include "blend_palette.h" +#include "data2.h" +#include "decompress.h" +#include "palette.h" +#include "pokemon_icon.h" +#include "species.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" +#include "util.h" + +#define GET_UNOWN_LETTER(personality) ((\ + (((personality & 0x03000000) >> 24) << 6) \ + | (((personality & 0x00030000) >> 16) << 4) \ + | (((personality & 0x00000300) >> 8) << 2) \ + | (((personality & 0x00000003) >> 0) << 0) \ +) % 28) + +#define IS_DOUBLE_BATTLE() ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) ? TRUE : FALSE) + +#define NUM_BATTLE_SLOTS 4 + +#define gBattleMonPartyPositions gBattlePartyID +#define gCastformElevations gUnknownCastformData_0837F5A8 +#define gCastformBackSpriteYCoords gUnknown_0837F5AC +#define gTransformPersonalities gPID_perBank +#define gBattleMonSprites gObjectBankIDs + + +struct Struct_unk_2019348 { + u16 field_0; + u16 field_2; + u8 field_4; + u32 field_8; + u32 field_c; + u32 field_10; +}; + +struct TransformStatus { + u16 unknown; + u16 species; +}; + +struct Struct_gUnknown_0837F578 { + u8 field_0; + u8 field_1; +}; + +struct OamMatrix { + s16 a; + s16 b; + s16 c; + s16 d; +}; + +struct Struct_2017810 { + u8 filler_0[6]; + u8 field_6; + u8 filler_7[5]; +}; + +struct Color { + u16 r:5; + u16 g:5; + u16 b:5; +}; + +struct Struct_sub_8078914 { + u8 *field_0; + u8 *field_4; + u8 field_8; +}; + +struct BGCnt { + u16 priority:2; + u16 charBase:2; + u16 unused:2; + u16 mosaic:1; + u16 colorMode:1; + u16 screenBase:5; + u16 overflow:1; + u16 size:2; +}; + +#define BG1CNT (*(volatile struct BGCnt*)REG_ADDR_BG1CNT) +#define BG2CNT (*(volatile struct BGCnt*)REG_ADDR_BG2CNT) +#define BG3CNT (*(volatile struct BGCnt*)REG_ADDR_BG3CNT) + +extern struct OamData gOamData_837DF9C[]; +extern const union AnimCmd *const gDummySpriteAnimTable[]; +extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[]; + +extern struct Struct_unk_2019348 unk_2019348; +extern struct TransformStatus gTransformStatuses[]; +extern u16 gBattleMonPartyPositions[]; +extern u16 gBattleTypeFlags; +extern u32 gTransformPersonalities[NUM_BATTLE_SLOTS]; +extern u8 gBattleMonForms[NUM_BATTLE_SLOTS]; +extern u16 gUnknown_0202F7CA[]; +extern u8 gBattleMonSprites[NUM_BATTLE_SLOTS]; +extern u8 gBattleAnimBankAttacker; +extern u8 gBattleAnimBankTarget; +extern s16 gBattleAnimArgs[8]; +extern u8 gBanksBySide[NUM_BATTLE_SLOTS]; +extern u8 gNoOfAllBanks; // gNumBattleMons? +extern struct OamMatrix gOamMatrices[]; +extern struct Struct_2017810 unk_2017810[]; +extern u8 gHappinessMoveAnim; + +EWRAM_DATA union AffineAnimCmd *gUnknown_0202F7D4 = NULL; +EWRAM_DATA u32 filler_0202F7D8[3] = {0}; + +const struct Struct_gUnknown_0837F578 gUnknown_0837F578[][4] = { + { + { 72, 80 }, + { 176, 40 }, + { 48, 40 }, + { 112, 80 }, + }, + { + { 32, 80 }, + { 200, 40 }, + { 90, 88 }, + { 152, 32 }, + }, +}; + +// One entry for each of the four Castform forms. +// Coords are probably front pic coords or back pic coords, but this data does not seem to be +// used during battle, party summary, or pokedex screens. +const struct MonCoords gCastformFrontSpriteCoords[] = { + { 0x44, 17 }, // NORMAL + { 0x66, 9 }, // SUN + { 0x46, 9 }, // RAIN + { 0x86, 8 }, // HAIL +}; + +const u8 gCastformElevations[] = { + 13, // NORMAL + 14, // SUN + 13, // RAIN + 13, // HAIL +}; + +// Y position of the backsprite for each of the four Castform forms. +const u8 gCastformBackSpriteYCoords[] = { + 0, // NORMAL + 0, // SUN + 0, // RAIN + 0, // HAIL +}; + +const struct SpriteTemplate gSpriteTemplate_837F5B0[] = { + { + .tileTag = 55125, + .paletteTag = 55125, + .oam = gOamData_837DF9C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, { + .tileTag = 55126, + .paletteTag = 55126, + .oam = gOamData_837DF9C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + } +}; + +const struct SpriteSheet gUnknown_0837F5E0[] = { + { gMiscBlank_Gfx, 0x800, 55125, }, + { gMiscBlank_Gfx, 0x800, 55126, }, +}; + + +u8 sub_8077ABC(u8 slot, u8 a2) { + u8 var; + u16 species; + struct TransformStatus *transform; + + if (IsContest()) { + if (a2 == 3 && slot == 3) { + a2 = 1; + } + } + switch (a2) { + case 0: + case 2: + var = gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_0; + break; + case 1: + var = gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_1; + break; + case 3: + case 4: + default: + if (IsContest()) { + if (unk_2019348.field_4 & 1) { + species = unk_2019348.field_2; + } else { + species = unk_2019348.field_0; + } + } else { + if (GetBankSide(slot)) { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); + } else { + species = transform->species; + } + } else { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); + } else { + species = transform->species; + } + } + } + if (a2 == 3) { + var = sub_8077E44(slot, species, 1); + } else { + var = sub_8077E44(slot, species, 0); + } + break; + } + return var; +} + +u8 sub_8077BFC(u8 slot, u16 species) { + u16 letter; + u32 personality; + struct TransformStatus *transform; + u8 ret; + u16 var; + + if (!GetBankSide(slot) || IsContest()) { + if (species == SPECIES_UNOWN) { + if (IsContest()) { + if (unk_2019348.field_4 & 1) { + personality = unk_2019348.field_10; + } else { + personality = unk_2019348.field_8; + } + } else { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + personality = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); + } else { + personality = gTransformPersonalities[slot]; + } + } + letter = GET_UNOWN_LETTER(personality); + if (!letter) { + var = species; + } else { + var = letter + SPECIES_UNOWN_B - 1; + } + ret = gMonBackPicCoords[var].y_offset; + } else if (species == SPECIES_CASTFORM) { + ret = gCastformBackSpriteYCoords[gBattleMonForms[slot]]; + } else if (species > NUM_SPECIES) { + ret = gMonBackPicCoords[0].y_offset; + } else { + ret = gMonBackPicCoords[species].y_offset; + } + } else { + if (species == SPECIES_UNOWN) { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + personality = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); + } else { + personality = gTransformPersonalities[slot]; + } + letter = GET_UNOWN_LETTER(personality); + if (!letter) { + var = species; + } else { + var = letter + SPECIES_UNOWN_B - 1; + } + ret = gMonFrontPicCoords[var].y_offset; + } else if (species == SPECIES_CASTFORM) { + ret = gCastformFrontSpriteCoords[gBattleMonForms[slot]].y_offset; + } else if (species > NUM_SPECIES) { + ret = gMonFrontPicCoords[0].y_offset; + } else { + ret = gMonFrontPicCoords[species].y_offset; + } + } + return ret; +} + +u8 sub_8077DD8(u8 slot, u16 species) { + u8 ret = 0; + if (GetBankSide(slot) == 1) { + if (!IsContest()) { + if (species == SPECIES_CASTFORM) { + ret = gCastformElevations[gBattleMonForms[slot]]; + } else if (species > NUM_SPECIES) { + ret = gEnemyMonElevation[0]; + } else { + ret = gEnemyMonElevation[species]; + } + } + } + return ret; +} + +u8 sub_8077E44(u8 slot, u16 species, u8 a3) { + u16 offset; + u8 y; + if (GetBankSide(slot) == 0 || IsContest()) { + offset = sub_8077BFC(slot, species); + } else { + offset = sub_8077BFC(slot, species); + offset -= sub_8077DD8(slot, species); + } + y = offset + gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_1; + if (a3) { + if (GetBankSide(slot) == 0) { + y += 8; + } + if (y > 104) y = 104; + } + return y; +} + +u8 sub_8077EE4(u8 slot, u8 a2) { + u16 species; + struct TransformStatus *transform; + if (a2 == 3 || a2 == 4) { + if (IsContest()) { + if (unk_2019348.field_4 & 1) { + species = unk_2019348.field_2; + } else { + species = unk_2019348.field_0; + } + } else { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = gUnknown_0202F7CA[slot]; + } else { + species = transform->species; + } + } + if (a2 == 3) { + return sub_8077E44(slot, species, 1); + } else { + return sub_8077E44(slot, species, 0); + } + } else { + return sub_8077ABC(slot, a2); + } +} + +u8 sub_8077F68(u8 slot) { + return sub_8077ABC(slot, 4); +} + +u8 sub_8077F7C(u8 slot) { + u16 var; + if (GetBankSide(slot)) { + var = sub_8077ABC(slot, 1) + 16; + } else { + var = sub_8077ABC(slot, 1) + 17; + } + return var; +} + +u8 sub_8077FC0(u8 slot) { + u16 var; + u8 r6; + struct TransformStatus *transform; + r6 = sub_8077ABC(slot, 1); + if (!IsContest()) { + if (GetBankSide(slot)) { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + var = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); + } else { + var = transform->species; + } + } else { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + var = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); + } else { + var = transform->species; + } + } + if (GetBankSide(slot)) { + r6 -= sub_8077DD8(slot, var); + } + } + return r6; +} + +u8 GetAnimBankSpriteId(u8 whichBank) { + u8 *sprites; + if (whichBank == ANIM_BANK_ATK) { + if (AnimBankSpriteExists(gBattleAnimBankAttacker)) { + sprites = gBattleMonSprites; + return sprites[gBattleAnimBankAttacker]; + } else { + return 0xff; + } + } else if (whichBank == ANIM_BANK_DEF) { + if (AnimBankSpriteExists(gBattleAnimBankTarget)) { + sprites = gBattleMonSprites; + return sprites[gBattleAnimBankTarget]; + } else { + return 0xff; + } + } else if (whichBank == ANIM_BANK_ATK_PARTNER) { + if (!IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { + return 0xff; + } else { + return gBattleMonSprites[gBattleAnimBankAttacker ^ 2]; + } + } else { + if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { + return gBattleMonSprites[gBattleAnimBankTarget ^ 2]; + } else { + return 0xff; + } + } +} + +void StoreSpriteCallbackInData6(struct Sprite *sprite, void (*callback)(struct Sprite*)) { + sprite->data6 = (u32)(callback) & 0xffff; + sprite->data7 = (u32)(callback) >> 16; +} + +void SetCallbackToStoredInData6(struct Sprite *sprite) { + u32 callback = (u16)sprite->data6 | (sprite->data7 << 16); + sprite->callback = (void (*)(struct Sprite *))callback; +} + +void sub_8078114(struct Sprite *sprite) { + if (sprite->data3) { + sprite->pos2.x = Sin(sprite->data0, sprite->data1); + sprite->pos2.y = Cos(sprite->data0, sprite->data1); + sprite->data0 += sprite->data2; + if (sprite->data0 >= 0x100) { + sprite->data0 -= 0x100; + } else if (sprite->data0 < 0) { + sprite->data0 += 0x100; + } + sprite->data3--; + } else { + SetCallbackToStoredInData6(sprite); + } +} + +void sub_8078174(struct Sprite *sprite) { + if (sprite->data3) { + sprite->pos2.x = Sin(sprite->data0, (sprite->data5 >> 8) + sprite->data1); + sprite->pos2.y = Cos(sprite->data0, (sprite->data5 >> 8) + sprite->data1); + sprite->data0 += sprite->data2; + sprite->data5 += sprite->data4; + if (sprite->data0 >= 0x100) { + sprite->data0 -= 0x100; + } else if (sprite->data0 < 0) { + sprite->data0 += 0x100; + } + sprite->data3--; + } else { + SetCallbackToStoredInData6(sprite); + } +} + +void unref_sub_80781F0(struct Sprite *sprite) { + if (sprite->data3) { + sprite->pos2.x = Sin(sprite->data0, sprite->data1); + sprite->pos2.y = Cos(sprite->data4, sprite->data1); + sprite->data0 += sprite->data2; + sprite->data4 += sprite->data5; + if (sprite->data0 >= 0x100) { + sprite->data0 -= 0x100; + } else if (sprite->data0 < 0) { + sprite->data0 += 0x100; + } + if (sprite->data4 >= 0x100) { + sprite->data4 -= 0x100; + } else if (sprite->data4 < 0) { + sprite->data4 += 0x100; + } + sprite->data3--; + } else { + SetCallbackToStoredInData6(sprite); + } +} + +void sub_8078278(struct Sprite *sprite) { + if (sprite->data3) { + sprite->pos2.x = Sin(sprite->data0, sprite->data1); + sprite->pos2.y = Cos(sprite->data0, sprite->data4); + sprite->data0 += sprite->data2; + if (sprite->data0 >= 0x100) { + sprite->data0 -= 0x100; + } else if (sprite->data0 < 0) { + sprite->data0 += 0x100; + } + sprite->data3--; + } else { + SetCallbackToStoredInData6(sprite); + } +} + +void sub_80782D8(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + } else { + SetCallbackToStoredInData6(sprite); + } +} + +void sub_80782F8(struct Sprite *sprite) { + sub_8078314(sprite); + sprite->callback = sub_8078364; + sprite->callback(sprite); +} + +void sub_8078314(struct Sprite *sprite) { + s16 old; + int v1; + if (sprite->data1 > sprite->data2) { + sprite->data0 = -sprite->data0; + } + v1 = sprite->data2 - sprite->data1; + old = sprite->data0; + sprite->data0 = abs(v1 / sprite->data0); + sprite->data2 = (sprite->data4 - sprite->data3) / sprite->data0; + sprite->data1 = old; +} + +void sub_8078364(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + sprite->pos2.x += sprite->data1; + sprite->pos2.y += sprite->data2; + } else { + SetCallbackToStoredInData6(sprite); + } +} + +void sub_8078394(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + sprite->data3 += sprite->data1; + sprite->data4 += sprite->data2; + sprite->pos2.x = sprite->data3 >> 8; + sprite->pos2.y = sprite->data4 >> 8; + } else { + SetCallbackToStoredInData6(sprite); + } +} + +void sub_80783D0(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + sprite->data3 += sprite->data1; + sprite->data4 += sprite->data2; + sprite->pos2.x = sprite->data3 >> 8; + sprite->pos2.y = sprite->data4 >> 8; + } else { + SetCallbackToStoredInData6(sprite); + } + UpdateMonIconFrame(sprite); +} + +void unref_sub_8078414(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x + sprite->pos2.x; + sprite->data3 = sprite->pos1.y + sprite->pos2.y; + sprite->data2 = sub_8077ABC(gBattleAnimBankTarget, 2); + sprite->data4 = sub_8077ABC(gBattleAnimBankTarget, 3); + sprite->callback = sub_80782F8; +} + +void sub_8078458(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + gSprites[sprite->data3].pos2.x += sprite->data1; + gSprites[sprite->data3].pos2.y += sprite->data2; + } else { + SetCallbackToStoredInData6(sprite); + } +} + +void sub_80784A8(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + sprite->data3 += sprite->data1; + sprite->data4 += sprite->data2; + gSprites[sprite->data5].pos2.x = sprite->data3 >> 8; + gSprites[sprite->data5].pos2.y = sprite->data4 >> 8; + } else { + SetCallbackToStoredInData6(sprite); + } +} + +void sub_8078504(struct Sprite *sprite) { + if (sprite->data0 > 0) { + sprite->data0--; + sprite->pos2.x = sprite->data2 >> 8; + sprite->data2 += sprite->data1; + sprite->pos2.y = sprite->data4 >> 8; + sprite->data4 += sprite->data3; + if (sprite->data0 % sprite->data5 == 0) { + if (sprite->data5) { + sprite->invisible ^= 1; + } + } + } else { + SetCallbackToStoredInData6(sprite); + } +} + +void move_anim_8074EE0(struct Sprite *sprite) { + FreeSpriteOamMatrix(sprite); + move_anim_8072740(sprite); +} + +void unref_sub_8078588(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x + sprite->pos2.x; + sprite->data3 = sprite->pos1.y + sprite->pos2.y; + sprite->data2 = sub_8077ABC(gBattleAnimBankAttacker, 2); + sprite->data4 = sub_8077ABC(gBattleAnimBankAttacker, 3); + sprite->callback = sub_80782F8; +} + +void unref_sub_80785CC(struct Sprite *sprite) { + ResetPaletteStructByUid(sprite->data5); + move_anim_8074EE0(sprite); +} + +void sub_80785E4(struct Sprite *sprite) { + if (sprite->affineAnimEnded) { + SetCallbackToStoredInData6(sprite); + } +} + +void sub_8078600(struct Sprite *sprite) { + if (sprite->animEnded) { + SetCallbackToStoredInData6(sprite); + } +} + +void sub_807861C(struct Sprite *sprite) { + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + move_anim_8072740(sprite); +} + +void sub_8078634(u8 task) { + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyAnimVisualTask(task); +} + +void sub_8078650(struct Sprite *sprite) { + sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2); + sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3); +} + +void sub_807867C(struct Sprite *sprite, s16 a2) { + u16 v1 = sub_8077ABC(gBattleAnimBankAttacker, 0); + u16 v2 = sub_8077ABC(gBattleAnimBankTarget, 0); + if (v1 > v2) { + sprite->pos1.x -= a2; + } else if (v1 < v2) { + sprite->pos1.x += a2; + } else { + if (GetBankSide(gBattleAnimBankAttacker)) { + sprite->pos1.x -= a2; + } else { + sprite->pos1.x += a2; + } + } +} + +void sub_80786EC(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x; + sprite->data3 = sprite->pos1.y; + obj_translate_based_on_private_1_2_3_4(sprite); + sprite->data6 = 0x8000 / sprite->data0; + sprite->data7 = 0; +} + +bool8 sub_8078718(struct Sprite *sprite) { + if (sub_8078B5C(sprite)) { + return TRUE; + } + sprite->data7 += sprite->data6; + sprite->pos2.y += Sin((u8)(sprite->data7 >> 8), sprite->data5); + return FALSE; +} + +void oamt_add_pos2_onto_pos1(struct Sprite *sprite) { + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; +} + +void sub_8078764(struct Sprite *sprite, u8 a2) { + if (!a2) { + sprite->pos1.x = sub_8077EE4(gBattleAnimBankTarget, 0); + sprite->pos1.y = sub_8077EE4(gBattleAnimBankTarget, 1); + } + sub_807867C(sprite, gBattleAnimArgs[0]); + sprite->pos1.y += gBattleAnimArgs[1]; +} + +void sub_80787B0(struct Sprite *sprite, u8 a2) { + if (!a2) { + sprite->pos1.x = sub_8077EE4(gBattleAnimBankAttacker, 0); + sprite->pos1.y = sub_8077EE4(gBattleAnimBankAttacker, 1); + } else { + sprite->pos1.x = sub_8077EE4(gBattleAnimBankAttacker, 2); + sprite->pos1.y = sub_8077EE4(gBattleAnimBankAttacker, 3); + } + sub_807867C(sprite, gBattleAnimArgs[0]); + sprite->pos1.y += gBattleAnimArgs[1]; +} + +u8 GetBankSide(u8 slot) { + return gBanksBySide[slot] & 1; +} + +u8 GetBankIdentity(u8 slot) { + return gBanksBySide[slot]; +} + +u8 GetBankByPlayerAI(u8 slot) { + u8 i; + for (i = 0; i < gNoOfAllBanks; i++) { + if (gBanksBySide[i] == slot) { + break; + } + } + return i; +} + +bool8 AnimBankSpriteExists(u8 slot) { + if (IsContest()) { + if (gBattleAnimBankAttacker == slot) { + return TRUE; + } + if (gBattleAnimBankTarget == slot) { + return TRUE; + } + return FALSE; + } else { + if (gBanksBySide[slot] == 0xff) { + return FALSE; + } + if (GetBankSide(slot)) { + if (GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) { + return TRUE; + } + } else { + if (GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) { + return TRUE; + } + } + return FALSE; + } +} + +bool8 IsDoubleBattle() { + return IS_DOUBLE_BATTLE(); +} + +void sub_8078914(struct Struct_sub_8078914 *unk) { + if (IsContest()) { + unk->field_0 = (u8 *)0x6008000; + unk->field_4 = (u8 *)0x600f000; + unk->field_8 = 0xe; + } else { + unk->field_0 = (u8 *)0x6004000; + unk->field_4 = (u8 *)0x600e000; + unk->field_8 = 0x8; + } +} + +void sub_8078954(struct Struct_sub_8078914 *unk) { + if (IsContest()) { + unk->field_0 = (u8 *)0x6008000; + unk->field_4 = (u8 *)0x600f000; + unk->field_8 = 0xe; + } else if (GetBankIdentity_permutated(gBattleAnimBankAttacker) == 1) { + unk->field_0 = (u8 *)0x6004000; + unk->field_4 = (u8 *)0x600e000; + unk->field_8 = 0x8; + } else { + unk->field_0 = (u8 *)0x6006000; + unk->field_4 = (u8 *)0x600f000; + unk->field_8 = 0x9; + } +} + +u8 sub_80789BC() { + if (IsContest()) { + return 1; + } + return 2; +} + +void sub_80789D4(bool8 a1) { + if (!a1) { + BG3CNT.size = 0; + BG3CNT.overflow = 1; + } else if (IsContest()) { + BG3CNT.size = 0; + BG3CNT.overflow = 1; + } else { + BG3CNT.size = 1; + BG3CNT.overflow = 0; + } +} + +void sub_8078A34(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x; + sprite->data3 = sprite->pos1.y; + sub_8078A5C(sprite); + sprite->callback = sub_80783D0; + sprite->callback(sprite); +} + +void sub_8078A5C(struct Sprite *sprite) { + s16 x = (sprite->data2 - sprite->data1) << 8; + s16 y = (sprite->data4 - sprite->data3) << 8; + sprite->data1 = x / sprite->data0; + sprite->data2 = y / sprite->data0; + sprite->data4 = 0; + sprite->data3 = 0; +} + +void obj_translate_based_on_private_1_2_3_4(struct Sprite *sprite) { + int x = sprite->data2 - sprite->data1; + int y = sprite->data4 - sprite->data3; + bool8 r8 = x < 0; + bool8 r9 = y < 0; + u16 x2 = abs(x) << 8; + u16 y2 = abs(y) << 8; + x2 = x2 / sprite->data0; + y2 = y2 / sprite->data0; + if (r8) { + x2 |= 1; + } else { + x2 &= ~1; + } + if (r9) { + y2 |= 1; + } else { + y2 &= ~1; + } + sprite->data1 = x2; + sprite->data2 = y2; + sprite->data4 = 0; + sprite->data3 = 0; +} + +void sub_8078B34(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x; + sprite->data3 = sprite->pos1.y; + obj_translate_based_on_private_1_2_3_4(sprite); + sprite->callback = sub_8078BB8; + sprite->callback(sprite); +} + +bool8 sub_8078B5C(struct Sprite *sprite) { + u16 v1, v2, x, y; + if (!sprite->data0) { + return TRUE; + } + v1 = sprite->data1; + v2 = sprite->data2; + x = sprite->data3; + y = sprite->data4; + x += v1; + y += v2; + if (v1 & 1) { + sprite->pos2.x = -(x >> 8); + } else { + sprite->pos2.x = x >> 8; + } + if (v2 & 1) { + sprite->pos2.y = -(y >> 8); + } else { + sprite->pos2.y = y >> 8; + } + sprite->data3 = x; + sprite->data4 = y; + sprite->data0--; + return FALSE; +} + +void sub_8078BB8(struct Sprite *sprite) { + if (sub_8078B5C(sprite)) { + SetCallbackToStoredInData6(sprite); + } +} + +void sub_8078BD4(struct Sprite *sprite) { + int v1 = abs(sprite->data2 - sprite->data1) << 8; + sprite->data0 = v1 / sprite->data0; + obj_translate_based_on_private_1_2_3_4(sprite); +} + +void sub_8078C00(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x; + sprite->data3 = sprite->pos1.y; + sub_8078BD4(sprite); + sprite->callback = sub_8078BB8; + sprite->callback(sprite); +} + +void sub_8078C28(struct Sprite *sprite) { + int x = sprite->data2 - sprite->data1; + int y = sprite->data4 - sprite->data3; + bool8 x_sign = x < 0; + bool8 y_sign = y < 0; + u16 x2 = abs(x) << 4; + u16 y2 = abs(y) << 4; + x2 /= sprite->data0; + y2 /= sprite->data0; + if (x_sign) { + x2 |= 1; + } else { + x2 &= ~1; + } + if (y_sign) { + y2 |= 1; + } else { + y2 &= ~1; + } + sprite->data1 = x2; + sprite->data2 = y2; + sprite->data4 = 0; + sprite->data3 = 0; +} + +void sub_8078CC0(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x; + sprite->data3 = sprite->pos1.y; + sub_8078C28(sprite); + sprite->callback = sub_8078D44; + sprite->callback(sprite); +} + +bool8 sub_8078CE8(struct Sprite *sprite) { + u16 v1, v2, x, y; + if (!sprite->data0) { + return TRUE; + } + v1 = sprite->data1; + v2 = sprite->data2; + x = sprite->data3; + y = sprite->data4; + x += v1; + y += v2; + if (v1 & 1) { + sprite->pos2.x = -(x >> 4); + } else { + sprite->pos2.x = x >> 4; + } + if (v2 & 1) { + sprite->pos2.y = -(y >> 4); + } else { + sprite->pos2.y = y >> 4; + } + sprite->data3 = x; + sprite->data4 = y; + sprite->data0--; + return FALSE; +} + +void sub_8078D44(struct Sprite *sprite) { + if (sub_8078CE8(sprite)) { + SetCallbackToStoredInData6(sprite); + } +} + +void sub_8078D60(struct Sprite *sprite) { + int v1 = abs(sprite->data2 - sprite->data1) << 4; + sprite->data0 = v1 / sprite->data0; + sub_8078C28(sprite); +} + +void sub_8078D8C(struct Sprite *sprite) { + sprite->data1 = sprite->pos1.x; + sprite->data3 = sprite->pos1.y; + sub_8078D60(sprite); + sprite->callback = sub_8078D44; + sprite->callback(sprite); +} + +void obj_id_set_rotscale(u8 sprite, s16 xScale, s16 yScale, u16 rotation) { + int i; + struct ObjAffineSrcData src; + struct OamMatrix matrix; + src.xScale = xScale; + src.yScale = yScale; + src.rotation = rotation; + if (sub_8078E38()) { + src.xScale = -src.xScale; + } + i = gSprites[sprite].oam.matrixNum; + ObjAffineSet(&src, &matrix, 1, 2); + gOamMatrices[i].a = matrix.a; + gOamMatrices[i].b = matrix.b; + gOamMatrices[i].c = matrix.c; + gOamMatrices[i].d = matrix.d; +} + +bool8 sub_8078E38() { + if (IsContest()) { + if (gSprites[GetAnimBankSpriteId(0)].data2 == 0xc9 /* XXX SPECIES_UNOWN? */) { + return FALSE; + } + return TRUE; + } + return FALSE; +} + +void sub_8078E70(u8 sprite, u8 a2) { + struct Struct_2017810 *unk; + u8 r7 = gSprites[sprite].data0; + if (IsContest() || IsAnimBankSpriteVisible(r7)) { + gSprites[sprite].invisible = FALSE; + } + gSprites[sprite].oam.objMode = a2; + gSprites[sprite].affineAnimPaused = TRUE; + if (!IsContest() && !gSprites[sprite].oam.affineMode) { + unk = &unk_2017810[r7]; + gSprites[sprite].oam.matrixNum = unk->field_6; + } + gSprites[sprite].oam.affineMode = 3; + CalcCenterToCornerVec(&gSprites[sprite], gSprites[sprite].oam.shape, gSprites[sprite].oam.size, gSprites[sprite].oam.affineMode); +} + +void sub_8078F40(u8 sprite) { + obj_id_set_rotscale(sprite, 0x100, 0x100, 0); + gSprites[sprite].oam.affineMode = 1; + gSprites[sprite].oam.objMode = 0; + gSprites[sprite].affineAnimPaused = FALSE; + CalcCenterToCornerVec(&gSprites[sprite], gSprites[sprite].oam.shape, gSprites[sprite].oam.size, gSprites[sprite].oam.affineMode); +} + +void sub_8078F9C(u8 sprite) { + u16 matrix = gSprites[sprite].oam.matrixNum; + s16 c = gOamMatrices[matrix].c; + if (c < 0) { + c = -c; + } + gSprites[sprite].pos2.y = c >> 3; +} + +// related to obj_id_set_rotscale +void sub_8078FDC(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 rotation) { + int i; + struct ObjAffineSrcData src; + struct OamMatrix matrix; + if (sprite->oam.affineMode & 1) { + sprite->affineAnimPaused = TRUE; + if (a2) { + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); + } + src.xScale = xScale; + src.yScale = yScale; + src.rotation = rotation; + if (sub_8078E38()) { + src.xScale = -src.xScale; + } + i = sprite->oam.matrixNum; + ObjAffineSet(&src, &matrix, 1, 2); + gOamMatrices[i].a = matrix.a; + gOamMatrices[i].b = matrix.b; + gOamMatrices[i].c = matrix.c; + gOamMatrices[i].d = matrix.d; + } +} + +void sub_8079098(struct Sprite *sprite) { + sub_8078FDC(sprite, TRUE, 0x100, 0x100, 0); + sprite->affineAnimPaused = FALSE; + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); +} + +static u16 ArcTan2_(s16 a, s16 b) { + return ArcTan2(a, b); +} + +u16 sub_80790F0(s16 a, s16 b) { + u16 var = ArcTan2_(a, b); + return -var; +} + +void sub_8079108(u16 a1, bool8 a2) { + int i; + struct Color *c; + struct Color *c2; + u16 average; + + a1 *= 0x10; + + if (!a2) { + for (i = 0; i < 0x10; i++) { + c = (struct Color *)&gPlttBufferUnfaded[a1 + i]; + average = c->r + c->g + c->b; + average /= 3; + + c2 = (struct Color *)&gPlttBufferFaded[a1 + i]; + c2->r = average; + c2->g = average; + c2->b = average; + } + } else { + CpuCopy32(&gPlttBufferUnfaded[a1], &gPlttBufferFaded[a1], 0x20); + } +} + +u32 sub_80791A8(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) { + u32 var = 0; + u32 shift; + if (a1) { + if (!IsContest()) { + var = 0xe; + } else { + var = 1 << sub_80789BC(); + } + } + if (a2) { + shift = gBattleAnimBankAttacker + 16; + var |= 1 << shift; + } + if (a3) { + shift = gBattleAnimBankTarget + 16; + var |= 1 << shift; + } + if (a4) { + if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { + shift = (gBattleAnimBankAttacker ^ 2) + 16; + var |= 1 << shift; + } + } + if (a5) { + if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { + shift = (gBattleAnimBankTarget ^ 2) + 16; + var |= 1 << shift; + } + } + if (a6) { + if (!IsContest()) { + var |= 0x100; + } else { + var |= 0x4000; + } + } + if (a7) { + if (!IsContest()) { + var |= 0x200; + } + } + return var; +} + +u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4) { + u32 var = 0; + u32 shift; + if (IsContest()) { + if (a1) { + var |= 1 << 18; + return var; + } + } else { + if (a1) { + if (IsAnimBankSpriteVisible(GetBankByPlayerAI(0))) { + var |= 1 << (GetBankByPlayerAI(0) + 16); + } + } + if (a2) { + if (IsAnimBankSpriteVisible(GetBankByPlayerAI(2))) { + shift = GetBankByPlayerAI(2) + 16; + var |= 1 << shift; + } + } + if (a3) { + if (IsAnimBankSpriteVisible(GetBankByPlayerAI(1))) { + shift = GetBankByPlayerAI(1) + 16; + var |= 1 << shift; + } + } + if (a4) { + if (IsAnimBankSpriteVisible(GetBankByPlayerAI(3))) { + shift = GetBankByPlayerAI(3) + 16; + var |= 1 << shift; + } + } + } + return var; +} + +u8 sub_80793A8(u8 a1) { + return a1; +} + +u8 unref_sub_80793B0(u8 a1) { + return GetBankByPlayerAI(a1); +} + +void sub_80793C4(struct Sprite *sprite) { + bool8 var; + if (!sprite->data0) { + if (!gBattleAnimArgs[3]) { + var = TRUE; + } else { + var = FALSE; + } + if (!gBattleAnimArgs[2]) { + sub_80787B0(sprite, var); + } else { + sub_8078764(sprite, var); + } + sprite->data0++; + + } else if (sprite->animEnded || sprite->affineAnimEnded) { + move_anim_8074EE0(sprite); + } +} + +void sub_807941C(struct Sprite *sprite) { + bool8 v1; + u8 v2; + if (!(gBattleAnimArgs[5] & 0xff00)) { + v1 = TRUE; + } else { + v1 = FALSE; + } + if (!(gBattleAnimArgs[5] & 0xff)) { + v2 = 3; + } else { + v2 = 1; + } + sub_80787B0(sprite, v1); + if (GetBankSide(gBattleAnimBankAttacker)) { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + sprite->data0 = gBattleAnimArgs[4]; + sprite->data2 = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data4 = sub_8077ABC(gBattleAnimBankTarget, v2) + gBattleAnimArgs[3]; + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData6(sprite, move_anim_8072740); +} + +void sub_80794A8(struct Sprite *sprite) { + sub_80787B0(sprite, 1); + if (GetBankSide(gBattleAnimBankAttacker)) { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + sprite->data0 = gBattleAnimArgs[4]; + sprite->data2 = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data4 = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[3]; + sprite->data5 = gBattleAnimArgs[5]; + sub_80786EC(sprite); + sprite->callback = sub_8079518; +} + +void sub_8079518(struct Sprite *sprite) { + if (sub_8078718(sprite)) { + move_anim_8072740(sprite); + } +} + +void sub_8079534(struct Sprite *sprite) { + u8 r4, slot, r7; + if (!gBattleAnimArgs[6]) { + r4 = 1; + r7 = 3; + } else { + r4 = 0; + r7 = 1; + } + if (!gBattleAnimArgs[5]) { + sub_80787B0(sprite, r4); + slot = gBattleAnimBankAttacker; + } else { + sub_8078764(sprite, r4); + slot = gBattleAnimBankTarget; + } + if (GetBankSide(gBattleAnimBankAttacker)) { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + sub_8078764(sprite, r4); + sprite->data0 = gBattleAnimArgs[4]; + sprite->data2 = sub_8077ABC(slot, 2) + gBattleAnimArgs[2]; + sprite->data4 = sub_8077ABC(slot, r7) + gBattleAnimArgs[3]; + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData6(sprite, move_anim_8072740); +} + +s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 a1) { + u16 i; + u8 sprite = GetAnimBankSpriteId(a1); + if (sprite != 0xff) { + for (i = 0; i < 0x40; i++) { + if (gSprites[i].inUse) { + continue; + } + gSprites[i] = gSprites[sprite]; + gSprites[i].oam.objMode = 1; + gSprites[i].invisible = FALSE; + return i; + } + } + return -1; +} + +void obj_delete_but_dont_free_vram(struct Sprite *sprite) { + sprite->usingSheet = TRUE; + DestroySprite(sprite); +} + +void sub_8079670(u8 task) { + s16 v1 = 0; + s16 v2 = 0; + if (gBattleAnimArgs[2] > gBattleAnimArgs[0]) { + v2 = 1; + } + if (gBattleAnimArgs[2] < gBattleAnimArgs[0]) { + v2 = -1; + } + if (gBattleAnimArgs[3] > gBattleAnimArgs[1]) { + v1 = 1; + } + if (gBattleAnimArgs[3] < gBattleAnimArgs[1]) { + v1 = -1; + } + gTasks[task].data[0] = 0; + gTasks[task].data[1] = gBattleAnimArgs[4]; + gTasks[task].data[2] = 0; + gTasks[task].data[3] = gBattleAnimArgs[0]; + gTasks[task].data[4] = gBattleAnimArgs[1]; + gTasks[task].data[5] = v2; + gTasks[task].data[6] = v1; + gTasks[task].data[7] = gBattleAnimArgs[2]; + gTasks[task].data[8] = gBattleAnimArgs[3]; + REG_BLDALPHA = (gBattleAnimArgs[1] << 8) | gBattleAnimArgs[0]; + gTasks[task].func = sub_80796F8; +} + +void sub_80796F8(u8 taskId) { + struct Task *task = &gTasks[taskId]; + if (++task->data[0] > task->data[1]) { + task->data[0] = 0; + if (++task->data[2] & 1) { + if (task->data[3] != task->data[7]) { + task->data[3] += task->data[5]; + } + } else { + if (task->data[4] != task->data[8]) { + task->data[4] += task->data[6]; + } + } + REG_BLDALPHA = (task->data[4] << 8) | task->data[3]; + if (task->data[3] == task->data[7] && task->data[4] == task->data[8]) { + DestroyAnimVisualTask(taskId); + return; + } + } +} + +void sub_8079790(u8 task) { + u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); + if (sprite == 0xff) { + DestroyAnimVisualTask(task); + return; + } + gTasks[task].data[0] = (gSprites[sprite].oam.paletteNum * 0x10) + 0x101; + sub_80797EC(&gTasks[task]); +} + +void sub_80797EC(struct Task *task) { + task->data[1] = gBattleAnimArgs[1]; + task->data[2] = 0; + task->data[3] = gBattleAnimArgs[2]; + task->data[4] = 0; + task->data[5] = gBattleAnimArgs[3]; + task->data[6] = 0; + task->data[7] = gBattleAnimArgs[4]; + task->func = sub_8079814; +} + +void sub_8079814(u8 taskId) { + struct Task *task = &gTasks[taskId]; + if (++task->data[4] >= task->data[5]) { + task->data[4] = 0; + if (!task->data[6]) { + task->data[2]++; + BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]); + if (task->data[2] == task->data[3]) { + task->data[6] = 1; + } + } else { + task->data[2]--; + BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]); + if (!task->data[2]) { + if (--task->data[7]) { + task->data[4] = 0; + task->data[6] = 0; + } else { + DestroyAnimVisualTask(taskId); + return; + } + } + } + } +} + +void sub_80798AC(u8 task) { + u8 palette = IndexOfSpritePaletteTag(gBattleAnimArgs[0]); + if (palette == 0xff) { + DestroyAnimVisualTask(task); + return; + } + gTasks[task].data[0] = (palette * 0x10) + 0x101; + sub_80797EC(&gTasks[task]); +} + +void sub_80798F4(struct Task *task, u8 a2, void *a3) { + task->data[7] = 0; + task->data[8] = 0; + task->data[9] = 0; + task->data[15] = a2; + task->data[10] = 0x100; + task->data[11] = 0x100; + task->data[12] = 0; + sub_8079BF4(&task->data[13], &task->data[14], a3); + sub_8078E70(a2, 0); +} + +bool8 sub_807992C(struct Task *task) { + gUnknown_0202F7D4 = sub_8079BFC(task->data[13], task->data[14]) + (task->data[7] << 3); + switch (gUnknown_0202F7D4->type) { + default: + if (!gUnknown_0202F7D4->frame.duration) { + task->data[10] = gUnknown_0202F7D4->frame.xScale; + task->data[11] = gUnknown_0202F7D4->frame.yScale; + task->data[12] = gUnknown_0202F7D4->frame.rotation; + task->data[7]++; + gUnknown_0202F7D4++; + } + task->data[10] += gUnknown_0202F7D4->frame.xScale; + task->data[11] += gUnknown_0202F7D4->frame.yScale; + task->data[12] += gUnknown_0202F7D4->frame.rotation; + obj_id_set_rotscale(task->data[15], task->data[10], task->data[11], task->data[12]); + sub_8079A64(task->data[15]); + if (++task->data[8] >= gUnknown_0202F7D4->frame.duration) { + task->data[8] = 0; + task->data[7]++; + } + break; + + case AFFINEANIMCMDTYPE_JUMP: + task->data[7] = gUnknown_0202F7D4->jump.target; + break; + + case AFFINEANIMCMDTYPE_LOOP: + if (gUnknown_0202F7D4->loop.count) { + if (task->data[9]) { + if (!--task->data[9]) { + task->data[7]++; + break; + } + } else { + task->data[9] = gUnknown_0202F7D4->loop.count; + } + if (!task->data[7]) { + break; + } + for (;;) { + task->data[7]--; + gUnknown_0202F7D4--; + if (gUnknown_0202F7D4->type == AFFINEANIMCMDTYPE_LOOP) { + task->data[7]++; + return TRUE; + } + if (!task->data[7]) { + return TRUE; + } + } + } + task->data[7]++; + break; + + case 0x7fff: + gSprites[task->data[15]].pos2.y = 0; + sub_8078F40(task->data[15]); + return FALSE; + } + + return TRUE; +} + +void sub_8079A64(u8 sprite) { + int var = 0x40 - sub_8079B10(sprite) * 2; + u16 matrix = gSprites[sprite].oam.matrixNum; + int var2 = (var << 8) / gOamMatrices[matrix].d; + if (var2 > 0x80) { + var2 = 0x80; + } + gSprites[sprite].pos2.y = (var - var2) / 2; +} + +void sub_8079AB8(u8 sprite, u8 sprite2) { + int var = 0x40 - sub_8079B10(sprite2) * 2; + u16 matrix = gSprites[sprite].oam.matrixNum; + int var2 = (var << 8) / gOamMatrices[matrix].d; + if (var2 > 0x80) { + var2 = 0x80; + } + gSprites[sprite].pos2.y = (var - var2) / 2; +} + +u16 sub_8079B10(u8 sprite) { + struct TransformStatus *transform; + u8 slot = gSprites[sprite].data0; + u16 species; + u16 i; + for (i = 0; i < (sizeof(gBattleMonSprites) / sizeof(u8)); i++) { + if (gBattleMonSprites[i] == sprite) { + if (IsContest()) { + species = unk_2019348.field_0; + return gMonBackPicCoords[species].y_offset; + } else { + if (!GetBankSide(i)) { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[i]], MON_DATA_SPECIES); + } else { + species = transform->species; + } + return gMonBackPicCoords[species].y_offset; + } else { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[i]], MON_DATA_SPECIES); + } else { + species = transform->species; + } + return gMonFrontPicCoords[species].y_offset; + } + } + } + } + return 0x40; +} + +void sub_8079BF4(s16 *bottom, s16 *top, void *ptr) { + *bottom = ((intptr_t) ptr) & 0xffff; + *top = (((intptr_t) ptr) >> 16) & 0xffff; +} + +void *sub_8079BFC(s16 bottom, s16 top) { + return (void *)((u16)bottom | ((u16)top << 16)); +} + + +// possible new file + +void sub_8079C08(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7) { + task->data[8] = a7; + task->data[15] = a2; + task->data[9] = a3; + task->data[10] = a4; + task->data[13] = a5; + task->data[14] = a6; + task->data[11] = (a5 - a3) / a7; + task->data[12] = (a6 - a4) / a7; +} + +u8 sub_8079C74(struct Task *task) { + if (!task->data[8]) { + return 0; + } + if (--task->data[8]) { + task->data[9] += task->data[11]; + task->data[10] += task->data[12]; + } else { + task->data[9] = task->data[13]; + task->data[10] = task->data[14]; + } + obj_id_set_rotscale(task->data[15], task->data[9], task->data[10], 0); + if (task->data[8]) { + sub_8079A64(task->data[15]); + } else { + gSprites[task->data[15]].pos2.y = 0; + } + return task->data[8]; +} + +void sub_8079CEC(u8 task) { + u16 v1; + if (gHappinessMoveAnim <= 30) { + v1 = 0; + } else if (gHappinessMoveAnim <= 100) { + v1 = 1; + } else if (gHappinessMoveAnim <= 200) { + v1 = 2; + } else { + v1 = 3; + } + gBattleAnimArgs[7] = v1; + DestroyAnimVisualTask(task); +} + +void unref_sub_8079D20(u8 priority) { + if (IsAnimBankSpriteVisible(gBattleAnimBankTarget)) { + gSprites[gBattleMonSprites[gBattleAnimBankTarget]].oam.priority = priority; + } + if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker)) { + gSprites[gBattleMonSprites[gBattleAnimBankAttacker]].oam.priority = priority; + } + if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { + gSprites[gBattleMonSprites[gBattleAnimBankTarget ^ 2]].oam.priority = priority; + } + if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { + gSprites[gBattleMonSprites[gBattleAnimBankAttacker ^ 2]].oam.priority = priority; + } +} + +void sub_8079E24() { + int i; + for (i = 0; i < gNoOfAllBanks; i++) { + if (IsAnimBankSpriteVisible(i)) { + gSprites[gBattleMonSprites[i]].subpriority = sub_8079E90(i); + gSprites[gBattleMonSprites[i]].oam.priority = 2; + } + } +} + +u8 sub_8079E90(u8 slot) { + u8 status; + u8 ret; + if (IsContest()) { + if (slot == 2) { + return 30; + } else { + return 40; + } + } else { + status = GetBankIdentity(slot); + if (status == 0) { + ret = 30; + } else if (status == 2) { + ret = 20; + } else if (status == 1) { + ret = 40; + } else { + ret = 50; + } + } + return ret; +} + +u8 sub_8079ED4(u8 slot) { + u8 status = GetBankIdentity(slot); + if (IsContest()) { + return 2; + } + if (status == 0 || status == 3) { + return BG2CNT.priority; + } else { + return BG1CNT.priority; + } +} + +u8 GetBankIdentity_permutated(u8 slot) { + u8 status; + if (!IsContest()) { + status = GetBankIdentity(slot); + if (status == 0 || status == 3) { + return 2; + } else { + return 1; + } + } + return 1; +} + +u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, u32 a8) { + void *src; + void *dest; + int size; + + u8 sprite; + u16 sheet = LoadSpriteSheet(&gUnknown_0837F5E0[a3]); + u16 palette = AllocSpritePalette(gSpriteTemplate_837F5B0[a3].paletteTag); + if (!isBackpic) { + LoadCompressedPalette(GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20); + LoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, + gMonFrontPicCoords[species].y_offset, + 0x2000000, + (void *)0x2000000, + species, + a7, + 1 + ); + } else { + LoadCompressedPalette( + GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20); + LoadSpecialPokePic( + &gMonBackPicTable[species], + gMonBackPicCoords[species].coords, + gMonBackPicCoords[species].y_offset, + 0x2000000, + (void *)0x2000000, + species, + a7, + 0 + ); + } + + src = (void *)0x2000000; + dest = (void *)(0x6010000 + (sheet * 0x20)); + size = 0x800; + DmaCopy32(3, src, dest, size); + + if (!isBackpic) { + sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonFrontPicCoords[species].y_offset, a6); + } else { + sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonBackPicCoords[species].y_offset, a6); + } + if (IsContest()) { + gSprites[sprite].affineAnims = &gSpriteAffineAnimTable_81E7C18; + StartSpriteAffineAnim(&gSprites[sprite], 0); + } + return sprite; +} + +void sub_807A0F4(struct Sprite *sprite) { + DestroySpriteAndFreeResources(sprite); +} + +int sub_807A100(u8 slot, u8 a2) { + u16 species; + u32 personality; + u16 letter; + u16 var; + int ret; + const struct MonCoords *coords; + struct TransformStatus *transform; + if (IsContest()) { + if (unk_2019348.field_4 & 1) { + species = unk_2019348.field_2; + personality = unk_2019348.field_10; + } else { + species = unk_2019348.field_0; + personality = unk_2019348.field_8; + } + if (species == SPECIES_UNOWN) { + letter = GET_UNOWN_LETTER(personality); + if (!letter) { + var = SPECIES_UNOWN; + } else { + var = letter + SPECIES_UNOWN_B - 1; + } + coords = &gMonBackPicCoords[var]; + } else if (species == SPECIES_CASTFORM) { + coords = &gCastformFrontSpriteCoords[gBattleMonForms[slot]]; + } else if (species <= SPECIES_EGG) { + coords = &gMonBackPicCoords[species]; + } else { + coords = &gMonBackPicCoords[0]; + } + } else { + if (!GetBankSide(slot)) { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); + personality = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); + } else { + species = transform->species; + personality = gTransformPersonalities[slot]; + } + if (species == SPECIES_UNOWN) { + letter = GET_UNOWN_LETTER(personality); + if (!letter) { + var = SPECIES_UNOWN; + } else { + var = letter + SPECIES_UNOWN_B - 1; + } + coords = &gMonBackPicCoords[var]; + } else if (species > SPECIES_EGG) { + coords = &gMonBackPicCoords[0]; + } else { + coords = &gMonBackPicCoords[species]; + } + } else { + transform = &gTransformStatuses[slot]; + if (!transform->species) { + species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES); + personality = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY); + } else { + species = transform->species; + personality = gTransformPersonalities[slot]; + } + if (species == SPECIES_UNOWN) { + letter = GET_UNOWN_LETTER(personality); + if (!letter) { + var = SPECIES_UNOWN; + } else { + var = letter + SPECIES_UNOWN_B - 1; + } + coords = &gMonFrontPicCoords[var]; + } else if (species == SPECIES_CASTFORM) { + coords = &gCastformFrontSpriteCoords[gBattleMonForms[slot]]; + } else if (species > SPECIES_EGG) { + coords = &gMonFrontPicCoords[0]; + } else { + coords = &gMonFrontPicCoords[species]; + } + } + } + + switch (a2) { + case 0: + return (coords->coords & 0xf) * 8; + case 1: + return (coords->coords >> 4) * 8; + case 4: + return sub_8077ABC(slot, 2) - ((coords->coords >> 4) * 4); + case 5: + return sub_8077ABC(slot, 2) + ((coords->coords >> 4) * 4); + case 2: + return sub_8077ABC(slot, 3) - ((coords->coords & 0xf) * 4); + case 3: + return sub_8077ABC(slot, 3) + ((coords->coords & 0xf) * 4); + case 6: + ret = sub_8077ABC(slot, 1) + 0x1f; + return ret - coords->y_offset; + default: + return 0; + } +} + +void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4) { + u8 v1, v2; + s16 v3, v4; + s16 v5, v6; + if (!a2) { + v1 = 0; + v2 = 1; + } else { + v1 = 2; + v2 = 3; + } + v3 = sub_8077ABC(slot, v1); + v4 = sub_8077ABC(slot, v2); + if (IsDoubleBattle() && !IsContest()) { + v5 = sub_8077ABC(slot ^ 2, v1); + v6 = sub_8077ABC(slot ^ 2, v2); + } else { + v5 = v3; + v6 = v4; + } + *a3 = (v3 + v5) / 2; + *a4 = (v4 + v6) / 2; +} + +u8 sub_807A4A0(int a1, u8 sprite, int a3) { + u8 new_sprite = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); + gSprites[new_sprite] = gSprites[sprite]; + gSprites[new_sprite].usingSheet = TRUE; + gSprites[new_sprite].oam.priority = 0; + gSprites[new_sprite].oam.objMode = 2; + gSprites[new_sprite].oam.tileNum = gSprites[sprite].oam.tileNum; + gSprites[new_sprite].callback = SpriteCallbackDummy; + return new_sprite; +} + +void sub_807A544(struct Sprite *sprite) { + sub_8078650(sprite); + if (GetBankSide(gBattleAnimBankAttacker)) { + sprite->pos1.x -= gBattleAnimArgs[0]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + sprite->hFlip = TRUE; + } else { + sprite->pos1.x += gBattleAnimArgs[0]; + } + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data0 = gBattleAnimArgs[2]; + sprite->data1 = gBattleAnimArgs[3]; + sprite->data3 = gBattleAnimArgs[4]; + sprite->data5 = gBattleAnimArgs[5]; + StoreSpriteCallbackInData6(sprite, move_anim_8074EE0); + sprite->callback = sub_8078504; +} + +void sub_807A5C4(struct Sprite *sprite) { + if (GetBankSide(gBattleAnimBankAttacker)) { + sprite->pos1.x -= gBattleAnimArgs[0]; + gBattleAnimArgs[3] *= -1; + } else { + sprite->pos1.x += gBattleAnimArgs[0]; + } + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data0 = gBattleAnimArgs[2]; + sprite->data1 = gBattleAnimArgs[3]; + sprite->data3 = gBattleAnimArgs[4]; + sprite->data5 = gBattleAnimArgs[5]; + StartSpriteAnim(sprite, gBattleAnimArgs[6]); + StoreSpriteCallbackInData6(sprite, move_anim_8074EE0); + sprite->callback = sub_8078504; +} + +void sub_807A63C(struct Sprite *sprite) { + sub_8078650(sprite); + if (GetBankSide(gBattleAnimBankAttacker)) { + sprite->pos1.x -= gBattleAnimArgs[0]; + } else { + sprite->pos1.x += gBattleAnimArgs[0]; + } + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->callback = sub_8078600; + StoreSpriteCallbackInData6(sprite, move_anim_8072740); +} + +void sub_807A69C(u8 taskId) { + u16 src; + u16 dest; + struct Task *task = &gTasks[taskId]; + task->data[0] = GetAnimBankSpriteId(0); + task->data[1] = (GetBankSide(gBattleAnimBankAttacker)) ? -8 : 8; + task->data[2] = 0; + task->data[3] = 0; + gSprites[task->data[0]].pos2.x -= task->data[0]; + task->data[4] = AllocSpritePalette(10097); + task->data[5] = 0; + + dest = (task->data[4] + 0x10) * 0x10; + src = (gSprites[task->data[0]].oam.paletteNum + 0x10) * 0x10; + task->data[6] = sub_8079E90(gBattleAnimBankAttacker); + if (task->data[6] == 20 || task->data[6] == 40) { + task->data[6] = 2; + } else { + task->data[6] = 3; + } + CpuCopy32(&gPlttBufferUnfaded[src], &gPlttBufferFaded[dest], 0x20); + BlendPalette(dest, 0x10, gBattleAnimArgs[1], gBattleAnimArgs[0]); + task->func = sub_807A784; +} + +void sub_807A784(u8 taskId) { + struct Task *task = &gTasks[taskId]; + switch (task->data[2]) { + case 0: + sub_807A850(task, taskId); + gSprites[task->data[0]].pos2.x += task->data[1]; + if (++task->data[3] == 5) { + task->data[3]--; + task->data[2]++; + } + break; + case 1: + sub_807A850(task, taskId); + gSprites[task->data[0]].pos2.x -= task->data[1]; + if (--task->data[3] == 0) { + gSprites[task->data[0]].pos2.x = 0; + task->data[2]++; + } + break; + case 2: + if (!task->data[5]) { + FreeSpritePaletteByTag(10097); + DestroyAnimVisualTask(taskId); + } + break; + } +} + +void sub_807A850(struct Task *task, u8 taskId) { + s16 sprite = duplicate_obj_of_side_rel2move_in_transparent_mode(0); + if (sprite >= 0) { + gSprites[sprite].oam.priority = task->data[6]; + gSprites[sprite].oam.paletteNum = task->data[4]; + gSprites[sprite].data0 = 8; + gSprites[sprite].data1 = taskId; + gSprites[sprite].data2 = sprite; + gSprites[sprite].pos2.x = gSprites[task->data[0]].pos2.x; + gSprites[sprite].callback = sub_807A8D4; + task->data[5]++; + } +} + +void sub_807A8D4(struct Sprite *sprite) { + if (--sprite->data0 == 0) { + gTasks[sprite->data1].data[5]--; + obj_delete_but_dont_free_vram(sprite); + } +} + +void sub_807A908(struct Sprite *sprite) { + sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2); + sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3); + if (!GetBankSide(gBattleAnimBankAttacker)) { + sprite->data0 = 5; + } else { + sprite->data0 = -10; + } + sprite->data1 = -40; + sprite->callback = sub_807A960; +} + +void sub_807A960(struct Sprite *sprite) { + sprite->data2 += sprite->data0; + sprite->data3 += sprite->data1; + sprite->pos2.x = sprite->data2 / 10; + sprite->pos2.y = sprite->data3 / 10; + if (sprite->data1 < -20) { + sprite->data1++; + } + if ((sprite->pos1.y + sprite->pos2.y) < -32) { + move_anim_8072740(sprite); + } +} + +void sub_807A9BC(struct Sprite *sprite) { + int x; + sprite->data0 = gBattleAnimArgs[2]; + sprite->data2 = sprite->pos1.x + gBattleAnimArgs[4]; + sprite->data4 = sprite->pos1.y + gBattleAnimArgs[5]; + if (!GetBankSide(gBattleAnimBankTarget)) { + x = (u16)gBattleAnimArgs[4] + 30; + sprite->pos1.x += x; + sprite->pos1.y = gBattleAnimArgs[5] - 20; + } else { + x = (u16)gBattleAnimArgs[4] - 30; + sprite->pos1.x += x; + sprite->pos1.y = gBattleAnimArgs[5] - 80; + } + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData6(sprite, move_anim_8072740); +} diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c new file mode 100644 index 000000000..f98293a90 --- /dev/null +++ b/src/script_pokemon_util_80C4BF0.c @@ -0,0 +1,714 @@ +#include "global.h" +#include "battle.h" +#include "berry.h" +#include "choose_party.h" +#include "contest.h" +#include "contest_link_80C2020.h" +#include "contest_painting.h" +#include "data2.h" +#include "daycare.h" +#include "debug.h" +#include "decompress.h" +#include "event_data.h" +#include "items.h" +#include "link.h" +#include "load_save.h" +#include "main.h" +#include "menu.h" +#include "pokedex.h" +#include "pokemon.h" +#include "rng.h" +#include "overworld.h" +#include "script_pokemon_80C4.h" +#include "species.h" +#include "task.h" + +#define CONTEST_ENTRY_PIC_LEFT 10 +#define CONTEST_ENTRY_PIC_TOP 3 + +extern struct SpriteTemplate gUnknown_02024E8C; + +extern u8 gContestPlayerMonIndex; +extern u8 gIsLinkContest; +extern u8 gPlayerPartyCount; +extern u8 gSelectedOrderFromParty[]; + +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; + +extern u16 gScriptContestCategory; +extern u16 gScriptContestRank; +extern u16 gScriptResult; + +extern u32 gUnknown_03005D28; + +extern u8 gUnknown_02038694; +extern u8 gUnknown_0203856C; +extern u8 gUnknown_02038690[]; +extern u16 gUnknown_02038678[]; + +void sub_80C4BF0(void) +{ + gSaveBlock1.vars[0x10] = gContestMons[0].unk16; + gSaveBlock1.vars[0x11] = gContestMons[1].unk16; + gSaveBlock1.vars[0x12] = gContestMons[2].unk16; +} + +void sub_80C4C28(void) +{ + u16 var; + u8 specialVar = gSpecialVar_0x8005; + + switch(specialVar) + { + case 0: + var = 3; + break; + case 1: + var = 4; + break; + case 2: + var = 5; + break; + default: + var = 100; + break; + } + gSpecialVar_0x8004 = var; +} + +void sub_80C4C64(void) +{ + sub_80C46EC(); + sub_80C4740(); + sub_80C48F4(); +} + +void sub_80C4C78(void) +{ + u16 var; + u16 returnVar; + + switch(gScriptContestCategory) + { + case 0: + var = 8; + break; + case 1: + var = 9; + break; + case 2: + var = 10; + break; + case 3: + var = 11; + break; + case 4: + default: + var = 12; + break; + } + + returnVar = gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[var].var; + + if(returnVar == 0) + gSpecialVar_0x8004 = returnVar; + else + gSpecialVar_0x8004 = 1; +} + +void sub_80C4CEC(void) +{ + sub_80B2A7C(0xFF); +} + +void sub_80C4CF8(void) +{ + if(!gUnknown_02038690[gContestPlayerMonIndex] + && gScriptContestRank == 3 + && (s16)gUnknown_02038678[gContestPlayerMonIndex] >= 800) + { + gSpecialVar_0x8004 = 1; + } + else + { + gSpecialVar_0x8004 = 0; + } +} + +u8 sub_80C4D50(void) +{ + u8 retVar = 0; + int i; + + for (i = 0; i < 5; i++) + if (gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[i + 8].var) + retVar++; + + return retVar; +} + +// nope. too hard +__attribute__((naked)) +void sub_80C4D80(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + ldr r0, _080C4EA0 @ =gUnknown_02038670\n\ + mov r12, r0\n\ + ldr r1, _080C4EA4 @ =gSpecialVar_0x8006\n\ + mov r8, r1\n\ + ldr r2, _080C4EA8 @ =gStringVar1\n\ + mov r9, r2\n\ + mov r2, r12\n\ + mov r1, sp\n\ + movs r6, 0x3\n\ +_080C4D9E:\n\ + ldrh r0, [r2]\n\ + strh r0, [r1]\n\ + adds r2, 0x2\n\ + adds r1, 0x2\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _080C4D9E\n\ + movs r6, 0\n\ +_080C4DAE:\n\ + movs r1, 0x3\n\ + cmp r1, r6\n\ + ble _080C4DD8\n\ +_080C4DB4:\n\ + subs r4, r1, 0x1\n\ + lsls r0, r4, 1\n\ + mov r5, sp\n\ + adds r3, r5, r0\n\ + lsls r0, r1, 1\n\ + adds r2, r5, r0\n\ + ldrh r5, [r3]\n\ + movs r7, 0\n\ + ldrsh r1, [r3, r7]\n\ + movs r7, 0\n\ + ldrsh r0, [r2, r7]\n\ + cmp r1, r0\n\ + bge _080C4DD2\n\ + strh r5, [r2]\n\ + strh r0, [r3]\n\ +_080C4DD2:\n\ + adds r1, r4, 0\n\ + cmp r1, r6\n\ + bgt _080C4DB4\n\ +_080C4DD8:\n\ + adds r6, 0x1\n\ + cmp r6, 0x2\n\ + ble _080C4DAE\n\ + mov r2, r8\n\ + ldrh r0, [r2]\n\ + lsls r0, 1\n\ + add r0, sp\n\ + ldrh r0, [r0]\n\ + movs r2, 0\n\ + movs r7, 0\n\ + movs r6, 0\n\ + lsls r0, 16\n\ + asrs r4, r0, 16\n\ + adds r3, r0, 0\n\ + mov r1, sp\n\ +_080C4DF6:\n\ + movs r5, 0\n\ + ldrsh r0, [r1, r5]\n\ + cmp r0, r4\n\ + bne _080C4E12\n\ + lsls r0, r2, 24\n\ + movs r2, 0x80\n\ + lsls r2, 17\n\ + adds r0, r2\n\ + lsrs r2, r0, 24\n\ + mov r5, r8\n\ + ldrh r5, [r5]\n\ + cmp r6, r5\n\ + bne _080C4E12\n\ + adds r7, r2, 0\n\ +_080C4E12:\n\ + adds r1, 0x2\n\ + adds r6, 0x1\n\ + cmp r6, 0x3\n\ + ble _080C4DF6\n\ + movs r6, 0\n\ + mov r0, sp\n\ + movs r1, 0\n\ + ldrsh r0, [r0, r1]\n\ + asrs r1, r3, 16\n\ + lsls r2, 24\n\ + mov r10, r2\n\ + cmp r0, r1\n\ + beq _080C4E40\n\ + adds r2, r1, 0\n\ + mov r1, sp\n\ +_080C4E30:\n\ + adds r1, 0x2\n\ + adds r6, 0x1\n\ + cmp r6, 0x3\n\ + bgt _080C4E40\n\ + movs r4, 0\n\ + ldrsh r0, [r1, r4]\n\ + cmp r0, r2\n\ + bne _080C4E30\n\ +_080C4E40:\n\ + lsls r0, r6, 24\n\ + lsrs r4, r0, 24\n\ + adds r2, r7, 0\n\ + movs r6, 0\n\ + asrs r5, r3, 16\n\ + mov r8, r5\n\ + mov r1, r12\n\ + movs r5, 0\n\ + ldrsh r0, [r1, r5]\n\ + cmp r8, r0\n\ + bne _080C4E60\n\ + cmp r7, 0x1\n\ + beq _080C4E78\n\ +_080C4E5A:\n\ + subs r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ +_080C4E60:\n\ + adds r6, 0x1\n\ + cmp r6, 0x3\n\ + bgt _080C4E78\n\ + lsls r0, r6, 1\n\ + add r0, r12\n\ + asrs r1, r3, 16\n\ + movs r5, 0\n\ + ldrsh r0, [r0, r5]\n\ + cmp r1, r0\n\ + bne _080C4E60\n\ + cmp r2, 0x1\n\ + bne _080C4E5A\n\ +_080C4E78:\n\ + lsls r1, r6, 24\n\ + lsrs r1, 24\n\ + mov r0, r9\n\ + bl sub_80C4698\n\ + ldr r0, _080C4EAC @ =gIsLinkContest\n\ + ldrb r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080C4EB8\n\ + ldr r0, _080C4EB0 @ =gStringVar2\n\ + lsls r1, r6, 3\n\ + subs r1, r6\n\ + lsls r1, 2\n\ + ldr r2, _080C4EB4 @ =gLinkPlayers + 0x8\n\ + adds r1, r2\n\ + bl sub_80C4674\n\ + b _080C4EC4\n\ + .align 2, 0\n\ +_080C4EA0: .4byte gUnknown_02038670\n\ +_080C4EA4: .4byte gSpecialVar_0x8006\n\ +_080C4EA8: .4byte gStringVar1\n\ +_080C4EAC: .4byte gIsLinkContest\n\ +_080C4EB0: .4byte gStringVar2\n\ +_080C4EB4: .4byte gLinkPlayers + 0x8\n\ +_080C4EB8:\n\ + ldr r0, _080C4ED8 @ =gStringVar2\n\ + lsls r1, r6, 6\n\ + ldr r2, _080C4EDC @ =gUnknown_0203857D\n\ + adds r1, r2\n\ + bl sub_80C4674\n\ +_080C4EC4:\n\ + mov r1, r10\n\ + asrs r0, r1, 24\n\ + cmp r0, 0x1\n\ + beq _080C4ED0\n\ + cmp r7, r0\n\ + bne _080C4EE4\n\ +_080C4ED0:\n\ + ldr r0, _080C4EE0 @ =gSpecialVar_0x8006\n\ + strh r4, [r0]\n\ + b _080C4EEA\n\ + .align 2, 0\n\ +_080C4ED8: .4byte gStringVar2\n\ +_080C4EDC: .4byte gUnknown_0203857D\n\ +_080C4EE0: .4byte gSpecialVar_0x8006\n\ +_080C4EE4:\n\ + ldr r1, _080C4EFC @ =gSpecialVar_0x8006\n\ + adds r0, r4, 0x4\n\ + strh r0, [r1]\n\ +_080C4EEA:\n\ + add sp, 0x8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080C4EFC: .4byte gSpecialVar_0x8006\n\ + .syntax divided"); +} + +void ShowContestWinnerCleanup(void) +{ + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void ShowContestWinner(void) +{ + if(gUnknown_0203856C) + { + sub_80AAF30(); + BATTLE_STRUCT->unk15DDF = 1; + BATTLE_STRUCT->unk15DDE = sub_80B2C4C(254, 0); + sub_80B2A7C(3); + gUnknown_0203856C = 0; + } + SetMainCallback2(CB2_ContestPainting); + gMain.savedCallback = ShowContestWinnerCleanup; +} + +void sub_80C4F70(void) +{ + VarSet(0x4010, gContestMons[0].unk16); + VarSet(0x4011, gContestMons[1].unk16); + VarSet(0x4012, gContestMons[2].unk16); + VarSet(0x4013, gContestMons[3].unk16); +} + +bool8 GiveMonArtistRibbon(void) +{ + u8 ribbon = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_ARTIST_RIBBON); + + if(ribbon == FALSE + && gUnknown_02038690[gContestPlayerMonIndex] == 0 + && gScriptContestRank == 3 + && (s16)gUnknown_02038678[gContestPlayerMonIndex] >= 800) + { + ribbon = TRUE; + SetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_ARTIST_RIBBON, &ribbon); + return TRUE; + } + else + { + return FALSE; + } +} + +u8 sub_80C5044(void) +{ + return gUnknown_0203856C; +} + +void ShowContestEntryMonPic(void) +{ + const struct CompressedSpritePalette *palette; + u32 var1, var2; + u16 species; + u8 spriteId; + u8 taskId; + + if(FindTaskIdByFunc(sub_80C5190) == 0xFF) + { + u8 left = CONTEST_ENTRY_PIC_LEFT; + u8 top = CONTEST_ENTRY_PIC_TOP; + + MenuDrawTextWindow(left, top, 19, 13); + species = gContestMons[gSpecialVar_0x8006].species; + var1 = gContestMons[gSpecialVar_0x8006].unk38; // v2 + var2 = gContestMons[gSpecialVar_0x8006].unk3C; // v3 + taskId = CreateTask(sub_80C5190, 0x50); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = species; + HandleLoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, + gMonFrontPicCoords[species].y_offset, + (u32)gUnknown_081FAF4C[0], + gUnknown_081FAF4C[1], + species, + var1); + palette = GetMonSpritePalStructFromOtIdPersonality(species, var2, var1); + LoadCompressedObjectPalette(palette); + GetMonSpriteTemplate_803C56C(species, 1); + gUnknown_02024E8C.paletteTag = palette->tag; + spriteId = CreateSprite(&gUnknown_02024E8C, 0x78, 0x40, 0); + gTasks[taskId].data[2] = spriteId; + gTasks[taskId].data[3] = left; + gTasks[taskId].data[4] = top; + gSprites[spriteId].callback = SpriteCallbackDummy; + gSprites[spriteId].oam.priority = 0; + } +} + +void sub_80C5164(void) +{ + u8 taskId = FindTaskIdByFunc(sub_80C5190); + + if(taskId != 0xFF) + gTasks[taskId].data[0]++; +} + +void sub_80C5190(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + struct Sprite *sprite; + + switch(task->data[0]) + { + case 2: + sprite = &gSprites[task->data[2]]; + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); + + if(sprite->oam.affineMode) + FreeOamMatrix(sprite->oam.matrixNum); + + DestroySprite(sprite); + task->data[0]++; + break; + case 0: + task->data[0]++; + break; + case 3: + MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10); + DestroyTask(taskId); + break; + case 1: + default: + break; + } +} + +void ScriptGetMultiplayerId(void) +{ + if(gIsLinkContest & 1) + gScriptResult = GetMultiplayerId(); + else + gScriptResult = 4; +} + +void ScriptRandom(void) +{ + u16 random; + u16 *scriptPtr; + + if(gIsLinkContest & 1) + { + gUnknown_03005D28 = 1103515245 * gUnknown_03005D28 + 24691; + random = gUnknown_03005D28 >> 16; + scriptPtr = &gScriptResult; + } + else + { + scriptPtr = &gScriptResult; + random = Random(); + } + *scriptPtr = random % *scriptPtr; +} + +void ScrSpecial_HealPlayerParty(void) +{ + u8 i, j; + u8 ppBonuses; + u8 arg[4]; + + // restore HP. + for(i = 0; i < gPlayerPartyCount; i++) + { + u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); + arg[0] = maxHP; + arg[1] = maxHP >> 8; + SetMonData(&gPlayerParty[i], MON_DATA_HP, arg); + ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES); + + // restore PP. + for(j = 0; j < 4; j++) + { + arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j); + SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg); + } + + // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData. + arg[0] = 0; + arg[1] = 0; + arg[2] = 0; + arg[3] = 0; + SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg); + } +} + +u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 unused3) +{ + u16 nationalDexNum; + int sentToPc; + u8 heldItem[2]; + struct Pokemon mon; + + CreateMon(&mon, species, level, 32, 0, 0, 0, 0); + heldItem[0] = item; + heldItem[1] = item >> 8; + SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem); + sentToPc = GiveMonToPlayer(&mon); + nationalDexNum = SpeciesToNationalPokedexNum(species); + + switch(sentToPc) + { + case 0: + case 1: + GetSetPokedexFlag(nationalDexNum, 2); + GetSetPokedexFlag(nationalDexNum, 3); + break; + } + return sentToPc; +} + +u8 ScriptGiveEgg(u16 species) +{ + struct Pokemon mon; + u8 isEgg; + + sub_8042044(&mon, species, 1); + isEgg = TRUE; + SetMonData(&mon, MON_DATA_IS_EGG, &isEgg); + + return GiveMonToPlayer(&mon); +} + +void CheckForAlivePartyMons(void) +{ + u8 var = sub_803DAA0(); + + switch(var) + { + case 1: + gScriptResult = var; + break; + case 0: + gScriptResult = var; + break; + case 2: + gScriptResult = var; + break; + } +} + +bool8 CheckPartyMonHasHeldItem(u16 item) +{ + int i; + + for(i = 0; i < 6; i++) + { + u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); + if(species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == item) + return TRUE; + } + return FALSE; +} + +bool8 GetNameOfEnigmaBerryInPlayerParty(void) +{ + bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY); + + if(hasItem == TRUE) + GetBerryNameByBerryType(ItemIdToBerryType(ITEM_ENIGMA_BERRY), gStringVar1); + + return hasItem; +} + +void CreateScriptedWildMon(u16 species, u8 level, u16 item) +{ + u8 heldItem[2]; + + ZeroEnemyPartyMons(); + CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, 0, 0); + + if(item) + { + heldItem[0] = item; + heldItem[1] = item >> 8; + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem); + } +} + +void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot) +{ + if(monIndex > 6) + monIndex = gPlayerPartyCount - 1; + + SetMonMoveSlot(&gPlayerParty[monIndex], move, slot); +} + +void sub_80C5568(void) +{ + gMain.savedCallback = sub_80C5580; + sub_8121E10(); +} + +void sub_80C5580(void) +{ + u8 var = gSelectedOrderFromParty[0]; + + switch(var) + { + case 0: + gScriptResult = 0; + break; + default: + gScriptResult = 1; + break; + } + + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void ChooseBattleTowerPlayerParty(void) +{ + gMain.savedCallback = SetBattleTowerPlayerParty; + sub_8121E34(); +} + +void SetBattleTowerPlayerParty(void) +{ + u8 var = gSelectedOrderFromParty[0]; + + switch(var) + { + case 0: // player quit battle tower? + LoadPlayerParty(); + gScriptResult = 0; + break; + default: // load battle tower. + ReducePlayerPartyToThree(); + gScriptResult = 1; + break; + } + + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void ReducePlayerPartyToThree(void) +{ + struct Pokemon party[3]; + int i; + + CpuFill32(0, party, sizeof party); + + // copy the selected pokemon according to the order. + for(i = 0; i < 3; i++) + if(gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop + party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal + + // delete the last 3 pokemon + CpuFill32(0, gPlayerParty, sizeof gPlayerParty); + + // overwrite the first 3 with the order copied to. + for(i = 0; i < 3; i++) + gPlayerParty[i] = party[i]; + + CalculatePlayerPartyCount(); +} diff --git a/src/script_pokemon_util_80F99CC.c b/src/script_pokemon_util_80F99CC.c new file mode 100644 index 000000000..f930df8e2 --- /dev/null +++ b/src/script_pokemon_util_80F99CC.c @@ -0,0 +1,444 @@ +#include "global.h" +#include "battle_party_menu.h" +#include "choose_party.h" +#include "contest.h" +#include "data2.h" +#include "party_menu.h" +#include "field_fadetransition.h" +#include "palette.h" +#include "party_menu.h" +#include "pokemon.h" +#include "pokemon_summary_screen.h" +#include "overworld.h" +#include "script.h" +#include "script_pokemon_80F9.h" +#include "songs.h" +#include "sound.h" +#include "string_util.h" +#include "task.h" +#include "text.h" + +extern u8 gPlayerPartyCount; +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u8 gUnknown_02038694; +extern u16 gScriptResult; + +extern void (*gFieldCallback)(void); + +void sub_80F99CC(void) +{ + u8 taskId; + + ScriptContext2_Enable(); + taskId = CreateTask((void *)sub_80F9A8C, 0xA); + gTasks[taskId].data[0] = 2; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void sub_80F9A0C(void) +{ + u8 taskId; + + ScriptContext2_Enable(); + taskId = CreateTask((void *)sub_80F9A8C, 0xA); + gTasks[taskId].data[0] = 3; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void sub_80F9A4C(void) +{ + u8 taskId; + + ScriptContext2_Enable(); + taskId = CreateTask((void *)sub_80F9A8C, 0xA); + gTasks[taskId].data[0] = 7; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void sub_80F9A8C(u8 taskId) +{ + if (!gPaletteFade.active) + { + gPaletteFade.bufferTransferDisabled = 1; + OpenPartyMenu((u8) gTasks[taskId].data[0], 0); + DestroyTask(taskId); + } +} + +bool8 sub_80F9ACC(void) +{ + switch (EWRAM_1B000.unk264) + { + case 0: + if (EWRAM_1B000.unk266 < gPlayerPartyCount) + { + TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); + EWRAM_1B000.unk266++; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264++; + } + break; + case 1: + LoadHeldItemIconGraphics(); + EWRAM_1B000.unk264++; + break; + case 2: + CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); + EWRAM_1B000.unk264++; + break; + case 3: + if (sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1) + { + EWRAM_1B000.unk266++; + break; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264++; + break; + } + case 4: + PartyMenuPrintMonsLevelOrStatus(); + EWRAM_1B000.unk264++; + break; + case 5: + PrintPartyMenuMonNicknames(); + EWRAM_1B000.unk264++; + break; + case 6: + sub_80F9C00(); + EWRAM_1B000.unk264++; + break; + case 7: // the only case that can return true. + if (sub_806B58C(EWRAM_1B000.unk266) != 1) + { + EWRAM_1B000.unk266++; + break; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264 = 0; + return TRUE; + } + } + return FALSE; +} + +void sub_80F9C00(void) +{ + u8 i; + + for (i = 0; i < gPlayerPartyCount; i++) + { + switch (sub_80AE47C(&gPlayerParty[i])) + { + case 0: + case 3: + case 4: + sub_806BC3C(i, 0x7E); + break; + case 1: + case 2: + sub_806BC3C(i, 0x70); + break; + } + } +} + +void sub_80F9C6C(u8 var) +{ + if (!gPaletteFade.active) + { + switch (sub_806BD80(var)) + { + case 1: + PlaySE(SE_SELECT); + gUnknown_02038694 = sub_806CA38(var); + gSpecialVar_0x8004 = gUnknown_02038694; + sub_8123138(var); + break; + case 2: + PlaySE(SE_SELECT); + gUnknown_02038694 = 0xFF; + gSpecialVar_0x8004 = 0xFF; + sub_8123138(var); + break; + } + } +} + +bool8 sub_80F9CE8(void) // this is the same function as sub_80F9ACC except case 6 calls a different function. why +{ + switch (EWRAM_1B000.unk264) + { + case 0: + if (EWRAM_1B000.unk266 < gPlayerPartyCount) + { + TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); + EWRAM_1B000.unk266++; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264++; + } + break; + case 1: + LoadHeldItemIconGraphics(); + EWRAM_1B000.unk264++; + break; + case 2: + CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); + EWRAM_1B000.unk264++; + break; + case 3: + if (sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1) + { + EWRAM_1B000.unk266++; + break; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264++; + break; + } + case 4: + PartyMenuPrintMonsLevelOrStatus(); + EWRAM_1B000.unk264++; + break; + case 5: + PrintPartyMenuMonNicknames(); + EWRAM_1B000.unk264++; + break; + case 6: + sub_80F9E1C(); + EWRAM_1B000.unk264++; + break; + case 7: // the only case that can return true. + if (sub_806B58C(EWRAM_1B000.unk266) != 1) + { + EWRAM_1B000.unk266++; + break; + } + else + { + EWRAM_1B000.unk266 = 0; + EWRAM_1B000.unk264 = 0; + return TRUE; + } + } + return FALSE; +} + +void sub_80F9E1C(void) +{ + u8 i; + + for (i = 0; i < gPlayerPartyCount; i++) + { + if (!sub_8040574(&gPlayerParty[i])) + sub_806BC3C(i, 0x9A); + else + sub_806BC3C(i, 0x8C); + } +} + +void sub_80F9E64(u8 var) +{ + if (!gPaletteFade.active) + { + switch (sub_806BD80(var)) + { + case 1: + PlaySE(SE_SELECT); + gSpecialVar_0x8004 = sub_806CA38(var); + gSpecialVar_0x8005 = sub_8040574(&gPlayerParty[gSpecialVar_0x8004]); + sub_8123138(var); + break; + case 2: + PlaySE(SE_SELECT); + gSpecialVar_0x8004 = 0xFF; + sub_8123138(var); + } + } +} + +void sub_80F9EEC(void) +{ + sub_809D9F0(&gPlayerParty[0], gSpecialVar_0x8004, gPlayerPartyCount - 1, c2_exit_to_overworld_2_switch, 0); + unk_2018000.unk8 = 3; + gFieldCallback = sub_8080990; +} + +void ScrSpecial_CountPokemonMoves(void) // count pokemon moves +{ + u8 i; + + gScriptResult = 0; + + for (i = 0; i < 4; i++) // checks MOVE1-MOVE4 + if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_MOVE1 + i)) + gScriptResult++; +} + +void ScrSpecial_GetPokemonNicknameAndMoveName(void) +{ + struct Pokemon *pkmn = &gPlayerParty[gSpecialVar_0x8004]; + u16 data = GetMonData(pkmn, MON_DATA_MOVE1 + gSpecialVar_0x8005); + + GetMonNickname(pkmn, gStringVar1); + StringCopy(gStringVar2, gMoveNames[data]); +} + +// no. hard +__attribute__((naked)) +void sub_80F9FDC(struct Pokemon *party, u8 var, u8 var2) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x20\n\ + mov r8, r0\n\ + adds r5, r1, 0\n\ + adds r4, r2, 0\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + adds r0, r5, 0\n\ + adds r0, 0xD\n\ + str r0, [sp, 0x8]\n\ + mov r0, r8\n\ + ldr r1, [sp, 0x8]\n\ + bl GetMonData\n\ + mov r1, sp\n\ + adds r1, 0x2\n\ + str r1, [sp, 0x14]\n\ + strh r0, [r1]\n\ + adds r3, r4, 0\n\ + adds r3, 0xD\n\ + str r3, [sp, 0xC]\n\ + mov r0, r8\n\ + adds r1, r3, 0\n\ + bl GetMonData\n\ + mov r1, sp\n\ + strh r0, [r1]\n\ + adds r7, r5, 0\n\ + adds r7, 0x11\n\ + str r7, [sp, 0x10]\n\ + mov r0, r8\n\ + adds r1, r7, 0\n\ + bl GetMonData\n\ + mov r1, sp\n\ + adds r1, 0x5\n\ + str r1, [sp, 0x18]\n\ + strb r0, [r1]\n\ + adds r3, r4, 0\n\ + adds r3, 0x11\n\ + str r3, [sp, 0x1C]\n\ + mov r0, r8\n\ + adds r1, r3, 0\n\ + bl GetMonData\n\ + add r7, sp, 0x4\n\ + mov r10, r7\n\ + strb r0, [r7]\n\ + mov r0, r8\n\ + movs r1, 0x15\n\ + bl GetMonData\n\ + mov r6, sp\n\ + adds r6, 0x6\n\ + strb r0, [r6]\n\ + ldr r1, _080FA0D8 @ =gUnknown_08208238\n\ + adds r0, r5, r1\n\ + ldrb r0, [r0]\n\ + mov r9, r0\n\ + ldrb r0, [r6]\n\ + adds r2, r0, 0\n\ + mov r3, r9\n\ + ands r2, r3\n\ + lsls r5, 1\n\ + asrs r2, r5\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r1, r4, r1\n\ + ldrb r3, [r1]\n\ + adds r1, r0, 0\n\ + ands r1, r3\n\ + lsls r4, 1\n\ + asrs r1, r4\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r7, r9\n\ + bics r0, r7\n\ + strb r0, [r6]\n\ + ldrb r0, [r6]\n\ + bics r0, r3\n\ + strb r0, [r6]\n\ + lsls r2, r4\n\ + lsls r1, r5\n\ + adds r2, r1\n\ + ldrb r0, [r6]\n\ + orrs r0, r2\n\ + strb r0, [r6]\n\ + mov r0, r8\n\ + ldr r1, [sp, 0x8]\n\ + mov r2, sp\n\ + bl SetMonData\n\ + mov r0, r8\n\ + ldr r1, [sp, 0xC]\n\ + ldr r2, [sp, 0x14]\n\ + bl SetMonData\n\ + mov r0, r8\n\ + ldr r1, [sp, 0x10]\n\ + mov r2, r10\n\ + bl SetMonData\n\ + mov r0, r8\n\ + ldr r1, [sp, 0x1C]\n\ + ldr r2, [sp, 0x18]\n\ + bl SetMonData\n\ + mov r0, r8\n\ + movs r1, 0x15\n\ + adds r2, r6, 0\n\ + bl SetMonData\n\ + add sp, 0x20\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080FA0D8: .4byte gUnknown_08208238\n\ + .syntax divided"); +} + +void sub_80FA0DC(void) +{ + u16 i; + + SetMonMoveSlot(&gPlayerParty[gSpecialVar_0x8004], 0, gSpecialVar_0x8005); + RemoveMonPPBonus(&gPlayerParty[gSpecialVar_0x8004], gSpecialVar_0x8005); + + for (i = gSpecialVar_0x8005; i < 3; i++) + sub_80F9FDC(&gPlayerParty[gSpecialVar_0x8004], i, i + 1); +} + +void sub_80FA148(void) +{ + struct Pokemon *party = &gPlayerParty[gSpecialVar_0x8004]; + gScriptResult = 0; + + if (GetMonData(party, MON_DATA_IS_EGG)) + gScriptResult = 1; +} diff --git a/src/unknown_task.c b/src/unknown_task.c new file mode 100644 index 000000000..5ec7fa6bc --- /dev/null +++ b/src/unknown_task.c @@ -0,0 +1,248 @@ +#include "global.h" +#include "data2.h" +#include "task.h" +#include "trig.h" +#include "unknown_task.h" + +struct UnknownStruct1 +{ + void *src[2]; + volatile void *dest; + u32 unkC; + void (*unk10)(void); + u8 srcBank; + u8 unk15; + u8 unk16; + u8 unk17; + u8 taskId; + u8 filler19[0x7]; +}; + +static void sub_80896F4(void); +static void sub_8089714(void); + +extern u16 gUnknown_030041B0; +extern u16 gUnknown_030041B4; +extern u16 gUnknown_030041B8; +extern u16 gUnknown_03004280; +extern u16 gUnknown_03004288; +extern u16 gUnknown_030042A0; +extern u16 gUnknown_030042A4; +extern u16 gUnknown_030042C0; + +extern u8 gUnknown_0202FFA4; + +extern struct UnknownStruct1 gUnknown_03004DC0; + +extern u16 gUnknown_03004DE0[][0x3C0]; + +void remove_some_task(void) +{ + gUnknown_03004DC0.unk15 = 0; + DmaStop(0); + if (gUnknown_03004DC0.taskId != 0xFF) + { + DestroyTask(gUnknown_03004DC0.taskId); + gUnknown_03004DC0.taskId = 0xFF; + } +} + +void dp12_8087EA4(void) +{ + CpuFill16(0, gUnknown_03004DE0, 0x780 * 2); + gUnknown_03004DC0.src[0] = 0; + gUnknown_03004DC0.src[1] = 0; + gUnknown_03004DC0.dest = 0; + gUnknown_03004DC0.unkC = 0; + gUnknown_03004DC0.srcBank = 0; + gUnknown_03004DC0.unk15 = 0; + gUnknown_03004DC0.unk16 = 0; + gUnknown_03004DC0.unk17 = 0; + gUnknown_03004DC0.taskId = 0xFF; +} + +void sub_80895F8(struct UnknownTaskStruct unk) +{ + if (unk.control == (((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1)) + { + gUnknown_03004DC0.src[0] = &gUnknown_03004DE0[0][1]; + gUnknown_03004DC0.src[1] = &gUnknown_03004DE0[1][1]; + gUnknown_03004DC0.unk10 = sub_80896F4; + } + else + { + gUnknown_03004DC0.src[0] = &gUnknown_03004DE0[0][2]; + gUnknown_03004DC0.src[1] = &gUnknown_03004DE0[1][2]; + gUnknown_03004DC0.unk10 = sub_8089714; + } + + gUnknown_03004DC0.unkC = unk.control; + gUnknown_03004DC0.dest = unk.dest; + gUnknown_03004DC0.unk15 = unk.unk8; + gUnknown_03004DC0.unk16 = unk.unk9; + gUnknown_03004DC0.unk17 = unk.unk9; +} + +void sub_8089668(void) +{ + if (gUnknown_03004DC0.unk15) + { + if (gUnknown_03004DC0.unk15 == 3) + { + gUnknown_03004DC0.unk15 = 0; + DmaStop(0); + gUnknown_0202FFA4 = 1; + } + else + { + DmaStop(0); + DmaSet(0, gUnknown_03004DC0.src[gUnknown_03004DC0.srcBank], gUnknown_03004DC0.dest, gUnknown_03004DC0.unkC); + gUnknown_03004DC0.unk10(); + gUnknown_03004DC0.srcBank ^= 1; + } + } +} + +static void sub_80896F4(void) +{ + u16 *dest = (u16 *)gUnknown_03004DC0.dest; + u16 *src = (u16 *)&gUnknown_03004DE0[gUnknown_03004DC0.srcBank]; + *dest = *src; +} + +static void sub_8089714(void) +{ + u32 *dest = (u32 *)gUnknown_03004DC0.dest; + u32 *src = (u32 *)&gUnknown_03004DE0[gUnknown_03004DC0.srcBank]; + *dest = *src; +} + +static void task00_for_dp12(u8 taskId) +{ + int value = 0; + + if (gUnknown_0202FFA4) + { + DestroyTask(taskId); + gUnknown_03004DC0.taskId = 0xFF; + } + else + { + if (gTasks[taskId].data[7]) + { + switch (gTasks[taskId].data[6]) + { + case 0x0: + value = gUnknown_030042A4; + break; + case 0x2: + value = gUnknown_030042A0; + break; + case 0x4: + value = gUnknown_030042C0; + break; + case 0x6: + value = gUnknown_030041B4; + break; + case 0x8: + value = gUnknown_03004288; + break; + case 0xA: + value = gUnknown_03004280; + break; + case 0xC: + value = gUnknown_030041B0; + break; + case 0xE: + value = gUnknown_030041B8; + break; + } + } + if (gTasks[taskId].data[4]) + { + int i; + int offset; + gTasks[taskId].data[4]--; + offset = gTasks[taskId].data[3] + 320; + for (i = gTasks[taskId].data[0]; i < gTasks[taskId].data[1]; i++) + { + gUnknown_03004DE0[gUnknown_03004DC0.srcBank][i] = gUnknown_03004DE0[0][offset] + value; + offset++; + } + } + else + { + int i; + int offset; + gTasks[taskId].data[4] = gTasks[taskId].data[5]; + offset = gTasks[taskId].data[3] + 320; + for (i = gTasks[taskId].data[0]; i < gTasks[taskId].data[1]; i++) + { + gUnknown_03004DE0[gUnknown_03004DC0.srcBank][i] = gUnknown_03004DE0[0][offset] + value; + offset++; + } + gTasks[taskId].data[3]++; + if (gTasks[taskId].data[3] == gTasks[taskId].data[2]) + { + gTasks[taskId].data[3] = 0; + } + } + } +} + +static void sub_80898FC(u16 *a1, u8 a2, u8 a3, u8 a4) +{ + u16 i = 0; + u8 offset = 0; + + while (i < 0x100) + { + a1[i] = (gSineTable[offset] * a3) / 256; + offset += a2; + i++; + } +} + +u8 sub_8089944(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) +{ + int i; + int offset; + struct UnknownTaskStruct unk; + u8 taskId; + + dp12_8087EA4(); + + unk.dest = (void *)(REG_ADDR_BG0HOFS + a6); + unk.control = ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1; + unk.unk8 = 1; + unk.unk9 = 0; + + sub_80895F8(unk); + + taskId = CreateTask(task00_for_dp12, 0); + + gTasks[taskId].data[0] = a1; + gTasks[taskId].data[1] = a2; + gTasks[taskId].data[2] = 256 / a3; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = a5; + gTasks[taskId].data[5] = a5; + gTasks[taskId].data[6] = a6; + gTasks[taskId].data[7] = a7; + + gUnknown_03004DC0.taskId = taskId; + gUnknown_0202FFA4 = 0; + + sub_80898FC(&gUnknown_03004DE0[0][320], a3, a4, a2 - a1); + + offset = 320; + + for (i = a1; i < a2; i++) + { + gUnknown_03004DE0[0][i] = gUnknown_03004DE0[0][offset]; + gUnknown_03004DE0[1][i] = gUnknown_03004DE0[0][offset]; + offset++; + } + + return taskId; +} diff --git a/src/unused_8124F94.c b/src/unused_8124F94.c new file mode 100644 index 000000000..5f76fa92e --- /dev/null +++ b/src/unused_8124F94.c @@ -0,0 +1,126 @@ +#include "global.h" +#include "decompress.h" +#include "palette.h" + +struct UnknownStruct2 +{ + void *src; + u8 unk4; + u8 unk5; + u8 unk6; + u16 unk8; +}; + +struct UnknownStruct3 +{ + u16 *paletteSrc; + u8 unk4; + u8 paletteCount; +}; + +struct UnknownStruct1 +{ + u8 paletteNum; + u8 unk1; + u16 unk2; + u8 *dest; + struct UnknownStruct3 unk8[16]; + struct UnknownStruct2 unk88[32]; +}; + +void unref_sub_8124F94(struct UnknownStruct1 *a) +{ + a->unk1 = 0; + a->paletteNum = 0; + a->unk2 = 0; + a->dest = (void *)VRAM; + DmaFill16(3, 0, a->unk8, sizeof(a->unk8)); + DmaFill16(3, 0, a->unk88, sizeof(a->unk88)); +} + +u8 unref_sub_8124FD8(struct UnknownStruct1 *a, const struct UnknownStruct2 *b) +{ + while (1) + { + s32 r6; + s32 temp; + + // Couldn't get it to match any other way + if (a->unk1 < 32 && b->src == NULL) + return 0; + if (a->unk1 >= 32) + break; + + a->unk88[a->unk1].src = b->src; + a->unk88[a->unk1].unk6 = b->unk6; + a->unk88[a->unk1].unk4 = b->unk4; + a->unk88[a->unk1].unk5 = b->unk5; + r6 = b->unk4 * b->unk5; + if (a->unk2 + r6 > 0x400) + return 2; + if (b->unk8 == 0) + { + DmaCopy16(3, b->src, a->dest + a->unk2 * 64, r6 * 32); + } + else + { + LZDecompressWram(b->src, a->dest + a->unk2 * 64); + } + a->unk88[a->unk1].unk8 = a->unk2; + temp = r6 + a->unk2; + a->unk2 = temp; + a->unk1++; + b++; + } + return 1; +} + +u8 unref_sub_81250A4(struct UnknownStruct1 *a, struct UnknownStruct3 *b) +{ + while (1) + { + // Couldn't get it to match any other way + if (a->paletteNum < 16 && b->paletteSrc == NULL) + return 0; + if (a->paletteNum >= 16) + break; + + a->unk8[a->paletteNum].paletteSrc = b->paletteSrc; + a->unk8[a->paletteNum].unk4 = b->unk4; + if (b->paletteCount == 0) + { + LoadPalette(b->paletteSrc, a->paletteNum * 16, 32); + } + else + { + u16 palette[16]; + + LZDecompressWram(b->paletteSrc, palette); + LoadPalette(palette, a->paletteNum * 16, 32); + } + a->unk8[a->paletteNum].paletteCount = a->paletteNum; + a->paletteNum = a->paletteNum + 1; + b++; + } + return 1; +} + +u8 unref_sub_8125118(struct UnknownStruct1 *a, struct UnknownStruct3 *b) +{ + u16 palettes[16][16] = {0}; + u8 r7 = b->paletteCount; + u8 i; + + LZDecompressWram(b->paletteSrc, palettes); + for (i = a->paletteNum; i < r7; i++) + { + if (a->paletteNum + i >= 16) + return 1; + a->unk8[i].paletteSrc = b->paletteSrc; + a->unk8[i].unk4 = b->unk4 + i; + a->unk8[i].paletteCount = a->paletteNum; + LoadPalette(palettes[i], a->paletteNum * 16, sizeof(palettes[i])); + a->paletteNum++; + } + return 0; +} -- cgit v1.2.3 From 70c45eb2616195eb47b8bc67d03a1589cd6c56e6 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 30 Sep 2017 21:26:05 -0400 Subject: remove unnecessary leftover from swiss safari decompile. --- src/battle/battle_anim_81258BC.c | 50 ---------------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 src/battle/battle_anim_81258BC.c (limited to 'src') diff --git a/src/battle/battle_anim_81258BC.c b/src/battle/battle_anim_81258BC.c deleted file mode 100644 index 5bdbb4946..000000000 --- a/src/battle/battle_anim_81258BC.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "global.h" -#include "battle_anim_81258BC.h" -#include "battle.h" -#include "battle_message.h" -#include "menu_cursor.h" -#include "text.h" - -extern struct Window gUnknown_03004210; -extern u8 gDisplayedStringBattle[]; -extern u8 gActionSelectionCursor[]; - -extern const u8 gUnknown_08400CBB[]; -extern u8 gActiveBank; -extern const u8 gUnknown_08400D15[]; - -extern void *gBattleBankFunc[]; -extern u16 gUnknown_030042A0; -extern u16 gUnknown_030042A4; - -#if ENGLISH -#define SUB_812BB10_TILE_DATA_OFFSET 440 -#elif GERMAN -#define SUB_812BB10_TILE_DATA_OFFSET 444 -#endif - -void sub_812BB10(void) { - int i; - - gUnknown_030042A4 = 0; - gUnknown_030042A0 = 160; - gUnknown_03004210.paletteNum = 0; - FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); - FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); - gBattleBankFunc[gActiveBank] = bx_battle_menu_t6_2; - - InitWindow(&gUnknown_03004210, gUnknown_08400D15, 400, 18, 35); - sub_8002F44(&gUnknown_03004210); - sub_814A5C0(0, 0xFFFF, 12, 11679, 0); - - for (i = 0; i < 4; i++) - { - nullsub_8(i); - } - - sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); - StrCpyDecodeToDisplayedStringBattle((u8 *) gUnknown_08400CBB); - - InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_812BB10_TILE_DATA_OFFSET, 2, 35); - sub_8002F44(&gUnknown_03004210); -} \ No newline at end of file -- cgit v1.2.3 From bdc9f5880e65e0b39d486feffc1c8131fe54edb4 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 30 Sep 2017 22:16:17 -0500 Subject: fix last nonmatching function and various improvements --- src/sound_check_menu.c | 655 ++++++++++++------------------------------------- 1 file changed, 158 insertions(+), 497 deletions(-) (limited to 'src') diff --git a/src/sound_check_menu.c b/src/sound_check_menu.c index 3cc25baf1..e8f98838c 100644 --- a/src/sound_check_menu.c +++ b/src/sound_check_menu.c @@ -12,9 +12,9 @@ #include "pokedex_cry_screen.h" // local task defines -#define WINDOW_SELECTED data[0] -#define BGM_INDEX data[1] -#define SE_INDEX data[2] +#define tWindowSelected data[0] +#define tBgmIndex data[1] +#define tSeIndex data[2] #define UNK_DATA3 data[3] #define UNK_DATA4 data[4] // data 5-7 are not used @@ -72,19 +72,19 @@ struct MusicPlayerInfo *gUnknown_03005D30; extern struct MusicPlayerInfo gMPlay_BGM; -void sub_80BA258(u8); +void Task_InitSoundCheckMenu(u8); void sub_80BA384(u8); void sub_80BA65C(u8); void sub_80BA68C(u8); -void sub_80BA6B8(u8); -void sub_80BA700(u16, u16, u16); +void HighlightSelectedWindow(u8); +void PrintSoundNumber(u16, u16, u16); void sub_80BA79C(const u8 *const, u16, u16); -void sub_80BA800(u8); +void Task_DrawDriverTestMenu(u8); void sub_80BAA48(u8); void sub_80BACDC(s8); void sub_80BAD5C(void); void sub_80BAE10(u8, u8); -void sub_80BAE78(int, u16, u16, u8); +void PrintSignedNumber(int, u16, u16, u8); void sub_80BAF84(u8); void sub_80BB038(u8); void sub_80BB1D4(void); @@ -92,7 +92,7 @@ void sub_80BB25C(u8); void sub_80BB3B4(u8); void sub_80BB494(void); -void sub_80BA0A8(void) +void CB2_SoundCheckMenu(void) { RunTasks(); AnimateSprites(); @@ -100,7 +100,7 @@ void sub_80BA0A8(void) UpdatePaletteFade(); } -void sub_80BA0C0(void) +void VBlankCB_SoundCheckMenu(void) { LoadOam(); ProcessSpriteCopyRequests(); @@ -151,21 +151,20 @@ void CB2_StartSoundCheckMenu(void) REG_IE = 1; // could be a typo of REG_IME REG_IE |= 1; REG_DISPSTAT |= 8; - SetVBlankCallback(sub_80BA0C0); - SetMainCallback2(sub_80BA0A8); + SetVBlankCallback(VBlankCB_SoundCheckMenu); + SetMainCallback2(CB2_SoundCheckMenu); REG_DISPCNT = 0x7140; - taskId = CreateTask(sub_80BA258, 0); - gTasks[taskId].WINDOW_SELECTED = BGM_WINDOW; - gTasks[taskId].BGM_INDEX = 0; - gTasks[taskId].SE_INDEX = 0; + taskId = CreateTask(Task_InitSoundCheckMenu, 0); + gTasks[taskId].tWindowSelected = BGM_WINDOW; + gTasks[taskId].tBgmIndex = 0; + gTasks[taskId].tSeIndex = 0; gTasks[taskId].UNK_DATA3 = 0; gUnknown_020387B0 = 0; gTasks[taskId].UNK_DATA3 = 0; // why? m4aSoundInit(); } -// Task_InitSoundCheckMenu -void sub_80BA258(u8 taskId) +void Task_InitSoundCheckMenu(u8 taskId) { u8 soundcheckStr[] = _("サウンドチェック"); u8 bgmStr[] = _("BGM"); @@ -176,9 +175,9 @@ void sub_80BA258(u8 taskId) if (!gPaletteFade.active) { - MenuDrawTextWindow(0x2, 0, 0x1B, 0x3); - MenuDrawTextWindow(0x2, 0x5, 0x1B, 0xA); - MenuDrawTextWindow(0x2, 0xC, 0x1B, 0x11); + MenuDrawTextWindow(2, 0, 27, 3); + MenuDrawTextWindow(2, 5, 27, 10); + MenuDrawTextWindow(2, 12, 27, 17); MenuPrint(soundcheckStr, 4, 1); MenuPrint(abDescStr, 14, 1); MenuPrint(bgmStr, 4, 6); @@ -186,7 +185,7 @@ void sub_80BA258(u8 taskId) MenuPrint(seStr, 4, 13); MenuPrint(upDownStr, 14, 13); MenuPrint(driverStr, 14, 18); - gTasks[taskId].FUNC = sub_80BA384; + gTasks[taskId].func = sub_80BA384; REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); } @@ -200,484 +199,145 @@ extern const u8 *const gSENames[]; void sub_80BA384(u8 taskId) // Task_HandleDrawingSoundCheckMenuText { - sub_80BA6B8(gTasks[taskId].WINDOW_SELECTED); - sub_80BA700(gTasks[taskId].BGM_INDEX + BGM_STOP, 7, 8); // print by BGM index - sub_80BA79C(gBGMNames[gTasks[taskId].BGM_INDEX], 11, 8); - sub_80BA700(gTasks[taskId].SE_INDEX, 7, 15); - sub_80BA79C(gSENames[gTasks[taskId].SE_INDEX], 11, 15); - gTasks[taskId].FUNC = sub_80BA65C; + HighlightSelectedWindow(gTasks[taskId].tWindowSelected); + PrintSoundNumber(gTasks[taskId].tBgmIndex + BGM_STOP, 7, 8); // print by BGM index + sub_80BA79C(gBGMNames[gTasks[taskId].tBgmIndex], 11, 8); + PrintSoundNumber(gTasks[taskId].tSeIndex, 7, 15); + sub_80BA79C(gSENames[gTasks[taskId].tSeIndex], 11, 15); + gTasks[taskId].func = sub_80BA65C; } -#ifdef NONMATCHING -bool8 sub_80BA400(u8 taskId) // Task_ProcessSoundCheckMenuInput +bool8 Task_ProcessSoundCheckMenuInput(u8 taskId) { if (gMain.newKeys & R_BUTTON) // driver test { - gTasks[taskId].FUNC = sub_80BA800; - return FALSE; + gTasks[taskId].func = Task_DrawDriverTestMenu; } - if (gMain.newKeys & L_BUTTON) + else if (gMain.newKeys & L_BUTTON) { - gTasks[taskId].FUNC = sub_80BAF84; - return FALSE; + gTasks[taskId].func = sub_80BAF84; } - if (gMain.newKeys & START_BUTTON) + else if (gMain.newKeys & START_BUTTON) { - gTasks[taskId].FUNC = sub_80BB25C; - return FALSE; + gTasks[taskId].func = sub_80BB25C; } - if (gMain.newKeys & A_BUTTON) // both these cases insist on non reuses of certain data variables and cause the function to not match. + else if (gMain.newKeys & A_BUTTON) { - if (gTasks[taskId].WINDOW_SELECTED != 0) // is playing? + if (gTasks[taskId].tWindowSelected != 0) // is playing? { - if (gTasks[taskId].UNK_DATA4 != 0) + if (gTasks[taskId].data[4] != 0) { - if (gTasks[taskId].SE_INDEX != 0) // why are you insiting on a non signed halfword? + if (gTasks[taskId].data[2] != 0) { - m4aSongNumStop(gTasks[taskId].UNK_DATA4); + m4aSongNumStop(gTasks[taskId].data[4]); + m4aSongNumStart(gTasks[taskId].data[2]); + gTasks[taskId].data[4] = gTasks[taskId].data[2]; } else { - m4aSongNumStop(gTasks[taskId].SE_INDEX); - gTasks[taskId].UNK_DATA4 = gTasks[taskId].SE_INDEX; - return FALSE; + m4aSongNumStop(gTasks[taskId].data[4]); + gTasks[taskId].data[4] = 0; } } - else if (gTasks[taskId].SE_INDEX == 0) // _080BA4BA + else { - return FALSE; + if (gTasks[taskId].data[2] != 0) + { + m4aSongNumStart(gTasks[taskId].data[2]); + gTasks[taskId].data[4] = gTasks[taskId].data[2]; + } } - // _080BA4C4 - m4aSongNumStart(gTasks[taskId].SE_INDEX); - gTasks[taskId].UNK_DATA4 = gTasks[taskId].SE_INDEX; - return FALSE; } - else // _080BA4D0 + else { - if (gTasks[taskId].UNK_DATA3 != 0) + if (gTasks[taskId].data[3] != 0) { - if (gTasks[taskId].BGM_INDEX != 0) + if (gTasks[taskId].tBgmIndex != 0) { - m4aSongNumStop(gTasks[taskId].UNK_DATA3 + BGM_STOP); + m4aSongNumStop(gTasks[taskId].data[3] + BGM_STOP); + m4aSongNumStart(gTasks[taskId].tBgmIndex + BGM_STOP); + gTasks[taskId].data[3] = gTasks[taskId].tBgmIndex; } - else // _080BA500 + else { - m4aSongNumStop(gTasks[taskId].UNK_DATA3 + BGM_STOP); - gTasks[taskId].UNK_DATA3 = gTasks[taskId].BGM_INDEX; - return FALSE; + m4aSongNumStop(gTasks[taskId].data[3] + BGM_STOP); + gTasks[taskId].data[3] = 0; } } - else if (gTasks[taskId].BGM_INDEX == 0) // _080BA514 - return FALSE; - - m4aSongNumStart(gTasks[taskId].BGM_INDEX + BGM_STOP); - gTasks[taskId].UNK_DATA3 = gTasks[taskId].BGM_INDEX; + else if (gTasks[taskId].tBgmIndex != 0) + { + m4aSongNumStart(gTasks[taskId].tBgmIndex + BGM_STOP); + gTasks[taskId].data[3] = gTasks[taskId].tBgmIndex; + } } - return FALSE; } - if (gMain.newKeys & B_BUTTON) + else if (gMain.newKeys & B_BUTTON) { - m4aSongNumStart(5); + m4aSongNumStart(SE_SELECT); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].FUNC = sub_80BA68C; - return FALSE; + gTasks[taskId].func = sub_80BA68C; } - if (gMain.newAndRepeatedKeys & DPAD_UP) + else if (gMain.newAndRepeatedKeys & DPAD_UP) { - gTasks[taskId].data[8] ^= A_BUTTON; // huh? + gTasks[taskId].tWindowSelected ^= 1; return TRUE; } - if (gMain.newAndRepeatedKeys & DPAD_DOWN) + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { - gTasks[taskId].data[8] ^= A_BUTTON; // huh? + gTasks[taskId].tWindowSelected ^= 1; return TRUE; } - else + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) { - u16 keys = gMain.newAndRepeatedKeys & DPAD_RIGHT; - if (keys) - { - if (gTasks[taskId].WINDOW_SELECTED != 0) + if (gTasks[taskId].tWindowSelected != 0) { - if (gTasks[taskId].SE_INDEX > 0) - { - gTasks[taskId].SE_INDEX--; - } + if (gTasks[taskId].tSeIndex > 0) + gTasks[taskId].tSeIndex--; else - { - gTasks[taskId].SE_INDEX = 0xF7; - } - } - else if (gTasks[taskId].BGM_INDEX > 0) - { - gTasks[taskId].BGM_INDEX--; + gTasks[taskId].tSeIndex = 0xF7; } else { - gTasks[taskId].BGM_INDEX = 0x75; + if (gTasks[taskId].tBgmIndex > 0) + gTasks[taskId].tBgmIndex--; + else + gTasks[taskId].tBgmIndex = 0x75; } return TRUE; } - if (gMain.newAndRepeatedKeys & DPAD_LEFT) + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) { - if (gTasks[taskId].WINDOW_SELECTED != 0) + if (gTasks[taskId].tWindowSelected != 0) { - if (gTasks[taskId].SE_INDEX < 0xF7) - { - gTasks[taskId].SE_INDEX++; - } + if (gTasks[taskId].tSeIndex < 0xF7) + gTasks[taskId].tSeIndex++; else - { - gTasks[taskId].SE_INDEX = keys; // ?? - } - } - else if (gTasks[taskId].BGM_INDEX < 0x75) - { - gTasks[taskId].BGM_INDEX++; - return TRUE; + gTasks[taskId].tSeIndex = 0; } else { - gTasks[taskId].BGM_INDEX = gTasks[taskId].SE_INDEX; - return TRUE; + if (gTasks[taskId].tBgmIndex < 0x75) + gTasks[taskId].tBgmIndex++; + else + gTasks[taskId].tBgmIndex = 0; } return TRUE; } - if (gMain.heldKeys & SELECT_BUTTON) + else if (gMain.heldKeys & SELECT_BUTTON) { - gUnknown_020387B0 = A_BUTTON; - return FALSE; + gUnknown_020387B0 = 1; } else { - gUnknown_020387B0 = (gMain.heldKeys & SELECT_BUTTON); - return FALSE; - } + gUnknown_020387B0 = 0; } + return FALSE; } -#else -__attribute__((naked)) -bool8 sub_80BA400(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldr r2, _080BA428 @ =gMain\n\ - ldrh r1, [r2, 0x2E]\n\ - movs r0, 0x80\n\ - lsls r0, 1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA434\n\ - ldr r0, _080BA42C @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldr r0, _080BA430 @ =sub_80BA800\n\ - str r0, [r1]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA428: .4byte gMain\n\ -_080BA42C: .4byte gTasks\n\ -_080BA430: .4byte sub_80BA800\n\ -_080BA434:\n\ - movs r0, 0x80\n\ - lsls r0, 2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA458\n\ - ldr r0, _080BA450 @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldr r0, _080BA454 @ =sub_80BAF84\n\ - str r0, [r1]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA450: .4byte gTasks\n\ -_080BA454: .4byte sub_80BAF84\n\ -_080BA458:\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA478\n\ - ldr r0, _080BA470 @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldr r0, _080BA474 @ =sub_80BB25C\n\ - str r0, [r1]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA470: .4byte gTasks\n\ -_080BA474: .4byte sub_80BB25C\n\ -_080BA478:\n\ - movs r6, 0x1\n\ - movs r5, 0x1\n\ - ands r5, r1\n\ - cmp r5, 0\n\ - beq _080BA538\n\ - ldr r0, _080BA4AC @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r5, r1, r0\n\ - movs r1, 0x8\n\ - ldrsh r0, [r5, r1]\n\ - cmp r0, 0\n\ - beq _080BA4D0\n\ - movs r2, 0x10\n\ - ldrsh r0, [r5, r2]\n\ - cmp r0, 0\n\ - beq _080BA4BA\n\ - movs r3, 0xC\n\ - ldrsh r4, [r5, r3]\n\ - cmp r4, 0\n\ - beq _080BA4B0\n\ - ldrh r0, [r5, 0x10]\n\ - bl m4aSongNumStop\n\ - b _080BA4C4\n\ - .align 2, 0\n\ -_080BA4AC: .4byte gTasks\n\ -_080BA4B0:\n\ - ldrh r0, [r5, 0x10]\n\ - bl m4aSongNumStop\n\ - strh r4, [r5, 0x10]\n\ - b _080BA64C\n\ -_080BA4BA:\n\ - movs r4, 0xC\n\ - ldrsh r0, [r5, r4]\n\ - cmp r0, 0\n\ - bne _080BA4C4\n\ - b _080BA64C\n\ -_080BA4C4:\n\ - ldrh r0, [r5, 0xC]\n\ - bl m4aSongNumStart\n\ - ldrh r0, [r5, 0xC]\n\ - strh r0, [r5, 0x10]\n\ - b _080BA64C\n\ -_080BA4D0:\n\ - ldrh r1, [r5, 0xE]\n\ - movs r2, 0xE\n\ - ldrsh r0, [r5, r2]\n\ - cmp r0, 0\n\ - beq _080BA514\n\ - movs r3, 0xA\n\ - ldrsh r4, [r5, r3]\n\ - cmp r4, 0\n\ - beq _080BA500\n\ - ldr r0, _080BA4FC @ =0x0000015d\n\ - adds r4, r0, 0\n\ - adds r0, r1, r4\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl m4aSongNumStop\n\ - ldrh r1, [r5, 0xA]\n\ - adds r4, r1\n\ - lsls r4, 16\n\ - lsrs r4, 16\n\ - adds r0, r4, 0\n\ - b _080BA528\n\ - .align 2, 0\n\ -_080BA4FC: .4byte 0x0000015d\n\ -_080BA500:\n\ - ldr r2, _080BA510 @ =0x0000015d\n\ - adds r0, r1, r2\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl m4aSongNumStop\n\ - strh r4, [r5, 0xE]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA510: .4byte 0x0000015d\n\ -_080BA514:\n\ - ldrh r1, [r5, 0xA]\n\ - movs r3, 0xA\n\ - ldrsh r0, [r5, r3]\n\ - cmp r0, 0\n\ - bne _080BA520\n\ - b _080BA64C\n\ -_080BA520:\n\ - ldr r4, _080BA534 @ =0x0000015d\n\ - adds r0, r1, r4\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ -_080BA528:\n\ - bl m4aSongNumStart\n\ - ldrh r0, [r5, 0xA]\n\ - strh r0, [r5, 0xE]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA534: .4byte 0x0000015d\n\ -_080BA538:\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA570\n\ - movs r0, 0x5\n\ - bl m4aSongNumStart\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - str r5, [sp]\n\ - movs r1, 0\n\ - movs r2, 0\n\ - movs r3, 0x10\n\ - bl BeginNormalPaletteFade\n\ - ldr r1, _080BA568 @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldr r1, _080BA56C @ =sub_80BA68C\n\ - str r1, [r0]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA568: .4byte gTasks\n\ -_080BA56C: .4byte sub_80BA68C\n\ -_080BA570:\n\ - ldrh r1, [r2, 0x30]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080BA582\n\ - movs r0, 0x80\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA59C\n\ -_080BA582:\n\ - ldr r0, _080BA598 @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldrh r0, [r1, 0x8]\n\ - eors r0, r6\n\ - strh r0, [r1, 0x8]\n\ -_080BA592:\n\ - movs r0, 0x1\n\ - b _080BA64E\n\ - .align 2, 0\n\ -_080BA598: .4byte gTasks\n\ -_080BA59C:\n\ - movs r0, 0x10\n\ - ands r0, r1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0\n\ - beq _080BA5EA\n\ - ldr r0, _080BA5CC @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - movs r2, 0x8\n\ - ldrsh r0, [r1, r2]\n\ - cmp r0, 0\n\ - beq _080BA5D6\n\ - ldrh r2, [r1, 0xC]\n\ - movs r3, 0xC\n\ - ldrsh r0, [r1, r3]\n\ - cmp r0, 0\n\ - ble _080BA5D0\n\ - subs r0, r2, 0x1\n\ - strh r0, [r1, 0xC]\n\ - b _080BA592\n\ - .align 2, 0\n\ -_080BA5CC: .4byte gTasks\n\ -_080BA5D0:\n\ - movs r0, 0xF7\n\ - strh r0, [r1, 0xC]\n\ - b _080BA592\n\ -_080BA5D6:\n\ - ldrh r2, [r1, 0xA]\n\ - movs r4, 0xA\n\ - ldrsh r0, [r1, r4]\n\ - cmp r0, 0\n\ - ble _080BA5E4\n\ - subs r0, r2, 0x1\n\ - b _080BA5E6\n\ -_080BA5E4:\n\ - movs r0, 0x75\n\ -_080BA5E6:\n\ - strh r0, [r1, 0xA]\n\ - b _080BA592\n\ -_080BA5EA:\n\ - movs r0, 0x20\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA630\n\ - ldr r1, _080BA614 @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r1, r0, r1\n\ - movs r0, 0x8\n\ - ldrsh r2, [r1, r0]\n\ - cmp r2, 0\n\ - beq _080BA61C\n\ - ldrh r2, [r1, 0xC]\n\ - movs r4, 0xC\n\ - ldrsh r0, [r1, r4]\n\ - cmp r0, 0xF6\n\ - bgt _080BA618\n\ - adds r0, r2, 0x1\n\ - strh r0, [r1, 0xC]\n\ - b _080BA592\n\ - .align 2, 0\n\ -_080BA614: .4byte gTasks\n\ -_080BA618:\n\ - strh r3, [r1, 0xC]\n\ - b _080BA592\n\ -_080BA61C:\n\ - ldrh r3, [r1, 0xA]\n\ - movs r4, 0xA\n\ - ldrsh r0, [r1, r4]\n\ - cmp r0, 0x74\n\ - bgt _080BA62C\n\ - adds r0, r3, 0x1\n\ - strh r0, [r1, 0xA]\n\ - b _080BA592\n\ -_080BA62C:\n\ - strh r2, [r1, 0xA]\n\ - b _080BA592\n\ -_080BA630:\n\ - ldrh r1, [r2, 0x2C]\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - cmp r1, 0\n\ - beq _080BA648\n\ - ldr r0, _080BA644 @ =gUnknown_020387B0\n\ - strb r6, [r0]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA644: .4byte gUnknown_020387B0\n\ -_080BA648:\n\ - ldr r0, _080BA658 @ =gUnknown_020387B0\n\ - strb r1, [r0]\n\ -_080BA64C:\n\ - movs r0, 0\n\ -_080BA64E:\n\ - add sp, 0x4\n\ - pop {r4-r6}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080BA658: .4byte gUnknown_020387B0\n\ - .syntax divided"); -} -#endif void sub_80BA65C(u8 taskId) { - if (sub_80BA400(taskId) != FALSE) - gTasks[taskId].FUNC = sub_80BA384; + if (Task_ProcessSoundCheckMenuInput(taskId) != FALSE) + gTasks[taskId].func = sub_80BA384; } void sub_80BA68C(u8 taskId) @@ -689,7 +349,7 @@ void sub_80BA68C(u8 taskId) } } -void sub_80BA6B8(u8 windowType) +void HighlightSelectedWindow(u8 windowType) { switch (windowType) { @@ -705,7 +365,7 @@ void sub_80BA6B8(u8 windowType) } } -void sub_80BA700(u16 soundIndex, u16 x, u16 y) // PrintSoundNumber ? +void PrintSoundNumber(u16 soundIndex, u16 x, u16 y) // PrintSoundNumber ? { u8 i; u8 str[5]; @@ -727,7 +387,7 @@ void sub_80BA700(u16 soundIndex, u16 x, u16 y) // PrintSoundNumber ? } divisorValue = (soundIndex % 100) / 10; - if (divisorValue || someBool != FALSE) + if (divisorValue || someBool) str[1] = divisorValue + CHAR_0; str[2] = ((soundIndex % 100) % 10) + CHAR_0; @@ -739,7 +399,7 @@ void sub_80BA79C(const u8 *const string, u16 x, u16 y) u8 i; u8 str[11]; - for (i = 0; i < 11; i++) + for (i = 0; i <= 10; i++) str[i] = 0; // format string. str[10] = EOS; // the above for loop formats the last element of the array unnecessarily. @@ -750,9 +410,8 @@ void sub_80BA79C(const u8 *const string, u16 x, u16 y) MenuPrint(str, x, y); } -void sub_80BA800(u8 taskId) // Task_DrawDriverTestMenu +void Task_DrawDriverTestMenu(u8 taskId) // Task_DrawDriverTestMenu { - u8 bbackStr[] = _("Bぼたんで もどる"); u8 aplayStr[] = _("Aぼたんで さいせい"); u8 voiceStr[] = _("VOICE‥‥‥‥"); @@ -769,23 +428,23 @@ void sub_80BA800(u8 taskId) // Task_DrawDriverTestMenu u8 stereoStr[] = _("すてれお‥‥‥‥"); // stereo REG_DISPCNT = 0x3140; - MenuDrawTextWindow(0, 0, 0x1D, 0x13); - MenuPrint(bbackStr, 0x13, 0x4); - MenuPrint(aplayStr, 0x13, 0x2); - MenuPrint(voiceStr, 0x2, 0x1); - MenuPrint(volumeStr, 0x2, 0x3); - MenuPrint(panpotStr, 0x2, 0x5); - MenuPrint(pitchStr, 0x2, 0x7); - MenuPrint(lengthStr, 0x2, 0x9); - MenuPrint(releaseStr, 0x2, 0xB); - MenuPrint(progressStr, 0x2, 0xD); - MenuPrint(chorusStr, 0x2, 0xF); - MenuPrint(priorityStr, 0x2, 0x11); - MenuPrint(playingStr, 0x13, 0x10); - MenuPrint(reverseStr, 0x13, 0xE); - MenuPrint(stereoStr, 0x13, 0xC); - REG_WIN0H = WIN_RANGE(0, 240); - REG_WIN0V = WIN_RANGE(0, 160); + MenuDrawTextWindow(0, 0, 29, 19); + MenuPrint(bbackStr, 19, 4); + MenuPrint(aplayStr, 19, 2); + MenuPrint(voiceStr, 2, 1); + MenuPrint(volumeStr, 2, 3); + MenuPrint(panpotStr, 2, 5); + MenuPrint(pitchStr, 2, 7); + MenuPrint(lengthStr, 2, 9); + MenuPrint(releaseStr, 2, 11); + MenuPrint(progressStr, 2, 13); + MenuPrint(chorusStr, 2, 15); + MenuPrint(priorityStr, 2, 17); + MenuPrint(playingStr, 19, 16); + MenuPrint(reverseStr, 19, 14); + MenuPrint(stereoStr, 19, 12); + REG_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH); + REG_WIN0V = WIN_RANGE(0, DISPLAY_HEIGHT); gUnknown_020387B3 = 0; gUnknown_020387B1 = 0; gUnknown_020387B2 = 0; @@ -803,7 +462,7 @@ void sub_80BA800(u8 taskId) // Task_DrawDriverTestMenu gUnknown_020387B4[CRY_TEST_PRIORITY] = 2; sub_80BAD5C(); sub_80BAE10(0, 0); - gTasks[taskId].FUNC = sub_80BAA48; + gTasks[taskId].func = sub_80BAA48; } @@ -815,8 +474,8 @@ void sub_80BAA48(u8 taskId) // Task_ProcessDriverTestInput REG_DISPCNT = 0x7140; REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - gTasks[taskId].FUNC = sub_80BA258; + MenuZeroFillWindowRect(0, 0, 29, 19); + gTasks[taskId].func = Task_InitSoundCheckMenu; return; } if (gMain.newAndRepeatedKeys & DPAD_UP) // _080BAAA8 @@ -957,18 +616,18 @@ void sub_80BACDC(s8 var) void sub_80BAD5C(void) { - sub_80BAE78(gUnknown_020387B4[CRY_TEST_UNK0] + 1, 0xB, 0x1, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_VOLUME], 0xB, 0x3, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_PANPOT], 0xB, 0x5, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_PITCH], 0xB, 0x7, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_LENGTH], 0xB, 0x9, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_RELEASE], 0xB, 0xB, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_PROGRESS], 0xB, 0xD, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_CHORUS], 0xB, 0xF, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_PRIORITY], 0xB, 0x11, 0x5); - sub_80BAE78(gUnknown_020387B1, 0x1B, 0x10, 0x1); - sub_80BAE78(gUnknown_020387D8, 0x1B, 0xE, 0x1); - sub_80BAE78(gUnknown_020387D9, 0x1B, 0xC, 0x1); + PrintSignedNumber(gUnknown_020387B4[CRY_TEST_UNK0] + 1, 11, 1, 5); + PrintSignedNumber(gUnknown_020387B4[CRY_TEST_VOLUME], 11, 3, 5); + PrintSignedNumber(gUnknown_020387B4[CRY_TEST_PANPOT], 11, 5, 5); + PrintSignedNumber(gUnknown_020387B4[CRY_TEST_PITCH], 11, 7, 5); + PrintSignedNumber(gUnknown_020387B4[CRY_TEST_LENGTH], 11, 9, 5); + PrintSignedNumber(gUnknown_020387B4[CRY_TEST_RELEASE], 11, 11, 5); + PrintSignedNumber(gUnknown_020387B4[CRY_TEST_PROGRESS], 11, 13, 5); + PrintSignedNumber(gUnknown_020387B4[CRY_TEST_CHORUS], 11, 15, 5); + PrintSignedNumber(gUnknown_020387B4[CRY_TEST_PRIORITY], 11, 17, 5); + PrintSignedNumber(gUnknown_020387B1, 27, 16, 1); + PrintSignedNumber(gUnknown_020387D8, 27, 14, 1); + PrintSignedNumber(gUnknown_020387D9, 27, 12, 1); } void sub_80BAE10(u8 var1, u8 var2) @@ -980,7 +639,7 @@ void sub_80BAE10(u8 var1, u8 var2) MenuPrint(str1, gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 1)]); } -void sub_80BAE78(int n, u16 x, u16 y, u8 digits) +void PrintSignedNumber(int n, u16 x, u16 y, u8 digits) { int powersOfTen[6] = { @@ -1038,19 +697,19 @@ void sub_80BAF84(u8 taskId) u8 playingStr[] = _("さいせいちゆう‥"); REG_DISPCNT = 0x3140; - MenuDrawTextWindow(0, 0, 0x1D, 0x13); + MenuDrawTextWindow(0, 0, 29, 19); MenuPrint(seStr, 3, 2); MenuPrint(panStr, 3, 4); MenuPrint(playingStr, 3, 8); - REG_WIN0H = WIN_RANGE(0, 240); - REG_WIN0V = WIN_RANGE(0, 160); + REG_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH); + REG_WIN0V = WIN_RANGE(0, DISPLAY_HEIGHT); gUnknown_020387B4[CRY_TEST_UNK0] = 1; gUnknown_020387B4[CRY_TEST_PANPOT] = 0; gUnknown_020387B4[CRY_TEST_CHORUS] = 0; gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; gUnknown_020387B4[CRY_TEST_RELEASE] = 0; sub_80BB1D4(); - gTasks[taskId].FUNC = sub_80BB038; + gTasks[taskId].func = sub_80BB038; } void sub_80BB038(u8 taskId) @@ -1067,17 +726,17 @@ void sub_80BB038(u8 taskId) s8 panpot = gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]; if (panpot != -128) { - if (panpot == 0x7F) + if (panpot == 127) { gUnknown_020387B4[CRY_TEST_CHORUS] += 2; - if (gUnknown_020387B4[CRY_TEST_CHORUS] < 0x3F) + if (gUnknown_020387B4[CRY_TEST_CHORUS] < 63) SE12PanpotControl(gUnknown_020387B4[CRY_TEST_CHORUS]); } } else // _080BB08C { gUnknown_020387B4[CRY_TEST_CHORUS] -= 2; - if (gUnknown_020387B4[CRY_TEST_CHORUS] > -0x40) + if (gUnknown_020387B4[CRY_TEST_CHORUS] > -64) SE12PanpotControl(gUnknown_020387B4[CRY_TEST_CHORUS]); } } @@ -1088,8 +747,8 @@ void sub_80BB038(u8 taskId) REG_DISPCNT = 0x7140; REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - gTasks[taskId].FUNC = sub_80BA258; + MenuZeroFillWindowRect(0, 0, 29, 19); + gTasks[taskId].func = Task_InitSoundCheckMenu; return; } if (gMain.newKeys & A_BUTTON) // _080BB104 @@ -1097,21 +756,21 @@ void sub_80BB038(u8 taskId) s8 panpot = gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]; if (panpot != -128) { - if (panpot == 0x7F) + if (panpot == 127) { - PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], -0x40); - gUnknown_020387B4[CRY_TEST_CHORUS] = -0x40; + PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], -64); + gUnknown_020387B4[CRY_TEST_CHORUS] = -64; gUnknown_020387B4[CRY_TEST_PROGRESS] = 1; - gUnknown_020387B4[CRY_TEST_RELEASE] = 0x1E; + gUnknown_020387B4[CRY_TEST_RELEASE] = 30; return; } } else // _080BB140 { - PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], 0x3F); - gUnknown_020387B4[CRY_TEST_CHORUS] = 0x3F; + PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], 63); + gUnknown_020387B4[CRY_TEST_CHORUS] = 63; gUnknown_020387B4[CRY_TEST_PROGRESS] = 1; - gUnknown_020387B4[CRY_TEST_RELEASE] = 0x1E; + gUnknown_020387B4[CRY_TEST_RELEASE] = 30; return; } // _080BB154 @@ -1150,7 +809,7 @@ void sub_80BB1D4(void) u8 lrStr[] = _(" LR"); u8 rlStr[] = _(" RL"); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_UNK0], 7, 2, 3); + PrintSignedNumber(gUnknown_020387B4[CRY_TEST_UNK0], 7, 2, 3); switch (gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]) { @@ -1161,10 +820,10 @@ void sub_80BB1D4(void) MenuPrint(rlStr, 7, 4); break; default: - sub_80BAE78(gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]], 7, 4, 3); + PrintSignedNumber(gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]], 7, 4, 3); break; } - sub_80BAE78(IsSEPlaying(), 12, 8, 1); + PrintSignedNumber(IsSEPlaying(), 12, 8, 1); } #define SOUND_LIST_BGM \ @@ -1581,7 +1240,8 @@ void sub_80BB25C(u8 taskId) zero = 0; // wtf? gUnknown_03005E98 = 0; - while (sub_8119E3C(&cryStruct, 3) == FALSE); + while (sub_8119E3C(&cryStruct, 3) == FALSE) + ; cryStruct2.unk0 = 0; cryStruct2.unk2 = 15; @@ -1592,7 +1252,8 @@ void sub_80BB25C(u8 taskId) zero = 0; // wtf? gUnknown_03005E98 = 0; - while (ShowPokedexCryScreen(&cryStruct2, 2) == FALSE); + while (ShowPokedexCryScreen(&cryStruct2, 2) == FALSE) + ; MenuDrawTextWindow(0, 16, 5, 19); sub_80BB494(); @@ -1603,7 +1264,7 @@ void sub_80BB25C(u8 taskId) REG_BG3CNT = 0x1D03; REG_DISPCNT = 0x1d40; m4aMPlayFadeOutTemporarily(&gMPlay_BGM, 2); - gTasks[taskId].FUNC = sub_80BB3B4; + gTasks[taskId].func = sub_80BB3B4; } void sub_80BB3B4(u8 taskId) @@ -1635,13 +1296,13 @@ void sub_80BB3B4(u8 taskId) REG_DISPCNT = 0x7140; REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - gTasks[taskId].FUNC = sub_80BA258; + MenuZeroFillWindowRect(0, 0, 29, 19); + gTasks[taskId].func = Task_InitSoundCheckMenu; DestroyCryMeterNeedleSprite(); } } void sub_80BB494(void) { - sub_80BAE78(gUnknown_03005D34, 1, 17, 3); + PrintSignedNumber(gUnknown_03005D34, 1, 17, 3); } -- cgit v1.2.3 From 30bc88f6572c435ff49b62f16c3734c12f75f7f0 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 30 Sep 2017 23:57:37 -0500 Subject: more labeling --- src/sound_check_menu.c | 304 ++++++++++++++++++++++++------------------------- 1 file changed, 148 insertions(+), 156 deletions(-) (limited to 'src') diff --git a/src/sound_check_menu.c b/src/sound_check_menu.c index e8f98838c..14261b75e 100644 --- a/src/sound_check_menu.c +++ b/src/sound_check_menu.c @@ -15,10 +15,6 @@ #define tWindowSelected data[0] #define tBgmIndex data[1] #define tSeIndex data[2] -#define UNK_DATA3 data[3] -#define UNK_DATA4 data[4] -// data 5-7 are not used -// i dont have a define for data 8 yet because its used in a nonmatching and I can't be sure yet its actually used. // window selections enum @@ -30,7 +26,7 @@ enum // driver test cry enums enum { - CRY_TEST_UNK0, + CRY_TEST_VOICE, CRY_TEST_VOLUME, CRY_TEST_PANPOT, CRY_TEST_PITCH, @@ -60,12 +56,12 @@ extern struct ToneData voicegroup_8453790[]; static EWRAM_DATA u8 gUnknown_020387B0 = 0; static EWRAM_DATA u8 gUnknown_020387B1 = 0; static EWRAM_DATA u8 gUnknown_020387B2 = 0; -static EWRAM_DATA s8 gUnknown_020387B3 = 0; -static EWRAM_DATA int gUnknown_020387B4[9] = {0}; +static EWRAM_DATA s8 sDriverTestSelection = 0; +static EWRAM_DATA int sSoundTestParams[9] = {0}; static EWRAM_DATA u8 gUnknown_020387D8 = 0; static EWRAM_DATA u8 gUnknown_020387D9 = 0; -extern u16 gUnknown_03005D34; +u16 gSoundTestCryNum; extern u8 gUnknown_03005E98; struct MusicPlayerInfo *gUnknown_03005D30; @@ -80,17 +76,17 @@ void HighlightSelectedWindow(u8); void PrintSoundNumber(u16, u16, u16); void sub_80BA79C(const u8 *const, u16, u16); void Task_DrawDriverTestMenu(u8); -void sub_80BAA48(u8); -void sub_80BACDC(s8); -void sub_80BAD5C(void); +void Task_ProcessDriverTestInput(u8); +void AdjustSelectedDriverParam(s8); +void PrintDriverTestMenuText(void); void sub_80BAE10(u8, u8); void PrintSignedNumber(int, u16, u16, u8); void sub_80BAF84(u8); void sub_80BB038(u8); void sub_80BB1D4(void); -void sub_80BB25C(u8); -void sub_80BB3B4(u8); -void sub_80BB494(void); +void Task_InitCryTest(u8); +void Task_ProcessCryTestInput(u8); +void PrintCryNumber(void); void CB2_SoundCheckMenu(void) { @@ -158,9 +154,9 @@ void CB2_StartSoundCheckMenu(void) gTasks[taskId].tWindowSelected = BGM_WINDOW; gTasks[taskId].tBgmIndex = 0; gTasks[taskId].tSeIndex = 0; - gTasks[taskId].UNK_DATA3 = 0; + gTasks[taskId].data[3] = 0; gUnknown_020387B0 = 0; - gTasks[taskId].UNK_DATA3 = 0; // why? + gTasks[taskId].data[3] = 0; // why? m4aSoundInit(); } @@ -219,7 +215,7 @@ bool8 Task_ProcessSoundCheckMenuInput(u8 taskId) } else if (gMain.newKeys & START_BUTTON) { - gTasks[taskId].func = sub_80BB25C; + gTasks[taskId].func = Task_InitCryTest; } else if (gMain.newKeys & A_BUTTON) { @@ -227,11 +223,11 @@ bool8 Task_ProcessSoundCheckMenuInput(u8 taskId) { if (gTasks[taskId].data[4] != 0) { - if (gTasks[taskId].data[2] != 0) + if (gTasks[taskId].tSeIndex != 0) { m4aSongNumStop(gTasks[taskId].data[4]); - m4aSongNumStart(gTasks[taskId].data[2]); - gTasks[taskId].data[4] = gTasks[taskId].data[2]; + m4aSongNumStart(gTasks[taskId].tSeIndex); + gTasks[taskId].data[4] = gTasks[taskId].tSeIndex; } else { @@ -239,13 +235,10 @@ bool8 Task_ProcessSoundCheckMenuInput(u8 taskId) gTasks[taskId].data[4] = 0; } } - else + else if (gTasks[taskId].tSeIndex != 0) { - if (gTasks[taskId].data[2] != 0) - { - m4aSongNumStart(gTasks[taskId].data[2]); - gTasks[taskId].data[4] = gTasks[taskId].data[2]; - } + m4aSongNumStart(gTasks[taskId].tSeIndex); + gTasks[taskId].data[4] = gTasks[taskId].tSeIndex; } } else @@ -294,14 +287,14 @@ bool8 Task_ProcessSoundCheckMenuInput(u8 taskId) if (gTasks[taskId].tSeIndex > 0) gTasks[taskId].tSeIndex--; else - gTasks[taskId].tSeIndex = 0xF7; + gTasks[taskId].tSeIndex = 247; } else { if (gTasks[taskId].tBgmIndex > 0) gTasks[taskId].tBgmIndex--; else - gTasks[taskId].tBgmIndex = 0x75; + gTasks[taskId].tBgmIndex = 117; } return TRUE; } @@ -309,14 +302,14 @@ bool8 Task_ProcessSoundCheckMenuInput(u8 taskId) { if (gTasks[taskId].tWindowSelected != 0) { - if (gTasks[taskId].tSeIndex < 0xF7) + if (gTasks[taskId].tSeIndex < 247) gTasks[taskId].tSeIndex++; else gTasks[taskId].tSeIndex = 0; } else { - if (gTasks[taskId].tBgmIndex < 0x75) + if (gTasks[taskId].tBgmIndex < 117) gTasks[taskId].tBgmIndex++; else gTasks[taskId].tBgmIndex = 0; @@ -445,29 +438,27 @@ void Task_DrawDriverTestMenu(u8 taskId) // Task_DrawDriverTestMenu MenuPrint(stereoStr, 19, 12); REG_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH); REG_WIN0V = WIN_RANGE(0, DISPLAY_HEIGHT); - gUnknown_020387B3 = 0; + sDriverTestSelection = 0; gUnknown_020387B1 = 0; gUnknown_020387B2 = 0; gUnknown_03005D30 = NULL; gUnknown_020387D8 = 0; gUnknown_020387D9 = 1; - gUnknown_020387B4[CRY_TEST_UNK0] = 0; - gUnknown_020387B4[CRY_TEST_VOLUME] = 0x78; - gUnknown_020387B4[CRY_TEST_PANPOT] = 0; - gUnknown_020387B4[CRY_TEST_PITCH] = 0x3C00; - gUnknown_020387B4[CRY_TEST_LENGTH] = 0xB4; - gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; - gUnknown_020387B4[CRY_TEST_RELEASE] = 0; - gUnknown_020387B4[CRY_TEST_CHORUS] = 0; - gUnknown_020387B4[CRY_TEST_PRIORITY] = 2; - sub_80BAD5C(); + sSoundTestParams[CRY_TEST_VOICE] = 0; + sSoundTestParams[CRY_TEST_VOLUME] = 120; + sSoundTestParams[CRY_TEST_PANPOT] = 0; + sSoundTestParams[CRY_TEST_PITCH] = 15360; + sSoundTestParams[CRY_TEST_LENGTH] = 180; + sSoundTestParams[CRY_TEST_PROGRESS] = 0; + sSoundTestParams[CRY_TEST_RELEASE] = 0; + sSoundTestParams[CRY_TEST_CHORUS] = 0; + sSoundTestParams[CRY_TEST_PRIORITY] = 2; + PrintDriverTestMenuText(); sub_80BAE10(0, 0); - gTasks[taskId].func = sub_80BAA48; + gTasks[taskId].func = Task_ProcessDriverTestInput; } - - -void sub_80BAA48(u8 taskId) // Task_ProcessDriverTestInput +void Task_ProcessDriverTestInput(u8 taskId) { if (gMain.newKeys & B_BUTTON) { @@ -480,74 +471,74 @@ void sub_80BAA48(u8 taskId) // Task_ProcessDriverTestInput } if (gMain.newAndRepeatedKeys & DPAD_UP) // _080BAAA8 { - u8 backupVar = gUnknown_020387B3; - if(--gUnknown_020387B3 < 0) - gUnknown_020387B3 = 8; + u8 old = sDriverTestSelection; - sub_80BAE10(backupVar, gUnknown_020387B3); + if(--sDriverTestSelection < 0) + sDriverTestSelection = 8; + sub_80BAE10(old, sDriverTestSelection); return; } if (gMain.newAndRepeatedKeys & DPAD_DOWN) // _080BAAD0 { - u8 backupVar = gUnknown_020387B3; - if(++gUnknown_020387B3 > 8) - gUnknown_020387B3 = 0; + u8 old = sDriverTestSelection; - sub_80BAE10(backupVar, gUnknown_020387B3); + if(++sDriverTestSelection > 8) + sDriverTestSelection = 0; + sub_80BAE10(old, sDriverTestSelection); return; } if (gMain.newKeys & START_BUTTON) // _080BAAF8 { gUnknown_020387D8 ^= 1; - sub_80BAD5C(); + PrintDriverTestMenuText(); return; } if (gMain.newKeys & SELECT_BUTTON) // _080BAB14 { gUnknown_020387D9 ^= 1; - sub_80BAD5C(); + PrintDriverTestMenuText(); SetPokemonCryStereo(gUnknown_020387D9); return; } if (gMain.newAndRepeatedKeys & R_BUTTON) // _080BAB38 { - sub_80BACDC(10); - sub_80BAD5C(); + AdjustSelectedDriverParam(10); + PrintDriverTestMenuText(); return; } if (gMain.newAndRepeatedKeys & L_BUTTON) // _080BAB46 { - sub_80BACDC(-10); - sub_80BAD5C(); + AdjustSelectedDriverParam(-10); + PrintDriverTestMenuText(); return; } if (gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BAB56 { - sub_80BACDC(-1); - sub_80BAD5C(); + AdjustSelectedDriverParam(-1); + PrintDriverTestMenuText(); return; } if (gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BAB64 { - sub_80BACDC(1); - sub_80BAD5C(); + AdjustSelectedDriverParam(1); + PrintDriverTestMenuText(); return; } if (gMain.newKeys & A_BUTTON) // _080BAB78 { u8 divide, remaining; - SetPokemonCryVolume(gUnknown_020387B4[CRY_TEST_VOLUME]); - SetPokemonCryPanpot(gUnknown_020387B4[CRY_TEST_PANPOT]); - SetPokemonCryPitch(gUnknown_020387B4[CRY_TEST_PITCH]); - SetPokemonCryLength(gUnknown_020387B4[CRY_TEST_LENGTH]); - SetPokemonCryProgress(gUnknown_020387B4[CRY_TEST_PROGRESS]); - SetPokemonCryRelease(gUnknown_020387B4[CRY_TEST_RELEASE]); - SetPokemonCryChorus(gUnknown_020387B4[CRY_TEST_CHORUS]); - SetPokemonCryPriority(gUnknown_020387B4[CRY_TEST_PRIORITY]); + SetPokemonCryVolume(sSoundTestParams[CRY_TEST_VOLUME]); + SetPokemonCryPanpot(sSoundTestParams[CRY_TEST_PANPOT]); + SetPokemonCryPitch(sSoundTestParams[CRY_TEST_PITCH]); + SetPokemonCryLength(sSoundTestParams[CRY_TEST_LENGTH]); + SetPokemonCryProgress(sSoundTestParams[CRY_TEST_PROGRESS]); + SetPokemonCryRelease(sSoundTestParams[CRY_TEST_RELEASE]); + SetPokemonCryChorus(sSoundTestParams[CRY_TEST_CHORUS]); + SetPokemonCryPriority(sSoundTestParams[CRY_TEST_PRIORITY]); - remaining = gUnknown_020387B4[CRY_TEST_UNK0] % 128; - divide = gUnknown_020387B4[CRY_TEST_UNK0] / 128; + remaining = sSoundTestParams[CRY_TEST_VOICE] % 128; + divide = sSoundTestParams[CRY_TEST_VOICE] / 128; switch (divide) { @@ -584,47 +575,48 @@ void sub_80BAA48(u8 taskId) // Task_ProcessDriverTestInput gUnknown_020387B1 = IsPokemonCryPlaying(gUnknown_03005D30); if (gUnknown_020387B1 != gUnknown_020387B2) - sub_80BAD5C(); + PrintDriverTestMenuText(); gUnknown_020387B2 = gUnknown_020387B1; } } -void sub_80BACDC(s8 var) +void AdjustSelectedDriverParam(s8 delta) { // also ideally should be a MinMax struct, but any attempt to make this into a struct causes it to not match due to the weird multi dim access. - int minMaxArray[16] = + int paramRanges[] = { - 0, 387, - 0, 127, - -127, 127, - -128, 32639, - 0, 65535, - 0, 255, - 0, 65535, - -64, 63 + 0, 387, // Voice + 0, 127, // Volume + -127, 127, // Panpot + -128, 32639, // Pitch + 0, 65535, // Length + 0, 255, // Release + 0, 65535, // Progress + -64, 63 // Chorus + // Priority??? Why is it missing? }; - gUnknown_020387B4[gUnknown_020387B3] += var; + sSoundTestParams[sDriverTestSelection] += delta; - if (gUnknown_020387B4[gUnknown_020387B3] > minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MAX)]) - gUnknown_020387B4[gUnknown_020387B3] = minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MIN)]; + if (sSoundTestParams[sDriverTestSelection] > paramRanges[MULTI_DIM_ARR(sDriverTestSelection, B_16, MAX)]) + sSoundTestParams[sDriverTestSelection] = paramRanges[MULTI_DIM_ARR(sDriverTestSelection, B_16, MIN)]; - if (gUnknown_020387B4[gUnknown_020387B3] < minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MIN)]) - gUnknown_020387B4[gUnknown_020387B3] = minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MAX)]; + if (sSoundTestParams[sDriverTestSelection] < paramRanges[MULTI_DIM_ARR(sDriverTestSelection, B_16, MIN)]) + sSoundTestParams[sDriverTestSelection] = paramRanges[MULTI_DIM_ARR(sDriverTestSelection, B_16, MAX)]; } -void sub_80BAD5C(void) +void PrintDriverTestMenuText(void) { - PrintSignedNumber(gUnknown_020387B4[CRY_TEST_UNK0] + 1, 11, 1, 5); - PrintSignedNumber(gUnknown_020387B4[CRY_TEST_VOLUME], 11, 3, 5); - PrintSignedNumber(gUnknown_020387B4[CRY_TEST_PANPOT], 11, 5, 5); - PrintSignedNumber(gUnknown_020387B4[CRY_TEST_PITCH], 11, 7, 5); - PrintSignedNumber(gUnknown_020387B4[CRY_TEST_LENGTH], 11, 9, 5); - PrintSignedNumber(gUnknown_020387B4[CRY_TEST_RELEASE], 11, 11, 5); - PrintSignedNumber(gUnknown_020387B4[CRY_TEST_PROGRESS], 11, 13, 5); - PrintSignedNumber(gUnknown_020387B4[CRY_TEST_CHORUS], 11, 15, 5); - PrintSignedNumber(gUnknown_020387B4[CRY_TEST_PRIORITY], 11, 17, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_VOICE] + 1, 11, 1, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_VOLUME], 11, 3, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_PANPOT], 11, 5, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_PITCH], 11, 7, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_LENGTH], 11, 9, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_RELEASE], 11, 11, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_PROGRESS], 11, 13, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_CHORUS], 11, 15, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_PRIORITY], 11, 17, 5); PrintSignedNumber(gUnknown_020387B1, 27, 16, 1); PrintSignedNumber(gUnknown_020387D8, 27, 14, 1); PrintSignedNumber(gUnknown_020387D9, 27, 12, 1); @@ -703,11 +695,11 @@ void sub_80BAF84(u8 taskId) MenuPrint(playingStr, 3, 8); REG_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH); REG_WIN0V = WIN_RANGE(0, DISPLAY_HEIGHT); - gUnknown_020387B4[CRY_TEST_UNK0] = 1; - gUnknown_020387B4[CRY_TEST_PANPOT] = 0; - gUnknown_020387B4[CRY_TEST_CHORUS] = 0; - gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; - gUnknown_020387B4[CRY_TEST_RELEASE] = 0; + sSoundTestParams[CRY_TEST_VOICE] = 1; + sSoundTestParams[CRY_TEST_PANPOT] = 0; + sSoundTestParams[CRY_TEST_CHORUS] = 0; + sSoundTestParams[CRY_TEST_PROGRESS] = 0; + sSoundTestParams[CRY_TEST_RELEASE] = 0; sub_80BB1D4(); gTasks[taskId].func = sub_80BB038; } @@ -715,29 +707,29 @@ void sub_80BAF84(u8 taskId) void sub_80BB038(u8 taskId) { sub_80BB1D4(); - if (gUnknown_020387B4[CRY_TEST_PROGRESS]) + if (sSoundTestParams[CRY_TEST_PROGRESS]) { - if (gUnknown_020387B4[CRY_TEST_RELEASE]) + if (sSoundTestParams[CRY_TEST_RELEASE]) { - gUnknown_020387B4[CRY_TEST_RELEASE]--; + sSoundTestParams[CRY_TEST_RELEASE]--; } else // _080BB05C { - s8 panpot = gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]; + s8 panpot = gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]]; if (panpot != -128) { if (panpot == 127) { - gUnknown_020387B4[CRY_TEST_CHORUS] += 2; - if (gUnknown_020387B4[CRY_TEST_CHORUS] < 63) - SE12PanpotControl(gUnknown_020387B4[CRY_TEST_CHORUS]); + sSoundTestParams[CRY_TEST_CHORUS] += 2; + if (sSoundTestParams[CRY_TEST_CHORUS] < 63) + SE12PanpotControl(sSoundTestParams[CRY_TEST_CHORUS]); } } else // _080BB08C { - gUnknown_020387B4[CRY_TEST_CHORUS] -= 2; - if (gUnknown_020387B4[CRY_TEST_CHORUS] > -64) - SE12PanpotControl(gUnknown_020387B4[CRY_TEST_CHORUS]); + sSoundTestParams[CRY_TEST_CHORUS] -= 2; + if (sSoundTestParams[CRY_TEST_CHORUS] > -64) + SE12PanpotControl(sSoundTestParams[CRY_TEST_CHORUS]); } } } @@ -753,54 +745,54 @@ void sub_80BB038(u8 taskId) } if (gMain.newKeys & A_BUTTON) // _080BB104 { - s8 panpot = gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]; + s8 panpot = gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]]; if (panpot != -128) { if (panpot == 127) { - PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], -64); - gUnknown_020387B4[CRY_TEST_CHORUS] = -64; - gUnknown_020387B4[CRY_TEST_PROGRESS] = 1; - gUnknown_020387B4[CRY_TEST_RELEASE] = 30; + PlaySE12WithPanning(sSoundTestParams[CRY_TEST_VOICE], -64); + sSoundTestParams[CRY_TEST_CHORUS] = -64; + sSoundTestParams[CRY_TEST_PROGRESS] = 1; + sSoundTestParams[CRY_TEST_RELEASE] = 30; return; } } else // _080BB140 { - PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], 63); - gUnknown_020387B4[CRY_TEST_CHORUS] = 63; - gUnknown_020387B4[CRY_TEST_PROGRESS] = 1; - gUnknown_020387B4[CRY_TEST_RELEASE] = 30; + PlaySE12WithPanning(sSoundTestParams[CRY_TEST_VOICE], 63); + sSoundTestParams[CRY_TEST_CHORUS] = 63; + sSoundTestParams[CRY_TEST_PROGRESS] = 1; + sSoundTestParams[CRY_TEST_RELEASE] = 30; return; } // _080BB154 - PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], panpot); - gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; + PlaySE12WithPanning(sSoundTestParams[CRY_TEST_VOICE], panpot); + sSoundTestParams[CRY_TEST_PROGRESS] = 0; return; } if (gMain.newKeys & L_BUTTON) // _080BB15E { - gUnknown_020387B4[CRY_TEST_PANPOT]++; - if (gUnknown_020387B4[CRY_TEST_PANPOT] > 4) - gUnknown_020387B4[CRY_TEST_PANPOT] = 0; + sSoundTestParams[CRY_TEST_PANPOT]++; + if (sSoundTestParams[CRY_TEST_PANPOT] > 4) + sSoundTestParams[CRY_TEST_PANPOT] = 0; } if (gMain.newKeys & R_BUTTON) // _080BB176 { - gUnknown_020387B4[CRY_TEST_PANPOT]--; - if (gUnknown_020387B4[CRY_TEST_PANPOT] < 0) - gUnknown_020387B4[CRY_TEST_PANPOT] = 4; + sSoundTestParams[CRY_TEST_PANPOT]--; + if (sSoundTestParams[CRY_TEST_PANPOT] < 0) + sSoundTestParams[CRY_TEST_PANPOT] = 4; } if (gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BB192 { - gUnknown_020387B4[CRY_TEST_UNK0]++; - if (gUnknown_020387B4[CRY_TEST_UNK0] > 0xF7) - gUnknown_020387B4[CRY_TEST_UNK0] = 0; + sSoundTestParams[CRY_TEST_VOICE]++; + if (sSoundTestParams[CRY_TEST_VOICE] > 247) + sSoundTestParams[CRY_TEST_VOICE] = 0; } else if (gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BB1B0 { - gUnknown_020387B4[CRY_TEST_UNK0]--; - if (gUnknown_020387B4[CRY_TEST_UNK0] < 0) - gUnknown_020387B4[CRY_TEST_UNK0] = 0xF7; + sSoundTestParams[CRY_TEST_VOICE]--; + if (sSoundTestParams[CRY_TEST_VOICE] < 0) + sSoundTestParams[CRY_TEST_VOICE] = 247; } } @@ -809,18 +801,18 @@ void sub_80BB1D4(void) u8 lrStr[] = _(" LR"); u8 rlStr[] = _(" RL"); - PrintSignedNumber(gUnknown_020387B4[CRY_TEST_UNK0], 7, 2, 3); + PrintSignedNumber(sSoundTestParams[CRY_TEST_VOICE], 7, 2, 3); - switch (gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]) + switch (gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]]) { - case 0x7F: + case 127: MenuPrint(lrStr, 7, 4); break; - case -0x80: + case -128: MenuPrint(rlStr, 7, 4); break; default: - PrintSignedNumber(gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]], 7, 4, 3); + PrintSignedNumber(gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]], 7, 4, 3); break; } PrintSignedNumber(IsSEPlaying(), 12, 8, 1); @@ -1220,14 +1212,14 @@ SOUND_LIST_SE }; #undef X -void sub_80BB25C(u8 taskId) +void Task_InitCryTest(u8 taskId) { struct CryRelatedStruct cryStruct, cryStruct2; u8 zero; SetUpWindowConfig(&gWindowConfig_81E6C3C); InitMenuWindow(&gWindowConfig_81E6CE4); - gUnknown_03005D34 = 1; + gSoundTestCryNum = 1; ResetSpriteData(); FreeAllSpritePalettes(); @@ -1256,7 +1248,7 @@ void sub_80BB25C(u8 taskId) ; MenuDrawTextWindow(0, 16, 5, 19); - sub_80BB494(); + PrintCryNumber(); BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); REG_BG2HOFS = 0; REG_BG2VOFS = 0; @@ -1264,16 +1256,16 @@ void sub_80BB25C(u8 taskId) REG_BG3CNT = 0x1D03; REG_DISPCNT = 0x1d40; m4aMPlayFadeOutTemporarily(&gMPlay_BGM, 2); - gTasks[taskId].func = sub_80BB3B4; + gTasks[taskId].func = Task_ProcessCryTestInput; } -void sub_80BB3B4(u8 taskId) +void Task_ProcessCryTestInput(u8 taskId) { sub_8119F88(3); if (gMain.newKeys & A_BUTTON) { - sub_811A050(gUnknown_03005D34); + sub_811A050(gSoundTestCryNum); } if (gMain.newKeys & R_BUTTON) { @@ -1281,15 +1273,15 @@ void sub_80BB3B4(u8 taskId) } if (gMain.newAndRepeatedKeys & DPAD_UP) { - if(--gUnknown_03005D34 == 0) - gUnknown_03005D34 = 384; // total species - sub_80BB494(); + if(--gSoundTestCryNum == 0) + gSoundTestCryNum = 384; // total species + PrintCryNumber(); } if (gMain.newAndRepeatedKeys & DPAD_DOWN) { - if(++gUnknown_03005D34 > 384) - gUnknown_03005D34 = 1; - sub_80BB494(); + if(++gSoundTestCryNum > 384) + gSoundTestCryNum = 1; + PrintCryNumber(); } if (gMain.newKeys & B_BUTTON) { @@ -1302,7 +1294,7 @@ void sub_80BB3B4(u8 taskId) } } -void sub_80BB494(void) +void PrintCryNumber(void) { - PrintSignedNumber(gUnknown_03005D34, 1, 17, 3); + PrintSignedNumber(gSoundTestCryNum, 1, 17, 3); } -- cgit v1.2.3 From 6ca1e8747d0278eb5a8e5d7f5ec74801a3e1aded Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 1 Oct 2017 11:51:50 -0500 Subject: fix more command names --- src/field/scrcmd.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index 35264d5e2..219dab818 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -1417,7 +1417,7 @@ bool8 ScrCmd_drawcontestwinner(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_braillemsg(struct ScriptContext *ctx) +bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) { u8 *ptr = (u8 *)ScriptReadWord(ctx); @@ -1441,7 +1441,7 @@ bool8 ScrCmd_vtext(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_bufferpoke(struct ScriptContext *ctx) +bool8 ScrCmd_getspeciesname(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 species = VarGet(ScriptReadHalfword(ctx)); @@ -1450,7 +1450,7 @@ bool8 ScrCmd_bufferpoke(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_bufferfirstpoke(struct ScriptContext *ctx) +bool8 ScrCmd_getfirstpartypokename(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); @@ -1461,7 +1461,7 @@ bool8 ScrCmd_bufferfirstpoke(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_bufferpartypoke(struct ScriptContext *ctx) +bool8 ScrCmd_getpartypokename(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); @@ -1471,7 +1471,7 @@ bool8 ScrCmd_bufferpartypoke(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_bufferitem(struct ScriptContext *ctx) +bool8 ScrCmd_getitemname(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 itemId = VarGet(ScriptReadHalfword(ctx)); @@ -1480,7 +1480,7 @@ bool8 ScrCmd_bufferitem(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_bufferdecor(struct ScriptContext *ctx) +bool8 ScrCmd_getdecorname(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 decorId = VarGet(ScriptReadHalfword(ctx)); @@ -1489,7 +1489,7 @@ bool8 ScrCmd_bufferdecor(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_bufferattack(struct ScriptContext *ctx) +bool8 ScrCmd_getmovename(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 moveId = VarGet(ScriptReadHalfword(ctx)); @@ -1498,7 +1498,7 @@ bool8 ScrCmd_bufferattack(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_buffernum(struct ScriptContext *ctx) +bool8 ScrCmd_getnumberstring(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 v1 = VarGet(ScriptReadHalfword(ctx)); @@ -1508,7 +1508,7 @@ bool8 ScrCmd_buffernum(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_bufferstd(struct ScriptContext *ctx) +bool8 ScrCmd_getstdstring(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 index = VarGet(ScriptReadHalfword(ctx)); @@ -1517,7 +1517,7 @@ bool8 ScrCmd_bufferstd(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_buffertext(struct ScriptContext *ctx) +bool8 ScrCmd_getstring(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u8 *text = (u8 *)ScriptReadWord(ctx); @@ -1778,7 +1778,7 @@ bool8 ScrCmd_pokemartbp(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_pokecasino(struct ScriptContext *ctx) +bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx) { u8 v2 = VarGet(ScriptReadHalfword(ctx)); @@ -1787,7 +1787,7 @@ bool8 ScrCmd_pokecasino(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_event_8a(struct ScriptContext *ctx) +bool8 ScrCmd_plantberrytree(struct ScriptContext *ctx) { u8 treeId = ScriptReadByte(ctx); u8 berry = ScriptReadByte(ctx); -- cgit v1.2.3 From 639493e0ee82d173e58d9a791b37ab08106e16fa Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 1 Oct 2017 12:07:22 -0500 Subject: fix more command names --- src/field/scrcmd.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index 219dab818..5bb4e31c7 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -608,7 +608,7 @@ bool8 ScrCmd_lighten(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_darken(struct ScriptContext *ctx) +bool8 ScrCmd_setdarklevel(struct ScriptContext *ctx) { u16 flashLevel = VarGet(ScriptReadHalfword(ctx)); @@ -1608,7 +1608,7 @@ bool8 ScrCmd_givemoney(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_paymoney(struct ScriptContext *ctx) +bool8 ScrCmd_takemoney(struct ScriptContext *ctx) { u32 amount = ScriptReadWord(ctx); u8 ignore = ScriptReadByte(ctx); @@ -1628,7 +1628,7 @@ bool8 ScrCmd_checkmoney(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_showmoney(struct ScriptContext *ctx) +bool8 ScrCmd_showmoneybox(struct ScriptContext *ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); @@ -1639,7 +1639,7 @@ bool8 ScrCmd_showmoney(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_hidemoney(struct ScriptContext *ctx) +bool8 ScrCmd_hidemoneybox(struct ScriptContext *ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); @@ -1648,7 +1648,7 @@ bool8 ScrCmd_hidemoney(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_updatemoney(struct ScriptContext *ctx) +bool8 ScrCmd_updatemoneybox(struct ScriptContext *ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); @@ -1800,7 +1800,7 @@ bool8 ScrCmd_plantberrytree(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_event_96(struct ScriptContext *ctx) +bool8 ScrCmd_getpricereduction(struct ScriptContext *ctx) { u16 value = VarGet(ScriptReadHalfword(ctx)); -- cgit v1.2.3 From 89092b609a9af15a35b0151442e9881aeab28708 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 1 Oct 2017 12:21:52 -0500 Subject: fix more command names --- src/field/scrcmd.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index 5bb4e31c7..dd80a2f42 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -601,7 +601,7 @@ bool8 ScrCmd_inccounter(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_lighten(struct ScriptContext *ctx) +bool8 ScrCmd_animdarklevel(struct ScriptContext *ctx) { sub_8081594(ScriptReadByte(ctx)); ScriptContext1_Stop(); @@ -1236,7 +1236,7 @@ bool8 ScrCmd_message(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_message2(struct ScriptContext *ctx) +bool8 ScrCmd_messageautoscroll(struct ScriptContext *ctx) { u8 *msg = (u8 *)ScriptReadWord(ctx); @@ -1836,7 +1836,7 @@ bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_doanimation(struct ScriptContext *ctx) +bool8 ScrCmd_dofieldeffect(struct ScriptContext *ctx) { u16 effectId = VarGet(ScriptReadHalfword(ctx)); @@ -1845,7 +1845,7 @@ bool8 ScrCmd_doanimation(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_setanimation(struct ScriptContext *ctx) +bool8 ScrCmd_setfieldeffect(struct ScriptContext *ctx) { u8 argNum = ScriptReadByte(ctx); @@ -1861,7 +1861,7 @@ static bool8 sub_8067B48() return FALSE; } -bool8 ScrCmd_checkanimation(struct ScriptContext *ctx) +bool8 ScrCmd_waitfieldeffect(struct ScriptContext *ctx) { sFieldEffectScriptId = VarGet(ScriptReadHalfword(ctx)); SetupNativeScript(ctx, sub_8067B48); @@ -1876,13 +1876,13 @@ bool8 ScrCmd_sethealplace(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_checkgender(struct ScriptContext *ctx) +bool8 ScrCmd_checkplayergender(struct ScriptContext *ctx) { gScriptResult = gSaveBlock2.playerGender; return FALSE; } -bool8 ScrCmd_pokecry(struct ScriptContext *ctx) +bool8 ScrCmd_playpokecry(struct ScriptContext *ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); u16 mode = VarGet(ScriptReadHalfword(ctx)); -- cgit v1.2.3 From 6c9249af37b380ee5f5b00ed24013bfc46bf1bae Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 1 Oct 2017 12:32:19 -0500 Subject: fix more command names --- src/field/scrcmd.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index dd80a2f42..90b986a1f 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -708,7 +708,7 @@ bool8 ScrCmd_tileeffect(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_setmapfooter(struct ScriptContext *ctx) +bool8 ScrCmd_setmaplayoutindex(struct ScriptContext *ctx) { u16 value = VarGet(ScriptReadHalfword(ctx)); @@ -1093,7 +1093,7 @@ bool8 ScrCmd_hideobject(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_spritelevelup(struct ScriptContext *ctx) +bool8 ScrCmd_setobjectpriority(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); @@ -1104,7 +1104,7 @@ bool8 ScrCmd_spritelevelup(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_restorespritelevel(struct ScriptContext *ctx) +bool8 ScrCmd_resetobjectpriority(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); @@ -1142,7 +1142,7 @@ bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_createvsprite(struct ScriptContext *ctx) +bool8 ScrCmd_createvobject(struct ScriptContext *ctx) { u8 graphicsId = ScriptReadByte(ctx); u8 v2 = ScriptReadByte(ctx); @@ -1155,7 +1155,7 @@ bool8 ScrCmd_createvsprite(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_vspriteface(struct ScriptContext *ctx) +bool8 ScrCmd_turnvobject(struct ScriptContext *ctx) { u8 v1 = ScriptReadByte(ctx); u8 direction = ScriptReadByte(ctx); @@ -1913,7 +1913,7 @@ bool8 ScrCmd_setmaptile(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_setdooropened(struct ScriptContext *ctx) +bool8 ScrCmd_opendoor(struct ScriptContext *ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); @@ -1925,7 +1925,7 @@ bool8 ScrCmd_setdooropened(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) +bool8 ScrCmd_closedoor(struct ScriptContext *ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); @@ -1944,13 +1944,13 @@ static bool8 IsDoorAnimationStopped() return FALSE; } -bool8 ScrCmd_doorchange(struct ScriptContext *ctx) +bool8 ScrCmd_waitdooranim(struct ScriptContext *ctx) { SetupNativeScript(ctx, IsDoorAnimationStopped); return TRUE; } -bool8 ScrCmd_setdooropened2(struct ScriptContext *ctx) +bool8 ScrCmd_setdooropen(struct ScriptContext *ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); @@ -1961,7 +1961,7 @@ bool8 ScrCmd_setdooropened2(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_setdoorclosed2(struct ScriptContext *ctx) +bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); -- cgit v1.2.3 From 3505da56b15432062be0b49fc9d212b12f0bea15 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 1 Oct 2017 12:40:07 -0500 Subject: fix more command names --- src/field/scrcmd.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index 90b986a1f..b64b17951 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -196,7 +196,7 @@ bool8 ScrCmd_setvaddress(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_vjump(struct ScriptContext *ctx) +bool8 ScrCmd_vgoto(struct ScriptContext *ctx) { u32 addr = ScriptReadWord(ctx); @@ -212,7 +212,7 @@ bool8 ScrCmd_vcall(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_if5(struct ScriptContext *ctx) +bool8 ScrCmd_vgoto_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); @@ -222,7 +222,7 @@ bool8 ScrCmd_if5(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_if6(struct ScriptContext *ctx) +bool8 ScrCmd_vcall_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); @@ -595,7 +595,7 @@ bool8 ScrCmd_checkflag(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_inccounter(struct ScriptContext *ctx) +bool8 ScrCmd_incrementgamestat(struct ScriptContext *ctx) { IncrementGameStat(ScriptReadByte(ctx)); return FALSE; @@ -837,7 +837,7 @@ bool8 ScrCmd_setholewarp(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_warp6(struct ScriptContext *ctx) +bool8 ScrCmd_setescapewarp(struct ScriptContext *ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); @@ -1433,7 +1433,7 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_vtext(struct ScriptContext *ctx) +bool8 ScrCmd_vmessage(struct ScriptContext *ctx) { u32 v1 = ScriptReadWord(ctx); @@ -1534,7 +1534,7 @@ bool8 ScrCmd_vloadptr(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_vbuffer(struct ScriptContext *ctx) +bool8 ScrCmd_vgetstring(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u32 addr = ScriptReadWord(ctx); @@ -1659,7 +1659,7 @@ bool8 ScrCmd_updatemoneybox(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_showcoins(struct ScriptContext *ctx) +bool8 ScrCmd_showcoinsbox(struct ScriptContext *ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); @@ -1668,7 +1668,7 @@ bool8 ScrCmd_showcoins(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_hidecoins(struct ScriptContext *ctx) +bool8 ScrCmd_hidecoinsbox(struct ScriptContext *ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); @@ -1677,7 +1677,7 @@ bool8 ScrCmd_hidecoins(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_updatecoins(struct ScriptContext *ctx) +bool8 ScrCmd_updatecoinsbox(struct ScriptContext *ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); @@ -1972,7 +1972,7 @@ bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_event_b1(struct ScriptContext *ctx) +bool8 ScrCmd_addelevmenuitem(struct ScriptContext *ctx) { u8 v3 = ScriptReadByte(ctx); u16 v5 = VarGet(ScriptReadHalfword(ctx)); @@ -1983,7 +1983,7 @@ bool8 ScrCmd_event_b1(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_event_b2(struct ScriptContext *ctx) +bool8 ScrCmd_showelevmenu(struct ScriptContext *ctx) { ScriptShowElevatorMenu(); ScriptContext1_Stop(); @@ -2008,7 +2008,7 @@ bool8 ScrCmd_givecoins(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_removecoins(struct ScriptContext *ctx) +bool8 ScrCmd_takecoins(struct ScriptContext *ctx) { u16 coins = VarGet(ScriptReadHalfword(ctx)); -- cgit v1.2.3 From dc802ea2bee0c4a8d8c99abc6918dae2679a4227 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 1 Oct 2017 13:02:25 -0500 Subject: setmestatus -> setmysteryeventstatus --- src/field/scrcmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index b64b17951..68511ecb7 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -293,7 +293,7 @@ bool8 ScrCmd_killscript(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_setmestatus(struct ScriptContext *ctx) +bool8 ScrCmd_setmysteryeventstatus(struct ScriptContext *ctx) { u8 value = ScriptReadByte(ctx); -- cgit v1.2.3 From ac8f084ec5b95f067369c5162985a5a7a13b3ba4 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 1 Oct 2017 13:22:34 -0500 Subject: imm -> value --- src/field/scrcmd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index 68511ecb7..ec8e17d34 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -398,7 +398,7 @@ bool8 ScrCmd_compare_local_to_local(struct ScriptContext *ctx) } // comparelocaltoimm -bool8 ScrCmd_compare_local_to_imm(struct ScriptContext *ctx) +bool8 ScrCmd_compare_local_to_value(struct ScriptContext *ctx) { u8 value1 = ctx->data[ScriptReadByte(ctx)]; u8 value2 = ScriptReadByte(ctx); @@ -425,7 +425,7 @@ bool8 ScrCmd_compare_addr_to_local(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_compare_addr_to_imm(struct ScriptContext *ctx) +bool8 ScrCmd_compare_addr_to_value(struct ScriptContext *ctx) { u8 value1 = *(u8 *)ScriptReadWord(ctx); u8 value2 = ScriptReadByte(ctx); @@ -443,7 +443,7 @@ bool8 ScrCmd_compare_addr_to_addr(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_compare_var_to_imm(struct ScriptContext *ctx) +bool8 ScrCmd_compare_var_to_value(struct ScriptContext *ctx) { u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx)); u16 value2 = ScriptReadHalfword(ctx); -- cgit v1.2.3 From ab3c40fbf6dd7e32d63ef8146edea900d10681d6 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 1 Oct 2017 14:39:25 -0500 Subject: vloadptr -> vloadword --- src/field/scrcmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index ec8e17d34..28584d4d0 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -1526,7 +1526,7 @@ bool8 ScrCmd_getstring(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_vloadptr(struct ScriptContext *ctx) +bool8 ScrCmd_vloadword(struct ScriptContext *ctx) { u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); -- cgit v1.2.3